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/09/16 14:32:49 UTC
svn commit: r997718 - in /subversion/trunk/subversion/libsvn_wc:
wc-queries.sql wc_db.c
Author: philip
Date: Thu Sep 16 12:32:49 2010
New Revision: 997718
URL: http://svn.apache.org/viewvc?rev=997718&view=rev
Log:
Make svn_wc__db_read_info verify base nodes in the NODES table. This
causes db-test 8 and entries-compat-test 1 and 2 to FAIL with SVN_WC__NODES.
* subversion/libsvn_wc/wc-queries.sql
(STMT_SELECT_WORKING_NODE_1): New.
* subversion/libsvn_wc/wc_db.c
(assert_working_rows_match): New.
(svn_wc__db_read_info): Read base and working nodes from the NODES
table, verify that BASE_NODE matches.
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=997718&r1=997717&r2=997718&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Thu Sep 16 12:32:49 2010
@@ -68,6 +68,15 @@ select presence, kind, checksum, transla
from working_node
where wc_id = ?1 and local_relpath = ?2;
+-- STMT_SELECT_WORKING_NODE_1
+select presence, kind, checksum, translated_size,
+ changed_revision, changed_date, changed_author, depth, symlink_target,
+ repos_id, repos_path, revision,
+ moved_here, moved_to, last_mod_time, properties
+from nodes
+where wc_id = ?1 and local_relpath = ?2 and op_depth > 0 order by op_depth desc
+limit 1;
+
-- STMT_SELECT_ACTUAL_NODE
select prop_reject, changelist, conflict_old, conflict_new,
conflict_working, tree_conflict_data, properties
Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=997718&r1=997717&r2=997718&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Thu Sep 16 12:32:49 2010
@@ -459,6 +459,62 @@ assert_base_rows_match(svn_boolean_t hav
return SVN_NO_ERROR;
}
+static svn_error_t *
+assert_working_rows_match(svn_boolean_t have_row1,
+ svn_boolean_t have_row2,
+ svn_sqlite__stmt_t *stmt1,
+ svn_sqlite__stmt_t *stmt2,
+ const char *relpath,
+ apr_pool_t *scratch_pool)
+{
+ if (have_row1 != have_row2)
+ SVN_ERR(svn_error_createf(
+ SVN_ERR_WC_CORRUPT, NULL,
+ "Different results from WORKING (%d) and NODES queries (%d), "
+ "for local_relpath %s",
+ have_row1, have_row2, relpath));
+
+ if (!have_row1)
+ return SVN_NO_ERROR;
+
+ /* presence */
+ SVN_ERR(assert_text_columns_equal(stmt1, stmt2, 0, scratch_pool));
+ /* kind */
+ SVN_ERR(assert_text_columns_equal(stmt1, stmt2, 1, scratch_pool));
+ /* checksum */
+ SVN_ERR(assert_text_columns_equal(stmt1, stmt2, 2, scratch_pool));
+ /* translated_size */
+ SVN_ERR_ASSERT(svn_sqlite__column_int64(stmt1, 3)
+ == svn_sqlite__column_int64(stmt2, 3));
+ /* changed_rev */
+ SVN_ERR_ASSERT(svn_sqlite__column_int64(stmt1, 4)
+ == svn_sqlite__column_int64(stmt2, 4));
+ /* changed_date */
+ SVN_ERR_ASSERT(svn_sqlite__column_int64(stmt1, 5)
+ == svn_sqlite__column_int64(stmt2, 5));
+ /* changed_author */
+ SVN_ERR(assert_text_columns_equal(stmt1, stmt2, 6, scratch_pool));
+ /* depth */
+ SVN_ERR(assert_text_columns_equal(stmt1, stmt2, 7, scratch_pool));
+ /* symlink_target */
+ /* copyfrom_repos_id */
+ SVN_ERR_ASSERT(svn_sqlite__column_int64(stmt1, 9)
+ == svn_sqlite__column_int64(stmt2, 9));
+ /* copyfrom_repos_path */
+ SVN_ERR(assert_text_columns_equal(stmt1, stmt2, 7, scratch_pool));
+ /* copyfrom_revnum */
+ SVN_ERR_ASSERT(svn_sqlite__column_int64(stmt1, 11)
+ == svn_sqlite__column_int64(stmt2, 11));
+ /* moved_here */
+ /* moved_to */
+ /* last_mod_time */
+ SVN_ERR_ASSERT(svn_sqlite__column_int64(stmt1, 14)
+ == svn_sqlite__column_int64(stmt2, 14));
+ /* properties */
+
+ return SVN_NO_ERROR;
+}
+
#endif /* SVN_WC__NODES_ONLY */
#endif /* SVN_WC__NODES */
@@ -4875,6 +4931,12 @@ svn_wc__db_read_info(svn_wc__db_status_t
svn_boolean_t local_have_base;
svn_boolean_t local_have_work;
svn_boolean_t have_act;
+#ifdef SVN_WC__NODES
+ svn_sqlite__stmt_t *stmt_nodes_base;
+ svn_sqlite__stmt_t *stmt_nodes_work;
+ svn_boolean_t local_have_nodes_base;
+ svn_boolean_t local_have_nodes_work;
+#endif
svn_error_t *err = NULL;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
@@ -4908,6 +4970,42 @@ svn_wc__db_read_info(svn_wc__db_status_t
pdh->wcroot->wc_id, local_relpath));
SVN_ERR(svn_sqlite__step(&have_act, stmt_act));
+#ifdef SVN_WC__NODES
+ SVN_ERR(svn_sqlite__get_statement(&stmt_nodes_base, pdh->wcroot->sdb,
+ lock ? STMT_SELECT_BASE_NODE_WITH_LOCK_1
+ : STMT_SELECT_BASE_NODE_1));
+ SVN_ERR(svn_sqlite__bindf(stmt_nodes_base, "is",
+ pdh->wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__step(&local_have_nodes_base, stmt_nodes_base));
+
+ /* Possible optimisation: if we didn't select op_depth > 0 then this
+ would give us the base node when there is no working node. */
+ SVN_ERR(svn_sqlite__get_statement(&stmt_nodes_work, pdh->wcroot->sdb,
+ STMT_SELECT_WORKING_NODE_1));
+ SVN_ERR(svn_sqlite__bindf(stmt_nodes_work, "is",
+ pdh->wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__step(&local_have_nodes_work, stmt_nodes_work));
+
+#ifndef SVN_WC__NODES_ONLY
+ SVN_ERR(assert_base_rows_match(*have_base, local_have_nodes_base,
+ stmt_base, stmt_nodes_base,
+ local_relpath, scratch_pool));
+#if 0
+ /* Too many regression test fail at present */
+ SVN_ERR(assert_working_rows_match(*have_work, local_have_nodes_work,
+ stmt_work, stmt_nodes_work,
+ local_relpath, scratch_pool));
+#endif
+#else
+ /* Lets assume the queries return compatible data */
+ *have_base = local_have_nodes_base;
+ *have_work = local_have_nodes_work;
+ stmt_base = stmt_nodes_base;
+ stmt_work = stmt_nodes_work;
+#endif
+
+#endif /* SVN_WC__NODES */
+
if (*have_base || *have_work)
{
svn_wc__db_kind_t node_kind;
@@ -5208,6 +5306,13 @@ svn_wc__db_read_info(svn_wc__db_status_t
scratch_pool));
}
+#ifdef SVN_WC__NODES
+#ifndef SVN_WC__NODES_ONLY
+ err = svn_error_compose_create(err, svn_sqlite__reset(stmt_nodes_base));
+ err = svn_error_compose_create(err, svn_sqlite__reset(stmt_nodes_work));
+#endif
+#endif
+
err = svn_error_compose_create(err, svn_sqlite__reset(stmt_base));
err = svn_error_compose_create(err, svn_sqlite__reset(stmt_work));
SVN_ERR(svn_error_compose_create(err, svn_sqlite__reset(stmt_act)));