We can now generate our own test schema
Matt S Trout [Fri, 27 Jan 2006 01:57:13 +0000 (01:57 +0000)]
21 files changed:
MANIFEST.SKIP
lib/SQL/Translator/Parser/DBIx/Class.pm
maint/gen-schema.pl [new file with mode: 0755]
t/lib/DBICTest/Schema/Artist.pm
t/lib/DBICTest/Schema/ArtistUndirectedMap.pm
t/lib/DBICTest/Schema/CD.pm
t/lib/DBICTest/Schema/CD_to_Producer.pm
t/lib/DBICTest/Schema/FourKeys.pm
t/lib/DBICTest/Schema/LinerNotes.pm
t/lib/DBICTest/Schema/OneKey.pm
t/lib/DBICTest/Schema/Producer.pm
t/lib/DBICTest/Schema/SelfRef.pm
t/lib/DBICTest/Schema/SelfRefAlias.pm
t/lib/DBICTest/Schema/Tag.pm
t/lib/DBICTest/Schema/Track.pm
t/lib/DBICTest/Schema/TwoKeys.pm
t/lib/DBICTest/Setup.pm
t/lib/sqlite.sql [new file with mode: 0644]
t/run/01core.tl
t/run/04db.tl
t/run/16joins.tl

index 261402e..2b46817 100644 (file)
@@ -32,3 +32,6 @@
 
 # Don't ship the last dist we built :)
 \.tar\.gz$
