DBD-Informix

 view release on metacpan or  search on metacpan

t/t00basic.t  view on Meta::CPAN

print  "#     Server  Version:       $dbh->{ix_ServerVersion}\n";
printf "#     Blob Support:          %d\n", $dbh->{ix_BlobSupport};
printf "#     Stored Procedures:     %d\n", $dbh->{ix_StoredProcedures};
printf "#     Multiple Connections:  %d\n", $dbh->{ix_MultipleConnections};
printf "#     Active Connections:    %d\n", $dbh->{ix_ActiveConnections};
print  "#     Current Connection:    $dbh->{ix_CurrentConnection}\n";
print  "#\n";

stmt_note("# Testing: \$dbh->disconnect()\n");
stmt_fail() unless ($dbh->disconnect);
stmt_ok();

stmt_note("# Re-testing: \$dbh->disconnect()\n");
stmt_fail() unless ($dbh->disconnect);
stmt_ok();

# Now reconnect to database!
$dbh = connect_to_test_database();
stmt_ok(0);

$dbh->{ChopBlanks} = 1;     # Force chopping of trailing blanks

print  "# Generic Database Handle Information\n";
print  "#     Type:                    $dbh->{Type}\n";
print  "#     Database Name:           $dbh->{Name}\n";
printf "#     AutoCommit:              %d\n", $dbh->{AutoCommit};
printf "#     PrintError:              %d\n", $dbh->{PrintError};
printf "#     RaiseError:              %d\n", $dbh->{RaiseError};
print  "# Informix Database Handle Information\n";
printf "#     Informix-OnLine:         %d\n", $dbh->{ix_InformixOnLine};
printf "#     Logged Database:         %d\n", $dbh->{ix_LoggedDatabase};
printf "#     Mode ANSI Database:      %d\n", $dbh->{ix_ModeAnsiDatabase};
printf "#     Transaction Active:      %d\n", $dbh->{ix_InTransaction};
print  "#\n";

# Remove table if it already exists, warning (not failing) if it doesn't
my $oldmode = $dbh->{PrintError};
$dbh->{PrintError} = 0;
my $stmt1 = "DROP TABLE $testtable";
stmt_test($dbh, $stmt1, 1);
$dbh->{PrintError} = $oldmode;

# Create table (now that it does not exist)...
my $stmt2 = "CREATE TEMP TABLE $testtable (id INTEGER NOT NULL, name CHAR(64))";
stmt_test($dbh, $stmt2, 0);

# Drop it (again)
stmt_test($dbh, $stmt1, 0);

# Create it again!
stmt_retest($dbh, $stmt2, 0);

my $stmt3 = "INSERT INTO $testtable VALUES(1, 'Alligator Descartes')";
stmt_test($dbh, $stmt3, 0);

my $stmt4 = "DELETE FROM $testtable WHERE id = 1";
stmt_test($dbh, $stmt4, 0);

# Test SELECT of empty data set
my $stmt5 = "SELECT * FROM $testtable WHERE id = 1";
stmt_note("# Testing: \$cursor = \$dbh->prepare('$stmt5')\n");
my $cursor;
stmt_fail() unless ($cursor = $dbh->prepare($stmt5));
stmt_ok();

# Print statement...
stmt_note("# Statement: $cursor->{Statement}\n");

stmt_note("# Testing: \$cursor->execute\n");
stmt_fail() unless ($cursor->execute);
stmt_ok();

stmt_note("# Statement: $cursor->{Statement}\n");
stmt_note("# Testing: \$cursor->fetch\n");

