DBD-Informix
view release on metacpan or search on metacpan
t/t33holdcurs.t view on Meta::CPAN
#!/usr/bin/perl
#
# @(#)$Id: t33holdcurs.t,v 2014.1 2014/04/21 06:38:37 jleffler Exp $
#
# Copyright 1996-99,2004 Jonathan Leffler
# Copyright 1999 Bill Rothanburg
# Copyright 2002-03 IBM
# Copyright 2004-14 Jonathan Leffler
#
# Tests hold cursors in transactions
use DBD::Informix::TestHarness;
use strict;
use warnings;
my $dbh = connect_to_test_database();
if ($dbh->{ix_LoggedDatabase} == 0)
{
stmt_note("1..1\n");
stmt_note("# No transactions on unlogged database '$dbh->{Name}'\n");
stmt_ok(0);
all_ok();
}
stmt_note("1..19\n");
$dbh->{AutoCommit} = 0;
$dbh->{PrintError} = 0;
print_dbinfo($dbh);
stmt_ok(0);
my $tablename1 = "dbd_ix_test1";
# Should not succeed, but doesn't matter.
$dbh->do("DROP TABLE $tablename1");
# These should be fine...
stmt_test($dbh, "CREATE TEMP TABLE $tablename1 (id INTEGER, name CHAR(64))");
stmt_test($dbh, "INSERT INTO $tablename1 VALUES(379, 'Mauritz Escher')");
stmt_test($dbh, "INSERT INTO $tablename1 VALUES(380, 'Salvador Dali')");
stmt_test($dbh, "INSERT INTO $tablename1 VALUES(381, 'Foo Manchu')");
# Without CURSOR WITH HOLD - Should fail at second fetch
#
# Prepare the SELECT statement
stmt_note("# SELECT: ix_CursorWithHold = False\n");
my $sth = $dbh->prepare("SELECT id, name FROM $tablename1");
stmt_fail() if (!defined $sth);
stmt_ok(0);
stmt_note("# Fetch Hold Attrib\n");
my $hold = $sth->{ix_CursorWithHold};
stmt_fail() unless defined $hold;
print "# ix_CursorWithHold = $hold\n";
stmt_ok(0);
# Open the first cursor
stmt_note("# Open cursor\n");
stmt_fail() unless $sth->execute;
stmt_ok(0);
my @row1 = $sth->fetchrow;
if (@row1)
{
print "# Row1: @row1\n";
stmt_ok(0);
}
else
{
print "# Row1: undefined (unexpected behaviour)\n";
print "# $DBI::errstr\n";
stmt_fail();
}
stmt_note("# Commit\n");
stmt_fail() unless $dbh->commit;
stmt_ok(0);
my @row2 = $sth->fetchrow;
if ($DBI::err == -400)
{ # The fetch should have errored
print "# Row2: undefined (expected behaviour)\n";
print "# $DBI::errstr\n";
stmt_ok(0);
}
else
{
print "# Row2: defined (incorrect behaviour - should have failed)\n";
print "# Row2: @row2\n";
stmt_fail();
}
# Close the cursors
stmt_note("# Close cursor\n");
stmt_fail() unless $sth->finish;
stmt_ok(0);
undef $sth;
# With CURSOR WITH HOLD - Should pass at second fetch
#
# Prepare the SELECT statement
stmt_note("# SELECT: ix_CursorWithHold = True\n");
$sth = $dbh->prepare("SELECT id, name FROM $tablename1", {'ix_CursorWithHold' => 1});
stmt_fail() if (!defined $sth);
stmt_ok(0);
stmt_note("# Fetch Hold Attrib\n");
$hold = $sth->{ix_CursorWithHold};
stmt_fail() unless defined $hold;
print "# ix_CursorWithHold = $hold\n";
stmt_ok(0);
# Open the first cursor
stmt_note("# Open cursor\n");
stmt_fail() unless $sth->execute;
stmt_ok(0);
@row1 = $sth->fetchrow;
if (@row1)
{
print "# Row1: @row1\n";
stmt_ok(0);
}
else
{
print "# Row1: undefined (unexpected behaviour)\n";
print "# $DBI::errstr\n";
stmt_fail();
}
stmt_note("# Commit\n");
stmt_fail() unless $dbh->commit;
stmt_ok(0);
@row2 = $sth->fetchrow;
if (@row2)
{
print "# Row1: @row2\n";
stmt_ok(0);
}
else
{
print "# Row2: undefined (unexpected behaviour)\n";
stmt_fail();
}
# Close the cursors
stmt_note("# Close cursor\n");
stmt_fail() unless $sth->finish;
stmt_ok(0);
undef $sth;
$dbh->disconnect;
all_ok();
( run in 0.985 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )