6 use File::Path 'rmtree';
7 use DBIx::Class::Schema::Loader 'make_schema_at';
11 use dbixcsl_common_tests ();
12 use dbixcsl_test_dir '$tdir';
14 use constant EXTRA_DUMP_DIR => "$tdir/db2_extra_dump";
16 my $dsn = $ENV{DBICTEST_DB2_DSN} || '';
17 my $user = $ENV{DBICTEST_DB2_USER} || '';
18 my $password = $ENV{DBICTEST_DB2_PASS} || '';
20 plan skip_all => 'You need to set the DBICTEST_DB2_DSN, _USER, and _PASS environment variables'
21 unless ($dsn && $user);
23 my ($schema, $schemas_created); # for cleanup in END for extra tests
27 my $dbh = DBI->connect ($dsn, $user, $password, { RaiseError => 1, PrintError => 0} );
28 eval { $dbh->get_info(18) } || 0;
30 my ($maj_srv_ver) = $srv_ver =~ /^(\d+)/;
32 my $extra_graphics_data_types = {
33 graphic => { data_type => 'graphic', size => 1 },
34 'graphic(3)' => { data_type => 'graphic', size => 3 },
35 'vargraphic(3)' => { data_type => 'vargraphic', size => 3 },
36 'long vargraphic' => { data_type => 'long vargraphic' },
37 'dbclob' => { data_type => 'dbclob' },
40 my $tester = dbixcsl_common_tests->new(
42 auto_inc_pk => 'INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY',
45 password => $password,
47 preserve_case_mode_is_exclusive => 1,
50 # http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0008483.htm
53 smallint => { data_type => 'smallint' },
54 integer => { data_type => 'integer' },
55 'int' => { data_type => 'integer' },
56 real => { data_type => 'real' },
57 'double precision' => { data_type => 'double precision' },
58 double => { data_type => 'double precision' },
59 float => { data_type => 'double precision' },
60 'float(24)' => { data_type => 'real' },
61 'float(25)' => { data_type => 'double precision' },
62 'float(53)' => { data_type => 'double precision' },
63 numeric => { data_type => 'numeric' },
64 decimal => { data_type => 'numeric' },
65 'numeric(6,3)' => { data_type => 'numeric', size => [6,3] },
66 'decimal(6,3)' => { data_type => 'numeric', size => [6,3] },
68 # Character String Types
69 char => { data_type => 'char', size => 1 },
70 'char(3)' => { data_type => 'char', size => 3 },
71 'varchar(3)' => { data_type => 'varchar', size => 3 },
72 'long varchar' => { data_type => 'long varchar' },
73 'clob' => { data_type => 'clob' },
75 # Graphic String Types (double-byte strings)
76 ($maj_srv_ver >= 9) ? (%$extra_graphics_data_types) : (),
79 'char for bit data'=> { data_type => 'binary', size => 1, original => { data_type => 'char for bit data' } },
80 'char(3) for bit data'
81 => { data_type => 'binary', size => 3, original => { data_type => 'char for bit data' } },
82 'varchar(3) for bit data'
83 => { data_type => 'varbinary', size => 3, original => { data_type => 'varchar for bit data' } },
84 'long varchar for bit data'
85 => { data_type => 'blob', original => { data_type => 'long varchar for bit data' } },
86 blob => { data_type => 'blob' },
89 'date' => { data_type => 'date' },
90 'date default current date'
91 => { data_type => 'date', default_value => \'current_timestamp',
92 original => { default_value => \'current date' } },
93 'time' => { data_type => 'time' },
94 'time default current time'
95 => { data_type => 'time', default_value => \'current_timestamp',
96 original => { default_value => \'current time' } },
97 timestamp => { data_type => 'timestamp' },
98 'timestamp default current timestamp'
99 => { data_type => 'timestamp', default_value => \'current_timestamp',
100 original => { default_value => \'current timestamp' } },
103 # XXX I don't know how to make these
104 # datalink => { data_type => 'datalink' },
112 my $dbh = $schema->storage->dbh;
115 $dbh->do('CREATE SCHEMA "dbicsl-test"');
118 $schemas_created = 0;
119 skip "no CREATE SCHEMA privileges", 28 * 2;
123 CREATE TABLE "dbicsl-test".db2_loader_test4 (
124 id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY,
129 CREATE TABLE "dbicsl-test".db2_loader_test5 (
130 id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY,
132 four_id INTEGER NOT NULL UNIQUE,
133 FOREIGN KEY (four_id) REFERENCES "dbicsl-test".db2_loader_test4 (id)
136 $dbh->do('CREATE SCHEMA "dbicsl.test"');
138 CREATE TABLE "dbicsl.test".db2_loader_test6 (
139 id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY,
141 db2_loader_test4_id INTEGER,
142 FOREIGN KEY (db2_loader_test4_id) REFERENCES "dbicsl-test".db2_loader_test4 (id)
146 CREATE TABLE "dbicsl.test".db2_loader_test7 (
147 id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY,
149 six_id INTEGER NOT NULL UNIQUE,
150 FOREIGN KEY (six_id) REFERENCES "dbicsl.test".db2_loader_test6 (id)
154 CREATE TABLE "dbicsl-test".db2_loader_test8 (
155 id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL PRIMARY KEY,
157 db2_loader_test7_id INTEGER,
158 FOREIGN KEY (db2_loader_test7_id) REFERENCES "dbicsl.test".db2_loader_test7 (id)
162 $schemas_created = 1;
164 foreach my $db_schema (['dbicsl-test', 'dbicsl.test'], '%') {
166 rmtree EXTRA_DUMP_DIR;
169 local $SIG{__WARN__} = sub {
170 push @warns, $_[0] unless $_[0] =~ /\bcollides\b/;
177 db_schema => $db_schema,
178 dump_directory => EXTRA_DUMP_DIR,
181 [ $dsn, $user, $password ],
184 diag join "\n", @warns if @warns;
187 } 'dumped schema for "dbicsl-test" and "dbicsl.test" schemas with no warnings';
189 my ($test_schema, $rsrc, $rs, $row, %uniqs, $rel_info);
192 ok $test_schema = DB2MultiSchema->connect($dsn, $user, $password);
193 } 'connected test schema';
196 ok $rsrc = $test_schema->source('Db2LoaderTest4');
197 } 'got source for table in schema name with dash';
199 is try { $rsrc->column_info('id')->{is_auto_increment} }, 1,
200 'column in schema name with dash';
202 is try { $rsrc->column_info('value')->{data_type} }, 'varchar',
203 'column in schema name with dash';
205 is try { $rsrc->column_info('value')->{size} }, 100,
206 'column in schema name with dash';
209 ok $rs = $test_schema->resultset('Db2LoaderTest4');
210 } 'got resultset for table in schema name with dash';
213 ok $row = $rs->create({ value => 'foo' });
214 } 'executed SQL on table in schema name with dash';
216 $rel_info = try { $rsrc->relationship_info('db2_loader_test5') };
218 is_deeply $rel_info->{cond}, {
219 'foreign.four_id' => 'self.id'
220 }, 'relationship in schema name with dash';
222 is $rel_info->{attrs}{accessor}, 'single',
223 'relationship in schema name with dash';
225 is $rel_info->{attrs}{join_type}, 'LEFT',
226 'relationship in schema name with dash';
229 ok $rsrc = $test_schema->source('Db2LoaderTest5');
230 } 'got source for table in schema name with dash';
232 %uniqs = try { $rsrc->unique_constraints };
235 'got unique and primary constraint in schema name with dash';
238 ok $rsrc = $test_schema->source('Db2LoaderTest6');
239 } 'got source for table in schema name with dot';
241 is try { $rsrc->column_info('id')->{is_auto_increment} }, 1,
242 'column in schema name with dot introspected correctly';
244 is try { $rsrc->column_info('value')->{data_type} }, 'varchar',
245 'column in schema name with dot introspected correctly';
247 is try { $rsrc->column_info('value')->{size} }, 100,
248 'column in schema name with dot introspected correctly';
251 ok $rs = $test_schema->resultset('Db2LoaderTest6');
252 } 'got resultset for table in schema name with dot';
255 ok $row = $rs->create({ value => 'foo' });
256 } 'executed SQL on table in schema name with dot';
258 $rel_info = try { $rsrc->relationship_info('db2_loader_test7') };
260 is_deeply $rel_info->{cond}, {
261 'foreign.six_id' => 'self.id'
262 }, 'relationship in schema name with dot';
264 is $rel_info->{attrs}{accessor}, 'single',
265 'relationship in schema name with dot';
267 is $rel_info->{attrs}{join_type}, 'LEFT',
268 'relationship in schema name with dot';
271 ok $rsrc = $test_schema->source('Db2LoaderTest7');
272 } 'got source for table in schema name with dot';
274 %uniqs = try { $rsrc->unique_constraints };
277 'got unique and primary constraint in schema name with dot';
280 ok $test_schema->source('Db2LoaderTest6')
281 ->has_relationship('db2_loader_test4');
282 } 'cross-schema relationship in multi-db_schema';
285 ok $test_schema->source('Db2LoaderTest4')
286 ->has_relationship('db2_loader_test6s');
287 } 'cross-schema relationship in multi-db_schema';
290 ok $test_schema->source('Db2LoaderTest8')
291 ->has_relationship('db2_loader_test7');
292 } 'cross-schema relationship in multi-db_schema';
295 ok $test_schema->source('Db2LoaderTest7')
296 ->has_relationship('db2_loader_test8s');
297 } 'cross-schema relationship in multi-db_schema';
305 $tester->run_tests();
308 if (not $ENV{SCHEMA_LOADER_TESTS_NOCLEANUP}) {
309 if ($schemas_created && (my $dbh = try { $schema->storage->dbh })) {
310 foreach my $table ('"dbicsl-test".db2_loader_test8',
311 '"dbicsl.test".db2_loader_test7',
312 '"dbicsl.test".db2_loader_test6',
313 '"dbicsl-test".db2_loader_test5',
314 '"dbicsl-test".db2_loader_test4') {
316 $dbh->do("DROP TABLE $table");
319 diag "Error dropping table: $_";
323 foreach my $db_schema (qw/dbicsl-test dbicsl.test/) {
325 $dbh->do(qq{DROP SCHEMA "$db_schema" RESTRICT});
328 diag "Error dropping test schema $db_schema: $_";
332 rmtree EXTRA_DUMP_DIR;
335 # vim:et sts=4 sw=4 tw=0: