[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: svn commit: r36758 - trunk/subversion/libsvn_wc

From: Hyrum K. Wright <hyrum_wright_at_mail.utexas.edu>
Date: Tue, 24 Mar 2009 16:16:50 -0500

A question about this, for those that care: Should the
incomplete_children bit of the insert_base_baton, insert_base(), etc.
be removed? If this happens, we could still set the flag, just not as
part of wc_db.

-Hyrum

On Mar 24, 2009, at 4:09 PM, Hyrum K. Wright wrote:

> Author: hwright
> Date: Tue Mar 24 14:09:14 2009
> New Revision: 36758
>
> Log:
> Move the directory initialization code into wc_db.
>
> * subversion/libsvn_wc/entries.c
> (statements, statement_keys): Remove a statement.
> (svn_wc__entries_init): Largely gut, calling the wc_db API instead.
>
> * subversion/libsvn_wc/wc_db.c
> (statement_keys, statements): New statement. Also, when inserting
> the
> base_node, also insert the incomplete children flag.
> (insert_base_baton): Add incomplete_children flag.
> (insert_base_node): Insert the incomplete children flag.
> (svn_wc__db_init): New.
>
> * subversion/libsvn_wc/wc_db.h
> (svn_wc__db_init): New.
>
> Modified:
> trunk/subversion/libsvn_wc/entries.c
> trunk/subversion/libsvn_wc/wc_db.c
> trunk/subversion/libsvn_wc/wc_db.h
>
> Modified: trunk/subversion/libsvn_wc/entries.c
> URL: http://svn.collab.net/viewvc/svn/trunk/subversion/libsvn_wc/entries.c?pathrev=36758&r1=36757&r2=36758
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- trunk/subversion/libsvn_wc/entries.c Tue Mar 24 09:59:55 2009
> (r36757)
> +++ trunk/subversion/libsvn_wc/entries.c Tue Mar 24 14:09:14 2009
> (r36758)
> @@ -59,7 +59,6 @@ static const char * const upgrade_sql[]
> and removed at the same time. */
> enum statement_keys {
> STMT_INSERT_REPOSITORY,
> - STMT_INSERT_WCROOT,
> STMT_INSERT_BASE_NODE,
> STMT_INSERT_WORKING_NODE,
> STMT_INSERT_ACTUAL_NODE,
> @@ -81,9 +80,6 @@ static const char * const statements[] =
> "insert into repository (root, uuid) "
> "values (?1, ?2);",
>
> - "insert into wcroot (local_abspath) "
> - "values (?1);",
> -
> "insert or replace into base_node "
> "(wc_id, local_relpath, repos_id, repos_relpath, parent_relpath, "
> "presence, "
> @@ -2935,77 +2931,31 @@ svn_error_t *
> svn_wc__entries_init(const char *path,
> const char *uuid,
> const char *url,
> - const char *repos,
> + const char *repos_root,
> svn_revnum_t initial_rev,
> svn_depth_t depth,
> apr_pool_t *pool)
> {
> - svn_sqlite__db_t *wc_db;
> - svn_wc__db_t *db;
> - svn_sqlite__stmt_t *stmt;
> apr_pool_t *scratch_pool = svn_pool_create(pool);
> - const char *wc_db_path = db_path(path, scratch_pool);
> - apr_int64_t wc_id;
> - apr_int64_t repos_id;
> - svn_wc_entry_t *entry = alloc_entry(scratch_pool);
> + const char *abspath;
> + const char *repos_relpath;
>
> if (!should_create_next_gen())
> - return svn_wc__entries_init_old(path, uuid, url, repos,
> initial_rev,
> + return svn_wc__entries_init_old(path, uuid, url, repos_root,
> initial_rev,
> depth, pool);
>
> - SVN_ERR_ASSERT(! repos || svn_path_is_ancestor(repos, url));
> + SVN_ERR_ASSERT(! repos_root || svn_path_is_ancestor(repos_root,
> url));
> SVN_ERR_ASSERT(depth == svn_depth_empty
> || depth == svn_depth_files
> || depth == svn_depth_immediates
> || depth == svn_depth_infinity);
>
> - /* ### chicken and egg problem: we don't have an adm_access baton
> to
> - ### use to open the initial entries database, we we've got to
> do it
> - ### manually. */
> - SVN_ERR(svn_wc__db_open(&db, svn_wc__db_openmode_readwrite, path,
> - NULL, scratch_pool, scratch_pool));
> -
> - /* Open the sqlite database, and insert the REPOS and WCROOT.
> - ### this is redundant, but we currently need it for the entry
> - ### inserting API. DB and WC_DB should be pointing to the
> *same*
> - ### sqlite database, and it works fine thanks for sqlite's
> - ### concurrency handling. However, this should eventually
> disappear. */
> - SVN_ERR(svn_sqlite__open(&wc_db, wc_db_path,
> svn_sqlite__mode_rwcreate,
> - statements,
> - SVN_WC__VERSION_EXPERIMENTAL, upgrade_sql,
> - scratch_pool, scratch_pool));
> -
> -#ifdef SVN_DEBUG
> - {
> - SVN_ERR(svn_sqlite__exec(wc_db, WC_CHECKS_SQL));
> - }
> -#endif
> -
> - /* Insert the repository. */
> - SVN_ERR(svn_sqlite__get_statement(&stmt, wc_db,
> STMT_INSERT_REPOSITORY));
> - SVN_ERR(svn_sqlite__bindf(stmt, "ss", repos, uuid));
> - SVN_ERR(svn_sqlite__insert(&repos_id, stmt));
> -
> - /* Insert the wcroot. */
> - /* ### Right now, this just assumes wc metadata is being stored
> locally. */
> - SVN_ERR(svn_sqlite__get_statement(&stmt, wc_db,
> STMT_INSERT_WCROOT));
> - SVN_ERR(svn_sqlite__insert(&wc_id, stmt));
> -
> - /* Add an entry for the dir itself. The directory has no name. It
> - might have a UUID, but otherwise only the revision and default
> - ancestry are present, and possibly an 'incomplete' flag if the
> revnum
> - is > 0. */
> - entry->kind = svn_node_dir;
> - entry->url = url;
> - entry->revision = initial_rev;
> - entry->uuid = uuid;
> - entry->repos = repos;
> - entry->depth = depth;
> - if (initial_rev > 0)
> - entry->incomplete = TRUE;
> -
> - SVN_ERR(write_entry(db, wc_db, wc_id, repos_id, repos, entry,
> - SVN_WC_ENTRY_THIS_DIR, path, entry,
> scratch_pool));
> + /* Initialize the db for this directory. */
> + SVN_ERR(svn_dirent_get_absolute(&abspath, path, scratch_pool));
> + repos_relpath = svn_uri_is_child(repos_root, url, scratch_pool);
> + SVN_ERR(svn_wc__db_init(abspath, repos_relpath == NULL ? ""
> + : svn_path_uri_decode(repos_relpath,
> scratch_pool),
> + repos_root, uuid, initial_rev, depth,
> scratch_pool));
>
> svn_pool_destroy(scratch_pool);
> return SVN_NO_ERROR;
>
> Modified: trunk/subversion/libsvn_wc/wc_db.c
> URL: http://svn.collab.net/viewvc/svn/trunk/subversion/libsvn_wc/wc_db.c?pathrev=36758&r1=36757&r2=36758
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- trunk/subversion/libsvn_wc/wc_db.c Tue Mar 24 09:59:55 2009
> (r36757)
> +++ trunk/subversion/libsvn_wc/wc_db.c Tue Mar 24 14:09:14 2009
> (r36758)
> @@ -166,7 +166,8 @@ enum statement_keys {
> STMT_UPDATE_ACTUAL_PROPS,
> STMT_SELECT_ALL_PROPS,
> STMT_SELECT_PRISTINE_PROPS,
> - STMT_INSERT_LOCK
> + STMT_INSERT_LOCK,
> + STMT_INSERT_WCROOT
> };
>
> static const char * const statements[] = {
> @@ -209,9 +210,9 @@ static const char * const statements[] =
> "insert or replace into base_node ("
> " wc_id, local_relpath, repos_id, repos_relpath, parent_relpath,
> presence, "
> " kind, revnum, properties, changed_rev, changed_date,
> changed_author, "
> - " depth, checksum, translated_size, symlink_target) "
> + " depth, checksum, translated_size, symlink_target,
> incomplete_children) "
> "values (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?
> 14, "
> - " ?15, ?16);",
> + " ?15, ?16, ?17);",
>
> "insert or ignore into base_node ("
> " wc_id, local_relpath, parent_relpath, presence, kind, revnum) "
> @@ -258,6 +259,9 @@ static const char * const statements[] =
> " lock_date)"
> "values (?1, ?2, ?3, ?4, ?5, ?6);",
>
> + "insert into wcroot (local_abspath) "
> + "values (?1);",
> +
> NULL
> };
>
> @@ -289,6 +293,7 @@ typedef struct {
> const char *target;
>
> /* for inserting absent nodes */
> + svn_boolean_t incomplete_children;
>
> /* for temporary allocations */
> apr_pool_t *scratch_pool;
> @@ -1102,6 +1107,8 @@ insert_base_node(void *baton, svn_sqlite
> SVN_ERR(svn_sqlite__bind_text(stmt, 16, pibb->target));
> }
>
> + SVN_ERR(svn_sqlite__bind_int64(stmt, 17, pibb-
> >incomplete_children));
> +
> SVN_ERR(svn_sqlite__insert(NULL, stmt));
>
> if (pibb->kind == svn_wc__db_kind_dir && pibb->children)
> @@ -1304,6 +1311,62 @@ svn_wc__db_close(svn_wc__db_t *db,
>
>
> svn_error_t *
> +svn_wc__db_init(const char *local_abspath,
> + const char *repos_relpath,
> + const char *repos_root_url,
> + const char *repos_uuid,
> + svn_revnum_t initial_rev,
> + svn_depth_t depth,
> + apr_pool_t *scratch_pool)
> +{
> + svn_sqlite__db_t *sdb;
> + svn_sqlite__stmt_t *stmt;
> + apr_int64_t repos_id;
> + apr_int64_t wc_id;
> + insert_base_baton_t ibb;
> +
> + SVN_ERR(svn_sqlite__open(&sdb,
> + svn_wc__adm_child(local_abspath, "wc.db",
> + scratch_pool),
> + svn_sqlite__mode_rwcreate, statements,
> + SVN_WC__VERSION_EXPERIMENTAL, upgrade_sql,
> + scratch_pool, scratch_pool));
> +
> + /* Insert the repository. */
> + SVN_ERR(create_repos_id(&repos_id, repos_root_url, repos_uuid, sdb,
> + scratch_pool));
> +
> + /* Insert the wcroot. */
> + /* ### Right now, this just assumes wc metadata is being stored
> locally. */
> + SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, STMT_INSERT_WCROOT));
> + SVN_ERR(svn_sqlite__insert(&wc_id, stmt));
> +
> + ibb.status = svn_wc__db_status_normal;
> + ibb.kind = svn_wc__db_kind_dir;
> + ibb.wc_id = wc_id;
> + ibb.local_relpath = "";
> + ibb.repos_id = repos_id;
> + ibb.repos_relpath = repos_relpath;
> + ibb.revision = initial_rev;
> +
> + ibb.props = NULL;
> + ibb.changed_rev = SVN_INVALID_REVNUM;
> + ibb.changed_date = 0;
> + ibb.changed_author = NULL;
> +
> + ibb.children = NULL;
> + ibb.incomplete_children = TRUE;
> + ibb.depth = depth;
> +
> + ibb.scratch_pool = scratch_pool;
> +
> + SVN_ERR(insert_base_node(&ibb, sdb));
> +
> + return svn_sqlite__close(sdb);
> +}
> +
> +
> +svn_error_t *
> svn_wc__db_base_add_directory(svn_wc__db_t *db,
> const char *local_abspath,
> const char *repos_relpath,
>
> Modified: trunk/subversion/libsvn_wc/wc_db.h
> URL: http://svn.collab.net/viewvc/svn/trunk/subversion/libsvn_wc/wc_db.h?pathrev=36758&r1=36757&r2=36758
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- trunk/subversion/libsvn_wc/wc_db.h Tue Mar 24 09:59:55 2009
> (r36757)
> +++ trunk/subversion/libsvn_wc/wc_db.h Tue Mar 24 14:09:14 2009
> (r36758)
> @@ -274,6 +274,21 @@ svn_error_t *
> svn_wc__db_close(svn_wc__db_t *db,
> apr_pool_t *scratch_pool);
>
> +
> +/**
> + * Initialize the DB for LOCAL_ABSPATH, which should be a working
> copy path.
> + * Use SCRATCH_POOL for temporary allocations.
> + */
> +svn_error_t *
> +svn_wc__db_init(const char *local_abspath,
> + const char *repos_relpath,
> + const char *repos_root_url,
> + const char *repos_uuid,
> + svn_revnum_t initial_rev,
> + svn_depth_t depth,
> + apr_pool_t *scratch_pool);
> +
> +
> /** @} */
>
> /**
>
> ------------------------------------------------------
> http://subversion.tigris.org/ds/viewMessage.do?dsForumId=495&dsMessageId=1406091

------------------------------------------------------
http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=1406129
Received on 2009-03-24 22:17:20 CET

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.