Catalog
view release on metacpan or search on metacpan
lib/Catalog/db/mysql.pm view on Meta::CPAN
next if(!exists($row->{$field}));
#
# Extract info
#
my($desc) = $info->{$field};
my($dict) = $desc->{'dict'};
my($map_table) = $dict->{'map'};
my($map_field_dict) = $dict->{'map_field_dict'};
my($map_field_table) = $dict->{'map_field_table'};
#
# Delete existing records
#
$self->mdelete($map_table, "$map_field_table = $primary");
#
# Create new records
#
if(defined($row->{$field}) && $row->{$field} !~ /^\s*$/) {
my(@rowids) = split(',', $row->{$field});
my($rowid);
foreach $rowid (@rowids) {
$self->insert($map_table,
$map_field_dict => $rowid,
$map_field_table => $primary);
}
}
}
}
sub mdelete {
my($self, $table, $where) = @_;
my($info) = $self->info_table($table);
my($primary_values);
if(exists($info->{'_set_dict_'}) || defined($self->{'hook'})) {
my($primary_key) = $info->{'_primary_'};
my($rows) = $self->exec_select("select $primary_key from $table where $where");
@$primary_values = map { $_->{$primary_key} } @$rows;
my($primary_value);
foreach $primary_value (@$primary_values) {
$self->dict_update($table, undef, $primary_value);
}
}
if(defined($self->{'hook'})) {
my($hook) = $self->{'hook'};
$hook->hook_delete($table, $primary_values);
}
my($base) = $self->connect();
my($sql) = "delete from $table where $where";
dbg($sql, "mysql");
my($stmt) = $base->prepare("$sql");
error("cannot prepare $sql : " . $base->errstr()) if(!defined($stmt));
$stmt->execute() or error("cannot execute $sql: " . $base->errstr());
$stmt->finish();
}
sub update {
my($self, $table, $where, %values) = @_;
if(defined($where) && $where ne '') {
$where = " where $where ";
}
my($info) = $self->info_table($table);
my(%dict);
my($set) = join(", ", map {
#
# Remove external dict with multiple values and memorize for
# later update.
#
my($increment) = $_ =~ /^\+=\s+(.*)$/o;
if(!$increment &&
$info->{$_}->{'type'} eq 'set' &&
exists($info->{$_}->{'dict'})) {
$dict{$_} = $values{$_};
();
} else {
if($increment) {
"$1 = $1 $values{$_}";
} else {
$values{$_} =~ s/\\/\\\\/go;
$values{$_} =~ s/\'/\'\'/go;
$values{$_} =~ s/\000/\\0/go;
"$_ = '$values{$_}'";
}
}
} sort(keys(%values)));
if($::opt_fake) {
my($sql) = "update $table set $set $where";
dbg($sql, "normal");
return 1;
}
#
# Update the dictionaries before data changes so that the $where clause
# is still valid.
#
my($primary_values);
if(keys(%dict) || defined($self->{'hook'})) {
my($primary_key) = $info->{'_primary_'};
my($rows) = $self->exec_select("select $primary_key from $table $where");
@$primary_values = map { $_->{$primary_key} } @$rows;
my($primary_value);
foreach $primary_value (@$primary_values) {
$self->dict_update($table, \%dict, $primary_value);
}
}
my($ret) = 0;
if($set !~ /^\s*$/o) {
my($sql) = "update $table set $set $where";
dbg($sql, "mysql");
my($base) = $self->connect();
my($stmt) = $base->prepare("$sql") or error("cannot prepare $sql : " . $base->errstr());
my $affected = $stmt->execute() or error("cannot execute $sql: " . $base->errstr());
#
# Return 1 if update occured at least on a row, even
( run in 1.270 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )