[interchange-cvs] interchange - heins modified lib/Vend/Data.pm
interchange-core@icdevgroup.org
interchange-core@icdevgroup.org
Fri Dec 13 16:36:00 2002
User: heins
Date: 2002-12-13 21:35:29 GMT
Modified: lib/Vend Data.pm
Log:
A number of minor changes to Vend::Data.
* Allow a database to spring into existence without a .txt file. TO
do this, you define the field names in the NAME paramter.
Database will_be_there will_be_there.txt __SQLDSN__
Database will_be_there NAME code field1 field2
Database will_be_there CREATE_EMPTY_TXT 1
All it does is create the .txt file (or whatever the name is) from
the value of NAME array. It does take delimiters into account.
You must be just a bit careful, since if you then remove the .txt
file it will of course recreate the table. Of course you should
take that into account when setting this non-default parameter. 8-)
This will allow some one-file configurations to be added to the
system -- I guess it would be nice if you could define a default
import, too. (TODO?)
* Allow autonumber for the linked-table behavior of update_data. Before,
you couldn't autonumber because the determination of whether the data
would be set was whether the key value is present. This allows
you to set mv_data_qual=fieldname and have a non-empty value in
that field determine whether to insert or not.
* Minor cleanup, including ensuring $obj->{DELIMITER} and $obj->{delimiter}
match. I would remove one, but am too afraid of interaction with
old configs.
Revision Changes Path
2.20 +36 -11 interchange/lib/Vend/Data.pm
rev 2.20, prev_rev 2.19
Index: Data.pm
===================================================================
RCS file: /var/cvs/interchange/lib/Vend/Data.pm,v
retrieving revision 2.19
retrieving revision 2.20
diff -u -r2.19 -r2.20
--- Data.pm 10 Dec 2002 20:09:43 -0000 2.19
+++ Data.pm 13 Dec 2002 21:35:29 -0000 2.20
@@ -1,6 +1,6 @@
# Vend::Data - Interchange databases
#
-# $Id: Data.pm,v 2.19 2002/12/10 20:09:43 jon Exp $
+# $Id: Data.pm,v 2.20 2002/12/13 21:35:29 mheins Exp $
#
# Copyright (C) 1996-2002 Red Hat, Inc. <interchange@redhat.com>
#
@@ -297,11 +297,11 @@
}
else {
$options->{field_names} = \@columns;
- $options->{'delimiter'} = $delimiter;
+ $options->{delimiter} = $options->{DELIMITER} = $delimiter;
}
- if($options->{'file'}) {
- $fn = $options->{'file'};
+ if($options->{file}) {
+ $fn = $options->{file};
if( $Global::NoAbsolute) {
die "No absolute file names like '$fn' allowed.\n"
if Vend::Util::file_name_is_absolute($fn);
@@ -790,6 +790,23 @@
my $tried_import;
+sub create_empty_txt {
+ my ($obj, $database_txt, $delimiter, $record_delim) = @_;
+ return if -f $database_txt;
+ return unless $obj->{CREATE_EMPTY_TXT};
+ if(! ref($obj->{NAME}) eq 'ARRAY') {
+ logError("Cannot create text file with no database NAME parameter");
+ }
+ else {
+ $delimiter ||= "\t";
+ $record_delim ||= "\n";
+ my $line = join $obj->{DELIMITER}, @{$obj->{NAME}};
+ $line .= $record_delim;
+ Vend::Util::writefile($database_txt, $line);
+ }
+ return;
+}
+
sub import_database {
my ($obj, $dummy) = @_;
@@ -905,7 +922,7 @@
if (
$Vend::Cfg->{NoImportExternal}
or -f $database_dbm
- or ! -f $database_txt
+ or (! $obj->{CREATE_EMPTY_TXT} and ! -f $database_txt)
)
{
$no_import = 1;
@@ -944,7 +961,6 @@
($dbm_time = file_modification_time($database_dbm))
)
{
-
warn "Importing $obj->{'name'} table from $database_txt\n"
unless $Vend::Quiet;
@@ -955,12 +971,16 @@
($delimiter, $record_delim) = auto_delimiter($database_txt);
}
- $obj->{'delimiter'} = $obj->{'DELIMITER'} = $delimiter;
+ $obj->{delimiter} = $obj->{DELIMITER} = $delimiter;
my $save = $/;
local($/) = $record_delim if defined $record_delim;
+ if($obj->{CREATE_EMPTY_TXT}) {
+ create_empty_txt($obj, $database_txt, $delimiter, $record_delim);
+ }
+
if($obj->{MIRROR}) {
$db = Vend::Table::Common::import_from_ic_db(
$database_txt,
@@ -1214,7 +1234,8 @@
}
my ($delim, $record_delim) = find_delimiter($type || $db->config('type'));
- $delim or ($delim, $record_delim) = find_delimiter($db->config('delimiter'));
+ $delim or ($delim, $record_delim) = find_delimiter($db->config('DELIMITER'));
+ $delim or ($delim, $record_delim) = find_delimiter('TAB');
$file = $file || $db->config('file');
my $dir = $db->config('DIR');
@@ -2002,6 +2023,7 @@
}
my $autonumber;
+#::logDebug("function=$function auto_number=" . $base_db->config('_Auto_number'));
if ($CGI::values{mv_data_auto_number}) {
$autonumber = 1;
my $ref = $data{$prikey};
@@ -2016,7 +2038,7 @@
elsif($function eq 'insert' and $base_db->config('_Auto_number') ) {
$autonumber = 1;
}
-
+#::logDebug("autonumber=$autonumber");
if(@file_fields) {
my $Tag = new Vend::Tags;
@@ -2168,6 +2190,7 @@
}
my @multis;
+ my $multiqual = $CGI::values{mv_data_multiple_qual} || $prikey;
if($CGI::values{mv_data_multiple}) {
my $re = qr/^\d+_$prikey$/;
@multis = grep $_ =~ $re, @cgi_keys;
@@ -2214,7 +2237,7 @@
else {
my $field;
$key = $data{$prikey}->[$i];
- if(! length($key) and $autonumber) {
+ if(! length($key) and ! $autonumber) {
## KEY IS possibly SET HERE
$key = $base_db->set_row($key);
}
@@ -2285,6 +2308,7 @@
}
for(keys %$qd) {
+#::logDebug("update_data: Getting ready to set_slice");
$qret = $qd->{$_}->set_slice($key, $qf->{$_}, $qv->{$_});
$rows_set[$i] = $qret unless $rows_set[$i];
}
@@ -2306,7 +2330,7 @@
}
if(my $new = shift(@multis)) {
#::logDebug("Doing multi for $new");
- last SETDATA unless length $CGI::values{"${new}_$prikey"};
+ last SETDATA unless length $CGI::values{"${new}_$multiqual"};
for(@fields) {
my $value = $CGI::values{$_} = $CGI::values{"${new}_$_"};
$data{$_} = [ $value ];
@@ -2365,6 +2389,7 @@
}
@CGI::values{keys %cgiset} = values %cgiset;
+#::logDebug("Reloading, function=$CGI::values{mv_data_function}");
update_data();
}