X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FProducer%2FTurnkey.pm;h=93f4e2f63bfee15d18f7f93097e5f7f5ccda18db;hb=1672901e45a5cc86603a0daa7219e9300e569ec2;hp=45b312c3313f579a32a2a6945f24cf34d6091861;hpb=c01582e98c07af668221691e11da0cae9700db50;p=dbsrgits%2FSQL-Translator.git diff --git a/lib/SQL/Translator/Producer/Turnkey.pm b/lib/SQL/Translator/Producer/Turnkey.pm index 45b312c..93f4e2f 100644 --- a/lib/SQL/Translator/Producer/Turnkey.pm +++ b/lib/SQL/Translator/Producer/Turnkey.pm @@ -1,10 +1,9 @@ package SQL::Translator::Producer::Turnkey; # ------------------------------------------------------------------- -# $Id: Turnkey.pm,v 1.16 2004-01-02 19:53:40 allenday Exp $ +# $Id: Turnkey.pm,v 1.57 2004-08-05 02:05:46 boconnor Exp $ # ------------------------------------------------------------------- -# Copyright (C) 2003 Allen Day , -# Brian O'Connor . +# Copyright (C) 2002-4 SQLFairy Authors # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as @@ -23,7 +22,7 @@ package SQL::Translator::Producer::Turnkey; use strict; use vars qw[ $VERSION $DEBUG ]; -$VERSION = sprintf "%d.%02d", q$Revision: 1.16 $ =~ /(\d+)\.(\d+)/; +$VERSION = sprintf "%d.%02d", q$Revision: 1.57 $ =~ /(\d+)\.(\d+)/; $DEBUG = 1 unless defined $DEBUG; use SQL::Translator::Schema::Constants; @@ -31,6 +30,7 @@ use SQL::Translator::Schema::Graph; use SQL::Translator::Schema::Graph::HyperEdge; use Log::Log4perl; Log::Log4perl::init('/etc/log4perl.conf'); use Data::Dumper; +$Data::Dumper::Maxdepth = 3; use Template; my %producer2dsn = ( @@ -58,10 +58,14 @@ sub produce { my %meta = ( format_fk => $t->format_fk_name, + format_package => $t->format_package_name, + format_table => $t->format_table_name, template => $args->{'template'} || '', baseclass => $baseclass, + db_dsn => $args->{'db_dsn'} || '', db_user => $args->{'db_user'} || '', db_pass => $args->{'db_pass'} || '', + db_str => $args->{'db_str'} || '', parser => $t->parser_type, producer => __PACKAGE__, dsn => $args->{'dsn'} || sprintf( 'dbi:%s:_', $producer2dsn{ $parser_type } @@ -73,6 +77,7 @@ sub produce { # # create methods # + # this code needs to move to Graph.pm foreach my $node_from ($graph->node_values){ next unless $node_from->table->is_data or !$node_from->table->is_trivial_link; @@ -133,6 +138,7 @@ sub produce { $i++; } } +#warn Dumper($hyperedge) if $hyperedge->type eq 'many2many'; $node_from->push_hyperedges($hyperedge); } } @@ -145,23 +151,34 @@ sub translateForm { my $t = shift; my $meta = shift; - -#"Node Data:\n"; -#warn Dumper $meta->{nodes}; -#exit; - my $args = $t->producer_args; my $type = $meta->{'template'}; - my $tt2; - $tt2 = template($type); + my $template = Template->new({ - PRE_CHOMP => 1, - POST_CHOMP => 0, - EVAL_PERL => 1 - }); + PRE_CHOMP => 1, + POST_CHOMP => 0, + EVAL_PERL => 1 + }); + my $tt2; + $tt2 = template($type); my $result; - $template->process(\$tt2, $meta, \$result) || die $template->error(); + + if($type eq 'atomtemplate'){ + my %result; + foreach my $node (values %{ $meta->{'nodes'} }){ + $result = ''; + my $param = { node => $node }; + $template->process(\$tt2, $param, \$result) || die $template->error(); + $result =~ s/^\s*(.+)\s*$/$1/s; + next unless $result; + $result{$node->table->name} = $result; + } + return \%result; + } else { + $template->process(\$tt2, $meta, \$result) || die $template->error(); + } + return($result); } @@ -186,7 +203,7 @@ L. =head1 AUTHORS Allen Day Eallenday@ucla.eduE -Brian O\'Connor Ebrian.oconnor@excite.comE. +Brian O\'Connor Eboconnor@ucla.comE. =cut @@ -198,16 +215,15 @@ sub template { ########################################### if($type eq 'dbi'){ - return <set_up_table('[% node.table.name %]'); [% printPKAccessors(node.primary_key, node.table.name) %] @@ -216,26 +232,25 @@ use Class::DBI::Pager; [% printHasCompound(node.compoundedges, node.hyperedges, node.name) %] [% #printHasFriendly(node) %] [% END %] - -# MACRO - [% MACRO printPKAccessors(array, name) BLOCK %] # # Primary key accessors # + [% FOREACH item = array %] -sub id { shift->[% item %] } -sub [% name %] { shift->[% item %] } +[% IF item != "id" %]sub id { shift->[% item %] }[% END %] +[% IF item != name %]sub [% name %] { shift->[% item %] }[% END %] [% END %] [% END %] - [% MACRO printHasA(edges, name) BLOCK %] +[% FOREACH edge = edges %] +[% IF loop.first() %] # # Has A # -[% FOREACH edge = edges %] +[% END %] [% IF edge.type == 'import' %] [% node.name %]->has_a([% edge.thisfield.name %] => '[% edge.thatnode.name %]'); [% IF node.has(edge.thatnode.name) < 2 %] @@ -243,18 +258,19 @@ sub [% edge.thatnode.table.name %] { return shift->[% edge.thisfield.name %] } [% ELSE %] sub [% format_fk(edge.thisnode.table.name,edge.thisfield.name) %] { return shift->[% edge.thisfield.name %] } [% END %] - [% END %] [% END %] [% END %] [% MACRO printHasMany(edges, node) BLOCK %] +[% FOREACH edge = edges %] +[% IF loop.first() %] # # Has Many # -[% FOREACH edge = edges %] +[% END %] [% IF edge.type == 'export' %] [% node.name %]->has_many('[% edge.thatnode.table.name %]_[% edge.thatfield.name %]', '[% edge.thatnode.name %]' => '[% edge.thatfield.name %]'); [% IF node.via(edge.thatnode.name) >= 1 %] @@ -271,98 +287,152 @@ sub [% edge.thatnode.table.name %]s { return shift->[% edge.thatnode.table.name [% END %] [% END %] - [% MACRO printHasCompound(cedges,hedges,name) BLOCK %] +[% FOREACH cedge = cedges %] +[% IF loop.first() %] # # Has Compound Many # -[% FOREACH cedge = cedges %] +[% END %] [% FOREACH edge = cedge.edges %] [% NEXT IF edge.thisnode.name != name %] sub [% cedge.via.table.name %]_[% format_fk(edge.thatnode.table.name,edge.thatfield.name) %]s { return shift->[% cedge.via.table.name %]_[% edge.thatfield.name %] } [% END %] [% END %] +[% seen = 0 %] [% FOREACH h = hedges %] -########## [% h.type %] ########## - [% IF h.type == 'one2one' %] -sub [% h.thatnode.table.name %]s { my \$self = shift; return map \$_->[% h.thatviafield.name %], \$self->[% h.vianode.table.name %]_[% h.thisviafield.name %] } + [% NEXT UNLESS h.type == 'one2one' %] +[% IF seen == 0 ; seen = 1 %]# one2one #[% END %] +sub [% h.thatnode.table.name %]s { my $self = shift; return map $_->[% h.thatviafield.name %], $self->[% h.vianode.table.name %]_[% h.thisviafield.name %] } +[% END %] - [% ELSIF h.type == 'one2many' %] - [% thisnode = h.thisnode_index(0) %] - [% i = 0 %] - [% FOREACH thatnode = h.thatnode %] +[% seen = 0 %] +[% FOREACH h = hedges %] + [% NEXT UNLESS h.type == 'one2many' %] +[% IF seen == 0 ; seen = 1 %]# one2many #[% END %] + [% thisnode = h.thisnode_index(0) %] + [% i = 0 %] + [% FOREACH thatnode = h.thatnode %] + [% NEXT UNLESS h.thisviafield_index(i).name %] #[% thisnode.name %]::[% h.thisfield_index(0).name %] -> [% h.vianode.name %]::[% h.thisviafield_index(i).name %] ... [% h.vianode.name %]::[% h.thatviafield_index(0).name %] <- [% h.thatnode_index(0).name %]::[% h.thatfield_index(0).name %] -sub [% h.vianode.table.name %]_[% format_fk(h.vianode,h.thatviafield_index(0).name) %]s { my \$self = shift; return map \$_->[% h.thatviafield_index(0).name %], \$self->[% h.vianode.table.name %]_[% h.thisviafield_index(i).name %] } - [% i = i + 1 %] - [% END %] +sub [% h.vianode.table.name %]_[% format_fk(h.vianode,h.thatviafield_index(0).name) %]s { my $self = shift; return map $_->[% h.thatviafield_index(0).name %], $self->[% h.vianode.table.name %]_[% h.thisviafield_index(i).name %] } + [% i = i + 1 %] + [% END %] +[% END %] - [% ELSIF h.type == 'many2one' %] - [% i = 0 %] - [% FOREACH thisnode = h.thisnode %] +[% seen = 0 %] +[% FOREACH h = hedges %] + [% NEXT UNLESS h.type == 'many2one' %] +[% IF seen == 0 ; seen = 1 %]# many2one #[% END %] + [% i = 0 %] + [% FOREACH thisnode = h.thisnode %] #[% thisnode.name %]::[% h.thisfield_index(0).name %] -> [% h.vianode.name %]::[% h.thisviafield_index(i).name %] ... [% h.vianode.name %]::[% h.thatviafield_index(0).name %] <- [% h.thatnode_index(0).name %]::[% h.thatfield_index(0).name %] -sub [% h.vianode.table.name %]_[% format_fk(h.vianode,h.thisviafield_index(i).name) %]_[% format_fk(h.vianode,h.thatviafield_index(0).name) %]s { my \$self = shift; return map \$_->[% h.thatviafield_index(0).name %], \$self->[% h.vianode.table.name %]_[% h.thisviafield_index(i).name %] } - [% i = i + 1 %] - - [% END %] +sub [% h.vianode.table.name %]_[% format_fk(h.vianode,h.thisviafield_index(i).name) %]_[% format_fk(h.vianode,h.thatviafield_index(0).name) %]s { my $self = shift; return map $_->[% h.thatviafield_index(0).name %], $self->[% h.vianode.table.name %]_[% h.thisviafield_index(i).name %] } + [% i = i + 1 %] + [% END %] +[% END %] - [% ELSIF h.type == 'many2many' %] - [% i = 0 %] - [% FOREACH thisnode = h.thisnode %] - [% j = 0 %] - [% FOREACH thatnode = h.thatnode %] +[% seen = 0 %] +[% FOREACH h = hedges %] + [% NEXT UNLESS h.type == 'many2many' %] +[% IF seen == 0 ; seen = 1 %]# many2many #[% END %] + [% i = 0 %] + [% FOREACH thisnode = h.thisnode %] + [% j = 0 %] + [% FOREACH thatnode = h.thatnode %] #[% thisnode.name %]::[% h.thisfield_index(i).name %] -> [% h.vianode.name %]::[% h.thisviafield_index(i).name %] ... [% h.vianode.name %]::[% h.thatviafield_index(j).name %] <- [% h.thatnode_index(j).name %]::[% h.thatfield_index(j).name %] -sub [% h.vianode.table.name %]_[% format_fk(h.vianode,h.thisviafield_index(i).name) %]_[% format_fk(h.vianode,h.thatviafield_index(j).name) %]s { my \$self = shift; return map \$_->[% %], \$self->[% %] } - [% j = j + 1 %] - - [% END %] - [% i = i + 1 %] +sub [% h.vianode.table.name %]_[% format_fk(h.vianode,h.thisviafield_index(i).name) %]_[% format_fk(h.vianode,h.thatviafield_index(j).name) %]s { my $self = shift; return map $_->[% h.vianode.table.name %]_[% format_fk(h.vianode,h.thatviafield_index(j).name) %]s, $self->[% h.vianode.table.name %]_[% format_fk(h.vianode,h.thisviafield_index(i).name) %]s } + [% j = j + 1 %] [% END %] + [% i = i + 1 %] [% END %] [% END %] - +1; [% END %] - [% MACRO printHasFriendly(node) BLOCK %] # # Has Friendly # +#FIXME, why aren't these being generated? [% END %] - [% MACRO printList(array) BLOCK %][% FOREACH item = array %][% item %] [% END %][% END %] + +########AutoDBI.pm######## +use Turnkey::Model::DBI; +[% FOREACH node = nodes %] +use [% node.value.name %]; +[% END %] +1; + +########[% baseclass | replace('Turnkey::Model::', '') %].pm######## package [% baseclass %]; # Created by SQL::Translator::Producer::Turnkey # Template used: classdbi use strict; +use Data::Dumper; +no warnings 'redefine'; use base qw(Class::DBI::Pg); -[% baseclass %]->set_db('Main', '[% db_str %]', '[% db_user %]', '[% db_pass %]'); +[% baseclass %]->set_db('Main', '[% db_dsn %]', '[% db_user %]', '[% db_pass %]'); +sub search_ilike { shift->_do_search(ILIKE => [% "\@\_" %] ) } +sub search_lower { + my $c = shift; + my %q = @_; + my %t; + foreach my $k (keys %q){ + $t{"lower($k)"} = lc($q{$k}); + } + $c->_do_search(LIKE => %t); +} -[% FOREACH node = nodes %] - [% printPackage(node.value) %] -[% END %] + +# debug method +sub dump { + my $self = shift; + my %arg = %{shift @_}; + $arg{'indent'} ||= 1; + $arg{'depth'} ||= 3; + $Data::Dumper::Maxdepth = $arg{'depth'} if defined $arg{'depth'}; + $Data::Dumper::Indent = $arg{'indent'} if defined $arg{'indent'}; + return(Dumper($arg{'object'})); +} + +1; + +[% FOREACH node = nodes %][% printPackage(node.value) %][% END %] EOF } +elsif($type eq 'soap'){ + return <<'EOF'; +[% FOREACH node = nodes %][% node.value.name %], [%- END -%] +EOF +} elsif($type eq 'atom'){ return <<'EOF'; -[% ###### DOCUMENT START ###### %] +[% # DOCUMENT START # %] + +########AutoAtom.pm######## +[% FOREACH node = nodes %] +use [% node.value.name %]; +[% END %] +1; [% FOREACH node = nodes %] [% IF !node.value.is_trivial_link %] -############################################## +########[% node.value.name | replace('Turnkey::Model::', '') %].pm######## package Turnkey::Atom::[% node.value.name FILTER replace "Turnkey::Model::", "" %]; [% pname = node.value.name FILTER replace "Turnkey::Model::", "" %] - use base qw(Turnkey::Atom); use Data::Dumper; @@ -391,8 +461,8 @@ sub _render_record { #data [% FOREACH value = node.value.data_fields %] - [% IF value != 1 %] - $field_hash->{[% value %]} = $dbobject->[% value %](); + [% IF value != 1 %] + $field_hash->{[% value.key %]} = $dbobject->[% value.key %](); [% END %] [% END %] @@ -419,7 +489,7 @@ sub _render_list { #data [% FOREACH value = node.value.data_fields %] [% IF value != 1 %] - $field_hash->{[% value %]} = $object->[% value %](); + $field_hash->{[% value.key %]} = $object->[% value.key %](); [% END %] [% END %] @@ -446,37 +516,43 @@ sub head { EOF } elsif($type eq 'xml'){ - return < - - - - + + + + [% FOREACH node = nodes %] [% IF !node.value.is_trivial_link %] - + [%- END -%] [% END %] + + + + + + [% FOREACH focus_atom = nodes %] [% IF !focus_atom.value.is_trivial_link %] [% FOREACH link_atom = focus_atom.value.hyperedges %] - + [%- END -%] [% previous = "" %] [% FOREACH link_atom = focus_atom.value.edges %] [% IF link_atom.type == 'export' && previous != link_atom.thatnode.table.name && link_atom.thatnode.table.name != "" %] - + [% previous = link_atom.thatnode.table.name %] [% END %] [%- END %] @@ -484,36 +560,54 @@ EOF [% END %] - + [% FOREACH focus_atom = nodes %] [% IF !focus_atom.value.is_trivial_link %] - + [% FOREACH link_atom = focus_atom.value.hyperedges %] - + [%- END%] [% previous = "" %] [% FOREACH link_atom = focus_atom.value.edges %] [% IF link_atom.type == 'export' && previous != link_atom.thatnode.table.name %] - + [% previous = link_atom.thatnode.table.name %] [% END %] [%- END %] - - + + [%- END %] [% END %] - + + + + + + + + + + + + - + + + [% FOREACH focus_atom = nodes %] [% IF !focus_atom.value.is_trivial_link %] - + [%- END -%] [% END %] + + + + + @@ -522,39 +616,48 @@ EOF } elsif($type eq 'template'){ return <<'EOF'; [% TAGS [- -] %] -[% MACRO renderpanel(panel,dbobject) BLOCK %] +[% MACRO renderpanel(panel,name,dbobject) BLOCK %] - - [% FOREACH p = panel.containers %] [% IF p.can_render(panel) %] - [% IF panel.orientation == 'vertical' %] - [% END %] [% END %] [% END %] - -
[% IF p.type == 'Container' %] - [% renderpanel(p,dbobject) %] + [% renderpanel(p,name,dbobject) %] [% ELSE %] - - [% IF p.name %] - - - - - [% END %] -
[% p.name %][% IF panel.type == 'major' %]: [% dbobject.name %][% END %]
+ [% IF p.type == 'major' %] +
+ [% IF name %] +
[% name %]
+ [% END %] - - [% renderatom(p,dbobject) %] -
-
+ + [% renderatom(name,dbobject,p.containers[0]) %] + + +
+ [% ELSIF p.type == 'minor' %] +
+ [% FOREACH atom = p.containers %] +
+ [% IF name %] + [% linkname = ref(p.containers[0]) %] +
[% atom.name | replace('Turnkey::Atom::', '') %]
+ [% END %] + + + [% renderatom(name,dbobject,atom) %] + +
+ [% END %] +
+ [% END %] [% END %] -
+ + [% END %] [% BLOCK make_linked_dbobject %] [% PERL %] @@ -573,8 +676,9 @@ EOF [% END %] [% MACRO obj2url(obj) SWITCH obj %] [% CASE DEFAULT %] - /?id=[% obj %];class=[% ref(obj) %] + /db/[% ref(obj) | replace('.+::','') %]/[% obj %] [% END %] + [% MACRO obj2desc(obj) SWITCH ref(obj) %] [% CASE '' %] [% obj %] @@ -585,65 +689,67 @@ EOF [% obj %] [% END %] [% END %] -[% MACRO renderatom(atom, dbobject) SWITCH atom.name %] +[% MACRO renderatom(name, dbobject, atom) SWITCH name %] [- FOREACH node = nodes -] [- IF !node.value.is_trivial_link -] - [% CASE '[- node.key FILTER ucfirst -]' %] - [% render[- node.key FILTER ucfirst -]Atom(atom,dbobject) %] + [% CASE '[- format_table(node.key) -]' %] + [% INCLUDE [- node.key -].tt2 %] [- END -] [- END -] [% CASE DEFAULT %] [% renderlist(atom.render(dbobject)) %] [% END %] -[- FOREACH node = nodes -] -[- IF !node.value.is_trivial_link -] -[% MACRO render[- node.key FILTER ucfirst -]Atom(atom, dbobject) BLOCK %] - [% lstArr = atom.render(dbobject) %] - [% rowcount = 0 %] - [% IF atom.focus == "yes" %] - [% FOREACH record = lstArr %] - [% fields = record.data %] - [- pname = node.key FILTER ucfirst -] - [- pkey = "Turnkey::Model::${pname}" -] - [- FOREACH field = node.value.data_fields -] - [- IF field != "1" -] - [- field -][% obj2link(fields.[- field -]) %] - [- END -] - [- END -] - [- FOREACH field = node.value.edges -] - [- NEXT IF field.type != 'import' -] - [- field.thisfield.name -][% obj2link(fields.[- field.thisfield.name -]) %] - [- END -] - [% id = record.id %] - [% IF (rowcount > 1) %]
[% END %] - [% rowcount = rowcount + 1 %] - [% END %] - [% ELSE %] -
    - [% FOREACH record = lstArr %] +[% MACRO renderlist(lstArr) BLOCK %] +
    +
      + [% FOREACH item = lstArr %] [% class = ref(atom) | replace('::Atom::', '::Model::') %] - [% id = record.id %] + [% id = item.id %] [% PROCESS make_linked_dbobject %]
    • [% obj2link(linked_dbobject) %]
    • [% END %] -
    - [% END %] +
