From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

use strict;
use IPC::Cmd qw/can_run/;
use Scalar::Util qw/reftype/;
our $VERSION = '0.000036';
use DBIx::QuickDB::Util::HashBase qw{-sqlite -started};
my ($SQLITE, $DBDSQLITE);
BEGIN {
local $@;
$SQLITE = can_run('sqlite3');
$DBDSQLITE = eval { require DBD::SQLite; 'DBD::SQLite' };
}
sub version_string {
my $binary;
# Go in reverse order assuming the last param hash provided is most important
for my $arg (reverse @_) {
my $type = reftype($arg) or next; # skip if not a ref
next unless $type eq 'HASH'; # We have a hashref, possibly blessed
# If we find a launcher we are done looping, we want to use this binary.
$binary = $arg->{+SQLITE} and last;
}
# If no args provided one to use we fallback to the default from $PATH
$binary ||= $SQLITE;
# Call the binary with '-V', capturing and returning the output using backticks.
return `$binary -version`;
}
sub _default_paths { return (sqlite => $SQLITE) }
sub viable {
my $this = shift;
my ($spec) = @_;
my %check = (ref($this) ? %$this : (), $this->_default_paths, %$spec);
my @bad;
push @bad => "'DBD::SQLite' module could not be loaded, needed for everything" unless $DBDSQLITE;
return (1, undef) unless @bad;
return (0, join "\n" => @bad);
}
sub init {
my $self = shift;
$self->SUPER::init();
my %defaults = $self->_default_paths;
$self->{$_} ||= $defaults{$_} for keys %defaults;
$self->{+STARTED} = 1;
return;
}
sub bootstrap { return }
sub start { return }
sub stop { return }
sub clone {
my $self = shift;
local $self->{+STARTED} = 0;
return $self->SUPER::clone(@_);
}
sub connect_string {
my $self = shift;
my ($db_name) = @_;
$db_name = 'quickdb' unless defined $db_name;
my $dir = $self->{+DIR};
my $path = "$dir/$db_name";
require DBD::SQLite;
return "dbi:SQLite:dbname=$path";
}
sub load_sql {
my $self = shift;
my ($db_name, $file) = @_;
my $dbh = $self->connect($db_name, sqlite_allow_multiple_statements => 1, RaiseError => 1, AutoCommit => 1);
open(my $fh, '<', $file) or die "Could not open file '$file': $!";
my $sql = join "" => <$fh>;
close($fh);
$dbh->do($sql) or die $dbh->errstr;
}
sub shell_command {
my $self = shift;
my ($db_name) = @_;
my $dir = $self->{+DIR};
my $path = "$dir/$db_name";
return ($self->{+SQLITE}, $path);
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
DBIx::QuickDB::Driver::SQLite - SQLite driver for DBIx::QuickDB.
=head1 DESCRIPTION
SQLite driver for L<DBIx::QuickDB>.
=head1 SYNOPSIS
See L<DBIx::QuickDB>.
=head1 SOURCE
The source code repository for DBIx-QuickDB can be found at
=head1 MAINTAINERS
=over 4
=item Chad Granum E<lt>exodist@cpan.orgE<gt>
=back
=head1 AUTHORS
=over 4
=item Chad Granum E<lt>exodist@cpan.orgE<gt>
=back
=head1 COPYRIGHT
Copyright 2020 Chad Granum E<lt>exodist7@gmail.comE<gt>.
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
=cut