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 )