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;