Neil Bird <n...@jibbyjobby.co.uk> writes:

> "*** in database main ***
> On tree page 40898 cell 60: 2nd reference to page 325
> On tree page 40898 cell 60: Child page depth differs
> On tree page 40898 cell 61: Child page depth differs"
> "rowid 14277 missing from index sqlite_autoindex_PRISTINE_1"
> "rowid 14278 missing from index sqlite_autoindex_PRISTINE_1"
> "wrong # of entries in index sqlite_autoindex_PRISTINE_1"
> "rowid 45935 missing from index I_NODES_PARENT"
> "rowid 45935 missing from index sqlite_autoindex_NODES_1"
> "rowid 45936 missing from index I_NODES_PARENT"
> "rowid 45936 missing from index sqlite_autoindex_NODES_1"
> "rowid 469 missing from index I_NODES_PARENT"
> "rowid 469 missing from index sqlite_autoindex_NODES_1"
> "rowid 470 missing from index I_NODES_PARENT"
> "rowid 470 missing from index sqlite_autoindex_NODES_1"
> "rowid 471 missing from index I_NODES_PARENT"
> "rowid 471 missing from index sqlite_autoindex_NODES_1"
> "rowid 472 missing from index I_NODES_PARENT"
> "rowid 472 missing from index sqlite_autoindex_NODES_1"
> "wrong # of entries in index I_NODES_PARENT"
> "wrong # of entries in index sqlite_autoindex_NODES_1"

Interesting!  I've never seen a corrupt SQLite database before.  It
seems as if the corruption is restricted to the indices so it may be
recoverable.

It may be as simple as

sqlite .svn/wc.db "reindex nodes"
sqlite .svn/wc.db "reindex pristine"

but I don't know if that will work.  If it doesn't then it may be
possible to copy, drop, replace the tables.  This may not work either as
the index corruption may simply be the visible effect of larger
corruption.

sqlite3 .svn/wc.db "select sql from sqlite_master where name='NODES'"
sqlite3 .svn/wc.db "select sql from sqlite_master where name='I_NODES_PARENT'"

will show you the SQL for the table and index that need to be recreated.

Make a backup copy of wc.db before going further!

Create a duplicate table NODES_COPY:

sqlite3 .svn/wc.db "CREATE TABLE NODES_COPY (   wc_id  INTEGER NOT NULL 
REFERENCES WCROOT (id),   local_relpath  TEXT NOT NULL,   op_depth INTEGER NOT 
NULL,   parent_relpath  TEXT,   repos_id  INTEGER REFERENCES REPOSITORY (id),   
repos_path  TEXT,   revision  INTEGER,   presence TEXT NOT NULL,   moved_here  
INTEGER,   moved_to  TEXT,   kind  TEXT NOT NULL,   properties  BLOB,   depth  
TEXT,   checksum  TEXT REFERENCES PRISTINE (checksum),   symlink_target  TEXT,  
 changed_revision INTEGER,   changed_date      INTEGER,     changed_author    
TEXT, translated_size  INTEGER,   last_mod_time  INTEGER,     dav_cache  BLOB, 
file_external  TEXT,   PRIMARY KEY (wc_id, local_relpath, op_depth)   )"

Copy NODES into NODES_COPY

sqlite3 .svn/wc.db "insert into NODES_COPY select * from NODES"

Drop and recreate NODES:

sqlite3 .svn/wc.db "drop table NODES"

sqlite3 .svn/wc.db "CREATE TABLE NODES (   wc_id  INTEGER NOT NULL REFERENCES 
WCROOT (id),   local_relpath  TEXT NOT NULL,   op_depth INTEGER NOT NULL,   
parent_relpath  TEXT,   repos_id  INTEGER REFERENCES REPOSITORY (id),   
repos_path  TEXT,   revision  INTEGER,   presence TEXT NOT NULL,   moved_here  
INTEGER,   moved_to  TEXT,   kind  TEXT NOT NULL,   properties  BLOB,   depth  
TEXT,   checksum  TEXT REFERENCES PRISTINE (checksum),   symlink_target  TEXT,  
 changed_revision INTEGER,   changed_date      INTEGER,     changed_author    
TEXT, translated_size  INTEGER,   last_mod_time  INTEGER,     dav_cache  BLOB, 
file_external  TEXT,   PRIMARY KEY (wc_id, local_relpath, op_depth)   )"

sqlite3 .svn/wc.db "create index I_NODES_PARENT on NODES (wc_id, 
parent_relpath, op_depth)"

Copy NODES_COPY into NODES:

sqlite3 .svn/wc.db "insert into NODES select * from NODES_COPY"

Drop table NODES_COPY:

sqlite3 .svn/wc.db "drop table NODES_COPY"

Then you need to do something similar for PRISTINE, although this time
there is no extra index:

sqlite3 .svn/wc.db "select sql from sqlite_master where name='PRISTINE'"

Create PRISTINE_COPY
Copy PRISTINE into PRISTINE_COPY
Drop and recreate PRISTINE
Copy PRISTINE_COPY into PRISTINE
Drop PRISTINE_COPY

-- 
Philip

Reply via email to