You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2011/04/06 20:57:19 UTC

svn commit: r1089560 - in /subversion/trunk/subversion/libsvn_wc: wc-queries.sql wc_db.c

Author: hwright
Date: Wed Apr  6 18:57:19 2011
New Revision: 1089560

URL: http://svn.apache.org/viewvc?rev=1089560&view=rev
Log:
Use triggers to populate the temporary set-changelist notification table.

* subversion/libsvn_wc/wc-queries.sql
  (STMT_CREATE_CHANGELIST_LIST): Add the needed triggers.

* subversion/libsvn_wc/wc_db.c
  (set_changelist_txn): Don't update the changelist list table manually.
  (svn_wc__db_op_set_changelist): Create and drop the triggers as the
    appropriate time.

Modified:
    subversion/trunk/subversion/libsvn_wc/wc-queries.sql
    subversion/trunk/subversion/libsvn_wc/wc_db.c

Modified: subversion/trunk/subversion/libsvn_wc/wc-queries.sql
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc-queries.sql?rev=1089560&r1=1089559&r2=1089560&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Wed Apr  6 18:57:19 2011
@@ -349,6 +349,53 @@ CREATE TEMPORARY TABLE changelist_list (
   changelist TEXT NOT NULL
   );
 CREATE INDEX changelist_list_index ON changelist_list(wc_id, local_relpath);
+/* We have four cases upon which we wish to notify.  The first is easy:
+
+        Action                                  Notification
+        ------                                  ------------
+        INSERT ACTUAL                           cl-set
+
+   The others are a bit more complex:
+        Action          Old CL      New CL      Notification
+        ------          ------      ------      ------------
+        UPDATE ACTUAL   NULL        NOT NULL    cl-set
+        UPDATE ACTUAL   NOT NULL    NOT NULL    cl-clear / cl-set
+        UPDATE ACTUAL   NOT NULL    NULL        cl-clear
+
+Of the following triggers, the first address the first case, and the second
+two address the last three cases.
+*/
+DROP TRIGGER IF EXISTS   trigger_changelist_list_actual_cl_insert;
+CREATE TEMPORARY TRIGGER trigger_changelist_list_actual_cl_insert
+BEFORE INSERT ON actual_node
+BEGIN
+    /* 26 corresponds to svn_wc_notify_changelist_set */
+    INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist)
+    VALUES (NEW.wc_id, NEW.local_relpath, 26, NEW.changelist);
+END;
+DROP TRIGGER IF EXISTS   trigger_changelist_list_actual_cl_set;
+CREATE TEMPORARY TRIGGER trigger_changelist_list_actual_cl_set
+BEFORE UPDATE ON actual_node
+WHEN NEW.CHANGELIST IS NOT NULL
+BEGIN
+    /* 26 corresponds to svn_wc_notify_changelist_set */
+    INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist)
+    VALUES (NEW.wc_id, NEW.local_relpath, 26, NEW.changelist);
+END;
+DROP TRIGGER IF EXISTS   trigger_changelist_list_actual_cl_clear;
+CREATE TEMPORARY TRIGGER trigger_changelist_list_actual_cl_clear
+BEFORE UPDATE ON actual_node
+WHEN OLD.changelist IS NOT NULL
+BEGIN
+    /* 27 corresponds to svn_wc_notify_changelist_clear */
+    INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist)
+    VALUES (OLD.wc_id, OLD.local_relpath, 27, OLD.changelist);
+END;
+
+-- STMT_DROP_CHANGELIST_LIST_TRIGGERS
+DROP TRIGGER IF EXISTS trigger_changelist_list_actual_cl_insert;
+DROP TRIGGER IF EXISTS trigger_changelist_list_actual_cl_set;
+DROP TRIGGER IF EXISTS trigger_changelist_list_actual_cl_clear;
 
 -- STMT_INSERT_CHANGELIST_LIST
 INSERT INTO changelist_list(wc_id, local_relpath, notify, changelist)

Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=1089560&r1=1089559&r2=1089560&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Wed Apr  6 18:57:19 2011
@@ -3410,29 +3410,6 @@ set_changelist_txn(void *baton,
       SVN_ERR(svn_sqlite__step_done(stmt));
     }
 
-  /* Now, add a row to the CHANGELIST_LIST table, so we can later notify. */
-  /* ### TODO: This could just as well be done with a trigger, but for right
-     ### now, this is quick and dirty. */
-  if (existing_changelist)
-    {
-      SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
-                                        STMT_INSERT_CHANGELIST_LIST));
-      SVN_ERR(svn_sqlite__bindf(stmt, "isis", wcroot->wc_id, local_relpath,
-                                (apr_int64_t)svn_wc_notify_changelist_clear,
-                                existing_changelist));
-      SVN_ERR(svn_sqlite__step_done(stmt));
-    }
-
-  if (new_changelist)
-    {
-      SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
-                                        STMT_INSERT_CHANGELIST_LIST));
-      SVN_ERR(svn_sqlite__bindf(stmt, "isis", wcroot->wc_id, local_relpath,
-                                (apr_int64_t)svn_wc_notify_changelist_set,
-                                new_changelist));
-      SVN_ERR(svn_sqlite__step_done(stmt));
-    }
-
   return SVN_NO_ERROR;
 }
 
@@ -3448,6 +3425,7 @@ svn_wc__db_op_set_changelist(svn_wc__db_
   svn_wc__db_txn_callback_t txn_func;
   svn_wc__db_wcroot_t *wcroot;
   const char *local_relpath;
+  svn_error_t *err;
 
   SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
 
@@ -3466,12 +3444,20 @@ svn_wc__db_op_set_changelist(svn_wc__db_
         NOT_IMPLEMENTED();
     }
 
-  SVN_ERR(svn_sqlite__exec_statements(wcroot->sdb,
-                                      STMT_CREATE_CHANGELIST_LIST));
+  /* We MUST remove the triggers and not leave them to affect subsequent
+     operations. */
+  err = svn_sqlite__exec_statements(wcroot->sdb, STMT_CREATE_CHANGELIST_LIST);
+  if (err)
+    return svn_error_compose_create(err,
+                                    svn_sqlite__exec_statements(wcroot->sdb,
+                                        STMT_DROP_CHANGELIST_LIST_TRIGGERS));
 
   SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, set_changelist_txn,
                               (void *) changelist, scratch_pool));
 
+  SVN_ERR(svn_sqlite__exec_statements(wcroot->sdb,
+                                      STMT_DROP_CHANGELIST_LIST_TRIGGERS));
+
   SVN_ERR(flush_entries(wcroot, local_abspath, scratch_pool));
 
   return SVN_NO_ERROR;