Fossil

Hex Artifact Content
Login

Artifact 9ceff8564cd4ffaebb7e3b8efc960fc97a744014:


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 76 61 5f 73 74 61 72 74 28 61 70  1;.  va_start(ap
07c0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20  , zFormat);.  z 
07d0: 3d 20 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  = vmprintf(zForm
07e0: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
07f0: 64 28 61 70 29 3b 0a 23 69 66 64 65 66 20 46 4f  d(ap);.#ifdef FO
0800: 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e  SSIL_ENABLE_JSON
0810: 0a 20 20 69 66 28 20 67 2e 6a 73 6f 6e 2e 69 73  .  if( g.json.is
0820: 4a 73 6f 6e 4d 6f 64 65 20 29 7b 0a 20 20 20 20  JsonMode ){.    
0830: 6a 73 6f 6e 5f 65 72 72 28 20 30 2c 20 7a 2c 20  json_err( 0, z, 
0840: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 69  1 );.    if( g.i
0850: 73 48 54 54 50 20 29 7b 0a 20 20 20 20 20 20 72  sHTTP ){.      r
0860: 63 20 3d 20 30 20 2f 2a 20 61 76 6f 69 64 20 48  c = 0 /* avoid H
0870: 54 54 50 20 35 30 30 20 2a 2f 3b 0a 20 20 20 20  TTP 500 */;.    
0880: 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 0a 23 65 6e  }.  }.  else.#en
0890: 64 69 66 20 2f 2a 20 46 4f 53 53 49 4c 5f 45 4e  dif /* FOSSIL_EN
08a0: 41 42 4c 45 5f 4a 53 4f 4e 20 2a 2f 0a 20 20 69  ABLE_JSON */.  i
08b0: 66 28 20 67 2e 78 66 65 72 50 61 6e 69 63 20 29  f( g.xferPanic )
08c0: 7b 0a 20 20 20 20 63 67 69 5f 72 65 73 65 74 5f  {.    cgi_reset_
08d0: 63 6f 6e 74 65 6e 74 28 29 3b 0a 20 20 20 20 40  content();.    @
08e0: 20 65 72 72 6f 72 20 44 61 74 61 62 61 73 65 5c   error Database\
08f0: 73 65 72 72 6f 72 3a 5c 73 25 46 28 7a 29 0a 20  serror:\s%F(z). 
0900: 20 20 20 20 20 63 67 69 5f 72 65 70 6c 79 28 29       cgi_reply()
0910: 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
0920: 20 67 2e 63 67 69 4f 75 74 70 75 74 20 29 7b 0a   g.cgiOutput ){.
0930: 20 20 20 20 67 2e 63 67 69 4f 75 74 70 75 74 20      g.cgiOutput 
0940: 3d 20 30 3b 0a 20 20 20 20 63 67 69 5f 70 72 69  = 0;.    cgi_pri
0950: 6e 74 66 28 22 3c 68 31 3e 44 61 74 61 62 61 73  ntf("<h1>Databas
0960: 65 20 45 72 72 6f 72 3c 2f 68 31 3e 5c 6e 3c 70  e Error</h1>\n<p
0970: 3e 25 68 3c 2f 70 3e 5c 6e 22 2c 20 7a 29 3b 0a  >%h</p>\n", z);.
0980: 20 20 20 20 63 67 69 5f 72 65 70 6c 79 28 29 3b      cgi_reply();
0990: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70  .  }else{.    fp
09a0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
09b0: 73 3a 20 25 73 5c 6e 22 2c 20 67 2e 61 72 67 76  s: %s\n", g.argv
09c0: 5b 30 5d 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 66  [0], z);.  }.  f
09d0: 72 65 65 28 7a 29 3b 0a 20 20 64 62 5f 66 6f 72  ree(z);.  db_for
09e0: 63 65 5f 72 6f 6c 6c 62 61 63 6b 28 29 3b 0a 20  ce_rollback();. 
09f0: 20 66 6f 73 73 69 6c 5f 65 78 69 74 28 72 63 29   fossil_exit(rc)
0a00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 73  ;.}../*.** All s
0a10: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 74  tatic variable t
0a20: 68 61 74 20 61 20 75 73 65 64 20 62 79 20 6f 6e  hat a used by on
0a30: 6c 79 20 74 68 69 73 20 66 69 6c 65 20 61 72 65  ly this file are
0a40: 20 67 61 74 68 65 72 65 64 20 69 6e 74 6f 0a 2a   gathered into.*
0a50: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
0a60: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
0a70: 61 74 69 63 20 73 74 72 75 63 74 20 44 62 4c 6f  atic struct DbLo
0a80: 63 61 6c 44 61 74 61 20 7b 0a 20 20 69 6e 74 20  calData {.  int 
0a90: 6e 42 65 67 69 6e 3b 20 20 20 20 20 20 20 20 20  nBegin;         
0aa0: 20 20 20 20 20 20 2f 2a 20 4e 65 73 74 69 6e 67        /* Nesting
0ab0: 20 64 65 70 74 68 20 6f 66 20 42 45 47 49 4e 20   depth of BEGIN 
0ac0: 2a 2f 0a 20 20 69 6e 74 20 64 6f 52 6f 6c 6c 62  */.  int doRollb
0ad0: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ack;           /
0ae0: 2a 20 54 72 75 65 20 74 6f 20 66 6f 72 63 65 20  * True to force 
0af0: 61 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  a rollback */.  
0b00: 69 6e 74 20 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 3b  int nCommitHook;
0b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0b20: 62 65 72 20 6f 66 20 63 6f 6d 6d 69 74 20 68 6f  ber of commit ho
0b30: 6f 6b 73 20 2a 2f 0a 20 20 53 74 6d 74 20 2a 70  oks */.  Stmt *p
0b40: 41 6c 6c 53 74 6d 74 3b 20 20 20 20 20 20 20 20  AllStmt;        
0b50: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
0b60: 6c 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 73 74  l unfinalized st
0b70: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  atements */.  in
0b80: 74 20 6e 50 72 65 70 61 72 65 3b 20 20 20 20 20  t nPrepare;     
0b90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0ba0: 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71  r of calls to sq
0bb0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
0bc0: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 65 6c  () */.  int nDel
0bd0: 65 74 65 4f 6e 46 61 69 6c 3b 20 20 20 20 20 20  eteOnFail;      
0be0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
0bf0: 6e 74 72 69 65 73 20 69 6e 20 61 7a 44 65 6c 65  ntries in azDele
0c00: 74 65 4f 6e 46 61 69 6c 5b 5d 20 2a 2f 0a 20 20  teOnFail[] */.  
0c10: 73 74 72 75 63 74 20 73 43 6f 6d 6d 69 74 48 6f  struct sCommitHo
0c20: 6f 6b 20 7b 0a 20 20 20 20 69 6e 74 20 28 2a 78  ok {.    int (*x
0c30: 48 6f 6f 6b 29 28 76 6f 69 64 29 3b 20 20 20 20  Hook)(void);    
0c40: 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
0c50: 73 20 74 6f 20 63 61 6c 6c 20 61 74 20 64 62 5f  s to call at db_
0c60: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
0c70: 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65 71  ) */.    int seq
0c80: 75 65 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20  uence;          
0c90: 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 75 6e       /* Call fun
0ca0: 63 74 69 6f 6e 73 20 69 6e 20 73 65 71 75 65 6e  ctions in sequen
0cb0: 63 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 7d 20  ce order */.  } 
0cc0: 61 48 6f 6f 6b 5b 35 5d 3b 0a 20 20 63 68 61 72  aHook[5];.  char
0cd0: 20 2a 61 7a 44 65 6c 65 74 65 4f 6e 46 61 69 6c   *azDeleteOnFail
0ce0: 5b 33 5d 3b 20 20 2f 2a 20 46 69 6c 65 73 20 74  [3];  /* Files t
0cf0: 6f 20 64 65 6c 65 74 65 20 6f 6e 20 61 20 66 61  o delete on a fa
0d00: 69 6c 75 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  ilure */.  char 
0d10: 2a 61 7a 42 65 66 6f 72 65 43 6f 6d 6d 69 74 5b  *azBeforeCommit[
0d20: 35 5d 3b 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 73  5];  /* Commands
0d30: 20 74 6f 20 72 75 6e 20 70 72 69 6f 72 20 74 6f   to run prior to
0d40: 20 43 4f 4d 4d 49 54 20 2a 2f 0a 20 20 69 6e 74   COMMIT */.  int
0d50: 20 6e 42 65 66 6f 72 65 43 6f 6d 6d 69 74 3b 20   nBeforeCommit; 
0d60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0d70: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
0d80: 7a 42 65 66 6f 72 65 43 6f 6d 6d 69 74 20 2a 2f  zBeforeCommit */
0d90: 0a 20 20 69 6e 74 20 6e 50 72 69 6f 72 43 68 61  .  int nPriorCha
0da0: 6e 67 65 73 3b 20 20 20 20 20 20 20 20 2f 2a 20  nges;        /* 
0db0: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
0dc0: 61 6e 67 65 73 28 29 20 61 74 20 74 72 61 6e 73  anges() at trans
0dd0: 61 63 74 69 6f 6e 20 73 74 61 72 74 20 2a 2f 0a  action start */.
0de0: 7d 20 64 62 20 3d 20 7b 30 2c 20 30 2c 20 30 2c  } db = {0, 0, 0,
0df0: 20 30 2c 20 30 2c 20 30 2c 20 7d 3b 0a 0a 2f 2a   0, 0, 0, };../*
0e00: 0a 2a 2a 20 41 72 72 61 6e 67 65 20 66 6f 72 20  .** Arrange for 
0e10: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 74  the given file t
0e20: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 20  o be deleted on 
0e30: 61 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 76 6f  a failure..*/.vo
0e40: 69 64 20 64 62 5f 64 65 6c 65 74 65 5f 6f 6e 5f  id db_delete_on_
0e50: 66 61 69 6c 75 72 65 28 63 6f 6e 73 74 20 63 68  failure(const ch
0e60: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
0e70: 20 20 61 73 73 65 72 74 28 20 64 62 2e 6e 44 65    assert( db.nDe
0e80: 6c 65 74 65 4f 6e 46 61 69 6c 3c 63 6f 75 6e 74  leteOnFail<count
0e90: 28 64 62 2e 61 7a 44 65 6c 65 74 65 4f 6e 46 61  (db.azDeleteOnFa
0ea0: 69 6c 29 20 29 3b 0a 20 20 64 62 2e 61 7a 44 65  il) );.  db.azDe
0eb0: 6c 65 74 65 4f 6e 46 61 69 6c 5b 64 62 2e 6e 44  leteOnFail[db.nD
0ec0: 65 6c 65 74 65 4f 6e 46 61 69 6c 2b 2b 5d 20 3d  eleteOnFail++] =
0ed0: 20 66 6f 73 73 69 6c 5f 73 74 72 64 75 70 28 7a   fossil_strdup(z
0ee0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  Filename);.}../*
0ef0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0f00: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
0f10: 65 20 53 51 4c 69 74 65 20 63 6f 6d 6d 69 74 2d  e SQLite commit-
0f20: 68 6f 6f 6b 20 6d 65 63 68 61 6e 69 73 6d 0a 2a  hook mechanism.*
0f30: 2a 20 6a 75 73 74 20 70 72 69 6f 72 20 74 6f 20  * just prior to 
0f40: 65 61 63 68 20 63 6f 6d 6d 69 74 2e 20 20 41 6c  each commit.  Al
0f50: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64  l this routine d
0f60: 6f 65 73 20 69 73 20 76 65 72 69 66 79 0a 2a 2a  oes is verify.**
0f70: 20 74 68 61 74 20 6e 42 65 67 69 6e 20 72 65 61   that nBegin rea
0f80: 6c 6c 79 20 69 73 20 7a 65 72 6f 2e 20 20 54 68  lly is zero.  Th
0f90: 61 74 20 69 6e 73 75 72 65 73 20 74 68 61 74 20  at insures that 
0fa0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 0a 2a 2a 20  transactions.** 
0fb0: 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 62 79  cannot commit by
0fc0: 20 61 6e 79 20 6d 65 61 6e 73 20 6f 74 68 65 72   any means other
0fd0: 20 74 68 61 6e 20 62 79 20 63 61 6c 6c 69 6e 67   than by calling
0fe0: 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74   db_end_transact
0ff0: 69 6f 6e 28 29 0a 2a 2a 20 62 65 6c 6f 77 2e 0a  ion().** below..
1000: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6a 75  **.** This is ju
1010: 73 74 20 61 20 73 61 66 65 74 79 20 61 6e 64 20  st a safety and 
1020: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2f  sanity check..*/
1030: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f 76  .static int db_v
1040: 65 72 69 66 79 5f 61 74 5f 63 6f 6d 6d 69 74 28  erify_at_commit(
1050: 76 6f 69 64 20 2a 6e 6f 74 55 73 65 64 29 7b 0a  void *notUsed){.
1060: 20 20 69 66 28 20 64 62 2e 6e 42 65 67 69 6e 20    if( db.nBegin 
1070: 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61  ){.    fossil_pa
1080: 6e 69 63 28 22 69 6c 6c 65 67 61 6c 20 63 6f 6d  nic("illegal com
1090: 6d 69 74 20 61 74 74 65 6d 70 74 22 29 3b 0a 20  mit attempt");. 
10a0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
10b0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
10c0: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 6e 64 20  /*.** Begin and 
10d0: 65 6e 64 20 61 20 6e 65 73 74 65 64 20 74 72 61  end a nested tra
10e0: 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
10f0: 20 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61   db_begin_transa
1100: 63 74 69 6f 6e 28 76 6f 69 64 29 7b 0a 20 20 69  ction(void){.  i
1110: 66 28 20 64 62 2e 6e 42 65 67 69 6e 3d 3d 30 20  f( db.nBegin==0 
1120: 29 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  ){.    db_multi_
1130: 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b 0a 20  exec("BEGIN");. 
1140: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
1150: 74 5f 68 6f 6f 6b 28 67 2e 64 62 2c 20 64 62 5f  t_hook(g.db, db_
1160: 76 65 72 69 66 79 5f 61 74 5f 63 6f 6d 6d 69 74  verify_at_commit
1170: 2c 20 30 29 3b 0a 20 20 20 20 64 62 2e 6e 50 72  , 0);.    db.nPr
1180: 69 6f 72 43 68 61 6e 67 65 73 20 3d 20 73 71 6c  iorChanges = sql
1190: 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67  ite3_total_chang
11a0: 65 73 28 67 2e 64 62 29 3b 0a 20 20 7d 0a 20 20  es(g.db);.  }.  
11b0: 64 62 2e 6e 42 65 67 69 6e 2b 2b 3b 0a 7d 0a 76  db.nBegin++;.}.v
11c0: 6f 69 64 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73  oid db_end_trans
11d0: 61 63 74 69 6f 6e 28 69 6e 74 20 72 6f 6c 6c 62  action(int rollb
11e0: 61 63 6b 46 6c 61 67 29 7b 0a 20 20 69 66 28 20  ackFlag){.  if( 
11f0: 67 2e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  g.db==0 ) return
1200: 3b 0a 20 20 69 66 28 20 64 62 2e 6e 42 65 67 69  ;.  if( db.nBegi
1210: 6e 3c 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n<=0 ) return;. 
1220: 20 69 66 28 20 72 6f 6c 6c 62 61 63 6b 46 6c 61   if( rollbackFla
1230: 67 20 29 20 64 62 2e 64 6f 52 6f 6c 6c 62 61 63  g ) db.doRollbac
1240: 6b 20 3d 20 31 3b 0a 20 20 64 62 2e 6e 42 65 67  k = 1;.  db.nBeg
1250: 69 6e 2d 2d 3b 0a 20 20 69 66 28 20 64 62 2e 6e  in--;.  if( db.n
1260: 42 65 67 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  Begin==0 ){.    
1270: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 64  int i;.    if( d
1280: 62 2e 64 6f 52 6f 6c 6c 62 61 63 6b 3d 3d 30 20  b.doRollback==0 
1290: 26 26 20 64 62 2e 6e 50 72 69 6f 72 43 68 61 6e  && db.nPriorChan
12a0: 67 65 73 3c 73 71 6c 69 74 65 33 5f 74 6f 74 61  ges<sqlite3_tota
12b0: 6c 5f 63 68 61 6e 67 65 73 28 67 2e 64 62 29 20  l_changes(g.db) 
12c0: 29 7b 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a  ){.      i = 0;.
12d0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 64 62 2e        while( db.
12e0: 6e 42 65 66 6f 72 65 43 6f 6d 6d 69 74 20 29 7b  nBeforeCommit ){
12f0: 0a 20 20 20 20 20 20 20 20 64 62 2e 6e 42 65 66  .        db.nBef
1300: 6f 72 65 43 6f 6d 6d 69 74 2d 2d 3b 0a 20 20 20  oreCommit--;.   
1310: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65       sqlite3_exe
1320: 63 28 67 2e 64 62 2c 20 64 62 2e 61 7a 42 65 66  c(g.db, db.azBef
1330: 6f 72 65 43 6f 6d 6d 69 74 5b 69 5d 2c 20 30 2c  oreCommit[i], 0,
1340: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
1350: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2e  sqlite3_free(db.
1360: 61 7a 42 65 66 6f 72 65 43 6f 6d 6d 69 74 5b 69  azBeforeCommit[i
1370: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b  ]);.        i++;
1380: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c  .      }.      l
1390: 65 61 66 5f 64 6f 5f 70 65 6e 64 69 6e 67 5f 63  eaf_do_pending_c
13a0: 68 65 63 6b 73 28 29 3b 0a 20 20 20 20 7d 0a 20  hecks();.    }. 
13b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 64 62 2e 64     for(i=0; db.d
13c0: 6f 52 6f 6c 6c 62 61 63 6b 3d 3d 30 20 26 26 20  oRollback==0 && 
13d0: 69 3c 64 62 2e 6e 43 6f 6d 6d 69 74 48 6f 6f 6b  i<db.nCommitHook
13e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 64 62  ; i++){.      db
13f0: 2e 64 6f 52 6f 6c 6c 62 61 63 6b 20 7c 3d 20 64  .doRollback |= d
1400: 62 2e 61 48 6f 6f 6b 5b 69 5d 2e 78 48 6f 6f 6b  b.aHook[i].xHook
1410: 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  ();.    }.    wh
1420: 69 6c 65 28 20 64 62 2e 70 41 6c 6c 53 74 6d 74  ile( db.pAllStmt
1430: 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 66 69 6e   ){.      db_fin
1440: 61 6c 69 7a 65 28 64 62 2e 70 41 6c 6c 53 74 6d  alize(db.pAllStm
1450: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  t);.    }.    db
1460: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 25 73 22  _multi_exec("%s"
1470: 2c 20 64 62 2e 64 6f 52 6f 6c 6c 62 61 63 6b 20  , db.doRollback 
1480: 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20 22  ? "ROLLBACK" : "
1490: 43 4f 4d 4d 49 54 22 29 3b 0a 20 20 20 20 64 62  COMMIT");.    db
14a0: 2e 64 6f 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  .doRollback = 0;
14b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f  .  }.}../*.** Fo
14c0: 72 63 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61  rce a rollback a
14d0: 6e 64 20 73 68 75 74 64 6f 77 6e 20 74 68 65 20  nd shutdown the 
14e0: 64 61 74 61 62 61 73 65 0a 2a 2f 0a 76 6f 69 64  database.*/.void
14f0: 20 64 62 5f 66 6f 72 63 65 5f 72 6f 6c 6c 62 61   db_force_rollba
1500: 63 6b 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20  ck(void){.  int 
1510: 69 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  i;.  static int 
1520: 62 75 73 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69  busy = 0;.  sqli
1530: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1540: 3d 20 30 3b 0a 20 20 69 66 28 20 62 75 73 79 20  = 0;.  if( busy 
1550: 7c 7c 20 67 2e 64 62 3d 3d 30 20 29 20 72 65 74  || g.db==0 ) ret
1560: 75 72 6e 3b 0a 20 20 62 75 73 79 20 3d 20 31 3b  urn;.  busy = 1;
1570: 0a 20 20 75 6e 64 6f 5f 72 6f 6c 6c 62 61 63 6b  .  undo_rollback
1580: 28 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 53  ();.  while( (pS
1590: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 6e 65  tmt = sqlite3_ne
15a0: 78 74 5f 73 74 6d 74 28 67 2e 64 62 2c 70 53 74  xt_stmt(g.db,pSt
15b0: 6d 74 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  mt))!=0 ){.    s
15c0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
15d0: 6d 74 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  mt);.  }.  while
15e0: 28 20 64 62 2e 70 41 6c 6c 53 74 6d 74 20 29 7b  ( db.pAllStmt ){
15f0: 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65  .    db_finalize
1600: 28 64 62 2e 70 41 6c 6c 53 74 6d 74 29 3b 0a 20  (db.pAllStmt);. 
1610: 20 7d 0a 20 20 69 66 28 20 64 62 2e 6e 42 65 67   }.  if( db.nBeg
1620: 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  in ){.    sqlite
1630: 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 22 52 4f  3_exec(g.db, "RO
1640: 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20 30  LLBACK", 0, 0, 0
1650: 29 3b 0a 20 20 20 20 64 62 2e 6e 42 65 67 69 6e  );.    db.nBegin
1660: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 75 73 79   = 0;.  }.  busy
1670: 20 3d 20 30 3b 0a 20 20 64 62 5f 63 6c 6f 73 65   = 0;.  db_close
1680: 28 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  (0);.  for(i=0; 
1690: 69 3c 64 62 2e 6e 44 65 6c 65 74 65 4f 6e 46 61  i<db.nDeleteOnFa
16a0: 69 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 69  il; i++){.    fi
16b0: 6c 65 5f 64 65 6c 65 74 65 28 64 62 2e 61 7a 44  le_delete(db.azD
16c0: 65 6c 65 74 65 4f 6e 46 61 69 6c 5b 69 5d 29 3b  eleteOnFail[i]);
16d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
16e0: 73 74 61 6c 6c 20 61 20 63 6f 6d 6d 69 74 20 68  stall a commit h
16f0: 6f 6f 6b 2e 20 20 48 6f 6f 6b 73 20 61 72 65 20  ook.  Hooks are 
1700: 69 6e 73 74 61 6c 6c 65 64 20 69 6e 20 73 65 71  installed in seq
1710: 75 65 6e 63 65 20 6f 72 64 65 72 2e 0a 2a 2a 20  uence order..** 
1720: 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74  It is an error t
1730: 6f 20 69 6e 73 74 61 6c 6c 20 74 68 65 20 73 61  o install the sa
1740: 6d 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 6d  me commit hook m
1750: 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2e 0a 2a  ore than once..*
1760: 2a 0a 2a 2a 20 45 61 63 68 20 63 6f 6d 6d 69 74  *.** Each commit
1770: 20 68 6f 6f 6b 20 69 73 20 63 61 6c 6c 65 64 20   hook is called 
1780: 28 69 6e 20 6f 72 64 65 72 20 6f 66 20 61 73 63  (in order of asc
1790: 65 6e 64 69 6e 67 20 73 65 71 75 65 6e 63 65 29  ending sequence)
17a0: 20 61 74 0a 2a 2a 20 65 61 63 68 20 63 6f 6d 6d   at.** each comm
17b0: 69 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49  it operation.  I
17c0: 66 20 61 6e 79 20 63 6f 6d 6d 69 74 20 68 6f 6f  f any commit hoo
17d0: 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
17e0: 72 6f 2c 0a 2a 2a 20 74 68 65 20 73 75 62 73 65  ro,.** the subse
17f0: 71 75 65 6e 63 65 20 63 6f 6d 6d 69 74 20 68 6f  quence commit ho
1800: 6f 6b 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20  oks are omitted 
1810: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1820: 69 6f 6e 0a 2a 2a 20 72 6f 6c 6c 73 20 62 61 63  ion.** rolls bac
1830: 6b 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 6f  k rather than co
1840: 6d 6d 69 74 2e 20 20 49 74 20 69 73 20 74 68 65  mmit.  It is the
1850: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1860: 6f 66 20 74 68 65 0a 2a 2a 20 68 6f 6f 6b 73 20  of the.** hooks 
1870: 74 68 65 6d 73 65 6c 76 65 73 20 74 6f 20 69 73  themselves to is
1880: 73 75 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  sue any error me
1890: 73 73 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ssages..*/.void 
18a0: 64 62 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 69  db_commit_hook(i
18b0: 6e 74 20 28 2a 78 29 28 76 6f 69 64 29 2c 20 69  nt (*x)(void), i
18c0: 6e 74 20 73 65 71 75 65 6e 63 65 29 7b 0a 20 20  nt sequence){.  
18d0: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
18e0: 20 64 62 2e 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 20   db.nCommitHook 
18f0: 3c 20 63 6f 75 6e 74 28 64 62 2e 61 48 6f 6f 6b  < count(db.aHook
1900: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ) );.  for(i=0; 
1910: 69 3c 64 62 2e 6e 43 6f 6d 6d 69 74 48 6f 6f 6b  i<db.nCommitHook
1920: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
1930: 72 74 28 20 78 21 3d 64 62 2e 61 48 6f 6f 6b 5b  rt( x!=db.aHook[
1940: 69 5d 2e 78 48 6f 6f 6b 20 29 3b 0a 20 20 20 20  i].xHook );.    
1950: 69 66 28 20 64 62 2e 61 48 6f 6f 6b 5b 69 5d 2e  if( db.aHook[i].
1960: 73 65 71 75 65 6e 63 65 3e 73 65 71 75 65 6e 63  sequence>sequenc
1970: 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  e ){.      int s
1980: 20 3d 20 73 65 71 75 65 6e 63 65 3b 0a 20 20 20   = sequence;.   
1990: 20 20 20 69 6e 74 20 28 2a 78 53 29 28 76 6f 69     int (*xS)(voi
19a0: 64 29 20 3d 20 78 3b 0a 20 20 20 20 20 20 73 65  d) = x;.      se
19b0: 71 75 65 6e 63 65 20 3d 20 64 62 2e 61 48 6f 6f  quence = db.aHoo
19c0: 6b 5b 69 5d 2e 73 65 71 75 65 6e 63 65 3b 0a 20  k[i].sequence;. 
19d0: 20 20 20 20 20 78 20 3d 20 64 62 2e 61 48 6f 6f       x = db.aHoo
19e0: 6b 5b 69 5d 2e 78 48 6f 6f 6b 3b 0a 20 20 20 20  k[i].xHook;.    
19f0: 20 20 64 62 2e 61 48 6f 6f 6b 5b 69 5d 2e 73 65    db.aHook[i].se
1a00: 71 75 65 6e 63 65 20 3d 20 73 3b 0a 20 20 20 20  quence = s;.    
1a10: 20 20 64 62 2e 61 48 6f 6f 6b 5b 69 5d 2e 78 48    db.aHook[i].xH
1a20: 6f 6f 6b 20 3d 20 78 53 3b 0a 20 20 20 20 7d 0a  ook = xS;.    }.
1a30: 20 20 7d 0a 20 20 64 62 2e 61 48 6f 6f 6b 5b 64    }.  db.aHook[d
1a40: 62 2e 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 5d 2e 73  b.nCommitHook].s
1a50: 65 71 75 65 6e 63 65 20 3d 20 73 65 71 75 65 6e  equence = sequen
1a60: 63 65 3b 0a 20 20 64 62 2e 61 48 6f 6f 6b 5b 64  ce;.  db.aHook[d
1a70: 62 2e 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 5d 2e 78  b.nCommitHook].x
1a80: 48 6f 6f 6b 20 3d 20 78 3b 0a 20 20 64 62 2e 6e  Hook = x;.  db.n
1a90: 43 6f 6d 6d 69 74 48 6f 6f 6b 2b 2b 3b 0a 7d 0a  CommitHook++;.}.
1aa0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
1ab0: 20 53 74 6d 74 2e 20 20 41 73 73 75 6d 65 20 74   Stmt.  Assume t
1ac0: 68 61 74 20 74 68 65 20 53 74 6d 74 20 69 73 20  hat the Stmt is 
1ad0: 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 69 6e 69  previously unini
1ae0: 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 20 49 66 20  tialized..** If 
1af0: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
1b00: 20 63 6f 6e 74 61 69 6e 73 20 6d 75 6c 74 69 70   contains multip
1b10: 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  le SQL statement
1b20: 73 2c 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  s, only the firs
1b30: 74 0a 2a 2a 20 6f 6e 65 20 69 73 20 70 72 6f 63  t.** one is proc
1b40: 65 73 73 65 64 2e 20 20 41 6c 6c 20 73 74 61 74  essed.  All stat
1b50: 65 6d 65 6e 74 73 20 62 65 79 6f 6e 64 20 74 68  ements beyond th
1b60: 65 20 66 69 72 73 74 20 61 72 65 20 73 69 6c 65  e first are sile
1b70: 6e 74 6c 79 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  ntly ignored..*/
1b80: 0a 69 6e 74 20 64 62 5f 76 70 72 65 70 61 72 65  .int db_vprepare
1b90: 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e  (Stmt *pStmt, in
1ba0: 74 20 65 72 72 4f 6b 2c 20 63 6f 6e 73 74 20 63  t errOk, const c
1bb0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61  har *zFormat, va
1bc0: 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 69 6e 74  _list ap){.  int
1bd0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71   rc;.  char *zSq
1be0: 6c 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26  l;.  blob_zero(&
1bf0: 70 53 74 6d 74 2d 3e 73 71 6c 29 3b 0a 20 20 62  pStmt->sql);.  b
1c00: 6c 6f 62 5f 76 61 70 70 65 6e 64 66 28 26 70 53  lob_vappendf(&pS
1c10: 74 6d 74 2d 3e 73 71 6c 2c 20 7a 46 6f 72 6d 61  tmt->sql, zForma
1c20: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
1c30: 28 61 70 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 62  (ap);.  zSql = b
1c40: 6c 6f 62 5f 73 74 72 28 26 70 53 74 6d 74 2d 3e  lob_str(&pStmt->
1c50: 73 71 6c 29 3b 0a 20 20 64 62 2e 6e 50 72 65 70  sql);.  db.nPrep
1c60: 61 72 65 2b 2b 3b 0a 20 20 72 63 20 3d 20 73 71  are++;.  rc = sq
1c70: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1c80: 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  (g.db, zSql, -1,
1c90: 20 26 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20   &pStmt->pStmt, 
1ca0: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  0);.  if( rc!=0 
1cb0: 26 26 20 21 65 72 72 4f 6b 20 29 7b 0a 20 20 20  && !errOk ){.   
1cc0: 20 64 62 5f 65 72 72 28 22 25 73 5c 6e 25 73 22   db_err("%s\n%s"
1cd0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1ce0: 28 67 2e 64 62 29 2c 20 7a 53 71 6c 29 3b 0a 20  (g.db), zSql);. 
1cf0: 20 7d 0a 20 20 70 53 74 6d 74 2d 3e 70 4e 65 78   }.  pStmt->pNex
1d00: 74 20 3d 20 70 53 74 6d 74 2d 3e 70 50 72 65 76  t = pStmt->pPrev
1d10: 20 3d 20 30 3b 0a 20 20 70 53 74 6d 74 2d 3e 6e   = 0;.  pStmt->n
1d20: 53 74 65 70 20 3d 20 30 3b 0a 20 20 72 65 74 75  Step = 0;.  retu
1d30: 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 64 62 5f  rn rc;.}.int db_
1d40: 70 72 65 70 61 72 65 28 53 74 6d 74 20 2a 70 53  prepare(Stmt *pS
1d50: 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  tmt, const char 
1d60: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
1d70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 6c    int rc;.  va_l
1d80: 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
1d90: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
1da0: 0a 20 20 72 63 20 3d 20 64 62 5f 76 70 72 65 70  .  rc = db_vprep
1db0: 61 72 65 28 70 53 74 6d 74 2c 20 30 2c 20 7a 46  are(pStmt, 0, zF
1dc0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
1dd0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
1de0: 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 64 62 5f  rn rc;.}.int db_
1df0: 70 72 65 70 61 72 65 5f 69 67 6e 6f 72 65 5f 65  prepare_ignore_e
1e00: 72 72 6f 72 28 53 74 6d 74 20 2a 70 53 74 6d 74  rror(Stmt *pStmt
1e10: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
1e20: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 69  ormat, ...){.  i
1e30: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 6c 69 73 74  nt rc;.  va_list
1e40: 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
1e50: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
1e60: 72 63 20 3d 20 64 62 5f 76 70 72 65 70 61 72 65  rc = db_vprepare
1e70: 28 70 53 74 6d 74 2c 20 31 2c 20 7a 46 6f 72 6d  (pStmt, 1, zForm
1e80: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
1e90: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
1ea0: 72 63 3b 0a 7d 0a 69 6e 74 20 64 62 5f 73 74 61  rc;.}.int db_sta
1eb0: 74 69 63 5f 70 72 65 70 61 72 65 28 53 74 6d 74  tic_prepare(Stmt
1ec0: 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63   *pStmt, const c
1ed0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
1ee0: 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
1ef0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1f00: 62 6c 6f 62 5f 73 69 7a 65 28 26 70 53 74 6d 74  blob_size(&pStmt
1f10: 2d 3e 73 71 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  ->sql)==0 ){.   
1f20: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20   va_list ap;.   
1f30: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1f40: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 72 63 20 3d  ormat);.    rc =
1f50: 20 64 62 5f 76 70 72 65 70 61 72 65 28 70 53 74   db_vprepare(pSt
1f60: 6d 74 2c 20 30 2c 20 7a 46 6f 72 6d 61 74 2c 20  mt, 0, zFormat, 
1f70: 61 70 29 3b 0a 20 20 20 20 70 53 74 6d 74 2d 3e  ap);.    pStmt->
1f80: 70 4e 65 78 74 20 3d 20 64 62 2e 70 41 6c 6c 53  pNext = db.pAllS
1f90: 74 6d 74 3b 0a 20 20 20 20 70 53 74 6d 74 2d 3e  tmt;.    pStmt->
1fa0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69  pPrev = 0;.    i
1fb0: 66 28 20 64 62 2e 70 41 6c 6c 53 74 6d 74 20 29  f( db.pAllStmt )
1fc0: 20 64 62 2e 70 41 6c 6c 53 74 6d 74 2d 3e 70 50   db.pAllStmt->pP
1fd0: 72 65 76 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20  rev = pStmt;.   
1fe0: 20 64 62 2e 70 41 6c 6c 53 74 6d 74 20 3d 20 70   db.pAllStmt = p
1ff0: 53 74 6d 74 3b 0a 20 20 20 20 76 61 5f 65 6e 64  Stmt;.    va_end
2000: 28 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ap);.  }.  retu
2010: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2020: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
2030: 20 6f 66 20 61 20 62 69 6e 64 20 70 61 72 61 6d   of a bind param
2040: 65 74 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eter.*/.static i
2050: 6e 74 20 70 61 72 61 6d 49 64 78 28 53 74 6d 74  nt paramIdx(Stmt
2060: 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63   *pStmt, const c
2070: 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 29  har *zParamName)
2080: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69  {.  int i = sqli
2090: 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
20a0: 65 72 5f 69 6e 64 65 78 28 70 53 74 6d 74 2d 3e  er_index(pStmt->
20b0: 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d  pStmt, zParamNam
20c0: 65 29 3b 0a 20 20 69 66 28 20 69 3d 3d 30 20 29  e);.  if( i==0 )
20d0: 7b 0a 20 20 20 20 64 62 5f 65 72 72 28 22 6e 6f  {.    db_err("no
20e0: 20 73 75 63 68 20 62 69 6e 64 20 70 61 72 61 6d   such bind param
20f0: 65 74 65 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 25  eter: %s\nSQL: %
2100: 62 22 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 2c 20  b", zParamName, 
2110: 26 70 53 74 6d 74 2d 3e 73 71 6c 29 3b 0a 20 20  &pStmt->sql);.  
2120: 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
2130: 2f 2a 0a 2a 2a 20 42 69 6e 64 20 61 6e 20 69 6e  /*.** Bind an in
2140: 74 65 67 65 72 2c 20 73 74 72 69 6e 67 2c 20 6f  teger, string, o
2150: 72 20 42 6c 6f 62 20 76 61 6c 75 65 20 74 6f 20  r Blob value to 
2160: 61 20 6e 61 6d 65 64 20 70 61 72 61 6d 65 74 65  a named paramete
2170: 72 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 62 69 6e  r..*/.int db_bin
2180: 64 5f 69 6e 74 28 53 74 6d 74 20 2a 70 53 74 6d  d_int(Stmt *pStm
2190: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
21a0: 50 61 72 61 6d 4e 61 6d 65 2c 20 69 6e 74 20 69  ParamName, int i
21b0: 56 61 6c 75 65 29 7b 0a 20 20 72 65 74 75 72 6e  Value){.  return
21c0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
21d0: 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20  t(pStmt->pStmt, 
21e0: 70 61 72 61 6d 49 64 78 28 70 53 74 6d 74 2c 20  paramIdx(pStmt, 
21f0: 7a 50 61 72 61 6d 4e 61 6d 65 29 2c 20 69 56 61  zParamName), iVa
2200: 6c 75 65 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 62  lue);.}.int db_b
2210: 69 6e 64 5f 69 6e 74 36 34 28 53 74 6d 74 20 2a  ind_int64(Stmt *
2220: 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61  pStmt, const cha
2230: 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c 20 69  r *zParamName, i
2240: 36 34 20 69 56 61 6c 75 65 29 7b 0a 20 20 72 65  64 iValue){.  re
2250: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e  turn sqlite3_bin
2260: 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2d 3e 70  d_int64(pStmt->p
2270: 53 74 6d 74 2c 20 70 61 72 61 6d 49 64 78 28 70  Stmt, paramIdx(p
2280: 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65  Stmt, zParamName
2290: 29 2c 20 69 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e  ), iValue);.}.in
22a0: 74 20 64 62 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  t db_bind_double
22b0: 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f  (Stmt *pStmt, co
22c0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
22d0: 4e 61 6d 65 2c 20 64 6f 75 62 6c 65 20 72 56 61  Name, double rVa
22e0: 6c 75 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  lue){.  return s
22f0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
2300: 6c 65 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c  le(pStmt->pStmt,
2310: 20 70 61 72 61 6d 49 64 78 28 70 53 74 6d 74 2c   paramIdx(pStmt,
2320: 20 7a 50 61 72 61 6d 4e 61 6d 65 29 2c 20 72 56   zParamName), rV
2330: 61 6c 75 65 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f  alue);.}.int db_
2340: 62 69 6e 64 5f 74 65 78 74 28 53 74 6d 74 20 2a  bind_text(Stmt *
2350: 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61  pStmt, const cha
2360: 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c 20 63  r *zParamName, c
2370: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75  onst char *zValu
2380: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
2390: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
23a0: 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61 72  Stmt->pStmt, par
23b0: 61 6d 49 64 78 28 70 53 74 6d 74 2c 20 7a 50 61  amIdx(pStmt, zPa
23c0: 72 61 6d 4e 61 6d 65 29 2c 20 7a 56 61 6c 75 65  ramName), zValue
23d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
23f0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
2400: 0a 7d 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 74  .}.int db_bind_t
2410: 65 78 74 31 36 28 53 74 6d 74 20 2a 70 53 74 6d  ext16(Stmt *pStm
2420: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
2430: 50 61 72 61 6d 4e 61 6d 65 2c 20 63 6f 6e 73 74  ParamName, const
2440: 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 29 7b 0a   char *zValue){.
2450: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2460: 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 70 53 74  _bind_text16(pSt
2470: 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d  mt->pStmt, param
2480: 49 64 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61  Idx(pStmt, zPara
2490: 6d 4e 61 6d 65 29 2c 20 7a 56 61 6c 75 65 2c 0a  mName), zValue,.
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
24c0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
24d0: 0a 7d 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 6e  .}.int db_bind_n
24e0: 75 6c 6c 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c  ull(Stmt *pStmt,
24f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2500: 72 61 6d 4e 61 6d 65 29 7b 0a 20 20 72 65 74 75  ramName){.  retu
2510: 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  rn sqlite3_bind_
2520: 6e 75 6c 6c 28 70 53 74 6d 74 2d 3e 70 53 74 6d  null(pStmt->pStm
2530: 74 2c 20 70 61 72 61 6d 49 64 78 28 70 53 74 6d  t, paramIdx(pStm
2540: 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29 29 3b  t, zParamName));
2550: 0a 7d 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 62  .}.int db_bind_b
2560: 6c 6f 62 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c  lob(Stmt *pStmt,
2570: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2580: 72 61 6d 4e 61 6d 65 2c 20 42 6c 6f 62 20 2a 70  ramName, Blob *p
2590: 42 6c 6f 62 29 7b 0a 20 20 72 65 74 75 72 6e 20  Blob){.  return 
25a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
25b0: 62 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20  b(pStmt->pStmt, 
25c0: 70 61 72 61 6d 49 64 78 28 70 53 74 6d 74 2c 20  paramIdx(pStmt, 
25d0: 7a 50 61 72 61 6d 4e 61 6d 65 29 2c 0a 20 20 20  zParamName),.   
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 20 20 20 20 20 20 62 6c 6f 62 5f 62 75 66 66         blob_buff
2600: 65 72 28 70 42 6c 6f 62 29 2c 20 62 6c 6f 62 5f  er(pBlob), blob_
2610: 73 69 7a 65 28 70 42 6c 6f 62 29 2c 20 53 51 4c  size(pBlob), SQL
2620: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a  ITE_STATIC);.}..
2630: 2f 2a 20 62 69 6e 64 5f 73 74 72 28 29 20 74 72  /* bind_str() tr
2640: 65 61 74 73 20 61 20 42 6c 6f 62 20 6f 62 6a 65  eats a Blob obje
2650: 63 74 20 6c 69 6b 65 20 61 20 54 45 58 54 20 73  ct like a TEXT s
2660: 74 72 69 6e 67 20 61 6e 64 20 62 69 6e 64 73 20  tring and binds 
2670: 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20 53 51 4c  it.** to the SQL
2680: 20 76 61 72 69 61 62 6c 65 2e 20 20 43 6f 6e 74   variable.  Cont
2690: 72 61 73 74 20 74 68 69 73 20 74 6f 20 62 69 6e  rast this to bin
26a0: 64 5f 62 6c 6f 62 28 29 20 77 68 69 63 68 20 74  d_blob() which t
26b0: 72 65 61 74 73 0a 2a 2a 20 74 68 65 20 42 6c 6f  reats.** the Blo
26c0: 62 20 6f 62 6a 65 63 74 20 6c 69 6b 65 20 61 6e  b object like an
26d0: 20 53 51 4c 20 42 4c 4f 42 2e 0a 2a 2f 0a 69 6e   SQL BLOB..*/.in
26e0: 74 20 64 62 5f 62 69 6e 64 5f 73 74 72 28 53 74  t db_bind_str(St
26f0: 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74  mt *pStmt, const
2700: 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61 6d   char *zParamNam
2710: 65 2c 20 42 6c 6f 62 20 2a 70 42 6c 6f 62 29 7b  e, Blob *pBlob){
2720: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2730: 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
2740: 74 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d 49  t->pStmt, paramI
2750: 64 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d  dx(pStmt, zParam
2760: 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20  Name),.         
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2780: 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 42 6c   blob_buffer(pBl
2790: 6f 62 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 70  ob), blob_size(p
27a0: 42 6c 6f 62 29 2c 20 53 51 4c 49 54 45 5f 53 54  Blob), SQLITE_ST
27b0: 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ATIC);.}../*.** 
27c0: 53 74 65 70 20 74 68 65 20 53 51 4c 20 73 74 61  Step the SQL sta
27d0: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  tement.  Return 
27e0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 52 4f  either SQLITE_RO
27f0: 57 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  W or an error co
2800: 64 65 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  de.** or SQLITE_
2810: 4f 4b 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  OK if the statem
2820: 65 6e 74 20 66 69 6e 69 73 68 65 73 20 73 75 63  ent finishes suc
2830: 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 69 6e  cessfully..*/.in
2840: 74 20 64 62 5f 73 74 65 70 28 53 74 6d 74 20 2a  t db_step(Stmt *
2850: 70 53 74 6d 74 29 7b 0a 20 20 69 6e 74 20 72 63  pStmt){.  int rc
2860: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2870: 5f 73 74 65 70 28 70 53 74 6d 74 2d 3e 70 53 74  _step(pStmt->pSt
2880: 6d 74 29 3b 0a 20 20 70 53 74 6d 74 2d 3e 6e 53  mt);.  pStmt->nS
2890: 74 65 70 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  tep++;.  return 
28a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  rc;.}../*.** Pri
28b0: 6e 74 20 77 61 72 6e 69 6e 67 73 20 69 66 20 61  nt warnings if a
28c0: 20 71 75 65 72 79 20 69 73 20 69 6e 65 66 66 69   query is ineffi
28d0: 63 69 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  cient..*/.static
28e0: 20 76 6f 69 64 20 64 62 5f 73 74 61 74 73 28 53   void db_stats(S
28f0: 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 23 69 66  tmt *pStmt){.#if
2900: 64 65 66 20 46 4f 53 53 49 4c 5f 44 45 42 55 47  def FOSSIL_DEBUG
2910: 0a 20 20 69 6e 74 20 63 31 2c 20 63 32 2c 20 63  .  int c1, c2, c
2920: 33 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  3;.  const char 
2930: 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
2940: 73 71 6c 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74  sql(pStmt->pStmt
2950: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
2960: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 31 20   ) return;.  c1 
2970: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
2980: 74 61 74 75 73 28 70 53 74 6d 74 2d 3e 70 53 74  tatus(pStmt->pSt
2990: 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
29a0: 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
29b0: 54 45 50 2c 20 31 29 3b 0a 20 20 63 32 20 3d 20  TEP, 1);.  c2 = 
29c0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
29d0: 74 75 73 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74  tus(pStmt->pStmt
29e0: 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
29f0: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 20 31  TUS_AUTOINDEX, 1
2a00: 29 3b 0a 20 20 63 33 20 3d 20 73 71 6c 69 74 65  );.  c3 = sqlite
2a10: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53  3_stmt_status(pS
2a20: 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  tmt->pStmt, SQLI
2a30: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
2a40: 52 54 2c 20 31 29 3b 0a 20 20 69 66 28 20 63 31  RT, 1);.  if( c1
2a50: 3e 70 53 74 6d 74 2d 3e 6e 53 74 65 70 2a 34 20  >pStmt->nStep*4 
2a60: 26 26 20 73 74 72 73 74 72 28 7a 53 71 6c 2c 22  && strstr(zSql,"
2a70: 2f 2a 73 63 61 6e 2a 2f 22 29 3d 3d 30 20 29 7b  /*scan*/")==0 ){
2a80: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 77 61 72 6e  .    fossil_warn
2a90: 69 6e 67 28 22 25 64 20 73 63 61 6e 20 73 74 65  ing("%d scan ste
2aa0: 70 73 20 66 6f 72 20 25 64 20 72 6f 77 73 20 69  ps for %d rows i
2ab0: 6e 20 5b 25 73 5d 22 2c 20 63 31 2c 20 70 53 74  n [%s]", c1, pSt
2ac0: 6d 74 2d 3e 6e 53 74 65 70 2c 20 7a 53 71 6c 29  mt->nStep, zSql)
2ad0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32  ;.  }else if( c2
2ae0: 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 77   ){.    fossil_w
2af0: 61 72 6e 69 6e 67 28 22 25 64 20 61 75 74 6f 6d  arning("%d autom
2b00: 61 74 69 63 20 69 6e 64 65 78 20 72 6f 77 73 20  atic index rows 
2b10: 69 6e 20 5b 25 73 5d 22 2c 20 63 32 2c 20 7a 53  in [%s]", c2, zS
2b20: 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ql);.  }else if(
2b30: 20 63 33 20 26 26 20 73 74 72 73 74 72 28 7a 53   c3 && strstr(zS
2b40: 71 6c 2c 22 2f 2a 73 6f 72 74 2a 2f 22 29 3d 3d  ql,"/*sort*/")==
2b50: 30 20 26 26 20 73 74 72 73 74 72 28 7a 53 71 6c  0 && strstr(zSql
2b60: 2c 22 2f 2a 73 63 61 6e 2a 2f 22 29 3d 3d 30 20  ,"/*scan*/")==0 
2b70: 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 77 61  ){.    fossil_wa
2b80: 72 6e 69 6e 67 28 22 73 6f 72 74 20 77 2f 6f 20  rning("sort w/o 
2b90: 69 6e 64 65 78 20 69 6e 20 5b 25 73 5d 22 2c 20  index in [%s]", 
2ba0: 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 70 53 74  zSql);.  }.  pSt
2bb0: 6d 74 2d 3e 6e 53 74 65 70 20 3d 20 30 3b 0a 23  mt->nStep = 0;.#
2bc0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
2bd0: 65 73 65 74 20 6f 72 20 66 69 6e 61 6c 69 7a 65  eset or finalize
2be0: 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
2bf0: 0a 69 6e 74 20 64 62 5f 72 65 73 65 74 28 53 74  .int db_reset(St
2c00: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69 6e  mt *pStmt){.  in
2c10: 74 20 72 63 3b 0a 20 20 64 62 5f 73 74 61 74 73  t rc;.  db_stats
2c20: 28 70 53 74 6d 74 29 3b 0a 20 20 72 63 20 3d 20  (pStmt);.  rc = 
2c30: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
2c40: 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 64  tmt->pStmt);.  d
2c50: 62 5f 63 68 65 63 6b 5f 72 65 73 75 6c 74 28 72  b_check_result(r
2c60: 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  c);.  return rc;
2c70: 0a 7d 0a 69 6e 74 20 64 62 5f 66 69 6e 61 6c 69  .}.int db_finali
2c80: 7a 65 28 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b  ze(Stmt *pStmt){
2c90: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 62 5f  .  int rc;.  db_
2ca0: 73 74 61 74 73 28 70 53 74 6d 74 29 3b 0a 20 20  stats(pStmt);.  
2cb0: 62 6c 6f 62 5f 72 65 73 65 74 28 26 70 53 74 6d  blob_reset(&pStm
2cc0: 74 2d 3e 73 71 6c 29 3b 0a 20 20 72 63 20 3d 20  t->sql);.  rc = 
2cd0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2ce0: 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pStmt->pStmt);.
2cf0: 20 20 64 62 5f 63 68 65 63 6b 5f 72 65 73 75 6c    db_check_resul
2d00: 74 28 72 63 29 3b 0a 20 20 70 53 74 6d 74 2d 3e  t(rc);.  pStmt->
2d10: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28  pStmt = 0;.  if(
2d20: 20 70 53 74 6d 74 2d 3e 70 4e 65 78 74 20 29 7b   pStmt->pNext ){
2d30: 0a 20 20 20 20 70 53 74 6d 74 2d 3e 70 4e 65 78  .    pStmt->pNex
2d40: 74 2d 3e 70 50 72 65 76 20 3d 20 70 53 74 6d 74  t->pPrev = pStmt
2d50: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69  ->pPrev;.  }.  i
2d60: 66 28 20 70 53 74 6d 74 2d 3e 70 50 72 65 76 20  f( pStmt->pPrev 
2d70: 29 7b 0a 20 20 20 20 70 53 74 6d 74 2d 3e 70 50  ){.    pStmt->pP
2d80: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 53 74  rev->pNext = pSt
2d90: 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c  mt->pNext;.  }el
2da0: 73 65 20 69 66 28 20 64 62 2e 70 41 6c 6c 53 74  se if( db.pAllSt
2db0: 6d 74 3d 3d 70 53 74 6d 74 20 29 7b 0a 20 20 20  mt==pStmt ){.   
2dc0: 20 64 62 2e 70 41 6c 6c 53 74 6d 74 20 3d 20 70   db.pAllStmt = p
2dd0: 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  Stmt->pNext;.  }
2de0: 0a 20 20 70 53 74 6d 74 2d 3e 70 4e 65 78 74 20  .  pStmt->pNext 
2df0: 3d 20 30 3b 0a 20 20 70 53 74 6d 74 2d 3e 70 50  = 0;.  pStmt->pP
2e00: 72 65 76 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  rev = 0;.  retur
2e10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2e20: 65 74 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20  eturn the rowid 
2e30: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
2e40: 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 69 6e 74  nt insert.*/.int
2e50: 20 64 62 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f   db_last_insert_
2e60: 72 6f 77 69 64 28 76 6f 69 64 29 7b 0a 20 20 69  rowid(void){.  i
2e70: 36 34 20 78 20 3d 20 73 71 6c 69 74 65 33 5f 6c  64 x = sqlite3_l
2e80: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
2e90: 28 67 2e 64 62 29 3b 0a 20 20 69 66 28 20 78 3c  (g.db);.  if( x<
2ea0: 30 20 7c 7c 20 78 3e 28 69 36 34 29 32 31 34 37  0 || x>(i64)2147
2eb0: 34 38 33 36 34 37 20 29 7b 0a 20 20 20 20 66 6f  483647 ){.    fo
2ec0: 73 73 69 6c 5f 66 61 74 61 6c 28 22 72 6f 77 69  ssil_fatal("rowi
2ed0: 64 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28  d out of range (
2ee0: 30 2e 2e 32 31 34 37 34 38 33 36 34 37 29 22 29  0..2147483647)")
2ef0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
2f00: 69 6e 74 29 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  int)x;.}../*.** 
2f10: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2f20: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
2f30: 65 72 65 20 63 68 61 6e 67 65 64 20 62 79 20 74  ere changed by t
2f40: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a  he most recent.*
2f50: 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  * INSERT, UPDATE
2f60: 2c 20 6f 72 20 44 45 4c 45 54 45 2e 20 20 41 75  , or DELETE.  Au
2f70: 78 69 6c 69 61 72 79 20 63 68 61 6e 67 65 73 20  xiliary changes 
2f80: 63 61 75 73 65 64 20 62 79 20 74 72 69 67 67 65  caused by trigge
2f90: 72 73 0a 2a 2a 20 6f 72 20 6f 74 68 65 72 20 73  rs.** or other s
2fa0: 69 64 65 20 65 66 66 65 63 74 73 20 61 72 65 20  ide effects are 
2fb0: 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
2fc0: 69 6e 74 20 64 62 5f 63 68 61 6e 67 65 73 28 76  int db_changes(v
2fd0: 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  oid){.  return s
2fe0: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 67  qlite3_changes(g
2ff0: 2e 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  .db);.}../*.** E
3000: 78 74 72 61 63 74 20 74 65 78 74 2c 20 69 6e 74  xtract text, int
3010: 65 67 65 72 2c 20 6f 72 20 62 6c 6f 62 20 76 61  eger, or blob va
3020: 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20 4e 2d  lues from the N-
3030: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
3040: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  .** current row.
3050: 0a 2a 2f 0a 69 6e 74 20 64 62 5f 63 6f 6c 75 6d  .*/.int db_colum
3060: 6e 5f 74 79 70 65 28 53 74 6d 74 20 2a 70 53 74  n_type(Stmt *pSt
3070: 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65  mt, int N){.  re
3080: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6c  turn sqlite3_col
3090: 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2d 3e  umn_type(pStmt->
30a0: 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 69 6e 74  pStmt, N);.}.int
30b0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73   db_column_bytes
30c0: 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e  (Stmt *pStmt, in
30d0: 74 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  t N){.  return s
30e0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
30f0: 74 65 73 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74  tes(pStmt->pStmt
3100: 2c 20 4e 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 63  , N);.}.int db_c
3110: 6f 6c 75 6d 6e 5f 69 6e 74 28 53 74 6d 74 20 2a  olumn_int(Stmt *
3120: 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20  pStmt, int N){. 
3130: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
3140: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
3150: 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 69  ->pStmt, N);.}.i
3160: 36 34 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  64 db_column_int
3170: 36 34 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20  64(Stmt *pStmt, 
3180: 69 6e 74 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e  int N){.  return
3190: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
31a0: 69 6e 74 36 34 28 70 53 74 6d 74 2d 3e 70 53 74  int64(pStmt->pSt
31b0: 6d 74 2c 20 4e 29 3b 0a 7d 0a 64 6f 75 62 6c 65  mt, N);.}.double
31c0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c   db_column_doubl
31d0: 65 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69  e(Stmt *pStmt, i
31e0: 6e 74 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20  nt N){.  return 
31f0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
3200: 6f 75 62 6c 65 28 70 53 74 6d 74 2d 3e 70 53 74  ouble(pStmt->pSt
3210: 6d 74 2c 20 4e 29 3b 0a 7d 0a 63 6f 6e 73 74 20  mt, N);.}.const 
3220: 63 68 61 72 20 2a 64 62 5f 63 6f 6c 75 6d 6e 5f  char *db_column_
3230: 74 65 78 74 28 53 74 6d 74 20 2a 70 53 74 6d 74  text(Stmt *pStmt
3240: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 74 75  , int N){.  retu
3250: 72 6e 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  rn (char*)sqlite
3260: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
3270: 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a  tmt->pStmt, N);.
3280: 7d 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62  }.const char *db
3290: 5f 63 6f 6c 75 6d 6e 5f 72 61 77 28 53 74 6d 74  _column_raw(Stmt
32a0: 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b   *pStmt, int N){
32b0: 0a 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74  .  return (const
32c0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
32d0: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
32e0: 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 63  ->pStmt, N);.}.c
32f0: 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 5f 63 6f  onst char *db_co
3300: 6c 75 6d 6e 5f 6e 61 6d 65 28 53 74 6d 74 20 2a  lumn_name(Stmt *
3310: 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20  pStmt, int N){. 
3320: 20 72 65 74 75 72 6e 20 28 63 68 61 72 2a 29 73   return (char*)s
3330: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
3340: 6d 65 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c  me(pStmt->pStmt,
3350: 20 4e 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 63 6f   N);.}.int db_co
3360: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 53 74 6d 74 20  lumn_count(Stmt 
3370: 2a 70 53 74 6d 74 29 7b 0a 20 20 72 65 74 75 72  *pStmt){.  retur
3380: 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  n sqlite3_column
3390: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 2d 3e 70 53  _count(pStmt->pS
33a0: 74 6d 74 29 3b 0a 7d 0a 63 68 61 72 20 2a 64 62  tmt);.}.char *db
33b0: 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c 6c 6f 63 28 53  _column_malloc(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 6d 70 72  N){.  return mpr
33e0: 69 6e 74 66 28 22 25 73 22 2c 20 64 62 5f 63 6f  intf("%s", db_co
33f0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
3400: 20 4e 29 29 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f   N));.}.void db_
3410: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 53 74 6d 74  column_blob(Stmt
3420: 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e 2c 20   *pStmt, int N, 
3430: 42 6c 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a 20 20  Blob *pBlob){.  
3440: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 42 6c 6f  blob_append(pBlo
3450: 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  b, sqlite3_colum
3460: 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2d 3e 70 53  n_blob(pStmt->pS
3470: 74 6d 74 2c 20 4e 29 2c 0a 20 20 20 20 20 20 20  tmt, N),.       
3480: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
3490: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
34a0: 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 29 3b 0a 7d  t->pStmt, N));.}
34b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
34c0: 7a 65 20 61 20 62 6c 6f 62 20 74 6f 20 61 6e 20  ze a blob to an 
34d0: 65 70 68 65 6d 65 72 61 6c 20 63 6f 70 79 20 6f  ephemeral copy o
34e0: 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  f the content of
34f0: 20 61 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20   a.** column in 
3500: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
3510: 20 20 54 68 65 20 64 61 74 61 20 69 6e 20 74 68    The data in th
3520: 65 20 62 6c 6f 62 20 77 69 6c 6c 20 62 65 63 6f  e blob will beco
3530: 6d 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 20 77 68  me.** invalid wh
3540: 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  en the statement
3550: 20 69 73 20 73 74 65 70 70 65 64 20 6f 72 20 72   is stepped or r
3560: 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62  eset..*/.void db
3570: 5f 65 70 68 65 6d 65 72 61 6c 5f 62 6c 6f 62 28  _ephemeral_blob(
3580: 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74  Stmt *pStmt, int
3590: 20 4e 2c 20 42 6c 6f 62 20 2a 70 42 6c 6f 62 29   N, Blob *pBlob)
35a0: 7b 0a 20 20 62 6c 6f 62 5f 69 6e 69 74 28 70 42  {.  blob_init(pB
35b0: 6c 6f 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  lob, sqlite3_col
35c0: 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2d 3e  umn_blob(pStmt->
35d0: 70 53 74 6d 74 2c 20 4e 29 2c 0a 20 20 20 20 20  pStmt, N),.     
35e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
35f0: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
3600: 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 29 3b  tmt->pStmt, N));
3610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
3620: 61 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20  a result code.  
3630: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 53 51 4c  If it is not SQL
3640: 49 54 45 5f 4f 4b 2c 20 70 72 69 6e 74 20 74 68  ITE_OK, print th
3650: 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
3660: 6e 67 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ng error message
3670: 20 61 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 76 6f   and exit..*/.vo
3680: 69 64 20 64 62 5f 63 68 65 63 6b 5f 72 65 73 75  id db_check_resu
3690: 6c 74 28 69 6e 74 20 72 63 29 7b 0a 20 20 69 66  lt(int rc){.  if
36a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36b0: 29 7b 0a 20 20 20 20 64 62 5f 65 72 72 28 22 53  ){.    db_err("S
36c0: 51 4c 20 65 72 72 6f 72 3a 20 25 73 22 2c 20 73  QL error: %s", s
36d0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e  qlite3_errmsg(g.
36e0: 64 62 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  db));.  }.}../*.
36f0: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 73 69 6e  ** Execute a sin
3700: 67 6c 65 20 70 72 65 70 61 72 65 64 20 73 74 61  gle prepared sta
3710: 74 65 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74 20  tement until it 
3720: 66 69 6e 69 73 68 65 73 2e 0a 2a 2f 0a 69 6e 74  finishes..*/.int
3730: 20 64 62 5f 65 78 65 63 28 53 74 6d 74 20 2a 70   db_exec(Stmt *p
3740: 53 74 6d 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Stmt){.  int rc;
3750: 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20  .  while( (rc = 
3760: 64 62 5f 73 74 65 70 28 70 53 74 6d 74 29 29 3d  db_step(pStmt))=
3770: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 7d 0a  =SQLITE_ROW ){}.
3780: 20 20 72 63 20 3d 20 64 62 5f 72 65 73 65 74 28    rc = db_reset(
3790: 70 53 74 6d 74 29 3b 0a 20 20 64 62 5f 63 68 65  pStmt);.  db_che
37a0: 63 6b 5f 72 65 73 75 6c 74 28 72 63 29 3b 0a 20  ck_result(rc);. 
37b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
37c0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 6f  *.** Print the o
37d0: 75 74 70 75 74 20 6f 66 20 6f 6e 65 20 6f 72 20  utput of one or 
37e0: 6d 6f 72 65 20 53 51 4c 20 71 75 65 72 69 65 73  more SQL queries
37f0: 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74   on standard out
3800: 70 75 74 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  put..** This rou
3810: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
3820: 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f   debugging purpo
3830: 73 65 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  ses only..*/.int
3840: 20 64 62 5f 64 65 62 75 67 28 63 6f 6e 73 74 20   db_debug(const 
3850: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29  char *zSql, ...)
3860: 7b 0a 20 20 42 6c 6f 62 20 73 71 6c 3b 0a 20 20  {.  Blob sql;.  
3870: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
3880: 4f 4b 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  OK;.  va_list ap
3890: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
38a0: 7a 2c 20 2a 7a 45 6e 64 3b 0a 20 20 73 71 6c 69  z, *zEnd;.  sqli
38b0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
38c0: 0a 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 73 71  .  blob_init(&sq
38d0: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 76 61 5f 73  l, 0, 0);.  va_s
38e0: 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a  tart(ap, zSql);.
38f0: 20 20 62 6c 6f 62 5f 76 61 70 70 65 6e 64 66 28    blob_vappendf(
3900: 26 73 71 6c 2c 20 7a 53 71 6c 2c 20 61 70 29 3b  &sql, zSql, ap);
3910: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
3920: 20 7a 20 3d 20 62 6c 6f 62 5f 73 74 72 28 26 73   z = blob_str(&s
3930: 71 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  ql);.  while( rc
3940: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
3950: 5b 30 5d 20 29 7b 0a 20 20 20 20 70 53 74 6d 74  [0] ){.    pStmt
3960: 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
3970: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
3980: 32 28 67 2e 64 62 2c 20 7a 2c 20 2d 31 2c 20 26  2(g.db, z, -1, &
3990: 70 53 74 6d 74 2c 20 26 7a 45 6e 64 29 3b 0a 20  pStmt, &zEnd);. 
39a0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
39b0: 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  E_OK ) break;.  
39c0: 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
39d0: 20 20 20 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20       int nRow = 
39e0: 30 3b 0a 20 20 20 20 20 20 64 62 2e 6e 50 72 65  0;.      db.nPre
39f0: 70 61 72 65 2b 2b 3b 0a 20 20 20 20 20 20 77 68  pare++;.      wh
3a00: 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
3a10: 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
3a20: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
3a30: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 20 20  int i, n;.      
3a40: 20 20 69 66 28 20 6e 52 6f 77 2b 2b 20 3e 20 30    if( nRow++ > 0
3a50: 20 29 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28   ) fossil_print(
3a60: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 6e  "\n");.        n
3a70: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
3a80: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
3a90: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
3aa0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
3ab0: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69        fossil_pri
3ac0: 6e 74 28 22 25 73 20 3d 20 25 73 5c 6e 22 2c 20  nt("%s = %s\n", 
3ad0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
3ae0: 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 2c 0a 20  ame(pStmt, i),. 
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
3b10: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
3b20: 69 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i));.        }. 
3b30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
3b40: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
3b50: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
3b60: 20 69 66 28 20 72 63 20 29 20 64 62 5f 65 72 72   if( rc ) db_err
3b70: 28 22 25 73 3a 20 7b 25 2e 2a 73 7d 22 2c 20 73  ("%s: {%.*s}", s
3b80: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e  qlite3_errmsg(g.
3b90: 64 62 29 2c 20 28 69 6e 74 29 28 7a 45 6e 64 2d  db), (int)(zEnd-
3ba0: 7a 29 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  z), z);.    }.  
3bb0: 20 20 7a 20 3d 20 7a 45 6e 64 3b 0a 20 20 7d 0a    z = zEnd;.  }.
3bc0: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 73 71    blob_reset(&sq
3bd0: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
3be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
3bf0: 65 20 6d 75 6c 74 69 70 6c 65 20 53 51 4c 20 73  e multiple SQL s
3c00: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
3c10: 74 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28  t db_multi_exec(
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 42 6c 6f 62 20 73  , ...){.  Blob s
3c40: 71 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ql;.  int rc = S
3c50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76 61 5f 6c  QLITE_OK;.  va_l
3c60: 69 73 74 20 61 70 3b 0a 20 20 63 6f 6e 73 74 20  ist ap;.  const 
3c70: 63 68 61 72 20 2a 7a 2c 20 2a 7a 45 6e 64 3b 0a  char *z, *zEnd;.
3c80: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
3c90: 70 53 74 6d 74 3b 0a 20 20 62 6c 6f 62 5f 69 6e  pStmt;.  blob_in
3ca0: 69 74 28 26 73 71 6c 2c 20 30 2c 20 30 29 3b 0a  it(&sql, 0, 0);.
3cb0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
3cc0: 53 71 6c 29 3b 0a 20 20 62 6c 6f 62 5f 76 61 70  Sql);.  blob_vap
3cd0: 70 65 6e 64 66 28 26 73 71 6c 2c 20 7a 53 71 6c  pendf(&sql, zSql
3ce0: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
3cf0: 61 70 29 3b 0a 20 20 7a 20 3d 20 62 6c 6f 62 5f  ap);.  z = blob_
3d00: 73 74 72 28 26 73 71 6c 29 3b 0a 20 20 77 68 69  str(&sql);.  whi
3d10: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
3d20: 4b 20 26 26 20 7a 5b 30 5d 20 29 7b 0a 20 20 20  K && z[0] ){.   
3d30: 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
3d40: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
3d50: 70 61 72 65 5f 76 32 28 67 2e 64 62 2c 20 7a 2c  pare_v2(g.db, z,
3d60: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 45   -1, &pStmt, &zE
3d70: 6e 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  nd);.    if( rc 
3d80: 29 7b 0a 20 20 20 20 20 20 64 62 5f 65 72 72 28  ){.      db_err(
3d90: 22 25 73 3a 20 7b 25 73 7d 22 2c 20 73 71 6c 69  "%s: {%s}", sqli
3da0: 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29  te3_errmsg(g.db)
3db0: 2c 20 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  , z);.    }else 
3dc0: 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
3dd0: 20 20 20 64 62 2e 6e 50 72 65 70 61 72 65 2b 2b     db.nPrepare++
3de0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73  ;.      while( s
3df0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
3e00: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
3e10: 7b 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  {}.      rc = sq
3e20: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
3e30: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
3e40: 20 72 63 20 29 20 64 62 5f 65 72 72 28 22 25 73   rc ) db_err("%s
3e50: 3a 20 7b 25 2e 2a 73 7d 22 2c 20 73 71 6c 69 74  : {%.*s}", sqlit
3e60: 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 2c  e3_errmsg(g.db),
3e70: 20 28 69 6e 74 29 28 7a 45 6e 64 2d 7a 29 2c 20   (int)(zEnd-z), 
3e80: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20  z);.    }.    z 
3e90: 3d 20 7a 45 6e 64 3b 0a 20 20 7d 0a 20 20 62 6c  = zEnd;.  }.  bl
3ea0: 6f 62 5f 72 65 73 65 74 28 26 73 71 6c 29 3b 0a  ob_reset(&sql);.
3eb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3ec0: 2f 2a 0a 2a 2a 20 4f 70 74 69 6f 6e 61 6c 6c 79  /*.** Optionally
3ed0: 20 6d 61 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   make the follow
3ee0: 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ing changes to t
3ef0: 68 65 20 64 61 74 61 62 61 73 65 20 69 66 20 66  he database if f
3f00: 65 61 73 69 62 6c 65 20 61 6e 64 0a 2a 2a 20 63  easible and.** c
3f10: 6f 6e 76 65 6e 69 65 6e 74 2e 20 20 44 6f 20 6e  onvenient.  Do n
3f20: 6f 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  ot start a trans
3f30: 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 73 65  action for these
3f40: 20 63 68 61 6e 67 65 73 2c 20 62 75 74 20 6f 6e   changes, but on
3f50: 6c 79 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 73 65  ly.** make these
3f60: 20 63 68 61 6e 67 65 73 20 69 66 20 6f 74 68 65   changes if othe
3f70: 72 20 63 68 61 6e 67 65 73 20 61 72 65 20 61 6c  r changes are al
3f80: 73 6f 20 62 65 69 6e 67 20 6d 61 64 65 2e 0a 2a  so being made..*
3f90: 2f 0a 76 6f 69 64 20 64 62 5f 6f 70 74 69 6f 6e  /.void db_option
3fa0: 61 6c 5f 73 71 6c 28 63 6f 6e 73 74 20 63 68 61  al_sql(const cha
3fb0: 72 20 2a 7a 44 62 2c 20 63 6f 6e 73 74 20 63 68  r *zDb, const ch
3fc0: 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a  ar *zSql, ...){.
3fd0: 20 20 69 66 28 20 64 62 5f 69 73 5f 77 72 69 74    if( db_is_writ
3fe0: 65 61 62 6c 65 28 7a 44 62 29 20 26 26 20 64 62  eable(zDb) && db
3ff0: 2e 6e 42 65 66 6f 72 65 43 6f 6d 6d 69 74 20 3c  .nBeforeCommit <
4000: 20 63 6f 75 6e 74 28 64 62 2e 61 7a 42 65 66 6f   count(db.azBefo
4010: 72 65 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20  reCommit) ){.   
4020: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20   va_list ap;.   
4030: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53   va_start(ap, zS
4040: 71 6c 29 3b 0a 20 20 20 20 64 62 2e 61 7a 42 65  ql);.    db.azBe
4050: 66 6f 72 65 43 6f 6d 6d 69 74 5b 64 62 2e 6e 42  foreCommit[db.nB
4060: 65 66 6f 72 65 43 6f 6d 6d 69 74 2b 2b 5d 20 3d  eforeCommit++] =
4070: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
4080: 66 28 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20 20  f(zSql, ap);.   
4090: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d   va_end(ap);.  }
40a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
40b0: 65 20 61 20 71 75 65 72 79 20 61 6e 64 20 72 65  e a query and re
40c0: 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 69 6e  turn a single in
40d0: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a  teger value..*/.
40e0: 69 36 34 20 64 62 5f 69 6e 74 36 34 28 69 36 34  i64 db_int64(i64
40f0: 20 69 44 66 6c 74 2c 20 63 6f 6e 73 74 20 63 68   iDflt, const ch
4100: 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a  ar *zSql, ...){.
4110: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
4120: 53 74 6d 74 20 73 3b 0a 20 20 69 36 34 20 72 63  Stmt s;.  i64 rc
4130: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
4140: 20 7a 53 71 6c 29 3b 0a 20 20 64 62 5f 76 70 72   zSql);.  db_vpr
4150: 65 70 61 72 65 28 26 73 2c 20 30 2c 20 7a 53 71  epare(&s, 0, zSq
4160: 6c 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  l, ap);.  va_end
4170: 28 61 70 29 3b 0a 20 20 69 66 28 20 64 62 5f 73  (ap);.  if( db_s
4180: 74 65 70 28 26 73 29 21 3d 53 51 4c 49 54 45 5f  tep(&s)!=SQLITE_
4190: 52 4f 57 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ROW ){.    rc = 
41a0: 69 44 66 6c 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iDflt;.  }else{.
41b0: 20 20 20 20 72 63 20 3d 20 64 62 5f 63 6f 6c 75      rc = db_colu
41c0: 6d 6e 5f 69 6e 74 36 34 28 26 73 2c 20 30 29 3b  mn_int64(&s, 0);
41d0: 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69  .  }.  db_finali
41e0: 7a 65 28 26 73 29 3b 0a 20 20 72 65 74 75 72 6e  ze(&s);.  return
41f0: 20 72 63 3b 0a 7d 0a 69 6e 74 20 64 62 5f 69 6e   rc;.}.int db_in
4200: 74 28 69 6e 74 20 69 44 66 6c 74 2c 20 63 6f 6e  t(int iDflt, con
4210: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2e  st char *zSql, .
4220: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
4230: 70 3b 0a 20 20 53 74 6d 74 20 73 3b 0a 20 20 69  p;.  Stmt s;.  i
4240: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72  nt rc;.  va_star
4250: 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 64  t(ap, zSql);.  d
4260: 62 5f 76 70 72 65 70 61 72 65 28 26 73 2c 20 30  b_vprepare(&s, 0
4270: 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20 76  , zSql, ap);.  v
4280: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
4290: 20 64 62 5f 73 74 65 70 28 26 73 29 21 3d 53 51   db_step(&s)!=SQ
42a0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
42b0: 72 63 20 3d 20 69 44 66 6c 74 3b 0a 20 20 7d 65  rc = iDflt;.  }e
42c0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 64 62  lse{.    rc = db
42d0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 73 2c 20  _column_int(&s, 
42e0: 30 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e  0);.  }.  db_fin
42f0: 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20 72 65 74  alize(&s);.  ret
4300: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4310: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4320: 74 68 65 20 71 75 65 72 79 20 77 6f 75 6c 64 20  the query would 
4330: 72 65 74 75 72 6e 20 31 20 6f 72 20 6d 6f 72 65  return 1 or more
4340: 20 72 6f 77 73 2e 20 20 52 65 74 75 72 6e 0a 2a   rows.  Return.*
4350: 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 71  * FALSE if the q
4360: 75 65 72 79 20 72 65 73 75 6c 74 20 77 6f 75 6c  uery result woul
4370: 64 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 65  d be an empty se
4380: 74 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 65 78 69  t..*/.int db_exi
4390: 73 74 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  sts(const char *
43a0: 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  zSql, ...){.  va
43b0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d 74  _list ap;.  Stmt
43c0: 20 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   s;.  int rc;.  
43d0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 71  va_start(ap, zSq
43e0: 6c 29 3b 0a 20 20 64 62 5f 76 70 72 65 70 61 72  l);.  db_vprepar
43f0: 65 28 26 73 2c 20 30 2c 20 7a 53 71 6c 2c 20 61  e(&s, 0, zSql, a
4400: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
4410: 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70 28  ;.  if( db_step(
4420: 26 73 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &s)!=SQLITE_ROW 
4430: 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
4440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
4450: 20 31 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e   1;.  }.  db_fin
4460: 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20 72 65 74  alize(&s);.  ret
4470: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
4480: 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72  * Execute a quer
4490: 79 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 66  y and return a f
44a0: 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 76 61  loating-point va
44b0: 6c 75 65 2e 0a 2a 2f 0a 64 6f 75 62 6c 65 20 64  lue..*/.double d
44c0: 62 5f 64 6f 75 62 6c 65 28 64 6f 75 62 6c 65 20  b_double(double 
44d0: 72 44 66 6c 74 2c 20 63 6f 6e 73 74 20 63 68 61  rDflt, const cha
44e0: 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20  r *zSql, ...){. 
44f0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 53   va_list ap;.  S
4500: 74 6d 74 20 73 3b 0a 20 20 64 6f 75 62 6c 65 20  tmt s;.  double 
4510: 72 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  r;.  va_start(ap
4520: 2c 20 7a 53 71 6c 29 3b 0a 20 20 64 62 5f 76 70  , zSql);.  db_vp
4530: 72 65 70 61 72 65 28 26 73 2c 20 30 2c 20 7a 53  repare(&s, 0, zS
4540: 71 6c 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  ql, ap);.  va_en
4550: 64 28 61 70 29 3b 0a 20 20 69 66 28 20 64 62 5f  d(ap);.  if( db_
4560: 73 74 65 70 28 26 73 29 21 3d 53 51 4c 49 54 45  step(&s)!=SQLITE
4570: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 20 3d 20  _ROW ){.    r = 
4580: 72 44 66 6c 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rDflt;.  }else{.
4590: 20 20 20 20 72 20 3d 20 64 62 5f 63 6f 6c 75 6d      r = db_colum
45a0: 6e 5f 64 6f 75 62 6c 65 28 26 73 2c 20 30 29 3b  n_double(&s, 0);
45b0: 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69  .  }.  db_finali
45c0: 7a 65 28 26 73 29 3b 0a 20 20 72 65 74 75 72 6e  ze(&s);.  return
45d0: 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65   r;.}../*.** Exe
45e0: 63 75 74 65 20 61 20 71 75 65 72 79 20 61 6e 64  cute a query and
45f0: 20 61 70 70 65 6e 64 20 74 68 65 20 66 69 72 73   append the firs
4600: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
4610: 66 69 72 73 74 20 72 6f 77 0a 2a 2a 20 6f 66 20  first row.** of 
4620: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 74  the result set t
4630: 6f 20 62 6c 6f 62 20 67 69 76 65 6e 20 69 6e 20  o blob given in 
4640: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
4650: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 62  nt..*/.void db_b
4660: 6c 6f 62 28 42 6c 6f 62 20 2a 70 52 65 73 75 6c  lob(Blob *pResul
4670: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
4680: 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  Sql, ...){.  va_
4690: 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d 74 20  list ap;.  Stmt 
46a0: 73 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  s;.  va_start(ap
46b0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 64 62 5f 76 70  , zSql);.  db_vp
46c0: 72 65 70 61 72 65 28 26 73 2c 20 30 2c 20 7a 53  repare(&s, 0, zS
46d0: 71 6c 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  ql, ap);.  va_en
46e0: 64 28 61 70 29 3b 0a 20 20 69 66 28 20 64 62 5f  d(ap);.  if( db_
46f0: 73 74 65 70 28 26 73 29 3d 3d 53 51 4c 49 54 45  step(&s)==SQLITE
4700: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 62 6c 6f 62  _ROW ){.    blob
4710: 5f 61 70 70 65 6e 64 28 70 52 65 73 75 6c 74 2c  _append(pResult,
4720: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
4730: 62 6c 6f 62 28 73 2e 70 53 74 6d 74 2c 20 30 29  blob(s.pStmt, 0)
4740: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4750: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
4760: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
4770: 73 2e 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20  s.pStmt, 0));.  
4780: 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28  }.  db_finalize(
4790: 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  &s);.}../*.** Ex
47a0: 65 63 75 74 65 20 61 20 71 75 65 72 79 2e 20 20  ecute a query.  
47b0: 52 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74  Return the first
47c0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
47d0: 69 72 73 74 20 72 6f 77 0a 2a 2a 20 6f 66 20 74  irst row.** of t
47e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 73  he result set as
47f0: 20 61 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63   a string.  Spac
4800: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 74  e to hold the st
4810: 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69  ring is.** obtai
4820: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
4830: 29 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c  ).  If the resul
4840: 74 20 73 65 74 20 69 73 20 65 6d 70 74 79 2c 20  t set is empty, 
4850: 72 65 74 75 72 6e 0a 2a 2a 20 7a 44 65 66 61 75  return.** zDefau
4860: 6c 74 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 63  lt instead..*/.c
4870: 68 61 72 20 2a 64 62 5f 74 65 78 74 28 63 6f 6e  har *db_text(con
4880: 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  st char *zDefaul
4890: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
48a0: 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  Sql, ...){.  va_
48b0: 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d 74 20  list ap;.  Stmt 
48c0: 73 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  s;.  char *z;.  
48d0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 71  va_start(ap, zSq
48e0: 6c 29 3b 0a 20 20 64 62 5f 76 70 72 65 70 61 72  l);.  db_vprepar
48f0: 65 28 26 73 2c 20 30 2c 20 7a 53 71 6c 2c 20 61  e(&s, 0, zSql, a
4900: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
4910: 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70 28  ;.  if( db_step(
4920: 26 73 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &s)==SQLITE_ROW 
4930: 29 7b 0a 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e  ){.    z = mprin
4940: 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
4950: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 73 2e 70  _column_text(s.p
4960: 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 65 6c  Stmt, 0));.  }el
4970: 73 65 20 69 66 28 20 7a 44 65 66 61 75 6c 74 20  se if( zDefault 
4980: 29 7b 0a 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e  ){.    z = mprin
4990: 74 66 28 22 25 73 22 2c 20 7a 44 65 66 61 75 6c  tf("%s", zDefaul
49a0: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
49b0: 20 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 64 62   z = 0;.  }.  db
49c0: 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 20  _finalize(&s);. 
49d0: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
49e0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
49f0: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 66 69   new database fi
4a00: 6c 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65  le with the give
4a10: 6e 20 73 63 68 65 6d 61 2e 20 20 49 66 20 61 6e  n schema.  If an
4a20: 79 74 68 69 6e 67 0a 2a 2a 20 67 6f 65 73 20 77  ything.** goes w
4a30: 72 6f 6e 67 2c 20 63 61 6c 6c 20 64 62 5f 65 72  rong, call db_er
4a40: 72 28 29 20 74 6f 20 65 78 69 74 2e 0a 2a 2f 0a  r() to exit..*/.
4a50: 76 6f 69 64 20 64 62 5f 69 6e 69 74 5f 64 61 74  void db_init_dat
4a60: 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63  abase(.  const c
4a70: 68 61 72 20 2a 7a 46 69 6c 65 4e 61 6d 65 2c 20  har *zFileName, 
4a80: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74    /* Name of dat
4a90: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 72  abase file to cr
4aa0: 65 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  eate */.  const 
4ab0: 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c 20 20  char *zSchema,  
4ac0: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
4ad0: 20 6f 66 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20   of schema */.  
4ae0: 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
4af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 69           /* Addi
4b00: 74 69 6f 6e 61 6c 20 53 51 4c 20 74 6f 20 72 75  tional SQL to ru
4b10: 6e 2e 20 20 54 65 72 6d 69 6e 61 74 65 20 77 69  n.  Terminate wi
4b20: 74 68 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20  th NULL. */.){. 
4b30: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4b40: 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
4b50: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 76 61  char *zSql;.  va
4b60: 5f 6c 69 73 74 20 61 70 3b 0a 0a 20 20 64 62 20  _list ap;..  db 
4b70: 3d 20 64 62 5f 6f 70 65 6e 28 7a 46 69 6c 65 4e  = db_open(zFileN
4b80: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
4b90: 65 78 65 63 28 64 62 2c 20 22 42 45 47 49 4e 20  exec(db, "BEGIN 
4ba0: 45 58 43 4c 55 53 49 56 45 22 2c 20 30 2c 20 30  EXCLUSIVE", 0, 0
4bb0: 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
4bc0: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
4bd0: 63 68 65 6d 61 2c 20 30 2c 20 30 2c 20 30 29 3b  chema, 0, 0, 0);
4be0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4bf0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 5f 65  E_OK ){.    db_e
4c00: 72 72 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  rr("%s", sqlite3
4c10: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
4c20: 7d 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  }.  va_start(ap,
4c30: 20 7a 53 63 68 65 6d 61 29 3b 0a 20 20 77 68 69   zSchema);.  whi
4c40: 6c 65 28 20 28 7a 53 71 6c 20 3d 20 76 61 5f 61  le( (zSql = va_a
4c50: 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61  rg(ap, const cha
4c60: 72 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  r*))!=0 ){.    r
4c70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
4c80: 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c  (db, zSql, 0, 0,
4c90: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
4ca0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4cb0: 20 20 20 20 64 62 5f 65 72 72 28 22 25 73 22 2c      db_err("%s",
4cc0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
4cd0: 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  db));.    }.  }.
4ce0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
4cf0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
4d00: 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c   "COMMIT", 0, 0,
4d10: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63   0);.  sqlite3_c
4d20: 6c 6f 73 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a  lose(db);.}../*.
4d30: 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  ** Function to r
4d40: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
4d50: 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   of seconds sinc
4d60: 65 20 31 39 37 30 2e 20 20 54 68 69 73 20 69 73  e 1970.  This is
4d70: 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20  .** the same as 
4d80: 73 74 72 66 74 69 6d 65 28 27 25 73 27 2c 27 6e  strftime('%s','n
4d90: 6f 77 27 29 20 62 75 74 20 69 73 20 6d 6f 72 65  ow') but is more
4da0: 20 63 6f 6d 70 61 63 74 2e 0a 2a 2f 0a 76 6f 69   compact..*/.voi
4db0: 64 20 64 62 5f 6e 6f 77 5f 66 75 6e 63 74 69 6f  d db_now_functio
4dc0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
4dd0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
4de0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
4df0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
4e00: 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72  v.){.  sqlite3_r
4e10: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
4e20: 65 78 74 2c 20 74 69 6d 65 28 30 29 29 3b 0a 7d  ext, time(0));.}
4e30: 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
4e40: 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 63   to return the c
4e50: 68 65 63 6b 2d 69 6e 20 74 69 6d 65 20 66 6f 72  heck-in time for
4e60: 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20   a file..**.**  
4e70: 20 20 20 20 63 68 65 63 6b 69 6e 5f 6d 74 69 6d      checkin_mtim
4e80: 65 28 43 4b 49 4e 49 44 2c 52 49 44 29 0a 2a 2a  e(CKINID,RID).**
4e90: 0a 2a 2a 20 43 4b 49 4e 49 44 3a 20 20 54 68 65  .** CKINID:  The
4ea0: 20 52 49 44 20 66 6f 72 20 74 68 65 20 6d 61 6e   RID for the man
4eb0: 69 66 65 73 74 20 66 6f 72 20 61 20 63 68 65 63  ifest for a chec
4ec0: 6b 2d 69 6e 2e 0a 2a 2a 20 52 49 44 3a 20 20 20  k-in..** RID:   
4ed0: 20 20 54 68 65 20 52 49 44 20 6f 66 20 61 20 66    The RID of a f
4ee0: 69 6c 65 20 69 6e 20 43 4b 49 4e 49 44 20 66 6f  ile in CKINID fo
4ef0: 72 20 77 68 69 63 68 20 74 68 65 20 63 68 65 63  r which the chec
4f00: 6b 2d 69 6e 20 74 69 6d 65 0a 2a 2a 20 20 20 20  k-in time.**    
4f10: 20 20 20 20 20 20 69 73 20 64 65 73 69 72 65 64        is desired
4f20: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 3a  ..**.** Returns:
4f30: 20 54 68 65 20 63 68 65 63 6b 2d 69 6e 20 74 69   The check-in ti
4f40: 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
4f50: 6e 63 65 20 31 39 37 30 2e 0a 2a 2f 0a 76 6f 69  nce 1970..*/.voi
4f60: 64 20 64 62 5f 63 68 65 63 6b 69 6e 5f 6d 74 69  d db_checkin_mti
4f70: 6d 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  me_function(.  s
4f80: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
4f90: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
4fa0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
4fb0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
4fc0: 20 69 36 34 20 6d 74 69 6d 65 3b 0a 20 20 69 6e   i64 mtime;.  in
4fd0: 74 20 72 63 20 3d 20 6d 74 69 6d 65 5f 6f 66 5f  t rc = mtime_of_
4fe0: 6d 61 6e 69 66 65 73 74 5f 66 69 6c 65 28 73 71  manifest_file(sq
4ff0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
5000: 61 72 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20  argv[0]),.      
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
5030: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
5040: 67 76 5b 31 5d 29 2c 20 26 6d 74 69 6d 65 29 3b  gv[1]), &mtime);
5050: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
5060: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5070: 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74  lt_int64(context
5080: 2c 20 6d 74 69 6d 65 29 3b 0a 20 20 7d 0a 7d 0a  , mtime);.  }.}.
5090: 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 77 72 61 70 70  ./*.** SQL wrapp
50a0: 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20 73 79  er around the sy
50b0: 6d 62 6f 6c 69 63 5f 6e 61 6d 65 5f 74 6f 5f 72  mbolic_name_to_r
50c0: 69 64 28 29 20 43 2d 6c 61 6e 67 75 61 67 65 20  id() C-language 
50d0: 41 50 49 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  API..** Examples
50e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 79 6d 62  :.**.**     symb
50f0: 6f 6c 69 63 5f 6e 61 6d 65 5f 74 6f 5f 72 69 64  olic_name_to_rid
5100: 28 27 74 72 75 6e 6b 27 29 3b 0a 2a 2a 20 20 20  ('trunk');.**   
5110: 20 20 73 79 6d 62 6f 6c 69 63 5f 6e 61 6d 65 5f    symbolic_name_
5120: 74 6f 5f 72 69 64 28 27 74 72 75 6e 6b 27 2c 27  to_rid('trunk','
5130: 77 27 29 3b 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20  w');.**.*/.void 
5140: 64 62 5f 73 79 6d 32 72 69 64 5f 66 75 6e 63 74  db_sym2rid_funct
5150: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
5160: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5170: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
5180: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5190: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  rgv.){.  const c
51a0: 68 61 72 20 2a 61 72 67 3b 0a 20 20 63 6f 6e 73  har *arg;.  cons
51b0: 74 20 63 68 61 72 20 2a 74 79 70 65 3b 0a 20 20  t char *type;.  
51c0: 69 66 28 31 20 21 3d 20 61 72 67 63 20 26 26 20  if(1 != argc && 
51d0: 32 20 21 3d 20 61 72 67 63 29 7b 0a 20 20 20 20  2 != argc){.    
51e0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
51f0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 45  rror(context, "E
5200: 78 70 65 63 74 69 6e 67 20 6f 6e 65 20 6f 72 20  xpecting one or 
5210: 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 22 2c 20  two arguments", 
5220: 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
5230: 0a 20 20 7d 0a 20 20 61 72 67 20 3d 20 28 63 6f  .  }.  arg = (co
5240: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
5250: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
5260: 76 5b 30 5d 29 3b 0a 20 20 69 66 28 21 61 72 67  v[0]);.  if(!arg
5270: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
5280: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
5290: 65 78 74 2c 20 22 45 78 70 65 63 74 69 6e 67 20  ext, "Expecting 
52a0: 61 20 53 54 52 49 4e 47 20 61 72 67 75 6d 65 6e  a STRING argumen
52b0: 74 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65  t", -1);.  }else
52c0: 7b 0a 20 20 20 20 69 6e 74 20 72 69 64 3b 0a 20  {.    int rid;. 
52d0: 20 20 20 74 79 70 65 20 3d 20 28 32 3d 3d 61 72     type = (2==ar
52e0: 67 63 29 20 3f 20 28 63 6f 6e 73 74 20 63 68 61  gc) ? (const cha
52f0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5300: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 20 3a  _text(argv[1]) :
5310: 20 30 3b 0a 20 20 20 20 69 66 28 21 74 79 70 65   0;.    if(!type
5320: 29 20 74 79 70 65 20 3d 20 22 63 69 22 3b 0a 20  ) type = "ci";. 
5330: 20 20 20 72 69 64 20 3d 20 73 79 6d 62 6f 6c 69     rid = symboli
5340: 63 5f 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 20 61  c_name_to_rid( a
5350: 72 67 2c 20 74 79 70 65 20 29 3b 0a 20 20 20 20  rg, type );.    
5360: 69 66 28 72 69 64 3c 30 29 7b 0a 20 20 20 20 20  if(rid<0){.     
5370: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5380: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
5390: 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 69 73  Symbolic name is
53a0: 20 61 6d 62 69 67 75 6f 75 73 2e 22 2c 20 2d 31   ambiguous.", -1
53b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
53c0: 30 3d 3d 72 69 64 29 7b 0a 20 20 20 20 20 20 73  0==rid){.      s
53d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
53e0: 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ll(context);.   
53f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
5400: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
5410: 36 34 28 63 6f 6e 74 65 78 74 2c 20 72 69 64 29  64(context, rid)
5420: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
5430: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
5440: 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  e SQL functions 
5450: 74 68 61 74 20 61 72 65 20 75 73 65 66 75 6c 20  that are useful 
5460: 62 6f 74 68 20 74 6f 20 74 68 65 20 69 6e 74 65  both to the inte
5470: 72 6e 61 6c 0a 2a 2a 20 72 65 70 72 65 73 65 6e  rnal.** represen
5480: 74 61 74 69 6f 6e 20 61 6e 64 20 74 6f 20 74 68  tation and to th
5490: 65 20 22 66 6f 73 73 69 6c 20 73 71 6c 22 20 63  e "fossil sql" c
54a0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ommand..*/.void 
54b0: 64 62 5f 61 64 64 5f 61 75 78 5f 66 75 6e 63 74  db_add_aux_funct
54c0: 69 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ions(sqlite3 *db
54d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65  ){.  sqlite3_cre
54e0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
54f0: 20 22 63 68 65 63 6b 69 6e 5f 6d 74 69 6d 65 22   "checkin_mtime"
5500: 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 2, SQLITE_UTF8
5510: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
5530: 62 5f 63 68 65 63 6b 69 6e 5f 6d 74 69 6d 65 5f  b_checkin_mtime_
5540: 66 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  function, 0, 0);
5550: 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
5560: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
5570: 73 79 6d 62 6f 6c 69 63 5f 6e 61 6d 65 5f 74 6f  symbolic_name_to
5580: 5f 72 69 64 22 2c 20 31 2c 20 53 51 4c 49 54 45  _rid", 1, SQLITE
5590: 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 20 20 64 62 5f 73 79 6d 32 72 69 64 5f 66      db_sym2rid_f
55c0: 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a  unction, 0, 0);.
55d0: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
55e0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73  _function(db, "s
55f0: 79 6d 62 6f 6c 69 63 5f 6e 61 6d 65 5f 74 6f 5f  ymbolic_name_to_
5600: 72 69 64 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  rid", 2, SQLITE_
5610: 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5630: 20 20 20 64 62 5f 73 79 6d 32 72 69 64 5f 66 75     db_sym2rid_fu
5640: 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20  nction, 0, 0);. 
5650: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
5660: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6e 6f  function(db, "no
5670: 77 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54  w", 0, SQLITE_UT
5680: 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  F8, 0,.         
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56a0: 20 20 20 20 20 20 20 20 64 62 5f 6e 6f 77 5f 66          db_now_f
56b0: 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a  unction, 0, 0);.
56c0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  }.../*.** Open a
56d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
56e0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
56f0: 72 20 74 6f 20 74 68 65 20 6e 65 77 20 64 61 74  r to the new dat
5700: 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
5710: 69 6f 6e 2e 20 20 41 6e 20 65 72 72 6f 72 20 72  ion.  An error r
5720: 65 73 75 6c 74 73 20 69 6e 20 70 72 6f 63 65 73  esults in proces
5730: 73 20 61 62 6f 72 74 2e 0a 2a 2f 0a 4c 4f 43 41  s abort..*/.LOCA
5740: 4c 20 73 71 6c 69 74 65 33 20 2a 64 62 5f 6f 70  L sqlite3 *db_op
5750: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
5760: 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72  DbName){.  int r
5770: 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
5780: 3b 0a 0a 20 20 69 66 28 20 67 2e 66 53 71 6c 54  ;..  if( g.fSqlT
5790: 72 61 63 65 20 29 20 66 6f 73 73 69 6c 5f 74 72  race ) fossil_tr
57a0: 61 63 65 28 22 2d 2d 20 73 71 6c 69 74 65 33 5f  ace("-- sqlite3_
57b0: 6f 70 65 6e 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  open: [%s]\n", z
57c0: 44 62 4e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20  DbName);.  rc = 
57d0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
57e0: 0a 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c  .       zDbName,
57f0: 20 26 64 62 2c 0a 20 20 20 20 20 20 20 53 51 4c   &db,.       SQL
5800: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
5810: 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
5820: 5f 43 52 45 41 54 45 2c 0a 20 20 20 20 20 20 20  _CREATE,.       
5830: 67 2e 7a 56 66 73 4e 61 6d 65 0a 20 20 29 3b 0a  g.zVfsName.  );.
5840: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5850: 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 5f 65 72  _OK ){.    db_er
5860: 72 28 22 5b 25 73 5d 3a 20 25 73 22 2c 20 7a 44  r("[%s]: %s", zD
5870: 62 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65  bName, sqlite3_e
5880: 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a  rrmsg(db));.  }.
5890: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74    sqlite3_busy_t
58a0: 69 6d 65 6f 75 74 28 64 62 2c 20 35 30 30 30 29  imeout(db, 5000)
58b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ;.  sqlite3_wal_
58c0: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64  autocheckpoint(d
58d0: 62 2c 20 31 29 3b 20 20 2f 2a 20 53 65 74 20 74  b, 1);  /* Set t
58e0: 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 66 72 65  o checkpoint fre
58f0: 71 75 65 6e 74 6c 79 20 2a 2f 0a 20 20 73 71 6c  quently */.  sql
5900: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
5910: 74 69 6f 6e 28 64 62 2c 20 22 75 73 65 72 22 2c  tion(db, "user",
5920: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
5930: 20 30 2c 20 64 62 5f 73 71 6c 5f 75 73 65 72 2c   0, db_sql_user,
5940: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
5950: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
5960: 6e 28 64 62 2c 20 22 63 67 69 22 2c 20 31 2c 20  n(db, "cgi", 1, 
5970: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
5980: 64 62 5f 73 71 6c 5f 63 67 69 2c 20 30 2c 20 30  db_sql_cgi, 0, 0
5990: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65  );.  sqlite3_cre
59a0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
59b0: 20 22 63 67 69 22 2c 20 32 2c 20 53 51 4c 49 54   "cgi", 2, SQLIT
59c0: 45 5f 55 54 46 38 2c 20 30 2c 20 64 62 5f 73 71  E_UTF8, 0, db_sq
59d0: 6c 5f 63 67 69 2c 20 30 2c 20 30 29 3b 0a 20 20  l_cgi, 0, 0);.  
59e0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
59f0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 70 72 69  unction(db, "pri
5a00: 6e 74 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  nt", -1, SQLITE_
5a10: 55 54 46 38 2c 20 30 2c 64 62 5f 73 71 6c 5f 70  UTF8, 0,db_sql_p
5a20: 72 69 6e 74 2c 30 2c 30 29 3b 0a 20 20 73 71 6c  rint,0,0);.  sql
5a30: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
5a40: 74 69 6f 6e 28 0a 20 20 20 20 64 62 2c 20 22 69  tion(.    db, "i
5a50: 73 5f 73 65 6c 65 63 74 65 64 22 2c 20 31 2c 20  s_selected", 1, 
5a60: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
5a70: 66 69 6c 65 5f 69 73 5f 73 65 6c 65 63 74 65 64  file_is_selected
5a80: 2c 30 2c 30 0a 20 20 29 3b 0a 20 20 73 71 6c 69  ,0,0.  );.  sqli
5a90: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
5aa0: 69 6f 6e 28 0a 20 20 20 20 64 62 2c 20 22 69 66  ion(.    db, "if
5ab0: 5f 73 65 6c 65 63 74 65 64 22 2c 20 33 2c 20 53  _selected", 3, S
5ac0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66  QLITE_UTF8, 0, f
5ad0: 69 6c 65 5f 69 73 5f 73 65 6c 65 63 74 65 64 2c  ile_is_selected,
5ae0: 30 2c 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 67  0,0.  );.  if( g
5af0: 2e 66 53 71 6c 54 72 61 63 65 20 29 20 73 71 6c  .fSqlTrace ) sql
5b00: 69 74 65 33 5f 74 72 61 63 65 28 64 62 2c 20 64  ite3_trace(db, d
5b10: 62 5f 73 71 6c 5f 74 72 61 63 65 2c 20 30 29 3b  b_sql_trace, 0);
5b20: 0a 20 20 64 62 5f 61 64 64 5f 61 75 78 5f 66 75  .  db_add_aux_fu
5b30: 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 20 20 72  nctions(db);.  r
5b40: 65 5f 61 64 64 5f 73 71 6c 5f 66 75 6e 63 28 64  e_add_sql_func(d
5b50: 62 29 3b 20 20 2f 2a 20 54 68 65 20 52 45 47 45  b);  /* The REGE
5b60: 58 50 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  XP operator */. 
5b70: 20 66 6f 63 69 5f 72 65 67 69 73 74 65 72 28 64   foci_register(d
5b80: 62 29 3b 20 20 20 20 2f 2a 20 54 68 65 20 22 66  b);    /* The "f
5b90: 69 6c 65 73 5f 6f 66 5f 63 68 65 63 6b 69 6e 22  iles_of_checkin"
5ba0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
5bb0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  /.  sqlite3_exec
5bc0: 28 64 62 2c 20 22 50 52 41 47 4d 41 20 66 6f 72  (db, "PRAGMA for
5bd0: 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 22 2c  eign_keys=OFF;",
5be0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74   0, 0, 0);.  ret
5bf0: 75 72 6e 20 64 62 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn db;.}.../*.*
5c00: 2a 20 44 65 74 61 63 68 65 73 20 74 68 65 20 7a  * Detaches the z
5c10: 4c 61 62 65 6c 20 64 61 74 61 62 61 73 65 2e 0a  Label database..
5c20: 2a 2f 0a 76 6f 69 64 20 64 62 5f 64 65 74 61 63  */.void db_detac
5c30: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c  h(const char *zL
5c40: 61 62 65 6c 29 7b 0a 20 20 64 62 5f 6d 75 6c 74  abel){.  db_mult
5c50: 69 5f 65 78 65 63 28 22 44 45 54 41 43 48 20 44  i_exec("DETACH D
5c60: 41 54 41 42 41 53 45 20 25 51 22 2c 20 7a 4c 61  ATABASE %Q", zLa
5c70: 62 65 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a  bel);.}../*.** z
5c80: 44 62 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  DbName is the na
5c90: 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
5ca0: 20 66 69 6c 65 2e 20 20 41 74 74 61 63 68 20 7a   file.  Attach z
5cb0: 44 62 4e 61 6d 65 20 75 73 69 6e 67 0a 2a 2a 20  DbName using.** 
5cc0: 74 68 65 20 6e 61 6d 65 20 7a 4c 61 62 65 6c 2e  the name zLabel.
5cd0: 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 61 74 74 61  .*/.void db_atta
5ce0: 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ch(const char *z
5cf0: 44 62 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  DbName, const ch
5d00: 61 72 20 2a 7a 4c 61 62 65 6c 29 7b 0a 20 20 64  ar *zLabel){.  d
5d10: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 41 54  b_multi_exec("AT
5d20: 54 41 43 48 20 44 41 54 41 42 41 53 45 20 25 51  TACH DATABASE %Q
5d30: 20 41 53 20 25 51 22 2c 20 7a 44 62 4e 61 6d 65   AS %Q", zDbName
5d40: 2c 20 7a 4c 61 62 65 6c 29 3b 0a 7d 0a 0a 2f 2a  , zLabel);.}../*
5d50: 0a 2a 2a 20 7a 44 62 4e 61 6d 65 20 69 73 20 74  .** zDbName is t
5d60: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
5d70: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
5d80: 6e 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  no other databas
5d90: 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 6f 70 65  e.** file is ope
5da0: 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 74 68 69  n, then open thi
5db0: 73 20 6f 6e 65 2e 20 20 49 66 20 61 6e 6f 74 68  s one.  If anoth
5dc0: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
5dd0: 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f   is.** already o
5de0: 70 65 6e 2c 20 74 68 65 6e 20 61 74 74 61 63 68  pen, then attach
5df0: 20 7a 44 62 4e 61 6d 65 20 75 73 69 6e 67 20 74   zDbName using t
5e00: 68 65 20 6e 61 6d 65 20 7a 4c 61 62 65 6c 2e 0a  he name zLabel..
5e10: 2a 2f 0a 76 6f 69 64 20 64 62 5f 6f 70 65 6e 5f  */.void db_open_
5e20: 6f 72 5f 61 74 74 61 63 68 28 0a 20 20 63 6f 6e  or_attach(.  con
5e30: 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
5e40: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
5e50: 7a 4c 61 62 65 6c 2c 0a 20 20 69 6e 74 20 2a 70  zLabel,.  int *p
5e60: 57 61 73 41 74 74 61 63 68 65 64 0a 29 7b 0a 20  WasAttached.){. 
5e70: 20 69 66 28 20 21 67 2e 64 62 20 29 7b 0a 20 20   if( !g.db ){.  
5e80: 20 20 61 73 73 65 72 74 28 20 67 2e 7a 4d 61 69    assert( g.zMai
5e90: 6e 44 62 54 79 70 65 3d 3d 30 20 29 3b 0a 20 20  nDbType==0 );.  
5ea0: 20 20 67 2e 64 62 20 3d 20 64 62 5f 6f 70 65 6e    g.db = db_open
5eb0: 28 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 20 20 67  (zDbName);.    g
5ec0: 2e 7a 4d 61 69 6e 44 62 54 79 70 65 20 3d 20 7a  .zMainDbType = z
5ed0: 4c 61 62 65 6c 3b 0a 20 20 20 20 69 66 28 20 70  Label;.    if( p
5ee0: 57 61 73 41 74 74 61 63 68 65 64 20 29 20 2a 70  WasAttached ) *p
5ef0: 57 61 73 41 74 74 61 63 68 65 64 20 3d 20 30 3b  WasAttached = 0;
5f00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
5f10: 73 65 72 74 28 20 67 2e 7a 4d 61 69 6e 44 62 54  sert( g.zMainDbT
5f20: 79 70 65 21 3d 30 20 29 3b 0a 20 20 20 20 64 62  ype!=0 );.    db
5f30: 5f 61 74 74 61 63 68 28 7a 44 62 4e 61 6d 65 2c  _attach(zDbName,
5f40: 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 69 66   zLabel);.    if
5f50: 28 20 70 57 61 73 41 74 74 61 63 68 65 64 20 29  ( pWasAttached )
5f60: 20 2a 70 57 61 73 41 74 74 61 63 68 65 64 20 3d   *pWasAttached =
5f70: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
5f80: 20 43 6c 6f 73 65 20 74 68 65 20 75 73 65 72 20   Close the user 
5f90: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69  database..*/.voi
5fa0: 64 20 64 62 5f 63 6c 6f 73 65 5f 63 6f 6e 66 69  d db_close_confi
5fb0: 67 28 29 7b 0a 20 20 69 66 28 20 67 2e 75 73 65  g(){.  if( g.use
5fc0: 41 74 74 61 63 68 20 29 7b 0a 20 20 20 20 64 62  Attach ){.    db
5fd0: 5f 64 65 74 61 63 68 28 22 63 6f 6e 66 69 67 64  _detach("configd
5fe0: 62 22 29 3b 0a 20 20 20 20 67 2e 75 73 65 41 74  b");.    g.useAt
5ff0: 74 61 63 68 20 3d 20 30 3b 0a 20 20 20 20 67 2e  tach = 0;.    g.
6000: 7a 43 6f 6e 66 69 67 44 62 4e 61 6d 65 20 3d 20  zConfigDbName = 
6010: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67  0;.  }else if( g
6020: 2e 64 62 43 6f 6e 66 69 67 20 29 7b 0a 20 20 20  .dbConfig ){.   
6030: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
6040: 63 6b 70 6f 69 6e 74 28 67 2e 64 62 43 6f 6e 66  ckpoint(g.dbConf
6050: 69 67 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ig, 0);.    sqli
6060: 74 65 33 5f 63 6c 6f 73 65 28 67 2e 64 62 43 6f  te3_close(g.dbCo
6070: 6e 66 69 67 29 3b 0a 20 20 20 20 67 2e 64 62 43  nfig);.    g.dbC
6080: 6f 6e 66 69 67 20 3d 20 30 3b 0a 20 20 20 20 67  onfig = 0;.    g
6090: 2e 7a 43 6f 6e 66 69 67 44 62 54 79 70 65 20 3d  .zConfigDbType =
60a0: 20 30 3b 0a 20 20 20 20 67 2e 7a 43 6f 6e 66 69   0;.    g.zConfi
60b0: 67 44 62 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  gDbName = 0;.  }
60c0: 65 6c 73 65 20 69 66 28 20 67 2e 64 62 20 26 26  else if( g.db &&
60d0: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 67   fossil_strcmp(g
60e0: 2e 7a 4d 61 69 6e 44 62 54 79 70 65 2c 20 22 63  .zMainDbType, "c
60f0: 6f 6e 66 69 67 64 62 22 29 3d 3d 30 20 29 7b 0a  onfigdb")==0 ){.
6100: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
6110: 63 68 65 63 6b 70 6f 69 6e 74 28 67 2e 64 62 2c  checkpoint(g.db,
6120: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6130: 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b 0a 20 20  _close(g.db);.  
6140: 20 20 67 2e 64 62 20 3d 20 30 3b 0a 20 20 20 20    g.db = 0;.    
6150: 67 2e 7a 4d 61 69 6e 44 62 54 79 70 65 20 3d 20  g.zMainDbType = 
6160: 30 3b 0a 20 20 20 20 67 2e 7a 43 6f 6e 66 69 67  0;.    g.zConfig
6170: 44 62 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  DbName = 0;.  }.
6180: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
6190: 65 20 75 73 65 72 20 64 61 74 61 62 61 73 65 20  e user database 
61a0: 69 6e 20 22 7e 2f 2e 66 6f 73 73 69 6c 22 2e 20  in "~/.fossil". 
61b0: 20 43 72 65 61 74 65 20 74 68 65 20 64 61 74 61   Create the data
61c0: 62 61 73 65 20 61 6e 65 77 20 69 66 0a 2a 2a 20  base anew if.** 
61d0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
61e0: 61 64 79 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  ady exist..**.**
61f0: 20 49 66 20 74 68 65 20 75 73 65 41 74 74 61 63   If the useAttac
6200: 68 20 66 6c 61 67 20 69 73 20 30 20 28 74 68 65  h flag is 0 (the
6210: 20 75 73 75 61 6c 20 63 61 73 65 29 20 74 68 65   usual case) the
6220: 6e 20 74 68 65 20 75 73 65 72 20 64 61 74 61 62  n the user datab
6230: 61 73 65 20 69 73 0a 2a 2a 20 6f 70 65 6e 65 64  ase is.** opened
6240: 20 6f 6e 20 61 20 73 65 70 61 72 61 74 65 20 64   on a separate d
6250: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6260: 6f 6e 20 67 2e 64 62 43 6f 6e 66 69 67 2e 20 20  on g.dbConfig.  
6270: 54 68 69 73 20 70 72 65 76 65 6e 74 73 0a 2a 2a  This prevents.**
6280: 20 74 68 65 20 7e 2f 2e 66 6f 73 73 69 6c 20 64   the ~/.fossil d
6290: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 62 65 63  atabase from bec
62a0: 6f 6d 69 6e 67 20 6c 6f 63 6b 65 64 20 6f 6e 20  oming locked on 
62b0: 6c 6f 6e 67 20 63 68 65 63 6b 2d 69 6e 20 6f 72  long check-in or
62c0: 20 73 79 6e 63 0a 2a 2a 20 6f 70 65 72 61 74 69   sync.** operati
62d0: 6f 6e 73 20 77 68 69 63 68 20 68 6f 6c 64 20 61  ons which hold a
62e0: 6e 20 65 78 63 6c 75 73 69 76 65 20 74 72 61 6e  n exclusive tran
62f0: 73 61 63 74 69 6f 6e 2e 20 20 49 6e 20 61 20 66  saction.  In a f
6300: 65 77 20 63 61 73 65 73 2c 20 74 68 6f 75 67 68  ew cases, though
6310: 2c 0a 2a 2a 20 69 74 20 69 73 20 63 6f 6e 76 65  ,.** it is conve
6320: 6e 69 65 6e 74 20 66 6f 72 20 74 68 65 20 7e 2f  nient for the ~/
6330: 2e 66 6f 73 73 69 6c 20 74 6f 20 62 65 20 61 74  .fossil to be at
6340: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6d 61  tached to the ma
6350: 69 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  in database.** c
6360: 6f 6e 6e 65 63 74 69 6f 6e 20 73 6f 20 74 68 61  onnection so tha
6370: 74 20 77 65 20 63 61 6e 20 6a 6f 69 6e 20 62 65  t we can join be
6380: 74 77 65 65 6e 20 74 68 65 20 76 61 72 69 6f 75  tween the variou
6390: 73 20 64 61 74 61 62 61 73 65 73 2e 20 20 49 6e  s databases.  In
63a0: 20 74 68 61 74 0a 2a 2a 20 63 61 73 65 2c 20 69   that.** case, i
63b0: 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69  nvoke this routi
63c0: 6e 65 20 77 69 74 68 20 75 73 65 41 74 74 61 63  ne with useAttac
63d0: 68 20 61 73 20 31 2e 0a 2a 2f 0a 76 6f 69 64 20  h as 1..*/.void 
63e0: 64 62 5f 6f 70 65 6e 5f 63 6f 6e 66 69 67 28 69  db_open_config(i
63f0: 6e 74 20 75 73 65 41 74 74 61 63 68 29 7b 0a 20  nt useAttach){. 
6400: 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a   char *zDbName;.
6410: 20 20 63 68 61 72 20 2a 7a 48 6f 6d 65 3b 0a 20    char *zHome;. 
6420: 20 69 66 28 20 67 2e 7a 43 6f 6e 66 69 67 44 62   if( g.zConfigDb
6430: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Name ){.    if( 
6440: 75 73 65 41 74 74 61 63 68 3d 3d 67 2e 75 73 65  useAttach==g.use
6450: 41 74 74 61 63 68 20 29 20 72 65 74 75 72 6e 3b  Attach ) return;
6460: 0a 20 20 20 20 64 62 5f 63 6c 6f 73 65 5f 63 6f  .    db_close_co
6470: 6e 66 69 67 28 29 3b 0a 20 20 7d 0a 20 20 7a 48  nfig();.  }.  zH
6480: 6f 6d 65 20 3d 20 66 6f 73 73 69 6c 5f 67 65 74  ome = fossil_get
6490: 65 6e 76 28 22 46 4f 53 53 49 4c 5f 48 4f 4d 45  env("FOSSIL_HOME
64a0: 22 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ");.#if defined(
64b0: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
64c0: 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
64d0: 20 69 66 28 20 7a 48 6f 6d 65 3d 3d 30 20 29 7b   if( zHome==0 ){
64e0: 0a 20 20 20 20 7a 48 6f 6d 65 20 3d 20 66 6f 73  .    zHome = fos
64f0: 73 69 6c 5f 67 65 74 65 6e 76 28 22 4c 4f 43 41  sil_getenv("LOCA
6500: 4c 41 50 50 44 41 54 41 22 29 3b 0a 20 20 20 20  LAPPDATA");.    
6510: 69 66 28 20 7a 48 6f 6d 65 3d 3d 30 20 29 7b 0a  if( zHome==0 ){.
6520: 20 20 20 20 20 20 7a 48 6f 6d 65 20 3d 20 66 6f        zHome = fo
6530: 73 73 69 6c 5f 67 65 74 65 6e 76 28 22 41 50 50  ssil_getenv("APP
6540: 44 41 54 41 22 29 3b 0a 20 20 20 20 20 20 69 66  DATA");.      if
6550: 28 20 7a 48 6f 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zHome==0 ){.  
6560: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 44 72 69        char *zDri
6570: 76 65 20 3d 20 66 6f 73 73 69 6c 5f 67 65 74 65  ve = fossil_gete
6580: 6e 76 28 22 48 4f 4d 45 44 52 49 56 45 22 29 3b  nv("HOMEDRIVE");
6590: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
65a0: 50 61 74 68 20 3d 20 66 6f 73 73 69 6c 5f 67 65  Path = fossil_ge
65b0: 74 65 6e 76 28 22 48 4f 4d 45 50 41 54 48 22 29  tenv("HOMEPATH")
65c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 44  ;.        if( zD
65d0: 72 69 76 65 20 26 26 20 7a 50 61 74 68 20 29 20  rive && zPath ) 
65e0: 7a 48 6f 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28  zHome = mprintf(
65f0: 22 25 73 25 73 22 2c 20 7a 44 72 69 76 65 2c 20  "%s%s", zDrive, 
6600: 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zPath);.      }.
6610: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
6620: 7a 48 6f 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zHome==0 ){.    
6630: 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 63 61  fossil_fatal("ca
6640: 6e 6e 6f 74 20 6c 6f 63 61 74 65 20 68 6f 6d 65  nnot locate home
6650: 20 64 69 72 65 63 74 6f 72 79 20 2d 20 70 6c 65   directory - ple
6660: 61 73 65 20 73 65 74 20 74 68 65 20 22 0a 20 20  ase set the ".  
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
6680: 46 4f 53 53 49 4c 5f 48 4f 4d 45 2c 20 4c 4f 43  FOSSIL_HOME, LOC
6690: 41 4c 41 50 50 44 41 54 41 2c 20 41 50 50 44 41  ALAPPDATA, APPDA
66a0: 54 41 2c 20 6f 72 20 48 4f 4d 45 50 41 54 48 20  TA, or HOMEPATH 
66b0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
66c0: 20 20 20 22 65 6e 76 69 72 6f 6e 6d 65 6e 74 20     "environment 
66d0: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
66e0: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 7a 48 6f  .#else.  if( zHo
66f0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 48 6f  me==0 ){.    zHo
6700: 6d 65 20 3d 20 66 6f 73 73 69 6c 5f 67 65 74 65  me = fossil_gete
6710: 6e 76 28 22 48 4f 4d 45 22 29 3b 0a 20 20 7d 0a  nv("HOME");.  }.
6720: 20 20 69 66 28 20 7a 48 6f 6d 65 3d 3d 30 20 29    if( zHome==0 )
6730: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74  {.    fossil_fat
6740: 61 6c 28 22 63 61 6e 6e 6f 74 20 6c 6f 63 61 74  al("cannot locat
6750: 65 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79  e home directory
6760: 20 2d 20 70 6c 65 61 73 65 20 73 65 74 20 74 68   - please set th
6770: 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  e ".            
6780: 20 20 20 20 20 22 46 4f 53 53 49 4c 5f 48 4f 4d       "FOSSIL_HOM
6790: 45 20 6f 72 20 48 4f 4d 45 20 65 6e 76 69 72 6f  E or HOME enviro
67a0: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 22  nment variables"
67b0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
67c0: 69 66 28 20 66 69 6c 65 5f 69 73 64 69 72 28 7a  if( file_isdir(z
67d0: 48 6f 6d 65 29 21 3d 31 20 29 7b 0a 20 20 20 20  Home)!=1 ){.    
67e0: 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 69 6e  fossil_fatal("in
67f0: 76 61 6c 69 64 20 68 6f 6d 65 20 64 69 72 65 63  valid home direc
6800: 74 6f 72 79 3a 20 25 73 22 2c 20 7a 48 6f 6d 65  tory: %s", zHome
6810: 29 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  );.  }.#if defin
6820: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
6830: 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
6840: 29 0a 20 20 2f 2a 20 2e 20 66 69 6c 65 6e 61 6d  ).  /* . filenam
6850: 65 73 20 67 69 76 65 20 73 6f 6d 65 20 77 69 6e  es give some win
6860: 64 6f 77 20 73 79 73 74 65 6d 73 20 70 72 6f 62  dow systems prob
6870: 6c 65 6d 73 20 61 6e 64 20 6d 61 6e 79 20 61 70  lems and many ap
6880: 70 73 20 70 72 6f 62 6c 65 6d 73 20 2a 2f 0a 20  ps problems */. 
6890: 20 7a 44 62 4e 61 6d 65 20 3d 20 6d 70 72 69 6e   zDbName = mprin
68a0: 74 66 28 22 25 2f 2f 5f 66 6f 73 73 69 6c 22 2c  tf("%//_fossil",
68b0: 20 7a 48 6f 6d 65 29 3b 0a 23 65 6c 73 65 0a 20   zHome);.#else. 
68c0: 20 7a 44 62 4e 61 6d 65 20 3d 20 6d 70 72 69 6e   zDbName = mprin
68d0: 74 66 28 22 25 73 2f 2e 66 6f 73 73 69 6c 22 2c  tf("%s/.fossil",
68e0: 20 7a 48 6f 6d 65 29 3b 0a 23 65 6e 64 69 66 0a   zHome);.#endif.
68f0: 20 20 69 66 28 20 66 69 6c 65 5f 73 69 7a 65 28    if( file_size(
6900: 7a 44 62 4e 61 6d 65 29 3c 31 30 32 34 2a 33 20  zDbName)<1024*3 
6910: 29 7b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f  ){.    if( file_
6920: 61 63 63 65 73 73 28 7a 48 6f 6d 65 2c 20 57 5f  access(zHome, W_
6930: 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 73  OK) ){.      fos
6940: 73 69 6c 5f 66 61 74 61 6c 28 22 68 6f 6d 65 20  sil_fatal("home 
6950: 64 69 72 65 63 74 6f 72 79 20 25 73 20 6d 75 73  directory %s mus
6960: 74 20 62 65 20 77 72 69 74 65 61 62 6c 65 22 2c  t be writeable",
6970: 20 7a 48 6f 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zHome);.    }. 
6980: 20 20 20 64 62 5f 69 6e 69 74 5f 64 61 74 61 62     db_init_datab
6990: 61 73 65 28 7a 44 62 4e 61 6d 65 2c 20 7a 43 6f  ase(zDbName, zCo
69a0: 6e 66 69 67 53 63 68 65 6d 61 2c 20 28 63 68 61  nfigSchema, (cha
69b0: 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  r*)0);.  }.  if(
69c0: 20 66 69 6c 65 5f 61 63 63 65 73 73 28 7a 44 62   file_access(zDb
69d0: 4e 61 6d 65 2c 20 57 5f 4f 4b 29 20 29 7b 0a 20  Name, W_OK) ){. 
69e0: 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28     fossil_fatal(
69f0: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66  "configuration f
6a00: 69 6c 65 20 25 73 20 6d 75 73 74 20 62 65 20 77  ile %s must be w
6a10: 72 69 74 65 61 62 6c 65 22 2c 20 7a 44 62 4e 61  riteable", zDbNa
6a20: 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75  me);.  }.  if( u
6a30: 73 65 41 74 74 61 63 68 20 29 7b 0a 20 20 20 20  seAttach ){.    
6a40: 64 62 5f 6f 70 65 6e 5f 6f 72 5f 61 74 74 61 63  db_open_or_attac
6a50: 68 28 7a 44 62 4e 61 6d 65 2c 20 22 63 6f 6e 66  h(zDbName, "conf
6a60: 69 67 64 62 22 2c 20 26 67 2e 75 73 65 41 74 74  igdb", &g.useAtt
6a70: 61 63 68 29 3b 0a 20 20 20 20 67 2e 64 62 43 6f  ach);.    g.dbCo
6a80: 6e 66 69 67 20 3d 20 30 3b 0a 20 20 20 20 67 2e  nfig = 0;.    g.
6a90: 7a 43 6f 6e 66 69 67 44 62 54 79 70 65 20 3d 20  zConfigDbType = 
6aa0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
6ab0: 67 2e 75 73 65 41 74 74 61 63 68 20 3d 20 30 3b  g.useAttach = 0;
6ac0: 0a 20 20 20 20 67 2e 64 62 43 6f 6e 66 69 67 20  .    g.dbConfig 
6ad0: 3d 20 64 62 5f 6f 70 65 6e 28 7a 44 62 4e 61 6d  = db_open(zDbNam
6ae0: 65 29 3b 0a 20 20 20 20 67 2e 7a 43 6f 6e 66 69  e);.    g.zConfi
6af0: 67 44 62 54 79 70 65 20 3d 20 22 63 6f 6e 66 69  gDbType = "confi
6b00: 67 64 62 22 3b 0a 20 20 7d 0a 20 20 67 2e 7a 43  gdb";.  }.  g.zC
6b10: 6f 6e 66 69 67 44 62 4e 61 6d 65 20 3d 20 7a 44  onfigDbName = zD
6b20: 62 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  bName;.}../*.** 
6b30: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a  Return TRUE if z
6b40: 54 61 62 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f  Table exists..*/
6b50: 0a 69 6e 74 20 64 62 5f 74 61 62 6c 65 5f 65 78  .int db_table_ex
6b60: 69 73 74 73 28 0a 20 20 63 6f 6e 73 74 20 63 68  ists(.  const ch
6b70: 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 2f 2a  ar *zDb,      /*
6b80: 20 4f 6e 65 20 6f 66 3a 20 4e 55 4c 4c 2c 20 22   One of: NULL, "
6b90: 63 6f 6e 66 69 67 64 62 22 2c 20 22 6c 6f 63 61  configdb", "loca
6ba0: 6c 64 62 22 2c 20 22 72 65 70 6f 73 69 74 6f 72  ldb", "repositor
6bb0: 79 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  y" */.  const ch
6bc0: 61 72 20 2a 7a 54 61 62 6c 65 20 20 20 20 2f 2a  ar *zTable    /*
6bd0: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 2a   Name of table *
6be0: 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  /.){.  return sq
6bf0: 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
6c00: 6d 6e 5f 6d 65 74 61 64 61 74 61 28 67 2e 64 62  mn_metadata(g.db
6c10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6c20: 7a 44 62 20 3f 20 64 62 5f 6e 61 6d 65 28 7a 44  zDb ? db_name(zD
6c30: 62 29 20 3a 20 30 2c 20 7a 54 61 62 6c 65 2c 20  b) : 0, zTable, 
6c40: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
6c50: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3d   0, 0, 0, 0, 0)=
6c60: 3d 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f  =SQLITE_OK;.}../
6c70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
6c80: 20 69 66 20 7a 54 61 62 6c 65 20 65 78 69 73 74   if zTable exist
6c90: 73 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73 20 63  s and contains c
6ca0: 6f 6c 75 6d 6e 20 7a 43 6f 6c 75 6d 6e 2e 0a 2a  olumn zColumn..*
6cb0: 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69  * Return FALSE i
6cc0: 66 20 7a 54 61 62 6c 65 20 64 6f 65 73 20 6e 6f  f zTable does no
6cd0: 74 20 65 78 69 73 74 20 6f 72 20 69 66 20 7a 54  t exist or if zT
6ce0: 61 62 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 62  able exists.** b
6cf0: 75 74 20 6c 61 63 6b 73 20 7a 43 6f 6c 75 6d 6e  ut lacks zColumn
6d00: 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 74 61 62 6c  ..*/.int db_tabl
6d10: 65 5f 68 61 73 5f 63 6f 6c 75 6d 6e 28 0a 20 20  e_has_column(.  
6d20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
6d30: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
6d40: 3a 20 4e 55 4c 4c 2c 20 22 63 6f 6e 66 69 67 22  : NULL, "config"
6d50: 2c 20 22 6c 6f 63 61 6c 64 62 22 2c 20 22 72 65  , "localdb", "re
6d60: 70 6f 73 69 74 6f 72 79 22 20 2a 2f 0a 20 20 63  pository" */.  c
6d70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
6d80: 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e,    /* Name of
6d90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73   table */.  cons
6da0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 20  t char *zColumn 
6db0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f     /* Name of co
6dc0: 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 2a 2f  lumn in table */
6dd0: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
6de0: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
6df0: 6e 5f 6d 65 74 61 64 61 74 61 28 67 2e 64 62 2c  n_metadata(g.db,
6e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
6e10: 44 62 20 3f 20 64 62 5f 6e 61 6d 65 28 7a 44 62  Db ? db_name(zDb
6e20: 29 20 3a 20 30 2c 20 7a 54 61 62 6c 65 2c 20 7a  ) : 0, zTable, z
6e30: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20  Column,.        
6e40: 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30        0, 0, 0, 0
6e50: 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  , 0)==SQLITE_OK;
6e60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6e70: 73 20 54 52 55 45 20 69 66 20 7a 54 61 62 6c 65  s TRUE if zTable
6e80: 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 6c   exists in the l
6e90: 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 62 75  ocal database bu
6ea0: 74 20 6c 61 63 6b 73 20 63 6f 6c 75 6d 6e 0a 2a  t lacks column.*
6eb0: 2a 20 7a 43 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61  * zColumn.*/.sta
6ec0: 74 69 63 20 69 6e 74 20 64 62 5f 6c 6f 63 61 6c  tic int db_local
6ed0: 5f 74 61 62 6c 65 5f 65 78 69 73 74 73 5f 62 75  _table_exists_bu
6ee0: 74 5f 6c 61 63 6b 73 5f 63 6f 6c 75 6d 6e 28 0a  t_lacks_column(.
6ef0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
6f00: 61 62 6c 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68  able,.  const ch
6f10: 61 72 20 2a 7a 43 6f 6c 75 6d 6e 0a 29 7b 0a 20  ar *zColumn.){. 
6f20: 20 72 65 74 75 72 6e 20 64 62 5f 74 61 62 6c 65   return db_table
6f30: 5f 65 78 69 73 74 73 28 64 62 5f 6e 61 6d 65 28  _exists(db_name(
6f40: 22 6c 6f 63 61 6c 64 62 22 29 2c 20 7a 54 61 62  "localdb"), zTab
6f50: 6c 65 29 0a 20 20 20 20 20 20 26 26 20 21 64 62  le).      && !db
6f60: 5f 74 61 62 6c 65 5f 68 61 73 5f 63 6f 6c 75 6d  _table_has_colum
6f70: 6e 28 64 62 5f 6e 61 6d 65 28 22 6c 6f 63 61 6c  n(db_name("local
6f80: 64 62 22 29 2c 20 7a 54 61 62 6c 65 2c 20 7a 43  db"), zTable, zC
6f90: 6f 6c 75 6d 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  olumn);.}../*.**
6fa0: 20 49 66 20 7a 44 62 4e 61 6d 65 20 69 73 20 61   If zDbName is a
6fb0: 20 76 61 6c 69 64 20 6c 6f 63 61 6c 20 64 61 74   valid local dat
6fc0: 61 62 61 73 65 20 66 69 6c 65 2c 20 6f 70 65 6e  abase file, open
6fd0: 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a   it and return.*
6fe0: 2a 20 74 72 75 65 2e 20 20 49 66 20 69 74 20 69  * true.  If it i
6ff0: 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6c 6f  s not a valid lo
7000: 63 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  cal database fil
7010: 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  e, return 0..*/.
7020: 73 74 61 74 69 63 20 69 6e 74 20 69 73 56 61 6c  static int isVal
7030: 69 64 4c 6f 63 61 6c 44 62 28 63 6f 6e 73 74 20  idLocalDb(const 
7040: 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
7050: 20 20 69 36 34 20 6c 73 69 7a 65 3b 0a 20 20 63    i64 lsize;.  c
7060: 68 61 72 20 2a 7a 56 46 69 6c 65 44 65 66 3b 0a  har *zVFileDef;.
7070: 0a 20 20 69 66 28 20 66 69 6c 65 5f 61 63 63 65  .  if( file_acce
7080: 73 73 28 7a 44 62 4e 61 6d 65 2c 20 46 5f 4f 4b  ss(zDbName, F_OK
7090: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
70a0: 6c 73 69 7a 65 20 3d 20 66 69 6c 65 5f 73 69 7a  lsize = file_siz
70b0: 65 28 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66  e(zDbName);.  if
70c0: 28 20 6c 73 69 7a 65 25 31 30 32 34 21 3d 30 20  ( lsize%1024!=0 
70d0: 7c 7c 20 6c 73 69 7a 65 3c 34 30 39 36 20 29 20  || lsize<4096 ) 
70e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 64 62 5f 6f  return 0;.  db_o
70f0: 70 65 6e 5f 6f 72 5f 61 74 74 61 63 68 28 7a 44  pen_or_attach(zD
7100: 62 4e 61 6d 65 2c 20 22 6c 6f 63 61 6c 64 62 22  bName, "localdb"
7110: 2c 20 30 29 3b 0a 20 20 7a 56 46 69 6c 65 44 65  , 0);.  zVFileDe
7120: 66 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22  f = db_text(0, "
7130: 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
7140: 25 73 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  %s.sqlite_master
7150: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
7160: 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
7170: 52 45 20 6e 61 6d 65 3d 3d 27 76 66 69 6c 65 27  RE name=='vfile'
7180: 22 2c 20 64 62 5f 6e 61 6d 65 28 22 6c 6f 63 61  ", db_name("loca
7190: 6c 64 62 22 29 29 3b 0a 20 20 69 66 28 20 7a 56  ldb"));.  if( zV
71a0: 46 69 6c 65 44 65 66 3d 3d 30 20 29 20 72 65 74  FileDef==0 ) ret
71b0: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  urn 0;..  /* If 
71c0: 74 68 65 20 22 69 73 65 78 65 22 20 63 6f 6c 75  the "isexe" colu
71d0: 6d 6e 20 69 73 20 6d 69 73 73 69 6e 67 20 66 72  mn is missing fr
71e0: 6f 6d 20 74 68 65 20 76 66 69 6c 65 20 74 61 62  om the vfile tab
71f0: 6c 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 64  le, then.  ** ad
7200: 64 20 69 74 20 6e 6f 77 2e 20 20 20 54 68 69 73  d it now.   This
7210: 20 63 6f 64 65 20 61 64 64 65 64 20 6f 6e 20 32   code added on 2
7220: 30 31 30 2d 30 33 2d 30 36 2e 20 20 41 66 74 65  010-03-06.  Afte
7230: 72 20 61 6c 6c 20 75 73 65 72 73 20 68 61 76 65  r all users have
7240: 0a 20 20 2a 2a 20 75 70 67 72 61 64 65 64 2c 20  .  ** upgraded, 
7250: 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 62 65  this code can be
7260: 20 73 61 66 65 6c 79 20 64 65 6c 65 74 65 64 2e   safely deleted.
7270: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
7280: 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 2a 20 69  te3_strglob("* i
7290: 73 65 78 65 20 2a 22 2c 20 7a 56 46 69 6c 65 44  sexe *", zVFileD
72a0: 65 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 62  ef)!=0 ){.    db
72b0: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 41 4c 54  _multi_exec("ALT
72c0: 45 52 20 54 41 42 4c 45 20 76 66 69 6c 65 20 41  ER TABLE vfile A
72d0: 44 44 20 43 4f 4c 55 4d 4e 20 69 73 65 78 65 20  DD COLUMN isexe 
72e0: 42 4f 4f 4c 45 41 4e 20 44 45 46 41 55 4c 54 20  BOOLEAN DEFAULT 
72f0: 30 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  0");.  }..  /* I
7300: 66 20 22 69 73 6c 69 6e 6b 22 2f 22 69 73 4c 69  f "islink"/"isLi
7310: 6e 6b 22 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20  nk" columns are 
7320: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 74 61 62  missing from tab
7330: 6c 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61  les, then.  ** a
7340: 64 64 20 74 68 65 6d 20 6e 6f 77 2e 20 20 20 54  dd them now.   T
7350: 68 69 73 20 63 6f 64 65 20 61 64 64 65 64 20 6f  his code added o
7360: 6e 20 32 30 31 31 2d 30 31 2d 31 37 20 61 6e 64  n 2011-01-17 and
7370: 20 32 30 31 31 2d 30 38 2d 32 37 2e 0a 20 20 2a   2011-08-27..  *
7380: 2a 20 41 66 74 65 72 20 61 6c 6c 20 75 73 65 72  * After all user
7390: 73 20 68 61 76 65 20 75 70 67 72 61 64 65 64 2c  s have upgraded,
73a0: 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 62   this code can b
73b0: 65 20 73 61 66 65 6c 79 20 64 65 6c 65 74 65 64  e safely deleted
73c0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
73d0: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 2a 20  ite3_strglob("* 
73e0: 69 73 6c 69 6e 6b 20 2a 22 2c 20 7a 56 46 69 6c  islink *", zVFil
73f0: 65 44 65 66 29 21 3d 30 20 29 7b 0a 20 20 20 20  eDef)!=0 ){.    
7400: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 41  db_multi_exec("A
7410: 4c 54 45 52 20 54 41 42 4c 45 20 76 66 69 6c 65  LTER TABLE vfile
7420: 20 41 44 44 20 43 4f 4c 55 4d 4e 20 69 73 6c 69   ADD COLUMN isli
7430: 6e 6b 20 42 4f 4f 4c 45 41 4e 20 44 45 46 41 55  nk BOOLEAN DEFAU
7440: 4c 54 20 30 22 29 3b 0a 20 20 20 20 69 66 28 20  LT 0");.    if( 
7450: 64 62 5f 6c 6f 63 61 6c 5f 74 61 62 6c 65 5f 65  db_local_table_e
7460: 78 69 73 74 73 5f 62 75 74 5f 6c 61 63 6b 73 5f  xists_but_lacks_
7470: 63 6f 6c 75 6d 6e 28 22 73 74 61 73 68 66 69 6c  column("stashfil
7480: 65 22 2c 20 22 69 73 4c 69 6e 6b 22 29 20 29 7b  e", "isLink") ){
7490: 0a 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  .      db_multi_
74a0: 65 78 65 63 28 22 41 4c 54 45 52 20 54 41 42 4c  exec("ALTER TABL
74b0: 45 20 73 74 61 73 68 66 69 6c 65 20 41 44 44 20  E stashfile ADD 
74c0: 43 4f 4c 55 4d 4e 20 69 73 4c 69 6e 6b 20 42 4f  COLUMN isLink BO
74d0: 4f 4c 20 44 45 46 41 55 4c 54 20 30 22 29 3b 0a  OL DEFAULT 0");.
74e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
74f0: 5f 6c 6f 63 61 6c 5f 74 61 62 6c 65 5f 65 78 69  _local_table_exi
7500: 73 74 73 5f 62 75 74 5f 6c 61 63 6b 73 5f 63 6f  sts_but_lacks_co
7510: 6c 75 6d 6e 28 22 75 6e 64 6f 22 2c 20 22 69 73  lumn("undo", "is
7520: 4c 69 6e 6b 22 29 20 29 7b 0a 20 20 20 20 20 20  Link") ){.      
7530: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 41  db_multi_exec("A
7540: 4c 54 45 52 20 54 41 42 4c 45 20 75 6e 64 6f 20  LTER TABLE undo 
7550: 41 44 44 20 43 4f 4c 55 4d 4e 20 69 73 4c 69 6e  ADD COLUMN isLin
7560: 6b 20 42 4f 4f 4c 45 41 4e 20 44 45 46 41 55 4c  k BOOLEAN DEFAUL
7570: 54 20 30 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  T 0");.    }.   
7580: 20 69 66 28 20 64 62 5f 6c 6f 63 61 6c 5f 74 61   if( db_local_ta
7590: 62 6c 65 5f 65 78 69 73 74 73 5f 62 75 74 5f 6c  ble_exists_but_l
75a0: 61 63 6b 73 5f 63 6f 6c 75 6d 6e 28 22 75 6e 64  acks_column("und
75b0: 6f 5f 76 66 69 6c 65 22 2c 20 22 69 73 6c 69 6e  o_vfile", "islin
75c0: 6b 22 29 20 29 7b 0a 20 20 20 20 20 20 64 62 5f  k") ){.      db_
75d0: 6d 75 6c 74 69 5f 65 78 65 63 28 22 41 4c 54 45  multi_exec("ALTE
75e0: 52 20 54 41 42 4c 45 20 75 6e 64 6f 5f 76 66 69  R TABLE undo_vfi
75f0: 6c 65 20 41 44 44 20 43 4f 4c 55 4d 4e 20 69 73  le ADD COLUMN is
7600: 6c 69 6e 6b 20 42 4f 4f 4c 20 44 45 46 41 55 4c  link BOOL DEFAUL
7610: 54 20 30 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  T 0");.    }.  }
7620: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
7630: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
7640: 20 72 6f 6f 74 20 64 69 72 65 63 74 6f 72 79 20   root directory 
7650: 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 72 65 70  of the local rep
7660: 6f 73 69 74 6f 72 79 20 74 72 65 65 2e 20 20 54  ository tree.  T
7670: 68 65 20 72 6f 6f 74 0a 2a 2a 20 64 69 72 65 63  he root.** direc
7680: 74 6f 72 79 20 69 73 20 66 6f 75 6e 64 20 62 79  tory is found by
7690: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61   searching for a
76a0: 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 5f 46 4f   file named "_FO
76b0: 53 53 49 4c 5f 22 20 6f 72 20 22 2e 66 73 6c 63  SSIL_" or ".fslc
76c0: 6b 6f 75 74 22 0a 2a 2a 20 74 68 61 74 20 63 6f  kout".** that co
76d0: 6e 74 61 69 6e 73 20 61 20 76 61 6c 69 64 20 72  ntains a valid r
76e0: 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61 62 61  epository databa
76f0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6c 65  se..**.** For le
7700: 67 61 63 79 2c 20 61 6c 73 6f 20 6c 6f 6f 6b 20  gacy, also look 
7710: 66 6f 72 20 22 2e 66 6f 73 22 2e 20 20 54 68 65  for ".fos".  The
7720: 20 75 73 65 20 6f 66 20 22 2e 66 6f 73 22 20 69   use of ".fos" i
7730: 73 20 64 65 70 72 65 63 61 74 65 64 0a 2a 2a 20  s deprecated.** 
7740: 73 69 6e 63 65 20 22 66 6f 73 22 20 68 61 73 20  since "fos" has 
7750: 6e 65 67 61 74 69 76 65 20 63 6f 6e 6e 6f 74 61  negative connota
7760: 74 69 6f 6e 73 20 69 6e 20 48 75 6e 67 61 72 69  tions in Hungari
7770: 61 6e 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2e  an, we are told.
7780: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 61 6c  .**.** If no val
7790: 69 64 20 5f 46 4f 53 53 49 4c 5f 20 6f 72 20 2e  id _FOSSIL_ or .
77a0: 66 73 6c 63 6b 6f 75 74 20 66 69 6c 65 20 69 73  fslckout file is
77b0: 20 66 6f 75 6e 64 2c 20 77 65 20 6d 6f 76 65 20   found, we move 
77c0: 75 70 20 6f 6e 65 20 6c 65 76 65 6c 20 61 6e 64  up one level and
77d0: 0a 2a 2a 20 74 72 79 20 61 67 61 69 6e 2e 20 4f  .** try again. O
77e0: 6e 63 65 20 74 68 65 20 66 69 6c 65 20 69 73 20  nce the file is 
77f0: 66 6f 75 6e 64 2c 20 74 68 65 20 67 2e 7a 4c 6f  found, the g.zLo
7800: 63 61 6c 52 6f 6f 74 20 76 61 72 69 61 62 6c 65  calRoot variable
7810: 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68   is set.** to th
7820: 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 72 65  e root of the re
7830: 70 6f 73 69 74 6f 72 79 20 74 72 65 65 20 61 6e  pository tree an
7840: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
7850: 65 74 75 72 6e 73 20 31 2e 20 20 49 66 0a 2a 2a  eturns 1.  If.**
7860: 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20   no database is 
7870: 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 69 73  found, then this
7880: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20   routine return 
7890: 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  0..**.** This ro
78a0: 75 74 69 6e 65 20 61 6c 77 61 79 73 20 6f 70 65  utine always ope
78b0: 6e 73 20 74 68 65 20 75 73 65 72 20 64 61 74 61  ns the user data
78c0: 62 61 73 65 20 72 65 67 61 72 64 6c 65 73 73 20  base regardless 
78d0: 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a 2a 2a  of whether or.**
78e0: 20 6e 6f 74 20 74 68 65 20 72 65 70 6f 73 69 74   not the reposit
78f0: 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
7900: 66 6f 75 6e 64 2e 20 20 49 66 20 74 68 65 20 5f  found.  If the _
7910: 46 4f 53 53 49 4c 5f 20 6f 72 20 2e 66 73 6c 63  FOSSIL_ or .fslc
7920: 6b 6f 75 74 20 66 69 6c 65 0a 2a 2a 20 69 73 20  kout file.** is 
7930: 66 6f 75 6e 64 2c 20 69 74 20 69 73 20 61 74 74  found, it is att
7940: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 70 65  ached to the ope
7950: 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  n database conne
7960: 63 74 69 6f 6e 20 74 6f 6f 2e 0a 2a 2f 0a 69 6e  ction too..*/.in
7970: 74 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28  t db_open_local(
7980: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
7990: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  ame){.  int i, n
79a0: 3b 0a 20 20 63 68 61 72 20 7a 50 77 64 5b 32 30  ;.  char zPwd[20
79b0: 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  00];.  static co
79c0: 6e 73 74 20 63 68 61 72 20 2a 28 61 44 62 4e 61  nst char *(aDbNa
79d0: 6d 65 5b 5d 29 20 3d 20 7b 20 22 5f 46 4f 53 53  me[]) = { "_FOSS
79e0: 49 4c 5f 22 2c 20 22 2e 66 73 6c 63 6b 6f 75 74  IL_", ".fslckout
79f0: 22 2c 20 22 2e 66 6f 73 22 20 7d 3b 0a 0a 20 20  ", ".fos" };..  
7a00: 69 66 28 20 67 2e 6c 6f 63 61 6c 4f 70 65 6e 20  if( g.localOpen 
7a10: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 69  ) return 1;.  fi
7a20: 6c 65 5f 67 65 74 63 77 64 28 7a 50 77 64 2c 20  le_getcwd(zPwd, 
7a30: 73 69 7a 65 6f 66 28 7a 50 77 64 29 2d 32 30 29  sizeof(zPwd)-20)
7a40: 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  ;.  n = strlen(z
7a50: 50 77 64 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  Pwd);.  while( n
7a60: 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  >0 ){.    for(i=
7a70: 30 3b 20 69 3c 63 6f 75 6e 74 28 61 44 62 4e 61  0; i<count(aDbNa
7a80: 6d 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  me); i++){.     
7a90: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7aa0: 66 28 73 69 7a 65 6f 66 28 7a 50 77 64 29 2d 6e  f(sizeof(zPwd)-n
7ab0: 2c 20 26 7a 50 77 64 5b 6e 5d 2c 20 22 2f 25 73  , &zPwd[n], "/%s
7ac0: 22 2c 20 61 44 62 4e 61 6d 65 5b 69 5d 29 3b 0a  ", aDbName[i]);.
7ad0: 20 20 20 20 20 20 69 66 28 20 69 73 56 61 6c 69        if( isVali
7ae0: 64 4c 6f 63 61 6c 44 62 28 7a 50 77 64 29 20 29  dLocalDb(zPwd) )
7af0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 75  {.        /* Fou
7b00: 6e 64 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b  nd a valid check
7b10: 6f 75 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  out database fil
7b20: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 2e 7a  e */.        g.z
7b30: 4c 6f 63 61 6c 44 62 4e 61 6d 65 20 3d 20 6d 70  LocalDbName = mp
7b40: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 50 77 64  rintf("%s", zPwd
7b50: 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 77 64 5b  );.        zPwd[
7b60: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  n] = 0;.        
7b70: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 50  while( n>0 && zP
7b80: 77 64 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 0a  wd[n-1]=='/' ){.
7b90: 20 20 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20            n--;. 
7ba0: 20 20 20 20 20 20 20 20 20 7a 50 77 64 5b 6e 5d           zPwd[n]
7bb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
7bc0: 20 20 20 20 20 20 20 20 67 2e 7a 4c 6f 63 61 6c          g.zLocal
7bd0: 52 6f 6f 74 20 3d 20 6d 70 72 69 6e 74 66 28 22  Root = mprintf("
7be0: 25 73 2f 22 2c 20 7a 50 77 64 29 3b 0a 20 20 20  %s/", zPwd);.   
7bf0: 20 20 20 20 20 67 2e 6c 6f 63 61 6c 4f 70 65 6e       g.localOpen
7c00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 64 62   = 1;.        db
7c10: 5f 6f 70 65 6e 5f 63 6f 6e 66 69 67 28 30 29 3b  _open_config(0);
7c20: 0a 20 20 20 20 20 20 20 20 64 62 5f 6f 70 65 6e  .        db_open
7c30: 5f 72 65 70 6f 73 69 74 6f 72 79 28 7a 44 62 4e  _repository(zDbN
7c40: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ame);.        re
7c50: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
7c60: 20 20 20 20 7d 0a 20 20 20 20 6e 2d 2d 3b 0a 20      }.    n--;. 
7c70: 20 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26     while( n>1 &&
7c80: 20 7a 50 77 64 5b 6e 5d 21 3d 27 2f 27 20 29 7b   zPwd[n]!='/' ){
7c90: 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20 77 68 69 6c   n--; }.    whil
7ca0: 65 28 20 6e 3e 31 20 26 26 20 7a 50 77 64 5b 6e  e( n>1 && zPwd[n
7cb0: 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b  -1]=='/' ){ n--;
7cc0: 20 7d 0a 20 20 20 20 7a 50 77 64 5b 6e 5d 20 3d   }.    zPwd[n] =
7cd0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 20   0;.  }..  /* A 
7ce0: 63 68 65 63 6b 6f 75 74 20 64 61 74 61 62 61 73  checkout databas
7cf0: 65 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  e file could not
7d00: 20 62 65 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 72   be found */.  r
7d10: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
7d20: 2a 20 47 65 74 20 74 68 65 20 66 75 6c 6c 20 70  * Get the full p
7d30: 61 74 68 6e 61 6d 65 20 74 6f 20 74 68 65 20 72  athname to the r
7d40: 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61 62 61  epository databa
7d50: 73 65 20 66 69 6c 65 2e 20 20 54 68 65 0a 2a 2a  se file.  The.**
7d60: 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20   local database 
7d70: 28 74 68 65 20 5f 46 4f 53 53 49 4c 5f 20 6f 72  (the _FOSSIL_ or
7d80: 20 2e 66 73 6c 63 6b 6f 75 74 20 64 61 74 61 62   .fslckout datab
7d90: 61 73 65 29 20 6d 75 73 74 20 68 61 76 65 20 61  ase) must have a
7da0: 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f  lready.** been o
7db0: 70 65 6e 65 64 20 62 65 66 6f 72 65 20 74 68 69  pened before thi
7dc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7dd0: 6c 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  led..*/.const ch
7de0: 61 72 20 2a 64 62 5f 72 65 70 6f 73 69 74 6f 72  ar *db_repositor
7df0: 79 5f 66 69 6c 65 6e 61 6d 65 28 76 6f 69 64 29  y_filename(void)
7e00: 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
7e10: 2a 7a 52 65 70 6f 20 3d 20 30 3b 0a 20 20 61 73  *zRepo = 0;.  as
7e20: 73 65 72 74 28 20 67 2e 6c 6f 63 61 6c 4f 70 65  sert( g.localOpe
7e30: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67  n );.  assert( g
7e40: 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 20 29 3b 0a 20  .zLocalRoot );. 
7e50: 20 69 66 28 20 7a 52 65 70 6f 3d 3d 30 20 29 7b   if( zRepo==0 ){
7e60: 0a 20 20 20 20 7a 52 65 70 6f 20 3d 20 64 62 5f  .    zRepo = db_
7e70: 6c 67 65 74 28 22 72 65 70 6f 73 69 74 6f 72 79  lget("repository
7e80: 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a  ", 0);.    if( z
7e90: 52 65 70 6f 20 26 26 20 21 66 69 6c 65 5f 69 73  Repo && !file_is
7ea0: 5f 61 62 73 6f 6c 75 74 65 5f 70 61 74 68 28 7a  _absolute_path(z
7eb0: 52 65 70 6f 29 20 29 7b 0a 20 20 20 20 20 20 7a  Repo) ){.      z
7ec0: 52 65 70 6f 20 3d 20 6d 70 72 69 6e 74 66 28 22  Repo = mprintf("
7ed0: 25 73 25 73 22 2c 20 67 2e 7a 4c 6f 63 61 6c 52  %s%s", g.zLocalR
7ee0: 6f 6f 74 2c 20 7a 52 65 70 6f 29 3b 0a 20 20 20  oot, zRepo);.   
7ef0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7f00: 7a 52 65 70 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zRepo;.}../*.** 
7f10: 4f 70 65 6e 20 74 68 65 20 72 65 70 6f 73 69 74  Open the reposit
7f20: 6f 72 79 20 64 61 74 61 62 61 73 65 20 67 69 76  ory database giv
7f30: 65 6e 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20  en by zDbName.  
7f40: 49 66 20 7a 44 62 4e 61 6d 65 3d 3d 4e 55 4c 4c  If zDbName==NULL
7f50: 20 74 68 65 6e 0a 2a 2a 20 67 65 74 20 74 68 65   then.** get the
7f60: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 61   name from the a
7f70: 6c 72 65 61 64 79 20 6f 70 65 6e 20 6c 6f 63 61  lready open loca
7f80: 6c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76  l database..*/.v
7f90: 6f 69 64 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f  oid db_open_repo
7fa0: 73 69 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  sitory(const cha
7fb0: 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69  r *zDbName){.  i
7fc0: 66 28 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f  f( g.repositoryO
7fd0: 70 65 6e 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pen ) return;.  
7fe0: 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29  if( zDbName==0 )
7ff0: 7b 0a 20 20 20 20 69 66 28 20 67 2e 6c 6f 63 61  {.    if( g.loca
8000: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 7a  lOpen ){.      z
8010: 44 62 4e 61 6d 65 20 3d 20 64 62 5f 72 65 70 6f  DbName = db_repo
8020: 73 69 74 6f 72 79 5f 66 69 6c 65 6e 61 6d 65 28  sitory_filename(
8030: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
8040: 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20   zDbName==0 ){. 
8050: 20 20 20 20 20 64 62 5f 65 72 72 28 22 75 6e 61       db_err("una
8060: 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
8070: 6e 61 6d 65 20 6f 66 20 61 20 72 65 70 6f 73 69  name of a reposi
8080: 74 6f 72 79 20 64 61 74 61 62 61 73 65 22 29 3b  tory database");
8090: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
80a0: 20 66 69 6c 65 5f 61 63 63 65 73 73 28 7a 44 62   file_access(zDb
80b0: 4e 61 6d 65 2c 20 52 5f 4f 4b 29 20 7c 7c 20 66  Name, R_OK) || f
80c0: 69 6c 65 5f 73 69 7a 65 28 7a 44 62 4e 61 6d 65  ile_size(zDbName
80d0: 29 3c 31 30 32 34 20 29 7b 0a 20 20 20 20 69 66  )<1024 ){.    if
80e0: 28 20 66 69 6c 65 5f 61 63 63 65 73 73 28 7a 44  ( file_access(zD
80f0: 62 4e 61 6d 65 2c 20 46 5f 4f 4b 29 20 29 7b 0a  bName, F_OK) ){.
8100: 23 69 66 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e  #ifdef FOSSIL_EN
8110: 41 42 4c 45 5f 4a 53 4f 4e 0a 20 20 20 20 20 20  ABLE_JSON.      
8120: 67 2e 6a 73 6f 6e 2e 72 65 73 75 6c 74 43 6f 64  g.json.resultCod
8130: 65 20 3d 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 44  e = FSL_JSON_E_D
8140: 42 5f 4e 4f 54 5f 46 4f 55 4e 44 3b 0a 23 65 6e  B_NOT_FOUND;.#en
8150: 64 69 66 0a 20 20 20 20 20 20 66 6f 73 73 69 6c  dif.      fossil
8160: 5f 70 61 6e 69 63 28 22 72 65 70 6f 73 69 74 6f  _panic("reposito
8170: 72 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  ry does not exis
8180: 74 20 6f 72 22 0a 20 20 20 20 20 20 20 20 20 20  t or".          
8190: 20 20 20 20 20 20 20 20 20 22 20 69 73 20 69 6e           " is in
81a0: 20 61 6e 20 75 6e 72 65 61 64 61 62 6c 65 20 64   an unreadable d
81b0: 69 72 65 63 74 6f 72 79 3a 20 25 73 22 2c 20 7a  irectory: %s", z
81c0: 44 62 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  DbName);.    }el
81d0: 73 65 20 69 66 28 20 66 69 6c 65 5f 61 63 63 65  se if( file_acce
81e0: 73 73 28 7a 44 62 4e 61 6d 65 2c 20 52 5f 4f 4b  ss(zDbName, R_OK
81f0: 29 20 29 7b 0a 23 69 66 64 65 66 20 46 4f 53 53  ) ){.#ifdef FOSS
8200: 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 0a 20  IL_ENABLE_JSON. 
8210: 20 20 20 20 20 67 2e 6a 73 6f 6e 2e 72 65 73 75       g.json.resu
8220: 6c 74 43 6f 64 65 20 3d 20 46 53 4c 5f 4a 53 4f  ltCode = FSL_JSO
8230: 4e 5f 45 5f 44 45 4e 49 45 44 3b 0a 23 65 6e 64  N_E_DENIED;.#end
8240: 69 66 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f  if.      fossil_
8250: 70 61 6e 69 63 28 22 72 65 61 64 20 70 65 72 6d  panic("read perm
8260: 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 20 66 6f  ission denied fo
8270: 72 20 72 65 70 6f 73 69 74 6f 72 79 20 25 73 22  r repository %s"
8280: 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 20 20  , zDbName);.    
8290: 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 46 4f  }else{.#ifdef FO
82a0: 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e  SSIL_ENABLE_JSON
82b0: 0a 20 20 20 20 20 20 67 2e 6a 73 6f 6e 2e 72 65  .      g.json.re
82c0: 73 75 6c 74 43 6f 64 65 20 3d 20 46 53 4c 5f 4a  sultCode = FSL_J
82d0: 53 4f 4e 5f 45 5f 44 42 5f 4e 4f 54 5f 56 41 4c  SON_E_DB_NOT_VAL
82e0: 49 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ID;.#endif.     
82f0: 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 6e   fossil_panic("n
8300: 6f 74 20 61 20 76 61 6c 69 64 20 72 65 70 6f 73  ot a valid repos
8310: 69 74 6f 72 79 3a 20 25 73 22 2c 20 7a 44 62 4e  itory: %s", zDbN
8320: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
8330: 20 20 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79 4e    g.zRepositoryN
8340: 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 25  ame = mprintf("%
8350: 73 22 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  s", zDbName);.  
8360: 64 62 5f 6f 70 65 6e 5f 6f 72 5f 61 74 74 61 63  db_open_or_attac
8370: 68 28 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79 4e  h(g.zRepositoryN
8380: 61 6d 65 2c 20 22 72 65 70 6f 73 69 74 6f 72 79  ame, "repository
8390: 22 2c 20 30 29 3b 0a 20 20 67 2e 72 65 70 6f 73  ", 0);.  g.repos
83a0: 69 74 6f 72 79 4f 70 65 6e 20 3d 20 31 3b 0a 20  itoryOpen = 1;. 
83b0: 20 2f 2a 20 43 61 63 68 65 20 22 61 6c 6c 6f 77   /* Cache "allow
83c0: 2d 73 79 6d 6c 69 6e 6b 73 22 20 6f 70 74 69 6f  -symlinks" optio
83d0: 6e 2c 20 62 65 63 61 75 73 65 20 77 65 27 6c 6c  n, because we'll
83e0: 20 6e 65 65 64 20 69 74 20 6f 6e 20 65 76 65 72   need it on ever
83f0: 79 20 73 74 61 74 20 63 61 6c 6c 20 2a 2f 0a 20  y stat call */. 
8400: 20 67 2e 61 6c 6c 6f 77 53 79 6d 6c 69 6e 6b 73   g.allowSymlinks
8410: 20 3d 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61   = db_get_boolea
8420: 6e 28 22 61 6c 6c 6f 77 2d 73 79 6d 6c 69 6e 6b  n("allow-symlink
8430: 73 22 2c 20 30 29 3b 0a 20 20 67 2e 7a 41 75 78  s", 0);.  g.zAux
8440: 53 63 68 65 6d 61 20 3d 20 64 62 5f 67 65 74 28  Schema = db_get(
8450: 22 61 75 78 2d 73 63 68 65 6d 61 22 2c 22 22 29  "aux-schema","")
8460: 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  ;..  /* Verify t
8470: 68 61 74 20 74 68 65 20 50 4c 49 4e 4b 20 74 61  hat the PLINK ta
8480: 62 6c 65 20 68 61 73 20 61 20 6e 65 77 20 63 6f  ble has a new co
8490: 6c 75 6d 6e 20 61 64 64 65 64 20 62 79 20 74 68  lumn added by th
84a0: 65 0a 20 20 2a 2a 20 32 30 31 34 2d 31 31 2d 32  e.  ** 2014-11-2
84b0: 38 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2e  8 schema change.
84c0: 20 20 43 72 65 61 74 65 20 69 74 20 69 66 20 6e    Create it if n
84d0: 65 63 65 73 73 61 72 79 2e 20 20 54 68 69 73 20  ecessary.  This 
84e0: 63 6f 64 65 0a 20 20 2a 2a 20 63 61 6e 20 62 65  code.  ** can be
84f0: 20 72 65 6d 6f 76 65 64 20 69 6e 20 74 68 65 20   removed in the 
8500: 66 75 74 75 72 65 2c 20 6f 6e 63 65 20 61 6c 6c  future, once all
8510: 20 75 73 65 72 73 20 68 61 76 65 20 75 70 67 72   users have upgr
8520: 61 64 65 64 20 74 6f 20 74 68 65 0a 20 20 2a 2a  aded to the.  **
8530: 20 32 30 31 34 2d 31 31 2d 32 38 20 6f 72 20 6c   2014-11-28 or l
8540: 61 74 65 72 20 73 63 68 65 6d 61 2e 0a 20 20 2a  ater schema..  *
8550: 2f 0a 20 20 69 66 28 20 21 64 62 5f 74 61 62 6c  /.  if( !db_tabl
8560: 65 5f 68 61 73 5f 63 6f 6c 75 6d 6e 28 22 72 65  e_has_column("re
8570: 70 6f 73 69 74 6f 72 79 22 2c 22 70 6c 69 6e 6b  pository","plink
8580: 22 2c 22 62 61 73 65 69 64 22 29 20 29 7b 0a 20  ","baseid") ){. 
8590: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
85a0: 28 0a 20 20 20 20 20 20 22 41 4c 54 45 52 20 54  (.      "ALTER T
85b0: 41 42 4c 45 20 25 73 2e 70 6c 69 6e 6b 20 41 44  ABLE %s.plink AD
85c0: 44 20 43 4f 4c 55 4d 4e 20 62 61 73 65 69 64 3b  D COLUMN baseid;
85d0: 22 2c 20 64 62 5f 6e 61 6d 65 28 22 72 65 70 6f  ", db_name("repo
85e0: 73 69 74 6f 72 79 22 29 0a 20 20 20 20 29 3b 0a  sitory").    );.
85f0: 20 20 7d 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79    }..  /* Verify
8600: 20 74 68 61 74 20 74 68 65 20 4d 4c 49 4e 4b 20   that the MLINK 
8610: 74 61 62 6c 65 20 68 61 73 20 74 68 65 20 6e 65  table has the ne
8620: 77 65 72 20 63 6f 6c 75 6d 6e 73 20 61 64 64 65  wer columns adde
8630: 64 20 62 79 20 74 68 65 0a 20 20 2a 2a 20 32 30  d by the.  ** 20
8640: 31 35 2d 30 31 2d 32 34 20 73 63 68 65 6d 61 20  15-01-24 schema 
8650: 63 68 61 6e 67 65 2e 20 20 43 72 65 61 74 65 20  change.  Create 
8660: 74 68 65 6d 20 69 66 20 6e 65 63 65 73 73 61 72  them if necessar
8670: 79 2e 20 20 54 68 69 73 20 63 6f 64 65 0a 20 20  y.  This code.  
8680: 2a 2a 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  ** can be remove
8690: 64 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  d in the future,
86a0: 20 6f 6e 63 65 20 61 6c 6c 20 75 73 65 72 73 20   once all users 
86b0: 68 61 76 65 20 75 70 67 72 61 64 65 64 20 74 6f  have upgraded to
86c0: 20 74 68 65 0a 20 20 2a 2a 20 32 30 31 35 2d 30   the.  ** 2015-0
86d0: 31 2d 32 34 20 6f 72 20 6c 61 74 65 72 20 73 63  1-24 or later sc
86e0: 68 65 6d 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  hema..  */.  if(
86f0: 20 21 64 62 5f 74 61 62 6c 65 5f 68 61 73 5f 63   !db_table_has_c
8700: 6f 6c 75 6d 6e 28 22 72 65 70 6f 73 69 74 6f 72  olumn("repositor
8710: 79 22 2c 22 6d 6c 69 6e 6b 22 2c 22 69 73 61 75  y","mlink","isau
8720: 78 22 29 20 29 7b 0a 20 20 20 20 64 62 5f 62 65  x") ){.    db_be
8730: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
8740: 29 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  );.    db_multi_
8750: 65 78 65 63 28 0a 20 20 20 20 20 20 22 41 4c 54  exec(.      "ALT
8760: 45 52 20 54 41 42 4c 45 20 25 73 2e 6d 6c 69 6e  ER TABLE %s.mlin
8770: 6b 20 41 44 44 20 43 4f 4c 55 4d 4e 20 70 6d 69  k ADD COLUMN pmi
8780: 64 20 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c  d INTEGER DEFAUL
8790: 54 20 30 3b 22 0a 20 20 20 20 20 20 22 41 4c 54  T 0;".      "ALT
87a0: 45 52 20 54 41 42 4c 45 20 25 73 2e 6d 6c 69 6e  ER TABLE %s.mlin
87b0: 6b 20 41 44 44 20 43 4f 4c 55 4d 4e 20 69 73 61  k ADD COLUMN isa
87c0: 75 78 20 42 4f 4f 4c 45 41 4e 20 44 45 46 41 55  ux BOOLEAN DEFAU
87d0: 4c 54 20 30 3b 22 2c 0a 20 20 20 20 20 20 64 62  LT 0;",.      db
87e0: 5f 6e 61 6d 65 28 22 72 65 70 6f 73 69 74 6f 72  _name("repositor
87f0: 79 22 29 2c 20 64 62 5f 6e 61 6d 65 28 22 72 65  y"), db_name("re
8800: 70 6f 73 69 74 6f 72 79 22 29 0a 20 20 20 20 29  pository").    )
8810: 3b 0a 20 20 20 20 64 62 5f 65 6e 64 5f 74 72 61  ;.    db_end_tra
8820: 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20 7d  nsaction(0);.  }
8830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 61 67 73 20  .}../*.** Flags 
8840: 66 6f 72 20 74 68 65 20 64 62 5f 66 69 6e 64 5f  for the db_find_
8850: 61 6e 64 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74  and_open_reposit
8860: 6f 72 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ory() function..
8870: 2a 2f 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45  */.#if INTERFACE
8880: 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f 4f 4b  .#define OPEN_OK
8890: 5f 4e 4f 54 5f 46 4f 55 4e 44 20 20 20 20 30 78  _NOT_FOUND    0x
88a0: 30 30 31 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  001      /* Do n
88b0: 6f 74 20 65 72 72 6f 72 20 6f 75 74 20 69 66 20  ot error out if 
88c0: 6e 6f 74 20 66 6f 75 6e 64 20 2a 2f 0a 23 64 65  not found */.#de
88d0: 66 69 6e 65 20 4f 50 45 4e 5f 41 4e 59 5f 53 43  fine OPEN_ANY_SC
88e0: 48 45 4d 41 20 20 20 20 20 20 30 78 30 30 32 20  HEMA      0x002 
88f0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 65       /* Do not e
8900: 72 72 6f 72 20 69 66 20 73 63 68 65 6d 61 20 69  rror if schema i
8910: 73 20 77 72 6f 6e 67 20 2a 2f 0a 23 65 6e 64 69  s wrong */.#endi
8920: 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  f../*.** Try to 
8930: 66 69 6e 64 20 74 68 65 20 72 65 70 6f 73 69 74  find the reposit
8940: 6f 72 79 20 61 6e 64 20 6f 70 65 6e 20 69 74 2e  ory and open it.
8950: 20 20 55 73 65 20 74 68 65 20 2d 52 20 6f 72 20    Use the -R or 
8960: 2d 2d 72 65 70 6f 73 69 74 6f 72 79 0a 2a 2a 20  --repository.** 
8970: 6f 70 74 69 6f 6e 20 74 6f 20 6c 6f 63 61 74 65  option to locate
8980: 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 2e   the repository.
8990: 20 20 49 66 20 6e 6f 20 73 75 63 68 20 6f 70 74    If no such opt
89a0: 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
89b0: 2c 20 74 68 65 6e 0a 2a 2a 20 75 73 65 20 74 68  , then.** use th
89c0: 65 20 72 65 70 6f 73 69 74 6f 72 79 20 6f 66 20  e repository of 
89d0: 74 68 65 20 6f 70 65 6e 20 63 68 65 63 6b 6f 75  the open checkou
89e0: 74 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  t if there is on
89f0: 65 2e 0a 2a 2a 0a 2a 2a 20 45 72 72 6f 72 20 6f  e..**.** Error o
8a00: 75 74 20 69 66 20 74 68 65 20 72 65 70 6f 73 69  ut if the reposi
8a10: 74 6f 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 6f  tory cannot be o
8a20: 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 64  pened..*/.void d
8a30: 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f  b_find_and_open_
8a40: 72 65 70 6f 73 69 74 6f 72 79 28 69 6e 74 20 62  repository(int b
8a50: 46 6c 61 67 73 2c 20 69 6e 74 20 6e 41 72 67 55  Flags, int nArgU
8a60: 73 65 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  sed){.  const ch
8a70: 61 72 20 2a 7a 52 65 70 20 3d 20 66 69 6e 64 5f  ar *zRep = find_
8a80: 72 65 70 6f 73 69 74 6f 72 79 5f 6f 70 74 69 6f  repository_optio
8a90: 6e 28 29 3b 0a 20 20 69 66 28 20 7a 52 65 70 20  n();.  if( zRep 
8aa0: 26 26 20 66 69 6c 65 5f 69 73 64 69 72 28 7a 52  && file_isdir(zR
8ab0: 65 70 29 3d 3d 31 20 29 7b 0a 20 20 20 20 67 6f  ep)==1 ){.    go
8ac0: 74 6f 20 72 65 70 5f 6e 6f 74 5f 66 6f 75 6e 64  to rep_not_found
8ad0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 52 65 70  ;.  }.  if( zRep
8ae0: 3d 3d 30 20 26 26 20 6e 41 72 67 55 73 65 64 20  ==0 && nArgUsed 
8af0: 26 26 20 67 2e 61 72 67 63 3d 3d 6e 41 72 67 55  && g.argc==nArgU
8b00: 73 65 64 2b 31 20 29 7b 0a 20 20 20 20 7a 52 65  sed+1 ){.    zRe
8b10: 70 20 3d 20 67 2e 61 72 67 76 5b 6e 41 72 67 55  p = g.argv[nArgU
8b20: 73 65 64 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  sed];.  }.  if( 
8b30: 7a 52 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69  zRep==0 ){.    i
8b40: 66 28 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c  f( db_open_local
8b50: 28 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  (0)==0 ){.      
8b60: 67 6f 74 6f 20 72 65 70 5f 6e 6f 74 5f 66 6f 75  goto rep_not_fou
8b70: 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52  nd;.    }.    zR
8b80: 65 70 20 3d 20 64 62 5f 72 65 70 6f 73 69 74 6f  ep = db_reposito
8b90: 72 79 5f 66 69 6c 65 6e 61 6d 65 28 29 3b 0a 20  ry_filename();. 
8ba0: 20 20 20 69 66 28 20 7a 52 65 70 3d 3d 30 20 29     if( zRep==0 )
8bb0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 72 65 70  {.      goto rep
8bc0: 5f 6e 6f 74 5f 66 6f 75 6e 64 3b 0a 20 20 20 20  _not_found;.    
8bd0: 7d 0a 20 20 7d 0a 20 20 64 62 5f 6f 70 65 6e 5f  }.  }.  db_open_
8be0: 72 65 70 6f 73 69 74 6f 72 79 28 7a 52 65 70 29  repository(zRep)
8bf0: 3b 0a 20 20 69 66 28 20 67 2e 72 65 70 6f 73 69  ;.  if( g.reposi
8c00: 74 6f 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20 20  toryOpen ){.    
8c10: 69 66 28 20 28 62 46 6c 61 67 73 20 26 20 4f 50  if( (bFlags & OP
8c20: 45 4e 5f 41 4e 59 5f 53 43 48 45 4d 41 29 3d 3d  EN_ANY_SCHEMA)==
8c30: 30 20 29 20 64 62 5f 76 65 72 69 66 79 5f 73 63  0 ) db_verify_sc
8c40: 68 65 6d 61 28 29 3b 0a 20 20 20 20 72 65 74 75  hema();.    retu
8c50: 72 6e 3b 0a 20 20 7d 0a 72 65 70 5f 6e 6f 74 5f  rn;.  }.rep_not_
8c60: 66 6f 75 6e 64 3a 0a 20 20 69 66 28 20 28 62 46  found:.  if( (bF
8c70: 6c 61 67 73 20 26 20 4f 50 45 4e 5f 4f 4b 5f 4e  lags & OPEN_OK_N
8c80: 4f 54 5f 46 4f 55 4e 44 29 3d 3d 30 20 29 7b 0a  OT_FOUND)==0 ){.
8c90: 23 69 66 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e  #ifdef FOSSIL_EN
8ca0: 41 42 4c 45 5f 4a 53 4f 4e 0a 20 20 20 20 67 2e  ABLE_JSON.    g.
8cb0: 6a 73 6f 6e 2e 72 65 73 75 6c 74 43 6f 64 65 20  json.resultCode 
8cc0: 3d 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 44 42 5f  = FSL_JSON_E_DB_
8cd0: 4e 4f 54 5f 46 4f 55 4e 44 3b 0a 23 65 6e 64 69  NOT_FOUND;.#endi
8ce0: 66 0a 20 20 20 20 69 66 28 20 6e 41 72 67 55 73  f.    if( nArgUs
8cf0: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ed==0 ){.      f
8d00: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 75 73 65  ossil_fatal("use
8d10: 20 2d 2d 72 65 70 6f 73 69 74 6f 72 79 20 6f 72   --repository or
8d20: 20 2d 52 20 74 6f 20 73 70 65 63 69 66 79 20 74   -R to specify t
8d30: 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61  he repository da
8d40: 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 7d 65  tabase");.    }e
8d50: 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 73 73 69  lse{.      fossi
8d60: 6c 5f 66 61 74 61 6c 28 22 73 70 65 63 69 66 79  l_fatal("specify
8d70: 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20   the repository 
8d80: 6e 61 6d 65 20 61 73 20 61 20 63 6f 6d 6d 61 6e  name as a comman
8d90: 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 22  d-line argument"
8da0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
8db0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
8dc0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
8dd0: 61 62 61 73 65 20 22 6c 6f 63 61 6c 64 62 22 2c  abase "localdb",
8de0: 20 22 63 6f 6e 66 69 67 64 62 22 2c 20 6f 72 20   "configdb", or 
8df0: 22 72 65 70 6f 73 69 74 6f 72 79 22 2e 0a 2a 2f  "repository"..*/
8e00: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 5f  .const char *db_
8e10: 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
8e20: 2a 7a 44 62 29 7b 0a 20 20 61 73 73 65 72 74 28  *zDb){.  assert(
8e30: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a   fossil_strcmp(z
8e40: 44 62 2c 22 6c 6f 63 61 6c 64 62 22 29 3d 3d 30  Db,"localdb")==0
8e50: 0a 20 20 20 20 20 20 20 7c 7c 20 66 6f 73 73 69  .       || fossi
8e60: 6c 5f 73 74 72 63 6d 70 28 7a 44 62 2c 22 63 6f  l_strcmp(zDb,"co
8e70: 6e 66 69 67 64 62 22 29 3d 3d 30 0a 20 20 20 20  nfigdb")==0.    
8e80: 20 20 20 7c 7c 20 66 6f 73 73 69 6c 5f 73 74 72     || fossil_str
8e90: 63 6d 70 28 7a 44 62 2c 22 72 65 70 6f 73 69 74  cmp(zDb,"reposit
8ea0: 6f 72 79 22 29 3d 3d 30 20 29 3b 0a 20 20 69 66  ory")==0 );.  if
8eb0: 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28  ( fossil_strcmp(
8ec0: 7a 44 62 2c 20 67 2e 7a 4d 61 69 6e 44 62 54 79  zDb, g.zMainDbTy
8ed0: 70 65 29 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22  pe)==0 ) zDb = "
8ee0: 6d 61 69 6e 22 3b 0a 20 20 72 65 74 75 72 6e 20  main";.  return 
8ef0: 7a 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  zDb;.}../*.** Re
8f00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
8f10: 20 73 63 68 65 6d 61 20 69 73 20 6f 75 74 2d 6f   schema is out-o
8f20: 66 2d 64 61 74 65 0a 2a 2f 0a 69 6e 74 20 64 62  f-date.*/.int db
8f30: 5f 73 63 68 65 6d 61 5f 69 73 5f 6f 75 74 6f 66  _schema_is_outof
8f40: 64 61 74 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  date(void){.  re
8f50: 74 75 72 6e 20 73 74 72 63 6d 70 28 67 2e 7a 41  turn strcmp(g.zA
8f60: 75 78 53 63 68 65 6d 61 2c 41 55 58 5f 53 43 48  uxSchema,AUX_SCH
8f70: 45 4d 41 5f 4d 49 4e 29 3c 30 0a 20 20 20 20 20  EMA_MIN)<0.     
8f80: 20 7c 7c 20 73 74 72 63 6d 70 28 67 2e 7a 41 75   || strcmp(g.zAu
8f90: 78 53 63 68 65 6d 61 2c 41 55 58 5f 53 43 48 45  xSchema,AUX_SCHE
8fa0: 4d 41 5f 4d 41 58 29 3e 30 3b 0a 7d 0a 0a 2f 2a  MA_MAX)>0;.}../*
8fb0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
8fc0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
8fd0: 69 73 20 77 72 69 74 65 61 62 6c 65 0a 2a 2f 0a  is writeable.*/.
8fe0: 69 6e 74 20 64 62 5f 69 73 5f 77 72 69 74 65 61  int db_is_writea
8ff0: 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ble(const char *
9000: 7a 4e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e  zName){.  return
9010: 20 67 2e 64 62 21 3d 30 20 26 26 20 21 73 71 6c   g.db!=0 && !sql
9020: 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
9030: 28 67 2e 64 62 2c 20 64 62 5f 6e 61 6d 65 28 7a  (g.db, db_name(z
9040: 4e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Name));.}../*.**
9050: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
9060: 20 72 65 70 6f 73 69 74 6f 72 79 20 73 63 68 65   repository sche
9070: 6d 61 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20  ma is correct.  
9080: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 72  If it is not cor
9090: 72 65 63 74 2c 0a 2a 2a 20 69 73 73 75 65 20 61  rect,.** issue a
90a0: 20 66 61 74 61 6c 20 65 72 72 6f 72 20 61 6e 64   fatal error and
90b0: 20 64 69 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62   die..*/.void db
90c0: 5f 76 65 72 69 66 79 5f 73 63 68 65 6d 61 28 76  _verify_schema(v
90d0: 6f 69 64 29 7b 0a 20 20 69 66 28 20 64 62 5f 73  oid){.  if( db_s
90e0: 63 68 65 6d 61 5f 69 73 5f 6f 75 74 6f 66 64 61  chema_is_outofda
90f0: 74 65 28 29 20 29 7b 0a 23 69 66 64 65 66 20 46  te() ){.#ifdef F
9100: 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f  OSSIL_ENABLE_JSO
9110: 4e 0a 20 20 20 20 67 2e 6a 73 6f 6e 2e 72 65 73  N.    g.json.res
9120: 75 6c 74 43 6f 64 65 20 3d 20 46 53 4c 5f 4a 53  ultCode = FSL_JS
9130: 4f 4e 5f 45 5f 44 42 5f 4e 45 45 44 53 5f 52 45  ON_E_DB_NEEDS_RE
9140: 42 55 49 4c 44 3b 0a 23 65 6e 64 69 66 0a 20 20  BUILD;.#endif.  
9150: 20 20 66 6f 73 73 69 6c 5f 77 61 72 6e 69 6e 67    fossil_warning
9160: 28 22 69 6e 63 6f 72 72 65 63 74 20 72 65 70 6f  ("incorrect repo
9170: 73 69 74 6f 72 79 20 73 63 68 65 6d 61 20 76 65  sitory schema ve
9180: 72 73 69 6f 6e 3a 20 22 0a 20 20 20 20 20 20 20  rsion: ".       
9190: 20 20 20 22 63 75 72 72 65 6e 74 20 72 65 70 6f     "current repo
91a0: 73 69 74 6f 72 79 20 73 63 68 65 6d 61 20 76 65  sitory schema ve
91b0: 72 73 69 6f 6e 20 69 73 20 5c 22 25 73 5c 22 20  rsion is \"%s\" 
91c0: 22 0a 20 20 20 20 20 20 20 20 20 20 22 62 75 74  ".          "but
91d0: 20 6e 65 65 64 20 76 65 72 73 69 6f 6e 73 20 62   need versions b
91e0: 65 74 77 65 65 6e 20 5c 22 25 73 5c 22 20 61 6e  etween \"%s\" an
91f0: 64 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20  d \"%s\".",.    
9200: 20 20 20 20 20 20 67 2e 7a 41 75 78 53 63 68 65        g.zAuxSche
9210: 6d 61 2c 20 41 55 58 5f 53 43 48 45 4d 41 5f 4d  ma, AUX_SCHEMA_M
9220: 49 4e 2c 20 41 55 58 5f 53 43 48 45 4d 41 5f 4d  IN, AUX_SCHEMA_M
9230: 41 58 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  AX);.    fossil_
9240: 66 61 74 61 6c 28 22 72 75 6e 20 5c 22 66 6f 73  fatal("run \"fos
9250: 73 69 6c 20 72 65 62 75 69 6c 64 5c 22 20 74 6f  sil rebuild\" to
9260: 20 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65   fix this proble
9270: 6d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  m");.  }.}.../*.
9280: 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74  ** COMMAND: test
9290: 2d 6d 6f 76 65 2d 72 65 70 6f 73 69 74 6f 72 79  -move-repository
92a0: 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66  .**.** Usage: %f
92b0: 6f 73 73 69 6c 20 74 65 73 74 2d 6d 6f 76 65 2d  ossil test-move-
92c0: 72 65 70 6f 73 69 74 6f 72 79 20 50 41 54 48 4e  repository PATHN
92d0: 41 4d 45 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65  AME.**.** Change
92e0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
92f0: 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20   the repository 
9300: 64 61 74 61 62 61 73 65 20 6f 6e 20 61 20 6c 6f  database on a lo
9310: 63 61 6c 20 63 68 65 63 6b 2d 6f 75 74 2e 0a 2a  cal check-out..*
9320: 2a 20 55 73 65 20 74 68 69 73 20 63 6f 6d 6d 61  * Use this comma
9330: 6e 64 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69  nd to avoid havi
9340: 6e 67 20 74 6f 20 63 6c 6f 73 65 20 61 6e 64 20  ng to close and 
9350: 72 65 6f 70 65 6e 20 61 20 63 68 65 63 6b 6f 75  reopen a checkou
9360: 74 0a 2a 2a 20 77 68 65 6e 20 72 65 6c 6f 63 61  t.** when reloca
9370: 74 69 6e 67 20 74 68 65 20 72 65 70 6f 73 69 74  ting the reposit
9380: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ory database..*/
9390: 0a 76 6f 69 64 20 6d 6f 76 65 5f 72 65 70 6f 5f  .void move_repo_
93a0: 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20 42 6c 6f  cmd(void){.  Blo
93b0: 62 20 72 65 70 6f 3b 0a 20 20 63 68 61 72 20 2a  b repo;.  char *
93c0: 7a 52 65 70 6f 3b 0a 20 20 69 66 28 20 67 2e 61  zRepo;.  if( g.a
93d0: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 75 73  rgc!=3 ){.    us
93e0: 61 67 65 28 22 50 41 54 48 4e 41 4d 45 22 29 3b  age("PATHNAME");
93f0: 0a 20 20 7d 0a 20 20 66 69 6c 65 5f 63 61 6e 6f  .  }.  file_cano
9400: 6e 69 63 61 6c 5f 6e 61 6d 65 28 67 2e 61 72 67  nical_name(g.arg
9410: 76 5b 32 5d 2c 20 26 72 65 70 6f 2c 20 30 29 3b  v[2], &repo, 0);
9420: 0a 20 20 7a 52 65 70 6f 20 3d 20 62 6c 6f 62 5f  .  zRepo = blob_
9430: 73 74 72 28 26 72 65 70 6f 29 3b 0a 20 20 69 66  str(&repo);.  if
9440: 28 20 66 69 6c 65 5f 61 63 63 65 73 73 28 7a 52  ( file_access(zR
9450: 65 70 6f 2c 20 46 5f 4f 4b 29 20 29 7b 0a 20 20  epo, F_OK) ){.  
9460: 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22    fossil_fatal("
9470: 6e 6f 20 73 75 63 68 20 66 69 6c 65 3a 20 25 73  no such file: %s
9480: 22 2c 20 7a 52 65 70 6f 29 3b 0a 20 20 7d 0a 20  ", zRepo);.  }. 
9490: 20 69 66 28 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63   if( db_open_loc
94a0: 61 6c 28 7a 52 65 70 6f 29 3d 3d 30 20 29 7b 0a  al(zRepo)==0 ){.
94b0: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c      fossil_fatal
94c0: 28 22 6e 6f 74 20 69 6e 20 61 20 6c 6f 63 61 6c  ("not in a local
94d0: 20 63 68 65 63 6b 6f 75 74 22 29 3b 0a 20 20 20   checkout");.   
94e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64   return;.  }.  d
94f0: 62 5f 6f 70 65 6e 5f 6f 72 5f 61 74 74 61 63 68  b_open_or_attach
9500: 28 7a 52 65 70 6f 2c 20 22 74 65 73 74 5f 72 65  (zRepo, "test_re
9510: 70 6f 22 2c 20 30 29 3b 0a 20 20 64 62 5f 6c 73  po", 0);.  db_ls
9520: 65 74 28 22 72 65 70 6f 73 69 74 6f 72 79 22 2c  et("repository",
9530: 20 62 6c 6f 62 5f 73 74 72 28 26 72 65 70 6f 29   blob_str(&repo)
9540: 29 3b 0a 20 20 64 62 5f 72 65 63 6f 72 64 5f 72  );.  db_record_r
9550: 65 70 6f 73 69 74 6f 72 79 5f 66 69 6c 65 6e 61  epository_filena
9560: 6d 65 28 62 6c 6f 62 5f 73 74 72 28 26 72 65 70  me(blob_str(&rep
9570: 6f 29 29 3b 0a 20 20 64 62 5f 63 6c 6f 73 65 28  o));.  db_close(
9580: 31 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70  1);.}.../*.** Op
9590: 65 6e 20 74 68 65 20 6c 6f 63 61 6c 20 64 61 74  en the local dat
95a0: 61 62 61 73 65 2e 20 20 49 66 20 75 6e 61 62 6c  abase.  If unabl
95b0: 65 2c 20 65 78 69 74 20 77 69 74 68 20 61 6e 20  e, exit with an 
95c0: 65 72 72 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 64  error..*/.void d
95d0: 62 5f 6d 75 73 74 5f 62 65 5f 77 69 74 68 69 6e  b_must_be_within
95e0: 5f 74 72 65 65 28 76 6f 69 64 29 7b 0a 20 20 69  _tree(void){.  i
95f0: 66 28 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c  f( db_open_local
9600: 28 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f  (0)==0 ){.    fo
9610: 73 73 69 6c 5f 66 61 74 61 6c 28 22 63 75 72 72  ssil_fatal("curr
9620: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 69 73  ent directory is
9630: 20 6e 6f 74 20 77 69 74 68 69 6e 20 61 6e 20 6f   not within an o
9640: 70 65 6e 20 63 68 65 63 6b 6f 75 74 22 29 3b 0a  pen checkout");.
9650: 20 20 7d 0a 20 20 64 62 5f 6f 70 65 6e 5f 72 65    }.  db_open_re
9660: 70 6f 73 69 74 6f 72 79 28 30 29 3b 0a 20 20 64  pository(0);.  d
9670: 62 5f 76 65 72 69 66 79 5f 73 63 68 65 6d 61 28  b_verify_schema(
9680: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
9690: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
96a0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
96b0: 20 43 68 65 63 6b 20 66 6f 72 20 75 6e 66 69 6e   Check for unfin
96c0: 61 6c 69 7a 65 64 20 73 74 61 74 65 6d 65 6e 74  alized statement
96d0: 73 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72 72  s and report err
96e0: 6f 72 73 20 69 66 20 74 68 65 20 72 65 70 6f 72  ors if the repor
96f0: 74 45 72 72 6f 72 73 0a 2a 2a 20 61 72 67 75 6d  tErrors.** argum
9700: 65 6e 74 20 69 73 20 74 72 75 65 2e 20 20 49 67  ent is true.  Ig
9710: 6e 6f 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64  nore unfinalized
9720: 20 73 74 61 74 65 6d 65 6e 74 73 20 77 68 65 6e   statements when
9730: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20   false..*/.void 
9740: 64 62 5f 63 6c 6f 73 65 28 69 6e 74 20 72 65 70  db_close(int rep
9750: 6f 72 74 45 72 72 6f 72 73 29 7b 0a 20 20 73 71  ortErrors){.  sq
9760: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
9770: 74 3b 0a 20 20 69 66 28 20 67 2e 64 62 3d 3d 30  t;.  if( g.db==0
9780: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
9790: 20 67 2e 66 53 71 6c 53 74 61 74 73 20 29 7b 0a   g.fSqlStats ){.
97a0: 20 20 20 20 69 6e 74 20 63 75 72 2c 20 68 69 77      int cur, hiw
97b0: 74 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  tr;.    sqlite3_
97c0: 64 62 5f 73 74 61 74 75 73 28 67 2e 64 62 2c 20  db_status(g.db, 
97d0: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
97e0: 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44 2c 20  LOOKASIDE_USED, 
97f0: 26 63 75 72 2c 20 26 68 69 77 74 72 2c 20 30 29  &cur, &hiwtr, 0)
9800: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  ;.    fprintf(st
9810: 64 65 72 72 2c 20 22 2d 2d 20 4c 4f 4f 4b 41 53  derr, "-- LOOKAS
9820: 49 44 45 5f 55 53 45 44 20 20 20 20 20 20 20 20  IDE_USED        
9830: 20 25 31 30 64 20 25 31 30 64 5c 6e 22 2c 20 63   %10d %10d\n", c
9840: 75 72 2c 20 68 69 77 74 72 29 3b 0a 20 20 20 20  ur, hiwtr);.    
9850: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
9860: 73 28 67 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44  s(g.db, SQLITE_D
9870: 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
9880: 45 5f 48 49 54 2c 20 26 63 75 72 2c 20 26 68 69  E_HIT, &cur, &hi
9890: 77 74 72 2c 20 30 29 3b 0a 20 20 20 20 66 70 72  wtr, 0);.    fpr
98a0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2d 2d  intf(stderr, "--
98b0: 20 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54 20 20   LOOKASIDE_HIT  
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 20 20 25 31 30 64 5c 6e 22 2c 20 68 69 77 74     %10d\n", hiwt
98e0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
98f0: 64 62 5f 73 74 61 74 75 73 28 67 2e 64 62 2c 20  db_status(g.db, 
9900: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
9910: 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 53  LOOKASIDE_MISS_S
9920: 49 5a 45 2c 20 26 63 75 72 2c 26 68 69 77 74 72  IZE, &cur,&hiwtr
9930: 2c 30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  ,0);.    fprintf
9940: 28 73 74 64 65 72 72 2c 20 22 2d 2d 20 4c 4f 4f  (stderr, "-- LOO
9950: 4b 41 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45  KASIDE_MISS_SIZE
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
9970: 31 30 64 5c 6e 22 2c 20 68 69 77 74 72 29 3b 0a  10d\n", hiwtr);.
9980: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
9990: 74 61 74 75 73 28 67 2e 64 62 2c 20 53 51 4c 49  tatus(g.db, SQLI
99a0: 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
99b0: 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c  ASIDE_MISS_FULL,
99c0: 20 26 63 75 72 2c 26 68 69 77 74 72 2c 30 29 3b   &cur,&hiwtr,0);
99d0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
99e0: 65 72 72 2c 20 22 2d 2d 20 4c 4f 4f 4b 41 53 49  err, "-- LOOKASI
99f0: 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 20 20 20 20  DE_MISS_FULL    
9a00: 20 20 20 20 20 20 20 20 20 20 20 25 31 30 64 5c             %10d\
9a10: 6e 22 2c 20 68 69 77 74 72 29 3b 0a 20 20 20 20  n", hiwtr);.    
9a20: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
9a30: 73 28 67 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44  s(g.db, SQLITE_D
9a40: 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53  BSTATUS_CACHE_US
9a50: 45 44 2c 20 26 63 75 72 2c 20 26 68 69 77 74 72  ED, &cur, &hiwtr
9a60: 2c 20 30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , 0);.    fprint
9a70: 66 28 73 74 64 65 72 72 2c 20 22 2d 2d 20 43 41  f(stderr, "-- CA
9a80: 43 48 45 5f 55 53 45 44 20 20 20 20 20 20 20 20  CHE_USED        
9a90: 20 20 20 20 20 25 31 30 64 5c 6e 22 2c 20 63 75       %10d\n", cu
9aa0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
9ab0: 64 62 5f 73 74 61 74 75 73 28 67 2e 64 62 2c 20  db_status(g.db, 
9ac0: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
9ad0: 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26 63 75  SCHEMA_USED, &cu
9ae0: 72 2c 20 26 68 69 77 74 72 2c 20 30 29 3b 0a 20  r, &hiwtr, 0);. 
9af0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
9b00: 72 2c 20 22 2d 2d 20 53 43 48 45 4d 41 5f 55 53  r, "-- SCHEMA_US
9b10: 45 44 20 20 20 20 20 20 20 20 20 20 20 20 25 31  ED            %1
9b20: 30 64 5c 6e 22 2c 20 63 75 72 29 3b 0a 20 20 20  0d\n", cur);.   
9b30: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
9b40: 75 73 28 67 2e 64 62 2c 20 53 51 4c 49 54 45 5f  us(g.db, SQLITE_
9b50: 44 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53  DBSTATUS_STMT_US
9b60: 45 44 2c 20 26 63 75 72 2c 20 26 68 69 77 74 72  ED, &cur, &hiwtr
9b70: 2c 20 30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , 0);.    fprint
9b80: 66 28 73 74 64 65 72 72 2c 20 22 2d 2d 20 53 54  f(stderr, "-- ST
9b90: 4d 54 5f 55 53 45 44 20 20 20 20 20 20 20 20 20  MT_USED         
9ba0: 20 20 20 20 20 25 31 30 64 5c 6e 22 2c 20 63 75       %10d\n", cu
9bb0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
9bc0: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
9bd0: 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44  ATUS_MEMORY_USED
9be0: 2c 20 26 63 75 72 2c 20 26 68 69 77 74 72 2c 20  , &cur, &hiwtr, 
9bf0: 30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  0);.    fprintf(
9c00: 73 74 64 65 72 72 2c 20 22 2d 2d 20 4d 45 4d 4f  stderr, "-- MEMO
9c10: 52 59 5f 55 53 45 44 20 20 20 20 20 20 20 20 20  RY_USED         
9c20: 20 20 20 25 31 30 64 20 25 31 30 64 5c 6e 22 2c     %10d %10d\n",
9c30: 20 63 75 72 2c 20 68 69 77 74 72 29 3b 0a 20 20   cur, hiwtr);.  
9c40: 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73    sqlite3_status
9c50: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d  (SQLITE_STATUS_M
9c60: 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 26 63 75 72  ALLOC_SIZE, &cur
9c70: 2c 20 26 68 69 77 74 72 2c 20 30 29 3b 0a 20 20  , &hiwtr, 0);.  
9c80: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
9c90: 2c 20 22 2d 2d 20 4d 41 4c 4c 4f 43 5f 53 49 5a  , "-- MALLOC_SIZ
9ca0: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
9cb0: 20 20 20 20 20 20 20 20 25 31 30 64 5c 6e 22 2c          %10d\n",
9cc0: 20 68 69 77 74 72 29 3b 0a 20 20 20 20 73 71 6c   hiwtr);.    sql
9cd0: 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49  ite3_status(SQLI
9ce0: 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43  TE_STATUS_MALLOC
9cf0: 5f 43 4f 55 4e 54 2c 20 26 63 75 72 2c 20 26 68  _COUNT, &cur, &h
9d00: 69 77 74 72 2c 20 30 29 3b 0a 20 20 20 20 66 70  iwtr, 0);.    fp
9d10: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2d  rintf(stderr, "-
9d20: 2d 20 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 20 20  - MALLOC_COUNT  
9d30: 20 20 20 20 20 20 20 20 20 25 31 30 64 20 25 31           %10d %1
9d40: 30 64 5c 6e 22 2c 20 63 75 72 2c 20 68 69 77 74  0d\n", cur, hiwt
9d50: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
9d60: 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54  status(SQLITE_ST
9d70: 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f  ATUS_PAGECACHE_O
9d80: 56 45 52 46 4c 4f 57 2c 20 26 63 75 72 2c 20 26  VERFLOW, &cur, &
9d90: 68 69 77 74 72 2c 20 30 29 3b 0a 20 20 20 20 66  hiwtr, 0);.    f
9da0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
9db0: 2d 2d 20 50 43 41 43 48 45 5f 4f 56 46 4c 4f 57  -- PCACHE_OVFLOW
9dc0: 20 20 20 20 20 20 20 20 20 20 25 31 30 64 20 25            %10d %
9dd0: 31 30 64 5c 6e 22 2c 20 63 75 72 2c 20 68 69 77  10d\n", cur, hiw
9de0: 74 72 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  tr);.    fprintf
9df0: 28 73 74 64 65 72 72 2c 20 22 2d 2d 20 70 72 65  (stderr, "-- pre
9e00: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
9e10: 20 20 20 20 25 31 30 64 5c 6e 22 2c 20 64 62 2e      %10d\n", db.
9e20: 6e 50 72 65 70 61 72 65 29 3b 0a 20 20 7d 0a 20  nPrepare);.  }. 
9e30: 20 77 68 69 6c 65 28 20 64 62 2e 70 41 6c 6c 53   while( db.pAllS
9e40: 74 6d 74 20 29 7b 0a 20 20 20 20 64 62 5f 66 69  tmt ){.    db_fi
9e50: 6e 61 6c 69 7a 65 28 64 62 2e 70 41 6c 6c 53 74  nalize(db.pAllSt
9e60: 6d 74 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 65 6e  mt);.  }.  db_en
9e70: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 31 29  d_transaction(1)
9e80: 3b 0a 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20  ;.  pStmt = 0;. 
9e90: 20 64 62 5f 63 6c 6f 73 65 5f 63 6f 6e 66 69 67   db_close_config
9ea0: 28 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ();..  /* If the
9eb0: 20 6c 6f 63 61 6c 64 62 20 28 74 68 65 20 63 68   localdb (the ch
9ec0: 65 63 6b 2d 6f 75 74 20 64 61 74 61 62 61 73 65  eck-out database
9ed0: 29 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 69 66  ) is open and if
9ee0: 20 69 74 20 68 61 73 0a 20 20 2a 2a 20 61 20 6c   it has.  ** a l
9ef0: 6f 74 20 6f 66 20 75 6e 75 73 65 64 20 66 72 65  ot of unused fre
9f00: 65 20 73 70 61 63 65 2c 20 74 68 65 6e 20 56 41  e space, then VA
9f10: 43 55 55 4d 20 69 74 20 61 73 20 77 65 20 73 68  CUUM it as we sh
9f20: 75 74 20 64 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  ut down..  */.  
9f30: 69 66 28 20 67 2e 6c 6f 63 61 6c 4f 70 65 6e 20  if( g.localOpen 
9f40: 26 26 20 73 74 72 63 6d 70 28 64 62 5f 6e 61 6d  && strcmp(db_nam
9f50: 65 28 22 6c 6f 63 61 6c 64 62 22 29 2c 22 6d 61  e("localdb"),"ma
9f60: 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  in")==0 ){.    i
9f70: 6e 74 20 6e 46 72 65 65 20 3d 20 64 62 5f 69 6e  nt nFree = db_in
9f80: 74 28 30 2c 20 22 50 52 41 47 4d 41 20 6d 61 69  t(0, "PRAGMA mai
9f90: 6e 2e 66 72 65 65 6c 69 73 74 5f 63 6f 75 6e 74  n.freelist_count
9fa0: 22 29 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 74  ");.    int nTot
9fb0: 61 6c 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22  al = db_int(0, "
9fc0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65  PRAGMA main.page
9fd0: 5f 63 6f 75 6e 74 22 29 3b 0a 20 20 20 20 69 66  _count");.    if
9fe0: 28 20 6e 46 72 65 65 3e 6e 54 6f 74 61 6c 2f 34  ( nFree>nTotal/4
9ff0: 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 6d 75 6c   ){.      db_mul
a000: 74 69 5f 65 78 65 63 28 22 56 41 43 55 55 4d 3b  ti_exec("VACUUM;
a010: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ");.    }.  }.. 
a020: 20 69 66 28 20 67 2e 64 62 20 29 7b 0a 20 20 20   if( g.db ){.   
a030: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73 71 6c   int rc;.    sql
a040: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
a050: 69 6e 74 28 67 2e 64 62 2c 20 30 29 3b 0a 20 20  int(g.db, 0);.  
a060: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
a070: 6c 6f 73 65 28 67 2e 64 62 29 3b 0a 20 20 20 20  lose(g.db);.    
a080: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
a090: 55 53 59 20 26 26 20 72 65 70 6f 72 74 45 72 72  USY && reportErr
a0a0: 6f 72 73 20 29 7b 0a 20 20 20 20 20 20 77 68 69  ors ){.      whi
a0b0: 6c 65 28 20 28 70 53 74 6d 74 20 3d 20 73 71 6c  le( (pStmt = sql
a0c0: 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 28 67  ite3_next_stmt(g
a0d0: 2e 64 62 2c 20 70 53 74 6d 74 29 29 21 3d 30 20  .db, pStmt))!=0 
a0e0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 73 73 69  ){.        fossi
a0f0: 6c 5f 77 61 72 6e 69 6e 67 28 22 75 6e 66 69 6e  l_warning("unfin
a100: 61 6c 69 7a 65 64 20 53 51 4c 20 73 74 61 74 65  alized SQL state
a110: 6d 65 6e 74 3a 20 5b 25 73 5d 22 2c 20 73 71 6c  ment: [%s]", sql
a120: 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 29  ite3_sql(pStmt))
a130: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a140: 20 20 20 20 67 2e 64 62 20 3d 20 30 3b 0a 20 20      g.db = 0;.  
a150: 20 20 67 2e 7a 4d 61 69 6e 44 62 54 79 70 65 20    g.zMainDbType 
a160: 3d 20 30 3b 0a 20 20 7d 0a 20 20 67 2e 72 65 70  = 0;.  }.  g.rep
a170: 6f 73 69 74 6f 72 79 4f 70 65 6e 20 3d 20 30 3b  ositoryOpen = 0;
a180: 0a 20 20 67 2e 6c 6f 63 61 6c 4f 70 65 6e 20 3d  .  g.localOpen =
a190: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 67 2e   0;.  assert( g.
a1a0: 64 62 43 6f 6e 66 69 67 3d 3d 30 20 29 3b 0a 20  dbConfig==0 );. 
a1b0: 20 61 73 73 65 72 74 28 20 67 2e 75 73 65 41 74   assert( g.useAt
a1c0: 74 61 63 68 3d 3d 30 20 29 3b 0a 20 20 61 73 73  tach==0 );.  ass
a1d0: 65 72 74 28 20 67 2e 7a 43 6f 6e 66 69 67 44 62  ert( g.zConfigDb
a1e0: 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Name==0 );.  ass
a1f0: 65 72 74 28 20 67 2e 7a 43 6f 6e 66 69 67 44 62  ert( g.zConfigDb
a200: 54 79 70 65 3d 3d 30 20 29 3b 0a 7d 0a 0a 0a 2f  Type==0 );.}.../
a210: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
a220: 77 20 65 6d 70 74 79 20 72 65 70 6f 73 69 74 6f  w empty reposito
a230: 72 79 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ry database with
a240: 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e   the given name.
a250: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
a260: 73 63 68 65 6d 61 20 69 73 20 69 6e 69 74 69 61  schema is initia
a270: 6c 69 7a 65 64 2e 20 20 54 68 65 20 72 65 71 75  lized.  The requ
a280: 69 72 65 64 20 56 41 52 20 74 61 62 6c 65 73 20  ired VAR tables 
a290: 65 6e 74 72 69 65 73 0a 2a 2a 20 61 72 65 20 6e  entries.** are n
a2a0: 6f 74 20 73 65 74 20 62 79 20 74 68 69 73 20 72  ot set by this r
a2b0: 6f 75 74 69 6e 65 20 61 6e 64 20 6d 75 73 74 20  outine and must 
a2c0: 62 65 20 73 65 74 20 73 65 70 61 72 61 74 65 6c  be set separatel
a2d0: 79 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  y in order.** to
a2e0: 20 6d 61 6b 65 20 74 68 65 20 6e 65 77 20 66 69   make the new fi
a2f0: 6c 65 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  le a valid datab
a300: 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f  ase..*/.void db_
a310: 63 72 65 61 74 65 5f 72 65 70 6f 73 69 74 6f 72  create_repositor
a320: 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  y(const char *zF
a330: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 64 62 5f 69  ilename){.  db_i
a340: 6e 69 74 5f 64 61 74 61 62 61 73 65 28 0a 20 20  nit_database(.  
a350: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20     zFilename,.  
a360: 20 20 20 7a 52 65 70 6f 73 69 74 6f 72 79 53 63     zRepositorySc
a370: 68 65 6d 61 31 2c 0a 20 20 20 20 20 7a 52 65 70  hema1,.     zRep
a380: 6f 73 69 74 6f 72 79 53 63 68 65 6d 61 44 65 66  ositorySchemaDef
a390: 61 75 6c 74 52 65 70 6f 72 74 73 2c 0a 20 20 20  aultReports,.   
a3a0: 20 20 7a 52 65 70 6f 73 69 74 6f 72 79 53 63 68    zRepositorySch
a3b0: 65 6d 61 32 2c 0a 20 20 20 20 20 28 63 68 61 72  ema2,.     (char
a3c0: 2a 29 30 0a 20 20 29 3b 0a 20 20 64 62 5f 64 65  *)0.  );.  db_de
a3d0: 6c 65 74 65 5f 6f 6e 5f 66 61 69 6c 75 72 65 28  lete_on_failure(
a3e0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f  zFilename);.}../
a3f0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
a400: 64 65 66 61 75 6c 74 20 75 73 65 72 20 61 63 63  default user acc
a410: 6f 75 6e 74 73 20 69 6e 20 74 68 65 20 55 53 45  ounts in the USE
a420: 52 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  R table..*/.void
a430: 20 64 62 5f 63 72 65 61 74 65 5f 64 65 66 61 75   db_create_defau
a440: 6c 74 5f 75 73 65 72 73 28 69 6e 74 20 73 65 74  lt_users(int set
a450: 75 70 55 73 65 72 4f 6e 6c 79 2c 20 63 6f 6e 73  upUserOnly, cons
a460: 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74  t char *zDefault
a470: 55 73 65 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63  User){.  const c
a480: 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 7a 44 65  har *zUser = zDe
a490: 66 61 75 6c 74 55 73 65 72 3b 0a 20 20 69 66 28  faultUser;.  if(
a4a0: 20 7a 55 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20   zUser==0 ){.   
a4b0: 20 7a 55 73 65 72 20 3d 20 64 62 5f 67 65 74 28   zUser = db_get(
a4c0: 22 64 65 66 61 75 6c 74 2d 75 73 65 72 22 2c 20  "default-user", 
a4d0: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 55  0);.  }.  if( zU
a4e0: 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 55  ser==0 ){.    zU
a4f0: 73 65 72 20 3d 20 66 6f 73 73 69 6c 5f 67 65 74  ser = fossil_get
a500: 65 6e 76 28 22 46 4f 53 53 49 4c 5f 55 53 45 52  env("FOSSIL_USER
a510: 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 55  ");.  }.  if( zU
a520: 73 65 72 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65  ser==0 ){.#if de
a530: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20  fined(_WIN32).  
a540: 20 20 7a 55 73 65 72 20 3d 20 66 6f 73 73 69 6c    zUser = fossil
a550: 5f 67 65 74 65 6e 76 28 22 55 53 45 52 4e 41 4d  _getenv("USERNAM
a560: 45 22 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a  E");.#else.    z
a570: 55 73 65 72 20 3d 20 66 6f 73 73 69 6c 5f 67 65  User = fossil_ge
a580: 74 65 6e 76 28 22 55 53 45 52 22 29 3b 0a 20 20  tenv("USER");.  
a590: 20 20 69 66 28 20 7a 55 73 65 72 3d 3d 30 20 29    if( zUser==0 )
a5a0: 7b 0a 20 20 20 20 20 20 7a 55 73 65 72 20 3d 20  {.      zUser = 
a5b0: 66 6f 73 73 69 6c 5f 67 65 74 65 6e 76 28 22 4c  fossil_getenv("L
a5c0: 4f 47 4e 41 4d 45 22 29 3b 0a 20 20 20 20 7d 0a  OGNAME");.    }.
a5d0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28  #endif.  }.  if(
a5e0: 20 7a 55 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20   zUser==0 ){.   
a5f0: 20 7a 55 73 65 72 20 3d 20 22 72 6f 6f 74 22 3b   zUser = "root";
a600: 0a 20 20 7d 0a 20 20 64 62 5f 6d 75 6c 74 69 5f  .  }.  db_multi_
a610: 65 78 65 63 28 0a 20 20 20 20 20 22 49 4e 53 45  exec(.     "INSE
a620: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
a630: 4f 20 75 73 65 72 28 6c 6f 67 69 6e 2c 20 69 6e  O user(login, in
a640: 66 6f 29 20 56 41 4c 55 45 53 28 25 51 2c 27 27  fo) VALUES(%Q,''
a650: 29 22 2c 20 7a 55 73 65 72 0a 20 20 29 3b 0a 20  )", zUser.  );. 
a660: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a   db_multi_exec(.
a670: 20 20 20 20 20 22 55 50 44 41 54 45 20 75 73 65       "UPDATE use
a680: 72 20 53 45 54 20 63 61 70 3d 27 73 27 2c 20 70  r SET cap='s', p
a690: 77 3d 6c 6f 77 65 72 28 68 65 78 28 72 61 6e 64  w=lower(hex(rand
a6a0: 6f 6d 62 6c 6f 62 28 33 29 29 29 22 0a 20 20 20  omblob(3)))".   
a6b0: 20 20 22 20 57 48 45 52 45 20 6c 6f 67 69 6e 3d    " WHERE login=
a6c0: 25 51 22 2c 20 7a 55 73 65 72 0a 20 20 29 3b 0a  %Q", zUser.  );.
a6d0: 20 20 69 66 28 20 21 73 65 74 75 70 55 73 65 72    if( !setupUser
a6e0: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 64 62 5f 6d  Only ){.    db_m
a6f0: 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20  ulti_exec(.     
a700: 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e    "INSERT OR IGN
a710: 4f 52 45 20 49 4e 54 4f 20 75 73 65 72 28 6c 6f  ORE INTO user(lo
a720: 67 69 6e 2c 70 77 2c 63 61 70 2c 69 6e 66 6f 29  gin,pw,cap,info)
a730: 22 0a 20 20 20 20 20 20 20 22 20 20 20 56 41 4c  ".       "   VAL
a740: 55 45 53 28 27 61 6e 6f 6e 79 6d 6f 75 73 27 2c  UES('anonymous',
a750: 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 38  hex(randomblob(8
a760: 29 29 2c 27 68 6d 6e 63 27 2c 27 41 6e 6f 6e 27  )),'hmnc','Anon'
a770: 29 3b 22 0a 20 20 20 20 20 20 20 22 49 4e 53 45  );".       "INSE
a780: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
a790: 4f 20 75 73 65 72 28 6c 6f 67 69 6e 2c 70 77 2c  O user(login,pw,
a7a0: 63 61 70 2c 69 6e 66 6f 29 22 0a 20 20 20 20 20  cap,info)".     
a7b0: 20 20 22 20 20 20 56 41 4c 55 45 53 28 27 6e 6f    "   VALUES('no
a7c0: 62 6f 64 79 27 2c 27 27 2c 27 67 6a 6f 72 7a 27  body','','gjorz'
a7d0: 2c 27 4e 6f 62 6f 64 79 27 29 3b 22 0a 20 20 20  ,'Nobody');".   
a7e0: 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
a7f0: 47 4e 4f 52 45 20 49 4e 54 4f 20 75 73 65 72 28  GNORE INTO user(
a800: 6c 6f 67 69 6e 2c 70 77 2c 63 61 70 2c 69 6e 66  login,pw,cap,inf
a810: 6f 29 22 0a 20 20 20 20 20 20 20 22 20 20 20 56  o)".       "   V
a820: 41 4c 55 45 53 28 27 64 65 76 65 6c 6f 70 65 72  ALUES('developer
a830: 27 2c 27 27 2c 27 64 65 69 27 2c 27 44 65 76 27  ','','dei','Dev'
a840: 29 3b 22 0a 20 20 20 20 20 20 20 22 49 4e 53 45  );".       "INSE
a850: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
a860: 4f 20 75 73 65 72 28 6c 6f 67 69 6e 2c 70 77 2c  O user(login,pw,
a870: 63 61 70 2c 69 6e 66 6f 29 22 0a 20 20 20 20 20  cap,info)".     
a880: 20 20 22 20 20 20 56 41 4c 55 45 53 28 27 72 65    "   VALUES('re
a890: 61 64 65 72 27 2c 27 27 2c 27 6b 70 74 77 27 2c  ader','','kptw',
a8a0: 27 52 65 61 64 65 72 27 29 3b 22 0a 20 20 20 20  'Reader');".    
a8b0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a8c0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
a8d0: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61   to a string tha
a8e0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 52  t contains the R
a8f0: 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72  HS of an IN oper
a900: 61 74 6f 72 0a 2a 2a 20 74 68 61 74 20 77 69 6c  ator.** that wil
a910: 6c 20 73 65 6c 65 63 74 20 43 4f 4e 46 49 47 20  l select CONFIG 
a920: 74 61 62 6c 65 20 6e 61 6d 65 73 20 74 68 61 74  table names that
a930: 20 61 72 65 20 69 6e 20 74 68 65 20 6c 69 73 74   are in the list
a940: 20 6f 66 20 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 73   of control.** s
a950: 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a 63 6f 6e 73  ettings..*/.cons
a960: 74 20 63 68 61 72 20 2a 64 62 5f 73 65 74 74 69  t char *db_setti
a970: 6e 67 5f 69 6e 6f 70 5f 72 68 73 28 29 7b 0a 20  ng_inop_rhs(){. 
a980: 20 42 6c 6f 62 20 78 3b 0a 20 20 69 6e 74 20 69   Blob x;.  int i
a990: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
a9a0: 7a 53 65 70 20 3d 20 22 22 3b 0a 0a 20 20 62 6c  zSep = "";..  bl
a9b0: 6f 62 5f 7a 65 72 6f 28 26 78 29 3b 0a 20 20 62  ob_zero(&x);.  b
a9c0: 6c 6f 62 5f 61 70 70 65 6e 64 5f 73 71 6c 28 26  lob_append_sql(&
a9d0: 78 2c 20 22 28 22 29 3b 0a 20 20 66 6f 72 28 69  x, "(");.  for(i
a9e0: 3d 30 3b 20 61 53 65 74 74 69 6e 67 5b 69 5d 2e  =0; aSetting[i].
a9f0: 6e 61 6d 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  name; i++){.    
aa00: 62 6c 6f 62 5f 61 70 70 65 6e 64 5f 73 71 6c 28  blob_append_sql(
aa10: 26 78 2c 20 22 25 73 25 51 22 2c 20 7a 53 65 70  &x, "%s%Q", zSep
aa20: 2f 2a 73 61 66 65 2d 66 6f 72 2d 25 73 2a 2f 2c  /*safe-for-%s*/,
aa30: 20 61 53 65 74 74 69 6e 67 5b 69 5d 2e 6e 61 6d   aSetting[i].nam
aa40: 65 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  e);.    zSep = "
aa50: 2c 22 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 61  ,";.  }.  blob_a
aa60: 70 70 65 6e 64 5f 73 71 6c 28 26 78 2c 20 22 29  ppend_sql(&x, ")
aa70: 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 6c 6f  ");.  return blo
aa80: 62 5f 73 71 6c 5f 74 65 78 74 28 26 78 29 3b 0a  b_sql_text(&x);.
aa90: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 61 6e  }../*.** Fill an
aaa0: 20 65 6d 70 74 79 20 72 65 70 6f 73 69 74 6f 72   empty repositor
aab0: 79 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  y database with 
aac0: 74 68 65 20 62 61 73 69 63 20 69 6e 66 6f 72 6d  the basic inform
aad0: 61 74 69 6f 6e 20 66 6f 72 20 61 0a 2a 2a 20 72  ation for a.** r
aae0: 65 70 6f 73 69 74 6f 72 79 2e 20 54 68 69 73 20  epository. This 
aaf0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 68 61 72  function is shar
ab00: 65 64 20 62 65 74 77 65 65 6e 20 27 63 72 65 61  ed between 'crea
ab10: 74 65 5f 72 65 70 6f 73 69 74 6f 72 79 5f 63 6d  te_repository_cm
ab20: 64 27 0a 2a 2a 20 28 27 6e 65 77 27 29 20 61 6e  d'.** ('new') an
ab30: 64 20 27 72 65 63 6f 6e 73 74 72 75 63 74 5f 63  d 'reconstruct_c
ab40: 6d 64 27 20 28 27 72 65 63 6f 6e 73 74 72 75 63  md' ('reconstruc
ab50: 74 27 29 2c 20 62 6f 74 68 20 6f 66 20 77 68 69  t'), both of whi
ab60: 63 68 20 63 72 65 61 74 65 0a 2a 2a 20 6e 65 77  ch create.** new
ab70: 20 72 65 70 6f 73 69 74 6f 72 69 65 73 2e 0a 2a   repositories..*
ab80: 2a 0a 2a 2a 20 54 68 65 20 7a 54 65 6d 70 6c 61  *.** The zTempla
ab90: 74 65 20 70 61 72 61 6d 65 74 65 72 20 64 65 74  te parameter det
aba0: 65 72 6d 69 6e 65 73 20 69 66 20 74 68 65 20 73  ermines if the s
abb0: 65 74 74 69 6e 67 73 20 66 6f 72 20 74 68 65 20  ettings for the 
abc0: 72 65 70 6f 73 69 74 6f 72 79 0a 2a 2a 20 73 68  repository.** sh
abd0: 6f 75 6c 64 20 62 65 20 63 6f 70 69 65 64 20 66  ould be copied f
abe0: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 72 65 70 6f  rom another repo
abf0: 73 69 74 6f 72 79 2e 20 20 49 66 20 7a 54 65 6d  sitory.  If zTem
ac00: 70 6c 61 74 65 20 69 73 20 30 20 74 68 65 6e 20  plate is 0 then 
ac10: 74 68 65 0a 2a 2a 20 73 65 74 74 69 6e 67 73 20  the.** settings 
ac20: 77 69 6c 6c 20 68 61 76 65 20 74 68 65 69 72 20  will have their 
ac30: 6e 6f 72 6d 61 6c 20 64 65 66 61 75 6c 74 20 76  normal default v
ac40: 61 6c 75 65 73 2e 20 20 49 66 20 7a 54 65 6d 70  alues.  If zTemp
ac50: 6c 61 74 65 20 69 73 0a 2a 2a 20 6e 6f 6e 2d 7a  late is.** non-z
ac60: 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
ac70: 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
ac80: 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  er of this funct
ac90: 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ion has already.
aca0: 2a 2a 20 61 74 74 61 63 68 65 64 20 61 20 64 61  ** attached a da
acb0: 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
acc0: 20 6c 61 62 65 6c 20 22 73 65 74 74 69 6e 67 53   label "settingS
acd0: 72 63 22 2e 20 20 49 66 20 6e 6f 74 2c 20 74 68  rc".  If not, th
ace0: 65 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69  e call to.** thi
acf0: 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
ad00: 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fail..**.** The 
ad10: 7a 49 6e 69 74 69 61 6c 44 61 74 65 20 70 61 72  zInitialDate par
ad20: 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65  ameter determine
ad30: 73 20 74 68 65 20 64 61 74 65 20 6f 66 20 74 68  s the date of th
ad40: 65 20 69 6e 69 74 69 61 6c 20 63 68 65 63 6b 2d  e initial check-
ad50: 69 6e 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75  in.** that is au
ad60: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
ad70: 74 65 64 2e 20 20 49 66 20 7a 49 6e 69 74 69 61  ted.  If zInitia
ad80: 6c 44 61 74 65 20 69 73 20 30 20 74 68 65 6e 20  lDate is 0 then 
ad90: 6e 6f 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 63 68  no initial.** ch
ada0: 65 63 6b 2d 69 6e 20 69 73 20 63 72 65 61 74 65  eck-in is create
adb0: 64 2e 20 54 68 65 20 6d 61 6b 65 53 65 72 76 65  d. The makeServe
adc0: 72 43 6f 64 65 73 20 66 6c 61 67 20 64 65 74 65  rCodes flag dete
add0: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
ade0: 72 0a 2a 2a 20 6e 6f 74 20 73 65 72 76 65 72 20  r.** not server 
adf0: 61 6e 64 20 70 72 6f 6a 65 63 74 20 63 6f 64 65  and project code
ae00: 73 20 61 72 65 20 69 6e 76 65 6e 74 65 64 20 66  s are invented f
ae10: 6f 72 20 74 68 69 73 20 72 65 70 6f 73 69 74 6f  or this reposito
ae20: 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 69  ry..*/.void db_i
ae30: 6e 69 74 69 61 6c 5f 73 65 74 75 70 28 0a 20 20  nitial_setup(.  
ae40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 6d  const char *zTem
ae50: 70 6c 61 74 65 2c 20 20 20 20 20 20 20 2f 2a 20  plate,       /* 
ae60: 52 65 70 6f 73 69 74 6f 72 79 20 66 72 6f 6d 20  Repository from 
ae70: 77 68 69 63 68 20 74 6f 20 63 6f 70 79 20 73 65  which to copy se
ae80: 74 74 69 6e 67 73 2e 20 2a 2f 0a 20 20 63 6f 6e  ttings. */.  con
ae90: 73 74 20 63 68 61 72 20 2a 7a 49 6e 69 74 69 61  st char *zInitia
aea0: 6c 44 61 74 65 2c 20 20 20 20 2f 2a 20 49 6e 69  lDate,    /* Ini
aeb0: 74 69 61 6c 20 64 61 74 65 20 6f 66 20 72 65 70  tial date of rep
aec0: 6f 73 69 74 6f 72 79 2e 20 28 65 78 3a 20 22 6e  ository. (ex: "n
aed0: 6f 77 22 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ow") */.  const 
aee0: 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 55 73  char *zDefaultUs
aef0: 65 72 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c  er     /* Defaul
af00: 74 20 75 73 65 72 20 66 6f 72 20 74 68 65 20 72  t user for the r
af10: 65 70 6f 73 69 74 6f 72 79 20 2a 2f 0a 29 7b 0a  epository */.){.
af20: 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20    char *zDate;. 
af30: 20 42 6c 6f 62 20 68 61 73 68 3b 0a 20 20 42 6c   Blob hash;.  Bl
af40: 6f 62 20 6d 61 6e 69 66 65 73 74 3b 0a 0a 20 20  ob manifest;..  
af50: 64 62 5f 73 65 74 28 22 63 6f 6e 74 65 6e 74 2d  db_set("content-
af60: 73 63 68 65 6d 61 22 2c 20 43 4f 4e 54 45 4e 54  schema", CONTENT
af70: 5f 53 43 48 45 4d 41 2c 20 30 29 3b 0a 20 20 64  _SCHEMA, 0);.  d
af80: 62 5f 73 65 74 28 22 61 75 78 2d 73 63 68 65 6d  b_set("aux-schem
af90: 61 22 2c 20 41 55 58 5f 53 43 48 45 4d 41 5f 4d  a", AUX_SCHEMA_M
afa0: 41 58 2c 20 30 29 3b 0a 20 20 64 62 5f 73 65 74  AX, 0);.  db_set
afb0: 28 22 72 65 62 75 69 6c 74 22 2c 20 67 65 74 5f  ("rebuilt", get_
afc0: 76 65 72 73 69 6f 6e 28 29 2c 20 30 29 3b 0a 20  version(), 0);. 
afd0: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a   db_multi_exec(.
afe0: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
aff0: 54 4f 20 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76  TO config(name,v
b000: 61 6c 75 65 2c 6d 74 69 6d 65 29 22 0a 20 20 20  alue,mtime)".   
b010: 20 20 20 22 20 56 41 4c 55 45 53 28 27 73 65 72     " VALUES('ser
b020: 76 65 72 2d 63 6f 64 65 27 2c 20 6c 6f 77 65 72  ver-code', lower
b030: 28 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  (hex(randomblob(
b040: 32 30 29 29 29 2c 6e 6f 77 28 29 29 3b 22 0a 20  20))),now());". 
b050: 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
b060: 4f 20 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61  O config(name,va
b070: 6c 75 65 2c 6d 74 69 6d 65 29 22 0a 20 20 20 20  lue,mtime)".    
b080: 20 20 22 20 56 41 4c 55 45 53 28 27 70 72 6f 6a    " VALUES('proj
b090: 65 63 74 2d 63 6f 64 65 27 2c 20 6c 6f 77 65 72  ect-code', lower
b0a0: 28 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  (hex(randomblob(
b0b0: 32 30 29 29 29 2c 6e 6f 77 28 29 29 3b 22 0a 20  20))),now());". 
b0c0: 20 29 3b 0a 20 20 69 66 28 20 21 64 62 5f 69 73   );.  if( !db_is
b0d0: 5f 67 6c 6f 62 61 6c 28 22 61 75 74 6f 73 79 6e  _global("autosyn
b0e0: 63 22 29 20 29 20 64 62 5f 73 65 74 5f 69 6e 74  c") ) db_set_int
b0f0: 28 22 61 75 74 6f 73 79 6e 63 22 2c 20 31 2c 20  ("autosync", 1, 
b100: 30 29 3b 0a 20 20 69 66 28 20 21 64 62 5f 69 73  0);.  if( !db_is
b110: 5f 67 6c 6f 62 61 6c 28 22 6c 6f 63 61 6c 61 75  _global("localau
b120: 74 68 22 29 20 29 20 64 62 5f 73 65 74 5f 69 6e  th") ) db_set_in
b130: 74 28 22 6c 6f 63 61 6c 61 75 74 68 22 2c 20 30  t("localauth", 0
b140: 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62 5f  , 0);.  if( !db_
b150: 69 73 5f 67 6c 6f 62 61 6c 28 22 74 69 6d 65 6c  is_global("timel
b160: 69 6e 65 2d 70 6c 61 69 6e 74 65 78 74 22 29 20  ine-plaintext") 
b170: 29 7b 0a 20 20 20 20 64 62 5f 73 65 74 5f 69 6e  ){.    db_set_in
b180: 74 28 22 74 69 6d 65 6c 69 6e 65 2d 70 6c 61 69  t("timeline-plai
b190: 6e 74 65 78 74 22 2c 20 31 2c 20 30 29 3b 0a 20  ntext", 1, 0);. 
b1a0: 20 7d 0a 20 20 64 62 5f 63 72 65 61 74 65 5f 64   }.  db_create_d
b1b0: 65 66 61 75 6c 74 5f 75 73 65 72 73 28 30 2c 20  efault_users(0, 
b1c0: 7a 44 65 66 61 75 6c 74 55 73 65 72 29 3b 0a 20  zDefaultUser);. 
b1d0: 20 69 66 28 20 7a 44 65 66 61 75 6c 74 55 73 65   if( zDefaultUse
b1e0: 72 20 29 20 67 2e 7a 4c 6f 67 69 6e 20 3d 20 7a  r ) g.zLogin = z
b1f0: 44 65 66 61 75 6c 74 55 73 65 72 3b 0a 20 20 75  DefaultUser;.  u
b200: 73 65 72 5f 73 65 6c 65 63 74 28 29 3b 0a 0a 20  ser_select();.. 
b210: 20 69 66 28 20 7a 54 65 6d 70 6c 61 74 65 20 29   if( zTemplate )
b220: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
b230: 43 6f 70 79 20 61 6c 6c 20 73 65 74 74 69 6e 67  Copy all setting
b240: 73 20 66 72 6f 6d 20 74 68 65 20 73 75 70 70 6c  s from the suppl
b250: 69 65 64 20 74 65 6d 70 6c 61 74 65 20 72 65 70  ied template rep
b260: 6f 73 69 74 6f 72 79 2e 0a 20 20 20 20 2a 2f 0a  ository..    */.
b270: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
b280: 63 28 0a 20 20 20 20 20 20 22 49 4e 53 45 52 54  c(.      "INSERT
b290: 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f   OR REPLACE INTO
b2a0: 20 63 6f 6e 66 69 67 22 0a 20 20 20 20 20 20 22   config".      "
b2b0: 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c 76 61 6c   SELECT name,val
b2c0: 75 65 2c 6d 74 69 6d 65 20 46 52 4f 4d 20 73 65  ue,mtime FROM se
b2d0: 74 74 69 6e 67 53 72 63 2e 63 6f 6e 66 69 67 22  ttingSrc.config"
b2e0: 0a 20 20 20 20 20 20 22 20 20 57 48 45 52 45 20  .      "  WHERE 
b2f0: 28 6e 61 6d 65 20 49 4e 20 25 73 20 4f 52 20 6e  (name IN %s OR n
b300: 61 6d 65 20 49 4e 20 25 73 29 22 0a 20 20 20 20  ame IN %s)".    
b310: 20 20 22 20 20 20 20 41 4e 44 20 6e 61 6d 65 20    "    AND name 
b320: 4e 4f 54 20 47 4c 4f 42 20 27 70 72 6f 6a 65 63  NOT GLOB 'projec
b330: 74 2d 2a 27 22 0a 20 20 20 20 20 20 22 20 20 20  t-*'".      "   
b340: 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 47 4c   AND name NOT GL
b350: 4f 42 20 27 73 68 6f 72 74 2d 70 72 6f 6a 65 63  OB 'short-projec
b360: 74 2d 2a 27 3b 22 2c 0a 20 20 20 20 20 20 63 6f  t-*';",.      co
b370: 6e 66 69 67 75 72 65 5f 69 6e 6f 70 5f 72 68 73  nfigure_inop_rhs
b380: 28 43 4f 4e 46 49 47 53 45 54 5f 41 4c 4c 29 2c  (CONFIGSET_ALL),
b390: 0a 20 20 20 20 20 20 64 62 5f 73 65 74 74 69 6e  .      db_settin
b3a0: 67 5f 69 6e 6f 70 5f 72 68 73 28 29 0a 20 20 20  g_inop_rhs().   
b3b0: 20 29 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69   );.    db_multi
b3c0: 5f 65 78 65 63 28 0a 20 20 20 20 20 20 22 52 45  _exec(.      "RE
b3d0: 50 4c 41 43 45 20 49 4e 54 4f 20 72 65 70 6f 72  PLACE INTO repor
b3e0: 74 66 6d 74 20 53 45 4c 45 43 54 20 2a 20 46 52  tfmt SELECT * FR
b3f0: 4f 4d 20 73 65 74 74 69 6e 67 53 72 63 2e 72 65  OM settingSrc.re
b400: 70 6f 72 74 66 6d 74 3b 22 0a 20 20 20 20 29 3b  portfmt;".    );
b410: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
b420: 43 6f 70 79 20 74 68 65 20 75 73 65 72 20 70 65  Copy the user pe
b430: 72 6d 69 73 73 69 6f 6e 73 2c 20 63 6f 6e 74 61  rmissions, conta
b440: 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20  ct information, 
b450: 6c 61 73 74 20 6d 6f 64 69 66 69 65 64 0a 20 20  last modified.  
b460: 20 20 2a 2a 20 74 69 6d 65 2c 20 61 6e 64 20 70    ** time, and p
b470: 68 6f 74 6f 20 66 6f 72 20 61 6c 6c 20 74 68 65  hoto for all the
b480: 20 22 73 79 73 74 65 6d 22 20 75 73 65 72 73 20   "system" users 
b490: 66 72 6f 6d 20 74 68 65 20 73 75 70 70 6c 69 65  from the supplie
b4a0: 64 0a 20 20 20 20 2a 2a 20 74 65 6d 70 6c 61 74  d.    ** templat
b4b0: 65 20 72 65 70 6f 73 69 74 6f 72 79 20 69 6e 74  e repository int
b4c0: 6f 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 20  o the one being 
b4d0: 73 65 74 75 70 2e 20 20 54 68 65 20 6f 74 68 65  setup.  The othe
b4e0: 72 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a  r columns.    **
b4f0: 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20   are not copied 
b500: 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 6e  because they con
b510: 74 61 69 6e 20 73 65 63 75 72 69 74 79 20 69 6e  tain security in
b520: 66 6f 72 6d 61 74 69 6f 6e 20 6f 72 20 6f 74 68  formation or oth
b530: 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 73  er.    ** data s
b540: 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20 6f  pecific to the o
b550: 74 68 65 72 20 72 65 70 6f 73 69 74 6f 72 79 2e  ther repository.
b560: 20 20 54 68 65 20 6c 69 73 74 20 6f 66 20 63 6f    The list of co
b570: 6c 75 6d 6e 73 20 63 6f 70 69 65 64 0a 20 20 20  lumns copied.   
b580: 20 2a 2a 20 62 79 20 74 68 69 73 20 53 51 4c 20   ** by this SQL 
b590: 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 6e 65  statement may ne
b5a0: 65 64 20 74 6f 20 62 65 20 72 65 76 69 73 65 64  ed to be revised
b5b0: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a   in the future..
b5c0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 5f 6d 75      */.    db_mu
b5d0: 6c 74 69 5f 65 78 65 63 28 22 55 50 44 41 54 45  lti_exec("UPDATE
b5e0: 20 75 73 65 72 20 53 45 54 22 0a 20 20 20 20 20   user SET".     
b5f0: 20 22 20 20 63 61 70 20 3d 20 28 53 45 4c 45 43   "  cap = (SELEC
b600: 54 20 75 32 2e 63 61 70 20 46 52 4f 4d 20 73 65  T u2.cap FROM se
b610: 74 74 69 6e 67 53 72 63 2e 75 73 65 72 20 75 32  ttingSrc.user u2
b620: 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 20  ".      "       
b630: 20 20 57 48 45 52 45 20 75 32 2e 6c 6f 67 69 6e    WHERE u2.login
b640: 20 3d 20 75 73 65 72 2e 6c 6f 67 69 6e 29 2c 22   = user.login),"
b650: 0a 20 20 20 20 20 20 22 20 20 69 6e 66 6f 20 3d  .      "  info =
b660: 20 28 53 45 4c 45 43 54 20 75 32 2e 69 6e 66 6f   (SELECT u2.info
b670: 20 46 52 4f 4d 20 73 65 74 74 69 6e 67 53 72 63   FROM settingSrc
b680: 2e 75 73 65 72 20 75 32 22 0a 20 20 20 20 20 20  .user u2".      
b690: 22 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45  "          WHERE
b6a0: 20 75 32 2e 6c 6f 67 69 6e 20 3d 20 75 73 65 72   u2.login = user
b6b0: 2e 6c 6f 67 69 6e 29 2c 22 0a 20 20 20 20 20 20  .login),".      
b6c0: 22 20 20 6d 74 69 6d 65 20 3d 20 28 53 45 4c 45  "  mtime = (SELE
b6d0: 43 54 20 75 32 2e 6d 74 69 6d 65 20 46 52 4f 4d  CT u2.mtime FROM
b6e0: 20 73 65 74 74 69 6e 67 53 72 63 2e 75 73 65 72   settingSrc.user
b6f0: 20 75 32 22 0a 20 20 20 20 20 20 22 20 20 20 20   u2".      "    
b700: 20 20 20 20 20 20 20 57 48 45 52 45 20 75 32 2e         WHERE u2.
b710: 6c 6f 67 69 6e 20 3d 20 75 73 65 72 2e 6c 6f 67  login = user.log
b720: 69 6e 29 2c 22 0a 20 20 20 20 20 20 22 20 20 70  in),".      "  p
b730: 68 6f 74 6f 20 3d 20 28 53 45 4c 45 43 54 20 75  hoto = (SELECT u
b740: 32 2e 70 68 6f 74 6f 20 46 52 4f 4d 20 73 65 74  2.photo FROM set
b750: 74 69 6e 67 53 72 63 2e 75 73 65 72 20 75 32 22  tingSrc.user u2"
b760: 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 20 20  .      "        
b770: 20 20 20 57 48 45 52 45 20 75 32 2e 6c 6f 67 69     WHERE u2.logi
b780: 6e 20 3d 20 75 73 65 72 2e 6c 6f 67 69 6e 29 22  n = user.login)"
b790: 0a 20 20 20 20 20 20 22 20 57 48 45 52 45 20 75  .      " WHERE u
b7a0: 73 65 72 2e 6c 6f 67 69 6e 20 49 4e 20 28 27 61  ser.login IN ('a
b7b0: 6e 6f 6e 79 6d 6f 75 73 27 2c 27 6e 6f 62 6f 64  nonymous','nobod
b7c0: 79 27 2c 27 64 65 76 65 6c 6f 70 65 72 27 2c 27  y','developer','
b7d0: 72 65 61 64 65 72 27 29 3b 22 0a 20 20 20 20 29  reader');".    )
b7e0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 49 6e  ;.  }..  if( zIn
b7f0: 69 74 69 61 6c 44 61 74 65 20 29 7b 0a 20 20 20  itialDate ){.   
b800: 20 69 6e 74 20 72 69 64 3b 0a 20 20 20 20 62 6c   int rid;.    bl
b810: 6f 62 5f 7a 65 72 6f 28 26 6d 61 6e 69 66 65 73  ob_zero(&manifes
b820: 74 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70  t);.    blob_app
b830: 65 6e 64 66 28 26 6d 61 6e 69 66 65 73 74 2c 20  endf(&manifest, 
b840: 22 43 20 69 6e 69 74 69 61 6c 5c 5c 73 65 6d 70  "C initial\\semp
b850: 74 79 5c 5c 73 63 68 65 63 6b 2d 69 6e 5c 6e 22  ty\\scheck-in\n"
b860: 29 3b 0a 20 20 20 20 7a 44 61 74 65 20 3d 20 64  );.    zDate = d
b870: 61 74 65 5f 69 6e 5f 73 74 61 6e 64 61 72 64 5f  ate_in_standard_
b880: 66 6f 72 6d 61 74 28 7a 49 6e 69 74 69 61 6c 44  format(zInitialD
b890: 61 74 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61  ate);.    blob_a
b8a0: 70 70 65 6e 64 66 28 26 6d 61 6e 69 66 65 73 74  ppendf(&manifest
b8b0: 2c 20 22 44 20 25 73 5c 6e 22 2c 20 7a 44 61 74  , "D %s\n", zDat
b8c0: 65 29 3b 0a 20 20 20 20 6d 64 35 73 75 6d 5f 69  e);.    md5sum_i
b8d0: 6e 69 74 28 29 3b 0a 20 20 20 20 2f 2a 20 54 68  nit();.    /* Th
b8e0: 65 20 52 2d 63 61 72 64 20 69 73 20 6e 65 63 65  e R-card is nece
b8f0: 73 73 61 72 79 20 68 65 72 65 20 62 65 63 61 75  ssary here becau
b900: 73 65 20 77 69 74 68 6f 75 74 20 69 74 0a 20 20  se without it.  
b910: 20 20 20 2a 20 66 6f 73 73 69 6c 20 76 65 72 73     * fossil vers
b920: 69 6f 6e 73 20 65 61 72 6c 69 65 72 20 74 68 61  ions earlier tha
b930: 6e 20 76 65 72 73 69 6f 6e 73 20 31 2e 32 37 20  n versions 1.27 
b940: 77 6f 75 6c 64 0a 20 20 20 20 20 2a 20 69 6e 74  would.     * int
b950: 65 72 70 72 65 74 20 74 68 69 73 20 61 72 74 69  erpret this arti
b960: 66 61 63 74 20 61 73 20 61 20 22 63 6f 6e 74 72  fact as a "contr
b970: 6f 6c 22 2e 20 2a 2f 0a 20 20 20 20 62 6c 6f 62  ol". */.    blob
b980: 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69 66 65  _appendf(&manife
b990: 73 74 2c 20 22 52 20 25 73 5c 6e 22 2c 20 6d 64  st, "R %s\n", md
b9a0: 35 73 75 6d 5f 66 69 6e 69 73 68 28 30 29 29 3b  5sum_finish(0));
b9b0: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  .    blob_append
b9c0: 66 28 26 6d 61 6e 69 66 65 73 74 2c 20 22 54 20  f(&manifest, "T 
b9d0: 2a 62 72 61 6e 63 68 20 2a 20 74 72 75 6e 6b 5c  *branch * trunk\
b9e0: 6e 22 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70  n");.    blob_ap
b9f0: 70 65 6e 64 66 28 26 6d 61 6e 69 66 65 73 74 2c  pendf(&manifest,
ba00: 20 22 54 20 2a 73 79 6d 2d 74 72 75 6e 6b 20 2a   "T *sym-trunk *
ba10: 5c 6e 22 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61  \n");.    blob_a
ba20: 70 70 65 6e 64 66 28 26 6d 61 6e 69 66 65 73 74  ppendf(&manifest
ba30: 2c 20 22 55 20 25 46 5c 6e 22 2c 20 67 2e 7a 4c  , "U %F\n", g.zL
ba40: 6f 67 69 6e 29 3b 0a 20 20 20 20 6d 64 35 73 75  ogin);.    md5su
ba50: 6d 5f 62 6c 6f 62 28 26 6d 61 6e 69 66 65 73 74  m_blob(&manifest
ba60: 2c 20 26 68 61 73 68 29 3b 0a 20 20 20 20 62 6c  , &hash);.    bl
ba70: 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69  ob_appendf(&mani
ba80: 66 65 73 74 2c 20 22 5a 20 25 62 5c 6e 22 2c 20  fest, "Z %b\n", 
ba90: 26 68 61 73 68 29 3b 0a 20 20 20 20 62 6c 6f 62  &hash);.    blob
baa0: 5f 72 65 73 65 74 28 26 68 61 73 68 29 3b 0a 20  _reset(&hash);. 
bab0: 20 20 20 72 69 64 20 3d 20 63 6f 6e 74 65 6e 74     rid = content
bac0: 5f 70 75 74 28 26 6d 61 6e 69 66 65 73 74 29 3b  _put(&manifest);
bad0: 0a 20 20 20 20 6d 61 6e 69 66 65 73 74 5f 63 72  .    manifest_cr
bae0: 6f 73 73 6c 69 6e 6b 28 72 69 64 2c 20 26 6d 61  osslink(rid, &ma
baf0: 6e 69 66 65 73 74 2c 20 4d 43 5f 4e 4f 4e 45 29  nifest, MC_NONE)
bb00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
bb10: 4f 4d 4d 41 4e 44 3a 20 6e 65 77 2a 0a 2a 2a 20  OMMAND: new*.** 
bb20: 43 4f 4d 4d 41 4e 44 3a 20 69 6e 69 74 0a 2a 2a  COMMAND: init.**
bb30: 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73  .** Usage: %foss
bb40: 69 6c 20 6e 65 77 20 3f 4f 50 54 49 4f 4e 53 3f  il new ?OPTIONS?
bb50: 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 20 20 20 20   FILENAME.**    
bb60: 4f 72 3a 20 25 66 6f 73 73 69 6c 20 69 6e 69 74  Or: %fossil init
bb70: 20 3f 4f 50 54 49 4f 4e 53 3f 20 46 49 4c 45 4e   ?OPTIONS? FILEN
bb80: 41 4d 45 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65  AME.**.** Create
bb90: 20 61 20 72 65 70 6f 73 69 74 6f 72 79 20 66 6f   a repository fo
bba0: 72 20 61 20 6e 65 77 20 70 72 6f 6a 65 63 74 20  r a new project 
bbb0: 69 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  in the file name
bbc0: 64 20 46 49 4c 45 4e 41 4d 45 2e 0a 2a 2a 20 54  d FILENAME..** T
bbd0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64  his command is d
bbe0: 69 73 74 69 6e 63 74 20 66 72 6f 6d 20 22 63 6c  istinct from "cl
bbf0: 6f 6e 65 22 2e 20 20 54 68 65 20 22 63 6c 6f 6e  one".  The "clon
bc00: 65 22 20 63 6f 6d 6d 61 6e 64 20 6d 61 6b 65 73  e" command makes
bc10: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  .** a copy of an
bc20: 20 65 78 69 73 74 69 6e 67 20 70 72 6f 6a 65 63   existing projec
bc30: 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
bc40: 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 70 72   starts a new pr
bc50: 6f 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 42 79 20  oject..**.** By 
bc60: 64 65 66 61 75 6c 74 2c 20 79 6f 75 72 20 63 75  default, your cu
bc70: 72 72 65 6e 74 20 6c 6f 67 69 6e 20 6e 61 6d 65  rrent login name
bc80: 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61   is used to crea
bc90: 74 65 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  te the default.*
bca0: 2a 20 61 64 6d 69 6e 20 75 73 65 72 2e 20 54 68  * admin user. Th
bcb0: 69 73 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69  is can be overri
bcc0: 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 2d  dden using the -
bcd0: 41 7c 2d 2d 61 64 6d 69 6e 2d 75 73 65 72 0a 2a  A|--admin-user.*
bce0: 2a 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  * parameter..**.
bcf0: 2a 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 61  ** By default, a
bd00: 6c 6c 20 73 65 74 74 69 6e 67 73 20 77 69 6c 6c  ll settings will
bd10: 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
bd20: 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  to their default
bd30: 20 76 61 6c 75 65 73 2e 0a 2a 2a 20 54 68 69 73   values..** This
bd40: 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64   can be overridd
bd50: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 2d 2d 74  en using the --t
bd60: 65 6d 70 6c 61 74 65 20 70 61 72 61 6d 65 74 65  emplate paramete
bd70: 72 20 74 6f 20 73 70 65 63 69 66 79 20 61 0a 2a  r to specify a.*
bd80: 2a 20 72 65 70 6f 73 69 74 6f 72 79 20 66 69 6c  * repository fil
bd90: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
bda0: 63 6f 70 79 20 74 68 65 20 69 6e 69 74 69 61 6c  copy the initial
bdb0: 20 73 65 74 74 69 6e 67 73 2e 20 20 57 68 65 6e   settings.  When
bdc0: 20 61 20 74 65 6d 70 6c 61 74 65 0a 2a 2a 20 72   a template.** r
bdd0: 65 70 6f 73 69 74 6f 72 79 20 69 73 20 75 73 65  epository is use
bde0: 64 2c 20 61 6c 6d 6f 73 74 20 61 6c 6c 20 6f 66  d, almost all of
bdf0: 20 74 68 65 20 73 65 74 74 69 6e 67 73 20 61 63   the settings ac
be00: 63 65 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68  cessible from th
be10: 65 20 73 65 74 75 70 0a 2a 2a 20 70 61 67 65 2c  e setup.** page,
be20: 20 65 69 74 68 65 72 20 64 69 72 65 63 74 6c 79   either directly
be30: 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2c 20   or indirectly, 
be40: 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 2e 20  will be copied. 
be50: 20 4e 6f 72 6d 61 6c 20 75 73 65 72 73 20 61 6e   Normal users an
be60: 64 0a 2a 2a 20 74 68 65 69 72 20 61 73 73 6f 63  d.** their assoc
be70: 69 61 74 65 64 20 70 65 72 6d 69 73 73 69 6f 6e  iated permission
be80: 73 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  s will not be co
be90: 70 69 65 64 3b 20 68 6f 77 65 76 65 72 2c 20 74  pied; however, t
bea0: 68 65 20 73 79 73 74 65 6d 0a 2a 2a 20 64 65 66  he system.** def
beb0: 61 75 6c 74 20 75 73 65 72 73 20 22 61 6e 6f 6e  ault users "anon
bec0: 79 6d 6f 75 73 22 2c 20 22 6e 6f 62 6f 64 79 22  ymous", "nobody"
bed0: 2c 20 22 72 65 61 64 65 72 22 2c 20 22 64 65 76  , "reader", "dev
bee0: 65 6c 6f 70 65 72 22 2c 20 61 6e 64 20 74 68 65  eloper", and the
bef0: 69 72 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  ir.** associated
bf00: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 69 6c   permissions wil
bf10: 6c 20 62 65 20 63 6f 70 69 65 64 2e 0a 2a 2a 0a  l be copied..**.
bf20: 2a 2a 20 4f 70 74 69 6f 6e 73 3a 0a 2a 2a 20 20  ** Options:.**  
bf30: 20 20 2d 2d 74 65 6d 70 6c 61 74 65 20 20 20 20    --template    
bf40: 20 20 46 49 4c 45 20 20 20 20 20 20 63 6f 70 79    FILE      copy
bf50: 20 73 65 74 74 69 6e 67 73 20 66 72 6f 6d 20 72   settings from r
bf60: 65 70 6f 73 69 74 6f 72 79 20 66 69 6c 65 0a 2a  epository file.*
bf70: 2a 20 20 20 20 2d 2d 61 64 6d 69 6e 2d 75 73 65  *    --admin-use
bf80: 72 7c 2d 41 20 55 53 45 52 4e 41 4d 45 20 20 73  r|-A USERNAME  s
bf90: 65 6c 65 63 74 20 67 69 76 65 6e 20 55 53 45 52  elect given USER
bfa0: 4e 41 4d 45 20 61 73 20 61 64 6d 69 6e 20 75 73  NAME as admin us
bfb0: 65 72 0a 2a 2a 20 20 20 20 2d 2d 64 61 74 65 2d  er.**    --date-
bfc0: 6f 76 65 72 72 69 64 65 20 44 41 54 45 54 49 4d  override DATETIM
bfd0: 45 20 20 75 73 65 20 44 41 54 45 54 49 4d 45 20  E  use DATETIME 
bfe0: 61 73 20 74 69 6d 65 20 6f 66 20 74 68 65 20 69  as time of the i
bff0: 6e 69 74 69 61 6c 20 63 68 65 63 6b 2d 69 6e 0a  nitial check-in.
c000: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  **.** See also: 
c010: 63 6c 6f 6e 65 0a 2a 2f 0a 76 6f 69 64 20 63 72  clone.*/.void cr
c020: 65 61 74 65 5f 72 65 70 6f 73 69 74 6f 72 79 5f  eate_repository_
c030: 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20 63 68 61  cmd(void){.  cha
c040: 72 20 2a 7a 50 61 73 73 77 6f 72 64 3b 0a 20 20  r *zPassword;.  
c050: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 6d  const char *zTem
c060: 70 6c 61 74 65 3b 20 20 20 20 20 20 2f 2a 20 52  plate;      /* R
c070: 65 70 6f 73 69 74 6f 72 79 20 66 72 6f 6d 20 77  epository from w
c080: 68 69 63 68 20 74 6f 20 63 6f 70 79 20 73 65 74  hich to copy set
c090: 74 69 6e 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tings */.  const
c0a0: 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 20 20 20   char *zDate;   
c0b0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 65 20 6f         /* Date o
c0c0: 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20 63 68  f the initial ch
c0d0: 65 63 6b 2d 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73  eck-in */.  cons
c0e0: 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74  t char *zDefault
c0f0: 55 73 65 72 3b 20 20 20 2f 2a 20 4f 70 74 69 6f  User;   /* Optio
c100: 6e 61 6c 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  nal name of the 
c110: 64 65 66 61 75 6c 74 20 75 73 65 72 20 2a 2f 0a  default user */.
c120: 0a 20 20 7a 54 65 6d 70 6c 61 74 65 20 3d 20 66  .  zTemplate = f
c130: 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 74 65 6d 70  ind_option("temp
c140: 6c 61 74 65 22 2c 30 2c 31 29 3b 0a 20 20 7a 44  late",0,1);.  zD
c150: 61 74 65 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f  ate = find_optio
c160: 6e 28 22 64 61 74 65 2d 6f 76 65 72 72 69 64 65  n("date-override
c170: 22 2c 30 2c 31 29 3b 0a 20 20 7a 44 65 66 61 75  ",0,1);.  zDefau
c180: 6c 74 55 73 65 72 20 3d 20 66 69 6e 64 5f 6f 70  ltUser = find_op
c190: 74 69 6f 6e 28 22 61 64 6d 69 6e 2d 75 73 65 72  tion("admin-user
c1a0: 22 2c 22 41 22 2c 31 29 3b 0a 20 20 2f 2a 20 57  ","A",1);.  /* W
c1b0: 65 20 73 68 6f 75 6c 64 20 62 65 20 64 6f 6e 65  e should be done
c1c0: 20 77 69 74 68 20 6f 70 74 69 6f 6e 73 2e 2e 20   with options.. 
c1d0: 2a 2f 0a 20 20 76 65 72 69 66 79 5f 61 6c 6c 5f  */.  verify_all_
c1e0: 6f 70 74 69 6f 6e 73 28 29 3b 0a 0a 20 20 69 66  options();..  if
c1f0: 28 20 67 2e 61 72 67 63 21 3d 33 20 29 7b 0a 20  ( g.argc!=3 ){. 
c200: 20 20 20 75 73 61 67 65 28 22 52 45 50 4f 53 49     usage("REPOSI
c210: 54 4f 52 59 2d 4e 41 4d 45 22 29 3b 0a 20 20 7d  TORY-NAME");.  }
c220: 0a 0a 20 20 69 66 28 20 2d 31 20 21 3d 20 66 69  ..  if( -1 != fi
c230: 6c 65 5f 73 69 7a 65 28 67 2e 61 72 67 76 5b 32  le_size(g.argv[2
c240: 5d 29 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c  ]) ){.    fossil
c250: 5f 66 61 74 61 6c 28 22 66 69 6c 65 20 61 6c 72  _fatal("file alr
c260: 65 61 64 79 20 65 78 69 73 74 73 3a 20 25 73 22  eady exists: %s"
c270: 2c 20 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20  , g.argv[2]);.  
c280: 7d 0a 0a 20 20 64 62 5f 63 72 65 61 74 65 5f 72  }..  db_create_r
c290: 65 70 6f 73 69 74 6f 72 79 28 67 2e 61 72 67 76  epository(g.argv
c2a0: 5b 32 5d 29 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f  [2]);.  db_open_
c2b0: 72 65 70 6f 73 69 74 6f 72 79 28 67 2e 61 72 67  repository(g.arg
c2c0: 76 5b 32 5d 29 3b 0a 20 20 64 62 5f 6f 70 65 6e  v[2]);.  db_open
c2d0: 5f 63 6f 6e 66 69 67 28 30 29 3b 0a 20 20 69 66  _config(0);.  if
c2e0: 28 20 7a 54 65 6d 70 6c 61 74 65 20 29 20 64 62  ( zTemplate ) db
c2f0: 5f 61 74 74 61 63 68 28 7a 54 65 6d 70 6c 61 74  _attach(zTemplat
c300: 65 2c 20 22 73 65 74 74 69 6e 67 53 72 63 22 29  e, "settingSrc")
c310: 3b 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 61  ;.  db_begin_tra
c320: 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 69 66  nsaction();.  if
c330: 28 20 7a 44 61 74 65 3d 3d 30 20 29 20 7a 44 61  ( zDate==0 ) zDa
c340: 74 65 20 3d 20 22 6e 6f 77 22 3b 0a 20 20 64 62  te = "now";.  db
c350: 5f 69 6e 69 74 69 61 6c 5f 73 65 74 75 70 28 7a  _initial_setup(z
c360: 54 65 6d 70 6c 61 74 65 2c 20 7a 44 61 74 65 2c  Template, zDate,
c370: 20 7a 44 65 66 61 75 6c 74 55 73 65 72 29 3b 0a   zDefaultUser);.
c380: 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63    db_end_transac
c390: 74 69 6f 6e 28 30 29 3b 0a 20 20 69 66 28 20 7a  tion(0);.  if( z
c3a0: 54 65 6d 70 6c 61 74 65 20 29 20 64 62 5f 64 65  Template ) db_de
c3b0: 74 61 63 68 28 22 73 65 74 74 69 6e 67 53 72 63  tach("settingSrc
c3c0: 22 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69  ");.  fossil_pri
c3d0: 6e 74 28 22 70 72 6f 6a 65 63 74 2d 69 64 3a 20  nt("project-id: 
c3e0: 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28 22 70  %s\n", db_get("p
c3f0: 72 6f 6a 65 63 74 2d 63 6f 64 65 22 2c 20 30 29  roject-code", 0)
c400: 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e  );.  fossil_prin
c410: 74 28 22 73 65 72 76 65 72 2d 69 64 3a 20 20 25  t("server-id:  %
c420: 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28 22 73 65  s\n", db_get("se
c430: 72 76 65 72 2d 63 6f 64 65 22 2c 20 30 29 29 3b  rver-code", 0));
c440: 0a 20 20 7a 50 61 73 73 77 6f 72 64 20 3d 20 64  .  zPassword = d
c450: 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43  b_text(0, "SELEC
c460: 54 20 70 77 20 46 52 4f 4d 20 75 73 65 72 20 57  T pw FROM user W
c470: 48 45 52 45 20 6c 6f 67 69 6e 3d 25 51 22 2c 20  HERE login=%Q", 
c480: 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 66 6f 73  g.zLogin);.  fos
c490: 73 69 6c 5f 70 72 69 6e 74 28 22 61 64 6d 69 6e  sil_print("admin
c4a0: 2d 75 73 65 72 3a 20 25 73 20 28 69 6e 69 74 69  -user: %s (initi
c4b0: 61 6c 20 70 61 73 73 77 6f 72 64 20 69 73 20 5c  al password is \
c4c0: 22 25 73 5c 22 29 5c 6e 22 2c 0a 20 20 20 20 20  "%s\")\n",.     
c4d0: 20 20 20 20 20 20 20 20 20 20 67 2e 7a 4c 6f 67            g.zLog
c4e0: 69 6e 2c 20 7a 50 61 73 73 77 6f 72 64 29 3b 0a  in, zPassword);.
c4f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e  }../*.** SQL fun
c500: 63 74 69 6f 6e 73 20 66 6f 72 20 64 65 62 75 67  ctions for debug
c510: 67 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ging..**.** The 
c520: 70 72 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  print() function
c530: 20 77 72 69 74 65 73 20 69 74 73 20 61 72 67 75   writes its argu
c540: 6d 65 6e 74 73 20 6f 6e 20 73 74 64 6f 75 74 2c  ments on stdout,
c550: 20 62 75 74 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20   but only.** if 
c560: 74 68 65 20 2d 73 71 6c 70 72 69 6e 74 20 63 6f  the -sqlprint co
c570: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
c580: 6e 20 69 73 20 74 75 72 6e 65 64 20 6f 6e 2e 0a  n is turned on..
c590: 2a 2f 0a 4c 4f 43 41 4c 20 76 6f 69 64 20 64 62  */.LOCAL void db
c5a0: 5f 73 71 6c 5f 70 72 69 6e 74 28 0a 20 20 73 71  _sql_print(.  sq
c5b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
c5c0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
c5d0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
c5e0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
c5f0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 67 2e 66  int i;.  if( g.f
c600: 53 71 6c 50 72 69 6e 74 20 29 7b 0a 20 20 20 20  SqlPrint ){.    
c610: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
c620: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
c630: 72 20 63 20 3d 20 69 3d 3d 61 72 67 63 2d 31 20  r c = i==argc-1 
c640: 3f 20 27 5c 6e 27 20 3a 20 27 20 27 3b 0a 20 20  ? '\n' : ' ';.  
c650: 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74      fossil_print
c660: 28 22 25 73 25 63 22 2c 20 73 71 6c 69 74 65 33  ("%s%c", sqlite3
c670: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
c680: 5b 69 5d 29 2c 20 63 29 3b 0a 20 20 20 20 7d 0a  [i]), c);.    }.
c690: 20 20 7d 0a 7d 0a 4c 4f 43 41 4c 20 76 6f 69 64    }.}.LOCAL void
c6a0: 20 64 62 5f 73 71 6c 5f 74 72 61 63 65 28 76 6f   db_sql_trace(vo
c6b0: 69 64 20 2a 6e 6f 74 55 73 65 64 2c 20 63 6f 6e  id *notUsed, con
c6c0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a  st char *zSql){.
c6d0: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
c6e0: 28 7a 53 71 6c 29 3b 0a 20 20 66 6f 73 73 69 6c  (zSql);.  fossil
c6f0: 5f 74 72 61 63 65 28 22 25 73 25 73 5c 6e 22 2c  _trace("%s%s\n",
c700: 20 7a 53 71 6c 2c 20 28 6e 3e 30 20 26 26 20 7a   zSql, (n>0 && z
c710: 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 29 20 3f  Sql[n-1]==';') ?
c720: 20 22 22 20 3a 20 22 3b 22 29 3b 0a 7d 0a 0a 2f   "" : ";");.}../
c730: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74  *.** Implement t
c740: 68 65 20 75 73 65 72 28 29 20 53 51 4c 20 66 75  he user() SQL fu
c750: 6e 63 74 69 6f 6e 2e 20 20 75 73 65 72 28 29 20  nction.  user() 
c760: 74 61 6b 65 73 20 6e 6f 20 61 72 67 75 6d 65 6e  takes no argumen
c770: 74 73 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ts and.** return
c780: 73 20 74 68 65 20 75 73 65 72 20 49 44 20 6f 66  s the user ID of
c790: 20 74 68 65 20 63 75 72 72 65 6e 74 20 75 73 65   the current use
c7a0: 72 2e 0a 2a 2f 0a 4c 4f 43 41 4c 20 76 6f 69 64  r..*/.LOCAL void
c7b0: 20 64 62 5f 73 71 6c 5f 75 73 65 72 28 0a 20 20   db_sql_user(.  
c7c0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
c7d0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
c7e0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
c7f0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
c800: 20 20 69 66 28 20 67 2e 7a 4c 6f 67 69 6e 21 3d    if( g.zLogin!=
c810: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c820: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
c830: 74 65 78 74 2c 20 67 2e 7a 4c 6f 67 69 6e 2c 20  text, g.zLogin, 
c840: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
c850: 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
c860: 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   Implement the c
c870: 67 69 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  gi() SQL functio
c880: 6e 2e 20 20 63 67 69 28 29 20 74 61 6b 65 73 20  n.  cgi() takes 
c890: 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  an argument whic
c8a0: 68 20 69 73 0a 2a 2a 20 61 20 6e 61 6d 65 20 6f  h is.** a name o
c8b0: 66 20 43 47 49 20 71 75 65 72 79 20 70 61 72 61  f CGI query para
c8c0: 6d 65 74 65 72 2e 20 54 68 65 20 76 61 6c 75 65  meter. The value
c8d0: 20 6f 66 20 74 68 61 74 20 70 61 72 61 6d 65 74   of that paramet
c8e0: 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a  er is returned,.
c8f0: 2a 2a 20 69 66 20 61 76 61 69 6c 61 62 6c 65 2e  ** if available.
c900: 20 4f 70 74 69 6f 6e 61 6c 20 73 65 63 6f 6e 64   Optional second
c910: 20 61 72 67 75 6d 65 6e 74 20 77 69 6c 6c 20 62   argument will b
c920: 65 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  e returned if th
c930: 65 20 66 69 72 73 74 0a 2a 2a 20 64 6f 65 73 6e  e first.** doesn
c940: 27 74 20 65 78 69 73 74 20 61 73 20 61 20 43 47  't exist as a CG
c950: 49 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a  I parameter..*/.
c960: 4c 4f 43 41 4c 20 76 6f 69 64 20 64 62 5f 73 71  LOCAL void db_sq
c970: 6c 5f 63 67 69 28 73 71 6c 69 74 65 33 5f 63 6f  l_cgi(sqlite3_co
c980: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
c990: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
c9a0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
c9b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 7a  .  const char* z
c9c0: 50 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 31  P;.  if( argc!=1
c9d0: 20 26 26 20 61 72 67 63 21 3d 32 20 29 20 72 65   && argc!=2 ) re
c9e0: 74 75 72 6e 3b 0a 20 20 7a 50 20 3d 20 50 28 28  turn;.  zP = P((
c9f0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
ca00: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
ca10: 72 67 76 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  rgv[0]));.  if( 
ca20: 7a 50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  zP ){.    sqlite
ca30: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
ca40: 6e 74 65 78 74 2c 20 7a 50 2c 20 2d 31 2c 20 53  ntext, zP, -1, S
ca50: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
ca60: 20 7d 65 6c 73 65 20 69 66 28 20 61 72 67 63 3d   }else if( argc=
ca70: 3d 32 20 29 7b 0a 20 20 20 20 7a 50 20 3d 20 28  =2 ){.    zP = (
ca80: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
ca90: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
caa0: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[1]);.    if(
cab0: 20 7a 50 20 29 20 73 71 6c 69 74 65 33 5f 72 65   zP ) sqlite3_re
cac0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
cad0: 74 2c 20 7a 50 2c 20 2d 31 2c 20 53 51 4c 49 54  t, zP, -1, SQLIT
cae0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
caf0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66  }.}../*.** SQL f
cb00: 75 6e 63 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20  unction:.**.**  
cb10: 20 20 20 20 20 69 73 5f 73 65 6c 65 63 74 65 64       is_selected
cb20: 28 69 64 29 0a 2a 2a 20 20 20 20 20 20 20 69 66  (id).**       if
cb30: 5f 73 65 6c 65 63 74 65 64 28 69 64 2c 20 58 2c  _selected(id, X,
cb40: 20 59 29 0a 2a 2a 0a 2a 2a 20 4f 6e 20 74 68 65   Y).**.** On the
cb50: 20 63 6f 6d 6d 69 74 20 63 6f 6d 6d 61 6e 64 2c   commit command,
cb60: 20 77 68 65 6e 20 66 69 6c 65 6e 61 6d 65 73 20   when filenames 
cb70: 61 72 65 20 73 70 65 63 69 66 69 65 64 20 28 69  are specified (i
cb80: 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a  n order to do.**
cb90: 20 61 20 70 61 72 74 69 61 6c 20 63 6f 6d 6d 69   a partial commi
cba0: 74 29 20 74 68 65 20 76 66 69 6c 65 2e 69 64 20  t) the vfile.id 
cbb0: 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 6e  values for the n
cbc0: 61 6d 65 64 20 66 69 6c 65 73 20 61 72 65 20 6c  amed files are l
cbd0: 6f 61 64 65 64 0a 2a 2a 20 69 6e 74 6f 20 74 68  oaded.** into th
cbe0: 65 20 67 2e 61 43 6f 6d 6d 69 74 46 69 6c 65 5b  e g.aCommitFile[
cbf0: 5d 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 66  ] array.  This f
cc00: 75 6e 63 74 69 6f 6e 20 6c 6f 6f 6b 73 20 61 74  unction looks at
cc10: 20 74 68 61 74 20 61 72 72 61 79 0a 2a 2a 20 74   that array.** t
cc20: 6f 20 73 65 65 20 69 66 20 61 20 66 69 6c 65 20  o see if a file 
cc30: 69 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20  is named on the 
cc40: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2e 0a 2a 2a  command-line..**
cc50: 0a 2a 2a 20 49 6e 20 74 68 65 20 66 69 72 73 74  .** In the first
cc60: 20 66 6f 72 6d 20 28 31 20 61 72 67 75 6d 65 6e   form (1 argumen
cc70: 74 29 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  t) return TRUE i
cc80: 66 20 65 69 74 68 65 72 20 6e 6f 20 66 69 6c 65  f either no file
cc90: 73 20 61 72 65 0a 2a 2a 20 6e 61 6d 65 64 20 6f  s are.** named o
cca0: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
ccb0: 6e 65 20 28 67 2e 61 43 6f 6d 6d 69 74 46 69 6c  ne (g.aCommitFil
ccc0: 65 20 69 73 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e  e is NULL meanin
ccd0: 67 20 74 68 61 74 20 61 6c 6c 0a 2a 2a 20 63 68  g that all.** ch
cce0: 61 6e 67 65 73 20 61 72 65 20 74 6f 20 62 65 20  anges are to be 
ccf0: 63 6f 6d 6d 69 74 74 65 64 29 20 6f 72 20 69 66  committed) or if
cd00: 20 69 64 20 69 73 20 66 6f 75 6e 64 20 69 6e 20   id is found in 
cd10: 67 2e 61 43 6f 6d 6d 69 74 46 69 6c 65 5b 5d 0a  g.aCommitFile[].
cd20: 2a 2a 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74  ** (meaning that
cd30: 20 69 64 20 77 61 73 20 6e 61 6d 65 64 20 6f 6e   id was named on
cd40: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e   the command-lin
cd50: 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  e)..**.** In the
cd60: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 28 33 20   second form (3 
cd70: 61 72 67 75 6d 65 6e 74 73 29 20 72 65 74 75 72  arguments) retur
cd80: 6e 20 61 72 67 75 6d 65 6e 74 20 58 20 69 66 20  n argument X if 
cd90: 74 72 75 65 20 61 6e 64 20 59 0a 2a 2a 20 69 66  true and Y.** if
cda0: 20 66 61 6c 73 65 2e 20 20 45 78 63 65 70 74 20   false.  Except 
cdb0: 69 66 20 59 20 69 73 20 4e 55 4c 4c 20 74 68 65  if Y is NULL the
cdc0: 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20  n always return 
cdd0: 58 2e 0a 2a 2f 0a 4c 4f 43 41 4c 20 76 6f 69 64  X..*/.LOCAL void
cde0: 20 66 69 6c 65 5f 69 73 5f 73 65 6c 65 63 74 65   file_is_selecte
cdf0: 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  d(.  sqlite3_con
ce00: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
ce10: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
ce20: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
ce30: 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  v.){.  int rc = 
ce40: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 61 72 67  0;..  assert(arg
ce50: 63 3d 3d 31 20 7c 7c 20 61 72 67 63 3d 3d 33 29  c==1 || argc==3)
ce60: 3b 0a 20 20 69 66 28 20 67 2e 61 43 6f 6d 6d 69  ;.  if( g.aCommi
ce70: 74 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  tFile ){.    int
ce80: 20 69 49 64 20 3d 20 73 71 6c 69 74 65 33 5f 76   iId = sqlite3_v
ce90: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d  alue_int(argv[0]
cea0: 29 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  );.    int ii;. 
ceb0: 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 67 2e 61     for(ii=0; g.a
cec0: 43 6f 6d 6d 69 74 46 69 6c 65 5b 69 69 5d 3b 20  CommitFile[ii]; 
ced0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
cee0: 20 69 49 64 3d 3d 67 2e 61 43 6f 6d 6d 69 74 46   iId==g.aCommitF
cef0: 69 6c 65 5b 69 69 5d 20 29 7b 0a 20 20 20 20 20  ile[ii] ){.     
cf00: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
cf10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
cf20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
cf30: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
cf40: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31 20 29  .  if( argc==1 )
cf50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
cf60: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
cf70: 2c 20 72 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , rc);.  }else{.
cf80: 20 20 20 20 61 73 73 65 72 74 28 20 61 72 67 63      assert( argc
cf90: 3d 3d 33 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==3 );.    asser
cfa0: 74 28 20 72 63 3d 3d 30 20 7c 7c 20 72 63 3d 3d  t( rc==0 || rc==
cfb0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  1 );.    if( sql
cfc0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
cfd0: 61 72 67 76 5b 32 2d 72 63 5d 29 3d 3d 53 51 4c  argv[2-rc])==SQL
cfe0: 49 54 45 5f 4e 55 4c 4c 20 29 20 72 63 20 3d 20  ITE_NULL ) rc = 
cff0: 31 2d 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  1-rc;.    sqlite
d000: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
d010: 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 32 2d 72  ontext, argv[2-r
d020: 63 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  c]);.  }.}../*.*
d030: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 69 6e  * Convert the in
d040: 70 75 74 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  put string into 
d050: 61 6e 20 53 48 41 31 2e 20 20 4d 61 6b 65 20 61  an SHA1.  Make a
d060: 20 6e 6f 74 61 74 69 6f 6e 20 69 6e 20 74 68 65   notation in the
d070: 0a 2a 2a 20 43 4f 4e 43 45 41 4c 45 44 20 74 61  .** CONCEALED ta
d080: 62 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ble so that the 
d090: 68 61 73 68 20 63 61 6e 20 62 65 20 75 6e 64 6f  hash can be undo
d0a0: 20 75 73 69 6e 67 20 74 68 65 20 64 62 5f 72 65   using the db_re
d0b0: 76 65 61 6c 28 29 0a 2a 2a 20 66 75 6e 63 74 69  veal().** functi
d0c0: 6f 6e 20 61 74 20 73 6f 6d 65 20 6c 61 74 65 72  on at some later
d0d0: 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   time..**.** The
d0e0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
d0f0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 73 74 61  is stored in sta
d100: 74 69 63 20 73 70 61 63 65 20 61 6e 64 20 77 69  tic space and wi
d110: 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
d120: 6e 0a 2a 2a 20 6f 6e 20 73 75 62 73 65 71 75 65  n.** on subseque
d130: 6e 74 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  nt calls..**.** 
d140: 49 66 20 7a 43 6f 6e 74 65 6e 74 20 69 73 20 61  If zContent is a
d150: 6c 72 65 61 64 79 20 61 20 77 65 6c 6c 2d 66 6f  lready a well-fo
d160: 72 6d 65 64 20 53 48 41 31 20 68 61 73 68 2c 20  rmed SHA1 hash, 
d170: 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 63 6f  then return a co
d180: 70 79 0a 2a 2a 20 6f 66 20 74 68 61 74 20 68 61  py.** of that ha
d190: 73 68 2c 20 6e 6f 74 20 61 20 68 61 73 68 20 6f  sh, not a hash o
d1a0: 66 20 74 68 65 20 68 61 73 68 2e 0a 2a 2a 0a 2a  f the hash..**.*
d1b0: 2a 20 54 68 65 20 43 4f 4e 43 45 41 4c 45 44 20  * The CONCEALED 
d1c0: 74 61 62 6c 65 20 69 73 20 6d 65 61 6e 74 20 74  table is meant t
d1d0: 6f 20 6f 62 73 63 75 72 65 20 65 6d 61 69 6c 20  o obscure email 
d1e0: 61 64 64 72 65 73 73 65 73 2e 20 20 45 76 65 72  addresses.  Ever
d1f0: 79 20 76 61 6c 69 64 0a 2a 2a 20 65 6d 61 69 6c  y valid.** email
d200: 20 61 64 64 72 65 73 73 20 77 69 6c 6c 20 63 6f   address will co
d210: 6e 74 61 69 6e 20 61 20 22 40 22 20 63 68 61 72  ntain a "@" char
d220: 61 63 74 65 72 20 61 6e 64 20 22 40 22 20 69 73  acter and "@" is
d230: 20 6e 6f 74 20 76 61 6c 69 64 20 77 69 74 68 69   not valid withi
d240: 6e 0a 2a 2a 20 61 6e 20 53 48 41 31 20 68 61 73  n.** an SHA1 has
d250: 68 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  h so there is no
d260: 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 76   chance that a v
d270: 61 6c 69 64 20 65 6d 61 69 6c 20 61 64 64 72 65  alid email addre
d280: 73 73 20 77 69 6c 6c 20 67 6f 0a 2a 2a 20 75 6e  ss will go.** un
d290: 63 6f 6e 63 65 61 6c 65 64 2e 0a 2a 2f 0a 63 68  concealed..*/.ch
d2a0: 61 72 20 2a 64 62 5f 63 6f 6e 63 65 61 6c 28 63  ar *db_conceal(c
d2b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74  onst char *zCont
d2c0: 65 6e 74 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 73  ent, int n){.  s
d2d0: 74 61 74 69 63 20 63 68 61 72 20 7a 48 61 73 68  tatic char zHash
d2e0: 5b 34 32 5d 3b 0a 20 20 42 6c 6f 62 20 6f 75 74  [42];.  Blob out
d2f0: 3b 0a 20 20 69 66 28 20 6e 3d 3d 34 30 20 26 26  ;.  if( n==40 &&
d300: 20 76 61 6c 69 64 61 74 65 31 36 28 7a 43 6f 6e   validate16(zCon
d310: 74 65 6e 74 2c 20 6e 29 20 29 7b 0a 20 20 20 20  tent, n) ){.    
d320: 6d 65 6d 63 70 79 28 7a 48 61 73 68 2c 20 7a 43  memcpy(zHash, zC
d330: 6f 6e 74 65 6e 74 2c 20 6e 29 3b 0a 20 20 20 20  ontent, n);.    
d340: 7a 48 61 73 68 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zHash[n] = 0;.  
d350: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 68 61 31 73  }else{.    sha1s
d360: 75 6d 5f 73 74 65 70 5f 74 65 78 74 28 7a 43 6f  um_step_text(zCo
d370: 6e 74 65 6e 74 2c 20 6e 29 3b 0a 20 20 20 20 73  ntent, n);.    s
d380: 68 61 31 73 75 6d 5f 66 69 6e 69 73 68 28 26 6f  ha1sum_finish(&o
d390: 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
d3a0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
d3b0: 28 7a 48 61 73 68 29 2c 20 7a 48 61 73 68 2c 20  (zHash), zHash, 
d3c0: 22 25 73 22 2c 20 62 6c 6f 62 5f 73 74 72 28 26  "%s", blob_str(&
d3d0: 6f 75 74 29 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  out));.    blob_
d3e0: 72 65 73 65 74 28 26 6f 75 74 29 3b 0a 20 20 20  reset(&out);.   
d3f0: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a   db_multi_exec(.
d400: 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f         "INSERT O
d410: 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 63 6f  R IGNORE INTO co
d420: 6e 63 65 61 6c 65 64 28 68 61 73 68 2c 63 6f 6e  ncealed(hash,con
d430: 74 65 6e 74 2c 6d 74 69 6d 65 29 22 0a 20 20 20  tent,mtime)".   
d440: 20 20 20 20 22 20 56 41 4c 55 45 53 28 25 51 2c      " VALUES(%Q,
d450: 25 23 51 2c 6e 6f 77 28 29 29 22 2c 0a 20 20 20  %#Q,now())",.   
d460: 20 20 20 20 7a 48 61 73 68 2c 20 6e 2c 20 7a 43      zHash, n, zC
d470: 6f 6e 74 65 6e 74 0a 20 20 20 20 29 3b 0a 20 20  ontent.    );.  
d480: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 48 61 73 68  }.  return zHash
d490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
d4a0: 70 74 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 74 68  pt to look up th
d4b0: 65 20 69 6e 70 75 74 20 69 6e 20 74 68 65 20 43  e input in the C
d4c0: 4f 4e 43 45 41 4c 45 44 20 74 61 62 6c 65 2e 20  ONCEALED table. 
d4d0: 20 49 66 20 66 6f 75 6e 64 2c 0a 2a 2a 20 61 6e   If found,.** an
d4e0: 64 20 69 66 20 74 68 65 20 6f 6b 52 64 41 64 64  d if the okRdAdd
d4f0: 72 20 70 65 72 6d 69 73 73 69 6f 6e 20 69 73 20  r permission is 
d500: 65 6e 61 62 6c 65 64 20 74 68 65 6e 20 72 65 74  enabled then ret
d510: 75 72 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  urn the.** origi
d520: 6e 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 77 68  nal value for wh
d530: 69 63 68 20 74 68 65 20 69 6e 70 75 74 20 69 73  ich the input is
d540: 20 61 20 68 61 73 68 2e 20 20 49 66 20 6f 6b 52   a hash.  If okR
d550: 64 41 64 64 72 20 69 73 0a 2a 2a 20 66 61 6c 73  dAddr is.** fals
d560: 65 20 6f 72 20 69 66 20 74 68 65 20 6c 6f 6f 6b  e or if the look
d570: 75 70 20 66 61 69 6c 73 2c 20 72 65 74 75 72 6e  up fails, return
d580: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74   the original st
d590: 72 69 6e 67 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  ring content..**
d5a0: 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
d5b0: 73 65 2c 20 74 68 65 20 73 74 72 69 6e 67 20 72  se, the string r
d5c0: 65 74 75 72 6e 65 64 20 69 73 20 73 74 6f 72 65  eturned is store
d5d0: 64 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69  d in space obtai
d5e0: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c  ned.** from mall
d5f0: 6f 63 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  oc and should be
d600: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
d610: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
d620: 2a 2f 0a 63 68 61 72 20 2a 64 62 5f 72 65 76 65  */.char *db_reve
d630: 61 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  al(const char *z
d640: 4b 65 79 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f  Key){.  char *zO
d650: 75 74 3b 0a 20 20 69 66 28 20 67 2e 70 65 72 6d  ut;.  if( g.perm
d660: 2e 52 64 41 64 64 72 20 29 7b 0a 20 20 20 20 7a  .RdAddr ){.    z
d670: 4f 75 74 20 3d 20 64 62 5f 74 65 78 74 28 30 2c  Out = db_text(0,
d680: 20 22 53 45 4c 45 43 54 20 63 6f 6e 74 65 6e 74   "SELECT content
d690: 20 46 52 4f 4d 20 63 6f 6e 63 65 61 6c 65 64 20   FROM concealed 
d6a0: 57 48 45 52 45 20 68 61 73 68 3d 25 51 22 2c 20  WHERE hash=%Q", 
d6b0: 7a 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zKey);.  }else{.
d6c0: 20 20 20 20 7a 4f 75 74 20 3d 20 30 3b 0a 20 20      zOut = 0;.  
d6d0: 7d 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20  }.  if( zOut==0 
d6e0: 29 7b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 6d 70  ){.    zOut = mp
d6f0: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4b 65 79  rintf("%s", zKey
d700: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
d710: 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  zOut;.}../*.** R
d720: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
d730: 65 20 73 74 72 69 6e 67 20 7a 56 61 6c 20 72 65  e string zVal re
d740: 70 72 65 73 65 6e 74 73 20 22 74 72 75 65 22 20  presents "true" 
d750: 28 6f 72 20 22 66 61 6c 73 65 22 29 2e 0a 2a 2f  (or "false")..*/
d760: 0a 69 6e 74 20 69 73 5f 74 72 75 74 68 28 63 6f  .int is_truth(co
d770: 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 29 7b  nst char *zVal){
d780: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
d790: 63 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a 4f 6e  char *const azOn
d7a0: 5b 5d 20 3d 20 7b 20 22 6f 6e 22 2c 20 22 79 65  [] = { "on", "ye
d7b0: 73 22 2c 20 22 74 72 75 65 22 2c 20 22 31 22 20  s", "true", "1" 
d7c0: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  };.  int i;.  fo
d7d0: 72 28 69 3d 30 3b 20 69 3c 63 6f 75 6e 74 28 61  r(i=0; i<count(a
d7e0: 7a 4f 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  zOn); i++){.    
d7f0: 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 69 63  if( fossil_stric
d800: 6d 70 28 7a 56 61 6c 2c 61 7a 4f 6e 5b 69 5d 29  mp(zVal,azOn[i])
d810: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
d820: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
d830: 7d 0a 69 6e 74 20 69 73 5f 66 61 6c 73 65 28 63  }.int is_false(c
d840: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 29  onst char *zVal)
d850: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
d860: 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a 4f   char *const azO
d870: 66 66 5b 5d 20 3d 20 7b 20 22 6f 66 66 22 2c 20  ff[] = { "off", 
d880: 22 6e 6f 22 2c 20 22 66 61 6c 73 65 22 2c 20 22  "no", "false", "
d890: 30 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  0" };.  int i;. 
d8a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f 75 6e   for(i=0; i<coun
d8b0: 74 28 61 7a 4f 66 66 29 3b 20 69 2b 2b 29 7b 0a  t(azOff); i++){.
d8c0: 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73      if( fossil_s
d8d0: 74 72 69 63 6d 70 28 7a 56 61 6c 2c 61 7a 4f 66  tricmp(zVal,azOf
d8e0: 66 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72  f[i])==0 ) retur
d8f0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
d900: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77  n 0;.}../*.** Sw
d910: 61 70 20 74 68 65 20 67 2e 64 62 20 61 6e 64 20  ap the g.db and 
d920: 67 2e 64 62 43 6f 6e 66 69 67 20 63 6f 6e 6e 65  g.dbConfig conne
d930: 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74  ctions so that t
d940: 68 65 20 76 61 72 69 6f 75 73 20 64 62 5f 2a 20  he various db_* 
d950: 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 77 6f 72 6b  routines.** work
d960: 20 6f 6e 20 74 68 65 20 7e 2f 2e 66 6f 73 73 69   on the ~/.fossi
d970: 6c 20 64 61 74 61 62 61 73 65 20 69 6e 73 74 65  l database inste
d980: 61 64 20 6f 66 20 6f 6e 20 74 68 65 20 72 65 70  ad of on the rep
d990: 6f 73 69 74 6f 72 79 20 64 61 74 61 62 61 73 65  ository database
d9a0: 2e 0a 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20  ..** Be sure to 
d9b0: 73 77 61 70 20 74 68 65 6d 20 62 61 63 6b 20 61  swap them back a
d9c0: 66 74 65 72 20 64 6f 69 6e 67 20 74 68 65 20 6f  fter doing the o
d9d0: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
d9e0: 49 66 20 74 68 65 20 7e 2f 2e 66 6f 73 73 69 6c  If the ~/.fossil
d9f0: 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61 6c   database has al
da00: 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
da10: 64 20 61 73 20 74 68 65 20 6d 61 69 6e 20 64 61  d as the main da
da20: 74 61 62 61 73 65 20 6f 72 0a 2a 2a 20 69 73 20  tabase or.** is 
da30: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
da40: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2c 20 6e  main database, n
da50: 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 77 61  o connection swa
da60: 70 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ps are required 
da70: 73 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  so this.** routi
da80: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
da90: 2f 0a 76 6f 69 64 20 64 62 5f 73 77 61 70 5f 63  /.void db_swap_c
daa0: 6f 6e 6e 65 63 74 69 6f 6e 73 28 76 6f 69 64 29  onnections(void)
dab0: 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 68 65 6e  {.  /*.  ** When
dac0: 20 73 77 61 70 70 69 6e 67 20 74 68 65 20 6d 61   swapping the ma
dad0: 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  in database conn
dae0: 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  ection with the 
daf0: 63 6f 6e 66 69 67 20 64 61 74 61 62 61 73 65 0a  config database.
db00: 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c    ** connection,
db10: 20 74 68 65 20 63 6f 6e 66 69 67 20 64 61 74 61   the config data
db20: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
db30: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 28 6e 6f  must be open (no
db40: 74 20 73 69 6d 70 6c 79 0a 20 20 2a 2a 20 61 74  t simply.  ** at
db50: 74 61 63 68 65 64 29 3b 20 6f 74 68 65 72 77 69  tached); otherwi
db60: 73 65 2c 20 74 68 65 20 73 77 61 70 20 77 6f 75  se, the swap wou
db70: 6c 64 20 65 6e 64 20 75 70 20 6c 65 61 76 69 6e  ld end up leavin
db80: 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  g the main datab
db90: 61 73 65 0a 20 20 2a 2a 20 63 6f 6e 6e 65 63 74  ase.  ** connect
dba0: 69 6f 6e 20 69 6e 76 61 6c 69 64 2c 20 64 65 66  ion invalid, def
dbb0: 65 61 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  eating the very 
dbc0: 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20  purpose of this 
dbd0: 72 6f 75 74 69 6e 65 2e 20 20 54 68 69 73 0a 20  routine.  This. 
dbe0: 20 2a 2a 20 73 61 6d 65 20 63 6f 6e 73 74 72 61   ** same constra
dbf0: 69 6e 74 20 61 6c 73 6f 20 68 6f 6c 64 73 20 74  int also holds t
dc00: 72 75 65 20 77 68 65 6e 20 72 65 73 74 6f 72 69  rue when restori
dc10: 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ng the previousl
dc20: 79 20 73 77 61 70 70 65 64 0a 20 20 2a 2a 20 64  y swapped.  ** d
dc30: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
dc40: 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 69  on; otherwise, i
dc50: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  t means that no 
dc60: 73 77 61 70 20 77 61 73 20 70 65 72 66 6f 72 6d  swap was perform
dc70: 65 64 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  ed.  ** because 
dc80: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
dc90: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
dca0: 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
dcb0: 67 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 0a  g to the config.
dcc0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
dcd0: 20 2a 2f 0a 20 20 69 66 28 20 67 2e 64 62 43 6f   */.  if( g.dbCo
dce0: 6e 66 69 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  nfig ){.    sqli
dcf0: 74 65 33 20 2a 64 62 54 65 6d 70 20 3d 20 67 2e  te3 *dbTemp = g.
dd00: 64 62 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  db;.    const ch
dd10: 61 72 20 2a 7a 54 65 6d 70 44 62 54 79 70 65 20  ar *zTempDbType 
dd20: 3d 20 67 2e 7a 4d 61 69 6e 44 62 54 79 70 65 3b  = g.zMainDbType;
dd30: 0a 20 20 20 20 67 2e 64 62 20 3d 20 67 2e 64 62  .    g.db = g.db
dd40: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 67 2e 7a 4d  Config;.    g.zM
dd50: 61 69 6e 44 62 54 79 70 65 20 3d 20 67 2e 7a 43  ainDbType = g.zC
dd60: 6f 6e 66 69 67 44 62 54 79 70 65 3b 0a 20 20 20  onfigDbType;.   
dd70: 20 67 2e 64 62 43 6f 6e 66 69 67 20 3d 20 64 62   g.dbConfig = db
dd80: 54 65 6d 70 3b 0a 20 20 20 20 67 2e 7a 43 6f 6e  Temp;.    g.zCon
dd90: 66 69 67 44 62 54 79 70 65 20 3d 20 7a 54 65 6d  figDbType = zTem
dda0: 70 44 62 54 79 70 65 3b 0a 20 20 7d 0a 7d 0a 0a  pDbType;.  }.}..
ddb0: 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 72 65 61  /*.** Try to rea
ddc0: 64 20 61 20 76 65 72 73 69 6f 6e 65 64 20 73 65  d a versioned se
ddd0: 74 74 69 6e 67 20 73 74 72 69 6e 67 20 66 72 6f  tting string fro
dde0: 6d 20 2e 66 6f 73 73 69 6c 2d 73 65 74 74 69 6e  m .fossil-settin
ddf0: 67 73 2f 3c 6e 61 6d 65 3e 2e 0a 2a 2a 0a 2a 2a  gs/<name>..**.**
de00: 20 52 65 74 75 72 6e 20 74 68 65 20 74 65 78 74   Return the text
de10: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 69   of the string i
de20: 66 20 69 74 20 69 73 20 66 6f 75 6e 64 2e 20 20  f it is found.  
de30: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
de40: 6f 74 0a 2a 2a 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  ot.** found..**.
de50: 2a 2a 20 49 66 20 74 68 65 20 7a 4e 6f 6e 56 65  ** If the zNonVe
de60: 72 73 69 6f 6e 65 64 53 65 74 74 69 6e 67 20 70  rsionedSetting p
de70: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
de80: 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 68 6f 6c  NULL then it hol
de90: 64 73 20 74 68 65 0a 2a 2a 20 6e 6f 6e 2d 76 65  ds the.** non-ve
dea0: 72 73 69 6f 6e 65 64 20 76 61 6c 75 65 20 66 6f  rsioned value fo
deb0: 72 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e 20  r this setting. 
dec0: 20 49 66 20 62 6f 74 68 20 61 20 76 65 72 73 69   If both a versi
ded0: 6f 6e 65 64 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f  oned and a.** no
dee0: 6e 2d 76 65 72 73 69 6f 6e 65 64 20 76 61 6c 75  n-versioned valu
def0: 65 20 65 78 69 73 74 20 61 6e 64 20 61 72 65 20  e exist and are 
df00: 6e 6f 74 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  not equal, then 
df10: 61 20 77 61 72 6e 69 6e 67 20 6d 65 73 73 61 67  a warning messag
df20: 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 65  e.** might be ge
df30: 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 63 68 61 72  nerated..*/.char
df40: 20 2a 64 62 5f 67 65 74 5f 76 65 72 73 69 6f 6e   *db_get_version
df50: 65 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ed(const char *z
df60: 4e 61 6d 65 2c 20 63 68 61 72 20 2a 7a 4e 6f 6e  Name, char *zNon
df70: 56 65 72 73 69 6f 6e 65 64 53 65 74 74 69 6e 67  VersionedSetting
df80: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 56 65 72 73  ){.  char *zVers
df90: 69 6f 6e 65 64 53 65 74 74 69 6e 67 20 3d 20 30  ionedSetting = 0
dfa0: 3b 0a 20 20 69 6e 74 20 6e 6f 57 61 72 6e 20 3d  ;.  int noWarn =
dfb0: 20 30 3b 0a 20 20 69 6e 74 20 66 6f 75 6e 64 20   0;.  int found 
dfc0: 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 5f 63  = 0;.  struct _c
dfd0: 61 63 68 65 45 6e 74 72 79 20 7b 0a 20 20 20 20  acheEntry {.    
dfe0: 73 74 72 75 63 74 20 5f 63 61 63 68 65 45 6e 74  struct _cacheEnt
dff0: 72 79 20 2a 6e 65 78 74 3b 0a 20 20 20 20 63 6f  ry *next;.    co
e000: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
e010: 20 2a 7a 56 61 6c 75 65 3b 0a 20 20 7d 20 2a 63   *zValue;.  } *c
e020: 61 63 68 65 45 6e 74 72 79 20 3d 20 30 3b 0a 20  acheEntry = 0;. 
e030: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 5f   static struct _
e040: 63 61 63 68 65 45 6e 74 72 79 20 2a 63 61 63 68  cacheEntry *cach
e050: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 21 67  e = 0;..  if( !g
e060: 2e 6c 6f 63 61 6c 4f 70 65 6e 20 26 26 20 67 2e  .localOpen && g.
e070: 7a 4f 70 65 6e 52 65 76 69 73 69 6f 6e 3d 3d 30  zOpenRevision==0
e080: 20 29 20 72 65 74 75 72 6e 20 7a 4e 6f 6e 56 65   ) return zNonVe
e090: 72 73 69 6f 6e 65 64 53 65 74 74 69 6e 67 3b 0a  rsionedSetting;.
e0a0: 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 6e 61 6d    /* Look up nam
e0b0: 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  e in cache */.  
e0c0: 63 61 63 68 65 45 6e 74 72 79 20 3d 20 63 61 63  cacheEntry = cac
e0d0: 68 65 3b 0a 20 20 77 68 69 6c 65 28 20 63 61 63  he;.  while( cac
e0e0: 68 65 45 6e 74 72 79 21 3d 30 20 29 7b 0a 20 20  heEntry!=0 ){.  
e0f0: 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72    if( fossil_str
e100: 63 6d 70 28 63 61 63 68 65 45 6e 74 72 79 2d 3e  cmp(cacheEntry->
e110: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
e120: 20 29 7b 0a 20 20 20 20 20 20 7a 56 65 72 73 69   ){.      zVersi
e130: 6f 6e 65 64 53 65 74 74 69 6e 67 20 3d 20 66 6f  onedSetting = fo
e140: 73 73 69 6c 5f 73 74 72 64 75 70 28 63 61 63 68  ssil_strdup(cach
e150: 65 45 6e 74 72 79 2d 3e 7a 56 61 6c 75 65 29 3b  eEntry->zValue);
e160: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e170: 20 20 7d 0a 20 20 20 20 63 61 63 68 65 45 6e 74    }.    cacheEnt
e180: 72 79 20 3d 20 63 61 63 68 65 45 6e 74 72 79 2d  ry = cacheEntry-
e190: 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20  >next;.  }.  /* 
e1a0: 41 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20  Attempt to read 
e1b0: 76 61 6c 75 65 20 66 72 6f 6d 20 66 69 6c 65 20  value from file 
e1c0: 69 6e 20 63 68 65 63 6b 6f 75 74 20 69 66 20 74  in checkout if t
e1d0: 68 65 72 65 20 77 61 73 6e 27 74 20 61 20 63 61  here wasn't a ca
e1e0: 63 68 65 20 68 69 74 2e 20 2a 2f 0a 20 20 69 66  che hit. */.  if
e1f0: 28 20 63 61 63 68 65 45 6e 74 72 79 3d 3d 30 20  ( cacheEntry==0 
e200: 29 7b 0a 20 20 20 20 42 6c 6f 62 20 76 65 72 73  ){.    Blob vers
e210: 69 6f 6e 65 64 50 61 74 68 6e 61 6d 65 3b 0a 20  ionedPathname;. 
e220: 20 20 20 42 6c 6f 62 20 73 65 74 74 69 6e 67 3b     Blob setting;
e230: 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26  .    blob_zero(&
e240: 76 65 72 73 69 6f 6e 65 64 50 61 74 68 6e 61 6d  versionedPathnam
e250: 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72  e);.    blob_zer
e260: 6f 28 26 73 65 74 74 69 6e 67 29 3b 0a 20 20 20  o(&setting);.   
e270: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 76   blob_appendf(&v
e280: 65 72 73 69 6f 6e 65 64 50 61 74 68 6e 61 6d 65  ersionedPathname
e290: 2c 20 22 25 73 2e 66 6f 73 73 69 6c 2d 73 65 74  , "%s.fossil-set
e2a0: 74 69 6e 67 73 2f 25 73 22 2c 0a 20 20 20 20 20  tings/%s",.     
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 67 2e 7a 4c              g.zL
e2c0: 6f 63 61 6c 52 6f 6f 74 2c 20 7a 4e 61 6d 65 29  ocalRoot, zName)
e2d0: 3b 0a 20 20 20 20 69 66 28 20 21 67 2e 6c 6f 63  ;.    if( !g.loc
e2e0: 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  alOpen ){.      
e2f0: 2f 2a 20 52 65 70 6f 73 69 74 6f 72 79 20 69 73  /* Repository is
e300: 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20   in the process 
e310: 6f 66 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 2c  of being opened,
e320: 20 62 75 74 20 66 69 6c 65 73 20 68 61 76 65 20   but files have 
e330: 6e 6f 74 20 62 65 65 6e 0a 20 20 20 20 20 20 20  not been.       
e340: 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  * written to dis
e350: 6b 2e 20 4c 6f 61 64 20 66 72 6f 6d 20 74 68 65  k. Load from the
e360: 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20   database. */.  
e370: 20 20 20 20 42 6c 6f 62 20 6e 6f 57 61 72 6e 46      Blob noWarnF
e380: 69 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 68  ile;.      if( h
e390: 69 73 74 6f 72 69 63 61 6c 5f 76 65 72 73 69 6f  istorical_versio
e3a0: 6e 5f 6f 66 5f 66 69 6c 65 28 67 2e 7a 4f 70 65  n_of_file(g.zOpe
e3b0: 6e 52 65 76 69 73 69 6f 6e 2c 0a 20 20 20 20 20  nRevision,.     
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 62 6c 6f 62 5f 73 74 72 28 26 76 65 72 73 69 6f  blob_str(&versio
e3f0: 6e 65 64 50 61 74 68 6e 61 6d 65 29 2c 0a 20 20  nedPathname),.  
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e420: 20 20 20 26 73 65 74 74 69 6e 67 2c 20 30 2c 20     &setting, 0, 
e430: 30 2c 20 30 2c 20 32 29 21 3d 32 20 29 7b 0a 20  0, 0, 2)!=2 ){. 
e440: 20 20 20 20 20 20 20 66 6f 75 6e 64 20 3d 20 31         found = 1
e450: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e460: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 72 65 27  /* See if there'
e470: 73 20 61 20 6e 6f 2d 77 61 72 6e 20 66 6c 61 67  s a no-warn flag
e480: 20 2a 2f 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61   */.      blob_a
e490: 70 70 65 6e 64 28 26 76 65 72 73 69 6f 6e 65 64  ppend(&versioned
e4a0: 50 61 74 68 6e 61 6d 65 2c 20 22 2e 6e 6f 2d 77  Pathname, ".no-w
e4b0: 61 72 6e 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20  arn", -1);.     
e4c0: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6e 6f 57 61   blob_zero(&noWa
e4d0: 72 6e 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  rnFile);.      i
e4e0: 66 28 20 68 69 73 74 6f 72 69 63 61 6c 5f 76 65  f( historical_ve
e4f0: 72 73 69 6f 6e 5f 6f 66 5f 66 69 6c 65 28 67 2e  rsion_of_file(g.
e500: 7a 4f 70 65 6e 52 65 76 69 73 69 6f 6e 2c 0a 20  zOpenRevision,. 
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 20 20 20 62 6c 6f 62 5f 73 74 72 28 26 76 65      blob_str(&ve
e540: 72 73 69 6f 6e 65 64 50 61 74 68 6e 61 6d 65 29  rsionedPathname)
e550: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e570: 20 20 20 20 20 20 20 26 6e 6f 57 61 72 6e 46 69         &noWarnFi
e580: 6c 65 2c 20 30 2c 20 30 2c 20 30 2c 20 32 29 21  le, 0, 0, 0, 2)!
e590: 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 6f  =2 ){.        no
e5a0: 57 61 72 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Warn = 1;.      
e5b0: 7d 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73  }.      blob_res
e5c0: 65 74 28 26 6e 6f 57 61 72 6e 46 69 6c 65 29 3b  et(&noWarnFile);
e5d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66  .    }else if( f
e5e0: 69 6c 65 5f 73 69 7a 65 28 62 6c 6f 62 5f 73 74  ile_size(blob_st
e5f0: 72 28 26 76 65 72 73 69 6f 6e 65 64 50 61 74 68  r(&versionedPath
e600: 6e 61 6d 65 29 29 3e 3d 30 20 29 7b 0a 20 20 20  name))>=0 ){.   
e610: 20 20 20 2f 2a 20 46 69 6c 65 20 65 78 69 73 74     /* File exist
e620: 73 2c 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73 20  s, and contains 
e630: 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
e640: 69 73 20 73 65 74 74 69 6e 67 2e 20 4c 6f 61 64  is setting. Load
e650: 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 74   from.      ** t
e660: 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  he file. */.    
e670: 20 20 69 66 28 20 62 6c 6f 62 5f 72 65 61 64 5f    if( blob_read_
e680: 66 72 6f 6d 5f 66 69 6c 65 28 26 73 65 74 74 69  from_file(&setti
e690: 6e 67 2c 20 62 6c 6f 62 5f 73 74 72 28 26 76 65  ng, blob_str(&ve
e6a0: 72 73 69 6f 6e 65 64 50 61 74 68 6e 61 6d 65 29  rsionedPathname)
e6b0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
e6c0: 66 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20  found = 1;.     
e6d0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 53 65 65 20   }.      /* See 
e6e0: 69 66 20 74 68 65 72 65 27 73 20 61 20 6e 6f 2d  if there's a no-
e6f0: 77 61 72 6e 20 66 6c 61 67 20 2a 2f 0a 20 20 20  warn flag */.   
e700: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26     blob_append(&
e710: 76 65 72 73 69 6f 6e 65 64 50 61 74 68 6e 61 6d  versionedPathnam
e720: 65 2c 20 22 2e 6e 6f 2d 77 61 72 6e 22 2c 20 2d  e, ".no-warn", -
e730: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 69  1);.      if( fi
e740: 6c 65 5f 73 69 7a 65 28 62 6c 6f 62 5f 73 74 72  le_size(blob_str
e750: 28 26 76 65 72 73 69 6f 6e 65 64 50 61 74 68 6e  (&versionedPathn
e760: 61 6d 65 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20  ame))>=0 ){.    
e770: 20 20 20 20 6e 6f 57 61 72 6e 20 3d 20 31 3b 0a      noWarn = 1;.
e780: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e790: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 76 65    blob_reset(&ve
e7a0: 72 73 69 6f 6e 65 64 50 61 74 68 6e 61 6d 65 29  rsionedPathname)
e7b0: 3b 0a 20 20 20 20 69 66 28 20 66 6f 75 6e 64 20  ;.    if( found 
e7c0: 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 74 72  ){.      blob_tr
e7d0: 69 6d 28 26 73 65 74 74 69 6e 67 29 3b 20 2f 2a  im(&setting); /*
e7e0: 20 41 76 6f 69 64 20 6e 6f 6e 2d 6f 62 76 69 6f   Avoid non-obvio
e7f0: 75 73 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  us problems with
e800: 20 6c 69 6e 65 20 65 6e 64 69 6e 67 73 0a 20 20   line endings.  
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 62           ** on b
e830: 6f 6f 6c 65 61 6e 20 70 72 6f 70 65 72 74 69 65  oolean propertie
e840: 73 20 2a 2f 0a 20 20 20 20 20 20 7a 56 65 72 73  s */.      zVers
e850: 69 6f 6e 65 64 53 65 74 74 69 6e 67 20 3d 20 66  ionedSetting = f
e860: 6f 73 73 69 6c 5f 73 74 72 64 75 70 28 62 6c 6f  ossil_strdup(blo
e870: 62 5f 73 74 72 28 26 73 65 74 74 69 6e 67 29 29  b_str(&setting))
e880: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62  ;.    }.    blob
e890: 5f 72 65 73 65 74 28 26 73 65 74 74 69 6e 67 29  _reset(&setting)
e8a0: 3b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72  ;.    /* Store r
e8b0: 65 73 75 6c 74 20 69 6e 20 63 61 63 68 65 2c 20  esult in cache, 
e8c0: 77 68 69 63 68 20 63 61 6e 20 62 65 20 74 68 65  which can be the
e8d0: 20 76 61 6c 75 65 20 6f 72 20 30 20 69 66 20 6e   value or 0 if n
e8e0: 6f 74 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  ot found */.    
e8f0: 63 61 63 68 65 45 6e 74 72 79 20 3d 20 28 73 74  cacheEntry = (st
e900: 72 75 63 74 20 5f 63 61 63 68 65 45 6e 74 72 79  ruct _cacheEntry
e910: 2a 29 66 6f 73 73 69 6c 5f 6d 61 6c 6c 6f 63 28  *)fossil_malloc(
e920: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 5f 63  sizeof(struct _c
e930: 61 63 68 65 45 6e 74 72 79 29 29 3b 0a 20 20 20  acheEntry));.   
e940: 20 63 61 63 68 65 45 6e 74 72 79 2d 3e 6e 65 78   cacheEntry->nex
e950: 74 20 3d 20 63 61 63 68 65 3b 0a 20 20 20 20 63  t = cache;.    c
e960: 61 63 68 65 45 6e 74 72 79 2d 3e 7a 4e 61 6d 65  acheEntry->zName
e970: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 61   = zName;.    ca
e980: 63 68 65 45 6e 74 72 79 2d 3e 7a 56 61 6c 75 65  cheEntry->zValue
e990: 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 64 75 70   = fossil_strdup
e9a0: 28 7a 56 65 72 73 69 6f 6e 65 64 53 65 74 74 69  (zVersionedSetti
e9b0: 6e 67 29 3b 0a 20 20 20 20 63 61 63 68 65 20 3d  ng);.    cache =
e9c0: 20 63 61 63 68 65 45 6e 74 72 79 3b 0a 20 20 7d   cacheEntry;.  }
e9d0: 0a 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 20  .  /* Display a 
e9e0: 77 61 72 6e 69 6e 67 3f 20 2a 2f 0a 20 20 69 66  warning? */.  if
e9f0: 28 20 7a 56 65 72 73 69 6f 6e 65 64 53 65 74 74  ( zVersionedSett
ea00: 69 6e 67 21 3d 30 20 26 26 20 7a 4e 6f 6e 56 65  ing!=0 && zNonVe
ea10: 72 73 69 6f 6e 65 64 53 65 74 74 69 6e 67 21 3d  rsionedSetting!=
ea20: 30 0a 20 20 20 26 26 20 7a 4e 6f 6e 56 65 72 73  0.   && zNonVers
ea30: 69 6f 6e 65 64 53 65 74 74 69 6e 67 5b 30 5d 21  ionedSetting[0]!
ea40: 3d 27 5c 30 27 20 26 26 20 21 6e 6f 57 61 72 6e  ='\0' && !noWarn
ea50: 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  .  ){.    /* The
ea60: 72 65 27 73 20 61 20 76 65 72 73 69 6f 6e 65 64  re's a versioned
ea70: 20 73 65 74 74 69 6e 67 2c 20 61 6e 64 20 61 20   setting, and a 
ea80: 6e 6f 6e 2d 76 65 72 73 69 6f 6e 65 64 20 73 65  non-versioned se
ea90: 74 74 69 6e 67 2e 20 54 65 6c 6c 0a 20 20 20 20  tting. Tell.    
eaa0: 2a 2a 20 74 68 65 20 75 73 65 72 20 61 62 6f 75  ** the user abou
eab0: 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 2a  t the conflict *
eac0: 2f 0a 20 20 20 20 66 6f 73 73 69 6c 5f 77 61 72  /.    fossil_war
ead0: 6e 69 6e 67 28 0a 20 20 20 20 20 20 20 20 22 73  ning(.        "s
eae0: 65 74 74 69 6e 67 20 25 73 20 68 61 73 20 62 6f  etting %s has bo
eaf0: 74 68 20 76 65 72 73 69 6f 6e 65 64 20 61 6e 64  th versioned and
eb00: 20 6e 6f 6e 2d 76 65 72 73 69 6f 6e 65 64 20 76   non-versioned v
eb10: 61 6c 75 65 73 3a 20 75 73 69 6e 67 20 22 0a 20  alues: using ". 
eb20: 20 20 20 20 20 20 20 22 76 65 72 73 69 6f 6e 65         "versione
eb30: 64 20 76 61 6c 75 65 20 66 72 6f 6d 20 66 69 6c  d value from fil
eb40: 65 20 2e 66 6f 73 73 69 6c 2d 73 65 74 74 69 6e  e .fossil-settin
eb50: 67 73 2f 25 73 20 28 74 6f 20 73 69 6c 65 6e 63  gs/%s (to silenc
eb60: 65 20 74 68 69 73 20 22 0a 20 20 20 20 20 20 20  e this ".       
eb70: 20 22 77 61 72 6e 69 6e 67 2c 20 65 69 74 68 65   "warning, eithe
eb80: 72 20 63 72 65 61 74 65 20 61 6e 20 65 6d 70 74  r create an empt
eb90: 79 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 0a 20  y file named ". 
eba0: 20 20 20 20 20 20 20 22 2e 66 6f 73 73 69 6c 2d         ".fossil-
ebb0: 73 65 74 74 69 6e 67 73 2f 25 73 2e 6e 6f 2d 77  settings/%s.no-w
ebc0: 61 72 6e 20 6f 72 20 64 65 6c 65 74 65 20 74 68  arn or delete th
ebd0: 65 20 6e 6f 6e 2d 76 65 72 73 69 6f 6e 65 64 20  e non-versioned 
ebe0: 73 65 74 74 69 6e 67 20 22 0a 20 20 20 20 20 20  setting ".      
ebf0: 20 20 22 20 77 69 74 68 20 5c 22 66 6f 73 73 69    " with \"fossi
ec00: 6c 20 75 6e 73 65 74 20 25 73 5c 22 29 22 2c 20  l unset %s\")", 
ec10: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a 4e  zName, zName, zN
ec20: 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29  ame, zName.    )
ec30: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 50 72 65 66 65  ;.  }.  /* Prefe
ec40: 72 20 74 68 65 20 76 65 72 73 69 6f 6e 65 64 20  r the versioned 
ec50: 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 72 65 74  setting */.  ret
ec60: 75 72 6e 20 28 20 7a 56 65 72 73 69 6f 6e 65 64  urn ( zVersioned
ec70: 53 65 74 74 69 6e 67 21 3d 30 20 29 20 3f 20 7a  Setting!=0 ) ? z
ec80: 56 65 72 73 69 6f 6e 65 64 53 65 74 74 69 6e 67  VersionedSetting
ec90: 20 3a 20 7a 4e 6f 6e 56 65 72 73 69 6f 6e 65 64   : zNonVersioned
eca0: 53 65 74 74 69 6e 67 3b 0a 7d 0a 0a 0a 2f 2a 0a  Setting;.}.../*.
ecb0: 2a 2a 20 47 65 74 20 61 6e 64 20 73 65 74 20 76  ** Get and set v
ecc0: 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20 43  alues from the C
ecd0: 4f 4e 46 49 47 2c 20 47 4c 4f 42 41 4c 5f 43 4f  ONFIG, GLOBAL_CO
ece0: 4e 46 49 47 20 61 6e 64 20 56 56 41 52 20 74 61  NFIG and VVAR ta
ecf0: 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 65  ble in the.** re
ed00: 70 6f 73 69 74 6f 72 79 20 61 6e 64 20 6c 6f 63  pository and loc
ed10: 61 6c 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  al databases..**
ed20: 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 63 68 20 76  .** If no such v
ed30: 61 72 69 61 62 6c 65 20 65 78 69 73 74 73 2c 20  ariable exists, 
ed40: 72 65 74 75 72 6e 20 7a 44 65 66 61 75 6c 74 2e  return zDefault.
ed50: 20 20 4f 72 2c 20 69 66 20 7a 4e 61 6d 65 20 69    Or, if zName i
ed60: 73 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  s the name.** of
ed70: 20 61 20 73 65 74 74 69 6e 67 2c 20 74 68 65 6e   a setting, then
ed80: 20 74 68 65 20 7a 44 65 66 61 75 6c 74 20 69 73   the zDefault is
ed90: 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74 68 65   ignored and the
eda0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f   default value o
edb0: 66 20 74 68 65 0a 2a 2a 20 73 65 74 74 69 6e 67  f the.** setting
edc0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73   is returned ins
edd0: 74 65 61 64 2e 20 20 49 66 20 7a 4e 61 6d 65 20  tead.  If zName 
ede0: 69 73 20 61 20 76 65 72 73 69 6f 6e 65 64 20 73  is a versioned s
edf0: 65 74 74 69 6e 67 2c 20 74 68 65 6e 0a 2a 2a 20  etting, then.** 
ee00: 76 65 72 73 69 6f 6e 65 64 20 76 61 6c 75 65 20  versioned value 
ee10: 74 61 6b 65 73 20 70 72 69 6f 72 69 74 79 2e 0a  takes priority..
ee20: 2a 2f 0a 63 68 61 72 20 2a 64 62 5f 67 65 74 28  */.char *db_get(
ee30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
ee40: 65 2c 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  e, char *zDefaul
ee50: 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20  t){.  char *z = 
ee60: 30 3b 0a 20 20 63 6f 6e 73 74 20 53 65 74 74 69  0;.  const Setti
ee70: 6e 67 20 2a 70 53 65 74 74 69 6e 67 20 3d 20 64  ng *pSetting = d
ee80: 62 5f 66 69 6e 64 5f 73 65 74 74 69 6e 67 28 7a  b_find_setting(z
ee90: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Name, 0);.  if( 
eea0: 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e  g.repositoryOpen
eeb0: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 64 62 5f 74   ){.    z = db_t
eec0: 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 76  ext(0, "SELECT v
eed0: 61 6c 75 65 20 46 52 4f 4d 20 63 6f 6e 66 69 67  alue FROM config
eee0: 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
eef0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69   zName);.  }.  i
ef00: 66 28 20 7a 3d 3d 30 20 26 26 20 67 2e 7a 43 6f  f( z==0 && g.zCo
ef10: 6e 66 69 67 44 62 4e 61 6d 65 20 29 7b 0a 20 20  nfigDbName ){.  
ef20: 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65 63    db_swap_connec
ef30: 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 7a 20 3d  tions();.    z =
ef40: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
ef50: 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 67  ECT value FROM g
ef60: 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45  lobal_config WHE
ef70: 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61  RE name=%Q", zNa
ef80: 6d 65 29 3b 0a 20 20 20 20 64 62 5f 73 77 61 70  me);.    db_swap
ef90: 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 29 3b 0a  _connections();.
efa0: 20 20 7d 0a 20 20 69 66 28 20 70 53 65 74 74 69    }.  if( pSetti
efb0: 6e 67 21 3d 30 20 26 26 20 70 53 65 74 74 69 6e  ng!=0 && pSettin
efc0: 67 2d 3e 76 65 72 73 69 6f 6e 61 62 6c 65 20 29  g->versionable )
efd0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
efe0: 20 61 20 76 65 72 73 69 6f 6e 61 62 6c 65 20 73   a versionable s
eff0: 65 74 74 69 6e 67 2c 20 74 72 79 20 61 6e 64 20  etting, try and 
f000: 67 65 74 20 74 68 65 20 69 6e 66 6f 20 66 72 6f  get the info fro
f010: 6d 20 61 0a 20 20 20 20 2a 2a 20 63 68 65 63 6b  m a.    ** check
f020: 65 64 20 6f 75 74 20 66 69 6c 65 20 2a 2f 0a 20  ed out file */. 
f030: 20 20 20 7a 20 3d 20 64 62 5f 67 65 74 5f 76 65     z = db_get_ve
f040: 72 73 69 6f 6e 65 64 28 7a 4e 61 6d 65 2c 20 7a  rsioned(zName, z
f050: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 3d 3d  );.  }.  if( z==
f060: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 65  0 ){.    if( zDe
f070: 66 61 75 6c 74 3d 3d 30 20 26 26 20 70 53 65 74  fault==0 && pSet
f080: 74 69 6e 67 20 26 26 20 70 53 65 74 74 69 6e 67  ting && pSetting
f090: 2d 3e 64 65 66 5b 30 5d 20 29 7b 0a 20 20 20 20  ->def[0] ){.    
f0a0: 20 20 7a 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72    z = fossil_str
f0b0: 64 75 70 28 70 53 65 74 74 69 6e 67 2d 3e 64 65  dup(pSetting->de
f0c0: 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f);.    }else{. 
f0d0: 20 20 20 20 20 7a 20 3d 20 7a 44 65 66 61 75 6c       z = zDefaul
f0e0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
f0f0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 63 68 61 72 20  eturn z;.}.char 
f100: 2a 64 62 5f 67 65 74 5f 6d 74 69 6d 65 28 63 6f  *db_get_mtime(co
f110: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
f120: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
f130: 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 29 7b  char *zDefault){
f140: 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  .  char *z = 0;.
f150: 20 20 69 66 28 20 67 2e 72 65 70 6f 73 69 74 6f    if( g.reposito
f160: 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20 20 7a 20  ryOpen ){.    z 
f170: 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45  = db_text(0, "SE
f180: 4c 45 43 54 20 6d 74 69 6d 65 20 46 52 4f 4d 20  LECT mtime FROM 
f190: 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d  config WHERE nam
f1a0: 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e=%Q", zName);. 
f1b0: 20 7d 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b   }.  if( z==0 ){
f1c0: 0a 20 20 20 20 7a 20 3d 20 7a 44 65 66 61 75 6c  .    z = zDefaul
f1d0: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  t;.  }else if( z
f1e0: 46 6f 72 6d 61 74 21 3d 30 20 29 7b 0a 20 20 20  Format!=0 ){.   
f1f0: 20 7a 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20   z = db_text(0, 
f200: 22 53 45 4c 45 43 54 20 73 74 72 66 74 69 6d 65  "SELECT strftime
f210: 28 25 51 2c 25 51 2c 27 75 6e 69 78 65 70 6f 63  (%Q,%Q,'unixepoc
f220: 68 27 29 3b 22 2c 20 7a 46 6f 72 6d 61 74 2c 20  h');", zFormat, 
f230: 7a 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  z);.  }.  return
f240: 20 7a 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 73 65   z;.}.void db_se
f250: 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  t(const char *zN
f260: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
f270: 2a 7a 56 61 6c 75 65 2c 20 69 6e 74 20 67 6c 6f  *zValue, int glo
f280: 62 61 6c 46 6c 61 67 29 7b 0a 20 20 64 62 5f 62  balFlag){.  db_b
f290: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
f2a0: 28 29 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61 6c  ();.  if( global
f2b0: 46 6c 61 67 20 29 7b 0a 20 20 20 20 64 62 5f 73  Flag ){.    db_s
f2c0: 77 61 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 28  wap_connections(
f2d0: 29 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  );.    db_multi_
f2e0: 65 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e  exec("REPLACE IN
f2f0: 54 4f 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67  TO global_config
f300: 28 6e 61 6d 65 2c 76 61 6c 75 65 29 20 56 41 4c  (name,value) VAL
f310: 55 45 53 28 25 51 2c 25 51 29 22 2c 0a 20 20 20  UES(%Q,%Q)",.   
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 7a 4e 61 6d 65 2c 20 7a 56 61 6c 75 65 29 3b 0a  zName, zValue);.
f340: 20 20 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e      db_swap_conn
f350: 65 63 74 69 6f 6e 73 28 29 3b 0a 20 20 7d 65 6c  ections();.  }el
f360: 73 65 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69  se{.    db_multi
f370: 5f 65 78 65 63 28 22 52 45 50 4c 41 43 45 20 49  _exec("REPLACE I
f380: 4e 54 4f 20 63 6f 6e 66 69 67 28 6e 61 6d 65 2c  NTO config(name,
f390: 76 61 6c 75 65 2c 6d 74 69 6d 65 29 20 56 41 4c  value,mtime) VAL
f3a0: 55 45 53 28 25 51 2c 25 51 2c 6e 6f 77 28 29 29  UES(%Q,%Q,now())
f3b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f3c0: 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 7a 56 61        zName, zVa
f3d0: 6c 75 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lue);.  }.  if( 
f3e0: 67 6c 6f 62 61 6c 46 6c 61 67 20 26 26 20 67 2e  globalFlag && g.
f3f0: 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20 29  repositoryOpen )
f400: 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65  {.    db_multi_e
f410: 78 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d  xec("DELETE FROM
f420: 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61   config WHERE na
f430: 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a  me=%Q", zName);.
f440: 20 20 7d 0a 20 20 64 62 5f 65 6e 64 5f 74 72 61    }.  db_end_tra
f450: 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 7d 0a 76  nsaction(0);.}.v
f460: 6f 69 64 20 64 62 5f 75 6e 73 65 74 28 63 6f 6e  oid db_unset(con
f470: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
f480: 69 6e 74 20 67 6c 6f 62 61 6c 46 6c 61 67 29 7b  int globalFlag){
f490: 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e  .  db_begin_tran
f4a0: 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 69 66 28  saction();.  if(
f4b0: 20 67 6c 6f 62 61 6c 46 6c 61 67 20 29 7b 0a 20   globalFlag ){. 
f4c0: 20 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65     db_swap_conne
f4d0: 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 64 62  ctions();.    db
f4e0: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 45 4c  _multi_exec("DEL
f4f0: 45 54 45 20 46 52 4f 4d 20 67 6c 6f 62 61 6c 5f  ETE FROM global_
f500: 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d  config WHERE nam
f510: 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e=%Q", zName);. 
f520: 20 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65     db_swap_conne
f530: 63 74 69 6f 6e 73 28 29 3b 0a 20 20 7d 65 6c 73  ctions();.  }els
f540: 65 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  e{.    db_multi_
f550: 65 78 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f  exec("DELETE FRO
f560: 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e  M config WHERE n
f570: 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b  ame=%Q", zName);
f580: 0a 20 20 7d 0a 20 20 69 66 28 20 67 6c 6f 62 61  .  }.  if( globa
f590: 6c 46 6c 61 67 20 26 26 20 67 2e 72 65 70 6f 73  lFlag && g.repos
f5a0: 69 74 6f 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20  itoryOpen ){.   
f5b0: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
f5c0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 6f 6e 66  DELETE FROM conf
f5d0: 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ig WHERE name=%Q
f5e0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  ", zName);.  }. 
f5f0: 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74   db_end_transact
f600: 69 6f 6e 28 30 29 3b 0a 7d 0a 69 6e 74 20 64 62  ion(0);.}.int db
f610: 5f 69 73 5f 67 6c 6f 62 61 6c 28 63 6f 6e 73 74  _is_global(const
f620: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
f630: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69   int rc = 0;.  i
f640: 66 28 20 67 2e 7a 43 6f 6e 66 69 67 44 62 4e 61  f( g.zConfigDbNa
f650: 6d 65 20 29 7b 0a 20 20 20 20 64 62 5f 73 77 61  me ){.    db_swa
f660: 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 29 3b  p_connections();
f670: 0a 20 20 20 20 72 63 20 3d 20 64 62 5f 65 78 69  .    rc = db_exi
f680: 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52  sts("SELECT 1 FR
f690: 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67  OM global_config
f6a0: 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
f6b0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 64 62 5f   zName);.    db_
f6c0: 73 77 61 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73  swap_connections
f6d0: 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
f6e0: 20 72 63 3b 0a 7d 0a 69 6e 74 20 64 62 5f 67 65   rc;.}.int db_ge
f6f0: 74 5f 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72  t_int(const char
f700: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 64 66 6c   *zName, int dfl
f710: 74 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 64 66  t){.  int v = df
f720: 6c 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lt;.  int rc;.  
f730: 69 66 28 20 67 2e 72 65 70 6f 73 69 74 6f 72 79  if( g.repository
f740: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 53 74 6d 74  Open ){.    Stmt
f750: 20 71 3b 0a 20 20 20 20 64 62 5f 70 72 65 70 61   q;.    db_prepa
f760: 72 65 28 26 71 2c 20 22 53 45 4c 45 43 54 20 76  re(&q, "SELECT v
f770: 61 6c 75 65 20 46 52 4f 4d 20 63 6f 6e 66 69 67  alue FROM config
f780: 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
f790: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20   zName);.    rc 
f7a0: 3d 20 64 62 5f 73 74 65 70 28 26 71 29 3b 0a 20  = db_step(&q);. 
f7b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f7c0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 76  E_ROW ){.      v
f7d0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
f7e0: 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  (&q, 0);.    }. 
f7f0: 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26     db_finalize(&
f800: 71 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  q);.  }else{.   
f810: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
f820: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  E;.  }.  if( rc=
f830: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20  =SQLITE_DONE && 
f840: 67 2e 7a 43 6f 6e 66 69 67 44 62 4e 61 6d 65 20  g.zConfigDbName 
f850: 29 7b 0a 20 20 20 20 64 62 5f 73 77 61 70 5f 63  ){.    db_swap_c
f860: 6f 6e 6e 65 63 74 69 6f 6e 73 28 29 3b 0a 20 20  onnections();.  
f870: 20 20 76 20 3d 20 64 62 5f 69 6e 74 28 64 66 6c    v = db_int(dfl
f880: 74 2c 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65  t, "SELECT value
f890: 20 46 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e   FROM global_con
f8a0: 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  fig WHERE name=%
f8b0: 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Q", zName);.    
f8c0: 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65 63 74 69  db_swap_connecti
f8d0: 6f 6e 73 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ons();.  }.  ret
f8e0: 75 72 6e 20 76 3b 0a 7d 0a 76 6f 69 64 20 64 62  urn v;.}.void db
f8f0: 5f 73 65 74 5f 69 6e 74 28 63 6f 6e 73 74 20 63  _set_int(const c
f900: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
f910: 76 61 6c 75 65 2c 20 69 6e 74 20 67 6c 6f 62 61  value, int globa
f920: 6c 46 6c 61 67 29 7b 0a 20 20 69 66 28 20 67 6c  lFlag){.  if( gl
f930: 6f 62 61 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20  obalFlag ){.    
f940: 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65 63 74 69  db_swap_connecti
f950: 6f 6e 73 28 29 3b 0a 20 20 20 20 64 62 5f 6d 75  ons();.    db_mu
f960: 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43  lti_exec("REPLAC
f970: 45 20 49 4e 54 4f 20 67 6c 6f 62 61 6c 5f 63 6f  E INTO global_co
f980: 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c 75 65 29  nfig(name,value)
f990: 20 56 41 4c 55 45 53 28 25 51 2c 25 64 29 22 2c   VALUES(%Q,%d)",
f9a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f9b0: 20 20 20 7a 4e 61 6d 65 2c 20 76 61 6c 75 65 29     zName, value)
f9c0: 3b 0a 20 20 20 20 64 62 5f 73 77 61 70 5f 63 6f  ;.    db_swap_co
f9d0: 6e 6e 65 63 74 69 6f 6e 73 28 29 3b 0a 20 20 7d  nnections();.  }
f9e0: 65 6c 73 65 7b 0a 20 20 20 20 64 62 5f 6d 75 6c  else{.    db_mul
f9f0: 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43 45  ti_exec("REPLACE
fa00: 20 49 4e 54 4f 20 63 6f 6e 66 69 67 28 6e 61 6d   INTO config(nam
fa10: 65 2c 76 61 6c 75 65 2c 6d 74 69 6d 65 29 20 56  e,value,mtime) V
fa20: 41 4c 55 45 53 28 25 51 2c 25 64 2c 6e 6f 77 28  ALUES(%Q,%d,now(
fa30: 29 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ))",.           
fa40: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 76 61         zName, va
fa50: 6c 75 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lue);.  }.  if( 
fa60: 67 6c 6f 62 61 6c 46 6c 61 67 20 26 26 20 67 2e  globalFlag && g.
fa70: 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20 29  repositoryOpen )
fa80: 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65  {.    db_multi_e
fa90: 78 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d  xec("DELETE FROM
faa0: 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61   config WHERE na
fab0: 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a  me=%Q", zName);.
fac0: 20 20 7d 0a 7d 0a 69 6e 74 20 64 62 5f 67 65 74    }.}.int db_get
fad0: 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63  _boolean(const c
fae0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
faf0: 64 66 6c 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a  dflt){.  char *z
fb00: 56 61 6c 20 3d 20 64 62 5f 67 65 74 28 7a 4e 61  Val = db_get(zNa
fb10: 6d 65 2c 20 64 66 6c 74 20 3f 20 22 6f 6e 22 20  me, dflt ? "on" 
fb20: 3a 20 22 6f 66 66 22 29 3b 0a 20 20 69 66 28 20  : "off");.  if( 
fb30: 69 73 5f 74 72 75 74 68 28 7a 56 61 6c 29 20 29  is_truth(zVal) )
fb40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
fb50: 20 69 73 5f 66 61 6c 73 65 28 7a 56 61 6c 29 20   is_false(zVal) 
fb60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
fb70: 74 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 63 68 61  turn dflt;.}.cha
fb80: 72 20 2a 64 62 5f 6c 67 65 74 28 63 6f 6e 73 74  r *db_lget(const
fb90: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 68   char *zName, ch
fba0: 61 72 20 2a 7a 44 65 66 61 75 6c 74 29 7b 0a 20  ar *zDefault){. 
fbb0: 20 72 65 74 75 72 6e 20 64 62 5f 74 65 78 74 28   return db_text(
fbc0: 28 63 68 61 72 2a 29 7a 44 65 66 61 75 6c 74 2c  (char*)zDefault,
fbd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fbe0: 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20    "SELECT value 
fbf0: 46 52 4f 4d 20 76 76 61 72 20 57 48 45 52 45 20  FROM vvar WHERE 
fc00: 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29  name=%Q", zName)
fc10: 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 6c 73 65 74  ;.}.void db_lset
fc20: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
fc30: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
fc40: 7a 56 61 6c 75 65 29 7b 0a 20 20 64 62 5f 6d 75  zValue){.  db_mu
fc50: 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43  lti_exec("REPLAC
fc60: 45 20 49 4e 54 4f 20 76 76 61 72 28 6e 61 6d 65  E INTO vvar(name
fc70: 2c 76 61 6c 75 65 29 20 56 41 4c 55 45 53 28 25  ,value) VALUES(%
fc80: 51 2c 25 51 29 22 2c 20 7a 4e 61 6d 65 2c 20 7a  Q,%Q)", zName, z
fc90: 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e 74 20 64 62  Value);.}.int db
fca0: 5f 6c 67 65 74 5f 69 6e 74 28 63 6f 6e 73 74 20  _lget_int(const 
fcb0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
fcc0: 20 64 66 6c 74 29 7b 0a 20 20 72 65 74 75 72 6e   dflt){.  return
fcd0: 20 64 62 5f 69 6e 74 28 64 66 6c 74 2c 20 22 53   db_int(dflt, "S
fce0: 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d  ELECT value FROM
fcf0: 20 76 76 61 72 20 57 48 45 52 45 20 6e 61 6d 65   vvar WHERE name
fd00: 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a  =%Q", zName);.}.
fd10: 76 6f 69 64 20 64 62 5f 6c 73 65 74 5f 69 6e 74  void db_lset_int
fd20: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
fd30: 6d 65 2c 20 69 6e 74 20 76 61 6c 75 65 29 7b 0a  me, int value){.
fd40: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
fd50: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 76 76  "REPLACE INTO vv
fd60: 61 72 28 6e 61 6d 65 2c 76 61 6c 75 65 29 20 56  ar(name,value) V
fd70: 41 4c 55 45 53 28 25 51 2c 25 64 29 22 2c 20 7a  ALUES(%Q,%d)", z
fd80: 4e 61 6d 65 2c 20 76 61 6c 75 65 29 3b 0a 7d 0a  Name, value);.}.
fd90: 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
fda0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 6c 6f 63 61  e name of a loca
fdb0: 6c 20 72 65 70 6f 73 69 74 6f 72 79 20 69 6e 20  l repository in 
fdc0: 74 68 65 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69  the global_confi
fdd0: 67 28 29 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  g() database..**
fde0: 20 54 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20   The repository 
fdf0: 66 69 6c 65 6e 61 6d 65 20 25 73 20 69 73 20 72  filename %s is r
fe00: 65 63 6f 72 64 65 64 20 61 73 20 61 6e 20 65 6e  ecorded as an en
fe10: 74 72 79 20 77 69 74 68 20 61 20 22 6e 61 6d 65  try with a "name
fe20: 22 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68  " field.** of th
fe30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
fe40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 72 65  :.**.**       re
fe50: 70 6f 3a 25 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20  po:%s.**.** The 
fe60: 76 61 6c 75 65 20 66 69 65 6c 64 20 69 73 20 73  value field is s
fe70: 65 74 20 74 6f 20 31 2e 0a 2a 2a 0a 2a 2a 20 49  et to 1..**.** I
fe80: 66 20 72 75 6e 6e 69 6e 67 20 66 72 6f 6d 20 61  f running from a
fe90: 20 6c 6f 63 61 6c 20 63 68 65 63 6b 6f 75 74 2c   local checkout,
fea0: 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 74 68 65   also record the
feb0: 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 63 68 65   root of the che
fec0: 63 6b 6f 75 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c  ckout.** as foll
fed0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ows:.**.**      
fee0: 20 63 6b 6f 75 74 3a 25 73 0a 2a 2a 0a 2a 2a 20   ckout:%s.**.** 
fef0: 57 68 65 72 65 20 25 73 20 69 73 20 74 68 65 20  Where %s is the 
ff00: 63 68 65 63 6b 6f 75 74 20 72 6f 6f 74 2e 20 20  checkout root.  
ff10: 54 68 65 20 76 61 6c 75 65 20 69 73 20 74 68 65  The value is the
ff20: 20 72 65 70 6f 73 69 74 6f 72 79 20 66 69 6c 65   repository file
ff30: 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 72 65 63  ..*/.void db_rec
ff40: 6f 72 64 5f 72 65 70 6f 73 69 74 6f 72 79 5f 66  ord_repository_f
ff50: 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68  ilename(const ch
ff60: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 63 68  ar *zName){.  ch
ff70: 61 72 20 2a 7a 52 65 70 6f 53 65 74 74 69 6e 67  ar *zRepoSetting
ff80: 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6b 6f 75 74  ;.  char *zCkout
ff90: 53 65 74 74 69 6e 67 3b 0a 20 20 42 6c 6f 62 20  Setting;.  Blob 
ffa0: 66 75 6c 6c 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  full;.  if( zNam
ffb0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
ffc0: 21 67 2e 6c 6f 63 61 6c 4f 70 65 6e 20 29 20 72  !g.localOpen ) r
ffd0: 65 74 75 72 6e 3b 0a 20 20 20 20 7a 4e 61 6d 65  eturn;.    zName
ffe0: 20 3d 20 64 62 5f 72 65 70 6f 73 69 74 6f 72 79   = db_repository
fff0: 5f 66 69 6c 65 6e 61 6d 65 28 29 3b 0a 20 20 7d  _filename();.  }
10000 0a 20 20 66 69 6c 65 5f 63 61 6e 6f 6e 69 63 61  .  file_canonica
10010 6c 5f 6e 61 6d 65 28 7a 4e 61 6d 65 2c 20 26 66  l_name(zName, &f
10020 75 6c 6c 2c 20 30 29 3b 0a 20 20 28 76 6f 69 64  ull, 0);.  (void
10030 29 66 69 6c 65 6e 61 6d 65 5f 63 6f 6c 6c 61 74  )filename_collat
10040 69 6f 6e 28 29 3b 20 20 2f 2a 20 49 6e 69 74 69  ion();  /* Initi
10050 61 6c 69 7a 65 20 62 65 66 6f 72 65 20 63 6f 6e  alize before con
10060 6e 65 63 74 69 6f 6e 20 73 77 61 70 20 2a 2f 0a  nection swap */.
10070 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65 63    db_swap_connec
10080 74 69 6f 6e 73 28 29 3b 0a 20 20 7a 52 65 70 6f  tions();.  zRepo
10090 53 65 74 74 69 6e 67 20 3d 20 6d 70 72 69 6e 74  Setting = mprint
100a0 66 28 22 72 65 70 6f 3a 25 71 22 2c 20 62 6c 6f  f("repo:%q", blo
100b0 62 5f 73 74 72 28 26 66 75 6c 6c 29 29 3b 0a 20  b_str(&full));. 
100c0 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a   db_multi_exec(.
100d0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
100e0 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20  M global_config 
100f0 57 48 45 52 45 20 6e 61 6d 65 20 25 73 20 3d 20  WHERE name %s = 
10100 25 51 3b 22 2c 0a 20 20 20 20 20 66 69 6c 65 6e  %Q;",.     filen
10110 61 6d 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29 2c  ame_collation(),
10120 20 7a 52 65 70 6f 53 65 74 74 69 6e 67 0a 20 20   zRepoSetting.  
10130 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78  );.  db_multi_ex
10140 65 63 28 0a 20 20 20 20 20 22 49 4e 53 45 52 54  ec(.     "INSERT
10150 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20   OR IGNORE INTO 
10160 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 28 6e 61  global_config(na
10170 6d 65 2c 76 61 6c 75 65 29 22 0a 20 20 20 20 20  me,value)".     
10180 22 56 41 4c 55 45 53 28 25 51 2c 31 29 3b 22 2c  "VALUES(%Q,1);",
10190 0a 20 20 20 20 20 7a 52 65 70 6f 53 65 74 74 69  .     zRepoSetti
101a0 6e 67 0a 20 20 29 3b 0a 20 20 66 6f 73 73 69 6c  ng.  );.  fossil
101b0 5f 66 72 65 65 28 7a 52 65 70 6f 53 65 74 74 69  _free(zRepoSetti
101c0 6e 67 29 3b 0a 20 20 69 66 28 20 67 2e 6c 6f 63  ng);.  if( g.loc
101d0 61 6c 4f 70 65 6e 20 26 26 20 67 2e 7a 4c 6f 63  alOpen && g.zLoc
101e0 61 6c 52 6f 6f 74 20 26 26 20 67 2e 7a 4c 6f 63  alRoot && g.zLoc
101f0 61 6c 52 6f 6f 74 5b 30 5d 20 29 7b 0a 20 20 20  alRoot[0] ){.   
10200 20 42 6c 6f 62 20 6c 6f 63 61 6c 52 6f 6f 74 3b   Blob localRoot;
10210 0a 20 20 20 20 66 69 6c 65 5f 63 61 6e 6f 6e 69  .    file_canoni
10220 63 61 6c 5f 6e 61 6d 65 28 67 2e 7a 4c 6f 63 61  cal_name(g.zLoca
10230 6c 52 6f 6f 74 2c 20 26 6c 6f 63 61 6c 52 6f 6f  lRoot, &localRoo
10240 74 2c 20 31 29 3b 0a 20 20 20 20 7a 43 6b 6f 75  t, 1);.    zCkou
10250 74 53 65 74 74 69 6e 67 20 3d 20 6d 70 72 69 6e  tSetting = mprin
10260 74 66 28 22 63 6b 6f 75 74 3a 25 71 22 2c 20 62  tf("ckout:%q", b
10270 6c 6f 62 5f 73 74 72 28 26 6c 6f 63 61 6c 52 6f  lob_str(&localRo
10280 6f 74 29 29 3b 0a 20 20 20 20 64 62 5f 6d 75 6c  ot));.    db_mul
10290 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 20 20  ti_exec(.       
102a0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 67 6c 6f  "DELETE FROM glo
102b0 62 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45 52 45  bal_config WHERE
102c0 20 6e 61 6d 65 20 25 73 20 3d 20 25 51 3b 22 2c   name %s = %Q;",
102d0 0a 20 20 20 20 20 20 20 66 69 6c 65 6e 61 6d 65  .       filename
102e0 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29 2c 20 7a 43  _collation(), zC
102f0 6b 6f 75 74 53 65 74 74 69 6e 67 0a 20 20 20 20  koutSetting.    
10300 29 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  );.    db_multi_
10310 65 78 65 63 28 0a 20 20 20 20 20 20 22 52 45 50  exec(.      "REP
10320 4c 41 43 45 20 49 4e 54 4f 20 67 6c 6f 62 61 6c  LACE INTO global
10330 5f 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 20 76 61  _config(name, va
10340 6c 75 65 29 22 0a 20 20 20 20 20 20 22 56 41 4c  lue)".      "VAL
10350 55 45 53 28 25 51 2c 25 51 29 3b 22 2c 0a 20 20  UES(%Q,%Q);",.  
10360 20 20 20 20 7a 43 6b 6f 75 74 53 65 74 74 69 6e      zCkoutSettin
10370 67 2c 20 62 6c 6f 62 5f 73 74 72 28 26 66 75 6c  g, blob_str(&ful
10380 6c 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 64 62  l).    );.    db
10390 5f 73 77 61 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e  _swap_connection
103a0 73 28 29 3b 0a 20 20 20 20 64 62 5f 6f 70 74 69  s();.    db_opti
103b0 6f 6e 61 6c 5f 73 71 6c 28 22 72 65 70 6f 73 69  onal_sql("reposi
103c0 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 20 20 22  tory",.        "
103d0 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 6f 6e 66  DELETE FROM conf
103e0 69 67 20 57 48 45 52 45 20 6e 61 6d 65 20 25 73  ig WHERE name %s
103f0 20 3d 20 25 51 3b 22 2c 0a 20 20 20 20 20 20 20   = %Q;",.       
10400 20 66 69 6c 65 6e 61 6d 65 5f 63 6f 6c 6c 61 74   filename_collat
10410 69 6f 6e 28 29 2c 20 7a 43 6b 6f 75 74 53 65 74  ion(), zCkoutSet
10420 74 69 6e 67 0a 20 20 20 20 29 3b 0a 20 20 20 20  ting.    );.    
10430 64 62 5f 6f 70 74 69 6f 6e 61 6c 5f 73 71 6c 28  db_optional_sql(
10440 22 72 65 70 6f 73 69 74 6f 72 79 22 2c 0a 20 20  "repository",.  
10450 20 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49        "REPLACE I
10460 4e 54 4f 20 63 6f 6e 66 69 67 28 6e 61 6d 65 2c  NTO config(name,
10470 76 61 6c 75 65 2c 6d 74 69 6d 65 29 22 0a 20 20  value,mtime)".  
10480 20 20 20 20 20 20 22 56 41 4c 55 45 53 28 25 51        "VALUES(%Q
10490 2c 31 2c 6e 6f 77 28 29 29 3b 22 2c 0a 20 20 20  ,1,now());",.   
104a0 20 20 20 20 20 7a 43 6b 6f 75 74 53 65 74 74 69       zCkoutSetti
104b0 6e 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f  ng.    );.    fo
104c0 73 73 69 6c 5f 66 72 65 65 28 7a 43 6b 6f 75 74  ssil_free(zCkout
104d0 53 65 74 74 69 6e 67 29 3b 0a 20 20 20 20 62 6c  Setting);.    bl
104e0 6f 62 5f 72 65 73 65 74 28 26 6c 6f 63 61 6c 52  ob_reset(&localR
104f0 6f 6f 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oot);.  }else{. 
10500 20 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65     db_swap_conne
10510 63 74 69 6f 6e 73 28 29 3b 0a 20 20 7d 0a 20 20  ctions();.  }.  
10520 62 6c 6f 62 5f 72 65 73 65 74 28 26 66 75 6c 6c  blob_reset(&full
10530 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d  );.}../*.** COMM
10540 41 4e 44 3a 20 6f 70 65 6e 0a 2a 2a 0a 2a 2a 20  AND: open.**.** 
10550 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 6f  Usage: %fossil o
10560 70 65 6e 20 46 49 4c 45 4e 41 4d 45 20 3f 56 45  pen FILENAME ?VE
10570 52 53 49 4f 4e 3f 20 3f 4f 50 54 49 4f 4e 53 3f  RSION? ?OPTIONS?
10580 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 63 6f  .**.** Open a co
10590 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
105a0 6c 6f 63 61 6c 20 72 65 70 6f 73 69 74 6f 72 79  local repository
105b0 20 69 6e 20 46 49 4c 45 4e 41 4d 45 2e 20 20 41   in FILENAME.  A
105c0 20 63 68 65 63 6b 6f 75 74 0a 2a 2a 20 66 6f 72   checkout.** for
105d0 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20   the repository 
105e0 69 73 20 63 72 65 61 74 65 64 20 77 69 74 68 20  is created with 
105f0 69 74 73 20 72 6f 6f 74 20 61 74 20 74 68 65 20  its root at the 
10600 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
10610 79 2e 0a 2a 2a 20 49 66 20 56 45 52 53 49 4f 4e  y..** If VERSION
10620 20 69 73 20 73 70 65 63 69 66 69 65 64 20 74 68   is specified th
10630 65 6e 20 74 68 61 74 20 76 65 72 73 69 6f 6e 20  en that version 
10640 69 73 20 63 68 65 63 6b 65 64 20 6f 75 74 2e 20  is checked out. 
10650 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 74 68   Otherwise.** th
10660 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e  e latest version
10670 20 69 73 20 63 68 65 63 6b 65 64 20 6f 75 74 2e   is checked out.
10680 20 20 4e 6f 20 66 69 6c 65 73 20 6f 74 68 65 72    No files other
10690 20 74 68 61 6e 20 22 6d 61 6e 69 66 65 73 74 22   than "manifest"
106a0 0a 2a 2a 20 61 6e 64 20 22 6d 61 6e 69 66 65 73  .** and "manifes
106b0 74 2e 75 75 69 64 22 20 61 72 65 20 6d 6f 64 69  t.uuid" are modi
106c0 66 69 65 64 20 69 66 20 74 68 65 20 2d 2d 6b 65  fied if the --ke
106d0 65 70 20 6f 70 74 69 6f 6e 20 69 73 20 70 72 65  ep option is pre
106e0 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 70 74 69  sent..**.** Opti
106f0 6f 6e 73 3a 0a 2a 2a 20 20 20 2d 2d 65 6d 70 74  ons:.**   --empt
10700 79 20 20 20 20 20 20 20 20 20 20 20 49 6e 69 74  y           Init
10710 69 61 6c 69 7a 65 20 63 68 65 63 6b 6f 75 74 20  ialize checkout 
10720 61 73 20 62 65 69 6e 67 20 65 6d 70 74 79 2c 20  as being empty, 
10730 62 75 74 20 73 74 69 6c 6c 20 63 6f 6e 6e 65 63  but still connec
10740 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ted.**          
10750 20 20 20 20 20 20 20 20 20 20 20 77 69 74 68 20             with 
10760 74 68 65 20 6c 6f 63 61 6c 20 72 65 70 6f 73 69  the local reposi
10770 74 6f 72 79 2e 20 49 66 20 79 6f 75 20 63 6f 6d  tory. If you com
10780 6d 69 74 20 74 68 69 73 20 63 68 65 63 6b 6f 75  mit this checkou
10790 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t,.**           
107a0 20 20 20 20 20 20 20 20 20 20 69 74 20 77 69 6c            it wil
107b0 6c 20 62 65 63 6f 6d 65 20 61 20 6e 65 77 20 22  l become a new "
107c0 69 6e 69 74 69 61 6c 22 20 63 6f 6d 6d 69 74 20  initial" commit 
107d0 69 6e 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72  in the repositor
107e0 79 2e 0a 2a 2a 20 20 20 2d 2d 6b 65 65 70 20 20  y..**   --keep  
107f0 20 20 20 20 20 20 20 20 20 20 4f 6e 6c 79 20 6d            Only m
10800 6f 64 69 66 79 20 74 68 65 20 6d 61 6e 69 66 65  odify the manife
10810 73 74 20 61 6e 64 20 6d 61 6e 69 66 65 73 74 2e  st and manifest.
10820 75 75 69 64 20 66 69 6c 65 73 0a 2a 2a 20 20 20  uuid files.**   
10830 2d 2d 6e 65 73 74 65 64 20 20 20 20 20 20 20 20  --nested        
10840 20 20 41 6c 6c 6f 77 20 6f 70 65 6e 69 6e 67 20    Allow opening 
10850 61 20 72 65 70 6f 73 69 74 6f 72 79 20 69 6e 73  a repository ins
10860 69 64 65 20 61 6e 20 6f 70 65 6e 65 64 20 63 68  ide an opened ch
10870 65 63 6b 6f 75 74 0a 2a 2a 20 20 20 2d 2d 66 6f  eckout.**   --fo
10880 72 63 65 2d 6d 69 73 73 69 6e 67 20 20 20 46 6f  rce-missing   Fo
10890 72 63 65 20 6f 70 65 6e 69 6e 67 20 61 20 72 65  rce opening a re
108a0 70 6f 73 69 74 6f 72 79 20 77 69 74 68 20 6d 69  pository with mi
108b0 73 73 69 6e 67 20 63 6f 6e 74 65 6e 74 0a 2a 2a  ssing content.**
108c0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 63 6c  .** See also: cl
108d0 6f 73 65 0a 2a 2f 0a 76 6f 69 64 20 63 6d 64 5f  ose.*/.void cmd_
108e0 6f 70 65 6e 28 76 6f 69 64 29 7b 0a 20 20 69 6e  open(void){.  in
108f0 74 20 65 6d 70 74 79 46 6c 61 67 3b 0a 20 20 69  t emptyFlag;.  i
10900 6e 74 20 6b 65 65 70 46 6c 61 67 3b 0a 20 20 69  nt keepFlag;.  i
10910 6e 74 20 66 6f 72 63 65 4d 69 73 73 69 6e 67 46  nt forceMissingF
10920 6c 61 67 3b 0a 20 20 69 6e 74 20 61 6c 6c 6f 77  lag;.  int allow
10930 4e 65 73 74 65 64 3b 0a 20 20 73 74 61 74 69 63  Nested;.  static
10940 20 63 68 61 72 20 2a 61 7a 4e 65 77 41 72 67 76   char *azNewArgv
10950 5b 5d 20 3d 20 7b 20 30 2c 20 22 63 68 65 63 6b  [] = { 0, "check
10960 6f 75 74 22 2c 20 22 2d 2d 70 72 6f 6d 70 74 22  out", "--prompt"
10970 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
10980 0a 20 20 75 72 6c 5f 70 72 6f 78 79 5f 6f 70 74  .  url_proxy_opt
10990 69 6f 6e 73 28 29 3b 0a 20 20 65 6d 70 74 79 46  ions();.  emptyF
109a0 6c 61 67 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f  lag = find_optio
109b0 6e 28 22 65 6d 70 74 79 22 2c 30 2c 30 29 21 3d  n("empty",0,0)!=
109c0 30 3b 0a 20 20 6b 65 65 70 46 6c 61 67 20 3d 20  0;.  keepFlag = 
109d0 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 6b 65 65  find_option("kee
109e0 70 22 2c 30 2c 30 29 21 3d 30 3b 0a 20 20 66 6f  p",0,0)!=0;.  fo
109f0 72 63 65 4d 69 73 73 69 6e 67 46 6c 61 67 20 3d  rceMissingFlag =
10a00 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 66 6f   find_option("fo
10a10 72 63 65 2d 6d 69 73 73 69 6e 67 22 2c 30 2c 30  rce-missing",0,0
10a20 29 21 3d 30 3b 0a 20 20 61 6c 6c 6f 77 4e 65 73  )!=0;.  allowNes
10a30 74 65 64 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f  ted = find_optio
10a40 6e 28 22 6e 65 73 74 65 64 22 2c 30 2c 30 29 21  n("nested",0,0)!
10a50 3d 30 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f  =0;..  /* We sho
10a60 75 6c 64 20 62 65 20 64 6f 6e 65 20 77 69 74 68  uld be done with
10a70 20 6f 70 74 69 6f 6e 73 2e 2e 20 2a 2f 0a 20 20   options.. */.  
10a80 76 65 72 69 66 79 5f 61 6c 6c 5f 6f 70 74 69 6f  verify_all_optio
10a90 6e 73 28 29 3b 0a 0a 20 20 69 66 28 20 67 2e 61  ns();..  if( g.a
10aa0 72 67 63 21 3d 33 20 26 26 20 67 2e 61 72 67 63  rgc!=3 && g.argc
10ab0 21 3d 34 20 29 7b 0a 20 20 20 20 75 73 61 67 65  !=4 ){.    usage
10ac0 28 22 52 45 50 4f 53 49 54 4f 52 59 2d 46 49 4c  ("REPOSITORY-FIL
10ad0 45 4e 41 4d 45 20 3f 56 45 52 53 49 4f 4e 3f 22  ENAME ?VERSION?"
10ae0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 61 6c  );.  }.  if( !al
10af0 6c 6f 77 4e 65 73 74 65 64 20 26 26 20 64 62 5f  lowNested && db_
10b00 6f 70 65 6e 5f 6c 6f 63 61 6c 28 30 29 20 29 7b  open_local(0) ){
10b10 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61  .    fossil_fata
10b20 6c 28 22 61 6c 72 65 61 64 79 20 77 69 74 68 69  l("already withi
10b30 6e 20 61 6e 20 6f 70 65 6e 20 74 72 65 65 20 72  n an open tree r
10b40 6f 6f 74 65 64 20 61 74 20 25 73 22 2c 20 67 2e  ooted at %s", g.
10b50 7a 4c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20 20 7d  zLocalRoot);.  }
10b60 0a 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73  .  db_open_repos
10b70 69 74 6f 72 79 28 67 2e 61 72 67 76 5b 32 5d 29  itory(g.argv[2])
10b80 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
10b90 75 74 20 77 68 69 63 68 20 72 65 76 69 73 69 6f  ut which revisio
10ba0 6e 20 74 6f 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20  n to open. */.  
10bb0 69 66 28 20 21 65 6d 70 74 79 46 6c 61 67 20 29  if( !emptyFlag )
10bc0 7b 0a 20 20 20 20 69 66 28 20 67 2e 61 72 67 63  {.    if( g.argc
10bd0 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 67 2e 7a  ==4 ){.      g.z
10be0 4f 70 65 6e 52 65 76 69 73 69 6f 6e 20 3d 20 67  OpenRevision = g
10bf0 2e 61 72 67 76 5b 33 5d 3b 0a 20 20 20 20 7d 65  .argv[3];.    }e
10c00 6c 73 65 20 69 66 28 20 64 62 5f 65 78 69 73 74  lse if( db_exist
10c10 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  s("SELECT 1 FROM
10c20 20 65 76 65 6e 74 20 57 48 45 52 45 20 74 79 70   event WHERE typ
10c30 65 3d 27 63 69 27 22 29 20 29 7b 0a 20 20 20 20  e='ci'") ){.    
10c40 20 20 67 2e 7a 4f 70 65 6e 52 65 76 69 73 69 6f    g.zOpenRevisio
10c50 6e 20 3d 20 64 62 5f 67 65 74 28 22 6d 61 69 6e  n = db_get("main
10c60 2d 62 72 61 6e 63 68 22 2c 20 22 74 72 75 6e 6b  -branch", "trunk
10c70 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ");.    }.  }.. 
10c80 20 69 66 28 20 67 2e 7a 4f 70 65 6e 52 65 76 69   if( g.zOpenRevi
10c90 73 69 6f 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 53  sion ){.    /* S
10ca0 69 6e 63 65 20 74 68 65 20 72 65 70 6f 73 69 74  ince the reposit
10cb0 6f 72 79 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ory is open and 
10cc0 77 65 20 6b 6e 6f 77 20 74 68 65 20 72 65 76 69  we know the revi
10cd0 73 69 6f 6e 20 6e 6f 77 2c 0a 20 20 20 20 2a 2a  sion now,.    **
10ce0 20 72 65 66 72 65 73 68 20 74 68 65 20 61 6c 6c   refresh the all
10cf0 6f 77 2d 73 79 6d 6c 69 6e 6b 73 20 66 6c 61 67  ow-symlinks flag
10d00 2e 20 2a 2f 0a 20 20 20 20 67 2e 61 6c 6c 6f 77  . */.    g.allow
10d10 53 79 6d 6c 69 6e 6b 73 20 3d 20 64 62 5f 67 65  Symlinks = db_ge
10d20 74 5f 62 6f 6f 6c 65 61 6e 28 22 61 6c 6c 6f 77  t_boolean("allow
10d30 2d 73 79 6d 6c 69 6e 6b 73 22 2c 20 30 29 3b 0a  -symlinks", 0);.
10d40 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64    }..#if defined
10d50 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
10d60 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
10d70 23 20 64 65 66 69 6e 65 20 4c 4f 43 41 4c 44 42  # define LOCALDB
10d80 5f 4e 41 4d 45 20 22 2e 2f 5f 46 4f 53 53 49 4c  _NAME "./_FOSSIL
10d90 5f 22 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  _".#else.# defin
10da0 65 20 4c 4f 43 41 4c 44 42 5f 4e 41 4d 45 20 22  e LOCALDB_NAME "
10db0 2e 2f 2e 66 73 6c 63 6b 6f 75 74 22 0a 23 65 6e  ./.fslckout".#en
10dc0 64 69 66 0a 20 20 64 62 5f 69 6e 69 74 5f 64 61  dif.  db_init_da
10dd0 74 61 62 61 73 65 28 4c 4f 43 41 4c 44 42 5f 4e  tabase(LOCALDB_N
10de0 41 4d 45 2c 20 7a 4c 6f 63 61 6c 53 63 68 65 6d  AME, zLocalSchem
10df0 61 2c 0a 23 69 66 64 65 66 20 46 4f 53 53 49 4c  a,.#ifdef FOSSIL
10e00 5f 4c 4f 43 41 4c 5f 57 41 4c 0a 20 20 20 20 20  _LOCAL_WAL.     
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43                "C
10e20 4f 4d 4d 49 54 3b 20 50 52 41 47 4d 41 20 6a 6f  OMMIT; PRAGMA jo
10e30 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41 4c 3b 20  urnal_mode=WAL; 
10e40 42 45 47 49 4e 3b 22 2c 0a 23 65 6e 64 69 66 0a  BEGIN;",.#endif.
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e60 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
10e70 64 62 5f 64 65 6c 65 74 65 5f 6f 6e 5f 66 61 69  db_delete_on_fai
10e80 6c 75 72 65 28 4c 4f 43 41 4c 44 42 5f 4e 41 4d  lure(LOCALDB_NAM
10e90 45 29 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 6c 6f  E);.  db_open_lo
10ea0 63 61 6c 28 30 29 3b 0a 20 20 64 62 5f 6c 73 65  cal(0);.  db_lse
10eb0 74 28 22 72 65 70 6f 73 69 74 6f 72 79 22 2c 20  t("repository", 
10ec0 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 64 62  g.argv[2]);.  db
10ed0 5f 72 65 63 6f 72 64 5f 72 65 70 6f 73 69 74 6f  _record_reposito
10ee0 72 79 5f 66 69 6c 65 6e 61 6d 65 28 67 2e 61 72  ry_filename(g.ar
10ef0 67 76 5b 32 5d 29 3b 0a 20 20 64 62 5f 6c 73 65  gv[2]);.  db_lse
10f00 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75 74 22  t_int("checkout"
10f10 2c 20 30 29 3b 0a 20 20 61 7a 4e 65 77 41 72 67  , 0);.  azNewArg
10f20 76 5b 30 5d 20 3d 20 67 2e 61 72 67 76 5b 30 5d  v[0] = g.argv[0]
10f30 3b 0a 20 20 67 2e 61 72 67 76 20 3d 20 61 7a 4e  ;.  g.argv = azN
10f40 65 77 41 72 67 76 3b 0a 20 20 69 66 28 20 21 65  ewArgv;.  if( !e
10f50 6d 70 74 79 46 6c 61 67 20 29 7b 0a 20 20 20 20  mptyFlag ){.    
10f60 67 2e 61 72 67 63 20 3d 20 33 3b 0a 20 20 20 20  g.argc = 3;.    
10f70 69 66 28 20 67 2e 7a 4f 70 65 6e 52 65 76 69 73  if( g.zOpenRevis
10f80 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 61 7a 4e  ion ){.      azN
10f90 65 77 41 72 67 76 5b 67 2e 61 72 67 63 2d 31 5d  ewArgv[g.argc-1]
10fa0 20 3d 20 67 2e 7a 4f 70 65 6e 52 65 76 69 73 69   = g.zOpenRevisi
10fb0 6f 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  on;.    }else{. 
10fc0 20 20 20 20 20 61 7a 4e 65 77 41 72 67 76 5b 67       azNewArgv[g
10fd0 2e 61 72 67 63 2d 31 5d 20 3d 20 22 2d 2d 6c 61  .argc-1] = "--la
10fe0 74 65 73 74 22 3b 0a 20 20 20 20 7d 0a 20 20 20  test";.    }.   
10ff0 20 69 66 28 20 6b 65 65 70 46 6c 61 67 20 29 7b   if( keepFlag ){
11000 0a 20 20 20 20 20 20 61 7a 4e 65 77 41 72 67 76  .      azNewArgv
11010 5b 67 2e 61 72 67 63 2b 2b 5d 20 3d 20 22 2d 2d  [g.argc++] = "--
11020 6b 65 65 70 22 3b 0a 20 20 20 20 7d 0a 20 20 20  keep";.    }.   
11030 20 69 66 28 20 66 6f 72 63 65 4d 69 73 73 69 6e   if( forceMissin
11040 67 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61  gFlag ){.      a
11050 7a 4e 65 77 41 72 67 76 5b 67 2e 61 72 67 63 2b  zNewArgv[g.argc+
11060 2b 5d 20 3d 20 22 2d 2d 66 6f 72 63 65 2d 6d 69  +] = "--force-mi
11070 73 73 69 6e 67 22 3b 0a 20 20 20 20 7d 0a 20 20  ssing";.    }.  
11080 20 20 63 68 65 63 6b 6f 75 74 5f 63 6d 64 28 29    checkout_cmd()
11090 3b 0a 20 20 7d 0a 20 20 67 2e 61 72 67 63 20 3d  ;.  }.  g.argc =
110a0 20 32 3b 0a 20 20 69 6e 66 6f 5f 63 6d 64 28 29   2;.  info_cmd()
110b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
110c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
110d0 75 65 20 6f 66 20 61 20 73 65 74 74 69 6e 67 20  ue of a setting 
110e0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
110f0 65 20 70 53 65 74 74 69 6e 67 0a 2a 2a 20 70 6f  e pSetting.** po
11100 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
11110 20 76 6f 69 64 20 70 72 69 6e 74 5f 73 65 74 74   void print_sett
11120 69 6e 67 28 63 6f 6e 73 74 20 53 65 74 74 69 6e  ing(const Settin
11130 67 20 2a 70 53 65 74 74 69 6e 67 29 7b 0a 20 20  g *pSetting){.  
11140 53 74 6d 74 20 71 3b 0a 20 20 69 66 28 20 67 2e  Stmt q;.  if( g.
11150 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20 29  repositoryOpen )
11160 7b 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 65  {.    db_prepare
11170 28 26 71 2c 0a 20 20 20 20 20 20 20 22 53 45 4c  (&q,.       "SEL
11180 45 43 54 20 27 28 6c 6f 63 61 6c 29 27 2c 20 76  ECT '(local)', v
11190 61 6c 75 65 20 46 52 4f 4d 20 63 6f 6e 66 69 67  alue FROM config
111a0 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 0a   WHERE name=%Q".
111b0 20 20 20 20 20 20 20 22 20 55 4e 49 4f 4e 20 41         " UNION A
111c0 4c 4c 20 22 0a 20 20 20 20 20 20 20 22 53 45 4c  LL ".       "SEL
111d0 45 43 54 20 27 28 67 6c 6f 62 61 6c 29 27 2c 20  ECT '(global)', 
111e0 76 61 6c 75 65 20 46 52 4f 4d 20 67 6c 6f 62 61  value FROM globa
111f0 6c 5f 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e  l_config WHERE n
11200 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20  ame=%Q",.       
11210 70 53 65 74 74 69 6e 67 2d 3e 6e 61 6d 65 2c 20  pSetting->name, 
11220 70 53 65 74 74 69 6e 67 2d 3e 6e 61 6d 65 0a 20  pSetting->name. 
11230 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
11240 20 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71     db_prepare(&q
11250 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  ,.      "SELECT 
11260 27 28 67 6c 6f 62 61 6c 29 27 2c 20 76 61 6c 75  '(global)', valu
11270 65 20 46 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f  e FROM global_co
11280 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d  nfig WHERE name=
11290 25 51 22 2c 0a 20 20 20 20 20 20 70 53 65 74 74  %Q",.      pSett
112a0 69 6e 67 2d 3e 6e 61 6d 65 0a 20 20 20 20 29 3b  ing->name.    );
112b0 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 5f 73 74  .  }.  if( db_st
112c0 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
112d0 4f 57 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c  OW ){.    fossil
112e0 5f 70 72 69 6e 74 28 22 25 2d 32 30 73 20 25 2d  _print("%-20s %-
112f0 38 73 20 25 73 5c 6e 22 2c 20 70 53 65 74 74 69  8s %s\n", pSetti
11300 6e 67 2d 3e 6e 61 6d 65 2c 20 64 62 5f 63 6f 6c  ng->name, db_col
11310 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 2c  umn_text(&q, 0),
11320 0a 20 20 20 20 20 20 20 20 64 62 5f 63 6f 6c 75  .        db_colu
11330 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 29 3b  mn_text(&q, 1));
11340 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
11350 73 73 69 6c 5f 70 72 69 6e 74 28 22 25 2d 32 30  ssil_print("%-20
11360 73 5c 6e 22 2c 20 70 53 65 74 74 69 6e 67 2d 3e  s\n", pSetting->
11370 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  name);.  }.  if(
11380 20 70 53 65 74 74 69 6e 67 2d 3e 76 65 72 73 69   pSetting->versi
11390 6f 6e 61 62 6c 65 20 26 26 20 67 2e 6c 6f 63 61  onable && g.loca
113a0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 2f 2a 20  lOpen ){.    /* 
113b0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
113c0 74 68 69 73 20 69 73 20 6f 76 65 72 72 69 64 64  this is overridd
113d0 65 6e 20 62 79 20 61 20 76 65 72 73 69 6f 6e 61  en by a versiona
113e0 62 6c 65 20 73 65 74 74 69 6e 67 73 20 66 69 6c  ble settings fil
113f0 65 20 2a 2f 0a 20 20 20 20 42 6c 6f 62 20 76 65  e */.    Blob ve
11400 72 73 69 6f 6e 65 64 50 61 74 68 6e 61 6d 65 3b  rsionedPathname;
11410 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26  .    blob_zero(&
11420 76 65 72 73 69 6f 6e 65 64 50 61 74 68 6e 61 6d  versionedPathnam
11430 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70  e);.    blob_app
11440 65 6e 64 66 28 26 76 65 72 73 69 6f 6e 65 64 50  endf(&versionedP
11450 61 74 68 6e 61 6d 65 2c 20 22 25 73 2e 66 6f 73  athname, "%s.fos
11460 73 69 6c 2d 73 65 74 74 69 6e 67 73 2f 25 73 22  sil-settings/%s"
11470 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11480 20 20 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 2c     g.zLocalRoot,
11490 20 70 53 65 74 74 69 6e 67 2d 3e 6e 61 6d 65 29   pSetting->name)
114a0 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 73  ;.    if( file_s
114b0 69 7a 65 28 62 6c 6f 62 5f 73 74 72 28 26 76 65  ize(blob_str(&ve
114c0 72 73 69 6f 6e 65 64 50 61 74 68 6e 61 6d 65 29  rsionedPathname)
114d0 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )>=0 ){.      fo
114e0 73 73 69 6c 5f 70 72 69 6e 74 28 22 20 20 28 6f  ssil_print("  (o
114f0 76 65 72 72 69 64 64 65 6e 20 62 79 20 63 6f 6e  verridden by con
11500 74 65 6e 74 73 20 6f 66 20 66 69 6c 65 20 2e 66  tents of file .f
11510 6f 73 73 69 6c 2d 73 65 74 74 69 6e 67 73 2f 25  ossil-settings/%
11520 73 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s)\n",.         
11530 20 20 20 20 20 20 20 20 20 20 70 53 65 74 74 69            pSetti
11540 6e 67 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  ng->name);.    }
11550 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69  .  }.  db_finali
11560 7a 65 28 26 71 29 3b 0a 7d 0a 0a 0a 23 69 66 20  ze(&q);.}...#if 
11570 49 4e 54 45 52 46 41 43 45 0a 2f 2a 0a 2a 2a 20  INTERFACE./*.** 
11580 44 65 66 69 6e 65 20 61 6c 6c 20 73 65 74 74 69  Define all setti
11590 6e 67 73 2c 20 77 68 69 63 68 20 63 61 6e 20 62  ngs, which can b
115a0 65 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 76 69 61  e controlled via
115b0 20 74 68 65 20 73 65 74 2f 75 6e 73 65 74 0a 2a   the set/unset.*
115c0 2a 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  * command..**.**
115d0 20 76 61 72 20 69 73 20 74 68 65 20 6e 61 6d 65   var is the name
115e0 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   of the internal
115f0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6e   configuration n
11600 61 6d 65 20 66 6f 72 20 64 62 5f 28 75 6e 29 73  ame for db_(un)s
11610 65 74 2e 0a 2a 2a 20 49 66 20 76 61 72 20 69 73  et..** If var is
11620 20 30 2c 20 74 68 65 20 73 65 74 74 69 6e 67 73   0, the settings
11630 20 6e 61 6d 65 20 69 73 20 75 73 65 64 2e 0a 2a   name is used..*
11640 2a 0a 2a 2a 20 77 69 64 74 68 20 69 73 20 74 68  *.** width is th
11650 65 20 6c 65 6e 67 74 68 20 66 6f 72 20 74 68 65  e length for the
11660 20 65 64 69 74 20 66 69 65 6c 64 20 6f 6e 20 74   edit field on t
11670 68 65 20 62 65 68 61 76 69 6f 72 20 70 61 67 65  he behavior page
11680 2c 20 30 0a 2a 2a 20 69 73 20 75 73 65 64 20 66  , 0.** is used f
11690 6f 72 20 6f 6e 2f 6f 66 66 20 63 68 65 63 6b 62  or on/off checkb
116a0 6f 78 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oxes..**.** The 
116b0 62 65 68 61 76 69 6f 75 72 20 70 61 67 65 20 64  behaviour page d
116c0 6f 65 73 6e 27 74 20 75 73 65 20 61 20 73 70 65  oesn't use a spe
116d0 63 69 61 6c 20 6c 61 79 6f 75 74 2e 20 49 74 20  cial layout. It 
116e0 6c 69 73 74 73 20 61 6c 6c 0a 2a 2a 20 73 65 74  lists all.** set
116f0 2d 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 64 69  -commands and di
11700 73 70 6c 61 79 73 20 74 68 65 20 27 73 65 74 27  splays the 'set'
11710 2d 68 65 6c 70 20 61 73 20 69 6e 66 6f 2e 0a 2a  -help as info..*
11720 2f 0a 73 74 72 75 63 74 20 53 65 74 74 69 6e 67  /.struct Setting
11730 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
11740 2a 6e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  *name;     /* Na
11750 6d 65 20 6f 66 20 74 68 65 20 73 65 74 74 69 6e  me of the settin
11760 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  g */.  const cha
11770 72 20 2a 76 61 72 3b 20 20 20 20 20 20 2f 2a 20  r *var;      /* 
11780 49 6e 74 65 72 6e 61 6c 20 76 61 72 69 61 62 6c  Internal variabl
11790 65 20 6e 61 6d 65 20 75 73 65 64 20 62 79 20 64  e name used by d
117a0 62 5f 73 65 74 28 29 20 2a 2f 0a 20 20 69 6e 74  b_set() */.  int
117b0 20 77 69 64 74 68 3b 20 20 20 20 20 20 20 20 20   width;         
117c0 20 20 20 2f 2a 20 57 69 64 74 68 20 6f 66 20 64     /* Width of d
117d0 69 73 70 6c 61 79 2e 20 20 30 20 66 6f 72 20 62  isplay.  0 for b
117e0 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 2a  oolean values. *
117f0 2f 0a 20 20 69 6e 74 20 76 65 72 73 69 6f 6e 61  /.  int versiona
11800 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20 49 73 20  ble;      /* Is 
11810 74 68 69 73 20 73 65 74 74 69 6e 67 20 76 65 72  this setting ver
11820 73 69 6f 6e 61 62 6c 65 3f 20 2a 2f 0a 20 20 69  sionable? */.  i
11830 6e 74 20 66 6f 72 63 65 54 65 78 74 41 72 65 61  nt forceTextArea
11840 3b 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 75 73  ;    /* Force us
11850 69 6e 67 20 61 20 74 65 78 74 20 61 72 65 61 20  ing a text area 
11860 66 6f 72 20 64 69 73 70 6c 61 79 3f 20 2a 2f 0a  for display? */.
11870 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 65    const char *de
11880 66 3b 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75  f;      /* Defau
11890 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 3b 0a 23  lt value */.};.#
118a0 65 6e 64 69 66 20 2f 2a 20 49 4e 54 45 52 46 41  endif /* INTERFA
118b0 43 45 20 2a 2f 0a 0a 63 6f 6e 73 74 20 53 65 74  CE */..const Set
118c0 74 69 6e 67 20 61 53 65 74 74 69 6e 67 5b 5d 20  ting aSetting[] 
118d0 3d 20 7b 0a 20 20 7b 20 22 61 63 63 65 73 73 2d  = {.  { "access-
118e0 6c 6f 67 22 2c 20 20 20 20 20 20 20 30 2c 20 20  log",       0,  
118f0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
11900 2c 20 30 2c 20 22 6f 66 66 22 20 20 20 20 20 20  , 0, "off"      
11910 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
11920 7b 20 22 61 64 6d 69 6e 2d 6c 6f 67 22 2c 20 20  { "admin-log",  
11930 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
11940 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 22        0, 0, 0, "
11950 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20  off"            
11960 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 61 6c 6c       },.  { "all
11970 6f 77 2d 73 79 6d 6c 69 6e 6b 73 22 2c 20 20 20  ow-symlinks",   
11980 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
11990 30 2c 20 31 2c 20 30 2c 20 22 6f 66 66 22 20 20  0, 1, 0, "off"  
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
119b0 2c 0a 20 20 7b 20 22 61 75 74 6f 2d 63 61 70 74  ,.  { "auto-capt
119c0 63 68 61 22 2c 20 20 20 20 20 22 61 75 74 6f 63  cha",     "autoc
119d0 61 70 74 63 68 61 22 2c 20 20 30 2c 20 30 2c 20  aptcha",  0, 0, 
119e0 30 2c 20 22 6f 6e 22 20 20 20 20 20 20 20 20 20  0, "on"         
119f0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
11a00 22 61 75 74 6f 2d 68 79 70 65 72 6c 69 6e 6b 22  "auto-hyperlink"
11a10 2c 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  ,   0,          
11a20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 22 6f 6e      0, 0, 0, "on
11a30 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
11a40 20 20 20 7d 2c 0a 20 20 7b 20 22 61 75 74 6f 2d     },.  { "auto-
11a50 73 68 75 6e 22 2c 20 20 20 20 20 20 20 20 30 2c  shun",        0,
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
11a70 20 30 2c 20 30 2c 20 22 6f 6e 22 20 20 20 20 20   0, 0, "on"     
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
11a90 20 20 7b 20 22 61 75 74 6f 73 79 6e 63 22 2c 20    { "autosync", 
11aa0 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20          0,      
11ab0 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c          0, 0, 0,
11ac0 20 22 6f 6e 22 20 20 20 20 20 20 20 20 20 20 20   "on"           
11ad0 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 61         },.  { "a
11ae0 75 74 6f 73 79 6e 63 2d 74 72 69 65 73 22 2c 20  utosync-tries", 
11af0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
11b00 20 31 36 2c 20 30 2c 20 30 2c 20 22 31 22 20 20   16, 0, 0, "1"  
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b20 20 7d 2c 0a 20 20 7b 20 22 62 69 6e 61 72 79 2d   },.  { "binary-
11b30 67 6c 6f 62 22 2c 20 20 20 20 20 20 30 2c 20 20  glob",      0,  
11b40 20 20 20 20 20 20 20 20 20 20 20 34 30 2c 20 31             40, 1
11b50 2c 20 30 2c 20 22 22 20 20 20 20 20 20 20 20 20  , 0, ""         
11b60 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69             },.#i
11b70 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
11b80 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 43  ) || defined(__C
11b90 59 47 57 49 4e 5f 5f 29 20 7c 7c 20 64 65 66 69  YGWIN__) || defi
11ba0 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 20  ned(__DARWIN__) 
11bb0 7c 7c 20 5c 0a 20 20 20 20 64 65 66 69 6e 65 64  || \.    defined
11bc0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 7b 20  (__APPLE__).  { 
11bd0 22 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65 22  "case-sensitive"
11be0 2c 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  ,   0,          
11bf0 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 22 6f 66      0, 0, 0, "of
11c00 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
11c10 20 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20     },.#else.  { 
11c20 22 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65 22  "case-sensitive"
11c30 2c 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  ,   0,          
11c40 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 22 6f 6e      0, 0, 0, "on
11c50 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
11c60 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7b     },.#endif.  {
11c70 20 22 63 6c 65 61 6e 2d 67 6c 6f 62 22 2c 20 20   "clean-glob",  
11c80 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
11c90 20 20 20 20 34 30 2c 20 31 2c 20 30 2c 20 22 22      40, 1, 0, ""
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cb0 20 20 20 20 7d 2c 0a 20 20 7b 20 22 63 6c 65 61      },.  { "clea
11cc0 72 73 69 67 6e 22 2c 20 20 20 20 20 20 20 20 30  rsign",        0
11cd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
11ce0 2c 20 30 2c 20 30 2c 20 22 6f 66 66 22 20 20 20  , 0, 0, "off"   
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
11d00 0a 20 20 7b 20 22 63 72 6e 6c 2d 67 6c 6f 62 22  .  { "crnl-glob"
11d10 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20  ,        0,     
11d20 20 20 20 20 20 20 20 20 34 30 2c 20 31 2c 20 30          40, 1, 0
11d30 2c 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20  , ""            
11d40 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
11d50 64 65 66 61 75 6c 74 2d 70 65 72 6d 73 22 2c 20  default-perms", 
11d60 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
11d70 20 20 31 36 2c 20 30 2c 20 30 2c 20 22 75 22 20    16, 0, 0, "u" 
11d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d90 20 20 7d 2c 0a 20 20 7b 20 22 64 69 66 66 2d 62    },.  { "diff-b
11da0 69 6e 61 72 79 22 2c 20 20 20 20 20 20 30 2c 20  inary",      0, 
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
11dc0 30 2c 20 30 2c 20 22 6f 6e 22 20 20 20 20 20 20  0, 0, "on"      
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
11de0 20 7b 20 22 64 69 66 66 2d 63 6f 6d 6d 61 6e 64   { "diff-command
11df0 22 2c 20 20 20 20 20 30 2c 20 20 20 20 20 20 20  ",     0,       
11e00 20 20 20 20 20 20 34 30 2c 20 30 2c 20 30 2c 20        40, 0, 0, 
11e10 22 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ""              
11e20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 64 6f        },.  { "do
11e30 6e 74 2d 70 75 73 68 22 2c 20 20 20 20 20 20 20  nt-push",       
11e40 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
11e50 20 30 2c 20 30 2c 20 30 2c 20 22 6f 66 66 22 20   0, 0, 0, "off" 
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e70 7d 2c 0a 20 20 7b 20 22 64 6f 74 66 69 6c 65 73  },.  { "dotfiles
11e80 22 2c 20 20 20 20 20 20 20 20 20 30 2c 20 20 20  ",         0,   
11e90 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 31 2c             0, 1,
11ea0 20 30 2c 20 22 6f 66 66 22 20 20 20 20 20 20 20   0, "off"       
11eb0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
11ec0 20 22 65 64 69 74 6f 72 22 2c 20 20 20 20 20 20   "editor",      
11ed0 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
11ee0 20 20 20 20 33 32 2c 20 30 2c 20 30 2c 20 22 22      32, 0, 0, ""
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f00 20 20 20 20 7d 2c 0a 20 20 7b 20 22 65 6d 70 74      },.  { "empt
11f10 79 2d 64 69 72 73 22 2c 20 20 20 20 20 20 20 30  y-dirs",       0
11f20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 34 30  ,             40
11f30 2c 20 31 2c 20 30 2c 20 22 22 20 20 20 20 20 20  , 1, 0, ""      
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
11f50 0a 20 20 7b 20 22 65 6e 63 6f 64 69 6e 67 2d 67  .  { "encoding-g
11f60 6c 6f 62 22 2c 20 20 20 20 30 2c 20 20 20 20 20  lob",    0,     
11f70 20 20 20 20 20 20 20 20 34 30 2c 20 31 2c 20 30          40, 1, 0
11f80 2c 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20  , ""            
11f90 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
11fa0 67 64 69 66 66 2d 63 6f 6d 6d 61 6e 64 22 2c 20  gdiff-command", 
11fb0 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
11fc0 20 20 34 30 2c 20 30 2c 20 30 2c 20 22 67 64 69    40, 0, 0, "gdi
11fd0 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ff"             
11fe0 20 20 7d 2c 0a 20 20 7b 20 22 67 6d 65 72 67 65    },.  { "gmerge
11ff0 2d 63 6f 6d 6d 61 6e 64 22 2c 20 20 20 30 2c 20  -command",   0, 
12000 20 20 20 20 20 20 20 20 20 20 20 20 34 30 2c 20              40, 
12010 30 2c 20 30 2c 20 22 22 20 20 20 20 20 20 20 20  0, 0, ""        
12020 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
12030 20 7b 20 22 68 61 73 68 2d 64 69 67 69 74 73 22   { "hash-digits"
12040 2c 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20  ,      0,       
12050 20 20 20 20 20 20 20 35 2c 20 30 2c 20 30 2c 20         5, 0, 0, 
12060 22 31 30 22 20 20 20 20 20 20 20 20 20 20 20 20  "10"            
12070 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 68 74        },.  { "ht
12080 74 70 2d 70 6f 72 74 22 2c 20 20 20 20 20 20 20  tp-port",       
12090 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
120a0 31 36 2c 20 30 2c 20 30 2c 20 22 38 30 38 30 22  16, 0, 0, "8080"
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120c0 7d 2c 0a 20 20 7b 20 22 68 74 74 70 73 2d 6c 6f  },.  { "https-lo
120d0 67 69 6e 22 2c 20 20 20 20 20 20 30 2c 20 20 20  gin",      0,   
120e0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
120f0 20 30 2c 20 22 6f 66 66 22 20 20 20 20 20 20 20   0, "off"       
12100 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
12110 20 22 69 67 6e 6f 72 65 2d 67 6c 6f 62 22 2c 20   "ignore-glob", 
12120 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
12130 20 20 20 20 34 30 2c 20 31 2c 20 30 2c 20 22 22      40, 1, 0, ""
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6b 65 65 70      },.  { "keep
12160 2d 67 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 30  -glob",        0
12170 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 34 30  ,             40
12180 2c 20 31 2c 20 30 2c 20 22 22 20 20 20 20 20 20  , 1, 0, ""      
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
121a0 0a 20 20 7b 20 22 6c 6f 63 61 6c 61 75 74 68 22  .  { "localauth"
121b0 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20  ,        0,     
121c0 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30           0, 0, 0
121d0 2c 20 22 6f 66 66 22 20 20 20 20 20 20 20 20 20  , "off"         
121e0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
121f0 6d 61 69 6e 2d 62 72 61 6e 63 68 22 2c 20 20 20  main-branch",   
12200 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
12210 20 20 34 30 2c 20 30 2c 20 30 2c 20 22 74 72 75    40, 0, 0, "tru
12220 6e 6b 22 20 20 20 20 20 20 20 20 20 20 20 20 20  nk"             
12230 20 20 7d 2c 0a 20 20 7b 20 22 6d 61 6e 69 66 65    },.  { "manife
12240 73 74 22 2c 20 20 20 20 20 20 20 20 20 30 2c 20  st",         0, 
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
12260 31 2c 20 30 2c 20 22 6f 66 66 22 20 20 20 20 20  1, 0, "off"     
12270 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
12280 20 7b 20 22 6d 61 78 2d 6c 6f 61 64 61 76 67 22   { "max-loadavg"
12290 2c 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20  ,      0,       
122a0 20 20 20 20 20 20 32 35 2c 20 30 2c 20 30 2c 20        25, 0, 0, 
122b0 22 30 2e 30 22 20 20 20 20 20 20 20 20 20 20 20  "0.0"           
122c0 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 6d 61        },.  { "ma
122d0 78 2d 75 70 6c 6f 61 64 22 2c 20 20 20 20 20 20  x-upload",      
122e0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
122f0 32 35 2c 20 30 2c 20 30 2c 20 22 32 35 30 30 30  25, 0, 0, "25000
12300 30 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0"              
12310 7d 2c 0a 20 20 7b 20 22 6d 74 69 6d 65 2d 63 68  },.  { "mtime-ch
12320 61 6e 67 65 73 22 2c 20 20 20 20 30 2c 20 20 20  anges",    0,   
12330 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
12340 20 30 2c 20 22 6f 6e 22 20 20 20 20 20 20 20 20   0, "on"        
12350 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66            },.#if
12360 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4c   FOSSIL_ENABLE_L
12370 45 47 41 43 59 5f 4d 56 5f 52 4d 0a 20 20 7b 20  EGACY_MV_RM.  { 
12380 22 6d 76 2d 72 6d 2d 66 69 6c 65 73 22 2c 20 20  "mv-rm-files",  
12390 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
123a0 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 22 6f 66      0, 0, 0, "of
123b0 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
123c0 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7b     },.#endif.  {
123d0 20 22 70 67 70 2d 63 6f 6d 6d 61 6e 64 22 2c 20   "pgp-command", 
123e0 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
123f0 20 20 20 20 34 30 2c 20 30 2c 20 30 2c 20 22 67      40, 0, 0, "g
12400 70 67 20 2d 2d 63 6c 65 61 72 73 69 67 6e 20 2d  pg --clearsign -
12410 6f 20 22 20 7d 2c 0a 20 20 7b 20 22 70 72 6f 78  o " },.  { "prox
12420 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  y",            0
12430 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 33 32  ,             32
12440 2c 20 30 2c 20 30 2c 20 22 6f 66 66 22 20 20 20  , 0, 0, "off"   
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
12460 0a 20 20 7b 20 22 72 65 6c 61 74 69 76 65 2d 70  .  { "relative-p
12470 61 74 68 73 22 2c 20 20 20 30 2c 20 20 20 20 20  aths",   0,     
12480 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30           0, 0, 0
12490 2c 20 22 6f 6e 22 20 20 20 20 20 20 20 20 20 20  , "on"          
124a0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
124b0 72 65 70 6f 2d 63 6b 73 75 6d 22 2c 20 20 20 20  repo-cksum",    
124c0 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
124d0 20 20 20 30 2c 20 30 2c 20 30 2c 20 22 6f 6e 22     0, 0, 0, "on"
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124f0 20 20 7d 2c 0a 20 20 7b 20 22 73 65 6c 66 2d 72    },.  { "self-r
12500 65 67 69 73 74 65 72 22 2c 20 20 20 20 30 2c 20  egister",    0, 
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
12520 30 2c 20 30 2c 20 22 6f 66 66 22 20 20 20 20 20  0, 0, "off"     
12530 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
12540 20 7b 20 22 73 73 68 2d 63 6f 6d 6d 61 6e 64 22   { "ssh-command"
12550 2c 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20  ,      0,       
12560 20 20 20 20 20 20 34 30 2c 20 30 2c 20 30 2c 20        40, 0, 0, 
12570 22 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ""              
12580 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 73 73        },.  { "ss
12590 6c 2d 63 61 2d 6c 6f 63 61 74 69 6f 6e 22 2c 20  l-ca-location", 
125a0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
125b0 34 30 2c 20 30 2c 20 30 2c 20 22 22 20 20 20 20  40, 0, 0, ""    
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125d0 7d 2c 0a 20 20 7b 20 22 73 73 6c 2d 69 64 65 6e  },.  { "ssl-iden
125e0 74 69 74 79 22 2c 20 20 20 20 20 30 2c 20 20 20  tity",     0,   
125f0 20 20 20 20 20 20 20 20 20 20 34 30 2c 20 30 2c            40, 0,
12600 20 30 2c 20 22 22 20 20 20 20 20 20 20 20 20 20   0, ""          
12610 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66            },.#if
12620 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c  def FOSSIL_ENABL
12630 45 5f 54 43 4c 0a 20 20 7b 20 22 74 63 6c 22 2c  E_TCL.  { "tcl",
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
12660 20 30 2c 20 30 2c 20 22 6f 66 66 22 20 20 20 20   0, 0, "off"    
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
12680 20 20 7b 20 22 74 63 6c 2d 73 65 74 75 70 22 2c    { "tcl-setup",
12690 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20          0,      
126a0 20 20 20 20 20 20 20 34 30 2c 20 31 2c 20 31 2c         40, 1, 1,
126b0 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20 20   ""             
126c0 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66         },.#endif
126d0 0a 23 69 66 64 65 66 20 46 4f 53 53 49 4c 5f 45  .#ifdef FOSSIL_E
126e0 4e 41 42 4c 45 5f 54 48 31 5f 44 4f 43 53 0a 20  NABLE_TH1_DOCS. 
126f0 20 7b 20 22 74 68 31 2d 64 6f 63 73 22 2c 20 20   { "th1-docs",  
12700 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
12710 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20         0, 0, 0, 
12720 22 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20  "off"           
12730 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a        },.#endif.
12740 23 69 66 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e  #ifdef FOSSIL_EN
12750 41 42 4c 45 5f 54 48 31 5f 48 4f 4f 4b 53 0a 20  ABLE_TH1_HOOKS. 
12760 20 7b 20 22 74 68 31 2d 68 6f 6f 6b 73 22 2c 20   { "th1-hooks", 
12770 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20         0,       
12780 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20         0, 0, 0, 
12790 22 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20  "off"           
127a0 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a        },.#endif.
127b0 20 20 7b 20 22 74 68 31 2d 73 65 74 75 70 22 2c    { "th1-setup",
127c0 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20 20          0,      
127d0 20 20 20 20 20 20 20 34 30 2c 20 31 2c 20 31 2c         40, 1, 1,
127e0 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20 20   ""             
127f0 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 74         },.  { "t
12800 68 31 2d 75 72 69 2d 72 65 67 65 78 70 22 2c 20  h1-uri-regexp", 
12810 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
12820 20 34 30 2c 20 31 2c 20 30 2c 20 22 22 20 20 20   40, 1, 0, ""   
12830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12840 20 7d 2c 0a 20 20 7b 20 22 77 65 62 2d 62 72 6f   },.  { "web-bro
12850 77 73 65 72 22 2c 20 20 20 20 20 20 30 2c 20 20  wser",      0,  
12860 20 20 20 20 20 20 20 20 20 20 20 33 32 2c 20 30             32, 0
12870 2c 20 30 2c 20 22 22 20 20 20 20 20 20 20 20 20  , 0, ""         
12880 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
12890 7b 20 30 2c 30 2c 30 2c 30 2c 30 2c 30 20 7d 0a  { 0,0,0,0,0,0 }.
128a0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 75  };../*.** Look u
128b0 70 20 61 20 63 6f 6e 74 72 6f 6c 20 73 65 74 74  p a control sett
128c0 69 6e 67 20 62 79 20 69 74 73 20 6e 61 6d 65 2e  ing by its name.
128d0 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
128e0 65 72 20 74 6f 20 74 68 65 20 53 65 74 74 69 6e  er to the Settin
128f0 67 0a 2a 2a 20 6f 62 6a 65 63 74 2c 20 6f 72 20  g.** object, or 
12900 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73  NULL if there is
12910 20 6e 6f 20 73 75 63 68 20 73 65 74 74 69 6e 67   no such setting
12920 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 6f 77  ..**.** If allow
12930 50 72 65 66 69 78 20 69 73 20 74 72 75 65 2c 20  Prefix is true, 
12940 74 68 65 6e 20 74 68 65 20 53 65 74 74 69 6e 67  then the Setting
12950 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
12960 20 66 69 72 73 74 20 6f 6e 65 20 66 6f 72 0a 2a   first one for.*
12970 2a 20 77 68 69 63 68 20 7a 4e 61 6d 65 20 69 73  * which zName is
12980 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
12990 20 53 65 74 74 69 6e 67 20 6e 61 6d 65 2e 0a 2a   Setting name..*
129a0 2f 0a 63 6f 6e 73 74 20 53 65 74 74 69 6e 67 20  /.const Setting 
129b0 2a 64 62 5f 66 69 6e 64 5f 73 65 74 74 69 6e 67  *db_find_setting
129c0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
129d0 6d 65 2c 20 69 6e 74 20 61 6c 6c 6f 77 50 72 65  me, int allowPre
129e0 66 69 78 29 7b 0a 20 20 69 6e 74 20 6c 77 72 2c  fix){.  int lwr,
129f0 20 6d 69 64 2c 20 75 70 72 2c 20 63 3b 0a 20 20   mid, upr, c;.  
12a00 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72  int n = (int)str
12a10 6c 65 6e 28 7a 4e 61 6d 65 29 20 2b 20 21 61 6c  len(zName) + !al
12a20 6c 6f 77 50 72 65 66 69 78 3b 0a 20 20 6c 77 72  lowPrefix;.  lwr
12a30 20 3d 20 30 3b 0a 20 20 75 70 72 20 3d 20 41 72   = 0;.  upr = Ar
12a40 72 61 79 53 69 7a 65 28 61 53 65 74 74 69 6e 67  raySize(aSetting
12a50 29 2d 32 3b 0a 20 20 77 68 69 6c 65 28 20 75 70  )-2;.  while( up
12a60 72 3e 3d 6c 77 72 20 29 7b 0a 20 20 20 20 6d 69  r>=lwr ){.    mi
12a70 64 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b  d = (upr+lwr)/2;
12a80 0a 20 20 20 20 63 20 3d 20 66 6f 73 73 69 6c 5f  .    c = fossil_
12a90 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 61  strncmp(zName, a
12aa0 53 65 74 74 69 6e 67 5b 6d 69 64 5d 2e 6e 61 6d  Setting[mid].nam
12ab0 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 63  e, n);.    if( c
12ac0 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 70 72 20  <0 ){.      upr 
12ad0 3d 20 6d 69 64 20 2d 20 31 3b 0a 20 20 20 20 7d  = mid - 1;.    }
12ae0 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a  else if( c>0 ){.
12af0 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 20        lwr = mid 
12b00 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  + 1;.    }else{.
12b10 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77 50        if( allowP
12b20 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 20  refix ){.       
12b30 20 77 68 69 6c 65 28 20 6d 69 64 3e 6c 77 72 20   while( mid>lwr 
12b40 26 26 20 66 6f 73 73 69 6c 5f 73 74 72 6e 63 6d  && fossil_strncm
12b50 70 28 7a 4e 61 6d 65 2c 20 61 53 65 74 74 69 6e  p(zName, aSettin
12b60 67 5b 6d 69 64 2d 31 5d 2e 6e 61 6d 65 2c 20 6e  g[mid-1].name, n
12b70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12b80 20 20 6d 69 64 2d 2d 3b 0a 20 20 20 20 20 20 20    mid--;.       
12b90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
12ba0 20 72 65 74 75 72 6e 20 26 61 53 65 74 74 69 6e   return &aSettin
12bb0 67 5b 6d 69 64 5d 3b 0a 20 20 20 20 7d 0a 20 20  g[mid];.    }.  
12bc0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
12bd0 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20  ./*.** COMMAND: 
12be0 73 65 74 74 69 6e 67 73 0a 2a 2a 20 43 4f 4d 4d  settings.** COMM
12bf0 41 4e 44 3a 20 75 6e 73 65 74 2a 0a 2a 2a 0a 2a  AND: unset*.**.*
12c00 2a 20 25 66 6f 73 73 69 6c 20 73 65 74 74 69 6e  * %fossil settin
12c10 67 73 20 3f 50 52 4f 50 45 52 54 59 3f 20 3f 56  gs ?PROPERTY? ?V
12c20 41 4c 55 45 3f 20 3f 4f 50 54 49 4f 4e 53 3f 0a  ALUE? ?OPTIONS?.
12c30 2a 2a 20 25 66 6f 73 73 69 6c 20 75 6e 73 65 74  ** %fossil unset
12c40 20 50 52 4f 50 45 52 54 59 20 3f 4f 50 54 49 4f   PROPERTY ?OPTIO
12c50 4e 53 3f 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 73  NS?.**.** The "s
12c60 65 74 74 69 6e 67 73 22 20 63 6f 6d 6d 61 6e 64  ettings" command
12c70 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e   with no argumen
12c80 74 73 20 6c 69 73 74 73 20 61 6c 6c 20 70 72 6f  ts lists all pro
12c90 70 65 72 74 69 65 73 20 61 6e 64 20 74 68 65 69  perties and thei
12ca0 72 0a 2a 2a 20 76 61 6c 75 65 73 2e 20 20 57 69  r.** values.  Wi
12cb0 74 68 20 6a 75 73 74 20 61 20 70 72 6f 70 65 72  th just a proper
12cc0 74 79 20 6e 61 6d 65 20 69 74 20 73 68 6f 77 73  ty name it shows
12cd0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
12ce0 61 74 20 70 72 6f 70 65 72 74 79 2e 0a 2a 2a 20  at property..** 
12cf0 57 69 74 68 20 61 20 76 61 6c 75 65 20 61 72 67  With a value arg
12d00 75 6d 65 6e 74 20 69 74 20 63 68 61 6e 67 65 73  ument it changes
12d10 20 74 68 65 20 70 72 6f 70 65 72 74 79 20 66 6f   the property fo
12d20 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  r the current re
12d30 70 6f 73 69 74 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  pository..**.** 
12d40 53 65 74 74 69 6e 67 73 20 6d 61 72 6b 65 64 20  Settings marked 
12d50 61 73 20 76 65 72 73 69 6f 6e 61 62 6c 65 20 61  as versionable a
12d60 72 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  re overridden by
12d70 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12d80 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6e 61 6d   the.** file nam
12d90 65 64 20 2e 66 6f 73 73 69 6c 2d 73 65 74 74 69  ed .fossil-setti
12da0 6e 67 73 2f 50 52 4f 50 45 52 54 59 20 69 6e 20  ngs/PROPERTY in 
12db0 74 68 65 20 63 68 65 63 6b 65 64 20 6f 75 74 20  the checked out 
12dc0 66 69 6c 65 73 2c 20 69 66 20 74 68 61 74 0a 2a  files, if that.*
12dd0 2a 20 66 69 6c 65 20 65 78 69 73 74 73 2e 0a 2a  * file exists..*
12de0 2a 0a 2a 2a 20 54 68 65 20 22 75 6e 73 65 74 22  *.** The "unset"
12df0 20 63 6f 6d 6d 61 6e 64 20 63 6c 65 61 72 73 20   command clears 
12e00 61 20 70 72 6f 70 65 72 74 79 20 73 65 74 74 69  a property setti
12e10 6e 67 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20  ng..**.**.**    
12e20 61 63 63 65 73 73 2d 6c 6f 67 20 20 20 20 20 20  access-log      
12e30 20 49 66 20 65 6e 61 62 6c 65 64 2c 20 72 65 63   If enabled, rec
12e40 6f 72 64 20 73 75 63 63 65 73 73 66 75 6c 20 61  ord successful a
12e50 6e 64 20 66 61 69 6c 65 64 20 6c 6f 67 69 6e 20  nd failed login 
12e60 61 74 74 65 6d 70 74 73 0a 2a 2a 20 20 20 20 20  attempts.**     
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 69 6e 20 74 68 65 20 22 61 63 63 65 73 73 6c 6f  in the "accesslo
12e90 67 22 20 74 61 62 6c 65 2e 20 20 44 65 66 61 75  g" table.  Defau
12ea0 6c 74 3a 20 6f 66 66 0a 2a 2a 0a 2a 2a 20 20 20  lt: off.**.**   
12eb0 20 61 64 6d 69 6e 2d 6c 6f 67 20 20 20 20 20 20   admin-log      
12ec0 20 20 49 66 20 65 6e 61 62 6c 65 64 2c 20 72 65    If enabled, re
12ed0 63 6f 72 64 20 63 6f 6e 66 69 67 75 72 61 74 69  cord configurati
12ee0 6f 6e 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68  on changes in th
12ef0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
12f00 20 20 20 20 20 20 20 20 20 22 61 64 6d 69 6e 5f           "admin_
12f10 6c 6f 67 22 20 74 61 62 6c 65 2e 20 20 44 65 66  log" table.  Def
12f20 61 75 6c 74 3a 20 6f 66 66 0a 2a 2a 0a 2a 2a 20  ault: off.**.** 
12f30 20 20 20 61 6c 6c 6f 77 2d 73 79 6d 6c 69 6e 6b     allow-symlink
12f40 73 20 20 20 49 66 20 65 6e 61 62 6c 65 64 2c 20  s   If enabled, 
12f50 64 6f 6e 27 74 20 66 6f 6c 6c 6f 77 20 73 79 6d  don't follow sym
12f60 6c 69 6e 6b 73 2c 20 61 6e 64 20 69 6e 73 74 65  links, and inste
12f70 61 64 20 74 72 65 61 74 0a 2a 2a 20 20 20 20 20  ad treat.**     
12f80 28 76 65 72 73 69 6f 6e 61 62 6c 65 29 20 20 20  (versionable)   
12f90 74 68 65 6d 20 61 73 20 73 79 6d 6c 69 6e 6b 73  them as symlinks
12fa0 20 6f 6e 20 55 6e 69 78 2e 20 48 61 73 20 6e 6f   on Unix. Has no
12fb0 20 65 66 66 65 63 74 20 6f 6e 20 57 69 6e 64 6f   effect on Windo
12fc0 77 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ws.**           
12fd0 20 20 20 20 20 20 20 20 20 20 28 65 78 69 73 74            (exist
12fe0 69 6e 67 20 6c 69 6e 6b 73 20 69 6e 20 72 65 70  ing links in rep
12ff0 6f 73 69 74 6f 72 79 20 63 72 65 61 74 65 64 20  ository created 
13000 6f 6e 20 55 6e 69 78 20 62 65 63 6f 6d 65 0a 2a  on Unix become.*
13010 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
13020 20 20 20 20 20 20 70 6c 61 69 6e 2d 74 65 78 74        plain-text
13030 20 66 69 6c 65 73 20 77 69 74 68 20 6c 69 6e 6b   files with link
13040 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 70 61 74   destination pat
13050 68 20 69 6e 73 69 64 65 29 2e 0a 2a 2a 20 20 20  h inside)..**   
13060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13070 20 20 44 65 66 61 75 6c 74 3a 20 6f 66 66 0a 2a    Default: off.*
13080 2a 0a 2a 2a 20 20 20 20 61 75 74 6f 2d 63 61 70  *.**    auto-cap
13090 74 63 68 61 20 20 20 20 20 49 66 20 65 6e 61 62  tcha     If enab
130a0 6c 65 64 2c 20 74 68 65 20 4c 6f 67 69 6e 20 70  led, the Login p
130b0 61 67 65 20 70 72 6f 76 69 64 65 73 20 61 20 62  age provides a b
130c0 75 74 74 6f 6e 20 74 6f 0a 2a 2a 20 20 20 20 20  utton to.**     
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130e0 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 61 70 74  fill in the capt
130f0 63 68 61 20 70 61 73 73 77 6f 72 64 2e 20 20 44  cha password.  D
13100 65 66 61 75 6c 74 3a 20 6f 6e 0a 2a 2a 0a 2a 2a  efault: on.**.**
13110 20 20 20 20 61 75 74 6f 2d 68 79 70 65 72 6c 69      auto-hyperli
13120 6e 6b 20 20 20 55 73 65 20 6a 61 76 61 73 63 72  nk   Use javascr
13130 69 70 74 20 74 6f 20 65 6e 61 62 6c 65 20 68 79  ipt to enable hy
13140 70 65 72 6c 69 6e 6b 73 20 6f 6e 20 77 65 62 20  perlinks on web 
13150 70 61 67 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  pages.**        
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
13170 20 61 6c 6c 20 75 73 65 72 73 20 28 72 65 67 61   all users (rega
13180 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 22 68  rdless of the "h
13190 22 20 70 72 69 76 69 6c 65 67 65 29 20 69 66 20  " privilege) if 
131a0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
131b0 20 20 20 20 20 20 20 20 20 20 20 55 73 65 72 2d             User-
131c0 41 67 65 6e 74 20 73 74 72 69 6e 67 20 69 6e 20  Agent string in 
131d0 74 68 65 20 48 54 54 50 20 68 65 61 64 65 72 20  the HTTP header 
131e0 6c 6f 6f 6b 20 6c 69 6b 65 20 69 74 20 63 61 6d  look like it cam
131f0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
13200 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 72 65           from re
13210 61 6c 20 70 65 72 73 6f 6e 2c 20 6e 6f 74 20 61  al person, not a
13220 20 73 70 69 64 65 72 20 6f 72 20 62 6f 74 2e 20   spider or bot. 
13230 20 44 65 66 61 75 6c 74 3a 20 6f 6e 0a 2a 2a 0a   Default: on.**.
13240 2a 2a 20 20 20 20 61 75 74 6f 2d 73 68 75 6e 20  **    auto-shun 
13250 20 20 20 20 20 20 20 49 66 20 65 6e 61 62 6c 65         If enable
13260 64 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  d, automatically
13270 20 70 75 6c 6c 20 74 68 65 20 73 68 75 6e 6e 69   pull the shunni
13280 6e 67 20 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20  ng list.**      
13290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
132a0 72 6f 6d 20 61 20 73 65 72 76 65 72 20 74 6f 20  rom a server to 
132b0 77 68 69 63 68 20 74 68 65 20 63 6c 69 65 6e 74  which the client
132c0 20 61 75 74 6f 73 79 6e 63 73 2e 0a 2a 2a 20 20   autosyncs..**  
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132e0 20 20 20 44 65 66 61 75 6c 74 3a 20 6f 6e 0a 2a     Default: on.*
132f0 2a 0a 2a 2a 20 20 20 20 61 75 74 6f 73 79 6e 63  *.**    autosync
13300 20 20 20 20 20 20 20 20 20 49 66 20 65 6e 61 62           If enab
13310 6c 65 64 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c  led, automatical
13320 6c 79 20 70 75 6c 6c 20 70 72 69 6f 72 20 74 6f  ly pull prior to
13330 20 63 6f 6d 6d 69 74 0a 2a 2a 20 20 20 20 20 20   commit.**      
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
13350 72 20 75 70 64 61 74 65 20 61 6e 64 20 61 75 74  r update and aut
13360 6f 6d 61 74 69 63 61 6c 6c 79 20 70 75 73 68 20  omatically push 
13370 61 66 74 65 72 20 63 6f 6d 6d 69 74 20 6f 72 0a  after commit or.
13380 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
13390 20 20 20 20 20 20 20 74 61 67 20 6f 72 20 62 72         tag or br
133a0 61 6e 63 68 20 63 72 65 61 74 69 6f 6e 2e 20 20  anch creation.  
133b0 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  If the value is 
133c0 22 70 75 6c 6c 6f 6e 6c 79 22 0a 2a 2a 20 20 20  "pullonly".**   
133d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133e0 20 20 74 68 65 6e 20 6f 6e 6c 79 20 70 75 6c 6c    then only pull
133f0 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75   operations occu
13400 72 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  r automatically.
13410 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13420 20 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 3a          Default:
13430 20 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 61 75 74   on.**.**    aut
13440 6f 73 79 6e 63 2d 74 72 69 65 73 20 20 20 49 66  osync-tries   If
13450 20 61 75 74 6f 73 79 6e 63 20 69 73 20 65 6e 61   autosync is ena
13460 62 6c 65 64 20 73 65 74 74 69 6e 67 20 74 68 69  bled setting thi
13470 73 20 74 6f 20 61 20 76 61 6c 75 65 20 67 72 65  s to a value gre
13480 61 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  ater.**         
13490 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 6e              than
134a0 20 7a 65 72 6f 20 77 69 6c 6c 20 63 61 75 73 65   zero will cause
134b0 20 61 75 74 6f 73 79 6e 63 20 74 6f 20 74 72 79   autosync to try
134c0 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 74 68   no more than th
134d0 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  is.**           
134e0 20 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72            number
134f0 20 6f 66 20 61 74 74 65 6d 70 74 73 20 69 66 20   of attempts if 
13500 74 68 65 72 65 20 69 73 20 61 20 73 79 6e 63 20  there is a sync 
13510 66 61 69 6c 75 72 65 2e 0a 2a 2a 20 20 20 20 20  failure..**     
13520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13530 44 65 66 61 75 6c 74 3a 20 31 0a 2a 2a 0a 2a 2a  Default: 1.**.**
13540 20 20 20 20 62 69 6e 61 72 79 2d 67 6c 6f 62 20      binary-glob 
13550 20 20 20 20 20 54 68 65 20 56 41 4c 55 45 20 69       The VALUE i
13560 73 20 61 20 63 6f 6d 6d 61 20 6f 72 20 6e 65 77  s a comma or new
13570 6c 69 6e 65 2d 73 65 70 61 72 61 74 65 64 20 6c  line-separated l
13580 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 28 76  ist of.**     (v
13590 65 72 73 69 6f 6e 61 62 6c 65 29 20 20 20 47 4c  ersionable)   GL
135a0 4f 42 20 70 61 74 74 65 72 6e 73 20 74 68 61 74  OB patterns that
135b0 20 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61 74   should be treat
135c0 65 64 20 61 73 20 62 69 6e 61 72 79 20 66 69 6c  ed as binary fil
135d0 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
135e0 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 63 6f            for co
135f0 6d 6d 69 74 74 69 6e 67 20 61 6e 64 20 6d 65 72  mmitting and mer
13600 67 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20  ging purposes.  
13610 45 78 61 6d 70 6c 65 3a 20 2a 2e 6a 70 67 0a 2a  Example: *.jpg.*
13620 2a 0a 2a 2a 20 20 20 20 63 61 73 65 2d 73 65 6e  *.**    case-sen
13630 73 69 74 69 76 65 20 20 20 49 66 20 54 52 55 45  sitive   If TRUE
13640 2c 20 74 68 65 20 66 69 6c 65 73 20 77 68 6f 73  , the files whos
13650 65 20 6e 61 6d 65 73 20 64 69 66 66 65 72 20 6f  e names differ o
13660 6e 6c 79 20 69 6e 20 63 61 73 65 0a 2a 2a 20 20  nly in case.**  
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13680 20 20 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65     are considere
13690 64 20 64 69 73 74 69 6e 63 74 2e 20 20 49 66 20  d distinct.  If 
136a0 46 41 4c 53 45 20 66 69 6c 65 73 20 77 68 6f 73  FALSE files whos
136b0 65 20 6e 61 6d 65 73 0a 2a 2a 20 20 20 20 20 20  e names.**      
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
136d0 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e 20 63 61  iffer only in ca
136e0 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  se are the same 
136f0 66 69 6c 65 2e 20 20 44 65 66 61 75 6c 74 73 20  file.  Defaults 
13700 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
13710 20 20 20 20 20 20 20 20 20 20 54 52 55 45 20 66            TRUE f
13720 6f 72 20 75 6e 69 78 20 61 6e 64 20 46 41 4c 53  or unix and FALS
13730 45 20 66 6f 72 20 43 79 67 77 69 6e 2c 20 4d 61  E for Cygwin, Ma
13740 63 20 61 6e 64 20 57 69 6e 64 6f 77 73 2e 0a 2a  c and Windows..*
13750 2a 0a 2a 2a 20 20 20 20 63 6c 65 61 6e 2d 67 6c  *.**    clean-gl
13760 6f 62 20 20 20 20 20 20 20 54 68 65 20 56 41 4c  ob       The VAL
13770 55 45 20 69 73 20 61 20 63 6f 6d 6d 61 20 6f 72  UE is a comma or
13780 20 6e 65 77 6c 69 6e 65 2d 73 65 70 61 72 61 74   newline-separat
13790 65 64 20 6c 69 73 74 20 6f 66 20 47 4c 4f 42 0a  ed list of GLOB.
137a0 2a 2a 20 20 20 20 20 28 76 65 72 73 69 6f 6e 61  **     (versiona
137b0 62 6c 65 29 20 20 20 70 61 74 74 65 72 6e 73 20  ble)   patterns 
137c0 73 70 65 63 69 66 79 69 6e 67 20 66 69 6c 65 73  specifying files
137d0 20 74 68 61 74 20 74 68 65 20 22 63 6c 65 61 6e   that the "clean
137e0 22 20 63 6f 6d 6d 61 6e 64 20 77 69 6c 6c 0a 2a  " command will.*
137f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
13800 20 20 20 20 20 20 64 65 6c 65 74 65 20 77 69 74        delete wit
13810 68 6f 75 74 20 70 72 6f 6d 70 74 69 6e 67 20 65  hout prompting e
13820 76 65 6e 20 77 68 65 6e 20 74 68 65 20 2d 66 6f  ven when the -fo
13830 72 63 65 20 66 6c 61 67 20 68 61 73 0a 2a 2a 20  rce flag has.** 
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 20 20 20 20 6e 6f 74 20 62 65 65 6e 20 75 73 65      not been use
13860 64 2e 20 20 45 78 61 6d 70 6c 65 3a 20 20 2a 2e  d.  Example:  *.
13870 61 20 2a 2e 6c 69 62 20 2a 2e 6f 0a 2a 2a 0a 2a  a *.lib *.o.**.*
13880 2a 20 20 20 20 63 6c 65 61 72 73 69 67 6e 20 20  *    clearsign  
13890 20 20 20 20 20 20 57 68 65 6e 20 65 6e 61 62 6c        When enabl
138a0 65 64 2c 20 66 6f 73 73 69 6c 20 77 69 6c 6c 20  ed, fossil will 
138b0 61 74 74 65 6d 70 74 20 74 6f 20 73 69 67 6e 20  attempt to sign 
138c0 61 6c 6c 20 63 6f 6d 6d 69 74 73 0a 2a 2a 20 20  all commits.**  
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138e0 20 20 20 77 69 74 68 20 67 70 67 2e 20 20 57 68     with gpg.  Wh
138f0 65 6e 20 64 69 73 61 62 6c 65 64 20 28 74 68 65  en disabled (the
13900 20 64 65 66 61 75 6c 74 29 2c 20 63 6f 6d 6d 69   default), commi
13910 74 73 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 20  ts will.**      
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
13930 65 20 75 6e 73 69 67 6e 65 64 2e 20 20 44 65 66  e unsigned.  Def
13940 61 75 6c 74 3a 20 6f 66 66 0a 2a 2a 0a 2a 2a 20  ault: off.**.** 
13950 20 20 20 63 72 6e 6c 2d 67 6c 6f 62 20 20 20 20     crnl-glob    
13960 20 20 20 20 41 20 63 6f 6d 6d 61 20 6f 72 20 6e      A comma or n
13970 65 77 6c 69 6e 65 2d 73 65 70 61 72 61 74 65 64  ewline-separated
13980 20 6c 69 73 74 20 6f 66 20 47 4c 4f 42 20 70 61   list of GLOB pa
13990 74 74 65 72 6e 73 20 66 6f 72 0a 2a 2a 20 20 20  tterns for.**   
139a0 20 20 28 76 65 72 73 69 6f 6e 61 62 6c 65 29 20    (versionable) 
139b0 20 20 74 65 78 74 20 66 69 6c 65 73 20 69 6e 20    text files in 
139c0 77 68 69 63 68 20 69 74 20 69 73 20 6f 6b 20 74  which it is ok t
139d0 6f 20 68 61 76 65 20 43 52 2c 20 43 52 2b 4e 4c  o have CR, CR+NL
139e0 20 6f 72 20 6d 69 78 65 64 0a 2a 2a 20 20 20 20   or mixed.**    
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a00 20 6c 69 6e 65 20 65 6e 64 69 6e 67 73 2e 20 53   line endings. S
13a10 65 74 20 74 6f 20 22 2a 22 20 74 6f 20 64 69 73  et to "*" to dis
13a20 61 62 6c 65 20 43 52 2b 4e 4c 20 63 68 65 63 6b  able CR+NL check
13a30 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 64 65  ing..**.**    de
13a40 66 61 75 6c 74 2d 70 65 72 6d 73 20 20 20 20 50  fault-perms    P
13a50 65 72 6d 69 73 73 69 6f 6e 73 20 67 69 76 65 6e  ermissions given
13a60 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74   automatically t
13a70 6f 20 6e 65 77 20 75 73 65 72 73 2e 20 20 46 6f  o new users.  Fo
13a80 72 20 6d 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20  r more.**       
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
13aa0 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 65 72  formation on per
13ab0 6d 69 73 73 69 6f 6e 73 20 73 65 65 20 55 73 65  missions see Use
13ac0 72 73 20 70 61 67 65 20 69 6e 20 53 65 72 76 65  rs page in Serve
13ad0 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
13ae0 20 20 20 20 20 20 20 20 20 41 64 6d 69 6e 69 73           Adminis
13af0 74 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 48  tration of the H
13b00 54 54 50 20 55 49 2e 20 44 65 66 61 75 6c 74 3a  TTP UI. Default:
13b10 20 75 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 64 69 66   u..**.**    dif
13b20 66 2d 62 69 6e 61 72 79 20 20 20 20 20 20 49 66  f-binary      If
13b30 20 54 52 55 45 20 28 74 68 65 20 64 65 66 61 75   TRUE (the defau
13b40 6c 74 29 2c 20 70 65 72 6d 69 74 20 66 69 6c 65  lt), permit file
13b50 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 62 69  s that may be bi
13b60 6e 61 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  nary.**         
13b70 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 20 74              or t
13b80 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 22 62  hat match the "b
13b90 69 6e 61 72 79 2d 67 6c 6f 62 22 20 73 65 74 74  inary-glob" sett
13ba0 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 77  ing to be used w
13bb0 69 74 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ith.**          
13bc0 20 20 20 20 20 20 20 20 20 20 20 65 78 74 65 72             exter
13bd0 6e 61 6c 20 64 69 66 66 20 70 72 6f 67 72 61 6d  nal diff program
13be0 73 2e 20 20 49 66 20 46 41 4c 53 45 2c 20 73 6b  s.  If FALSE, sk
13bf0 69 70 20 74 68 65 73 65 20 66 69 6c 65 73 2e 0a  ip these files..
13c00 2a 2a 0a 2a 2a 20 20 20 20 64 69 66 66 2d 63 6f  **.**    diff-co
13c10 6d 6d 61 6e 64 20 20 20 20 20 45 78 74 65 72 6e  mmand     Extern
13c20 61 6c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 75  al command to ru
13c30 6e 20 77 68 65 6e 20 70 65 72 66 6f 72 6d 69 6e  n when performin
13c40 67 20 61 20 64 69 66 66 2e 0a 2a 2a 20 20 20 20  g a diff..**    
13c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c60 20 49 66 20 75 6e 64 65 66 69 6e 65 64 2c 20 74   If undefined, t
13c70 68 65 20 69 6e 74 65 72 6e 61 6c 20 74 65 78 74  he internal text
13c80 20 64 69 66 66 20 77 69 6c 6c 20 62 65 20 75 73   diff will be us
13c90 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 64 6f 6e  ed..**.**    don
13ca0 74 2d 70 75 73 68 20 20 20 20 20 20 20 20 50 72  t-push        Pr
13cb0 65 76 65 6e 74 20 74 68 69 73 20 72 65 70 6f 73  event this repos
13cc0 69 74 6f 72 79 20 66 72 6f 6d 20 70 75 73 68 69  itory from pushi
13cd0 6e 67 20 66 72 6f 6d 20 63 6c 69 65 6e 74 20 74  ng from client t
13ce0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
13cf0 20 20 20 20 20 20 20 20 20 73 65 72 76 65 72 2e           server.
13d00 20 20 55 73 65 66 75 6c 20 77 68 65 6e 20 73 65    Useful when se
13d10 74 74 69 6e 67 20 75 70 20 61 20 70 72 69 76 61  tting up a priva
13d20 74 65 20 62 72 61 6e 63 68 2e 0a 2a 2a 0a 2a 2a  te branch..**.**
13d30 20 20 20 20 64 6f 74 66 69 6c 65 73 20 20 20 20      dotfiles    
13d40 20 20 20 20 20 49 6e 63 6c 75 64 65 20 2d 2d 64       Include --d
13d50 6f 74 66 69 6c 65 73 20 6f 70 74 69 6f 6e 20 66  otfiles option f
13d60 6f 72 20 61 6c 6c 20 63 6f 6d 70 61 74 69 62 6c  or all compatibl
13d70 65 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 20 20  e commands..**  
13d80 20 20 20 28 76 65 72 73 69 6f 6e 61 62 6c 65 29     (versionable)
13d90 0a 2a 2a 0a 2a 2a 20 20 20 20 65 64 69 74 6f 72  .**.**    editor
13da0 20 20 20 20 20 20 20 20 20 20 20 54 65 78 74 20             Text 
13db0 65 64 69 74 6f 72 20 63 6f 6d 6d 61 6e 64 20 75  editor command u
13dc0 73 65 64 20 66 6f 72 20 63 68 65 63 6b 2d 69 6e  sed for check-in
13dd0 20 63 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   comments..**.**
13de0 20 20 20 20 65 6d 70 74 79 2d 64 69 72 73 20 20      empty-dirs  
13df0 20 20 20 20 20 41 20 63 6f 6d 6d 61 20 6f 72 20       A comma or 
13e00 6e 65 77 6c 69 6e 65 2d 73 65 70 61 72 61 74 65  newline-separate
13e10 64 20 6c 69 73 74 20 6f 66 20 70 61 74 68 6e 61  d list of pathna
13e20 6d 65 73 2e 20 4f 6e 0a 2a 2a 20 20 20 20 20 28  mes. On.**     (
13e30 76 65 72 73 69 6f 6e 61 62 6c 65 29 20 20 20 75  versionable)   u
13e40 70 64 61 74 65 20 61 6e 64 20 63 68 65 63 6b 6f  pdate and checko
13e50 75 74 20 63 6f 6d 6d 61 6e 64 73 2c 20 69 66 20  ut commands, if 
13e60 6e 6f 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63  no file or direc
13e70 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  tory.**         
13e80 20 20 20 20 20 20 20 20 20 20 20 20 65 78 69 73              exis
13e90 74 73 20 77 69 74 68 20 74 68 61 74 20 6e 61 6d  ts with that nam
13ea0 65 2c 20 61 6e 20 65 6d 70 74 79 20 64 69 72 65  e, an empty dire
13eb0 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 0a 2a 2a  ctory will be.**
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ed0 20 20 20 20 20 63 72 65 61 74 65 64 2e 0a 2a 2a       created..**
13ee0 0a 2a 2a 20 20 20 20 65 6e 63 6f 64 69 6e 67 2d  .**    encoding-
13ef0 67 6c 6f 62 20 20 20 20 54 68 65 20 56 41 4c 55  glob    The VALU
13f00 45 20 69 73 20 61 20 63 6f 6d 6d 61 20 6f 72 20  E is a comma or 
13f10 6e 65 77 6c 69 6e 65 2d 73 65 70 61 72 61 74 65  newline-separate
13f20 64 20 6c 69 73 74 20 6f 66 20 47 4c 4f 42 0a 2a  d list of GLOB.*
13f30 2a 20 20 20 20 20 28 76 65 72 73 69 6f 6e 61 62  *     (versionab
13f40 6c 65 29 20 20 20 70 61 74 74 65 72 6e 73 20 73  le)   patterns s
13f50 70 65 63 69 66 79 69 6e 67 20 66 69 6c 65 73 20  pecifying files 
13f60 74 68 61 74 20 74 68 65 20 22 63 6f 6d 6d 69 74  that the "commit
13f70 22 20 63 6f 6d 6d 61 6e 64 20 77 69 6c 6c 0a 2a  " command will.*
13f80 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
13f90 20 20 20 20 20 20 69 67 6e 6f 72 65 20 77 68 65        ignore whe
13fa0 6e 20 69 73 73 75 69 6e 67 20 77 61 72 6e 69 6e  n issuing warnin
13fb0 67 73 20 61 62 6f 75 74 20 74 65 78 74 20 66 69  gs about text fi
13fc0 6c 65 73 20 74 68 61 74 20 6d 61 79 0a 2a 2a 20  les that may.** 
13fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fe0 20 20 20 20 75 73 65 20 61 6e 6f 74 68 65 72 20      use another 
13ff0 65 6e 63 6f 64 69 6e 67 20 74 68 61 6e 20 41 53  encoding than AS
14000 43 49 49 20 6f 72 20 55 54 46 2d 38 2e 20 53 65  CII or UTF-8. Se
14010 74 20 74 6f 20 22 2a 22 0a 2a 2a 20 20 20 20 20  t to "*".**     
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14030 74 6f 20 64 69 73 61 62 6c 65 20 65 6e 63 6f 64  to disable encod
14040 69 6e 67 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a  ing checking..**
14050 0a 2a 2a 20 20 20 20 67 64 69 66 66 2d 63 6f 6d  .**    gdiff-com
14060 6d 61 6e 64 20 20 20 20 45 78 74 65 72 6e 61 6c  mand    External
14070 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 75 6e 20   command to run 
14080 77 68 65 6e 20 70 65 72 66 6f 72 6d 69 6e 67 20  when performing 
14090 61 20 67 72 61 70 68 69 63 61 6c 0a 2a 2a 20 20  a graphical.**  
140a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140b0 20 20 20 64 69 66 66 2e 20 49 66 20 75 6e 64 65     diff. If unde
140c0 66 69 6e 65 64 2c 20 74 65 78 74 20 64 69 66 66  fined, text diff
140d0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a   will be used..*
140e0 2a 0a 2a 2a 20 20 20 20 67 6d 65 72 67 65 2d 63  *.**    gmerge-c
140f0 6f 6d 6d 61 6e 64 20 20 20 41 20 67 72 61 70 68  ommand   A graph
14100 69 63 61 6c 20 6d 65 72 67 65 20 63 6f 6e 66 6c  ical merge confl
14110 69 63 74 20 72 65 73 6f 6c 76 65 72 20 63 6f 6d  ict resolver com
14120 6d 61 6e 64 20 6f 70 65 72 61 74 69 6e 67 0a 2a  mand operating.*
14130 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
14140 20 20 20 20 20 20 6f 6e 20 66 6f 75 72 20 66 69        on four fi
14150 6c 65 73 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  les..**         
14160 20 20 20 20 20 20 20 20 20 20 20 20 45 78 3a 20              Ex: 
14170 6b 64 69 66 66 33 20 22 25 62 61 73 65 6c 69 6e  kdiff3 "%baselin
14180 65 22 20 22 25 6f 72 69 67 69 6e 61 6c 22 20 22  e" "%original" "
14190 25 6d 65 72 67 65 22 20 2d 6f 20 22 25 6f 75 74  %merge" -o "%out
141a0 70 75 74 22 0a 2a 2a 20 20 20 20 20 20 20 20 20  put".**         
141b0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 3a 20              Ex: 
141c0 78 78 64 69 66 66 20 22 25 6f 72 69 67 69 6e 61  xxdiff "%origina
141d0 6c 22 20 22 25 62 61 73 65 6c 69 6e 65 22 20 22  l" "%baseline" "
141e0 25 6d 65 72 67 65 22 20 2d 4d 20 22 25 6f 75 74  %merge" -M "%out
141f0 70 75 74 22 0a 2a 2a 20 20 20 20 20 20 20 20 20  put".**         
14200 20 20 20 20 20 20 20 20 20 20 20 20 45 78 3a 20              Ex: 
14210 6d 65 6c 64 20 22 25 62 61 73 65 6c 69 6e 65 22  meld "%baseline"
14220 20 22 25 6f 72 69 67 69 6e 61 6c 22 20 22 25 6d   "%original" "%m
14230 65 72 67 65 22 20 22 25 6f 75 74 70 75 74 22 0a  erge" "%output".
14240 2a 2a 0a 2a 2a 20 20 20 20 68 61 73 68 2d 64 69  **.**    hash-di
14250 67 69 74 73 20 20 20 20 20 20 54 68 65 20 6e 75  gits      The nu
14260 6d 62 65 72 20 6f 66 20 68 65 78 61 64 65 63 69  mber of hexadeci
14270 6d 61 6c 20 64 69 67 69 74 73 20 6f 66 20 74 68  mal digits of th
14280 65 20 53 48 41 31 20 68 61 73 68 20 74 6f 0a 2a  e SHA1 hash to.*
14290 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
142a0 20 20 20 20 20 20 64 69 73 70 6c 61 79 2e 20 20        display.  
142b0 28 44 65 66 61 75 6c 74 3a 20 31 30 3b 20 4d 69  (Default: 10; Mi
142c0 6e 69 6d 75 6d 3a 20 36 29 0a 2a 2a 0a 2a 2a 20  nimum: 6).**.** 
142d0 20 20 20 68 74 74 70 2d 70 6f 72 74 20 20 20 20     http-port    
142e0 20 20 20 20 54 68 65 20 54 43 50 2f 49 50 20 70      The TCP/IP p
142f0 6f 72 74 20 6e 75 6d 62 65 72 20 74 6f 20 75 73  ort number to us
14300 65 20 62 79 20 74 68 65 20 22 73 65 72 76 65 72  e by the "server
14310 22 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ".**            
14320 20 20 20 20 20 20 20 20 20 61 6e 64 20 22 75 69           and "ui
14330 22 20 63 6f 6d 6d 61 6e 64 73 2e 20 20 44 65 66  " commands.  Def
14340 61 75 6c 74 3a 20 38 30 38 30 0a 2a 2a 0a 2a 2a  ault: 8080.**.**
14350 20 20 20 20 68 74 74 70 73 2d 6c 6f 67 69 6e 20      https-login 
14360 20 20 20 20 20 53 65 6e 64 20 6c 6f 67 69 6e 20       Send login 
14370 63 72 65 64 65 6e 74 69 61 6c 73 20 75 73 69 6e  credentials usin
14380 67 20 48 54 54 50 53 20 69 6e 73 74 65 61 64 20  g HTTPS instead 
14390 6f 66 20 48 54 54 50 0a 2a 2a 20 20 20 20 20 20  of HTTP.**      
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
143b0 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 67 69 6e  ven if the login
143c0 20 70 61 67 65 20 72 65 71 75 65 73 74 20 63 61   page request ca
143d0 6d 65 20 76 69 61 20 48 54 54 50 2e 0a 2a 2a 0a  me via HTTP..**.
143e0 2a 2a 20 20 20 20 69 67 6e 6f 72 65 2d 67 6c 6f  **    ignore-glo
143f0 62 20 20 20 20 20 20 54 68 65 20 56 41 4c 55 45  b      The VALUE
14400 20 69 73 20 61 20 63 6f 6d 6d 61 20 6f 72 20 6e   is a comma or n
14410 65 77 6c 69 6e 65 2d 73 65 70 61 72 61 74 65 64  ewline-separated
14420 20 6c 69 73 74 20 6f 66 20 47 4c 4f 42 0a 2a 2a   list of GLOB.**
14430 20 20 20 20 20 28 76 65 72 73 69 6f 6e 61 62 6c       (versionabl
14440 65 29 20 20 20 70 61 74 74 65 72 6e 73 20 73 70  e)   patterns sp
14450 65 63 69 66 79 69 6e 67 20 66 69 6c 65 73 20 74  ecifying files t
14460 68 61 74 20 74 68 65 20 22 61 64 64 22 2c 20 22  hat the "add", "
14470 61 64 64 72 65 6d 6f 76 65 22 2c 0a 2a 2a 20 20  addremove",.**  
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14490 20 20 20 22 63 6c 65 61 6e 22 2c 20 61 6e 64 20     "clean", and 
144a0 22 65 78 74 72 61 22 20 63 6f 6d 6d 61 6e 64 73  "extra" commands
144b0 20 77 69 6c 6c 20 69 67 6e 6f 72 65 2e 0a 2a 2a   will ignore..**
144c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144d0 20 20 20 20 20 45 78 61 6d 70 6c 65 3a 20 20 2a       Example:  *
144e0 2e 6c 6f 67 20 63 75 73 74 6f 6d 43 6f 64 65 2e  .log customCode.
144f0 63 20 6e 6f 74 65 73 2e 74 78 74 0a 2a 2a 0a 2a  c notes.txt.**.*
14500 2a 20 20 20 20 6b 65 65 70 2d 67 6c 6f 62 20 20  *    keep-glob  
14510 20 20 20 20 20 20 54 68 65 20 56 41 4c 55 45 20        The VALUE 
14520 69 73 20 61 20 63 6f 6d 6d 61 20 6f 72 20 6e 65  is a comma or ne
14530 77 6c 69 6e 65 2d 73 65 70 61 72 61 74 65 64 20  wline-separated 
14540 6c 69 73 74 20 6f 66 20 47 4c 4f 42 0a 2a 2a 20  list of GLOB.** 
14550 20 20 20 20 28 76 65 72 73 69 6f 6e 61 62 6c 65      (versionable
14560 29 20 20 20 70 61 74 74 65 72 6e 73 20 73 70 65  )   patterns spe
14570 63 69 66 79 69 6e 67 20 66 69 6c 65 73 20 74 68  cifying files th
14580 61 74 20 74 68 65 20 22 63 6c 65 61 6e 22 20 63  at the "clean" c
14590 6f 6d 6d 61 6e 64 20 77 69 6c 6c 0a 2a 2a 20 20  ommand will.**  
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145b0 20 20 20 6b 65 65 70 2e 0a 2a 2a 0a 2a 2a 20 20     keep..**.**  
145c0 20 20 6c 6f 63 61 6c 61 75 74 68 20 20 20 20 20    localauth     
145d0 20 20 20 49 66 20 65 6e 61 62 6c 65 64 2c 20 72     If enabled, r
145e0 65 71 75 69 72 65 20 74 68 61 74 20 48 54 54 50  equire that HTTP
145f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   connections fro
14600 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  m.**            
14610 20 20 20 20 20 20 20 20 20 31 32 37 2e 30 2e 30           127.0.0
14620 2e 31 20 62 65 20 61 75 74 68 65 6e 74 69 63 61  .1 be authentica
14630 74 65 64 20 62 79 20 70 61 73 73 77 6f 72 64 2e  ted by password.
14640 20 20 49 66 0a 2a 2a 20 20 20 20 20 20 20 20 20    If.**         
14650 20 20 20 20 20 20 20 20 20 20 20 20 66 61 6c 73              fals
14660 65 2c 20 61 6c 6c 20 48 54 54 50 20 72 65 71 75  e, all HTTP requ
14670 65 73 74 73 20 66 72 6f 6d 20 6c 6f 63 61 6c 68  ests from localh
14680 6f 73 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  ost have.**     
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 75 6e 72 65 73 74 72 69 63 74 65 64 20 61 63 63  unrestricted acc
146b0 65 73 73 20 74 6f 20 74 68 65 20 72 65 70 6f 73  ess to the repos
146c0 69 74 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itory..**.**    
146d0 6d 61 69 6e 2d 62 72 61 6e 63 68 20 20 20 20 20  main-branch     
146e0 20 54 68 65 20 70 72 69 6d 61 72 79 20 62 72 61   The primary bra
146f0 6e 63 68 20 66 6f 72 20 74 68 65 20 70 72 6f 6a  nch for the proj
14700 65 63 74 2e 20 20 44 65 66 61 75 6c 74 3a 20 74  ect.  Default: t
14710 72 75 6e 6b 0a 2a 2a 0a 2a 2a 20 20 20 20 6d 61  runk.**.**    ma
14720 6e 69 66 65 73 74 20 20 20 20 20 20 20 20 20 49  nifest         I
14730 66 20 65 6e 61 62 6c 65 64 2c 20 61 75 74 6f 6d  f enabled, autom
14740 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 20  atically create 
14750 66 69 6c 65 73 20 22 6d 61 6e 69 66 65 73 74 22  files "manifest"
14760 20 61 6e 64 0a 2a 2a 20 20 20 20 20 28 76 65 72   and.**     (ver
14770 73 69 6f 6e 61 62 6c 65 29 20 20 20 22 6d 61 6e  sionable)   "man
14780 69 66 65 73 74 2e 75 75 69 64 22 20 69 6e 20 65  ifest.uuid" in e
14790 76 65 72 79 20 63 68 65 63 6b 6f 75 74 2e 20 20  very checkout.  
147a0 54 68 65 20 53 51 4c 69 74 65 20 61 6e 64 0a 2a  The SQLite and.*
147b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
147c0 20 20 20 20 20 20 46 6f 73 73 69 6c 20 72 65 70        Fossil rep
147d0 6f 73 69 74 6f 72 69 65 73 20 62 6f 74 68 20 72  ositories both r
147e0 65 71 75 69 72 65 20 74 68 69 73 2e 20 20 44 65  equire this.  De
147f0 66 61 75 6c 74 3a 20 6f 66 66 2e 0a 2a 2a 0a 2a  fault: off..**.*
14800 2a 20 20 20 20 6d 61 78 2d 6c 6f 61 64 61 76 67  *    max-loadavg
14810 20 20 20 20 20 20 53 6f 6d 65 20 43 50 55 2d 69        Some CPU-i
14820 6e 74 65 6e 73 69 76 65 20 77 65 62 20 70 61 67  ntensive web pag
14830 65 73 20 28 65 78 3a 20 2f 7a 69 70 2c 20 2f 74  es (ex: /zip, /t
14840 61 72 62 61 6c 6c 2c 20 2f 62 6c 61 6d 65 29 0a  arball, /blame).
14850 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
14860 20 20 20 20 20 20 20 61 72 65 20 64 69 73 61 6c         are disal
14870 6c 6f 77 65 64 20 69 66 20 74 68 65 20 73 79 73  lowed if the sys
14880 74 65 6d 20 6c 6f 61 64 20 61 76 65 72 61 67 65  tem load average
14890 20 67 6f 65 73 20 61 62 6f 76 65 20 74 68 69 73   goes above this
148a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
148b0 20 20 20 20 20 20 20 20 76 61 6c 75 65 2e 20 20          value.  
148c0 22 30 2e 30 22 20 6d 65 61 6e 73 20 6e 6f 20 6c  "0.0" means no l
148d0 69 6d 69 74 2e 20 20 54 68 69 73 20 6f 6e 6c 79  imit.  This only
148e0 20 77 6f 72 6b 73 20 6f 6e 20 75 6e 69 78 2e 0a   works on unix..
148f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
14900 20 20 20 20 20 20 20 4f 6e 6c 79 20 6c 6f 63 61         Only loca
14910 6c 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68  l settings of th
14920 69 73 20 76 61 6c 75 65 20 6d 61 6b 65 20 61 20  is value make a 
14930 64 69 66 66 65 72 65 6e 63 65 20 73 69 6e 63 65  difference since
14940 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
14950 20 20 20 20 20 20 20 20 77 68 65 6e 20 72 75 6e          when run
14960 6e 69 6e 67 20 61 73 20 61 20 77 65 62 2d 73 65  ning as a web-se
14970 72 76 65 72 2c 20 46 6f 73 73 69 6c 20 64 6f 65  rver, Fossil doe
14980 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 0a 2a  s not open the.*
14990 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
149a0 20 20 20 20 20 20 67 6c 6f 62 61 6c 20 63 6f 6e        global con
149b0 66 69 67 75 72 61 74 69 6f 6e 20 64 61 74 61 62  figuration datab
149c0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6d 61  ase..**.**    ma
149d0 78 2d 75 70 6c 6f 61 64 20 20 20 20 20 20 20 41  x-upload       A
149e0 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 73 69   limit on the si
149f0 7a 65 20 6f 66 20 75 70 6c 69 6e 6b 20 48 54 54  ze of uplink HTT
14a00 50 20 72 65 71 75 65 73 74 73 2e 20 20 54 68 65  P requests.  The
14a10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
14a20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20          default 
14a30 69 73 20 32 35 30 30 30 30 20 62 79 74 65 73 2e  is 250000 bytes.
14a40 0a 2a 2a 0a 2a 2a 20 20 20 20 6d 74 69 6d 65 2d  .**.**    mtime-
14a50 63 68 61 6e 67 65 73 20 20 20 20 55 73 65 20 66  changes    Use f
14a60 69 6c 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  ile modification
14a70 20 74 69 6d 65 73 20 28 6d 74 69 6d 65 73 29 20   times (mtimes) 
14a80 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 0a 2a  to detect when.*
14a90 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
14aa0 20 20 20 20 20 20 66 69 6c 65 73 20 68 61 76 65        files have
14ab0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
14ac0 20 28 44 65 66 61 75 6c 74 20 22 6f 6e 22 2e 29   (Default "on".)
14ad0 0a 2a 2a 0a 2a 2a 20 20 20 20 6d 76 2d 72 6d 2d  .**.**    mv-rm-
14ae0 66 69 6c 65 73 20 20 20 20 20 20 49 66 20 65 6e  files      If en
14af0 61 62 6c 65 64 20 28 61 6e 64 20 46 6f 73 73 69  abled (and Fossi
14b00 6c 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  l was compiled w
14b10 69 74 68 20 6c 65 67 61 63 79 20 22 6d 76 2f 72  ith legacy "mv/r
14b20 6d 22 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  m".**           
14b30 20 20 20 20 20 20 20 20 20 20 73 75 70 70 6f 72            suppor
14b40 74 29 2c 20 74 68 65 20 22 6d 76 22 20 61 6e 64  t), the "mv" and
14b50 20 22 72 65 6e 61 6d 65 22 20 63 6f 6d 6d 61 6e   "rename" comman
14b60 64 73 20 77 69 6c 6c 20 61 6c 73 6f 20 6d 6f 76  ds will also mov
14b70 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
14b80 20 20 20 20 20 20 20 20 20 74 68 65 20 61 73 73           the ass
14b90 6f 63 69 61 74 65 64 20 66 69 6c 65 73 20 77 69  ociated files wi
14ba0 74 68 69 6e 20 74 68 65 20 63 68 65 63 6b 6f 75  thin the checkou
14bb0 74 20 2d 41 4e 44 2d 20 74 68 65 20 22 72 6d 22  t -AND- the "rm"
14bc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
14bd0 20 20 20 20 20 20 20 20 61 6e 64 20 22 64 65 6c          and "del
14be0 65 74 65 22 20 63 6f 6d 6d 61 6e 64 73 20 77 69  ete" commands wi
14bf0 6c 6c 20 61 6c 73 6f 20 72 65 6d 6f 76 65 20 74  ll also remove t
14c00 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  he associated.**
14c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c20 20 20 20 20 20 66 69 6c 65 73 20 66 72 6f 6d 20       files from 
14c30 77 69 74 68 69 6e 20 74 68 65 20 63 68 65 63 6b  within the check
14c40 6f 75 74 2e 20 20 44 65 66 61 75 6c 74 3a 20 6f  out.  Default: o
14c50 66 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 67 70  ff..**.**    pgp
14c60 2d 63 6f 6d 6d 61 6e 64 20 20 20 20 20 20 43 6f  -command      Co
14c70 6d 6d 61 6e 64 20 75 73 65 64 20 74 6f 20 63 6c  mmand used to cl
14c80 65 61 72 2d 73 69 67 6e 20 6d 61 6e 69 66 65 73  ear-sign manifes
14c90 74 73 20 61 74 20 63 68 65 63 6b 2d 69 6e 2e 0a  ts at check-in..
14ca0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
14cb0 20 20 20 20 20 20 20 54 68 65 20 64 65 66 61 75         The defau
14cc0 6c 74 20 69 73 20 22 67 70 67 20 2d 2d 63 6c 65  lt is "gpg --cle
14cd0 61 72 73 69 67 6e 20 2d 6f 20 22 2e 0a 2a 2a 0a  arsign -o "..**.
14ce0 2a 2a 20 20 20 20 70 72 6f 78 79 20 20 20 20 20  **    proxy     
14cf0 20 20 20 20 20 20 20 55 52 4c 20 6f 66 20 74 68         URL of th
14d00 65 20 48 54 54 50 20 70 72 6f 78 79 2e 20 20 49  e HTTP proxy.  I
14d10 66 20 75 6e 64 65 66 69 6e 65 64 20 6f 72 20 22  f undefined or "
14d20 6f 66 66 22 20 74 68 65 6e 0a 2a 2a 20 20 20 20  off" then.**    
14d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d40 20 74 68 65 20 22 68 74 74 70 5f 70 72 6f 78 79   the "http_proxy
14d50 22 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  " environment va
14d60 72 69 61 62 6c 65 20 69 73 20 63 6f 6e 73 75 6c  riable is consul
14d70 74 65 64 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ted..**         
14d80 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 74              If t
14d90 68 65 20 68 74 74 70 5f 70 72 6f 78 79 20 65 6e  he http_proxy en
14da0 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
14db0 6c 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 0a  le is undefined.
14dc0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
14dd0 20 20 20 20 20 20 20 74 68 65 6e 20 61 20 64 69         then a di
14de0 72 65 63 74 20 48 54 54 50 20 63 6f 6e 6e 65 63  rect HTTP connec
14df0 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2a  tion is used..**
14e00 0a 2a 2a 20 20 20 20 72 65 6c 61 74 69 76 65 2d  .**    relative-
14e10 70 61 74 68 73 20 20 20 57 68 65 6e 20 73 68 6f  paths   When sho
14e20 77 69 6e 67 20 63 68 61 6e 67 65 73 20 61 6e 64  wing changes and
14e30 20 65 78 74 72 61 73 2c 20 72 65 70 6f 72 74 20   extras, report 
14e40 70 61 74 68 73 20 72 65 6c 61 74 69 76 65 0a 2a  paths relative.*
14e50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
14e60 20 20 20 20 20 20 74 6f 20 74 68 65 20 63 75 72        to the cur
14e70 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72  rent working dir
14e80 65 63 74 6f 72 79 2e 20 20 44 65 66 61 75 6c 74  ectory.  Default
14e90 3a 20 22 6f 6e 22 0a 2a 2a 0a 2a 2a 20 20 20 20  : "on".**.**    
14ea0 72 65 70 6f 2d 63 6b 73 75 6d 20 20 20 20 20 20  repo-cksum      
14eb0 20 43 6f 6d 70 75 74 65 20 63 68 65 63 6b 73 75   Compute checksu
14ec0 6d 73 20 6f 76 65 72 20 61 6c 6c 20 66 69 6c 65  ms over all file
14ed0 73 20 69 6e 20 65 61 63 68 20 63 68 65 63 6b 6f  s in each checko
14ee0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
14ef0 20 20 20 20 20 20 20 20 20 20 61 73 20 61 20 64            as a d
14f00 6f 75 62 6c 65 2d 63 68 65 63 6b 20 6f 66 20 63  ouble-check of c
14f10 6f 72 72 65 63 74 6e 65 73 73 2e 20 20 44 65 66  orrectness.  Def
14f20 61 75 6c 74 73 20 74 6f 20 22 6f 6e 22 2e 0a 2a  aults to "on"..*
14f30 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
14f40 20 20 20 20 20 20 44 69 73 61 62 6c 65 20 6f 6e        Disable on
14f50 20 6c 61 72 67 65 20 72 65 70 6f 73 69 74 6f 72   large repositor
14f60 69 65 73 20 66 6f 72 20 61 20 70 65 72 66 6f 72  ies for a perfor
14f70 6d 61 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20  mance.**        
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70               imp
14f90 72 6f 76 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  rovement..**.** 
14fa0 20 20 20 73 65 6c 66 2d 72 65 67 69 73 74 65 72     self-register
14fb0 20 20 20 20 41 6c 6c 6f 77 20 75 73 65 72 73 20      Allow users 
14fc0 74 6f 20 72 65 67 69 73 74 65 72 20 74 68 65 6d  to register them
14fd0 73 65 6c 76 65 73 20 74 68 72 6f 75 67 68 20 74  selves through t
14fe0 68 65 20 48 54 54 50 20 55 49 2e 0a 2a 2a 20 20  he HTTP UI..**  
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15000 20 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75     This is usefu
15010 6c 20 69 66 20 79 6f 75 20 77 61 6e 74 20 74 6f  l if you want to
15020 20 73 65 65 20 6f 74 68 65 72 20 6e 61 6d 65 73   see other names
15030 20 74 68 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20   than.**        
15040 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 6e               "An
15050 6f 6e 79 6d 6f 75 73 22 20 69 6e 20 65 2e 67 2e  onymous" in e.g.
15060 20 74 69 63 6b 65 74 69 6e 67 20 73 79 73 74 65   ticketing syste
15070 6d 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  m. On the other 
15080 68 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  hand.**         
15090 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65 72              user
150a0 73 20 63 61 6e 20 6e 6f 74 20 62 65 20 64 65 6c  s can not be del
150b0 65 74 65 64 2e 20 44 65 66 61 75 6c 74 3a 20 6f  eted. Default: o
150c0 66 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 73 73 68  ff..**.**    ssh
150d0 2d 63 6f 6d 6d 61 6e 64 20 20 20 20 20 20 43 6f  -command      Co
150e0 6d 6d 61 6e 64 20 75 73 65 64 20 74 6f 20 74 61  mmand used to ta
150f0 6c 6b 20 74 6f 20 61 20 72 65 6d 6f 74 65 20 6d  lk to a remote m
15100 61 63 68 69 6e 65 20 77 69 74 68 0a 2a 2a 20 20  achine with.**  
15110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15120 20 20 20 74 68 65 20 22 73 73 68 3a 2f 2f 22 20     the "ssh://" 
15130 70 72 6f 74 6f 63 6f 6c 2e 0a 2a 2a 0a 2a 2a 20  protocol..**.** 
15140 20 20 20 73 73 6c 2d 63 61 2d 6c 6f 63 61 74 69     ssl-ca-locati
15150 6f 6e 20 20 54 68 65 20 66 75 6c 6c 20 70 61 74  on  The full pat
15160 68 6e 61 6d 65 20 74 6f 20 61 20 66 69 6c 65 20  hname to a file 
15170 63 6f 6e 74 61 69 6e 69 6e 67 20 50 45 4d 20 65  containing PEM e
15180 6e 63 6f 64 65 64 0a 2a 2a 20 20 20 20 20 20 20  ncoded.**       
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 41                CA
151a0 20 72 6f 6f 74 20 63 65 72 74 69 66 69 63 61 74   root certificat
151b0 65 73 2c 20 6f 72 20 61 20 64 69 72 65 63 74 6f  es, or a directo
151c0 72 79 20 6f 66 20 63 65 72 74 69 66 69 63 61 74  ry of certificat
151d0 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
151e0 20 20 20 20 20 20 20 20 20 20 77 69 74 68 20 66            with f
151f0 69 6c 65 6e 61 6d 65 73 20 66 6f 72 6d 65 64 20  ilenames formed 
15200 66 72 6f 6d 20 74 68 65 20 63 65 72 74 69 66 69  from the certifi
15210 63 61 74 65 20 68 61 73 68 65 73 20 61 73 0a 2a  cate hashes as.*
15220 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
15230 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20 62        required b
15240 79 20 4f 70 65 6e 53 53 4c 2e 0a 2a 2a 20 20 20  y OpenSSL..**   
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15260 20 20 49 66 20 73 65 74 2c 20 74 68 69 73 20 77    If set, this w
15270 69 6c 6c 20 6f 76 65 72 72 69 64 65 20 74 68 65  ill override the
15280 20 4f 53 20 64 65 66 61 75 6c 74 20 6c 69 73 74   OS default list
15290 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
152a0 20 20 20 20 20 20 20 20 20 20 20 4f 70 65 6e 53             OpenS
152b0 53 4c 20 43 41 73 2e 20 49 66 20 75 6e 73 65 74  SL CAs. If unset
152c0 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 69  , the default li
152d0 73 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e  st will be used.
152e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
152f0 20 20 20 20 20 20 20 20 53 6f 6d 65 20 70 6c 61          Some pla
15300 74 66 6f 72 6d 73 20 6d 61 79 20 61 64 64 20 61  tforms may add a
15310 64 64 69 74 69 6f 6e 61 6c 20 63 65 72 74 69 66  dditional certif
15320 69 63 61 74 65 73 2e 0a 2a 2a 20 20 20 20 20 20  icates..**      
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
15340 68 65 63 6b 20 79 6f 75 72 20 70 6c 61 74 66 6f  heck your platfo
15350 72 6d 20 62 65 68 61 76 69 6f 75 72 20 69 73 20  rm behaviour is 
15360 61 73 20 72 65 71 75 69 72 65 64 20 69 66 20 74  as required if t
15370 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
15380 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 20            exact 
15390 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
153a0 43 41 20 72 6f 6f 74 20 69 73 20 63 72 69 74 69  CA root is criti
153b0 63 61 6c 20 66 6f 72 20 79 6f 75 72 0a 2a 2a 20  cal for your.** 
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153d0 20 20 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e      application.
153e0 0a 2a 2a 0a 2a 2a 20 20 20 20 73 73 6c 2d 69 64  .**.**    ssl-id
153f0 65 6e 74 69 74 79 20 20 20 20 20 54 68 65 20 66  entity     The f
15400 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 74 6f 20  ull pathname to 
15410 61 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  a file containin
15420 67 20 61 20 63 65 72 74 69 66 69 63 61 74 65 0a  g a certificate.
15430 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15440 20 20 20 20 20 20 20 61 6e 64 20 70 72 69 76 61         and priva
15450 74 65 20 6b 65 79 20 69 6e 20 50 45 4d 20 66 6f  te key in PEM fo
15460 72 6d 61 74 2e 20 43 72 65 61 74 65 20 62 79 20  rmat. Create by 
15470 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a  concatenating.**
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15490 20 20 20 20 20 74 68 65 20 63 65 72 74 69 66 69       the certifi
154a0 63 61 74 65 20 61 6e 64 20 70 72 69 76 61 74 65  cate and private
154b0 20 6b 65 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 20   key files..**  
154c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154d0 20 20 20 54 68 69 73 20 69 64 65 6e 74 69 74 79     This identity
154e0 20 77 69 6c 6c 20 62 65 20 70 72 65 73 65 6e 74   will be present
154f0 65 64 20 74 6f 20 53 53 4c 20 73 65 72 76 65 72  ed to SSL server
15500 73 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  s to.**         
15510 20 20 20 20 20 20 20 20 20 20 20 20 61 75 74 68              auth
15520 65 6e 74 69 63 61 74 65 20 74 68 69 73 20 63 6c  enticate this cl
15530 69 65 6e 74 2c 20 69 6e 20 61 64 64 69 74 69 6f  ient, in additio
15540 6e 20 74 6f 20 74 68 65 20 6e 6f 72 6d 61 6c 0a  n to the normal.
15550 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15560 20 20 20 20 20 20 20 70 61 73 73 77 6f 72 64 20         password 
15570 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 2e 0a  authentication..
15580 2a 2a 0a 2a 2a 20 20 20 20 74 63 6c 20 20 20 20  **.**    tcl    
15590 20 20 20 20 20 20 20 20 20 20 49 66 20 65 6e 61            If ena
155a0 62 6c 65 64 20 28 61 6e 64 20 46 6f 73 73 69 6c  bled (and Fossil
155b0 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69   was compiled wi
155c0 74 68 20 54 63 6c 20 73 75 70 70 6f 72 74 29 2c  th Tcl support),
155d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
155e0 20 20 20 20 20 20 20 20 54 63 6c 20 69 6e 74 65          Tcl inte
155f0 67 72 61 74 69 6f 6e 20 63 6f 6d 6d 61 6e 64 73  gration commands
15600 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
15610 6f 20 74 68 65 20 54 48 31 0a 2a 2a 20 20 20 20  o the TH1.**    
15620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15630 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 61 6c   interpreter, al
15640 6c 6f 77 69 6e 67 20 61 72 62 69 74 72 61 72 79  lowing arbitrary
15650 20 54 63 6c 20 65 78 70 72 65 73 73 69 6f 6e 73   Tcl expressions
15660 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
15670 20 20 20 20 20 20 20 20 20 20 20 20 73 63 72 69              scri
15680 70 74 73 20 74 6f 20 62 65 20 65 76 61 6c 75 61  pts to be evalua
15690 74 65 64 20 66 72 6f 6d 20 54 48 31 2e 20 20 41  ted from TH1.  A
156a0 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
156b0 20 54 63 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20   Tcl.**         
156c0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 65              inte
156d0 72 70 72 65 74 65 72 20 77 69 6c 6c 20 62 65 20  rpreter will be 
156e0 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65  able to evaluate
156f0 20 61 72 62 69 74 72 61 72 79 20 54 48 31 0a 2a   arbitrary TH1.*
15700 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
15710 20 20 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e        expression
15720 73 20 61 6e 64 20 73 63 72 69 70 74 73 2e 20 44  s and scripts. D
15730 65 66 61 75 6c 74 3a 20 6f 66 66 2e 0a 2a 2a 0a  efault: off..**.
15740 2a 2a 20 20 20 20 74 63 6c 2d 73 65 74 75 70 20  **    tcl-setup 
15750 20 20 20 20 20 20 20 54 68 69 73 20 69 73 20 74         This is t
15760 68 65 20 73 65 74 75 70 20 73 63 72 69 70 74 20  he setup script 
15770 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  to be evaluated 
15780 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 2a  after creating.*
15790 2a 20 20 20 20 20 28 76 65 72 73 69 6f 6e 61 62  *     (versionab
157a0 6c 65 29 20 20 20 61 6e 64 20 69 6e 69 74 69 61  le)   and initia
157b0 6c 69 7a 69 6e 67 20 74 68 65 20 54 63 6c 20 69  lizing the Tcl i
157c0 6e 74 65 72 70 72 65 74 65 72 2e 20 20 42 79 20  nterpreter.  By 
157d0 64 65 66 61 75 6c 74 2c 20 74 68 69 73 0a 2a 2a  default, this.**
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157f0 20 20 20 20 20 69 73 20 65 6d 70 74 79 20 61 6e       is empty an
15800 64 20 6e 6f 20 65 78 74 72 61 20 73 65 74 75 70  d no extra setup
15810 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
15820 2a 0a 2a 2a 20 20 20 20 74 68 31 2d 64 6f 63 73  *.**    th1-docs
15830 20 20 20 20 20 20 20 20 20 57 41 52 4e 49 4e 47           WARNING
15840 3a 20 49 66 20 65 6e 61 62 6c 65 64 20 28 61 6e  : If enabled (an
15850 64 20 46 6f 73 73 69 6c 20 77 61 73 20 63 6f 6d  d Fossil was com
15860 70 69 6c 65 64 20 77 69 74 68 20 54 48 31 0a 2a  piled with TH1.*
15870 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
15880 20 20 20 20 20 20 73 75 70 70 6f 72 74 20 66 6f        support fo
15890 72 20 65 6d 62 65 64 64 65 64 20 64 6f 63 75 6d  r embedded docum
158a0 65 6e 74 61 74 69 6f 6e 20 66 69 6c 65 73 29 2c  entation files),
158b0 20 74 68 69 73 20 61 6c 6c 6f 77 73 0a 2a 2a 20   this allows.** 
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 20 20 65 6d 62 65 64 64 65 64 20 64 6f 63      embedded doc
158e0 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69 6c 65 73  umentation files
158f0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 72 62 69   to contain arbi
15900 74 72 61 72 79 20 54 48 31 0a 2a 2a 20 20 20 20  trary TH1.**    
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15920 20 73 63 72 69 70 74 73 20 74 68 61 74 20 61 72   scripts that ar
15930 65 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 20 74  e evaluated on t
15940 68 65 20 73 65 72 76 65 72 2e 20 20 49 66 20 6e  he server.  If n
15950 61 74 69 76 65 0a 2a 2a 20 20 20 20 20 20 20 20  ative.**        
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
15970 20 69 6e 74 65 67 72 61 74 69 6f 6e 20 69 73 20   integration is 
15980 61 6c 73 6f 20 65 6e 61 62 6c 65 64 2c 20 74 68  also enabled, th
15990 69 73 20 73 65 74 74 69 6e 67 20 68 61 73 20 74  is setting has t
159a0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
159b0 20 20 20 20 20 20 20 20 20 20 70 6f 74 65 6e 74            potent
159c0 69 61 6c 20 74 6f 20 61 6c 6c 6f 77 20 61 6e 79  ial to allow any
159d0 62 6f 64 79 20 77 69 74 68 20 63 68 65 63 6b 2d  body with check-
159e0 69 6e 20 70 72 69 76 69 6c 65 67 65 73 20 74 6f  in privileges to
159f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
15a00 20 20 20 20 20 20 20 20 64 6f 20 61 6c 6d 6f 73          do almos
15a10 74 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20  t anything that 
15a20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 6f  the associated o
15a30 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 0a  perating system.
15a40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15a50 20 20 20 20 20 20 20 75 73 65 72 20 61 63 63 6f         user acco
15a60 75 6e 74 20 63 6f 75 6c 64 20 64 6f 2e 20 20 45  unt could do.  E
15a70 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 20 73  xtreme caution s
15a80 68 6f 75 6c 64 20 62 65 20 75 73 65 64 0a 2a 2a  hould be used.**
15a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15aa0 20 20 20 20 20 77 68 65 6e 20 65 6e 61 62 6c 69       when enabli
15ab0 6e 67 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e  ng this setting.
15ac0 20 20 44 65 66 61 75 6c 74 3a 20 6f 66 66 2e 0a    Default: off..
15ad0 2a 2a 0a 2a 2a 20 20 20 20 74 68 31 2d 68 6f 6f  **.**    th1-hoo
15ae0 6b 73 20 20 20 20 20 20 20 20 49 66 20 65 6e 61  ks        If ena
15af0 62 6c 65 64 20 28 61 6e 64 20 46 6f 73 73 69 6c  bled (and Fossil
15b00 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69   was compiled wi
15b10 74 68 20 73 75 70 70 6f 72 74 20 66 6f 72 20 54  th support for T
15b20 48 31 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  H1.**           
15b30 20 20 20 20 20 20 20 20 20 20 68 6f 6f 6b 73 29            hooks)
15b40 2c 20 73 70 65 63 69 61 6c 20 54 48 31 20 63 6f  , special TH1 co
15b50 6d 6d 61 6e 64 73 20 77 69 6c 6c 20 62 65 20 63  mmands will be c
15b60 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 6e 64  alled before and
15b70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
15b80 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6e          after an
15b90 79 20 46 6f 73 73 69 6c 20 63 6f 6d 6d 61 6e 64  y Fossil command
15ba0 20 6f 72 20 77 65 62 20 70 61 67 65 2e 20 44 65   or web page. De
15bb0 66 61 75 6c 74 3a 20 6f 66 66 2e 0a 2a 2a 0a 2a  fault: off..**.*
15bc0 2a 20 20 20 20 74 68 31 2d 73 65 74 75 70 20 20  *    th1-setup  
15bd0 20 20 20 20 20 20 54 68 69 73 20 69 73 20 74 68        This is th
15be0 65 20 73 65 74 75 70 20 73 63 72 69 70 74 20 74  e setup script t
15bf0 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 61  o be evaluated a
15c00 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 2a 2a  fter creating.**
15c10 20 20 20 20 20 28 76 65 72 73 69 6f 6e 61 62 6c       (versionabl
15c20 65 29 20 20 20 61 6e 64 20 69 6e 69 74 69 61 6c  e)   and initial
15c30 69 7a 69 6e 67 20 74 68 65 20 54 48 31 20 69 6e  izing the TH1 in
15c40 74 65 72 70 72 65 74 65 72 2e 20 20 42 79 20 64  terpreter.  By d
15c50 65 66 61 75 6c 74 2c 20 74 68 69 73 0a 2a 2a 20  efault, this.** 
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c70 20 20 20 20 69 73 20 65 6d 70 74 79 20 61 6e 64      is empty and
15c80 20 6e 6f 20 65 78 74 72 61 20 73 65 74 75 70 20   no extra setup 
15c90 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a  is performed..**
15ca0 0a 2a 2a 20 20 20 20 74 68 31 2d 75 72 69 2d 72  .**    th1-uri-r
15cb0 65 67 65 78 70 20 20 20 53 70 65 63 69 66 79 20  egexp   Specify 
15cc0 77 68 69 63 68 20 55 52 49 27 73 20 61 72 65 20  which URI's are 
15cd0 61 6c 6c 6f 77 65 64 20 69 6e 20 48 54 54 50 20  allowed in HTTP 
15ce0 72 65 71 75 65 73 74 73 20 66 72 6f 6d 0a 2a 2a  requests from.**
15cf0 20 20 20 20 20 28 76 65 72 73 69 6f 6e 61 62 6c       (versionabl
15d00 65 29 20 20 20 54 48 31 20 73 63 72 69 70 74 73  e)   TH1 scripts
15d10 2e 20 20 49 66 20 65 6d 70 74 79 2c 20 6e 6f 20  .  If empty, no 
15d20 48 54 54 50 20 72 65 71 75 65 73 74 73 20 61 72  HTTP requests ar
15d30 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 20 20 20  e allowed.**    
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d50 20 77 68 61 74 73 6f 65 76 65 72 2e 20 20 54 68   whatsoever.  Th
15d60 65 20 64 65 66 61 75 6c 74 20 69 73 20 61 6e 20  e default is an 
15d70 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a  empty string..**
15d80 0a 2a 2a 20 20 20 20 77 65 62 2d 62 72 6f 77 73  .**    web-brows
15d90 65 72 20 20 20 20 20 20 41 20 73 68 65 6c 6c 20  er      A shell 
15da0 63 6f 6d 6d 61 6e 64 20 75 73 65 64 20 74 6f 20  command used to 
15db0 6c 61 75 6e 63 68 20 79 6f 75 72 20 70 72 65 66  launch your pref
15dc0 65 72 72 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  erred.**        
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 65 62               web
15de0 20 62 72 6f 77 73 65 72 20 77 68 65 6e 20 67 69   browser when gi
15df0 76 65 6e 20 61 20 55 52 4c 20 61 73 20 61 6e 20  ven a URL as an 
15e00 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 20 20 20  argument..**    
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 44 65 66 61 75 6c 74 73 20 74 6f 20 22 73 74   Defaults to "st
15e30 61 72 74 22 20 6f 6e 20 77 69 6e 64 6f 77 73 2c  art" on windows,
15e40 20 22 6f 70 65 6e 22 20 6f 6e 20 4d 61 63 2c 0a   "open" on Mac,.
15e50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15e60 20 20 20 20 20 20 20 61 6e 64 20 22 66 69 72 65         and "fire
15e70 66 6f 78 22 20 6f 6e 20 55 6e 69 78 2e 0a 2a 2a  fox" on Unix..**
15e80 0a 2a 2a 20 4f 70 74 69 6f 6e 73 3a 0a 2a 2a 20  .** Options:.** 
15e90 20 20 2d 2d 67 6c 6f 62 61 6c 20 20 20 73 65 74    --global   set
15ea0 20 6f 72 20 75 6e 73 65 74 20 74 68 65 20 67 69   or unset the gi
15eb0 76 65 6e 20 70 72 6f 70 65 72 74 79 20 67 6c 6f  ven property glo
15ec0 62 61 6c 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  bally instead of
15ed0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
15ee0 20 73 65 74 74 69 6e 67 20 6f 72 20 75 6e 73 65   setting or unse
15ef0 74 74 69 6e 67 20 69 74 20 66 6f 72 20 74 68 65  tting it for the
15f00 20 6f 70 65 6e 20 72 65 70 6f 73 69 74 6f 72 79   open repository
15f10 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   only..**.** See
15f20 20 61 6c 73 6f 3a 20 63 6f 6e 66 69 67 75 72 61   also: configura
15f30 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 65 74  tion.*/.void set
15f40 74 69 6e 67 5f 63 6d 64 28 76 6f 69 64 29 7b 0a  ting_cmd(void){.
15f50 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 67    int i;.  int g
15f60 6c 6f 62 61 6c 46 6c 61 67 20 3d 20 66 69 6e 64  lobalFlag = find
15f70 5f 6f 70 74 69 6f 6e 28 22 67 6c 6f 62 61 6c 22  _option("global"
15f80 2c 22 67 22 2c 30 29 21 3d 30 3b 0a 20 20 69 6e  ,"g",0)!=0;.  in
15f90 74 20 75 6e 73 65 74 46 6c 61 67 20 3d 20 67 2e  t unsetFlag = g.
15fa0 61 72 67 76 5b 31 5d 5b 30 5d 3d 3d 27 75 27 3b  argv[1][0]=='u';
15fb0 0a 20 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e 66 69  .  db_open_confi
15fc0 67 28 31 29 3b 0a 20 20 69 66 28 20 21 67 6c 6f  g(1);.  if( !glo
15fd0 62 61 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 64  balFlag ){.    d
15fe0 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f  b_find_and_open_
15ff0 72 65 70 6f 73 69 74 6f 72 79 28 4f 50 45 4e 5f  repository(OPEN_
16000 41 4e 59 5f 53 43 48 45 4d 41 20 7c 20 4f 50 45  ANY_SCHEMA | OPE
16010 4e 5f 4f 4b 5f 4e 4f 54 5f 46 4f 55 4e 44 2c 20  N_OK_NOT_FOUND, 
16020 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 67  0);.  }.  if( !g
16030 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20  .repositoryOpen 
16040 29 7b 0a 20 20 20 20 67 6c 6f 62 61 6c 46 6c 61  ){.    globalFla
16050 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  g = 1;.  }.  if(
16060 20 75 6e 73 65 74 46 6c 61 67 20 26 26 20 67 2e   unsetFlag && g.
16070 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 75  argc!=3 ){.    u
16080 73 61 67 65 28 22 50 52 4f 50 45 52 54 59 20 3f  sage("PROPERTY ?
16090 2d 67 6c 6f 62 61 6c 3f 22 29 3b 0a 20 20 7d 0a  -global?");.  }.
160a0 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
160b0 74 20 74 68 65 20 61 53 65 74 74 69 6e 67 5b 5d  t the aSetting[]
160c0 20 65 6e 74 72 69 65 73 20 61 72 65 20 69 6e 20   entries are in 
160d0 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 54  sorted order.  T
160e0 68 69 73 20 69 73 0a 20 20 2a 2a 20 6e 65 63 65  his is.  ** nece
160f0 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 62 69  ssary for the bi
16100 6e 61 72 79 20 73 65 61 72 63 68 20 69 6e 20 64  nary search in d
16110 62 5f 66 69 6e 64 5f 73 65 74 74 69 6e 67 28 29  b_find_setting()
16120 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74   to work correct
16130 6c 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ly..  */.  for(i
16140 3d 31 3b 20 61 53 65 74 74 69 6e 67 5b 69 5d 2e  =1; aSetting[i].
16150 6e 61 6d 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  name; i++){.    
16160 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d  if( fossil_strcm
16170 70 28 61 53 65 74 74 69 6e 67 5b 69 2d 31 5d 2e  p(aSetting[i-1].
16180 6e 61 6d 65 2c 20 61 53 65 74 74 69 6e 67 5b 69  name, aSetting[i
16190 5d 2e 6e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20  ].name)>=0 ){.  
161a0 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63      fossil_panic
161b0 28 22 49 6e 74 65 72 6e 61 6c 20 45 72 72 6f 72  ("Internal Error
161c0 3a 20 61 53 65 74 74 69 6e 67 5b 5d 20 65 6e 74  : aSetting[] ent
161d0 72 69 65 73 20 66 6f 72 20 5c 22 25 73 5c 22 22  ries for \"%s\""
161e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
161f0 20 20 20 20 22 20 61 6e 64 20 5c 22 25 73 5c 22      " and \"%s\"
16200 20 61 72 65 20 6f 75 74 20 6f 66 20 6f 72 64 65   are out of orde
16210 72 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r.",.           
16220 20 20 20 20 20 20 20 20 61 53 65 74 74 69 6e 67          aSetting
16230 5b 69 2d 31 5d 2e 6e 61 6d 65 2c 20 61 53 65 74  [i-1].name, aSet
16240 74 69 6e 67 5b 69 5d 2e 6e 61 6d 65 29 3b 0a 20  ting[i].name);. 
16250 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
16260 67 2e 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20  g.argc==2 ){.   
16270 20 66 6f 72 28 69 3d 30 3b 20 61 53 65 74 74 69   for(i=0; aSetti
16280 6e 67 5b 69 5d 2e 6e 61 6d 65 3b 20 69 2b 2b 29  ng[i].name; i++)
16290 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 5f 73 65  {.      print_se
162a0 74 74 69 6e 67 28 26 61 53 65 74 74 69 6e 67 5b  tting(&aSetting[
162b0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  i]);.    }.  }el
162c0 73 65 20 69 66 28 20 67 2e 61 72 67 63 3d 3d 33  se if( g.argc==3
162d0 20 7c 7c 20 67 2e 61 72 67 63 3d 3d 34 20 29 7b   || g.argc==4 ){
162e0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
162f0 2a 7a 4e 61 6d 65 20 3d 20 67 2e 61 72 67 76 5b  *zName = g.argv[
16300 32 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  2];.    int n = 
16310 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4e 61 6d  (int)strlen(zNam
16320 65 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 65  e);.    const Se
16330 74 74 69 6e 67 20 2a 70 53 65 74 74 69 6e 67 20  tting *pSetting 
16340 3d 20 64 62 5f 66 69 6e 64 5f 73 65 74 74 69 6e  = db_find_settin
16350 67 28 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20  g(zName, 1);.   
16360 20 69 66 28 20 70 53 65 74 74 69 6e 67 3d 3d 30   if( pSetting==0
16370 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c   ){.      fossil
16380 5f 66 61 74 61 6c 28 22 6e 6f 20 73 75 63 68 20  _fatal("no such 
16390 73 65 74 74 69 6e 67 3a 20 25 73 22 2c 20 7a 4e  setting: %s", zN
163a0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
163b0 69 66 28 20 67 6c 6f 62 61 6c 46 6c 61 67 20 26  if( globalFlag &
163c0 26 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28  & fossil_strcmp(
163d0 70 53 65 74 74 69 6e 67 2d 3e 6e 61 6d 65 2c 20  pSetting->name, 
163e0 22 6d 61 6e 69 66 65 73 74 22 29 3d 3d 30 20 29  "manifest")==0 )
163f0 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66  {.      fossil_f
16400 61 74 61 6c 28 22 63 61 6e 6e 6f 74 20 73 65 74  atal("cannot set
16410 20 27 6d 61 6e 69 66 65 73 74 27 20 67 6c 6f 62   'manifest' glob
16420 61 6c 6c 79 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ally");.    }.  
16430 20 20 69 66 28 20 75 6e 73 65 74 46 6c 61 67 20    if( unsetFlag 
16440 7c 7c 20 67 2e 61 72 67 63 3d 3d 34 20 29 7b 0a  || g.argc==4 ){.
16450 20 20 20 20 20 20 69 6e 74 20 69 73 4d 61 6e 69        int isMani
16460 66 65 73 74 20 3d 20 66 6f 73 73 69 6c 5f 73 74  fest = fossil_st
16470 72 63 6d 70 28 70 53 65 74 74 69 6e 67 2d 3e 6e  rcmp(pSetting->n
16480 61 6d 65 2c 20 22 6d 61 6e 69 66 65 73 74 22 29  ame, "manifest")
16490 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ==0;.      if( n
164a0 21 3d 73 74 72 6c 65 6e 28 70 53 65 74 74 69 6e  !=strlen(pSettin
164b0 67 5b 30 5d 2e 6e 61 6d 65 29 20 26 26 20 70 53  g[0].name) && pS
164c0 65 74 74 69 6e 67 5b 31 5d 2e 6e 61 6d 65 20 26  etting[1].name &
164d0 26 0a 20 20 20 20 20 20 20 20 20 20 66 6f 73 73  &.          foss
164e0 69 6c 5f 73 74 72 6e 63 6d 70 28 70 53 65 74 74  il_strncmp(pSett
164f0 69 6e 67 5b 31 5d 2e 6e 61 6d 65 2c 20 7a 4e 61  ing[1].name, zNa
16500 6d 65 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  me, n)==0 ){.   
16510 20 20 20 20 20 42 6c 6f 62 20 78 3b 0a 20 20 20       Blob x;.   
16520 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
16530 20 20 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 78      blob_init(&x
16540 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 66  ,0,0);.        f
16550 6f 72 28 69 3d 30 3b 20 70 53 65 74 74 69 6e 67  or(i=0; pSetting
16560 5b 69 5d 2e 6e 61 6d 65 3b 20 69 2b 2b 29 7b 0a  [i].name; i++){.
16570 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66 6f            if( fo
16580 73 73 69 6c 5f 73 74 72 6e 63 6d 70 28 70 53 65  ssil_strncmp(pSe
16590 74 74 69 6e 67 5b 69 5d 2e 6e 61 6d 65 2c 7a 4e  tting[i].name,zN
165a0 61 6d 65 2c 6e 29 21 3d 30 20 29 20 62 72 65 61  ame,n)!=0 ) brea
165b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f  k;.          blo
165c0 62 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 20  b_appendf(&x, " 
165d0 25 73 22 2c 20 70 53 65 74 74 69 6e 67 5b 69 5d  %s", pSetting[i]
165e0 2e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  .name);.        
165f0 7d 0a 20 20 20 20 20 20 20 20 66 6f 73 73 69 6c  }.        fossil
16600 5f 66 61 74 61 6c 28 22 61 6d 62 69 67 75 6f 75  _fatal("ambiguou
16610 73 20 73 65 74 74 69 6e 67 20 5c 22 25 73 5c 22  s setting \"%s\"
16620 20 2d 20 6d 69 67 68 74 20 62 65 3a 25 73 22 2c   - might be:%s",
16630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16640 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 62 6c 6f        zName, blo
16650 62 5f 73 74 72 28 26 78 29 29 3b 0a 20 20 20 20  b_str(&x));.    
16660 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 6c    }.      if( gl
16670 6f 62 61 6c 46 6c 61 67 20 26 26 20 69 73 4d 61  obalFlag && isMa
16680 6e 69 66 65 73 74 20 29 7b 0a 20 20 20 20 20 20  nifest ){.      
16690 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22    fossil_fatal("
166a0 63 61 6e 6e 6f 74 20 73 65 74 20 27 6d 61 6e 69  cannot set 'mani
166b0 66 65 73 74 27 20 67 6c 6f 62 61 6c 6c 79 22 29  fest' globally")
166c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
166d0 69 66 28 20 75 6e 73 65 74 46 6c 61 67 20 29 7b  if( unsetFlag ){
166e0 0a 20 20 20 20 20 20 20 20 64 62 5f 75 6e 73 65  .        db_unse
166f0 74 28 70 53 65 74 74 69 6e 67 2d 3e 6e 61 6d 65  t(pSetting->name
16700 2c 20 67 6c 6f 62 61 6c 46 6c 61 67 29 3b 0a 20  , globalFlag);. 
16710 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16720 20 20 20 20 64 62 5f 73 65 74 28 70 53 65 74 74      db_set(pSett
16730 69 6e 67 2d 3e 6e 61 6d 65 2c 20 67 2e 61 72 67  ing->name, g.arg
16740 76 5b 33 5d 2c 20 67 6c 6f 62 61 6c 46 6c 61 67  v[3], globalFlag
16750 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16760 20 69 66 28 20 69 73 4d 61 6e 69 66 65 73 74 20   if( isManifest 
16770 26 26 20 67 2e 6c 6f 63 61 6c 4f 70 65 6e 20 29  && g.localOpen )
16780 7b 0a 20 20 20 20 20 20 20 20 6d 61 6e 69 66 65  {.        manife
16790 73 74 5f 74 6f 5f 64 69 73 6b 28 64 62 5f 6c 67  st_to_disk(db_lg
167a0 65 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75 74  et_int("checkout
167b0 22 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ", 0));.      }.
167c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
167d0 20 77 68 69 6c 65 28 20 70 53 65 74 74 69 6e 67   while( pSetting
167e0 2d 3e 6e 61 6d 65 20 26 26 20 66 6f 73 73 69 6c  ->name && fossil
167f0 5f 73 74 72 6e 63 6d 70 28 70 53 65 74 74 69 6e  _strncmp(pSettin
16800 67 2d 3e 6e 61 6d 65 2c 7a 4e 61 6d 65 2c 6e 29  g->name,zName,n)
16810 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
16820 72 69 6e 74 5f 73 65 74 74 69 6e 67 28 70 53 65  rint_setting(pSe
16830 74 74 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20  tting);.        
16840 70 53 65 74 74 69 6e 67 2b 2b 3b 0a 20 20 20 20  pSetting++;.    
16850 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
16860 65 7b 0a 20 20 20 20 75 73 61 67 65 28 22 3f 50  e{.    usage("?P
16870 52 4f 50 45 52 54 59 3f 20 3f 56 41 4c 55 45 3f  ROPERTY? ?VALUE?
16880 20 3f 2d 67 6c 6f 62 61 6c 3f 22 29 3b 0a 20 20   ?-global?");.  
16890 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  }.}../*.** The i
168a0 6e 70 75 74 20 69 6e 20 61 20 74 69 6d 65 73 70  nput in a timesp
168b0 61 6e 20 6d 65 61 73 75 72 65 64 20 69 6e 20 64  an measured in d
168c0 61 79 73 2e 20 20 52 65 74 75 72 6e 20 61 20 73  ays.  Return a s
168d0 74 72 69 6e 67 20 77 68 69 63 68 0a 2a 2a 20 64  tring which.** d
168e0 65 73 63 72 69 62 65 73 20 74 68 61 74 20 74 69  escribes that ti
168f0 6d 65 73 70 61 6e 20 69 6e 20 75 6e 69 74 73 20  mespan in units 
16900 6f 66 20 73 65 63 6f 6e 64 73 2c 20 6d 69 6e 75  of seconds, minu
16910 74 65 73 2c 20 68 6f 75 72 73 2c 20 64 61 79 73  tes, hours, days
16920 2c 0a 2a 2a 20 6f 72 20 79 65 61 72 73 2c 20 64  ,.** or years, d
16930 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 74 73 20  epending on its 
16940 64 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61  duration..*/.cha
16950 72 20 2a 64 62 5f 74 69 6d 65 73 70 61 6e 5f 6e  r *db_timespan_n
16960 61 6d 65 28 64 6f 75 62 6c 65 20 72 53 70 61 6e  ame(double rSpan
16970 29 7b 0a 20 20 69 66 28 20 72 53 70 61 6e 3c 30  ){.  if( rSpan<0
16980 20 29 20 72 53 70 61 6e 20 3d 20 2d 72 53 70 61   ) rSpan = -rSpa
16990 6e 3b 0a 20 20 72 53 70 61 6e 20 2a 3d 20 32 34  n;.  rSpan *= 24
169a0 2e 30 2a 33 36 30 30 2e 30 3b 20 20 2f 2a 20 43  .0*3600.0;  /* C
169b0 6f 6e 76 65 72 74 20 75 6e 69 74 73 20 74 6f 20  onvert units to 
169c0 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 69 66 28  seconds */.  if(
169d0 20 72 53 70 61 6e 3c 31 32 30 2e 30 20 29 7b 0a   rSpan<120.0 ){.
169e0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
169f0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 31 66  e3_mprintf("%.1f
16a00 20 73 65 63 6f 6e 64 73 22 2c 20 72 53 70 61 6e   seconds", rSpan
16a10 29 3b 0a 20 20 7d 0a 20 20 72 53 70 61 6e 20 2f  );.  }.  rSpan /
16a20 3d 20 36 30 2e 30 3b 20 20 20 20 20 20 20 20 20  = 60.0;         
16a30 2f 2a 20 43 6f 6e 76 65 72 74 20 75 6e 69 74 73  /* Convert units
16a40 20 74 6f 20 6d 69 6e 75 74 65 73 20 2a 2f 0a 20   to minutes */. 
16a50 20 69 66 28 20 72 53 70 61 6e 3c 39 30 2e 30 20   if( rSpan<90.0 
16a60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
16a70 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
16a80 2e 31 66 20 6d 69 6e 75 74 65 73 22 2c 20 72 53  .1f minutes", rS
16a90 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 53 70 61  pan);.  }.  rSpa
16aa0 6e 20 2f 3d 20 36 30 2e 30 3b 20 20 20 20 20 20  n /= 60.0;      
16ab0 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 75 6e     /* Convert un
16ac0 69 74 73 20 74 6f 20 68 6f 75 72 73 20 2a 2f 0a  its to hours */.
16ad0 20 20 69 66 28 20 72 53 70 61 6e 3c 3d 34 38 2e    if( rSpan<=48.
16ae0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
16af0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16b00 22 25 2e 31 66 20 68 6f 75 72 73 22 2c 20 72 53  "%.1f hours", rS
16b10 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 53 70 61  pan);.  }.  rSpa
16b20 6e 20 2f 3d 20 32 34 2e 30 3b 20 20 20 20 20 20  n /= 24.0;      
16b30 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 75 6e     /* Convert un
16b40 69 74 73 20 74 6f 20 64 61 79 73 20 2a 2f 0a 20  its to days */. 
16b50 20 69 66 28 20 72 53 70 61 6e 3c 3d 33 36 35 2e   if( rSpan<=365.
16b60 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
16b70 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
16b80 22 25 2e 31 66 20 64 61 79 73 22 2c 20 72 53 70  "%.1f days", rSp
16b90 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 53 70 61 6e  an);.  }.  rSpan
16ba0 20 2f 3d 20 33 35 36 2e 32 34 3b 20 20 20 20 20   /= 356.24;     
16bb0 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 75      /* Convert u
16bc0 6e 69 74 73 20 74 6f 20 79 65 61 72 73 20 2a 2f  nits to years */
16bd0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
16be0 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 31 66 20  3_mprintf("%.1f 
16bf0 79 65 61 72 73 22 2c 20 72 53 70 61 6e 29 3b 0a  years", rSpan);.
16c00 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44  }../*.** COMMAND
16c10 3a 20 74 65 73 74 2d 74 69 6d 65 73 70 61 6e 0a  : test-timespan.
16c20 2a 2a 20 25 66 6f 73 73 69 6c 20 74 65 73 74 2d  ** %fossil test-
16c30 74 69 6d 65 73 70 61 6e 20 54 49 4d 45 53 54 41  timespan TIMESTA
16c40 4d 50 0a 2a 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  MP.**.** Print t
16c50 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 20 73  he approximate s
16c60 70 61 6e 20 6f 66 20 74 69 6d 65 20 66 72 6f 6d  pan of time from
16c70 20 6e 6f 77 20 74 6f 20 54 49 4d 45 53 54 41 4d   now to TIMESTAM
16c80 50 2e 0a 2a 2f 0a 76 6f 69 64 20 74 65 73 74 5f  P..*/.void test_
16c90 74 69 6d 65 73 70 61 6e 5f 63 6d 64 28 76 6f 69  timespan_cmd(voi
16ca0 64 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72 44 69  d){.  double rDi
16cb0 66 66 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63  ff;.  if( g.argc
16cc0 21 3d 33 20 29 20 75 73 61 67 65 28 22 54 49 4d  !=3 ) usage("TIM
16cd0 45 53 54 41 4d 50 22 29 3b 0a 20 20 73 71 6c 69  ESTAMP");.  sqli
16ce0 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72  te3_open(":memor
16cf0 79 3a 22 2c 20 26 67 2e 64 62 29 3b 0a 20 20 72  y:", &g.db);.  r
16d00 44 69 66 66 20 3d 20 64 62 5f 64 6f 75 62 6c 65  Diff = db_double
16d10 28 30 2e 30 2c 20 22 53 45 4c 45 43 54 20 6a 75  (0.0, "SELECT ju
16d20 6c 69 61 6e 64 61 79 28 27 6e 6f 77 27 29 20 2d  lianday('now') -
16d30 20 6a 75 6c 69 61 6e 64 61 79 28 25 51 29 22 2c   julianday(%Q)",
16d40 20 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 66   g.argv[2]);.  f
16d50 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 54 69 6d  ossil_print("Tim
16d60 65 20 64 69 66 66 65 72 65 6e 63 65 73 3a 20 25  e differences: %
16d70 73 5c 6e 22 2c 20 64 62 5f 74 69 6d 65 73 70 61  s\n", db_timespa
16d80 6e 5f 6e 61 6d 65 28 72 44 69 66 66 29 29 3b 0a  n_name(rDiff));.
16d90 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
16da0 67 2e 64 62 29 3b 0a 20 20 67 2e 64 62 20 3d 20  g.db);.  g.db = 
16db0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d  0;.}../*.** COMM
16dc0 41 4e 44 3a 20 74 65 73 74 2d 77 69 74 68 6f 75  AND: test-withou
16dd0 74 2d 72 6f 77 69 64 0a 2a 2a 20 25 66 6f 73 73  t-rowid.** %foss
16de0 69 6c 20 74 65 73 74 2d 77 69 74 68 6f 75 74 2d  il test-without-
16df0 72 6f 77 69 64 20 46 49 4c 45 4e 41 4d 45 2e 2e  rowid FILENAME..
16e00 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ..**.** Change t
16e10 68 65 20 46 6f 73 73 69 6c 20 72 65 70 6f 73 69  he Fossil reposi
16e20 74 6f 72 79 20 46 49 4c 45 4e 41 4d 45 20 74 6f  tory FILENAME to
16e30 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 74 68 65   make use of the
16e40 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 2a   WITHOUT ROWID.*
16e50 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  * optimization. 
16e60 20 46 49 4c 45 4e 41 4d 45 20 63 61 6e 20 61 6c   FILENAME can al
16e70 73 6f 20 62 65 20 74 68 65 20 7e 2f 2e 66 6f 73  so be the ~/.fos
16e80 73 69 6c 20 66 69 6c 65 20 6f 72 20 61 20 6c 6f  sil file or a lo
16e90 63 61 6c 0a 2a 2a 20 2e 66 73 6c 63 6b 6f 75 74  cal.** .fslckout
16ea0 20 6f 72 20 5f 46 4f 53 53 49 4c 5f 20 66 69 6c   or _FOSSIL_ fil
16eb0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 75 72  e..**.** The pur
16ec0 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 6f 6d  pose of this com
16ed0 6d 61 6e 64 20 69 73 20 66 6f 72 20 74 65 73 74  mand is for test
16ee0 69 6e 67 20 74 68 65 20 57 49 54 48 4f 55 54 20  ing the WITHOUT 
16ef0 52 4f 57 49 44 20 63 61 70 61 62 69 6c 69 74 69  ROWID capabiliti
16f00 65 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 2e  es.** of SQLite.
16f10 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 62 69    There is no bi
16f20 67 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75  g advantage to u
16f30 73 69 6e 67 20 57 49 54 48 4f 55 54 20 52 4f 57  sing WITHOUT ROW
16f40 49 44 20 69 6e 20 46 6f 73 73 69 6c 2e 0a 2a 2a  ID in Fossil..**
16f50 0a 2a 2a 20 4f 70 74 69 6f 6e 73 3a 0a 2a 2a 20  .** Options:.** 
16f60 20 20 20 2d 2d 64 72 79 72 75 6e 20 7c 20 2d 6e     --dryrun | -n
16f70 20 20 20 20 20 20 20 20 20 4e 6f 20 63 68 61 6e           No chan
16f80 67 65 73 2e 20 20 4a 75 73 74 20 70 72 69 6e 74  ges.  Just print
16f90 20 77 68 61 74 20 77 6f 75 6c 64 20 68 61 70 70   what would happ
16fa0 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 74 65 73 74  en..*/.void test
16fb0 5f 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 28 76  _without_rowid(v
16fc0 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  oid){.  int i, j
16fd0 3b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 42 6c  ;.  Stmt q;.  Bl
16fe0 6f 62 20 61 6c 6c 53 71 6c 3b 0a 20 20 69 6e 74  ob allSql;.  int
16ff0 20 64 72 79 52 75 6e 20 3d 20 66 69 6e 64 5f 6f   dryRun = find_o
17000 70 74 69 6f 6e 28 22 64 72 79 2d 72 75 6e 22 2c  ption("dry-run",
17010 20 22 6e 22 2c 20 30 29 21 3d 30 3b 0a 20 20 66   "n", 0)!=0;.  f
17020 6f 72 28 69 3d 32 3b 20 69 3c 67 2e 61 72 67 63  or(i=2; i<g.argc
17030 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 64 62 5f 6f  ; i++){.    db_o
17040 70 65 6e 5f 6f 72 5f 61 74 74 61 63 68 28 67 2e  pen_or_attach(g.
17050 61 72 67 76 5b 69 5d 2c 20 22 6d 61 69 6e 22 2c  argv[i], "main",
17060 20 30 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 69 6e   0);.    blob_in
17070 69 74 28 26 61 6c 6c 53 71 6c 2c 20 22 42 45 47  it(&allSql, "BEG
17080 49 4e 3b 5c 6e 22 2c 20 2d 31 29 3b 0a 20 20 20  IN;\n", -1);.   
17090 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a   db_prepare(&q,.
170a0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
170b0 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 6d 61 69  me, sql FROM mai
170c0 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n.sqlite_master 
170d0 22 0a 20 20 20 20 20 20 22 20 57 48 45 52 45 20  ".      " WHERE 
170e0 74 79 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44  type='table' AND
170f0 20 73 71 6c 20 4e 4f 54 20 4c 49 4b 45 20 27 25   sql NOT LIKE '%
17100 25 57 49 54 48 4f 55 54 20 52 4f 57 49 44 25 25  %WITHOUT ROWID%%
17110 27 22 0a 20 20 20 20 20 20 22 20 20 20 41 4e 44  '".      "   AND
17120 20 6e 61 6d 65 20 49 4e 20 28 27 67 6c 6f 62 61   name IN ('globa
17130 6c 5f 63 6f 6e 66 69 67 27 2c 27 73 68 75 6e 27  l_config','shun'
17140 2c 27 63 6f 6e 63 65 61 6c 65 64 27 2c 27 63 6f  ,'concealed','co
17150 6e 66 69 67 27 2c 22 0a 20 20 20 20 20 20 20 20  nfig',".        
17160 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 27              "  '
17170 70 6c 69 6e 6b 27 2c 27 74 61 67 78 72 65 66 27  plink','tagxref'
17180 2c 27 62 61 63 6b 6c 69 6e 6b 27 2c 27 76 63 61  ,'backlink','vca
17190 63 68 65 27 29 3b 22 0a 20 20 20 20 29 3b 0a 20  che');".    );. 
171a0 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65     while( db_ste
171b0 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
171c0 57 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  W ){.      const
171d0 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20   char *zTName = 
171e0 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
171f0 71 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e  q, 0);.      con
17200 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 53 71  st char *zOrigSq
17210 6c 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  l = db_column_te
17220 78 74 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 20  xt(&q, 1);.     
17230 20 42 6c 6f 62 20 6e 65 77 53 71 6c 3b 0a 20 20   Blob newSql;.  
17240 20 20 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 6e      blob_init(&n
17250 65 77 53 71 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  ewSql, 0, 0);.  
17260 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 4f 72      for(j=0; zOr
17270 69 67 53 71 6c 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  igSql[j]; j++){.
17280 20 20 20 20 20 20 20 20 69 66 28 20 66 6f 73 73          if( foss
17290 69 6c 5f 73 74 72 6e 69 63 6d 70 28 7a 4f 72 69  il_strnicmp(zOri
172a0 67 53 71 6c 2b 6a 2c 22 75 6e 69 71 75 65 22 2c  gSql+j,"unique",
172b0 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  6)==0 ){.       
172c0 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26     blob_append(&
172d0 6e 65 77 53 71 6c 2c 20 7a 4f 72 69 67 53 71 6c  newSql, zOrigSql
172e0 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , j);.          
172f0 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 6e 65 77  blob_append(&new
17300 53 71 6c 2c 20 22 50 52 49 4d 41 52 59 20 4b 45  Sql, "PRIMARY KE
17310 59 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  Y", -1);.       
17320 20 20 20 7a 4f 72 69 67 53 71 6c 20 2b 3d 20 6a     zOrigSql += j
17330 2b 36 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20  +6;.          j 
17340 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = -1;.        }.
17350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 6c        }.      bl
17360 6f 62 5f 61 70 70 65 6e 64 28 26 6e 65 77 53 71  ob_append(&newSq
17370 6c 2c 20 7a 4f 72 69 67 53 71 6c 2c 20 2d 31 29  l, zOrigSql, -1)
17380 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  ;.      blob_app
17390 65 6e 64 5f 73 71 6c 28 26 61 6c 6c 53 71 6c 2c  end_sql(&allSql,
173a0 0a 20 20 20 20 20 20 20 20 20 22 41 4c 54 45 52  .         "ALTER
173b0 20 54 41 42 4c 45 20 5c 22 25 77 5c 22 20 52 45   TABLE \"%w\" RE
173c0 4e 41 4d 45 20 54 4f 20 5c 22 78 5f 25 77 5c 22  NAME TO \"x_%w\"
173d0 3b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 25  ;\n".         "%
173e0 73 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b  s WITHOUT ROWID;
173f0 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 49 4e  \n".         "IN
17400 53 45 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22  SERT INTO \"%w\"
17410 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c   SELECT * FROM \
17420 22 78 5f 25 77 5c 22 3b 5c 6e 22 0a 20 20 20 20  "x_%w\";\n".    
17430 20 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45       "DROP TABLE
17440 20 5c 22 78 5f 25 77 5c 22 3b 5c 6e 22 2c 0a 20   \"x_%w\";\n",. 
17450 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 2c 20          zTName, 
17460 7a 54 4e 61 6d 65 2c 20 62 6c 6f 62 5f 73 71 6c  zTName, blob_sql
17470 5f 74 65 78 74 28 26 6e 65 77 53 71 6c 29 2c 20  _text(&newSql), 
17480 7a 54 4e 61 6d 65 2c 20 7a 54 4e 61 6d 65 2c 20  zTName, zTName, 
17490 7a 54 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  zTName.      );.
174a0 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69        fossil_pri
174b0 6e 74 28 22 43 6f 6e 76 65 72 74 69 6e 67 20 74  nt("Converting t
174c0 61 62 6c 65 20 25 73 20 6f 66 20 25 73 20 74 6f  able %s of %s to
174d0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 5c   WITHOUT ROWID.\
174e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
174f0 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 2c 20          zTName, 
17500 67 2e 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  g.argv[i]);.    
17510 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 6e 65    blob_reset(&ne
17520 77 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  wSql);.    }.   
17530 20 62 6c 6f 62 5f 61 70 70 65 6e 64 5f 73 71 6c   blob_append_sql
17540 28 26 61 6c 6c 53 71 6c 2c 20 22 43 4f 4d 4d 49  (&allSql, "COMMI
17550 54 3b 5c 6e 22 29 3b 0a 20 20 20 20 64 62 5f 66  T;\n");.    db_f
17560 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 20  inalize(&q);.   
17570 20 69 66 28 20 64 72 79 52 75 6e 20 29 7b 0a 20   if( dryRun ){. 
17580 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e       fossil_prin
17590 74 28 22 53 51 4c 20 74 68 61 74 20 77 6f 75 6c  t("SQL that woul
175a0 64 20 68 61 76 65 20 62 65 65 6e 20 65 76 61 6c  d have been eval
175b0 75 61 74 65 64 3a 5c 6e 22 29 3b 0a 20 20 20 20  uated:\n");.    
175c0 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
175d0 25 2e 37 38 63 5c 6e 22 2c 20 27 2d 27 29 3b 0a  %.78c\n", '-');.
175e0 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69        fossil_pri
175f0 6e 74 28 22 25 73 22 2c 20 62 6c 6f 62 5f 73 71  nt("%s", blob_sq
17600 6c 5f 74 65 78 74 28 26 61 6c 6c 53 71 6c 29 29  l_text(&allSql))
17610 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17620 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
17630 28 22 25 73 22 2c 20 62 6c 6f 62 5f 73 71 6c 5f  ("%s", blob_sql_
17640 74 65 78 74 28 26 61 6c 6c 53 71 6c 29 29 3b 0a  text(&allSql));.
17650 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 72      }.    blob_r
17660 65 73 65 74 28 26 61 6c 6c 53 71 6c 29 3b 0a 20  eset(&allSql);. 
17670 20 20 20 64 62 5f 63 6c 6f 73 65 28 31 29 3b 0a     db_close(1);.
17680 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
17690 65 20 73 75 72 65 20 74 68 65 20 61 64 6d 69 6e  e sure the admin
176a0 6c 6f 67 20 74 61 62 6c 65 20 65 78 69 73 74 73  log table exists
176b0 2e 20 20 43 72 65 61 74 65 20 69 74 20 69 66 20  .  Create it if 
176c0 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2f 0a 76  it does not.*/.v
176d0 6f 69 64 20 63 72 65 61 74 65 5f 61 64 6d 69 6e  oid create_admin
176e0 5f 6c 6f 67 5f 74 61 62 6c 65 28 76 6f 69 64 29  _log_table(void)
176f0 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6f  {.  static int o
17700 6e 63 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f  nce = 0;.  if( o
17710 6e 63 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nce ) return;.  
17720 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 64 62 5f 6d  once = 1;.  db_m
17730 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 22  ulti_exec(.    "
17740 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
17750 4e 4f 54 20 45 58 49 53 54 53 20 5c 22 25 77 5c  NOT EXISTS \"%w\
17760 22 2e 61 64 6d 69 6e 5f 6c 6f 67 28 5c 6e 22 0a  ".admin_log(\n".
17770 20 20 20 20 22 20 69 64 20 49 4e 54 45 47 45 52      " id INTEGER
17780 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22   PRIMARY KEY,\n"
17790 0a 20 20 20 20 22 20 74 69 6d 65 20 49 4e 54 45  .    " time INTE
177a0 47 45 52 2c 20 2d 2d 20 53 65 63 6f 6e 64 73 20  GER, -- Seconds 
177b0 73 69 6e 63 65 20 31 39 37 30 5c 6e 22 0a 20 20  since 1970\n".  
177c0 20 20 22 20 70 61 67 65 20 54 45 58 54 2c 20 20    " page TEXT,  
177d0 20 20 2d 2d 20 70 61 74 68 20 6f 66 20 70 61 67    -- path of pag
177e0 65 5c 6e 22 0a 20 20 20 20 22 20 77 68 6f 20 54  e\n".    " who T
177f0 45 58 54 2c 20 20 20 20 20 2d 2d 20 55 73 65 72  EXT,     -- User
17800 20 77 68 6f 20 6d 61 64 65 20 74 68 65 20 63 68   who made the ch
17810 61 6e 67 65 5c 6e 20 22 0a 20 20 20 20 22 20 77  ange\n ".    " w
17820 68 61 74 20 54 45 58 54 20 20 20 20 20 2d 2d 20  hat TEXT     -- 
17830 57 68 61 74 20 63 68 61 6e 67 65 64 5c 6e 22 0a  What changed\n".
17840 20 20 20 20 22 29 22 2c 20 64 62 5f 6e 61 6d 65      ")", db_name
17850 28 22 72 65 70 6f 73 69 74 6f 72 79 22 29 0a 20  ("repository"). 
17860 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69   );.}../*.** Wri
17870 74 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e 74  te a message int
17880 6f 20 74 68 65 20 61 64 6d 69 6e 5f 65 76 65 6e  o the admin_even
17890 74 20 74 61 62 6c 65 2c 20 69 66 20 61 64 6d 69  t table, if admi
178a0 6e 20 6c 6f 67 67 69 6e 67 20 69 73 0a 2a 2a 20  n logging is.** 
178b0 65 6e 61 62 6c 65 64 20 76 69 61 20 74 68 65 20  enabled via the 
178c0 61 64 6d 69 6e 2d 6c 6f 67 20 63 6f 6e 66 69 67  admin-log config
178d0 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 2e 0a  uration option..
178e0 2a 2f 0a 76 6f 69 64 20 61 64 6d 69 6e 5f 6c 6f  */.void admin_lo
178f0 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  g(const char *zF
17900 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 42  ormat, ...){.  B
17910 6c 6f 62 20 77 68 61 74 20 3d 20 65 6d 70 74 79  lob what = empty
17920 5f 62 6c 6f 62 3b 0a 20 20 76 61 5f 6c 69 73 74  _blob;.  va_list
17930 20 61 70 3b 0a 20 20 69 66 28 20 21 64 62 5f 67   ap;.  if( !db_g
17940 65 74 5f 62 6f 6f 6c 65 61 6e 28 22 61 64 6d 69  et_boolean("admi
17950 6e 2d 6c 6f 67 22 2c 20 30 29 20 29 7b 0a 20 20  n-log", 0) ){.  
17960 20 20 20 20 2f 2a 20 50 6f 74 65 6e 74 69 61 6c      /* Potential
17970 20 6c 65 61 6b 20 68 65 72 65 20 28 6f 6e 20 25   leak here (on %
17980 7a 20 70 61 72 61 6d 73 29 20 62 75 74 0a 20 20  z params) but.  
17990 20 20 20 20 20 20 20 74 68 65 20 61 6c 74 65 72         the alter
179a0 6e 61 74 69 76 65 20 69 73 20 74 6f 20 6c 65 74  native is to let
179b0 20 62 6c 6f 62 5f 76 61 70 70 65 6e 64 66 28 29   blob_vappendf()
179c0 0a 20 20 20 20 20 20 20 20 20 64 6f 20 69 74 20  .         do it 
179d0 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  below. */.      
179e0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 63 72  return;.  }.  cr
179f0 65 61 74 65 5f 61 64 6d 69 6e 5f 6c 6f 67 5f 74  eate_admin_log_t
17a00 61 62 6c 65 28 29 3b 0a 20 20 76 61 5f 73 74 61  able();.  va_sta
17a10 72 74 28 61 70 2c 7a 46 6f 72 6d 61 74 29 3b 0a  rt(ap,zFormat);.
17a20 20 20 62 6c 6f 62 5f 76 61 70 70 65 6e 64 66 28    blob_vappendf(
17a30 20 26 77 68 61 74 2c 20 7a 46 6f 72 6d 61 74 2c   &what, zFormat,
17a40 20 61 70 20 29 3b 0a 20 20 76 61 5f 65 6e 64 28   ap );.  va_end(
17a50 61 70 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f  ap);.  db_multi_
17a60 65 78 65 63 28 22 49 4e 53 45 52 54 20 49 4e 54  exec("INSERT INT
17a70 4f 20 61 64 6d 69 6e 5f 6c 6f 67 28 74 69 6d 65  O admin_log(time
17a80 2c 70 61 67 65 2c 77 68 6f 2c 77 68 61 74 29 22  ,page,who,what)"
17a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17aa0 20 22 20 56 41 4c 55 45 53 28 6e 6f 77 28 29 2c   " VALUES(now(),
17ab0 20 25 51 2c 20 25 51 2c 20 25 42 29 22 2c 0a 20   %Q, %Q, %B)",. 
17ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
17ad0 2e 7a 50 61 74 68 2c 20 67 2e 7a 4c 6f 67 69 6e  .zPath, g.zLogin
17ae0 2c 20 26 77 68 61 74 29 3b 0a 20 20 62 6c 6f 62  , &what);.  blob
17af0 5f 72 65 73 65 74 28 26 77 68 61 74 29 3b 0a 7d  _reset(&what);.}
17b00 0a                                               .