+
+# Skip maint stuff
+^maint/
index 4ec18ef..6225724 100644 (file)
@@ -40,11 +40,12 @@ sub parse {
 
 #    print Dumper($dbixschema->registered_classes);
 
-    foreach my $tableclass ($dbixschema->registered_classes)
+    #foreach my $tableclass ($dbixschema->registered_classes)
+    foreach my $moniker ($dbixschema->sources)
     {
-        eval "use $tableclass";
-        print("Can't load $tableclass"), next if($@);
-        my $source = $tableclass->result_source_instance;
+        #eval "use $tableclass";
+        #print("Can't load $tableclass"), next if($@);
+        my $source = $dbixschema->source($moniker);
 
         my $table = $schema->add_table(
                                        name => $source->name,
@@ -57,13 +58,15 @@ sub parse {
             # data_type is a number, column_type is text?
             my %colinfo = (
               name => $col,
-              default_value => '',
               size => 0,
               is_auto_increment => 0,
               is_foreign_key => 0,
               is_nullable => 0,
               %{$source->column_info($col)}
             );
+            if ($colinfo{is_nullable}) {
+              $colinfo{default} = '' unless exists $colinfo{default};
+            }
             my $f = $table->add_field(%colinfo) || die $table->error;
         }
         $table->primary_key($source->primary_columns);
diff --git a/maint/gen-schema.pl b/maint/gen-schema.pl
new file mode 100755 (executable)
index 0000000..b16bd15
--- /dev/null
@@ -0,0 +1,22 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use lib qw(lib t/lib);
+
+use UNIVERSAL::require;
+
+my $from = 'SQL::Translator::Parser::DBIx::Class';
+my $to = 'SQL::Translator::Producer::SQLite';
+my $sqlt = 'SQL::Translator';
+my $schema = 'DBICTest::Schema';
+
+$from->require;
+$to->require;
+$sqlt->require;
+$schema->require;
+
+my $tr = $sqlt->new;
+
+$from->can("parse")->($tr, $schema);
+print $to->can("produce")->($tr);
index 47f22e8..2200cd4 100644 (file)
@@ -3,7 +3,16 @@ package DBICTest::Schema::Artist;
 use base 'DBIx::Class::Core';
 
 DBICTest::Schema::Artist->table('artist');
-DBICTest::Schema::Artist->add_columns('artistid', {}, 'name');
+DBICTest::Schema::Artist->add_columns(
+  'artistid' => {
+    data_type => 'integer',
+    is_auto_increment => 1
+  },
+  'name' => {
+    data_type => 'varchar',
+    is_nullable => 1,
+  },
+);
 DBICTest::Schema::Artist->set_primary_key('artistid');
 
 __PACKAGE__->mk_classdata('field_name_for', {
index 3c0a379..8e58312 100644 (file)
@@ -3,7 +3,10 @@ package DBICTest::Schema::ArtistUndirectedMap;
 use base 'DBIx::Class::Core';
 
 __PACKAGE__->table('artist_undirected_map');
-__PACKAGE__->add_columns(qw/id1 id2/);
+__PACKAGE__->add_columns(
+  'id1' => { data_type => 'integer' },
+  'id2' => { data_type => 'integer' },
+);
 __PACKAGE__->set_primary_key(qw/id1 id2/);
 
 1;
index 35b8acd..8e04c16 100644 (file)
@@ -3,7 +3,21 @@ package DBICTest::Schema::CD;
 use base 'DBIx::Class::Core';
 
 DBICTest::Schema::CD->table('cd');
-DBICTest::Schema::CD->add_columns(qw/cdid artist title year/);
+DBICTest::Schema::CD->add_columns(
+  'cdid' => {
+    data_type => 'integer',
+    is_auto_increment => 1,
+  },
+  'artist' => {
+    data_type => 'integer',
+  },
+  'title' => {
+    data_type => 'varchar',
+  },
+  'year' => {
+    data_type => 'varchar',
+  },
+);
 DBICTest::Schema::CD->set_primary_key('cdid');
 DBICTest::Schema::CD->add_unique_constraint(artist_title => [ qw/artist title/ ]);
 
index 4c111c4..762e806 100644 (file)
@@ -3,7 +3,10 @@ package DBICTest::Schema::CD_to_Producer;
 use base 'DBIx::Class::Core';
 
 __PACKAGE__->table('cd_to_producer');
-__PACKAGE__->add_columns(qw/cd producer/);
+__PACKAGE__->add_columns(
+  cd => { data_type => 'integer' },
+  producer => { data_type => 'integer' },
+);
 __PACKAGE__->set_primary_key(qw/cd producer/);
 
 1;
index be18952..f9112fa 100644 (file)
@@ -3,7 +3,12 @@ package DBICTest::Schema::FourKeys;
 use base 'DBIx::Class::Core';
 
 DBICTest::Schema::FourKeys->table('fourkeys');
-DBICTest::Schema::FourKeys->add_columns(qw/foo bar hello goodbye/);
+DBICTest::Schema::FourKeys->add_columns(
+  'foo' => { data_type => 'integer' },
+  'bar' => { data_type => 'integer' },
+  'hello' => { data_type => 'integer' },
+  'goodbye' => { data_type => 'integer' },
+);
 DBICTest::Schema::FourKeys->set_primary_key(qw/foo bar hello goodbye/);
 
 1;
index 442a5c1..1f35b4b 100644 (file)
@@ -3,7 +3,14 @@ package DBICTest::Schema::LinerNotes;
 use base qw/DBIx::Class::Core/;
 
 DBICTest::Schema::LinerNotes->table('liner_notes');
-DBICTest::Schema::LinerNotes->add_columns(qw/liner_id notes/);
+DBICTest::Schema::LinerNotes->add_columns(
+  'liner_id' => {
+    data_type => 'integer',
+  },
+  'notes' => {
+    data_type => 'varchar',
+  },
+);
 DBICTest::Schema::LinerNotes->set_primary_key('liner_id');
 
 1;
index 72d8de3..081c94b 100644 (file)
@@ -3,7 +3,18 @@ package DBICTest::Schema::OneKey;
 use base 'DBIx::Class::Core';
 
 DBICTest::Schema::OneKey->table('onekey');
-DBICTest::Schema::OneKey->add_columns(qw/id artist cd/);
+DBICTest::Schema::OneKey->add_columns(
+  'id' => {
+    data_type => 'integer',
+    is_auto_increment => 1,
+  },
+  'artist' => {
+    data_type => 'integer',
+  },
+  'cd' => {
+    data_type => 'integer',
+  },
+);
 DBICTest::Schema::OneKey->set_primary_key('id');
 
 
index c8dbf70..01fa843 100644 (file)
@@ -3,7 +3,15 @@ package DBICTest::Schema::Producer;
 use base 'DBIx::Class::Core';
 
 __PACKAGE__->table('producer');
-__PACKAGE__->add_columns(qw/producerid name/);
+__PACKAGE__->add_columns(
+  'producerid' => {
+    data_type => 'integer',
+    is_auto_increment => 1
+  },
+  'name' => {
+    data_type => 'varchar',
+  },
+);
 __PACKAGE__->set_primary_key('producerid');
 
 1;
index 8c065c2..48c8290 100644 (file)
@@ -3,7 +3,15 @@ package DBICTest::Schema::SelfRef;
 use base 'DBIx::Class::Core';\r
 \r
 __PACKAGE__->table('self_ref');\r
-__PACKAGE__->add_columns(qw/id name/);\r
+__PACKAGE__->add_columns(\r
+  'id' => {\r
+    data_type => 'integer',\r
+    is_auto_increment => 1,\r
+  },\r
+  'name' => {\r
+    data_type => 'varchar',\r
+  },\r
+);\r
 __PACKAGE__->set_primary_key('id');\r
 \r
 1;\r
index 736e418..d4ef35c 100644 (file)
@@ -3,7 +3,14 @@ package DBICTest::Schema::SelfRefAlias;
 use base 'DBIx::Class::Core';\r
 \r
 __PACKAGE__->table('self_ref_alias');\r
-__PACKAGE__->add_columns(qw/self_ref alias/);\r
+__PACKAGE__->add_columns(\r
+  'self_ref' => {\r
+    data_type => 'integer',\r
+  },\r
+  'alias' => {\r
+    data_type => 'integer',\r
+  },\r
+);\r
 __PACKAGE__->set_primary_key('self_ref alias');\r
 \r
 1;\r
index a356d8f..0a303d6 100644 (file)
@@ -3,7 +3,18 @@ package DBICTest::Schema::Tag;
 use base qw/DBIx::Class::Core/;
 
 DBICTest::Schema::Tag->table('tags');
-DBICTest::Schema::Tag->add_columns(qw/tagid cd tag/);
+DBICTest::Schema::Tag->add_columns(
+  'tagid' => {
+    data_type => 'varchar',
+    is_auto_increment => 1,
+  },
+  'cd' => {
+    data_type => 'integer',
+  },
+  'tag' => {
+    data_type => 'varchar'
+  },
+);
 DBICTest::Schema::Tag->set_primary_key('tagid');
 
 1;
index 2e6fa7f..be0f273 100644 (file)
@@ -3,7 +3,21 @@ package DBICTest::Schema::Track;
 use base 'DBIx::Class::Core';
 
 DBICTest::Schema::Track->table('track');
-DBICTest::Schema::Track->add_columns(qw/trackid cd position title/);
+DBICTest::Schema::Track->add_columns(
+  'trackid' => {
+    data_type => 'integer',
+    is_auto_increment => 1,
+  },
+  'cd' => {
+    data_type => 'integer',
+  },
+  'position' => {
+    data_type => 'integer',
+  },
+  'title' => {
+    data_type => 'varchar',
+  },
+);
 DBICTest::Schema::Track->set_primary_key('trackid');
 
 1;
index ea6fa92..e4bb1b0 100755 (executable)
@@ -3,7 +3,10 @@ package DBICTest::Schema::TwoKeys;
 use base 'DBIx::Class::Core';
 
 DBICTest::Schema::TwoKeys->table('twokeys');
-DBICTest::Schema::TwoKeys->add_columns(qw/artist cd/);
+DBICTest::Schema::TwoKeys->add_columns(
+  'artist' => { data_type => 'integer' },
+  'cd' => { data_type => 'integer' },
+);
 DBICTest::Schema::TwoKeys->set_primary_key(qw/artist cd/);
 
 1;
index 94de234..de113db 100755 (executable)
@@ -15,40 +15,6 @@ my $schema = DBICTest::Schema->compose_connection('DBICTest' => $dsn);
 my $dbh = DBI->connect($dsn);
 
 my $sql = <<EOSQL;
-CREATE TABLE artist (artistid INTEGER NOT NULL PRIMARY KEY, name VARCHAR);
-
-CREATE TABLE cd (cdid INTEGER NOT NULL PRIMARY KEY, artist INTEGER NOT NULL,
-                     title VARCHAR, year VARCHAR);
-
-CREATE TABLE liner_notes (liner_id INTEGER NOT NULL PRIMARY KEY, notes VARCHAR);
-
-CREATE TABLE track (trackid INTEGER NOT NULL PRIMARY KEY, cd INTEGER NOT NULL,
-                       position INTEGER NOT NULL, title VARCHAR);
-
-CREATE TABLE tags (tagid INTEGER NOT NULL PRIMARY KEY, cd INTEGER NOT NULL,
-                      tag VARCHAR);
-
-CREATE TABLE twokeys (artist INTEGER NOT NULL, cd INTEGER NOT NULL,
-                      PRIMARY KEY (artist, cd) );
-
-CREATE TABLE fourkeys (foo INTEGER NOT NULL, bar INTEGER NOT NULL,
-                      hello INTEGER NOT NULL, goodbye INTEGER NOT NULL,
-                      PRIMARY KEY (foo, bar, hello, goodbye) );
-
-CREATE TABLE onekey (id INTEGER NOT NULL PRIMARY KEY,
-                      artist INTEGER NOT NULL, cd INTEGER NOT NULL );
-
-CREATE TABLE self_ref (id INTEGER NOT NULL PRIMARY KEY,
-                      name VARCHAR );
-
-CREATE TABLE self_ref_alias (self_ref INTEGER NOT NULL, alias INTEGER NOT NULL,
-                      PRIMARY KEY( self_ref, alias ) );
-
-CREATE TABLE artist_undirected_map (id1 INTEGER NOT NULL, id2 INTEGER NOT NULL, PRIMARY KEY(id1, id2));
-
-CREATE TABLE producer (producerid INTEGER NOT NULL PRIMARY KEY, name VARCHAR);
-
-CREATE TABLE cd_to_producer (cd INTEGER NOT NULL, producer INTEGER NOT NULL);
 
 INSERT INTO artist (artistid, name) VALUES (1, 'Caterwauler McCrae');
 
@@ -128,8 +94,52 @@ INSERT INTO cd_to_producer (cd, producer) VALUES (1, 1);
 
 EOSQL
 
+open IN, "t/lib/sqlite.sql";
+
+{ local $/ = undef; $sql = <IN>.$sql; }
+
+close IN;
+
 $dbh->do($_) for split(/\n\n/, $sql);
 
 $schema->storage->dbh->do("PRAGMA synchronous = OFF");
 
 1;
+
+__DATA__
+
+CREATE TABLE artist (artistid INTEGER NOT NULL PRIMARY KEY, name VARCHAR);
+
+CREATE TABLE cd (cdid INTEGER NOT NULL PRIMARY KEY, artist INTEGER NOT NULL,
+                     title VARCHAR, year VARCHAR);
+
+CREATE TABLE liner_notes (liner_id INTEGER NOT NULL PRIMARY KEY, notes VARCHAR);
+
+CREATE TABLE track (trackid INTEGER NOT NULL PRIMARY KEY, cd INTEGER NOT NULL,
+                       position INTEGER NOT NULL, title VARCHAR);
+
+CREATE TABLE tags (tagid INTEGER NOT NULL PRIMARY KEY, cd INTEGER NOT NULL,
+                      tag VARCHAR);
+
+CREATE TABLE twokeys (artist INTEGER NOT NULL, cd INTEGER NOT NULL,
+                      PRIMARY KEY (artist, cd) );
+
+CREATE TABLE fourkeys (foo INTEGER NOT NULL, bar INTEGER NOT NULL,
+                      hello INTEGER NOT NULL, goodbye INTEGER NOT NULL,
+                      PRIMARY KEY (foo, bar, hello, goodbye) );
+
+CREATE TABLE onekey (id INTEGER NOT NULL PRIMARY KEY,
+                      artist INTEGER NOT NULL, cd INTEGER NOT NULL );
+
+CREATE TABLE self_ref (id INTEGER NOT NULL PRIMARY KEY,
+                      name VARCHAR );
+
+CREATE TABLE self_ref_alias (self_ref INTEGER NOT NULL, alias INTEGER NOT NULL,
+                      PRIMARY KEY( self_ref, alias ) );
+
+CREATE TABLE artist_undirected_map (id1 INTEGER NOT NULL, id2 INTEGER NOT NULL, PRIMARY KEY(id1, id2));
+
+CREATE TABLE producer (producerid INTEGER NOT NULL PRIMARY KEY, name VARCHAR);
+
+CREATE TABLE cd_to_producer (cd INTEGER NOT NULL, producer INTEGER NOT NULL);
+
diff --git a/t/lib/sqlite.sql b/t/lib/sqlite.sql
new file mode 100644 (file)
index 0000000..8bc7146
--- /dev/null
@@ -0,0 +1,124 @@
+-- 
+-- Created by SQL::Translator::Producer::SQLite
+-- Created on Fri Jan 27 01:16:24 2006
+-- 
+BEGIN TRANSACTION;
+
+--
+-- Table: twokeys
+--
+CREATE TABLE twokeys (
+  artist integer NOT NULL,
+  cd integer NOT NULL,
+  PRIMARY KEY (artist, cd)
+);
+
+--
+-- Table: liner_notes
+--
+CREATE TABLE liner_notes (
+  liner_id INTEGER PRIMARY KEY NOT NULL,
+  notes varchar NOT NULL
+);
+
+--
+-- Table: cd_to_producer
+--
+CREATE TABLE cd_to_producer (
+  cd integer NOT NULL,
+  producer integer NOT NULL,
+  PRIMARY KEY (cd, producer)
+);
+
+--
+-- Table: artist
+--
+CREATE TABLE artist (
+  artistid INTEGER PRIMARY KEY NOT NULL,
+  name varchar
+);
+
+--
+-- Table: self_ref_alias
+--
+CREATE TABLE self_ref_alias (
+  self_ref integer NOT NULL,
+  alias integer NOT NULL
+);
+
+--
+-- Table: fourkeys
+--
+CREATE TABLE fourkeys (
+  foo integer NOT NULL,
+  bar integer NOT NULL,
+  hello integer NOT NULL,
+  goodbye integer NOT NULL,
+  PRIMARY KEY (foo, bar, hello, goodbye)
+);
+
+--
+-- Table: cd
+--
+CREATE TABLE cd (
+  cdid INTEGER PRIMARY KEY NOT NULL,
+  artist integer NOT NULL,
+  title varchar NOT NULL,
+  year varchar NOT NULL
+);
+
+--
+-- Table: artist_undirected_map
+--
+CREATE TABLE artist_undirected_map (
+  id1 integer NOT NULL,
+  id2 integer NOT NULL,
+  PRIMARY KEY (id1, id2)
+);
+
+--
+-- Table: onekey
+--
+CREATE TABLE onekey (
+  id INTEGER PRIMARY KEY NOT NULL,
+  artist integer NOT NULL,
+  cd integer NOT NULL
+);
+
+--
+-- Table: track
+--
+CREATE TABLE track (
+  trackid INTEGER PRIMARY KEY NOT NULL,
+  cd integer NOT NULL,
+  position integer NOT NULL,
+  title varchar NOT NULL
+);
+
+--
+-- Table: producer
+--
+CREATE TABLE producer (
+  producerid INTEGER PRIMARY KEY NOT NULL,
+  name varchar NOT NULL
+);
+
+--
+-- Table: self_ref
+--
+CREATE TABLE self_ref (
+  id INTEGER PRIMARY KEY NOT NULL,
+  name varchar NOT NULL
+);
+
+--
+-- Table: tags
+--
+CREATE TABLE tags (
+  tagid varchar NOT NULL,
+  cd integer NOT NULL,
+  tag varchar NOT NULL,
+  PRIMARY KEY (tagid)
+);
+
+COMMIT;
index ddae2c4..27868df 100644 (file)
@@ -143,6 +143,8 @@ cmp_ok($or_rs->next->cdid, '==', $rel_rs->next->cdid, 'Related object ok');
 
 ok($schema->storage(), 'Storage available');
 
+$schema->source("Artist")->{_columns}{'artistid'} = {};
+
 my $typeinfo = $schema->source("Artist")->column_info('artistid');
 is($typeinfo->{data_type}, 'INTEGER', 'column_info ok');
 }
index 452c0b9..5adf439 100644 (file)
@@ -34,7 +34,7 @@ my $test_type_info = {
         'data_type' => 'INTEGER'
     },
     'name' => {
-        'data_type' => 'VARCHAR'
+        'data_type' => 'varchar'
     }
 };
 is_deeply($type_info, $test_type_info, 'columns_info_for - column data types');
index 0f59ab7..1b3ff15 100644 (file)
@@ -151,8 +151,8 @@ is( $tag->cd->artist->name, 'Caterwauler McCrae', 'step 2 ok for nested prefetch
 
 # count the SELECTs
 DBI->trace(0, undef);
-my $selects = 0;
-my $trace = IO::File->new('t/var/dbic.trace', '<') 
+$selects = 0;
+$trace = IO::File->new('t/var/dbic.trace', '<') 
     or die "Unable to read trace file";
 while (<$trace>) {
     $selects++ if /SELECT(?!.*WHERE 1=0.*)/;