Fossil
Hex Artifact Content
Not logged in

Artifact 72deb4bbbdd92f83fce494cc44f4ca5c0d88a468:

Attachment "rebuild.diff" to ticket [5199df97bc] added by anonymous 2010-10-05 15:40:31.
0000: 2d 2d 2d 20 72 65 62 75 69 6c 64 2e 63 0a 2b 2b  --- rebuild.c.++
0010: 2b 20 72 65 62 75 69 6c 64 2e 63 0a 40 40 20 2d  + rebuild.c.@@ -
0020: 35 30 36 2c 31 37 20 2b 35 30 36 2c 31 32 30 20  506,17 +506,120 
0030: 40 40 0a 20 20 20 2f 2a 20 53 6b 69 70 20 74 68  @@.   /* Skip th
0040: 65 20 76 65 72 69 66 79 5f 62 65 66 6f 72 65 5f  e verify_before_
0050: 63 6f 6d 6d 69 74 28 29 20 73 74 65 70 20 6f 6e  commit() step on
0060: 20 61 20 72 65 63 6f 6e 73 74 72 75 63 74 2e 20   a reconstruct. 
0070: 20 4d 6f 73 74 20 61 72 74 69 66 61 63 74 73 0a   Most artifacts.
0080: 20 20 20 2a 2a 20 77 69 6c 6c 20 68 61 76 65 20     ** will have 
0090: 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
00a0: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 74 68   verification th
00b0: 65 72 65 66 6f 72 65 20 74 61 6b 65 73 20 61 20  erefore takes a 
00c0: 72 65 61 6c 6c 79 2c 20 72 65 61 6c 6c 79 0a 20  really, really. 
00d0: 20 20 2a 2a 20 6c 6f 6e 67 20 74 69 6d 65 2e 0a    ** long time..
00e0: 20 20 20 2a 2f 0a 20 20 20 76 65 72 69 66 79 5f     */.   verify_
00f0: 63 61 6e 63 65 6c 28 29 3b 0a 2d 20 20 0a 2b 0a  cancel();.-  .+.
0100: 2b 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61  +  db_end_transa
0110: 63 74 69 6f 6e 28 30 29 3b 0a 2b 20 20 70 72 69  ction(0);.+  pri
0120: 6e 74 66 28 22 70 72 6f 6a 65 63 74 2d 69 64 3a  ntf("project-id:
0130: 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28 22   %s\n", db_get("
0140: 70 72 6f 6a 65 63 74 2d 63 6f 64 65 22 2c 20 30  project-code", 0
0150: 29 29 3b 0a 2b 20 20 70 72 69 6e 74 66 28 22 73  ));.+  printf("s
0160: 65 72 76 65 72 2d 69 64 3a 20 25 73 5c 6e 22 2c  erver-id: %s\n",
0170: 20 64 62 5f 67 65 74 28 22 73 65 72 76 65 72 2d   db_get("server-
0180: 63 6f 64 65 22 2c 20 30 29 29 3b 0a 2b 20 20 7a  code", 0));.+  z
0190: 50 61 73 73 77 6f 72 64 20 3d 20 64 62 5f 74 65  Password = db_te
01a0: 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 70 77  xt(0, "SELECT pw
01b0: 20 46 52 4f 4d 20 75 73 65 72 20 57 48 45 52 45   FROM user WHERE
01c0: 20 6c 6f 67 69 6e 3d 25 51 22 2c 20 67 2e 7a 4c   login=%Q", g.zL
01d0: 6f 67 69 6e 29 3b 0a 2b 20 20 70 72 69 6e 74 66  ogin);.+  printf
01e0: 28 22 61 64 6d 69 6e 2d 75 73 65 72 3a 20 25 73  ("admin-user: %s
01f0: 20 28 69 6e 69 74 69 61 6c 20 70 61 73 73 77 6f   (initial passwo
0200: 72 64 20 69 73 20 5c 22 25 73 5c 22 29 5c 6e 22  rd is \"%s\")\n"
0210: 2c 20 67 2e 7a 4c 6f 67 69 6e 2c 20 7a 50 61 73  , g.zLogin, zPas
0220: 73 77 6f 72 64 29 3b 0a 2b 7d 0a 2b 0a 2b 23 69  sword);.+}.+.+#i
0230: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
0240: 68 22 0a 2b 23 69 6e 63 6c 75 64 65 20 3c 7a 6c  h".+#include <zl
0250: 69 62 2e 68 3e 0a 2b 0a 2b 2f 2a 0a 2b 2a 2a 20  ib.h>.+.+/*.+** 
0260: 43 4f 4d 4d 41 4e 44 3a 20 72 65 63 6f 6e 73 74  COMMAND: reconst
0270: 72 75 63 74 2d 73 71 6c 0a 2b 2a 2a 0a 2b 2a 2a  ruct-sql.+**.+**
0280: 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20   Usage: %fossil 
0290: 72 65 63 6f 6e 73 74 72 75 63 74 2d 73 71 6c 20  reconstruct-sql 
02a0: 52 45 50 4f 53 49 54 4f 52 59 20 43 4f 4e 54 45  REPOSITORY CONTE
02b0: 4e 54 2d 44 41 54 41 42 41 53 45 0a 2b 2a 2a 0a  NT-DATABASE.+**.
02c0: 2b 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  +** This command
02d0: 20 69 6d 70 6f 72 74 73 20 61 72 74 69 66 69 63   imports artific
02e0: 61 74 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  ats from the sql
02f0: 69 74 65 33 20 64 61 74 61 62 61 73 65 0a 2b 2a  ite3 database.+*
0300: 2a 20 43 4f 4e 54 45 4e 54 2d 44 41 54 41 42 41  * CONTENT-DATABA
0310: 53 45 20 61 6e 64 20 72 65 63 6f 6e 73 74 72 75  SE and reconstru
0320: 63 74 73 20 74 68 65 20 66 6f 73 73 69 6c 20 72  cts the fossil r
0330: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 6d 2e  ecord from them.
0340: 0a 2b 2a 2a 20 49 74 20 70 6c 61 63 65 73 20 74  .+** It places t
0350: 68 65 20 6e 65 77 20 66 6f 73 73 69 6c 20 72 65  he new fossil re
0360: 70 6f 73 69 74 6f 72 79 20 69 6e 20 52 45 50 4f  pository in REPO
0370: 53 49 54 4f 52 59 2e 0a 2b 2a 2a 0a 2b 2a 2a 20  SITORY..+**.+** 
0380: 43 4f 4e 54 45 4e 54 2d 44 41 54 41 42 41 53 45  CONTENT-DATABASE
0390: 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20   is expected to 
03a0: 68 61 76 65 20 61 20 6e 6f 6e 2d 65 6d 70 74 79  have a non-empty
03b0: 20 74 61 62 6c 65 20 22 63 6f 6e 74 65 6e 74 22   table "content"
03c0: 0a 2b 2a 2a 20 77 69 74 68 20 63 6f 6c 75 6d 6e  .+** with column
03d0: 73 20 22 63 6f 6e 74 65 6e 74 22 20 61 6e 64 20  s "content" and 
03e0: 22 73 69 7a 65 22 2e 20 22 63 6f 6e 74 65 6e 74  "size". "content
03f0: 22 20 69 73 20 74 68 65 20 7a 6c 69 62 2d 63 6f  " is the zlib-co
0400: 6d 70 72 65 73 73 65 64 0a 2b 2a 2a 20 61 72 74  mpressed.+** art
0410: 69 66 61 63 74 20 61 6e 64 20 22 73 69 7a 65 22  ifact and "size"
0420: 20 74 68 65 20 75 6e 63 6f 6d 70 72 65 73 73 65   the uncompresse
0430: 64 20 73 69 7a 65 2e 0a 2b 2a 2a 0a 2b 2a 2f 0a  d size..+**.+*/.
0440: 2b 76 6f 69 64 20 72 65 63 6f 6e 73 74 72 75 63  +void reconstruc
0450: 74 5f 73 71 6c 5f 63 6d 64 28 76 6f 69 64 29 20  t_sql_cmd(void) 
0460: 7b 0a 2b 20 20 42 6c 6f 62 20 61 43 6f 6e 74 65  {.+  Blob aConte
0470: 6e 74 3b 0a 2b 20 20 73 71 6c 69 74 65 33 20 2a  nt;.+  sqlite3 *
0480: 64 62 3b 0a 2b 20 20 73 71 6c 69 74 65 33 5f 73  db;.+  sqlite3_s
0490: 74 6d 74 20 2a 73 74 6d 74 3b 0a 2b 20 20 69 6e  tmt *stmt;.+  in
04a0: 74 20 72 76 3b 0a 2b 20 20 69 6e 74 20 63 6f 75  t rv;.+  int cou
04b0: 6e 74 2c 20 74 6f 74 61 6c 3b 0a 2b 20 20 63 68  nt, total;.+  ch
04c0: 61 72 20 2a 7a 50 61 73 73 77 6f 72 64 3b 0a 2b  ar *zPassword;.+
04d0: 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d 34 20    if( g.argc!=4 
04e0: 29 7b 0a 2b 20 20 20 20 75 73 61 67 65 28 22 52  ){.+    usage("R
04f0: 45 50 4f 53 49 54 4f 52 59 20 43 4f 4e 54 45 4e  EPOSITORY CONTEN
0500: 54 2d 44 41 54 41 42 41 53 45 22 29 3b 0a 2b 20  T-DATABASE");.+ 
0510: 20 7d 0a 2b 0a 2b 20 20 69 66 28 20 73 71 6c 69   }.+.+  if( sqli
0520: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 67 2e 61 72  te3_open_v2(g.ar
0530: 67 76 5b 33 5d 2c 20 26 64 62 2c 20 53 51 4c 49  gv[3], &db, SQLI
0540: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
0550: 2c 20 20 4e 55 4c 4c 29 20 29 7b 0a 2b 20 20 20  ,  NULL) ){.+   
0560: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
0570: 20 22 64 61 74 61 62 61 73 65 20 6f 70 65 6e 20   "database open 
0580: 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73  failed: %s\n", s
0590: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
05a0: 29 29 3b 0a 2b 20 20 20 20 65 78 69 74 28 31 29  ));.+    exit(1)
05b0: 3b 0a 2b 20 20 7d 0a 2b 0a 2b 20 20 69 66 28 20  ;.+  }.+.+  if( 
05c0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
05d0: 64 62 2c 20 22 53 45 4c 45 43 54 20 43 4f 55 4e  db, "SELECT COUN
05e0: 54 28 2a 29 20 46 52 4f 4d 20 63 6f 6e 74 65 6e  T(*) FROM conten
05f0: 74 22 2c 20 2d 31 2c 20 26 73 74 6d 74 2c 20 4e  t", -1, &stmt, N
0600: 55 4c 4c 29 20 29 7b 0a 2b 20 20 20 20 66 70 72  ULL) ){.+    fpr
0610: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 70 72  intf(stderr, "pr
0620: 65 70 61 72 65 20 66 61 69 6c 65 64 5c 6e 22 29  epare failed\n")
0630: 3b 0a 2b 20 20 20 20 65 78 69 74 28 31 29 3b 0a  ;.+    exit(1);.
0640: 2b 20 20 7d 0a 2b 20 20 69 66 28 20 73 71 6c 69  +  }.+  if( sqli
0650: 74 65 33 5f 73 74 65 70 28 73 74 6d 74 29 20 21  te3_step(stmt) !
0660: 3d 20 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  = SQLITE_ROW ){.
0670: 2b 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  +    fprintf(std
0680: 65 72 72 2c 20 22 73 74 65 70 20 66 61 69 6c 65  err, "step faile
0690: 64 5c 6e 22 29 3b 0a 2b 20 20 20 20 65 78 69 74  d\n");.+    exit
06a0: 28 31 29 3b 0a 2b 20 20 7d 0a 2b 20 20 74 6f 74  (1);.+  }.+  tot
06b0: 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
06c0: 75 6d 6e 5f 69 6e 74 28 73 74 6d 74 2c 20 30 29  umn_int(stmt, 0)
06d0: 3b 0a 2b 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  ;.+  sqlite3_fin
06e0: 61 6c 69 7a 65 28 73 74 6d 74 29 3b 0a 2b 0a 2b  alize(stmt);.+.+
06f0: 20 20 69 66 28 20 21 74 6f 74 61 6c 20 29 7b 0a    if( !total ){.
0700: 2b 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  +    fprintf(std
0710: 65 72 72 2c 20 22 64 61 74 61 62 61 73 65 20 63  err, "database c
0720: 6f 6e 74 61 69 6e 73 20 6e 6f 20 61 72 74 69 66  ontains no artif
0730: 61 63 74 73 5c 6e 22 29 3b 0a 2b 20 20 20 20 65  acts\n");.+    e
0740: 78 69 74 28 31 29 3b 0a 2b 20 20 7d 0a 2b 0a 2b  xit(1);.+  }.+.+
0750: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 70 72    if( sqlite3_pr
0760: 65 70 61 72 65 28 64 62 2c 20 22 53 45 4c 45 43  epare(db, "SELEC
0770: 54 20 63 6f 6e 74 65 6e 74 2c 73 69 7a 65 20 46  T content,size F
0780: 52 4f 4d 20 63 6f 6e 74 65 6e 74 22 2c 20 2d 31  ROM content", -1
0790: 2c 20 26 73 74 6d 74 2c 20 4e 55 4c 4c 29 20 29  , &stmt, NULL) )
07a0: 7b 0a 2b 20 20 20 20 66 70 72 69 6e 74 66 28 73  {.+    fprintf(s
07b0: 74 64 65 72 72 2c 20 22 70 72 65 70 61 72 65 20  tderr, "prepare 
07c0: 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 2b 20 20 20  failed\n");.+   
07d0: 20 65 78 69 74 28 31 29 3b 0a 2b 20 20 7d 0a 2b   exit(1);.+  }.+
07e0: 0a 2b 20 20 64 62 5f 63 72 65 61 74 65 5f 72 65  .+  db_create_re
07f0: 70 6f 73 69 74 6f 72 79 28 67 2e 61 72 67 76 5b  pository(g.argv[
0800: 32 5d 29 3b 0a 2b 20 20 64 62 5f 6f 70 65 6e 5f  2]);.+  db_open_
0810: 72 65 70 6f 73 69 74 6f 72 79 28 67 2e 61 72 67  repository(g.arg
0820: 76 5b 32 5d 29 3b 0a 2b 20 20 64 62 5f 6f 70 65  v[2]);.+  db_ope
0830: 6e 5f 63 6f 6e 66 69 67 28 30 29 3b 0a 2b 20 20  n_config(0);.+  
0840: 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  db_begin_transac
0850: 74 69 6f 6e 28 29 3b 0a 2b 20 20 64 62 5f 69 6e  tion();.+  db_in
0860: 69 74 69 61 6c 5f 73 65 74 75 70 28 30 2c 20 30  itial_setup(0, 0
0870: 2c 20 31 29 3b 0a 2b 0a 2b 20 20 63 6f 75 6e 74  , 1);.+.+  count
0880: 20 3d 20 30 3b 0a 2b 20 20 77 68 69 6c 65 28 20   = 0;.+  while( 
0890: 28 72 76 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  (rv = sqlite3_st
08a0: 65 70 28 73 74 6d 74 29 29 20 3d 3d 20 53 51 4c  ep(stmt)) == SQL
08b0: 49 54 45 5f 52 4f 57 20 29 7b 0a 2b 20 20 20 20  ITE_ROW ){.+    
08c0: 75 4c 6f 6e 67 66 20 73 7a 3b 0a 2b 20 20 20 20  uLongf sz;.+    
08d0: 69 6e 74 20 72 76 3b 0a 2b 20 20 20 20 62 6c 6f  int rv;.+    blo
08e0: 62 5f 69 6e 69 74 28 26 61 43 6f 6e 74 65 6e 74  b_init(&aContent
08f0: 2c 20 30 2c 20 30 29 3b 0a 2b 20 20 20 20 73 7a  , 0, 0);.+    sz
0900: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
0910: 6e 5f 69 6e 74 28 73 74 6d 74 2c 20 31 29 3b 0a  n_int(stmt, 1);.
0920: 2b 20 20 20 20 62 6c 6f 62 5f 72 65 73 69 7a 65  +    blob_resize
0930: 28 26 61 43 6f 6e 74 65 6e 74 2c 20 73 7a 29 3b  (&aContent, sz);
0940: 0a 2b 20 20 20 20 72 76 3d 20 75 6e 63 6f 6d 70  .+    rv= uncomp
0950: 72 65 73 73 28 28 75 6e 73 69 67 6e 65 64 20 63  ress((unsigned c
0960: 68 61 72 20 2a 29 62 6c 6f 62 5f 62 75 66 66 65  har *)blob_buffe
0970: 72 28 26 61 43 6f 6e 74 65 6e 74 29 2c 20 26 73  r(&aContent), &s
0980: 7a 2c 0a 2b 09 73 71 6c 69 74 65 33 5f 63 6f 6c  z,.+.sqlite3_col
0990: 75 6d 6e 5f 62 6c 6f 62 28 73 74 6d 74 2c 20 30  umn_blob(stmt, 0
09a0: 29 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ), sqlite3_colum
09b0: 6e 5f 62 79 74 65 73 28 73 74 6d 74 2c 20 30 29  n_bytes(stmt, 0)
09c0: 29 3b 0a 2b 20 20 20 20 69 66 28 20 72 76 20 21  );.+    if( rv !
09d0: 3d 20 5a 5f 4f 4b 20 7c 7c 20 73 7a 20 21 3d 20  = Z_OK || sz != 
09e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
09f0: 6e 74 28 73 74 6d 74 2c 31 29 29 7b 0a 2b 20 20  nt(stmt,1)){.+  
0a00: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
0a10: 72 72 2c 20 22 44 65 63 6f 6d 70 72 65 73 73 69  rr, "Decompressi
0a20: 6f 6e 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 2b  on failed\n");.+
0a30: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 2b        exit(1);.+
0a40: 20 20 20 20 7d 0a 2b 20 20 20 20 63 6f 6e 74 65      }.+    conte
0a50: 6e 74 5f 70 75 74 28 26 61 43 6f 6e 74 65 6e 74  nt_put(&aContent
0a60: 2c 20 30 2c 20 30 29 3b 0a 2b 20 20 20 20 62 6c  , 0, 0);.+    bl
0a70: 6f 62 5f 72 65 73 65 74 28 26 61 43 6f 6e 74 65  ob_reset(&aConte
0a80: 6e 74 29 3b 0a 2b 20 20 20 20 2b 2b 63 6f 75 6e  nt);.+    ++coun
0a90: 74 3b 0a 2b 20 20 20 20 70 72 69 6e 74 66 28 22  t;.+    printf("
0aa0: 25 64 20 28 25 64 25 25 29 2e 2e 2e 5c 72 22 2c  %d (%d%%)...\r",
0ab0: 20 63 6f 75 6e 74 2c 20 28 63 6f 75 6e 74 20 2a   count, (count *
0ac0: 20 31 30 30 29 20 2f 20 74 6f 74 61 6c 29 3b 0a   100) / total);.
0ad0: 2b 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f  +    fflush(stdo
0ae0: 75 74 29 3b 0a 2b 20 20 7d 0a 2b 20 20 70 72 69  ut);.+  }.+  pri
0af0: 6e 74 66 28 22 5c 6e 22 29 3b 0a 2b 0a 2b 20 20  ntf("\n");.+.+  
0b00: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
0b10: 28 73 74 6d 74 29 3b 0a 2b 20 20 73 71 6c 69 74  (stmt);.+  sqlit
0b20: 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 2b 0a  e3_close(db);.+.
0b30: 2b 20 20 72 65 62 75 69 6c 64 5f 64 62 28 30 2c  +  rebuild_db(0,
0b40: 20 31 29 3b 0a 2b 0a 2b 20 20 2f 2a 20 53 6b 69   1);.+.+  /* Ski
0b50: 70 20 74 68 65 20 76 65 72 69 66 79 5f 62 65 66  p the verify_bef
0b60: 6f 72 65 5f 63 6f 6d 6d 69 74 28 29 20 73 74 65  ore_commit() ste
0b70: 70 20 6f 6e 20 61 20 72 65 63 6f 6e 73 74 72 75  p on a reconstru
0b80: 63 74 2e 20 20 4d 6f 73 74 20 61 72 74 69 66 61  ct.  Most artifa
0b90: 63 74 73 0a 2b 20 20 2a 2a 20 77 69 6c 6c 20 68  cts.+  ** will h
0ba0: 61 76 65 20 62 65 65 6e 20 63 68 61 6e 67 65 64  ave been changed
0bb0: 20 61 6e 64 20 76 65 72 69 66 69 63 61 74 69 6f   and verificatio
0bc0: 6e 20 74 68 65 72 65 66 6f 72 65 20 74 61 6b 65  n therefore take
0bd0: 73 20 61 20 72 65 61 6c 6c 79 2c 20 72 65 61 6c  s a really, real
0be0: 6c 79 0a 2b 20 20 2a 2a 20 6c 6f 6e 67 20 74 69  ly.+  ** long ti
0bf0: 6d 65 2e 0a 2b 20 20 2a 2f 0a 2b 20 20 76 65 72  me..+  */.+  ver
0c00: 69 66 79 5f 63 61 6e 63 65 6c 28 29 3b 0a 2b 0a  ify_cancel();.+.
0c10: 20 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61     db_end_transa
0c20: 63 74 69 6f 6e 28 30 29 3b 0a 2b 20 20 70 72 69  ction(0);.+  pri
0c30: 6e 74 66 28 22 52 75 6e 6e 69 6e 67 20 56 41 43  ntf("Running VAC
0c40: 55 55 4d 2e 2e 2e 5c 6e 22 29 3b 0a 2b 20 20 64  UUM...\n");.+  d
0c50: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 56 41  b_multi_exec("VA
0c60: 43 55 55 4d 3b 22 29 3b 0a 2b 0a 20 20 20 70 72  CUUM;");.+.   pr
0c70: 69 6e 74 66 28 22 70 72 6f 6a 65 63 74 2d 69 64  intf("project-id
0c80: 3a 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28  : %s\n", db_get(
0c90: 22 70 72 6f 6a 65 63 74 2d 63 6f 64 65 22 2c 20  "project-code", 
0ca0: 30 29 29 3b 0a 20 20 20 70 72 69 6e 74 66 28 22  0));.   printf("
0cb0: 73 65 72 76 65 72 2d 69 64 3a 20 25 73 5c 6e 22  server-id: %s\n"
0cc0: 2c 20 64 62 5f 67 65 74 28 22 73 65 72 76 65 72  , db_get("server
0cd0: 2d 63 6f 64 65 22 2c 20 30 29 29 3b 0a 20 20 20  -code", 0));.   
0ce0: 7a 50 61 73 73 77 6f 72 64 20 3d 20 64 62 5f 74  zPassword = db_t
0cf0: 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 70  ext(0, "SELECT p
0d00: 77 20 46 52 4f 4d 20 75 73 65 72 20 57 48 45 52  w FROM user WHER
0d10: 45 20 6c 6f 67 69 6e 3d 25 51 22 2c 20 67 2e 7a  E login=%Q", g.z
0d20: 4c 6f 67 69 6e 29 3b 0a 20 20 20 70 72 69 6e 74  Login);.   print
0d30: 66 28 22 61 64 6d 69 6e 2d 75 73 65 72 3a 20 25  f("admin-user: %
0d40: 73 20 28 69 6e 69 74 69 61 6c 20 70 61 73 73 77  s (initial passw
0d50: 6f 72 64 20 69 73 20 5c 22 25 73 5c 22 29 5c 6e  ord is \"%s\")\n
0d60: 22 2c 20 67 2e 7a 4c 6f 67 69 6e 2c 20 7a 50 61  ", g.zLogin, zPa
0d70: 73 73 77 6f 72 64 29 3b 0a 20 7d 0a 2b 0a 20 0a  ssword);. }.+. .
0d80: 20 2f 2a 0a 20 2a 2a 20 43 4f 4d 4d 41 4e 44 3a   /*. ** COMMAND:
0d90: 20 64 65 63 6f 6e 73 74 72 75 63 74 0a 20 2a 2a   deconstruct. **
0da0: 0a 20 2a 2a 20 55 73 61 67 65 20 25 66 6f 73 73  . ** Usage %foss
0db0: 69 6c 20 64 65 63 6f 6e 73 74 72 75 63 74 20 3f  il deconstruct ?
0dc0: 2d 52 7c 2d 2d 72 65 70 6f 73 69 74 6f 72 79 20  -R|--repository 
0dd0: 52 45 50 4f 53 49 54 4f 52 59 3f 20 3f 2d 4c 7c  REPOSITORY? ?-L|
0de0: 2d 2d 70 72 65 66 69 78 6c 65 6e 67 74 68 20 4e  --prefixlength N
0df0: 3f 20 44 45 53 54 49 4e 41 54 49 4f 4e 0a 0a     ? DESTINATION..