+ [% END %] -[- END -] -[- END -] -[% MACRO renderlist(lstArr) BLOCK %] -
    - [% FOREACH item = lstArr %] +EOF + +} elsif($type eq 'atomtemplate') { + return <<'EOF'; +[%- TAGS [- -] -%] +[-- IF !node.is_trivial_link --] +[% records = atom.render(dbobject) %] +[% rowcount = 0 %] +[% IF atom.focus == "yes" %] +[% FOREACH record = records %] +[% fields = record.data %] + + [- FOREACH field = node.data_fields -] + [- IF field != "1" -] + + [- END -] + [- END -] + [- FOREACH field = node.edges -] + [- NEXT IF field.type != 'import' -] + + [- END -] + [% IF (rowcount > 1) %] [% END %] + [% rowcount = rowcount + 1 %] +
    [- field.key -][% obj2link(fields.[- field.key -]) %]
    [- field.thisfield.name -][% obj2link(fields.[- field.thisfield.name -]) %]

    +[% END %] +[% ELSE %] +
      + [% FOREACH record = atom.render(dbobject) %] [% class = ref(atom) | replace('::Atom::', '::Model::') %] - [% id = item.id %] + [% id = record.id #needed by make_linked_dbobject macro %] [% PROCESS make_linked_dbobject %]
    • [% obj2link(linked_dbobject) %]
    • [% END %] -
    +
[% END %] +[- END -] EOF -1; - } } + +1;