cvs commit: p5ee/App-Repository/lib/App/Repository DBI.pm

[email protected] (Stephen Adkins)
Newsgroups perl.cvs.p5ee
Message-ID <[email protected]>
cvsuser     04/09/02 14:04:08

  Modified:    App-Repository/lib/App/Repository DBI.pm
  Log:
  primary keys, @{} expressions, contains _ bug, tracing
  
  Revision  Changes    Path
  1.18      +196 -120  p5ee/App-Repository/lib/App/Repository/DBI.pm
  
  Index: DBI.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/App-Repository/lib/App/Repository/DBI.pm,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -w -r1.17 -r1.18
  --- DBI.pm	18 Feb 2004 13:17:40 -0000	1.17
  +++ DBI.pm	2 Sep 2004 21:04:07 -0000	1.18
  @@ -1,13 +1,13 @@
   
   ######################################################################
  -## File: $Id: DBI.pm,v 1.17 2004/02/18 13:17:40 spadkins Exp $
  +## File: $Id: DBI.pm,v 1.18 2004/09/02 21:04:07 spadkins Exp $
   ######################################################################
   
   use App;
   use App::Repository;
   
   package App::Repository::DBI;
  -$VERSION = do { my @r=(q$Revision: 1.17 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r};
  +$VERSION = do { my @r=(q$Revision: 1.18 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r};
   
   @ISA = ( "App::Repository" );
   
  @@ -171,7 +171,7 @@
   =cut
   
   sub _connect {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my $self = shift;
   
       if (!defined $self->{dbh}) {
  @@ -180,13 +180,13 @@
           $self->{dbh} = DBI->connect($dsn, $self->{dbuser}, $self->{dbpass}, $attr);
       }
   
  -    &App::sub_exit(defined $self->{dbh}) if ($App::trace_subs);
  +    &App::sub_exit(defined $self->{dbh}) if ($App::trace);
       return(defined $self->{dbh});
   }
   
   # likely overridden at the subclass level
   sub _dsn {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self) = @_;
       my ($dbidriver, $dbname, $dbuser, $dbpass, $dbschema);
   
  @@ -201,27 +201,27 @@
   
       my $dsn = "dbi:${dbidriver}:database=${dbname}";
   
  -    &App::sub_exit($dsn) if ($App::trace_subs);
  +    &App::sub_exit($dsn) if ($App::trace);
       return($dsn);
   }
   
   # likely overridden at the subclass level
   sub _attr {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my $attr = {
           PrintError         => 0,
           AutoCommit         => 1,
           RaiseError         => 1,
           #ShowErrorStatement => 1,  # this doesn't seem to include the right SQL statement. very confusing.
       };
  -    &App::sub_exit($attr) if ($App::trace_subs);
  +    &App::sub_exit($attr) if ($App::trace);
       return($attr);
   }
   
   sub _dbh {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my $self = shift;
  -    &App::sub_exit($self->{dbh}) if ($App::trace_subs);
  +    &App::sub_exit($self->{dbh}) if ($App::trace);
       return($self->{dbh});
   }
   
  @@ -254,33 +254,33 @@
   =cut
   
   sub _disconnect {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my $self = shift;
       if (defined $self->{dbh} && !($self->{preconnected})) {
           my $dbh = $self->{dbh};
           $dbh->disconnect;
           delete $self->{dbh};
       }
  -    &App::sub_exit(1) if ($App::trace_subs);
  +    &App::sub_exit(1) if ($App::trace);
       1;
   }
   
   sub _disconnect_client_only {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my $self = shift;
       if ($self->{dbh}) {
           $self->{dbh}{InactiveDestroy} = 1;
           delete $self->{dbh};
       }
  -    &App::sub_exit(1) if ($App::trace_subs);
  +    &App::sub_exit(1) if ($App::trace);
       1;
   }
   
   sub _is_connected {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my $self = shift;
       my $retval = ((defined $self->{dbh}) ? 1 : 0);
  -    &App::sub_exit($retval) if ($App::trace_subs);
  +    &App::sub_exit($retval) if ($App::trace);
       return ($retval);
   }
   
  @@ -297,7 +297,7 @@
   ######################################################################
   
   sub _init2 {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my $self = shift;
       my ($name);
   
  @@ -316,11 +316,11 @@
               }
           }
       }
  -    &App::sub_exit() if ($App::trace_subs);
  +    &App::sub_exit() if ($App::trace);
   }
   
   sub _get_row {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $params, $cols, $options) = @_;
   
       # we only need the first row
  @@ -355,12 +355,12 @@
           print "\n";
       }
   
  -    &App::sub_exit($row) if ($App::trace_subs);
  +    &App::sub_exit($row) if ($App::trace);
       return($row);
   }
   
   sub _get_rows {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $params, $cols, $options) = @_;
   
       my ($sql, $dbh, $rows, $startrow, $endrow);
  @@ -395,13 +395,13 @@
           print "\n";
       }
   
  -    &App::sub_exit($rows) if ($App::trace_subs);
  +    &App::sub_exit($rows) if ($App::trace);
       return($rows);
   }
   
   # modified from the DBD::_::db::selectall_arrayref in DBI.pm
   sub _selectrange_arrayref {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $stmt, $startrow, $endrow, $attr, @bind) = @_;
       my $dbh = $self->{dbh};
       return [] if (!$dbh);
  @@ -417,18 +417,18 @@
               }
           }
           my $retval = $self->_fetchrange_arrayref($sth, $startrow, $endrow, $slice);
  -        &App::sub_exit($retval) if ($App::trace_subs);
  +        &App::sub_exit($retval) if ($App::trace);
           return($retval);
       }
       else {
  -        &App::sub_exit() if ($App::trace_subs);
  +        &App::sub_exit() if ($App::trace);
           return();
       }
   }
   
   # modified from the DBD::_::st::fetchall_arrayref in DBI.pm
   sub _fetchrange_arrayref {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $sth, $startrow, $endrow, $slice) = @_;
       $slice = [] if (! defined $slice);
       $startrow = 0 if (!defined $startrow);
  @@ -485,7 +485,7 @@
           }
       }
       else { Carp::croak("fetchall_arrayref($mode) invalid") }
  -    &App::sub_exit(\@rows) if ($App::trace_subs);
  +    &App::sub_exit(\@rows) if ($App::trace);
       return \@rows;
   }
   
  @@ -494,7 +494,7 @@
   ######################################################################
   
   sub _mk_where_clause {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $params, $options) = @_;
       my ($where, $column, $param, $value, $colnum, $repop, $sqlop, $column_def, $quoted);
       my ($tabledef, $tabcols, %sqlop, $alias, $dbexpr);
  @@ -567,7 +567,14 @@
               else {
                   $value = $params->{$param};
   
  -                if ($value =~ s/^!expr!//) {
  +                if (ref($value) eq "ARRAY") {
  +                    $value = join(",", @$value);
  +                }
  +
  +                if ($value =~ s/^@\{(.*)\}$/$1/) {  # new @{} expressions replace !expr!
  +                    $quoted = 0;
  +                }
  +                elsif ($value =~ s/^!expr!//) { # deprecated (ugh!)
                       $quoted = 0;
                   }
                   elsif ($value =~ /,/ && ! $tabledef->{param}{$param}{no_auto_in_param}) {
  @@ -582,8 +589,10 @@
                       $value = "'%$value%'";
                   }
                   elsif ($repop eq "matches") {
  -                    $value =~ s/\*/%/g;
  +                    $value =~ s/_/\\_/g;
                       $value =~ s/'/\\'/g;
  +                    $value =~ s/\*/%/g;
  +                    $value =~ s/\?/_/g;
                       $value = "'$value'";
                   }
                   elsif ($sqlop eq "in" || $sqlop eq "=") {
  @@ -622,12 +631,12 @@
               }
           }
       }
  -    &App::sub_exit($where) if ($App::trace_subs);
  +    &App::sub_exit($where) if ($App::trace);
       $where;
   }
   
   sub _mk_select_sql {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $params, $cols, $options) = @_;
       $self->_load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
   
  @@ -646,6 +655,15 @@
       if (defined $order_by && $#$order_by > -1) {
           for ($colnum = 0; $colnum <= $#$order_by; $colnum++) {
               $col = $order_by->[$colnum];
  +            if ($col =~ /^(.+)\.asc$/) {
  +                $col = $1;
  +                $dir = " asc";
  +            }
  +            elsif ($col =~ /^(.+)\.desc$/) {
  +                $col = $1;
  +                $dir = " desc";
  +            }
  +            else {
               $dir = "";
               if ($direction && ref($direction) eq "HASH" && defined $direction->{$col}) {
                   if ($direction->{$col} =~ /^asc$/i) {
  @@ -655,6 +673,7 @@
                       $dir = " desc";
                   }
               }
  +            }
               $sql .= ($colnum == 0) ? "order by\n   $col$dir" : ",\n   $col$dir";
           }
           $sql .= "\n";
  @@ -662,12 +681,12 @@
       my $suffix = $self->_mk_select_sql_suffix($table, $options);
       $sql .= $suffix if ($suffix);
       
  -    &App::sub_exit($sql) if ($App::trace_subs);
  +    &App::sub_exit($sql) if ($App::trace);
       return($sql);
   }
   
   sub _mk_select_joined_sql {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $params, $cols, $options) = @_;
       $self->_load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
   
  @@ -888,9 +907,19 @@
       ############################################################
       my (@order_by_dbexpr, $order_by_dbexpr);
       if (defined $order_by && ref($order_by) eq "ARRAY") {
  +        my ($dir);
   
           for ($idx = 0; $idx <= $#$order_by; $idx++) {
               $column = $order_by->[$idx];
  +            $dir = "";
  +            if ($column =~ /^(.+)\.asc$/) {
  +                $column = $1;
  +                $dir = " asc";
  +            }
  +            elsif ($column =~ /^(.+)\.desc$/) {
  +                $column = $1;
  +                $dir = " desc";
  +            }
               $column_def = $table_def->{column}{$column};
               next if (!defined $column_def);
   
  @@ -907,6 +936,10 @@
               }
   
               if ($order_by_dbexpr) {
  +                if ($dir) {
  +                    $order_by_dbexpr .= $dir;
  +                }
  +                else {
                   if ($direction && ref($direction) eq "HASH" && defined $direction->{$column}) {
                       if ($direction->{$column} =~ /^asc$/i) {
                           $order_by_dbexpr .= " asc";
  @@ -915,6 +948,7 @@
                           $order_by_dbexpr .= " desc";
                       }
                   }
  +                }
                   push(@order_by_dbexpr, $order_by_dbexpr);
               }
           }
  @@ -1004,9 +1038,19 @@
               next if (defined $table_def->{param}{$param}{all_value} &&
                        $paramvalue eq $table_def->{param}{$param}{all_value});
   
  -            if ($paramvalue =~ s/^!expr!//) {
  +            if (ref($paramvalue) eq "ARRAY") {
  +                $paramvalue = join(",", @$paramvalue);
  +            }
  +
  +            if ($paramvalue =~ s/^@\{(.*)\}$/$1/) {  # new @{} expressions replace !expr!
  +                $quoted = 0;
  +            }
  +            elsif ($paramvalue =~ s/^!expr!//) { # deprecated (ugh!)
                   $quoted = 0;
               }
  +            elsif ($paramvalue =~ /,/ && ! $table_def->{param}{$param}{no_auto_in_param}) {
  +                $quoted = (defined $column_def->{quoted}) ? ($column_def->{quoted}) : ($paramvalue !~ /^-?[0-9.,]+$/);
  +            }
               else {
                   $quoted = (defined $column_def->{quoted}) ? ($column_def->{quoted}) : ($paramvalue !~ /^-?[0-9.]+$/);
               }
  @@ -1016,8 +1060,10 @@
                   $paramvalue = "'%$paramvalue%'";
               }
               elsif ($repop eq "matches") {
  -                $paramvalue =~ s/\*/%/g;
  +                $paramvalue =~ s/_/\\_/g;
                   $paramvalue =~ s/'/\\'/g;
  +                $paramvalue =~ s/\*/%/g;
  +                $paramvalue =~ s/\?/_/g;
                   $paramvalue = "'$paramvalue'";
               }
               elsif ($sqlop eq "in" || $sqlop eq "=") {
  @@ -1201,19 +1247,19 @@
       ############################################################
       # return the SQL statement
       ############################################################
  -    &App::sub_exit($sql) if ($App::trace_subs);
  +    &App::sub_exit($sql) if ($App::trace);
       return($sql);
   }
   
   sub _mk_select_sql_suffix {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $options) = @_;
  -    &App::sub_exit("") if ($App::trace_subs);
  +    &App::sub_exit("") if ($App::trace);
       return("");
   }
   
   sub _require_tables {
  -    &App::sub_entry if ($App::trace_subs >= 3);
  +    &App::sub_entry if ($App::trace >= 3);
       my ($self, $dbexpr, $reqd_tables, $tablealiashref, $require_type) = @_;
       #print "_require_tables($dbexpr,...,...,$require_type)\n";
       my ($tablealias, $tablealias2, @tablealias, %tableseen, $dependencies);
  @@ -1236,12 +1282,12 @@
               }
           }
       }
  -    &App::sub_exit() if ($App::trace_subs >= 3);
  +    &App::sub_exit() if ($App::trace >= 3);
   }
   
   # $insert_sql = $rep->_mk_insert_row_sql ($table, \@cols, \@row);
   sub _mk_insert_row_sql {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $cols, $row) = @_;
       $self->_load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
       my ($sql, $values, $col, $value, $colnum, $quoted);
  @@ -1282,13 +1328,13 @@
       $sql .= ")\n";
       $values .= ")\n";
       $sql .= $values;
  -    &App::sub_exit($sql) if ($App::trace_subs);
  +    &App::sub_exit($sql) if ($App::trace);
       $sql;
   }
   
   # $insert_sql = $rep->_mk_insert_sql ($table, \@cols, \@row, \%options);
   sub _mk_insert_sql {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $cols, $row, $options) = @_;
       $self->_load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
   
  @@ -1329,7 +1375,7 @@
           }
       }
       my $sql = "insert into $table\n  (" . join(",\n   ",@$cols) . ")\nvalues\n  (" . join(@values) . ")\n";
  -    &App::sub_exit($sql) if ($App::trace_subs);
  +    &App::sub_exit($sql) if ($App::trace);
       $sql;
   }
   
  @@ -1339,7 +1385,7 @@
   # $update_sql = $rep->_mk_update_sql($table, $key,        \@cols, \@row, \%options);
   # $update_sql = $rep->_mk_update_sql($table, undef,       \@cols, \@row, \%options);
   sub _mk_update_sql {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $params, $cols, $row, $options) = @_;
       die "Database->_mk_update_sql(): no columns specified" if (!$cols || $#$cols == -1);
   
  @@ -1458,7 +1504,7 @@
       }
   
       my $sql = "update $table set\n   " . join(",\n   ",@set) . "\n" . $where;
  -    &App::sub_exit($sql) if ($App::trace_subs);
  +    &App::sub_exit($sql) if ($App::trace);
       $sql;
   }
   
  @@ -1470,7 +1516,7 @@
   # $delete_sql = $rep->_mk_delete_sql($table, $key,        undef,  undef, \%options);
   # $delete_sql = $rep->_mk_delete_sql($table, undef,       \@cols, \@row, \%options);
   sub _mk_delete_sql {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $params, $cols, $row, $options) = @_;
   
       $self->_load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
  @@ -1562,13 +1608,13 @@
       }
   
       my $sql = "delete from $table\n$where";
  -    &App::sub_exit($sql) if ($App::trace_subs);
  +    &App::sub_exit($sql) if ($App::trace);
       $sql;
   }
   
   # $delete_sql = $rep->_mk_delete_row_sql ($table, \@cols, \@row, \@keycolidx);
   sub _mk_delete_row_sql {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $cols, $row, $keycolidx) = @_;
       $self->_load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
       my ($sql, $where, @colused, $col, $value, $colnum, $i, $nonkeycolnum, $quoted);
  @@ -1609,20 +1655,20 @@
       }
   
       $sql .= $where;
  -    &App::sub_exit($sql) if ($App::trace_subs);
  +    &App::sub_exit($sql) if ($App::trace);
       $sql;
   }
   
   # $delete_sql = $rep->_mk_delete_rows_sql($table, \@params, \%paramvalues);
   sub _mk_delete_rows_sql {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $params, $paramvalues) = @_;
       $self->_load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
       my ($sql, $col, $colnum);
   
       $sql = "delete from $table\n";
       $sql .= $self->_mk_where_clause($table, $params);
  -    &App::sub_exit($sql) if ($App::trace_subs);
  +    &App::sub_exit($sql) if ($App::trace);
       $sql;
   }
   
  @@ -1636,7 +1682,7 @@
   # unfortunately, it doesn't work yet
   
   sub _select_row {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $cols, $params, $paramvalues) = @_;
       my ($dbh, $sql, $param, @params, %paramvalues, @paramvalues);
   
  @@ -1662,10 +1708,10 @@
   
       my $rows = $self->_selectrange_arrayref($sql, 1, 1, undef, @paramvalues);
       if (!$rows || $#$rows == -1) {
  -        &App::sub_exit([]) if ($App::trace_subs);
  +        &App::sub_exit([]) if ($App::trace);
           return [];
       }
  -    &App::sub_exit($rows->[0]) if ($App::trace_subs);
  +    &App::sub_exit($rows->[0]) if ($App::trace);
       return ($rows->[0]);
   }
   
  @@ -1681,7 +1727,7 @@
   # unfortunately, it doesn't work yet
   
   sub _select_rows {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $cols, $params, $paramvalues, $order_by, $startrow, $endrow,
           $sortdircol, $keycolidx, $writeable, $columntype, $summarykeys) = @_;
       my ($sql, $param, @params, %paramvalues, @paramvalues);
  @@ -1708,13 +1754,13 @@
       }
       $self->{sql} = $sql;
       my $retval = $self->_selectrange_arrayref($sql, $startrow, $endrow, undef, @paramvalues);
  -    &App::sub_exit($retval) if ($App::trace_subs);
  +    &App::sub_exit($retval) if ($App::trace);
       $retval;
   }
   
   # $ok = $rep->_insert_row ($table, \@cols, \@row);
   sub _insert_row {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $cols, $row) = @_;
       $self->{error} = "";
       my $sql = $self->_mk_insert_row_sql($table, $cols);
  @@ -1724,7 +1770,7 @@
   
       my $debug_sql = $self->{context}{options}{debug_sql};
       if ($debug_sql) {
  -        print "DEBUG_SQL: _insert_row()\n";
  +        print "DEBUG_SQL: insert()\n";
           print "DEBUG_SQL: bind vars [", join("|",map { defined $_ ? $_ : "undef" } @$row), "]\n";
           print $sql;
       }
  @@ -1734,13 +1780,13 @@
           print "\n";
       }
   
  -    &App::sub_exit($retval) if ($App::trace_subs);
  +    &App::sub_exit($retval) if ($App::trace);
       $retval;
   }
   
   # $ok = $rep->_insert_rows ($table, \@cols, \@rows);
   sub _insert_rows {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $cols, $rows) = @_;
       $self->{error} = "";
       my ($row, $sql, $nrows, $ok, $retval);
  @@ -1773,12 +1819,12 @@
       }
       $self->{sql} = $sql;
       $self->{numrows} = $nrows;
  -    &App::sub_exit($ok) if ($App::trace_subs);
  +    &App::sub_exit($ok) if ($App::trace);
       return($ok);
   }
   
   sub _delete {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $params, $cols, $row, $options) = @_;
       $self->{error} = "";
       my $sql = $self->_mk_delete_sql($table, $params, $cols, $row, $options);
  @@ -1795,7 +1841,7 @@
           print "\n";
       }
   
  -    &App::sub_exit($retval) if ($App::trace_subs);
  +    &App::sub_exit($retval) if ($App::trace);
       return($retval);
   }
   
  @@ -1805,7 +1851,7 @@
   # $nrows = $rep->_update($table, $key,        \@cols, \@row, \%options);
   # $nrows = $rep->_update($table, undef,       \@cols, \@row, \%options);
   sub _update {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table, $params, $cols, $row, $options) = @_;
       $self->{error} = "";
       my $sql = $self->_mk_update_sql($table, $params, $cols, $row, $options);
  @@ -1822,13 +1868,13 @@
           print "\n";
       }
   
  -    &App::sub_exit($retval) if ($App::trace_subs);
  +    &App::sub_exit($retval) if ($App::trace);
       return($retval);
   }
   
   # $ok = $rep->_delete_row ($table, \@cols, \@row, \@keycolidx);
   sub _delete_row {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my $self = shift;
       $self->{error} = "";
       my $sql = $self->_mk_delete_row_sql(@_);
  @@ -1847,13 +1893,13 @@
           print "\n";
       }
   
  -    &App::sub_exit($retval) if ($App::trace_subs);
  +    &App::sub_exit($retval) if ($App::trace);
       $retval;
   }
   
   # $ok = $rep->_delete_rows($table, \@params, \%paramvalues);
   sub _delete_rows {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my $self = shift;
       $self->{error} = "";
       my $sql = $self->_mk_delete_rows_sql(@_);
  @@ -1872,7 +1918,7 @@
           print "\n";
       }
   
  -    &App::sub_exit($retval) if ($App::trace_subs);
  +    &App::sub_exit($retval) if ($App::trace);
       $retval;
   }
   
  @@ -1883,7 +1929,7 @@
   use DBIx::Compat;
   
   sub _load_rep_metadata_from_source {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self) = @_;
   
       my ($dbidriver, $dbh);
  @@ -2072,11 +2118,11 @@
       $self->{native}{need_null_in_create}    = DBIx::Compat::GetItem($dbidriver, "NeedNullInCreate");
       $self->{native}{empty_is_null}          = DBIx::Compat::GetItem($dbidriver, "EmptyIsNull");
   
  -    &App::sub_exit() if ($App::trace_subs);
  +    &App::sub_exit() if ($App::trace);
   }
   
   sub _load_table_metadata_from_source {
  -    &App::sub_entry if ($App::trace_subs);
  +    &App::sub_entry if ($App::trace);
       my ($self, $table) = @_;
   
       return if (! $table);
  @@ -2113,11 +2159,14 @@
       # COLUMN DATA
       #########################################################
       my ($colnum, $data_types, $columns, $column_def, $phys_columns);
  -    my ($native_type_num, $native_type_def);
  +    my ($native_type_num, $native_type_def, $phys_table);
   
       $func = DBIx::Compat::GetItem($dbidriver, "ListFields");
  +    eval {
       $sth  = &{$func}($dbh, $table);
  -
  +    };
  +    if (!$@) {
  +        $table_def->{phys_table} = $table;
       $phys_columns = $sth->{NAME};    # array of fieldnames
       $data_types   = $sth->{TYPE};    # array of fieldtypes
   
  @@ -2156,6 +2205,15 @@
                   if (!defined $column_def->{dbexpr});
           }
       }
  +    }
  +
  +    ######################################################################
  +    # primary key
  +    ######################################################################
  +
  +    if (!$self->{primary_key} || !$self->{alternate_key}) {
  +        $self->_load_table_key_metadata($table);
  +    }
   
       ######################################################################
       # tables that are related via tablealiases can be "import"-ed
  @@ -2212,7 +2270,25 @@
       #    $d->Indent(1);
       #    print $d->Dump();
       #}
  -    &App::sub_exit() if ($App::trace_subs);
  +    &App::sub_exit() if ($App::trace);
  +}
  +
  +sub _load_table_key_metadata {
  +    &App::sub_entry if ($App::trace);
  +    my ($self, $table) = @_;
  +
  +    return if (! $table);
  +    my $table_def = $self->{table}{$table};
  +    return if (! $table_def);
  +    my $dbh = $self->{dbh};
  +
  +    # if not defined at all, try to get it from the database
  +    if (! defined $table_def->{primary_key}) {
  +        eval {
  +            $table_def->{primary_key} = [ $dbh->primary_key($self->{dbcatalog}, $self->{dbschema}, $table) ];
  +        };
  +    }
  +    &App::sub_exit() if ($App::trace);
   }
   
   1;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.