[svn:p5ee] r9661 - p5ee/trunk/App-Repository/lib/App/Repository

[email protected]
Newsgroups perl.cvs.p5ee
Message-ID <[email protected]>
Author: spadkins
Date: Mon Jun 18 08:27:37 2007
New Revision: 9661

Modified:
   p5ee/trunk/App-Repository/lib/App/Repository/DBI.pm
   p5ee/trunk/App-Repository/lib/App/Repository/MySQL.pm

Log:
handle update on duplicate in _insert_row

Modified: p5ee/trunk/App-Repository/lib/App/Repository/DBI.pm
==============================================================================
--- p5ee/trunk/App-Repository/lib/App/Repository/DBI.pm	(original)
+++ p5ee/trunk/App-Repository/lib/App/Repository/DBI.pm	Mon Jun 18 08:27:37 2007
@@ -2161,9 +2161,9 @@
 # $ok = $rep->_insert_row($table, \@cols, \@row);
 sub _insert_row {
     &App::sub_entry if ($App::trace);
-    my ($self, $table, $cols, $row) = @_;
+    my ($self, $table, $cols, $row, $options) = @_;
     $self->{error} = "";
-    my $sql = $self->_mk_insert_row_sql($table, $cols);
+    my $sql = $self->_mk_insert_row_sql($table, $cols, undef, $options);
     $self->{sql} = $sql;
     my $dbh = $self->{dbh};
     my $retval = 0;

Modified: p5ee/trunk/App-Repository/lib/App/Repository/MySQL.pm
==============================================================================
--- p5ee/trunk/App-Repository/lib/App/Repository/MySQL.pm	(original)
+++ p5ee/trunk/App-Repository/lib/App/Repository/MySQL.pm	Mon Jun 18 08:27:37 2007
@@ -124,6 +124,74 @@
     return($suffix);
 }
 
+# $insert_sql = $rep->_mk_insert_row_sql ($table, \@cols, \@row);
+sub _mk_insert_row_sql {
+    &App::sub_entry if ($App::trace);
+    my ($self, $table, $cols, $row, $options) = @_;
+
+    $self->_load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
+    my $dbh = $self->{dbh};
+
+    my ($sql, $values, $col, $value, $colnum, $quoted);
+    #print "_mk_insert_row_sql($table,\n   [",
+    #    join(",",@$cols), "],\n   [",
+    #    join(",",@$row), "])\n";
+
+    if ($#$cols == -1) {
+        $self->{error} = "Database->_mk_insert_row_sql(): no columns specified";
+        return();
+    }
+    my $tabcols = $self->{table}{$table}{column};
+    my $insert = $options->{replace} ? "replace" : "insert";
+
+    $sql = "$insert into $table\n";
+    $values = "values\n";
+    for ($colnum = 0; $colnum <= $#$cols; $colnum++) {
+        $col = $cols->[$colnum];
+        if (!defined $row || $#$row == -1) {
+            $value = "?";
+        }
+        else {
+            $value = $row->[$colnum];
+            if (!defined $value) {
+                $value = "NULL";
+            }
+            else {
+                $quoted = (defined $tabcols->{$col}{quoted}) ? ($tabcols->{$col}{quoted}) : ($value !~ /^-?[0-9.]+$/);
+                if ($quoted) {
+                    $value = $dbh->quote($value);
+                }
+            }
+        }
+        $sql .= ($colnum == 0) ? "  ($col" : ",\n   $col";
+        if ($tabcols->{$col}{dbexpr_update}) {
+            $value = sprintf($tabcols->{$col}{dbexpr_update}, $value);
+        }
+        $values .= ($colnum == 0) ? "  ($value" : ",\n   $value";
+    }
+    $sql .= ")\n";
+    $values .= ")\n";
+    $sql .= $values;
+
+    if (!$options->{replace} && $options->{update}) {
+        my $update = $options->{update};
+        $sql .= "on duplicate key update";
+        my $first_update_column = 1;
+        for ($colnum = 0; $colnum <= $#$cols; $colnum++) {
+            $col = $cols->[$colnum];
+            if (!ref($update) || $update->{$col}) {
+                $sql .= "," if (!$first_update_column);
+                $first_update_column = 0;
+                $sql .= "\n   $col = values($col)";
+            }
+        }
+        $sql .= "\n";
+    }
+
+    &App::sub_exit($sql) if ($App::trace);
+    $sql;
+}
+
 # $insert_sql = $rep->_mk_insert_rows_sql ($table, \@cols, \@rows, \%options);
 # i.e. $options->{replace}
 sub _mk_insert_rows_sql {
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.