1#!/usr/bin/perl -w 2 3use strict; 4 5use Test::More tests => 1 + (1 * 4); 6 7BEGIN 8{ 9 require 't/test-lib.pl'; 10 use_ok('Rose::DB::Object::Loader'); 11} 12 13our %Have; 14 15# 16# Tests 17# 18 19#$Rose::DB::Object::Manager::Debug = 1; 20 21foreach my $db_type (qw(mysql pg informix sqlite)) 22{ 23 SKIP: 24 { 25 skip("$db_type tests", 1) unless($Have{$db_type}); 26 } 27 28 next unless($Have{$db_type}); 29 30 Rose::DB::Object::Metadata->unregister_all_classes; 31 Rose::DB->default_type($db_type); 32 33 my $class_prefix = ucfirst($db_type); 34 35 my $loader = 36 Rose::DB::Object::Loader->new( 37 db => Rose::DB->new, 38 class_prefix => $class_prefix); 39 40 my @classes = $loader->make_classes(include_tables => [ 'rose_db_object_uk_test' ]); 41 42 #foreach my $class (@classes) 43 #{ 44 # print $class->meta->perl_class_definition if($class->can('meta')); 45 #} 46 47 my $class = $class_prefix . '::RoseDbObjectUkTest'; 48 49 $class->new(a => 1, b => 2, c => 3)->save; 50 51 my $o = $class->new(a => 1, c => 3); 52 53 ok($o->load(speculative => 1), "unique key precedence 1 - $db_type"); 54} 55 56BEGIN 57{ 58 our %Have; 59 60 # 61 # PostgreSQL 62 # 63 64 my $dbh; 65 66 eval 67 { 68 $dbh = Rose::DB->new('pg_admin')->retain_dbh() 69 or die Rose::DB->error; 70 }; 71 72 if(!$@ && $dbh) 73 { 74 $Have{'pg'} = 1; 75 $Have{'pg_with_schema'} = 1; 76 77 # Drop existing tables and create schema, ignoring errors 78 { 79 local $dbh->{'RaiseError'} = 0; 80 local $dbh->{'PrintError'} = 0; 81 82 $dbh->do('DROP TABLE rose_db_object_uk_test'); 83 } 84 85 $dbh->do(<<"EOF"); 86CREATE TABLE rose_db_object_uk_test 87( 88 id SERIAL NOT NULL PRIMARY KEY, 89 a INT, 90 b INT, 91 c INT, 92 93 UNIQUE(a, b, c), 94 UNIQUE(a, c) 95) 96EOF 97 98 $dbh->disconnect; 99 } 100 101 # 102 # MySQL 103 # 104 105 eval 106 { 107 my $db = Rose::DB->new('mysql_admin'); 108 $dbh = $db->retain_dbh or die Rose::DB->error; 109 110 # Drop existing tables, ignoring errors 111 { 112 local $dbh->{'RaiseError'} = 0; 113 local $dbh->{'PrintError'} = 0; 114 115 $dbh->do('DROP TABLE rose_db_object_uk_test'); 116 } 117 }; 118 119 if(!$@ && $dbh) 120 { 121 $Have{'mysql'} = 1; 122 123 $dbh->do(<<"EOF"); 124CREATE TABLE rose_db_object_uk_test 125( 126 id INT AUTO_INCREMENT PRIMARY KEY, 127 a INT, 128 b INT, 129 c INT, 130 131 UNIQUE(a, b, c), 132 UNIQUE(a, c) 133) 134EOF 135 136 $dbh->disconnect; 137 } 138 139 # 140 # Informix 141 # 142 143 eval 144 { 145 $dbh = Rose::DB->new('informix_admin')->retain_dbh() 146 or die Rose::DB->error; 147 }; 148 149 if(!$@ && $dbh) 150 { 151 $Have{'informix'} = 1; 152 153 # Drop existing tables and create schema, ignoring errors 154 { 155 local $dbh->{'RaiseError'} = 0; 156 local $dbh->{'PrintError'} = 0; 157 158 $dbh->do('DROP TABLE rose_db_object_uk_test'); 159 } 160 161 $dbh->do(<<"EOF"); 162CREATE TABLE rose_db_object_uk_test 163( 164 id SERIAL NOT NULL PRIMARY KEY, 165 a INT, 166 b INT, 167 c INT, 168 169 UNIQUE(a, b, c), 170 UNIQUE(a, c) 171) 172EOF 173 174 $dbh->disconnect; 175 } 176 177 # 178 # SQLite 179 # 180 181 eval 182 { 183 $dbh = Rose::DB->new('sqlite_admin')->retain_dbh() 184 or die Rose::DB->error; 185 }; 186 187 if(!$@ && $dbh) 188 { 189 $Have{'sqlite'} = 1; 190 191 # Drop existing tables and create schema, ignoring errors 192 { 193 local $dbh->{'RaiseError'} = 0; 194 local $dbh->{'PrintError'} = 0; 195 196 $dbh->do('DROP TABLE rose_db_object_uk_test'); 197 } 198 199 $dbh->do(<<"EOF"); 200CREATE TABLE rose_db_object_uk_test 201( 202 id INTEGER PRIMARY KEY AUTOINCREMENT, 203 a INT, 204 b INT, 205 c INT, 206 207 UNIQUE(a, b, c), 208 UNIQUE(a, c) 209) 210EOF 211 212 $dbh->disconnect; 213 } 214} 215 216END 217{ 218 # Delete test table 219 220 if($Have{'pg'}) 221 { 222 # PostgreSQL 223 my $dbh = Rose::DB->new('pg_admin')->retain_dbh() 224 or die Rose::DB->error; 225 226 $dbh->do('DROP TABLE rose_db_object_uk_test'); 227 228 $dbh->disconnect; 229 } 230 231 if($Have{'mysql'}) 232 { 233 # MySQL 234 my $dbh = Rose::DB->new('mysql_admin')->retain_dbh() 235 or die Rose::DB->error; 236 237 $dbh->do('DROP TABLE rose_db_object_uk_test'); 238 239 $dbh->disconnect; 240 } 241 242 if($Have{'informix'}) 243 { 244 # Informix 245 my $dbh = Rose::DB->new('informix_admin')->retain_dbh() 246 or die Rose::DB->error; 247 248 $dbh->do('DROP TABLE rose_db_object_uk_test'); 249 250 $dbh->disconnect; 251 } 252 253 if($Have{'sqlite'}) 254 { 255 # Informix 256 my $dbh = Rose::DB->new('sqlite_admin')->retain_dbh() 257 or die Rose::DB->error; 258 259 $dbh->do('DROP TABLE rose_db_object_uk_test'); 260 261 $dbh->disconnect; 262 } 263} 264