X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator%2FProducer%2FTurnkey.pm;h=2bcf7830c33c9d027d8af0d3022394c4310655ce;hb=82cedef0e6878ce7be2d2515eb042e5deeb1b226;hp=07974a8c0084ef52114aeaa8a8d37d5d4ffc7930;hpb=a0249514ef761312c5ea2eca66802265afba8c77;p=dbsrgits%2FSQL-Translator.git diff --git a/lib/SQL/Translator/Producer/Turnkey.pm b/lib/SQL/Translator/Producer/Turnkey.pm index 07974a8..2bcf783 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.10 2003-12-28 12:14:59 boconnor Exp $ +# $Id: Turnkey.pm,v 1.42 2004-04-16 09:46:51 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.10 $ =~ /(\d+)\.(\d+)/; +$VERSION = sprintf "%d.%02d", q$Revision: 1.42 $ =~ /(\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 = ( @@ -41,7 +41,7 @@ my %producer2dsn = ( # ------------------------------------------------------------------- sub produce { - my $log = Log::Log4perl->get_logger('sql.translator'); + my $log = Log::Log4perl->get_logger('SQL.Translator.Producer.Turnkey'); my $t = shift; my $create = undef; @@ -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; @@ -111,7 +116,7 @@ sub produce { elsif($hyperedge->count_thisnode == 1 and $hyperedge->count_thatnode > 1){ $hyperedge->type('one2many') } elsif($hyperedge->count_thisnode > 1 and $hyperedge->count_thatnode > 1){ $hyperedge->type('many2many') } -#warn join "\n", sort keys %::SQL::Translator::Schema::Graph::HyperEdge::; + $log->debug($_) foreach sort keys %::SQL::Translator::Schema::Graph::HyperEdge::; #node_to won't always be defined b/c of multiple edges to a single other node if(defined($node_to)){ @@ -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; - -#print "Node Data:\n"; -#print 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 @@ -199,9 +216,6 @@ sub template { if($type eq 'dbi'){ return <[% 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 +256,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,65 +285,76 @@ 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' %] + [% 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 %] + [% 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 %] + [% 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 %] [% 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 %] package [% baseclass %]; @@ -337,9 +362,12 @@ package [% baseclass %]; # Template used: classdbi use strict; +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 => [% "\@\_" %] ) } + [% FOREACH node = nodes %] [% printPackage(node.value) %] @@ -354,14 +382,13 @@ elsif($type eq 'atom'){ [% ###### DOCUMENT START ###### %] [% FOREACH node = nodes %] -[% IF node.value.compoundedges %] +[% IF !node.value.is_trivial_link %] ############################################## package Turnkey::Atom::[% node.value.name FILTER replace "Turnkey::Model::", "" %]; [% pname = node.value.name FILTER replace "Turnkey::Model::", "" %] -[% pkey = "Turnkey::Model::${pname}" %] use base qw(Turnkey::Atom); use Data::Dumper; @@ -373,9 +400,11 @@ sub can_render { sub render { my $self = shift; my $dbobject = shift; - # Assumption here that if it's not rendering on it's own dbobject - # then it's a list. This will be updated when AtomLists are implemented -boconnor + + # Assumption here that if it's not rendering on it's own dbobject + # then it's a list. This will be updated when AtomLists are implemented -boconnor if(ref($dbobject) eq 'Turnkey::Model::[% pname %]') { + $self->focus('yes'); return(_render_record($dbobject)); } else { return(_render_list($dbobject)); } @@ -386,11 +415,20 @@ sub _render_record { my @output = (); my $row = {}; my $field_hash = {}; + + #data [% FOREACH value = node.value.data_fields %] [% IF value != 1 %] - $field_hash->{[% value %]} = $dbobject->[% value %](); - [% END %] - [% END %] + $field_hash->{[% value.key %]} = $dbobject->[% value.key %](); + [% END %] + [% END %] + + #keys + [% FOREACH value = node.value.edges %] + [% NEXT IF value.type != 'import' %] + $field_hash->{[% value.thisfield.name %]} = $dbobject->[% value.thisfield.name %](); + [% END %] + $row->{data} = $field_hash; $row->{id} = $dbobject->id(); push @output, $row; @@ -401,19 +439,27 @@ sub _render_list { my $dbobject = shift; my @output = (); my @objects = $dbobject->[% node.key %]s; - foreach my $object (@objects) - { + foreach my $object (@objects){ my $row = {}; - my $field_hash = {}; - [% FOREACH value = node.value.data_fields %] - [% IF value != 1 %] - $field_hash->{[% value %]} = $object->[% value %](); - [% END %] - [% END %] + my $field_hash = {}; + + #data + [% FOREACH value = node.value.data_fields %] + [% IF value != 1 %] + $field_hash->{[% value.key %]} = $object->[% value.key %](); + [% END %] + [% END %] + + #keys + [% FOREACH value = node.value.edges %] + [% NEXT IF value.type != 'import' %] + $field_hash->{[% value.thisfield.name %]} = $object->[% value.thisfield.name %](); + [% END %] + $row->{data} = $field_hash; - $row->{id} = $object->id(); - push @output, $row; - } + $row->{id} = $object->id(); + push @output, $row; + } return(\@output); } @@ -429,123 +475,208 @@ EOF } elsif($type eq 'xml'){ return < - - + + - - - - + + + + -[% FOREACH node = linkable %] - +[% FOREACH node = nodes %] +[% IF !node.value.is_trivial_link %] + [%- END -%] +[% END %] -[% FOREACH focus_atom = linkable %] - [% FOREACH link_atom = focus_atom.value %] - +[% 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 %] [%- END -%] +[% END %] - -[% FOREACH focus_atom = linkable %] - - [% FOREACH link_atom = focus_atom.value %] - - [%- 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 %] + + [% previous = link_atom.thatnode.table.name %] + [% END %] + [%- END %] + + + [%- END %] +[% END %] + - + -[% FOREACH focus_atom = linkable %] - +[% FOREACH focus_atom = nodes %] +[% IF !focus_atom.value.is_trivial_link %] + [%- END -%] - +[% END %] - + 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(name,dbobject,p.containers[0]) %] +
+
+
+ [% ELSIF p.type == 'minor' %] +
+
+ [% IF name %] + [% linkname = ref(p.containers[0]) %] +
[% linkname | replace('Turnkey::Atom::', '') %]
+ [% END %] - [% renderatom(p,dbobject) %] + [% renderatom(name,dbobject,p.containers[0]) %]
-
+ + [% END %] [% END %] -
+ + +[% END %] +[% BLOCK make_linked_dbobject %] + [% PERL %] + $stash->set(linked_dbobject => [% class %]->retrieve([% id %])); + [% END %] +[% END %] +[% MACRO obj2link(obj) SWITCH ref(obj) %] + [% CASE '' %] + [% obj %] + [% CASE DEFAULT %] + [% IF obj.name %] + [% obj.name %] + [% ELSE %] + [% obj %] + [% END %] [% END %] -[% MACRO renderatom(atom, dbobject) SWITCH atom.name %] - [- FOREACH node = linkable -] - [% CASE '[- node.key FILTER ucfirst -]' %] - [% render[- node.key FILTER ucfirst -]Atom(atom.render(dbobject)) %] +[% MACRO obj2url(obj) SWITCH obj %] + [% CASE DEFAULT %] + /[% ref(obj) | replace('.+::','') %]/[% obj %] +[% END %] +[% MACRO obj2desc(obj) SWITCH ref(obj) %] + [% CASE '' %] + [% obj %] + [% CASE DEFAULT %] + [% IF obj.value %] + [% obj.value %] + [% ELSE %] + [% obj %] + [% END %] +[% END %] +[% MACRO renderatom(name, dbobject, atom) SWITCH name %] + [- FOREACH node = nodes -] + [- IF !node.value.is_trivial_link -] + [% CASE '[- format_table(node.key) -]' %] + [% INCLUDE [- node.key -].tt2 %] + [- END -] [- END -] [% CASE DEFAULT %] [% renderlist(atom.render(dbobject)) %] [% END %] -[- FOREACH node = linkable -] -[% MACRO render[- node.key FILTER ucfirst -]Atom(lstArr) BLOCK %] - [% FOREACH record = lstArr %] - [% fields = record.data %] - [- pname = node.key FILTER ucfirst -] - [- pkey = "Durian::Model::${pname}" -] - [- FOREACH field = nodes.$pkey.columns_essential -] - [- field -][% fields.[- field -] %] - [- END -] - [% id = record.id %] - Link - [% END %] -[% END %] -[- END -] [% MACRO renderlist(lstArr) BLOCK %] - [% FOREACH item = lstArr %] - [% item %] +
    + [% FOREACH item = lstArr %] + [% class = ref(atom) | replace('::Atom::', '::Model::') %] + [% id = item.id %] + [% PROCESS make_linked_dbobject %] +
  • [% obj2link(linked_dbobject) %]
  • [% END %] +
[% END %] EOF -1; +} 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 -][% obj2link(fields.[- field -]) %]
[- field.thisfield.name -][% obj2link(fields.[- field.thisfield.name -]) %]

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