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 2010/11/01 14:48:36 UTC
svn commit: r1029655 - /subversion/trunk/subversion/libsvn_wc/wc_db.c
Author: philip
Date: Mon Nov 1 13:48:36 2010
New Revision: 1029655
URL: http://svn.apache.org/viewvc?rev=1029655&view=rev
Log:
Make svn_wc__db_temp_op_delete into a single transaction.
* subversion/libsvn_wc/wc_db.c
(db_working_update_presence): Convert to PDH/local_relpath interface.
(db_working_actual_remove): Convert to PDH/local_relpath interface, don't
flush entries.
(db_working_insert): Convert to PDH/local_relpath interface, don't use a
transaction, don't flush entries.
(struct temp_op_delete_baton): New.
(temp_op_delete_txn): New, implementation from svn_wc__db_temp_op_delete.
(svn_wc__db_temp_op_delete): Wrap temp_op_delete_txn with a transaction,
flush entries here, open database read-write.
Modified:
subversion/trunk/subversion/libsvn_wc/wc_db.c
Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=1029655&r1=1029654&r2=1029655&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Mon Nov 1 13:48:36 2010
@@ -4557,20 +4557,12 @@ delete_not_present_children(svn_wc__db_p
/* Update the working node for LOCAL_ABSPATH setting presence=STATUS */
static svn_error_t *
db_working_update_presence(svn_wc__db_status_t status,
- svn_wc__db_t *db,
- const char *local_abspath,
+ svn_wc__db_pdh_t *pdh,
+ const char *local_relpath,
apr_pool_t *scratch_pool)
{
- svn_wc__db_pdh_t *pdh;
- const char *local_relpath;
svn_sqlite__stmt_t *stmt;
- SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
- SVN_ERR(svn_wc__db_pdh_parse_local_abspath(&pdh, &local_relpath, db,
- local_abspath, svn_sqlite__mode_readwrite,
- scratch_pool, scratch_pool));
- VERIFY_USABLE_PDH(pdh);
-
SVN_ERR(svn_sqlite__get_statement(&stmt, pdh->wcroot->sdb,
STMT_UPDATE_NODE_WORKING_PRESENCE));
SVN_ERR(svn_sqlite__bindf(stmt, "ist", pdh->wcroot->wc_id, local_relpath,
@@ -4591,21 +4583,12 @@ db_working_update_presence(svn_wc__db_st
remain working child sub-trees should be presence=not-present and will
be deleted. */
static svn_error_t *
-db_working_actual_remove(svn_wc__db_t *db,
- const char *local_abspath,
+db_working_actual_remove(svn_wc__db_pdh_t *pdh,
+ const char *local_relpath,
apr_pool_t *scratch_pool)
{
- svn_wc__db_pdh_t *pdh;
- const char *local_relpath;
svn_sqlite__stmt_t *stmt;
- SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
- SVN_ERR(svn_wc__db_pdh_parse_local_abspath(&pdh, &local_relpath, db,
- local_abspath, svn_sqlite__mode_readwrite,
- scratch_pool, scratch_pool));
-
- VERIFY_USABLE_PDH(pdh);
-
SVN_ERR(svn_sqlite__get_statement(&stmt, pdh->wcroot->sdb,
STMT_DELETE_WORKING_NODES));
SVN_ERR(svn_sqlite__bindf(stmt, "is", pdh->wcroot->wc_id, local_relpath));
@@ -4618,8 +4601,6 @@ db_working_actual_remove(svn_wc__db_t *d
SVN_ERR(delete_not_present_children(pdh, local_relpath, scratch_pool));
- SVN_ERR(flush_entries(db, pdh, local_abspath, scratch_pool));
-
return SVN_NO_ERROR;
}
@@ -4629,21 +4610,12 @@ db_working_actual_remove(svn_wc__db_t *d
/* Insert a working node for LOCAL_ABSPATH with presence=STATUS. */
static svn_error_t *
db_working_insert(svn_wc__db_status_t status,
- svn_wc__db_t *db,
- const char *local_abspath,
+ svn_wc__db_pdh_t *pdh,
+ const char *local_relpath,
apr_pool_t *scratch_pool)
{
- svn_wc__db_pdh_t *pdh;
- const char *local_relpath;
insert_working_baton_t iwb;
- SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
- SVN_ERR(svn_wc__db_pdh_parse_local_abspath(&pdh, &local_relpath, db,
- local_abspath, svn_sqlite__mode_readwrite,
- scratch_pool, scratch_pool));
- VERIFY_USABLE_PDH(pdh);
-
- /* Update WORKING_NODE and NODE_DATA transactionally */
blank_iwb(&iwb);
iwb.wc_id = pdh->wcroot->wc_id;
@@ -4655,12 +4627,7 @@ db_working_insert(svn_wc__db_status_t st
iwb.op_depth = 2; /* ### temporary op_depth */
#endif
- SVN_ERR(svn_sqlite__with_transaction(pdh->wcroot->sdb,
- copy_working_from_base, &iwb,
- scratch_pool));
-
-
- SVN_ERR(flush_entries(db, pdh, local_abspath, scratch_pool));
+ SVN_ERR(copy_working_from_base(&iwb, pdh->wcroot->sdb, scratch_pool));
return SVN_NO_ERROR;
}
@@ -4738,31 +4705,29 @@ is_add_or_root_of_copy(svn_boolean_t *ad
return SVN_NO_ERROR;
}
+struct temp_op_delete_baton {
+ svn_wc__db_pdh_t *pdh;
+ const char *local_relpath;
+
+ /* The following two are only needed for svn_wc__db_temp_forget_directory */
+ svn_wc__db_t *db;
+ const char *local_abspath;
+};
/* Delete LOCAL_ABSPATH. Implements the delete transition from
notes/wc-ng/transitions. */
-svn_error_t *
-svn_wc__db_temp_op_delete(svn_wc__db_t *db,
- const char *local_abspath,
- apr_pool_t *scratch_pool)
+static svn_error_t *
+temp_op_delete_txn(void *baton, svn_sqlite__db_t *sdb, apr_pool_t *scratch_pool)
{
- svn_wc__db_pdh_t *pdh;
- const char *local_relpath;
+ struct temp_op_delete_baton *b = baton;
svn_wc__db_status_t base_status, working_status, new_working_status;
svn_boolean_t have_base, have_work, new_have_work;
- SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
-
- SVN_ERR(svn_wc__db_pdh_parse_local_abspath(&pdh, &local_relpath, db,
- local_abspath, svn_sqlite__mode_readonly,
- scratch_pool, scratch_pool));
- VERIFY_USABLE_PDH(pdh);
-
SVN_ERR(read_info(&working_status, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, &have_base, &have_work, NULL, NULL,
- pdh, local_relpath,
+ b->pdh, b->local_relpath,
scratch_pool, scratch_pool));
if (working_status == svn_wc__db_status_deleted)
{
@@ -4775,7 +4740,8 @@ svn_wc__db_temp_op_delete(svn_wc__db_t *
SVN_ERR(base_get_info(&base_status,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- pdh, local_relpath, scratch_pool, scratch_pool));
+ b->pdh, b->local_relpath,
+ scratch_pool, scratch_pool));
if (have_base && (base_status == svn_wc__db_status_absent
|| base_status == svn_wc__db_status_excluded))
@@ -4822,7 +4788,7 @@ svn_wc__db_temp_op_delete(svn_wc__db_t *
svn_boolean_t add_or_root_of_copy;
SVN_ERR(is_add_or_root_of_copy(&add_or_root_of_copy,
- pdh, local_relpath, scratch_pool));
+ b->pdh, b->local_relpath, scratch_pool));
if (add_or_root_of_copy)
new_have_work = FALSE;
else
@@ -4833,7 +4799,7 @@ svn_wc__db_temp_op_delete(svn_wc__db_t *
/* DELETE + ADD */
svn_boolean_t add_or_root_of_copy;
SVN_ERR(is_add_or_root_of_copy(&add_or_root_of_copy,
- pdh, local_relpath, scratch_pool));
+ b->pdh, b->local_relpath, scratch_pool));
if (add_or_root_of_copy)
new_working_status = svn_wc__db_status_base_deleted;
else
@@ -4843,32 +4809,59 @@ svn_wc__db_temp_op_delete(svn_wc__db_t *
{
svn_boolean_t add_or_root_of_copy;
SVN_ERR(is_add_or_root_of_copy(&add_or_root_of_copy,
- pdh, local_relpath, scratch_pool));
+ b->pdh, b->local_relpath, scratch_pool));
if (add_or_root_of_copy)
new_have_work = FALSE;
}
if (!new_have_work && have_work)
{
- SVN_ERR(db_working_actual_remove(db, local_abspath, scratch_pool));
+ SVN_ERR(db_working_actual_remove(b->pdh, b->local_relpath, scratch_pool));
+
/* ### Search the cached directories in db for directories below
local_abspath and close their handles to allow deleting
them from the working copy */
- SVN_ERR(svn_wc__db_temp_forget_directory(db, local_abspath,
+ SVN_ERR(svn_wc__db_temp_forget_directory(b->db, b->local_abspath,
scratch_pool));
}
else if (new_have_work && !have_work)
SVN_ERR(db_working_insert(new_working_status,
- db, local_abspath, scratch_pool));
+ b->pdh, b->local_relpath, scratch_pool));
else if (new_have_work && have_work
&& new_working_status != working_status)
SVN_ERR(db_working_update_presence(new_working_status,
- db, local_abspath, scratch_pool));
+ b->pdh, b->local_relpath, scratch_pool));
/* ### else nothing to do, return an error? */
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_wc__db_temp_op_delete(svn_wc__db_t *db,
+ const char *local_abspath,
+ apr_pool_t *scratch_pool)
+{
+ struct temp_op_delete_baton b;
+
+ SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
+
+ SVN_ERR(svn_wc__db_pdh_parse_local_abspath(&b.pdh, &b.local_relpath, db,
+ local_abspath, svn_sqlite__mode_readwrite,
+ scratch_pool, scratch_pool));
+ VERIFY_USABLE_PDH(b.pdh);
+
+ /* These two for svn_wc__db_temp_forget_directory */
+ b.db = db;
+ b.local_abspath = local_abspath;
+
+ SVN_ERR(svn_sqlite__with_transaction(b.pdh->wcroot->sdb, temp_op_delete_txn,
+ &b, scratch_pool));
+
+ SVN_ERR(flush_entries(db, b.pdh, local_abspath, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
/* Like svn_wc__db_read_info(), but with PDH+LOCAL_RELPATH instead of
* DB+LOCAL_ABSPATH.*/