Artifact 6ab5a0bcde231e1433cac7413a824d9504e550c5:
File
src/rebuild.c
part of check-in
[eea381f416]
- Progress toward delta compression on the xfer protocol. The compression
works well. But the client is not telling the server what files it has
so the server does not have anything to delta against.
by
drh on
2007-08-09 03:19:18.
0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20 /*.** Copyright
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68 (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54 ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20 te it and/or.**
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20 modify it under
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76 lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65 ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 tributed in the
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 l be useful,.**
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20 but WITHOUT ANY
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54 * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52 Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55 A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20 RPOSE. See the
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50 GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 d have received
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72 g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69 ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65 te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20 ation, Inc., 59
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53 Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73 uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31 ton, MA 02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20 307, USA..**.**
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 nformation:.**
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 * http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 contains code u
0380: 73 65 64 20 74 6f 20 72 65 62 75 69 6c 64 20 74 sed to rebuild t
0390: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a he database..*/.
03a0: 23 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 #include "config
03b0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 72 65 .h".#include "re
03c0: 62 75 69 6c 64 2e 68 22 0a 23 69 6e 63 6c 75 64 build.h".#includ
03d0: 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 0a 2f e <assert.h>.../
03e0: 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 20 72 *.** COMMAND: r
03f0: 65 62 75 69 6c 64 0a 2a 2a 0a 2a 2a 20 52 65 63 ebuild.**.** Rec
0400: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65 6e 74 onstruct the ent
0410: 69 72 65 20 72 65 70 6f 73 69 74 6f 72 79 20 64 ire repository d
0420: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 74 68 65 atabase from the
0430: 20 63 6f 72 65 0a 2a 2a 20 72 65 63 6f 72 64 73 core.** records
0440: 2e 20 20 52 75 6e 20 74 68 69 73 20 63 6f 6d 6d . Run this comm
0450: 61 6e 64 20 61 66 74 65 72 20 75 70 64 61 74 69 and after updati
0460: 6e 67 20 74 68 65 20 66 6f 73 73 69 6c 0a 2a 2a ng the fossil.**
0470: 20 65 78 65 63 75 74 61 62 6c 65 20 69 6e 20 61 executable in a
0480: 20 77 61 79 20 74 68 61 74 20 63 68 61 6e 67 65 way that change
0490: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 s the database s
04a0: 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f 69 64 20 72 chema..*/.void r
04b0: 65 62 75 69 6c 64 5f 64 61 74 61 62 61 73 65 28 ebuild_database(
04c0: 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 73 3b void){. Stmt s;
04d0: 0a 20 20 69 6e 74 20 65 72 72 43 6e 74 3b 0a 20 . int errCnt;.
04e0: 20 69 6e 74 20 66 6f 72 63 65 46 6c 61 67 3b 0a int forceFlag;.
04f0: 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a char *zTable;.
0500: 0a 20 20 66 6f 72 63 65 46 6c 61 67 20 3d 20 66 . forceFlag = f
0510: 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 66 6f 72 63 ind_option("forc
0520: 65 22 2c 22 66 22 2c 30 29 21 3d 30 3b 0a 20 20 e","f",0)!=0;.
0530: 69 66 28 20 67 2e 61 72 67 63 21 3d 33 20 29 7b if( g.argc!=3 ){
0540: 0a 20 20 20 20 75 73 61 67 65 28 22 52 45 50 4f . usage("REPO
0550: 53 49 54 4f 52 59 2d 46 49 4c 45 4e 41 4d 45 22 SITORY-FILENAME"
0560: 29 3b 0a 20 20 7d 0a 20 20 65 72 72 43 6e 74 20 );. }. errCnt
0570: 3d 20 30 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 72 = 0;. db_open_r
0580: 65 70 6f 73 69 74 6f 72 79 28 67 2e 61 72 67 76 epository(g.argv
0590: 5b 32 5d 29 3b 0a 20 20 64 62 5f 62 65 67 69 6e [2]);. db_begin
05a0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a _transaction();.
05b0: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 db_multi_exec(
05c0: 0a 20 20 20 20 22 43 52 45 41 54 45 20 49 4e 44 . "CREATE IND
05d0: 45 58 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 EX IF NOT EXISTS
05e0: 20 64 65 6c 74 61 5f 69 31 20 4f 4e 20 64 65 6c delta_i1 ON del
05f0: 74 61 28 73 72 63 69 64 29 3b 22 0a 20 20 29 3b ta(srcid);". );
0600: 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 . for(;;){.
0610: 7a 54 61 62 6c 65 20 3d 20 64 62 5f 74 65 78 74 zTable = db_text
0620: 28 30 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 (0,. "SELE
0630: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c CT name FROM sql
0640: 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 ite_master".
0650: 20 20 20 22 20 57 48 45 52 45 20 74 79 70 65 3d " WHERE type=
0660: 27 74 61 62 6c 65 27 22 0a 20 20 20 20 20 20 20 'table'".
0670: 22 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 49 " AND name NOT I
0680: 4e 20 28 27 62 6c 6f 62 27 2c 27 64 65 6c 74 61 N ('blob','delta
0690: 27 2c 27 72 63 76 66 72 6f 6d 27 2c 27 75 73 65 ','rcvfrom','use
06a0: 72 27 2c 27 63 6f 6e 66 69 67 27 29 22 29 3b 0a r','config')");.
06b0: 20 20 20 20 69 66 28 20 7a 54 61 62 6c 65 3d 3d if( zTable==
06c0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 0 ) break;. d
06d0: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 52 b_multi_exec("DR
06e0: 4f 50 20 54 41 42 4c 45 20 25 51 22 2c 20 7a 54 OP TABLE %Q", zT
06f0: 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65 65 28 able);. free(
0700: 7a 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 64 zTable);. }. d
0710: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 7a 52 65 b_multi_exec(zRe
0720: 70 6f 73 69 74 6f 72 79 53 63 68 65 6d 61 32 29 positorySchema2)
0730: 3b 0a 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 ;.. db_prepare(
0740: 26 73 2c 20 22 53 45 4c 45 43 54 20 72 69 64 20 &s, "SELECT rid
0750: 46 52 4f 4d 20 62 6c 6f 62 22 29 3b 0a 20 20 77 FROM blob");. w
0760: 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 73 hile( db_step(&s
0770: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b )==SQLITE_ROW ){
0780: 0a 20 20 20 20 69 6e 74 20 72 69 64 20 3d 20 64 . int rid = d
0790: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 73 2c b_column_int(&s,
07a0: 20 30 29 3b 0a 20 20 20 20 42 6c 6f 62 20 63 6f 0);. Blob co
07b0: 6e 74 65 6e 74 3b 0a 20 20 20 20 63 6f 6e 74 65 ntent;. conte
07c0: 6e 74 5f 67 65 74 28 72 69 64 2c 20 26 63 6f 6e nt_get(rid, &con
07d0: 74 65 6e 74 29 3b 0a 20 20 20 20 6d 61 6e 69 66 tent);. manif
07e0: 65 73 74 5f 63 72 6f 73 73 6c 69 6e 6b 28 72 69 est_crosslink(ri
07f0: 64 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 d, &content);.
0800: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 6f blob_reset(&co
0810: 6e 74 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 ntent);. }.. i
0820: 66 28 20 65 72 72 43 6e 74 20 26 26 20 21 66 6f f( errCnt && !fo
0830: 72 63 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 70 rceFlag ){. p
0840: 72 69 6e 74 66 28 22 25 64 20 65 72 72 6f 72 73 rintf("%d errors
0850: 2e 20 52 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 63 . Rolling back c
0860: 68 61 6e 67 65 73 2e 20 55 73 65 20 2d 2d 66 6f hanges. Use --fo
0870: 72 63 65 20 74 6f 20 66 6f 72 63 65 20 61 20 63 rce to force a c
0880: 6f 6d 6d 69 74 2e 5c 6e 22 2c 0a 20 20 20 20 20 ommit.\n",.
0890: 20 20 20 20 20 20 20 65 72 72 43 6e 74 29 3b 0a errCnt);.
08a0: 20 20 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 db_end_trans
08b0: 61 63 74 69 6f 6e 28 31 29 3b 0a 20 20 7d 65 6c action(1);. }el
08c0: 73 65 7b 0a 20 20 20 20 64 62 5f 65 6e 64 5f 74 se{. db_end_t
08d0: 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 ransaction(0);.
08e0: 20 7d 0a 7d 0a }.}.