NAME
DBIx::ThinSQL::SQLite - add various functions to SQLite
VERSION
0.0.17 (2017-01-04) Development release.
SYNOPSIS
use DBIx::ThinSQL;
use DBIx::ThinSQL::SQLite
qw/create_functions
create_methods
create_sqlite_sequence/;
my $db = DBIx::ThinSQL->connect('dbi:SQLite:dbname=...');
# Call once only to initialize permanently
create_sqlite_sequence($db);
# Call after every connect to the database
create_functions( $db, qw/ debug create_sequence currval / );
# Call once every program run
create_methods(qw/create_sequence nextval/);
# Then use SQL functions or Perl methods as required
$db->do(q{ SELECT debug('logged via Log::Any->debug'); });
$db->do(q{ SELECT create_sequence('name'); });
$db->do(q{ SELECT nextval('name'); });
$db->create_sequence('othername');
$db->nextval('othername');
DESCRIPTION
DBIx::ThinSQL::SQLite adds various functions to the SQL syntax understood by SQLite, using the sqlite_create_function() and sqlite_create_aggregate_function() methods of DBD::SQLite. It also adds sequence methods to DBIx::ThinSQL database handles.
The following functions are exported on request:
- create_sqlite_sequence( $dbh )
-
[DEPRECIATED - no longer required]
Ensure that the
sqlite_sequencetable exists. This function must be called on the database (once only - the changes are permanent) before any of the other sequence related functions or methods will work.This function works by creating (and dropping) a table with an
INTEGER PRIMARY KEY AUTOINCREMENTdefinition. If you are using the sequence support from this module you probably don't want to be creating your own tables with the autoincrement feature, as it may clash with this module. - create_functions( $dbh, @functions )
-
Add
@functionsto the SQL understood by SQLite for the database handle$dbh.@functionscan be any combination of the following:- debug( @items )
-
This function called from SQL context logs
@itemswith adebug()call to a Log::Any instance. If the first item of@itemsbegins with/^select/ithen that statement will be run and the result logged usinglog_debugfrom DBIx::ThinSQL instead. - warn( @items )
-
This function called from SQL context logs
@itemsusing Perl'swarnfunction. If the first item of@itemsbegins with/^select/ithen that statement will be run using the current handle and the result warned instead. - create_sequence( $name )
-
Create a sequence in the database with name $name.
- nextval( $name ) -> Int
-
Advance the sequence to its next value and return that value.
- currval( $name ) -> Int
-
Return the current value of the sequence.
If Digest::SHA is installed then the following functions can also be created.
- sha1( $expr, ... ) -> bytes
-
Calculate the SHA digest of
$exprand return it in a 20-byte binary form. Unfortunately it seems that the underlying SQLite C sqlite_create_function() provides no way to identify the result as a blob, so you must always manually cast the result in SQL like so:CAST(sha1(SQLITE_EXPRESSION) AS blob) - sha1_hex( $expr, ... ) -> hexidecimal
-
Calculate the SQLite digest of
$exprand return it in a 40-character hexidecimal form. - sha1_base64( $expr, ... ) -> base64
-
Calculate the SQLite digest of
$exprand return it in a base64 encoded form. - agg_sha1( $expr, $sort_expr ) -> bytes
- agg_sha1_hex( $expr, $sort_expr ) -> hexidecimal
- agg_sha1_base64( $expr, $sort_expr ) -> base64
-
These aggregate functions are for use with statements using GROUP BY.
$expris the expression on which to calculate the SHA1 hash, and$sort_exprdetermines the (string) comparison order in which$expris fed to the SHA1 stream.
Note that user-defined SQLite functions are only valid for the current session. They must be created each time you connect to the database. You can have this happen automatically at connect time by taking advantage of the DBI
Callbacksattribute:my $db = DBI::ThinSQL->connect( $dsn, undef, undef, { Callbacks => { connected => sub { my $dbh = shift; create_functions( $dbh, qw/debug nextval/ ); } }, } ); - create_methods( @methods )
-
Add
@methodsto the DBIx::ThinSQL::db class which can be any combination of the following:- create_sequence( $name )
-
Create a sequence in the database with name $name.
- nextval( $name ) -> Int
-
Advance the sequence to its next value and return that value.
- currval( $name ) -> Int
-
Return the current value of the sequence.
These methods are added to a Perl class and are therefore available to any DBIx::ThinSQL handle.
SEE ALSO
AUTHOR
Mark Lawrence <nomad@null.net>
COPYRIGHT AND LICENSE
Copyright (C) 2013-2014 Mark Lawrence <nomad@null.net>
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.