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 {