[Date Prev][Date Next][Thread Prev][Thread Next][Minivend by date
][Minivend by thread
]
Re: [mv] New Interchange preview release 4.5.5 -- auto-increment problems
****** message to minivend-users from Stefan Hornburg <racke@linuxia.de> ******
Mike Heins <mikeh@minivend.com> writes:
[...]
> >
> > > -- Improved auto-numbering support.
> >
> > Has this to do with the auto-increment fields of MySQL?
>
> No. Currently, you cannot set an autonumbered field via the UI.
> release. There might be some handling of this in the next release,
> though. I am looking at alternatives; it is a complex issue if we
> hope to handle it at all portably.
I made the following hack for auto_increment (against IC 4.5.5):
(DBI.pm):
# returns subroutine which updates/inserts a data record
# on insertion we don't need a key if the AUTO_INCREMENT
# configuration option for this database set
sub row_settor {
my ($s, @columns) = @_;
my ($i, $haskey, @quote);
for ($i = 0; $i < @columns; $i++) {
$haskey = 1 if $columns[$i] eq $s->[$KEY];
push @quote, $i
unless $s->[$CONFIG]{NUMERIC}{$columns[$i]};
}
return sub {
my(@values, @parts) = @_;
my $query;
my $update;
if ($haskey) {
# key is one of the columns check if record already exists
$update = $s->record_exists($values[0]) ? 1 : 0;
} elsif (! $s->[$CONFIG]{AUTO_INCREMENT}) {
::logError('DBI insertion without key value and AUTO_INCREMENT set');
return undef;
}
for(@quote) {
$values[$_] = $s->[$DBI]->quote($values[$_]);
}
my $key = $values[0];
if($update) {
for (@columns) {
push (@parts, " $_ = " . shift(@values));
}
$query = "update $s->[$TABLE] set "
. join (', ', @parts)
. " where $s->[$KEY] = $key";
}
else {
$query = "insert into $s->[$TABLE] (" .
join (",\n", @columns) .
") VALUES (" .
join (",\n", @values) .
")"
;
}
my $sth = $s->[$DBI]->prepare($query);
if(!$sth) {
::logError("DBI prepare row_settor for table=$s->[$TABLE]: $DBI::errstr");
return undef;
}
my $rc = $sth->execute();
if(! defined $rc) {
::logError("DBI execute row_settor for table=$s->[$TABLE]: $DBI::errstr (query: $query)");
return undef;
}
return $rc;
};
}
minivend.PL:
if ($function eq 'insert' && $ref->{type} == 8
&& $db->config('AUTO_INCREMENT')) {
# special insertion case => key not needed
my (@k, @v);
for(keys %data) {
next if $_ eq $prikey && length($data{$_}->[0]) == 0;
next unless (length($value = $data{$_}->[0]) || $CGI::values{mv_update_empty});
push(@k, $_);
# LEGACY
HTML::Entities::decode($value) if $decode;
# END LEGACY
if(defined $CGI::values{"mv_data_filter_$_"}) {
$value = Vend::Interpolate::filter_value(
$CGI::values{"mv_data_filter_$_"},
$value,
0
);
}
push(@v, $value);
}
my $func = $db->row_settor(@k);
return &$func(@v);
}
if (not defined $data{$prikey}) {
....
Ciao
Racke
--
LinuXia Systems && Cobolt NetServices, eCommerce and more
Shop- und Datenbanklösungen mit MiniVend, Firewalls auf Debian-Basis
http://www.linuxia.de - http://www.cobolt.net
--> Coding from hell and back <---
-
To unsubscribe from the list, DO NOT REPLY to this message. Instead, send
email with 'UNSUBSCRIBE minivend-users' in the body to Majordomo@minivend.com.
Archive of past messages: http://www.minivend.com/minivend/minivend-list