my $i = 0;
my @row;
while ((@row = $cursor->fetch) and $#row > 0)
{
    $i++;
    stmt_note("# Row $i: $row[0] => $row[1]\n");
    stmt_note("# FETCH succeeded but should have failed!\n");
    stmt_fail();
}

stmt_fail() unless ($#row == 0);
stmt_note("# OK (nothing found)\n");
stmt_ok(0);

print_sqlca($cursor);

stmt_note("# Testing: \$cursor->finish\n");
stmt_fail() unless ($cursor->finish);
stmt_ok(0);

# FREE the cursor and asociated data
undef $cursor;

# Insert some data
stmt_retest($dbh, $stmt3, 0);

# Verify that inserted data can be returned
stmt_note("# Re-testing: \$cursor = \$dbh->prepare('$stmt5')\n");
stmt_fail() unless ($cursor = $dbh->prepare($stmt5));
stmt_ok(0);

stmt_note("# Re-testing: \$cursor->execute\n");
stmt_fail() unless ($cursor->execute);
stmt_ok(0);

stmt_note("# Re-testing: \$cursor->fetch\n");
# Fetch returns a reference to an array!
my $j = 0;
my $ref;
while ($ref = $cursor->fetch)
{
    $j++;
    @row = @{$ref};
    # Verify returned data!
    my @exp = (1, "Alligator Descartes");
    stmt_note("# Values returned: ", $#row + 1, "\n");
    for ($i = 0; $i <= $#row; $i++)
    {
        stmt_note("# Row value $i: $row[$i]\n");
        stmt_fail("Incorrect value returned: got $row[$i]; wanted $exp[$i]\n")
            unless ($exp[$i] eq $row[$i]);
    }
}
stmt_fail("FAIL: $j rows selected when 1 expected\n") unless ($j == 1);

# Verify data attributes!
my @type = @{$cursor->{TYPE}};
for ($i = 0; $i <= $#type; $i++) { print ("# Type      $i: $type[$i]\n"); }
my @name = @{$cursor->{NAME}};
for ($i = 0; $i <= $#name; $i++) { print ("# Name      $i: <<$name[$i]>>\n"); }
my @null = @{$cursor->{NULLABLE}};
for ($i = 0; $i <= $#null; $i++) { print ("# Nullable  $i: $null[$i]\n"); }
my @prec = @{$cursor->{PRECISION}};
for ($i = 0; $i <= $#prec; $i++) { print ("# Precision $i: $prec[$i]\n"); }
my @scal = @{$cursor->{SCALE}};
for ($i = 0; $i <= $#scal; $i++) { print ("# Scale     $i: $scal[$i]\n"); }

my $nfld = $cursor->{NUM_OF_FIELDS};
my $nbnd = $cursor->{NUM_OF_PARAMS};
print("# Number of Columns: $nfld; Number of Parameters: $nbnd\n");

stmt_note("# Re-testing: \$cursor->finish\n");
stmt_fail() unless ($cursor->finish);
stmt_ok(0);

# FREE the cursor and asociated data
undef $cursor;

my $stmt6 = "UPDATE $testtable SET id = 2 WHERE name = 'Alligator Descartes'";
stmt_retest($dbh, $stmt6, 0);

my $stmt7 = "INSERT INTO $testtable VALUES(1, 'Jonathan Leffler')";
stmt_test($dbh, $stmt7, 0);

sub select_all
{
    my ($dbh, $exp1) = @_;
    my (%exp2) = %{$exp1};  # Associative array of numbers (keys) and names
    my (@row, $i);  # Local variables

    stmt_note("# Checking Updated Data\n");
    my $stmt8 = "SELECT * FROM $testtable ORDER BY id";
    stmt_note("# Re-testing: \$cursor = \$dbh->prepare('$stmt8')\n");
    stmt_fail() unless ($cursor = $dbh->prepare($stmt8));
    stmt_ok(0);

    stmt_note("# Re-testing: \$cursor->execute\n");
    stmt_fail() unless ($cursor->execute);
    stmt_ok(0);

    stmt_note("# Testing: \$cursor->fetchrow iteratively\n");
    $i = 1;
    while (@row = $cursor->fetchrow)
    {
        stmt_note("# Row $i: $row[0] => $row[1]\n");
        if ($row[1] eq $exp2{$row[0]})
        {
            stmt_ok(0);
        }
        else
        {
            stmt_note("# Wrong value:\n");
            stmt_note("# -- Got <<$row[1]>>\n");
            stmt_note("# -- Wanted <<$exp2{$row[0]}>>\n");
            stmt_fail();
        }
        $i++;
    }

    stmt_note("# Re-testing: \$cursor->finish\n");
    stmt_fail() unless ($cursor->finish);
    stmt_ok(0);

    # Free cursor referencing the table...
    undef $cursor;
}

select_all($dbh, {
    1 => 'Jonathan Leffler',
    2 => 'Alligator Descartes',
});

# Now the table is dropped.
stmt_retest($dbh, $stmt1, 0);

# Test execute with bound values
stmt_retest($dbh, $stmt2, 0);   # CREATE TABLE
stmt_retest($dbh, $stmt7, 0);   # INSERT Alligator
stmt_retest($dbh, $stmt3, 0);   # UPDATE Alligator
stmt_retest($dbh, $stmt6, 0);   # INSERT Jonathan

my $stmt13 = "INSERT INTO $testtable VALUES(?, ?)";
stmt_note("# Testing: \$sth = \$dbh->prepare('$stmt13')\n");
my $sth;
stmt_fail() unless ($sth = $dbh->prepare($stmt13));
stmt_ok(0);

my @bind = ( "3", "Frederick the Great" );
stmt_note("# Testing: \$sth->execute(@bind)\n");
stmt_fail() unless ($sth->execute(@bind));
stmt_ok(0);
print_sqlca($sth);

stmt_note("# Testing: \$sth->execute([4.00, \"Ghenghis Khan\"])\n");
stmt_fail() unless ($sth->execute(4.00, "Ghenghis Khan"));
stmt_ok(0);

select_all($dbh, {
1 => 'Jonathan Leffler',
2 => 'Alligator Descartes',
3 => 'Frederick the Great',
4 => 'Ghenghis Khan',
});

# FREE the statement and asociated data
undef $sth;

stmt_note("# Testing: \$dbh->disconnect()\n");
stmt_fail() unless ($dbh->disconnect);
stmt_ok(0);

all_ok;



( run in 1.178 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )