Author: julianfoad
Date: Wed Dec  1 15:26:16 2010
New Revision: 1041051

URL: http://svn.apache.org/viewvc?rev=1041051&view=rev
Log:
Simplify the cleanup of unreferenced pristines by getting SQLite to
calculate the list of unreferenced checksums.  A follow-up to r1040663.
This makes no significant speed difference in my tests.

Suggested by: rhuijben

* subversion/libsvn_wc/wc-queries.sql
  (STMT_SELECT_PRISTINE_ROWS, STMT_SELECT_ALL_PRISTINE_REFERENCES): Remove.
  (STMT_SELECT_UNREFERENCED_PRISTINES): New query.

* subversion/libsvn_wc/wc_db.c
  (svn_wc__db_pristine_cleanup): Reduce to just a single loop over the
    unreferenced pristines.

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=1041051&r1=1041050&r2=1041051&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/trunk/subversion/libsvn_wc/wc-queries.sql Wed Dec  1 15:26:16 
2010
@@ -426,10 +426,6 @@ SELECT checksum
 FROM pristine
 WHERE md5_checksum = ?1
 
--- STMT_SELECT_PRISTINE_ROWS
-SELECT checksum
-FROM pristine
-
 -- STMT_SELECT_ANY_PRISTINE_REFERENCE
 SELECT 1 FROM nodes
   WHERE checksum = ?1 OR checksum = ?2
@@ -440,16 +436,19 @@ SELECT 1 FROM actual_node
     OR  right_checksum = ?1 OR right_checksum = ?2
 LIMIT 1
 
--- STMT_SELECT_ALL_PRISTINE_REFERENCES
+-- STMT_SELECT_UNREFERENCED_PRISTINES
+SELECT checksum
+FROM pristine
+EXCEPT
 SELECT checksum FROM nodes
   WHERE checksum IS NOT NULL
-UNION ALL
+EXCEPT
 SELECT older_checksum FROM actual_node
   WHERE older_checksum IS NOT NULL
-UNION ALL
+EXCEPT
 SELECT left_checksum FROM actual_node
   WHERE left_checksum  IS NOT NULL
-UNION ALL
+EXCEPT
 SELECT right_checksum FROM actual_node
   WHERE right_checksum IS NOT NULL
 

Modified: subversion/trunk/subversion/libsvn_wc/wc_db.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db.c?rev=1041051&r1=1041050&r2=1041051&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db.c Wed Dec  1 15:26:16 2010
@@ -2659,8 +2659,6 @@ svn_wc__db_pristine_cleanup(svn_wc__db_t
   svn_wc__db_pdh_t *pdh;
   const char *local_relpath;
   svn_sqlite__stmt_t *stmt;
-  apr_hash_t *sha1s = apr_hash_make(scratch_pool);
-  apr_hash_index_t *hi;
 
   SVN_ERR_ASSERT(svn_dirent_is_absolute(wri_abspath));
 
@@ -2669,28 +2667,9 @@ svn_wc__db_pristine_cleanup(svn_wc__db_t
                               scratch_pool, scratch_pool));
   VERIFY_USABLE_PDH(pdh);
 
-  /* Find all the pristines in the DB; store their SHA-1s in SHA1S. */
-  SVN_ERR(svn_sqlite__get_statement(&stmt, pdh->wcroot->sdb,
-                                    STMT_SELECT_PRISTINE_ROWS));
-  while (1)
-    {
-      svn_boolean_t have_row;
-      const svn_checksum_t *sha1_checksum;
-
-      SVN_ERR(svn_sqlite__step(&have_row, stmt));
-      if (! have_row)
-        break;
-
-      SVN_ERR(svn_sqlite__column_checksum(&sha1_checksum, stmt, 0,
-                                          scratch_pool));
-      apr_hash_set(sha1s, sha1_checksum->digest,
-                   svn_checksum_size(sha1_checksum), (void *)1);
-    }
-  SVN_ERR(svn_sqlite__reset(stmt));
-
-  /* Find all the referenced pristines; remove their SHA-1s from SHA1S. */
+  /* Find each unreferenced pristine in the DB and remove it. */
   SVN_ERR(svn_sqlite__get_statement(&stmt, pdh->wcroot->sdb,
-                                    STMT_SELECT_ALL_PRISTINE_REFERENCES));
+                                    STMT_SELECT_UNREFERENCED_PRISTINES));
   while (1)
     {
       svn_boolean_t have_row;
@@ -2702,29 +2681,9 @@ svn_wc__db_pristine_cleanup(svn_wc__db_t
 
       SVN_ERR(svn_sqlite__column_checksum(&sha1_checksum, stmt, 0,
                                           scratch_pool));
-      if (sha1_checksum->kind != svn_checksum_sha1)
-        {
-          /* ### Transitional. Should no longer be possible. */
-          SVN_ERR(svn_wc__db_pristine_get_sha1(&sha1_checksum, db, wri_abspath,
-                                               sha1_checksum,
-                                               scratch_pool, scratch_pool));
-        }
-      apr_hash_set(sha1s, sha1_checksum->digest,
-                   svn_checksum_size(sha1_checksum), NULL);
-    }
-  SVN_ERR(svn_sqlite__reset(stmt));
-
-  /* Remove each remaining pristine that is listed in SHA1S. */
-  for (hi = apr_hash_first(scratch_pool, sha1s);
-       hi; hi = apr_hash_next(hi))
-    {
-      const unsigned char *sha1_digest = svn__apr_hash_index_key(hi);
-      const svn_checksum_t *sha1_checksum
-        = svn_checksum__from_digest(sha1_digest, svn_checksum_sha1,
-                                    scratch_pool);
-
       SVN_ERR(pristine_remove(pdh, sha1_checksum, scratch_pool));
     }
+  SVN_ERR(svn_sqlite__reset(stmt));
 
   return SVN_NO_ERROR;
 }


Reply via email to