summaryrefslogtreecommitdiff
path: root/README
diff options
context:
space:
mode:
Diffstat (limited to 'README')
-rw-r--r--README1412
1 files changed, 1412 insertions, 0 deletions
diff --git a/README b/README
new file mode 100644
index 0000000..81eca75
--- /dev/null
+++ b/README
@@ -0,0 +1,1412 @@
+NAME
+ DBD::SQLite - Self-contained RDBMS in a DBI Driver
+
+SYNOPSIS
+ use DBI;
+ my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","");
+
+DESCRIPTION
+ SQLite is a public domain file-based relational database engine that you
+ can find at <http://www.sqlite.org/>.
+
+ DBD::SQLite is a Perl DBI driver for SQLite, that includes the entire
+ thing in the distribution. So in order to get a fast transaction capable
+ RDBMS working for your perl project you simply have to install this
+ module, and nothing else.
+
+ SQLite supports the following features:
+
+ Implements a large subset of SQL92
+ See <http://www.sqlite.org/lang.html> for details.
+
+ A complete DB in a single disk file
+ Everything for your database is stored in a single disk file, making
+ it easier to move things around than with DBD::CSV.
+
+ Atomic commit and rollback
+ Yes, DBD::SQLite is small and light, but it supports full
+ transactions!
+
+ Extensible
+ User-defined aggregate or regular functions can be registered with
+ the SQL parser.
+
+ There's lots more to it, so please refer to the docs on the SQLite web
+ page, listed above, for SQL details. Also refer to DBI for details on
+ how to use DBI itself. The API works like every DBI module does.
+ However, currently many statement attributes are not implemented or are
+ limited by the typeless nature of the SQLite database.
+
+NOTABLE DIFFERENCES FROM OTHER DRIVERS
+ Database Name Is A File Name
+ SQLite creates a file per a database. You should pass the "path" of the
+ database file (with or without a parent directory) in the DBI connection
+ string (as a database "name"):
+
+ my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","");
+
+ The file is opened in read/write mode, and will be created if it does
+ not exist yet.
+
+ Although the database is stored in a single file, the directory
+ containing the database file must be writable by SQLite because the
+ library will create several temporary files there.
+
+ If the filename $dbfile is ":memory:", then a private, temporary
+ in-memory database is created for the connection. This in-memory
+ database will vanish when the database connection is closed. It is handy
+ for your library tests.
+
+ Note that future versions of SQLite might make use of additional special
+ filenames that begin with the ":" character. It is recommended that when
+ a database filename actually does begin with a ":" character you should
+ prefix the filename with a pathname such as "./" to avoid ambiguity.
+
+ If the filename $dbfile is an empty string, then a private, temporary
+ on-disk database will be created. This private database will be
+ automatically deleted as soon as the database connection is closed.
+
+ Accessing A Database With Other Tools
+ To access the database from the command line, try using "dbish" which
+ comes with the DBI::Shell module. Just type:
+
+ dbish dbi:SQLite:foo.db
+
+ On the command line to access the file foo.db.
+
+ Alternatively you can install SQLite from the link above without
+ conflicting with DBD::SQLite and use the supplied "sqlite3" command line
+ tool.
+
+ Blobs
+ As of version 1.11, blobs should "just work" in SQLite as text columns.
+ However this will cause the data to be treated as a string, so SQL
+ statements such as length(x) will return the length of the column as a
+ NUL terminated string, rather than the size of the blob in bytes. In
+ order to store natively as a BLOB use the following code:
+
+ use DBI qw(:sql_types);
+ my $dbh = DBI->connect("dbi:SQLite:dbfile","","");
+
+ my $blob = `cat foo.jpg`;
+ my $sth = $dbh->prepare("INSERT INTO mytable VALUES (1, ?)");
+ $sth->bind_param(1, $blob, SQL_BLOB);
+ $sth->execute();
+
+ And then retrieval just works:
+
+ $sth = $dbh->prepare("SELECT * FROM mytable WHERE id = 1");
+ $sth->execute();
+ my $row = $sth->fetch;
+ my $blobo = $row->[1];
+
+ # now $blobo == $blob
+
+ Functions And Bind Parameters
+ As of this writing, a SQL that compares a return value of a function
+ with a numeric bind value like this doesn't work as you might expect.
+
+ my $sth = $dbh->prepare(q{
+ SELECT bar FROM foo GROUP BY bar HAVING count(*) > ?;
+ });
+ $sth->execute(5);
+
+ This is because DBD::SQLite assumes that all the bind values are text
+ (and should be quoted) by default. Thus the above statement becomes like
+ this while executing:
+
+ SELECT bar FROM foo GROUP BY bar HAVING count(*) > "5";
+
+ There are three workarounds for this.
+
+ Use bind_param() explicitly
+ As shown above in the "BLOB" section, you can always use
+ "bind_param()" to tell the type of a bind value.
+
+ use DBI qw(:sql_types); # Don't forget this
+
+ my $sth = $dbh->prepare(q{
+ SELECT bar FROM foo GROUP BY bar HAVING count(*) > ?;
+ });
+ $sth->bind_param(1, 5, SQL_INTEGER);
+ $sth->execute();
+
+ Add zero to make it a number
+ This is somewhat weird, but works anyway.
+
+ my $sth = $dbh->prepare(q{
+ SELECT bar FROM foo GROUP BY bar HAVING count(*) > (? + 0);
+ });
+ $sth->execute(5);
+
+ Set "sqlite_see_if_its_a_number" database handle attribute
+ As of version 1.32_02, you can use "sqlite_see_if_its_a_number" to
+ let DBD::SQLite to see if the bind values are numbers or not.
+
+ $dbh->{sqlite_see_if_its_a_number} = 1;
+ my $sth = $dbh->prepare(q{
+ SELECT bar FROM foo GROUP BY bar HAVING count(*) > ?;
+ });
+ $sth->execute(5);
+
+ You can set it to true when you connect to a database.
+
+ my $dbh = DBI->connect('dbi:SQLite:foo', undef, undef, {
+ AutoCommit => 1,
+ RaiseError => 1,
+ sqlite_see_if_its_a_number => 1,
+ });
+
+ This is the most straightforward solution, but as noted above,
+ existing data in your databases created by DBD::SQLite have not
+ always been stored as numbers, so this *might* cause other obscure
+ problems. Use this sparingly when you handle existing databases. If
+ you handle databases created by other tools like native "sqlite3"
+ command line tool, this attribute would help you.
+
+ Placeholders
+ SQLite supports several placeholder expressions, including "?" and
+ ":AAAA". Consult the DBI and sqlite documentation for details.
+
+ <http://www.sqlite.org/lang_expr.html#varparam>
+
+ Note that a question mark actually means a next unused (numbered)
+ placeholder. You're advised not to use it with other (numbered or named)
+ placeholders to avoid confusion.
+
+ my $sth = $dbh->prepare(
+ 'update TABLE set a=?1 where b=?2 and a IS NOT ?1'
+ );
+ $sth->execute(1, 2);
+
+ Foreign Keys
+ BE PREPARED! WOLVES APPROACH!!
+
+ SQLite has started supporting foreign key constraints since 3.6.19
+ (released on Oct 14, 2009; bundled in DBD::SQLite 1.26_05). To be exact,
+ SQLite has long been able to parse a schema with foreign keys, but the
+ constraints has not been enforced. Now you can issue a pragma actually
+ to enable this feature and enforce the constraints.
+
+ To do this, issue the following pragma (see below), preferably as soon
+ as you connect to a database and you're not in a transaction:
+
+ $dbh->do("PRAGMA foreign_keys = ON");
+
+ And you can explicitly disable the feature whenever you like by turning
+ the pragma off:
+
+ $dbh->do("PRAGMA foreign_keys = OFF");
+
+ As of this writing, this feature is disabled by default by the sqlite
+ team, and by us, to secure backward compatibility, as this feature may
+ break your applications, and actually broke some for us. If you have
+ used a schema with foreign key constraints but haven't cared them much
+ and supposed they're always ignored for SQLite, be prepared, and please
+ do extensive testing to ensure that your applications will continue to
+ work when the foreign keys support is enabled by default. It is very
+ likely that the sqlite team will turn it default-on in the future, and
+ we plan to do it NO LATER THAN they do so.
+
+ See <http://www.sqlite.org/foreignkeys.html> for details.
+
+ Pragma
+ SQLite has a set of "Pragma"s to modifiy its operation or to query for
+ its internal data. These are specific to SQLite and are not likely to
+ work with other DBD libraries, but you may find some of these are quite
+ useful. DBD::SQLite actually sets some (like "show_datatypes") for you
+ when you connect to a database. See <http://www.sqlite.org/pragma.html>
+ for details.
+
+ Transactions
+ DBI/DBD::SQLite's transactions may be a bit confusing. They behave
+ differently according to the status of the "AutoCommit" flag:
+
+ When the AutoCommit flag is on
+ You're supposed to always use the auto-commit mode, except you
+ explicitly begin a transaction, and when the transaction ended,
+ you're supposed to go back to the auto-commit mode. To begin a
+ transaction, call "begin_work" method, or issue a "BEGIN" statement.
+ To end it, call "commit/rollback" methods, or issue the
+ corresponding statements.
+
+ $dbh->{AutoCommit} = 1;
+
+ $dbh->begin_work; # or $dbh->do('BEGIN TRANSACTION');
+
+ # $dbh->{AutoCommit} is turned off temporarily during a transaction;
+
+ $dbh->commit; # or $dbh->do('COMMIT');
+
+ # $dbh->{AutoCommit} is turned on again;
+
+ When the AutoCommit flag is off
+ You're supposed to always use the transactional mode, until you
+ explicitly turn on the AutoCommit flag. You can explicitly issue a
+ "BEGIN" statement (only when an actual transaction has not begun
+ yet) but you're not allowed to call "begin_work" method (if you
+ don't issue a "BEGIN", it will be issued internally). You can commit
+ or roll it back freely. Another transaction will automatically
+ begins if you execute another statement.
+
+ $dbh->{AutoCommit} = 0;
+
+ # $dbh->do('BEGIN TRANSACTION') is not necessary, but possible
+
+ ...
+
+ $dbh->commit; # or $dbh->do('COMMIT');
+
+ # $dbh->{AutoCommit} stays intact;
+
+ $dbh->{AutoCommit} = 1; # ends the transactional mode
+
+ This "AutoCommit" mode is independent from the autocommit mode of the
+ internal SQLite library, which always begins by a "BEGIN" statement, and
+ ends by a "COMMIT" or a <ROLLBACK>.
+
+ Transaction and Database Locking
+ The default transaction behavior of SQLite is "deferred", that means,
+ locks are not acquired until the first read or write operation, and thus
+ it is possible that another thread or process could create a separate
+ transaction and write to the database after the "BEGIN" on the current
+ thread has executed, and eventually cause a "deadlock". To avoid this,
+ DBD::SQLite internally issues a "BEGIN IMMEDIATE" when you begin a
+ transaction by "begin_work" or under the "AutoCommit" mode (since
+ 1.38_01).
+
+ If you really need to turn off this feature for some reasons, set
+ "sqlite_use_immediate_transaction" database handle attribute to false,
+ and the default "deferred" transaction will be used.
+
+ my $dbh = DBI->connect("dbi:SQLite::memory:", "", "", {
+ sqlite_use_immediate_transaction => 0,
+ });
+
+ See <http://sqlite.org/lockingv3.html> for locking details.
+
+ "$sth->finish" and Transaction Rollback
+ As the DBI doc says, you almost certainly do not need to call "finish"
+ in DBI method if you fetch all rows (probably in a loop). However, there
+ are several exceptions to this rule, and rolling-back of an unfinished
+ "SELECT" statement is one of such exceptional cases.
+
+ SQLite prohibits "ROLLBACK" of unfinished "SELECT" statements in a
+ transaction (See <http://sqlite.org/lang_transaction.html> for details).
+ So you need to call "finish" before you issue a rollback.
+
+ $sth = $dbh->prepare("SELECT * FROM t");
+ $dbh->begin_work;
+ eval {
+ $sth->execute;
+ $row = $sth->fetch;
+ ...
+ die "For some reason";
+ ...
+ };
+ if($@) {
+ $sth->finish; # You need this for SQLite
+ $dbh->rollback;
+ } else {
+ $dbh->commit;
+ }
+
+ Processing Multiple Statements At A Time
+ DBI's statement handle is not supposed to process multiple statements at
+ a time. So if you pass a string that contains multiple statements (a
+ "dump") to a statement handle (via "prepare" or "do"), DBD::SQLite only
+ processes the first statement, and discards the rest.
+
+ Since 1.30_01, you can retrieve those ignored (unprepared) statements
+ via "$sth->{sqlite_unprepared_statements}". It usually contains nothing
+ but white spaces, but if you really care, you can check this attribute
+ to see if there's anything left undone. Also, if you set a
+ "sqlite_allow_multiple_statements" attribute of a database handle to
+ true when you connect to a database, "do" method automatically checks
+ the "sqlite_unprepared_statements" attribute, and if it finds anything
+ undone (even if what's left is just a single white space), it repeats
+ the process again, to the end.
+
+ Performance
+ SQLite is fast, very fast. Matt processed his 72MB log file with it,
+ inserting the data (400,000+ rows) by using transactions and only
+ committing every 1000 rows (otherwise the insertion is quite slow), and
+ then performing queries on the data.
+
+ Queries like count(*) and avg(bytes) took fractions of a second to
+ return, but what surprised him most of all was:
+
+ SELECT url, count(*) as count
+ FROM access_log
+ GROUP BY url
+ ORDER BY count desc
+ LIMIT 20
+
+ To discover the top 20 hit URLs on the site (<http://axkit.org>), and it
+ returned within 2 seconds. He was seriously considering switching his
+ log analysis code to use this little speed demon!
+
+ Oh yeah, and that was with no indexes on the table, on a 400MHz PIII.
+
+ For best performance be sure to tune your hdparm settings if you are
+ using linux. Also you might want to set:
+
+ PRAGMA synchronous = OFF
+
+ Which will prevent sqlite from doing fsync's when writing (which slows
+ down non-transactional writes significantly) at the expense of some
+ peace of mind. Also try playing with the cache_size pragma.
+
+ The memory usage of SQLite can also be tuned using the cache_size
+ pragma.
+
+ $dbh->do("PRAGMA cache_size = 800000");
+
+ The above will allocate 800M for DB cache; the default is 2M. Your sweet
+ spot probably lies somewhere in between.
+
+DRIVER PRIVATE ATTRIBUTES
+ Database Handle Attributes
+ sqlite_version
+ Returns the version of the SQLite library which DBD::SQLite is
+ using, e.g., "2.8.0". Can only be read.
+
+ sqlite_unicode
+ If set to a true value, DBD::SQLite will turn the UTF-8 flag on for
+ all text strings coming out of the database (this feature is
+ currently disabled for perl < 5.8.5). For more details on the UTF-8
+ flag see perlunicode. The default is for the UTF-8 flag to be turned
+ off.
+
+ Also note that due to some bizarreness in SQLite's type system (see
+ <http://www.sqlite.org/datatype3.html>), if you want to retain
+ blob-style behavior for some columns under "$dbh->{sqlite_unicode} =
+ 1" (say, to store images in the database), you have to state so
+ explicitly using the 3-argument form of "bind_param" in DBI when
+ doing updates:
+
+ use DBI qw(:sql_types);
+ $dbh->{sqlite_unicode} = 1;
+ my $sth = $dbh->prepare("INSERT INTO mytable (blobcolumn) VALUES (?)");
+
+ # Binary_data will be stored as is.
+ $sth->bind_param(1, $binary_data, SQL_BLOB);
+
+ Defining the column type as "BLOB" in the DDL is not sufficient.
+
+ This attribute was originally named as "unicode", and renamed to
+ "sqlite_unicode" for integrity since version 1.26_06. Old "unicode"
+ attribute is still accessible but will be deprecated in the near
+ future.
+
+ sqlite_allow_multiple_statements
+ If you set this to true, "do" method will process multiple
+ statements at one go. This may be handy, but with performance
+ penalty. See above for details.
+
+ sqlite_use_immediate_transaction
+ If you set this to true, DBD::SQLite tries to issue a "begin
+ immediate transaction" (instead of "begin transaction") when
+ necessary. See above for details.
+
+ As of version 1.38_01, this attribute is set to true by default. If
+ you really need to use "deferred" transactions for some reasons, set
+ this to false explicitly.
+
+ sqlite_see_if_its_a_number
+ If you set this to true, DBD::SQLite tries to see if the bind values
+ are number or not, and does not quote if they are numbers. See above
+ for details.
+
+ Statement Handle Attributes
+ sqlite_unprepared_statements
+ Returns an unprepared part of the statement you pass to "prepare".
+ Typically this contains nothing but white spaces after a semicolon.
+ See above for details.
+
+METHODS
+ See also to the DBI documentation for the details of other common
+ methods.
+
+ table_info
+ $sth = $dbh->table_info(undef, $schema, $table, $type, \%attr);
+
+ Returns all tables and schemas (databases) as specified in "table_info"
+ in DBI. The schema and table arguments will do a "LIKE" search. You can
+ specify an ESCAPE character by including an 'Escape' attribute in
+ \%attr. The $type argument accepts a comma separated list of the
+ following types 'TABLE', 'VIEW', 'LOCAL TEMPORARY' and 'SYSTEM TABLE'
+ (by default all are returned). Note that a statement handle is returned,
+ and not a direct list of tables.
+
+ The following fields are returned:
+
+ TABLE_CAT: Always NULL, as SQLite does not have the concept of catalogs.
+
+ TABLE_SCHEM: The name of the schema (database) that the table or view is
+ in. The default schema is 'main', temporary tables are in 'temp' and
+ other databases will be in the name given when the database was
+ attached.
+
+ TABLE_NAME: The name of the table or view.
+
+ TABLE_TYPE: The type of object returned. Will be one of 'TABLE', 'VIEW',
+ 'LOCAL TEMPORARY' or 'SYSTEM TABLE'.
+
+ primary_key, primary_key_info
+ @names = $dbh->primary_key(undef, $schema, $table);
+ $sth = $dbh->primary_key_info(undef, $schema, $table, \%attr);
+
+ You can retrieve primary key names or more detailed information. As
+ noted above, SQLite does not have the concept of catalogs, so the first
+ argument of the mothods is usually "undef", and you'll usually set
+ "undef" for the second one (unless you want to know the primary keys of
+ temporary tables).
+
+ foreign_key_info
+ $sth = $dbh->foreign_key_info(undef, $pk_schema, $pk_table,
+ undef, $fk_schema, $fk_table);
+
+ Returns information about foreign key constraints, as specified in
+ "foreign_key_info" in DBI, but with some limitations :
+
+ * information in rows returned by the $sth is incomplete with respect
+ to the "foreign_key_info" in DBI specification. All requested fields
+ are present, but the content is "undef" for some of them.
+
+ The following nonempty fields are returned :
+
+ PKTABLE_NAME: The primary (unique) key table identifier.
+
+ PKCOLUMN_NAME: The primary (unique) key column identifier.
+
+ FKTABLE_NAME: The foreign key table identifier.
+
+ FKCOLUMN_NAME: The foreign key column identifier.
+
+ KEY_SEQ: The column sequence number (starting with 1), when several
+ columns belong to a same constraint.
+
+ UPDATE_RULE: The referential action for the UPDATE rule. The following
+ codes are defined:
+
+ CASCADE 0
+ RESTRICT 1
+ SET NULL 2
+ NO ACTION 3
+ SET DEFAULT 4
+
+ Default is 3 ('NO ACTION').
+
+ DELETE_RULE: The referential action for the DELETE rule. The codes are
+ the same as for UPDATE_RULE.
+
+ Unfortunately, the DEFERRABILITY field is always "undef"; as a matter of
+ fact, deferrability clauses are supported by SQLite, but they can't be
+ reported because the "PRAGMA foreign_key_list" tells nothing about them.
+
+ UNIQUE_OR_PRIMARY: Whether the column is primary or unique.
+
+ Note: foreign key support in SQLite must be explicitly turned on through
+ a "PRAGMA" command; see "Foreign keys" earlier in this manual.
+
+ ping
+ my $bool = $dbh->ping;
+
+ returns true if the database file exists (or the database is in-memory),
+ and the database connection is active.
+
+DRIVER PRIVATE METHODS
+ The following methods can be called via the func() method with a little
+ tweak, but the use of func() method is now discouraged by the DBI author
+ for various reasons (see DBI's document
+ <http://search.cpan.org/dist/DBI/lib/DBI/DBD.pm#Using_install_method()_t
+ o_expose_driver-private_methods> for details). So, if you're using DBI
+ >= 1.608, use these "sqlite_" methods. If you need to use an older DBI,
+ you can call these like this:
+
+ $dbh->func( ..., "(method name without sqlite_ prefix)" );
+
+ Exception: "sqlite_trace" should always be called as is, even with
+ "func()" method (to avoid conflict with DBI's trace() method).
+
+ $dbh->func( ..., "sqlite_trace");
+
+ $dbh->sqlite_last_insert_rowid()
+ This method returns the last inserted rowid. If you specify an INTEGER
+ PRIMARY KEY as the first column in your table, that is the column that
+ is returned. Otherwise, it is the hidden ROWID column. See the sqlite
+ docs for details.
+
+ Generally you should not be using this method. Use the DBI
+ last_insert_id method instead. The usage of this is:
+
+ $h->last_insert_id($catalog, $schema, $table_name, $field_name [, \%attr ])
+
+ Running "$h->last_insert_id("","","","")" is the equivalent of running
+ "$dbh->sqlite_last_insert_rowid()" directly.
+
+ $dbh->sqlite_db_filename()
+ Retrieve the current (main) database filename. If the database is
+ in-memory or temporary, this returns "undef".
+
+ $dbh->sqlite_busy_timeout()
+ Retrieve the current busy timeout.
+
+ $dbh->sqlite_busy_timeout( $ms )
+ Set the current busy timeout. The timeout is in milliseconds.
+
+ $dbh->sqlite_create_function( $name, $argc, $code_ref )
+ This method will register a new function which will be usable in an SQL
+ query. The method's parameters are:
+
+ $name
+ The name of the function. This is the name of the function as it
+ will be used from SQL.
+
+ $argc
+ The number of arguments taken by the function. If this number is -1,
+ the function can take any number of arguments.
+
+ $code_ref
+ This should be a reference to the function's implementation.
+
+ For example, here is how to define a now() function which returns the
+ current number of seconds since the epoch:
+
+ $dbh->sqlite_create_function( 'now', 0, sub { return time } );
+
+ After this, it could be use from SQL as:
+
+ INSERT INTO mytable ( now() );
+
+ REGEXP function
+ SQLite includes syntactic support for an infix operator 'REGEXP', but
+ without any implementation. The "DBD::SQLite" driver automatically
+ registers an implementation that performs standard perl regular
+ expression matching, using current locale. So for example you can search
+ for words starting with an 'A' with a query like
+
+ SELECT * from table WHERE column REGEXP '\bA\w+'
+
+ If you want case-insensitive searching, use perl regex flags, like this
+ :
+
+ SELECT * from table WHERE column REGEXP '(?i:\bA\w+)'
+
+ The default REGEXP implementation can be overridden through the
+ "create_function" API described above.
+
+ Note that regexp matching will not use SQLite indices, but will iterate
+ over all rows, so it could be quite costly in terms of performance.
+
+ $dbh->sqlite_create_collation( $name, $code_ref )
+ This method manually registers a new function which will be usable in an
+ SQL query as a COLLATE option for sorting. Such functions can also be
+ registered automatically on demand: see section "COLLATION FUNCTIONS"
+ below.
+
+ The method's parameters are:
+
+ $name
+ The name of the function exposed to SQL.
+
+ $code_ref
+ Reference to the function's implementation. The driver will check
+ that this is a proper sorting function.
+
+ $dbh->sqlite_collation_needed( $code_ref )
+ This method manually registers a callback function that will be invoked
+ whenever an undefined collation sequence is required from an SQL
+ statement. The callback is invoked as
+
+ $code_ref->($dbh, $collation_name)
+
+ and should register the desired collation using
+ "sqlite_create_collation".
+
+ An initial callback is already registered by "DBD::SQLite", so for most
+ common cases it will be simpler to just add your collation sequences in
+ the %DBD::SQLite::COLLATION hash (see section "COLLATION FUNCTIONS"
+ below).
+
+ $dbh->sqlite_create_aggregate( $name, $argc, $pkg )
+ This method will register a new aggregate function which can then be
+ used from SQL. The method's parameters are:
+
+ $name
+ The name of the aggregate function, this is the name under which the
+ function will be available from SQL.
+
+ $argc
+ This is an integer which tells the SQL parser how many arguments the
+ function takes. If that number is -1, the function can take any
+ number of arguments.
+
+ $pkg
+ This is the package which implements the aggregator interface.
+
+ The aggregator interface consists of defining three methods:
+
+ new()
+ This method will be called once to create an object which should be
+ used to aggregate the rows in a particular group. The step() and
+ finalize() methods will be called upon the reference return by the
+ method.
+
+ step(@_)
+ This method will be called once for each row in the aggregate.
+
+ finalize()
+ This method will be called once all rows in the aggregate were
+ processed and it should return the aggregate function's result. When
+ there is no rows in the aggregate, finalize() will be called right
+ after new().
+
+ Here is a simple aggregate function which returns the variance (example
+ adapted from pysqlite):
+
+ package variance;
+
+ sub new { bless [], shift; }
+
+ sub step {
+ my ( $self, $value ) = @_;
+
+ push @$self, $value;
+ }
+
+ sub finalize {
+ my $self = $_[0];
+
+ my $n = @$self;
+
+ # Variance is NULL unless there is more than one row
+ return undef unless $n || $n == 1;
+
+ my $mu = 0;
+ foreach my $v ( @$self ) {
+ $mu += $v;
+ }
+ $mu /= $n;
+
+ my $sigma = 0;
+ foreach my $v ( @$self ) {
+ $sigma += ($v - $mu)**2;
+ }
+ $sigma = $sigma / ($n - 1);
+
+ return $sigma;
+ }
+
+ $dbh->sqlite_create_aggregate( "variance", 1, 'variance' );
+
+ The aggregate function can then be used as:
+
+ SELECT group_name, variance(score)
+ FROM results
+ GROUP BY group_name;
+
+ For more examples, see the DBD::SQLite::Cookbook.
+
+ $dbh->sqlite_progress_handler( $n_opcodes, $code_ref )
+ This method registers a handler to be invoked periodically during long
+ running calls to SQLite.
+
+ An example use for this interface is to keep a GUI updated during a
+ large query. The parameters are:
+
+ $n_opcodes
+ The progress handler is invoked once for every $n_opcodes virtual
+ machine opcodes in SQLite.
+
+ $code_ref
+ Reference to the handler subroutine. If the progress handler returns
+ non-zero, the SQLite operation is interrupted. This feature can be
+ used to implement a "Cancel" button on a GUI dialog box.
+
+ Set this argument to "undef" if you want to unregister a previous
+ progress handler.
+
+ $dbh->sqlite_commit_hook( $code_ref )
+ This method registers a callback function to be invoked whenever a
+ transaction is committed. Any callback set by a previous call to
+ "sqlite_commit_hook" is overridden. A reference to the previous callback
+ (if any) is returned. Registering an "undef" disables the callback.
+
+ When the commit hook callback returns zero, the commit operation is
+ allowed to continue normally. If the callback returns non-zero, then the
+ commit is converted into a rollback (in that case, any attempt to
+ *explicitly* call "$dbh->rollback()" afterwards would yield an error).
+
+ $dbh->sqlite_rollback_hook( $code_ref )
+ This method registers a callback function to be invoked whenever a
+ transaction is rolled back. Any callback set by a previous call to
+ "sqlite_rollback_hook" is overridden. A reference to the previous
+ callback (if any) is returned. Registering an "undef" disables the
+ callback.
+
+ $dbh->sqlite_update_hook( $code_ref )
+ This method registers a callback function to be invoked whenever a row
+ is updated, inserted or deleted. Any callback set by a previous call to
+ "sqlite_update_hook" is overridden. A reference to the previous callback
+ (if any) is returned. Registering an "undef" disables the callback.
+
+ The callback will be called as
+
+ $code_ref->($action_code, $database, $table, $rowid)
+
+ where
+
+ $action_code
+ is an integer equal to either "DBD::SQLite::INSERT",
+ "DBD::SQLite::DELETE" or "DBD::SQLite::UPDATE" (see "Action Codes");
+
+ $database
+ is the name of the database containing the affected row;
+
+ $table
+ is the name of the table containing the affected row;
+
+ $rowid
+ is the unique 64-bit signed integer key of the affected row within
+ that table.
+
+ $dbh->sqlite_set_authorizer( $code_ref )
+ This method registers an authorizer callback to be invoked whenever SQL
+ statements are being compiled by the "prepare" in DBI method. The
+ authorizer callback should return "DBD::SQLite::OK" to allow the action,
+ "DBD::SQLite::IGNORE" to disallow the specific action but allow the SQL
+ statement to continue to be compiled, or "DBD::SQLite::DENY" to cause
+ the entire SQL statement to be rejected with an error. If the authorizer
+ callback returns any other value, then then "prepare" call that
+ triggered the authorizer will fail with an error message.
+
+ An authorizer is used when preparing SQL statements from an untrusted
+ source, to ensure that the SQL statements do not try to access data they
+ are not allowed to see, or that they do not try to execute malicious
+ statements that damage the database. For example, an application may
+ allow a user to enter arbitrary SQL queries for evaluation by a
+ database. But the application does not want the user to be able to make
+ arbitrary changes to the database. An authorizer could then be put in
+ place while the user-entered SQL is being prepared that disallows
+ everything except SELECT statements.
+
+ The callback will be called as
+
+ $code_ref->($action_code, $string1, $string2, $database, $trigger_or_view)
+
+ where
+
+ $action_code
+ is an integer that specifies what action is being authorized (see
+ "Action Codes").
+
+ $string1, $string2
+ are strings that depend on the action code (see "Action Codes").
+
+ $database
+ is the name of the database ("main", "temp", etc.) if applicable.
+
+ $trigger_or_view
+ is the name of the inner-most trigger or view that is responsible
+ for the access attempt, or "undef" if this access attempt is
+ directly from top-level SQL code.
+
+ $dbh->sqlite_backup_from_file( $filename )
+ This method accesses the SQLite Online Backup API, and will take a
+ backup of the named database file, copying it to, and overwriting, your
+ current database connection. This can be particularly handy if your
+ current connection is to the special :memory: database, and you wish to
+ populate it from an existing DB.
+
+ $dbh->sqlite_backup_to_file( $filename )
+ This method accesses the SQLite Online Backup API, and will take a
+ backup of the currently connected database, and write it out to the
+ named file.
+
+ $dbh->sqlite_enable_load_extension( $bool )
+ Calling this method with a true value enables loading (external) sqlite3
+ extensions. After the call, you can load extensions like this:
+
+ $dbh->sqlite_enable_load_extension(1);
+ $sth = $dbh->prepare("select load_extension('libsqlitefunctions.so')")
+ or die "Cannot prepare: " . $dbh->errstr();
+
+ $dbh->sqlite_load_extension( $file, $proc )
+ Loading an extension by a select statement (with the "load_extension"
+ sqlite3 function like above) has some limitations. If you need to, say,
+ create other functions from an extension, use this method. $file (a path
+ to the extension) is mandatory, and $proc (an entry point name) is
+ optional. You need to call "sqlite_enable_load_extension" before calling
+ "sqlite_load_extension".
+
+ $dbh->sqlite_trace( $code_ref )
+ This method registers a trace callback to be invoked whenever SQL
+ statements are being run.
+
+ The callback will be called as
+
+ $code_ref->($statement)
+
+ where
+
+ $statement
+ is a UTF-8 rendering of the SQL statement text as the statement
+ first begins executing.
+
+ Additional callbacks might occur as each triggered subprogram is
+ entered. The callbacks for triggers contain a UTF-8 SQL comment that
+ identifies the trigger.
+
+ See also "TRACING" in DBI for better tracing options.
+
+ $dbh->sqlite_profile( $code_ref )
+ This method registers a profile callback to be invoked whenever a SQL
+ statement finishes.
+
+ The callback will be called as
+
+ $code_ref->($statement, $elapsed_time)
+
+ where
+
+ $statement
+ is the original statement text (without bind parameters).
+
+ $elapsed_time
+ is an estimate of wall-clock time of how long that statement took to
+ run (in milliseconds).
+
+ This method is considered experimental and is subject to change in
+ future versions of SQLite.
+
+ See also DBI::Profile for better profiling options.
+
+ $dbh->sqlite_table_column_metadata( $dbname, $tablename, $columnname )
+ is for internal use only.
+
+ DBD::SQLite::compile_options()
+ Returns an array of compile options (available since sqlite 3.6.23,
+ bundled in DBD::SQLite 1.30_01), or an empty array if the bundled
+ library is old or compiled with SQLITE_OMIT_COMPILEOPTION_DIAGS.
+
+ DBD::SQLite::sqlite_status()
+ Returns a hash reference that holds a set of status information of
+ SQLite runtime such as memory usage or page cache usage (see
+ <http://www.sqlite.org/c3ref/c_status_malloc_count.html> for details).
+ Each of the entry contains the current value and the highwater value.
+
+ my $status = DBD::SQLite::sqlite_status();
+ my $cur = $status->{memory_used}{current};
+ my $high = $status->{memory_used}{highwater};
+
+ You may also pass 0 as an argument to reset the status.
+
+ $dbh->sqlite_db_status()
+ Returns a hash reference that holds a set of status information of
+ database connection such as cache usage. See
+ <http://www.sqlite.org/c3ref/c_dbstatus_options.html> for details. You
+ may also pass 0 as an argument to reset the status.
+
+ $sth->sqlite_st_status()
+ Returns a hash reference that holds a set of status information of
+ SQLite statement handle such as full table scan count. See
+ <http://www.sqlite.org/c3ref/c_stmtstatus_counter.html> for details.
+ Statement status only holds the current value.
+
+ my $status = $sth->sqlite_st_status();
+ my $cur = $status->{fullscan_step};
+
+ You may also pass 0 as an argument to reset the status.
+
+DRIVER CONSTANTS
+ A subset of SQLite C constants are made available to Perl, because they
+ may be needed when writing hooks or authorizer callbacks. For accessing
+ such constants, the "DBD::SQLite" module must be explicitly "use"d at
+ compile time. For example, an authorizer that forbids any DELETE
+ operation would be written as follows :
+
+ use DBD::SQLite;
+ $dbh->sqlite_set_authorizer(sub {
+ my $action_code = shift;
+ return $action_code == DBD::SQLite::DELETE ? DBD::SQLite::DENY
+ : DBD::SQLite::OK;
+ });
+
+ The list of constants implemented in "DBD::SQLite" is given below; more
+ information can be found ad at
+ <http://www.sqlite.org/c3ref/constlist.html>.
+
+ Authorizer Return Codes
+ OK
+ DENY
+ IGNORE
+
+ Action Codes
+ The "set_authorizer" method registers a callback function that is
+ invoked to authorize certain SQL statement actions. The first parameter
+ to the callback is an integer code that specifies what action is being
+ authorized. The second and third parameters to the callback are strings,
+ the meaning of which varies according to the action code. Below is the
+ list of action codes, together with their associated strings.
+
+ # constant string1 string2
+ # ======== ======= =======
+ CREATE_INDEX Index Name Table Name
+ CREATE_TABLE Table Name undef
+ CREATE_TEMP_INDEX Index Name Table Name
+ CREATE_TEMP_TABLE Table Name undef
+ CREATE_TEMP_TRIGGER Trigger Name Table Name
+ CREATE_TEMP_VIEW View Name undef
+ CREATE_TRIGGER Trigger Name Table Name
+ CREATE_VIEW View Name undef
+ DELETE Table Name undef
+ DROP_INDEX Index Name Table Name
+ DROP_TABLE Table Name undef
+ DROP_TEMP_INDEX Index Name Table Name
+ DROP_TEMP_TABLE Table Name undef
+ DROP_TEMP_TRIGGER Trigger Name Table Name
+ DROP_TEMP_VIEW View Name undef
+ DROP_TRIGGER Trigger Name Table Name
+ DROP_VIEW View Name undef
+ INSERT Table Name undef
+ PRAGMA Pragma Name 1st arg or undef
+ READ Table Name Column Name
+ SELECT undef undef
+ TRANSACTION Operation undef
+ UPDATE Table Name Column Name
+ ATTACH Filename undef
+ DETACH Database Name undef
+ ALTER_TABLE Database Name Table Name
+ REINDEX Index Name undef
+ ANALYZE Table Name undef
+ CREATE_VTABLE Table Name Module Name
+ DROP_VTABLE Table Name Module Name
+ FUNCTION undef Function Name
+ SAVEPOINT Operation Savepoint Name
+
+COLLATION FUNCTIONS
+ Definition
+ SQLite v3 provides the ability for users to supply arbitrary comparison
+ functions, known as user-defined "collation sequences" or "collating
+ functions", to be used for comparing two text values.
+ <http://www.sqlite.org/datatype3.html#collation> explains how collations
+ are used in various SQL expressions.
+
+ Builtin collation sequences
+ The following collation sequences are builtin within SQLite :
+
+ BINARY
+ Compares string data using memcmp(), regardless of text encoding.
+
+ NOCASE
+ The same as binary, except the 26 upper case characters of ASCII are
+ folded to their lower case equivalents before the comparison is
+ performed. Note that only ASCII characters are case folded. SQLite
+ does not attempt to do full UTF case folding due to the size of the
+ tables required.
+
+ RTRIM
+ The same as binary, except that trailing space characters are
+ ignored.
+
+ In addition, "DBD::SQLite" automatically installs the following
+ collation sequences :
+
+ perl
+ corresponds to the Perl "cmp" operator
+
+ perllocale
+ Perl "cmp" operator, in a context where "use locale" is activated.
+
+ Usage
+ You can write for example
+
+ CREATE TABLE foo(
+ txt1 COLLATE perl,
+ txt2 COLLATE perllocale,
+ txt3 COLLATE nocase
+ )
+
+ or
+
+ SELECT * FROM foo ORDER BY name COLLATE perllocale
+
+ Unicode handling
+ If the attribute "$dbh->{sqlite_unicode}" is set, strings coming from
+ the database and passed to the collation function will be properly
+ tagged with the utf8 flag; but this only works if the "sqlite_unicode"
+ attribute is set before the first call to a perl collation sequence .
+ The recommended way to activate unicode is to set the parameter at
+ connection time :
+
+ my $dbh = DBI->connect(
+ "dbi:SQLite:dbname=foo", "", "",
+ {
+ RaiseError => 1,
+ sqlite_unicode => 1,
+ }
+ );
+
+ Adding user-defined collations
+ The native SQLite API for adding user-defined collations is exposed
+ through methods "sqlite_create_collation" and "sqlite_collation_needed".
+
+ To avoid calling these functions every time a $dbh handle is created,
+ "DBD::SQLite" offers a simpler interface through the
+ %DBD::SQLite::COLLATION hash : just insert your own collation functions
+ in that hash, and whenever an unknown collation name is encountered in
+ SQL, the appropriate collation function will be loaded on demand from
+ the hash. For example, here is a way to sort text values regardless of
+ their accented characters :
+
+ use DBD::SQLite;
+ $DBD::SQLite::COLLATION{no_accents} = sub {
+ my ( $a, $b ) = map lc, @_;
+ tr[����������������������������]
+ [aaaaaacdeeeeiiiinoooooouuuuy] for $a, $b;
+ $a cmp $b;
+ };
+ my $dbh = DBI->connect("dbi:SQLite:dbname=dbfile");
+ my $sql = "SELECT ... FROM ... ORDER BY ... COLLATE no_accents");
+ my $rows = $dbh->selectall_arrayref($sql);
+
+ The builtin "perl" or "perllocale" collations are predefined in that
+ same hash.
+
+ The COLLATION hash is a global registry within the current process;
+ hence there is a risk of undesired side-effects. Therefore, to prevent
+ action at distance, the hash is implemented as a "write-only" hash, that
+ will happily accept new entries, but will raise an exception if any
+ attempt is made to override or delete a existing entry (including the
+ builtin "perl" and "perllocale").
+
+ If you really, really need to change or delete an entry, you can always
+ grab the tied object underneath %DBD::SQLite::COLLATION --- but don't do
+ that unless you really know what you are doing. Also observe that
+ changes in the global hash will not modify existing collations in
+ existing database handles: it will only affect new *requests* for
+ collations. In other words, if you want to change the behaviour of a
+ collation within an existing $dbh, you need to call the
+ "create_collation" method directly.
+
+FULLTEXT SEARCH
+ The FTS3 extension module within SQLite allows users to create special
+ tables with a built-in full-text index (hereafter "FTS3 tables"). The
+ full-text index allows the user to efficiently query the database for
+ all rows that contain one or more instances of a specified word
+ (hereafter a "token"), even if the table contains many large documents.
+
+ Short introduction to FTS3
+ The detailed documentation for FTS3 can be found at
+ <http://www.sqlite.org/fts3.html>. Here is a very short example :
+
+ $dbh->do(<<"") or die DBI::errstr;
+ CREATE VIRTUAL TABLE fts_example USING fts3(content)
+
+ my $sth = $dbh->prepare("INSERT INTO fts_example(content) VALUES (?))");
+ $sth->execute($_) foreach @docs_to_insert;
+
+ my $results = $dbh->selectall_arrayref(<<"");
+ SELECT docid, snippet(content) FROM fts_example WHERE content MATCH 'foo'
+
+ The key points in this example are :
+
+ * The syntax for creating FTS3 tables is
+
+ CREATE VIRTUAL TABLE <table_name> USING fts3(<columns>)
+
+ where "<columns>" is a list of column names. Columns may be typed,
+ but the type information is ignored. If no columns are specified,
+ the default is a single column named "content". In addition, FTS3
+ tables have an implicit column called "docid" (or also "rowid") for
+ numbering the stored documents.
+
+ * Statements for inserting, updating or deleting records use the same
+ syntax as for regular SQLite tables.
+
+ * Full-text searches are specified with the "MATCH" operator, and an
+ operand which may be a single word, a word prefix ending with '*', a
+ list of words, a "phrase query" in double quotes, or a boolean
+ combination of the above.
+
+ * The builtin function "snippet(...)" builds a formatted excerpt of
+ the document text, where the words pertaining to the query are
+ highlighted.
+
+ There are many more details to building and searching FTS3 tables, so we
+ strongly invite you to read the full documentation at at
+ <http://www.sqlite.org/fts3.html>.
+
+ Incompatible change : starting from version 1.31, "DBD::SQLite" uses the
+ new, recommended "Enhanced Query Syntax" for binary set operators (AND,
+ OR, NOT, possibly nested with parenthesis). Previous versions of
+ "DBD::SQLite" used the "Standard Query Syntax" (see
+ <http://www.sqlite.org/fts3.html#section_3_2>). Unfortunately this is a
+ compilation switch, so it cannot be tuned at runtime; however, since
+ FTS3 was never advertised in versions prior to 1.31, the change should
+ be invisible to the vast majority of "DBD::SQLite" users. If, however,
+ there are any applications that nevertheless were built using the
+ "Standard Query" syntax, they have to be migrated, because the
+ precedence of the "OR" operator has changed. Conversion from old to new
+ syntax can be automated through DBD::SQLite::FTS3Transitional, published
+ in a separate distribution.
+
+ Tokenizers
+ The behaviour of full-text indexes strongly depends on how documents are
+ split into *tokens*; therefore FTS3 table declarations can explicitly
+ specify how to perform tokenization:
+
+ CREATE ... USING fts3(<columns>, tokenize=<tokenizer>)
+
+ where "<tokenizer>" is a sequence of space-separated words that triggers
+ a specific tokenizer, as explained below.
+
+ SQLite builtin tokenizers
+ SQLite comes with three builtin tokenizers :
+
+ simple
+ Under the *simple* tokenizer, a term is a contiguous sequence of
+ eligible characters, where eligible characters are all alphanumeric
+ characters, the "_" character, and all characters with UTF
+ codepoints greater than or equal to 128. All other characters are
+ discarded when splitting a document into terms. They serve only to
+ separate adjacent terms.
+
+ All uppercase characters within the ASCII range (UTF codepoints less
+ than 128), are transformed to their lowercase equivalents as part of
+ the tokenization process. Thus, full-text queries are
+ case-insensitive when using the simple tokenizer.
+
+ porter
+ The *porter* tokenizer uses the same rules to separate the input
+ document into terms, but as well as folding all terms to lower case
+ it uses the Porter Stemming algorithm to reduce related English
+ language words to a common root.
+
+ icu If SQLite is compiled with the SQLITE_ENABLE_ICU pre-processor
+ symbol defined, then there exists a built-in tokenizer named "icu"
+ implemented using the ICU library, and taking an ICU locale
+ identifier as argument (such as "tr_TR" for Turkish as used in
+ Turkey, or "en_AU" for English as used in Australia). For example:
+
+ CREATE VIRTUAL TABLE thai_text USING fts3(text, tokenize=icu th_TH)
+
+ The ICU tokenizer implementation is very simple. It splits the input
+ text according to the ICU rules for finding word boundaries and
+ discards any tokens that consist entirely of white-space. This may
+ be suitable for some applications in some locales, but not all. If
+ more complex processing is required, for example to implement
+ stemming or discard punctuation, use the perl tokenizer as explained
+ below.
+
+ Perl tokenizers
+ In addition to the builtin SQLite tokenizers, "DBD::SQLite" implements a
+ *perl* tokenizer, that can hook to any tokenizing algorithm written in
+ Perl. This is specified as follows :
+
+ CREATE ... USING fts3(<columns>, tokenize=perl '<perl_function>')
+
+ where "<perl_function>" is a fully qualified Perl function name (i.e.
+ prefixed by the name of the package in which that function is declared).
+ So for example if the function is "my_func" in the main program, write
+
+ CREATE ... USING fts3(<columns>, tokenize=perl 'main::my_func')
+
+ That function should return a code reference that takes a string as
+ single argument, and returns an iterator (another function), which
+ returns a tuple "($term, $len, $start, $end, $index)" for each term.
+ Here is a simple example that tokenizes on words according to the
+ current perl locale
+
+ sub locale_tokenizer {
+ return sub {
+ my $string = shift;
+
+ use locale;
+ my $regex = qr/\w+/;
+ my $term_index = 0;
+
+ return sub { # closure
+ $string =~ /$regex/g or return; # either match, or no more token
+ my ($start, $end) = ($-[0], $+[0]);
+ my $len = $end-$start;
+ my $term = substr($string, $start, $len);
+ return ($term, $len, $start, $end, $term_index++);
+ }
+ };
+ }
+
+ There must be three levels of subs, in a kind of "Russian dolls"
+ structure, because :
+
+ * the external, named sub is called whenever accessing a FTS3 table
+ with that tokenizer
+
+ * the inner, anonymous sub is called whenever a new string needs to be
+ tokenized (either for inserting new text into the table, or for
+ analyzing a query).
+
+ * the innermost, anonymous sub is called repeatedly for retrieving all
+ terms within that string.
+
+ Instead of writing tokenizers by hand, you can grab one of those already
+ implemented in the Search::Tokenizer module :
+
+ use Search::Tokenizer;
+ $dbh->do(<<"") or die DBI::errstr;
+ CREATE ... USING fts3(<columns>,
+ tokenize=perl 'Search::Tokenizer::unaccent')
+
+ or you can use "new" in Search::Tokenizer to build your own tokenizer.
+
+ Incomplete handling of utf8 characters
+ The current FTS3 implementation in SQLite is far from complete with
+ respect to utf8 handling : in particular, variable-length characters are
+ not treated correctly by the builtin functions "offsets()" and
+ "snippet()".
+
+ Database space for FTS3
+ FTS3 stores a complete copy of the indexed documents, together with the
+ fulltext index. On a large collection of documents, this can consume
+ quite a lot of disk space. If copies of documents are also available as
+ external resources (for example files on the filesystem), that space can
+ sometimes be spared --- see the tip in the Cookbook.
+
+R* TREE SUPPORT
+ The RTREE extension module within SQLite adds support for creating a
+ R-Tree, a special index for range and multidimensional queries. This
+ allows users to create tables that can be loaded with (as an example)
+ geospatial data such as latitude/longitude coordinates for buildings
+ within a city :
+
+ CREATE VIRTUAL TABLE city_buildings USING rtree(
+ id, -- Integer primary key
+ minLong, maxLong, -- Minimum and maximum longitude
+ minLat, maxLat -- Minimum and maximum latitude
+ );
+
+ then query which buildings overlap or are contained within a specified
+ region:
+
+ # IDs that are contained within query coordinates
+ my $contained_sql = <<"";
+ SELECT id FROM try_rtree
+ WHERE minLong >= ? AND maxLong <= ?
+ AND minLat >= ? AND maxLat <= ?
+
+ # ... and those that overlap query coordinates
+ my $overlap_sql = <<"";
+ SELECT id FROM try_rtree
+ WHERE maxLong >= ? AND minLong <= ?
+ AND maxLat >= ? AND minLat <= ?
+
+ my $contained = $dbh->selectcol_arrayref($contained_sql,undef,
+ $minLong, $maxLong, $minLat, $maxLat);
+
+ my $overlapping = $dbh->selectcol_arrayref($overlap_sql,undef,
+ $minLong, $maxLong, $minLat, $maxLat);
+
+ For more detail, please see the SQLite R-Tree page
+ (<http://www.sqlite.org/rtree.html>). Note that custom R-Tree queries
+ using callbacks, as mentioned in the prior link, have not been
+ implemented yet.
+
+FOR DBD::SQLITE EXTENSION AUTHORS
+ Since 1.30_01, you can retrieve the bundled sqlite C source and/or
+ header like this:
+
+ use File::ShareDir 'dist_dir';
+ use File::Spec::Functions 'catfile';
+
+ # the whole sqlite3.h header
+ my $sqlite3_h = catfile(dist_dir('DBD-SQLite'), 'sqlite3.h');
+
+ # or only a particular header, amalgamated in sqlite3.c
+ my $what_i_want = 'parse.h';
+ my $sqlite3_c = catfile(dist_dir('DBD-SQLite'), 'sqlite3.c');
+ open my $fh, '<', $sqlite3_c or die $!;
+ my $code = do { local $/; <$fh> };
+ my ($parse_h) = $code =~ m{(
+ /\*+[ ]Begin[ ]file[ ]$what_i_want[ ]\*+
+ .+?
+ /\*+[ ]End[ ]of[ ]$what_i_want[ ]\*+/
+ )}sx;
+ open my $out, '>', $what_i_want or die $!;
+ print $out $parse_h;
+ close $out;
+
+ You usually want to use this in your extension's "Makefile.PL", and you
+ may want to add DBD::SQLite to your extension's "CONFIGURE_REQUIRES" to
+ ensure your extension users use the same C source/header they use to
+ build DBD::SQLite itself (instead of the ones installed in their
+ system).
+
+TO DO
+ The following items remain to be done.
+
+ Leak Detection
+ Implement one or more leak detection tests that only run during
+ AUTOMATED_TESTING and RELEASE_TESTING and validate that none of the C
+ code we work with leaks.
+
+ Stream API for Blobs
+ Reading/writing into blobs using "sqlite2_blob_open" /
+ "sqlite2_blob_close".
+
+ Flags for sqlite3_open_v2
+ Support the full API of sqlite3_open_v2 (flags for opening the file).
+
+ Support for custom callbacks for R-Tree queries
+ Custom queries of a R-Tree index using a callback are possible with the
+ SQLite C API (<http://www.sqlite.org/rtree.html>), so one could
+ potentially use a callback that narrowed the result set down based on a
+ specific need, such as querying for overlapping circles.
+
+SUPPORT
+ Bugs should be reported via the CPAN bug tracker at
+
+ <http://rt.cpan.org/NoAuth/ReportBug.html?Queue=DBD-SQLite>
+
+ Note that bugs of bundled sqlite library (i.e. bugs in "sqlite3.[ch]")
+ should be reported to the sqlite developers at sqlite.org via their bug
+ tracker or via their mailing list.
+
+AUTHORS
+ Matt Sergeant <matt@sergeant.org>
+
+ Francis J. Lacoste <flacoste@logreport.org>
+
+ Wolfgang Sourdeau <wolfgang@logreport.org>
+
+ Adam Kennedy <adamk@cpan.org>
+
+ Max Maischein <corion@cpan.org>
+
+ Laurent Dami <dami@cpan.org>
+
+ Kenichi Ishigaki <ishigaki@cpan.org>
+
+COPYRIGHT
+ The bundled SQLite code in this distribution is Public Domain.
+
+ DBD::SQLite is copyright 2002 - 2007 Matt Sergeant.
+
+ Some parts copyright 2008 Francis J. Lacoste.
+
+ Some parts copyright 2008 Wolfgang Sourdeau.
+
+ Some parts copyright 2008 - 2012 Adam Kennedy.
+
+ Some parts copyright 2009 - 2012 Kenichi Ishigaki.
+
+ Some parts derived from DBD::SQLite::Amalgamation copyright 2008 Audrey
+ Tang.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the same terms as Perl itself.
+
+ The full text of the license can be found in the LICENSE file included
+ with this module.
+