1 package DBIx::Class::Storage::DBI::SQLite;
6 use base qw/DBIx::Class::Storage::DBI/;
9 use SQL::Abstract 'is_plain_value';
10 use DBIx::Class::_Util qw(modver_gt_or_eq sigwarn_silencer);
11 use DBIx::Class::Carp;
15 __PACKAGE__->sql_maker_class('DBIx::Class::SQLMaker::SQLite');
16 __PACKAGE__->sql_limit_dialect ('LimitOffset');
17 __PACKAGE__->sql_quote_char ('"');
18 __PACKAGE__->datetime_parser_type ('DateTime::Format::SQLite');
22 DBIx::Class::Storage::DBI::SQLite - Automatic primary key class for SQLite
26 # In your table classes
27 use base 'DBIx::Class::Core';
28 __PACKAGE__->set_primary_key('id');
32 This class implements autoincrements for SQLite.
40 NOTE - This section applies to you only if ALL of these are true:
42 * You are or were using DBD::SQLite with a version lesser than 1.38_01
44 * You are or were using DBIx::Class versions between 0.08191 and 0.08209
45 (inclusive) or between 0.08240-TRIAL and 0.08242-TRIAL (also inclusive)
47 * You use objects with overloaded stringification and are feeding them
48 to DBIC CRUD methods directly
50 An unfortunate chain of events led to DBIx::Class silently hitting the problem
51 described in L<RT#79576|https://rt.cpan.org/Public/Bug/Display.html?id=79576>.
53 In order to trigger the bug condition one needs to supply B<more than one>
54 bind value that is an object with overloaded stringification (numification
55 is not relevant, only stringification is). When this is the case the internal
56 DBIx::Class call to C<< $sth->bind_param >> would be executed in a way that
57 triggers the above-mentioned DBD::SQLite bug. As a result all the logs and
58 tracers will contain the expected values, however SQLite will receive B<all>
59 these bind positions being set to the value of the B<last> supplied
62 Even if you upgrade DBIx::Class (which works around the bug starting from
63 version 0.08210) you may still have corrupted/incorrect data in your database.
64 DBIx::Class will currently detect when this condition (more than one
65 stringifiable object in one CRUD call) is encountered and will issue a warning
66 pointing to this section. This warning will be removed 2 years from now,
67 around April 2015, You can disable it after you've audited your data by
68 setting the C<DBIC_RT79576_NOWARN> environment variable. Note - the warning
69 is emitted only once per callsite per process and only when the condition in
70 question is encountered. Thus it is very unlikely that your logsystem will be
71 flooded as a result of this.
85 my ($self, $dir) = @_;
88 ## Where is the db file?
89 my $dsn = $self->_dbi_connect_info()->[0];
91 my $dbname = $1 if($dsn =~ /dbname=([^;]+)/);
94 $dbname = $1 if($dsn =~ /^dbi:SQLite:(.+)$/i);
96 $self->throw_exception("Cannot determine name of SQLite db file")
97 if(!$dbname || !-f $dbname);
99 # print "Found database: $dbname\n";
100 # my $dbfile = file($dbname);
101 my ($vol, $dbdir, $file) = File::Spec->splitpath($dbname);
102 # my $file = $dbfile->basename();
103 $file = POSIX::strftime("%Y-%m-%d-%H_%M_%S", localtime()) . $file;
104 $file = "B$file" while(-f $file);
106 mkdir($dir) unless -f $dir;
107 my $backupfile = File::Spec->catfile($dir, $file);
109 my $res = File::Copy::copy($dbname, $backupfile);
110 $self->throw_exception("Backup failed! ($!)") if(!$res);
115 sub _exec_svp_begin {
116 my ($self, $name) = @_;
118 $self->_dbh->do("SAVEPOINT $name");
121 sub _exec_svp_release {
122 my ($self, $name) = @_;
124 $self->_dbh->do("RELEASE SAVEPOINT $name");
127 sub _exec_svp_rollback {
128 my ($self, $name) = @_;
130 $self->_dbh->do("ROLLBACK TO SAVEPOINT $name");
133 # older SQLite has issues here too - both of these are in fact
134 # completely benign warnings (or at least so say the tests)
135 sub _exec_txn_rollback {
136 local $SIG{__WARN__} = sigwarn_silencer( qr/rollback ineffective/ )
137 unless $DBD::SQLite::__DBIC_TXN_SYNC_SANE__;
139 shift->next::method(@_);
142 sub _exec_txn_commit {
143 local $SIG{__WARN__} = sigwarn_silencer( qr/commit ineffective/ )
144 unless $DBD::SQLite::__DBIC_TXN_SYNC_SANE__;
146 shift->next::method(@_);
152 # Be extremely careful what we do here. SQLite is notoriously bad at
153 # synchronizing its internal transaction state with {AutoCommit}
154 # https://metacpan.org/source/ADAMK/DBD-SQLite-1.37/lib/DBD/SQLite.pm#L921
155 # There is a function http://www.sqlite.org/c3ref/get_autocommit.html
156 # but DBD::SQLite does not expose it (nor does it seem to properly use it)
158 # Therefore only execute a "ping" when we have no other choice *AND*
159 # scrutinize the thrown exceptions to make sure we are where we think we are
160 my $dbh = $self->_dbh or return undef;
161 return undef unless $dbh->FETCH('Active');
162 return undef unless $dbh->ping;
166 # older DBD::SQLite does not properly synchronize commit state between
167 # the libsqlite and the $dbh
168 unless (defined $DBD::SQLite::__DBIC_TXN_SYNC_SANE__) {
169 $DBD::SQLite::__DBIC_TXN_SYNC_SANE__ = modver_gt_or_eq('DBD::SQLite', '1.38_02');
172 # fallback to travesty
173 unless ($DBD::SQLite::__DBIC_TXN_SYNC_SANE__) {
174 # since we do not have access to sqlite3_get_autocommit(), do a trick
175 # to attempt to *safely* determine what state are we *actually* in.
177 # also using T::T here leads to bizarre leaks - will figure it out later
178 my $really_not_in_txn = do {
181 # older versions of DBD::SQLite do not properly detect multiline BEGIN/COMMIT
182 # statements to adjust their {AutoCommit} state. Hence use such a statement
183 # pair here as well, in order to escape from poking {AutoCommit} needlessly
184 # https://rt.cpan.org/Public/Bug/Display.html?id=80087
186 # will fail instantly if already in a txn
187 $dbh->do("-- multiline\nBEGIN");
188 $dbh->do("-- multiline\nCOMMIT");
191 ($@ =~ /transaction within a transaction/)
198 # if we were unable to determine this - we may very well be dead
199 if (not defined $really_not_in_txn) {
202 # check the AC sync-state
203 elsif ($really_not_in_txn xor $dbh->{AutoCommit}) {
205 'Internal transaction state of handle %s (apparently %s a transaction) does not seem to '
206 . 'match its AutoCommit attribute setting of %s - this is an indication of a '
207 . 'potentially serious bug in your transaction handling logic',
209 $really_not_in_txn ? 'NOT in' : 'in',
210 $dbh->{AutoCommit} ? 'TRUE' : 'FALSE',
213 # it is too dangerous to execute anything else in this state
214 # assume everything works (safer - worst case scenario next statement throws)
219 # do the actual test and return on no failure
220 ( $ping_fail ||= ! try { $dbh->do('SELECT * FROM sqlite_master LIMIT 1'); 1 } )
221 or return 1; # the actual RV of _ping()
223 # ping failed (or so it seems) - need to do some cleanup
224 # it is possible to have a proper "connection", and have "ping" return
225 # false anyway (e.g. corrupted file). In such cases DBD::SQLite still
226 # keeps the actual file handle open. We don't really want this to happen,
227 # so force-close the handle via DBI itself
229 local $@; # so that we do not clobber the real error as set above
230 eval { $dbh->disconnect }; # if it fails - it fails
231 undef; # the actual RV of _ping()
234 sub deployment_statements {
236 my ($schema, $type, $version, $dir, $sqltargs, @rest) = @_;
241 ! exists $sqltargs->{producer_args}{sqlite_version}
243 my $dver = $self->_server_info->{normalized_dbms_version}
245 $sqltargs->{producer_args}{sqlite_version} = $dver;
248 $self->next::method($schema, $type, $version, $dir, $sqltargs, @rest);
251 sub bind_attribute_by_data_type {
253 # According to http://www.sqlite.org/datatype3.html#storageclasses
254 # all numeric types are dynamically allocated up to 8 bytes per
256 # Thus it should be safe and non-wasteful to bind everything as
257 # SQL_BIGINT and have SQLite deal with storage/comparisons however
259 $_[1] =~ /^ (?: int(?:[1248]|eger)? | (?:tiny|small|medium|big)int ) $/ix
265 # FIXME - what the flying fuck... work around RT#76395
266 # DBD::SQLite warns on binding >32 bit values with 32 bit IVs
270 DBIx::Class::_ENV_::IV_SIZE < 8
272 DBIx::Class::_ENV_::OS_NAME eq 'MSWin32'
275 ! defined $DBD::SQLite::__DBIC_CHECK_dbd_mishandles_bound_BIGINT
277 $DBD::SQLite::__DBIC_CHECK_dbd_mishandles_bound_BIGINT = (
278 modver_gt_or_eq('DBD::SQLite', '1.37')
282 local $SIG{__WARN__} = sigwarn_silencer( qr/
283 \Qdatatype mismatch: bind\E \s (?:
284 param \s+ \( \d+ \) \s+ [-+]? \d+ (?: \. 0*)? \Q as integer\E
286 \d+ \s type \s @{[ DBI::SQL_BIGINT() ]} \s as \s [-+]? \d+ (?: \. 0*)?
290 DBIx::Class::_ENV_::IV_SIZE < 8
292 DBIx::Class::_ENV_::OS_NAME eq 'MSWin32'
295 $DBD::SQLite::__DBIC_CHECK_dbd_mishandles_bound_BIGINT
298 shift->next::method(@_);
301 # DBD::SQLite (at least up to version 1.31 has a bug where it will
302 # non-fatally numify a string value bound as an integer, resulting
303 # in insertions of '0' into supposed-to-be-numeric fields
304 # Since this can result in severe data inconsistency, remove the
305 # bind attr if such a situation is detected
307 # FIXME - when a DBD::SQLite version is released that eventually fixes
308 # this situation (somehow) - no-op this override once a proper DBD
309 # version is detected
310 sub _dbi_attrs_for_bind {
311 my ($self, $ident, $bind) = @_;
313 my $bindattrs = $self->next::method($ident, $bind);
315 if (! defined $DBD::SQLite::__DBIC_CHECK_dbd_can_bind_bigint_values) {
316 $DBD::SQLite::__DBIC_CHECK_dbd_can_bind_bigint_values
317 = modver_gt_or_eq('DBD::SQLite', '1.37') ? 1 : 0;
320 # an attempt to detect former effects of RT#79576, bug itself present between
321 # 0.08191 and 0.08209 inclusive (fixed in 0.08210 and higher)
322 my $stringifiable = 0;
324 for my $i (0.. $#$bindattrs) {
326 $stringifiable++ if ( length ref $bind->[$i][1] and is_plain_value($bind->[$i][1]) );
329 defined $bindattrs->[$i]
331 defined $bind->[$i][1]
333 grep { $bindattrs->[$i] eq $_ } (
334 DBI::SQL_INTEGER(), DBI::SQL_TINYINT(), DBI::SQL_SMALLINT(), DBI::SQL_BIGINT()
337 if ( $bind->[$i][1] !~ /^ [\+\-]? [0-9]+ (?: \. 0* )? $/x ) {
338 carp_unique( sprintf (
339 "Non-integer value supplied for column '%s' despite the integer datatype",
340 $bind->[$i][0]{dbic_colname} || "# $i"
342 undef $bindattrs->[$i];
345 ! $DBD::SQLite::__DBIC_CHECK_dbd_can_bind_bigint_values
347 # unsigned 32 bit ints have a range of −2,147,483,648 to 2,147,483,647
348 # alternatively expressed as the hexadecimal numbers below
349 # the comparison math will come out right regardless of ivsize, since
350 # we are operating within 31 bits
351 # P.S. 31 because one bit is lost for the sign
352 if ($bind->[$i][1] > 0x7fff_ffff or $bind->[$i][1] < -0x8000_0000) {
353 carp_unique( sprintf (
354 "An integer value occupying more than 32 bits was supplied for column '%s' "
355 . 'which your version of DBD::SQLite (%s) can not bind properly so DBIC '
356 . 'will treat it as a string instead, consider upgrading to at least '
357 . 'DBD::SQLite version 1.37',
358 $bind->[$i][0]{dbic_colname} || "# $i",
359 DBD::SQLite->VERSION,
361 undef $bindattrs->[$i];
364 $bindattrs->[$i] = DBI::SQL_INTEGER()
371 'POSSIBLE *PAST* DATA CORRUPTION detected - see '
372 . 'DBIx::Class::Storage::DBI::SQLite/RT79576 or '
373 . 'http://v.gd/DBIC_SQLite_RT79576 for further details or set '
374 . '$ENV{DBIC_RT79576_NOWARN} to disable this warning. Trigger '
375 . 'condition encountered'
376 ) if (!$ENV{DBIC_RT79576_NOWARN} and $stringifiable > 1);
381 =head2 connect_call_use_foreign_keys
385 on_connect_call => 'use_foreign_keys'
387 In L<connect_info|DBIx::Class::Storage::DBI/connect_info> to turn on foreign key
388 (including cascading) support for recent versions of SQLite and L<DBD::SQLite>.
392 PRAGMA foreign_keys = ON
394 See L<http://www.sqlite.org/foreignkeys.html> for more information.
398 sub connect_call_use_foreign_keys {
402 'PRAGMA foreign_keys = ON'
406 =head1 FURTHER QUESTIONS?
408 Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
410 =head1 COPYRIGHT AND LICENSE
412 This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
413 by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
414 redistribute it and/or modify it under the same terms as the
415 L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.