Fossil

Hex Artifact Content
Login

Artifact d4c698ad253b9d53422dfe622404cd8b3f4d22d2:


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 36 20 44 2e 20 52 69 63 68  (c) 2006 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 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20   Simplified BSD 
00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a  License (also.**
00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32   known as the "2
00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22  -Clause License"
00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63   or "FreeBSD Lic
00e0: 65 6e 73 65 22 2e 29 0a 0a 2a 2a 20 54 68 69 73  ense".)..** This
00f0: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74   program is dist
0100: 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68  ributed in the h
0110: 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c  ope that it will
0120: 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62   be useful,.** b
0130: 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79 20 77  ut without any w
0140: 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f 75 74  arranty; without
0150: 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65   even the implie
0160: 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a  d warranty of.**
0170: 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 74 79   merchantability
0180: 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f 72 20   or fitness for 
0190: 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 72  a particular pur
01a0: 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 74 68  pose..**.** Auth
01b0: 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 6f 72  or contact infor
01c0: 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 72 68  mation:.**   drh
01d0: 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 20 20  @hwaci.com.**   
01e0: 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 63 69  http://www.hwaci
01f0: 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a  .com/drh/.**.***
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
0250: 2a 2a 20 43 6f 64 65 20 66 6f 72 20 69 6e 74 65  ** Code for inte
0260: 72 66 61 63 69 6e 67 20 74 6f 20 74 68 65 20 76  rfacing to the v
0270: 61 72 69 6f 75 73 20 64 61 74 61 62 61 73 65 73  arious databases
0280: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
0290: 65 20 74 68 72 65 65 20 73 65 70 61 72 61 74 65  e three separate
02a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
02b0: 74 68 61 74 20 66 6f 73 73 69 6c 20 69 6e 74 65  that fossil inte
02c0: 72 61 63 74 73 0a 2a 2a 20 77 69 74 68 3a 0a 2a  racts.** with:.*
02d0: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
02e0: 20 22 75 73 65 72 22 20 64 61 74 61 62 61 73 65   "user" database
02f0: 20 69 6e 20 7e 2f 2e 66 6f 73 73 69 6c 0a 2a 2a   in ~/.fossil.**
0300: 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 20  .**    (2)  The 
0310: 22 72 65 70 6f 73 69 74 6f 72 79 22 20 64 61 74  "repository" dat
0320: 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 28  abase.**.**    (
0330: 33 29 20 20 41 20 6c 6f 63 61 6c 20 63 68 65 63  3)  A local chec
0340: 6b 6f 75 74 20 64 61 74 61 62 61 73 65 20 6e 61  kout database na
0350: 6d 65 64 20 22 5f 46 4f 53 53 49 4c 5f 22 20 6f  med "_FOSSIL_" o
0360: 72 20 22 2e 66 73 6c 63 6b 6f 75 74 22 0a 2a 2a  r ".fslckout".**
0370: 20 20 20 20 20 20 20 20 20 61 6e 64 20 6c 6f 63           and loc
0380: 61 74 65 64 20 61 74 20 74 68 65 20 72 6f 6f 74  ated at the root
0390: 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f   of the local co
03a0: 70 79 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  py of the source
03b0: 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2f 0a 23 69 6e   tree..**.*/.#in
03c0: 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22  clude "config.h"
03d0: 0a 23 69 66 20 21 20 64 65 66 69 6e 65 64 28 5f  .#if ! defined(_
03e0: 57 49 4e 33 32 29 0a 23 20 20 69 6e 63 6c 75 64  WIN32).#  includ
03f0: 65 20 3c 70 77 64 2e 68 3e 0a 23 65 6e 64 69 66  e <pwd.h>.#endif
0400: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 71 6c 69 74  .#include <sqlit
0410: 65 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  e3.h>.#include <
0420: 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e  sys/types.h>.#in
0430: 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e  clude <sys/stat.
0440: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69  h>.#include <uni
0450: 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  std.h>.#include 
0460: 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  <time.h>.#includ
0470: 65 20 22 64 62 2e 68 22 0a 0a 23 69 66 20 49 4e  e "db.h"..#if IN
0480: 54 45 52 46 41 43 45 0a 2f 2a 0a 2a 2a 20 41 6e  TERFACE./*.** An
0490: 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74   single SQL stat
04a0: 65 6d 65 6e 74 20 69 73 20 72 65 70 72 65 73 65  ement is represe
04b0: 6e 74 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61  nted as an insta
04c0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
04d0: 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  wing.** structur
04e0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 74 6d  e..*/.struct Stm
04f0: 74 20 7b 0a 20 20 42 6c 6f 62 20 73 71 6c 3b 20  t {.  Blob sql; 
0500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0510: 20 54 68 65 20 53 51 4c 20 66 6f 72 20 74 68 69   The SQL for thi
0520: 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  s statement */. 
0530: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
0540: 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  Stmt;    /* The 
0550: 72 65 73 75 6c 74 73 20 6f 66 20 73 71 6c 69 74  results of sqlit
0560: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20  e3_prepare_v2() 
0570: 2a 2f 0a 20 20 53 74 6d 74 20 2a 70 4e 65 78 74  */.  Stmt *pNext
0580: 2c 20 2a 70 50 72 65 76 3b 20 20 20 20 2f 2a 20  , *pPrev;    /* 
0590: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 66 69  List of all unfi
05a0: 6e 61 6c 69 7a 65 64 20 73 74 61 74 65 6d 65 6e  nalized statemen
05b0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 74 65  ts */.  int nSte
05c0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
05d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 71 6c  /* Number of sql
05e0: 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c  ite3_step() call
05f0: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.};../*.** C
0600: 6f 70 79 20 74 68 69 73 20 74 6f 20 69 6e 69 74  opy this to init
0610: 69 61 6c 69 7a 65 20 61 20 53 74 6d 74 20 6f 62  ialize a Stmt ob
0620: 6a 65 63 74 20 74 6f 20 61 20 63 6c 65 61 6e 2f  ject to a clean/
0630: 65 6d 70 74 79 20 73 74 61 74 65 2e 20 54 68 69  empty state. Thi
0640: 73 0a 2a 2a 20 69 73 20 75 73 65 66 75 6c 20 74  s.** is useful t
0650: 6f 20 68 65 6c 70 20 61 76 6f 69 64 20 61 73 73  o help avoid ass
0660: 65 72 74 69 6f 6e 73 20 77 68 65 6e 20 70 65 72  ertions when per
0670: 66 6f 72 6d 69 6e 67 20 63 6c 65 61 6e 75 70 20  forming cleanup 
0680: 69 6e 20 73 6f 6d 65 0a 2a 2a 20 65 72 72 6f 72  in some.** error
0690: 20 68 61 6e 64 6c 69 6e 67 20 63 61 73 65 73 2e   handling cases.
06a0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 65 6d 70 74  .*/.#define empt
06b0: 79 5f 53 74 6d 74 5f 6d 20 7b 42 4c 4f 42 5f 49  y_Stmt_m {BLOB_I
06c0: 4e 49 54 49 41 4c 49 5a 45 52 2c 4e 55 4c 4c 2c  NITIALIZER,NULL,
06d0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 7d 0a   NULL, NULL, 0}.
06e0: 23 65 6e 64 69 66 20 2f 2a 20 49 4e 54 45 52 46  #endif /* INTERF
06f0: 41 43 45 20 2a 2f 0a 63 6f 6e 73 74 20 73 74 72  ACE */.const str
0700: 75 63 74 20 53 74 6d 74 20 65 6d 70 74 79 5f 53  uct Stmt empty_S
0710: 74 6d 74 20 3d 20 65 6d 70 74 79 5f 53 74 6d 74  tmt = empty_Stmt
0720: 5f 6d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  _m;../*.** Call 
0730: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
0740: 6e 20 61 20 64 61 74 61 62 61 73 65 20 65 72 72  n a database err
0750: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
0760: 61 74 69 63 20 76 6f 69 64 20 64 62 5f 65 72 72  atic void db_err
0770: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
0780: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
0790: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
07a0: 20 2a 7a 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   *z;.  int rc = 
07b0: 31 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  1;.  static cons
07c0: 74 20 63 68 61 72 20 7a 52 65 62 75 69 6c 64 4d  t char zRebuildM
07d0: 73 67 5b 5d 20 3d 0a 20 20 20 20 20 20 22 49 66  sg[] =.      "If
07e0: 20 79 6f 75 20 68 61 76 65 20 72 65 63 65 6e 74   you have recent
07f0: 6c 79 20 75 70 64 61 74 65 64 20 79 6f 75 72 20  ly updated your 
0800: 66 6f 73 73 69 6c 20 65 78 65 63 75 74 61 62 6c  fossil executabl
0810: 65 2c 20 79 6f 75 20 6d 69 67 68 74 5c 6e 22 0a  e, you might\n".
0820: 20 20 20 20 20 20 22 6e 65 65 64 20 74 6f 20 72        "need to r
0830: 75 6e 20 5c 22 66 6f 73 73 69 6c 20 61 6c 6c 20  un \"fossil all 
0840: 72 65 62 75 69 6c 64 5c 22 20 74 6f 20 62 72 69  rebuild\" to bri
0850: 6e 67 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72  ng the repositor
0860: 79 5c 6e 22 0a 20 20 20 20 20 20 22 73 63 68 65  y\n".      "sche
0870: 6d 61 73 20 75 70 20 74 6f 20 64 61 74 65 2e 5c  mas up to date.\
0880: 6e 22 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  n";.  va_start(a
0890: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
08a0: 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72   = vmprintf(zFor
08b0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
08c0: 6e 64 28 61 70 29 3b 0a 23 69 66 64 65 66 20 46  nd(ap);.#ifdef F
08d0: 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f  OSSIL_ENABLE_JSO
08e0: 4e 0a 20 20 69 66 28 20 67 2e 6a 73 6f 6e 2e 69  N.  if( g.json.i
08f0: 73 4a 73 6f 6e 4d 6f 64 65 20 29 7b 0a 20 20 20  sJsonMode ){.   
0900: 20 6a 73 6f 6e 5f 65 72 72 28 20 30 2c 20 7a 2c   json_err( 0, z,
0910: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 67 2e   1 );.    if( g.
0920: 69 73 48 54 54 50 20 29 7b 0a 20 20 20 20 20 20  isHTTP ){.      
0930: 72 63 20 3d 20 30 20 2f 2a 20 61 76 6f 69 64 20  rc = 0 /* avoid 
0940: 48 54 54 50 20 35 30 30 20 2a 2f 3b 0a 20 20 20  HTTP 500 */;.   
0950: 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 0a 23 65   }.  }.  else.#e
0960: 6e 64 69 66 20 2f 2a 20 46 4f 53 53 49 4c 5f 45  ndif /* FOSSIL_E
0970: 4e 41 42 4c 45 5f 4a 53 4f 4e 20 2a 2f 0a 20 20  NABLE_JSON */.  
0980: 69 66 28 20 67 2e 78 66 65 72 50 61 6e 69 63 20  if( g.xferPanic 
0990: 29 7b 0a 20 20 20 20 63 67 69 5f 72 65 73 65 74  ){.    cgi_reset
09a0: 5f 63 6f 6e 74 65 6e 74 28 29 3b 0a 20 20 20 20  _content();.    
09b0: 40 20 65 72 72 6f 72 20 44 61 74 61 62 61 73 65  @ error Database
09c0: 5c 73 65 72 72 6f 72 3a 5c 73 25 46 28 7a 29 0a  \serror:\s%F(z).
09d0: 20 20 20 20 20 20 63 67 69 5f 72 65 70 6c 79 28        cgi_reply(
09e0: 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
09f0: 28 20 67 2e 63 67 69 4f 75 74 70 75 74 20 29 7b  ( g.cgiOutput ){
0a00: 0a 20 20 20 20 67 2e 63 67 69 4f 75 74 70 75 74  .    g.cgiOutput
0a10: 20 3d 20 30 3b 0a 20 20 20 20 63 67 69 5f 70 72   = 0;.    cgi_pr
0a20: 69 6e 74 66 28 22 3c 68 31 3e 44 61 74 61 62 61  intf("<h1>Databa
0a30: 73 65 20 45 72 72 6f 72 3c 2f 68 31 3e 5c 6e 22  se Error</h1>\n"
0a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0a50: 22 3c 70 72 65 3e 25 68 3c 2f 70 72 65 3e 5c 6e  "<pre>%h</pre>\n
0a60: 3c 70 3e 25 73 3c 2f 70 3e 5c 6e 22 2c 20 7a 2c  <p>%s</p>\n", z,
0a70: 20 7a 52 65 62 75 69 6c 64 4d 73 67 29 3b 0a 20   zRebuildMsg);. 
0a80: 20 20 20 63 67 69 5f 72 65 70 6c 79 28 29 3b 0a     cgi_reply();.
0a90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
0aa0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
0ab0: 3a 20 25 73 5c 6e 5c 6e 25 73 22 2c 20 67 2e 61  : %s\n\n%s", g.a
0ac0: 72 67 76 5b 30 5d 2c 20 7a 2c 20 7a 52 65 62 75  rgv[0], z, zRebu
0ad0: 69 6c 64 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 66  ildMsg);.  }.  f
0ae0: 72 65 65 28 7a 29 3b 0a 20 20 64 62 5f 66 6f 72  ree(z);.  db_for
0af0: 63 65 5f 72 6f 6c 6c 62 61 63 6b 28 29 3b 0a 20  ce_rollback();. 
0b00: 20 66 6f 73 73 69 6c 5f 65 78 69 74 28 72 63 29   fossil_exit(rc)
0b10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 73  ;.}../*.** All s
0b20: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 74  tatic variable t
0b30: 68 61 74 20 61 20 75 73 65 64 20 62 79 20 6f 6e  hat a used by on
0b40: 6c 79 20 74 68 69 73 20 66 69 6c 65 20 61 72 65  ly this file are
0b50: 20 67 61 74 68 65 72 65 64 20 69 6e 74 6f 0a 2a   gathered into.*
0b60: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
0b70: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
0b80: 61 74 69 63 20 73 74 72 75 63 74 20 44 62 4c 6f  atic struct DbLo
0b90: 63 61 6c 44 61 74 61 20 7b 0a 20 20 69 6e 74 20  calData {.  int 
0ba0: 6e 42 65 67 69 6e 3b 20 20 20 20 20 20 20 20 20  nBegin;         
0bb0: 20 20 20 20 20 20 2f 2a 20 4e 65 73 74 69 6e 67        /* Nesting
0bc0: 20 64 65 70 74 68 20 6f 66 20 42 45 47 49 4e 20   depth of BEGIN 
0bd0: 2a 2f 0a 20 20 69 6e 74 20 64 6f 52 6f 6c 6c 62  */.  int doRollb
0be0: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ack;           /
0bf0: 2a 20 54 72 75 65 20 74 6f 20 66 6f 72 63 65 20  * True to force 
0c00: 61 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  a rollback */.  
0c10: 69 6e 74 20 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 3b  int nCommitHook;
0c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0c30: 62 65 72 20 6f 66 20 63 6f 6d 6d 69 74 20 68 6f  ber of commit ho
0c40: 6f 6b 73 20 2a 2f 0a 20 20 53 74 6d 74 20 2a 70  oks */.  Stmt *p
0c50: 41 6c 6c 53 74 6d 74 3b 20 20 20 20 20 20 20 20  AllStmt;        
0c60: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
0c70: 6c 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 73 74  l unfinalized st
0c80: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  atements */.  in
0c90: 74 20 6e 50 72 65 70 61 72 65 3b 20 20 20 20 20  t nPrepare;     
0ca0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0cb0: 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71  r of calls to sq
0cc0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
0cd0: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 65 6c  () */.  int nDel
0ce0: 65 74 65 4f 6e 46 61 69 6c 3b 20 20 20 20 20 20  eteOnFail;      
0cf0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
0d00: 6e 74 72 69 65 73 20 69 6e 20 61 7a 44 65 6c 65  ntries in azDele
0d10: 74 65 4f 6e 46 61 69 6c 5b 5d 20 2a 2f 0a 20 20  teOnFail[] */.  
0d20: 73 74 72 75 63 74 20 73 43 6f 6d 6d 69 74 48 6f  struct sCommitHo
0d30: 6f 6b 20 7b 0a 20 20 20 20 69 6e 74 20 28 2a 78  ok {.    int (*x
0d40: 48 6f 6f 6b 29 28 76 6f 69 64 29 3b 20 20 20 20  Hook)(void);    
0d50: 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
0d60: 73 20 74 6f 20 63 61 6c 6c 20 61 74 20 64 62 5f  s to call at db_
0d70: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
0d80: 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65 71  ) */.    int seq
0d90: 75 65 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20  uence;          
0da0: 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 75 6e       /* Call fun
0db0: 63 74 69 6f 6e 73 20 69 6e 20 73 65 71 75 65 6e  ctions in sequen
0dc0: 63 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 7d 20  ce order */.  } 
0dd0: 61 48 6f 6f 6b 5b 35 5d 3b 0a 20 20 63 68 61 72  aHook[5];.  char
0de0: 20 2a 61 7a 44 65 6c 65 74 65 4f 6e 46 61 69 6c   *azDeleteOnFail
0df0: 5b 33 5d 3b 20 20 2f 2a 20 46 69 6c 65 73 20 74  [3];  /* Files t
0e00: 6f 20 64 65 6c 65 74 65 20 6f 6e 20 61 20 66 61  o delete on a fa
0e10: 69 6c 75 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  ilure */.  char 
0e20: 2a 61 7a 42 65 66 6f 72 65 43 6f 6d 6d 69 74 5b  *azBeforeCommit[
0e30: 35 5d 3b 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 73  5];  /* Commands
0e40: 20 74 6f 20 72 75 6e 20 70 72 69 6f 72 20 74 6f   to run prior to
0e50: 20 43 4f 4d 4d 49 54 20 2a 2f 0a 20 20 69 6e 74   COMMIT */.  int
0e60: 20 6e 42 65 66 6f 72 65 43 6f 6d 6d 69 74 3b 20   nBeforeCommit; 
0e70: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0e80: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
0e90: 7a 42 65 66 6f 72 65 43 6f 6d 6d 69 74 20 2a 2f  zBeforeCommit */
0ea0: 0a 20 20 69 6e 74 20 6e 50 72 69 6f 72 43 68 61  .  int nPriorCha
0eb0: 6e 67 65 73 3b 20 20 20 20 20 20 20 20 2f 2a 20  nges;        /* 
0ec0: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
0ed0: 61 6e 67 65 73 28 29 20 61 74 20 74 72 61 6e 73  anges() at trans
0ee0: 61 63 74 69 6f 6e 20 73 74 61 72 74 20 2a 2f 0a  action start */.
0ef0: 7d 20 64 62 20 3d 20 7b 30 2c 20 30 2c 20 30 2c  } db = {0, 0, 0,
0f00: 20 30 2c 20 30 2c 20 30 2c 20 7d 3b 0a 0a 2f 2a   0, 0, 0, };../*
0f10: 0a 2a 2a 20 41 72 72 61 6e 67 65 20 66 6f 72 20  .** Arrange for 
0f20: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 74  the given file t
0f30: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 20  o be deleted on 
0f40: 61 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 76 6f  a failure..*/.vo
0f50: 69 64 20 64 62 5f 64 65 6c 65 74 65 5f 6f 6e 5f  id db_delete_on_
0f60: 66 61 69 6c 75 72 65 28 63 6f 6e 73 74 20 63 68  failure(const ch
0f70: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
0f80: 20 20 61 73 73 65 72 74 28 20 64 62 2e 6e 44 65    assert( db.nDe
0f90: 6c 65 74 65 4f 6e 46 61 69 6c 3c 63 6f 75 6e 74  leteOnFail<count
0fa0: 28 64 62 2e 61 7a 44 65 6c 65 74 65 4f 6e 46 61  (db.azDeleteOnFa
0fb0: 69 6c 29 20 29 3b 0a 20 20 64 62 2e 61 7a 44 65  il) );.  db.azDe
0fc0: 6c 65 74 65 4f 6e 46 61 69 6c 5b 64 62 2e 6e 44  leteOnFail[db.nD
0fd0: 65 6c 65 74 65 4f 6e 46 61 69 6c 2b 2b 5d 20 3d  eleteOnFail++] =
0fe0: 20 66 6f 73 73 69 6c 5f 73 74 72 64 75 70 28 7a   fossil_strdup(z
0ff0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  Filename);.}../*
1000: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1010: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1020: 65 20 53 51 4c 69 74 65 20 63 6f 6d 6d 69 74 2d  e SQLite commit-
1030: 68 6f 6f 6b 20 6d 65 63 68 61 6e 69 73 6d 0a 2a  hook mechanism.*
1040: 2a 20 6a 75 73 74 20 70 72 69 6f 72 20 74 6f 20  * just prior to 
1050: 65 61 63 68 20 63 6f 6d 6d 69 74 2e 20 20 41 6c  each commit.  Al
1060: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64  l this routine d
1070: 6f 65 73 20 69 73 20 76 65 72 69 66 79 0a 2a 2a  oes is verify.**
1080: 20 74 68 61 74 20 6e 42 65 67 69 6e 20 72 65 61   that nBegin rea
1090: 6c 6c 79 20 69 73 20 7a 65 72 6f 2e 20 20 54 68  lly is zero.  Th
10a0: 61 74 20 69 6e 73 75 72 65 73 20 74 68 61 74 20  at insures that 
10b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 0a 2a 2a 20  transactions.** 
10c0: 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 62 79  cannot commit by
10d0: 20 61 6e 79 20 6d 65 61 6e 73 20 6f 74 68 65 72   any means other
10e0: 20 74 68 61 6e 20 62 79 20 63 61 6c 6c 69 6e 67   than by calling
10f0: 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74   db_end_transact
1100: 69 6f 6e 28 29 0a 2a 2a 20 62 65 6c 6f 77 2e 0a  ion().** below..
1110: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6a 75  **.** This is ju
1120: 73 74 20 61 20 73 61 66 65 74 79 20 61 6e 64 20  st a safety and 
1130: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2f  sanity check..*/
1140: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f 76  .static int db_v
1150: 65 72 69 66 79 5f 61 74 5f 63 6f 6d 6d 69 74 28  erify_at_commit(
1160: 76 6f 69 64 20 2a 6e 6f 74 55 73 65 64 29 7b 0a  void *notUsed){.
1170: 20 20 69 66 28 20 64 62 2e 6e 42 65 67 69 6e 20    if( db.nBegin 
1180: 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61  ){.    fossil_pa
1190: 6e 69 63 28 22 69 6c 6c 65 67 61 6c 20 63 6f 6d  nic("illegal com
11a0: 6d 69 74 20 61 74 74 65 6d 70 74 22 29 3b 0a 20  mit attempt");. 
11b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
11c0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11d0: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 6e 64 20  /*.** Begin and 
11e0: 65 6e 64 20 61 20 6e 65 73 74 65 64 20 74 72 61  end a nested tra
11f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
1200: 20 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61   db_begin_transa
1210: 63 74 69 6f 6e 28 76 6f 69 64 29 7b 0a 20 20 69  ction(void){.  i
1220: 66 28 20 64 62 2e 6e 42 65 67 69 6e 3d 3d 30 20  f( db.nBegin==0 
1230: 29 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  ){.    db_multi_
1240: 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b 0a 20  exec("BEGIN");. 
1250: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
1260: 74 5f 68 6f 6f 6b 28 67 2e 64 62 2c 20 64 62 5f  t_hook(g.db, db_
1270: 76 65 72 69 66 79 5f 61 74 5f 63 6f 6d 6d 69 74  verify_at_commit
1280: 2c 20 30 29 3b 0a 20 20 20 20 64 62 2e 6e 50 72  , 0);.    db.nPr
1290: 69 6f 72 43 68 61 6e 67 65 73 20 3d 20 73 71 6c  iorChanges = sql
12a0: 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67  ite3_total_chang
12b0: 65 73 28 67 2e 64 62 29 3b 0a 20 20 7d 0a 20 20  es(g.db);.  }.  
12c0: 64 62 2e 6e 42 65 67 69 6e 2b 2b 3b 0a 7d 0a 76  db.nBegin++;.}.v
12d0: 6f 69 64 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73  oid db_end_trans
12e0: 61 63 74 69 6f 6e 28 69 6e 74 20 72 6f 6c 6c 62  action(int rollb
12f0: 61 63 6b 46 6c 61 67 29 7b 0a 20 20 69 66 28 20  ackFlag){.  if( 
1300: 67 2e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  g.db==0 ) return
1310: 3b 0a 20 20 69 66 28 20 64 62 2e 6e 42 65 67 69  ;.  if( db.nBegi
1320: 6e 3c 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n<=0 ) return;. 
1330: 20 69 66 28 20 72 6f 6c 6c 62 61 63 6b 46 6c 61   if( rollbackFla
1340: 67 20 29 20 64 62 2e 64 6f 52 6f 6c 6c 62 61 63  g ) db.doRollbac
1350: 6b 20 3d 20 31 3b 0a 20 20 64 62 2e 6e 42 65 67  k = 1;.  db.nBeg
1360: 69 6e 2d 2d 3b 0a 20 20 69 66 28 20 64 62 2e 6e  in--;.  if( db.n
1370: 42 65 67 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  Begin==0 ){.    
1380: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 64  int i;.    if( d
1390: 62 2e 64 6f 52 6f 6c 6c 62 61 63 6b 3d 3d 30 20  b.doRollback==0 
13a0: 26 26 20 64 62 2e 6e 50 72 69 6f 72 43 68 61 6e  && db.nPriorChan
13b0: 67 65 73 3c 73 71 6c 69 74 65 33 5f 74 6f 74 61  ges<sqlite3_tota
13c0: 6c 5f 63 68 61 6e 67 65 73 28 67 2e 64 62 29 20  l_changes(g.db) 
13d0: 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
13e0: 64 62 2e 6e 42 65 66 6f 72 65 43 6f 6d 6d 69 74  db.nBeforeCommit
13f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 2e 6e   ){.        db.n
1400: 42 65 66 6f 72 65 43 6f 6d 6d 69 74 2d 2d 3b 0a  BeforeCommit--;.
1410: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1420: 65 78 65 63 28 67 2e 64 62 2c 20 64 62 2e 61 7a  exec(g.db, db.az
1430: 42 65 66 6f 72 65 43 6f 6d 6d 69 74 5b 64 62 2e  BeforeCommit[db.
1440: 6e 42 65 66 6f 72 65 43 6f 6d 6d 69 74 5d 2c 20  nBeforeCommit], 
1450: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
1460: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
1470: 62 2e 61 7a 42 65 66 6f 72 65 43 6f 6d 6d 69 74  b.azBeforeCommit
1480: 5b 64 62 2e 6e 42 65 66 6f 72 65 43 6f 6d 6d 69  [db.nBeforeCommi
1490: 74 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t]);.      }.   
14a0: 20 20 20 6c 65 61 66 5f 64 6f 5f 70 65 6e 64 69     leaf_do_pendi
14b0: 6e 67 5f 63 68 65 63 6b 73 28 29 3b 0a 20 20 20  ng_checks();.   
14c0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
14d0: 64 62 2e 64 6f 52 6f 6c 6c 62 61 63 6b 3d 3d 30  db.doRollback==0
14e0: 20 26 26 20 69 3c 64 62 2e 6e 43 6f 6d 6d 69 74   && i<db.nCommit
14f0: 48 6f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Hook; i++){.    
1500: 20 20 64 62 2e 64 6f 52 6f 6c 6c 62 61 63 6b 20    db.doRollback 
1510: 7c 3d 20 64 62 2e 61 48 6f 6f 6b 5b 69 5d 2e 78  |= db.aHook[i].x
1520: 48 6f 6f 6b 28 29 3b 0a 20 20 20 20 7d 0a 20 20  Hook();.    }.  
1530: 20 20 77 68 69 6c 65 28 20 64 62 2e 70 41 6c 6c    while( db.pAll
1540: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 64 62  Stmt ){.      db
1550: 5f 66 69 6e 61 6c 69 7a 65 28 64 62 2e 70 41 6c  _finalize(db.pAl
1560: 6c 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20  lStmt);.    }.  
1570: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
1580: 64 62 2e 64 6f 52 6f 6c 6c 62 61 63 6b 20 3f 20  db.doRollback ? 
1590: 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20 22 43 4f  "ROLLBACK" : "CO
15a0: 4d 4d 49 54 22 29 3b 0a 20 20 20 20 64 62 2e 64  MMIT");.    db.d
15b0: 6f 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  oRollback = 0;. 
15c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 63   }.}../*.** Forc
15d0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  e a rollback and
15e0: 20 73 68 75 74 64 6f 77 6e 20 74 68 65 20 64 61   shutdown the da
15f0: 74 61 62 61 73 65 0a 2a 2f 0a 76 6f 69 64 20 64  tabase.*/.void d
1600: 62 5f 66 6f 72 63 65 5f 72 6f 6c 6c 62 61 63 6b  b_force_rollback
1610: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b  (void){.  int i;
1620: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 62 75  .  static int bu
1630: 73 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  sy = 0;.  sqlite
1640: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
1650: 30 3b 0a 20 20 69 66 28 20 62 75 73 79 20 7c 7c  0;.  if( busy ||
1660: 20 67 2e 64 62 3d 3d 30 20 29 20 72 65 74 75 72   g.db==0 ) retur
1670: 6e 3b 0a 20 20 62 75 73 79 20 3d 20 31 3b 0a 20  n;.  busy = 1;. 
1680: 20 75 6e 64 6f 5f 72 6f 6c 6c 62 61 63 6b 28 29   undo_rollback()
1690: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 53 74 6d  ;.  while( (pStm
16a0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  t = sqlite3_next
16b0: 5f 73 74 6d 74 28 67 2e 64 62 2c 70 53 74 6d 74  _stmt(g.db,pStmt
16c0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
16d0: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
16e0: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
16f0: 64 62 2e 70 41 6c 6c 53 74 6d 74 20 29 7b 0a 20  db.pAllStmt ){. 
1700: 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 64     db_finalize(d
1710: 62 2e 70 41 6c 6c 53 74 6d 74 29 3b 0a 20 20 7d  b.pAllStmt);.  }
1720: 0a 20 20 69 66 28 20 64 62 2e 6e 42 65 67 69 6e  .  if( db.nBegin
1730: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1740: 65 78 65 63 28 67 2e 64 62 2c 20 22 52 4f 4c 4c  exec(g.db, "ROLL
1750: 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  BACK", 0, 0, 0);
1760: 0a 20 20 20 20 64 62 2e 6e 42 65 67 69 6e 20 3d  .    db.nBegin =
1770: 20 30 3b 0a 20 20 7d 0a 20 20 62 75 73 79 20 3d   0;.  }.  busy =
1780: 20 30 3b 0a 20 20 64 62 5f 63 6c 6f 73 65 28 30   0;.  db_close(0
1790: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
17a0: 64 62 2e 6e 44 65 6c 65 74 65 4f 6e 46 61 69 6c  db.nDeleteOnFail
17b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 69 6c 65  ; i++){.    file
17c0: 5f 64 65 6c 65 74 65 28 64 62 2e 61 7a 44 65 6c  _delete(db.azDel
17d0: 65 74 65 4f 6e 46 61 69 6c 5b 69 5d 29 3b 0a 20  eteOnFail[i]);. 
17e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 74   }.}../*.** Inst
17f0: 61 6c 6c 20 61 20 63 6f 6d 6d 69 74 20 68 6f 6f  all a commit hoo
1800: 6b 2e 20 20 48 6f 6f 6b 73 20 61 72 65 20 69 6e  k.  Hooks are in
1810: 73 74 61 6c 6c 65 64 20 69 6e 20 73 65 71 75 65  stalled in seque
1820: 6e 63 65 20 6f 72 64 65 72 2e 0a 2a 2a 20 49 74  nce order..** It
1830: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20   is an error to 
1840: 69 6e 73 74 61 6c 6c 20 74 68 65 20 73 61 6d 65  install the same
1850: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 6d 6f 72   commit hook mor
1860: 65 20 74 68 61 6e 20 6f 6e 63 65 2e 0a 2a 2a 0a  e than once..**.
1870: 2a 2a 20 45 61 63 68 20 63 6f 6d 6d 69 74 20 68  ** Each commit h
1880: 6f 6f 6b 20 69 73 20 63 61 6c 6c 65 64 20 28 69  ook is called (i
1890: 6e 20 6f 72 64 65 72 20 6f 66 20 61 73 63 65 6e  n order of ascen
18a0: 64 69 6e 67 20 73 65 71 75 65 6e 63 65 29 20 61  ding sequence) a
18b0: 74 0a 2a 2a 20 65 61 63 68 20 63 6f 6d 6d 69 74  t.** each commit
18c0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 66 20   operation.  If 
18d0: 61 6e 79 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  any commit hook 
18e0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
18f0: 2c 0a 2a 2a 20 74 68 65 20 73 75 62 73 65 71 75  ,.** the subsequ
1900: 65 6e 63 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b  ence commit hook
1910: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 61 6e  s are omitted an
1920: 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
1930: 6e 0a 2a 2a 20 72 6f 6c 6c 73 20 62 61 63 6b 20  n.** rolls back 
1940: 72 61 74 68 65 72 20 74 68 61 6e 20 63 6f 6d 6d  rather than comm
1950: 69 74 2e 20 20 49 74 20 69 73 20 74 68 65 20 72  it.  It is the r
1960: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
1970: 20 74 68 65 0a 2a 2a 20 68 6f 6f 6b 73 20 74 68   the.** hooks th
1980: 65 6d 73 65 6c 76 65 73 20 74 6f 20 69 73 73 75  emselves to issu
1990: 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
19a0: 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62  ages..*/.void db
19b0: 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 69 6e 74  _commit_hook(int
19c0: 20 28 2a 78 29 28 76 6f 69 64 29 2c 20 69 6e 74   (*x)(void), int
19d0: 20 73 65 71 75 65 6e 63 65 29 7b 0a 20 20 69 6e   sequence){.  in
19e0: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64  t i;.  assert( d
19f0: 62 2e 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 20 3c 20  b.nCommitHook < 
1a00: 63 6f 75 6e 74 28 64 62 2e 61 48 6f 6f 6b 29 20  count(db.aHook) 
1a10: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1a20: 64 62 2e 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 3b 20  db.nCommitHook; 
1a30: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
1a40: 28 20 78 21 3d 64 62 2e 61 48 6f 6f 6b 5b 69 5d  ( x!=db.aHook[i]
1a50: 2e 78 48 6f 6f 6b 20 29 3b 0a 20 20 20 20 69 66  .xHook );.    if
1a60: 28 20 64 62 2e 61 48 6f 6f 6b 5b 69 5d 2e 73 65  ( db.aHook[i].se
1a70: 71 75 65 6e 63 65 3e 73 65 71 75 65 6e 63 65 20  quence>sequence 
1a80: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 20 3d  ){.      int s =
1a90: 20 73 65 71 75 65 6e 63 65 3b 0a 20 20 20 20 20   sequence;.     
1aa0: 20 69 6e 74 20 28 2a 78 53 29 28 76 6f 69 64 29   int (*xS)(void)
1ab0: 20 3d 20 78 3b 0a 20 20 20 20 20 20 73 65 71 75   = x;.      sequ
1ac0: 65 6e 63 65 20 3d 20 64 62 2e 61 48 6f 6f 6b 5b  ence = db.aHook[
1ad0: 69 5d 2e 73 65 71 75 65 6e 63 65 3b 0a 20 20 20  i].sequence;.   
1ae0: 20 20 20 78 20 3d 20 64 62 2e 61 48 6f 6f 6b 5b     x = db.aHook[
1af0: 69 5d 2e 78 48 6f 6f 6b 3b 0a 20 20 20 20 20 20  i].xHook;.      
1b00: 64 62 2e 61 48 6f 6f 6b 5b 69 5d 2e 73 65 71 75  db.aHook[i].sequ
1b10: 65 6e 63 65 20 3d 20 73 3b 0a 20 20 20 20 20 20  ence = s;.      
1b20: 64 62 2e 61 48 6f 6f 6b 5b 69 5d 2e 78 48 6f 6f  db.aHook[i].xHoo
1b30: 6b 20 3d 20 78 53 3b 0a 20 20 20 20 7d 0a 20 20  k = xS;.    }.  
1b40: 7d 0a 20 20 64 62 2e 61 48 6f 6f 6b 5b 64 62 2e  }.  db.aHook[db.
1b50: 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 5d 2e 73 65 71  nCommitHook].seq
1b60: 75 65 6e 63 65 20 3d 20 73 65 71 75 65 6e 63 65  uence = sequence
1b70: 3b 0a 20 20 64 62 2e 61 48 6f 6f 6b 5b 64 62 2e  ;.  db.aHook[db.
1b80: 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 5d 2e 78 48 6f  nCommitHook].xHo
1b90: 6f 6b 20 3d 20 78 3b 0a 20 20 64 62 2e 6e 43 6f  ok = x;.  db.nCo
1ba0: 6d 6d 69 74 48 6f 6f 6b 2b 2b 3b 0a 7d 0a 0a 2f  mmitHook++;.}../
1bb0: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 53  *.** Prepare a S
1bc0: 74 6d 74 2e 20 20 41 73 73 75 6d 65 20 74 68 61  tmt.  Assume tha
1bd0: 74 20 74 68 65 20 53 74 6d 74 20 69 73 20 70 72  t the Stmt is pr
1be0: 65 76 69 6f 75 73 6c 79 20 75 6e 69 6e 69 74 69  eviously uniniti
1bf0: 61 6c 69 7a 65 64 2e 0a 2a 2a 20 49 66 20 74 68  alized..** If th
1c00: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 63  e input string c
1c10: 6f 6e 74 61 69 6e 73 20 6d 75 6c 74 69 70 6c 65  ontains multiple
1c20: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2c   SQL statements,
1c30: 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 0a   only the first.
1c40: 2a 2a 20 6f 6e 65 20 69 73 20 70 72 6f 63 65 73  ** one is proces
1c50: 73 65 64 2e 20 20 41 6c 6c 20 73 74 61 74 65 6d  sed.  All statem
1c60: 65 6e 74 73 20 62 65 79 6f 6e 64 20 74 68 65 20  ents beyond the 
1c70: 66 69 72 73 74 20 61 72 65 20 73 69 6c 65 6e 74  first are silent
1c80: 6c 79 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  ly ignored..*/.i
1c90: 6e 74 20 64 62 5f 76 70 72 65 70 61 72 65 28 53  nt db_vprepare(S
1ca0: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20  tmt *pStmt, int 
1cb0: 65 72 72 4f 6b 2c 20 63 6f 6e 73 74 20 63 68 61  errOk, const cha
1cc0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c  r *zFormat, va_l
1cd0: 69 73 74 20 61 70 29 7b 0a 20 20 69 6e 74 20 72  ist ap){.  int r
1ce0: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  c;.  char *zSql;
1cf0: 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 70 53  .  blob_zero(&pS
1d00: 74 6d 74 2d 3e 73 71 6c 29 3b 0a 20 20 62 6c 6f  tmt->sql);.  blo
1d10: 62 5f 76 61 70 70 65 6e 64 66 28 26 70 53 74 6d  b_vappendf(&pStm
1d20: 74 2d 3e 73 71 6c 2c 20 7a 46 6f 72 6d 61 74 2c  t->sql, zFormat,
1d30: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1d40: 70 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 62 6c 6f  p);.  zSql = blo
1d50: 62 5f 73 74 72 28 26 70 53 74 6d 74 2d 3e 73 71  b_str(&pStmt->sq
1d60: 6c 29 3b 0a 20 20 64 62 2e 6e 50 72 65 70 61 72  l);.  db.nPrepar
1d70: 65 2b 2b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e++;.  rc = sqli
1d80: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67  te3_prepare_v2(g
1d90: 2e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  .db, zSql, -1, &
1da0: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 30 29  pStmt->pStmt, 0)
1db0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 26 26  ;.  if( rc!=0 &&
1dc0: 20 21 65 72 72 4f 6b 20 29 7b 0a 20 20 20 20 64   !errOk ){.    d
1dd0: 62 5f 65 72 72 28 22 25 73 5c 6e 25 73 22 2c 20  b_err("%s\n%s", 
1de0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 67  sqlite3_errmsg(g
1df0: 2e 64 62 29 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d  .db), zSql);.  }
1e00: 0a 20 20 70 53 74 6d 74 2d 3e 70 4e 65 78 74 20  .  pStmt->pNext 
1e10: 3d 20 70 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d  = pStmt->pPrev =
1e20: 20 30 3b 0a 20 20 70 53 74 6d 74 2d 3e 6e 53 74   0;.  pStmt->nSt
1e30: 65 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ep = 0;.  return
1e40: 20 72 63 3b 0a 7d 0a 69 6e 74 20 64 62 5f 70 72   rc;.}.int db_pr
1e50: 65 70 61 72 65 28 53 74 6d 74 20 2a 70 53 74 6d  epare(Stmt *pStm
1e60: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1e70: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
1e80: 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 6c 69 73  int rc;.  va_lis
1e90: 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
1ea0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
1eb0: 20 72 63 20 3d 20 64 62 5f 76 70 72 65 70 61 72   rc = db_vprepar
1ec0: 65 28 70 53 74 6d 74 2c 20 30 2c 20 7a 46 6f 72  e(pStmt, 0, zFor
1ed0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
1ee0: 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  nd(ap);.  return
1ef0: 20 72 63 3b 0a 7d 0a 69 6e 74 20 64 62 5f 70 72   rc;.}.int db_pr
1f00: 65 70 61 72 65 5f 69 67 6e 6f 72 65 5f 65 72 72  epare_ignore_err
1f10: 6f 72 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20  or(Stmt *pStmt, 
1f20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
1f30: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74  mat, ...){.  int
1f40: 20 72 63 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61   rc;.  va_list a
1f50: 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
1f60: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 72 63  , zFormat);.  rc
1f70: 20 3d 20 64 62 5f 76 70 72 65 70 61 72 65 28 70   = db_vprepare(p
1f80: 53 74 6d 74 2c 20 31 2c 20 7a 46 6f 72 6d 61 74  Stmt, 1, zFormat
1f90: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
1fa0: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ap);.  return rc
1fb0: 3b 0a 7d 0a 69 6e 74 20 64 62 5f 73 74 61 74 69  ;.}.int db_stati
1fc0: 63 5f 70 72 65 70 61 72 65 28 53 74 6d 74 20 2a  c_prepare(Stmt *
1fd0: 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61  pStmt, const cha
1fe0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
1ff0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2000: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 62 6c  ITE_OK;.  if( bl
2010: 6f 62 5f 73 69 7a 65 28 26 70 53 74 6d 74 2d 3e  ob_size(&pStmt->
2020: 73 71 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 76  sql)==0 ){.    v
2030: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 76  a_list ap;.    v
2040: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
2050: 6d 61 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  mat);.    rc = d
2060: 62 5f 76 70 72 65 70 61 72 65 28 70 53 74 6d 74  b_vprepare(pStmt
2070: 2c 20 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  , 0, zFormat, ap
2080: 29 3b 0a 20 20 20 20 70 53 74 6d 74 2d 3e 70 4e  );.    pStmt->pN
2090: 65 78 74 20 3d 20 64 62 2e 70 41 6c 6c 53 74 6d  ext = db.pAllStm
20a0: 74 3b 0a 20 20 20 20 70 53 74 6d 74 2d 3e 70 50  t;.    pStmt->pP
20b0: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rev = 0;.    if(
20c0: 20 64 62 2e 70 41 6c 6c 53 74 6d 74 20 29 20 64   db.pAllStmt ) d
20d0: 62 2e 70 41 6c 6c 53 74 6d 74 2d 3e 70 50 72 65  b.pAllStmt->pPre
20e0: 76 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 64  v = pStmt;.    d
20f0: 62 2e 70 41 6c 6c 53 74 6d 74 20 3d 20 70 53 74  b.pAllStmt = pSt
2100: 6d 74 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  mt;.    va_end(a
2110: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
2120: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
2130: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
2140: 66 20 61 20 62 69 6e 64 20 70 61 72 61 6d 65 74  f a bind paramet
2150: 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  er.*/.static int
2160: 20 70 61 72 61 6d 49 64 78 28 53 74 6d 74 20 2a   paramIdx(Stmt *
2170: 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61  pStmt, const cha
2180: 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 29 7b 0a  r *zParamName){.
2190: 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65    int i = sqlite
21a0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
21b0: 5f 69 6e 64 65 78 28 70 53 74 6d 74 2d 3e 70 53  _index(pStmt->pS
21c0: 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29  tmt, zParamName)
21d0: 3b 0a 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a  ;.  if( i==0 ){.
21e0: 20 20 20 20 64 62 5f 65 72 72 28 22 6e 6f 20 73      db_err("no s
21f0: 75 63 68 20 62 69 6e 64 20 70 61 72 61 6d 65 74  uch bind paramet
2200: 65 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 25 62 22  er: %s\nSQL: %b"
2210: 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 2c 20 26 70  , zParamName, &p
2220: 53 74 6d 74 2d 3e 73 71 6c 29 3b 0a 20 20 7d 0a  Stmt->sql);.  }.
2230: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 2f 2a    return i;.}./*
2240: 0a 2a 2a 20 42 69 6e 64 20 61 6e 20 69 6e 74 65  .** Bind an inte
2250: 67 65 72 2c 20 73 74 72 69 6e 67 2c 20 6f 72 20  ger, string, or 
2260: 42 6c 6f 62 20 76 61 6c 75 65 20 74 6f 20 61 20  Blob value to a 
2270: 6e 61 6d 65 64 20 70 61 72 61 6d 65 74 65 72 2e  named parameter.
2280: 0a 2a 2f 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f  .*/.int db_bind_
2290: 69 6e 74 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c  int(Stmt *pStmt,
22a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
22b0: 72 61 6d 4e 61 6d 65 2c 20 69 6e 74 20 69 56 61  ramName, int iVa
22c0: 6c 75 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  lue){.  return s
22d0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
22e0: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61  pStmt->pStmt, pa
22f0: 72 61 6d 49 64 78 28 70 53 74 6d 74 2c 20 7a 50  ramIdx(pStmt, zP
2300: 61 72 61 6d 4e 61 6d 65 29 2c 20 69 56 61 6c 75  aramName), iValu
2310: 65 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 62 69 6e  e);.}.int db_bin
2320: 64 5f 69 6e 74 36 34 28 53 74 6d 74 20 2a 70 53  d_int64(Stmt *pS
2330: 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  tmt, const char 
2340: 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c 20 69 36 34  *zParamName, i64
2350: 20 69 56 61 6c 75 65 29 7b 0a 20 20 72 65 74 75   iValue){.  retu
2360: 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  rn sqlite3_bind_
2370: 69 6e 74 36 34 28 70 53 74 6d 74 2d 3e 70 53 74  int64(pStmt->pSt
2380: 6d 74 2c 20 70 61 72 61 6d 49 64 78 28 70 53 74  mt, paramIdx(pSt
2390: 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29 2c  mt, zParamName),
23a0: 20 69 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e 74 20   iValue);.}.int 
23b0: 64 62 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 53  db_bind_double(S
23c0: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73  tmt *pStmt, cons
23d0: 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61  t char *zParamNa
23e0: 6d 65 2c 20 64 6f 75 62 6c 65 20 72 56 61 6c 75  me, double rValu
23f0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
2400: 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
2410: 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 70  (pStmt->pStmt, p
2420: 61 72 61 6d 49 64 78 28 70 53 74 6d 74 2c 20 7a  aramIdx(pStmt, z
2430: 50 61 72 61 6d 4e 61 6d 65 29 2c 20 72 56 61 6c  ParamName), rVal
2440: 75 65 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 62 69  ue);.}.int db_bi
2450: 6e 64 5f 74 65 78 74 28 53 74 6d 74 20 2a 70 53  nd_text(Stmt *pS
2460: 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  tmt, const char 
2470: 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c 20 63 6f 6e  *zParamName, con
2480: 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 29  st char *zValue)
2490: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
24a0: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
24b0: 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d  mt->pStmt, param
24c0: 49 64 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61  Idx(pStmt, zPara
24d0: 6d 4e 61 6d 65 29 2c 20 7a 56 61 6c 75 65 2c 0a  mName), zValue,.
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53             -1, S
2500: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d  QLITE_STATIC);.}
2510: 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 74 65 78  .int db_bind_tex
2520: 74 31 36 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c  t16(Stmt *pStmt,
2530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2540: 72 61 6d 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ramName, const c
2550: 68 61 72 20 2a 7a 56 61 6c 75 65 29 7b 0a 20 20  har *zValue){.  
2560: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 62  return sqlite3_b
2570: 69 6e 64 5f 74 65 78 74 31 36 28 70 53 74 6d 74  ind_text16(pStmt
2580: 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d 49 64  ->pStmt, paramId
2590: 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e  x(pStmt, zParamN
25a0: 61 6d 65 29 2c 20 7a 56 61 6c 75 65 2c 0a 20 20  ame), zValue,.  
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53             -1, S
25d0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d  QLITE_STATIC);.}
25e0: 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 6e 75 6c  .int db_bind_nul
25f0: 6c 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63  l(Stmt *pStmt, c
2600: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
2610: 6d 4e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e  mName){.  return
2620: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
2630: 6c 6c 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c  ll(pStmt->pStmt,
2640: 20 70 61 72 61 6d 49 64 78 28 70 53 74 6d 74 2c   paramIdx(pStmt,
2650: 20 7a 50 61 72 61 6d 4e 61 6d 65 29 29 3b 0a 7d   zParamName));.}
2660: 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 62 6c 6f  .int db_bind_blo
2670: 62 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63  b(Stmt *pStmt, c
2680: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
2690: 6d 4e 61 6d 65 2c 20 42 6c 6f 62 20 2a 70 42 6c  mName, Blob *pBl
26a0: 6f 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ob){.  return sq
26b0: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
26c0: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61  pStmt->pStmt, pa
26d0: 72 61 6d 49 64 78 28 70 53 74 6d 74 2c 20 7a 50  ramIdx(pStmt, zP
26e0: 61 72 61 6d 4e 61 6d 65 29 2c 0a 20 20 20 20 20  aramName),.     
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 62 6c 6f 62 5f 62 75 66 66 65 72       blob_buffer
2710: 28 70 42 6c 6f 62 29 2c 20 62 6c 6f 62 5f 73 69  (pBlob), blob_si
2720: 7a 65 28 70 42 6c 6f 62 29 2c 20 53 51 4c 49 54  ze(pBlob), SQLIT
2730: 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a  E_STATIC);.}../*
2740: 20 62 69 6e 64 5f 73 74 72 28 29 20 74 72 65 61   bind_str() trea
2750: 74 73 20 61 20 42 6c 6f 62 20 6f 62 6a 65 63 74  ts a Blob object
2760: 20 6c 69 6b 65 20 61 20 54 45 58 54 20 73 74 72   like a TEXT str
2770: 69 6e 67 20 61 6e 64 20 62 69 6e 64 73 20 69 74  ing and binds it
2780: 0a 2a 2a 20 74 6f 20 74 68 65 20 53 51 4c 20 76  .** to the SQL v
2790: 61 72 69 61 62 6c 65 2e 20 20 43 6f 6e 74 72 61  ariable.  Contra
27a0: 73 74 20 74 68 69 73 20 74 6f 20 62 69 6e 64 5f  st this to bind_
27b0: 62 6c 6f 62 28 29 20 77 68 69 63 68 20 74 72 65  blob() which tre
27c0: 61 74 73 0a 2a 2a 20 74 68 65 20 42 6c 6f 62 20  ats.** the Blob 
27d0: 6f 62 6a 65 63 74 20 6c 69 6b 65 20 61 6e 20 53  object like an S
27e0: 51 4c 20 42 4c 4f 42 2e 0a 2a 2f 0a 69 6e 74 20  QL BLOB..*/.int 
27f0: 64 62 5f 62 69 6e 64 5f 73 74 72 28 53 74 6d 74  db_bind_str(Stmt
2800: 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63   *pStmt, const c
2810: 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c  har *zParamName,
2820: 20 42 6c 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a 20   Blob *pBlob){. 
2830: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
2840: 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2d  bind_text(pStmt-
2850: 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d 49 64 78  >pStmt, paramIdx
2860: 28 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61  (pStmt, zParamNa
2870: 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2890: 6c 6f 62 5f 62 75 66 66 65 72 28 70 42 6c 6f 62  lob_buffer(pBlob
28a0: 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 70 42 6c  ), blob_size(pBl
28b0: 6f 62 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  ob), SQLITE_STAT
28c0: 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  IC);.}../*.** St
28d0: 65 70 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ep the SQL state
28e0: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 65 69  ment.  Return ei
28f0: 74 68 65 72 20 53 51 4c 49 54 45 5f 52 4f 57 20  ther SQLITE_ROW 
2900: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
2910: 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b  .** or SQLITE_OK
2920: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
2930: 74 20 66 69 6e 69 73 68 65 73 20 73 75 63 63 65  t finishes succe
2940: 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ssfully..*/.int 
2950: 64 62 5f 73 74 65 70 28 53 74 6d 74 20 2a 70 53  db_step(Stmt *pS
2960: 74 6d 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  tmt){.  int rc;.
2970: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
2980: 74 65 70 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74  tep(pStmt->pStmt
2990: 29 3b 0a 20 20 70 53 74 6d 74 2d 3e 6e 53 74 65  );.  pStmt->nSte
29a0: 70 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  p++;.  return rc
29b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
29c0: 20 77 61 72 6e 69 6e 67 73 20 69 66 20 61 20 71   warnings if a q
29d0: 75 65 72 79 20 69 73 20 69 6e 65 66 66 69 63 69  uery is ineffici
29e0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
29f0: 6f 69 64 20 64 62 5f 73 74 61 74 73 28 53 74 6d  oid db_stats(Stm
2a00: 74 20 2a 70 53 74 6d 74 29 7b 0a 23 69 66 64 65  t *pStmt){.#ifde
2a10: 66 20 46 4f 53 53 49 4c 5f 44 45 42 55 47 0a 20  f FOSSIL_DEBUG. 
2a20: 20 69 6e 74 20 63 31 2c 20 63 32 2c 20 63 33 3b   int c1, c2, c3;
2a30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2a40: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71  Sql = sqlite3_sq
2a50: 6c 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b  l(pStmt->pStmt);
2a60: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
2a70: 20 72 65 74 75 72 6e 3b 0a 20 20 63 31 20 3d 20   return;.  c1 = 
2a80: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
2a90: 74 75 73 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74  tus(pStmt->pStmt
2aa0: 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
2ab0: 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
2ac0: 50 2c 20 31 29 3b 0a 20 20 63 32 20 3d 20 73 71  P, 1);.  c2 = sq
2ad0: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
2ae0: 73 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20  s(pStmt->pStmt, 
2af0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
2b00: 53 5f 41 55 54 4f 49 4e 44 45 58 2c 20 31 29 3b  S_AUTOINDEX, 1);
2b10: 0a 20 20 63 33 20 3d 20 73 71 6c 69 74 65 33 5f  .  c3 = sqlite3_
2b20: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
2b30: 74 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45  t->pStmt, SQLITE
2b40: 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
2b50: 2c 20 31 29 3b 0a 20 20 69 66 28 20 63 31 3e 70  , 1);.  if( c1>p
2b60: 53 74 6d 74 2d 3e 6e 53 74 65 70 2a 34 20 26 26  Stmt->nStep*4 &&
2b70: 20 73 74 72 73 74 72 28 7a 53 71 6c 2c 22 2f 2a   strstr(zSql,"/*
2b80: 73 63 61 6e 2a 2f 22 29 3d 3d 30 20 29 7b 0a 20  scan*/")==0 ){. 
2b90: 20 20 20 66 6f 73 73 69 6c 5f 77 61 72 6e 69 6e     fossil_warnin
2ba0: 67 28 22 25 64 20 73 63 61 6e 20 73 74 65 70 73  g("%d scan steps
2bb0: 20 66 6f 72 20 25 64 20 72 6f 77 73 20 69 6e 20   for %d rows in 
2bc0: 5b 25 73 5d 22 2c 20 63 31 2c 20 70 53 74 6d 74  [%s]", c1, pStmt
2bd0: 2d 3e 6e 53 74 65 70 2c 20 7a 53 71 6c 29 3b 0a  ->nStep, zSql);.
2be0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 20 29    }else if( c2 )
2bf0: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 77 61 72  {.    fossil_war
2c00: 6e 69 6e 67 28 22 25 64 20 61 75 74 6f 6d 61 74  ning("%d automat
2c10: 69 63 20 69 6e 64 65 78 20 72 6f 77 73 20 69 6e  ic index rows in
2c20: 20 5b 25 73 5d 22 2c 20 63 32 2c 20 7a 53 71 6c   [%s]", c2, zSql
2c30: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63  );.  }else if( c
2c40: 33 20 26 26 20 73 74 72 73 74 72 28 7a 53 71 6c  3 && strstr(zSql
2c50: 2c 22 2f 2a 73 6f 72 74 2a 2f 22 29 3d 3d 30 20  ,"/*sort*/")==0 
2c60: 26 26 20 73 74 72 73 74 72 28 7a 53 71 6c 2c 22  && strstr(zSql,"
2c70: 2f 2a 73 63 61 6e 2a 2f 22 29 3d 3d 30 20 29 7b  /*scan*/")==0 ){
2c80: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 77 61 72 6e  .    fossil_warn
2c90: 69 6e 67 28 22 73 6f 72 74 20 77 2f 6f 20 69 6e  ing("sort w/o in
2ca0: 64 65 78 20 69 6e 20 5b 25 73 5d 22 2c 20 7a 53  dex in [%s]", zS
2cb0: 71 6c 29 3b 0a 20 20 7d 0a 20 20 70 53 74 6d 74  ql);.  }.  pStmt
2cc0: 2d 3e 6e 53 74 65 70 20 3d 20 30 3b 0a 23 65 6e  ->nStep = 0;.#en
2cd0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  dif.}../*.** Res
2ce0: 65 74 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 61  et or finalize a
2cf0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
2d00: 6e 74 20 64 62 5f 72 65 73 65 74 28 53 74 6d 74  nt db_reset(Stmt
2d10: 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69 6e 74 20   *pStmt){.  int 
2d20: 72 63 3b 0a 20 20 64 62 5f 73 74 61 74 73 28 70  rc;.  db_stats(p
2d30: 53 74 6d 74 29 3b 0a 20 20 72 63 20 3d 20 73 71  Stmt);.  rc = sq
2d40: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
2d50: 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 64 62 5f  t->pStmt);.  db_
2d60: 63 68 65 63 6b 5f 72 65 73 75 6c 74 28 72 63 29  check_result(rc)
2d70: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2d80: 0a 69 6e 74 20 64 62 5f 66 69 6e 61 6c 69 7a 65  .int db_finalize
2d90: 28 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  (Stmt *pStmt){. 
2da0: 20 69 6e 74 20 72 63 3b 0a 20 20 64 62 5f 73 74   int rc;.  db_st
2db0: 61 74 73 28 70 53 74 6d 74 29 3b 0a 20 20 62 6c  ats(pStmt);.  bl
2dc0: 6f 62 5f 72 65 73 65 74 28 26 70 53 74 6d 74 2d  ob_reset(&pStmt-
2dd0: 3e 73 71 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71  >sql);.  rc = sq
2de0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2df0: 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Stmt->pStmt);.  
2e00: 64 62 5f 63 68 65 63 6b 5f 72 65 73 75 6c 74 28  db_check_result(
2e10: 72 63 29 3b 0a 20 20 70 53 74 6d 74 2d 3e 70 53  rc);.  pStmt->pS
2e20: 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  tmt = 0;.  if( p
2e30: 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  Stmt->pNext ){. 
2e40: 20 20 20 70 53 74 6d 74 2d 3e 70 4e 65 78 74 2d     pStmt->pNext-
2e50: 3e 70 50 72 65 76 20 3d 20 70 53 74 6d 74 2d 3e  >pPrev = pStmt->
2e60: 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28  pPrev;.  }.  if(
2e70: 20 70 53 74 6d 74 2d 3e 70 50 72 65 76 20 29 7b   pStmt->pPrev ){
2e80: 0a 20 20 20 20 70 53 74 6d 74 2d 3e 70 50 72 65  .    pStmt->pPre
2e90: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 53 74 6d 74  v->pNext = pStmt
2ea0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
2eb0: 20 69 66 28 20 64 62 2e 70 41 6c 6c 53 74 6d 74   if( db.pAllStmt
2ec0: 3d 3d 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 64  ==pStmt ){.    d
2ed0: 62 2e 70 41 6c 6c 53 74 6d 74 20 3d 20 70 53 74  b.pAllStmt = pSt
2ee0: 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  mt->pNext;.  }. 
2ef0: 20 70 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20   pStmt->pNext = 
2f00: 30 3b 0a 20 20 70 53 74 6d 74 2d 3e 70 50 72 65  0;.  pStmt->pPre
2f10: 76 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  v = 0;.  return 
2f20: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2f30: 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66  urn the rowid of
2f40: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
2f50: 20 69 6e 73 65 72 74 0a 2a 2f 0a 69 6e 74 20 64   insert.*/.int d
2f60: 62 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  b_last_insert_ro
2f70: 77 69 64 28 76 6f 69 64 29 7b 0a 20 20 69 36 34  wid(void){.  i64
2f80: 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73   x = sqlite3_las
2f90: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 67  t_insert_rowid(g
2fa0: 2e 64 62 29 3b 0a 20 20 69 66 28 20 78 3c 30 20  .db);.  if( x<0 
2fb0: 7c 7c 20 78 3e 28 69 36 34 29 32 31 34 37 34 38  || x>(i64)214748
2fc0: 33 36 34 37 20 29 7b 0a 20 20 20 20 66 6f 73 73  3647 ){.    foss
2fd0: 69 6c 5f 66 61 74 61 6c 28 22 72 6f 77 69 64 20  il_fatal("rowid 
2fe0: 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 30 2e  out of range (0.
2ff0: 2e 32 31 34 37 34 38 33 36 34 37 29 22 29 3b 0a  .2147483647)");.
3000: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
3010: 74 29 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  t)x;.}../*.** Re
3020: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
3030: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72  of rows that wer
3040: 65 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 65  e changed by the
3050: 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
3060: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
3070: 6f 72 20 44 45 4c 45 54 45 2e 20 20 41 75 78 69  or DELETE.  Auxi
3080: 6c 69 61 72 79 20 63 68 61 6e 67 65 73 20 63 61  liary changes ca
3090: 75 73 65 64 20 62 79 20 74 72 69 67 67 65 72 73  used by triggers
30a0: 0a 2a 2a 20 6f 72 20 6f 74 68 65 72 20 73 69 64  .** or other sid
30b0: 65 20 65 66 66 65 63 74 73 20 61 72 65 20 6e 6f  e effects are no
30c0: 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 69 6e  t counted..*/.in
30d0: 74 20 64 62 5f 63 68 61 6e 67 65 73 28 76 6f 69  t db_changes(voi
30e0: 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  d){.  return sql
30f0: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 67 2e 64  ite3_changes(g.d
3100: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74  b);.}../*.** Ext
3110: 72 61 63 74 20 74 65 78 74 2c 20 69 6e 74 65 67  ract text, integ
3120: 65 72 2c 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  er, or blob valu
3130: 65 73 20 66 72 6f 6d 20 74 68 65 20 4e 2d 74 68  es from the N-th
3140: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 0a 2a   column of the.*
3150: 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a  * current row..*
3160: 2f 0a 69 6e 74 20 64 62 5f 63 6f 6c 75 6d 6e 5f  /.int db_column_
3170: 62 79 74 65 73 28 53 74 6d 74 20 2a 70 53 74 6d  bytes(Stmt *pStm
3180: 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 74  t, int N){.  ret
3190: 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  urn sqlite3_colu
31a0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2d 3e  mn_bytes(pStmt->
31b0: 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 69 6e 74  pStmt, N);.}.int
31c0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 53   db_column_int(S
31d0: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20  tmt *pStmt, int 
31e0: 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  N){.  return sql
31f0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
3200: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29  pStmt->pStmt, N)
3210: 3b 0a 7d 0a 69 36 34 20 64 62 5f 63 6f 6c 75 6d  ;.}.i64 db_colum
3220: 6e 5f 69 6e 74 36 34 28 53 74 6d 74 20 2a 70 53  n_int64(Stmt *pS
3230: 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72  tmt, int N){.  r
3240: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 6f  eturn sqlite3_co
3250: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
3260: 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 64  ->pStmt, N);.}.d
3270: 6f 75 62 6c 65 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ouble db_column_
3280: 64 6f 75 62 6c 65 28 53 74 6d 74 20 2a 70 53 74  double(Stmt *pSt
3290: 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65  mt, int N){.  re
32a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6c  turn sqlite3_col
32b0: 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  umn_double(pStmt
32c0: 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 63  ->pStmt, N);.}.c
32d0: 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 5f 63 6f  onst char *db_co
32e0: 6c 75 6d 6e 5f 74 65 78 74 28 53 74 6d 74 20 2a  lumn_text(Stmt *
32f0: 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20  pStmt, int N){. 
3300: 20 72 65 74 75 72 6e 20 28 63 68 61 72 2a 29 73   return (char*)s
3310: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
3320: 78 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c  xt(pStmt->pStmt,
3330: 20 4e 29 3b 0a 7d 0a 63 6f 6e 73 74 20 63 68 61   N);.}.const cha
3340: 72 20 2a 64 62 5f 63 6f 6c 75 6d 6e 5f 72 61 77  r *db_column_raw
3350: 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e  (Stmt *pStmt, in
3360: 74 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  t N){.  return (
3370: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
3380: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
3390: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29  pStmt->pStmt, N)
33a0: 3b 0a 7d 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.}.const char *
33b0: 64 62 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 53  db_column_name(S
33c0: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20  tmt *pStmt, int 
33d0: 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 63 68  N){.  return (ch
33e0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
33f0: 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2d 3e 70  mn_name(pStmt->p
3400: 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 69 6e 74 20  Stmt, N);.}.int 
3410: 64 62 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  db_column_count(
3420: 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20  Stmt *pStmt){.  
3430: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
3440: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
3450: 74 2d 3e 70 53 74 6d 74 29 3b 0a 7d 0a 63 68 61  t->pStmt);.}.cha
3460: 72 20 2a 64 62 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c  r *db_column_mal
3470: 6c 6f 63 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c  loc(Stmt *pStmt,
3480: 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 74 75 72   int N){.  retur
3490: 6e 20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  n mprintf("%s", 
34a0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  db_column_text(p
34b0: 53 74 6d 74 2c 20 4e 29 29 3b 0a 7d 0a 76 6f 69  Stmt, N));.}.voi
34c0: 64 20 64 62 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  d db_column_blob
34d0: 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e  (Stmt *pStmt, in
34e0: 74 20 4e 2c 20 42 6c 6f 62 20 2a 70 42 6c 6f 62  t N, Blob *pBlob
34f0: 29 7b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  ){.  blob_append
3500: 28 70 42 6c 6f 62 2c 20 73 71 6c 69 74 65 33 5f  (pBlob, sqlite3_
3510: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
3520: 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 2c 0a 20 20  t->pStmt, N),.  
3530: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
3540: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
3550: 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e  (pStmt->pStmt, N
3560: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ));.}../*.** Ini
3570: 74 69 61 6c 69 7a 65 20 61 20 62 6c 6f 62 20 74  tialize a blob t
3580: 6f 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 63  o an ephemeral c
3590: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  opy of the conte
35a0: 6e 74 20 6f 66 20 61 0a 2a 2a 20 63 6f 6c 75 6d  nt of a.** colum
35b0: 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
35c0: 20 72 6f 77 2e 20 20 54 68 65 20 64 61 74 61 20   row.  The data 
35d0: 69 6e 20 74 68 65 20 62 6c 6f 62 20 77 69 6c 6c  in the blob will
35e0: 20 62 65 63 6f 6d 65 0a 2a 2a 20 69 6e 76 61 6c   become.** inval
35f0: 69 64 20 77 68 65 6e 20 74 68 65 20 73 74 61 74  id when the stat
3600: 65 6d 65 6e 74 20 69 73 20 73 74 65 70 70 65 64  ement is stepped
3610: 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f   or reset..*/.vo
3620: 69 64 20 64 62 5f 65 70 68 65 6d 65 72 61 6c 5f  id db_ephemeral_
3630: 62 6c 6f 62 28 53 74 6d 74 20 2a 70 53 74 6d 74  blob(Stmt *pStmt
3640: 2c 20 69 6e 74 20 4e 2c 20 42 6c 6f 62 20 2a 70  , int N, Blob *p
3650: 42 6c 6f 62 29 7b 0a 20 20 62 6c 6f 62 5f 69 6e  Blob){.  blob_in
3660: 69 74 28 70 42 6c 6f 62 2c 20 73 71 6c 69 74 65  it(pBlob, sqlite
3670: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
3680: 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 2c 0a  tmt->pStmt, N),.
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
36a0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
36b0: 65 73 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c  es(pStmt->pStmt,
36c0: 20 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   N));.}../*.** C
36d0: 68 65 63 6b 20 61 20 72 65 73 75 6c 74 20 63 6f  heck a result co
36e0: 64 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  de.  If it is no
36f0: 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 70 72 69  t SQLITE_OK, pri
3700: 6e 74 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  nt the.** corres
3710: 70 6f 6e 64 69 6e 67 20 65 72 72 6f 72 20 6d 65  ponding error me
3720: 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e 0a  ssage and exit..
3730: 2a 2f 0a 76 6f 69 64 20 64 62 5f 63 68 65 63 6b  */.void db_check
3740: 5f 72 65 73 75 6c 74 28 69 6e 74 20 72 63 29 7b  _result(int rc){
3750: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
3760: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 5f 65  E_OK ){.    db_e
3770: 72 72 28 22 53 51 4c 20 65 72 72 6f 72 3a 20 25  rr("SQL error: %
3780: 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
3790: 73 67 28 67 2e 64 62 29 29 3b 0a 20 20 7d 0a 7d  sg(g.db));.  }.}
37a0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
37b0: 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65  a single prepare
37c0: 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 74 69  d statement unti
37d0: 6c 20 69 74 20 66 69 6e 69 73 68 65 73 2e 0a 2a  l it finishes..*
37e0: 2f 0a 69 6e 74 20 64 62 5f 65 78 65 63 28 53 74  /.int db_exec(St
37f0: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69 6e  mt *pStmt){.  in
3800: 74 20 72 63 3b 0a 20 20 77 68 69 6c 65 28 20 28  t rc;.  while( (
3810: 72 63 20 3d 20 64 62 5f 73 74 65 70 28 70 53 74  rc = db_step(pSt
3820: 6d 74 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  mt))==SQLITE_ROW
3830: 20 29 7b 7d 0a 20 20 72 63 20 3d 20 64 62 5f 72   ){}.  rc = db_r
3840: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 64  eset(pStmt);.  d
3850: 62 5f 63 68 65 63 6b 5f 72 65 73 75 6c 74 28 72  b_check_result(r
3860: 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  c);.  return rc;
3870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
3880: 65 20 6d 75 6c 74 69 70 6c 65 20 53 51 4c 20 73  e multiple SQL s
3890: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
38a0: 74 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28  t db_multi_exec(
38b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
38c0: 2c 20 2e 2e 2e 29 7b 0a 20 20 42 6c 6f 62 20 73  , ...){.  Blob s
38d0: 71 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ql;.  int rc = S
38e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76 61 5f 6c  QLITE_OK;.  va_l
38f0: 69 73 74 20 61 70 3b 0a 20 20 63 6f 6e 73 74 20  ist ap;.  const 
3900: 63 68 61 72 20 2a 7a 2c 20 2a 7a 45 6e 64 3b 0a  char *z, *zEnd;.
3910: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
3920: 70 53 74 6d 74 3b 0a 20 20 62 6c 6f 62 5f 69 6e  pStmt;.  blob_in
3930: 69 74 28 26 73 71 6c 2c 20 30 2c 20 30 29 3b 0a  it(&sql, 0, 0);.
3940: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
3950: 53 71 6c 29 3b 0a 20 20 62 6c 6f 62 5f 76 61 70  Sql);.  blob_vap
3960: 70 65 6e 64 66 28 26 73 71 6c 2c 20 7a 53 71 6c  pendf(&sql, zSql
3970: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
3980: 61 70 29 3b 0a 20 20 7a 20 3d 20 62 6c 6f 62 5f  ap);.  z = blob_
3990: 73 74 72 28 26 73 71 6c 29 3b 0a 20 20 77 68 69  str(&sql);.  whi
39a0: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
39b0: 4b 20 26 26 20 7a 5b 30 5d 20 29 7b 0a 20 20 20  K && z[0] ){.   
39c0: 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
39d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
39e0: 70 61 72 65 5f 76 32 28 67 2e 64 62 2c 20 7a 2c  pare_v2(g.db, z,
39f0: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 45   -1, &pStmt, &zE
3a00: 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  nd);.    if( rc!
3a10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65  =SQLITE_OK ) bre
3a20: 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 53 74 6d  ak;.    if( pStm
3a30: 74 20 29 7b 0a 20 20 20 20 20 20 64 62 2e 6e 50  t ){.      db.nP
3a40: 72 65 70 61 72 65 2b 2b 3b 0a 20 20 20 20 20 20  repare++;.      
3a50: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
3a60: 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
3a70: 54 45 5f 52 4f 57 20 29 7b 7d 0a 20 20 20 20 20  TE_ROW ){}.     
3a80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
3a90: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
3aa0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 64 62       if( rc ) db
3ab0: 5f 65 72 72 28 22 25 73 3a 20 7b 25 2e 2a 73 7d  _err("%s: {%.*s}
3ac0: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
3ad0: 67 28 67 2e 64 62 29 2c 20 28 69 6e 74 29 28 7a  g(g.db), (int)(z
3ae0: 45 6e 64 2d 7a 29 2c 20 7a 29 3b 0a 20 20 20 20  End-z), z);.    
3af0: 7d 0a 20 20 20 20 7a 20 3d 20 7a 45 6e 64 3b 0a  }.    z = zEnd;.
3b00: 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74    }.  blob_reset
3b10: 28 26 73 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (&sql);.  return
3b20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
3b30: 74 69 6f 6e 61 6c 6c 79 20 6d 61 6b 65 20 74 68  tionally make th
3b40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e  e following chan
3b50: 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
3b60: 61 73 65 20 69 66 20 66 65 61 73 69 62 6c 65 20  ase if feasible 
3b70: 61 6e 64 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e  and.** convenien
3b80: 74 2e 20 20 44 6f 20 6e 6f 74 20 73 74 61 72 74  t.  Do not start
3b90: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66   a transaction f
3ba0: 6f 72 20 74 68 65 73 65 20 63 68 61 6e 67 65 73  or these changes
3bb0: 2c 20 62 75 74 20 6f 6e 6c 79 0a 2a 2a 20 6d 61  , but only.** ma
3bc0: 6b 65 20 74 68 65 73 65 20 63 68 61 6e 67 65 73  ke these changes
3bd0: 20 69 66 20 6f 74 68 65 72 20 63 68 61 6e 67 65   if other change
3be0: 73 20 61 72 65 20 61 6c 73 6f 20 62 65 69 6e 67  s are also being
3bf0: 20 6d 61 64 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64   made..*/.void d
3c00: 62 5f 6f 70 74 69 6f 6e 61 6c 5f 73 71 6c 28 63  b_optional_sql(c
3c10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
3c20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
3c30: 2c 20 2e 2e 2e 29 7b 0a 20 20 69 66 28 20 64 62  , ...){.  if( db
3c40: 5f 69 73 5f 77 72 69 74 65 61 62 6c 65 28 7a 44  _is_writeable(zD
3c50: 62 29 20 26 26 20 64 62 2e 6e 42 65 66 6f 72 65  b) && db.nBefore
3c60: 43 6f 6d 6d 69 74 20 3c 20 63 6f 75 6e 74 28 64  Commit < count(d
3c70: 62 2e 61 7a 42 65 66 6f 72 65 43 6f 6d 6d 69 74  b.azBeforeCommit
3c80: 29 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74  ) ){.    va_list
3c90: 20 61 70 3b 0a 20 20 20 20 76 61 5f 73 74 61 72   ap;.    va_star
3ca0: 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  t(ap, zSql);.   
3cb0: 20 64 62 2e 61 7a 42 65 66 6f 72 65 43 6f 6d 6d   db.azBeforeComm
3cc0: 69 74 5b 64 62 2e 6e 42 65 66 6f 72 65 43 6f 6d  it[db.nBeforeCom
3cd0: 6d 69 74 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33  mit++] = sqlite3
3ce0: 5f 76 6d 70 72 69 6e 74 66 28 7a 53 71 6c 2c 20  _vmprintf(zSql, 
3cf0: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
3d00: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
3d10: 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72  * Execute a quer
3d20: 79 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 73  y and return a s
3d30: 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 76 61  ingle integer va
3d40: 6c 75 65 2e 0a 2a 2f 0a 69 36 34 20 64 62 5f 69  lue..*/.i64 db_i
3d50: 6e 74 36 34 28 69 36 34 20 69 44 66 6c 74 2c 20  nt64(i64 iDflt, 
3d60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
3d70: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
3d80: 74 20 61 70 3b 0a 20 20 53 74 6d 74 20 73 3b 0a  t ap;.  Stmt s;.
3d90: 20 20 69 36 34 20 72 63 3b 0a 20 20 76 61 5f 73    i64 rc;.  va_s
3da0: 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a  tart(ap, zSql);.
3db0: 20 20 64 62 5f 76 70 72 65 70 61 72 65 28 26 73    db_vprepare(&s
3dc0: 2c 20 30 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a  , 0, zSql, ap);.
3dd0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
3de0: 69 66 28 20 64 62 5f 73 74 65 70 28 26 73 29 21  if( db_step(&s)!
3df0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
3e00: 20 20 20 72 63 20 3d 20 69 44 66 6c 74 3b 0a 20     rc = iDflt;. 
3e10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
3e20: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34   db_column_int64
3e30: 28 26 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64  (&s, 0);.  }.  d
3e40: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a  b_finalize(&s);.
3e50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
3e60: 6e 74 20 64 62 5f 69 6e 74 28 69 6e 74 20 69 44  nt db_int(int iD
3e70: 66 6c 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  flt, const char 
3e80: 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76  *zSql, ...){.  v
3e90: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d  a_list ap;.  Stm
3ea0: 74 20 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  t s;.  int rc;. 
3eb0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53   va_start(ap, zS
3ec0: 71 6c 29 3b 0a 20 20 64 62 5f 76 70 72 65 70 61  ql);.  db_vprepa
3ed0: 72 65 28 26 73 2c 20 30 2c 20 7a 53 71 6c 2c 20  re(&s, 0, zSql, 
3ee0: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
3ef0: 29 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70  );.  if( db_step
3f00: 28 26 73 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57  (&s)!=SQLITE_ROW
3f10: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 44 66   ){.    rc = iDf
3f20: 6c 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  lt;.  }else{.   
3f30: 20 72 63 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f   rc = db_column_
3f40: 69 6e 74 28 26 73 2c 20 30 29 3b 0a 20 20 7d 0a  int(&s, 0);.  }.
3f50: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73    db_finalize(&s
3f60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
3f70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3f80: 54 52 55 45 20 69 66 20 74 68 65 20 71 75 65 72  TRUE if the quer
3f90: 79 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 31  y would return 1
3fa0: 20 6f 72 20 6d 6f 72 65 20 72 6f 77 73 2e 20 20   or more rows.  
3fb0: 52 65 74 75 72 6e 0a 2a 2a 20 46 41 4c 53 45 20  Return.** FALSE 
3fc0: 69 66 20 74 68 65 20 71 75 65 72 79 20 72 65 73  if the query res
3fd0: 75 6c 74 20 77 6f 75 6c 64 20 62 65 20 61 6e 20  ult would be an 
3fe0: 65 6d 70 74 79 20 73 65 74 2e 0a 2a 2f 0a 69 6e  empty set..*/.in
3ff0: 74 20 64 62 5f 65 78 69 73 74 73 28 63 6f 6e 73  t db_exists(cons
4000: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e  t char *zSql, ..
4010: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
4020: 3b 0a 20 20 53 74 6d 74 20 73 3b 0a 20 20 69 6e  ;.  Stmt s;.  in
4030: 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  t rc;.  va_start
4040: 28 61 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 64 62  (ap, zSql);.  db
4050: 5f 76 70 72 65 70 61 72 65 28 26 73 2c 20 30 2c  _vprepare(&s, 0,
4060: 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20 76 61   zSql, ap);.  va
4070: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
4080: 64 62 5f 73 74 65 70 28 26 73 29 21 3d 53 51 4c  db_step(&s)!=SQL
4090: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72  ITE_ROW ){.    r
40a0: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
40b0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
40c0: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73    db_finalize(&s
40d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
40e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  }.../*.** Execut
40f0: 65 20 61 20 71 75 65 72 79 20 61 6e 64 20 72 65  e a query and re
4100: 74 75 72 6e 20 61 20 66 6c 6f 61 74 69 6e 67 2d  turn a floating-
4110: 70 6f 69 6e 74 20 76 61 6c 75 65 2e 0a 2a 2f 0a  point value..*/.
4120: 64 6f 75 62 6c 65 20 64 62 5f 64 6f 75 62 6c 65  double db_double
4130: 28 64 6f 75 62 6c 65 20 72 44 66 6c 74 2c 20 63  (double rDflt, c
4140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
4150: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
4160: 20 61 70 3b 0a 20 20 53 74 6d 74 20 73 3b 0a 20   ap;.  Stmt s;. 
4170: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 76 61 5f   double r;.  va_
4180: 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b  start(ap, zSql);
4190: 0a 20 20 64 62 5f 76 70 72 65 70 61 72 65 28 26  .  db_vprepare(&
41a0: 73 2c 20 30 2c 20 7a 53 71 6c 2c 20 61 70 29 3b  s, 0, zSql, ap);
41b0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
41c0: 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 73 29   if( db_step(&s)
41d0: 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  !=SQLITE_ROW ){.
41e0: 20 20 20 20 72 20 3d 20 72 44 66 6c 74 3b 0a 20      r = rDflt;. 
41f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 20 3d 20   }else{.    r = 
4200: 64 62 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  db_column_double
4210: 28 26 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64  (&s, 0);.  }.  d
4220: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a  b_finalize(&s);.
4230: 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f    return r;.}../
4240: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71  *.** Execute a q
4250: 75 65 72 79 20 61 6e 64 20 61 70 70 65 6e 64 20  uery and append 
4260: 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  the first column
4270: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f   of the first ro
4280: 77 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 73 75  w.** of the resu
4290: 6c 74 20 73 65 74 20 74 6f 20 62 6c 6f 62 20 67  lt set to blob g
42a0: 69 76 65 6e 20 69 6e 20 74 68 65 20 66 69 72 73  iven in the firs
42b0: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76  t argument..*/.v
42c0: 6f 69 64 20 64 62 5f 62 6c 6f 62 28 42 6c 6f 62  oid db_blob(Blob
42d0: 20 2a 70 52 65 73 75 6c 74 2c 20 63 6f 6e 73 74   *pResult, const
42e0: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e   char *zSql, ...
42f0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
4300: 0a 20 20 53 74 6d 74 20 73 3b 0a 20 20 76 61 5f  .  Stmt s;.  va_
4310: 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b  start(ap, zSql);
4320: 0a 20 20 64 62 5f 76 70 72 65 70 61 72 65 28 26  .  db_vprepare(&
4330: 73 2c 20 30 2c 20 7a 53 71 6c 2c 20 61 70 29 3b  s, 0, zSql, ap);
4340: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
4350: 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 73 29   if( db_step(&s)
4360: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
4370: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
4380: 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
4390: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 73 2e 70  _column_blob(s.p
43a0: 53 74 6d 74 2c 20 30 29 2c 0a 20 20 20 20 20 20  Stmt, 0),.      
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43c0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
43d0: 6e 5f 62 79 74 65 73 28 73 2e 70 53 74 6d 74 2c  n_bytes(s.pStmt,
43e0: 20 30 29 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66   0));.  }.  db_f
43f0: 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 7d 0a 0a  inalize(&s);.}..
4400: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
4410: 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74  query.  Return t
4420: 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  he first column 
4430: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
4440: 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 73 75 6c  .** of the resul
4450: 74 20 73 65 74 20 61 73 20 61 20 73 74 72 69 6e  t set as a strin
4460: 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  g.  Space to hol
4470: 64 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 0a  d the string is.
4480: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
4490: 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 49 66 20 74   malloc().  If t
44a0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  he result set is
44b0: 20 65 6d 70 74 79 2c 20 72 65 74 75 72 6e 0a 2a   empty, return.*
44c0: 2a 20 7a 44 65 66 61 75 6c 74 20 69 6e 73 74 65  * zDefault inste
44d0: 61 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 64 62 5f  ad..*/.char *db_
44e0: 74 65 78 74 28 63 68 61 72 20 63 6f 6e 73 74 20  text(char const 
44f0: 2a 7a 44 65 66 61 75 6c 74 2c 20 63 6f 6e 73 74  *zDefault, const
4500: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e   char *zSql, ...
4510: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
4520: 0a 20 20 53 74 6d 74 20 73 3b 0a 20 20 63 68 61  .  Stmt s;.  cha
4530: 72 20 2a 7a 3b 0a 20 20 76 61 5f 73 74 61 72 74  r *z;.  va_start
4540: 28 61 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 64 62  (ap, zSql);.  db
4550: 5f 76 70 72 65 70 61 72 65 28 26 73 2c 20 30 2c  _vprepare(&s, 0,
4560: 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20 76 61   zSql, ap);.  va
4570: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
4580: 64 62 5f 73 74 65 70 28 26 73 29 3d 3d 53 51 4c  db_step(&s)==SQL
4590: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a  ITE_ROW ){.    z
45a0: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c   = mprintf("%s",
45b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
45c0: 74 65 78 74 28 73 2e 70 53 74 6d 74 2c 20 30 29  text(s.pStmt, 0)
45d0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  );.  }else if( z
45e0: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 7a  Default ){.    z
45f0: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c   = mprintf("%s",
4600: 20 7a 44 65 66 61 75 6c 74 29 3b 0a 20 20 7d 65   zDefault);.  }e
4610: 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 30 3b 0a  lse{.    z = 0;.
4620: 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a    }.  db_finaliz
4630: 65 28 26 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&s);.  return 
4640: 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  z;.}../*.** Init
4650: 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 64 61 74  ialize a new dat
4660: 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 20  abase file with 
4670: 74 68 65 20 67 69 76 65 6e 20 73 63 68 65 6d 61  the given schema
4680: 2e 20 20 49 66 20 61 6e 79 74 68 69 6e 67 0a 2a  .  If anything.*
4690: 2a 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 63 61  * goes wrong, ca
46a0: 6c 6c 20 64 62 5f 65 72 72 28 29 20 74 6f 20 65  ll db_err() to e
46b0: 78 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f  xit..*/.void db_
46c0: 69 6e 69 74 5f 64 61 74 61 62 61 73 65 28 0a 20  init_database(. 
46d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
46e0: 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  leName,   /* Nam
46f0: 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  e of database fi
4700: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  le to create */.
4710: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
4720: 63 68 65 6d 61 2c 20 20 20 20 20 2f 2a 20 46 69  chema,     /* Fi
4730: 72 73 74 20 70 61 72 74 20 6f 66 20 73 63 68 65  rst part of sche
4740: 6d 61 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20 20  ma */.  ...     
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4760: 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 53   /* Additional S
4770: 51 4c 20 74 6f 20 72 75 6e 2e 20 20 54 65 72 6d  QL to run.  Term
4780: 69 6e 61 74 65 20 77 69 74 68 20 4e 55 4c 4c 2e  inate with NULL.
4790: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
47a0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
47b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
47c0: 71 6c 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  ql;.  va_list ap
47d0: 3b 0a 0a 20 20 64 62 20 3d 20 64 62 5f 6f 70 65  ;..  db = db_ope
47e0: 6e 28 7a 46 69 6c 65 4e 61 6d 65 29 3b 0a 20 20  n(zFileName);.  
47f0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
4800: 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56   "BEGIN EXCLUSIV
4810: 45 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  E", 0, 0, 0);.  
4820: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
4830: 63 28 64 62 2c 20 7a 53 63 68 65 6d 61 2c 20 30  c(db, zSchema, 0
4840: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
4850: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
4860: 20 20 20 20 64 62 5f 65 72 72 28 73 71 6c 69 74      db_err(sqlit
4870: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
4880: 20 20 7d 0a 20 20 76 61 5f 73 74 61 72 74 28 61    }.  va_start(a
4890: 70 2c 20 7a 53 63 68 65 6d 61 29 3b 0a 20 20 77  p, zSchema);.  w
48a0: 68 69 6c 65 28 20 28 7a 53 71 6c 20 3d 20 76 61  hile( (zSql = va
48b0: 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63  _arg(ap, const c
48c0: 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20  har*))!=0 ){.   
48d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
48e0: 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  ec(db, zSql, 0, 
48f0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
4900: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
4910: 20 20 20 20 20 20 64 62 5f 65 72 72 28 73 71 6c        db_err(sql
4920: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
4930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
4940: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c 69  _end(ap);.  sqli
4950: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 43 4f  te3_exec(db, "CO
4960: 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b  MMIT", 0, 0, 0);
4970: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
4980: 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  (db);.}../*.** F
4990: 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72  unction to retur
49a0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
49b0: 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
49c0: 37 30 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  70.  This is.** 
49d0: 74 68 65 20 73 61 6d 65 20 61 73 20 73 74 72 66  the same as strf
49e0: 74 69 6d 65 28 27 25 73 27 2c 27 6e 6f 77 27 29  time('%s','now')
49f0: 20 62 75 74 20 69 73 20 6d 6f 72 65 20 63 6f 6d   but is more com
4a00: 70 61 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62  pact..*/.void db
4a10: 5f 6e 6f 77 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  _now_function(. 
4a20: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
4a30: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
4a40: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
4a50: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
4a60: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
4a70: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
4a80: 20 74 69 6d 65 28 30 29 29 3b 0a 7d 0a 0a 2f 2a   time(0));.}../*
4a90: 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20  .** Function to 
4aa0: 72 65 74 75 72 6e 20 74 68 65 20 63 68 65 63 6b  return the check
4ab0: 2d 69 6e 20 74 69 6d 65 20 66 6f 72 20 61 20 66  -in time for a f
4ac0: 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f  ile..*/.void db_
4ad0: 63 68 65 63 6b 69 6e 5f 6d 74 69 6d 65 5f 66 75  checkin_mtime_fu
4ae0: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
4af0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
4b00: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
4b10: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
4b20: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 36 34 20  **argv.){.  i64 
4b30: 6d 74 69 6d 65 3b 0a 20 20 69 6e 74 20 72 63 20  mtime;.  int rc 
4b40: 3d 20 6d 74 69 6d 65 5f 6f 66 5f 6d 61 6e 69 66  = mtime_of_manif
4b50: 65 73 74 5f 66 69 6c 65 28 73 71 6c 69 74 65 33  est_file(sqlite3
4b60: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
4b70: 30 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  0]),.           
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
4ba0: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d  alue_int(argv[1]
4bb0: 29 2c 20 26 6d 74 69 6d 65 29 3b 0a 20 20 69 66  ), &mtime);.  if
4bc0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ( rc==0 ){.    s
4bd0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
4be0: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 6d 74 69  t64(context, mti
4bf0: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  me);.  }.}.../*.
4c00: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
4c10: 73 65 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e  se file.  Return
4c20: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4c30: 65 20 6e 65 77 20 64 61 74 61 62 61 73 65 0a 2a  e new database.*
4c40: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 41  * connection.  A
4c50: 6e 20 65 72 72 6f 72 20 72 65 73 75 6c 74 73 20  n error results 
4c60: 69 6e 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74  in process abort
4c70: 2e 0a 2a 2f 0a 4c 4f 43 41 4c 20 73 71 6c 69 74  ..*/.LOCAL sqlit
4c80: 65 33 20 2a 64 62 5f 6f 70 65 6e 28 63 6f 6e 73  e3 *db_open(cons
4c90: 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29  t char *zDbName)
4ca0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
4cb0: 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 23 69 66 20  lite3 *db;..#if 
4cc0: 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
4cd0: 5f 5f 29 20 26 26 20 55 53 45 5f 53 59 53 54 45  __) && USE_SYSTE
4ce0: 4d 5f 53 51 4c 49 54 45 2b 30 21 3d 31 0a 20 20  M_SQLITE+0!=1.  
4cf0: 7a 44 62 4e 61 6d 65 20 3d 20 66 6f 73 73 69 6c  zDbName = fossil
4d00: 5f 75 74 66 38 5f 74 6f 5f 66 69 6c 65 6e 61 6d  _utf8_to_filenam
4d10: 65 28 7a 44 62 4e 61 6d 65 29 3b 0a 23 65 6e 64  e(zDbName);.#end
4d20: 69 66 0a 20 20 69 66 28 20 67 2e 66 53 71 6c 54  if.  if( g.fSqlT
4d30: 72 61 63 65 20 29 20 66 6f 73 73 69 6c 5f 74 72  race ) fossil_tr
4d40: 61 63 65 28 22 2d 2d 20 73 71 6c 69 74 65 33 5f  ace("-- sqlite3_
4d50: 6f 70 65 6e 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  open: [%s]\n", z
4d60: 44 62 4e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20  DbName);.  rc = 
4d70: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
4d80: 0a 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c  .       zDbName,
4d90: 20 26 64 62 2c 0a 20 20 20 20 20 20 20 53 51 4c   &db,.       SQL
4da0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
4db0: 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
4dc0: 5f 43 52 45 41 54 45 2c 0a 20 20 20 20 20 20 20  _CREATE,.       
4dd0: 67 2e 7a 56 66 73 4e 61 6d 65 0a 20 20 29 3b 0a  g.zVfsName.  );.
4de0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4df0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 5f 65 72  _OK ){.    db_er
4e00: 72 28 22 5b 25 73 5d 3a 20 25 73 22 2c 20 7a 44  r("[%s]: %s", zD
4e10: 62 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65  bName, sqlite3_e
4e20: 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a  rrmsg(db));.  }.
4e30: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74    sqlite3_busy_t
4e40: 69 6d 65 6f 75 74 28 64 62 2c 20 35 30 30 30 29  imeout(db, 5000)
4e50: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ;.  sqlite3_wal_
4e60: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64  autocheckpoint(d
4e70: 62 2c 20 31 29 3b 20 20 2f 2a 20 53 65 74 20 74  b, 1);  /* Set t
4e80: 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 66 72 65  o checkpoint fre
4e90: 71 75 65 6e 74 6c 79 20 2a 2f 0a 20 20 73 71 6c  quently */.  sql
4ea0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
4eb0: 74 69 6f 6e 28 64 62 2c 20 22 6e 6f 77 22 2c 20  tion(db, "now", 
4ec0: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
4ed0: 30 2c 20 64 62 5f 6e 6f 77 5f 66 75 6e 63 74 69  0, db_now_functi
4ee0: 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c  on, 0, 0);.  sql
4ef0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
4f00: 74 69 6f 6e 28 64 62 2c 20 22 63 68 65 63 6b 69  tion(db, "checki
4f10: 6e 5f 6d 74 69 6d 65 22 2c 20 32 2c 20 53 51 4c  n_mtime", 2, SQL
4f20: 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f40: 20 20 20 20 20 20 20 64 62 5f 63 68 65 63 6b 69         db_checki
4f50: 6e 5f 6d 74 69 6d 65 5f 66 75 6e 63 74 69 6f 6e  n_mtime_function
4f60: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
4f70: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
4f80: 6f 6e 28 64 62 2c 20 22 75 73 65 72 22 2c 20 30  on(db, "user", 0
4f90: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
4fa0: 2c 20 64 62 5f 73 71 6c 5f 75 73 65 72 2c 20 30  , db_sql_user, 0
4fb0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
4fc0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
4fd0: 64 62 2c 20 22 63 67 69 22 2c 20 31 2c 20 53 51  db, "cgi", 1, SQ
4fe0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 64 62  LITE_UTF8, 0, db
4ff0: 5f 73 71 6c 5f 63 67 69 2c 20 30 2c 20 30 29 3b  _sql_cgi, 0, 0);
5000: 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
5010: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
5020: 63 67 69 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  cgi", 2, SQLITE_
5030: 55 54 46 38 2c 20 30 2c 20 64 62 5f 73 71 6c 5f  UTF8, 0, db_sql_
5040: 63 67 69 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  cgi, 0, 0);.  sq
5050: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
5060: 63 74 69 6f 6e 28 64 62 2c 20 22 70 72 69 6e 74  ction(db, "print
5070: 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ", -1, SQLITE_UT
5080: 46 38 2c 20 30 2c 64 62 5f 73 71 6c 5f 70 72 69  F8, 0,db_sql_pri
5090: 6e 74 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74  nt,0,0);.  sqlit
50a0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
50b0: 6f 6e 28 0a 20 20 20 20 64 62 2c 20 22 69 73 5f  on(.    db, "is_
50c0: 73 65 6c 65 63 74 65 64 22 2c 20 31 2c 20 53 51  selected", 1, SQ
50d0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 69  LITE_UTF8, 0, fi
50e0: 6c 65 5f 69 73 5f 73 65 6c 65 63 74 65 64 2c 30  le_is_selected,0
50f0: 2c 30 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  ,0.  );.  sqlite
5100: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
5110: 6e 28 0a 20 20 20 20 64 62 2c 20 22 69 66 5f 73  n(.    db, "if_s
5120: 65 6c 65 63 74 65 64 22 2c 20 33 2c 20 53 51 4c  elected", 3, SQL
5130: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 69 6c  ITE_UTF8, 0, fil
5140: 65 5f 69 73 5f 73 65 6c 65 63 74 65 64 2c 30 2c  e_is_selected,0,
5150: 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 67 2e 66  0.  );.  if( g.f
5160: 53 71 6c 54 72 61 63 65 20 29 20 73 71 6c 69 74  SqlTrace ) sqlit
5170: 65 33 5f 74 72 61 63 65 28 64 62 2c 20 64 62 5f  e3_trace(db, db_
5180: 73 71 6c 5f 74 72 61 63 65 2c 20 30 29 3b 0a 20  sql_trace, 0);. 
5190: 20 72 65 5f 61 64 64 5f 73 71 6c 5f 66 75 6e 63   re_add_sql_func
51a0: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (db);.  sqlite3_
51b0: 65 78 65 63 28 64 62 2c 20 22 50 52 41 47 4d 41  exec(db, "PRAGMA
51c0: 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46   foreign_keys=OF
51d0: 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  F;", 0, 0, 0);. 
51e0: 20 72 65 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a 0a   return db;.}...
51f0: 2f 2a 0a 2a 2a 20 44 65 74 61 63 68 65 73 20 74  /*.** Detaches t
5200: 68 65 20 7a 4c 61 62 65 6c 20 64 61 74 61 62 61  he zLabel databa
5210: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 64  se..*/.void db_d
5220: 65 74 61 63 68 28 63 6f 6e 73 74 20 63 68 61 72  etach(const char
5230: 20 2a 7a 4c 61 62 65 6c 29 7b 0a 20 20 64 62 5f   *zLabel){.  db_
5240: 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 45 54 41  multi_exec("DETA
5250: 43 48 20 44 41 54 41 42 41 53 45 20 25 73 22 2c  CH DATABASE %s",
5260: 20 7a 4c 61 62 65 6c 29 3b 0a 7d 0a 0a 2f 2a 0a   zLabel);.}../*.
5270: 2a 2a 20 7a 44 62 4e 61 6d 65 20 69 73 20 74 68  ** zDbName is th
5280: 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
5290: 62 61 73 65 20 66 69 6c 65 2e 20 20 41 74 74 61  base file.  Atta
52a0: 63 68 20 7a 44 62 4e 61 6d 65 20 75 73 69 6e 67  ch zDbName using
52b0: 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 7a 4c 61  .** the name zLa
52c0: 62 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f  bel..*/.void db_
52d0: 61 74 74 61 63 68 28 63 6f 6e 73 74 20 63 68 61  attach(const cha
52e0: 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 63 6f 6e 73  r *zDbName, cons
52f0: 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 29 7b  t char *zLabel){
5300: 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63  .  db_multi_exec
5310: 28 22 41 54 54 41 43 48 20 44 41 54 41 42 41 53  ("ATTACH DATABAS
5320: 45 20 25 51 20 41 53 20 25 73 22 2c 20 7a 44 62  E %Q AS %s", zDb
5330: 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3b 0a 7d  Name, zLabel);.}
5340: 0a 0a 2f 2a 0a 2a 2a 20 7a 44 62 4e 61 6d 65 20  ../*.** zDbName 
5350: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
5360: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
5370: 20 49 66 20 6e 6f 20 6f 74 68 65 72 20 64 61 74   If no other dat
5380: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
5390: 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e   open, then open
53a0: 20 74 68 69 73 20 6f 6e 65 2e 20 20 49 66 20 61   this one.  If a
53b0: 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
53c0: 66 69 6c 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61  file is.** alrea
53d0: 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 61 74  dy open, then at
53e0: 74 61 63 68 20 7a 44 62 4e 61 6d 65 20 75 73 69  tach zDbName usi
53f0: 6e 67 20 74 68 65 20 6e 61 6d 65 20 7a 4c 61 62  ng the name zLab
5400: 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 6f  el..*/.void db_o
5410: 70 65 6e 5f 6f 72 5f 61 74 74 61 63 68 28 0a 20  pen_or_attach(. 
5420: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
5430: 4e 61 6d 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Name,.  const ch
5440: 61 72 20 2a 7a 4c 61 62 65 6c 2c 0a 20 20 69 6e  ar *zLabel,.  in
5450: 74 20 2a 70 57 61 73 41 74 74 61 63 68 65 64 0a  t *pWasAttached.
5460: 29 7b 0a 20 20 69 66 28 20 21 67 2e 64 62 20 29  ){.  if( !g.db )
5470: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 2e  {.    assert( g.
5480: 7a 4d 61 69 6e 44 62 54 79 70 65 3d 3d 30 20 29  zMainDbType==0 )
5490: 3b 0a 20 20 20 20 67 2e 64 62 20 3d 20 64 62 5f  ;.    g.db = db_
54a0: 6f 70 65 6e 28 7a 44 62 4e 61 6d 65 29 3b 0a 20  open(zDbName);. 
54b0: 20 20 20 67 2e 7a 4d 61 69 6e 44 62 54 79 70 65     g.zMainDbType
54c0: 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 69   = zLabel;.    i
54d0: 66 28 20 70 57 61 73 41 74 74 61 63 68 65 64 20  f( pWasAttached 
54e0: 29 20 2a 70 57 61 73 41 74 74 61 63 68 65 64 20  ) *pWasAttached 
54f0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
5500: 20 20 61 73 73 65 72 74 28 20 67 2e 7a 4d 61 69    assert( g.zMai
5510: 6e 44 62 54 79 70 65 21 3d 30 20 29 3b 0a 20 20  nDbType!=0 );.  
5520: 20 20 64 62 5f 61 74 74 61 63 68 28 7a 44 62 4e    db_attach(zDbN
5530: 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20  ame, zLabel);.  
5540: 20 20 69 66 28 20 70 57 61 73 41 74 74 61 63 68    if( pWasAttach
5550: 65 64 20 29 20 2a 70 57 61 73 41 74 74 61 63 68  ed ) *pWasAttach
5560: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
5570: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 75  *.** Close the u
5580: 73 65 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ser database..*/
5590: 0a 76 6f 69 64 20 64 62 5f 63 6c 6f 73 65 5f 63  .void db_close_c
55a0: 6f 6e 66 69 67 28 29 7b 0a 20 20 69 66 28 20 67  onfig(){.  if( g
55b0: 2e 75 73 65 41 74 74 61 63 68 20 29 7b 0a 20 20  .useAttach ){.  
55c0: 20 20 64 62 5f 64 65 74 61 63 68 28 22 63 6f 6e    db_detach("con
55d0: 66 69 67 64 62 22 29 3b 0a 20 20 20 20 67 2e 75  figdb");.    g.u
55e0: 73 65 41 74 74 61 63 68 20 3d 20 30 3b 0a 20 20  seAttach = 0;.  
55f0: 20 20 67 2e 7a 43 6f 6e 66 69 67 44 62 4e 61 6d    g.zConfigDbNam
5600: 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
5610: 66 28 20 67 2e 64 62 43 6f 6e 66 69 67 20 29 7b  f( g.dbConfig ){
5620: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
5630: 73 65 28 67 2e 64 62 43 6f 6e 66 69 67 29 3b 0a  se(g.dbConfig);.
5640: 20 20 20 20 67 2e 64 62 43 6f 6e 66 69 67 20 3d      g.dbConfig =
5650: 20 30 3b 0a 20 20 20 20 67 2e 7a 43 6f 6e 66 69   0;.    g.zConfi
5660: 67 44 62 54 79 70 65 20 3d 20 30 3b 0a 20 20 20  gDbType = 0;.   
5670: 20 67 2e 7a 43 6f 6e 66 69 67 44 62 4e 61 6d 65   g.zConfigDbName
5680: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
5690: 28 20 67 2e 64 62 20 26 26 20 66 6f 73 73 69 6c  ( g.db && fossil
56a0: 5f 73 74 72 63 6d 70 28 67 2e 7a 4d 61 69 6e 44  _strcmp(g.zMainD
56b0: 62 54 79 70 65 2c 20 22 63 6f 6e 66 69 67 64 62  bType, "configdb
56c0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ")==0 ){.    sql
56d0: 69 74 65 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29  ite3_close(g.db)
56e0: 3b 0a 20 20 20 20 67 2e 64 62 20 3d 20 30 3b 0a  ;.    g.db = 0;.
56f0: 20 20 20 20 67 2e 7a 4d 61 69 6e 44 62 54 79 70      g.zMainDbTyp
5700: 65 20 3d 20 30 3b 0a 20 20 20 20 67 2e 7a 43 6f  e = 0;.    g.zCo
5710: 6e 66 69 67 44 62 4e 61 6d 65 20 3d 20 30 3b 0a  nfigDbName = 0;.
5720: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
5730: 6e 20 74 68 65 20 75 73 65 72 20 64 61 74 61 62  n the user datab
5740: 61 73 65 20 69 6e 20 22 7e 2f 2e 66 6f 73 73 69  ase in "~/.fossi
5750: 6c 22 2e 20 20 43 72 65 61 74 65 20 74 68 65 20  l".  Create the 
5760: 64 61 74 61 62 61 73 65 20 61 6e 65 77 20 69 66  database anew if
5770: 0a 2a 2a 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  .** it does not 
5780: 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a 2a  already exist..*
5790: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 41  *.** If the useA
57a0: 74 74 61 63 68 20 66 6c 61 67 20 69 73 20 30 20  ttach flag is 0 
57b0: 28 74 68 65 20 75 73 75 61 6c 20 63 61 73 65 29  (the usual case)
57c0: 20 74 68 65 6e 20 74 68 65 20 75 73 65 72 20 64   then the user d
57d0: 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 6f 70  atabase is.** op
57e0: 65 6e 65 64 20 6f 6e 20 61 20 73 65 70 61 72 61  ened on a separa
57f0: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
5800: 65 63 74 69 6f 6e 20 67 2e 64 62 43 6f 6e 66 69  ection g.dbConfi
5810: 67 2e 20 20 54 68 69 73 20 70 72 65 76 65 6e 74  g.  This prevent
5820: 73 0a 2a 2a 20 74 68 65 20 7e 2f 2e 66 6f 73 73  s.** the ~/.foss
5830: 69 6c 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  il database from
5840: 20 62 65 63 6f 6d 69 6e 67 20 6c 6f 63 6b 65 64   becoming locked
5850: 20 6f 6e 20 6c 6f 6e 67 20 63 68 65 63 6b 2d 69   on long check-i
5860: 6e 20 6f 72 20 73 79 6e 63 0a 2a 2a 20 6f 70 65  n or sync.** ope
5870: 72 61 74 69 6f 6e 73 20 77 68 69 63 68 20 68 6f  rations which ho
5880: 6c 64 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ld an exclusive 
5890: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 6e  transaction.  In
58a0: 20 61 20 66 65 77 20 63 61 73 65 73 2c 20 74 68   a few cases, th
58b0: 6f 75 67 68 2c 0a 2a 2a 20 69 74 20 69 73 20 63  ough,.** it is c
58c0: 6f 6e 76 65 6e 69 65 6e 74 20 66 6f 72 20 74 68  onvenient for th
58d0: 65 20 7e 2f 2e 66 6f 73 73 69 6c 20 74 6f 20 62  e ~/.fossil to b
58e0: 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  e attached to th
58f0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
5900: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 6f  ** connection so
5910: 20 74 68 61 74 20 77 65 20 63 61 6e 20 6a 6f 69   that we can joi
5920: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 76 61  n between the va
5930: 72 69 6f 75 73 20 64 61 74 61 62 61 73 65 73 2e  rious databases.
5940: 20 20 49 6e 20 74 68 61 74 0a 2a 2a 20 63 61 73    In that.** cas
5950: 65 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72  e, invoke this r
5960: 6f 75 74 69 6e 65 20 77 69 74 68 20 75 73 65 41  outine with useA
5970: 74 74 61 63 68 20 61 73 20 31 2e 0a 2a 2f 0a 76  ttach as 1..*/.v
5980: 6f 69 64 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e 66  oid db_open_conf
5990: 69 67 28 69 6e 74 20 75 73 65 41 74 74 61 63 68  ig(int useAttach
59a0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 4e 61  ){.  char *zDbNa
59b0: 6d 65 3b 0a 20 20 63 68 61 72 20 2a 7a 48 6f 6d  me;.  char *zHom
59c0: 65 3b 0a 20 20 69 66 28 20 67 2e 7a 43 6f 6e 66  e;.  if( g.zConf
59d0: 69 67 44 62 4e 61 6d 65 20 29 7b 0a 20 20 20 20  igDbName ){.    
59e0: 69 66 28 20 75 73 65 41 74 74 61 63 68 3d 3d 67  if( useAttach==g
59f0: 2e 75 73 65 41 74 74 61 63 68 20 29 20 72 65 74  .useAttach ) ret
5a00: 75 72 6e 3b 0a 20 20 20 20 64 62 5f 63 6c 6f 73  urn;.    db_clos
5a10: 65 5f 63 6f 6e 66 69 67 28 29 3b 0a 20 20 7d 0a  e_config();.  }.
5a20: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
5a30: 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  32) || defined(_
5a40: 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 7a 48 6f  _CYGWIN__).  zHo
5a50: 6d 65 20 3d 20 66 6f 73 73 69 6c 5f 67 65 74 65  me = fossil_gete
5a60: 6e 76 28 22 4c 4f 43 41 4c 41 50 50 44 41 54 41  nv("LOCALAPPDATA
5a70: 22 29 3b 0a 20 20 69 66 28 20 7a 48 6f 6d 65 3d  ");.  if( zHome=
5a80: 3d 30 20 29 7b 0a 20 20 20 20 7a 48 6f 6d 65 20  =0 ){.    zHome 
5a90: 3d 20 66 6f 73 73 69 6c 5f 67 65 74 65 6e 76 28  = fossil_getenv(
5aa0: 22 41 50 50 44 41 54 41 22 29 3b 0a 20 20 20 20  "APPDATA");.    
5ab0: 69 66 28 20 7a 48 6f 6d 65 3d 3d 30 20 29 7b 0a  if( zHome==0 ){.
5ac0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 44 72 69        char *zDri
5ad0: 76 65 20 3d 20 66 6f 73 73 69 6c 5f 67 65 74 65  ve = fossil_gete
5ae0: 6e 76 28 22 48 4f 4d 45 44 52 49 56 45 22 29 3b  nv("HOMEDRIVE");
5af0: 0a 20 20 20 20 20 20 7a 48 6f 6d 65 20 3d 20 66  .      zHome = f
5b00: 6f 73 73 69 6c 5f 67 65 74 65 6e 76 28 22 48 4f  ossil_getenv("HO
5b10: 4d 45 50 41 54 48 22 29 3b 0a 20 20 20 20 20 20  MEPATH");.      
5b20: 69 66 28 20 7a 44 72 69 76 65 20 26 26 20 7a 48  if( zDrive && zH
5b30: 6f 6d 65 20 29 20 7a 48 6f 6d 65 20 3d 20 6d 70  ome ) zHome = mp
5b40: 72 69 6e 74 66 28 22 25 73 25 73 22 2c 20 7a 44  rintf("%s%s", zD
5b50: 72 69 76 65 2c 20 7a 48 6f 6d 65 29 3b 0a 20 20  rive, zHome);.  
5b60: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 48    }.  }.  if( zH
5b70: 6f 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ome==0 ){.    fo
5b80: 73 73 69 6c 5f 66 61 74 61 6c 28 22 63 61 6e 6e  ssil_fatal("cann
5b90: 6f 74 20 6c 6f 63 61 74 65 20 68 6f 6d 65 20 64  ot locate home d
5ba0: 69 72 65 63 74 6f 72 79 20 2d 20 22 0a 20 20 20  irectory - ".   
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70 6c               "pl
5bc0: 65 61 73 65 20 73 65 74 20 74 68 65 20 4c 4f 43  ease set the LOC
5bd0: 41 4c 41 50 50 44 41 54 41 20 6f 72 20 41 50 50  ALAPPDATA or APP
5be0: 44 41 54 41 20 6f 72 20 48 4f 4d 45 50 41 54 48  DATA or HOMEPATH
5bf0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
5c00: 20 20 20 22 65 6e 76 69 72 6f 6e 6d 65 6e 74 20     "environment 
5c10: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
5c20: 0a 23 65 6c 73 65 0a 20 20 7a 48 6f 6d 65 20 3d  .#else.  zHome =
5c30: 20 66 6f 73 73 69 6c 5f 67 65 74 65 6e 76 28 22   fossil_getenv("
5c40: 48 4f 4d 45 22 29 3b 0a 20 20 69 66 28 20 7a 48  HOME");.  if( zH
5c50: 6f 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ome==0 ){.    fo
5c60: 73 73 69 6c 5f 66 61 74 61 6c 28 22 63 61 6e 6e  ssil_fatal("cann
5c70: 6f 74 20 6c 6f 63 61 74 65 20 68 6f 6d 65 20 64  ot locate home d
5c80: 69 72 65 63 74 6f 72 79 20 2d 20 22 0a 20 20 20  irectory - ".   
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
5ca0: 6c 65 61 73 65 20 73 65 74 20 74 68 65 20 48 4f  lease set the HO
5cb0: 4d 45 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  ME environment v
5cc0: 61 72 69 61 62 6c 65 22 29 3b 0a 20 20 7d 0a 23  ariable");.  }.#
5cd0: 65 6e 64 69 66 0a 20 20 69 66 28 20 66 69 6c 65  endif.  if( file
5ce0: 5f 69 73 64 69 72 28 7a 48 6f 6d 65 29 21 3d 31  _isdir(zHome)!=1
5cf0: 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66   ){.    fossil_f
5d00: 61 74 61 6c 28 22 69 6e 76 61 6c 69 64 20 68 6f  atal("invalid ho
5d10: 6d 65 20 64 69 72 65 63 74 6f 72 79 3a 20 25 73  me directory: %s
5d20: 22 2c 20 7a 48 6f 6d 65 29 3b 0a 20 20 7d 0a 23  ", zHome);.  }.#
5d30: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
5d40: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  2) || defined(__
5d50: 43 59 47 57 49 4e 5f 5f 29 0a 20 20 2f 2a 20 2e  CYGWIN__).  /* .
5d60: 20 66 69 6c 65 6e 61 6d 65 73 20 67 69 76 65 20   filenames give 
5d70: 73 6f 6d 65 20 77 69 6e 64 6f 77 20 73 79 73 74  some window syst
5d80: 65 6d 73 20 70 72 6f 62 6c 65 6d 73 20 61 6e 64  ems problems and
5d90: 20 6d 61 6e 79 20 61 70 70 73 20 70 72 6f 62 6c   many apps probl
5da0: 65 6d 73 20 2a 2f 0a 20 20 7a 44 62 4e 61 6d 65  ems */.  zDbName
5db0: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 2f 2f 5f   = mprintf("%//_
5dc0: 66 6f 73 73 69 6c 22 2c 20 7a 48 6f 6d 65 29 3b  fossil", zHome);
5dd0: 0a 23 65 6c 73 65 0a 20 20 7a 44 62 4e 61 6d 65  .#else.  zDbName
5de0: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 2f 2e   = mprintf("%s/.
5df0: 66 6f 73 73 69 6c 22 2c 20 7a 48 6f 6d 65 29 3b  fossil", zHome);
5e00: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 66 69  .#endif.  if( fi
5e10: 6c 65 5f 73 69 7a 65 28 7a 44 62 4e 61 6d 65 29  le_size(zDbName)
5e20: 3c 31 30 32 34 2a 33 20 29 7b 0a 20 20 20 20 69  <1024*3 ){.    i
5e30: 66 28 20 66 69 6c 65 5f 61 63 63 65 73 73 28 7a  f( file_access(z
5e40: 48 6f 6d 65 2c 20 57 5f 4f 4b 29 20 29 7b 0a 20  Home, W_OK) ){. 
5e50: 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61       fossil_fata
5e60: 6c 28 22 68 6f 6d 65 20 64 69 72 65 63 74 6f 72  l("home director
5e70: 79 20 25 73 20 6d 75 73 74 20 62 65 20 77 72 69  y %s must be wri
5e80: 74 65 61 62 6c 65 22 2c 20 7a 48 6f 6d 65 29 3b  teable", zHome);
5e90: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 69 6e  .    }.    db_in
5ea0: 69 74 5f 64 61 74 61 62 61 73 65 28 7a 44 62 4e  it_database(zDbN
5eb0: 61 6d 65 2c 20 7a 43 6f 6e 66 69 67 53 63 68 65  ame, zConfigSche
5ec0: 6d 61 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ma, (char*)0);. 
5ed0: 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 5f 61 63   }.  if( file_ac
5ee0: 63 65 73 73 28 7a 44 62 4e 61 6d 65 2c 20 57 5f  cess(zDbName, W_
5ef0: 4f 4b 29 20 29 7b 0a 20 20 20 20 66 6f 73 73 69  OK) ){.    fossi
5f00: 6c 5f 66 61 74 61 6c 28 22 63 6f 6e 66 69 67 75  l_fatal("configu
5f10: 72 61 74 69 6f 6e 20 66 69 6c 65 20 25 73 20 6d  ration file %s m
5f20: 75 73 74 20 62 65 20 77 72 69 74 65 61 62 6c 65  ust be writeable
5f30: 22 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 7d  ", zDbName);.  }
5f40: 0a 20 20 69 66 28 20 75 73 65 41 74 74 61 63 68  .  if( useAttach
5f50: 20 29 7b 0a 20 20 20 20 64 62 5f 6f 70 65 6e 5f   ){.    db_open_
5f60: 6f 72 5f 61 74 74 61 63 68 28 7a 44 62 4e 61 6d  or_attach(zDbNam
5f70: 65 2c 20 22 63 6f 6e 66 69 67 64 62 22 2c 20 26  e, "configdb", &
5f80: 67 2e 75 73 65 41 74 74 61 63 68 29 3b 0a 20 20  g.useAttach);.  
5f90: 20 20 67 2e 64 62 43 6f 6e 66 69 67 20 3d 20 30    g.dbConfig = 0
5fa0: 3b 0a 20 20 20 20 67 2e 7a 43 6f 6e 66 69 67 44  ;.    g.zConfigD
5fb0: 62 54 79 70 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  bType = 0;.  }el
5fc0: 73 65 7b 0a 20 20 20 20 67 2e 75 73 65 41 74 74  se{.    g.useAtt
5fd0: 61 63 68 20 3d 20 30 3b 0a 20 20 20 20 67 2e 64  ach = 0;.    g.d
5fe0: 62 43 6f 6e 66 69 67 20 3d 20 64 62 5f 6f 70 65  bConfig = db_ope
5ff0: 6e 28 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 20 20  n(zDbName);.    
6000: 67 2e 7a 43 6f 6e 66 69 67 44 62 54 79 70 65 20  g.zConfigDbType 
6010: 3d 20 22 63 6f 6e 66 69 67 64 62 22 3b 0a 20 20  = "configdb";.  
6020: 7d 0a 20 20 67 2e 7a 43 6f 6e 66 69 67 44 62 4e  }.  g.zConfigDbN
6030: 61 6d 65 20 3d 20 7a 44 62 4e 61 6d 65 3b 0a 7d  ame = zDbName;.}
6040: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  .../*.** Returns
6050: 20 54 52 55 45 20 69 66 20 7a 54 61 62 6c 65 20   TRUE if zTable 
6060: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 6c 6f  exists in the lo
6070: 63 61 6c 20 64 61 74 61 62 61 73 65 20 62 75 74  cal database but
6080: 20 6c 61 63 6b 73 20 63 6f 6c 75 6d 6e 0a 2a 2a   lacks column.**
6090: 20 7a 43 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74   zColumn.*/.stat
60a0: 69 63 20 69 6e 74 20 64 62 5f 6c 6f 63 61 6c 5f  ic int db_local_
60b0: 74 61 62 6c 65 5f 65 78 69 73 74 73 5f 62 75 74  table_exists_but
60c0: 5f 6c 61 63 6b 73 5f 63 6f 6c 75 6d 6e 28 0a 20  _lacks_column(. 
60d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
60e0: 62 6c 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ble,.  const cha
60f0: 72 20 2a 7a 43 6f 6c 75 6d 6e 0a 29 7b 0a 20 20  r *zColumn.){.  
6100: 63 68 61 72 20 2a 7a 44 65 66 20 3d 20 64 62 5f  char *zDef = db_
6110: 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20  text(0, "SELECT 
6120: 73 71 6c 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69  sql FROM %s.sqli
6130: 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
6150: 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 25 73 27  WHERE name=='%s'
6160: 20 2f 2a 73 63 61 6e 2a 2f 22 2c 0a 20 20 20 20   /*scan*/",.    
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
6180: 62 5f 6e 61 6d 65 28 22 6c 6f 63 61 6c 64 62 22  b_name("localdb"
6190: 29 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 69 6e  ), zTable);.  in
61a0: 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  t rc = 0;.  if( 
61b0: 7a 44 65 66 20 29 7b 0a 20 20 20 20 63 68 61 72  zDef ){.    char
61c0: 20 2a 7a 50 61 74 74 65 72 6e 20 3d 20 6d 70 72   *zPattern = mpr
61d0: 69 6e 74 66 28 22 2a 20 25 73 20 2a 22 2c 20 7a  intf("* %s *", z
61e0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 63 20  Column);.    rc 
61f0: 3d 20 73 74 72 67 6c 6f 62 28 7a 50 61 74 74 65  = strglob(zPatte
6200: 72 6e 2c 20 7a 44 65 66 29 3d 3d 30 3b 0a 20 20  rn, zDef)==0;.  
6210: 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 50    fossil_free(zP
6220: 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f 73  attern);.    fos
6230: 73 69 6c 5f 66 72 65 65 28 7a 44 65 66 29 3b 0a  sil_free(zDef);.
6240: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6250: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 7a 44 62  .}../*.** If zDb
6260: 4e 61 6d 65 20 69 73 20 61 20 76 61 6c 69 64 20  Name is a valid 
6270: 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 66  local database f
6280: 69 6c 65 2c 20 6f 70 65 6e 20 69 74 20 61 6e 64  ile, open it and
6290: 20 72 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 2e   return.** true.
62a0: 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
62b0: 20 76 61 6c 69 64 20 6c 6f 63 61 6c 20 64 61 74   valid local dat
62c0: 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
62d0: 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
62e0: 69 6e 74 20 69 73 56 61 6c 69 64 4c 6f 63 61 6c  int isValidLocal
62f0: 44 62 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Db(const char *z
6300: 44 62 4e 61 6d 65 29 7b 0a 20 20 69 36 34 20 6c  DbName){.  i64 l
6310: 73 69 7a 65 3b 0a 20 20 63 68 61 72 20 2a 7a 56  size;.  char *zV
6320: 46 69 6c 65 44 65 66 3b 0a 0a 20 20 69 66 28 20  FileDef;..  if( 
6330: 66 69 6c 65 5f 61 63 63 65 73 73 28 7a 44 62 4e  file_access(zDbN
6340: 61 6d 65 2c 20 46 5f 4f 4b 29 20 29 20 72 65 74  ame, F_OK) ) ret
6350: 75 72 6e 20 30 3b 0a 20 20 6c 73 69 7a 65 20 3d  urn 0;.  lsize =
6360: 20 66 69 6c 65 5f 73 69 7a 65 28 7a 44 62 4e 61   file_size(zDbNa
6370: 6d 65 29 3b 0a 20 20 69 66 28 20 6c 73 69 7a 65  me);.  if( lsize
6380: 25 31 30 32 34 21 3d 30 20 7c 7c 20 6c 73 69 7a  %1024!=0 || lsiz
6390: 65 3c 34 30 39 36 20 29 20 72 65 74 75 72 6e 20  e<4096 ) return 
63a0: 30 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 6f 72 5f  0;.  db_open_or_
63b0: 61 74 74 61 63 68 28 7a 44 62 4e 61 6d 65 2c 20  attach(zDbName, 
63c0: 22 6c 6f 63 61 6c 64 62 22 2c 20 30 29 3b 0a 20  "localdb", 0);. 
63d0: 20 7a 56 46 69 6c 65 44 65 66 20 3d 20 64 62 5f   zVFileDef = db_
63e0: 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20  text(0, "SELECT 
63f0: 73 71 6c 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69  sql FROM %s.sqli
6400: 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6420: 20 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65      " WHERE name
6430: 3d 3d 27 76 66 69 6c 65 27 22 2c 20 64 62 5f 6e  =='vfile'", db_n
6440: 61 6d 65 28 22 6c 6f 63 61 6c 64 62 22 29 29 3b  ame("localdb"));
6450: 0a 20 20 69 66 28 20 7a 56 46 69 6c 65 44 65 66  .  if( zVFileDef
6460: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
6470: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 22 69 73  .  /* If the "is
6480: 65 78 65 22 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  exe" column is m
6490: 69 73 73 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  issing from the 
64a0: 76 66 69 6c 65 20 74 61 62 6c 65 2c 20 74 68 65  vfile table, the
64b0: 6e 0a 20 20 2a 2a 20 61 64 64 20 69 74 20 6e 6f  n.  ** add it no
64c0: 77 2e 20 20 20 54 68 69 73 20 63 6f 64 65 20 61  w.   This code a
64d0: 64 64 65 64 20 6f 6e 20 32 30 31 30 2d 30 33 2d  dded on 2010-03-
64e0: 30 36 2e 20 20 41 66 74 65 72 20 61 6c 6c 20 75  06.  After all u
64f0: 73 65 72 73 20 68 61 76 65 0a 20 20 2a 2a 20 75  sers have.  ** u
6500: 70 67 72 61 64 65 64 2c 20 74 68 69 73 20 63 6f  pgraded, this co
6510: 64 65 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79  de can be safely
6520: 20 64 65 6c 65 74 65 64 2e 0a 20 20 2a 2f 0a 20   deleted..  */. 
6530: 20 69 66 28 20 21 73 74 72 67 6c 6f 62 28 22 2a   if( !strglob("*
6540: 20 69 73 65 78 65 20 2a 22 2c 20 7a 56 46 69 6c   isexe *", zVFil
6550: 65 44 65 66 29 20 29 7b 0a 20 20 20 20 64 62 5f  eDef) ){.    db_
6560: 6d 75 6c 74 69 5f 65 78 65 63 28 22 41 4c 54 45  multi_exec("ALTE
6570: 52 20 54 41 42 4c 45 20 76 66 69 6c 65 20 41 44  R TABLE vfile AD
6580: 44 20 43 4f 4c 55 4d 4e 20 69 73 65 78 65 20 42  D COLUMN isexe B
6590: 4f 4f 4c 45 41 4e 20 44 45 46 41 55 4c 54 20 30  OOLEAN DEFAULT 0
65a0: 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ");.  }..  /* If
65b0: 20 22 69 73 6c 69 6e 6b 22 2f 22 69 73 4c 69 6e   "islink"/"isLin
65c0: 6b 22 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6d  k" columns are m
65d0: 69 73 73 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c  issing from tabl
65e0: 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 64  es, then.  ** ad
65f0: 64 20 74 68 65 6d 20 6e 6f 77 2e 20 20 20 54 68  d them now.   Th
6600: 69 73 20 63 6f 64 65 20 61 64 64 65 64 20 6f 6e  is code added on
6610: 20 32 30 31 31 2d 30 31 2d 31 37 20 61 6e 64 20   2011-01-17 and 
6620: 32 30 31 31 2d 30 38 2d 32 37 2e 0a 20 20 2a 2a  2011-08-27..  **
6630: 20 41 66 74 65 72 20 61 6c 6c 20 75 73 65 72 73   After all users
6640: 20 68 61 76 65 20 75 70 67 72 61 64 65 64 2c 20   have upgraded, 
6650: 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 62 65  this code can be
6660: 20 73 61 66 65 6c 79 20 64 65 6c 65 74 65 64 2e   safely deleted.
6670: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 73 74 72  .  */.  if( !str
6680: 67 6c 6f 62 28 22 2a 20 69 73 6c 69 6e 6b 20 2a  glob("* islink *
6690: 22 2c 20 7a 56 46 69 6c 65 44 65 66 29 20 29 7b  ", zVFileDef) ){
66a0: 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78  .    db_multi_ex
66b0: 65 63 28 22 41 4c 54 45 52 20 54 41 42 4c 45 20  ec("ALTER TABLE 
66c0: 76 66 69 6c 65 20 41 44 44 20 43 4f 4c 55 4d 4e  vfile ADD COLUMN
66d0: 20 69 73 6c 69 6e 6b 20 42 4f 4f 4c 45 41 4e 20   islink BOOLEAN 
66e0: 44 45 46 41 55 4c 54 20 30 22 29 3b 0a 20 20 20  DEFAULT 0");.   
66f0: 20 69 66 28 20 64 62 5f 6c 6f 63 61 6c 5f 74 61   if( db_local_ta
6700: 62 6c 65 5f 65 78 69 73 74 73 5f 62 75 74 5f 6c  ble_exists_but_l
6710: 61 63 6b 73 5f 63 6f 6c 75 6d 6e 28 22 73 74 61  acks_column("sta
6720: 73 68 66 69 6c 65 22 2c 20 22 69 73 4c 69 6e 6b  shfile", "isLink
6730: 22 29 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 6d  ") ){.      db_m
6740: 75 6c 74 69 5f 65 78 65 63 28 22 41 4c 54 45 52  ulti_exec("ALTER
6750: 20 54 41 42 4c 45 20 73 74 61 73 68 66 69 6c 65   TABLE stashfile
6760: 20 41 44 44 20 43 4f 4c 55 4d 4e 20 69 73 4c 69   ADD COLUMN isLi
6770: 6e 6b 20 42 4f 4f 4c 20 44 45 46 41 55 4c 54 20  nk BOOL DEFAULT 
6780: 30 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  0");.    }.    i
6790: 66 28 20 64 62 5f 6c 6f 63 61 6c 5f 74 61 62 6c  f( db_local_tabl
67a0: 65 5f 65 78 69 73 74 73 5f 62 75 74 5f 6c 61 63  e_exists_but_lac
67b0: 6b 73 5f 63 6f 6c 75 6d 6e 28 22 75 6e 64 6f 22  ks_column("undo"
67c0: 2c 20 22 69 73 4c 69 6e 6b 22 29 20 29 7b 0a 20  , "isLink") ){. 
67d0: 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78       db_multi_ex
67e0: 65 63 28 22 41 4c 54 45 52 20 54 41 42 4c 45 20  ec("ALTER TABLE 
67f0: 75 6e 64 6f 20 41 44 44 20 43 4f 4c 55 4d 4e 20  undo ADD COLUMN 
6800: 69 73 4c 69 6e 6b 20 42 4f 4f 4c 45 41 4e 20 44  isLink BOOLEAN D
6810: 45 46 41 55 4c 54 20 30 22 29 3b 0a 20 20 20 20  EFAULT 0");.    
6820: 7d 0a 20 20 20 20 69 66 28 20 64 62 5f 6c 6f 63  }.    if( db_loc
6830: 61 6c 5f 74 61 62 6c 65 5f 65 78 69 73 74 73 5f  al_table_exists_
6840: 62 75 74 5f 6c 61 63 6b 73 5f 63 6f 6c 75 6d 6e  but_lacks_column
6850: 28 22 75 6e 64 6f 5f 76 66 69 6c 65 22 2c 20 22  ("undo_vfile", "
6860: 69 73 6c 69 6e 6b 22 29 20 29 7b 0a 20 20 20 20  islink") ){.    
6870: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
6880: 22 41 4c 54 45 52 20 54 41 42 4c 45 20 75 6e 64  "ALTER TABLE und
6890: 6f 5f 76 66 69 6c 65 20 41 44 44 20 43 4f 4c 55  o_vfile ADD COLU
68a0: 4d 4e 20 69 73 6c 69 6e 6b 20 42 4f 4f 4c 20 44  MN islink BOOL D
68b0: 45 46 41 55 4c 54 20 30 22 29 3b 0a 20 20 20 20  EFAULT 0");.    
68c0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
68d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
68e0: 65 20 74 68 65 20 72 6f 6f 74 20 64 69 72 65 63  e the root direc
68f0: 74 6f 72 79 20 6f 66 20 74 68 65 20 6c 6f 63 61  tory of the loca
6900: 6c 20 72 65 70 6f 73 69 74 6f 72 79 20 74 72 65  l repository tre
6910: 65 2e 20 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20  e.  The root.** 
6920: 64 69 72 65 63 74 6f 72 79 20 69 73 20 66 6f 75  directory is fou
6930: 6e 64 20 62 79 20 73 65 61 72 63 68 69 6e 67 20  nd by searching 
6940: 66 6f 72 20 61 20 66 69 6c 65 20 6e 61 6d 65 64  for a file named
6950: 20 22 5f 46 4f 53 53 49 4c 5f 22 20 6f 72 20 22   "_FOSSIL_" or "
6960: 2e 66 73 6c 63 6b 6f 75 74 22 0a 2a 2a 20 74 68  .fslckout".** th
6970: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 76 61  at contains a va
6980: 6c 69 64 20 72 65 70 6f 73 69 74 6f 72 79 20 64  lid repository d
6990: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 46  atabase..**.** F
69a0: 6f 72 20 6c 65 67 61 63 79 2c 20 61 6c 73 6f 20  or legacy, also 
69b0: 6c 6f 6f 6b 20 66 6f 72 20 22 2e 66 6f 73 22 2e  look for ".fos".
69c0: 20 20 54 68 65 20 75 73 65 20 6f 66 20 22 2e 66    The use of ".f
69d0: 6f 73 22 20 69 73 20 64 65 70 72 65 63 61 74 65  os" is deprecate
69e0: 64 0a 2a 2a 20 73 69 6e 63 65 20 22 66 6f 73 22  d.** since "fos"
69f0: 20 68 61 73 20 6e 65 67 61 74 69 76 65 20 63 6f   has negative co
6a00: 6e 6e 6f 74 61 74 69 6f 6e 73 20 69 6e 20 48 75  nnotations in Hu
6a10: 6e 67 61 72 69 61 6e 2c 20 77 65 20 61 72 65 20  ngarian, we are 
6a20: 74 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  told..**.** If n
6a30: 6f 20 76 61 6c 69 64 20 5f 46 4f 53 53 49 4c 5f  o valid _FOSSIL_
6a40: 20 6f 72 20 2e 66 73 6c 63 6b 6f 75 74 20 66 69   or .fslckout fi
6a50: 6c 65 20 69 73 20 66 6f 75 6e 64 2c 20 77 65 20  le is found, we 
6a60: 6d 6f 76 65 20 75 70 20 6f 6e 65 20 6c 65 76 65  move up one leve
6a70: 6c 20 61 6e 64 0a 2a 2a 20 74 72 79 20 61 67 61  l and.** try aga
6a80: 69 6e 2e 20 4f 6e 63 65 20 74 68 65 20 66 69 6c  in. Once the fil
6a90: 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20  e is found, the 
6aa0: 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 20 76 61 72  g.zLocalRoot var
6ab0: 69 61 62 6c 65 20 69 73 20 73 65 74 0a 2a 2a 20  iable is set.** 
6ac0: 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  to the root of t
6ad0: 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20 74 72  he repository tr
6ae0: 65 65 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  ee and this rout
6af0: 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 20 20  ine returns 1.  
6b00: 49 66 0a 2a 2a 20 6e 6f 20 64 61 74 61 62 61 73  If.** no databas
6b10: 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e  e is found, then
6b20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
6b30: 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  turn 0..**.** Th
6b40: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79  is routine alway
6b50: 73 20 6f 70 65 6e 73 20 74 68 65 20 75 73 65 72  s opens the user
6b60: 20 64 61 74 61 62 61 73 65 20 72 65 67 61 72 64   database regard
6b70: 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
6b80: 6f 72 0a 2a 2a 20 6e 6f 74 20 74 68 65 20 72 65  or.** not the re
6b90: 70 6f 73 69 74 6f 72 79 20 64 61 74 61 62 61 73  pository databas
6ba0: 65 20 69 73 20 66 6f 75 6e 64 2e 20 20 49 66 20  e is found.  If 
6bb0: 74 68 65 20 5f 46 4f 53 53 49 4c 5f 20 6f 72 20  the _FOSSIL_ or 
6bc0: 2e 66 73 6c 63 6b 6f 75 74 20 66 69 6c 65 0a 2a  .fslckout file.*
6bd0: 2a 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 20 69  * is found, it i
6be0: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
6bf0: 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
6c00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 6f 2e 0a  connection too..
6c10: 2a 2f 0a 69 6e 74 20 64 62 5f 6f 70 65 6e 5f 6c  */.int db_open_l
6c20: 6f 63 61 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  ocal(const char 
6c30: 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  *zDbName){.  int
6c40: 20 69 2c 20 6e 3b 0a 20 20 63 68 61 72 20 7a 50   i, n;.  char zP
6c50: 77 64 5b 32 30 30 30 5d 3b 0a 20 20 73 74 61 74  wd[2000];.  stat
6c60: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 61 44  ic const char aD
6c70: 62 4e 61 6d 65 5b 5d 5b 31 30 5d 20 3d 20 7b 20  bName[][10] = { 
6c80: 22 5f 46 4f 53 53 49 4c 5f 22 2c 20 22 2e 66 73  "_FOSSIL_", ".fs
6c90: 6c 63 6b 6f 75 74 22 2c 20 22 2e 66 6f 73 22 20  lckout", ".fos" 
6ca0: 7d 3b 0a 0a 20 20 69 66 28 20 67 2e 6c 6f 63 61  };..  if( g.loca
6cb0: 6c 4f 70 65 6e 20 29 20 72 65 74 75 72 6e 20 31  lOpen ) return 1
6cc0: 3b 0a 20 20 66 69 6c 65 5f 67 65 74 63 77 64 28  ;.  file_getcwd(
6cd0: 7a 50 77 64 2c 20 73 69 7a 65 6f 66 28 7a 50 77  zPwd, sizeof(zPw
6ce0: 64 29 2d 32 30 29 3b 0a 20 20 6e 20 3d 20 73 74  d)-20);.  n = st
6cf0: 72 6c 65 6e 28 7a 50 77 64 29 3b 0a 20 20 77 68  rlen(zPwd);.  wh
6d00: 69 6c 65 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20  ile( n>0 ){.    
6d10: 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f 75 6e 74  for(i=0; i<count
6d20: 28 61 44 62 4e 61 6d 65 29 3b 20 69 2b 2b 29 7b  (aDbName); i++){
6d30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6d40: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
6d50: 50 77 64 29 2d 6e 2c 20 26 7a 50 77 64 5b 6e 5d  Pwd)-n, &zPwd[n]
6d60: 2c 20 22 2f 25 73 22 2c 20 61 44 62 4e 61 6d 65  , "/%s", aDbName
6d70: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
6d80: 69 73 56 61 6c 69 64 4c 6f 63 61 6c 44 62 28 7a  isValidLocalDb(z
6d90: 50 77 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Pwd) ){.        
6da0: 2f 2a 20 46 6f 75 6e 64 20 61 20 76 61 6c 69 64  /* Found a valid
6db0: 20 63 68 65 63 6b 6f 75 74 20 64 61 74 61 62 61   checkout databa
6dc0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  se file */.     
6dd0: 20 20 20 7a 50 77 64 5b 6e 5d 20 3d 20 30 3b 0a     zPwd[n] = 0;.
6de0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e          while( n
6df0: 3e 30 20 26 26 20 7a 50 77 64 5b 6e 2d 31 5d 3d  >0 && zPwd[n-1]=
6e00: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
6e10: 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20    n--;.         
6e20: 20 7a 50 77 64 5b 6e 5d 20 3d 20 30 3b 0a 20 20   zPwd[n] = 0;.  
6e30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6e40: 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 20 3d 20 6d  g.zLocalRoot = m
6e50: 70 72 69 6e 74 66 28 22 25 73 2f 22 2c 20 7a 50  printf("%s/", zP
6e60: 77 64 29 3b 0a 20 20 20 20 20 20 20 20 67 2e 6c  wd);.        g.l
6e70: 6f 63 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  ocalOpen = 1;.  
6e80: 20 20 20 20 20 20 64 62 5f 6f 70 65 6e 5f 63 6f        db_open_co
6e90: 6e 66 69 67 28 30 29 3b 0a 20 20 20 20 20 20 20  nfig(0);.       
6ea0: 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74   db_open_reposit
6eb0: 6f 72 79 28 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  ory(zDbName);.  
6ec0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
6ed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6ee0: 20 20 6e 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65    n--;.    while
6ef0: 28 20 6e 3e 31 20 26 26 20 7a 50 77 64 5b 6e 5d  ( n>1 && zPwd[n]
6f00: 21 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  !='/' ){ n--; }.
6f10: 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26      while( n>1 &
6f20: 26 20 7a 50 77 64 5b 6e 2d 31 5d 3d 3d 27 2f 27  & zPwd[n-1]=='/'
6f30: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20 7a   ){ n--; }.    z
6f40: 50 77 64 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  Pwd[n] = 0;.  }.
6f50: 0a 20 20 2f 2a 20 41 20 63 68 65 63 6b 6f 75 74  .  /* A checkout
6f60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
6f70: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 6f 75 6e  ould not be foun
6f80: 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  d */.  return 0;
6f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68  .}../*.** Get th
6fa0: 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
6fb0: 74 6f 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72  to the repositor
6fc0: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  y database file.
6fd0: 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 64    The.** local d
6fe0: 61 74 61 62 61 73 65 20 28 74 68 65 20 5f 46 4f  atabase (the _FO
6ff0: 53 53 49 4c 5f 20 6f 72 20 2e 66 73 6c 63 6b 6f  SSIL_ or .fslcko
7000: 75 74 20 64 61 74 61 62 61 73 65 29 20 6d 75 73  ut database) mus
7010: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  t have already.*
7020: 2a 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62 65  * been opened be
7030: 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
7040: 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
7050: 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 5f 72  const char *db_r
7060: 65 70 6f 73 69 74 6f 72 79 5f 66 69 6c 65 6e 61  epository_filena
7070: 6d 65 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  me(void){.  stat
7080: 69 63 20 63 68 61 72 20 2a 7a 52 65 70 6f 20 3d  ic char *zRepo =
7090: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 67 2e   0;.  assert( g.
70a0: 6c 6f 63 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 61  localOpen );.  a
70b0: 73 73 65 72 74 28 20 67 2e 7a 4c 6f 63 61 6c 52  ssert( g.zLocalR
70c0: 6f 6f 74 20 29 3b 0a 20 20 69 66 28 20 7a 52 65  oot );.  if( zRe
70d0: 70 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 52 65  po==0 ){.    zRe
70e0: 70 6f 20 3d 20 64 62 5f 6c 67 65 74 28 22 72 65  po = db_lget("re
70f0: 70 6f 73 69 74 6f 72 79 22 2c 20 30 29 3b 0a 20  pository", 0);. 
7100: 20 20 20 69 66 28 20 7a 52 65 70 6f 20 26 26 20     if( zRepo && 
7110: 21 66 69 6c 65 5f 69 73 5f 61 62 73 6f 6c 75 74  !file_is_absolut
7120: 65 5f 70 61 74 68 28 7a 52 65 70 6f 29 20 29 7b  e_path(zRepo) ){
7130: 0a 20 20 20 20 20 20 7a 52 65 70 6f 20 3d 20 6d  .      zRepo = m
7140: 70 72 69 6e 74 66 28 22 25 73 25 73 22 2c 20 67  printf("%s%s", g
7150: 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 2c 20 7a 52 65  .zLocalRoot, zRe
7160: 70 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  po);.    }.  }. 
7170: 20 72 65 74 75 72 6e 20 7a 52 65 70 6f 3b 0a 7d   return zRepo;.}
7180: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
7190: 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61   repository data
71a0: 62 61 73 65 20 67 69 76 65 6e 20 62 79 20 7a 44  base given by zD
71b0: 62 4e 61 6d 65 2e 20 20 49 66 20 7a 44 62 4e 61  bName.  If zDbNa
71c0: 6d 65 3d 3d 4e 55 4c 4c 20 74 68 65 6e 0a 2a 2a  me==NULL then.**
71d0: 20 67 65 74 20 74 68 65 20 6e 61 6d 65 20 66 72   get the name fr
71e0: 6f 6d 20 74 68 65 20 61 6c 72 65 61 64 79 20 6f  om the already o
71f0: 70 65 6e 20 6c 6f 63 61 6c 20 64 61 74 61 62 61  pen local databa
7200: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 6f  se..*/.void db_o
7210: 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 63  pen_repository(c
7220: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
7230: 6d 65 29 7b 0a 20 20 69 66 28 20 67 2e 72 65 70  me){.  if( g.rep
7240: 6f 73 69 74 6f 72 79 4f 70 65 6e 20 29 20 72 65  ositoryOpen ) re
7250: 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a 44 62 4e  turn;.  if( zDbN
7260: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ame==0 ){.    if
7270: 28 20 67 2e 6c 6f 63 61 6c 4f 70 65 6e 20 29 7b  ( g.localOpen ){
7280: 0a 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d  .      zDbName =
7290: 20 64 62 5f 72 65 70 6f 73 69 74 6f 72 79 5f 66   db_repository_f
72a0: 69 6c 65 6e 61 6d 65 28 29 3b 0a 20 20 20 20 7d  ilename();.    }
72b0: 0a 20 20 20 20 69 66 28 20 7a 44 62 4e 61 6d 65  .    if( zDbName
72c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 62 5f  ==0 ){.      db_
72d0: 65 72 72 28 22 75 6e 61 62 6c 65 20 74 6f 20 66  err("unable to f
72e0: 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
72f0: 61 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74  a repository dat
7300: 61 62 61 73 65 22 29 3b 0a 20 20 20 20 7d 0a 20  abase");.    }. 
7310: 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 5f 61 63   }.  if( file_ac
7320: 63 65 73 73 28 7a 44 62 4e 61 6d 65 2c 20 52 5f  cess(zDbName, R_
7330: 4f 4b 29 20 7c 7c 20 66 69 6c 65 5f 73 69 7a 65  OK) || file_size
7340: 28 7a 44 62 4e 61 6d 65 29 3c 31 30 32 34 20 29  (zDbName)<1024 )
7350: 7b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 61  {.    if( file_a
7360: 63 63 65 73 73 28 7a 44 62 4e 61 6d 65 2c 20 46  ccess(zDbName, F
7370: 5f 4f 4b 29 20 29 7b 0a 23 69 66 64 65 66 20 46  _OK) ){.#ifdef F
7380: 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f  OSSIL_ENABLE_JSO
7390: 4e 0a 20 20 20 20 20 20 67 2e 6a 73 6f 6e 2e 72  N.      g.json.r
73a0: 65 73 75 6c 74 43 6f 64 65 20 3d 20 46 53 4c 5f  esultCode = FSL_
73b0: 4a 53 4f 4e 5f 45 5f 44 42 5f 4e 4f 54 5f 46 4f  JSON_E_DB_NOT_FO
73c0: 55 4e 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  UND;.#endif.    
73d0: 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22    fossil_panic("
73e0: 72 65 70 6f 73 69 74 6f 72 79 20 64 6f 65 73 20  repository does 
73f0: 6e 6f 74 20 65 78 69 73 74 20 6f 72 22 0a 20 20  not exist or".  
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7410: 20 22 20 69 73 20 69 6e 20 61 6e 20 75 6e 72 65   " is in an unre
7420: 61 64 61 62 6c 65 20 64 69 72 65 63 74 6f 72 79  adable directory
7430: 3a 20 25 73 22 2c 20 7a 44 62 4e 61 6d 65 29 3b  : %s", zDbName);
7440: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66  .    }else if( f
7450: 69 6c 65 5f 61 63 63 65 73 73 28 7a 44 62 4e 61  ile_access(zDbNa
7460: 6d 65 2c 20 52 5f 4f 4b 29 20 29 7b 0a 23 69 66  me, R_OK) ){.#if
7470: 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c  def FOSSIL_ENABL
7480: 45 5f 4a 53 4f 4e 0a 20 20 20 20 20 20 67 2e 6a  E_JSON.      g.j
7490: 73 6f 6e 2e 72 65 73 75 6c 74 43 6f 64 65 20 3d  son.resultCode =
74a0: 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 44 45 4e 49   FSL_JSON_E_DENI
74b0: 45 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ED;.#endif.     
74c0: 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 72   fossil_panic("r
74d0: 65 61 64 20 70 65 72 6d 69 73 73 69 6f 6e 20 64  ead permission d
74e0: 65 6e 69 65 64 20 66 6f 72 20 72 65 70 6f 73 69  enied for reposi
74f0: 74 6f 72 79 20 25 73 22 2c 20 7a 44 62 4e 61 6d  tory %s", zDbNam
7500: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23  e);.    }else{.#
7510: 69 66 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e 41  ifdef FOSSIL_ENA
7520: 42 4c 45 5f 4a 53 4f 4e 0a 20 20 20 20 20 20 67  BLE_JSON.      g
7530: 2e 6a 73 6f 6e 2e 72 65 73 75 6c 74 43 6f 64 65  .json.resultCode
7540: 20 3d 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 44 42   = FSL_JSON_E_DB
7550: 5f 4e 4f 54 5f 56 41 4c 49 44 3b 0a 23 65 6e 64  _NOT_VALID;.#end
7560: 69 66 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f  if.      fossil_
7570: 70 61 6e 69 63 28 22 6e 6f 74 20 61 20 76 61 6c  panic("not a val
7580: 69 64 20 72 65 70 6f 73 69 74 6f 72 79 3a 20 25  id repository: %
7590: 73 22 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  s", zDbName);.  
75a0: 20 20 7d 0a 20 20 7d 0a 20 20 67 2e 7a 52 65 70    }.  }.  g.zRep
75b0: 6f 73 69 74 6f 72 79 4e 61 6d 65 20 3d 20 6d 70  ositoryName = mp
75c0: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 44 62 4e  rintf("%s", zDbN
75d0: 61 6d 65 29 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f  ame);.  db_open_
75e0: 6f 72 5f 61 74 74 61 63 68 28 67 2e 7a 52 65 70  or_attach(g.zRep
75f0: 6f 73 69 74 6f 72 79 4e 61 6d 65 2c 20 22 72 65  ositoryName, "re
7600: 70 6f 73 69 74 6f 72 79 22 2c 20 30 29 3b 0a 20  pository", 0);. 
7610: 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65   g.repositoryOpe
7620: 6e 20 3d 20 31 3b 0a 20 20 2f 2a 20 43 61 63 68  n = 1;.  /* Cach
7630: 65 20 22 61 6c 6c 6f 77 2d 73 79 6d 6c 69 6e 6b  e "allow-symlink
7640: 73 22 20 6f 70 74 69 6f 6e 2c 20 62 65 63 61 75  s" option, becau
7650: 73 65 20 77 65 27 6c 6c 20 6e 65 65 64 20 69 74  se we'll need it
7660: 20 6f 6e 20 65 76 65 72 79 20 73 74 61 74 20 63   on every stat c
7670: 61 6c 6c 20 2a 2f 0a 20 20 67 2e 61 6c 6c 6f 77  all */.  g.allow
7680: 53 79 6d 6c 69 6e 6b 73 20 3d 20 64 62 5f 67 65  Symlinks = db_ge
7690: 74 5f 62 6f 6f 6c 65 61 6e 28 22 61 6c 6c 6f 77  t_boolean("allow
76a0: 2d 73 79 6d 6c 69 6e 6b 73 22 2c 20 30 29 3b 0a  -symlinks", 0);.
76b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 61 67 73 20 66  }../*.** Flags f
76c0: 6f 72 20 74 68 65 20 64 62 5f 66 69 6e 64 5f 61  or the db_find_a
76d0: 6e 64 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f  nd_open_reposito
76e0: 72 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ry() function..*
76f0: 2f 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a  /.#if INTERFACE.
7700: 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f 4f 4b 5f  #define OPEN_OK_
7710: 4e 4f 54 5f 46 4f 55 4e 44 20 20 20 20 30 78 30  NOT_FOUND    0x0
7720: 30 31 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  01      /* Do no
7730: 74 20 65 72 72 6f 72 20 6f 75 74 20 69 66 20 6e  t error out if n
7740: 6f 74 20 66 6f 75 6e 64 20 2a 2f 0a 23 64 65 66  ot found */.#def
7750: 69 6e 65 20 4f 50 45 4e 5f 41 4e 59 5f 53 43 48  ine OPEN_ANY_SCH
7760: 45 4d 41 20 20 20 20 20 20 30 78 30 30 32 20 20  EMA      0x002  
7770: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 65 72      /* Do not er
7780: 72 6f 72 20 69 66 20 73 63 68 65 6d 61 20 69 73  ror if schema is
7790: 20 77 72 6f 6e 67 20 2a 2f 0a 23 65 6e 64 69 66   wrong */.#endif
77a0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66  ../*.** Try to f
77b0: 69 6e 64 20 74 68 65 20 72 65 70 6f 73 69 74 6f  ind the reposito
77c0: 72 79 20 61 6e 64 20 6f 70 65 6e 20 69 74 2e 20  ry and open it. 
77d0: 20 55 73 65 20 74 68 65 20 2d 52 20 6f 72 20 2d   Use the -R or -
77e0: 2d 72 65 70 6f 73 69 74 6f 72 79 0a 2a 2a 20 6f  -repository.** o
77f0: 70 74 69 6f 6e 20 74 6f 20 6c 6f 63 61 74 65 20  ption to locate 
7800: 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 2e 20  the repository. 
7810: 20 49 66 20 6e 6f 20 73 75 63 68 20 6f 70 74 69   If no such opti
7820: 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  on is available,
7830: 20 74 68 65 6e 0a 2a 2a 20 75 73 65 20 74 68 65   then.** use the
7840: 20 72 65 70 6f 73 69 74 6f 72 79 20 6f 66 20 74   repository of t
7850: 68 65 20 6f 70 65 6e 20 63 68 65 63 6b 6f 75 74  he open checkout
7860: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
7870: 2e 0a 2a 2a 0a 2a 2a 20 45 72 72 6f 72 20 6f 75  ..**.** Error ou
7880: 74 20 69 66 20 74 68 65 20 72 65 70 6f 73 69 74  t if the reposit
7890: 6f 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ory cannot be op
78a0: 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62  ened..*/.void db
78b0: 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f 72  _find_and_open_r
78c0: 65 70 6f 73 69 74 6f 72 79 28 69 6e 74 20 62 46  epository(int bF
78d0: 6c 61 67 73 2c 20 69 6e 74 20 6e 41 72 67 55 73  lags, int nArgUs
78e0: 65 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ed){.  const cha
78f0: 72 20 2a 7a 52 65 70 20 3d 20 66 69 6e 64 5f 6f  r *zRep = find_o
7900: 70 74 69 6f 6e 28 22 72 65 70 6f 73 69 74 6f 72  ption("repositor
7910: 79 22 2c 20 22 52 22 2c 20 31 29 3b 0a 20 20 69  y", "R", 1);.  i
7920: 66 28 20 7a 52 65 70 3d 3d 30 20 26 26 20 6e 41  f( zRep==0 && nA
7930: 72 67 55 73 65 64 20 26 26 20 67 2e 61 72 67 63  rgUsed && g.argc
7940: 3d 3d 6e 41 72 67 55 73 65 64 2b 31 20 29 7b 0a  ==nArgUsed+1 ){.
7950: 20 20 20 20 7a 52 65 70 20 3d 20 67 2e 61 72 67      zRep = g.arg
7960: 76 5b 6e 41 72 67 55 73 65 64 5d 3b 0a 20 20 7d  v[nArgUsed];.  }
7970: 0a 20 20 69 66 28 20 7a 52 65 70 3d 3d 30 20 29  .  if( zRep==0 )
7980: 7b 0a 20 20 20 20 69 66 28 20 64 62 5f 6f 70 65  {.    if( db_ope
7990: 6e 5f 6c 6f 63 61 6c 28 30 29 3d 3d 30 20 29 7b  n_local(0)==0 ){
79a0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 72 65 70 5f  .      goto rep_
79b0: 6e 6f 74 5f 66 6f 75 6e 64 3b 0a 20 20 20 20 7d  not_found;.    }
79c0: 0a 20 20 20 20 7a 52 65 70 20 3d 20 64 62 5f 72  .    zRep = db_r
79d0: 65 70 6f 73 69 74 6f 72 79 5f 66 69 6c 65 6e 61  epository_filena
79e0: 6d 65 28 29 3b 0a 20 20 20 20 69 66 28 20 7a 52  me();.    if( zR
79f0: 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  ep==0 ){.      g
7a00: 6f 74 6f 20 72 65 70 5f 6e 6f 74 5f 66 6f 75 6e  oto rep_not_foun
7a10: 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64  d;.    }.  }.  d
7a20: 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72  b_open_repositor
7a30: 79 28 7a 52 65 70 29 3b 0a 20 20 69 66 28 20 67  y(zRep);.  if( g
7a40: 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20  .repositoryOpen 
7a50: 29 7b 0a 20 20 20 20 69 66 28 20 28 62 46 6c 61  ){.    if( (bFla
7a60: 67 73 20 26 20 4f 50 45 4e 5f 41 4e 59 5f 53 43  gs & OPEN_ANY_SC
7a70: 48 45 4d 41 29 3d 3d 30 20 29 20 64 62 5f 76 65  HEMA)==0 ) db_ve
7a80: 72 69 66 79 5f 73 63 68 65 6d 61 28 29 3b 0a 20  rify_schema();. 
7a90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 72     return;.  }.r
7aa0: 65 70 5f 6e 6f 74 5f 66 6f 75 6e 64 3a 0a 20 20  ep_not_found:.  
7ab0: 69 66 28 20 28 62 46 6c 61 67 73 20 26 20 4f 50  if( (bFlags & OP
7ac0: 45 4e 5f 4f 4b 5f 4e 4f 54 5f 46 4f 55 4e 44 29  EN_OK_NOT_FOUND)
7ad0: 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 46 4f  ==0 ){.#ifdef FO
7ae0: 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e  SSIL_ENABLE_JSON
7af0: 0a 20 20 20 20 67 2e 6a 73 6f 6e 2e 72 65 73 75  .    g.json.resu
7b00: 6c 74 43 6f 64 65 20 3d 20 46 53 4c 5f 4a 53 4f  ltCode = FSL_JSO
7b10: 4e 5f 45 5f 44 42 5f 4e 4f 54 5f 46 4f 55 4e 44  N_E_DB_NOT_FOUND
7b20: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
7b30: 20 6e 41 72 67 55 73 65 64 3d 3d 30 20 29 7b 0a   nArgUsed==0 ){.
7b40: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74        fossil_fat
7b50: 61 6c 28 22 75 73 65 20 2d 2d 72 65 70 6f 73 69  al("use --reposi
7b60: 74 6f 72 79 20 6f 72 20 2d 52 20 74 6f 20 73 70  tory or -R to sp
7b70: 65 63 69 66 79 20 74 68 65 20 72 65 70 6f 73 69  ecify the reposi
7b80: 74 6f 72 79 20 64 61 74 61 62 61 73 65 22 29 3b  tory database");
7b90: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7ba0: 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22    fossil_fatal("
7bb0: 73 70 65 63 69 66 79 20 74 68 65 20 72 65 70 6f  specify the repo
7bc0: 73 69 74 6f 72 79 20 6e 61 6d 65 20 61 73 20 61  sitory name as a
7bd0: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72   command-line ar
7be0: 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 7d 0a  gument");.    }.
7bf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
7c00: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
7c10: 74 68 65 20 64 61 74 61 62 61 73 65 20 22 6c 6f  the database "lo
7c20: 63 61 6c 64 62 22 2c 20 22 63 6f 6e 66 69 67 64  caldb", "configd
7c30: 62 22 2c 20 6f 72 20 22 72 65 70 6f 73 69 74 6f  b", or "reposito
7c40: 72 79 22 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ry"..*/.const ch
7c50: 61 72 20 2a 64 62 5f 6e 61 6d 65 28 63 6f 6e 73  ar *db_name(cons
7c60: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
7c70: 61 73 73 65 72 74 28 20 66 6f 73 73 69 6c 5f 73  assert( fossil_s
7c80: 74 72 63 6d 70 28 7a 44 62 2c 22 6c 6f 63 61 6c  trcmp(zDb,"local
7c90: 64 62 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c  db")==0.       |
7ca0: 7c 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28  | fossil_strcmp(
7cb0: 7a 44 62 2c 22 63 6f 6e 66 69 67 64 62 22 29 3d  zDb,"configdb")=
7cc0: 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 66 6f 73  =0.       || fos
7cd0: 73 69 6c 5f 73 74 72 63 6d 70 28 7a 44 62 2c 22  sil_strcmp(zDb,"
7ce0: 72 65 70 6f 73 69 74 6f 72 79 22 29 3d 3d 30 20  repository")==0 
7cf0: 29 3b 0a 20 20 69 66 28 20 66 6f 73 73 69 6c 5f  );.  if( fossil_
7d00: 73 74 72 63 6d 70 28 7a 44 62 2c 20 67 2e 7a 4d  strcmp(zDb, g.zM
7d10: 61 69 6e 44 62 54 79 70 65 29 3d 3d 30 20 29 20  ainDbType)==0 ) 
7d20: 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  zDb = "main";.  
7d30: 72 65 74 75 72 6e 20 7a 44 62 3b 0a 7d 0a 0a 2f  return zDb;.}../
7d40: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
7d50: 20 69 66 20 74 68 65 20 73 63 68 65 6d 61 20 69   if the schema i
7d60: 73 20 6f 75 74 2d 6f 66 2d 64 61 74 65 0a 2a 2f  s out-of-date.*/
7d70: 0a 69 6e 74 20 64 62 5f 73 63 68 65 6d 61 5f 69  .int db_schema_i
7d80: 73 5f 6f 75 74 6f 66 64 61 74 65 28 76 6f 69 64  s_outofdate(void
7d90: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 5f 65  ){.  return db_e
7da0: 78 69 73 74 73 28 22 53 45 4c 45 43 54 20 31 20  xists("SELECT 1 
7db0: 46 52 4f 4d 20 63 6f 6e 66 69 67 22 0a 20 20 20  FROM config".   
7dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dd0: 22 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 61 75  " WHERE name='au
7de0: 78 2d 73 63 68 65 6d 61 27 22 0a 20 20 20 20 20  x-schema'".     
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
7e00: 20 20 41 4e 44 20 76 61 6c 75 65 3c 3e 27 25 73    AND value<>'%s
7e10: 27 22 2c 20 41 55 58 5f 53 43 48 45 4d 41 29 3b  '", AUX_SCHEMA);
7e20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7e30: 20 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74   true if the dat
7e40: 61 62 61 73 65 20 69 73 20 77 72 69 74 65 61 62  abase is writeab
7e50: 6c 65 0a 2a 2f 0a 69 6e 74 20 64 62 5f 69 73 5f  le.*/.int db_is_
7e60: 77 72 69 74 65 61 62 6c 65 28 63 6f 6e 73 74 20  writeable(const 
7e70: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
7e80: 72 65 74 75 72 6e 20 67 2e 64 62 21 3d 30 20 26  return g.db!=0 &
7e90: 26 20 21 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  & !sqlite3_db_re
7ea0: 61 64 6f 6e 6c 79 28 67 2e 64 62 2c 20 64 62 5f  adonly(g.db, db_
7eb0: 6e 61 6d 65 28 7a 4e 61 6d 65 29 29 3b 0a 7d 0a  name(zName));.}.
7ec0: 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  ./*.** Verify th
7ed0: 61 74 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72  at the repositor
7ee0: 79 20 73 63 68 65 6d 61 20 69 73 20 63 6f 72 72  y schema is corr
7ef0: 65 63 74 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ect.  If it is n
7f00: 6f 74 20 63 6f 72 72 65 63 74 2c 0a 2a 2a 20 69  ot correct,.** i
7f10: 73 73 75 65 20 61 20 66 61 74 61 6c 20 65 72 72  ssue a fatal err
7f20: 6f 72 20 61 6e 64 20 64 69 65 2e 0a 2a 2f 0a 76  or and die..*/.v
7f30: 6f 69 64 20 64 62 5f 76 65 72 69 66 79 5f 73 63  oid db_verify_sc
7f40: 68 65 6d 61 28 76 6f 69 64 29 7b 0a 20 20 69 66  hema(void){.  if
7f50: 28 20 64 62 5f 73 63 68 65 6d 61 5f 69 73 5f 6f  ( db_schema_is_o
7f60: 75 74 6f 66 64 61 74 65 28 29 20 29 7b 0a 23 69  utofdate() ){.#i
7f70: 66 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e 41 42  fdef FOSSIL_ENAB
7f80: 4c 45 5f 4a 53 4f 4e 0a 20 20 20 20 67 2e 6a 73  LE_JSON.    g.js
7f90: 6f 6e 2e 72 65 73 75 6c 74 43 6f 64 65 20 3d 20  on.resultCode = 
7fa0: 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 44 42 5f 4e 45  FSL_JSON_E_DB_NE
7fb0: 45 44 53 5f 52 45 42 55 49 4c 44 3b 0a 23 65 6e  EDS_REBUILD;.#en
7fc0: 64 69 66 0a 20 20 20 20 66 6f 73 73 69 6c 5f 77  dif.    fossil_w
7fd0: 61 72 6e 69 6e 67 28 22 69 6e 63 6f 72 72 65 63  arning("incorrec
7fe0: 74 20 72 65 70 6f 73 69 74 6f 72 79 20 73 63 68  t repository sch
7ff0: 65 6d 61 20 76 65 72 73 69 6f 6e 22 29 3b 0a 20  ema version");. 
8000: 20 20 20 66 6f 73 73 69 6c 5f 77 61 72 6e 69 6e     fossil_warnin
8010: 67 28 22 79 6f 75 72 20 72 65 70 6f 73 69 74 6f  g("your reposito
8020: 72 79 20 68 61 73 20 73 63 68 65 6d 61 20 76 65  ry has schema ve
8030: 72 73 69 6f 6e 20 5c 22 25 73 5c 22 20 22 0a 20  rsion \"%s\" ". 
8040: 20 20 20 20 20 20 20 20 20 22 62 75 74 20 74 68           "but th
8050: 69 73 20 62 69 6e 61 72 79 20 65 78 70 65 63 74  is binary expect
8060: 73 20 76 65 72 73 69 6f 6e 20 5c 22 25 73 5c 22  s version \"%s\"
8070: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62 5f  ",.          db_
8080: 67 65 74 28 22 61 75 78 2d 73 63 68 65 6d 61 22  get("aux-schema"
8090: 2c 30 29 2c 20 41 55 58 5f 53 43 48 45 4d 41 29  ,0), AUX_SCHEMA)
80a0: 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74  ;.    fossil_fat
80b0: 61 6c 28 22 72 75 6e 20 5c 22 66 6f 73 73 69 6c  al("run \"fossil
80c0: 20 72 65 62 75 69 6c 64 5c 22 20 74 6f 20 66 69   rebuild\" to fi
80d0: 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 22 29  x this problem")
80e0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
80f0: 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 6d 6f  COMMAND: test-mo
8100: 76 65 2d 72 65 70 6f 73 69 74 6f 72 79 0a 2a 2a  ve-repository.**
8110: 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73  .** Usage: %foss
8120: 69 6c 20 74 65 73 74 2d 6d 6f 76 65 2d 72 65 70  il test-move-rep
8130: 6f 73 69 74 6f 72 79 20 50 41 54 48 4e 41 4d 45  ository PATHNAME
8140: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  .**.** Change th
8150: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
8160: 65 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74  e repository dat
8170: 61 62 61 73 65 20 6f 6e 20 61 20 6c 6f 63 61 6c  abase on a local
8180: 20 63 68 65 63 6b 2d 6f 75 74 2e 0a 2a 2a 20 55   check-out..** U
8190: 73 65 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  se this command 
81a0: 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20  to avoid having 
81b0: 74 6f 20 63 6c 6f 73 65 20 61 6e 64 20 72 65 6f  to close and reo
81c0: 70 65 6e 20 61 20 63 68 65 63 6b 6f 75 74 0a 2a  pen a checkout.*
81d0: 2a 20 77 68 65 6e 20 72 65 6c 6f 63 61 74 69 6e  * when relocatin
81e0: 67 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79  g the repository
81f0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f   database..*/.vo
8200: 69 64 20 6d 6f 76 65 5f 72 65 70 6f 5f 63 6d 64  id move_repo_cmd
8210: 28 76 6f 69 64 29 7b 0a 20 20 42 6c 6f 62 20 72  (void){.  Blob r
8220: 65 70 6f 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  epo;.  char *zRe
8230: 70 6f 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63  po;.  if( g.argc
8240: 21 3d 33 20 29 7b 0a 20 20 20 20 75 73 61 67 65  !=3 ){.    usage
8250: 28 22 50 41 54 48 4e 41 4d 45 22 29 3b 0a 20 20  ("PATHNAME");.  
8260: 7d 0a 20 20 66 69 6c 65 5f 63 61 6e 6f 6e 69 63  }.  file_canonic
8270: 61 6c 5f 6e 61 6d 65 28 67 2e 61 72 67 76 5b 32  al_name(g.argv[2
8280: 5d 2c 20 26 72 65 70 6f 2c 20 30 29 3b 0a 20 20  ], &repo, 0);.  
8290: 7a 52 65 70 6f 20 3d 20 62 6c 6f 62 5f 73 74 72  zRepo = blob_str
82a0: 28 26 72 65 70 6f 29 3b 0a 20 20 69 66 28 20 66  (&repo);.  if( f
82b0: 69 6c 65 5f 61 63 63 65 73 73 28 7a 52 65 70 6f  ile_access(zRepo
82c0: 2c 20 46 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 66  , F_OK) ){.    f
82d0: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e 6f 20  ossil_fatal("no 
82e0: 73 75 63 68 20 66 69 6c 65 3a 20 25 73 22 2c 20  such file: %s", 
82f0: 7a 52 65 70 6f 29 3b 0a 20 20 7d 0a 20 20 69 66  zRepo);.  }.  if
8300: 28 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28  ( db_open_local(
8310: 7a 52 65 70 6f 29 3d 3d 30 20 29 7b 0a 20 20 20  zRepo)==0 ){.   
8320: 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e   fossil_fatal("n
8330: 6f 74 20 69 6e 20 61 20 6c 6f 63 61 6c 20 63 68  ot in a local ch
8340: 65 63 6b 6f 75 74 22 29 3b 0a 20 20 20 20 72 65  eckout");.    re
8350: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62 5f 6f  turn;.  }.  db_o
8360: 70 65 6e 5f 6f 72 5f 61 74 74 61 63 68 28 7a 52  pen_or_attach(zR
8370: 65 70 6f 2c 20 22 74 65 73 74 5f 72 65 70 6f 22  epo, "test_repo"
8380: 2c 20 30 29 3b 0a 20 20 64 62 5f 6c 73 65 74 28  , 0);.  db_lset(
8390: 22 72 65 70 6f 73 69 74 6f 72 79 22 2c 20 62 6c  "repository", bl
83a0: 6f 62 5f 73 74 72 28 26 72 65 70 6f 29 29 3b 0a  ob_str(&repo));.
83b0: 20 20 64 62 5f 63 6c 6f 73 65 28 31 29 3b 0a 7d    db_close(1);.}
83c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  .../*.** Open th
83d0: 65 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65  e local database
83e0: 2e 20 20 49 66 20 75 6e 61 62 6c 65 2c 20 65 78  .  If unable, ex
83f0: 69 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  it with an error
8400: 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 6d 75 73  ..*/.void db_mus
8410: 74 5f 62 65 5f 77 69 74 68 69 6e 5f 74 72 65 65  t_be_within_tree
8420: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 64 62  (void){.  if( db
8430: 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 30 29 3d 3d  _open_local(0)==
8440: 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  0 ){.    fossil_
8450: 66 61 74 61 6c 28 22 63 75 72 72 65 6e 74 20 64  fatal("current d
8460: 69 72 65 63 74 6f 72 79 20 69 73 20 6e 6f 74 20  irectory is not 
8470: 77 69 74 68 69 6e 20 61 6e 20 6f 70 65 6e 20 63  within an open c
8480: 68 65 63 6b 6f 75 74 22 29 3b 0a 20 20 7d 0a 20  heckout");.  }. 
8490: 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74   db_open_reposit
84a0: 6f 72 79 28 30 29 3b 0a 20 20 64 62 5f 76 65 72  ory(0);.  db_ver
84b0: 69 66 79 5f 73 63 68 65 6d 61 28 29 3b 0a 7d 0a  ify_schema();.}.
84c0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
84d0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
84e0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 43 68 65 63  tion..**.** Chec
84f0: 6b 20 66 6f 72 20 75 6e 66 69 6e 61 6c 69 7a 65  k for unfinalize
8500: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64  d statements and
8510: 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 69   report errors i
8520: 66 20 74 68 65 20 72 65 70 6f 72 74 45 72 72 6f  f the reportErro
8530: 72 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  rs.** argument i
8540: 73 20 74 72 75 65 2e 20 20 49 67 6e 6f 72 65 20  s true.  Ignore 
8550: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 73 74 61 74  unfinalized stat
8560: 65 6d 65 6e 74 73 20 77 68 65 6e 20 66 61 6c 73  ements when fals
8570: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 63 6c  e..*/.void db_cl
8580: 6f 73 65 28 69 6e 74 20 72 65 70 6f 72 74 45 72  ose(int reportEr
8590: 72 6f 72 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  rors){.  sqlite3
85a0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
85b0: 69 66 28 20 67 2e 64 62 3d 3d 30 20 29 20 72 65  if( g.db==0 ) re
85c0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 67 2e 66 53  turn;.  if( g.fS
85d0: 71 6c 53 74 61 74 73 20 29 7b 0a 20 20 20 20 69  qlStats ){.    i
85e0: 6e 74 20 63 75 72 2c 20 68 69 77 74 72 3b 0a 20  nt cur, hiwtr;. 
85f0: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
8600: 61 74 75 73 28 67 2e 64 62 2c 20 53 51 4c 49 54  atus(g.db, SQLIT
8610: 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41  E_DBSTATUS_LOOKA
8620: 53 49 44 45 5f 55 53 45 44 2c 20 26 63 75 72 2c  SIDE_USED, &cur,
8630: 20 26 68 69 77 74 72 2c 20 30 29 3b 0a 20 20 20   &hiwtr, 0);.   
8640: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
8650: 20 22 2d 2d 20 4c 4f 4f 4b 41 53 49 44 45 5f 55   "-- LOOKASIDE_U
8660: 53 45 44 20 20 20 20 20 20 20 20 20 25 31 30 64  SED         %10d
8670: 20 25 31 30 64 5c 6e 22 2c 20 63 75 72 2c 20 68   %10d\n", cur, h
8680: 69 77 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iwtr);.    sqlit
8690: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 67 2e 64  e3_db_status(g.d
86a0: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
86b0: 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54  US_LOOKASIDE_HIT
86c0: 2c 20 26 63 75 72 2c 20 26 68 69 77 74 72 2c 20  , &cur, &hiwtr, 
86d0: 30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  0);.    fprintf(
86e0: 73 74 64 65 72 72 2c 20 22 2d 2d 20 4c 4f 4f 4b  stderr, "-- LOOK
86f0: 41 53 49 44 45 5f 48 49 54 20 20 20 20 20 20 20  ASIDE_HIT       
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 31                %1
8710: 30 64 5c 6e 22 2c 20 68 69 77 74 72 29 3b 0a 20  0d\n", hiwtr);. 
8720: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
8730: 61 74 75 73 28 67 2e 64 62 2c 20 53 51 4c 49 54  atus(g.db, SQLIT
8740: 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41  E_DBSTATUS_LOOKA
8750: 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 20  SIDE_MISS_SIZE, 
8760: 26 63 75 72 2c 26 68 69 77 74 72 2c 30 29 3b 0a  &cur,&hiwtr,0);.
8770: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
8780: 72 72 2c 20 22 2d 2d 20 4c 4f 4f 4b 41 53 49 44  rr, "-- LOOKASID
8790: 45 5f 4d 49 53 53 5f 53 49 5a 45 20 20 20 20 20  E_MISS_SIZE     
87a0: 20 20 20 20 20 20 20 20 20 20 25 31 30 64 5c 6e            %10d\n
87b0: 22 2c 20 68 69 77 74 72 29 3b 0a 20 20 20 20 73  ", hiwtr);.    s
87c0: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
87d0: 28 67 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  (g.db, SQLITE_DB
87e0: 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45  STATUS_LOOKASIDE
87f0: 5f 4d 49 53 53 5f 46 55 4c 4c 2c 20 26 63 75 72  _MISS_FULL, &cur
8800: 2c 26 68 69 77 74 72 2c 30 29 3b 0a 20 20 20 20  ,&hiwtr,0);.    
8810: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
8820: 22 2d 2d 20 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49  "-- LOOKASIDE_MI
8830: 53 53 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 20  SS_FULL         
8840: 20 20 20 20 20 20 25 31 30 64 5c 6e 22 2c 20 68        %10d\n", h
8850: 69 77 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iwtr);.    sqlit
8860: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 67 2e 64  e3_db_status(g.d
8870: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
8880: 55 53 5f 43 41 43 48 45 5f 55 53 45 44 2c 20 26  US_CACHE_USED, &
8890: 63 75 72 2c 20 26 68 69 77 74 72 2c 20 30 29 3b  cur, &hiwtr, 0);
88a0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
88b0: 65 72 72 2c 20 22 2d 2d 20 43 41 43 48 45 5f 55  err, "-- CACHE_U
88c0: 53 45 44 20 20 20 20 20 20 20 20 20 20 20 20 20  SED             
88d0: 25 31 30 64 5c 6e 22 2c 20 63 75 72 29 3b 0a 20  %10d\n", cur);. 
88e0: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
88f0: 61 74 75 73 28 67 2e 64 62 2c 20 53 51 4c 49 54  atus(g.db, SQLIT
8900: 45 5f 44 42 53 54 41 54 55 53 5f 53 43 48 45 4d  E_DBSTATUS_SCHEM
8910: 41 5f 55 53 45 44 2c 20 26 63 75 72 2c 20 26 68  A_USED, &cur, &h
8920: 69 77 74 72 2c 20 30 29 3b 0a 20 20 20 20 66 70  iwtr, 0);.    fp
8930: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2d  rintf(stderr, "-
8940: 2d 20 53 43 48 45 4d 41 5f 55 53 45 44 20 20 20  - SCHEMA_USED   
8950: 20 20 20 20 20 20 20 20 20 25 31 30 64 5c 6e 22           %10d\n"
8960: 2c 20 63 75 72 29 3b 0a 20 20 20 20 73 71 6c 69  , cur);.    sqli
8970: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 67 2e  te3_db_status(g.
8980: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
8990: 54 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c 20 26  TUS_STMT_USED, &
89a0: 63 75 72 2c 20 26 68 69 77 74 72 2c 20 30 29 3b  cur, &hiwtr, 0);
89b0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
89c0: 65 72 72 2c 20 22 2d 2d 20 53 54 4d 54 5f 55 53  err, "-- STMT_US
89d0: 45 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ED              
89e0: 25 31 30 64 5c 6e 22 2c 20 63 75 72 29 3b 0a 20  %10d\n", cur);. 
89f0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75     sqlite3_statu
8a00: 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  s(SQLITE_STATUS_
8a10: 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 26 63 75  MEMORY_USED, &cu
8a20: 72 2c 20 26 68 69 77 74 72 2c 20 30 29 3b 0a 20  r, &hiwtr, 0);. 
8a30: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
8a40: 72 2c 20 22 2d 2d 20 4d 45 4d 4f 52 59 5f 55 53  r, "-- MEMORY_US
8a50: 45 44 20 20 20 20 20 20 20 20 20 20 20 20 25 31  ED            %1
8a60: 30 64 20 25 31 30 64 5c 6e 22 2c 20 63 75 72 2c  0d %10d\n", cur,
8a70: 20 68 69 77 74 72 29 3b 0a 20 20 20 20 73 71 6c   hiwtr);.    sql
8a80: 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49  ite3_status(SQLI
8a90: 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43  TE_STATUS_MALLOC
8aa0: 5f 53 49 5a 45 2c 20 26 63 75 72 2c 20 26 68 69  _SIZE, &cur, &hi
8ab0: 77 74 72 2c 20 30 29 3b 0a 20 20 20 20 66 70 72  wtr, 0);.    fpr
8ac0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2d 2d  intf(stderr, "--
8ad0: 20 4d 41 4c 4c 4f 43 5f 53 49 5a 45 20 20 20 20   MALLOC_SIZE    
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8af0: 20 20 20 25 31 30 64 5c 6e 22 2c 20 68 69 77 74     %10d\n", hiwt
8b00: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
8b10: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
8b20: 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e  ATUS_MALLOC_COUN
8b30: 54 2c 20 26 63 75 72 2c 20 26 68 69 77 74 72 2c  T, &cur, &hiwtr,
8b40: 20 30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   0);.    fprintf
8b50: 28 73 74 64 65 72 72 2c 20 22 2d 2d 20 4d 41 4c  (stderr, "-- MAL
8b60: 4c 4f 43 5f 43 4f 55 4e 54 20 20 20 20 20 20 20  LOC_COUNT       
8b70: 20 20 20 20 25 31 30 64 20 25 31 30 64 5c 6e 22      %10d %10d\n"
8b80: 2c 20 63 75 72 2c 20 68 69 77 74 72 29 3b 0a 20  , cur, hiwtr);. 
8b90: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75     sqlite3_statu
8ba0: 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  s(SQLITE_STATUS_
8bb0: 50 41 47 45 43 41 43 48 45 5f 4f 56 45 52 46 4c  PAGECACHE_OVERFL
8bc0: 4f 57 2c 20 26 63 75 72 2c 20 26 68 69 77 74 72  OW, &cur, &hiwtr
8bd0: 2c 20 30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , 0);.    fprint
8be0: 66 28 73 74 64 65 72 72 2c 20 22 2d 2d 20 50 43  f(stderr, "-- PC
8bf0: 41 43 48 45 5f 4f 56 46 4c 4f 57 20 20 20 20 20  ACHE_OVFLOW     
8c00: 20 20 20 20 20 25 31 30 64 20 25 31 30 64 5c 6e       %10d %10d\n
8c10: 22 2c 20 63 75 72 2c 20 68 69 77 74 72 29 3b 0a  ", cur, hiwtr);.
8c20: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
8c30: 72 72 2c 20 22 2d 2d 20 70 72 65 70 61 72 65 64  rr, "-- prepared
8c40: 20 73 74 61 74 65 6d 65 6e 74 73 20 20 20 20 25   statements    %
8c50: 31 30 64 5c 6e 22 2c 20 64 62 2e 6e 50 72 65 70  10d\n", db.nPrep
8c60: 61 72 65 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  are);.  }.  whil
8c70: 65 28 20 64 62 2e 70 41 6c 6c 53 74 6d 74 20 29  e( db.pAllStmt )
8c80: 7b 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a  {.    db_finaliz
8c90: 65 28 64 62 2e 70 41 6c 6c 53 74 6d 74 29 3b 0a  e(db.pAllStmt);.
8ca0: 20 20 7d 0a 20 20 64 62 5f 65 6e 64 5f 74 72 61    }.  db_end_tra
8cb0: 6e 73 61 63 74 69 6f 6e 28 31 29 3b 0a 20 20 70  nsaction(1);.  p
8cc0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Stmt = 0;.  if( 
8cd0: 72 65 70 6f 72 74 45 72 72 6f 72 73 20 29 7b 0a  reportErrors ){.
8ce0: 20 20 20 20 77 68 69 6c 65 28 20 28 70 53 74 6d      while( (pStm
8cf0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  t = sqlite3_next
8d00: 5f 73 74 6d 74 28 67 2e 64 62 2c 20 70 53 74 6d  _stmt(g.db, pStm
8d10: 74 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  t))!=0 ){.      
8d20: 66 6f 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22  fossil_warning("
8d30: 75 6e 66 69 6e 61 6c 69 7a 65 64 20 53 51 4c 20  unfinalized SQL 
8d40: 73 74 61 74 65 6d 65 6e 74 3a 20 5b 25 73 5d 22  statement: [%s]"
8d50: 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  , sqlite3_sql(pS
8d60: 74 6d 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tmt));.    }.  }
8d70: 0a 20 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f  .  g.repositoryO
8d80: 70 65 6e 20 3d 20 30 3b 0a 20 20 67 2e 6c 6f 63  pen = 0;.  g.loc
8d90: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 67 2e  alOpen = 0;.  g.
8da0: 7a 43 6f 6e 66 69 67 44 62 4e 61 6d 65 20 3d 20  zConfigDbName = 
8db0: 4e 55 4c 4c 3b 0a 20 20 73 71 6c 69 74 65 33 5f  NULL;.  sqlite3_
8dc0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 67  wal_checkpoint(g
8dd0: 2e 64 62 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  .db, 0);.  sqlit
8de0: 65 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b 0a  e3_close(g.db);.
8df0: 20 20 67 2e 64 62 20 3d 20 30 3b 0a 20 20 67 2e    g.db = 0;.  g.
8e00: 7a 4d 61 69 6e 44 62 54 79 70 65 20 3d 20 30 3b  zMainDbType = 0;
8e10: 0a 20 20 69 66 28 20 67 2e 64 62 43 6f 6e 66 69  .  if( g.dbConfi
8e20: 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
8e30: 5f 63 6c 6f 73 65 28 67 2e 64 62 43 6f 6e 66 69  _close(g.dbConfi
8e40: 67 29 3b 0a 20 20 20 20 67 2e 64 62 43 6f 6e 66  g);.    g.dbConf
8e50: 69 67 20 3d 20 30 3b 0a 20 20 20 20 67 2e 7a 43  ig = 0;.    g.zC
8e60: 6f 6e 66 69 67 44 62 54 79 70 65 20 3d 20 30 3b  onfigDbType = 0;
8e70: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  .  }.}.../*.** C
8e80: 72 65 61 74 65 20 61 20 6e 65 77 20 65 6d 70 74  reate a new empt
8e90: 79 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74  y repository dat
8ea0: 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 67  abase with the g
8eb0: 69 76 65 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  iven name..**.**
8ec0: 20 4f 6e 6c 79 20 74 68 65 20 73 63 68 65 6d 61   Only the schema
8ed0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
8ee0: 20 20 54 68 65 20 72 65 71 75 69 72 65 64 20 56    The required V
8ef0: 41 52 20 74 61 62 6c 65 73 20 65 6e 74 72 69 65  AR tables entrie
8f00: 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 73 65 74  s.** are not set
8f10: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
8f20: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 73 65 74   and must be set
8f30: 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e 20 6f   separately in o
8f40: 72 64 65 72 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20  rder.** to make 
8f50: 74 68 65 20 6e 65 77 20 66 69 6c 65 20 61 20 76  the new file a v
8f60: 61 6c 69 64 20 64 61 74 61 62 61 73 65 2e 0a 2a  alid database..*
8f70: 2f 0a 76 6f 69 64 20 64 62 5f 63 72 65 61 74 65  /.void db_create
8f80: 5f 72 65 70 6f 73 69 74 6f 72 79 28 63 6f 6e 73  _repository(cons
8f90: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
8fa0: 65 29 7b 0a 20 20 64 62 5f 69 6e 69 74 5f 64 61  e){.  db_init_da
8fb0: 74 61 62 61 73 65 28 0a 20 20 20 20 20 7a 46 69  tabase(.     zFi
8fc0: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 7a 52 65  lename,.     zRe
8fd0: 70 6f 73 69 74 6f 72 79 53 63 68 65 6d 61 31 2c  positorySchema1,
8fe0: 0a 20 20 20 20 20 7a 52 65 70 6f 73 69 74 6f 72  .     zRepositor
8ff0: 79 53 63 68 65 6d 61 44 65 66 61 75 6c 74 52 65  ySchemaDefaultRe
9000: 70 6f 72 74 73 2c 0a 20 20 20 20 20 7a 52 65 70  ports,.     zRep
9010: 6f 73 69 74 6f 72 79 53 63 68 65 6d 61 32 2c 0a  ositorySchema2,.
9020: 20 20 20 20 20 28 63 68 61 72 2a 29 30 0a 20 20       (char*)0.  
9030: 29 3b 0a 20 20 64 62 5f 64 65 6c 65 74 65 5f 6f  );.  db_delete_o
9040: 6e 5f 66 61 69 6c 75 72 65 28 7a 46 69 6c 65 6e  n_failure(zFilen
9050: 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ame);.}../*.** C
9060: 72 65 61 74 65 20 74 68 65 20 64 65 66 61 75 6c  reate the defaul
9070: 74 20 75 73 65 72 20 61 63 63 6f 75 6e 74 73 20  t user accounts 
9080: 69 6e 20 74 68 65 20 55 53 45 52 20 74 61 62 6c  in the USER tabl
9090: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 63 72  e..*/.void db_cr
90a0: 65 61 74 65 5f 64 65 66 61 75 6c 74 5f 75 73 65  eate_default_use
90b0: 72 73 28 69 6e 74 20 73 65 74 75 70 55 73 65 72  rs(int setupUser
90c0: 4f 6e 6c 79 2c 20 63 6f 6e 73 74 20 63 68 61 72  Only, const char
90d0: 20 2a 7a 44 65 66 61 75 6c 74 55 73 65 72 29 7b   *zDefaultUser){
90e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
90f0: 55 73 65 72 20 3d 20 7a 44 65 66 61 75 6c 74 55  User = zDefaultU
9100: 73 65 72 3b 0a 20 20 69 66 28 20 7a 55 73 65 72  ser;.  if( zUser
9110: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 55 73 65 72  ==0 ){.    zUser
9120: 20 3d 20 64 62 5f 67 65 74 28 22 64 65 66 61 75   = db_get("defau
9130: 6c 74 2d 75 73 65 72 22 2c 20 30 29 3b 0a 20 20  lt-user", 0);.  
9140: 7d 0a 20 20 69 66 28 20 7a 55 73 65 72 3d 3d 30  }.  if( zUser==0
9150: 20 29 7b 0a 20 20 20 20 7a 55 73 65 72 20 3d 20   ){.    zUser = 
9160: 66 6f 73 73 69 6c 5f 67 65 74 65 6e 76 28 22 46  fossil_getenv("F
9170: 4f 53 53 49 4c 5f 55 53 45 52 22 29 3b 0a 20 20  OSSIL_USER");.  
9180: 7d 0a 20 20 69 66 28 20 7a 55 73 65 72 3d 3d 30  }.  if( zUser==0
9190: 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   ){.#if defined(
91a0: 5f 57 49 4e 33 32 29 0a 20 20 20 20 7a 55 73 65  _WIN32).    zUse
91b0: 72 20 3d 20 66 6f 73 73 69 6c 5f 67 65 74 65 6e  r = fossil_geten
91c0: 76 28 22 55 53 45 52 4e 41 4d 45 22 29 3b 0a 23  v("USERNAME");.#
91d0: 65 6c 73 65 0a 20 20 20 20 7a 55 73 65 72 20 3d  else.    zUser =
91e0: 20 66 6f 73 73 69 6c 5f 67 65 74 65 6e 76 28 22   fossil_getenv("
91f0: 55 53 45 52 22 29 3b 0a 20 20 20 20 69 66 28 20  USER");.    if( 
9200: 7a 55 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  zUser==0 ){.    
9210: 20 20 7a 55 73 65 72 20 3d 20 66 6f 73 73 69 6c    zUser = fossil
9220: 5f 67 65 74 65 6e 76 28 22 4c 4f 47 4e 41 4d 45  _getenv("LOGNAME
9230: 22 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ");.    }.#endif
9240: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 55 73 65 72  .  }.  if( zUser
9250: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 55 73 65 72  ==0 ){.    zUser
9260: 20 3d 20 22 72 6f 6f 74 22 3b 0a 20 20 7d 0a 20   = "root";.  }. 
9270: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a   db_multi_exec(.
9280: 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20       "INSERT OR 
9290: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 75 73 65 72  IGNORE INTO user
92a0: 28 6c 6f 67 69 6e 2c 20 69 6e 66 6f 29 20 56 41  (login, info) VA
92b0: 4c 55 45 53 28 25 51 2c 27 27 29 22 2c 20 7a 55  LUES(%Q,'')", zU
92c0: 73 65 72 0a 20 20 29 3b 0a 20 20 64 62 5f 6d 75  ser.  );.  db_mu
92d0: 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 22  lti_exec(.     "
92e0: 55 50 44 41 54 45 20 75 73 65 72 20 53 45 54 20  UPDATE user SET 
92f0: 63 61 70 3d 27 73 27 2c 20 70 77 3d 6c 6f 77 65  cap='s', pw=lowe
9300: 72 28 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62  r(hex(randomblob
9310: 28 33 29 29 29 22 0a 20 20 20 20 20 22 20 57 48  (3)))".     " WH
9320: 45 52 45 20 6c 6f 67 69 6e 3d 25 51 22 2c 20 7a  ERE login=%Q", z
9330: 55 73 65 72 0a 20 20 29 3b 0a 20 20 69 66 28 20  User.  );.  if( 
9340: 21 73 65 74 75 70 55 73 65 72 4f 6e 6c 79 20 29  !setupUserOnly )
9350: 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65  {.    db_multi_e
9360: 78 65 63 28 0a 20 20 20 20 20 20 20 22 49 4e 53  xec(.       "INS
9370: 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e  ERT OR IGNORE IN
9380: 54 4f 20 75 73 65 72 28 6c 6f 67 69 6e 2c 70 77  TO user(login,pw
9390: 2c 63 61 70 2c 69 6e 66 6f 29 22 0a 20 20 20 20  ,cap,info)".    
93a0: 20 20 20 22 20 20 20 56 41 4c 55 45 53 28 27 61     "   VALUES('a
93b0: 6e 6f 6e 79 6d 6f 75 73 27 2c 68 65 78 28 72 61  nonymous',hex(ra
93c0: 6e 64 6f 6d 62 6c 6f 62 28 38 29 29 2c 27 68 6d  ndomblob(8)),'hm
93d0: 6e 63 7a 27 2c 27 41 6e 6f 6e 27 29 3b 22 0a 20  ncz','Anon');". 
93e0: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52        "INSERT OR
93f0: 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 75 73 65   IGNORE INTO use
9400: 72 28 6c 6f 67 69 6e 2c 70 77 2c 63 61 70 2c 69  r(login,pw,cap,i
9410: 6e 66 6f 29 22 0a 20 20 20 20 20 20 20 22 20 20  nfo)".       "  
9420: 20 56 41 4c 55 45 53 28 27 6e 6f 62 6f 64 79 27   VALUES('nobody'
9430: 2c 27 27 2c 27 67 6a 6f 72 27 2c 27 4e 6f 62 6f  ,'','gjor','Nobo
9440: 64 79 27 29 3b 22 0a 20 20 20 20 20 20 20 22 49  dy');".       "I
9450: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
9460: 49 4e 54 4f 20 75 73 65 72 28 6c 6f 67 69 6e 2c  INTO user(login,
9470: 70 77 2c 63 61 70 2c 69 6e 66 6f 29 22 0a 20 20  pw,cap,info)".  
9480: 20 20 20 20 20 22 20 20 20 56 41 4c 55 45 53 28       "   VALUES(
9490: 27 64 65 76 65 6c 6f 70 65 72 27 2c 27 27 2c 27  'developer','','
94a0: 64 65 69 27 2c 27 44 65 76 27 29 3b 22 0a 20 20  dei','Dev');".  
94b0: 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20       "INSERT OR 
94c0: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 75 73 65 72  IGNORE INTO user
94d0: 28 6c 6f 67 69 6e 2c 70 77 2c 63 61 70 2c 69 6e  (login,pw,cap,in
94e0: 66 6f 29 22 0a 20 20 20 20 20 20 20 22 20 20 20  fo)".       "   
94f0: 56 41 4c 55 45 53 28 27 72 65 61 64 65 72 27 2c  VALUES('reader',
9500: 27 27 2c 27 6b 70 74 77 27 2c 27 52 65 61 64 65  '','kptw','Reade
9510: 72 27 29 3b 22 0a 20 20 20 20 29 3b 0a 20 20 7d  r');".    );.  }
9520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9530: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
9540: 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 74  string that cont
9550: 61 69 6e 73 20 74 68 65 20 52 48 53 20 6f 66 20  ains the RHS of 
9560: 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  an IN operator.*
9570: 2a 20 74 68 61 74 20 77 69 6c 6c 20 73 65 6c 65  * that will sele
9580: 63 74 20 43 4f 4e 46 49 47 20 74 61 62 6c 65 20  ct CONFIG table 
9590: 6e 61 6d 65 73 20 74 68 61 74 20 61 72 65 20 69  names that are i
95a0: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
95b0: 6e 74 72 6f 6c 0a 2a 2a 20 73 65 74 74 69 6e 67  ntrol.** setting
95c0: 73 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  s..*/.const char
95d0: 20 2a 64 62 5f 73 65 74 74 69 6e 67 5f 69 6e 6f   *db_setting_ino
95e0: 70 5f 72 68 73 28 29 7b 0a 20 20 42 6c 6f 62 20  p_rhs(){.  Blob 
95f0: 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  x;.  int i;.  co
9600: 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d  nst char *zSep =
9610: 20 22 22 3b 0a 0a 20 20 62 6c 6f 62 5f 7a 65 72   "";..  blob_zer
9620: 6f 28 26 78 29 3b 0a 20 20 62 6c 6f 62 5f 61 70  o(&x);.  blob_ap
9630: 70 65 6e 64 28 26 78 2c 20 22 28 22 2c 20 31 29  pend(&x, "(", 1)
9640: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 63 74 72  ;.  for(i=0; ctr
9650: 6c 53 65 74 74 69 6e 67 73 5b 69 5d 2e 6e 61 6d  lSettings[i].nam
9660: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 62 6c 6f  e; i++){.    blo
9670: 62 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  b_appendf(&x, "%
9680: 73 27 25 73 27 22 2c 20 7a 53 65 70 2c 20 63 74  s'%s'", zSep, ct
9690: 72 6c 53 65 74 74 69 6e 67 73 5b 69 5d 2e 6e 61  rlSettings[i].na
96a0: 6d 65 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  me);.    zSep = 
96b0: 22 2c 22 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f  ",";.  }.  blob_
96c0: 61 70 70 65 6e 64 28 26 78 2c 20 22 29 22 2c 20  append(&x, ")", 
96d0: 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 6c 6f  1);.  return blo
96e0: 62 5f 73 74 72 28 26 78 29 3b 0a 7d 0a 0a 2f 2a  b_str(&x);.}../*
96f0: 0a 2a 2a 20 46 69 6c 6c 20 61 6e 20 65 6d 70 74  .** Fill an empt
9700: 79 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74  y repository dat
9710: 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 62  abase with the b
9720: 61 73 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  asic information
9730: 20 66 6f 72 20 61 0a 2a 2a 20 72 65 70 6f 73 69   for a.** reposi
9740: 74 6f 72 79 2e 20 54 68 69 73 20 66 75 6e 63 74  tory. This funct
9750: 69 6f 6e 20 69 73 20 73 68 61 72 65 64 20 62 65  ion is shared be
9760: 74 77 65 65 6e 20 27 63 72 65 61 74 65 5f 72 65  tween 'create_re
9770: 70 6f 73 69 74 6f 72 79 5f 63 6d 64 27 0a 2a 2a  pository_cmd'.**
9780: 20 28 27 6e 65 77 27 29 20 61 6e 64 20 27 72 65   ('new') and 're
9790: 63 6f 6e 73 74 72 75 63 74 5f 63 6d 64 27 20 28  construct_cmd' (
97a0: 27 72 65 63 6f 6e 73 74 72 75 63 74 27 29 2c 20  'reconstruct'), 
97b0: 62 6f 74 68 20 6f 66 20 77 68 69 63 68 20 63 72  both of which cr
97c0: 65 61 74 65 0a 2a 2a 20 6e 65 77 20 72 65 70 6f  eate.** new repo
97d0: 73 69 74 6f 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20  sitories..**.** 
97e0: 54 68 65 20 7a 54 65 6d 70 6c 61 74 65 20 70 61  The zTemplate pa
97f0: 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
9800: 65 73 20 69 66 20 74 68 65 20 73 65 74 74 69 6e  es if the settin
9810: 67 73 20 66 6f 72 20 74 68 65 20 72 65 70 6f 73  gs for the repos
9820: 69 74 6f 72 79 0a 2a 2a 20 73 68 6f 75 6c 64 20  itory.** should 
9830: 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 61  be copied from a
9840: 6e 6f 74 68 65 72 20 72 65 70 6f 73 69 74 6f 72  nother repositor
9850: 79 2e 20 20 49 66 20 7a 54 65 6d 70 6c 61 74 65  y.  If zTemplate
9860: 20 69 73 20 30 20 74 68 65 6e 20 74 68 65 0a 2a   is 0 then the.*
9870: 2a 20 73 65 74 74 69 6e 67 73 20 77 69 6c 6c 20  * settings will 
9880: 68 61 76 65 20 74 68 65 69 72 20 6e 6f 72 6d 61  have their norma
9890: 6c 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  l default values
98a0: 2e 20 20 49 66 20 7a 54 65 6d 70 6c 61 74 65 20  .  If zTemplate 
98b0: 69 73 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  is.** non-zero, 
98c0: 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
98d0: 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  at the caller of
98e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
98f0: 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 61 74  as already.** at
9900: 74 61 63 68 65 64 20 61 20 64 61 74 61 62 61 73  tached a databas
9910: 65 20 75 73 69 6e 67 20 74 68 65 20 6c 61 62 65  e using the labe
9920: 6c 20 22 73 65 74 74 69 6e 67 53 72 63 22 2e 20  l "settingSrc". 
9930: 20 49 66 20 6e 6f 74 2c 20 74 68 65 20 63 61 6c   If not, the cal
9940: 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 66 75 6e  l to.** this fun
9950: 63 74 69 6f 6e 20 77 69 6c 6c 20 66 61 69 6c 2e  ction will fail.
9960: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 49 6e 69 74  .**.** The zInit
9970: 69 61 6c 44 61 74 65 20 70 61 72 61 6d 65 74 65  ialDate paramete
9980: 72 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65  r determines the
9990: 20 64 61 74 65 20 6f 66 20 74 68 65 20 69 6e 69   date of the ini
99a0: 74 69 61 6c 20 63 68 65 63 6b 2d 69 6e 0a 2a 2a  tial check-in.**
99b0: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
99c0: 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 2e 20  ically created. 
99d0: 20 49 66 20 7a 49 6e 69 74 69 61 6c 44 61 74 65   If zInitialDate
99e0: 20 69 73 20 30 20 74 68 65 6e 20 6e 6f 20 69 6e   is 0 then no in
99f0: 69 74 69 61 6c 0a 2a 2a 20 63 68 65 63 6b 2d 69  itial.** check-i
9a00: 6e 20 69 73 20 63 72 65 61 74 65 64 2e 20 54 68  n is created. Th
9a10: 65 20 6d 61 6b 65 53 65 72 76 65 72 43 6f 64 65  e makeServerCode
9a20: 73 20 66 6c 61 67 20 64 65 74 65 72 6d 69 6e 65  s flag determine
9a30: 73 20 77 68 65 74 68 65 72 20 6f 72 0a 2a 2a 20  s whether or.** 
9a40: 6e 6f 74 20 73 65 72 76 65 72 20 61 6e 64 20 70  not server and p
9a50: 72 6f 6a 65 63 74 20 63 6f 64 65 73 20 61 72 65  roject codes are
9a60: 20 69 6e 76 65 6e 74 65 64 20 66 6f 72 20 74 68   invented for th
9a70: 69 73 20 72 65 70 6f 73 69 74 6f 72 79 2e 0a 2a  is repository..*
9a80: 2f 0a 76 6f 69 64 20 64 62 5f 69 6e 69 74 69 61  /.void db_initia
9a90: 6c 5f 73 65 74 75 70 28 0a 20 20 63 6f 6e 73 74  l_setup(.  const
9aa0: 20 63 68 61 72 20 2a 7a 54 65 6d 70 6c 61 74 65   char *zTemplate
9ab0: 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 73  ,       /* Repos
9ac0: 69 74 6f 72 79 20 66 72 6f 6d 20 77 68 69 63 68  itory from which
9ad0: 20 74 6f 20 63 6f 70 79 20 73 65 74 74 69 6e 67   to copy setting
9ae0: 73 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  s. */.  const ch
9af0: 61 72 20 2a 7a 49 6e 69 74 69 61 6c 44 61 74 65  ar *zInitialDate
9b00: 2c 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20  ,    /* Initial 
9b10: 64 61 74 65 20 6f 66 20 72 65 70 6f 73 69 74 6f  date of reposito
9b20: 72 79 2e 20 28 65 78 3a 20 22 6e 6f 77 22 29 20  ry. (ex: "now") 
9b30: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
9b40: 2a 7a 44 65 66 61 75 6c 74 55 73 65 72 2c 20 20  *zDefaultUser,  
9b50: 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 75 73 65    /* Default use
9b60: 72 20 66 6f 72 20 74 68 65 20 72 65 70 6f 73 69  r for the reposi
9b70: 74 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  tory */.  int ma
9b80: 6b 65 53 65 72 76 65 72 43 6f 64 65 73 20 20 20  keServerCodes   
9b90: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
9ba0: 6f 20 6d 61 6b 65 20 6e 65 77 20 73 65 72 76 65  o make new serve
9bb0: 72 20 26 20 70 72 6f 6a 65 63 74 20 63 6f 64 65  r & project code
9bc0: 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  s */.){.  char *
9bd0: 7a 44 61 74 65 3b 0a 20 20 42 6c 6f 62 20 68 61  zDate;.  Blob ha
9be0: 73 68 3b 0a 20 20 42 6c 6f 62 20 6d 61 6e 69 66  sh;.  Blob manif
9bf0: 65 73 74 3b 0a 0a 20 20 64 62 5f 73 65 74 28 22  est;..  db_set("
9c00: 63 6f 6e 74 65 6e 74 2d 73 63 68 65 6d 61 22 2c  content-schema",
9c10: 20 43 4f 4e 54 45 4e 54 5f 53 43 48 45 4d 41 2c   CONTENT_SCHEMA,
9c20: 20 30 29 3b 0a 20 20 64 62 5f 73 65 74 28 22 61   0);.  db_set("a
9c30: 75 78 2d 73 63 68 65 6d 61 22 2c 20 41 55 58 5f  ux-schema", AUX_
9c40: 53 43 48 45 4d 41 2c 20 30 29 3b 0a 20 20 64 62  SCHEMA, 0);.  db
9c50: 5f 73 65 74 28 22 72 65 62 75 69 6c 74 22 2c 20  _set("rebuilt", 
9c60: 67 65 74 5f 76 65 72 73 69 6f 6e 28 29 2c 20 30  get_version(), 0
9c70: 29 3b 0a 20 20 69 66 28 20 6d 61 6b 65 53 65 72  );.  if( makeSer
9c80: 76 65 72 43 6f 64 65 73 20 29 7b 0a 20 20 20 20  verCodes ){.    
9c90: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20  db_multi_exec(. 
9ca0: 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
9cb0: 4f 20 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61  O config(name,va
9cc0: 6c 75 65 2c 6d 74 69 6d 65 29 22 0a 20 20 20 20  lue,mtime)".    
9cd0: 20 20 22 20 56 41 4c 55 45 53 28 27 73 65 72 76    " VALUES('serv
9ce0: 65 72 2d 63 6f 64 65 27 2c 20 6c 6f 77 65 72 28  er-code', lower(
9cf0: 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32  hex(randomblob(2
9d00: 30 29 29 29 2c 6e 6f 77 28 29 29 3b 22 0a 20 20  0))),now());".  
9d10: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
9d20: 20 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c   config(name,val
9d30: 75 65 2c 6d 74 69 6d 65 29 22 0a 20 20 20 20 20  ue,mtime)".     
9d40: 20 22 20 56 41 4c 55 45 53 28 27 70 72 6f 6a 65   " VALUES('proje
9d50: 63 74 2d 63 6f 64 65 27 2c 20 6c 6f 77 65 72 28  ct-code', lower(
9d60: 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32  hex(randomblob(2
9d70: 30 29 29 29 2c 6e 6f 77 28 29 29 3b 22 0a 20 20  0))),now());".  
9d80: 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21    );.  }.  if( !
9d90: 64 62 5f 69 73 5f 67 6c 6f 62 61 6c 28 22 61 75  db_is_global("au
9da0: 74 6f 73 79 6e 63 22 29 20 29 20 64 62 5f 73 65  tosync") ) db_se
9db0: 74 5f 69 6e 74 28 22 61 75 74 6f 73 79 6e 63 22  t_int("autosync"
9dc0: 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 21  , 1, 0);.  if( !
9dd0: 64 62 5f 69 73 5f 67 6c 6f 62 61 6c 28 22 6c 6f  db_is_global("lo
9de0: 63 61 6c 61 75 74 68 22 29 20 29 20 64 62 5f 73  calauth") ) db_s
9df0: 65 74 5f 69 6e 74 28 22 6c 6f 63 61 6c 61 75 74  et_int("localaut
9e00: 68 22 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  h", 0, 0);.  if(
9e10: 20 21 64 62 5f 69 73 5f 67 6c 6f 62 61 6c 28 22   !db_is_global("
9e20: 74 69 6d 65 6c 69 6e 65 2d 70 6c 61 69 6e 74 65  timeline-plainte
9e30: 78 74 22 29 20 29 7b 0a 20 20 20 20 64 62 5f 73  xt") ){.    db_s
9e40: 65 74 5f 69 6e 74 28 22 74 69 6d 65 6c 69 6e 65  et_int("timeline
9e50: 2d 70 6c 61 69 6e 74 65 78 74 22 2c 20 31 2c 20  -plaintext", 1, 
9e60: 30 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 63 72 65  0);.  }.  db_cre
9e70: 61 74 65 5f 64 65 66 61 75 6c 74 5f 75 73 65 72  ate_default_user
9e80: 73 28 30 2c 20 7a 44 65 66 61 75 6c 74 55 73 65  s(0, zDefaultUse
9e90: 72 29 3b 0a 20 20 69 66 28 20 7a 44 65 66 61 75  r);.  if( zDefau
9ea0: 6c 74 55 73 65 72 20 29 20 67 2e 7a 4c 6f 67 69  ltUser ) g.zLogi
9eb0: 6e 20 3d 20 7a 44 65 66 61 75 6c 74 55 73 65 72  n = zDefaultUser
9ec0: 3b 0a 20 20 75 73 65 72 5f 73 65 6c 65 63 74 28  ;.  user_select(
9ed0: 29 3b 0a 0a 20 20 69 66 28 20 7a 54 65 6d 70 6c  );..  if( zTempl
9ee0: 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ate ){.    /*.  
9ef0: 20 20 2a 2a 20 43 6f 70 79 20 61 6c 6c 20 73 65    ** Copy all se
9f00: 74 74 69 6e 67 73 20 66 72 6f 6d 20 74 68 65 20  ttings from the 
9f10: 73 75 70 70 6c 69 65 64 20 74 65 6d 70 6c 61 74  supplied templat
9f20: 65 20 72 65 70 6f 73 69 74 6f 72 79 2e 0a 20 20  e repository..  
9f30: 20 20 2a 2f 0a 20 20 20 20 64 62 5f 6d 75 6c 74    */.    db_mult
9f40: 69 5f 65 78 65 63 28 0a 20 20 20 20 20 20 22 49  i_exec(.      "I
9f50: 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
9f60: 20 49 4e 54 4f 20 63 6f 6e 66 69 67 22 0a 20 20   INTO config".  
9f70: 20 20 20 20 22 20 53 45 4c 45 43 54 20 6e 61 6d      " SELECT nam
9f80: 65 2c 76 61 6c 75 65 2c 6d 74 69 6d 65 20 46 52  e,value,mtime FR
9f90: 4f 4d 20 73 65 74 74 69 6e 67 53 72 63 2e 63 6f  OM settingSrc.co
9fa0: 6e 66 69 67 22 0a 20 20 20 20 20 20 22 20 20 57  nfig".      "  W
9fb0: 48 45 52 45 20 28 6e 61 6d 65 20 49 4e 20 25 73  HERE (name IN %s
9fc0: 20 4f 52 20 6e 61 6d 65 20 49 4e 20 25 73 29 22   OR name IN %s)"
9fd0: 0a 20 20 20 20 20 20 22 20 20 20 20 41 4e 44 20  .      "    AND 
9fe0: 6e 61 6d 65 20 4e 4f 54 20 47 4c 4f 42 20 27 70  name NOT GLOB 'p
9ff0: 72 6f 6a 65 63 74 2d 2a 27 22 0a 20 20 20 20 20  roject-*'".     
a000: 20 22 20 20 20 20 41 4e 44 20 6e 61 6d 65 20 4e   "    AND name N
a010: 4f 54 20 47 4c 4f 42 20 27 73 68 6f 72 74 2d 70  OT GLOB 'short-p
a020: 72 6f 6a 65 63 74 2d 2a 27 3b 22 2c 0a 20 20 20  roject-*';",.   
a030: 20 20 20 63 6f 6e 66 69 67 75 72 65 5f 69 6e 6f     configure_ino
a040: 70 5f 72 68 73 28 43 4f 4e 46 49 47 53 45 54 5f  p_rhs(CONFIGSET_
a050: 41 4c 4c 29 2c 0a 20 20 20 20 20 20 64 62 5f 73  ALL),.      db_s
a060: 65 74 74 69 6e 67 5f 69 6e 6f 70 5f 72 68 73 28  etting_inop_rhs(
a070: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 64 62 5f  ).    );.    db_
a080: 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20  multi_exec(.    
a090: 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
a0a0: 72 65 70 6f 72 74 66 6d 74 20 53 45 4c 45 43 54  reportfmt SELECT
a0b0: 20 2a 20 46 52 4f 4d 20 73 65 74 74 69 6e 67 53   * FROM settingS
a0c0: 72 63 2e 72 65 70 6f 72 74 66 6d 74 3b 22 0a 20  rc.reportfmt;". 
a0d0: 20 20 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20     );..    /*.  
a0e0: 20 20 2a 2a 20 43 6f 70 79 20 74 68 65 20 75 73    ** Copy the us
a0f0: 65 72 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20  er permissions, 
a100: 63 6f 6e 74 61 63 74 20 69 6e 66 6f 72 6d 61 74  contact informat
a110: 69 6f 6e 2c 20 6c 61 73 74 20 6d 6f 64 69 66 69  ion, last modifi
a120: 65 64 0a 20 20 20 20 2a 2a 20 74 69 6d 65 2c 20  ed.    ** time, 
a130: 61 6e 64 20 70 68 6f 74 6f 20 66 6f 72 20 61 6c  and photo for al
a140: 6c 20 74 68 65 20 22 73 79 73 74 65 6d 22 20 75  l the "system" u
a150: 73 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 75  sers from the su
a160: 70 70 6c 69 65 64 0a 20 20 20 20 2a 2a 20 74 65  pplied.    ** te
a170: 6d 70 6c 61 74 65 20 72 65 70 6f 73 69 74 6f 72  mplate repositor
a180: 79 20 69 6e 74 6f 20 74 68 65 20 6f 6e 65 20 62  y into the one b
a190: 65 69 6e 67 20 73 65 74 75 70 2e 20 20 54 68 65  eing setup.  The
a1a0: 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 73 0a 20   other columns. 
a1b0: 20 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 63 6f     ** are not co
a1c0: 70 69 65 64 20 62 65 63 61 75 73 65 20 74 68 65  pied because the
a1d0: 79 20 63 6f 6e 74 61 69 6e 20 73 65 63 75 72 69  y contain securi
a1e0: 74 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  ty information o
a1f0: 72 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  r other.    ** d
a200: 61 74 61 20 73 70 65 63 69 66 69 63 20 74 6f 20  ata specific to 
a210: 74 68 65 20 6f 74 68 65 72 20 72 65 70 6f 73 69  the other reposi
a220: 74 6f 72 79 2e 20 20 54 68 65 20 6c 69 73 74 20  tory.  The list 
a230: 6f 66 20 63 6f 6c 75 6d 6e 73 20 63 6f 70 69 65  of columns copie
a240: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
a250: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 6d   SQL statement m
a260: 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ay need to be re
a270: 76 69 73 65 64 20 69 6e 20 74 68 65 20 66 75 74  vised in the fut
a280: 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
a290: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 55  db_multi_exec("U
a2a0: 50 44 41 54 45 20 75 73 65 72 20 53 45 54 22 0a  PDATE user SET".
a2b0: 20 20 20 20 20 20 22 20 20 63 61 70 20 3d 20 28        "  cap = (
a2c0: 53 45 4c 45 43 54 20 75 32 2e 63 61 70 20 46 52  SELECT u2.cap FR
a2d0: 4f 4d 20 73 65 74 74 69 6e 67 53 72 63 2e 75 73  OM settingSrc.us
a2e0: 65 72 20 75 32 22 0a 20 20 20 20 20 20 22 20 20  er u2".      "  
a2f0: 20 20 20 20 20 20 20 57 48 45 52 45 20 75 32 2e         WHERE u2.
a300: 6c 6f 67 69 6e 20 3d 20 75 73 65 72 2e 6c 6f 67  login = user.log
a310: 69 6e 29 2c 22 0a 20 20 20 20 20 20 22 20 20 69  in),".      "  i
a320: 6e 66 6f 20 3d 20 28 53 45 4c 45 43 54 20 75 32  nfo = (SELECT u2
a330: 2e 69 6e 66 6f 20 46 52 4f 4d 20 73 65 74 74 69  .info FROM setti
a340: 6e 67 53 72 63 2e 75 73 65 72 20 75 32 22 0a 20  ngSrc.user u2". 
a350: 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20       "          
a360: 57 48 45 52 45 20 75 32 2e 6c 6f 67 69 6e 20 3d  WHERE u2.login =
a370: 20 75 73 65 72 2e 6c 6f 67 69 6e 29 2c 22 0a 20   user.login),". 
a380: 20 20 20 20 20 22 20 20 6d 74 69 6d 65 20 3d 20       "  mtime = 
a390: 28 53 45 4c 45 43 54 20 75 32 2e 6d 74 69 6d 65  (SELECT u2.mtime
a3a0: 20 46 52 4f 4d 20 73 65 74 74 69 6e 67 53 72 63   FROM settingSrc
a3b0: 2e 75 73 65 72 20 75 32 22 0a 20 20 20 20 20 20  .user u2".      
a3c0: 22 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52  "           WHER
a3d0: 45 20 75 32 2e 6c 6f 67 69 6e 20 3d 20 75 73 65  E u2.login = use
a3e0: 72 2e 6c 6f 67 69 6e 29 2c 22 0a 20 20 20 20 20  r.login),".     
a3f0: 20 22 20 20 70 68 6f 74 6f 20 3d 20 28 53 45 4c   "  photo = (SEL
a400: 45 43 54 20 75 32 2e 70 68 6f 74 6f 20 46 52 4f  ECT u2.photo FRO
a410: 4d 20 73 65 74 74 69 6e 67 53 72 63 2e 75 73 65  M settingSrc.use
a420: 72 20 75 32 22 0a 20 20 20 20 20 20 22 20 20 20  r u2".      "   
a430: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 75 32          WHERE u2
a440: 2e 6c 6f 67 69 6e 20 3d 20 75 73 65 72 2e 6c 6f  .login = user.lo
a450: 67 69 6e 29 22 0a 20 20 20 20 20 20 22 20 57 48  gin)".      " WH
a460: 45 52 45 20 75 73 65 72 2e 6c 6f 67 69 6e 20 49  ERE user.login I
a470: 4e 20 28 27 61 6e 6f 6e 79 6d 6f 75 73 27 2c 27  N ('anonymous','
a480: 6e 6f 62 6f 64 79 27 2c 27 64 65 76 65 6c 6f 70  nobody','develop
a490: 65 72 27 2c 27 72 65 61 64 65 72 27 29 3b 22 0a  er','reader');".
a4a0: 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66      );.  }..  if
a4b0: 28 20 7a 49 6e 69 74 69 61 6c 44 61 74 65 20 29  ( zInitialDate )
a4c0: 7b 0a 20 20 20 20 69 6e 74 20 72 69 64 3b 0a 20  {.    int rid;. 
a4d0: 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6d 61     blob_zero(&ma
a4e0: 6e 69 66 65 73 74 29 3b 0a 20 20 20 20 62 6c 6f  nifest);.    blo
a4f0: 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69 66  b_appendf(&manif
a500: 65 73 74 2c 20 22 43 20 69 6e 69 74 69 61 6c 5c  est, "C initial\
a510: 5c 73 65 6d 70 74 79 5c 5c 73 63 68 65 63 6b 2d  \sempty\\scheck-
a520: 69 6e 5c 6e 22 29 3b 0a 20 20 20 20 7a 44 61 74  in\n");.    zDat
a530: 65 20 3d 20 64 61 74 65 5f 69 6e 5f 73 74 61 6e  e = date_in_stan
a540: 64 61 72 64 5f 66 6f 72 6d 61 74 28 7a 49 6e 69  dard_format(zIni
a550: 74 69 61 6c 44 61 74 65 29 3b 0a 20 20 20 20 62  tialDate);.    b
a560: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e  lob_appendf(&man
a570: 69 66 65 73 74 2c 20 22 44 20 25 73 5c 6e 22 2c  ifest, "D %s\n",
a580: 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 6d 64 35   zDate);.    md5
a590: 73 75 6d 5f 69 6e 69 74 28 29 3b 0a 20 20 20 20  sum_init();.    
a5a0: 2f 2a 20 54 68 65 20 52 2d 63 61 72 64 20 69 73  /* The R-card is
a5b0: 20 6e 65 63 65 73 73 61 72 79 20 68 65 72 65 20   necessary here 
a5c0: 62 65 63 61 75 73 65 20 77 69 74 68 6f 75 74 20  because without 
a5d0: 69 74 0a 20 20 20 20 20 2a 20 66 6f 73 73 69 6c  it.     * fossil
a5e0: 20 76 65 72 73 69 6f 6e 73 20 65 61 72 6c 69 65   versions earlie
a5f0: 72 20 74 68 61 6e 20 76 65 72 73 69 6f 6e 73 20  r than versions 
a600: 31 2e 32 37 20 77 6f 75 6c 64 0a 20 20 20 20 20  1.27 would.     
a610: 2a 20 69 6e 74 65 72 70 72 65 74 20 74 68 69 73  * interpret this
a620: 20 61 72 74 69 66 61 63 74 20 61 73 20 61 20 22   artifact as a "
a630: 63 6f 6e 74 72 6f 6c 22 2e 20 2a 2f 0a 20 20 20  control". */.   
a640: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d   blob_appendf(&m
a650: 61 6e 69 66 65 73 74 2c 20 22 52 20 25 73 5c 6e  anifest, "R %s\n
a660: 22 2c 20 6d 64 35 73 75 6d 5f 66 69 6e 69 73 68  ", md5sum_finish
a670: 28 30 29 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61  (0));.    blob_a
a680: 70 70 65 6e 64 66 28 26 6d 61 6e 69 66 65 73 74  ppendf(&manifest
a690: 2c 20 22 54 20 2a 62 72 61 6e 63 68 20 2a 20 74  , "T *branch * t
a6a0: 72 75 6e 6b 5c 6e 22 29 3b 0a 20 20 20 20 62 6c  runk\n");.    bl
a6b0: 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69  ob_appendf(&mani
a6c0: 66 65 73 74 2c 20 22 54 20 2a 73 79 6d 2d 74 72  fest, "T *sym-tr
a6d0: 75 6e 6b 20 2a 5c 6e 22 29 3b 0a 20 20 20 20 62  unk *\n");.    b
a6e0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e  lob_appendf(&man
a6f0: 69 66 65 73 74 2c 20 22 55 20 25 46 5c 6e 22 2c  ifest, "U %F\n",
a700: 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 20 20   g.zLogin);.    
a710: 6d 64 35 73 75 6d 5f 62 6c 6f 62 28 26 6d 61 6e  md5sum_blob(&man
a720: 69 66 65 73 74 2c 20 26 68 61 73 68 29 3b 0a 20  ifest, &hash);. 
a730: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
a740: 26 6d 61 6e 69 66 65 73 74 2c 20 22 5a 20 25 62  &manifest, "Z %b
a750: 5c 6e 22 2c 20 26 68 61 73 68 29 3b 0a 20 20 20  \n", &hash);.   
a760: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 68 61 73   blob_reset(&has
a770: 68 29 3b 0a 20 20 20 20 72 69 64 20 3d 20 63 6f  h);.    rid = co
a780: 6e 74 65 6e 74 5f 70 75 74 28 26 6d 61 6e 69 66  ntent_put(&manif
a790: 65 73 74 29 3b 0a 20 20 20 20 6d 61 6e 69 66 65  est);.    manife
a7a0: 73 74 5f 63 72 6f 73 73 6c 69 6e 6b 28 72 69 64  st_crosslink(rid
a7b0: 2c 20 26 6d 61 6e 69 66 65 73 74 2c 20 4d 43 5f  , &manifest, MC_
a7c0: 4e 4f 4e 45 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NONE);.  }.}../*
a7d0: 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 6e 65 77  .** COMMAND: new
a7e0: 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 69 6e  *.** COMMAND: in
a7f0: 69 74 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  it.**.** Usage: 
a800: 25 66 6f 73 73 69 6c 20 6e 65 77 20 3f 4f 50 54  %fossil new ?OPT
a810: 49 4f 4e 53 3f 20 46 49 4c 45 4e 41 4d 45 0a 2a  IONS? FILENAME.*
a820: 2a 20 20 20 20 4f 72 3a 20 25 66 6f 73 73 69 6c  *    Or: %fossil
a830: 20 69 6e 69 74 20 3f 4f 50 54 49 4f 4e 53 3f 20   init ?OPTIONS? 
a840: 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 43  FILENAME.**.** C
a850: 72 65 61 74 65 20 61 20 72 65 70 6f 73 69 74 6f  reate a reposito
a860: 72 79 20 66 6f 72 20 61 20 6e 65 77 20 70 72 6f  ry for a new pro
a870: 6a 65 63 74 20 69 6e 20 74 68 65 20 66 69 6c 65  ject in the file
a880: 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e   named FILENAME.
a890: 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
a8a0: 20 69 73 20 64 69 73 74 69 6e 63 74 20 66 72 6f   is distinct fro
a8b0: 6d 20 22 63 6c 6f 6e 65 22 2e 20 20 54 68 65 20  m "clone".  The 
a8c0: 22 63 6c 6f 6e 65 22 20 63 6f 6d 6d 61 6e 64 20  "clone" command 
a8d0: 6d 61 6b 65 73 0a 2a 2a 20 61 20 63 6f 70 79 20  makes.** a copy 
a8e0: 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70  of an existing p
a8f0: 72 6f 6a 65 63 74 2e 20 20 54 68 69 73 20 63 6f  roject.  This co
a900: 6d 6d 61 6e 64 20 73 74 61 72 74 73 20 61 20 6e  mmand starts a n
a910: 65 77 20 70 72 6f 6a 65 63 74 2e 0a 2a 2a 0a 2a  ew project..**.*
a920: 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 79 6f  * By default, yo
a930: 75 72 20 63 75 72 72 65 6e 74 20 6c 6f 67 69 6e  ur current login
a940: 20 6e 61 6d 65 20 69 73 20 75 73 65 64 20 74 6f   name is used to
a950: 20 63 72 65 61 74 65 20 74 68 65 20 64 65 66 61   create the defa
a960: 75 6c 74 0a 2a 2a 20 61 64 6d 69 6e 20 75 73 65  ult.** admin use
a970: 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20 6f  r. This can be o
a980: 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20  verridden using 
a990: 74 68 65 20 2d 41 7c 2d 2d 61 64 6d 69 6e 2d 75  the -A|--admin-u
a9a0: 73 65 72 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ser.** parameter
a9b0: 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 64 65 66 61 75  ..**.** By defau
a9c0: 6c 74 2c 20 61 6c 6c 20 73 65 74 74 69 6e 67 73  lt, all settings
a9d0: 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c   will be initial
a9e0: 69 7a 65 64 20 74 6f 20 74 68 65 69 72 20 64 65  ized to their de
a9f0: 66 61 75 6c 74 20 76 61 6c 75 65 73 2e 0a 2a 2a  fault values..**
aa00: 20 54 68 69 73 20 63 61 6e 20 62 65 20 6f 76 65   This can be ove
aa10: 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68  rridden using th
aa20: 65 20 2d 2d 74 65 6d 70 6c 61 74 65 20 70 61 72  e --template par
aa30: 61 6d 65 74 65 72 20 74 6f 20 73 70 65 63 69 66  ameter to specif
aa40: 79 20 61 0a 2a 2a 20 72 65 70 6f 73 69 74 6f 72  y a.** repositor
aa50: 79 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63  y file from whic
aa60: 68 20 74 6f 20 63 6f 70 79 20 74 68 65 20 69 6e  h to copy the in
aa70: 69 74 69 61 6c 20 73 65 74 74 69 6e 67 73 2e 20  itial settings. 
aa80: 20 57 68 65 6e 20 61 20 74 65 6d 70 6c 61 74 65   When a template
aa90: 0a 2a 2a 20 72 65 70 6f 73 69 74 6f 72 79 20 69  .** repository i
aaa0: 73 20 75 73 65 64 2c 20 61 6c 6d 6f 73 74 20 61  s used, almost a
aab0: 6c 6c 20 6f 66 20 74 68 65 20 73 65 74 74 69 6e  ll of the settin
aac0: 67 73 20 61 63 63 65 73 73 69 62 6c 65 20 66 72  gs accessible fr
aad0: 6f 6d 20 74 68 65 20 73 65 74 75 70 0a 2a 2a 20  om the setup.** 
aae0: 70 61 67 65 2c 20 65 69 74 68 65 72 20 64 69 72  page, either dir
aaf0: 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63  ectly or indirec
ab00: 74 6c 79 2c 20 77 69 6c 6c 20 62 65 20 63 6f 70  tly, will be cop
ab10: 69 65 64 2e 20 20 4e 6f 72 6d 61 6c 20 75 73 65  ied.  Normal use
ab20: 72 73 20 61 6e 64 0a 2a 2a 20 74 68 65 69 72 20  rs and.** their 
ab30: 61 73 73 6f 63 69 61 74 65 64 20 70 65 72 6d 69  associated permi
ab40: 73 73 69 6f 6e 73 20 77 69 6c 6c 20 6e 6f 74 20  ssions will not 
ab50: 62 65 20 63 6f 70 69 65 64 3b 20 68 6f 77 65 76  be copied; howev
ab60: 65 72 2c 20 74 68 65 20 73 79 73 74 65 6d 0a 2a  er, the system.*
ab70: 2a 20 64 65 66 61 75 6c 74 20 75 73 65 72 73 20  * default users 
ab80: 22 61 6e 6f 6e 79 6d 6f 75 73 22 2c 20 22 6e 6f  "anonymous", "no
ab90: 62 6f 64 79 22 2c 20 22 72 65 61 64 65 72 22 2c  body", "reader",
aba0: 20 22 64 65 76 65 6c 6f 70 65 72 22 2c 20 61 6e   "developer", an
abb0: 64 20 74 68 65 69 72 0a 2a 2a 20 61 73 73 6f 63  d their.** assoc
abc0: 69 61 74 65 64 20 70 65 72 6d 69 73 73 69 6f 6e  iated permission
abd0: 73 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64  s will be copied
abe0: 2e 0a 2a 2a 0a 2a 2a 20 4f 70 74 69 6f 6e 73 3a  ..**.** Options:
abf0: 0a 2a 2a 20 20 20 20 2d 2d 74 65 6d 70 6c 61 74  .**    --templat
ac00: 65 20 20 20 20 20 20 46 49 4c 45 20 20 20 20 20  e      FILE     
ac10: 20 63 6f 70 79 20 73 65 74 74 69 6e 67 73 20 66   copy settings f
ac20: 72 6f 6d 20 72 65 70 6f 73 69 74 6f 72 79 20 66  rom repository f
ac30: 69 6c 65 0a 2a 2a 20 20 20 20 2d 2d 61 64 6d 69  ile.**    --admi
ac40: 6e 2d 75 73 65 72 7c 2d 41 20 55 53 45 52 4e 41  n-user|-A USERNA
ac50: 4d 45 20 20 73 65 6c 65 63 74 20 67 69 76 65 6e  ME  select given
ac60: 20 55 53 45 52 4e 41 4d 45 20 61 73 20 61 64 6d   USERNAME as adm
ac70: 69 6e 20 75 73 65 72 0a 2a 2a 20 20 20 20 2d 2d  in user.**    --
ac80: 64 61 74 65 2d 6f 76 65 72 72 69 64 65 20 44 41  date-override DA
ac90: 54 45 54 49 4d 45 20 20 75 73 65 20 44 41 54 45  TETIME  use DATE
aca0: 54 49 4d 45 20 61 73 20 74 69 6d 65 20 6f 66 20  TIME as time of 
acb0: 74 68 65 20 69 6e 69 74 69 61 6c 20 63 68 65 63  the initial chec
acc0: 6b 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  kin.**          
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ace0: 20 20 20 20 28 6f 76 65 72 72 69 64 65 73 20 2d      (overrides -
acf0: 2d 65 6d 70 74 79 20 61 73 20 77 65 6c 6c 29 0a  -empty as well).
ad00: 2a 2a 20 20 20 20 2d 2d 65 6d 70 74 79 20 20 20  **    --empty   
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad20: 44 6f 20 6e 6f 74 20 63 72 65 61 74 65 20 61 6e  Do not create an
ad30: 20 69 6e 69 74 69 61 6c 20 65 6d 70 74 79 20 63   initial empty c
ad40: 68 65 63 6b 69 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65  heckin..**.** Se
ad50: 65 20 61 6c 73 6f 3a 20 63 6c 6f 6e 65 0a 2a 2f  e also: clone.*/
ad60: 0a 76 6f 69 64 20 63 72 65 61 74 65 5f 72 65 70  .void create_rep
ad70: 6f 73 69 74 6f 72 79 5f 63 6d 64 28 76 6f 69 64  ository_cmd(void
ad80: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73  ){.  char *zPass
ad90: 77 6f 72 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  word;.  const ch
ada0: 61 72 20 2a 7a 54 65 6d 70 6c 61 74 65 3b 20 20  ar *zTemplate;  
adb0: 20 20 20 20 2f 2a 20 52 65 70 6f 73 69 74 6f 72      /* Repositor
adc0: 79 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  y from which to 
add0: 63 6f 70 79 20 73 65 74 74 69 6e 67 73 20 2a 2f  copy settings */
ade0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
adf0: 44 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Date;          /
ae00: 2a 20 44 61 74 65 20 6f 66 20 74 68 65 20 69 6e  * Date of the in
ae10: 69 74 69 61 6c 20 63 68 65 63 6b 2d 69 6e 20 2a  itial check-in *
ae20: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
ae30: 7a 44 65 66 61 75 6c 74 55 73 65 72 3b 20 20 20  zDefaultUser;   
ae40: 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6e 61 6d 65  /* Optional name
ae50: 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
ae60: 75 73 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 63  user */.  char c
ae70: 6f 6e 73 74 20 2a 7a 43 72 65 61 74 65 45 6d 70  onst *zCreateEmp
ae80: 74 79 3b 20 20 20 2f 2a 20 2d 2d 65 6d 70 74 79  ty;   /* --empty
ae90: 20 66 6c 61 67 20 73 65 74 3f 20 2a 2f 0a 0a 20   flag set? */.. 
aea0: 20 7a 54 65 6d 70 6c 61 74 65 20 3d 20 66 69 6e   zTemplate = fin
aeb0: 64 5f 6f 70 74 69 6f 6e 28 22 74 65 6d 70 6c 61  d_option("templa
aec0: 74 65 22 2c 30 2c 31 29 3b 0a 20 20 7a 44 61 74  te",0,1);.  zDat
aed0: 65 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28  e = find_option(
aee0: 22 64 61 74 65 2d 6f 76 65 72 72 69 64 65 22 2c  "date-override",
aef0: 30 2c 31 29 3b 0a 20 20 7a 44 65 66 61 75 6c 74  0,1);.  zDefault
af00: 55 73 65 72 20 3d 20 66 69 6e 64 5f 6f 70 74 69  User = find_opti
af10: 6f 6e 28 22 61 64 6d 69 6e 2d 75 73 65 72 22 2c  on("admin-user",
af20: 22 41 22 2c 31 29 3b 0a 20 20 7a 43 72 65 61 74  "A",1);.  zCreat
af30: 65 45 6d 70 74 79 20 3d 20 66 69 6e 64 5f 6f 70  eEmpty = find_op
af40: 74 69 6f 6e 28 22 65 6d 70 74 79 22 2c 20 30 2c  tion("empty", 0,
af50: 20 30 29 3b 0a 20 20 69 66 28 20 21 7a 44 61 74   0);.  if( !zDat
af60: 65 20 26 26 20 21 7a 43 72 65 61 74 65 45 6d 70  e && !zCreateEmp
af70: 74 79 20 29 7b 0a 20 20 20 20 7a 44 61 74 65 20  ty ){.    zDate 
af80: 3d 20 22 6e 6f 77 22 3b 0a 20 20 7d 0a 20 20 69  = "now";.  }.  i
af90: 66 28 20 67 2e 61 72 67 63 21 3d 33 20 29 7b 0a  f( g.argc!=3 ){.
afa0: 20 20 20 20 75 73 61 67 65 28 22 52 45 50 4f 53      usage("REPOS
afb0: 49 54 4f 52 59 2d 4e 41 4d 45 22 29 3b 0a 20 20  ITORY-NAME");.  
afc0: 7d 0a 20 20 64 62 5f 63 72 65 61 74 65 5f 72 65  }.  db_create_re
afd0: 70 6f 73 69 74 6f 72 79 28 67 2e 61 72 67 76 5b  pository(g.argv[
afe0: 32 5d 29 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 72  2]);.  db_open_r
aff0: 65 70 6f 73 69 74 6f 72 79 28 67 2e 61 72 67 76  epository(g.argv
b000: 5b 32 5d 29 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f  [2]);.  db_open_
b010: 63 6f 6e 66 69 67 28 30 29 3b 0a 20 20 69 66 28  config(0);.  if(
b020: 20 7a 54 65 6d 70 6c 61 74 65 20 29 20 64 62 5f   zTemplate ) db_
b030: 61 74 74 61 63 68 28 7a 54 65 6d 70 6c 61 74 65  attach(zTemplate
b040: 2c 20 22 73 65 74 74 69 6e 67 53 72 63 22 29 3b  , "settingSrc");
b050: 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e  .  db_begin_tran
b060: 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 64 62 5f  saction();.  db_
b070: 69 6e 69 74 69 61 6c 5f 73 65 74 75 70 28 7a 54  initial_setup(zT
b080: 65 6d 70 6c 61 74 65 2c 20 7a 44 61 74 65 2c 20  emplate, zDate, 
b090: 7a 44 65 66 61 75 6c 74 55 73 65 72 2c 20 31 29  zDefaultUser, 1)
b0a0: 3b 0a 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73  ;.  db_end_trans
b0b0: 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20 69 66 28  action(0);.  if(
b0c0: 20 7a 54 65 6d 70 6c 61 74 65 20 29 20 64 62 5f   zTemplate ) db_
b0d0: 64 65 74 61 63 68 28 22 73 65 74 74 69 6e 67 53  detach("settingS
b0e0: 72 63 22 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70  rc");.  fossil_p
b0f0: 72 69 6e 74 28 22 70 72 6f 6a 65 63 74 2d 69 64  rint("project-id
b100: 3a 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28  : %s\n", db_get(
b110: 22 70 72 6f 6a 65 63 74 2d 63 6f 64 65 22 2c 20  "project-code", 
b120: 30 29 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72  0));.  fossil_pr
b130: 69 6e 74 28 22 73 65 72 76 65 72 2d 69 64 3a 20  int("server-id: 
b140: 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28 22   %s\n", db_get("
b150: 73 65 72 76 65 72 2d 63 6f 64 65 22 2c 20 30 29  server-code", 0)
b160: 29 3b 0a 20 20 7a 50 61 73 73 77 6f 72 64 20 3d  );.  zPassword =
b170: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
b180: 45 43 54 20 70 77 20 46 52 4f 4d 20 75 73 65 72  ECT pw FROM user
b190: 20 57 48 45 52 45 20 6c 6f 67 69 6e 3d 25 51 22   WHERE login=%Q"
b1a0: 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 66  , g.zLogin);.  f
b1b0: 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 61 64 6d  ossil_print("adm
b1c0: 69 6e 2d 75 73 65 72 3a 20 25 73 20 28 69 6e 69  in-user: %s (ini
b1d0: 74 69 61 6c 20 70 61 73 73 77 6f 72 64 20 69 73  tial password is
b1e0: 20 5c 22 25 73 5c 22 29 5c 6e 22 2c 0a 20 20 20   \"%s\")\n",.   
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 67 2e 7a 4c              g.zL
b200: 6f 67 69 6e 2c 20 7a 50 61 73 73 77 6f 72 64 29  ogin, zPassword)
b210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66  ;.}../*.** SQL f
b220: 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 64 65 62  unctions for deb
b230: 75 67 67 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ugging..**.** Th
b240: 65 20 70 72 69 6e 74 28 29 20 66 75 6e 63 74 69  e print() functi
b250: 6f 6e 20 77 72 69 74 65 73 20 69 74 73 20 61 72  on writes its ar
b260: 67 75 6d 65 6e 74 73 20 6f 6e 20 73 74 64 6f 75  guments on stdou
b270: 74 2c 20 62 75 74 20 6f 6e 6c 79 0a 2a 2a 20 69  t, but only.** i
b280: 66 20 74 68 65 20 2d 73 71 6c 70 72 69 6e 74 20  f the -sqlprint 
b290: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
b2a0: 69 6f 6e 20 69 73 20 74 75 72 6e 65 64 20 6f 6e  ion is turned on
b2b0: 2e 0a 2a 2f 0a 4c 4f 43 41 4c 20 76 6f 69 64 20  ..*/.LOCAL void 
b2c0: 64 62 5f 73 71 6c 5f 70 72 69 6e 74 28 0a 20 20  db_sql_print(.  
b2d0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
b2e0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
b2f0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
b300: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
b310: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 67    int i;.  if( g
b320: 2e 66 53 71 6c 50 72 69 6e 74 20 29 7b 0a 20 20  .fSqlPrint ){.  
b330: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
b340: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  c; i++){.      c
b350: 68 61 72 20 63 20 3d 20 69 3d 3d 61 72 67 63 2d  har c = i==argc-
b360: 31 20 3f 20 27 5c 6e 27 20 3a 20 27 20 27 3b 0a  1 ? '\n' : ' ';.
b370: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69        fossil_pri
b380: 6e 74 28 22 25 73 25 63 22 2c 20 73 71 6c 69 74  nt("%s%c", sqlit
b390: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
b3a0: 67 76 5b 69 5d 29 2c 20 63 29 3b 0a 20 20 20 20  gv[i]), c);.    
b3b0: 7d 0a 20 20 7d 0a 7d 0a 4c 4f 43 41 4c 20 76 6f  }.  }.}.LOCAL vo
b3c0: 69 64 20 64 62 5f 73 71 6c 5f 74 72 61 63 65 28  id db_sql_trace(
b3d0: 76 6f 69 64 20 2a 6e 6f 74 55 73 65 64 2c 20 63  void *notUsed, c
b3e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
b3f0: 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c  {.  int n = strl
b400: 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 66 6f 73 73  en(zSql);.  foss
b410: 69 6c 5f 74 72 61 63 65 28 22 25 73 25 73 5c 6e  il_trace("%s%s\n
b420: 22 2c 20 7a 53 71 6c 2c 20 28 6e 3e 30 20 26 26  ", zSql, (n>0 &&
b430: 20 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29   zSql[n-1]==';')
b440: 20 3f 20 22 22 20 3a 20 22 3b 22 29 3b 0a 7d 0a   ? "" : ";");.}.
b450: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
b460: 20 74 68 65 20 75 73 65 72 28 29 20 53 51 4c 20   the user() SQL 
b470: 66 75 6e 63 74 69 6f 6e 2e 20 20 75 73 65 72 28  function.  user(
b480: 29 20 74 61 6b 65 73 20 6e 6f 20 61 72 67 75 6d  ) takes no argum
b490: 65 6e 74 73 20 61 6e 64 0a 2a 2a 20 72 65 74 75  ents and.** retu
b4a0: 72 6e 73 20 74 68 65 20 75 73 65 72 20 49 44 20  rns the user ID 
b4b0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 75  of the current u
b4c0: 73 65 72 2e 0a 2a 2f 0a 4c 4f 43 41 4c 20 76 6f  ser..*/.LOCAL vo
b4d0: 69 64 20 64 62 5f 73 71 6c 5f 75 73 65 72 28 0a  id db_sql_user(.
b4e0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
b4f0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
b500: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
b510: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
b520: 7b 0a 20 20 69 66 28 20 67 2e 7a 4c 6f 67 69 6e  {.  if( g.zLogin
b530: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
b540: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
b550: 6f 6e 74 65 78 74 2c 20 67 2e 7a 4c 6f 67 69 6e  ontext, g.zLogin
b560: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
b570: 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  TIC);.  }.}../*.
b580: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65  ** Implement the
b590: 20 63 67 69 28 29 20 53 51 4c 20 66 75 6e 63 74   cgi() SQL funct
b5a0: 69 6f 6e 2e 20 20 63 67 69 28 29 20 74 61 6b 65  ion.  cgi() take
b5b0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 68  s an argument wh
b5c0: 69 63 68 20 69 73 0a 2a 2a 20 61 20 6e 61 6d 65  ich is.** a name
b5d0: 20 6f 66 20 43 47 49 20 71 75 65 72 79 20 70 61   of CGI query pa
b5e0: 72 61 6d 65 74 65 72 2e 20 54 68 65 20 76 61 6c  rameter. The val
b5f0: 75 65 20 6f 66 20 74 68 61 74 20 70 61 72 61 6d  ue of that param
b600: 65 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  eter is returned
b610: 2c 0a 2a 2a 20 69 66 20 61 76 61 69 6c 61 62 6c  ,.** if availabl
b620: 65 2e 20 4f 70 74 69 6f 6e 61 6c 20 73 65 63 6f  e. Optional seco
b630: 6e 64 20 61 72 67 75 6d 65 6e 74 20 77 69 6c 6c  nd argument will
b640: 20 62 65 20 72 65 74 75 72 6e 65 64 20 69 66 20   be returned if 
b650: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 64 6f 65  the first.** doe
b660: 73 6e 27 74 20 65 78 69 73 74 20 61 73 20 61 20  sn't exist as a 
b670: 43 47 49 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  CGI parameter..*
b680: 2f 0a 4c 4f 43 41 4c 20 76 6f 69 64 20 64 62 5f  /.LOCAL void db_
b690: 73 71 6c 5f 63 67 69 28 73 71 6c 69 74 65 33 5f  sql_cgi(sqlite3_
b6a0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
b6b0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69  , int argc, sqli
b6c0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
b6d0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 2a  ){.  const char*
b6e0: 20 7a 50 3b 0a 20 20 69 66 28 20 61 72 67 63 21   zP;.  if( argc!
b6f0: 3d 31 20 26 26 20 61 72 67 63 21 3d 32 20 29 20  =1 && argc!=2 ) 
b700: 72 65 74 75 72 6e 3b 0a 20 20 7a 50 20 3d 20 50  return;.  zP = P
b710: 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71  ((const char*)sq
b720: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
b730: 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20 69 66  (argv[0]));.  if
b740: 28 20 7a 50 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( zP ){.    sqli
b750: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
b760: 63 6f 6e 74 65 78 74 2c 20 7a 50 2c 20 2d 31 2c  context, zP, -1,
b770: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
b780: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 72 67  .  }else if( arg
b790: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50 20 3d  c==2 ){.    zP =
b7a0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
b7b0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
b7c0: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69  (argv[1]);.    i
b7d0: 66 28 20 7a 50 20 29 20 73 71 6c 69 74 65 33 5f  f( zP ) sqlite3_
b7e0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
b7f0: 65 78 74 2c 20 7a 50 2c 20 2d 31 2c 20 53 51 4c  ext, zP, -1, SQL
b800: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
b810: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c    }.}../*.** SQL
b820: 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a   function:.**.**
b830: 20 20 20 20 20 20 20 69 73 5f 73 65 6c 65 63 74         is_select
b840: 65 64 28 69 64 29 0a 2a 2a 20 20 20 20 20 20 20  ed(id).**       
b850: 69 66 5f 73 65 6c 65 63 74 65 64 28 69 64 2c 20  if_selected(id, 
b860: 58 2c 20 59 29 0a 2a 2a 0a 2a 2a 20 4f 6e 20 74  X, Y).**.** On t
b870: 68 65 20 63 6f 6d 6d 69 74 20 63 6f 6d 6d 61 6e  he commit comman
b880: 64 2c 20 77 68 65 6e 20 66 69 6c 65 6e 61 6d 65  d, when filename
b890: 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20  s are specified 
b8a0: 28 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a  (in order to do.
b8b0: 2a 2a 20 61 20 70 61 72 74 69 61 6c 20 63 6f 6d  ** a partial com
b8c0: 6d 69 74 29 20 74 68 65 20 76 66 69 6c 65 2e 69  mit) the vfile.i
b8d0: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  d values for the
b8e0: 20 6e 61 6d 65 64 20 66 69 6c 65 73 20 61 72 65   named files are
b8f0: 20 6c 6f 61 64 65 64 0a 2a 2a 20 69 6e 74 6f 20   loaded.** into 
b900: 74 68 65 20 67 2e 61 43 6f 6d 6d 69 74 46 69 6c  the g.aCommitFil
b910: 65 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 69 73  e[] array.  This
b920: 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 6f 6b 73 20   function looks 
b930: 61 74 20 74 68 61 74 20 61 72 72 61 79 0a 2a 2a  at that array.**
b940: 20 74 6f 20 73 65 65 20 69 66 20 61 20 66 69 6c   to see if a fil
b950: 65 20 69 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68  e is named on th
b960: 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2e 0a  e command-line..
b970: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 66 69 72  **.** In the fir
b980: 73 74 20 66 6f 72 6d 20 28 31 20 61 72 67 75 6d  st form (1 argum
b990: 65 6e 74 29 20 72 65 74 75 72 6e 20 54 52 55 45  ent) return TRUE
b9a0: 20 69 66 20 65 69 74 68 65 72 20 6e 6f 20 66 69   if either no fi
b9b0: 6c 65 73 20 61 72 65 0a 2a 2a 20 6e 61 6d 65 64  les are.** named
b9c0: 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
b9d0: 6c 69 6e 65 20 28 67 2e 61 43 6f 6d 6d 69 74 46  line (g.aCommitF
b9e0: 69 6c 65 20 69 73 20 4e 55 4c 4c 20 6d 65 61 6e  ile is NULL mean
b9f0: 69 6e 67 20 74 68 61 74 20 61 6c 6c 0a 2a 2a 20  ing that all.** 
ba00: 63 68 61 6e 67 65 73 20 61 72 65 20 74 6f 20 62  changes are to b
ba10: 65 20 63 6f 6d 6d 69 74 74 65 64 29 20 6f 72 20  e committed) or 
ba20: 69 66 20 69 64 20 69 73 20 66 6f 75 6e 64 20 69  if id is found i
ba30: 6e 20 67 2e 61 43 6f 6d 6d 69 74 46 69 6c 65 5b  n g.aCommitFile[
ba40: 5d 0a 2a 2a 20 28 6d 65 61 6e 69 6e 67 20 74 68  ].** (meaning th
ba50: 61 74 20 69 64 20 77 61 73 20 6e 61 6d 65 64 20  at id was named 
ba60: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c  on the command-l
ba70: 69 6e 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ine)..**.** In t
ba80: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 28  he second form (
ba90: 33 20 61 72 67 75 6d 65 6e 74 73 29 20 72 65 74  3 arguments) ret
baa0: 75 72 6e 20 61 72 67 75 6d 65 6e 74 20 58 20 69  urn argument X i
bab0: 66 20 74 72 75 65 20 61 6e 64 20 59 0a 2a 2a 20  f true and Y.** 
bac0: 69 66 20 66 61 6c 73 65 2e 20 20 45 78 63 65 70  if false.  Excep
bad0: 74 20 69 66 20 59 20 69 73 20 4e 55 4c 4c 20 74  t if Y is NULL t
bae0: 68 65 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72  hen always retur
baf0: 6e 20 58 2e 0a 2a 2f 0a 4c 4f 43 41 4c 20 76 6f  n X..*/.LOCAL vo
bb00: 69 64 20 66 69 6c 65 5f 69 73 5f 73 65 6c 65 63  id file_is_selec
bb10: 74 65 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ted(.  sqlite3_c
bb20: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
bb30: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
bb40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
bb50: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  rgv.){.  int rc 
bb60: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 61  = 0;..  assert(a
bb70: 72 67 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d  rgc==1 || argc==
bb80: 33 29 3b 0a 20 20 69 66 28 20 67 2e 61 43 6f 6d  3);.  if( g.aCom
bb90: 6d 69 74 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  mitFile ){.    i
bba0: 6e 74 20 69 49 64 20 3d 20 73 71 6c 69 74 65 33  nt iId = sqlite3
bbb0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
bbc0: 30 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b  0]);.    int ii;
bbd0: 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 67  .    for(ii=0; g
bbe0: 2e 61 43 6f 6d 6d 69 74 46 69 6c 65 5b 69 69 5d  .aCommitFile[ii]
bbf0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ; ii++){.      i
bc00: 66 28 20 69 49 64 3d 3d 67 2e 61 43 6f 6d 6d 69  f( iId==g.aCommi
bc10: 74 46 69 6c 65 5b 69 69 5d 20 29 7b 0a 20 20 20  tFile[ii] ){.   
bc20: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
bc30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bc40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
bc50: 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  e{.    rc = 1;. 
bc60: 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31   }.  if( argc==1
bc70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
bc80: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
bc90: 78 74 2c 20 72 63 29 3b 0a 20 20 7d 65 6c 73 65  xt, rc);.  }else
bca0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 72  {.    assert( ar
bcb0: 67 63 3d 3d 33 20 29 3b 0a 20 20 20 20 61 73 73  gc==3 );.    ass
bcc0: 65 72 74 28 20 72 63 3d 3d 30 20 7c 7c 20 72 63  ert( rc==0 || rc
bcd0: 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73  ==1 );.    if( s
bce0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
bcf0: 65 28 61 72 67 76 5b 32 2d 72 63 5d 29 3d 3d 53  e(argv[2-rc])==S
bd00: 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 72 63 20  QLITE_NULL ) rc 
bd10: 3d 20 31 2d 72 63 3b 0a 20 20 20 20 73 71 6c 69  = 1-rc;.    sqli
bd20: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
bd30: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 32  (context, argv[2
bd40: 2d 72 63 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  -rc]);.  }.}../*
bd50: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20  .** Convert the 
bd60: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 69 6e 74  input string int
bd70: 6f 20 61 6e 20 53 48 41 31 2e 20 20 4d 61 6b 65  o an SHA1.  Make
bd80: 20 61 20 6e 6f 74 61 74 69 6f 6e 20 69 6e 20 74   a notation in t
bd90: 68 65 0a 2a 2a 20 43 4f 4e 43 45 41 4c 45 44 20  he.** CONCEALED 
bda0: 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20 74 68  table so that th
bdb0: 65 20 68 61 73 68 20 63 61 6e 20 62 65 20 75 6e  e hash can be un
bdc0: 64 6f 20 75 73 69 6e 67 20 74 68 65 20 64 62 5f  do using the db_
bdd0: 72 65 76 65 61 6c 28 29 0a 2a 2a 20 66 75 6e 63  reveal().** func
bde0: 74 69 6f 6e 20 61 74 20 73 6f 6d 65 20 6c 61 74  tion at some lat
bdf0: 65 72 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54  er time..**.** T
be00: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
be10: 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 73  d is stored in s
be20: 74 61 74 69 63 20 73 70 61 63 65 20 61 6e 64 20  tatic space and 
be30: 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
be40: 74 65 6e 0a 2a 2a 20 6f 6e 20 73 75 62 73 65 71  ten.** on subseq
be50: 75 65 6e 74 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  uent calls..**.*
be60: 2a 20 49 66 20 7a 43 6f 6e 74 65 6e 74 20 69 73  * If zContent is
be70: 20 61 6c 72 65 61 64 79 20 61 20 77 65 6c 6c 2d   already a well-
be80: 66 6f 72 6d 65 64 20 53 48 41 31 20 68 61 73 68  formed SHA1 hash
be90: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  , then return a 
bea0: 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 61 74 20  copy.** of that 
beb0: 68 61 73 68 2c 20 6e 6f 74 20 61 20 68 61 73 68  hash, not a hash
bec0: 20 6f 66 20 74 68 65 20 68 61 73 68 2e 0a 2a 2a   of the hash..**
bed0: 0a 2a 2a 20 54 68 65 20 43 4f 4e 43 45 41 4c 45  .** The CONCEALE
bee0: 44 20 74 61 62 6c 65 20 69 73 20 6d 65 61 6e 74  D table is meant
bef0: 20 74 6f 20 6f 62 73 63 75 72 65 20 65 6d 61 69   to obscure emai
bf00: 6c 20 61 64 64 72 65 73 73 65 73 2e 20 20 45 76  l addresses.  Ev
bf10: 65 72 79 20 76 61 6c 69 64 0a 2a 2a 20 65 6d 61  ery valid.** ema
bf20: 69 6c 20 61 64 64 72 65 73 73 20 77 69 6c 6c 20  il address will 
bf30: 63 6f 6e 74 61 69 6e 20 61 20 22 40 22 20 63 68  contain a "@" ch
bf40: 61 72 61 63 74 65 72 20 61 6e 64 20 22 40 22 20  aracter and "@" 
bf50: 69 73 20 6e 6f 74 20 76 61 6c 69 64 20 77 69 74  is not valid wit
bf60: 68 69 6e 0a 2a 2a 20 61 6e 20 53 48 41 31 20 68  hin.** an SHA1 h
bf70: 61 73 68 20 73 6f 20 74 68 65 72 65 20 69 73 20  ash so there is 
bf80: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  no chance that a
bf90: 20 76 61 6c 69 64 20 65 6d 61 69 6c 20 61 64 64   valid email add
bfa0: 72 65 73 73 20 77 69 6c 6c 20 67 6f 0a 2a 2a 20  ress will go.** 
bfb0: 75 6e 63 6f 6e 63 65 61 6c 65 64 2e 0a 2a 2f 0a  unconcealed..*/.
bfc0: 63 68 61 72 20 2a 64 62 5f 63 6f 6e 63 65 61 6c  char *db_conceal
bfd0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f  (const char *zCo
bfe0: 6e 74 65 6e 74 2c 20 69 6e 74 20 6e 29 7b 0a 20  ntent, int n){. 
bff0: 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 48 61   static char zHa
c000: 73 68 5b 34 32 5d 3b 0a 20 20 42 6c 6f 62 20 6f  sh[42];.  Blob o
c010: 75 74 3b 0a 20 20 69 66 28 20 6e 3d 3d 34 30 20  ut;.  if( n==40 
c020: 26 26 20 76 61 6c 69 64 61 74 65 31 36 28 7a 43  && validate16(zC
c030: 6f 6e 74 65 6e 74 2c 20 6e 29 20 29 7b 0a 20 20  ontent, n) ){.  
c040: 20 20 6d 65 6d 63 70 79 28 7a 48 61 73 68 2c 20    memcpy(zHash, 
c050: 7a 43 6f 6e 74 65 6e 74 2c 20 6e 29 3b 0a 20 20  zContent, n);.  
c060: 20 20 7a 48 61 73 68 5b 6e 5d 20 3d 20 30 3b 0a    zHash[n] = 0;.
c070: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 68 61    }else{.    sha
c080: 31 73 75 6d 5f 73 74 65 70 5f 74 65 78 74 28 7a  1sum_step_text(z
c090: 43 6f 6e 74 65 6e 74 2c 20 6e 29 3b 0a 20 20 20  Content, n);.   
c0a0: 20 73 68 61 31 73 75 6d 5f 66 69 6e 69 73 68 28   sha1sum_finish(
c0b0: 26 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  &out);.    sqlit
c0c0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
c0d0: 6f 66 28 7a 48 61 73 68 29 2c 20 7a 48 61 73 68  of(zHash), zHash
c0e0: 2c 20 22 25 73 22 2c 20 62 6c 6f 62 5f 73 74 72  , "%s", blob_str
c0f0: 28 26 6f 75 74 29 29 3b 0a 20 20 20 20 62 6c 6f  (&out));.    blo
c100: 62 5f 72 65 73 65 74 28 26 6f 75 74 29 3b 0a 20  b_reset(&out);. 
c110: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
c120: 28 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  (.       "INSERT
c130: 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20   OR IGNORE INTO 
c140: 63 6f 6e 63 65 61 6c 65 64 28 68 61 73 68 2c 63  concealed(hash,c
c150: 6f 6e 74 65 6e 74 2c 6d 74 69 6d 65 29 22 0a 20  ontent,mtime)". 
c160: 20 20 20 20 20 20 22 20 56 41 4c 55 45 53 28 25        " VALUES(%
c170: 51 2c 25 23 51 2c 6e 6f 77 28 29 29 22 2c 0a 20  Q,%#Q,now())",. 
c180: 20 20 20 20 20 20 7a 48 61 73 68 2c 20 6e 2c 20        zHash, n, 
c190: 7a 43 6f 6e 74 65 6e 74 0a 20 20 20 20 29 3b 0a  zContent.    );.
c1a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 48 61    }.  return zHa
c1b0: 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  sh;.}../*.** Att
c1c0: 65 6d 70 74 20 74 6f 20 6c 6f 6f 6b 20 75 70 20  empt to look up 
c1d0: 74 68 65 20 69 6e 70 75 74 20 69 6e 20 74 68 65  the input in the
c1e0: 20 43 4f 4e 43 45 41 4c 45 44 20 74 61 62 6c 65   CONCEALED table
c1f0: 2e 20 20 49 66 20 66 6f 75 6e 64 2c 0a 2a 2a 20  .  If found,.** 
c200: 61 6e 64 20 69 66 20 74 68 65 20 6f 6b 52 64 41  and if the okRdA
c210: 64 64 72 20 70 65 72 6d 69 73 73 69 6f 6e 20 69  ddr permission i
c220: 73 20 65 6e 61 62 6c 65 64 20 74 68 65 6e 20 72  s enabled then r
c230: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6f 72 69  eturn the.** ori
c240: 67 69 6e 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  ginal value for 
c250: 77 68 69 63 68 20 74 68 65 20 69 6e 70 75 74 20  which the input 
c260: 69 73 20 61 20 68 61 73 68 2e 20 20 49 66 20 6f  is a hash.  If o
c270: 6b 52 64 41 64 64 72 20 69 73 0a 2a 2a 20 66 61  kRdAddr is.** fa
c280: 6c 73 65 20 6f 72 20 69 66 20 74 68 65 20 6c 6f  lse or if the lo
c290: 6f 6b 75 70 20 66 61 69 6c 73 2c 20 72 65 74 75  okup fails, retu
c2a0: 72 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  rn the original 
c2b0: 73 74 72 69 6e 67 20 63 6f 6e 74 65 6e 74 2e 0a  string content..
c2c0: 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20  **.** In either 
c2d0: 63 61 73 65 2c 20 74 68 65 20 73 74 72 69 6e 67  case, the string
c2e0: 20 72 65 74 75 72 6e 65 64 20 69 73 20 73 74 6f   returned is sto
c2f0: 72 65 64 20 69 6e 20 73 70 61 63 65 20 6f 62 74  red in space obt
c300: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61  ained.** from ma
c310: 6c 6c 6f 63 20 61 6e 64 20 73 68 6f 75 6c 64 20  lloc and should 
c320: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
c330: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
c340: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 64 62 5f 72 65  ..*/.char *db_re
c350: 76 65 61 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  veal(const char 
c360: 2a 7a 4b 65 79 29 7b 0a 20 20 63 68 61 72 20 2a  *zKey){.  char *
c370: 7a 4f 75 74 3b 0a 20 20 69 66 28 20 67 2e 70 65  zOut;.  if( g.pe
c380: 72 6d 2e 52 64 41 64 64 72 20 29 7b 0a 20 20 20  rm.RdAddr ){.   
c390: 20 7a 4f 75 74 20 3d 20 64 62 5f 74 65 78 74 28   zOut = db_text(
c3a0: 30 2c 20 22 53 45 4c 45 43 54 20 63 6f 6e 74 65  0, "SELECT conte
c3b0: 6e 74 20 46 52 4f 4d 20 63 6f 6e 63 65 61 6c 65  nt FROM conceale
c3c0: 64 20 57 48 45 52 45 20 68 61 73 68 3d 25 51 22  d WHERE hash=%Q"
c3d0: 2c 20 7a 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65  , zKey);.  }else
c3e0: 7b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 30 3b 0a  {.    zOut = 0;.
c3f0: 20 20 7d 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d    }.  if( zOut==
c400: 30 20 29 7b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  0 ){.    zOut = 
c410: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4b  mprintf("%s", zK
c420: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
c430: 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zOut;.}../*.**
c440: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
c450: 74 68 65 20 73 74 72 69 6e 67 20 7a 56 61 6c 20  the string zVal 
c460: 72 65 70 72 65 73 65 6e 74 73 20 22 74 72 75 65  represents "true
c470: 22 20 28 6f 72 20 22 66 61 6c 73 65 22 29 2e 0a  " (or "false")..
c480: 2a 2f 0a 69 6e 74 20 69 73 5f 74 72 75 74 68 28  */.int is_truth(
c490: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
c4a0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
c4b0: 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a  t char *const az
c4c0: 4f 6e 5b 5d 20 3d 20 7b 20 22 6f 6e 22 2c 20 22  On[] = { "on", "
c4d0: 79 65 73 22 2c 20 22 74 72 75 65 22 2c 20 22 31  yes", "true", "1
c4e0: 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  " };.  int i;.  
c4f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f 75 6e 74  for(i=0; i<count
c500: 28 61 7a 4f 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20  (azOn); i++){.  
c510: 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72    if( fossil_str
c520: 69 63 6d 70 28 7a 56 61 6c 2c 61 7a 4f 6e 5b 69  icmp(zVal,azOn[i
c530: 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ])==0 ) return 1
c540: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
c550: 3b 0a 7d 0a 69 6e 74 20 69 73 5f 66 61 6c 73 65  ;.}.int is_false
c560: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61  (const char *zVa
c570: 6c 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  l){.  static con
c580: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 61  st char *const a
c590: 7a 4f 66 66 5b 5d 20 3d 20 7b 20 22 6f 66 66 22  zOff[] = { "off"
c5a0: 2c 20 22 6e 6f 22 2c 20 22 66 61 6c 73 65 22 2c  , "no", "false",
c5b0: 20 22 30 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b   "0" };.  int i;
c5c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f  .  for(i=0; i<co
c5d0: 75 6e 74 28 61 7a 4f 66 66 29 3b 20 69 2b 2b 29  unt(azOff); i++)
c5e0: 7b 0a 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c  {.    if( fossil
c5f0: 5f 73 74 72 69 63 6d 70 28 7a 56 61 6c 2c 61 7a  _stricmp(zVal,az
c600: 4f 66 66 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74  Off[i])==0 ) ret
c610: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
c620: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
c630: 53 77 61 70 20 74 68 65 20 67 2e 64 62 20 61 6e  Swap the g.db an
c640: 64 20 67 2e 64 62 43 6f 6e 66 69 67 20 63 6f 6e  d g.dbConfig con
c650: 6e 65 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  nections so that
c660: 20 74 68 65 20 76 61 72 69 6f 75 73 20 64 62 5f   the various db_
c670: 2a 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 77 6f  * routines.** wo
c680: 72 6b 20 6f 6e 20 74 68 65 20 7e 2f 2e 66 6f 73  rk on the ~/.fos
c690: 73 69 6c 20 64 61 74 61 62 61 73 65 20 69 6e 73  sil database ins
c6a0: 74 65 61 64 20 6f 66 20 6f 6e 20 74 68 65 20 72  tead of on the r
c6b0: 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61 62 61  epository databa
c6c0: 73 65 2e 0a 2a 2a 20 42 65 20 73 75 72 65 20 74  se..** Be sure t
c6d0: 6f 20 73 77 61 70 20 74 68 65 6d 20 62 61 63 6b  o swap them back
c6e0: 20 61 66 74 65 72 20 64 6f 69 6e 67 20 74 68 65   after doing the
c6f0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
c700: 2a 20 49 66 20 74 68 65 20 7e 2f 2e 66 6f 73 73  * If the ~/.foss
c710: 69 6c 20 64 61 74 61 62 61 73 65 20 68 61 73 20  il database has 
c720: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
c730: 6e 65 64 20 61 73 20 74 68 65 20 6d 61 69 6e 20  ned as the main 
c740: 64 61 74 61 62 61 73 65 20 6f 72 0a 2a 2a 20 69  database or.** i
c750: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
c760: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2c  e main database,
c770: 20 6e 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73   no connection s
c780: 77 61 70 73 20 61 72 65 20 72 65 71 75 69 72 65  waps are require
c790: 64 20 73 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75  d so this.** rou
c7a0: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
c7b0: 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 73 77 61 70  .*/.void db_swap
c7c0: 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 76 6f 69  _connections(voi
c7d0: 64 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 68  d){.  /*.  ** Wh
c7e0: 65 6e 20 73 77 61 70 70 69 6e 67 20 74 68 65 20  en swapping the 
c7f0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f  main database co
c800: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68  nnection with th
c810: 65 20 63 6f 6e 66 69 67 20 64 61 74 61 62 61 73  e config databas
c820: 65 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  e.  ** connectio
c830: 6e 2c 20 74 68 65 20 63 6f 6e 66 69 67 20 64 61  n, the config da
c840: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
c850: 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 28  n must be open (
c860: 6e 6f 74 20 73 69 6d 70 6c 79 0a 20 20 2a 2a 20  not simply.  ** 
c870: 61 74 74 61 63 68 65 64 29 3b 20 6f 74 68 65 72  attached); other
c880: 77 69 73 65 2c 20 74 68 65 20 73 77 61 70 20 77  wise, the swap w
c890: 6f 75 6c 64 20 65 6e 64 20 75 70 20 6c 65 61 76  ould end up leav
c8a0: 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ing the main dat
c8b0: 61 62 61 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e 65  abase.  ** conne
c8c0: 63 74 69 6f 6e 20 69 6e 76 61 6c 69 64 2c 20 64  ction invalid, d
c8d0: 65 66 65 61 74 69 6e 67 20 74 68 65 20 76 65 72  efeating the ver
c8e0: 79 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69  y purpose of thi
c8f0: 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 69 73  s routine.  This
c900: 0a 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6e 73 74  .  ** same const
c910: 72 61 69 6e 74 20 61 6c 73 6f 20 68 6f 6c 64 73  raint also holds
c920: 20 74 72 75 65 20 77 68 65 6e 20 72 65 73 74 6f   true when resto
c930: 72 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75  ring the previou
c940: 73 6c 79 20 73 77 61 70 70 65 64 0a 20 20 2a 2a  sly swapped.  **
c950: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
c960: 74 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c  tion; otherwise,
c970: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e   it means that n
c980: 6f 20 73 77 61 70 20 77 61 73 20 70 65 72 66 6f  o swap was perfo
c990: 72 6d 65 64 0a 20 20 2a 2a 20 62 65 63 61 75 73  rmed.  ** becaus
c9a0: 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
c9b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  ase connection w
c9c0: 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
c9d0: 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6e 66 69  ing to the confi
c9e0: 67 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  g.  ** database.
c9f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67 2e 64 62  .  */.  if( g.db
ca00: 43 6f 6e 66 69 67 20 29 7b 0a 20 20 20 20 73 71  Config ){.    sq
ca10: 6c 69 74 65 33 20 2a 64 62 54 65 6d 70 20 3d 20  lite3 *dbTemp = 
ca20: 67 2e 64 62 3b 0a 20 20 20 20 63 6f 6e 73 74 20  g.db;.    const 
ca30: 63 68 61 72 20 2a 7a 54 65 6d 70 44 62 54 79 70  char *zTempDbTyp
ca40: 65 20 3d 20 67 2e 7a 4d 61 69 6e 44 62 54 79 70  e = g.zMainDbTyp
ca50: 65 3b 0a 20 20 20 20 67 2e 64 62 20 3d 20 67 2e  e;.    g.db = g.
ca60: 64 62 43 6f 6e 66 69 67 3b 0a 20 20 20 20 67 2e  dbConfig;.    g.
ca70: 7a 4d 61 69 6e 44 62 54 79 70 65 20 3d 20 67 2e  zMainDbType = g.
ca80: 7a 43 6f 6e 66 69 67 44 62 54 79 70 65 3b 0a 20  zConfigDbType;. 
ca90: 20 20 20 67 2e 64 62 43 6f 6e 66 69 67 20 3d 20     g.dbConfig = 
caa0: 64 62 54 65 6d 70 3b 0a 20 20 20 20 67 2e 7a 43  dbTemp;.    g.zC
cab0: 6f 6e 66 69 67 44 62 54 79 70 65 20 3d 20 7a 54  onfigDbType = zT
cac0: 65 6d 70 44 62 54 79 70 65 3b 0a 20 20 7d 0a 7d  empDbType;.  }.}
cad0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 69 63 20 66 6f  ../*.** Logic fo
cae0: 72 20 72 65 61 64 69 6e 67 20 70 6f 74 65 6e 74  r reading potent
caf0: 69 61 6c 6c 79 20 76 65 72 73 69 6f 6e 65 64 20  ially versioned 
cb00: 73 65 74 74 69 6e 67 73 20 66 72 6f 6d 0a 2a 2a  settings from.**
cb10: 20 2e 66 6f 73 73 69 6c 2d 73 65 74 74 69 6e 67   .fossil-setting
cb20: 73 2f 3c 6e 61 6d 65 3e 20 2c 20 61 6e 64 20 65  s/<name> , and e
cb30: 6d 69 74 73 20 77 61 72 6e 69 6e 67 73 20 69 66  mits warnings if
cb40: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 52   necessary..** R
cb50: 65 74 75 72 6e 73 20 74 68 65 20 6e 6f 6e 2d 76  eturns the non-v
cb60: 65 72 73 69 6f 6e 65 64 20 76 61 6c 75 65 20 77  ersioned value w
cb70: 69 74 68 6f 75 74 20 6d 6f 64 69 66 69 63 61 74  ithout modificat
cb80: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
cb90: 6e 6f 0a 2a 2a 20 76 65 72 73 69 6f 6e 65 64 20  no.** versioned 
cba0: 76 61 6c 75 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a  value..*/.char *
cbb0: 64 62 5f 67 65 74 5f 64 6f 5f 76 65 72 73 69 6f  db_get_do_versio
cbc0: 6e 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  nable(const char
cbd0: 20 2a 7a 4e 61 6d 65 2c 20 63 68 61 72 20 2a 7a   *zName, char *z
cbe0: 4e 6f 6e 56 65 72 73 69 6f 6e 65 64 53 65 74 74  NonVersionedSett
cbf0: 69 6e 67 29 7b 0a 20 20 63 68 61 72 20 2a 7a 56  ing){.  char *zV
cc00: 65 72 73 69 6f 6e 65 64 53 65 74 74 69 6e 67 20  ersionedSetting 
cc10: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 57 61 72  = 0;.  int noWar
cc20: 6e 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  n = 0;.  struct 
cc30: 5f 63 61 63 68 65 45 6e 74 72 79 20 7b 0a 20 20  _cacheEntry {.  
cc40: 20 20 73 74 72 75 63 74 20 5f 63 61 63 68 65 45    struct _cacheE
cc50: 6e 74 72 79 20 2a 6e 65 78 74 3b 0a 20 20 20 20  ntry *next;.    
cc60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
cc70: 65 2c 20 2a 7a 56 61 6c 75 65 3b 0a 20 20 7d 20  e, *zValue;.  } 
cc80: 2a 63 61 63 68 65 45 6e 74 72 79 20 3d 20 30 3b  *cacheEntry = 0;
cc90: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
cca0: 20 5f 63 61 63 68 65 45 6e 74 72 79 20 2a 63 61   _cacheEntry *ca
ccb0: 63 68 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  che = 0;..  if( 
ccc0: 21 67 2e 6c 6f 63 61 6c 4f 70 65 6e 29 20 72 65  !g.localOpen) re
ccd0: 74 75 72 6e 20 7a 4e 6f 6e 56 65 72 73 69 6f 6e  turn zNonVersion
cce0: 65 64 53 65 74 74 69 6e 67 3b 0a 20 20 2f 2a 20  edSetting;.  /* 
ccf0: 4c 6f 6f 6b 20 75 70 20 6e 61 6d 65 20 69 6e 20  Look up name in 
cd00: 63 61 63 68 65 20 2a 2f 0a 20 20 63 61 63 68 65  cache */.  cache
cd10: 45 6e 74 72 79 20 3d 20 63 61 63 68 65 3b 0a 20  Entry = cache;. 
cd20: 20 77 68 69 6c 65 28 20 63 61 63 68 65 45 6e 74   while( cacheEnt
cd30: 72 79 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ry!=0 ){.    if(
cd40: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 63   fossil_strcmp(c
cd50: 61 63 68 65 45 6e 74 72 79 2d 3e 7a 4e 61 6d 65  acheEntry->zName
cd60: 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  , zName)==0 ){. 
cd70: 20 20 20 20 20 7a 56 65 72 73 69 6f 6e 65 64 53       zVersionedS
cd80: 65 74 74 69 6e 67 20 3d 20 66 6f 73 73 69 6c 5f  etting = fossil_
cd90: 73 74 72 64 75 70 28 63 61 63 68 65 45 6e 74 72  strdup(cacheEntr
cda0: 79 2d 3e 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20  y->zValue);.    
cdb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
cdc0: 20 20 20 63 61 63 68 65 45 6e 74 72 79 20 3d 20     cacheEntry = 
cdd0: 63 61 63 68 65 45 6e 74 72 79 2d 3e 6e 65 78 74  cacheEntry->next
cde0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 74 74 65 6d  ;.  }.  /* Attem
cdf0: 70 74 20 74 6f 20 72 65 61 64 20 76 61 6c 75 65  pt to read value
ce00: 20 66 72 6f 6d 20 66 69 6c 65 20 69 6e 20 63 68   from file in ch
ce10: 65 63 6b 6f 75 74 20 69 66 20 74 68 65 72 65 20  eckout if there 
ce20: 77 61 73 6e 27 74 20 61 20 63 61 63 68 65 20 68  wasn't a cache h
ce30: 69 74 0a 20 20 2a 2a 20 61 6e 64 20 61 20 63 68  it.  ** and a ch
ce40: 65 63 6b 6f 75 74 20 69 73 20 6f 70 65 6e 2e 20  eckout is open. 
ce50: 2a 2f 0a 20 20 69 66 28 20 63 61 63 68 65 45 6e  */.  if( cacheEn
ce60: 74 72 79 3d 3d 30 20 29 7b 0a 20 20 20 20 42 6c  try==0 ){.    Bl
ce70: 6f 62 20 76 65 72 73 69 6f 6e 65 64 50 61 74 68  ob versionedPath
ce80: 6e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  name;.    char *
ce90: 7a 56 65 72 73 69 6f 6e 65 64 50 61 74 68 6e 61  zVersionedPathna
cea0: 6d 65 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72  me;.    blob_zer
ceb0: 6f 28 26 76 65 72 73 69 6f 6e 65 64 50 61 74 68  o(&versionedPath
cec0: 6e 61 6d 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  name);.    blob_
ced0: 61 70 70 65 6e 64 66 28 26 76 65 72 73 69 6f 6e  appendf(&version
cee0: 65 64 50 61 74 68 6e 61 6d 65 2c 20 22 25 73 2e  edPathname, "%s.
cef0: 66 6f 73 73 69 6c 2d 73 65 74 74 69 6e 67 73 2f  fossil-settings/
cf00: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
cf10: 20 20 20 20 20 20 67 2e 7a 4c 6f 63 61 6c 52 6f        g.zLocalRo
cf20: 6f 74 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ot, zName);.    
cf30: 7a 56 65 72 73 69 6f 6e 65 64 50 61 74 68 6e 61  zVersionedPathna
cf40: 6d 65 20 3d 20 62 6c 6f 62 5f 73 74 72 28 26 76  me = blob_str(&v
cf50: 65 72 73 69 6f 6e 65 64 50 61 74 68 6e 61 6d 65  ersionedPathname
cf60: 29 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f  );.    if( file_
cf70: 73 69 7a 65 28 7a 56 65 72 73 69 6f 6e 65 64 50  size(zVersionedP
cf80: 61 74 68 6e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  athname)>=0 ){. 
cf90: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 65 78 69       /* File exi
cfa0: 73 74 73 2c 20 61 6e 64 20 63 6f 6e 74 61 69 6e  sts, and contain
cfb0: 73 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  s the value for 
cfc0: 74 68 69 73 20 73 65 74 74 69 6e 67 2e 20 4c 6f  this setting. Lo
cfd0: 61 64 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  ad from.      **
cfe0: 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20   the file. */.  
cff0: 20 20 20 20 42 6c 6f 62 20 73 65 74 74 69 6e 67      Blob setting
d000: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 7a 65 72  ;.      blob_zer
d010: 6f 28 26 73 65 74 74 69 6e 67 29 3b 0a 20 20 20  o(&setting);.   
d020: 20 20 20 69 66 28 20 62 6c 6f 62 5f 72 65 61 64     if( blob_read
d030: 5f 66 72 6f 6d 5f 66 69 6c 65 28 26 73 65 74 74  _from_file(&sett
d040: 69 6e 67 2c 20 7a 56 65 72 73 69 6f 6e 65 64 50  ing, zVersionedP
d050: 61 74 68 6e 61 6d 65 29 20 3e 3d 20 30 20 29 7b  athname) >= 0 ){
d060: 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 74 72  .        blob_tr
d070: 69 6d 28 26 73 65 74 74 69 6e 67 29 3b 20 2f 2a  im(&setting); /*
d080: 20 41 76 6f 69 64 20 6e 6f 6e 2d 6f 62 76 69 6f   Avoid non-obvio
d090: 75 73 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  us problems with
d0a0: 20 6c 69 6e 65 20 65 6e 64 69 6e 67 73 0a 20 20   line endings.  
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0c0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
d0d0: 20 62 6f 6f 6c 65 61 6e 20 70 72 6f 70 65 72 74   boolean propert
d0e0: 69 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  ies */.        z
d0f0: 56 65 72 73 69 6f 6e 65 64 53 65 74 74 69 6e 67  VersionedSetting
d100: 20 3d 20 73 74 72 64 75 70 28 62 6c 6f 62 5f 73   = strdup(blob_s
d110: 74 72 28 26 73 65 74 74 69 6e 67 29 29 3b 0a 20  tr(&setting));. 
d120: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 6c 6f       }.      blo
d130: 62 5f 72 65 73 65 74 28 26 73 65 74 74 69 6e 67  b_reset(&setting
d140: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 53 65 65 20  );.      /* See 
d150: 69 66 20 74 68 65 72 65 27 73 20 61 20 6e 6f 2d  if there's a no-
d160: 77 61 72 6e 20 66 6c 61 67 20 2a 2f 0a 20 20 20  warn flag */.   
d170: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26     blob_append(&
d180: 76 65 72 73 69 6f 6e 65 64 50 61 74 68 6e 61 6d  versionedPathnam
d190: 65 2c 20 22 2e 6e 6f 2d 77 61 72 6e 22 2c 20 2d  e, ".no-warn", -
d1a0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 69  1);.      if( fi
d1b0: 6c 65 5f 73 69 7a 65 28 62 6c 6f 62 5f 73 74 72  le_size(blob_str
d1c0: 28 26 76 65 72 73 69 6f 6e 65 64 50 61 74 68 6e  (&versionedPathn
d1d0: 61 6d 65 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20  ame))>=0 ){.    
d1e0: 20 20 20 20 6e 6f 57 61 72 6e 20 3d 20 31 3b 0a      noWarn = 1;.
d1f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d200: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 76 65    blob_reset(&ve
d210: 72 73 69 6f 6e 65 64 50 61 74 68 6e 61 6d 65 29  rsionedPathname)
d220: 3b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72  ;.    /* Store r
d230: 65 73 75 6c 74 20 69 6e 20 63 61 63 68 65 2c 20  esult in cache, 
d240: 77 68 69 63 68 20 63 61 6e 20 62 65 20 74 68 65  which can be the
d250: 20 76 61 6c 75 65 20 6f 72 20 30 20 69 66 20 6e   value or 0 if n
d260: 6f 74 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  ot found */.    
d270: 63 61 63 68 65 45 6e 74 72 79 20 3d 20 28 73 74  cacheEntry = (st
d280: 72 75 63 74 20 5f 63 61 63 68 65 45 6e 74 72 79  ruct _cacheEntry
d290: 2a 29 66 6f 73 73 69 6c 5f 6d 61 6c 6c 6f 63 28  *)fossil_malloc(
d2a0: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 5f 63  sizeof(struct _c
d2b0: 61 63 68 65 45 6e 74 72 79 29 29 3b 0a 20 20 20  acheEntry));.   
d2c0: 20 63 61 63 68 65 45 6e 74 72 79 2d 3e 6e 65 78   cacheEntry->nex
d2d0: 74 20 3d 20 63 61 63 68 65 3b 0a 20 20 20 20 63  t = cache;.    c
d2e0: 61 63 68 65 45 6e 74 72 79 2d 3e 7a 4e 61 6d 65  acheEntry->zName
d2f0: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 61   = zName;.    ca
d300: 63 68 65 45 6e 74 72 79 2d 3e 7a 56 61 6c 75 65  cheEntry->zValue
d310: 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 64 75 70   = fossil_strdup
d320: 28 7a 56 65 72 73 69 6f 6e 65 64 53 65 74 74 69  (zVersionedSetti
d330: 6e 67 29 3b 0a 20 20 20 20 63 61 63 68 65 20 3d  ng);.    cache =
d340: 20 63 61 63 68 65 45 6e 74 72 79 3b 0a 20 20 7d   cacheEntry;.  }
d350: 0a 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 20  .  /* Display a 
d360: 77 61 72 6e 69 6e 67 3f 20 2a 2f 0a 20 20 69 66  warning? */.  if
d370: 28 20 7a 56 65 72 73 69 6f 6e 65 64 53 65 74 74  ( zVersionedSett
d380: 69 6e 67 21 3d 30 20 26 26 20 7a 4e 6f 6e 56 65  ing!=0 && zNonVe
d390: 72 73 69 6f 6e 65 64 53 65 74 74 69 6e 67 21 3d  rsionedSetting!=
d3a0: 30 0a 20 20 20 26 26 20 7a 4e 6f 6e 56 65 72 73  0.   && zNonVers
d3b0: 69 6f 6e 65 64 53 65 74 74 69 6e 67 5b 30 5d 21  ionedSetting[0]!
d3c0: 3d 27 5c 30 27 20 26 26 20 21 6e 6f 57 61 72 6e  ='\0' && !noWarn
d3d0: 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  .  ){.    /* The
d3e0: 72 65 27 73 20 61 20 76 65 72 73 69 6f 6e 65 64  re's a versioned
d3f0: 20 73 65 74 74 69 6e 67 2c 20 61 6e 64 20 61 20   setting, and a 
d400: 6e 6f 6e 2d 76 65 72 73 69 6f 6e 65 64 20 73 65  non-versioned se
d410: 74 74 69 6e 67 2e 20 54 65 6c 6c 0a 20 20 20 20  tting. Tell.    
d420: 2a 2a 20 74 68 65 20 75 73 65 72 20 61 62 6f 75  ** the user abou
d430: 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 2a  t the conflict *
d440: 2f 0a 20 20 20 20 66 6f 73 73 69 6c 5f 77 61 72  /.    fossil_war
d450: 6e 69 6e 67 28 0a 20 20 20 20 20 20 20 20 22 73  ning(.        "s
d460: 65 74 74 69 6e 67 20 25 73 20 68 61 73 20 62 6f  etting %s has bo
d470: 74 68 20 76 65 72 73 69 6f 6e 65 64 20 61 6e 64  th versioned and
d480: 20 6e 6f 6e 2d 76 65 72 73 69 6f 6e 65 64 20 76   non-versioned v
d490: 61 6c 75 65 73 3a 20 75 73 69 6e 67 20 22 0a 20  alues: using ". 
d4a0: 20 20 20 20 20 20 20 22 76 65 72 73 69 6f 6e 65         "versione
d4b0: 64 20 76 61 6c 75 65 20 66 72 6f 6d 20 66 69 6c  d value from fil
d4c0: 65 20 2e 66 6f 73 73 69 6c 2d 73 65 74 74 69 6e  e .fossil-settin
d4d0: 67 73 2f 25 73 20 28 74 6f 20 73 69 6c 65 6e 63  gs/%s (to silenc
d4e0: 65 20 74 68 69 73 20 22 0a 20 20 20 20 20 20 20  e this ".       
d4f0: 20 22 77 61 72 6e 69 6e 67 2c 20 65 69 74 68 65   "warning, eithe
d500: 72 20 63 72 65 61 74 65 20 61 6e 20 65 6d 70 74  r create an empt
d510: 79 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 0a 20  y file named ". 
d520: 20 20 20 20 20 20 20 22 2e 66 6f 73 73 69 6c 2d         ".fossil-
d530: 73 65 74 74 69 6e 67 73 2f 25 73 2e 6e 6f 2d 77  settings/%s.no-w
d540: 61 72 6e 20 6f 72 20 64 65 6c 65 74 65 20 74 68  arn or delete th
d550: 65 20 6e 6f 6e 2d 76 65 72 73 69 6f 6e 65 64 20  e non-versioned 
d560: 73 65 74 74 69 6e 67 20 22 0a 20 20 20 20 20 20  setting ".      
d570: 20 20 22 20 77 69 74 68 20 5c 22 66 6f 73 73 69    " with \"fossi
d580: 6c 20 75 6e 73 65 74 20 25 73 5c 22 29 22 2c 20  l unset %s\")", 
d590: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a 4e  zName, zName, zN
d5a0: 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29  ame, zName.    )
d5b0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 50 72 65 66 65  ;.  }.  /* Prefe
d5c0: 72 20 74 68 65 20 76 65 72 73 69 6f 6e 65 64 20  r the versioned 
d5d0: 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 72 65 74  setting */.  ret
d5e0: 75 72 6e 20 28 20 7a 56 65 72 73 69 6f 6e 65 64  urn ( zVersioned
d5f0: 53 65 74 74 69 6e 67 21 3d 30 20 29 20 3f 20 7a  Setting!=0 ) ? z
d600: 56 65 72 73 69 6f 6e 65 64 53 65 74 74 69 6e 67  VersionedSetting
d610: 20 3a 20 7a 4e 6f 6e 56 65 72 73 69 6f 6e 65 64   : zNonVersioned
d620: 53 65 74 74 69 6e 67 3b 0a 7d 0a 0a 0a 2f 2a 0a  Setting;.}.../*.
d630: 2a 2a 20 47 65 74 20 61 6e 64 20 73 65 74 20 76  ** Get and set v
d640: 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20 43  alues from the C
d650: 4f 4e 46 49 47 2c 20 47 4c 4f 42 41 4c 5f 43 4f  ONFIG, GLOBAL_CO
d660: 4e 46 49 47 20 61 6e 64 20 56 56 41 52 20 74 61  NFIG and VVAR ta
d670: 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 65  ble in the.** re
d680: 70 6f 73 69 74 6f 72 79 20 61 6e 64 20 6c 6f 63  pository and loc
d690: 61 6c 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2f  al databases..*/
d6a0: 0a 63 68 61 72 20 2a 64 62 5f 67 65 74 28 63 6f  .char *db_get(co
d6b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
d6c0: 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 29   char *zDefault)
d6d0: 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  {.  char *z = 0;
d6e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
d6f0: 74 20 73 74 72 75 63 74 20 73 74 43 6f 6e 74 72  t struct stContr
d700: 6f 6c 53 65 74 74 69 6e 67 73 20 2a 63 74 72 6c  olSettings *ctrl
d710: 53 65 74 74 69 6e 67 20 3d 20 30 3b 0a 20 20 2f  Setting = 0;.  /
d720: 2a 20 49 73 20 74 68 69 73 20 61 20 73 65 74 74  * Is this a sett
d730: 69 6e 67 3f 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ing? */.  for(i=
d740: 30 3b 20 63 74 72 6c 53 65 74 74 69 6e 67 73 5b  0; ctrlSettings[
d750: 69 5d 2e 6e 61 6d 65 3b 20 69 2b 2b 29 7b 0a 20  i].name; i++){. 
d760: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 63 74     if( strcmp(ct
d770: 72 6c 53 65 74 74 69 6e 67 73 5b 69 5d 2e 6e 61  rlSettings[i].na
d780: 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  me, zName)==0 ){
d790: 0a 20 20 20 20 20 20 63 74 72 6c 53 65 74 74 69  .      ctrlSetti
d7a0: 6e 67 20 3d 20 26 28 63 74 72 6c 53 65 74 74 69  ng = &(ctrlSetti
d7b0: 6e 67 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 62  ngs[i]);.      b
d7c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
d7d0: 20 20 69 66 28 20 67 2e 72 65 70 6f 73 69 74 6f    if( g.reposito
d7e0: 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20 20 7a 20  ryOpen ){.    z 
d7f0: 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45  = db_text(0, "SE
d800: 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20  LECT value FROM 
d810: 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d  config WHERE nam
d820: 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e=%Q", zName);. 
d830: 20 7d 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26 26   }.  if( z==0 &&
d840: 20 67 2e 7a 43 6f 6e 66 69 67 44 62 4e 61 6d 65   g.zConfigDbName
d850: 20 29 7b 0a 20 20 20 20 64 62 5f 73 77 61 70 5f   ){.    db_swap_
d860: 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 29 3b 0a 20  connections();. 
d870: 20 20 20 7a 20 3d 20 64 62 5f 74 65 78 74 28 30     z = db_text(0
d880: 2c 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20  , "SELECT value 
d890: 46 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66  FROM global_conf
d8a0: 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ig WHERE name=%Q
d8b0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 64  ", zName);.    d
d8c0: 62 5f 73 77 61 70 5f 63 6f 6e 6e 65 63 74 69 6f  b_swap_connectio
d8d0: 6e 73 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ns();.  }.  if( 
d8e0: 63 74 72 6c 53 65 74 74 69 6e 67 21 3d 30 20 26  ctrlSetting!=0 &
d8f0: 26 20 63 74 72 6c 53 65 74 74 69 6e 67 2d 3e 76  & ctrlSetting->v
d900: 65 72 73 69 6f 6e 61 62 6c 65 20 29 7b 0a 20 20  ersionable ){.  
d910: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 76    /* This is a v
d920: 65 72 73 69 6f 6e 61 62 6c 65 20 73 65 74 74 69  ersionable setti
d930: 6e 67 2c 20 74 72 79 20 61 6e 64 20 67 65 74 20  ng, try and get 
d940: 74 68 65 20 69 6e 66 6f 20 66 72 6f 6d 20 61 0a  the info from a.
d950: 20 20 20 20 2a 2a 20 63 68 65 63 6b 65 64 20 6f      ** checked o
d960: 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7a  ut file */.    z
d970: 20 3d 20 64 62 5f 67 65 74 5f 64 6f 5f 76 65 72   = db_get_do_ver
d980: 73 69 6f 6e 61 62 6c 65 28 7a 4e 61 6d 65 2c 20  sionable(zName, 
d990: 7a 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 3d  z);.  }.  if( z=
d9a0: 3d 30 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 44  =0 ){.    z = zD
d9b0: 65 66 61 75 6c 74 3b 0a 20 20 7d 0a 20 20 72 65  efault;.  }.  re
d9c0: 74 75 72 6e 20 7a 3b 0a 7d 0a 63 68 61 72 20 2a  turn z;.}.char *
d9d0: 64 62 5f 67 65 74 5f 6d 74 69 6d 65 28 63 6f 6e  db_get_mtime(con
d9e0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
d9f0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 63  char *zFormat, c
da00: 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 29 7b 0a  har *zDefault){.
da10: 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20    char *z = 0;. 
da20: 20 69 66 28 20 67 2e 72 65 70 6f 73 69 74 6f 72   if( g.repositor
da30: 79 4f 70 65 6e 20 29 7b 0a 20 20 20 20 7a 20 3d  yOpen ){.    z =
da40: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
da50: 45 43 54 20 6d 74 69 6d 65 20 46 52 4f 4d 20 63  ECT mtime FROM c
da60: 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65  onfig WHERE name
da70: 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  =%Q", zName);.  
da80: 7d 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a  }.  if( z==0 ){.
da90: 20 20 20 20 7a 20 3d 20 7a 44 65 66 61 75 6c 74      z = zDefault
daa0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 46  ;.  }else if( zF
dab0: 6f 72 6d 61 74 21 3d 30 20 29 7b 0a 20 20 20 20  ormat!=0 ){.    
dac0: 7a 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22  z = db_text(0, "
dad0: 53 45 4c 45 43 54 20 73 74 72 66 74 69 6d 65 28  SELECT strftime(
dae0: 25 51 2c 25 51 2c 27 75 6e 69 78 65 70 6f 63 68  %Q,%Q,'unixepoch
daf0: 27 29 3b 22 2c 20 7a 46 6f 72 6d 61 74 2c 20 7a  ');", zFormat, z
db00: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
db10: 7a 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 73 65 74  z;.}.void db_set
db20: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
db30: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
db40: 7a 56 61 6c 75 65 2c 20 69 6e 74 20 67 6c 6f 62  zValue, int glob
db50: 61 6c 46 6c 61 67 29 7b 0a 20 20 64 62 5f 62 65  alFlag){.  db_be
db60: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
db70: 29 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61 6c 46  );.  if( globalF
db80: 6c 61 67 20 29 7b 0a 20 20 20 20 64 62 5f 73 77  lag ){.    db_sw
db90: 61 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 29  ap_connections()
dba0: 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65  ;.    db_multi_e
dbb0: 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54  xec("REPLACE INT
dbc0: 4f 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 28  O global_config(
dbd0: 6e 61 6d 65 2c 76 61 6c 75 65 29 20 56 41 4c 55  name,value) VALU
dbe0: 45 53 28 25 51 2c 25 51 29 22 2c 0a 20 20 20 20  ES(%Q,%Q)",.    
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
dc00: 4e 61 6d 65 2c 20 7a 56 61 6c 75 65 29 3b 0a 20  Name, zValue);. 
dc10: 20 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65     db_swap_conne
dc20: 63 74 69 6f 6e 73 28 29 3b 0a 20 20 7d 65 6c 73  ctions();.  }els
dc30: 65 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  e{.    db_multi_
dc40: 65 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e  exec("REPLACE IN
dc50: 54 4f 20 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76  TO config(name,v
dc60: 61 6c 75 65 2c 6d 74 69 6d 65 29 20 56 41 4c 55  alue,mtime) VALU
dc70: 45 53 28 25 51 2c 25 51 2c 6e 6f 77 28 29 29 22  ES(%Q,%Q,now())"
dc80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dc90: 20 20 20 20 20 7a 4e 61 6d 65 2c 20 7a 56 61 6c       zName, zVal
dca0: 75 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ue);.  }.  if( g
dcb0: 6c 6f 62 61 6c 46 6c 61 67 20 26 26 20 67 2e 72  lobalFlag && g.r
dcc0: 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20 29 7b  epositoryOpen ){
dcd0: 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78  .    db_multi_ex
dce0: 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  ec("DELETE FROM 
dcf0: 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d  config WHERE nam
dd00: 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e=%Q", zName);. 
dd10: 20 7d 0a 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e   }.  db_end_tran
dd20: 73 61 63 74 69 6f 6e 28 30 29 3b 0a 7d 0a 76 6f  saction(0);.}.vo
dd30: 69 64 20 64 62 5f 75 6e 73 65 74 28 63 6f 6e 73  id db_unset(cons
dd40: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
dd50: 6e 74 20 67 6c 6f 62 61 6c 46 6c 61 67 29 7b 0a  nt globalFlag){.
dd60: 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73    db_begin_trans
dd70: 61 63 74 69 6f 6e 28 29 3b 0a 20 20 69 66 28 20  action();.  if( 
dd80: 67 6c 6f 62 61 6c 46 6c 61 67 20 29 7b 0a 20 20  globalFlag ){.  
dd90: 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65 63    db_swap_connec
dda0: 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 64 62 5f  tions();.    db_
ddb0: 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 45 4c 45  multi_exec("DELE
ddc0: 54 45 20 46 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63  TE FROM global_c
ddd0: 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65  onfig WHERE name
dde0: 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  =%Q", zName);.  
ddf0: 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65 63    db_swap_connec
de00: 74 69 6f 6e 73 28 29 3b 0a 20 20 7d 65 6c 73 65  tions();.  }else
de10: 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65  {.    db_multi_e
de20: 78 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d  xec("DELETE FROM
de30: 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61   config WHERE na
de40: 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a  me=%Q", zName);.
de50: 20 20 7d 0a 20 20 69 66 28 20 67 6c 6f 62 61 6c    }.  if( global
de60: 46 6c 61 67 20 26 26 20 67 2e 72 65 70 6f 73 69  Flag && g.reposi
de70: 74 6f 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20 20  toryOpen ){.    
de80: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 44  db_multi_exec("D
de90: 45 4c 45 54 45 20 46 52 4f 4d 20 63 6f 6e 66 69  ELETE FROM confi
dea0: 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  g WHERE name=%Q"
deb0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  , zName);.  }.  
dec0: 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  db_end_transacti
ded0: 6f 6e 28 30 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f  on(0);.}.int db_
dee0: 69 73 5f 67 6c 6f 62 61 6c 28 63 6f 6e 73 74 20  is_global(const 
def0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
df00: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 66  int rc = 0;.  if
df10: 28 20 67 2e 7a 43 6f 6e 66 69 67 44 62 4e 61 6d  ( g.zConfigDbNam
df20: 65 20 29 7b 0a 20 20 20 20 64 62 5f 73 77 61 70  e ){.    db_swap
df30: 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 29 3b 0a  _connections();.
df40: 20 20 20 20 72 63 20 3d 20 64 62 5f 65 78 69 73      rc = db_exis
df50: 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f  ts("SELECT 1 FRO
df60: 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20  M global_config 
df70: 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20  WHERE name=%Q", 
df80: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 64 62 5f 73  zName);.    db_s
df90: 77 61 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 28  wap_connections(
dfa0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
dfb0: 72 63 3b 0a 7d 0a 69 6e 74 20 64 62 5f 67 65 74  rc;.}.int db_get
dfc0: 5f 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20  _int(const char 
dfd0: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 64 66 6c 74  *zName, int dflt
dfe0: 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 64 66 6c  ){.  int v = dfl
dff0: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
e000: 66 28 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f  f( g.repositoryO
e010: 70 65 6e 20 29 7b 0a 20 20 20 20 53 74 6d 74 20  pen ){.    Stmt 
e020: 71 3b 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72  q;.    db_prepar
e030: 65 28 26 71 2c 20 22 53 45 4c 45 43 54 20 76 61  e(&q, "SELECT va
e040: 6c 75 65 20 46 52 4f 4d 20 63 6f 6e 66 69 67 20  lue FROM config 
e050: 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20  WHERE name=%Q", 
e060: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d  zName);.    rc =
e070: 20 64 62 5f 73 74 65 70 28 26 71 29 3b 0a 20 20   db_step(&q);.  
e080: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e090: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 76 20  _ROW ){.      v 
e0a0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  = db_column_int(
e0b0: 26 71 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  &q, 0);.    }.  
e0c0: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71    db_finalize(&q
e0d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
e0e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
e0f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
e100: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 67  SQLITE_DONE && g
e110: 2e 7a 43 6f 6e 66 69 67 44 62 4e 61 6d 65 20 29  .zConfigDbName )
e120: 7b 0a 20 20 20 20 64 62 5f 73 77 61 70 5f 63 6f  {.    db_swap_co
e130: 6e 6e 65 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20  nnections();.   
e140: 20 76 20 3d 20 64 62 5f 69 6e 74 28 64 66 6c 74   v = db_int(dflt
e150: 2c 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20  , "SELECT value 
e160: 46 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66  FROM global_conf
e170: 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ig WHERE name=%Q
e180: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 64  ", zName);.    d
e190: 62 5f 73 77 61 70 5f 63 6f 6e 6e 65 63 74 69 6f  b_swap_connectio
e1a0: 6e 73 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ns();.  }.  retu
e1b0: 72 6e 20 76 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f  rn v;.}.void db_
e1c0: 73 65 74 5f 69 6e 74 28 63 6f 6e 73 74 20 63 68  set_int(const ch
e1d0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 76  ar *zName, int v
e1e0: 61 6c 75 65 2c 20 69 6e 74 20 67 6c 6f 62 61 6c  alue, int global
e1f0: 46 6c 61 67 29 7b 0a 20 20 69 66 28 20 67 6c 6f  Flag){.  if( glo
e200: 62 61 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 64  balFlag ){.    d
e210: 62 5f 73 77 61 70 5f 63 6f 6e 6e 65 63 74 69 6f  b_swap_connectio
e220: 6e 73 28 29 3b 0a 20 20 20 20 64 62 5f 6d 75 6c  ns();.    db_mul
e230: 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43 45  ti_exec("REPLACE
e240: 20 49 4e 54 4f 20 67 6c 6f 62 61 6c 5f 63 6f 6e   INTO global_con
e250: 66 69 67 28 6e 61 6d 65 2c 76 61 6c 75 65 29 20  fig(name,value) 
e260: 56 41 4c 55 45 53 28 25 51 2c 25 64 29 22 2c 0a  VALUES(%Q,%d)",.
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 7a 4e 61 6d 65 2c 20 76 61 6c 75 65 29 3b    zName, value);
e290: 0a 20 20 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e  .    db_swap_con
e2a0: 6e 65 63 74 69 6f 6e 73 28 29 3b 0a 20 20 7d 65  nections();.  }e
e2b0: 6c 73 65 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74  lse{.    db_mult
e2c0: 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43 45 20  i_exec("REPLACE 
e2d0: 49 4e 54 4f 20 63 6f 6e 66 69 67 28 6e 61 6d 65  INTO config(name
e2e0: 2c 76 61 6c 75 65 2c 6d 74 69 6d 65 29 20 56 41  ,value,mtime) VA
e2f0: 4c 55 45 53 28 25 51 2c 25 64 2c 6e 6f 77 28 29  LUES(%Q,%d,now()
e300: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
e310: 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 76 61 6c        zName, val
e320: 75 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ue);.  }.  if( g
e330: 6c 6f 62 61 6c 46 6c 61 67 20 26 26 20 67 2e 72  lobalFlag && g.r
e340: 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20 29 7b  epositoryOpen ){
e350: 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78  .    db_multi_ex
e360: 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  ec("DELETE FROM 
e370: 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d  config WHERE nam
e380: 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e=%Q", zName);. 
e390: 20 7d 0a 7d 0a 69 6e 74 20 64 62 5f 67 65 74 5f   }.}.int db_get_
e3a0: 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68  boolean(const ch
e3b0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 64  ar *zName, int d
e3c0: 66 6c 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 56  flt){.  char *zV
e3d0: 61 6c 20 3d 20 64 62 5f 67 65 74 28 7a 4e 61 6d  al = db_get(zNam
e3e0: 65 2c 20 64 66 6c 74 20 3f 20 22 6f 6e 22 20 3a  e, dflt ? "on" :
e3f0: 20 22 6f 66 66 22 29 3b 0a 20 20 69 66 28 20 69   "off");.  if( i
e400: 73 5f 74 72 75 74 68 28 7a 56 61 6c 29 20 29 20  s_truth(zVal) ) 
e410: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
e420: 69 73 5f 66 61 6c 73 65 28 7a 56 61 6c 29 20 29  is_false(zVal) )
e430: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
e440: 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 63 68 61 72  urn dflt;.}.char
e450: 20 2a 64 62 5f 6c 67 65 74 28 63 6f 6e 73 74 20   *db_lget(const 
e460: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 68 61  char *zName, cha
e470: 72 20 2a 7a 44 65 66 61 75 6c 74 29 7b 0a 20 20  r *zDefault){.  
e480: 72 65 74 75 72 6e 20 64 62 5f 74 65 78 74 28 28  return db_text((
e490: 63 68 61 72 2a 29 7a 44 65 66 61 75 6c 74 2c 0a  char*)zDefault,.
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4b0: 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46   "SELECT value F
e4c0: 52 4f 4d 20 76 76 61 72 20 57 48 45 52 45 20 6e  ROM vvar WHERE n
e4d0: 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b  ame=%Q", zName);
e4e0: 0a 7d 0a 76 6f 69 64 20 64 62 5f 6c 73 65 74 28  .}.void db_lset(
e4f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
e500: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
e510: 56 61 6c 75 65 29 7b 0a 20 20 64 62 5f 6d 75 6c  Value){.  db_mul
e520: 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43 45  ti_exec("REPLACE
e530: 20 49 4e 54 4f 20 76 76 61 72 28 6e 61 6d 65 2c   INTO vvar(name,
e540: 76 61 6c 75 65 29 20 56 41 4c 55 45 53 28 25 51  value) VALUES(%Q
e550: 2c 25 51 29 22 2c 20 7a 4e 61 6d 65 2c 20 7a 56  ,%Q)", zName, zV
e560: 61 6c 75 65 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f  alue);.}.int db_
e570: 6c 67 65 74 5f 69 6e 74 28 63 6f 6e 73 74 20 63  lget_int(const c
e580: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
e590: 64 66 6c 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  dflt){.  return 
e5a0: 64 62 5f 69 6e 74 28 64 66 6c 74 2c 20 22 53 45  db_int(dflt, "SE
e5b0: 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20  LECT value FROM 
e5c0: 76 76 61 72 20 57 48 45 52 45 20 6e 61 6d 65 3d  vvar WHERE name=
e5d0: 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 76  %Q", zName);.}.v
e5e0: 6f 69 64 20 64 62 5f 6c 73 65 74 5f 69 6e 74 28  oid db_lset_int(
e5f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
e600: 65 2c 20 69 6e 74 20 76 61 6c 75 65 29 7b 0a 20  e, int value){. 
e610: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
e620: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 76 76 61  REPLACE INTO vva
e630: 72 28 6e 61 6d 65 2c 76 61 6c 75 65 29 20 56 41  r(name,value) VA
e640: 4c 55 45 53 28 25 51 2c 25 64 29 22 2c 20 7a 4e  LUES(%Q,%d)", zN
e650: 61 6d 65 2c 20 76 61 6c 75 65 29 3b 0a 7d 0a 0a  ame, value);.}..
e660: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f  /*.** Returns no
e670: 6e 2d 30 20 69 66 20 74 68 65 20 64 61 74 61 62  n-0 if the datab
e680: 61 73 65 20 28 77 68 69 63 68 20 6d 75 73 74 20  ase (which must 
e690: 62 65 20 6f 70 65 6e 29 20 74 61 62 6c 65 20 69  be open) table i
e6a0: 64 65 6e 74 69 66 69 65 64 0a 2a 2a 20 62 79 20  dentified.** by 
e6b0: 7a 54 61 62 6c 65 4e 61 6d 65 20 68 61 73 20 61  zTableName has a
e6c0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a 43   column named zC
e6d0: 6f 6c 4e 61 6d 65 20 28 63 61 73 65 2d 73 65 6e  olName (case-sen
e6e0: 73 69 74 69 76 65 29 2c 20 65 6c 73 65 0a 2a 2a  sitive), else.**
e6f0: 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2f 0a 69   returns 0..*/.i
e700: 6e 74 20 64 62 5f 74 61 62 6c 65 5f 68 61 73 5f  nt db_table_has_
e710: 63 6f 6c 75 6d 6e 28 20 63 68 61 72 20 63 6f 6e  column( char con
e720: 73 74 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20  st *zTableName, 
e730: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
e740: 4e 61 6d 65 20 29 7b 0a 20 20 53 74 6d 74 20 71  Name ){.  Stmt q
e750: 20 3d 20 65 6d 70 74 79 5f 53 74 6d 74 3b 0a 20   = empty_Stmt;. 
e760: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 64   int rc = 0;.  d
e770: 62 5f 70 72 65 70 61 72 65 28 20 26 71 2c 20 22  b_prepare( &q, "
e780: 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66  PRAGMA table_inf
e790: 6f 28 25 51 29 22 2c 20 7a 54 61 62 6c 65 4e 61  o(%Q)", zTableNa
e7a0: 6d 65 20 29 3b 0a 20 20 77 68 69 6c 65 28 53 51  me );.  while(SQ
e7b0: 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 64 62 5f 73  LITE_ROW == db_s
e7c0: 74 65 70 28 26 71 29 29 7b 0a 20 20 20 20 2f 2a  tep(&q)){.    /*
e7d0: 20 43 6f 6c 75 6d 6e 73 3a 20 28 63 69 64 2c 20   Columns: (cid, 
e7e0: 6e 61 6d 65 2c 20 74 79 70 65 2c 20 6e 6f 74 6e  name, type, notn
e7f0: 75 6c 6c 2c 20 64 66 6c 74 5f 76 61 6c 75 65 2c  ull, dflt_value,
e800: 20 70 6b 29 20 2a 2f 0a 20 20 20 20 63 68 61 72   pk) */.    char
e810: 20 63 6f 6e 73 74 20 2a 20 7a 43 6f 6c 20 3d 20   const * zCol = 
e820: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
e830: 71 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 30  q, 1);.    if( 0
e840: 3d 3d 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28  ==fossil_strcmp(
e850: 7a 43 6f 6c 4e 61 6d 65 2c 20 7a 43 6f 6c 29 20  zColName, zCol) 
e860: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  ){.      rc = 1;
e870: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e880: 20 20 7d 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e    }.  }.  db_fin
e890: 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 72 65 74  alize(&q);.  ret
e8a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e8b0: 20 52 65 63 6f 72 64 20 74 68 65 20 6e 61 6d 65   Record the name
e8c0: 20 6f 66 20 61 20 6c 6f 63 61 6c 20 72 65 70 6f   of a local repo
e8d0: 73 69 74 6f 72 79 20 69 6e 20 74 68 65 20 67 6c  sitory in the gl
e8e0: 6f 62 61 6c 5f 63 6f 6e 66 69 67 28 29 20 64 61  obal_config() da
e8f0: 74 61 62 61 73 65 2e 0a 2a 2a 20 54 68 65 20 72  tabase..** The r
e900: 65 70 6f 73 69 74 6f 72 79 20 66 69 6c 65 6e 61  epository filena
e910: 6d 65 20 25 73 20 69 73 20 72 65 63 6f 72 64 65  me %s is recorde
e920: 64 20 61 73 20 61 6e 20 65 6e 74 72 79 20 77 69  d as an entry wi
e930: 74 68 20 61 20 22 6e 61 6d 65 22 20 66 69 65 6c  th a "name" fiel
e940: 64 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  d.** of the foll
e950: 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  owing form:.**.*
e960: 2a 20 20 20 20 20 20 20 72 65 70 6f 3a 25 73 0a  *       repo:%s.
e970: 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
e980: 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20  field is set to 
e990: 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 75 6e 6e  1..**.** If runn
e9a0: 69 6e 67 20 66 72 6f 6d 20 61 20 6c 6f 63 61 6c  ing from a local
e9b0: 20 63 68 65 63 6b 6f 75 74 2c 20 61 6c 73 6f 20   checkout, also 
e9c0: 72 65 63 6f 72 64 20 74 68 65 20 72 6f 6f 74 20  record the root 
e9d0: 6f 66 20 74 68 65 20 63 68 65 63 6b 6f 75 74 0a  of the checkout.
e9e0: 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ** as follows:.*
e9f0: 2a 0a 2a 2a 20 20 20 20 20 20 20 63 6b 6f 75 74  *.**       ckout
ea00: 3a 25 73 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20  :%s.**.** Where 
ea10: 25 73 20 69 73 20 74 68 65 20 63 68 65 63 6b 6f  %s is the checko
ea20: 75 74 20 72 6f 6f 74 2e 20 20 54 68 65 20 76 61  ut root.  The va
ea30: 6c 75 65 20 69 73 20 74 68 65 20 72 65 70 6f 73  lue is the repos
ea40: 69 74 6f 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 76  itory file..*/.v
ea50: 6f 69 64 20 64 62 5f 72 65 63 6f 72 64 5f 72 65  oid db_record_re
ea60: 70 6f 73 69 74 6f 72 79 5f 66 69 6c 65 6e 61 6d  pository_filenam
ea70: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  e(const char *zN
ea80: 61 6d 65 29 7b 0a 20 20 42 6c 6f 62 20 66 75 6c  ame){.  Blob ful
ea90: 6c 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  l;.  if( zName==
eaa0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 67 2e  0 ){.    if( !g.
eab0: 6c 6f 63 61 6c 4f 70 65 6e 20 29 20 72 65 74 75  localOpen ) retu
eac0: 72 6e 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  rn;.    zName = 
ead0: 64 62 5f 72 65 70 6f 73 69 74 6f 72 79 5f 66 69  db_repository_fi
eae0: 6c 65 6e 61 6d 65 28 29 3b 0a 20 20 7d 0a 20 20  lename();.  }.  
eaf0: 66 69 6c 65 5f 63 61 6e 6f 6e 69 63 61 6c 5f 6e  file_canonical_n
eb00: 61 6d 65 28 7a 4e 61 6d 65 2c 20 26 66 75 6c 6c  ame(zName, &full
eb10: 2c 20 30 29 3b 0a 20 20 64 62 5f 73 77 61 70 5f  , 0);.  db_swap_
eb20: 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 29 3b 0a 20  connections();. 
eb30: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a   db_multi_exec(.
eb40: 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20       "INSERT OR 
eb50: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 67 6c 6f 62  IGNORE INTO glob
eb60: 61 6c 5f 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76  al_config(name,v
eb70: 61 6c 75 65 29 22 0a 20 20 20 20 20 22 56 41 4c  alue)".     "VAL
eb80: 55 45 53 28 27 72 65 70 6f 3a 25 71 27 2c 31 29  UES('repo:%q',1)
eb90: 22 2c 0a 20 20 20 20 20 62 6c 6f 62 5f 73 74 72  ",.     blob_str
eba0: 28 26 66 75 6c 6c 29 0a 20 20 29 3b 0a 20 20 69  (&full).  );.  i
ebb0: 66 28 20 67 2e 6c 6f 63 61 6c 4f 70 65 6e 20 26  f( g.localOpen &
ebc0: 26 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 20 26  & g.zLocalRoot &
ebd0: 26 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 5b 30  & g.zLocalRoot[0
ebe0: 5d 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20 6c 6f  ] ){.    Blob lo
ebf0: 63 61 6c 52 6f 6f 74 3b 0a 20 20 20 20 66 69 6c  calRoot;.    fil
ec00: 65 5f 63 61 6e 6f 6e 69 63 61 6c 5f 6e 61 6d 65  e_canonical_name
ec10: 28 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 2c 20 26  (g.zLocalRoot, &
ec20: 6c 6f 63 61 6c 52 6f 6f 74 2c 20 31 29 3b 0a 20  localRoot, 1);. 
ec30: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
ec40: 28 0a 20 20 20 20 20 20 22 52 45 50 4c 41 43 45  (.      "REPLACE
ec50: 20 49 4e 54 4f 20 67 6c 6f 62 61 6c 5f 63 6f 6e   INTO global_con
ec60: 66 69 67 28 6e 61 6d 65 2c 20 76 61 6c 75 65 29  fig(name, value)
ec70: 22 0a 20 20 20 20 20 20 22 56 41 4c 55 45 53 28  ".      "VALUES(
ec80: 27 63 6b 6f 75 74 3a 25 71 27 2c 27 25 71 27 29  'ckout:%q','%q')
ec90: 3b 22 2c 0a 20 20 20 20 20 20 62 6c 6f 62 5f 73  ;",.      blob_s
eca0: 74 72 28 26 6c 6f 63 61 6c 52 6f 6f 74 29 2c 20  tr(&localRoot), 
ecb0: 62 6c 6f 62 5f 73 74 72 28 26 66 75 6c 6c 29 0a  blob_str(&full).
ecc0: 20 20 20 20 29 3b 0a 20 20 20 20 64 62 5f 73 77      );.    db_sw
ecd0: 61 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 29  ap_connections()
ece0: 3b 0a 20 20 20 20 64 62 5f 6f 70 74 69 6f 6e 61  ;.    db_optiona
ecf0: 6c 5f 73 71 6c 28 22 72 65 70 6f 73 69 74 6f 72  l_sql("repositor
ed00: 79 22 2c 0a 20 20 20 20 20 20 20 20 22 52 45 50  y",.        "REP
ed10: 4c 41 43 45 20 49 4e 54 4f 20 63 6f 6e 66 69 67  LACE INTO config
ed20: 28 6e 61 6d 65 2c 76 61 6c 75 65 2c 6d 74 69 6d  (name,value,mtim
ed30: 65 29 22 0a 20 20 20 20 20 20 20 20 22 56 41 4c  e)".        "VAL
ed40: 55 45 53 28 27 63 6b 6f 75 74 3a 25 71 27 2c 31  UES('ckout:%q',1
ed50: 2c 6e 6f 77 28 29 29 22 2c 0a 20 20 20 20 20 20  ,now())",.      
ed60: 20 20 62 6c 6f 62 5f 73 74 72 28 26 6c 6f 63 61    blob_str(&loca
ed70: 6c 52 6f 6f 74 29 0a 20 20 20 20 29 3b 0a 20 20  lRoot).    );.  
ed80: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 6c 6f    blob_reset(&lo
ed90: 63 61 6c 52 6f 6f 74 29 3b 0a 20 20 7d 65 6c 73  calRoot);.  }els
eda0: 65 7b 0a 20 20 20 20 64 62 5f 73 77 61 70 5f 63  e{.    db_swap_c
edb0: 6f 6e 6e 65 63 74 69 6f 6e 73 28 29 3b 0a 20 20  onnections();.  
edc0: 7d 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26  }.  blob_reset(&
edd0: 66 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  full);.}../*.** 
ede0: 43 4f 4d 4d 41 4e 44 3a 20 6f 70 65 6e 0a 2a 2a  COMMAND: open.**
edf0: 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73  .** Usage: %foss
ee00: 69 6c 20 6f 70 65 6e 20 46 49 4c 45 4e 41 4d 45  il open FILENAME
ee10: 20 3f 56 45 52 53 49 4f 4e 3f 20 3f 4f 50 54 49   ?VERSION? ?OPTI
ee20: 4f 4e 53 3f 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  ONS?.**.** Open 
ee30: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
ee40: 74 68 65 20 6c 6f 63 61 6c 20 72 65 70 6f 73 69  the local reposi
ee50: 74 6f 72 79 20 69 6e 20 46 49 4c 45 4e 41 4d 45  tory in FILENAME
ee60: 2e 20 20 41 20 63 68 65 63 6b 6f 75 74 0a 2a 2a  .  A checkout.**
ee70: 20 66 6f 72 20 74 68 65 20 72 65 70 6f 73 69 74   for the reposit
ee80: 6f 72 79 20 69 73 20 63 72 65 61 74 65 64 20 77  ory is created w
ee90: 69 74 68 20 69 74 73 20 72 6f 6f 74 20 61 74 20  ith its root at 
eea0: 74 68 65 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  the working dire
eeb0: 63 74 6f 72 79 2e 0a 2a 2a 20 49 66 20 56 45 52  ctory..** If VER
eec0: 53 49 4f 4e 20 69 73 20 73 70 65 63 69 66 69 65  SION is specifie
eed0: 64 20 74 68 65 6e 20 74 68 61 74 20 76 65 72 73  d then that vers
eee0: 69 6f 6e 20 69 73 20 63 68 65 63 6b 65 64 20 6f  ion is checked o
eef0: 75 74 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  ut.  Otherwise.*
ef00: 2a 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72  * the latest ver
ef10: 73 69 6f 6e 20 69 73 20 63 68 65 63 6b 65 64 20  sion is checked 
ef20: 6f 75 74 2e 20 20 4e 6f 20 66 69 6c 65 73 20 6f  out.  No files o
ef30: 74 68 65 72 20 74 68 61 6e 20 22 6d 61 6e 69 66  ther than "manif
ef40: 65 73 74 22 0a 2a 2a 20 61 6e 64 20 22 6d 61 6e  est".** and "man
ef50: 69 66 65 73 74 2e 75 75 69 64 22 20 61 72 65 20  ifest.uuid" are 
ef60: 6d 6f 64 69 66 69 65 64 20 69 66 20 74 68 65 20  modified if the 
ef70: 2d 2d 6b 65 65 70 20 6f 70 74 69 6f 6e 20 69 73  --keep option is
ef80: 20 70 72 65 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   present..**.** 
ef90: 4f 70 74 69 6f 6e 73 3a 0a 2a 2a 20 20 20 2d 2d  Options:.**   --
efa0: 65 6d 70 74 79 20 20 20 20 20 20 20 20 20 20 20  empty           
efb0: 49 6e 69 74 69 61 6c 69 7a 65 20 63 68 65 63 6b  Initialize check
efc0: 6f 75 74 20 61 73 20 62 65 69 6e 67 20 65 6d 70  out as being emp
efd0: 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f  ty, but still co
efe0: 6e 6e 65 63 74 65 64 0a 2a 2a 20 20 20 20 20 20  nnected.**      
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
f000: 69 74 68 20 74 68 65 20 6c 6f 63 61 6c 20 72 65  ith the local re
f010: 70 6f 73 69 74 6f 72 79 2e 20 49 66 20 79 6f 75  pository. If you
f020: 20 63 6f 6d 6d 69 74 20 74 68 69 73 20 63 68 65   commit this che
f030: 63 6b 6f 75 74 2c 0a 2a 2a 20 20 20 20 20 20 20  ckout,.**       
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
f050: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6e   will become a n
f060: 65 77 20 22 69 6e 69 74 69 61 6c 22 20 63 6f 6d  ew "initial" com
f070: 6d 69 74 20 69 6e 20 74 68 65 20 72 65 70 6f 73  mit in the repos
f080: 69 74 6f 72 79 2e 0a 2a 2a 20 20 20 2d 2d 6b 65  itory..**   --ke
f090: 65 70 20 20 20 20 20 20 20 20 20 20 20 20 4f 6e  ep            On
f0a0: 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 6d 61  ly modify the ma
f0b0: 6e 69 66 65 73 74 20 61 6e 64 20 6d 61 6e 69 66  nifest and manif
f0c0: 65 73 74 2e 75 75 69 64 20 66 69 6c 65 73 0a 2a  est.uuid files.*
f0d0: 2a 20 20 20 2d 2d 6e 65 73 74 65 64 20 20 20 20  *   --nested    
f0e0: 20 20 20 20 20 20 41 6c 6c 6f 77 20 6f 70 65 6e        Allow open
f0f0: 69 6e 67 20 61 20 72 65 70 6f 73 69 74 6f 72 79  ing a repository
f100: 20 69 6e 73 69 64 65 20 61 6e 20 6f 70 65 6e 65   inside an opene
f110: 64 20 63 68 65 63 6b 6f 75 74 0a 2a 2a 20 20 20  d checkout.**   
f120: 2d 2d 66 6f 72 63 65 2d 6d 69 73 73 69 6e 67 20  --force-missing 
f130: 20 20 46 6f 72 63 65 20 6f 70 65 6e 69 6e 67 20    Force opening 
f140: 61 20 72 65 70 6f 73 69 74 6f 72 79 20 77 69 74  a repository wit
f150: 68 20 6d 69 73 73 69 6e 67 20 63 6f 6e 74 65 6e  h missing conten
f160: 74 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  t.**.** See also
f170: 3a 20 63 6c 6f 73 65 0a 2a 2f 0a 76 6f 69 64 20  : close.*/.void 
f180: 63 6d 64 5f 6f 70 65 6e 28 76 6f 69 64 29 7b 0a  cmd_open(void){.
f190: 20 20 69 6e 74 20 65 6d 70 74 79 46 6c 61 67 3b    int emptyFlag;
f1a0: 0a 20 20 69 6e 74 20 6b 65 65 70 46 6c 61 67 3b  .  int keepFlag;
f1b0: 0a 20 20 69 6e 74 20 66 6f 72 63 65 4d 69 73 73  .  int forceMiss
f1c0: 69 6e 67 46 6c 61 67 3b 0a 20 20 69 6e 74 20 61  ingFlag;.  int a
f1d0: 6c 6c 6f 77 4e 65 73 74 65 64 3b 0a 20 20 63 68  llowNested;.  ch
f1e0: 61 72 20 2a 2a 6f 6c 64 41 72 67 76 3b 0a 20 20  ar **oldArgv;.  
f1f0: 69 6e 74 20 6f 6c 64 41 72 67 63 3b 0a 20 20 73  int oldArgc;.  s
f200: 74 61 74 69 63 20 63 68 61 72 20 2a 61 7a 4e 65  tatic char *azNe
f210: 77 41 72 67 76 5b 5d 20 3d 20 7b 20 30 2c 20 22  wArgv[] = { 0, "
f220: 63 68 65 63 6b 6f 75 74 22 2c 20 22 2d 2d 70 72  checkout", "--pr
f230: 6f 6d 70 74 22 2c 20 30 2c 20 30 2c 20 30 2c 20  ompt", 0, 0, 0, 
f240: 30 20 7d 3b 0a 0a 20 20 75 72 6c 5f 70 72 6f 78  0 };..  url_prox
f250: 79 5f 6f 70 74 69 6f 6e 73 28 29 3b 0a 20 20 65  y_options();.  e
f260: 6d 70 74 79 46 6c 61 67 20 3d 20 66 69 6e 64 5f  mptyFlag = find_
f270: 6f 70 74 69 6f 6e 28 22 65 6d 70 74 79 22 2c 30  option("empty",0
f280: 2c 30 29 21 3d 30 3b 0a 20 20 6b 65 65 70 46 6c  ,0)!=0;.  keepFl
f290: 61 67 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e  ag = find_option
f2a0: 28 22 6b 65 65 70 22 2c 30 2c 30 29 21 3d 30 3b  ("keep",0,0)!=0;
f2b0: 0a 20 20 66 6f 72 63 65 4d 69 73 73 69 6e 67 46  .  forceMissingF
f2c0: 6c 61 67 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f  lag = find_optio
f2d0: 6e 28 22 66 6f 72 63 65 2d 6d 69 73 73 69 6e 67  n("force-missing
f2e0: 22 2c 30 2c 30 29 21 3d 30 3b 0a 20 20 61 6c 6c  ",0,0)!=0;.  all
f2f0: 6f 77 4e 65 73 74 65 64 20 3d 20 66 69 6e 64 5f  owNested = find_
f300: 6f 70 74 69 6f 6e 28 22 6e 65 73 74 65 64 22 2c  option("nested",
f310: 30 2c 30 29 21 3d 30 3b 0a 20 20 69 66 28 20 67  0,0)!=0;.  if( g
f320: 2e 61 72 67 63 21 3d 33 20 26 26 20 67 2e 61 72  .argc!=3 && g.ar
f330: 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 75 73 61  gc!=4 ){.    usa
f340: 67 65 28 22 52 45 50 4f 53 49 54 4f 52 59 2d 46  ge("REPOSITORY-F
f350: 49 4c 45 4e 41 4d 45 20 3f 56 45 52 53 49 4f 4e  ILENAME ?VERSION
f360: 3f 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ?");.  }.  if( !
f370: 61 6c 6c 6f 77 4e 65 73 74 65 64 20 26 26 20 64  allowNested && d
f380: 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 30 29 20  b_open_local(0) 
f390: 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61  ){.    fossil_fa
f3a0: 74 61 6c 28 22 61 6c 72 65 61 64 79 20 77 69 74  tal("already wit
f3b0: 68 69 6e 20 61 6e 20 6f 70 65 6e 20 74 72 65 65  hin an open tree
f3c0: 20 72 6f 6f 74 65 64 20 61 74 20 25 73 22 2c 20   rooted at %s", 
f3d0: 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20  g.zLocalRoot);. 
f3e0: 20 7d 0a 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70   }.  db_open_rep
f3f0: 6f 73 69 74 6f 72 79 28 67 2e 61 72 67 76 5b 32  ository(g.argv[2
f400: 5d 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ]);.#if defined(
f410: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
f420: 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 23  ed(__CYGWIN__).#
f430: 20 64 65 66 69 6e 65 20 4c 4f 43 41 4c 44 42 5f   define LOCALDB_
f440: 4e 41 4d 45 20 22 2e 2f 5f 46 4f 53 53 49 4c 5f  NAME "./_FOSSIL_
f450: 22 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ".#else.# define
f460: 20 4c 4f 43 41 4c 44 42 5f 4e 41 4d 45 20 22 2e   LOCALDB_NAME ".
f470: 2f 2e 66 73 6c 63 6b 6f 75 74 22 0a 23 65 6e 64  /.fslckout".#end
f480: 69 66 0a 20 20 64 62 5f 69 6e 69 74 5f 64 61 74  if.  db_init_dat
f490: 61 62 61 73 65 28 4c 4f 43 41 4c 44 42 5f 4e 41  abase(LOCALDB_NA
f4a0: 4d 45 2c 20 7a 4c 6f 63 61 6c 53 63 68 65 6d 61  ME, zLocalSchema
f4b0: 2c 0a 23 69 66 64 65 66 20 46 4f 53 53 49 4c 5f  ,.#ifdef FOSSIL_
f4c0: 4c 4f 43 41 4c 5f 57 41 4c 0a 20 20 20 20 20 20  LOCAL_WAL.      
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43 4f               "CO
f4e0: 4d 4d 49 54 3b 20 50 52 41 47 4d 41 20 6a 6f 75  MMIT; PRAGMA jou
f4f0: 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41 4c 3b 20 42  rnal_mode=WAL; B
f500: 45 47 49 4e 3b 22 2c 0a 23 65 6e 64 69 66 0a 20  EGIN;",.#endif. 
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 64    (char*)0);.  d
f530: 62 5f 64 65 6c 65 74 65 5f 6f 6e 5f 66 61 69 6c  b_delete_on_fail
f540: 75 72 65 28 4c 4f 43 41 4c 44 42 5f 4e 41 4d 45  ure(LOCALDB_NAME
f550: 29 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63  );.  db_open_loc
f560: 61 6c 28 30 29 3b 0a 20 20 64 62 5f 6c 73 65 74  al(0);.  db_lset
f570: 28 22 72 65 70 6f 73 69 74 6f 72 79 22 2c 20 67  ("repository", g
f580: 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 64 62 5f  .argv[2]);.  db_
f590: 72 65 63 6f 72 64 5f 72 65 70 6f 73 69 74 6f 72  record_repositor
f5a0: 79 5f 66 69 6c 65 6e 61 6d 65 28 67 2e 61 72 67  y_filename(g.arg
f5b0: 76 5b 32 5d 29 3b 0a 20 20 64 62 5f 6c 73 65 74  v[2]);.  db_lset
f5c0: 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75 74 22 2c  _int("checkout",
f5d0: 20 30 29 3b 0a 20 20 6f 6c 64 41 72 67 76 20 3d   0);.  oldArgv =
f5e0: 20 67 2e 61 72 67 76 3b 0a 20 20 6f 6c 64 41 72   g.argv;.  oldAr
f5f0: 67 63 20 3d 20 67 2e 61 72 67 63 3b 0a 20 20 61  gc = g.argc;.  a
f600: 7a 4e 65 77 41 72 67 76 5b 30 5d 20 3d 20 67 2e  zNewArgv[0] = g.
f610: 61 72 67 76 5b 30 5d 3b 0a 20 20 67 2e 61 72 67  argv[0];.  g.arg
f620: 76 20 3d 20 61 7a 4e 65 77 41 72 67 76 3b 0a 20  v = azNewArgv;. 
f630: 20 69 66 28 20 21 65 6d 70 74 79 46 6c 61 67 20   if( !emptyFlag 
f640: 29 7b 0a 20 20 20 20 67 2e 61 72 67 63 20 3d 20  ){.    g.argc = 
f650: 33 3b 0a 20 20 20 20 69 66 28 20 6f 6c 64 41 72  3;.    if( oldAr
f660: 67 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 61  gc==4 ){.      a
f670: 7a 4e 65 77 41 72 67 76 5b 67 2e 61 72 67 63 2d  zNewArgv[g.argc-
f680: 31 5d 20 3d 20 6f 6c 64 41 72 67 76 5b 33 5d 3b  1] = oldArgv[3];
f690: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
f6a0: 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43  db_exists("SELEC
f6b0: 54 20 31 20 46 52 4f 4d 20 65 76 65 6e 74 20 57  T 1 FROM event W
f6c0: 48 45 52 45 20 74 79 70 65 3d 27 63 69 27 22 29  HERE type='ci'")
f6d0: 20 29 7b 0a 20 20 20 20 20 20 61 7a 4e 65 77 41   ){.      azNewA
f6e0: 72 67 76 5b 67 2e 61 72 67 63 2d 31 5d 20 3d 20  rgv[g.argc-1] = 
f6f0: 22 2d 2d 6c 61 74 65 73 74 22 3b 0a 20 20 20 20  "--latest";.    
f700: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a 4e  }else{.      azN
f710: 65 77 41 72 67 76 5b 67 2e 61 72 67 63 2d 31 5d  ewArgv[g.argc-1]
f720: 20 3d 20 64 62 5f 67 65 74 28 22 6d 61 69 6e 2d   = db_get("main-
f730: 62 72 61 6e 63 68 22 2c 20 22 74 72 75 6e 6b 22  branch", "trunk"
f740: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
f750: 20 6b 65 65 70 46 6c 61 67 20 29 7b 0a 20 20 20   keepFlag ){.   
f760: 20 20 20 61 7a 4e 65 77 41 72 67 76 5b 67 2e 61     azNewArgv[g.a
f770: 72 67 63 2b 2b 5d 20 3d 20 22 2d 2d 6b 65 65 70  rgc++] = "--keep
f780: 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ";.    }.    if(
f790: 20 66 6f 72 63 65 4d 69 73 73 69 6e 67 46 6c 61   forceMissingFla
f7a0: 67 20 29 7b 0a 20 20 20 20 20 20 61 7a 4e 65 77  g ){.      azNew
f7b0: 41 72 67 76 5b 67 2e 61 72 67 63 2b 2b 5d 20 3d  Argv[g.argc++] =
f7c0: 20 22 2d 2d 66 6f 72 63 65 2d 6d 69 73 73 69 6e   "--force-missin
f7d0: 67 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 68  g";.    }.    ch
f7e0: 65 63 6b 6f 75 74 5f 63 6d 64 28 29 3b 0a 20 20  eckout_cmd();.  
f7f0: 7d 0a 20 20 67 2e 61 72 67 63 20 3d 20 32 3b 0a  }.  g.argc = 2;.
f800: 20 20 69 6e 66 6f 5f 63 6d 64 28 29 3b 0a 7d 0a    info_cmd();.}.
f810: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
f820: 20 76 61 6c 75 65 20 6f 66 20 61 20 73 65 74 74   value of a sett
f830: 69 6e 67 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 0a  ing named zName.
f840: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
f850: 72 69 6e 74 5f 73 65 74 74 69 6e 67 28 0a 20 20  rint_setting(.  
f860: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 43  const struct stC
f870: 6f 6e 74 72 6f 6c 53 65 74 74 69 6e 67 73 20 2a  ontrolSettings *
f880: 63 74 72 6c 53 65 74 74 69 6e 67 2c 0a 20 20 69  ctrlSetting,.  i
f890: 6e 74 20 6c 6f 63 61 6c 4f 70 65 6e 0a 29 7b 0a  nt localOpen.){.
f8a0: 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 66 28 20    Stmt q;.  if( 
f8b0: 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e  g.repositoryOpen
f8c0: 20 29 7b 0a 20 20 20 20 64 62 5f 70 72 65 70 61   ){.    db_prepa
f8d0: 72 65 28 26 71 2c 0a 20 20 20 20 20 20 20 22 53  re(&q,.       "S
f8e0: 45 4c 45 43 54 20 27 28 6c 6f 63 61 6c 29 27 2c  ELECT '(local)',
f8f0: 20 76 61 6c 75 65 20 46 52 4f 4d 20 63 6f 6e 66   value FROM conf
f900: 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ig WHERE name=%Q
f910: 22 0a 20 20 20 20 20 20 20 22 20 55 4e 49 4f 4e  ".       " UNION
f920: 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 20 22 53   ALL ".       "S
f930: 45 4c 45 43 54 20 27 28 67 6c 6f 62 61 6c 29 27  ELECT '(global)'
f940: 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20 67 6c 6f  , value FROM glo
f950: 62 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45 52 45  bal_config WHERE
f960: 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
f970: 20 20 63 74 72 6c 53 65 74 74 69 6e 67 2d 3e 6e    ctrlSetting->n
f980: 61 6d 65 2c 20 63 74 72 6c 53 65 74 74 69 6e 67  ame, ctrlSetting
f990: 2d 3e 6e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  ->name.    );.  
f9a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 5f 70 72  }else{.    db_pr
f9b0: 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20 20 20  epare(&q,.      
f9c0: 22 53 45 4c 45 43 54 20 27 28 67 6c 6f 62 61 6c  "SELECT '(global
f9d0: 29 27 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20 67  )', value FROM g
f9e0: 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45  lobal_config WHE
f9f0: 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
fa00: 20 20 20 63 74 72 6c 53 65 74 74 69 6e 67 2d 3e     ctrlSetting->
fa10: 6e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  name.    );.  }.
fa20: 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 71    if( db_step(&q
fa30: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
fa40: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e  .    fossil_prin
fa50: 74 28 22 25 2d 32 30 73 20 25 2d 38 73 20 25 73  t("%-20s %-8s %s
fa60: 5c 6e 22 2c 20 63 74 72 6c 53 65 74 74 69 6e 67  \n", ctrlSetting
fa70: 2d 3e 6e 61 6d 65 2c 20 64 62 5f 63 6f 6c 75 6d  ->name, db_colum
fa80: 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 2c 0a 20  n_text(&q, 0),. 
fa90: 20 20 20 20 20 20 20 64 62 5f 63 6f 6c 75 6d 6e         db_column
faa0: 5f 74 65 78 74 28 26 71 2c 20 31 29 29 3b 0a 20  _text(&q, 1));. 
fab0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 73 73   }else{.    foss
fac0: 69 6c 5f 70 72 69 6e 74 28 22 25 2d 32 30 73 5c  il_print("%-20s\
fad0: 6e 22 2c 20 63 74 72 6c 53 65 74 74 69 6e 67 2d  n", ctrlSetting-
fae0: 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66  >name);.  }.  if
faf0: 28 20 63 74 72 6c 53 65 74 74 69 6e 67 2d 3e 76  ( ctrlSetting->v
fb00: 65 72 73 69 6f 6e 61 62 6c 65 20 26 26 20 6c 6f  ersionable && lo
fb10: 63 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 2f  calOpen ){.    /
fb20: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
fb30: 66 20 74 68 69 73 20 69 73 20 6f 76 65 72 72 69  f this is overri
fb40: 64 64 65 6e 20 62 79 20 61 20 76 65 72 73 69 6f  dden by a versio
fb50: 6e 61 62 6c 65 20 73 65 74 74 69 6e 67 73 20 66  nable settings f
fb60: 69 6c 65 20 2a 2f 0a 20 20 20 20 42 6c 6f 62 20  ile */.    Blob 
fb70: 76 65 72 73 69 6f 6e 65 64 50 61 74 68 6e 61 6d  versionedPathnam
fb80: 65 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f  e;.    blob_zero
fb90: 28 26 76 65 72 73 69 6f 6e 65 64 50 61 74 68 6e  (&versionedPathn
fba0: 61 6d 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61  ame);.    blob_a
fbb0: 70 70 65 6e 64 66 28 26 76 65 72 73 69 6f 6e 65  ppendf(&versione
fbc0: 64 50 61 74 68 6e 61 6d 65 2c 20 22 25 73 2f 2e  dPathname, "%s/.
fbd0: 66 6f 73 73 69 6c 2d 73 65 74 74 69 6e 67 73 2f  fossil-settings/
fbe0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
fbf0: 20 20 20 20 20 20 67 2e 7a 4c 6f 63 61 6c 52 6f        g.zLocalRo
fc00: 6f 74 2c 20 63 74 72 6c 53 65 74 74 69 6e 67 2d  ot, ctrlSetting-
fc10: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  >name);.    if( 
fc20: 66 69 6c 65 5f 73 69 7a 65 28 62 6c 6f 62 5f 73  file_size(blob_s
fc30: 74 72 28 26 76 65 72 73 69 6f 6e 65 64 50 61 74  tr(&versionedPat
fc40: 68 6e 61 6d 65 29 29 3e 3d 30 20 29 7b 0a 20 20  hname))>=0 ){.  
fc50: 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74      fossil_print
fc60: 28 22 20 20 28 6f 76 65 72 72 69 64 64 65 6e 20  ("  (overridden 
fc70: 62 79 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 66  by contents of f
fc80: 69 6c 65 20 2e 66 6f 73 73 69 6c 2d 73 65 74 74  ile .fossil-sett
fc90: 69 6e 67 73 2f 25 73 29 5c 6e 22 2c 0a 20 20 20  ings/%s)\n",.   
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcb0: 63 74 72 6c 53 65 74 74 69 6e 67 2d 3e 6e 61 6d  ctrlSetting->nam
fcc0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
fcd0: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b  db_finalize(&q);
fce0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 64 65 66 69 6e  .}.../*.** defin
fcf0: 65 20 61 6c 6c 20 73 65 74 74 69 6e 67 73 2c 20  e all settings, 
fd00: 77 68 69 63 68 20 63 61 6e 20 62 65 20 63 6f 6e  which can be con
fd10: 74 72 6f 6c 6c 65 64 20 76 69 61 20 74 68 65 20  trolled via the 
fd20: 73 65 74 2f 75 6e 73 65 74 0a 2a 2a 20 63 6f 6d  set/unset.** com
fd30: 6d 61 6e 64 2e 20 76 61 72 20 69 73 20 74 68 65  mand. var is the
fd40: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 74   name of the int
fd50: 65 72 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ernal configurat
fd60: 69 6f 6e 20 6e 61 6d 65 20 66 6f 72 20 64 62 5f  ion name for db_
fd70: 28 75 6e 29 73 65 74 2e 0a 2a 2a 20 49 66 20 76  (un)set..** If v
fd80: 61 72 20 69 73 20 30 2c 20 74 68 65 20 73 65 74  ar is 0, the set
fd90: 74 69 6e 67 73 20 6e 61 6d 65 20 69 73 20 75 73  tings name is us
fda0: 65 64 2e 0a 2a 2a 20 77 69 64 74 68 20 69 73 20  ed..** width is 
fdb0: 74 68 65 20 6c 65 6e 67 74 68 20 66 6f 72 20 74  the length for t
fdc0: 68 65 20 65 64 69 74 20 66 69 65 6c 64 20 6f 6e  he edit field on
fdd0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 70 61   the behavior pa
fde0: 67 65 2c 20 30 0a 2a 2a 20 69 73 20 75 73 65 64  ge, 0.** is used
fdf0: 20 66 6f 72 20 6f 6e 2f 6f 66 66 20 63 68 65 63   for on/off chec
fe00: 6b 62 6f 78 65 73 2e 0a 2a 2a 20 54 68 65 20 62  kboxes..** The b
fe10: 65 68 61 76 69 6f 75 72 20 70 61 67 65 20 64 6f  ehaviour page do
fe20: 65 73 6e 27 74 20 75 73 65 20 61 20 73 70 65 63  esn't use a spec
fe30: 69 61 6c 20 6c 61 79 6f 75 74 2e 20 49 74 20 6c  ial layout. It l
fe40: 69 73 74 73 20 61 6c 6c 0a 2a 2a 20 73 65 74 2d  ists all.** set-
fe50: 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 64 69 73  commands and dis
fe60: 70 6c 61 79 73 20 74 68 65 20 27 73 65 74 27 2d  plays the 'set'-
fe70: 68 65 6c 70 20 61 73 20 69 6e 66 6f 2e 0a 2a 2f  help as info..*/
fe80: 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a 73  .#if INTERFACE.s
fe90: 74 72 75 63 74 20 73 74 43 6f 6e 74 72 6f 6c 53  truct stControlS
fea0: 65 74 74 69 6e 67 73 20 7b 0a 20 20 63 68 61 72  ettings {.  char
feb0: 20 63 6f 6e 73 74 20 2a 6e 61 6d 65 3b 20 20 20   const *name;   
fec0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
fed0: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 63 68   setting */.  ch
fee0: 61 72 20 63 6f 6e 73 74 20 2a 76 61 72 3b 20 20  ar const *var;  
fef0: 20 20 20 20 2f 2a 20 49 6e 74 65 72 6e 61 6c 20      /* Internal 
ff00: 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 20 75 73  variable name us
ff10: 65 64 20 62 79 20 64 62 5f 73 65 74 28 29 20 2a  ed by db_set() *
ff20: 2f 0a 20 20 69 6e 74 20 77 69 64 74 68 3b 20 20  /.  int width;  
ff30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 64            /* Wid
ff40: 74 68 20 6f 66 20 64 69 73 70 6c 61 79 2e 20 20  th of display.  
ff50: 30 20 66 6f 72 20 62 6f 6f 6c 65 61 6e 20 76 61  0 for boolean va
ff60: 6c 75 65 73 2e 20 2a 2f 0a 20 20 69 6e 74 20 76  lues. */.  int v
ff70: 65 72 73 69 6f 6e 61 62 6c 65 3b 20 20 20 20 20  ersionable;     
ff80: 20 2f 2a 20 49 73 20 74 68 69 73 20 73 65 74 74   /* Is this sett
ff90: 69 6e 67 20 76 65 72 73 69 6f 6e 61 62 6c 65 3f  ing versionable?
ffa0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6f 72 63 65 54   */.  int forceT
ffb0: 65 78 74 41 72 65 61 3b 20 20 20 20 2f 2a 20 46  extArea;    /* F
ffc0: 6f 72 63 65 20 75 73 69 6e 67 20 61 20 74 65 78  orce using a tex
ffd0: 74 20 61 72 65 61 20 66 6f 72 20 64 69 73 70 6c  t area for displ
ffe0: 61 79 3f 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ay? */.  char co
fff0: 6e 73 74 20 2a 64 65 66 3b 20 20 20 20 20 20 2f  nst *def;      /
10000 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
10010 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  */.};.#endif /* 
10020 49 4e 54 45 52 46 41 43 45 20 2a 2f 0a 73 74 72  INTERFACE */.str
10030 75 63 74 20 73 74 43 6f 6e 74 72 6f 6c 53 65 74  uct stControlSet
10040 74 69 6e 67 73 20 63 6f 6e 73 74 20 63 74 72 6c  tings const ctrl
10050 53 65 74 74 69 6e 67 73 5b 5d 20 3d 20 7b 0a 20  Settings[] = {. 
10060 20 7b 20 22 61 63 63 65 73 73 2d 6c 6f 67 22 2c   { "access-log",
10070 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
10080 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20         0, 0, 0, 
10090 22 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20  "off"           
100a0 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 61 6c        },.  { "al
100b0 6c 6f 77 2d 73 79 6d 6c 69 6e 6b 73 22 2c 20 20  low-symlinks",  
100c0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
100d0 20 30 2c 20 31 2c 20 30 2c 20 22 6f 66 66 22 20   0, 1, 0, "off" 
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 7d 2c 0a 20 20 7b 20 22 61 75 74 6f 2d 63 61 70  },.  { "auto-cap
10100 74 63 68 61 22 2c 20 20 20 20 20 22 61 75 74 6f  tcha",     "auto
10110 63 61 70 74 63 68 61 22 2c 20 20 30 2c 20 30 2c  captcha",  0, 0,
10120 20 30 2c 20 22 6f 6e 22 20 20 20 20 20 20 20 20   0, "on"        
10130 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
10140 20 22 61 75 74 6f 2d 68 79 70 65 72 6c 69 6e 6b   "auto-hyperlink
10150 22 2c 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  ",   0,         
10160 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 22 6f       0, 0, 0, "o
10170 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  n",             
10180 20 20 20 20 7d 2c 0a 20 20 7b 20 22 61 75 74 6f      },.  { "auto
10190 2d 73 68 75 6e 22 2c 20 20 20 20 20 20 20 20 30  -shun",        0
101a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
101b0 2c 20 30 2c 20 30 2c 20 22 6f 6e 22 20 20 20 20  , 0, 0, "on"    
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
101d0 0a 20 20 7b 20 22 61 75 74 6f 73 79 6e 63 22 2c  .  { "autosync",
101e0 20 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20           0,     
101f0 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30           0, 0, 0
10200 2c 20 22 6f 6e 22 20 20 20 20 20 20 20 20 20 20  , "on"          
10210 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
10220 61 75 74 6f 73 79 6e 63 2d 74 72 69 65 73 22 2c  autosync-tries",
10230 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
10240 20 20 20 30 2c 20 30 2c 20 30 2c 20 22 22 20 20     0, 0, 0, ""  
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10260 20 20 7d 2c 0a 20 20 7b 20 22 62 69 6e 61 72 79    },.  { "binary
10270 2d 67 6c 6f 62 22 2c 20 20 20 20 20 20 30 2c 20  -glob",      0, 
10280 20 20 20 20 20 20 20 20 20 20 20 20 34 30 2c 20              40, 
10290 31 2c 20 30 2c 20 22 22 20 20 20 20 20 20 20 20  1, 0, ""        
102a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
102b0 20 7b 20 22 63 6c 65 61 72 73 69 67 6e 22 2c 20   { "clearsign", 
102c0 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
102d0 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20         0, 0, 0, 
102e0 22 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20  "off"           
102f0 20 20 20 20 20 20 7d 2c 0a 23 69 66 20 64 65 66        },.#if def
10300 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
10310 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
10320 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  __) || defined(_
10330 5f 44 41 52 57 49 4e 5f 5f 29 20 7c 7c 20 5c 0a  _DARWIN__) || \.
10340 20 20 20 20 64 65 66 69 6e 65 64 28 5f 5f 41 50      defined(__AP
10350 50 4c 45 5f 5f 29 0a 20 20 7b 20 22 63 61 73 65  PLE__).  { "case
10360 2d 73 65 6e 73 69 74 69 76 65 22 2c 20 20 20 30  -sensitive",   0
10370 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
10380 2c 20 30 2c 20 30 2c 20 22 6f 66 66 22 20 20 20  , 0, 0, "off"   
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
103a0 0a 23 65 6c 73 65 0a 20 20 7b 20 22 63 61 73 65  .#else.  { "case
103b0 2d 73 65 6e 73 69 74 69 76 65 22 2c 20 20 20 30  -sensitive",   0
103c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
103d0 2c 20 30 2c 20 30 2c 20 22 6f 6e 22 20 20 20 20  , 0, 0, "on"    
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
103f0 0a 23 65 6e 64 69 66 0a 20 20 7b 20 22 63 6c 65  .#endif.  { "cle
10400 61 6e 2d 67 6c 6f 62 22 2c 20 20 20 20 20 20 20  an-glob",       
10410 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 34  0,             4
10420 30 2c 20 31 2c 20 30 2c 20 22 22 20 20 20 20 20  0, 1, 0, ""     
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10440 2c 0a 20 20 7b 20 22 63 72 6e 6c 2d 67 6c 6f 62  ,.  { "crnl-glob
10450 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20 20  ",        0,    
10460 20 20 20 20 20 20 20 20 20 34 30 2c 20 31 2c 20           40, 1, 
10470 30 2c 20 22 22 20 20 20 20 20 20 20 20 20 20 20  0, ""           
10480 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
10490 22 64 65 66 61 75 6c 74 2d 70 65 72 6d 73 22 2c  "default-perms",
104a0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
104b0 20 20 20 31 36 2c 20 30 2c 20 30 2c 20 22 75 22     16, 0, 0, "u"
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104d0 20 20 20 7d 2c 0a 20 20 7b 20 22 64 69 66 66 2d     },.  { "diff-
104e0 62 69 6e 61 72 79 22 2c 20 20 20 20 20 20 30 2c  binary",      0,
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
10500 20 30 2c 20 30 2c 20 22 6f 6e 22 20 20 20 20 20   0, 0, "on"     
10510 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
10520 20 20 7b 20 22 64 69 66 66 2d 63 6f 6d 6d 61 6e    { "diff-comman
10530 64 22 2c 20 20 20 20 20 30 2c 20 20 20 20 20 20  d",     0,      
10540 20 20 20 20 20 20 20 34 30 2c 20 30 2c 20 30 2c         40, 0, 0,
10550 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20 20   ""             
10560 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 64         },.  { "d
10570 6f 6e 74 2d 70 75 73 68 22 2c 20 20 20 20 20 20  ont-push",      
10580 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
10590 20 20 30 2c 20 30 2c 20 30 2c 20 22 6f 66 66 22    0, 0, 0, "off"
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105b0 20 7d 2c 0a 20 20 7b 20 22 65 64 69 74 6f 72 22   },.  { "editor"
105c0 2c 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 20  ,           0,  
105d0 20 20 20 20 20 20 20 20 20 20 20 33 32 2c 20 30             32, 0
105e0 2c 20 30 2c 20 22 22 20 20 20 20 20 20 20 20 20  , 0, ""         
105f0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
10600 7b 20 22 65 6d 70 74 79 2d 64 69 72 73 22 2c 20  { "empty-dirs", 
10610 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
10620 20 20 20 20 20 34 30 2c 20 31 2c 20 30 2c 20 22       40, 1, 0, "
10630 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
10640 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 65 6e 63       },.  { "enc
10650 6f 64 69 6e 67 2d 67 6c 6f 62 22 2c 20 20 20 20  oding-glob",    
10660 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 34  0,             4
10670 30 2c 20 31 2c 20 30 2c 20 22 22 20 20 20 20 20  0, 1, 0, ""     
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10690 2c 0a 20 20 7b 20 22 67 64 69 66 66 2d 63 6f 6d  ,.  { "gdiff-com
106a0 6d 61 6e 64 22 2c 20 20 20 20 30 2c 20 20 20 20  mand",    0,    
106b0 20 20 20 20 20 20 20 20 20 34 30 2c 20 30 2c 20           40, 0, 
106c0 30 2c 20 22 67 64 69 66 66 22 20 20 20 20 20 20  0, "gdiff"      
106d0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
106e0 22 67 6d 65 72 67 65 2d 63 6f 6d 6d 61 6e 64 22  "gmerge-command"
106f0 2c 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  ,   0,          
10700 20 20 20 34 30 2c 20 30 2c 20 30 2c 20 22 22 20     40, 0, 0, "" 
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 20 20 7d 2c 0a 20 20 7b 20 22 68 74 74 70 2d     },.  { "http-
10730 70 6f 72 74 22 2c 20 20 20 20 20 20 20 20 30 2c  port",        0,
10740 20 20 20 20 20 20 20 20 20 20 20 20 20 31 36 2c               16,
10750 20 30 2c 20 30 2c 20 22 38 30 38 30 22 20 20 20   0, 0, "8080"   
10760 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
10770 20 20 7b 20 22 68 74 74 70 73 2d 6c 6f 67 69 6e    { "https-login
10780 22 2c 20 20 20 20 20 20 30 2c 20 20 20 20 20 20  ",      0,      
10790 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c          0, 0, 0,
107a0 20 22 6f 66 66 22 20 20 20 20 20 20 20 20 20 20   "off"          
107b0 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 69         },.  { "i
107c0 67 6e 6f 72 65 2d 67 6c 6f 62 22 2c 20 20 20 20  gnore-glob",    
107d0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
107e0 20 34 30 2c 20 31 2c 20 30 2c 20 22 22 20 20 20   40, 1, 0, ""   
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10800 20 7d 2c 0a 20 20 7b 20 22 6b 65 65 70 2d 67 6c   },.  { "keep-gl
10810 6f 62 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20  ob",        0,  
10820 20 20 20 20 20 20 20 20 20 20 20 34 30 2c 20 31             40, 1
10830 2c 20 30 2c 20 22 22 20 20 20 20 20 20 20 20 20  , 0, ""         
10840 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
10850 7b 20 22 6c 6f 63 61 6c 61 75 74 68 22 2c 20 20  { "localauth",  
10860 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
10870 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 22        0, 0, 0, "
10880 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20  off"            
10890 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6d 61 69       },.  { "mai
108a0 6e 2d 62 72 61 6e 63 68 22 2c 20 20 20 20 20 20  n-branch",      
108b0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 34  0,             4
108c0 30 2c 20 30 2c 20 30 2c 20 22 74 72 75 6e 6b 22  0, 0, 0, "trunk"
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
108e0 2c 0a 20 20 7b 20 22 6d 61 6e 69 66 65 73 74 22  ,.  { "manifest"
108f0 2c 20 20 20 20 20 20 20 20 20 30 2c 20 20 20 20  ,         0,    
10900 20 20 20 20 20 20 20 20 20 20 30 2c 20 31 2c 20            0, 1, 
10910 30 2c 20 22 6f 66 66 22 20 20 20 20 20 20 20 20  0, "off"        
10920 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
10930 22 6d 61 78 2d 6c 6f 61 64 61 76 67 22 2c 20 20  "max-loadavg",  
10940 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
10950 20 20 20 32 35 2c 20 30 2c 20 30 2c 20 22 30 2e     25, 0, 0, "0.
10960 30 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0"              
10970 20 20 20 7d 2c 0a 20 20 7b 20 22 6d 61 78 2d 75     },.  { "max-u
10980 70 6c 6f 61 64 22 2c 20 20 20 20 20 20 20 30 2c  pload",       0,
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 32 35 2c               25,
109a0 20 30 2c 20 30 2c 20 22 32 35 30 30 30 30 22 20   0, 0, "250000" 
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
109c0 20 20 7b 20 22 6d 74 69 6d 65 2d 63 68 61 6e 67    { "mtime-chang
109d0 65 73 22 2c 20 20 20 20 30 2c 20 20 20 20 20 20  es",    0,      
109e0 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c          0, 0, 0,
109f0 20 22 6f 6e 22 20 20 20 20 20 20 20 20 20 20 20   "on"           
10a00 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 70         },.  { "p
10a10 67 70 2d 63 6f 6d 6d 61 6e 64 22 2c 20 20 20 20  gp-command",    
10a20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
10a30 20 34 30 2c 20 30 2c 20 30 2c 20 22 67 70 67 20   40, 0, 0, "gpg 
10a40 2d 2d 63 6c 65 61 72 73 69 67 6e 20 2d 6f 20 22  --clearsign -o "
10a50 20 7d 2c 0a 20 20 7b 20 22 70 72 6f 78 79 22 2c   },.  { "proxy",
10a60 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 20              0,  
10a70 20 20 20 20 20 20 20 20 20 20 20 33 32 2c 20 30             32, 0
10a80 2c 20 30 2c 20 22 6f 66 66 22 20 20 20 20 20 20  , 0, "off"      
10a90 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
10aa0 7b 20 22 72 65 6c 61 74 69 76 65 2d 70 61 74 68  { "relative-path
10ab0 73 22 2c 20 20 20 30 2c 20 20 20 20 20 20 20 20  s",   0,        
10ac0 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 22        0, 0, 0, "
10ad0 6f 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  on"             
10ae0 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 72 65 70       },.  { "rep
10af0 6f 2d 63 6b 73 75 6d 22 2c 20 20 20 20 20 20 20  o-cksum",       
10b00 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
10b10 30 2c 20 30 2c 20 30 2c 20 22 6f 6e 22 20 20 20  0, 0, 0, "on"   
10b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10b30 2c 0a 20 20 7b 20 22 73 65 6c 66 2d 72 65 67 69  ,.  { "self-regi
10b40 73 74 65 72 22 2c 20 20 20 20 30 2c 20 20 20 20  ster",    0,    
10b50 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
10b60 30 2c 20 22 6f 66 66 22 20 20 20 20 20 20 20 20  0, "off"        
10b70 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
10b80 22 73 73 68 2d 63 6f 6d 6d 61 6e 64 22 2c 20 20  "ssh-command",  
10b90 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
10ba0 20 20 20 34 30 2c 20 30 2c 20 30 2c 20 22 22 20     40, 0, 0, "" 
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bc0 20 20 20 7d 2c 0a 20 20 7b 20 22 73 73 6c 2d 63     },.  { "ssl-c
10bd0 61 2d 6c 6f 63 61 74 69 6f 6e 22 2c 20 20 30 2c  a-location",  0,
10be0 20 20 20 20 20 20 20 20 20 20 20 20 20 34 30 2c               40,
10bf0 20 30 2c 20 30 2c 20 22 22 20 20 20 20 20 20 20   0, 0, ""       
10c00 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
10c10 20 20 7b 20 22 73 73 6c 2d 69 64 65 6e 74 69 74    { "ssl-identit
10c20 79 22 2c 20 20 20 20 20 30 2c 20 20 20 20 20 20  y",     0,      
10c30 20 20 20 20 20 20 20 34 30 2c 20 30 2c 20 30 2c         40, 0, 0,
10c40 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20 20   ""             
10c50 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 64 65 66         },.#ifdef
10c60 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 54   FOSSIL_ENABLE_T
10c70 43 4c 0a 20 20 7b 20 22 74 63 6c 22 2c 20 20 20  CL.  { "tcl",   
10c80 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 20 20             0,   
10c90 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
10ca0 20 30 2c 20 22 6f 66 66 22 20 20 20 20 20 20 20   0, "off"       
10cb0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
10cc0 20 22 74 63 6c 2d 73 65 74 75 70 22 2c 20 20 20   "tcl-setup",   
10cd0 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
10ce0 20 20 20 20 34 30 2c 20 31 2c 20 31 2c 20 22 22      40, 1, 1, ""
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d00 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20      },.#endif.  
10d10 7b 20 22 74 68 31 2d 68 6f 6f 6b 73 22 2c 20 20  { "th1-hooks",  
10d20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
10d30 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 22        0, 0, 0, "
10d40 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20  off"            
10d50 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 74 68 31       },.  { "th1
10d60 2d 73 65 74 75 70 22 2c 20 20 20 20 20 20 20 20  -setup",        
10d70 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 34  0,             4
10d80 30 2c 20 31 2c 20 31 2c 20 22 22 20 20 20 20 20  0, 1, 1, ""     
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10da0 2c 0a 20 20 7b 20 22 74 68 31 2d 75 72 69 2d 72  ,.  { "th1-uri-r
10db0 65 67 65 78 70 22 2c 20 20 20 30 2c 20 20 20 20  egexp",   0,    
10dc0 20 20 20 20 20 20 20 20 20 34 30 2c 20 31 2c 20           40, 1, 
10dd0 30 2c 20 22 22 20 20 20 20 20 20 20 20 20 20 20  0, ""           
10de0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
10df0 22 77 65 62 2d 62 72 6f 77 73 65 72 22 2c 20 20  "web-browser",  
10e00 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
10e10 20 20 20 33 32 2c 20 30 2c 20 30 2c 20 22 22 20     32, 0, 0, "" 
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 20 20 20 7d 2c 0a 20 20 7b 20 22 77 68 69 74 65     },.  { "white
10e40 2d 66 6f 72 65 67 72 6f 75 6e 64 22 2c 20 30 2c  -foreground", 0,
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
10e60 20 30 2c 20 30 2c 20 22 6f 66 66 22 20 20 20 20   0, 0, "off"    
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
10e80 20 20 7b 20 30 2c 30 2c 30 2c 30 2c 30 2c 30 20    { 0,0,0,0,0,0 
10e90 7d 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d  }.};../*.** COMM
10ea0 41 4e 44 3a 20 73 65 74 74 69 6e 67 73 0a 2a 2a  AND: settings.**
10eb0 20 43 4f 4d 4d 41 4e 44 3a 20 75 6e 73 65 74 2a   COMMAND: unset*
10ec0 0a 2a 2a 0a 2a 2a 20 25 66 6f 73 73 69 6c 20 73  .**.** %fossil s
10ed0 65 74 74 69 6e 67 73 20 3f 50 52 4f 50 45 52 54  ettings ?PROPERT
10ee0 59 3f 20 3f 56 41 4c 55 45 3f 20 3f 4f 50 54 49  Y? ?VALUE? ?OPTI
10ef0 4f 4e 53 3f 0a 2a 2a 20 25 66 6f 73 73 69 6c 20  ONS?.** %fossil 
10f00 75 6e 73 65 74 20 50 52 4f 50 45 52 54 59 20 3f  unset PROPERTY ?
10f10 4f 50 54 49 4f 4e 53 3f 0a 2a 2a 0a 2a 2a 20 54  OPTIONS?.**.** T
10f20 68 65 20 22 73 65 74 74 69 6e 67 73 22 20 63 6f  he "settings" co
10f30 6d 6d 61 6e 64 20 77 69 74 68 20 6e 6f 20 61 72  mmand with no ar
10f40 67 75 6d 65 6e 74 73 20 6c 69 73 74 73 20 61 6c  guments lists al
10f50 6c 20 70 72 6f 70 65 72 74 69 65 73 20 61 6e 64  l properties and
10f60 20 74 68 65 69 72 0a 2a 2a 20 76 61 6c 75 65 73   their.** values
10f70 2e 20 20 57 69 74 68 20 6a 75 73 74 20 61 20 70  .  With just a p
10f80 72 6f 70 65 72 74 79 20 6e 61 6d 65 20 69 74 20  roperty name it 
10f90 73 68 6f 77 73 20 74 68 65 20 76 61 6c 75 65 20  shows the value 
10fa0 6f 66 20 74 68 61 74 20 70 72 6f 70 65 72 74 79  of that property
10fb0 2e 0a 2a 2a 20 57 69 74 68 20 61 20 76 61 6c 75  ..** With a valu
10fc0 65 20 61 72 67 75 6d 65 6e 74 20 69 74 20 63 68  e argument it ch
10fd0 61 6e 67 65 73 20 74 68 65 20 70 72 6f 70 65 72  anges the proper
10fe0 74 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ty for the curre
10ff0 6e 74 20 72 65 70 6f 73 69 74 6f 72 79 2e 0a 2a  nt repository..*
11000 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 73 20 6d 61  *.** Settings ma
11010 72 6b 65 64 20 61 73 20 76 65 72 73 69 6f 6e 61  rked as versiona
11020 62 6c 65 20 61 72 65 20 6f 76 65 72 72 69 64 64  ble are overridd
11030 65 6e 20 62 79 20 74 68 65 20 63 6f 6e 74 65 6e  en by the conten
11040 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ts of the.** fil
11050 65 20 6e 61 6d 65 64 20 2e 66 6f 73 73 69 6c 2d  e named .fossil-
11060 73 65 74 74 69 6e 67 73 2f 50 52 4f 50 45 52 54  settings/PROPERT
11070 59 20 69 6e 20 74 68 65 20 63 68 65 63 6b 65 64  Y in the checked
11080 20 6f 75 74 20 66 69 6c 65 73 2c 20 69 66 20 74   out files, if t
11090 68 61 74 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  hat.** file exis
110a0 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 75  ts..**.** The "u
110b0 6e 73 65 74 22 20 63 6f 6d 6d 61 6e 64 20 63 6c  nset" command cl
110c0 65 61 72 73 20 61 20 70 72 6f 70 65 72 74 79 20  ears a property 
110d0 73 65 74 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 0a 2a  setting..**.**.*
110e0 2a 20 20 20 20 61 63 63 65 73 73 2d 6c 6f 67 20  *    access-log 
110f0 20 20 20 20 20 20 49 66 20 65 6e 61 62 6c 65 64        If enabled
11100 2c 20 72 65 63 6f 72 64 20 73 75 63 63 65 73 73  , record success
11110 66 75 6c 20 61 6e 64 20 66 61 69 6c 65 64 20 6c  ful and failed l
11120 6f 67 69 6e 20 61 74 74 65 6d 70 74 73 0a 2a 2a  ogin attempts.**
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11140 20 20 20 20 20 69 6e 20 74 68 65 20 22 61 63 63       in the "acc
11150 65 73 73 6c 6f 67 22 20 74 61 62 6c 65 2e 20 20  esslog" table.  
11160 44 65 66 61 75 6c 74 3a 20 6f 66 66 0a 2a 2a 0a  Default: off.**.
11170 2a 2a 20 20 20 20 61 6c 6c 6f 77 2d 73 79 6d 6c  **    allow-syml
11180 69 6e 6b 73 20 20 20 49 66 20 65 6e 61 62 6c 65  inks   If enable
11190 64 2c 20 64 6f 6e 27 74 20 66 6f 6c 6c 6f 77 20  d, don't follow 
111a0 73 79 6d 6c 69 6e 6b 73 2c 20 61 6e 64 20 69 6e  symlinks, and in
111b0 73 74 65 61 64 20 74 72 65 61 74 0a 2a 2a 20 20  stead treat.**  
111c0 20 20 20 28 76 65 72 73 69 6f 6e 61 62 6c 65 29     (versionable)
111d0 20 20 20 74 68 65 6d 20 61 73 20 73 79 6d 6c 69     them as symli
111e0 6e 6b 73 20 6f 6e 20 55 6e 69 78 2e 20 48 61 73  nks on Unix. Has
111f0 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 57 69   no effect on Wi
11200 6e 64 6f 77 73 0a 2a 2a 20 20 20 20 20 20 20 20  ndows.**        
11210 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65 78               (ex
11220 69 73 74 69 6e 67 20 6c 69 6e 6b 73 20 69 6e 20  isting links in 
11230 72 65 70 6f 73 69 74 6f 72 79 20 63 72 65 61 74  repository creat
11240 65 64 20 6f 6e 20 55 6e 69 78 20 62 65 63 6f 6d  ed on Unix becom
11250 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
11260 20 20 20 20 20 20 20 20 20 70 6c 61 69 6e 2d 74           plain-t
11270 65 78 74 20 66 69 6c 65 73 20 77 69 74 68 20 6c  ext files with l
11280 69 6e 6b 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ink destination 
11290 70 61 74 68 20 69 6e 73 69 64 65 29 2e 0a 2a 2a  path inside)..**
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112b0 20 20 20 20 20 44 65 66 61 75 6c 74 3a 20 6f 66       Default: of
112c0 66 0a 2a 2a 0a 2a 2a 20 20 20 20 61 75 74 6f 2d  f.**.**    auto-
112d0 63 61 70 74 63 68 61 20 20 20 20 20 49 66 20 65  captcha     If e
112e0 6e 61 62 6c 65 64 2c 20 74 68 65 20 4c 6f 67 69  nabled, the Logi
112f0 6e 20 70 61 67 65 20 70 72 6f 76 69 64 65 73 20  n page provides 
11300 61 20 62 75 74 74 6f 6e 20 74 6f 0a 2a 2a 20 20  a button to.**  
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11320 20 20 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63     fill in the c
11330 61 70 74 63 68 61 20 70 61 73 73 77 6f 72 64 2e  aptcha password.
11340 20 20 44 65 66 61 75 6c 74 3a 20 6f 6e 0a 2a 2a    Default: on.**
11350 0a 2a 2a 20 20 20 20 61 75 74 6f 2d 68 79 70 65  .**    auto-hype
11360 72 6c 69 6e 6b 20 20 20 55 73 65 20 6a 61 76 61  rlink   Use java
11370 73 63 72 69 70 74 20 74 6f 20 65 6e 61 62 6c 65  script to enable
11380 20 68 79 70 65 72 6c 69 6e 6b 73 20 6f 6e 20 77   hyperlinks on w
11390 65 62 20 70 61 67 65 73 0a 2a 2a 20 20 20 20 20  eb pages.**     
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113b0 66 6f 72 20 61 6c 6c 20 75 73 65 72 73 20 28 72  for all users (r
113c0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
113d0 20 22 68 22 20 70 72 69 76 69 6c 65 67 65 29 20   "h" privilege) 
113e0 69 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  if the.**       
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73                Us
11400 65 72 2d 41 67 65 6e 74 20 73 74 72 69 6e 67 20  er-Agent string 
11410 69 6e 20 74 68 65 20 48 54 54 50 20 68 65 61 64  in the HTTP head
11420 65 72 20 6c 6f 6f 6b 20 6c 69 6b 65 20 69 74 20  er look like it 
11430 63 61 6d 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  came.**         
11440 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d              from
11450 20 72 65 61 6c 20 70 65 72 73 6f 6e 2c 20 6e 6f   real person, no
11460 74 20 61 20 73 70 69 64 65 72 20 6f 72 20 62 6f  t a spider or bo
11470 74 2e 20 20 44 65 66 61 75 6c 74 3a 20 6f 6e 0a  t.  Default: on.
11480 2a 2a 0a 2a 2a 20 20 20 20 61 75 74 6f 2d 73 68  **.**    auto-sh
11490 75 6e 20 20 20 20 20 20 20 20 49 66 20 65 6e 61  un        If ena
114a0 62 6c 65 64 2c 20 61 75 74 6f 6d 61 74 69 63 61  bled, automatica
114b0 6c 6c 79 20 70 75 6c 6c 20 74 68 65 20 73 68 75  lly pull the shu
114c0 6e 6e 69 6e 67 20 6c 69 73 74 0a 2a 2a 20 20 20  nning list.**   
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114e0 20 20 66 72 6f 6d 20 61 20 73 65 72 76 65 72 20    from a server 
114f0 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 6c 69  to which the cli
11500 65 6e 74 20 61 75 74 6f 73 79 6e 63 73 2e 0a 2a  ent autosyncs..*
11510 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
11520 20 20 20 20 20 20 44 65 66 61 75 6c 74 3a 20 6f        Default: o
11530 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 61 75 74 6f 73  n.**.**    autos
11540 79 6e 63 20 20 20 20 20 20 20 20 20 49 66 20 65  ync         If e
11550 6e 61 62 6c 65 64 2c 20 61 75 74 6f 6d 61 74 69  nabled, automati
11560 63 61 6c 6c 79 20 70 75 6c 6c 20 70 72 69 6f 72  cally pull prior
11570 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 20 20   to commit.**   
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11590 20 20 6f 72 20 75 70 64 61 74 65 20 61 6e 64 20    or update and 
115a0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 70 75  automatically pu
115b0 73 68 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 20  sh after commit 
115c0 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
115d0 20 20 20 20 20 20 20 20 20 20 74 61 67 20 6f 72            tag or
115e0 20 62 72 61 6e 63 68 20 63 72 65 61 74 69 6f 6e   branch creation
115f0 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  .  If the value 
11600 69 73 20 22 70 75 6c 6c 6f 6e 6c 79 22 0a 2a 2a  is "pullonly".**
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11620 20 20 20 20 20 74 68 65 6e 20 6f 6e 6c 79 20 70       then only p
11630 75 6c 6c 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  ull operations o
11640 63 63 75 72 20 61 75 74 6f 6d 61 74 69 63 61 6c  ccur automatical
11650 6c 79 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly..**          
11660 20 20 20 20 20 20 20 20 20 20 20 44 65 66 61 75             Defau
11670 6c 74 3a 20 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  lt: on.**.**    
11680 61 75 74 6f 73 79 6e 63 2d 74 72 69 65 73 20 20  autosync-tries  
11690 20 49 66 20 61 75 74 6f 73 79 6e 63 20 69 73 20   If autosync is 
116a0 65 6e 61 62 6c 65 64 20 73 65 74 74 69 6e 67 20  enabled setting 
116b0 74 68 69 73 20 74 6f 20 61 20 76 61 6c 75 65 20  this to a value 
116c0 67 72 65 61 74 65 72 0a 2a 2a 20 20 20 20 20 20  greater.**      
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
116e0 68 61 6e 20 7a 65 72 6f 20 77 69 6c 6c 20 63 61  han zero will ca
116f0 75 73 65 20 61 75 74 6f 73 79 6e 63 20 74 6f 20  use autosync to 
11700 74 72 79 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  try no more than
11710 20 74 68 69 73 0a 2a 2a 20 20 20 20 20 20 20 20   this.**        
11720 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
11730 62 65 72 20 6f 66 20 61 74 74 65 6d 70 74 73 20  ber of attempts 
11740 69 66 20 74 68 65 72 65 20 69 73 20 61 20 73 79  if there is a sy
11750 6e 63 20 66 61 69 6c 75 72 65 2e 0a 2a 2a 20 20  nc failure..**  
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11770 20 20 20 44 65 66 61 75 6c 74 3a 20 31 0a 2a 2a     Default: 1.**
11780 0a 2a 2a 20 20 20 20 62 69 6e 61 72 79 2d 67 6c  .**    binary-gl
11790 6f 62 20 20 20 20 20 20 54 68 65 20 56 41 4c 55  ob      The VALU
117a0 45 20 69 73 20 61 20 63 6f 6d 6d 61 20 6f 72 20  E is a comma or 
117b0 6e 65 77 6c 69 6e 65 2d 73 65 70 61 72 61 74 65  newline-separate
117c0 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20  d list of.**    
117d0 20 28 76 65 72 73 69 6f 6e 61 62 6c 65 29 20 20   (versionable)  
117e0 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20 74   GLOB patterns t
117f0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72  hat should be tr
11800 65 61 74 65 64 20 61 73 20 62 69 6e 61 72 79 20  eated as binary 
11810 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  files.**        
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
11830 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 6e 64 20   committing and 
11840 6d 65 72 67 69 6e 67 20 70 75 72 70 6f 73 65 73  merging purposes
11850 2e 20 20 45 78 61 6d 70 6c 65 3a 20 2a 2e 6a 70  .  Example: *.jp
11860 67 0a 2a 2a 0a 2a 2a 20 20 20 20 63 61 73 65 2d  g.**.**    case-
11870 73 65 6e 73 69 74 69 76 65 20 20 20 49 66 20 54  sensitive   If T
11880 52 55 45 2c 20 74 68 65 20 66 69 6c 65 73 20 77  RUE, the files w
11890 68 6f 73 65 20 6e 61 6d 65 73 20 64 69 66 66 65  hose names diffe
118a0 72 20 6f 6e 6c 79 20 69 6e 20 63 61 73 65 0a 2a  r only in case.*
118b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
118c0 20 20 20 20 20 20 61 72 65 20 63 6f 6e 73 69 64        are consid
118d0 65 72 65 64 20 64 69 73 74 69 6e 63 74 2e 20 20  ered distinct.  
118e0 49 66 20 46 41 4c 53 45 20 66 69 6c 65 73 20 77  If FALSE files w
118f0 68 6f 73 65 20 6e 61 6d 65 73 0a 2a 2a 20 20 20  hose names.**   
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e    differ only in
11920 20 63 61 73 65 20 61 72 65 20 74 68 65 20 73 61   case are the sa
11930 6d 65 20 66 69 6c 65 2e 20 20 44 65 66 61 75 6c  me file.  Defaul
11940 74 73 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ts to.**        
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 54 52 55               TRU
11960 45 20 66 6f 72 20 75 6e 69 78 20 61 6e 64 20 46  E for unix and F
11970 41 4c 53 45 20 66 6f 72 20 43 79 67 77 69 6e 2c  ALSE for Cygwin,
11980 20 4d 61 63 20 61 6e 64 20 57 69 6e 64 6f 77 73   Mac and Windows
11990 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 63 6c 65 61 6e  ..**.**    clean
119a0 2d 67 6c 6f 62 20 20 20 20 20 20 20 54 68 65 20  -glob       The 
119b0 56 41 4c 55 45 20 69 73 20 61 20 63 6f 6d 6d 61  VALUE is a comma
119c0 20 6f 72 20 6e 65 77 6c 69 6e 65 2d 73 65 70 61   or newline-sepa
119d0 72 61 74 65 64 20 6c 69 73 74 20 6f 66 20 47 4c  rated list of GL
119e0 4f 42 0a 2a 2a 20 20 20 20 20 28 76 65 72 73 69  OB.**     (versi
119f0 6f 6e 61 62 6c 65 29 20 20 20 70 61 74 74 65 72  onable)   patter
11a00 6e 73 20 73 70 65 63 69 66 79 69 6e 67 20 66 69  ns specifying fi
11a10 6c 65 73 20 74 68 61 74 20 74 68 65 20 22 63 6c  les that the "cl
11a20 65 61 6e 22 20 63 6f 6d 6d 61 6e 64 20 77 69 6c  ean" command wil
11a30 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
11a40 20 20 20 20 20 20 20 20 20 64 65 6c 65 74 65 20           delete 
11a50 77 69 74 68 6f 75 74 20 70 72 6f 6d 70 74 69 6e  without promptin
11a60 67 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 20  g even when the 
11a70 2d 66 6f 72 63 65 20 66 6c 61 67 20 68 61 73 0a  -force flag has.
11a80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11a90 20 20 20 20 20 20 20 6e 6f 74 20 62 65 65 6e 20         not been 
11aa0 75 73 65 64 2e 20 20 45 78 61 6d 70 6c 65 3a 20  used.  Example: 
11ab0 20 2a 2e 61 20 2a 2e 6c 69 62 20 2a 2e 6f 0a 2a   *.a *.lib *.o.*
11ac0 2a 0a 2a 2a 20 20 20 20 63 6c 65 61 72 73 69 67  *.**    clearsig
11ad0 6e 20 20 20 20 20 20 20 20 57 68 65 6e 20 65 6e  n        When en
11ae0 61 62 6c 65 64 2c 20 66 6f 73 73 69 6c 20 77 69  abled, fossil wi
11af0 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 73 69  ll attempt to si
11b00 67 6e 20 61 6c 6c 20 63 6f 6d 6d 69 74 73 0a 2a  gn all commits.*
11b10 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
11b20 20 20 20 20 20 20 77 69 74 68 20 67 70 67 2e 20        with gpg. 
11b30 20 57 68 65 6e 20 64 69 73 61 62 6c 65 64 20 28   When disabled (
11b40 74 68 65 20 64 65 66 61 75 6c 74 29 2c 20 63 6f  the default), co
11b50 6d 6d 69 74 73 20 77 69 6c 6c 0a 2a 2a 20 20 20  mmits will.**   
11b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b70 20 20 62 65 20 75 6e 73 69 67 6e 65 64 2e 20 20    be unsigned.  
11b80 44 65 66 61 75 6c 74 3a 20 6f 66 66 0a 2a 2a 0a  Default: off.**.
11b90 2a 2a 20 20 20 20 63 72 6e 6c 2d 67 6c 6f 62 20  **    crnl-glob 
11ba0 20 20 20 20 20 20 20 41 20 63 6f 6d 6d 61 20 6f         A comma o
11bb0 72 20 6e 65 77 6c 69 6e 65 2d 73 65 70 61 72 61  r newline-separa
11bc0 74 65 64 20 6c 69 73 74 20 6f 66 20 47 4c 4f 42  ted list of GLOB
11bd0 20 70 61 74 74 65 72 6e 73 20 66 6f 72 0a 2a 2a   patterns for.**
11be0 20 20 20 20 20 28 76 65 72 73 69 6f 6e 61 62 6c       (versionabl
11bf0 65 29 20 20 20 74 65 78 74 20 66 69 6c 65 73 20  e)   text files 
11c00 69 6e 20 77 68 69 63 68 20 69 74 20 69 73 20 6f  in which it is o
11c10 6b 20 74 6f 20 68 61 76 65 20 43 52 2c 20 43 52  k to have CR, CR
11c20 2b 4e 4c 20 6f 72 20 6d 69 78 65 64 0a 2a 2a 20  +NL or mixed.** 
11c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c40 20 20 20 20 6c 69 6e 65 20 65 6e 64 69 6e 67 73      line endings
11c50 2e 20 53 65 74 20 74 6f 20 22 2a 22 20 74 6f 20  . Set to "*" to 
11c60 64 69 73 61 62 6c 65 20 43 52 2b 4e 4c 20 63 68  disable CR+NL ch
11c70 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  ecking..**.**   
11c80 20 64 65 66 61 75 6c 74 2d 70 65 72 6d 73 20 20   default-perms  
11c90 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 67 69    Permissions gi
11ca0 76 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ven automaticall
11cb0 79 20 74 6f 20 6e 65 77 20 75 73 65 72 73 2e 20  y to new users. 
11cc0 20 46 6f 72 20 6d 6f 72 65 0a 2a 2a 20 20 20 20   For more.**    
11cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ce0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
11cf0 70 65 72 6d 69 73 73 69 6f 6e 73 20 73 65 65 20  permissions see 
11d00 55 73 65 72 73 20 70 61 67 65 20 69 6e 20 53 65  Users page in Se
11d10 72 76 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  rver.**         
11d20 20 20 20 20 20 20 20 20 20 20 20 20 41 64 6d 69              Admi
11d30 6e 69 73 74 72 61 74 69 6f 6e 20 6f 66 20 74 68  nistration of th
11d40 65 20 48 54 54 50 20 55 49 2e 20 44 65 66 61 75  e HTTP UI. Defau
11d50 6c 74 3a 20 75 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lt: u..**.**    
11d60 64 69 66 66 2d 62 69 6e 61 72 79 20 20 20 20 20  diff-binary     
11d70 20 49 66 20 54 52 55 45 20 28 74 68 65 20 64 65   If TRUE (the de
11d80 66 61 75 6c 74 29 2c 20 70 65 72 6d 69 74 20 66  fault), permit f
11d90 69 6c 65 73 20 74 68 61 74 20 6d 61 79 20 62 65  iles that may be
11da0 20 62 69 6e 61 72 79 0a 2a 2a 20 20 20 20 20 20   binary.**      
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
11dc0 72 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  r that match the
11dd0 20 22 62 69 6e 61 72 79 2d 67 6c 6f 62 22 20 73   "binary-glob" s
11de0 65 74 74 69 6e 67 20 74 6f 20 62 65 20 75 73 65  etting to be use
11df0 64 20 77 69 74 68 0a 2a 2a 20 20 20 20 20 20 20  d with.**       
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
11e10 74 65 72 6e 61 6c 20 64 69 66 66 20 70 72 6f 67  ternal diff prog
11e20 72 61 6d 73 2e 20 20 49 66 20 46 41 4c 53 45 2c  rams.  If FALSE,
11e30 20 73 6b 69 70 20 74 68 65 73 65 20 66 69 6c 65   skip these file
11e40 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 64 69 66 66  s..**.**    diff
11e50 2d 63 6f 6d 6d 61 6e 64 20 20 20 20 20 45 78 74  -command     Ext
11e60 65 72 6e 61 6c 20 63 6f 6d 6d 61 6e 64 20 74 6f  ernal command to
11e70 20 72 75 6e 20 77 68 65 6e 20 70 65 72 66 6f 72   run when perfor
11e80 6d 69 6e 67 20 61 20 64 69 66 66 2e 0a 2a 2a 20  ming a diff..** 
11e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ea0 20 20 20 20 49 66 20 75 6e 64 65 66 69 6e 65 64      If undefined
11eb0 2c 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 74  , the internal t
11ec0 65 78 74 20 64 69 66 66 20 77 69 6c 6c 20 62 65  ext diff will be
11ed0 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   used..**.**    
11ee0 64 6f 6e 74 2d 70 75 73 68 20 20 20 20 20 20 20  dont-push       
11ef0 20 50 72 65 76 65 6e 74 20 74 68 69 73 20 72 65   Prevent this re
11f00 70 6f 73 69 74 6f 72 79 20 66 72 6f 6d 20 70 75  pository from pu
11f10 73 68 69 6e 67 20 66 72 6f 6d 20 63 6c 69 65 6e  shing from clien
11f20 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  t to.**         
11f30 20 20 20 20 20 20 20 20 20 20 20 20 73 65 72 76              serv
11f40 65 72 2e 20 20 55 73 65 66 75 6c 20 77 68 65 6e  er.  Useful when
11f50 20 73 65 74 74 69 6e 67 20 75 70 20 61 20 70 72   setting up a pr
11f60 69 76 61 74 65 20 62 72 61 6e 63 68 2e 0a 2a 2a  ivate branch..**
11f70 0a 2a 2a 20 20 20 20 65 64 69 74 6f 72 20 20 20  .**    editor   
11f80 20 20 20 20 20 20 20 20 54 65 78 74 20 65 64 69          Text edi
11f90 74 6f 72 20 63 6f 6d 6d 61 6e 64 20 75 73 65 64  tor command used
11fa0 20 66 6f 72 20 63 68 65 63 6b 2d 69 6e 20 63 6f   for check-in co
11fb0 6d 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  mments..**.**   
11fc0 20 65 6d 70 74 79 2d 64 69 72 73 20 20 20 20 20   empty-dirs     
11fd0 20 20 41 20 63 6f 6d 6d 61 20 6f 72 20 6e 65 77    A comma or new
11fe0 6c 69 6e 65 2d 73 65 70 61 72 61 74 65 64 20 6c  line-separated l
11ff0 69 73 74 20 6f 66 20 70 61 74 68 6e 61 6d 65 73  ist of pathnames
12000 2e 20 4f 6e 0a 2a 2a 20 20 20 20 20 28 76 65 72  . On.**     (ver
12010 73 69 6f 6e 61 62 6c 65 29 20 20 20 75 70 64 61  sionable)   upda
12020 74 65 20 61 6e 64 20 63 68 65 63 6b 6f 75 74 20  te and checkout 
12030 63 6f 6d 6d 61 6e 64 73 2c 20 69 66 20 6e 6f 20  commands, if no 
12040 66 69 6c 65 20 6f 72 20 64 69 72 65 63 74 6f 72  file or director
12050 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
12060 20 20 20 20 20 20 20 20 20 65 78 69 73 74 73 20           exists 
12070 77 69 74 68 20 74 68 61 74 20 6e 61 6d 65 2c 20  with that name, 
12080 61 6e 20 65 6d 70 74 79 20 64 69 72 65 63 74 6f  an empty directo
12090 72 79 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20 20  ry will be.**   
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120b0 20 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a    created..**.**
120c0 20 20 20 20 65 6e 63 6f 64 69 6e 67 2d 67 6c 6f      encoding-glo
120d0 62 20 20 20 20 54 68 65 20 56 41 4c 55 45 20 69  b    The VALUE i
120e0 73 20 61 20 63 6f 6d 6d 61 20 6f 72 20 6e 65 77  s a comma or new
120f0 6c 69 6e 65 2d 73 65 70 61 72 61 74 65 64 20 6c  line-separated l
12100 69 73 74 20 6f 66 20 47 4c 4f 42 0a 2a 2a 20 20  ist of GLOB.**  
12110 20 20 20 28 76 65 72 73 69 6f 6e 61 62 6c 65 29     (versionable)
12120 20 20 20 70 61 74 74 65 72 6e 73 20 73 70 65 63     patterns spec
12130 69 66 79 69 6e 67 20 66 69 6c 65 73 20 74 68 61  ifying files tha
12140 74 20 74 68 65 20 22 63 6f 6d 6d 69 74 22 20 63  t the "commit" c
12150 6f 6d 6d 61 6e 64 20 77 69 6c 6c 0a 2a 2a 20 20  ommand will.**  
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12170 20 20 20 69 67 6e 6f 72 65 20 77 68 65 6e 20 69     ignore when i
12180 73 73 75 69 6e 67 20 77 61 72 6e 69 6e 67 73 20  ssuing warnings 
12190 61 62 6f 75 74 20 74 65 78 74 20 66 69 6c 65 73  about text files
121a0 20 74 68 61 74 20 6d 61 79 0a 2a 2a 20 20 20 20   that may.**    
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121c0 20 75 73 65 20 61 6e 6f 74 68 65 72 20 65 6e 63   use another enc
121d0 6f 64 69 6e 67 20 74 68 61 6e 20 41 53 43 49 49  oding than ASCII
121e0 20 6f 72 20 55 54 46 2d 38 2e 20 53 65 74 20 74   or UTF-8. Set t
121f0 6f 20 22 2a 22 0a 2a 2a 20 20 20 20 20 20 20 20  o "*".**        
12200 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20               to 
12210 64 69 73 61 62 6c 65 20 65 6e 63 6f 64 69 6e 67  disable encoding
12220 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   checking..**.**
12230 20 20 20 20 67 64 69 66 66 2d 63 6f 6d 6d 61 6e      gdiff-comman
12240 64 20 20 20 20 45 78 74 65 72 6e 61 6c 20 63 6f  d    External co
12250 6d 6d 61 6e 64 20 74 6f 20 72 75 6e 20 77 68 65  mmand to run whe
12260 6e 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 67  n performing a g
12270 72 61 70 68 69 63 61 6c 0a 2a 2a 20 20 20 20 20  raphical.**     
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12290 64 69 66 66 2e 20 49 66 20 75 6e 64 65 66 69 6e  diff. If undefin
122a0 65 64 2c 20 74 65 78 74 20 64 69 66 66 20 77 69  ed, text diff wi
122b0 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a  ll be used..**.*
122c0 2a 20 20 20 20 67 6d 65 72 67 65 2d 63 6f 6d 6d  *    gmerge-comm
122d0 61 6e 64 20 20 20 41 20 67 72 61 70 68 69 63 61  and   A graphica
122e0 6c 20 6d 65 72 67 65 20 63 6f 6e 66 6c 69 63 74  l merge conflict
122f0 20 72 65 73 6f 6c 76 65 72 20 63 6f 6d 6d 61 6e   resolver comman
12300 64 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 20  d operating.**  
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 20 6f 6e 20 66 6f 75 72 20 66 69 6c 65 73     on four files
12330 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
12340 20 20 20 20 20 20 20 20 20 45 78 3a 20 6b 64 69           Ex: kdi
12350 66 66 33 20 22 25 62 61 73 65 6c 69 6e 65 22 20  ff3 "%baseline" 
12360 22 25 6f 72 69 67 69 6e 61 6c 22 20 22 25 6d 65  "%original" "%me
12370 72 67 65 22 20 2d 6f 20 22 25 6f 75 74 70 75 74  rge" -o "%output
12380 22 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ".**            
12390 20 20 20 20 20 20 20 20 20 45 78 3a 20 78 78 64           Ex: xxd
123a0 69 66 66 20 22 25 6f 72 69 67 69 6e 61 6c 22 20  iff "%original" 
123b0 22 25 62 61 73 65 6c 69 6e 65 22 20 22 25 6d 65  "%baseline" "%me
123c0 72 67 65 22 20 2d 4d 20 22 25 6f 75 74 70 75 74  rge" -M "%output
123d0 22 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ".**            
123e0 20 20 20 20 20 20 20 20 20 45 78 3a 20 6d 65 6c           Ex: mel
123f0 64 20 22 25 62 61 73 65 6c 69 6e 65 22 20 22 25  d "%baseline" "%
12400 6f 72 69 67 69 6e 61 6c 22 20 22 25 6d 65 72 67  original" "%merg
12410 65 22 20 22 25 6f 75 74 70 75 74 22 0a 2a 2a 0a  e" "%output".**.
12420 2a 2a 20 20 20 20 68 74 74 70 2d 70 6f 72 74 20  **    http-port 
12430 20 20 20 20 20 20 20 54 68 65 20 54 43 50 2f 49         The TCP/I
12440 50 20 70 6f 72 74 20 6e 75 6d 62 65 72 20 74 6f  P port number to
12450 20 75 73 65 20 62 79 20 74 68 65 20 22 73 65 72   use by the "ser
12460 76 65 72 22 0a 2a 2a 20 20 20 20 20 20 20 20 20  ver".**         
12470 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
12480 22 75 69 22 20 63 6f 6d 6d 61 6e 64 73 2e 20 20  "ui" commands.  
12490 44 65 66 61 75 6c 74 3a 20 38 30 38 30 0a 2a 2a  Default: 8080.**
124a0 0a 2a 2a 20 20 20 20 68 74 74 70 73 2d 6c 6f 67  .**    https-log
124b0 69 6e 20 20 20 20 20 20 53 65 6e 64 20 6c 6f 67  in      Send log
124c0 69 6e 20 63 72 65 64 65 6e 74 69 61 6c 73 20 75  in credentials u
124d0 73 69 6e 67 20 48 54 54 50 53 20 69 6e 73 74 65  sing HTTPS inste
124e0 61 64 20 6f 66 20 48 54 54 50 0a 2a 2a 20 20 20  ad of HTTP.**   
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12500 20 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f    even if the lo
12510 67 69 6e 20 70 61 67 65 20 72 65 71 75 65 73 74  gin page request
12520 20 63 61 6d 65 20 76 69 61 20 48 54 54 50 2e 0a   came via HTTP..
12530 2a 2a 0a 2a 2a 20 20 20 20 69 67 6e 6f 72 65 2d  **.**    ignore-
12540 67 6c 6f 62 20 20 20 20 20 20 54 68 65 20 56 41  glob      The VA
12550 4c 55 45 20 69 73 20 61 20 63 6f 6d 6d 61 20 6f  LUE is a comma o
12560 72 20 6e 65 77 6c 69 6e 65 2d 73 65 70 61 72 61  r newline-separa
12570 74 65 64 20 6c 69 73 74 20 6f 66 20 47 4c 4f 42  ted list of GLOB
12580 0a 2a 2a 20 20 20 20 20 28 76 65 72 73 69 6f 6e  .**     (version
12590 61 62 6c 65 29 20 20 20 70 61 74 74 65 72 6e 73  able)   patterns
125a0 20 73 70 65 63 69 66 79 69 6e 67 20 66 69 6c 65   specifying file
125b0 73 20 74 68 61 74 20 74 68 65 20 22 61 64 64 22  s that the "add"
125c0 2c 20 22 61 64 64 72 65 6d 6f 76 65 22 2c 0a 2a  , "addremove",.*
125d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
125e0 20 20 20 20 20 20 22 63 6c 65 61 6e 22 2c 20 61        "clean", a
125f0 6e 64 20 22 65 78 74 72 61 22 20 63 6f 6d 6d 61  nd "extra" comma
12600 6e 64 73 20 77 69 6c 6c 20 69 67 6e 6f 72 65 2e  nds will ignore.
12610 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12620 20 20 20 20 20 20 20 20 45 78 61 6d 70 6c 65 3a          Example:
12630 20 20 2a 2e 6c 6f 67 20 63 75 73 74 6f 6d 43 6f    *.log customCo
12640 64 65 2e 63 20 6e 6f 74 65 73 2e 74 78 74 0a 2a  de.c notes.txt.*
12650 2a 0a 2a 2a 20 20 20 20 6b 65 65 70 2d 67 6c 6f  *.**    keep-glo
12660 62 20 20 20 20 20 20 20 20 54 68 65 20 56 41 4c  b        The VAL
12670 55 45 20 69 73 20 61 20 63 6f 6d 6d 61 20 6f 72  UE is a comma or
12680 20 6e 65 77 6c 69 6e 65 2d 73 65 70 61 72 61 74   newline-separat
12690 65 64 20 6c 69 73 74 20 6f 66 20 47 4c 4f 42 0a  ed list of GLOB.
126a0 2a 2a 20 20 20 20 20 28 76 65 72 73 69 6f 6e 61  **     (versiona
126b0 62 6c 65 29 20 20 20 70 61 74 74 65 72 6e 73 20  ble)   patterns 
126c0 73 70 65 63 69 66 79 69 6e 67 20 66 69 6c 65 73  specifying files
126d0 20 74 68 61 74 20 74 68 65 20 22 63 6c 65 61 6e   that the "clean
126e0 22 20 63 6f 6d 6d 61 6e 64 20 77 69 6c 6c 0a 2a  " command will.*
126f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12700 20 20 20 20 20 20 6b 65 65 70 2e 0a 2a 2a 0a 2a        keep..**.*
12710 2a 20 20 20 20 6c 6f 63 61 6c 61 75 74 68 20 20  *    localauth  
12720 20 20 20 20 20 20 49 66 20 65 6e 61 62 6c 65 64        If enabled
12730 2c 20 72 65 71 75 69 72 65 20 74 68 61 74 20 48  , require that H
12740 54 54 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  TTP connections 
12750 66 72 6f 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20  from.**         
12760 20 20 20 20 20 20 20 20 20 20 20 20 31 32 37 2e              127.
12770 30 2e 30 2e 31 20 62 65 20 61 75 74 68 65 6e 74  0.0.1 be authent
12780 69 63 61 74 65 64 20 62 79 20 70 61 73 73 77 6f  icated by passwo
12790 72 64 2e 20 20 49 66 0a 2a 2a 20 20 20 20 20 20  rd.  If.**      
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
127b0 61 6c 73 65 2c 20 61 6c 6c 20 48 54 54 50 20 72  alse, all HTTP r
127c0 65 71 75 65 73 74 73 20 66 72 6f 6d 20 6c 6f 63  equests from loc
127d0 61 6c 68 6f 73 74 20 68 61 76 65 0a 2a 2a 20 20  alhost have.**  
127e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127f0 20 20 20 75 6e 72 65 73 74 72 69 63 74 65 64 20     unrestricted 
12800 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 72 65  access to the re
12810 70 6f 73 69 74 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  pository..**.** 
12820 20 20 20 6d 61 69 6e 2d 62 72 61 6e 63 68 20 20     main-branch  
12830 20 20 20 20 54 68 65 20 70 72 69 6d 61 72 79 20      The primary 
12840 62 72 61 6e 63 68 20 66 6f 72 20 74 68 65 20 70  branch for the p
12850 72 6f 6a 65 63 74 2e 20 20 44 65 66 61 75 6c 74  roject.  Default
12860 3a 20 74 72 75 6e 6b 0a 2a 2a 0a 2a 2a 20 20 20  : trunk.**.**   
12870 20 6d 61 6e 69 66 65 73 74 20 20 20 20 20 20 20   manifest       
12880 20 20 49 66 20 65 6e 61 62 6c 65 64 2c 20 61 75    If enabled, au
12890 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
128a0 74 65 20 66 69 6c 65 73 20 22 6d 61 6e 69 66 65  te files "manife
128b0 73 74 22 20 61 6e 64 0a 2a 2a 20 20 20 20 20 28  st" and.**     (
128c0 76 65 72 73 69 6f 6e 61 62 6c 65 29 20 20 20 22  versionable)   "
128d0 6d 61 6e 69 66 65 73 74 2e 75 75 69 64 22 20 69  manifest.uuid" i
128e0 6e 20 65 76 65 72 79 20 63 68 65 63 6b 6f 75 74  n every checkout
128f0 2e 20 20 54 68 65 20 53 51 4c 69 74 65 20 61 6e  .  The SQLite an
12900 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
12910 20 20 20 20 20 20 20 20 20 46 6f 73 73 69 6c 20           Fossil 
12920 72 65 70 6f 73 69 74 6f 72 69 65 73 20 62 6f 74  repositories bot
12930 68 20 72 65 71 75 69 72 65 20 74 68 69 73 2e 20  h require this. 
12940 20 44 65 66 61 75 6c 74 3a 20 6f 66 66 2e 0a 2a   Default: off..*
12950 2a 0a 2a 2a 20 20 20 20 6d 61 78 2d 6c 6f 61 64  *.**    max-load
12960 61 76 67 20 20 20 20 20 20 53 6f 6d 65 20 43 50  avg      Some CP
12970 55 2d 69 6e 74 65 6e 73 69 76 65 20 77 65 62 20  U-intensive web 
12980 70 61 67 65 73 20 28 65 78 3a 20 2f 7a 69 70 2c  pages (ex: /zip,
12990 20 2f 74 61 72 62 61 6c 6c 2c 20 2f 62 6c 61 6d   /tarball, /blam
129a0 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e).**           
129b0 20 20 20 20 20 20 20 20 20 20 61 72 65 20 64 69            are di
129c0 73 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 20  sallowed if the 
129d0 73 79 73 74 65 6d 20 6c 6f 61 64 20 61 76 65 72  system load aver
129e0 61 67 65 20 67 6f 65 73 20 61 62 6f 76 65 20 74  age goes above t
129f0 68 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  his.**          
12a00 20 20 20 20 20 20 20 20 20 20 20 76 61 6c 75 65             value
12a10 2e 20 20 22 30 2e 30 22 20 6d 65 61 6e 73 20 6e  .  "0.0" means n
12a20 6f 20 6c 69 6d 69 74 2e 20 20 54 68 69 73 20 6f  o limit.  This o
12a30 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 75 6e 69  nly works on uni
12a40 78 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  x..**           
12a50 20 20 20 20 20 20 20 20 20 20 4f 6e 6c 79 20 6c            Only l
12a60 6f 63 61 6c 20 73 65 74 74 69 6e 67 73 20 6f 66  ocal settings of
12a70 20 74 68 69 73 20 76 61 6c 75 65 20 6d 61 6b 65   this value make
12a80 20 61 20 64 69 66 66 65 72 65 6e 63 65 20 73 69   a difference si
12a90 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nce.**          
12aa0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
12ab0 72 75 6e 6e 69 6e 67 20 61 73 20 61 20 77 65 62  running as a web
12ac0 2d 73 65 72 76 65 72 2c 20 46 6f 73 73 69 6c 20  -server, Fossil 
12ad0 64 6f 65 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68  does not open th
12ae0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
12af0 20 20 20 20 20 20 20 20 20 67 6c 6f 62 61 6c 20           global 
12b00 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 64 61  configuration da
12b10 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
12b20 20 6d 61 78 2d 75 70 6c 6f 61 64 20 20 20 20 20   max-upload     
12b30 20 20 41 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65    A limit on the
12b40 20 73 69 7a 65 20 6f 66 20 75 70 6c 69 6e 6b 20   size of uplink 
12b50 48 54 54 50 20 72 65 71 75 65 73 74 73 2e 20 20  HTTP requests.  
12b60 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  The.**          
12b70 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75             defau
12b80 6c 74 20 69 73 20 32 35 30 30 30 30 20 62 79 74  lt is 250000 byt
12b90 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6d 74 69  es..**.**    mti
12ba0 6d 65 2d 63 68 61 6e 67 65 73 20 20 20 20 55 73  me-changes    Us
12bb0 65 20 66 69 6c 65 20 6d 6f 64 69 66 69 63 61 74  e file modificat
12bc0 69 6f 6e 20 74 69 6d 65 73 20 28 6d 74 69 6d 65  ion times (mtime
12bd0 73 29 20 74 6f 20 64 65 74 65 63 74 20 77 68 65  s) to detect whe
12be0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  n.**            
12bf0 20 20 20 20 20 20 20 20 20 66 69 6c 65 73 20 68           files h
12c00 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
12c10 64 2e 20 20 28 44 65 66 61 75 6c 74 20 22 6f 6e  d.  (Default "on
12c20 22 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 70 67 70  ".).**.**    pgp
12c30 2d 63 6f 6d 6d 61 6e 64 20 20 20 20 20 20 43 6f  -command      Co
12c40 6d 6d 61 6e 64 20 75 73 65 64 20 74 6f 20 63 6c  mmand used to cl
12c50 65 61 72 2d 73 69 67 6e 20 6d 61 6e 69 66 65 73  ear-sign manifes
12c60 74 73 20 61 74 20 63 68 65 63 6b 2d 69 6e 2e 0a  ts at check-in..
12c70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12c80 20 20 20 20 20 20 20 54 68 65 20 64 65 66 61 75         The defau
12c90 6c 74 20 69 73 20 22 67 70 67 20 2d 2d 63 6c 65  lt is "gpg --cle
12ca0 61 72 73 69 67 6e 20 2d 6f 20 22 2e 0a 2a 2a 0a  arsign -o "..**.
12cb0 2a 2a 20 20 20 20 70 72 6f 78 79 20 20 20 20 20  **    proxy     
12cc0 20 20 20 20 20 20 20 55 52 4c 20 6f 66 20 74 68         URL of th
12cd0 65 20 48 54 54 50 20 70 72 6f 78 79 2e 20 20 49  e HTTP proxy.  I
12ce0 66 20 75 6e 64 65 66 69 6e 65 64 20 6f 72 20 22  f undefined or "
12cf0 6f 66 66 22 20 74 68 65 6e 0a 2a 2a 20 20 20 20  off" then.**    
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 20 74 68 65 20 22 68 74 74 70 5f 70 72 6f 78 79   the "http_proxy
12d20 22 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  " environment va
12d30 72 69 61 62 6c 65 20 69 73 20 63 6f 6e 73 75 6c  riable is consul
12d40 74 65 64 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ted..**         
12d50 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 74              If t
12d60 68 65 20 68 74 74 70 5f 70 72 6f 78 79 20 65 6e  he http_proxy en
12d70 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
12d80 6c 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 0a  le is undefined.
12d90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12da0 20 20 20 20 20 20 20 74 68 65 6e 20 61 20 64 69         then a di
12db0 72 65 63 74 20 48 54 54 50 20 63 6f 6e 6e 65 63  rect HTTP connec
12dc0 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2a  tion is used..**
12dd0 0a 2a 2a 20 20 20 20 72 65 6c 61 74 69 76 65 2d  .**    relative-
12de0 70 61 74 68 73 20 20 20 57 68 65 6e 20 73 68 6f  paths   When sho
12df0 77 69 6e 67 20 63 68 61 6e 67 65 73 20 61 6e 64  wing changes and
12e00 20 65 78 74 72 61 73 2c 20 72 65 70 6f 72 74 20   extras, report 
12e10 70 61 74 68 73 20 72 65 6c 61 74 69 76 65 0a 2a  paths relative.*
12e20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12e30 20 20 20 20 20 20 74 6f 20 74 68 65 20 63 75 72        to the cur
12e40 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72  rent working dir
12e50 65 63 74 6f 72 79 2e 20 20 44 65 66 61 75 6c 74  ectory.  Default
12e60 3a 20 22 6f 6e 22 0a 2a 2a 0a 2a 2a 20 20 20 20  : "on".**.**    
12e70 72 65 70 6f 2d 63 6b 73 75 6d 20 20 20 20 20 20  repo-cksum      
12e80 20 43 6f 6d 70 75 74 65 20 63 68 65 63 6b 73 75   Compute checksu
12e90 6d 73 20 6f 76 65 72 20 61 6c 6c 20 66 69 6c 65  ms over all file
12ea0 73 20 69 6e 20 65 61 63 68 20 63 68 65 63 6b 6f  s in each checko
12eb0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
12ec0 20 20 20 20 20 20 20 20 20 20 61 73 20 61 20 64            as a d
12ed0 6f 75 62 6c 65 2d 63 68 65 63 6b 20 6f 66 20 63  ouble-check of c
12ee0 6f 72 72 65 63 74 6e 65 73 73 2e 20 20 44 65 66  orrectness.  Def
12ef0 61 75 6c 74 73 20 74 6f 20 22 6f 6e 22 2e 0a 2a  aults to "on"..*
12f00 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
12f10 20 20 20 20 20 20 44 69 73 61 62 6c 65 20 6f 6e        Disable on
12f20 20 6c 61 72 67 65 20 72 65 70 6f 73 69 74 6f 72   large repositor
12f30 69 65 73 20 66 6f 72 20 61 20 70 65 72 66 6f 72  ies for a perfor
12f40 6d 61 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20  mance.**        
12f50 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70               imp
12f60 72 6f 76 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  rovement..**.** 
12f70 20 20 20 73 65 6c 66 2d 72 65 67 69 73 74 65 72     self-register
12f80 20 20 20 20 41 6c 6c 6f 77 20 75 73 65 72 73 20      Allow users 
12f90 74 6f 20 72 65 67 69 73 74 65 72 20 74 68 65 6d  to register them
12fa0 73 65 6c 76 65 73 20 74 68 72 6f 75 67 68 20 74  selves through t
12fb0 68 65 20 48 54 54 50 20 55 49 2e 0a 2a 2a 20 20  he HTTP UI..**  
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 20 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75     This is usefu
12fe0 6c 20 69 66 20 79 6f 75 20 77 61 6e 74 20 74 6f  l if you want to
12ff0 20 73 65 65 20 6f 74 68 65 72 20 6e 61 6d 65 73   see other names
13000 20 74 68 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20   than.**        
13010 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 6e               "An
13020 6f 6e 79 6d 6f 75 73 22 20 69 6e 20 65 2e 67 2e  onymous" in e.g.
13030 20 74 69 63 6b 65 74 69 6e 67 20 73 79 73 74 65   ticketing syste
13040 6d 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  m. On the other 
13050 68 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  hand.**         
13060 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65 72              user
13070 73 20 63 61 6e 20 6e 6f 74 20 62 65 20 64 65 6c  s can not be del
13080 65 74 65 64 2e 20 44 65 66 61 75 6c 74 3a 20 6f  eted. Default: o
13090 66 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 73 68  ff..**.**    ssh
130a0 2d 63 6f 6d 6d 61 6e 64 20 20 20 20 20 20 43 6f  -command      Co
130b0 6d 6d 61 6e 64 20 75 73 65 64 20 74 6f 20 74 61  mmand used to ta
130c0 6c 6b 20 74 6f 20 61 20 72 65 6d 6f 74 65 20 6d  lk to a remote m
130d0 61 63 68 69 6e 65 20 77 69 74 68 0a 2a 2a 20 20  achine with.**  
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130f0 20 20 20 74 68 65 20 22 73 73 68 3a 2f 2f 22 20     the "ssh://" 
13100 70 72 6f 74 6f 63 6f 6c 2e 0a 2a 2a 0a 2a 2a 20  protocol..**.** 
13110 20 20 20 73 73 6c 2d 63 61 2d 6c 6f 63 61 74 69     ssl-ca-locati
13120 6f 6e 20 20 54 68 65 20 66 75 6c 6c 20 70 61 74  on  The full pat
13130 68 6e 61 6d 65 20 74 6f 20 61 20 66 69 6c 65 20  hname to a file 
13140 63 6f 6e 74 61 69 6e 69 6e 67 20 50 45 4d 20 65  containing PEM e
13150 6e 63 6f 64 65 64 0a 2a 2a 20 20 20 20 20 20 20  ncoded.**       
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 41                CA
13170 20 72 6f 6f 74 20 63 65 72 74 69 66 69 63 61 74   root certificat
13180 65 73 2c 20 6f 72 20 61 20 64 69 72 65 63 74 6f  es, or a directo
13190 72 79 20 6f 66 20 63 65 72 74 69 66 69 63 61 74  ry of certificat
131a0 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
131b0 20 20 20 20 20 20 20 20 20 20 77 69 74 68 20 66            with f
131c0 69 6c 65 6e 61 6d 65 73 20 66 6f 72 6d 65 64 20  ilenames formed 
131d0 66 72 6f 6d 20 74 68 65 20 63 65 72 74 69 66 69  from the certifi
131e0 63 61 74 65 20 68 61 73 68 65 73 20 61 73 0a 2a  cate hashes as.*
131f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
13200 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20 62        required b
13210 79 20 4f 70 65 6e 53 53 4c 2e 0a 2a 2a 20 20 20  y OpenSSL..**   
13220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13230 20 20 49 66 20 73 65 74 2c 20 74 68 69 73 20 77    If set, this w
13240 69 6c 6c 20 6f 76 65 72 72 69 64 65 20 74 68 65  ill override the
13250 20 4f 53 20 64 65 66 61 75 6c 74 20 6c 69 73 74   OS default list
13260 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
13270 20 20 20 20 20 20 20 20 20 20 20 4f 70 65 6e 53             OpenS
13280 53 4c 20 43 41 73 2e 20 49 66 20 75 6e 73 65 74  SL CAs. If unset
13290 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 69  , the default li
132a0 73 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e  st will be used.
132b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
132c0 20 20 20 20 20 20 20 20 53 6f 6d 65 20 70 6c 61          Some pla
132d0 74 66 6f 72 6d 73 20 6d 61 79 20 61 64 64 20 61  tforms may add a
132e0 64 64 69 74 69 6f 6e 61 6c 20 63 65 72 74 69 66  dditional certif
132f0 69 63 61 74 65 73 2e 0a 2a 2a 20 20 20 20 20 20  icates..**      
13300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
13310 68 65 63 6b 20 79 6f 75 72 20 70 6c 61 74 66 6f  heck your platfo
13320 72 6d 20 62 65 68 61 76 69 6f 75 72 20 69 73 20  rm behaviour is 
13330 61 73 20 72 65 71 75 69 72 65 64 20 69 66 20 74  as required if t
13340 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
13350 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 20            exact 
13360 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
13370 43 41 20 72 6f 6f 74 20 69 73 20 63 72 69 74 69  CA root is criti
13380 63 61 6c 20 66 6f 72 20 79 6f 75 72 0a 2a 2a 20  cal for your.** 
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133a0 20 20 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e      application.
133b0 0a 2a 2a 0a 2a 2a 20 20 20 20 73 73 6c 2d 69 64  .**.**    ssl-id
133c0 65 6e 74 69 74 79 20 20 20 20 20 54 68 65 20 66  entity     The f
133d0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 74 6f 20  ull pathname to 
133e0 61 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  a file containin
133f0 67 20 61 20 63 65 72 74 69 66 69 63 61 74 65 0a  g a certificate.
13400 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
13410 20 20 20 20 20 20 20 61 6e 64 20 70 72 69 76 61         and priva
13420 74 65 20 6b 65 79 20 69 6e 20 50 45 4d 20 66 6f  te key in PEM fo
13430 72 6d 61 74 2e 20 43 72 65 61 74 65 20 62 79 20  rmat. Create by 
13440 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a  concatenating.**
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13460 20 20 20 20 20 74 68 65 20 63 65 72 74 69 66 69       the certifi
13470 63 61 74 65 20 61 6e 64 20 70 72 69 76 61 74 65  cate and private
13480 20 6b 65 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 20   key files..**  
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134a0 20 20 20 54 68 69 73 20 69 64 65 6e 74 69 74 79     This identity
134b0 20 77 69 6c 6c 20 62 65 20 70 72 65 73 65 6e 74   will be present
134c0 65 64 20 74 6f 20 53 53 4c 20 73 65 72 76 65 72  ed to SSL server
134d0 73 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  s to.**         
134e0 20 20 20 20 20 20 20 20 20 20 20 20 61 75 74 68              auth
134f0 65 6e 74 69 63 61 74 65 20 74 68 69 73 20 63 6c  enticate this cl
13500 69 65 6e 74 2c 20 69 6e 20 61 64 64 69 74 69 6f  ient, in additio
13510 6e 20 74 6f 20 74 68 65 20 6e 6f 72 6d 61 6c 0a  n to the normal.
13520 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
13530 20 20 20 20 20 20 20 70 61 73 73 77 6f 72 64 20         password 
13540 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 2e 0a  authentication..
13550 2a 2a 0a 2a 2a 20 20 20 20 74 63 6c 20 20 20 20  **.**    tcl    
13560 20 20 20 20 20 20 20 20 20 20 49 66 20 65 6e 61            If ena
13570 62 6c 65 64 20 28 61 6e 64 20 46 6f 73 73 69 6c  bled (and Fossil
13580 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69   was compiled wi
13590 74 68 20 54 63 6c 20 73 75 70 70 6f 72 74 29 2c  th Tcl support),
135a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
135b0 20 20 20 20 20 20 20 20 54 63 6c 20 69 6e 74 65          Tcl inte
135c0 67 72 61 74 69 6f 6e 20 63 6f 6d 6d 61 6e 64 73  gration commands
135d0 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
135e0 6f 20 74 68 65 20 54 48 31 0a 2a 2a 20 20 20 20  o the TH1.**    
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13600 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 61 6c   interpreter, al
13610 6c 6f 77 69 6e 67 20 61 72 62 69 74 72 61 72 79  lowing arbitrary
13620 20 54 63 6c 20 65 78 70 72 65 73 73 69 6f 6e 73   Tcl expressions
13630 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
13640 20 20 20 20 20 20 20 20 20 20 20 20 73 63 72 69              scri
13650 70 74 73 20 74 6f 20 62 65 20 65 76 61 6c 75 61  pts to be evalua
13660 74 65 64 20 66 72 6f 6d 20 54 48 31 2e 20 20 41  ted from TH1.  A
13670 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
13680 20 54 63 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20   Tcl.**         
13690 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65              inte
136a0 72 70 72 65 74 65 72 20 77 69 6c 6c 20 62 65 20  rpreter will be 
136b0 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65  able to evaluate
136c0 20 61 72 62 69 74 72 61 72 79 20 54 48 31 0a 2a   arbitrary TH1.*
136d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
136e0 20 20 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e        expression
136f0 73 20 61 6e 64 20 73 63 72 69 70 74 73 2e 20 44  s and scripts. D
13700 65 66 61 75 6c 74 3a 20 6f 66 66 2e 0a 2a 2a 0a  efault: off..**.
13710 2a 2a 20 20 20 20 74 63 6c 2d 73 65 74 75 70 20  **    tcl-setup 
13720 20 20 20 20 20 20 20 54 68 69 73 20 69 73 20 74         This is t
13730 68 65 20 73 65 74 75 70 20 73 63 72 69 70 74 20  he setup script 
13740 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  to be evaluated 
13750 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 2a  after creating.*
13760 2a 20 20 20 20 20 28 76 65 72 73 69 6f 6e 61 62  *     (versionab
13770 6c 65 29 20 20 20 61 6e 64 20 69 6e 69 74 69 61  le)   and initia
13780 6c 69 7a 69 6e 67 20 74 68 65 20 54 63 6c 20 69  lizing the Tcl i
13790 6e 74 65 72 70 72 65 74 65 72 2e 20 20 42 79 20  nterpreter.  By 
137a0 64 65 66 61 75 6c 74 2c 20 74 68 69 73 0a 2a 2a  default, this.**
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137c0 20 20 20 20 20 69 73 20 65 6d 70 74 79 20 61 6e       is empty an
137d0 64 20 6e 6f 20 65 78 74 72 61 20 73 65 74 75 70  d no extra setup
137e0 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
137f0 2a 0a 2a 2a 20 20 20 20 74 68 31 2d 68 6f 6f 6b  *.**    th1-hook
13800 73 20 20 20 20 20 20 20 20 49 66 20 65 6e 61 62  s        If enab
13810 6c 65 64 20 28 61 6e 64 20 46 6f 73 73 69 6c 20  led (and Fossil 
13820 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
13830 68 20 73 75 70 70 6f 72 74 20 66 6f 72 20 54 48  h support for TH
13840 31 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  1.**            
13850 20 20 20 20 20 20 20 20 20 68 6f 6f 6b 73 29 2c           hooks),
13860 20 73 70 65 63 69 61 6c 20 54 48 31 20 63 6f 6d   special TH1 com
13870 6d 61 6e 64 73 20 77 69 6c 6c 20 62 65 20 63 61  mands will be ca
13880 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 6e 64 0a  lled before and.
13890 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
138a0 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6e 79         after any
138b0 20 46 6f 73 73 69 6c 20 63 6f 6d 6d 61 6e 64 20   Fossil command 
138c0 6f 72 20 77 65 62 20 70 61 67 65 2e 20 44 65 66  or web page. Def
138d0 61 75 6c 74 3a 20 6f 66 66 2e 0a 2a 2a 0a 2a 2a  ault: off..**.**
138e0 20 20 20 20 74 68 31 2d 73 65 74 75 70 20 20 20      th1-setup   
138f0 20 20 20 20 20 54 68 69 73 20 69 73 20 74 68 65       This is the
13900 20 73 65 74 75 70 20 73 63 72 69 70 74 20 74 6f   setup script to
13910 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 61 66   be evaluated af
13920 74 65 72 20 63 72 65 61 74 69 6e 67 0a 2a 2a 20  ter creating.** 
13930 20 20 20 20 28 76 65 72 73 69 6f 6e 61 62 6c 65      (versionable
13940 29 20 20 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  )   and initiali
13950 7a 69 6e 67 20 74 68 65 20 54 48 31 20 69 6e 74  zing the TH1 int
13960 65 72 70 72 65 74 65 72 2e 20 20 42 79 20 64 65  erpreter.  By de
13970 66 61 75 6c 74 2c 20 74 68 69 73 0a 2a 2a 20 20  fault, this.**  
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13990 20 20 20 69 73 20 65 6d 70 74 79 20 61 6e 64 20     is empty and 
139a0 6e 6f 20 65 78 74 72 61 20 73 65 74 75 70 20 69  no extra setup i
139b0 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a  s performed..**.
139c0 2a 2a 20 20 20 20 74 68 31 2d 75 72 69 2d 72 65  **    th1-uri-re
139d0 67 65 78 70 20 20 20 53 70 65 63 69 66 79 20 77  gexp   Specify w
139e0 68 69 63 68 20 55 52 49 27 73 20 61 72 65 20 61  hich URI's are a
139f0 6c 6c 6f 77 65 64 20 69 6e 20 48 54 54 50 20 72  llowed in HTTP r
13a00 65 71 75 65 73 74 73 20 66 72 6f 6d 0a 2a 2a 20  equests from.** 
13a10 20 20 20 20 28 76 65 72 73 69 6f 6e 61 62 6c 65      (versionable
13a20 29 20 20 20 54 48 31 20 73 63 72 69 70 74 73 2e  )   TH1 scripts.
13a30 20 20 49 66 20 65 6d 70 74 79 2c 20 6e 6f 20 48    If empty, no H
13a40 54 54 50 20 72 65 71 75 65 73 74 73 20 61 72 65  TTP requests are
13a50 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 20 20 20 20   allowed.**     
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 77 68 61 74 73 6f 65 76 65 72 2e 20 20 54 68 65  whatsoever.  The
13a80 20 64 65 66 61 75 6c 74 20 69 73 20 61 6e 20 65   default is an e
13a90 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  mpty string..**.
13aa0 2a 2a 20 20 20 20 77 65 62 2d 62 72 6f 77 73 65  **    web-browse
13ab0 72 20 20 20 20 20 20 41 20 73 68 65 6c 6c 20 63  r      A shell c
13ac0 6f 6d 6d 61 6e 64 20 75 73 65 64 20 74 6f 20 6c  ommand used to l
13ad0 61 75 6e 63 68 20 79 6f 75 72 20 70 72 65 66 65  aunch your prefe
13ae0 72 72 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  rred.**         
13af0 20 20 20 20 20 20 20 20 20 20 20 20 77 65 62 20              web 
13b00 62 72 6f 77 73 65 72 20 77 68 65 6e 20 67 69 76  browser when giv
13b10 65 6e 20 61 20 55 52 4c 20 61 73 20 61 6e 20 61  en a URL as an a
13b20 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 20 20 20 20  rgument..**     
13b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b40 44 65 66 61 75 6c 74 73 20 74 6f 20 22 73 74 61  Defaults to "sta
13b50 72 74 22 20 6f 6e 20 77 69 6e 64 6f 77 73 2c 20  rt" on windows, 
13b60 22 6f 70 65 6e 22 20 6f 6e 20 4d 61 63 2c 0a 2a  "open" on Mac,.*
13b70 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
13b80 20 20 20 20 20 20 61 6e 64 20 22 66 69 72 65 66        and "firef
13b90 6f 78 22 20 6f 6e 20 55 6e 69 78 2e 0a 2a 2a 0a  ox" on Unix..**.
13ba0 2a 2a 20 4f 70 74 69 6f 6e 73 3a 0a 2a 2a 20 20  ** Options:.**  
13bb0 20 2d 2d 67 6c 6f 62 61 6c 20 20 20 73 65 74 20   --global   set 
13bc0 6f 72 20 75 6e 73 65 74 20 74 68 65 20 67 69 76  or unset the giv
13bd0 65 6e 20 70 72 6f 70 65 72 74 79 20 67 6c 6f 62  en property glob
13be0 61 6c 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 0a  ally instead of.
13bf0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
13c00 73 65 74 74 69 6e 67 20 6f 72 20 75 6e 73 65 74  setting or unset
13c10 74 69 6e 67 20 69 74 20 66 6f 72 20 74 68 65 20  ting it for the 
13c20 6f 70 65 6e 20 72 65 70 6f 73 69 74 6f 72 79 20  open repository 
13c30 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  only..**.** See 
13c40 61 6c 73 6f 3a 20 63 6f 6e 66 69 67 75 72 61 74  also: configurat
13c50 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 65 74 74  ion.*/.void sett
13c60 69 6e 67 5f 63 6d 64 28 76 6f 69 64 29 7b 0a 20  ing_cmd(void){. 
13c70 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 67 6c   int i;.  int gl
13c80 6f 62 61 6c 46 6c 61 67 20 3d 20 66 69 6e 64 5f  obalFlag = find_
13c90 6f 70 74 69 6f 6e 28 22 67 6c 6f 62 61 6c 22 2c  option("global",
13ca0 22 67 22 2c 30 29 21 3d 30 3b 0a 20 20 69 6e 74  "g",0)!=0;.  int
13cb0 20 75 6e 73 65 74 46 6c 61 67 20 3d 20 67 2e 61   unsetFlag = g.a
13cc0 72 67 76 5b 31 5d 5b 30 5d 3d 3d 27 75 27 3b 0a  rgv[1][0]=='u';.
13cd0 20 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e 66 69 67    db_open_config
13ce0 28 31 29 3b 0a 20 20 69 66 28 20 21 67 6c 6f 62  (1);.  if( !glob
13cf0 61 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 64 62  alFlag ){.    db
13d00 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f 72  _find_and_open_r
13d10 65 70 6f 73 69 74 6f 72 79 28 4f 50 45 4e 5f 41  epository(OPEN_A
13d20 4e 59 5f 53 43 48 45 4d 41 20 7c 20 4f 50 45 4e  NY_SCHEMA | OPEN
13d30 5f 4f 4b 5f 4e 4f 54 5f 46 4f 55 4e 44 2c 20 30  _OK_NOT_FOUND, 0
13d40 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 67 2e  );.  }.  if( !g.
13d50 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20 29  repositoryOpen )
13d60 7b 0a 20 20 20 20 67 6c 6f 62 61 6c 46 6c 61 67  {.    globalFlag
13d70 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
13d80 75 6e 73 65 74 46 6c 61 67 20 26 26 20 67 2e 61  unsetFlag && g.a
13d90 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 75 73  rgc!=3 ){.    us
13da0 61 67 65 28 22 50 52 4f 50 45 52 54 59 20 3f 2d  age("PROPERTY ?-
13db0 67 6c 6f 62 61 6c 3f 22 29 3b 0a 20 20 7d 0a 20  global?");.  }. 
13dc0 20 69 66 28 20 67 2e 61 72 67 63 3d 3d 32 20 29   if( g.argc==2 )
13dd0 7b 0a 20 20 20 20 69 6e 74 20 6f 70 65 6e 4c 6f  {.    int openLo
13de0 63 61 6c 20 3d 20 64 62 5f 6f 70 65 6e 5f 6c 6f  cal = db_open_lo
13df0 63 61 6c 28 30 29 3b 0a 20 20 20 20 66 6f 72 28  cal(0);.    for(
13e00 69 3d 30 3b 20 63 74 72 6c 53 65 74 74 69 6e 67  i=0; ctrlSetting
13e10 73 5b 69 5d 2e 6e 61 6d 65 3b 20 69 2b 2b 29 7b  s[i].name; i++){
13e20 0a 20 20 20 20 20 20 70 72 69 6e 74 5f 73 65 74  .      print_set
13e30 74 69 6e 67 28 26 63 74 72 6c 53 65 74 74 69 6e  ting(&ctrlSettin
13e40 67 73 5b 69 5d 2c 20 6f 70 65 6e 4c 6f 63 61 6c  gs[i], openLocal
13e50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
13e60 20 69 66 28 20 67 2e 61 72 67 63 3d 3d 33 20 7c   if( g.argc==3 |
13e70 7c 20 67 2e 61 72 67 63 3d 3d 34 20 29 7b 0a 20  | g.argc==4 ){. 
13e80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
13e90 4e 61 6d 65 20 3d 20 67 2e 61 72 67 76 5b 32 5d  Name = g.argv[2]
13ea0 3b 0a 20 20 20 20 69 6e 74 20 69 73 4d 61 6e 69  ;.    int isMani
13eb0 66 65 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 20  fest;.    int n 
13ec0 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b  = strlen(zName);
13ed0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 63 74  .    for(i=0; ct
13ee0 72 6c 53 65 74 74 69 6e 67 73 5b 69 5d 2e 6e 61  rlSettings[i].na
13ef0 6d 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  me; i++){.      
13f00 69 66 28 20 73 74 72 6e 63 6d 70 28 63 74 72 6c  if( strncmp(ctrl
13f10 53 65 74 74 69 6e 67 73 5b 69 5d 2e 6e 61 6d 65  Settings[i].name
13f20 2c 20 7a 4e 61 6d 65 2c 20 6e 29 3d 3d 30 20 29  , zName, n)==0 )
13f30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
13f40 20 20 69 66 28 20 21 63 74 72 6c 53 65 74 74 69    if( !ctrlSetti
13f50 6e 67 73 5b 69 5d 2e 6e 61 6d 65 20 29 7b 0a 20  ngs[i].name ){. 
13f60 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61       fossil_fata
13f70 6c 28 22 6e 6f 20 73 75 63 68 20 73 65 74 74 69  l("no such setti
13f80 6e 67 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  ng: %s", zName);
13f90 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 4d 61 6e  .    }.    isMan
13fa0 69 66 65 73 74 20 3d 20 66 6f 73 73 69 6c 5f 73  ifest = fossil_s
13fb0 74 72 63 6d 70 28 63 74 72 6c 53 65 74 74 69 6e  trcmp(ctrlSettin
13fc0 67 73 5b 69 5d 2e 6e 61 6d 65 2c 20 22 6d 61 6e  gs[i].name, "man
13fd0 69 66 65 73 74 22 29 3d 3d 30 3b 0a 20 20 20 20  ifest")==0;.    
13fe0 69 66 28 20 69 73 4d 61 6e 69 66 65 73 74 20 26  if( isManifest &
13ff0 26 20 67 6c 6f 62 61 6c 46 6c 61 67 20 29 7b 0a  & globalFlag ){.
14000 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74        fossil_fat
14010 61 6c 28 22 63 61 6e 6e 6f 74 20 73 65 74 20 27  al("cannot set '
14020 6d 61 6e 69 66 65 73 74 27 20 67 6c 6f 62 61 6c  manifest' global
14030 6c 79 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ly");.    }.    
14040 69 66 28 20 75 6e 73 65 74 46 6c 61 67 20 29 7b  if( unsetFlag ){
14050 0a 20 20 20 20 20 20 64 62 5f 75 6e 73 65 74 28  .      db_unset(
14060 63 74 72 6c 53 65 74 74 69 6e 67 73 5b 69 5d 2e  ctrlSettings[i].
14070 6e 61 6d 65 2c 20 67 6c 6f 62 61 6c 46 6c 61 67  name, globalFlag
14080 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
14090 20 67 2e 61 72 67 63 3d 3d 34 20 29 7b 0a 20 20   g.argc==4 ){.  
140a0 20 20 20 20 64 62 5f 73 65 74 28 63 74 72 6c 53      db_set(ctrlS
140b0 65 74 74 69 6e 67 73 5b 69 5d 2e 6e 61 6d 65 2c  ettings[i].name,
140c0 20 67 2e 61 72 67 76 5b 33 5d 2c 20 67 6c 6f 62   g.argv[3], glob
140d0 61 6c 46 6c 61 67 29 3b 0a 20 20 20 20 7d 65 6c  alFlag);.    }el
140e0 73 65 7b 0a 20 20 20 20 20 20 69 73 4d 61 6e 69  se{.      isMani
140f0 66 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fest = 0;.      
14100 70 72 69 6e 74 5f 73 65 74 74 69 6e 67 28 26 63  print_setting(&c
14110 74 72 6c 53 65 74 74 69 6e 67 73 5b 69 5d 2c 20  trlSettings[i], 
14120 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 30 29  db_open_local(0)
14130 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
14140 20 69 73 4d 61 6e 69 66 65 73 74 20 26 26 20 67   isManifest && g
14150 2e 6c 6f 63 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  .localOpen ){.  
14160 20 20 20 20 6d 61 6e 69 66 65 73 74 5f 74 6f 5f      manifest_to_
14170 64 69 73 6b 28 64 62 5f 6c 67 65 74 5f 69 6e 74  disk(db_lget_int
14180 28 22 63 68 65 63 6b 6f 75 74 22 2c 20 30 29 29  ("checkout", 0))
14190 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
141a0 0a 20 20 20 20 75 73 61 67 65 28 22 3f 50 52 4f  .    usage("?PRO
141b0 50 45 52 54 59 3f 20 3f 56 41 4c 55 45 3f 20 3f  PERTY? ?VALUE? ?
141c0 2d 67 6c 6f 62 61 6c 3f 22 29 3b 0a 20 20 7d 0a  -global?");.  }.
141d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  }../*.** The inp
141e0 75 74 20 69 6e 20 61 20 74 69 6d 65 73 70 61 6e  ut in a timespan
141f0 20 6d 65 61 73 75 72 65 64 20 69 6e 20 64 61 79   measured in day
14200 73 2e 20 20 52 65 74 75 72 6e 20 61 20 73 74 72  s.  Return a str
14210 69 6e 67 20 77 68 69 63 68 0a 2a 2a 20 64 65 73  ing which.** des
14220 63 72 69 62 65 73 20 74 68 61 74 20 74 69 6d 65  cribes that time
14230 73 70 61 6e 20 69 6e 20 75 6e 69 74 73 20 6f 66  span in units of
14240 20 73 65 63 6f 6e 64 73 2c 20 6d 69 6e 75 74 65   seconds, minute
14250 73 2c 20 68 6f 75 72 73 2c 20 64 61 79 73 2c 0a  s, hours, days,.
14260 2a 2a 20 6f 72 20 79 65 61 72 73 2c 20 64 65 70  ** or years, dep
14270 65 6e 64 69 6e 67 20 6f 6e 20 69 74 73 20 64 75  ending on its du
14280 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20  ration..*/.char 
14290 2a 64 62 5f 74 69 6d 65 73 70 61 6e 5f 6e 61 6d  *db_timespan_nam
142a0 65 28 64 6f 75 62 6c 65 20 72 53 70 61 6e 29 7b  e(double rSpan){
142b0 0a 20 20 69 66 28 20 72 53 70 61 6e 3c 30 20 29  .  if( rSpan<0 )
142c0 20 72 53 70 61 6e 20 3d 20 2d 72 53 70 61 6e 3b   rSpan = -rSpan;
142d0 0a 20 20 72 53 70 61 6e 20 2a 3d 20 32 34 2e 30  .  rSpan *= 24.0
142e0 2a 33 36 30 30 2e 30 3b 20 20 2f 2a 20 43 6f 6e  *3600.0;  /* Con
142f0 76 65 72 74 20 75 6e 69 74 73 20 74 6f 20 73 65  vert units to se
14300 63 6f 6e 64 73 20 2a 2f 0a 20 20 69 66 28 20 72  conds */.  if( r
14310 53 70 61 6e 3c 31 32 30 2e 30 20 29 7b 0a 20 20  Span<120.0 ){.  
14320 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
14330 5f 6d 70 72 69 6e 74 66 28 22 25 2e 31 66 20 73  _mprintf("%.1f s
14340 65 63 6f 6e 64 73 22 2c 20 72 53 70 61 6e 29 3b  econds", rSpan);
14350 0a 20 20 7d 0a 20 20 72 53 70 61 6e 20 2f 3d 20  .  }.  rSpan /= 
14360 36 30 2e 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  60.0;         /*
14370 20 43 6f 6e 76 65 72 74 20 75 6e 69 74 73 20 74   Convert units t
14380 6f 20 6d 69 6e 75 74 65 73 20 2a 2f 0a 20 20 69  o minutes */.  i
14390 66 28 20 72 53 70 61 6e 3c 39 30 2e 30 20 29 7b  f( rSpan<90.0 ){
143a0 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
143b0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 31  te3_mprintf("%.1
143c0 66 20 6d 69 6e 75 74 65 73 22 2c 20 72 53 70 61  f minutes", rSpa
143d0 6e 29 3b 0a 20 20 7d 0a 20 20 72 53 70 61 6e 20  n);.  }.  rSpan 
143e0 2f 3d 20 36 30 2e 30 3b 20 20 20 20 20 20 20 20  /= 60.0;        
143f0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 75 6e 69 74   /* Convert unit
14400 73 20 74 6f 20 68 6f 75 72 73 20 2a 2f 0a 20 20  s to hours */.  
14410 69 66 28 20 72 53 70 61 6e 3c 3d 34 38 2e 30 20  if( rSpan<=48.0 
14420 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
14430 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
14440 2e 31 66 20 68 6f 75 72 73 22 2c 20 72 53 70 61  .1f hours", rSpa
14450 6e 29 3b 0a 20 20 7d 0a 20 20 72 53 70 61 6e 20  n);.  }.  rSpan 
14460 2f 3d 20 32 34 2e 30 3b 20 20 20 20 20 20 20 20  /= 24.0;        
14470 20 2f 2a 20 43 6f 6e 76 65 72 74 20 75 6e 69 74   /* Convert unit
14480 73 20 74 6f 20 64 61 79 73 20 2a 2f 0a 20 20 69  s to days */.  i
14490 66 28 20 72 53 70 61 6e 3c 3d 33 36 35 2e 30 20  f( rSpan<=365.0 
144a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
144b0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
144c0 2e 31 66 20 64 61 79 73 22 2c 20 72 53 70 61 6e  .1f days", rSpan
144d0 29 3b 0a 20 20 7d 0a 20 20 72 53 70 61 6e 20 2f  );.  }.  rSpan /
144e0 3d 20 33 35 36 2e 32 34 3b 20 20 20 20 20 20 20  = 356.24;       
144f0 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 75 6e 69    /* Convert uni
14500 74 73 20 74 6f 20 79 65 61 72 73 20 2a 2f 0a 20  ts to years */. 
14510 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
14520 6d 70 72 69 6e 74 66 28 22 25 2e 31 66 20 79 65  mprintf("%.1f ye
14530 61 72 73 22 2c 20 72 53 70 61 6e 29 3b 0a 7d 0a  ars", rSpan);.}.
14540 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20  ./*.** COMMAND: 
14550 74 65 73 74 2d 74 69 6d 65 73 70 61 6e 0a 2a 2a  test-timespan.**
14560 20 25 66 6f 73 73 69 6c 20 74 65 73 74 2d 74 69   %fossil test-ti
14570 6d 65 73 70 61 6e 20 54 49 4d 45 53 54 41 4d 50  mespan TIMESTAMP
14580 0a 2a 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  .**.** Print the
14590 20 61 70 70 72 6f 78 69 6d 61 74 65 20 73 70 61   approximate spa
145a0 6e 20 6f 66 20 74 69 6d 65 20 66 72 6f 6d 20 6e  n of time from n
145b0 6f 77 20 74 6f 20 54 49 4d 45 53 54 41 4d 50 2e  ow to TIMESTAMP.
145c0 0a 2a 2f 0a 76 6f 69 64 20 74 65 73 74 5f 74 69  .*/.void test_ti
145d0 6d 65 73 70 61 6e 5f 63 6d 64 28 76 6f 69 64 29  mespan_cmd(void)
145e0 7b 0a 20 20 64 6f 75 62 6c 65 20 72 44 69 66 66  {.  double rDiff
145f0 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d  ;.  if( g.argc!=
14600 33 20 29 20 75 73 61 67 65 28 22 54 49 4d 45 53  3 ) usage("TIMES
14610 54 41 4d 50 22 29 3b 0a 20 20 73 71 6c 69 74 65  TAMP");.  sqlite
14620 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72 79 3a  3_open(":memory:
14630 22 2c 20 26 67 2e 64 62 29 3b 0a 20 20 72 44 69  ", &g.db);.  rDi
14640 66 66 20 3d 20 64 62 5f 64 6f 75 62 6c 65 28 30  ff = db_double(0
14650 2e 30 2c 20 22 53 45 4c 45 43 54 20 6a 75 6c 69  .0, "SELECT juli
14660 61 6e 64 61 79 28 27 6e 6f 77 27 29 20 2d 20 6a  anday('now') - j
14670 75 6c 69 61 6e 64 61 79 28 25 51 29 22 2c 20 67  ulianday(%Q)", g
14680 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 66 6f 73  .argv[2]);.  fos
14690 73 69 6c 5f 70 72 69 6e 74 28 22 54 69 6d 65 20  sil_print("Time 
146a0 64 69 66 66 65 72 65 6e 63 65 73 3a 20 25 73 5c  differences: %s\
146b0 6e 22 2c 20 64 62 5f 74 69 6d 65 73 70 61 6e 5f  n", db_timespan_
146c0 6e 61 6d 65 28 72 44 69 66 66 29 29 3b 0a 20 20  name(rDiff));.  
146d0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 67 2e  sqlite3_close(g.
146e0 64 62 29 3b 0a 20 20 67 2e 64 62 20 3d 20 30 3b  db);.  g.db = 0;
146f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e  .}../*.** COMMAN
14700 44 3a 20 74 65 73 74 2d 77 69 74 68 6f 75 74 2d  D: test-without-
14710 72 6f 77 69 64 0a 2a 2a 20 25 66 6f 73 73 69 6c  rowid.** %fossil
14720 20 74 65 73 74 2d 77 69 74 68 6f 75 74 2d 72 6f   test-without-ro
14730 77 69 64 20 46 49 4c 45 4e 41 4d 45 2e 2e 2e 0a  wid FILENAME....
14740 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  **.** Change the
14750 20 46 6f 73 73 69 6c 20 72 65 70 6f 73 69 74 6f   Fossil reposito
14760 72 79 20 46 49 4c 45 4e 41 4d 45 20 74 6f 20 6d  ry FILENAME to m
14770 61 6b 65 20 75 73 65 20 6f 66 20 74 68 65 20 57  ake use of the W
14780 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 2a 2a 20  ITHOUT ROWID.** 
14790 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 46  optimization.  F
147a0 49 4c 45 4e 41 4d 45 20 63 61 6e 20 61 6c 73 6f  ILENAME can also
147b0 20 62 65 20 74 68 65 20 7e 2f 2e 66 6f 73 73 69   be the ~/.fossi
147c0 6c 20 66 69 6c 65 20 6f 72 20 61 20 6c 6f 63 61  l file or a loca
147d0 6c 0a 2a 2a 20 2e 66 73 6c 63 6b 6f 75 74 20 6f  l.** .fslckout o
147e0 72 20 5f 46 4f 53 53 49 4c 5f 20 66 69 6c 65 2e  r _FOSSIL_ file.
147f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 75 72 70 6f  .**.** The purpo
14800 73 65 20 6f 66 20 74 68 69 73 20 63 6f 6d 6d 61  se of this comma
14810 6e 64 20 69 73 20 66 6f 72 20 74 65 73 74 69 6e  nd is for testin
14820 67 20 74 68 65 20 57 49 54 48 4f 55 54 20 52 4f  g the WITHOUT RO
14830 57 49 44 20 63 61 70 61 62 69 6c 69 74 69 65 73  WID capabilities
14840 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 2e 20 20  .** of SQLite.  
14850 54 68 65 72 65 20 69 73 20 6e 6f 20 62 69 67 20  There is no big 
14860 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69  advantage to usi
14870 6e 67 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  ng WITHOUT ROWID
14880 20 69 6e 20 46 6f 73 73 69 6c 2e 0a 2a 2a 0a 2a   in Fossil..**.*
14890 2a 20 4f 70 74 69 6f 6e 73 3a 0a 2a 2a 20 20 20  * Options:.**   
148a0 20 2d 2d 64 72 79 72 75 6e 20 7c 20 2d 6e 20 20   --dryrun | -n  
148b0 20 20 20 20 20 20 20 4e 6f 20 63 68 61 6e 67 65         No change
148c0 73 2e 20 20 4a 75 73 74 20 70 72 69 6e 74 20 77  s.  Just print w
148d0 68 61 74 20 77 6f 75 6c 64 20 68 61 70 70 65 6e  hat would happen
148e0 2e 0a 2a 2f 0a 76 6f 69 64 20 74 65 73 74 5f 77  ..*/.void test_w
148f0 69 74 68 6f 75 74 5f 72 6f 77 69 64 28 76 6f 69  ithout_rowid(voi
14900 64 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  d){.  int i, j;.
14910 20 20 53 74 6d 74 20 71 3b 0a 20 20 42 6c 6f 62    Stmt q;.  Blob
14920 20 61 6c 6c 53 71 6c 3b 0a 20 20 69 6e 74 20 64   allSql;.  int d
14930 72 79 52 75 6e 20 3d 20 66 69 6e 64 5f 6f 70 74  ryRun = find_opt
14940 69 6f 6e 28 22 64 72 79 2d 72 75 6e 22 2c 20 22  ion("dry-run", "
14950 6e 22 2c 20 30 29 21 3d 30 3b 0a 20 20 66 6f 72  n", 0)!=0;.  for
14960 28 69 3d 32 3b 20 69 3c 67 2e 61 72 67 63 3b 20  (i=2; i<g.argc; 
14970 69 2b 2b 29 7b 0a 20 20 20 20 64 62 5f 6f 70 65  i++){.    db_ope
14980 6e 5f 6f 72 5f 61 74 74 61 63 68 28 67 2e 61 72  n_or_attach(g.ar
14990 67 76 5b 69 5d 2c 20 22 6d 61 69 6e 22 2c 20 30  gv[i], "main", 0
149a0 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 69 6e 69 74  );.    blob_init
149b0 28 26 61 6c 6c 53 71 6c 2c 20 22 42 45 47 49 4e  (&allSql, "BEGIN
149c0 3b 5c 6e 22 2c 20 2d 31 29 3b 0a 20 20 20 20 64  ;\n", -1);.    d
149d0 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20  b_prepare(&q,.  
149e0 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
149f0 2c 20 73 71 6c 20 46 52 4f 4d 20 6d 61 69 6e 2e  , sql FROM main.
14a00 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
14a10 20 20 20 20 20 20 22 20 57 48 45 52 45 20 74 79        " WHERE ty
14a20 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 73  pe='table' AND s
14a30 71 6c 20 4e 4f 54 20 4c 49 4b 45 20 27 25 25 57  ql NOT LIKE '%%W
14a40 49 54 48 4f 55 54 20 52 4f 57 49 44 25 25 27 22  ITHOUT ROWID%%'"
14a50 0a 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 6e  .      "   AND n
14a60 61 6d 65 20 49 4e 20 28 27 67 6c 6f 62 61 6c 5f  ame IN ('global_
14a70 63 6f 6e 66 69 67 27 2c 27 73 68 75 6e 27 2c 27  config','shun','
14a80 63 6f 6e 63 65 61 6c 65 64 27 2c 27 63 6f 6e 66  concealed','conf
14a90 69 67 27 2c 22 0a 20 20 20 20 20 20 20 20 20 20  ig',".          
14aa0 20 20 20 20 20 20 20 20 20 20 22 20 20 27 70 6c            "  'pl
14ab0 69 6e 6b 27 2c 27 74 61 67 78 72 65 66 27 2c 27  ink','tagxref','
14ac0 62 61 63 6b 6c 69 6e 6b 27 2c 27 76 63 61 63 68  backlink','vcach
14ad0 65 27 29 3b 22 0a 20 20 20 20 29 3b 0a 20 20 20  e');".    );.   
14ae0 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28   while( db_step(
14af0 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &q)==SQLITE_ROW 
14b00 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
14b10 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 64 62  har *zTName = db
14b20 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
14b30 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   0);.      const
14b40 20 63 68 61 72 20 2a 7a 4f 72 69 67 53 71 6c 20   char *zOrigSql 
14b50 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
14b60 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 42  (&q, 1);.      B
14b70 6c 6f 62 20 6e 65 77 53 71 6c 3b 0a 20 20 20 20  lob newSql;.    
14b80 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 6e 65 77    blob_init(&new
14b90 53 71 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Sql, 0, 0);.    
14ba0 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 4f 72 69 67    for(j=0; zOrig
14bb0 53 71 6c 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  Sql[j]; j++){.  
14bc0 20 20 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c        if( fossil
14bd0 5f 73 74 72 6e 69 63 6d 70 28 7a 4f 72 69 67 53  _strnicmp(zOrigS
14be0 71 6c 2b 6a 2c 22 75 6e 69 71 75 65 22 2c 36 29  ql+j,"unique",6)
14bf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
14c00 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 6e 65   blob_append(&ne
14c10 77 53 71 6c 2c 20 7a 4f 72 69 67 53 71 6c 2c 20  wSql, zOrigSql, 
14c20 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 6c  j);.          bl
14c30 6f 62 5f 61 70 70 65 6e 64 28 26 6e 65 77 53 71  ob_append(&newSq
14c40 6c 2c 20 22 50 52 49 4d 41 52 59 20 4b 45 59 22  l, "PRIMARY KEY"
14c50 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , -1);.         
14c60 20 7a 4f 72 69 67 53 71 6c 20 2b 3d 20 6a 2b 36   zOrigSql += j+6
14c70 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20  ;.          j = 
14c80 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -1;.        }.  
14c90 20 20 20 20 7d 0a 20 20 20 20 20 20 62 6c 6f 62      }.      blob
14ca0 5f 61 70 70 65 6e 64 28 26 6e 65 77 53 71 6c 2c  _append(&newSql,
14cb0 20 7a 4f 72 69 67 53 71 6c 2c 20 2d 31 29 3b 0a   zOrigSql, -1);.
14cc0 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
14cd0 64 66 28 26 61 6c 6c 53 71 6c 2c 0a 20 20 20 20  df(&allSql,.    
14ce0 20 20 20 20 20 22 41 4c 54 45 52 20 54 41 42 4c       "ALTER TABL
14cf0 45 20 25 73 20 52 45 4e 41 4d 45 20 54 4f 20 78  E %s RENAME TO x
14d00 5f 25 73 3b 5c 6e 22 0a 20 20 20 20 20 20 20 20  _%s;\n".        
14d10 20 22 25 73 20 57 49 54 48 4f 55 54 20 52 4f 57   "%s WITHOUT ROW
14d20 49 44 3b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  ID;\n".         
14d30 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 73 20  "INSERT INTO %s 
14d40 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 78 5f  SELECT * FROM x_
14d50 25 73 3b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  %s;\n".         
14d60 22 44 52 4f 50 20 54 41 42 4c 45 20 78 5f 25 73  "DROP TABLE x_%s
14d70 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  ;\n",.         z
14d80 54 4e 61 6d 65 2c 20 7a 54 4e 61 6d 65 2c 20 62  TName, zTName, b
14d90 6c 6f 62 5f 73 74 72 28 26 6e 65 77 53 71 6c 29  lob_str(&newSql)
14da0 2c 20 7a 54 4e 61 6d 65 2c 20 7a 54 4e 61 6d 65  , zTName, zTName
14db0 2c 20 7a 54 4e 61 6d 65 0a 20 20 20 20 20 20 29  , zTName.      )
14dc0 3b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70  ;.      fossil_p
14dd0 72 69 6e 74 28 22 43 6f 6e 76 65 72 74 69 6e 67  rint("Converting
14de0 20 74 61 62 6c 65 20 25 73 20 6f 66 20 25 73 20   table %s of %s 
14df0 74 6f 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  to WITHOUT ROWID
14e00 2e 5c 6e 22 2c 20 7a 54 4e 61 6d 65 2c 20 67 2e  .\n", zTName, g.
14e10 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  argv[i]);.      
14e20 62 6c 6f 62 5f 72 65 73 65 74 28 26 6e 65 77 53  blob_reset(&newS
14e30 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ql);.    }.    b
14e40 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 61 6c 6c  lob_appendf(&all
14e50 53 71 6c 2c 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22  Sql, "COMMIT;\n"
14e60 29 3b 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69  );.    db_finali
14e70 7a 65 28 26 71 29 3b 0a 20 20 20 20 69 66 28 20  ze(&q);.    if( 
14e80 64 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20 20  dryRun ){.      
14e90 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 53 51  fossil_print("SQ
14ea0 4c 20 74 68 61 74 20 77 6f 75 6c 64 20 68 61 76  L that would hav
14eb0 65 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64  e been evaluated
14ec0 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 73  :\n");.      fos
14ed0 73 69 6c 5f 70 72 69 6e 74 28 22 2d 2d 2d 2d 2d  sil_print("-----
14ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f10 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20  --------\n");.  
14f20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74      fossil_print
14f30 28 22 25 73 22 2c 20 62 6c 6f 62 5f 73 74 72 28  ("%s", blob_str(
14f40 26 61 6c 6c 53 71 6c 29 29 3b 0a 20 20 20 20 7d  &allSql));.    }
14f50 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 5f 6d  else{.      db_m
14f60 75 6c 74 69 5f 65 78 65 63 28 22 25 73 22 2c 20  ulti_exec("%s", 
14f70 62 6c 6f 62 5f 73 74 72 28 26 61 6c 6c 53 71 6c  blob_str(&allSql
14f80 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c  ));.    }.    bl
14f90 6f 62 5f 72 65 73 65 74 28 26 61 6c 6c 53 71 6c  ob_reset(&allSql
14fa0 29 3b 0a 20 20 20 20 64 62 5f 63 6c 6f 73 65 28  );.    db_close(
14fb0 31 29 3b 0a 20 20 7d 0a 7d 0a                    1);.  }.}.