[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();
 	}