# Copyright (c) 2003, 2004, 2005 Jeffrey I Cohen. All rights reserved. # # Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.pl' ######################### We start with some black magic to print on failure. # Change 1..1 below to 1..last_test_to_print . # (It may become useful if the test is moved to ./t subdirectory.) BEGIN { $| = 1; print "1..23\n"; } END {print "not ok 1\n" unless $loaded;} use Genezzo::GenDBI; $loaded = 1; print "ok 1\n"; ######################### End of black magic. # Insert your test code below (better if it prints "ok 13" # (correspondingly "not ok 13") depending on the success of chunk 13 # of the test code): use strict; use warnings; use File::Path; use File::Spec; my $TEST_COUNT; $TEST_COUNT = 2; my $dbinit = 1; my $gnz_home = File::Spec->catdir("t", "gnz_home"); my $gnz_restore = File::Spec->catdir("t", "restore"); #rmtree($gnz_home, 1, 1); #mkpath($gnz_home, 1, 0755); my $ins_count = 50; my $dup_count = 4; if (1) { use Genezzo::Util; my $starttime = time(); my %t3arg = ( unique_key => 1, key_type => ["n", "c"], use_keycount => 1 ); my $bt = Genezzo::Index::bt2->new(%t3arg); my @foo = qw(alpha bravo charlie delta echo foxtrot golf hotel india juliet kilo lima mike november oscar papa quebec romeo sierra tango uniform victor whiskey xray yankee zulu); # 5 * 26 rows for my $frid (@foo) { not_ok("failed to insert 1 $frid") unless ($bt->insert([1, $frid], undef)); } for my $frid (@foo) { not_ok("failed to insert 2 $frid") unless ($bt->insert([2, $frid], undef)); } for my $frid (@foo) { not_ok("failed to insert 3 $frid") unless ($bt->insert([3, $frid], undef)); } for my $frid (@foo) { not_ok("failed to insert 4 $frid") unless ($bt->insert([4, $frid], undef)); } for my $frid (@foo) { not_ok("failed to insert 5 $frid") unless ($bt->insert([5, $frid], undef)); } # dup test if ( $bt->insert([3, "echo"], undef)) { not_ok("duplicate key echo"); } else { ok() } if ($bt->insert([3, "golf"], undef)) { not_ok("duplicate key golf"); } else { ok() } greet $bt->stats(); my $hcount = $bt->HCount(); if ($hcount == 130) { ok(); } else { not_ok("count mismatch - $hcount vs 130"); } greet time() - $starttime; # greet $bt; { # search my $sth = $bt->SQLPrepare(start_key => [1, ""], stop_key => [3, ""]); $sth->SQLExecute() ? ok() : not_ok("could not execute"); my @row = $sth->SQLFetch(); my $fcnt = 0; while (scalar(@row) > 1) { # greet @row; unless ($row[0]->[-1] eq $row[1]) { my ($kk, $vv) = ($row[0], $row[1]); not_ok("val mismatch: key $kk, val $vv"); } if ($fcnt < 26) { unless ($row[0]->[0] == 1) { my ($kk, $vv) = ($row[0], $row[1]); not_ok("key 1: key $kk, val $vv"); } } else { unless ($row[0]->[0] == 2) { my ($kk, $vv) = ($row[0], $row[1]); not_ok("key 2: key $kk, val $vv"); } } @row = $sth->SQLFetch(); $fcnt++; } if ($fcnt == 52) { ok(); } else { not_ok("count mismatch - $fcnt vs 52"); } greet time() - $starttime; } } if (1) { use Genezzo::TestSetup; my $fb = Genezzo::TestSetup::CreateOrRestoreDB( gnz_home => $gnz_home, restore_dir => $gnz_restore ); unless (defined($fb)) { not_ok ("could not create database"); exit 1; } ok(); $dbinit = 0; } if (1) { use Genezzo::Util; my $dbh = Genezzo::GenDBI->connect($gnz_home, "NOUSER", "NOPASSWORD"); unless (defined($dbh)) { not_ok ("could not find database"); exit 1; } ok(); if ($dbh->do("startup")) { ok(); } else { not_ok ("could not startup"); } $dbinit = 0; if ($dbh->do("startup")) { ok(); } else { not_ok ("could not startup"); } if ($dbh->do("af filesize=16K")) { ok(); } else { not_ok ("could not addfile"); } if ($dbh->do("af filesize=16K")) { ok(); } else { not_ok ("could not addfile"); } if ($dbh->do("af ")) { ok(); } else { not_ok ("could not addfile"); } if ($dbh->do("ct duptab id=n cname=c")) { ok(); } else { not_ok ("could not create table"); } { for my $ii (1..$ins_count) { my $ins = "i duptab $ii foo_$ii"; if ($dbh->do($ins)) { # ok(); } else { not_ok ("could not insert: $ins"); last; } } } if ($dbh->do("ci dup_idx duptab id")) { ok(); } else { not_ok ("could not create index"); } for my $jj (1..$dup_count) { for my $ii (1..$ins_count) { my $ins = "i duptab $ii foo_$ii"; if ($dbh->do($ins)) { # ok(); } else { not_ok ("could not insert: $ins"); last; } } } ok (); my $fetchcount; my $lastfetch = $dbh->selectrow_arrayref("select count(*) from duptab"); if (scalar(@{$lastfetch})) { $fetchcount = $lastfetch->[0]; if ($fetchcount != (($dup_count + 1) * $ins_count)) { not_ok("fetch count $fetchcount mismatch"); } else { ok(); } } else { not_ok ("could not fetch ary ref count(*)"); } $lastfetch = $dbh->selectrow_arrayref("select count(*) from dup_idx"); if (scalar(@{$lastfetch})) { $fetchcount = $lastfetch->[0]; if ($fetchcount != (($dup_count + 1) * $ins_count)) { not_ok("idx fetch count $fetchcount mismatch"); } else { ok(); } } else { not_ok ("could not fetch idx ary ref count(*)"); } my $del_posn = int($ins_count/2); if ($dbh->do("delete from duptab where id = $del_posn")) { ok(); } else { not_ok ("could not delete"); } $lastfetch = $dbh->selectrow_arrayref("select count(*) from duptab"); if (scalar(@{$lastfetch})) { $fetchcount = $lastfetch->[0]; ok(); } else { not_ok ("could not fetch ary ref count(*)"); } $lastfetch = $dbh->selectrow_arrayref("select count(*) from dup_idx"); if (scalar(@{$lastfetch})) { # check that index still has same rowcount as table if ($fetchcount != $lastfetch->[0]) { not_ok("idx fetch count $fetchcount mismatch"); } else { ok(); } } else { not_ok ("could not fetch idx ary ref count(*)"); } $del_posn++; my $sth = $dbh->prepare("select rid, id, cname from duptab where id = $del_posn"); print $sth->execute(), " rows \n"; for my $ii (1..(int($dup_count/2))) { my $ggg = $sth->fetchrow_hashref(); last unless (defined($ggg)); $lastfetch = $ggg; } greet $lastfetch; my $del_rid = $lastfetch->{rid}; my $del_id = $lastfetch->{id}; my $delstr = 'delete from duptab where rid = \'' . $del_rid . '\''; if ($dbh->do($delstr)) { ok(); } else { not_ok ("could not delete"); } $sth = $dbh->prepare("select rid, id, \"_trid\" as trid from dup_idx where id = $del_id"); print $sth->execute(), " rows \n"; while (1) { my $ggg = $sth->fetchrow_hashref(); last unless (defined($ggg)); $lastfetch = $ggg; if ($lastfetch->{trid} eq $del_rid) { not_ok("index delete failed : $del_rid"); } } if ($dbh->do("commit")) { ok(); } else { not_ok ("could not commit"); } } sub ok { print "ok $TEST_COUNT\n"; $TEST_COUNT++; } sub not_ok { my ( $message ) = @_; print "not ok $TEST_COUNT # $message\n"; $TEST_COUNT++; } sub skip { my ( $message ) = @_; print "ok $TEST_COUNT # skipped: $message\n"; $TEST_COUNT++; }