The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;
use Test::More;

BEGIN { use_ok ("DBI"); }
do "./t/lib.pl";

my @tbl_def = (
    [ "id",   "INTEGER",  4, &COL_KEY		],
    [ "str",  "CHAR",    64, &COL_NULLABLE	],
    [ "name", "CHAR",    64, &COL_NULLABLE	],
    );

sub DbFile;

my $dir = "output$$";
my $fqd = File::Spec->rel2abs ($dir);
my $abs = Cwd::abs_path ($dir);

ok (my $dbh = Connect (),			"connect");

ok ($dbh->{f_dir} eq $dir || $dbh->{f_dir} eq $abs ||
    $dbh->{f_dir} eq $fqd,			"default dir");
ok ($dbh->{f_dir} = $dir,			"set f_dir");

ok (my $tbl  = FindNewTable ($dbh),		"find new test table");
ok (!-f DbFile ($tbl),				"does not exist");

ok (my $tbl2 = FindNewTable ($dbh),		"find new test table");
ok (!-f DbFile ($tbl2),				"does not exist");

ok (my $tbl3 = FindNewTable ($dbh),		"find new test table");
ok (!-f DbFile ($tbl3),				"does not exist");

ok (my $tbl4 = FindNewTable ($dbh),		"find new test table");
ok (!-f DbFile ($tbl4),				"does not exist");

isnt ($tbl,  $tbl2,				"different 1 2");
isnt ($tbl,  $tbl3,				"different 1 3");
isnt ($tbl,  $tbl4,				"different 1 4");
isnt ($tbl2, $tbl3,				"different 2 3");
isnt ($tbl2, $tbl4,				"different 2 4");
isnt ($tbl3, $tbl4,				"different 3 4");

like (my $def = TableDefinition ($tbl, @tbl_def),
	qr{^create table $tbl}i,		"table definition");
ok ($dbh->do ($def),				"create table 1");
ok (-f DbFile ($tbl),				"does exists");

ok ($dbh->do ("drop table $tbl"),		"drop table");
ok (!-f DbFile ($tbl),				"does not exist");

ok ($dbh->disconnect,				"disconnect");
undef $dbh;

my $dsn = "DBI:CSV:f_dir=$dir;csv_eol=\015\012;csv_sep_char=\\;;";
ok ($dbh = Connect ($dsn),			"connect");

ok ($dbh->do ($def),				"create table");
ok (-f DbFile ($tbl),				"does exists");

ok ($dbh->do ("insert into $tbl values (1, 1, ?)", undef, "joe"),     "insert 1");
ok ($dbh->do ("insert into $tbl values (2, 2, ?)", undef, "Jochen;"), "insert 2");

ok (my $sth = $dbh->prepare ("select * from $tbl"),	"prepare");
ok ($sth->execute,				"execute");
ok (my $row = $sth->fetch,			"fetch 1");
is_deeply ($row, [ 1, "1", "joe" ],		"content");
ok (   $row = $sth->fetch,			"fetch 2");
is_deeply ($row, [ 2, "2", "Jochen;" ],		"content");
ok ($sth->finish,				"finish");
undef $sth;

ok ($dbh->do ("drop table $tbl"),		"drop table");
ok (!-f DbFile ($tbl),				"does not exist");

ok ($dbh->disconnect,				"disconnect");
undef $dbh;

$dsn = "DBI:CSV:";
ok ($dbh = Connect ($dsn),			"connect");

# Check, whether the csv_tables->{$tbl}{file} attribute works
like (my $def4 = TableDefinition ($tbl4, @tbl_def),
	qr{^create table $tbl4}i,		"table definition");
ok ($dbh->{csv_tables}{$tbl4}{file} = DbFile ($tbl4), "set table/file");
ok ($dbh->do ($def4),				"create table");
ok (-f DbFile ($tbl4),				"does exists");

ok ($dbh->do ("drop table $tbl4"),		"drop table");

ok ($dbh->disconnect,				"disconnect");
undef $dbh;

ok ($dbh = DBI->connect ("dbi:CSV:", "", "", {
    f_dir		=> DbDir (),
    f_ext		=> ".csv",
    dbd_verbose		=> 8,
    csv_sep_char	=> ";",
    csv_blank_is_undef	=> 1,
    csv_always_quote	=> 1,
    }),						"connect with attr");

is ($dbh->{dbd_verbose},	8,		"dbd_verbose set");
is ($dbh->{f_ext},		".csv",		"f_ext set");
is ($dbh->{csv_sep_char},	";",		"sep_char set");
is ($dbh->{csv_blank_is_undef},	1,		"blank_is_undef set");

ok ($dbh->do ($def),				"create table");
ok (-f DbFile ($tbl).".csv",			"does exists");
#is ($sth->{blank_is_undef},	1,		"blank_is_undef");
eval {
    local $SIG{__WARN__} = sub { };

    ok ($sth = $dbh->prepare ("insert into $tbl values (?, ?, ?)"), "prepare");
    is ($sth->execute (1, ""), undef,		"not enough values");
    like ($dbh->errstr, qr/passed 2 parameters where 3 required/, "error message");

    # Cannot use the same handle twice. SQL::Statement bug
    ok ($sth = $dbh->prepare ("insert into $tbl values (?, ?, ?)"), "prepare");
    is ($sth->execute (1, "", 1, ""), undef,	"too many values");
    like ($dbh->errstr, qr/passed 4 parameters where 3 required/, "error message");
    };
ok ($sth->execute ($_, undef, "Code $_"),	"insert $_") for 0 .. 9;

ok ($dbh->do ("drop table $tbl"),		"drop table");
ok (!-f DbFile ($tbl),				"does not exist");
ok (!-f DbFile ($tbl).".csv",			"does not exist");

ok ($dbh->disconnect,				"disconnect");
undef $dbh;

done_testing ();