[interchange] * Add ability to have a NO_UPDATE field in SQL tables, which field will

Mike Heins interchange-cvs at icdevgroup.org
Mon May 23 13:03:38 UTC 2016


commit 10c2e8ae294165bfae2e22e482d0437b4d9d96a5
Author: Mike Heins <mike at perusion.com>
Date:   Mon May 23 09:02:51 2016 -0400

    * Add ability to have a NO_UPDATE field in SQL tables, which field will
      not affect a TIMESTAMP field (in MySQL or Postgres, at least).
    
      Intended to allow mod_time in user logins to be updated without
      changing a timestamp field. May have other uses, but is only
      honored at this time in the set_field() method, so has limited
      applicability.
    
      Assuming one has a timestamp field in the userdb table called
      "update_date", this is effected by changing the configuration as:
    
      	Database userdb  TIMESTAMP_FIELD  update_date
      	Database userdb  NO_UPDATE        mod_time

 WHATSNEW-5.11         |   26 +++++++++++++++++
 lib/Vend/Config.pm    |    1 +
 lib/Vend/Table/DBI.pm |   73 ++++++++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 99 insertions(+), 1 deletions(-)
---
diff --git a/WHATSNEW-5.11 b/WHATSNEW-5.11
new file mode 100644
index 0000000..bcd63b9
--- /dev/null
+++ b/WHATSNEW-5.11
@@ -0,0 +1,26 @@
+------------------------------------------------------------------------------
+
+                  What's new in each version of Interchange
+                       (since the version 5.11 branch)
+
+          See UPGRADE document for a list of incompatible changes.
+
+------------------------------------------------------------------------------
+
+
+Database
+--------
+
+* Add ability to have a NO_UPDATE field in SQL tables, which field will
+  not affect a TIMESTAMP field (in MySQL or Postgres, at least).
+
+  Intended to allow mod_time in user logins to be updated without
+  changing a timestamp field. May have other uses, but is only
+  honored at this time in the set_field() method, so has limited
+  applicability.
+
+  Assuming one has a timestamp field in the userdb table called
+  "update_date", this is effected by changing the configuration as:
+
+  	Database userdb  TIMESTAMP_FIELD  update_date
+  	Database userdb  NO_UPDATE        mod_time
diff --git a/lib/Vend/Config.pm b/lib/Vend/Config.pm
index 032f27c..5d29384 100644
--- a/lib/Vend/Config.pm
+++ b/lib/Vend/Config.pm
@@ -4257,6 +4257,7 @@ my %Hash_ref = (  qw!
 							DEFAULT_SESSION       DEFAULT_SESSION
 							FIELD_ALIAS   FIELD_ALIAS
 							NUMERIC       NUMERIC
+							NO_UPDATE     NO_UPDATE
 							PREFER_NULL   PREFER_NULL
 							WRITE_CATALOG WRITE_CATALOG
 					! );
diff --git a/lib/Vend/Table/DBI.pm b/lib/Vend/Table/DBI.pm
index 268b5bc..0223e8d 100644
--- a/lib/Vend/Table/DBI.pm
+++ b/lib/Vend/Table/DBI.pm
@@ -18,6 +18,28 @@
 # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
 # MA  02110-1301  USA.
 
+=head1 NAME
+
+Vend::Table::DBI
+
+=head1 SYNOPSIS
+
+use Vend::Table::Common;
+use Vend::Table::DBI;
+
+=head1 DESCRIPTION
+
+This is the database code that links Interchange to database tables as
+presented by Perl DBI, and which are interfaced by SQL. Some may
+conceivably be non-SQL tables with DBI frontents, but most Interchange
+installations use MySQL or Postgres.
+
+=head1 METHODS
+
+Selected methods used in this module are documented below.
+
+=cut
+
 package Vend::Table::DBI;
 $VERSION = '2.89';
 
@@ -1797,6 +1819,50 @@ sub field {
 	$data;
 }
 
+=over
+
+=item set_field
+
+This method sets a single field with a value, i.e.
+
+	$dbobj->set_field($key,$field,$value)
+
+The primary key for the field is passed as the first parameter, the
+field name as defined in the Interchange table definition is the
+second parameter, and the value to be set is the last value.
+
+If the row does not exist, it will be created. (Note that this
+may fail if there are NOT NULL values without defaults.)
+
+This will essentially perform this pseudo-query:
+
+	UPDATE  $table
+	SET     $field = $value
+	WHERE   $primary_key = $key
+
+If there is a database configuration TIMESTAMP_FIELD, and the column
+is defined as NO_UPDATE, the TIMESTAMP_FIELD will be set to its
+current value to avoid being marked as updated. This changes the
+pseudo_query to be
+
+	UPDATE  $table
+	SET     $timestamp_field = $timestamp_field, $field = $value
+	WHERE   $primary_key = $key
+
+This is most commonly needed in Interchange's userdb definition,
+where it sets the mod_time field and you may not wish to indicate
+the user as having been updated.
+
+	Database userdb TIMESTAMP_FIELD update_date
+	Database userdb NO_UPDATE mod_time
+
+WARNING: There is no update_date field in Interchange's table definition
+in the demo. You would need to add that to make this work.
+
+=back
+
+=cut
+
 sub set_field {
     my ($s, $key, $column, $value) = @_;
 	$s = $s->import_db() if ! defined $s->[$DBI];
@@ -1840,9 +1906,14 @@ sub set_field {
 		}
 	}
 
+	my $extra = '';
+	if( my $f = $s->[$CONFIG]{TIMESTAMP_FIELD} and exists $s->[$CONFIG]{NO_UPDATE}{$column} ) {
+		$extra = "$f = $f, ";
+	}
+
 	my @args;
 	if(!$q) {
-		$q = qq{update $s->[$QTABLE] SET $column = ? where $s->[$QKEY] = ?};
+		$q = qq{update $s->[$QTABLE] SET $extra$column = ? where $s->[$QKEY] = ?};
 		@args = ($value, $key);
 	}
 	else {



More information about the interchange-cvs mailing list