You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ph...@apache.org on 2011/04/01 20:24:55 UTC
svn commit: r1087838 - in /subversion/trunk/subversion/libsvn_wc: adm_ops.c
wc-queries.sql wc_db.c wc_db.h
Author: philip
Date: Fri Apr 1 18:24:55 2011
New Revision: 1087838
URL: http://svn.apache.org/viewvc?rev=1087838&view=rev
Log:
Make the new revert code notify for all reverted paths. Use the term
list rather than cache for the temporary table.
* subversion/libsvn_wc/adm_ops.c
(revert_restore): Use renamed function, call extra notification function,
add iteration pool for recursion.
(new_revert_internal): Call extra notification function.
* subversion/libsvn_wc/wc-queries.sql
(STMT_CREATE_REVERT_CACHE): Rename to...
(STMT_CREATE_REVERT_LIST): ...this, rename triggers.
(STMT_DROP_REVERT_CACHE_TRIGGERS): Rename to...
(STMT_DROP_REVERT_LIST_TRIGGERS): this, rename triggers, drop trailing
semi-colon.
(STMT_SELECT_REVERT_CACHE): Rename to...
(STMT_SELECT_REVERT_LIST): ...this.
(STMT_SELECT_REVERT_CACHE_RECURSIVE): Delete.
(STMT_DELETE_REVERT_LIST, STMT_SELECT_REVERT_LIST_RECURSIVE,
STMT_DELETE_REVERT_LIST_RECURSIVE): New.
* subversion/libsvn_wc/wc_db.h
(svn_wc__db_op_revert): Tweak comment.
(svn_wc__db_reverted): Renamed to...
(svn_wc__db_revert_list_read): ...this.
(svn_wc__db_revert_list_notify): New.
* subversion/libsvn_wc/wc_db.c
(svn_wc__db_op_revert): Use renamed queries.
(struct revert_list_read_baton_t): New.
(revert_list_read): New, guts from svn_wc__db_reverted, use renamed
queries, delete row.
(svn_wc__db_reverted): Renamed to...
(svn_wc__db_revert_list_read): ...this, calls revert_list_read in a txn.
(svn_wc__db_revert_list_notify): New.
Modified:
subversion/trunk/subversion/libsvn_wc/adm_ops.c
subversion/trunk/subversion/libsvn_wc/wc-queries.sql
subversion/trunk/subversion/libsvn_wc/wc_db.c
subversion/trunk/subversion/libsvn_wc/wc_db.h
Modified: subversion/trunk/subversion/libsvn_wc/adm_ops.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/adm_ops.c?rev=1087838&r1=1087837&r2=1087838&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/adm_ops.c (original)
+++ subversion/trunk/subversion/libsvn_wc/adm_ops.c Fri Apr 1 18:24:55 2011
@@ -1385,10 +1385,11 @@ revert_restore(svn_wc__db_t *db,
if (cancel_func)
SVN_ERR(cancel_func(cancel_baton));
- SVN_ERR(svn_wc__db_reverted(¬ify_required,
- &conflict_old, &conflict_new, &conflict_working,
- &prop_reject,
- db, local_abspath, scratch_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_revert_list_read(¬ify_required,
+ &conflict_old, &conflict_new,
+ &conflict_working, &prop_reject,
+ db, local_abspath,
+ scratch_pool, scratch_pool));
err = svn_wc__db_read_info(&status, &kind,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -1407,6 +1408,10 @@ revert_restore(svn_wc__db_t *db,
scratch_pool),
scratch_pool);
+ if (notify_func)
+ SVN_ERR(svn_wc__db_revert_list_notify(notify_func, notify_baton,
+ db, local_abspath, scratch_pool));
+
return SVN_NO_ERROR;
}
else if (err)
@@ -1529,28 +1534,39 @@ revert_restore(svn_wc__db_t *db,
if (depth == svn_depth_infinity && kind == svn_wc__db_kind_dir)
{
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
const apr_array_header_t *children;
int i;
SVN_ERR(svn_wc__db_read_children_of_working_node(&children, db,
local_abspath,
scratch_pool,
- scratch_pool));
+ iterpool));
for (i = 0; i < children->nelts; ++i)
{
- const char *child_abspath
- = svn_dirent_join(local_abspath,
- APR_ARRAY_IDX(children, i, const char *),
- scratch_pool);
+ const char *child_abspath;
+
+ svn_pool_clear(iterpool);
+
+ child_abspath = svn_dirent_join(local_abspath,
+ APR_ARRAY_IDX(children, i,
+ const char *),
+ iterpool);
SVN_ERR(revert_restore(db, revert_root, child_abspath, depth,
use_commit_times, changelist_hash,
cancel_func, cancel_baton,
notify_func, notify_baton,
- scratch_pool));
+ iterpool));
}
+
+ svn_pool_destroy(iterpool);
}
+ if (notify_func)
+ SVN_ERR(svn_wc__db_revert_list_notify(notify_func, notify_baton,
+ db, local_abspath, scratch_pool));
+
return SVN_NO_ERROR;
}
@@ -1576,6 +1592,10 @@ new_revert_internal(svn_wc__db_t *db,
notify_func, notify_baton,
scratch_pool));
+ if (notify_func)
+ SVN_ERR(svn_wc__db_revert_list_notify(notify_func, notify_baton,
+ db, local_abspath, scratch_pool));
+
return SVN_NO_ERROR;
}
#endif
Modified: subversion/trunk/subversion/libsvn_wc/wc-queries.sql
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc-queries.sql?rev=1087838&r1=1087837&r2=1087838&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Fri Apr 1 18:24:55 2011
@@ -909,10 +909,9 @@ CREATE UNIQUE INDEX temp__node_props_cac
SELECT local_relpath, kind, properties FROM temp__node_props_cache
ORDER BY local_relpath
-/* Perhaps revert log would be a better term? */
--- STMT_CREATE_REVERT_CACHE
-DROP TABLE IF EXISTS revert_cache;
-CREATE TEMPORARY TABLE revert_cache (
+-- STMT_CREATE_REVERT_LIST
+DROP TABLE IF EXISTS revert_list;
+CREATE TEMPORARY TABLE revert_list (
local_relpath TEXT PRIMARY KEY,
conflict_old TEXT,
conflict_new TEXT,
@@ -920,18 +919,19 @@ CREATE TEMPORARY TABLE revert_cache (
prop_reject TEXT,
notify INTEGER
);
-DROP TRIGGER IF EXISTS trigger_revert_cache_nodes;
-CREATE TEMPORARY TRIGGER trigger_revert_cache_nodes
+CREATE UNIQUE INDEX revert_list_index ON revert_list(local_relpath);
+DROP TRIGGER IF EXISTS trigger_revert_list_nodes;
+CREATE TEMPORARY TRIGGER trigger_revert_list_nodes
BEFORE DELETE ON nodes
BEGIN
- INSERT OR REPLACE INTO revert_cache(local_relpath, notify)
+ INSERT OR REPLACE INTO revert_list(local_relpath, notify)
SELECT OLD.local_relpath, 1;
END;
-DROP TRIGGER IF EXISTS trigger_revert_cache_actual;
-CREATE TEMPORARY TRIGGER trigger_revert_cache_actual_delete
+DROP TRIGGER IF EXISTS trigger_revert_list_actual_delete;
+CREATE TEMPORARY TRIGGER trigger_revert_list_actual_delete
BEFORE DELETE ON actual_node
BEGIN
- INSERT OR REPLACE INTO revert_cache(local_relpath, conflict_old,
+ INSERT OR REPLACE INTO revert_list(local_relpath, conflict_old,
conflict_new, conflict_working,
prop_reject, notify)
SELECT OLD.local_relpath,
@@ -939,11 +939,11 @@ BEGIN
OLD.prop_reject,
CASE WHEN OLD.properties IS NOT NULL THEN 1 ELSE NULL END;
END;
-DROP TRIGGER IF EXISTS trigger_revert_cache_update;
-CREATE TEMPORARY TRIGGER trigger_revert_cache_actual_update
+DROP TRIGGER IF EXISTS trigger_revert_list_actual_update;
+CREATE TEMPORARY TRIGGER trigger_revert_list_actual_update
BEFORE UPDATE ON actual_node
BEGIN
- INSERT OR REPLACE INTO revert_cache(local_relpath, conflict_old,
+ INSERT OR REPLACE INTO revert_list(local_relpath, conflict_old,
conflict_new, conflict_working,
prop_reject, notify)
SELECT OLD.local_relpath,
@@ -952,20 +952,28 @@ BEGIN
CASE WHEN OLD.properties IS NOT NULL THEN 1 ELSE NULL END;
END
--- STMT_DROP_REVERT_CACHE_TRIGGERS
-DROP TRIGGER IF EXISTS trigger_revert_cache_nodes;
-DROP TRIGGER IF EXISTS trigger_revert_cache_actual_delete;
-DROP TRIGGER IF EXISTS trigger_revert_cache_actual_update;
+-- STMT_DROP_REVERT_LIST_TRIGGERS
+DROP TRIGGER IF EXISTS trigger_revert_list_nodes;
+DROP TRIGGER IF EXISTS trigger_revert_list_actual_delete;
+DROP TRIGGER IF EXISTS trigger_revert_list_actual_update
--- STMT_SELECT_REVERT_CACHE
+-- STMT_SELECT_REVERT_LIST
SELECT conflict_old, conflict_new, conflict_working, prop_reject, notify
-FROM revert_cache
+FROM revert_list
WHERE local_relpath = ?1
--- STMT_SELECT_REVERT_CACHE_RECURSIVE
-SELECT local_relpath, conflict_old, conflict_new, conflict_working, prop_reject
-FROM revert_cache
-WHERE local_relpath LIKE ?1 ESCAPE '#' ORDER BY local_relpath
+-- STMT_DELETE_REVERT_LIST
+DELETE FROM revert_list WHERE local_relpath = ?1
+
+-- STMT_SELECT_REVERT_LIST_RECURSIVE
+SELECT local_relpath, notify
+FROM revert_list
+WHERE local_relpath = ?1 or local_relpath LIKE ?2 ESCAPE '#'
+ORDER BY local_relpath
+
+-- STMT_DELETE_REVERT_LIST_RECURSIVE
+DELETE FROM revert_list
+WHERE local_relpath = ?1 OR local_relpath LIKE ?2 ESCAPE '#'
/* ------------------------------------------------------------------------- */
Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=1087838&r1=1087837&r2=1087838&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Fri Apr 1 18:24:55 2011
@@ -3708,35 +3708,107 @@ svn_wc__db_op_revert(svn_wc__db_t *db,
/* We MUST remove the triggers and not leave them to affect subsequent
operations. */
- err = svn_sqlite__exec_statements(wcroot->sdb, STMT_CREATE_REVERT_CACHE);
+ err = svn_sqlite__exec_statements(wcroot->sdb, STMT_CREATE_REVERT_LIST);
if (err)
return svn_error_compose_create(err,
svn_sqlite__exec_statements(wcroot->sdb,
- STMT_DROP_REVERT_CACHE_TRIGGERS));
+ STMT_DROP_REVERT_LIST_TRIGGERS));
err = svn_wc__db_with_txn(wcroot, local_relpath, txn_func, NULL,
scratch_pool);
err = svn_error_compose_create(err,
svn_sqlite__exec_statements(wcroot->sdb,
- STMT_DROP_REVERT_CACHE_TRIGGERS));
+ STMT_DROP_REVERT_LIST_TRIGGERS));
return err;
}
+struct revert_list_read_baton {
+ svn_boolean_t *reverted;
+ const char **conflict_old;
+ const char **conflict_new;
+ const char **conflict_working;
+ const char **prop_reject;
+ apr_pool_t *result_pool;
+};
+
+static svn_error_t *
+revert_list_read(void *baton,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_pool_t *scratch_pool)
+{
+ struct revert_list_read_baton *b = baton;
+ svn_sqlite__stmt_t *stmt;
+ svn_boolean_t have_row;
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_REVERT_LIST));
+ SVN_ERR(svn_sqlite__bindf(stmt, "s", local_relpath));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ if (have_row)
+ {
+ *(b->reverted) = !svn_sqlite__column_is_null(stmt, 4);
+ *(b->conflict_new) = svn_sqlite__column_text(stmt, 0, b->result_pool);
+ *(b->conflict_old) = svn_sqlite__column_text(stmt, 1, b->result_pool);
+ *(b->conflict_working) = svn_sqlite__column_text(stmt, 2, b->result_pool);
+ *(b->prop_reject) = svn_sqlite__column_text(stmt, 3, b->result_pool);
+ }
+ else
+ {
+ *(b->reverted) = FALSE;
+ *(b->conflict_new) = *(b->conflict_old) = *(b->conflict_working) = NULL;
+ *(b->prop_reject) = NULL;
+ }
+ SVN_ERR(svn_sqlite__reset(stmt));
+
+ if (have_row)
+ {
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_DELETE_REVERT_LIST));
+ SVN_ERR(svn_sqlite__bindf(stmt, "s", local_relpath));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ }
+
+ return SVN_NO_ERROR;
+}
+
svn_error_t *
-svn_wc__db_reverted(svn_boolean_t *reverted,
- const char **conflict_old,
- const char **conflict_new,
- const char **conflict_working,
- const char **prop_reject,
- svn_wc__db_t *db,
- const char *local_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
+svn_wc__db_revert_list_read(svn_boolean_t *reverted,
+ const char **conflict_old,
+ const char **conflict_new,
+ const char **conflict_working,
+ const char **prop_reject,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_wc__db_wcroot_t *wcroot;
const char *local_relpath;
+ struct revert_list_read_baton b = {reverted, conflict_old, conflict_new,
+ conflict_working, prop_reject,
+ result_pool};
+
+ SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath,
+ db, local_abspath, scratch_pool, scratch_pool));
+ VERIFY_USABLE_WCROOT(wcroot);
+
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, revert_list_read, &b,
+ scratch_pool));
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_wc__db_revert_list_notify(svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *scratch_pool)
+{
+ svn_wc__db_wcroot_t *wcroot;
+ const char *local_relpath, *like_arg;
svn_sqlite__stmt_t *stmt;
svn_boolean_t have_row;
@@ -3744,25 +3816,39 @@ svn_wc__db_reverted(svn_boolean_t *rever
db, local_abspath, scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
+ like_arg = construct_like_arg(local_relpath, scratch_pool);
+
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_REVERT_CACHE));
- SVN_ERR(svn_sqlite__bindf(stmt, "s", local_relpath));
+ STMT_SELECT_REVERT_LIST_RECURSIVE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "ss", local_relpath, like_arg));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
- if (have_row)
- {
- *reverted = !svn_sqlite__column_is_null(stmt, 4);
- *conflict_new = svn_sqlite__column_text(stmt, 0, result_pool);
- *conflict_old = svn_sqlite__column_text(stmt, 1, result_pool);
- *conflict_working = svn_sqlite__column_text(stmt, 2, result_pool);
- *prop_reject = svn_sqlite__column_text(stmt, 3, result_pool);
- }
- else
+ if (!have_row)
+ return svn_error_return(svn_sqlite__reset(stmt)); /* optimise for no row */
+ while (have_row)
{
- *reverted = FALSE;
- *conflict_new = *conflict_old = *conflict_working = *prop_reject = NULL;
+ const char *notify_relpath = svn_sqlite__column_text(stmt, 0, NULL);
+
+ if (svn_sqlite__column_int64(stmt, 1))
+ {
+ const char *notify_abspath = svn_dirent_join(wcroot->abspath,
+ notify_relpath,
+ scratch_pool);
+ notify_func(notify_baton,
+ svn_wc_create_notify(notify_abspath, svn_wc_notify_revert,
+ scratch_pool),
+ scratch_pool);
+
+ /* ### Need cancel_func? */
+ }
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
}
SVN_ERR(svn_sqlite__reset(stmt));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_DELETE_REVERT_LIST_RECURSIVE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "ss", local_relpath, like_arg));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+
return SVN_NO_ERROR;
}
@@ -3811,7 +3897,6 @@ read_all_tree_conflicts(apr_hash_t **tre
SVN_ERR(svn_sqlite__step(&have_row, stmt));
}
-
SVN_ERR(svn_sqlite__reset(stmt));
svn_pool_destroy(iterpool);
Modified: subversion/trunk/subversion/libsvn_wc/wc_db.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.h?rev=1087838&r1=1087837&r2=1087838&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.h (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.h Fri Apr 1 18:24:55 2011
@@ -1248,10 +1248,8 @@ svn_wc__db_op_revert_actual(svn_wc__db_t
*
* At present only depth=empty and depth=infinity are supported.
*
- * This function populates the revert cache that can be queried to
+ * This function populates the revert list that can be queried to
* determine what was reverted.
- *
- * ### Need a way to drop the cache.
*/
svn_error_t *
svn_wc__db_op_revert(svn_wc__db_t *db,
@@ -1260,21 +1258,37 @@ svn_wc__db_op_revert(svn_wc__db_t *db,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-/* Query the revert cache for LOCAL_ABSPATH and set *REVERTED if the
+/* Query the revert list for LOCAL_ABSPATH and set *REVERTED if the
* path was reverted. Set *CONFLICT_OLD, *CONFLICT_NEW,
* *CONFLICT_WORKING and *PROP_REJECT to the names of the conflict
* files, or NULL if the names are not stored.
+ *
+ * Removes the row for LOCAL_ABSPATH from the revert list.
*/
svn_error_t *
-svn_wc__db_reverted(svn_boolean_t *reverted,
- const char **conflict_old,
- const char **conflict_new,
- const char **conflict_working,
- const char **prop_reject,
- svn_wc__db_t *db,
- const char *local_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
+svn_wc__db_revert_list_read(svn_boolean_t *reverted,
+ const char **conflict_old,
+ const char **conflict_new,
+ const char **conflict_working,
+ const char **prop_reject,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Make revert notifications for all paths in the revert list that are
+ * equal to LOCAL_ABSPATH or below LOCAL_ABSPATH.
+ *
+ * Removes all the corresponding rows from the revert list.
+ *
+ * ### Pass in cancel_func?
+ */
+svn_error_t *
+svn_wc__db_revert_list_notify(svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
+ svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *scratch_pool);
/* Return a hash @a *tree_conflicts of all the children of @a