[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: Greg Stein <gstein_at_gmail.com>
Date: Wed, 25 Mar 2009 14:48:38 +0100

I don't think the flag is permanent. So if you *do* keep it in there,
then add a bunch of markers to that effect.

When we add a directory, it will be "complete", but it will have
incomplete nodes for all of its children. Thus, the determination for
"incomplete" will be count(*) for parent_relpath=?1 where
presence='incomplete'.

Also: in your code below, the other uses of insert_base_baton_t do not
clear the new flag (each user initializes all fields). And the
"incomplete_children" is listed under absent nodes, when it is
actually a directory flag (for now).

Cheers,
-g

On Tue, Mar 24, 2009 at 22:16, Hyrum K. Wright
<hyrum_wright_at_mail.utexas.edu> wrote:
> 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
>

------------------------------------------------------
http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessageId=1415606
Received on 2009-03-25 14:49: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.