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 2013/02/08 13:39:46 UTC
svn commit: r1443989 - in /subversion/trunk/subversion/libsvn_wc:
wc-queries.sql wc_db.c
Author: rhuijben
Date: Fri Feb 8 12:39:46 2013
New Revision: 1443989
URL: http://svn.apache.org/r1443989
Log:
In the post commit handling: use a smarter sqlite query to avoid a coded
recursion over all descendants in c code.
When I originally wrote this code, we couldn't assume a single-db yet,
but now we can rely on an index-backed sqlite query.
* subversion/libsvn_wc/wc-queries.sql
(STMT_COMMIT_DESCENDANT_TO_BASE): Make query recursive as...
(STMT_COMMIT_DESCENDANTS_TO_BASE): ... this.
* subversion/libsvn_wc/wc_db.c
(moved_descendant_commit): Update comment.
(descendant_commit): Update comment. Replace implementation with smarter
query.
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=1443989&r1=1443988&r2=1443989&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Fri Feb 8 12:39:46 2013
@@ -302,13 +302,22 @@ WHERE wc_id = ?1 AND op_depth = ?3
AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
AND presence = MAP_NOT_PRESENT
--- STMT_COMMIT_DESCENDANT_TO_BASE
-UPDATE NODES SET op_depth = 0, repos_id = ?4, repos_path = ?5, revision = ?6,
- moved_here = NULL, moved_to = NULL, dav_cache = NULL,
- presence = CASE presence WHEN MAP_NORMAL THEN MAP_NORMAL
- WHEN MAP_EXCLUDED THEN MAP_EXCLUDED
- ELSE MAP_NOT_PRESENT END
-WHERE wc_id = ?1 AND local_relpath = ?2 and op_depth = ?3
+-- STMT_COMMIT_DESCENDANTS_TO_BASE
+UPDATE NODES SET op_depth = 0,
+ repos_id = ?4,
+ repos_path = ?5 || SUBSTR(local_relpath, LENGTH(?2)+1),
+ revision = ?6,
+ dav_cache = NULL,
+ moved_here = NULL,
+ moved_to = NULL,
+ presence = CASE presence
+ WHEN MAP_NORMAL THEN MAP_NORMAL
+ WHEN MAP_EXCLUDED THEN MAP_EXCLUDED
+ ELSE MAP_NOT_PRESENT
+ END
+WHERE wc_id = ?1
+ AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2)
+ AND op_depth = ?3
-- STMT_SELECT_NODE_CHILDREN
/* Return all paths that are children of the directory (?1, ?2) in any
Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=1443989&r1=1443988&r2=1443989&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Fri Feb 8 12:39:46 2013
@@ -10035,7 +10035,7 @@ determine_repos_info(apr_int64_t *repos_
/* Helper for svn_wc__db_global_commit()
Makes local_relpath and all its descendants at the same op-depth represent
- the copy origin repos:repos_relpath@revision.
+ the copy origin repos_id:repos_relpath@revision.
This code is only valid to fix-up a move from an old location, to a new
location during a commit.
@@ -10136,52 +10136,42 @@ moved_descendant_commit(svn_wc__db_wcroo
/* Helper for svn_wc__db_global_commit()
- Moves all nodes below PARENT_LOCAL_RELPATH from op-depth OP_DEPTH to
- op-depth 0 (BASE), setting their presence to 'not-present' if their presence
- wasn't 'normal'. */
+ Moves all nodes below LOCAL_RELPATH from op-depth OP_DEPTH to op-depth 0
+ (BASE), setting their presence to 'not-present' if their presence wasn't
+ 'normal'.
+
+ Makes all nodes below LOCAL_RELPATH represent the descendants of repository
+ location repos_id:repos_relpath@revision.
+
+ Assumptions:
+ * local_relpath is not the working copy root (can't be replaced)
+ * repos_relpath is not the repository root (can't be replaced)
+ */
static svn_error_t *
descendant_commit(svn_wc__db_wcroot_t *wcroot,
- const char *parent_local_relpath,
+ const char *local_relpath,
int op_depth,
apr_int64_t repos_id,
- const char *parent_repos_relpath,
+ const char *repos_relpath,
svn_revnum_t revision,
apr_pool_t *scratch_pool)
{
- const apr_array_header_t *children;
- apr_pool_t *iterpool = svn_pool_create(scratch_pool);
svn_sqlite__stmt_t *stmt;
- int i;
-
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_COMMIT_DESCENDANT_TO_BASE));
-
- SVN_ERR(gather_repo_children(&children, wcroot, parent_local_relpath,
- op_depth, scratch_pool, iterpool));
- for (i = 0; i < children->nelts; i++)
- {
- const char *local_relpath;
- const char *repos_relpath;
- const char *name = APR_ARRAY_IDX(children, i, const char *);
+ SVN_ERR_ASSERT(*local_relpath != '\0'
+ && *repos_relpath != '\0');
- svn_pool_clear(iterpool);
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_COMMIT_DESCENDANTS_TO_BASE));
- local_relpath = svn_relpath_join(parent_local_relpath, name, iterpool);
- repos_relpath = svn_relpath_join(parent_repos_relpath, name, iterpool);
- SVN_ERR(svn_sqlite__bindf(stmt, "isdisr",
- wcroot->wc_id,
- local_relpath,
- op_depth,
- repos_id,
- repos_relpath,
- revision));
- SVN_ERR(svn_sqlite__step_done(stmt));
+ SVN_ERR(svn_sqlite__bindf(stmt, "isdisr", wcroot->wc_id,
+ local_relpath,
+ op_depth,
+ repos_id,
+ repos_relpath,
+ revision));
- SVN_ERR(descendant_commit(wcroot, local_relpath, op_depth, repos_id,
- repos_relpath, revision, iterpool));
- }
- svn_pool_destroy(iterpool);
+ SVN_ERR(svn_sqlite__update(NULL, stmt));
return SVN_NO_ERROR;
}