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/03/14 20:32:04 UTC
svn commit: r1081528 [1/2] - in /subversion/trunk/subversion/libsvn_wc:
wc_db.c wc_db_pristine.c wc_db_private.h wc_db_txn.c
Author: hwright
Date: Mon Mar 14 19:32:04 2011
New Revision: 1081528
URL: http://svn.apache.org/viewvc?rev=1081528&view=rev
Log:
Fix the svnversion test 1 failure introduced in r1081510. This involves
exposing the wc_db txn handler to the larger library, rather than just
wc_db.c.
One of the pristine handling functions was using an SQLite txn, which
couldn't be nested. This change allows that txn to be nested.
* subversion/libsvn_wc/wc_db_txn.c:
New, copied from wc_db.c, and everything but the txn handling stripped out.
* subversion/libsvn_wc/wc_db_private.h
(svn_wc__db_txn_callback_t, svn_wc__db_with_txn): New.
* subversion/libsvn_wc/wc_db.c
(db_txn_callback_t, txn_baton_t, run_txn, with_db_txn): Remove.
[elsewhere]: Update callers to new function name.
Added:
subversion/trunk/subversion/libsvn_wc/wc_db_txn.c
- copied, changed from r1081515, subversion/trunk/subversion/libsvn_wc/wc_db.c
Modified:
subversion/trunk/subversion/libsvn_wc/wc_db.c
subversion/trunk/subversion/libsvn_wc/wc_db_pristine.c
subversion/trunk/subversion/libsvn_wc/wc_db_private.h
Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=1081528&r1=1081527&r2=1081528&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Mon Mar 14 19:32:04 2011
@@ -309,63 +309,6 @@ wclock_owns_lock(svn_boolean_t *own_lock
-/* Some helpful transaction helpers.
-
- Instead of directly using SQLite transactions, these wrappers take care of
- simple cases by allowing consumers to worry about wrapping the wcroot and
- local_relpath, which are almost always used within the transaction.
-
- This also means if we later want to implement some wc_db-specific txn
- handling, we have a convenient place to do it.
- */
-
-/* A callback which supplies WCROOTs and LOCAL_RELPATHs. */
-typedef svn_error_t *(*db_txn_callback_t)(void *baton,
- svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- apr_pool_t *scratch_pool);
-
-/* Baton for use with run_txn() and with_db_txn(). */
-struct txn_baton_t
-{
- svn_wc__db_wcroot_t *wcroot;
- const char *local_relpath;
-
- db_txn_callback_t cb_func;
- void *cb_baton;
-};
-
-
-/* Unwrap the sqlite transaction into a wc_db txn.
- Implements svn_sqlite__transaction_callback_t. */
-static svn_error_t *
-run_txn(void *baton, svn_sqlite__db_t *db, apr_pool_t *scratch_pool)
-{
- struct txn_baton_t *tb = baton;
-
- return svn_error_return(
- tb->cb_func(tb->cb_baton, tb->wcroot, tb->local_relpath, scratch_pool));
-}
-
-
-/* Run CB_FUNC in a SQLite transaction with CB_BATON, using WCROOT and
- LOCAL_RELPATH. If callbacks require additional information, they may
- provide it using CB_BATON. */
-static svn_error_t *
-with_db_txn(svn_wc__db_wcroot_t *wcroot,
- const char *local_relpath,
- db_txn_callback_t cb_func,
- void *cb_baton,
- apr_pool_t *scratch_pool)
-{
- struct txn_baton_t tb = { wcroot, local_relpath, cb_func, cb_baton };
-
- return svn_error_return(
- svn_sqlite__with_lock(wcroot->sdb, run_txn, &tb, scratch_pool));
-}
-
-
-
/* Return the absolute path, in local path style, of LOCAL_RELPATH
in WCROOT. */
static const char *
@@ -1493,8 +1436,8 @@ svn_wc__db_base_add_directory(svn_wc__db
Note: old children can stick around, even if they are no longer present
in this directory's revision. */
- SVN_ERR(with_db_txn(wcroot, local_relpath, insert_base_node, &ibb,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, insert_base_node, &ibb,
+ scratch_pool));
/* ### worry about flushing child subdirs? */
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
@@ -1566,8 +1509,8 @@ svn_wc__db_base_add_file(svn_wc__db_t *d
### or maybe let caller deal with that, if there is a possibility
### of a node kind change (rather than eat an extra lookup here). */
- SVN_ERR(with_db_txn(wcroot, local_relpath, insert_base_node, &ibb,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, insert_base_node, &ibb,
+ scratch_pool));
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
return SVN_NO_ERROR;
@@ -1636,8 +1579,8 @@ svn_wc__db_base_add_symlink(svn_wc__db_t
### or maybe let caller deal with that, if there is a possibility
### of a node kind change (rather than eat an extra lookup here). */
- SVN_ERR(with_db_txn(wcroot, local_relpath, insert_base_node, &ibb,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, insert_base_node, &ibb,
+ scratch_pool));
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
return SVN_NO_ERROR;
@@ -1701,8 +1644,8 @@ add_absent_excluded_not_present_node(svn
### or maybe let caller deal with that, if there is a possibility
### of a node kind change (rather than eat an extra lookup here). */
- SVN_ERR(with_db_txn(wcroot, local_relpath, insert_base_node, &ibb,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, insert_base_node, &ibb,
+ scratch_pool));
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
@@ -1750,7 +1693,7 @@ svn_wc__db_base_add_not_present_node(svn
}
-/* This implements db_txn_callback_t */
+/* This implements svn_wc__db_txn_callback_t */
static svn_error_t *
db_base_remove(void *baton,
svn_wc__db_wcroot_t *wcroot,
@@ -1802,8 +1745,8 @@ svn_wc__db_base_remove(svn_wc__db_t *db,
scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- SVN_ERR(with_db_txn(wcroot, local_relpath, db_base_remove, NULL,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, db_base_remove, NULL,
+ scratch_pool));
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
@@ -2778,8 +2721,8 @@ svn_wc__db_op_copy_dir(svn_wc__db_t *db,
iwb.work_items = work_items;
- SVN_ERR(with_db_txn(wcroot, local_relpath, insert_working_node, &iwb,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, insert_working_node, &iwb,
+ scratch_pool));
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
return SVN_NO_ERROR;
@@ -2851,8 +2794,8 @@ svn_wc__db_op_copy_file(svn_wc__db_t *db
iwb.work_items = work_items;
- SVN_ERR(with_db_txn(wcroot, local_relpath, insert_working_node, &iwb,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, insert_working_node, &iwb,
+ scratch_pool));
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
return SVN_NO_ERROR;
@@ -2920,8 +2863,8 @@ svn_wc__db_op_copy_symlink(svn_wc__db_t
iwb.work_items = work_items;
- SVN_ERR(with_db_txn(wcroot, local_relpath, insert_working_node, &iwb,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, insert_working_node, &iwb,
+ scratch_pool));
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
return SVN_NO_ERROR;
@@ -2953,8 +2896,8 @@ svn_wc__db_op_add_directory(svn_wc__db_t
iwb.work_items = work_items;
- SVN_ERR(with_db_txn(wcroot, local_relpath, insert_working_node, &iwb,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, insert_working_node, &iwb,
+ scratch_pool));
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
return SVN_NO_ERROR;
@@ -2986,8 +2929,8 @@ svn_wc__db_op_add_file(svn_wc__db_t *db,
iwb.work_items = work_items;
- SVN_ERR(with_db_txn(wcroot, local_relpath, insert_working_node, &iwb,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, insert_working_node, &iwb,
+ scratch_pool));
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
return SVN_NO_ERROR;
@@ -3023,8 +2966,8 @@ svn_wc__db_op_add_symlink(svn_wc__db_t *
iwb.work_items = work_items;
- SVN_ERR(with_db_txn(wcroot, local_relpath, insert_working_node, &iwb,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, insert_working_node, &iwb,
+ scratch_pool));
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
return SVN_NO_ERROR;
@@ -3138,8 +3081,9 @@ svn_wc__db_op_set_props(svn_wc__db_t *db
spb.conflict = conflict;
spb.work_items = work_items;
- return svn_error_return(with_db_txn(wcroot, local_relpath, set_props_txn,
- &spb, scratch_pool));
+ return svn_error_return(svn_wc__db_with_txn(wcroot, local_relpath,
+ set_props_txn, &spb,
+ scratch_pool));
}
@@ -3312,8 +3256,8 @@ svn_wc__db_op_set_changelist(svn_wc__db_
scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- SVN_ERR(with_db_txn(wcroot, local_relpath, set_changelist_txn,
- (void *) changelist, scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, set_changelist_txn,
+ (void *) changelist, scratch_pool));
/* No need to flush the parent entries; changelists were not stored in the
stub */
@@ -3467,8 +3411,8 @@ svn_wc__db_op_set_tree_conflict(svn_wc__
scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- SVN_ERR(with_db_txn(wcroot, local_relpath, set_tc_txn2,
- (void *) tree_conflict, scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, set_tc_txn2,
+ (void *) tree_conflict, scratch_pool));
/* There may be some entries, and the lock info is now out of date. */
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
@@ -3524,7 +3468,7 @@ struct op_revert_baton {
};
-/* This implements db_txn_callback_t */
+/* This implements svn_wc__db_txn_callback_t */
static svn_error_t *
op_revert_txn(void *baton,
svn_wc__db_wcroot_t *wcroot,
@@ -3637,7 +3581,7 @@ op_revert_txn(void *baton,
}
-/* This implements db_txn_callback_t */
+/* This implements svn_wc__db_txn_callback_t */
static svn_error_t *
op_revert_recursive_txn(void *baton,
svn_wc__db_wcroot_t *wcroot,
@@ -3721,7 +3665,7 @@ svn_wc__db_op_revert(apr_array_header_t
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- db_txn_callback_t txn_func;
+ svn_wc__db_txn_callback_t txn_func;
svn_wc__db_wcroot_t *wcroot;
const char *local_relpath;
struct op_revert_baton baton;
@@ -3751,7 +3695,8 @@ svn_wc__db_op_revert(apr_array_header_t
scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- SVN_ERR(with_db_txn(wcroot, local_relpath, txn_func, &baton, scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, txn_func, &baton,
+ scratch_pool));
*local_relpaths = baton.local_relpaths;
@@ -4551,8 +4496,8 @@ svn_wc__db_temp_op_delete(svn_wc__db_t *
b.db = db;
b.local_abspath = local_abspath;
- SVN_ERR(with_db_txn(wcroot, local_relpath, temp_op_delete_txn, &b,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, temp_op_delete_txn, &b,
+ scratch_pool));
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
@@ -5298,8 +5243,8 @@ read_url(const char **url,
apr_pool_t *scratch_pool)
{
struct read_url_baton rub = { url, result_pool };
- SVN_ERR(with_db_txn(wcroot, local_relpath, read_url_txn, &rub,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, read_url_txn, &rub,
+ scratch_pool));
return SVN_NO_ERROR;
}
@@ -6220,7 +6165,8 @@ svn_wc__db_global_commit(svn_wc__db_t *d
cb.no_unlock = no_unlock;
cb.work_items = work_items;
- SVN_ERR(with_db_txn(wcroot, local_relpath, commit_node, &cb, scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, commit_node, &cb,
+ scratch_pool));
/* We *totally* monkeyed the entries. Toss 'em. */
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
@@ -6303,7 +6249,8 @@ svn_wc__db_global_update(svn_wc__db_t *d
NOT_IMPLEMENTED();
#if 0
- SVN_ERR(with_db_txn(wcroot, local_relpath, update_node, &ub, scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, update_node, &ub,
+ scratch_pool));
#endif
/* We *totally* monkeyed the entries. Toss 'em. */
@@ -6363,8 +6310,8 @@ svn_wc__db_global_record_fileinfo(svn_wc
rb.translated_size = translated_size;
rb.last_mod_time = last_mod_time;
- SVN_ERR(with_db_txn(wcroot, local_relpath, record_fileinfo, &rb,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, record_fileinfo, &rb,
+ scratch_pool));
/* We *totally* monkeyed the entries. Toss 'em. */
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
@@ -6424,8 +6371,8 @@ svn_wc__db_lock_add(svn_wc__db_t *db,
scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- SVN_ERR(with_db_txn(wcroot, local_relpath, lock_add_txn, (void *) lock,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, lock_add_txn,
+ (void *) lock, scratch_pool));
/* There may be some entries, and the lock info is now out of date. */
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
@@ -6473,8 +6420,8 @@ svn_wc__db_lock_remove(svn_wc__db_t *db,
scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- SVN_ERR(with_db_txn(wcroot, local_relpath, lock_remove_txn, NULL,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, lock_remove_txn, NULL,
+ scratch_pool));
/* There may be some entries, and the lock info is now out of date. */
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
@@ -6792,8 +6739,9 @@ scan_addition(svn_wc__db_status_t *statu
sab.original_revision = original_revision;
sab.result_pool = result_pool;
- return svn_error_return(with_db_txn(wcroot, local_relpath, scan_addition_txn,
- &sab, scratch_pool));
+ return svn_error_return(svn_wc__db_with_txn(wcroot, local_relpath,
+ scan_addition_txn,
+ &sab, scratch_pool));
}
@@ -7073,8 +7021,9 @@ scan_deletion(const char **base_del_relp
sd_baton.work_del_relpath = work_del_relpath;
sd_baton.result_pool = result_pool;
- return svn_error_return(with_db_txn(wcroot, local_relpath, scan_deletion_txn,
- &sd_baton, scratch_pool));
+ return svn_error_return(svn_wc__db_with_txn(wcroot, local_relpath,
+ scan_deletion_txn, &sd_baton,
+ scratch_pool));
}
@@ -8249,8 +8198,9 @@ svn_wc__db_wclock_obtain(svn_wc__db_t *d
baton.steal_lock = steal_lock;
baton.levels_to_lock = levels_to_lock;
- return svn_error_return(with_db_txn(wcroot, local_relpath, wclock_obtain_cb,
- &baton, scratch_pool));
+ return svn_error_return(svn_wc__db_with_txn(wcroot, local_relpath,
+ wclock_obtain_cb, &baton,
+ scratch_pool));
}
@@ -8552,8 +8502,8 @@ svn_wc__db_temp_op_start_directory_updat
du.new_rev = new_rev;
du.new_repos_relpath = new_repos_relpath;
- SVN_ERR(with_db_txn(wcroot, local_relpath, start_directory_update_txn, &du,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath,
+ start_directory_update_txn, &du, scratch_pool));
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
@@ -8750,8 +8700,8 @@ svn_wc__db_temp_op_make_copy(svn_wc__db_
mcb.local_abspath = local_abspath;
mcb.op_depth = relpath_depth(local_relpath);
- SVN_ERR(with_db_txn(wcroot, local_relpath, make_copy_txn, &mcb,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, make_copy_txn, &mcb,
+ scratch_pool));
return SVN_NO_ERROR;
}
@@ -8902,8 +8852,8 @@ svn_wc__db_temp_op_set_file_external(svn
sfeb.peg_rev = peg_rev;
sfeb.rev = rev;
- SVN_ERR(with_db_txn(wcroot, local_relpath, set_file_external_txn,
- &sfeb, scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, set_file_external_txn,
+ &sfeb, scratch_pool));
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
@@ -9114,8 +9064,8 @@ svn_wc__db_temp_op_set_rev_and_repos_rel
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
- SVN_ERR(with_db_txn(wcroot, local_relpath, set_rev_relpath_txn,
- &baton, scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, set_rev_relpath_txn,
+ &baton, scratch_pool));
return SVN_NO_ERROR;
}
@@ -9209,8 +9159,9 @@ svn_wc__db_temp_op_set_new_dir_to_incomp
SVN_ERR(flush_entries(db, wcroot, local_abspath, scratch_pool));
- SVN_ERR(with_db_txn(wcroot, local_relpath, set_new_dir_to_incomplete_txn,
- &baton, scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath,
+ set_new_dir_to_incomplete_txn,
+ &baton, scratch_pool));
return SVN_NO_ERROR;
}
@@ -9647,7 +9598,7 @@ svn_wc__db_revision_status(svn_revnum_t
scratch_pool, scratch_pool));
VERIFY_USABLE_WCROOT(wcroot);
- return svn_error_return(with_db_txn(wcroot, local_relpath,
- revision_status_txn, &rsb,
- scratch_pool));
+ return svn_error_return(svn_wc__db_with_txn(wcroot, local_relpath,
+ revision_status_txn, &rsb,
+ scratch_pool));
}
Modified: subversion/trunk/subversion/libsvn_wc/wc_db_pristine.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db_pristine.c?rev=1081528&r1=1081527&r2=1081528&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db_pristine.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db_pristine.c Mon Mar 14 19:32:04 2011
@@ -193,7 +193,8 @@ typedef struct pristine_read_baton_t
* Implements svn_sqlite__transaction_callback_t. */
static svn_error_t *
pristine_read_txn(void *baton,
- svn_sqlite__db_t *sdb,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
apr_pool_t *scratch_pool)
{
pristine_read_baton_t *b = baton;
@@ -202,7 +203,7 @@ pristine_read_txn(void *baton,
/* Check that this pristine text is present in the store. (The presence
* of the file is not sufficient.) */
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, STMT_SELECT_PRISTINE));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, STMT_SELECT_PRISTINE));
SVN_ERR(svn_sqlite__bind_checksum(stmt, 1, b->sha1_checksum, scratch_pool));
SVN_ERR(svn_sqlite__step(&have_row, stmt));
SVN_ERR(svn_sqlite__reset(stmt));
@@ -256,8 +257,8 @@ svn_wc__db_pristine_read(svn_stream_t **
sha1_checksum,
FALSE /* create_subdir */,
scratch_pool, scratch_pool));
- SVN_ERR(svn_sqlite__with_transaction(wcroot->sdb, pristine_read_txn, &b,
- scratch_pool));
+ SVN_ERR(svn_wc__db_with_txn(wcroot, local_relpath, pristine_read_txn, &b,
+ scratch_pool));
return SVN_NO_ERROR;
}
Modified: subversion/trunk/subversion/libsvn_wc/wc_db_private.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db_private.h?rev=1081528&r1=1081527&r2=1081528&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db_private.h (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db_private.h Mon Mar 14 19:32:04 2011
@@ -169,5 +169,25 @@ svn_wc__db_util_open_db(svn_sqlite__db_t
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
+
+/* Transaction handling */
+
+/* A callback which supplies WCROOTs and LOCAL_RELPATHs. */
+typedef svn_error_t *(*svn_wc__db_txn_callback_t)(void *baton,
+ svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ apr_pool_t *scratch_pool);
+
+
+/* Run CB_FUNC in a SQLite transaction with CB_BATON, using WCROOT and
+ LOCAL_RELPATH. If callbacks require additional information, they may
+ provide it using CB_BATON. */
+svn_error_t *
+svn_wc__db_with_txn(svn_wc__db_wcroot_t *wcroot,
+ const char *local_relpath,
+ svn_wc__db_txn_callback_t cb_func,
+ void *cb_baton,
+ apr_pool_t *scratch_pool);
+
#endif /* WC_DB_PDH_H */