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