package t::lib::SQLite::Temp; use 5.005; use strict; use DBI (); use DBD::SQLite (); use File::Spec (); use File::Temp (); use Parse::CSV (); use vars qw{$VERSION @ISA @EXPORT}; BEGIN { $VERSION = '1.06'; require Exporter; @ISA = 'Exporter'; @EXPORT = qw{ empty_db create_db }; } sub empty_db { # Get a temp file name my $dir = File::Temp::tempdir( CLEANUP => 1 ); my $file = File::Spec->catfile( $dir, 'sqlite.db' ); # Create the database my $dbh = DBI->connect("dbi:SQLite:$file"); unless ( $dbh ) { die "Failed to create test DB handle"; } } sub create_db { my $dbh = empty_db(); # For each value provided fill the database foreach my $file ( @_ ) { if ( $file =~ /\.sql$/ ) { fill_sql( $dbh, $file ); } elsif ( $file =~ /\.csv$/ ) { fill_csv( $dbh, $file ); } else { die "Unsupported file type $file"; } } return $dbh; } sub fill_sql { my $dbh = shift; my $file = shift; my @sql = (); # Read in the file SCOPE: { local $/; open( SQLFILE, $file ) or die "open: $!"; my $buffer = ; close SQLFILE; @sql = split /\n\n/, $buffer; } # Execute the SQL commands foreach my $statement ( @sql ) { defined($dbh->do($statement)) or die "$statement failes"; } return 1; } sub fill_csv { my $dbh = shift; my $file = shift; my $parser = Parse::CSV->new( file => $file, fields => 'auto', ) or die "Failed to create parser"; my (undef, undef, $table) = File::Spec->splitpath($file); $table =~ s/\.csv$// or die "Failed to trim table name"; # Process the inserts while ( my $row = $parser->fetch ) { my $sql = "INSERT INTO $table ( " . join( ', ', keys %$row ) . " ) values ( " . join( ', ', map { '?' } values %$row ) . " )"; my $sth = $dbh->prepare( $sql ) or die "prepare_cached failed"; my $rv = $sth->execute( values %$row ) or die "execute failed"; $sth->finish; } return 1; } 1;