| "Single DB" in this context means one SQLite DB in the root of each working |
| copy. |
| |
| |
| Build and Test |
| ============== |
| |
| To build with experimental single-DB support: |
| define SINGLE_DB ("CFLAGS=-DSINGLE_DB configure ...") |
| define SVN_WC__VERSION to 18 in wc.h |
| |
| Current test results (r960984): |
| most/all C tests pass |
| half of the Python tests fail; common errors are |
| Wrong results but no error message. |
| Error: columns wc_id, local_dir_relpath are not unique |
| Error: No write-lock in '...' |
| Crash. |
| |
| |
| Upgrade: Migration of DB tables from subdir DBs to wcroot DB |
| ============================================================ |
| |
| "Move into wcroot's table" means move each row into the same table in the WC |
| root's DB; we expect the primary key to be unique - not already in the |
| wcroot table. |
| |
| REPOSITORY |
| |
| Merge into wcroot's table: |
| move the row into the wcroot's REPOSITORY table, unless a row that's |
| identical (apart from its id) is already present, in which case take the |
| existing wcroot row's id. |
| |
| Change all repos id's accordingly in the other tables being migrated: |
| BASE_NODE.repos_id |
| WORKING_NODE.copyfrom_repos_id |
| LOCK.repos_id |
| # and in tree conflict info? |
| |
| Note: The existence of more than one repository id in a working copy |
| arises when "svn switch --relocate" is used. A new repository table row |
| is created, with the new repository URL and a new id (say repos_id = 2). |
| Any new versioned directories that are created after that have the new |
| repository URL but with repos-id = 1. Hence the need to merge the tables. |
| |
| WCROOT |
| |
| Ignore this table. (It always has just one row, with a default id and a |
| null local_abspath.) |
| |
| BASE_NODE |
| |
| Move into wcroot's table; |
| omit if .kind == subdir |
| change .local_relpath |
| set .parent_relpath |
| |
| WORKING_NODE |
| |
| Move into wcroot's table; |
| omit if .kind == subdir (?) |
| change .local_relpath |
| set .parent_relpath |
| |
| Note from Greg: |
| Generally, ignoring subdir might be okay in these two tables [BASE_NODE, |
| WORKING_NODE], but the not-present value is used/important. |
| |
| ACTUAL_NODE |
| |
| Move into wcroot's table; |
| change .local_relpath |
| set .parent_relpath |
| |
| LOCK |
| |
| Move into wcroot's table. |
| |
| PRISTINE |
| |
| Move into wcroot's table. |
| Move the corresponding pristine text files into wcroot's 'pristine' dir. |
| Change wcroot's pristine directory to sharded (or this could be a |
| separate upgrade). |
| |
| WC_LOCK |
| |
| Ignore this table. (Ensure it is empty. If not, 'svn cleanup' should be |
| run.) |
| |
| WORK_QUEUE |
| |
| Ignore this table. (Ensure it is empty. If not, 'svn cleanup' should be |
| run.) |
| |
| |
| Code Changes Required |
| ===================== |
| |
| Greg says: An area to examine is all of the uses of db_status_obstructed, |
| db_status_obstructed_(add|delete). Those should not occur in single-db, so |
| anything that sets those status values or checks for them is suspect. (I'd |
| #ifdef them away, for example, then patch all references). |
| |