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;
}