You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2011/04/18 19:43:25 UTC
svn commit: r1094672 - in /subversion/trunk/subversion/libsvn_wc:
wc-queries.sql wc_db.c
Author: rhuijben
Date: Mon Apr 18 17:43:24 2011
New Revision: 1094672
URL: http://svn.apache.org/viewvc?rev=1094672&view=rev
Log:
Only use the expensive STMT_DELETE_SHADOWED_RECURSIVE query when we know that
we have to remove lower layers.
* subversion/libsvn_wc/wc-queries.sql
(STMT_DELETE_ALL_LAYERS): New query.
* subversion/libsvn_wc/wc_db.c
(commit_node): When STMT_DELETE_ALL_LAYERS affects more then 1 row, we have
a shadowing operation. Only then use STMT_DELETE_ALL_LAYERS.
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=1094672&r1=1094671&r2=1094672&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Mon Apr 18 17:43:24 2011
@@ -453,6 +453,10 @@ WHERE wc_id = ?1 AND local_relpath = ?2
DELETE FROM nodes
WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth > 0
+-- STMT_DELETE_ALL_LAYERS
+DELETE FROM nodes
+WHERE wc_id = ?1 AND local_relpath = ?2
+
-- STMT_DELETE_NODES
DELETE FROM nodes
WHERE wc_id = ?1 AND local_relpath = ?2
Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=1094672&r1=1094671&r2=1094672&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Mon Apr 18 17:43:24 2011
@@ -6884,31 +6884,41 @@ commit_node(void *baton,
if (op_depth > 0)
{
- /* Do we commit a shadowing operation?
+ int affected_rows;
+
+ /* This removes all layers of this node and at the same time determines
+ if we need to remove shadowed layers below our descendants. */
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_DELETE_ALL_LAYERS));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
+
+ if (affected_rows > 1)
+ {
+ /* We commit a shadowing operation
- If yes then:
1) Remove all shadowed nodes
2) And remove all nodes that have a base-deleted as lowest layer,
because 1) removed that layer
- Possible followup:
- 3) ### Collapse descendants of the current op_depth in layer 0,
- to commit a remote copy in one step (but don't touch/use
- ACTUAL!!)
- */
-
- svn_sqlite__stmt_t *delete_stmt;
+ Possible followup:
+ 3) ### Collapse descendants of the current op_depth in layer 0,
+ to commit a remote copy in one step (but don't touch/use
+ ACTUAL!!)
+ */
- SVN_ERR(svn_sqlite__get_statement(&delete_stmt, wcroot->sdb,
- STMT_DELETE_SHADOWED_RECURSIVE));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_DELETE_SHADOWED_RECURSIVE));
- SVN_ERR(svn_sqlite__bindf(delete_stmt,
- "isi",
- wcroot->wc_id,
- local_relpath,
- op_depth));
+ SVN_ERR(svn_sqlite__bindf(stmt,
+ "isi",
+ wcroot->wc_id,
+ local_relpath,
+ op_depth));
- SVN_ERR(svn_sqlite__step_done(delete_stmt));
+ SVN_ERR(svn_sqlite__step_done(stmt));
+ }
}
/* Update or add the BASE_NODE row with all the new information. */
@@ -6945,17 +6955,6 @@ commit_node(void *baton,
SVN_ERR(svn_sqlite__step_done(stmt));
- if (op_depth > 0)
- {
- /* This removes all op_depth 0 and so does both layers of a
- two-layer replace. */
-
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_DELETE_ALL_WORKING_NODES));
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
- SVN_ERR(svn_sqlite__step_done(stmt));
- }
-
if (have_act)
{
if (cb->keep_changelist && changelist != NULL)