#!/usr/bin/perl -w
use strict;
use Test::More tests => 1 + (5 * 15);
BEGIN
{
require 't/test-lib.pl';
use_ok('Rose::DB');
}
foreach my $db_type (qw(mysql pg informix sqlite oracle))
{
SKIP:
{
unless(have_db($db_type))
{
skip("$db_type tests", 15);
}
}
next unless(have_db($db_type));
Rose::DB->default_type($db_type);
my $db = Rose::DB->new;
my $pk_columns = $db->primary_key_column_names('Rdb_test_pk0');
ok(ref $pk_columns eq 'ARRAY' && @$pk_columns == 0, "$db_type no pk columns 1");
my @pk_columns = $db->primary_key_column_names('Rdb_test_pk0');
ok(@pk_columns == 0, "$db_type no pk columns 2");
if($db_type eq 'pg')
{
@pk_columns = $db->primary_key_column_names(schema => 'Rose_db_private',
table => 'Rdb_test_pk0');
ok(@pk_columns == 0, "$db_type no pk columns 3");
$pk_columns = $db->primary_key_column_names(schema => 'Rose_db_private',
table => 'Rdb_test_pk0');
ok(@$pk_columns == 0, "$db_type no pk columns 4");
}
else
{
ok(1, "$db_type no pk columns 3");
ok(1, "$db_type no pk columns 4");
}
$pk_columns = $db->primary_key_column_names('Rdb_test_pk1');
@pk_columns = sort @$pk_columns;
if($db_type eq 'oracle')
{
# Oracle returns names in upper case.
is_deeply(\@pk_columns, [ 'ID' ], "$db_type pk columns 1");
}
else
{
is_deeply(\@pk_columns, [ 'id' ], "$db_type pk columns 1");
}
@pk_columns = $db->primary_key_column_names('Rdb_test_pk1');
@pk_columns = sort @pk_columns;
if($db_type eq 'oracle')
{
is_deeply(\@pk_columns, [ 'ID' ], "$db_type pk columns 2");
}
else
{
is_deeply(\@pk_columns, [ 'id' ], "$db_type pk columns 2");
}
ok($db->has_primary_key(table => 'Rdb_test_pk1'), "$db_type pk check 1");
ok($db_type ne 'pg' || $db->has_primary_key('rdb_test_Pk1'), "$db_type pk check 2");
$pk_columns = $db->primary_key_column_names('Rdb_test_pk2');
@pk_columns = sort @$pk_columns;
if($db_type eq 'oracle')
{
# Oracle returns names in upper case.
is_deeply(\@pk_columns, [ 'ID1', 'ID2' ], "$db_type pk columns 3");
}
else
{
is_deeply(\@pk_columns, [ 'id1', 'id2' ], "$db_type pk columns 3");
}
@pk_columns = $db->primary_key_column_names('Rdb_test_pk2');
@pk_columns = sort @pk_columns;
if($db_type eq 'oracle')
{
# Oracle returns names in upper case.
is_deeply(\@pk_columns, [ 'ID1', 'ID2' ], "$db_type pk columns 4");
}
else
{
is_deeply(\@pk_columns, [ 'id1', 'id2' ], "$db_type pk columns 4");
}
ok($db->has_primary_key(table => 'Rdb_test_pk2'), "$db_type pk check 3");
ok($db_type ne 'pg' || $db->has_primary_key('rdb_test_Pk2'), "$db_type pk check 4");
if($db_type eq 'pg')
{
@pk_columns = $db->primary_key_column_names(schema => 'Rose_db_private',
table => 'Rdb_test_pk2');
@pk_columns = sort @pk_columns;
is_deeply(\@pk_columns, [ 'id1', 'id2' ], "$db_type pk columns 5");
ok($db->has_primary_key(schema => 'Rose_db_private', table => 'Rdb_test_pk2'), "$db_type pk check 5");
ok($db->has_primary_key(schema => 'rose_db_Private', table => 'rdb_test_Pk2'), "$db_type pk check 6");
}
else
{
ok(1, "$db_type pk columns 5");
ok(1, "$db_type pk check 5");
ok(1, "$db_type pk check 6");
}
}
BEGIN
{
#
# PostgreSQL
#
if(my $dbh = get_dbh('pg_admin'))
{
# Drop existing tables and create schema, ignoring errors
{
local $dbh->{'RaiseError'} = 0;
local $dbh->{'PrintError'} = 0;
$dbh->do('DROP TABLE Rdb_test_pk0 CASCADE');
$dbh->do('DROP TABLE Rdb_test_pk1 CASCADE');
$dbh->do('DROP TABLE Rdb_test_pk2 CASCADE');
$dbh->do('DROP TABLE Rose_db_private.Rdb_test_pk0 CASCADE');
$dbh->do('DROP TABLE Rose_db_private.Rdb_test_pk1 CASCADE');
$dbh->do('DROP TABLE Rose_db_private.Rdb_test_pk2 CASCADE');
$dbh->do('DROP SCHEMA Rose_db_private CASCADE');
$dbh->do('CREATE SCHEMA Rose_db_private');
}
$dbh->do(<<"EOF");
CREATE TABLE Rdb_test_pk0
(
name VARCHAR(255) NOT NULL,
UNIQUE(name)
)
EOF
$dbh->do(<<"EOF");
CREATE TABLE Rdb_test_pk1
(
id SERIAL NOT NULL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
UNIQUE(name)
)
EOF
$dbh->do(<<"EOF");
CREATE TABLE Rdb_test_pk2
(
id1 INT NOT NULL,
id2 INT NOT NULL,
name VARCHAR(255) NOT NULL,
PRIMARY KEY(id1, id2),
UNIQUE(name)
)
EOF
$dbh->do(<<"EOF");
CREATE TABLE Rose_db_private.Rdb_test_pk0
(
name VARCHAR(255) NOT NULL,
UNIQUE(name)
)
EOF
$dbh->do(<<"EOF");
CREATE TABLE Rose_db_private.Rdb_test_pk1
(
id SERIAL NOT NULL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
UNIQUE(name)
)
EOF
$dbh->do(<<"EOF");
CREATE TABLE Rose_db_private.Rdb_test_pk2
(
id1 INT NOT NULL,
id2 INT NOT NULL,
name VARCHAR(255) NOT NULL,
PRIMARY KEY(id1, id2),
UNIQUE(name)
)
EOF
# $dbh->do(<<"EOF");
# CREATE VIEW Rose_db_private.Rdb_test_view AS
# SELECT * FROM Rose_db_private.Rdb_test_pk1
# EOF
$dbh->disconnect;
}
#
# Oracle
#
if(my $dbh = get_dbh('oracle_admin'))
{
# Drop existing tables, ignoring errors
{
local $dbh->{'RaiseError'} = 0;
local $dbh->{'PrintError'} = 0;
$dbh->do('DROP TABLE Rdb_test_pk0 CASCADE CONSTRAINTS');
$dbh->do('DROP TABLE Rdb_test_pk1 CASCADE CONSTRAINTS');
$dbh->do('DROP TABLE Rdb_test_pk2 CASCADE CONSTRAINTS');
}
$dbh->do(<<"EOF");
CREATE TABLE Rdb_test_pk0
(
name VARCHAR(255) NOT NULL,
UNIQUE(name)
)
EOF
$dbh->do(<<"EOF");
CREATE TABLE Rdb_test_pk1
(
id INT NOT NULL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
UNIQUE(name)
)
EOF
$dbh->do(<<"EOF");
CREATE TABLE Rdb_test_pk2
(
id1 INT NOT NULL,
id2 INT NOT NULL,
name VARCHAR(255) NOT NULL,
PRIMARY KEY(id1, id2),
UNIQUE(name)
)
EOF
$dbh->disconnect;
}
#
# MySQL
#
if(my $dbh = get_dbh('mysql_admin'))
{
# Drop existing tables, ignoring errors
{
local $dbh->{'RaiseError'} = 0;
local $dbh->{'PrintError'} = 0;
$dbh->do('DROP TABLE Rdb_test_pk0 CASCADE');
$dbh->do('DROP TABLE Rdb_test_pk1 CASCADE');
$dbh->do('DROP TABLE Rdb_test_pk2 CASCADE');
}
$dbh->do(<<"EOF");
CREATE TABLE Rdb_test_pk0
(
name VARCHAR(255) NOT NULL,
UNIQUE(name)
)
EOF
$dbh->do(<<"EOF");
CREATE TABLE Rdb_test_pk1
(
id INT NOT NULL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
UNIQUE(name)
)
EOF
$dbh->do(<<"EOF");
CREATE TABLE Rdb_test_pk2
(
id1 INT NOT NULL,
id2 INT NOT NULL,
name VARCHAR(255) NOT NULL,
PRIMARY KEY(id1, id2),
UNIQUE(name)
)
EOF
$dbh->disconnect;
}
#
# Informix
#
if(my $dbh = get_dbh('informix_admin'))
{
# Drop existing tables, ignoring errors
{
local $dbh->{'RaiseError'} = 0;
local $dbh->{'PrintError'} = 0;
$dbh->do('DROP TABLE Rdb_test_pk0 CASCADE');
$dbh->do('DROP TABLE Rdb_test_pk1 CASCADE');
$dbh->do('DROP TABLE Rdb_test_pk2 CASCADE');
}
$dbh->do(<<"EOF");
CREATE TABLE Rdb_test_pk0
(
name VARCHAR(255) NOT NULL,
UNIQUE(name)
)
EOF
$dbh->do(<<"EOF");
CREATE TABLE Rdb_test_pk1
(
id INT NOT NULL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
UNIQUE(name)
)
EOF
$dbh->do(<<"EOF");
CREATE TABLE Rdb_test_pk2
(
id1 INT NOT NULL,
id2 INT NOT NULL,
name VARCHAR(255) NOT NULL,
PRIMARY KEY(id1, id2),
UNIQUE(name)
)
EOF
$dbh->disconnect;
}
#
# SQLite
#
if(my $dbh = get_dbh('sqlite_admin'))
{
# Drop existing tables, ignoring errors
{
local $dbh->{'RaiseError'} = 0;
local $dbh->{'PrintError'} = 0;
$dbh->do('DROP TABLE Rdb_test_pk0');
$dbh->do('DROP TABLE Rdb_test_pk1');
$dbh->do('DROP TABLE Rdb_test_pk2');
}
$dbh->do(<<"EOF");
CREATE TABLE Rdb_test_pk0
(
name VARCHAR(255) NOT NULL,
UNIQUE(name)
)
EOF
$dbh->do(<<"EOF");
CREATE TABLE Rdb_test_pk1
(
id INT NOT NULL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
UNIQUE(name)
)
EOF
$dbh->do(<<"EOF");
CREATE TABLE Rdb_test_pk2
(
id1 INT NOT NULL,
id2 INT NOT NULL,
name VARCHAR(255) NOT NULL,
PRIMARY KEY(id1, id2),
UNIQUE(name)
)
EOF
$dbh->disconnect;
}
}
END
{
# Delete test tables
if(have_db('pg_admin') && (my $dbh = get_dbh('pg_admin')))
{
$dbh->do('DROP TABLE Rdb_test_pk0 CASCADE');
$dbh->do('DROP TABLE Rdb_test_pk1 CASCADE');
$dbh->do('DROP TABLE Rdb_test_pk2 CASCADE');
$dbh->do('DROP TABLE Rose_db_private.Rdb_test_pk0 CASCADE');
$dbh->do('DROP TABLE Rose_db_private.Rdb_test_pk1 CASCADE');
$dbh->do('DROP TABLE Rose_db_private.Rdb_test_pk2 CASCADE');
$dbh->do('DROP SCHEMA Rose_db_private CASCADE');
$dbh->disconnect;
}
if(have_db('oracle_admin') && (my $dbh = get_dbh('oracle_admin')))
{
$dbh->do('DROP TABLE Rdb_test_pk0 CASCADE CONSTRAINTS');
$dbh->do('DROP TABLE Rdb_test_pk1 CASCADE CONSTRAINTS');
$dbh->do('DROP TABLE Rdb_test_pk2 CASCADE CONSTRAINTS');
$dbh->disconnect;
}
if(have_db('mysql_admin') && (my $dbh = get_dbh('mysql_admin')))
{
$dbh->do('DROP TABLE Rdb_test_pk0 CASCADE');
$dbh->do('DROP TABLE Rdb_test_pk1 CASCADE');
$dbh->do('DROP TABLE Rdb_test_pk2 CASCADE');
$dbh->disconnect;
}
if(have_db('informix_admin') && (my $dbh = get_dbh('informix_admin')))
{
$dbh->do('DROP TABLE Rdb_test_pk0 CASCADE');
$dbh->do('DROP TABLE Rdb_test_pk1 CASCADE');
$dbh->do('DROP TABLE Rdb_test_pk2 CASCADE');
$dbh->disconnect;
}
if(have_db('sqlite_admin') && (my $dbh = get_dbh('sqlite_admin')))
{
$dbh->do('DROP TABLE Rdb_test_pk0');
$dbh->do('DROP TABLE Rdb_test_pk1');
$dbh->do('DROP TABLE Rdb_test_pk2');
$dbh->disconnect;
}
}