From: Kieren Diment Date: Sat, 9 Sep 2006 02:37:47 +0000 (+0000) Subject: added reference implementation of DBIx::Class::Manual::Example X-Git-Tag: v0.07002~5 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=0c337847c1f39b0939676ff0d7ab03d146e04174;p=dbsrgits%2FDBIx-Class.git added reference implementation of DBIx::Class::Manual::Example --- diff --git a/t/examples/Schema/MyDatabase/Main.pm b/t/examples/Schema/MyDatabase/Main.pm new file mode 100644 index 0000000..6b9eef7 --- /dev/null +++ b/t/examples/Schema/MyDatabase/Main.pm @@ -0,0 +1,5 @@ +package MyDatabase::Main; +use base qw/DBIx::Class::Schema/; +__PACKAGE__->load_classes(qw/Artist Cd Track/); + +1; diff --git a/t/examples/Schema/MyDatabase/Main/Artist.pm b/t/examples/Schema/MyDatabase/Main/Artist.pm new file mode 100644 index 0000000..5f039e6 --- /dev/null +++ b/t/examples/Schema/MyDatabase/Main/Artist.pm @@ -0,0 +1,10 @@ +package MyDatabase::Main::Artist; +use base qw/DBIx::Class/; +__PACKAGE__->load_components(qw/PK::Auto Core/); +__PACKAGE__->table('artist'); +__PACKAGE__->add_columns(qw/ artistid name /); +__PACKAGE__->set_primary_key('artistid'); +__PACKAGE__->has_many('cds' => 'MyDatabase::Main::Cd'); + +1; + diff --git a/t/examples/Schema/MyDatabase/Main/Cd.pm b/t/examples/Schema/MyDatabase/Main/Cd.pm new file mode 100644 index 0000000..4579823 --- /dev/null +++ b/t/examples/Schema/MyDatabase/Main/Cd.pm @@ -0,0 +1,10 @@ +package MyDatabase::Main::Cd; +use base qw/DBIx::Class/; +__PACKAGE__->load_components(qw/PK::Auto Core/); +__PACKAGE__->table('cd'); +__PACKAGE__->add_columns(qw/ cdid artist title/); +__PACKAGE__->set_primary_key('cdid'); +__PACKAGE__->belongs_to('artist' => 'MyDatabase::Main::Artist'); +__PACKAGE__->has_many('tracks' => 'MyDatabase::Main::Track'); + +1; diff --git a/t/examples/Schema/MyDatabase/Main/Track.pm b/t/examples/Schema/MyDatabase/Main/Track.pm new file mode 100644 index 0000000..3710406 --- /dev/null +++ b/t/examples/Schema/MyDatabase/Main/Track.pm @@ -0,0 +1,9 @@ +package MyDatabase::Main::Track; +use base qw/DBIx::Class/; +__PACKAGE__->load_components(qw/PK::Auto Core/); +__PACKAGE__->table('track'); +__PACKAGE__->add_columns(qw/ trackid cd title/); +__PACKAGE__->set_primary_key('trackid'); +__PACKAGE__->belongs_to('cd' => 'MyDatabase::Main::Cd'); + +1; diff --git a/t/examples/Schema/db/example.db b/t/examples/Schema/db/example.db new file mode 100644 index 0000000..67a1ec8 Binary files /dev/null and b/t/examples/Schema/db/example.db differ diff --git a/t/examples/Schema/db/example.sql b/t/examples/Schema/db/example.sql new file mode 100644 index 0000000..13d9b39 --- /dev/null +++ b/t/examples/Schema/db/example.sql @@ -0,0 +1,16 @@ +CREATE TABLE artist ( + artistid INTEGER PRIMARY KEY, + name TEXT NOT NULL +); + +CREATE TABLE cd ( + cdid INTEGER PRIMARY KEY, + artist INTEGER NOT NULL REFERENCES artist(artistid), + title TEXT NOT NULL +); + +CREATE TABLE track ( + trackid INTEGER PRIMARY KEY, + cd INTEGER NOT NULL REFERENCES cd(cdid), + title TEXT NOT NULL +); \ No newline at end of file diff --git a/t/examples/Schema/insertdb.pl b/t/examples/Schema/insertdb.pl new file mode 100644 index 0000000..6ce1ed9 --- /dev/null +++ b/t/examples/Schema/insertdb.pl @@ -0,0 +1,59 @@ +#!/usr/bin/perl -w + +use MyDatabase::Main; +use strict; + +my $schema = MyDatabase::Main->connect('dbi:SQLite:db/example.db'); + +# here's some of the sql that is going to be generated by the schema +# INSERT INTO artist VALUES (NULL,'Michael Jackson'); +# INSERT INTO artist VALUES (NULL,'Eminem'); + +my @artists = (['Michael Jackson'], ['Eminem']); +$schema->populate('Artist', [ + [qw/name/], + @artists, +]); + +my %albums = ( + 'Thriller' => 'Michael Jackson', + 'Bad' => 'Michael Jackson', + 'The Marshall Mathers LP' => 'Eminem', +); + +my @cds; +foreach my $lp (keys %albums) { + my $artist = $schema->resultset('Artist')->search({ + name => $albums{$lp} + }); + push @cds, [$lp, $artist->first]; +} + +$schema->populate('Cd', [ + [qw/title artist/], + @cds, +]); + + +my %tracks = ( + 'Beat It' => 'Thriller', + 'Billie Jean' => 'Thriller', + 'Dirty Diana' => 'Bad', + 'Smooth Criminal' => 'Bad', + 'Leave Me Alone' => 'Bad', + 'Stan' => 'The Marshall Mathers LP', + 'The Way I Am' => 'The Marshall Mathers LP', +); + +my @tracks; +foreach my $track (keys %tracks) { + my $cdname = $schema->resultset('Cd')->search({ + title => $tracks{$track}, + }); + push @tracks, [$cdname->first, $track]; +} + +$schema->populate('Track',[ + [qw/cd title/], + @tracks, +]); diff --git a/t/examples/Schema/testdb.pl b/t/examples/Schema/testdb.pl new file mode 100644 index 0000000..b31773d --- /dev/null +++ b/t/examples/Schema/testdb.pl @@ -0,0 +1,124 @@ +#!/usr/bin/perl -w + +use MyDatabase::Main; +use strict; + +my $schema = MyDatabase::Main->connect('dbi:SQLite:db/example.db'); +# for other DSNs, e.g. MySql, see the perldoc for the relevant dbd +# driver, e.g perldoc L. + +get_tracks_by_cd('Bad'); +get_tracks_by_artist('Michael Jackson'); + +get_cd_by_track('Stan'); +get_cds_by_artist('Michael Jackson'); + +get_artist_by_track('Dirty Diana'); +get_artist_by_cd('The Marshall Mathers LP'); + + +sub get_tracks_by_cd { + my $cdtitle = shift; + print "get_tracks_by_cd($cdtitle):\n"; + my $rs = $schema->resultset('Track')->search( + { + 'cd.title' => $cdtitle + }, + { + join => [qw/ cd /], + prefetch => [qw/ cd /] + } + ); + while (my $track = $rs->next) { + print $track->title . "\n"; + } + print "\n"; +} + +sub get_tracks_by_artist { + my $artistname = shift; + print "get_tracks_by_artist($artistname):\n"; + my $rs = $schema->resultset('Track')->search( + { + 'artist.name' => $artistname + }, + { + join => { + 'cd' => 'artist' + }, + } + ); + while (my $track = $rs->next) { + print $track->title . "\n"; + } + print "\n"; +} + + +sub get_cd_by_track { + my $tracktitle = shift; + print "get_cd_by_track($tracktitle):\n"; + my $rs = $schema->resultset('Cd')->search( + { + 'tracks.title' => $tracktitle + }, + { + join => [qw/ tracks /], + } + ); + my $cd = $rs->first; + print $cd->title . "\n\n"; +} + +sub get_cds_by_artist { + my $artistname = shift; + print "get_cds_by_artist($artistname):\n"; + my $rs = $schema->resultset('Cd')->search( + { + 'artist.name' => $artistname + }, + { + join => [qw/ artist /], + prefetch => [qw/ artist /] + } + ); + while (my $cd = $rs->next) { + print $cd->title . "\n"; + } + print "\n"; +} + + + +sub get_artist_by_track { + my $tracktitle = shift; + print "get_artist_by_track($tracktitle):\n"; + my $rs = $schema->resultset('Artist')->search( + { + 'tracks.title' => $tracktitle + }, + { + join => { + 'cds' => 'tracks' + } + } + ); + my $artist = $rs->first; + print $artist->name . "\n\n"; +} + + +sub get_artist_by_cd { + my $cdtitle = shift; + print "get_artist_by_cd($cdtitle):\n"; + my $rs = $schema->resultset('Artist')->search( + { + 'cds.title' => $cdtitle + }, + { + join => [qw/ cds /], + } + ); + my $artist = $rs->first; + print $artist->name . "\n\n"; +}