Keystone-Resolver
view release on metacpan or search on metacpan
lib/Keystone/Resolver/DB/Object.pm view on Meta::CPAN
foreach my $key (keys %maybe_data) {
$data{$key} = $maybe_data{$key}
if $maybe_data{$key} ne "" &&
grep { $_ eq $key } $class->physical_fields();
}
my $table = $class->table();
my $sql = "INSERT INTO " . $db->quote($table) .
" (" . join(", ", map { $db->quote($_) } sort keys %data) . ") VALUES" .
" (" . join(", ", map { sql_quote($data{$_}) } sort keys %data) . ")";
$db->do($sql);
my $id = $db->last_insert_id($table);
die "can't get new record's ID" if !defined $id;
return $db->find1($class, id => $id);
}
sub sql_quote {
my($text) = @_;
my $sq = "'";
$text =~ s/$sq/''/g;
return "'$text'";
}
# Returns a label to be used on-screen for the specified field
sub label {
my $this = shift();
my($field, $label) = @_;
return $label if defined $label;
my $map = $this->field_map();
$label = $map->{$field};
return $label if defined $label;
# No explicit label passed, and none in config: use default rules
$label = $field;
$label =~ s/_/ /g;
return ucfirst($label);
}
# Return the components needed to identify a linked-to object
sub link {
my $this = shift();
my($field) = @_;
my %virtual = $this->virtual_fields();
my $ref = $virtual{$field};
return undef if !defined $ref;
my($linkfield, $linkclass, $linkto) = @$ref;
my $linkid = $this->field($linkfield);
return ($linkclass, $linkto, $linkid, $linkfield);
}
# Returns the number of fields modified, dies on error
sub update {
my $this = shift();
my(%maybe_data) = @_;
my %data;
foreach my $key (keys %maybe_data) {
$data{$key} = $maybe_data{$key}
if (!defined $this->field($key) ||
$maybe_data{$key} ne $this->field($key));
}
return 0 if !%data; # nothing to do
my $sql = "UPDATE " . $this->quote($this->table()) . " SET " .
join(", ", map { $this->quote($_) . " = " . sql_quote($data{$_}) } sort keys %data) .
" WHERE " . $this->quote("id") . " = " . $this->id();
$this->db()->do($sql);
foreach my $key (keys %data) {
$this->field($key, $data{$key});
}
return scalar keys %data;
}
sub delete {
my $this = shift();
my $sql = "DELETE FROM " . $this->quote($this->table()) .
" WHERE " . $this->quote("id") . " = " . $this->id();
$this->db()->do($sql);
# Wow, that embarrasingly easy
}
sub field {
my $this = shift();
my($fieldname, $value) = @_;
die "$this: request for system-function field '$fieldname'"
if grep { $_ eq $fieldname } qw(table fields mandatory_fields
physical_fields
virtual_fields search_fields
sort_fields display_fields
fulldisplay_fields field_map
field);
if (grep { $_ eq $fieldname } $this->physical_fields()) {
$this->{$fieldname} = $value if defined $value;
return $this->{$fieldname};
}
my %virtual;
eval { %virtual = $this->virtual_fields() };
if (!defined $virtual{$fieldname}) {
confess "$this: field `$fieldname' not defined";
} elsif (defined $value) {
die "can't set virtual field '$fieldname'='$value'";
} else {
return $this->virtual_field($fieldname);
( run in 1.344 second using v1.01-cache-2.11-cpan-5735350b133 )