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, [EMAIL PROTECTED], [EMAIL PROTECTED]);
 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, [EMAIL PROTECTED], [EMAIL 
PROTECTED]);
+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, [EMAIL PROTECTED], [EMAIL 
PROTECTED], \%options);
 # i.e. $options->{replace}
 sub _mk_insert_rows_sql {

Reply via email to