Fossil

Hex Artifact Content
Login

Artifact 6d07632054b709a56a3ee9e5340d67fb120e80d99fd6dc261fb64c67606bc759:


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 2a 2a 0a 2a 2a 20 54 68  ense".).**.** Th
00f0: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0100: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65  stributed in the
0110: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69   hope that it wi
0120: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a  ll be useful,.**
0130: 20 62 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79   but without any
0140: 20 77 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f   warranty; witho
0150: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c  ut even the impl
0160: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a  ied warranty of.
0170: 2a 2a 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69  ** merchantabili
0180: 74 79 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f  ty or fitness fo
0190: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 70  r a particular p
01a0: 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75  urpose..**.** Au
01b0: 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66  thor contact inf
01c0: 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64  ormation:.**   d
01d0: 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20  rh@hwaci.com.** 
01e0: 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61    http://www.hwa
01f0: 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a  ci.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 2a 2a 0a 2a  **************.*
0250: 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 69 6e  *.** Code for in
0260: 74 65 72 66 61 63 69 6e 67 20 74 6f 20 74 68 65  terfacing to the
0270: 20 76 61 72 69 6f 75 73 20 64 61 74 61 62 61 73   various databas
0280: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  es..**.** There 
0290: 61 72 65 20 74 68 72 65 65 20 73 65 70 61 72 61  are three separa
02a0: 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  te database file
02b0: 73 20 74 68 61 74 20 66 6f 73 73 69 6c 20 69 6e  s that fossil in
02c0: 74 65 72 61 63 74 73 0a 2a 2a 20 77 69 74 68 3a  teracts.** with:
02d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
02e0: 68 65 20 22 75 73 65 72 22 20 64 61 74 61 62 61  he "user" databa
02f0: 73 65 20 69 6e 20 7e 2f 2e 66 6f 73 73 69 6c 0a  se in ~/.fossil.
0300: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68  **.**    (2)  Th
0310: 65 20 22 72 65 70 6f 73 69 74 6f 72 79 22 20 64  e "repository" d
0320: 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20  atabase.**.**   
0330: 20 28 33 29 20 20 41 20 6c 6f 63 61 6c 20 63 68   (3)  A local ch
0340: 65 63 6b 6f 75 74 20 64 61 74 61 62 61 73 65 20  eckout database 
0350: 6e 61 6d 65 64 20 22 5f 46 4f 53 53 49 4c 5f 22  named "_FOSSIL_"
0360: 20 6f 72 20 22 2e 66 73 6c 63 6b 6f 75 74 22 0a   or ".fslckout".
0370: 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6c  **         and l
0380: 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 72 6f  ocated at the ro
0390: 6f 74 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20  ot of the local 
03a0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 6f 75 72  copy of the sour
03b0: 63 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2f 0a 23  ce tree..**.*/.#
03c0: 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e  include "config.
03d0: 68 22 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  h".#if defined(_
03e0: 57 49 4e 33 32 29 0a 23 20 20 69 66 20 55 53 45  WIN32).#  if USE
03f0: 5f 53 45 45 0a 23 20 20 20 20 69 6e 63 6c 75 64  _SEE.#    includ
0400: 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 23 20  e <windows.h>.# 
0410: 20 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 20 20   endif.#else.#  
0420: 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e 68 3e 0a  include <pwd.h>.
0430: 23 65 6e 64 69 66 0a 23 69 66 20 55 53 45 5f 53  #endif.#if USE_S
0440: 45 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  EE && !defined(S
0450: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29  QLITE_HAS_CODEC)
0460: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
0470: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 65 6e 64  E_HAS_CODEC.#end
0480: 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 73 71 6c  if.#include <sql
0490: 69 74 65 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ite3.h>.#include
04a0: 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23   <sys/types.h>.#
04b0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61  include <sys/sta
04c0: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75  t.h>.#include <u
04d0: 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64  nistd.h>.#includ
04e0: 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c  e <time.h>.#incl
04f0: 75 64 65 20 22 64 62 2e 68 22 0a 0a 23 69 66 20  ude "db.h"..#if 
0500: 49 4e 54 45 52 46 41 43 45 0a 2f 2a 0a 2a 2a 20  INTERFACE./*.** 
0510: 41 6e 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74  An single SQL st
0520: 61 74 65 6d 65 6e 74 20 69 73 20 72 65 70 72 65  atement is repre
0530: 73 65 6e 74 65 64 20 61 73 20 61 6e 20 69 6e 73  sented as an ins
0540: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
0550: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
0560: 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ure..*/.struct S
0570: 74 6d 74 20 7b 0a 20 20 42 6c 6f 62 20 73 71 6c  tmt {.  Blob sql
0580: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0590: 2f 2a 20 54 68 65 20 53 51 4c 20 66 6f 72 20 74  /* The SQL for t
05a0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  his statement */
05b0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
05c0: 2a 70 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 68  *pStmt;    /* Th
05d0: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 73 71 6c  e results of sql
05e0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
05f0: 29 20 2a 2f 0a 20 20 53 74 6d 74 20 2a 70 4e 65  ) */.  Stmt *pNe
0600: 78 74 2c 20 2a 70 50 72 65 76 3b 20 20 20 20 2f  xt, *pPrev;    /
0610: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e  * List of all un
0620: 66 69 6e 61 6c 69 7a 65 64 20 73 74 61 74 65 6d  finalized statem
0630: 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ents */.  int nS
0640: 74 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  tep;            
0650: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
0660: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
0670: 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  lls */.  int rc;
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0690: 20 2f 2a 20 45 72 72 6f 72 20 66 72 6f 6d 20 64   /* Error from d
06a0: 62 5f 76 70 72 65 70 61 72 65 28 29 20 2a 2f 0a  b_vprepare() */.
06b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  };../*.** Copy t
06c0: 68 69 73 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  his to initializ
06d0: 65 20 61 20 53 74 6d 74 20 6f 62 6a 65 63 74 20  e a Stmt object 
06e0: 74 6f 20 61 20 63 6c 65 61 6e 2f 65 6d 70 74 79  to a clean/empty
06f0: 20 73 74 61 74 65 2e 20 54 68 69 73 0a 2a 2a 20   state. This.** 
0700: 69 73 20 75 73 65 66 75 6c 20 74 6f 20 68 65 6c  is useful to hel
0710: 70 20 61 76 6f 69 64 20 61 73 73 65 72 74 69 6f  p avoid assertio
0720: 6e 73 20 77 68 65 6e 20 70 65 72 66 6f 72 6d 69  ns when performi
0730: 6e 67 20 63 6c 65 61 6e 75 70 20 69 6e 20 73 6f  ng cleanup in so
0740: 6d 65 0a 2a 2a 20 65 72 72 6f 72 20 68 61 6e 64  me.** error hand
0750: 6c 69 6e 67 20 63 61 73 65 73 2e 0a 2a 2f 0a 23  ling cases..*/.#
0760: 64 65 66 69 6e 65 20 65 6d 70 74 79 5f 53 74 6d  define empty_Stm
0770: 74 5f 6d 20 7b 42 4c 4f 42 5f 49 4e 49 54 49 41  t_m {BLOB_INITIA
0780: 4c 49 5a 45 52 2c 4e 55 4c 4c 2c 20 4e 55 4c 4c  LIZER,NULL, NULL
0790: 2c 20 4e 55 4c 4c 2c 20 30 2c 20 30 7d 0a 23 65  , NULL, 0, 0}.#e
07a0: 6e 64 69 66 20 2f 2a 20 49 4e 54 45 52 46 41 43  ndif /* INTERFAC
07b0: 45 20 2a 2f 0a 63 6f 6e 73 74 20 73 74 72 75 63  E */.const struc
07c0: 74 20 53 74 6d 74 20 65 6d 70 74 79 5f 53 74 6d  t Stmt empty_Stm
07d0: 74 20 3d 20 65 6d 70 74 79 5f 53 74 6d 74 5f 6d  t = empty_Stmt_m
07e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  ;../*.** Call th
07f0: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
0800: 61 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  a database error
0810: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
0820: 69 63 20 76 6f 69 64 20 64 62 5f 65 72 72 28 63  ic void db_err(c
0830: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
0840: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 73 74 61 74  at, ...){.  stat
0850: 69 63 20 69 6e 74 20 72 63 4c 6f 6f 70 69 6e 67  ic int rcLooping
0860: 20 3d 20 30 3b 0a 20 20 76 61 5f 6c 69 73 74 20   = 0;.  va_list 
0870: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ap;.  char *z;. 
0880: 20 69 6e 74 20 72 63 20 3d 20 31 3b 0a 20 20 69   int rc = 1;.  i
0890: 66 28 20 72 63 4c 6f 6f 70 69 6e 67 20 29 20 65  f( rcLooping ) e
08a0: 78 69 74 28 72 63 4c 6f 6f 70 69 6e 67 29 3b 0a  xit(rcLooping);.
08b0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
08c0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 76  Format);.  z = v
08d0: 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c  mprintf(zFormat,
08e0: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
08f0: 70 29 3b 0a 23 69 66 64 65 66 20 46 4f 53 53 49  p);.#ifdef FOSSI
0900: 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 0a 20 20  L_ENABLE_JSON.  
0910: 69 66 28 20 67 2e 6a 73 6f 6e 2e 69 73 4a 73 6f  if( g.json.isJso
0920: 6e 4d 6f 64 65 20 29 7b 0a 20 20 20 20 6a 73 6f  nMode ){.    jso
0930: 6e 5f 65 72 72 28 20 30 2c 20 7a 2c 20 31 20 29  n_err( 0, z, 1 )
0940: 3b 0a 20 20 20 20 69 66 28 20 67 2e 69 73 48 54  ;.    if( g.isHT
0950: 54 50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  TP ){.      rc =
0960: 20 30 20 2f 2a 20 61 76 6f 69 64 20 48 54 54 50   0 /* avoid HTTP
0970: 20 35 30 30 20 2a 2f 3b 0a 20 20 20 20 7d 0a 20   500 */;.    }. 
0980: 20 7d 0a 20 20 65 6c 73 65 0a 23 65 6e 64 69 66   }.  else.#endif
0990: 20 2f 2a 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c   /* FOSSIL_ENABL
09a0: 45 5f 4a 53 4f 4e 20 2a 2f 0a 20 20 69 66 28 20  E_JSON */.  if( 
09b0: 67 2e 78 66 65 72 50 61 6e 69 63 20 29 7b 0a 20  g.xferPanic ){. 
09c0: 20 20 20 63 67 69 5f 72 65 73 65 74 5f 63 6f 6e     cgi_reset_con
09d0: 74 65 6e 74 28 29 3b 0a 20 20 20 20 40 20 65 72  tent();.    @ er
09e0: 72 6f 72 20 44 61 74 61 62 61 73 65 5c 73 65 72  ror Database\ser
09f0: 72 6f 72 3a 5c 73 25 46 28 7a 29 0a 20 20 20 20  ror:\s%F(z).    
0a00: 20 20 63 67 69 5f 72 65 70 6c 79 28 29 3b 0a 20    cgi_reply();. 
0a10: 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 67 2e   }.  else if( g.
0a20: 63 67 69 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  cgiOutput ){.   
0a30: 20 67 2e 63 67 69 4f 75 74 70 75 74 20 3d 20 30   g.cgiOutput = 0
0a40: 3b 0a 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66  ;.    cgi_printf
0a50: 28 22 3c 68 31 3e 44 61 74 61 62 61 73 65 20 45  ("<h1>Database E
0a60: 72 72 6f 72 3c 2f 68 31 3e 5c 6e 3c 70 3e 25 68  rror</h1>\n<p>%h
0a70: 3c 2f 70 3e 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20  </p>\n", z);.   
0a80: 20 63 67 69 5f 72 65 70 6c 79 28 29 3b 0a 20 20   cgi_reply();.  
0a90: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
0aa0: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 20  tf(stderr, "%s: 
0ab0: 25 73 5c 6e 22 2c 20 67 2e 61 72 67 76 5b 30 5d  %s\n", g.argv[0]
0ac0: 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65  , z);.  }.  free
0ad0: 28 7a 29 3b 0a 20 20 72 63 4c 6f 6f 70 69 6e 67  (z);.  rcLooping
0ae0: 20 3d 20 72 63 3b 0a 20 20 64 62 5f 66 6f 72 63   = rc;.  db_forc
0af0: 65 5f 72 6f 6c 6c 62 61 63 6b 28 29 3b 0a 20 20  e_rollback();.  
0b00: 66 6f 73 73 69 6c 5f 65 78 69 74 28 72 63 29 3b  fossil_exit(rc);
0b10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 73 74  .}../*.** All st
0b20: 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 74 68  atic variable th
0b30: 61 74 20 61 20 75 73 65 64 20 62 79 20 6f 6e 6c  at a used by onl
0b40: 79 20 74 68 69 73 20 66 69 6c 65 20 61 72 65 20  y this file are 
0b50: 67 61 74 68 65 72 65 64 20 69 6e 74 6f 0a 2a 2a  gathered into.**
0b60: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
0b70: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
0b80: 74 69 63 20 73 74 72 75 63 74 20 44 62 4c 6f 63  tic struct DbLoc
0b90: 61 6c 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 6e  alData {.  int n
0ba0: 42 65 67 69 6e 3b 20 20 20 20 20 20 20 20 20 20  Begin;          
0bb0: 20 20 20 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20       /* Nesting 
0bc0: 64 65 70 74 68 20 6f 66 20 42 45 47 49 4e 20 2a  depth of BEGIN *
0bd0: 2f 0a 20 20 69 6e 74 20 64 6f 52 6f 6c 6c 62 61  /.  int doRollba
0be0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ck;           /*
0bf0: 20 54 72 75 65 20 74 6f 20 66 6f 72 63 65 20 61   True to force a
0c00: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   rollback */.  i
0c10: 6e 74 20 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 3b 20  nt nCommitHook; 
0c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
0c30: 65 72 20 6f 66 20 63 6f 6d 6d 69 74 20 68 6f 6f  er of commit hoo
0c40: 6b 73 20 2a 2f 0a 20 20 53 74 6d 74 20 2a 70 41  ks */.  Stmt *pA
0c50: 6c 6c 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  llStmt;         
0c60: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
0c70: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 73 74 61   unfinalized sta
0c80: 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  tements */.  int
0c90: 20 6e 50 72 65 70 61 72 65 3b 20 20 20 20 20 20   nPrepare;      
0ca0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0cb0: 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   of calls to sql
0cc0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
0cd0: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 65 6c 65  ) */.  int nDele
0ce0: 74 65 4f 6e 46 61 69 6c 3b 20 20 20 20 20 20 20  teOnFail;       
0cf0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
0d00: 74 72 69 65 73 20 69 6e 20 61 7a 44 65 6c 65 74  tries in azDelet
0d10: 65 4f 6e 46 61 69 6c 5b 5d 20 2a 2f 0a 20 20 73  eOnFail[] */.  s
0d20: 74 72 75 63 74 20 73 43 6f 6d 6d 69 74 48 6f 6f  truct sCommitHoo
0d30: 6b 20 7b 0a 20 20 20 20 69 6e 74 20 28 2a 78 48  k {.    int (*xH
0d40: 6f 6f 6b 29 28 76 6f 69 64 29 3b 20 20 20 20 20  ook)(void);     
0d50: 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73      /* Functions
0d60: 20 74 6f 20 63 61 6c 6c 20 61 74 20 64 62 5f 65   to call at db_e
0d70: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29  nd_transaction()
0d80: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65 71 75   */.    int sequ
0d90: 65 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  ence;           
0da0: 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 75 6e 63      /* Call func
0db0: 74 69 6f 6e 73 20 69 6e 20 73 65 71 75 65 6e 63  tions in sequenc
0dc0: 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 7d 20 61  e order */.  } a
0dd0: 48 6f 6f 6b 5b 35 5d 3b 0a 20 20 63 68 61 72 20  Hook[5];.  char 
0de0: 2a 61 7a 44 65 6c 65 74 65 4f 6e 46 61 69 6c 5b  *azDeleteOnFail[
0df0: 33 5d 3b 20 20 2f 2a 20 46 69 6c 65 73 20 74 6f  3];  /* Files to
0e00: 20 64 65 6c 65 74 65 20 6f 6e 20 61 20 66 61 69   delete on a fai
0e10: 6c 75 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lure */.  char *
0e20: 61 7a 42 65 66 6f 72 65 43 6f 6d 6d 69 74 5b 35  azBeforeCommit[5
0e30: 5d 3b 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20  ];  /* Commands 
0e40: 74 6f 20 72 75 6e 20 70 72 69 6f 72 20 74 6f 20  to run prior to 
0e50: 43 4f 4d 4d 49 54 20 2a 2f 0a 20 20 69 6e 74 20  COMMIT */.  int 
0e60: 6e 42 65 66 6f 72 65 43 6f 6d 6d 69 74 3b 20 20  nBeforeCommit;  
0e70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0e80: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
0e90: 42 65 66 6f 72 65 43 6f 6d 6d 69 74 20 2a 2f 0a  BeforeCommit */.
0ea0: 20 20 69 6e 74 20 6e 50 72 69 6f 72 43 68 61 6e    int nPriorChan
0eb0: 67 65 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 73  ges;        /* s
0ec0: 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61  qlite3_total_cha
0ed0: 6e 67 65 73 28 29 20 61 74 20 74 72 61 6e 73 61  nges() at transa
0ee0: 63 74 69 6f 6e 20 73 74 61 72 74 20 2a 2f 0a 7d  ction start */.}
0ef0: 20 64 62 20 3d 20 7b 30 2c 20 30 2c 20 30 2c 20   db = {0, 0, 0, 
0f00: 30 2c 20 30 2c 20 30 2c 20 7d 3b 0a 0a 2f 2a 0a  0, 0, 0, };../*.
0f10: 2a 2a 20 41 72 72 61 6e 67 65 20 66 6f 72 20 74  ** Arrange for t
0f20: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 74 6f  he given file to
0f30: 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 20 61   be deleted on a
0f40: 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 76 6f 69   failure..*/.voi
0f50: 64 20 64 62 5f 64 65 6c 65 74 65 5f 6f 6e 5f 66  d db_delete_on_f
0f60: 61 69 6c 75 72 65 28 63 6f 6e 73 74 20 63 68 61  ailure(const cha
0f70: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
0f80: 20 61 73 73 65 72 74 28 20 64 62 2e 6e 44 65 6c   assert( db.nDel
0f90: 65 74 65 4f 6e 46 61 69 6c 3c 63 6f 75 6e 74 28  eteOnFail<count(
0fa0: 64 62 2e 61 7a 44 65 6c 65 74 65 4f 6e 46 61 69  db.azDeleteOnFai
0fb0: 6c 29 20 29 3b 0a 20 20 64 62 2e 61 7a 44 65 6c  l) );.  db.azDel
0fc0: 65 74 65 4f 6e 46 61 69 6c 5b 64 62 2e 6e 44 65  eteOnFail[db.nDe
0fd0: 6c 65 74 65 4f 6e 46 61 69 6c 2b 2b 5d 20 3d 20  leteOnFail++] = 
0fe0: 66 6f 73 73 69 6c 5f 73 74 72 64 75 70 28 7a 46  fossil_strdup(zF
0ff0: 69 6c 65 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  ilename);.}../*.
1000: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1010: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
1020: 20 53 51 4c 69 74 65 20 63 6f 6d 6d 69 74 2d 68   SQLite commit-h
1030: 6f 6f 6b 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a  ook mechanism.**
1040: 20 6a 75 73 74 20 70 72 69 6f 72 20 74 6f 20 65   just prior to e
1050: 61 63 68 20 63 6f 6d 6d 69 74 2e 20 20 41 6c 6c  ach commit.  All
1060: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
1070: 65 73 20 69 73 20 76 65 72 69 66 79 0a 2a 2a 20  es is verify.** 
1080: 74 68 61 74 20 6e 42 65 67 69 6e 20 72 65 61 6c  that nBegin real
1090: 6c 79 20 69 73 20 7a 65 72 6f 2e 20 20 54 68 61  ly is zero.  Tha
10a0: 74 20 69 6e 73 75 72 65 73 20 74 68 61 74 20 74  t insures that t
10b0: 72 61 6e 73 61 63 74 69 6f 6e 73 0a 2a 2a 20 63  ransactions.** c
10c0: 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 62 79 20  annot commit by 
10d0: 61 6e 79 20 6d 65 61 6e 73 20 6f 74 68 65 72 20  any means other 
10e0: 74 68 61 6e 20 62 79 20 63 61 6c 6c 69 6e 67 20  than by calling 
10f0: 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  db_end_transacti
1100: 6f 6e 28 29 0a 2a 2a 20 62 65 6c 6f 77 2e 0a 2a  on().** below..*
1110: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6a 75 73  *.** This is jus
1120: 74 20 61 20 73 61 66 65 74 79 20 61 6e 64 20 73  t a safety and s
1130: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2f 0a  anity check..*/.
1140: 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f 76 65  static int db_ve
1150: 72 69 66 79 5f 61 74 5f 63 6f 6d 6d 69 74 28 76  rify_at_commit(v
1160: 6f 69 64 20 2a 6e 6f 74 55 73 65 64 29 7b 0a 20  oid *notUsed){. 
1170: 20 69 66 28 20 64 62 2e 6e 42 65 67 69 6e 20 29   if( db.nBegin )
1180: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e  {.    fossil_pan
1190: 69 63 28 22 69 6c 6c 65 67 61 6c 20 63 6f 6d 6d  ic("illegal comm
11a0: 69 74 20 61 74 74 65 6d 70 74 22 29 3b 0a 20 20  it attempt");.  
11b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
11c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
11d0: 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 6e 64 20 65  *.** Begin and e
11e0: 6e 64 20 61 20 6e 65 73 74 65 64 20 74 72 61 6e  nd a nested tran
11f0: 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
1200: 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  db_begin_transac
1210: 74 69 6f 6e 28 76 6f 69 64 29 7b 0a 20 20 69 66  tion(void){.  if
1220: 28 20 64 62 2e 6e 42 65 67 69 6e 3d 3d 30 20 29  ( db.nBegin==0 )
1230: 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65  {.    db_multi_e
1240: 78 65 63 28 22 42 45 47 49 4e 22 29 3b 0a 20 20  xec("BEGIN");.  
1250: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74    sqlite3_commit
1260: 5f 68 6f 6f 6b 28 67 2e 64 62 2c 20 64 62 5f 76  _hook(g.db, db_v
1270: 65 72 69 66 79 5f 61 74 5f 63 6f 6d 6d 69 74 2c  erify_at_commit,
1280: 20 30 29 3b 0a 20 20 20 20 64 62 2e 6e 50 72 69   0);.    db.nPri
1290: 6f 72 43 68 61 6e 67 65 73 20 3d 20 73 71 6c 69  orChanges = sqli
12a0: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
12b0: 73 28 67 2e 64 62 29 3b 0a 20 20 7d 0a 20 20 64  s(g.db);.  }.  d
12c0: 62 2e 6e 42 65 67 69 6e 2b 2b 3b 0a 7d 0a 76 6f  b.nBegin++;.}.vo
12d0: 69 64 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61  id db_end_transa
12e0: 63 74 69 6f 6e 28 69 6e 74 20 72 6f 6c 6c 62 61  ction(int rollba
12f0: 63 6b 46 6c 61 67 29 7b 0a 20 20 69 66 28 20 67  ckFlag){.  if( g
1300: 2e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  .db==0 ) return;
1310: 0a 20 20 69 66 28 20 64 62 2e 6e 42 65 67 69 6e  .  if( db.nBegin
1320: 3c 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  <=0 ) return;.  
1330: 69 66 28 20 72 6f 6c 6c 62 61 63 6b 46 6c 61 67  if( rollbackFlag
1340: 20 29 20 64 62 2e 64 6f 52 6f 6c 6c 62 61 63 6b   ) db.doRollback
1350: 20 3d 20 31 3b 0a 20 20 64 62 2e 6e 42 65 67 69   = 1;.  db.nBegi
1360: 6e 2d 2d 3b 0a 20 20 69 66 28 20 64 62 2e 6e 42  n--;.  if( db.nB
1370: 65 67 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69  egin==0 ){.    i
1380: 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 64 62  nt i;.    if( db
1390: 2e 64 6f 52 6f 6c 6c 62 61 63 6b 3d 3d 30 20 26  .doRollback==0 &
13a0: 26 20 64 62 2e 6e 50 72 69 6f 72 43 68 61 6e 67  & db.nPriorChang
13b0: 65 73 3c 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  es<sqlite3_total
13c0: 5f 63 68 61 6e 67 65 73 28 67 2e 64 62 29 20 29  _changes(g.db) )
13d0: 7b 0a 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20  {.      i = 0;. 
13e0: 20 20 20 20 20 77 68 69 6c 65 28 20 64 62 2e 6e       while( db.n
13f0: 42 65 66 6f 72 65 43 6f 6d 6d 69 74 20 29 7b 0a  BeforeCommit ){.
1400: 20 20 20 20 20 20 20 20 64 62 2e 6e 42 65 66 6f          db.nBefo
1410: 72 65 43 6f 6d 6d 69 74 2d 2d 3b 0a 20 20 20 20  reCommit--;.    
1420: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
1430: 28 67 2e 64 62 2c 20 64 62 2e 61 7a 42 65 66 6f  (g.db, db.azBefo
1440: 72 65 43 6f 6d 6d 69 74 5b 69 5d 2c 20 30 2c 20  reCommit[i], 0, 
1450: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
1460: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2e 61  qlite3_free(db.a
1470: 7a 42 65 66 6f 72 65 43 6f 6d 6d 69 74 5b 69 5d  zBeforeCommit[i]
1480: 29 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  );.        i++;.
1490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 65        }.      le
14a0: 61 66 5f 64 6f 5f 70 65 6e 64 69 6e 67 5f 63 68  af_do_pending_ch
14b0: 65 63 6b 73 28 29 3b 0a 20 20 20 20 7d 0a 20 20  ecks();.    }.  
14c0: 20 20 66 6f 72 28 69 3d 30 3b 20 64 62 2e 64 6f    for(i=0; db.do
14d0: 52 6f 6c 6c 62 61 63 6b 3d 3d 30 20 26 26 20 69  Rollback==0 && i
14e0: 3c 64 62 2e 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 3b  <db.nCommitHook;
14f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 64 62 2e   i++){.      db.
1500: 64 6f 52 6f 6c 6c 62 61 63 6b 20 7c 3d 20 64 62  doRollback |= db
1510: 2e 61 48 6f 6f 6b 5b 69 5d 2e 78 48 6f 6f 6b 28  .aHook[i].xHook(
1520: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  );.    }.    whi
1530: 6c 65 28 20 64 62 2e 70 41 6c 6c 53 74 6d 74 20  le( db.pAllStmt 
1540: 29 7b 0a 20 20 20 20 20 20 64 62 5f 66 69 6e 61  ){.      db_fina
1550: 6c 69 7a 65 28 64 62 2e 70 41 6c 6c 53 74 6d 74  lize(db.pAllStmt
1560: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f  );.    }.    db_
1570: 6d 75 6c 74 69 5f 65 78 65 63 28 22 25 73 22 2c  multi_exec("%s",
1580: 20 64 62 2e 64 6f 52 6f 6c 6c 62 61 63 6b 20 3f   db.doRollback ?
1590: 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20 22 43   "ROLLBACK" : "C
15a0: 4f 4d 4d 49 54 22 29 3b 0a 20 20 20 20 64 62 2e  OMMIT");.    db.
15b0: 64 6f 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  doRollback = 0;.
15c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72    }.}../*.** For
15d0: 63 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ce a rollback an
15e0: 64 20 73 68 75 74 64 6f 77 6e 20 74 68 65 20 64  d shutdown the d
15f0: 61 74 61 62 61 73 65 0a 2a 2f 0a 76 6f 69 64 20  atabase.*/.void 
1600: 64 62 5f 66 6f 72 63 65 5f 72 6f 6c 6c 62 61 63  db_force_rollbac
1610: 6b 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69  k(void){.  int i
1620: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 62  ;.  static int b
1630: 75 73 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  usy = 0;.  sqlit
1640: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
1650: 20 30 3b 0a 20 20 69 66 28 20 62 75 73 79 20 7c   0;.  if( busy |
1660: 7c 20 67 2e 64 62 3d 3d 30 20 29 20 72 65 74 75  | g.db==0 ) retu
1670: 72 6e 3b 0a 20 20 62 75 73 79 20 3d 20 31 3b 0a  rn;.  busy = 1;.
1680: 20 20 75 6e 64 6f 5f 72 6f 6c 6c 62 61 63 6b 28    undo_rollback(
1690: 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 53 74  );.  while( (pSt
16a0: 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 6e 65 78  mt = sqlite3_nex
16b0: 74 5f 73 74 6d 74 28 67 2e 64 62 2c 70 53 74 6d  t_stmt(g.db,pStm
16c0: 74 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  t))!=0 ){.    sq
16d0: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
16e0: 74 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  t);.  }.  while(
16f0: 20 64 62 2e 70 41 6c 6c 53 74 6d 74 20 29 7b 0a   db.pAllStmt ){.
1700: 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28      db_finalize(
1710: 64 62 2e 70 41 6c 6c 53 74 6d 74 29 3b 0a 20 20  db.pAllStmt);.  
1720: 7d 0a 20 20 69 66 28 20 64 62 2e 6e 42 65 67 69  }.  if( db.nBegi
1730: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
1740: 5f 65 78 65 63 28 67 2e 64 62 2c 20 22 52 4f 4c  _exec(g.db, "ROL
1750: 4c 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20 30 29  LBACK", 0, 0, 0)
1760: 3b 0a 20 20 20 20 64 62 2e 6e 42 65 67 69 6e 20  ;.    db.nBegin 
1770: 3d 20 30 3b 0a 20 20 7d 0a 20 20 62 75 73 79 20  = 0;.  }.  busy 
1780: 3d 20 30 3b 0a 20 20 64 62 5f 63 6c 6f 73 65 28  = 0;.  db_close(
1790: 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0);.  for(i=0; i
17a0: 3c 64 62 2e 6e 44 65 6c 65 74 65 4f 6e 46 61 69  <db.nDeleteOnFai
17b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 69 6c  l; i++){.    fil
17c0: 65 5f 64 65 6c 65 74 65 28 64 62 2e 61 7a 44 65  e_delete(db.azDe
17d0: 6c 65 74 65 4f 6e 46 61 69 6c 5b 69 5d 29 3b 0a  leteOnFail[i]);.
17e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73    }.}../*.** Ins
17f0: 74 61 6c 6c 20 61 20 63 6f 6d 6d 69 74 20 68 6f  tall a commit ho
1800: 6f 6b 2e 20 20 48 6f 6f 6b 73 20 61 72 65 20 69  ok.  Hooks are i
1810: 6e 73 74 61 6c 6c 65 64 20 69 6e 20 73 65 71 75  nstalled in sequ
1820: 65 6e 63 65 20 6f 72 64 65 72 2e 0a 2a 2a 20 49  ence order..** I
1830: 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f  t is an error to
1840: 20 69 6e 73 74 61 6c 6c 20 74 68 65 20 73 61 6d   install the sam
1850: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 6d 6f  e commit hook mo
1860: 72 65 20 74 68 61 6e 20 6f 6e 63 65 2e 0a 2a 2a  re than once..**
1870: 0a 2a 2a 20 45 61 63 68 20 63 6f 6d 6d 69 74 20  .** Each commit 
1880: 68 6f 6f 6b 20 69 73 20 63 61 6c 6c 65 64 20 28  hook is called (
1890: 69 6e 20 6f 72 64 65 72 20 6f 66 20 61 73 63 65  in order of asce
18a0: 6e 64 69 6e 67 20 73 65 71 75 65 6e 63 65 29 20  nding sequence) 
18b0: 61 74 0a 2a 2a 20 65 61 63 68 20 63 6f 6d 6d 69  at.** each commi
18c0: 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 66  t operation.  If
18d0: 20 61 6e 79 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   any commit hook
18e0: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
18f0: 6f 2c 0a 2a 2a 20 74 68 65 20 73 75 62 73 65 71  o,.** the subseq
1900: 75 65 6e 63 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  uence commit hoo
1910: 6b 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 61  ks are omitted a
1920: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
1930: 6f 6e 0a 2a 2a 20 72 6f 6c 6c 73 20 62 61 63 6b  on.** rolls back
1940: 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 6f 6d   rather than com
1950: 6d 69 74 2e 20 20 49 74 20 69 73 20 74 68 65 20  mit.  It is the 
1960: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
1970: 66 20 74 68 65 0a 2a 2a 20 68 6f 6f 6b 73 20 74  f the.** hooks t
1980: 68 65 6d 73 65 6c 76 65 73 20 74 6f 20 69 73 73  hemselves to iss
1990: 75 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  ue any error mes
19a0: 73 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 64  sages..*/.void d
19b0: 62 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 69 6e  b_commit_hook(in
19c0: 74 20 28 2a 78 29 28 76 6f 69 64 29 2c 20 69 6e  t (*x)(void), in
19d0: 74 20 73 65 71 75 65 6e 63 65 29 7b 0a 20 20 69  t sequence){.  i
19e0: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
19f0: 64 62 2e 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 20 3c  db.nCommitHook <
1a00: 20 63 6f 75 6e 74 28 64 62 2e 61 48 6f 6f 6b 29   count(db.aHook)
1a10: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
1a20: 3c 64 62 2e 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 3b  <db.nCommitHook;
1a30: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
1a40: 74 28 20 78 21 3d 64 62 2e 61 48 6f 6f 6b 5b 69  t( x!=db.aHook[i
1a50: 5d 2e 78 48 6f 6f 6b 20 29 3b 0a 20 20 20 20 69  ].xHook );.    i
1a60: 66 28 20 64 62 2e 61 48 6f 6f 6b 5b 69 5d 2e 73  f( db.aHook[i].s
1a70: 65 71 75 65 6e 63 65 3e 73 65 71 75 65 6e 63 65  equence>sequence
1a80: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 20   ){.      int s 
1a90: 3d 20 73 65 71 75 65 6e 63 65 3b 0a 20 20 20 20  = sequence;.    
1aa0: 20 20 69 6e 74 20 28 2a 78 53 29 28 76 6f 69 64    int (*xS)(void
1ab0: 29 20 3d 20 78 3b 0a 20 20 20 20 20 20 73 65 71  ) = x;.      seq
1ac0: 75 65 6e 63 65 20 3d 20 64 62 2e 61 48 6f 6f 6b  uence = db.aHook
1ad0: 5b 69 5d 2e 73 65 71 75 65 6e 63 65 3b 0a 20 20  [i].sequence;.  
1ae0: 20 20 20 20 78 20 3d 20 64 62 2e 61 48 6f 6f 6b      x = db.aHook
1af0: 5b 69 5d 2e 78 48 6f 6f 6b 3b 0a 20 20 20 20 20  [i].xHook;.     
1b00: 20 64 62 2e 61 48 6f 6f 6b 5b 69 5d 2e 73 65 71   db.aHook[i].seq
1b10: 75 65 6e 63 65 20 3d 20 73 3b 0a 20 20 20 20 20  uence = s;.     
1b20: 20 64 62 2e 61 48 6f 6f 6b 5b 69 5d 2e 78 48 6f   db.aHook[i].xHo
1b30: 6f 6b 20 3d 20 78 53 3b 0a 20 20 20 20 7d 0a 20  ok = xS;.    }. 
1b40: 20 7d 0a 20 20 64 62 2e 61 48 6f 6f 6b 5b 64 62   }.  db.aHook[db
1b50: 2e 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 5d 2e 73 65  .nCommitHook].se
1b60: 71 75 65 6e 63 65 20 3d 20 73 65 71 75 65 6e 63  quence = sequenc
1b70: 65 3b 0a 20 20 64 62 2e 61 48 6f 6f 6b 5b 64 62  e;.  db.aHook[db
1b80: 2e 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 5d 2e 78 48  .nCommitHook].xH
1b90: 6f 6f 6b 20 3d 20 78 3b 0a 20 20 64 62 2e 6e 43  ook = x;.  db.nC
1ba0: 6f 6d 6d 69 74 48 6f 6f 6b 2b 2b 3b 0a 7d 0a 0a  ommitHook++;.}..
1bb0: 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a 2f 2a  #if INTERFACE./*
1bc0: 0a 2a 2a 20 50 6f 73 73 69 62 6c 65 20 66 6c 61  .** Possible fla
1bd0: 67 73 20 74 6f 20 64 62 5f 76 70 72 65 70 61 72  gs to db_vprepar
1be0: 65 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 42 5f  e.*/.#define DB_
1bf0: 50 52 45 50 41 52 45 5f 49 47 4e 4f 52 45 5f 45  PREPARE_IGNORE_E
1c00: 52 52 4f 52 20 20 30 78 30 30 31 20 20 2f 2a 20  RROR  0x001  /* 
1c10: 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 73 20  Suppress errors 
1c20: 2a 2f 0a 23 64 65 66 69 6e 65 20 44 42 5f 50 52  */.#define DB_PR
1c30: 45 50 41 52 45 5f 50 45 52 53 49 53 54 45 4e 54  EPARE_PERSISTENT
1c40: 20 20 20 20 30 78 30 30 32 20 20 2f 2a 20 53 74      0x002  /* St
1c50: 6d 74 20 77 69 6c 6c 20 73 74 69 63 6b 20 61 72  mt will stick ar
1c60: 6f 75 6e 64 20 66 6f 72 20 61 20 77 68 69 6c 65  ound for a while
1c70: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
1c80: 2a 20 50 72 65 70 61 72 65 20 61 20 53 74 6d 74  * Prepare a Stmt
1c90: 2e 20 20 41 73 73 75 6d 65 20 74 68 61 74 20 74  .  Assume that t
1ca0: 68 65 20 53 74 6d 74 20 69 73 20 70 72 65 76 69  he Stmt is previ
1cb0: 6f 75 73 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69  ously uninitiali
1cc0: 7a 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  zed..** If the i
1cd0: 6e 70 75 74 20 73 74 72 69 6e 67 20 63 6f 6e 74  nput string cont
1ce0: 61 69 6e 73 20 6d 75 6c 74 69 70 6c 65 20 53 51  ains multiple SQ
1cf0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 6f 6e  L statements, on
1d00: 6c 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  ly the first.** 
1d10: 6f 6e 65 20 69 73 20 70 72 6f 63 65 73 73 65 64  one is processed
1d20: 2e 20 20 41 6c 6c 20 73 74 61 74 65 6d 65 6e 74  .  All statement
1d30: 73 20 62 65 79 6f 6e 64 20 74 68 65 20 66 69 72  s beyond the fir
1d40: 73 74 20 61 72 65 20 73 69 6c 65 6e 74 6c 79 20  st are silently 
1d50: 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20  ignored..*/.int 
1d60: 64 62 5f 76 70 72 65 70 61 72 65 28 53 74 6d 74  db_vprepare(Stmt
1d70: 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 66 6c 61   *pStmt, int fla
1d80: 67 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gs, const char *
1d90: 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74  zFormat, va_list
1da0: 20 61 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   ap){.  int rc;.
1db0: 20 20 69 6e 74 20 70 72 65 70 46 6c 61 67 73 20    int prepFlags 
1dc0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  = 0;.  char *zSq
1dd0: 6c 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26  l;.  blob_zero(&
1de0: 70 53 74 6d 74 2d 3e 73 71 6c 29 3b 0a 20 20 62  pStmt->sql);.  b
1df0: 6c 6f 62 5f 76 61 70 70 65 6e 64 66 28 26 70 53  lob_vappendf(&pS
1e00: 74 6d 74 2d 3e 73 71 6c 2c 20 7a 46 6f 72 6d 61  tmt->sql, zForma
1e10: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
1e20: 28 61 70 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 62  (ap);.  zSql = b
1e30: 6c 6f 62 5f 73 74 72 28 26 70 53 74 6d 74 2d 3e  lob_str(&pStmt->
1e40: 73 71 6c 29 3b 0a 20 20 64 62 2e 6e 50 72 65 70  sql);.  db.nPrep
1e50: 61 72 65 2b 2b 3b 0a 20 20 69 66 28 20 66 6c 61  are++;.  if( fla
1e60: 67 73 20 26 20 44 42 5f 50 52 45 50 41 52 45 5f  gs & DB_PREPARE_
1e70: 50 45 52 53 49 53 54 45 4e 54 20 29 7b 0a 20 20  PERSISTENT ){.  
1e80: 20 20 70 72 65 70 46 6c 61 67 73 20 3d 20 53 51    prepFlags = SQ
1e90: 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 50 45 52  LITE_PREPARE_PER
1ea0: 53 49 53 54 45 4e 54 3b 0a 20 20 7d 0a 20 20 72  SISTENT;.  }.  r
1eb0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1ec0: 61 72 65 5f 76 33 28 67 2e 64 62 2c 20 7a 53 71  are_v3(g.db, zSq
1ed0: 6c 2c 20 2d 31 2c 20 70 72 65 70 46 6c 61 67 73  l, -1, prepFlags
1ee0: 2c 20 26 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c  , &pStmt->pStmt,
1ef0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30   0);.  if( rc!=0
1f00: 20 26 26 20 28 66 6c 61 67 73 20 26 20 44 42 5f   && (flags & DB_
1f10: 50 52 45 50 41 52 45 5f 49 47 4e 4f 52 45 5f 45  PREPARE_IGNORE_E
1f20: 52 52 4f 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  RROR)!=0 ){.    
1f30: 64 62 5f 65 72 72 28 22 25 73 5c 6e 25 73 22 2c  db_err("%s\n%s",
1f40: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1f50: 67 2e 64 62 29 2c 20 7a 53 71 6c 29 3b 0a 20 20  g.db), zSql);.  
1f60: 7d 0a 20 20 70 53 74 6d 74 2d 3e 70 4e 65 78 74  }.  pStmt->pNext
1f70: 20 3d 20 70 53 74 6d 74 2d 3e 70 50 72 65 76 20   = pStmt->pPrev 
1f80: 3d 20 30 3b 0a 20 20 70 53 74 6d 74 2d 3e 6e 53  = 0;.  pStmt->nS
1f90: 74 65 70 20 3d 20 30 3b 0a 20 20 70 53 74 6d 74  tep = 0;.  pStmt
1fa0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 72 65 74  ->rc = rc;.  ret
1fb0: 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 64 62  urn rc;.}.int db
1fc0: 5f 70 72 65 70 61 72 65 28 53 74 6d 74 20 2a 70  _prepare(Stmt *p
1fd0: 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  Stmt, const char
1fe0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
1ff0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f  .  int rc;.  va_
2000: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
2010: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2020: 3b 0a 20 20 72 63 20 3d 20 64 62 5f 76 70 72 65  ;.  rc = db_vpre
2030: 70 61 72 65 28 70 53 74 6d 74 2c 20 30 2c 20 7a  pare(pStmt, 0, z
2040: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2050: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
2060: 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 64 62  urn rc;.}.int db
2070: 5f 70 72 65 70 61 72 65 5f 69 67 6e 6f 72 65 5f  _prepare_ignore_
2080: 65 72 72 6f 72 28 53 74 6d 74 20 2a 70 53 74 6d  error(Stmt *pStm
2090: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
20a0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
20b0: 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 6c 69 73  int rc;.  va_lis
20c0: 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
20d0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
20e0: 20 72 63 20 3d 20 64 62 5f 76 70 72 65 70 61 72   rc = db_vprepar
20f0: 65 28 70 53 74 6d 74 2c 20 44 42 5f 50 52 45 50  e(pStmt, DB_PREP
2100: 41 52 45 5f 49 47 4e 4f 52 45 5f 45 52 52 4f 52  ARE_IGNORE_ERROR
2110: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
2120: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
2130: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
2140: 20 64 62 5f 73 74 61 74 69 63 5f 70 72 65 70 61   db_static_prepa
2150: 72 65 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20  re(Stmt *pStmt, 
2160: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
2170: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74  mat, ...){.  int
2180: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2190: 0a 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a 65  .  if( blob_size
21a0: 28 26 70 53 74 6d 74 2d 3e 73 71 6c 29 3d 3d 30  (&pStmt->sql)==0
21b0: 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20   ){.    va_list 
21c0: 61 70 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  ap;.    va_start
21d0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
21e0: 20 20 20 72 63 20 3d 20 64 62 5f 76 70 72 65 70     rc = db_vprep
21f0: 61 72 65 28 70 53 74 6d 74 2c 20 44 42 5f 50 52  are(pStmt, DB_PR
2200: 45 50 41 52 45 5f 50 45 52 53 49 53 54 45 4e 54  EPARE_PERSISTENT
2210: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
2220: 20 20 20 20 70 53 74 6d 74 2d 3e 70 4e 65 78 74      pStmt->pNext
2230: 20 3d 20 64 62 2e 70 41 6c 6c 53 74 6d 74 3b 0a   = db.pAllStmt;.
2240: 20 20 20 20 70 53 74 6d 74 2d 3e 70 50 72 65 76      pStmt->pPrev
2250: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 64 62   = 0;.    if( db
2260: 2e 70 41 6c 6c 53 74 6d 74 20 29 20 64 62 2e 70  .pAllStmt ) db.p
2270: 41 6c 6c 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d  AllStmt->pPrev =
2280: 20 70 53 74 6d 74 3b 0a 20 20 20 20 64 62 2e 70   pStmt;.    db.p
2290: 41 6c 6c 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b  AllStmt = pStmt;
22a0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
22b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
22c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22d0: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  n the index of a
22e0: 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72 0a   bind parameter.
22f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2300: 72 61 6d 49 64 78 28 53 74 6d 74 20 2a 70 53 74  ramIdx(Stmt *pSt
2310: 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  mt, const char *
2320: 7a 50 61 72 61 6d 4e 61 6d 65 29 7b 0a 20 20 69  zParamName){.  i
2330: 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33 5f 62  nt i = sqlite3_b
2340: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
2350: 64 65 78 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74  dex(pStmt->pStmt
2360: 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29 3b 0a 20  , zParamName);. 
2370: 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
2380: 20 64 62 5f 65 72 72 28 22 6e 6f 20 73 75 63 68   db_err("no such
2390: 20 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72 3a   bind parameter:
23a0: 20 25 73 5c 6e 53 51 4c 3a 20 25 62 22 2c 20 7a   %s\nSQL: %b", z
23b0: 50 61 72 61 6d 4e 61 6d 65 2c 20 26 70 53 74 6d  ParamName, &pStm
23c0: 74 2d 3e 73 71 6c 29 3b 0a 20 20 7d 0a 20 20 72  t->sql);.  }.  r
23d0: 65 74 75 72 6e 20 69 3b 0a 7d 0a 2f 2a 0a 2a 2a  eturn i;.}./*.**
23e0: 20 42 69 6e 64 20 61 6e 20 69 6e 74 65 67 65 72   Bind an integer
23f0: 2c 20 73 74 72 69 6e 67 2c 20 6f 72 20 42 6c 6f  , string, or Blo
2400: 62 20 76 61 6c 75 65 20 74 6f 20 61 20 6e 61 6d  b value to a nam
2410: 65 64 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  ed parameter..*/
2420: 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 69 6e 74  .int db_bind_int
2430: 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f  (Stmt *pStmt, co
2440: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
2450: 4e 61 6d 65 2c 20 69 6e 74 20 69 56 61 6c 75 65  Name, int iValue
2460: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
2470: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74  te3_bind_int(pSt
2480: 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d  mt->pStmt, param
2490: 49 64 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61  Idx(pStmt, zPara
24a0: 6d 4e 61 6d 65 29 2c 20 69 56 61 6c 75 65 29 3b  mName), iValue);
24b0: 0a 7d 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 69  .}.int db_bind_i
24c0: 6e 74 36 34 28 53 74 6d 74 20 2a 70 53 74 6d 74  nt64(Stmt *pStmt
24d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
24e0: 61 72 61 6d 4e 61 6d 65 2c 20 69 36 34 20 69 56  aramName, i64 iV
24f0: 61 6c 75 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  alue){.  return 
2500: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
2510: 36 34 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c  64(pStmt->pStmt,
2520: 20 70 61 72 61 6d 49 64 78 28 70 53 74 6d 74 2c   paramIdx(pStmt,
2530: 20 7a 50 61 72 61 6d 4e 61 6d 65 29 2c 20 69 56   zParamName), iV
2540: 61 6c 75 65 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f  alue);.}.int db_
2550: 62 69 6e 64 5f 64 6f 75 62 6c 65 28 53 74 6d 74  bind_double(Stmt
2560: 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63   *pStmt, const c
2570: 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c  har *zParamName,
2580: 20 64 6f 75 62 6c 65 20 72 56 61 6c 75 65 29 7b   double rValue){
2590: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
25a0: 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53  3_bind_double(pS
25b0: 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61  tmt->pStmt, para
25c0: 6d 49 64 78 28 70 53 74 6d 74 2c 20 7a 50 61 72  mIdx(pStmt, zPar
25d0: 61 6d 4e 61 6d 65 29 2c 20 72 56 61 6c 75 65 29  amName), rValue)
25e0: 3b 0a 7d 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f  ;.}.int db_bind_
25f0: 74 65 78 74 28 53 74 6d 74 20 2a 70 53 74 6d 74  text(Stmt *pStmt
2600: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
2610: 61 72 61 6d 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  aramName, const 
2620: 63 68 61 72 20 2a 7a 56 61 6c 75 65 29 7b 0a 20  char *zValue){. 
2630: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
2640: 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2d  bind_text(pStmt-
2650: 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d 49 64 78  >pStmt, paramIdx
2660: 28 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61  (pStmt, zParamNa
2670: 6d 65 29 2c 20 7a 56 61 6c 75 65 2c 0a 20 20 20  me), zValue,.   
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49          -1, SQLI
26a0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 69 6e  TE_STATIC);.}.in
26b0: 74 20 64 62 5f 62 69 6e 64 5f 74 65 78 74 31 36  t db_bind_text16
26c0: 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f  (Stmt *pStmt, co
26d0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
26e0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
26f0: 20 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 72 65 74   *zValue){.  ret
2700: 75 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  urn sqlite3_bind
2710: 5f 74 65 78 74 31 36 28 70 53 74 6d 74 2d 3e 70  _text16(pStmt->p
2720: 53 74 6d 74 2c 20 70 61 72 61 6d 49 64 78 28 70  Stmt, paramIdx(p
2730: 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65  Stmt, zParamName
2740: 29 2c 20 7a 56 61 6c 75 65 2c 0a 20 20 20 20 20  ), zValue,.     
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49          -1, SQLI
2770: 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 69 6e  TE_STATIC);.}.in
2780: 74 20 64 62 5f 62 69 6e 64 5f 6e 75 6c 6c 28 53  t db_bind_null(S
2790: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73  tmt *pStmt, cons
27a0: 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61  t char *zParamNa
27b0: 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  me){.  return sq
27c0: 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
27d0: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61  pStmt->pStmt, pa
27e0: 72 61 6d 49 64 78 28 70 53 74 6d 74 2c 20 7a 50  ramIdx(pStmt, zP
27f0: 61 72 61 6d 4e 61 6d 65 29 29 3b 0a 7d 0a 69 6e  aramName));.}.in
2800: 74 20 64 62 5f 62 69 6e 64 5f 62 6c 6f 62 28 53  t db_bind_blob(S
2810: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73  tmt *pStmt, cons
2820: 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61  t char *zParamNa
2830: 6d 65 2c 20 42 6c 6f 62 20 2a 70 42 6c 6f 62 29  me, Blob *pBlob)
2840: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2850: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
2860: 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d  mt->pStmt, param
2870: 49 64 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61  Idx(pStmt, zPara
2880: 6d 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  mName),.        
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 42    blob_buffer(pB
28b0: 6c 6f 62 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28  lob), blob_size(
28c0: 70 42 6c 6f 62 29 2c 20 53 51 4c 49 54 45 5f 53  pBlob), SQLITE_S
28d0: 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 20 62 69  TATIC);.}../* bi
28e0: 6e 64 5f 73 74 72 28 29 20 74 72 65 61 74 73 20  nd_str() treats 
28f0: 61 20 42 6c 6f 62 20 6f 62 6a 65 63 74 20 6c 69  a Blob object li
2900: 6b 65 20 61 20 54 45 58 54 20 73 74 72 69 6e 67  ke a TEXT string
2910: 20 61 6e 64 20 62 69 6e 64 73 20 69 74 0a 2a 2a   and binds it.**
2920: 20 74 6f 20 74 68 65 20 53 51 4c 20 76 61 72 69   to the SQL vari
2930: 61 62 6c 65 2e 20 20 43 6f 6e 74 72 61 73 74 20  able.  Contrast 
2940: 74 68 69 73 20 74 6f 20 62 69 6e 64 5f 62 6c 6f  this to bind_blo
2950: 62 28 29 20 77 68 69 63 68 20 74 72 65 61 74 73  b() which treats
2960: 0a 2a 2a 20 74 68 65 20 42 6c 6f 62 20 6f 62 6a  .** the Blob obj
2970: 65 63 74 20 6c 69 6b 65 20 61 6e 20 53 51 4c 20  ect like an SQL 
2980: 42 4c 4f 42 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f  BLOB..*/.int db_
2990: 62 69 6e 64 5f 73 74 72 28 53 74 6d 74 20 2a 70  bind_str(Stmt *p
29a0: 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  Stmt, const char
29b0: 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c 20 42 6c   *zParamName, Bl
29c0: 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 72 65  ob *pBlob){.  re
29d0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e  turn sqlite3_bin
29e0: 64 5f 74 65 78 74 28 70 53 74 6d 74 2d 3e 70 53  d_text(pStmt->pS
29f0: 74 6d 74 2c 20 70 61 72 61 6d 49 64 78 28 70 53  tmt, paramIdx(pS
2a00: 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29  tmt, zParamName)
2a10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62              blob
2a30: 5f 62 75 66 66 65 72 28 70 42 6c 6f 62 29 2c 20  _buffer(pBlob), 
2a40: 62 6c 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62 29  blob_size(pBlob)
2a50: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
2a60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  ;.}../*.** Step 
2a70: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
2a80: 74 2e 20 20 52 65 74 75 72 6e 20 65 69 74 68 65  t.  Return eithe
2a90: 72 20 53 51 4c 49 54 45 5f 52 4f 57 20 6f 72 20  r SQLITE_ROW or 
2aa0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  an error code.**
2ab0: 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66   or SQLITE_OK if
2ac0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 66   the statement f
2ad0: 69 6e 69 73 68 65 73 20 73 75 63 63 65 73 73 66  inishes successf
2ae0: 75 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f  ully..*/.int db_
2af0: 73 74 65 70 28 53 74 6d 74 20 2a 70 53 74 6d 74  step(Stmt *pStmt
2b00: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
2b10: 66 28 20 70 53 74 6d 74 2d 3e 70 53 74 6d 74 3d  f( pStmt->pStmt=
2b20: 3d 30 20 29 20 72 65 74 75 72 6e 20 70 53 74 6d  =0 ) return pStm
2b30: 74 2d 3e 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  t->rc;.  rc = sq
2b40: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
2b50: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 53 74 6d  ->pStmt);.  pStm
2b60: 74 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 72 65  t->nStep++;.  re
2b70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2b80: 2a 20 50 72 69 6e 74 20 77 61 72 6e 69 6e 67 73  * Print warnings
2b90: 20 69 66 20 61 20 71 75 65 72 79 20 69 73 20 69   if a query is i
2ba0: 6e 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2f 0a 73  nefficient..*/.s
2bb0: 74 61 74 69 63 20 76 6f 69 64 20 64 62 5f 73 74  tatic void db_st
2bc0: 61 74 73 28 53 74 6d 74 20 2a 70 53 74 6d 74 29  ats(Stmt *pStmt)
2bd0: 7b 0a 23 69 66 64 65 66 20 46 4f 53 53 49 4c 5f  {.#ifdef FOSSIL_
2be0: 44 45 42 55 47 0a 20 20 69 6e 74 20 63 31 2c 20  DEBUG.  int c1, 
2bf0: 63 32 2c 20 63 33 3b 0a 20 20 63 6f 6e 73 74 20  c2, c3;.  const 
2c00: 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
2c10: 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 2d 3e  ite3_sql(pStmt->
2c20: 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 7a 53  pStmt);.  if( zS
2c30: 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ql==0 ) return;.
2c40: 20 20 63 31 20 3d 20 73 71 6c 69 74 65 33 5f 73    c1 = sqlite3_s
2c50: 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74  tmt_status(pStmt
2c60: 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
2c70: 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
2c80: 43 41 4e 5f 53 54 45 50 2c 20 31 29 3b 0a 20 20  CAN_STEP, 1);.  
2c90: 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  c2 = sqlite3_stm
2ca0: 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2d 3e  t_status(pStmt->
2cb0: 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
2cc0: 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
2cd0: 45 58 2c 20 31 29 3b 0a 20 20 63 33 20 3d 20 73  EX, 1);.  c3 = s
2ce0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
2cf0: 75 73 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c  us(pStmt->pStmt,
2d00: 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
2d10: 55 53 5f 53 4f 52 54 2c 20 31 29 3b 0a 20 20 69  US_SORT, 1);.  i
2d20: 66 28 20 63 31 3e 70 53 74 6d 74 2d 3e 6e 53 74  f( c1>pStmt->nSt
2d30: 65 70 2a 34 20 26 26 20 73 74 72 73 74 72 28 7a  ep*4 && strstr(z
2d40: 53 71 6c 2c 22 2f 2a 73 63 61 6e 2a 2f 22 29 3d  Sql,"/*scan*/")=
2d50: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c  =0 ){.    fossil
2d60: 5f 77 61 72 6e 69 6e 67 28 22 25 64 20 73 63 61  _warning("%d sca
2d70: 6e 20 73 74 65 70 73 20 66 6f 72 20 25 64 20 72  n steps for %d r
2d80: 6f 77 73 20 69 6e 20 5b 25 73 5d 22 2c 20 63 31  ows in [%s]", c1
2d90: 2c 20 70 53 74 6d 74 2d 3e 6e 53 74 65 70 2c 20  , pStmt->nStep, 
2da0: 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 20 69  zSql);.  }else i
2db0: 66 28 20 63 32 20 29 7b 0a 20 20 20 20 66 6f 73  f( c2 ){.    fos
2dc0: 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22 25 64 20  sil_warning("%d 
2dd0: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
2de0: 72 6f 77 73 20 69 6e 20 5b 25 73 5d 22 2c 20 63  rows in [%s]", c
2df0: 32 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73  2, zSql);.  }els
2e00: 65 20 69 66 28 20 63 33 20 26 26 20 73 74 72 73  e if( c3 && strs
2e10: 74 72 28 7a 53 71 6c 2c 22 2f 2a 73 6f 72 74 2a  tr(zSql,"/*sort*
2e20: 2f 22 29 3d 3d 30 20 26 26 20 73 74 72 73 74 72  /")==0 && strstr
2e30: 28 7a 53 71 6c 2c 22 2f 2a 73 63 61 6e 2a 2f 22  (zSql,"/*scan*/"
2e40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73  )==0 ){.    foss
2e50: 69 6c 5f 77 61 72 6e 69 6e 67 28 22 73 6f 72 74  il_warning("sort
2e60: 20 77 2f 6f 20 69 6e 64 65 78 20 69 6e 20 5b 25   w/o index in [%
2e70: 73 5d 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a  s]", zSql);.  }.
2e80: 20 20 70 53 74 6d 74 2d 3e 6e 53 74 65 70 20 3d    pStmt->nStep =
2e90: 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
2ea0: 0a 2a 2a 20 52 65 73 65 74 20 6f 72 20 66 69 6e  .** Reset or fin
2eb0: 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e  alize a statemen
2ec0: 74 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 72 65 73  t..*/.int db_res
2ed0: 65 74 28 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b  et(Stmt *pStmt){
2ee0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 62 5f  .  int rc;.  db_
2ef0: 73 74 61 74 73 28 70 53 74 6d 74 29 3b 0a 20 20  stats(pStmt);.  
2f00: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
2f10: 65 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29  et(pStmt->pStmt)
2f20: 3b 0a 20 20 64 62 5f 63 68 65 63 6b 5f 72 65 73  ;.  db_check_res
2f30: 75 6c 74 28 72 63 29 3b 0a 20 20 72 65 74 75 72  ult(rc);.  retur
2f40: 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 64 62 5f 66  n rc;.}.int db_f
2f50: 69 6e 61 6c 69 7a 65 28 53 74 6d 74 20 2a 70 53  inalize(Stmt *pS
2f60: 74 6d 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  tmt){.  int rc;.
2f70: 20 20 64 62 5f 73 74 61 74 73 28 70 53 74 6d 74    db_stats(pStmt
2f80: 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28  );.  blob_reset(
2f90: 26 70 53 74 6d 74 2d 3e 73 71 6c 29 3b 0a 20 20  &pStmt->sql);.  
2fa0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
2fb0: 61 6c 69 7a 65 28 70 53 74 6d 74 2d 3e 70 53 74  alize(pStmt->pSt
2fc0: 6d 74 29 3b 0a 20 20 64 62 5f 63 68 65 63 6b 5f  mt);.  db_check_
2fd0: 72 65 73 75 6c 74 28 72 63 29 3b 0a 20 20 70 53  result(rc);.  pS
2fe0: 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt->pStmt = 0;.
2ff0: 20 20 69 66 28 20 70 53 74 6d 74 2d 3e 70 4e 65    if( pStmt->pNe
3000: 78 74 20 29 7b 0a 20 20 20 20 70 53 74 6d 74 2d  xt ){.    pStmt-
3010: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
3020: 70 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20  pStmt->pPrev;.  
3030: 7d 0a 20 20 69 66 28 20 70 53 74 6d 74 2d 3e 70  }.  if( pStmt->p
3040: 50 72 65 76 20 29 7b 0a 20 20 20 20 70 53 74 6d  Prev ){.    pStm
3050: 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  t->pPrev->pNext 
3060: 3d 20 70 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a  = pStmt->pNext;.
3070: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2e 70    }else if( db.p
3080: 41 6c 6c 53 74 6d 74 3d 3d 70 53 74 6d 74 20 29  AllStmt==pStmt )
3090: 7b 0a 20 20 20 20 64 62 2e 70 41 6c 6c 53 74 6d  {.    db.pAllStm
30a0: 74 20 3d 20 70 53 74 6d 74 2d 3e 70 4e 65 78 74  t = pStmt->pNext
30b0: 3b 0a 20 20 7d 0a 20 20 70 53 74 6d 74 2d 3e 70  ;.  }.  pStmt->p
30c0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 53 74 6d  Next = 0;.  pStm
30d0: 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  t->pPrev = 0;.  
30e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
3100: 6f 77 69 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  owid of the most
3110: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
3120: 2f 0a 69 6e 74 20 64 62 5f 6c 61 73 74 5f 69 6e  /.int db_last_in
3130: 73 65 72 74 5f 72 6f 77 69 64 28 76 6f 69 64 29  sert_rowid(void)
3140: 7b 0a 20 20 69 36 34 20 78 20 3d 20 73 71 6c 69  {.  i64 x = sqli
3150: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
3160: 72 6f 77 69 64 28 67 2e 64 62 29 3b 0a 20 20 69  rowid(g.db);.  i
3170: 66 28 20 78 3c 30 20 7c 7c 20 78 3e 28 69 36 34  f( x<0 || x>(i64
3180: 29 32 31 34 37 34 38 33 36 34 37 20 29 7b 0a 20  )2147483647 ){. 
3190: 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28     fossil_fatal(
31a0: 22 72 6f 77 69 64 20 6f 75 74 20 6f 66 20 72 61  "rowid out of ra
31b0: 6e 67 65 20 28 30 2e 2e 32 31 34 37 34 38 33 36  nge (0..21474836
31c0: 34 37 29 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74  47)");.  }.  ret
31d0: 75 72 6e 20 28 69 6e 74 29 78 3b 0a 7d 0a 0a 2f  urn (int)x;.}../
31e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
31f0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
3200: 68 61 74 20 77 65 72 65 20 63 68 61 6e 67 65 64  hat were changed
3210: 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
3220: 65 6e 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  ent.** INSERT, U
3230: 50 44 41 54 45 2c 20 6f 72 20 44 45 4c 45 54 45  PDATE, or DELETE
3240: 2e 20 20 41 75 78 69 6c 69 61 72 79 20 63 68 61  .  Auxiliary cha
3250: 6e 67 65 73 20 63 61 75 73 65 64 20 62 79 20 74  nges caused by t
3260: 72 69 67 67 65 72 73 0a 2a 2a 20 6f 72 20 6f 74  riggers.** or ot
3270: 68 65 72 20 73 69 64 65 20 65 66 66 65 63 74 73  her side effects
3280: 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64   are not counted
3290: 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 63 68 61 6e  ..*/.int db_chan
32a0: 67 65 73 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ges(void){.  ret
32b0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  urn sqlite3_chan
32c0: 67 65 73 28 67 2e 64 62 29 3b 0a 7d 0a 0a 2f 2a  ges(g.db);.}../*
32d0: 0a 2a 2a 20 45 78 74 72 61 63 74 20 74 65 78 74  .** Extract text
32e0: 2c 20 69 6e 74 65 67 65 72 2c 20 6f 72 20 62 6c  , integer, or bl
32f0: 6f 62 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74  ob values from t
3300: 68 65 20 4e 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he N-th column o
3310: 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  f the.** current
3320: 20 72 6f 77 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f   row..*/.int db_
3330: 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 53 74 6d 74  column_type(Stmt
3340: 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b   *pStmt, int N){
3350: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
3360: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
3370: 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a  tmt->pStmt, N);.
3380: 7d 0a 69 6e 74 20 64 62 5f 63 6f 6c 75 6d 6e 5f  }.int db_column_
3390: 62 79 74 65 73 28 53 74 6d 74 20 2a 70 53 74 6d  bytes(Stmt *pStm
33a0: 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 74  t, int N){.  ret
33b0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  urn sqlite3_colu
33c0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2d 3e  mn_bytes(pStmt->
33d0: 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 69 6e 74  pStmt, N);.}.int
33e0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 53   db_column_int(S
33f0: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20  tmt *pStmt, int 
3400: 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  N){.  return sql
3410: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
3420: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29  pStmt->pStmt, N)
3430: 3b 0a 7d 0a 69 36 34 20 64 62 5f 63 6f 6c 75 6d  ;.}.i64 db_colum
3440: 6e 5f 69 6e 74 36 34 28 53 74 6d 74 20 2a 70 53  n_int64(Stmt *pS
3450: 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72  tmt, int N){.  r
3460: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 6f  eturn sqlite3_co
3470: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
3480: 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 64  ->pStmt, N);.}.d
3490: 6f 75 62 6c 65 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ouble db_column_
34a0: 64 6f 75 62 6c 65 28 53 74 6d 74 20 2a 70 53 74  double(Stmt *pSt
34b0: 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65  mt, int N){.  re
34c0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6c  turn sqlite3_col
34d0: 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  umn_double(pStmt
34e0: 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 63  ->pStmt, N);.}.c
34f0: 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 5f 63 6f  onst char *db_co
3500: 6c 75 6d 6e 5f 74 65 78 74 28 53 74 6d 74 20 2a  lumn_text(Stmt *
3510: 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20  pStmt, int N){. 
3520: 20 72 65 74 75 72 6e 20 28 63 68 61 72 2a 29 73   return (char*)s
3530: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
3540: 78 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c  xt(pStmt->pStmt,
3550: 20 4e 29 3b 0a 7d 0a 63 6f 6e 73 74 20 63 68 61   N);.}.const cha
3560: 72 20 2a 64 62 5f 63 6f 6c 75 6d 6e 5f 72 61 77  r *db_column_raw
3570: 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e  (Stmt *pStmt, in
3580: 74 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  t N){.  return (
3590: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
35a0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
35b0: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29  pStmt->pStmt, N)
35c0: 3b 0a 7d 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.}.const char *
35d0: 64 62 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 53  db_column_name(S
35e0: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20  tmt *pStmt, int 
35f0: 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 63 68  N){.  return (ch
3600: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
3610: 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2d 3e 70  mn_name(pStmt->p
3620: 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 69 6e 74 20  Stmt, N);.}.int 
3630: 64 62 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  db_column_count(
3640: 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20  Stmt *pStmt){.  
3650: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
3660: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
3670: 74 2d 3e 70 53 74 6d 74 29 3b 0a 7d 0a 63 68 61  t->pStmt);.}.cha
3680: 72 20 2a 64 62 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c  r *db_column_mal
3690: 6c 6f 63 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c  loc(Stmt *pStmt,
36a0: 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 74 75 72   int N){.  retur
36b0: 6e 20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  n mprintf("%s", 
36c0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  db_column_text(p
36d0: 53 74 6d 74 2c 20 4e 29 29 3b 0a 7d 0a 76 6f 69  Stmt, N));.}.voi
36e0: 64 20 64 62 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  d db_column_blob
36f0: 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e  (Stmt *pStmt, in
3700: 74 20 4e 2c 20 42 6c 6f 62 20 2a 70 42 6c 6f 62  t N, Blob *pBlob
3710: 29 7b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  ){.  blob_append
3720: 28 70 42 6c 6f 62 2c 20 73 71 6c 69 74 65 33 5f  (pBlob, sqlite3_
3730: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
3740: 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 2c 0a 20 20  t->pStmt, N),.  
3750: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
3760: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
3770: 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e  (pStmt->pStmt, N
3780: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ));.}../*.** Ini
3790: 74 69 61 6c 69 7a 65 20 61 20 62 6c 6f 62 20 74  tialize a blob t
37a0: 6f 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 63  o an ephemeral c
37b0: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  opy of the conte
37c0: 6e 74 20 6f 66 20 61 0a 2a 2a 20 63 6f 6c 75 6d  nt of a.** colum
37d0: 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
37e0: 20 72 6f 77 2e 20 20 54 68 65 20 64 61 74 61 20   row.  The data 
37f0: 69 6e 20 74 68 65 20 62 6c 6f 62 20 77 69 6c 6c  in the blob will
3800: 20 62 65 63 6f 6d 65 0a 2a 2a 20 69 6e 76 61 6c   become.** inval
3810: 69 64 20 77 68 65 6e 20 74 68 65 20 73 74 61 74  id when the stat
3820: 65 6d 65 6e 74 20 69 73 20 73 74 65 70 70 65 64  ement is stepped
3830: 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f   or reset..*/.vo
3840: 69 64 20 64 62 5f 65 70 68 65 6d 65 72 61 6c 5f  id db_ephemeral_
3850: 62 6c 6f 62 28 53 74 6d 74 20 2a 70 53 74 6d 74  blob(Stmt *pStmt
3860: 2c 20 69 6e 74 20 4e 2c 20 42 6c 6f 62 20 2a 70  , int N, Blob *p
3870: 42 6c 6f 62 29 7b 0a 20 20 62 6c 6f 62 5f 69 6e  Blob){.  blob_in
3880: 69 74 28 70 42 6c 6f 62 2c 20 73 71 6c 69 74 65  it(pBlob, sqlite
3890: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53  3_column_blob(pS
38a0: 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 2c 0a  tmt->pStmt, N),.
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
38c0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
38d0: 65 73 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c  es(pStmt->pStmt,
38e0: 20 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   N));.}../*.** C
38f0: 68 65 63 6b 20 61 20 72 65 73 75 6c 74 20 63 6f  heck a result co
3900: 64 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  de.  If it is no
3910: 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 70 72 69  t SQLITE_OK, pri
3920: 6e 74 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  nt the.** corres
3930: 70 6f 6e 64 69 6e 67 20 65 72 72 6f 72 20 6d 65  ponding error me
3940: 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e 0a  ssage and exit..
3950: 2a 2f 0a 76 6f 69 64 20 64 62 5f 63 68 65 63 6b  */.void db_check
3960: 5f 72 65 73 75 6c 74 28 69 6e 74 20 72 63 29 7b  _result(int rc){
3970: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
3980: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 5f 65  E_OK ){.    db_e
3990: 72 72 28 22 53 51 4c 20 65 72 72 6f 72 3a 20 25  rr("SQL error: %
39a0: 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
39b0: 73 67 28 67 2e 64 62 29 29 3b 0a 20 20 7d 0a 7d  sg(g.db));.  }.}
39c0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
39d0: 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65  a single prepare
39e0: 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 74 69  d statement unti
39f0: 6c 20 69 74 20 66 69 6e 69 73 68 65 73 2e 0a 2a  l it finishes..*
3a00: 2f 0a 69 6e 74 20 64 62 5f 65 78 65 63 28 53 74  /.int db_exec(St
3a10: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69 6e  mt *pStmt){.  in
3a20: 74 20 72 63 3b 0a 20 20 77 68 69 6c 65 28 20 28  t rc;.  while( (
3a30: 72 63 20 3d 20 64 62 5f 73 74 65 70 28 70 53 74  rc = db_step(pSt
3a40: 6d 74 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  mt))==SQLITE_ROW
3a50: 20 29 7b 7d 0a 20 20 72 63 20 3d 20 64 62 5f 72   ){}.  rc = db_r
3a60: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 64  eset(pStmt);.  d
3a70: 62 5f 63 68 65 63 6b 5f 72 65 73 75 6c 74 28 72  b_check_result(r
3a80: 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  c);.  return rc;
3a90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  .}../*.** Print 
3aa0: 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 6f 6e  the output of on
3ab0: 65 20 6f 72 20 6d 6f 72 65 20 53 51 4c 20 71 75  e or more SQL qu
3ac0: 65 72 69 65 73 20 6f 6e 20 73 74 61 6e 64 61 72  eries on standar
3ad0: 64 20 6f 75 74 70 75 74 2e 0a 2a 2a 20 54 68 69  d output..** Thi
3ae0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3af0: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
3b00: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 0a 2a  purposes only..*
3b10: 2f 0a 69 6e 74 20 64 62 5f 64 65 62 75 67 28 63  /.int db_debug(c
3b20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
3b30: 20 2e 2e 2e 29 7b 0a 20 20 42 6c 6f 62 20 73 71   ...){.  Blob sq
3b40: 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  l;.  int rc = SQ
3b50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76 61 5f 6c 69  LITE_OK;.  va_li
3b60: 73 74 20 61 70 3b 0a 20 20 63 6f 6e 73 74 20 63  st ap;.  const c
3b70: 68 61 72 20 2a 7a 2c 20 2a 7a 45 6e 64 3b 0a 20  har *z, *zEnd;. 
3b80: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
3b90: 53 74 6d 74 3b 0a 20 20 62 6c 6f 62 5f 69 6e 69  Stmt;.  blob_ini
3ba0: 74 28 26 73 71 6c 2c 20 30 2c 20 30 29 3b 0a 20  t(&sql, 0, 0);. 
3bb0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53   va_start(ap, zS
3bc0: 71 6c 29 3b 0a 20 20 62 6c 6f 62 5f 76 61 70 70  ql);.  blob_vapp
3bd0: 65 6e 64 66 28 26 73 71 6c 2c 20 7a 53 71 6c 2c  endf(&sql, zSql,
3be0: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
3bf0: 70 29 3b 0a 20 20 7a 20 3d 20 62 6c 6f 62 5f 73  p);.  z = blob_s
3c00: 74 72 28 26 73 71 6c 29 3b 0a 20 20 77 68 69 6c  tr(&sql);.  whil
3c10: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
3c20: 20 26 26 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20   && z[0] ){.    
3c30: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 72  pStmt = 0;.    r
3c40: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
3c50: 61 72 65 5f 76 32 28 67 2e 64 62 2c 20 7a 2c 20  are_v2(g.db, z, 
3c60: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 45 6e  -1, &pStmt, &zEn
3c70: 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
3c80: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
3c90: 6b 3b 0a 20 20 20 20 69 66 28 20 70 53 74 6d 74  k;.    if( pStmt
3ca0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52   ){.      int nR
3cb0: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 62  ow = 0;.      db
3cc0: 2e 6e 50 72 65 70 61 72 65 2b 2b 3b 0a 20 20 20  .nPrepare++;.   
3cd0: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
3ce0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
3cf0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
3d00: 20 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20       int i, n;. 
3d10: 20 20 20 20 20 20 20 69 66 28 20 6e 52 6f 77 2b         if( nRow+
3d20: 2b 20 3e 20 30 20 29 20 66 6f 73 73 69 6c 5f 70  + > 0 ) fossil_p
3d30: 72 69 6e 74 28 22 5c 6e 22 29 3b 0a 20 20 20 20  rint("\n");.    
3d40: 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f      n = sqlite3_
3d50: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
3d60: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  mt);.        for
3d70: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
3d80: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 73 73 69  .          fossi
3d90: 6c 5f 70 72 69 6e 74 28 22 25 73 20 3d 20 25 73  l_print("%s = %s
3da0: 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  \n", sqlite3_col
3db0: 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20  umn_name(pStmt, 
3dc0: 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i),.            
3dd0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
3de0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
3df0: 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20  Stmt,i));.      
3e00: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3e10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
3e20: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
3e30: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 64        if( rc ) d
3e40: 62 5f 65 72 72 28 22 25 73 3a 20 7b 25 2e 2a 73  b_err("%s: {%.*s
3e50: 7d 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  }", sqlite3_errm
3e60: 73 67 28 67 2e 64 62 29 2c 20 28 69 6e 74 29 28  sg(g.db), (int)(
3e70: 7a 45 6e 64 2d 7a 29 2c 20 7a 29 3b 0a 20 20 20  zEnd-z), z);.   
3e80: 20 7d 0a 20 20 20 20 7a 20 3d 20 7a 45 6e 64 3b   }.    z = zEnd;
3e90: 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73 65  .  }.  blob_rese
3ea0: 74 28 26 73 71 6c 29 3b 0a 20 20 72 65 74 75 72  t(&sql);.  retur
3eb0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
3ec0: 78 65 63 75 74 65 20 6d 75 6c 74 69 70 6c 65 20  xecute multiple 
3ed0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  SQL statements..
3ee0: 2a 2f 0a 69 6e 74 20 64 62 5f 6d 75 6c 74 69 5f  */.int db_multi_
3ef0: 65 78 65 63 28 63 6f 6e 73 74 20 63 68 61 72 20  exec(const char 
3f00: 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 42  *zSql, ...){.  B
3f10: 6c 6f 62 20 73 71 6c 3b 0a 20 20 69 6e 74 20 72  lob sql;.  int r
3f20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
3f30: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
3f40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 2a 7a  onst char *z, *z
3f50: 45 6e 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  End;.  sqlite3_s
3f60: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 62 6c  tmt *pStmt;.  bl
3f70: 6f 62 5f 69 6e 69 74 28 26 73 71 6c 2c 20 30 2c  ob_init(&sql, 0,
3f80: 20 30 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   0);.  va_start(
3f90: 61 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 62 6c 6f  ap, zSql);.  blo
3fa0: 62 5f 76 61 70 70 65 6e 64 66 28 26 73 71 6c 2c  b_vappendf(&sql,
3fb0: 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20 76 61   zSql, ap);.  va
3fc0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7a 20 3d 20  _end(ap);.  z = 
3fd0: 62 6c 6f 62 5f 73 74 72 28 26 73 71 6c 29 3b 0a  blob_str(&sql);.
3fe0: 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
3ff0: 49 54 45 5f 4f 4b 20 26 26 20 7a 5b 30 5d 20 29  ITE_OK && z[0] )
4000: 7b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b  {.    pStmt = 0;
4010: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
4020: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67 2e 64  3_prepare_v2(g.d
4030: 62 2c 20 7a 2c 20 2d 31 2c 20 26 70 53 74 6d 74  b, z, -1, &pStmt
4040: 2c 20 26 7a 45 6e 64 29 3b 0a 20 20 20 20 69 66  , &zEnd);.    if
4050: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 64 62  ( rc ){.      db
4060: 5f 65 72 72 28 22 25 73 3a 20 7b 25 73 7d 22 2c  _err("%s: {%s}",
4070: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
4080: 67 2e 64 62 29 2c 20 7a 29 3b 0a 20 20 20 20 7d  g.db), z);.    }
4090: 65 6c 73 65 20 69 66 28 20 70 53 74 6d 74 20 29  else if( pStmt )
40a0: 7b 0a 20 20 20 20 20 20 64 62 2e 6e 50 72 65 70  {.      db.nPrep
40b0: 61 72 65 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69  are++;.      whi
40c0: 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
40d0: 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
40e0: 52 4f 57 20 29 7b 7d 0a 20 20 20 20 20 20 72 63  ROW ){}.      rc
40f0: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
4100: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
4110: 20 20 69 66 28 20 72 63 20 29 20 64 62 5f 65 72    if( rc ) db_er
4120: 72 28 22 25 73 3a 20 7b 25 2e 2a 73 7d 22 2c 20  r("%s: {%.*s}", 
4130: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 67  sqlite3_errmsg(g
4140: 2e 64 62 29 2c 20 28 69 6e 74 29 28 7a 45 6e 64  .db), (int)(zEnd
4150: 2d 7a 29 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20  -z), z);.    }. 
4160: 20 20 20 7a 20 3d 20 7a 45 6e 64 3b 0a 20 20 7d     z = zEnd;.  }
4170: 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 73  .  blob_reset(&s
4180: 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ql);.  return rc
4190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 74 69 6f  ;.}../*.** Optio
41a0: 6e 61 6c 6c 79 20 6d 61 6b 65 20 74 68 65 20 66  nally make the f
41b0: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73  ollowing changes
41c0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
41d0: 20 69 66 20 66 65 61 73 69 62 6c 65 20 61 6e 64   if feasible and
41e0: 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 74 2e 20  .** convenient. 
41f0: 20 44 6f 20 6e 6f 74 20 73 74 61 72 74 20 61 20   Do not start a 
4200: 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
4210: 74 68 65 73 65 20 63 68 61 6e 67 65 73 2c 20 62  these changes, b
4220: 75 74 20 6f 6e 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ut only.** make 
4230: 74 68 65 73 65 20 63 68 61 6e 67 65 73 20 69 66  these changes if
4240: 20 6f 74 68 65 72 20 63 68 61 6e 67 65 73 20 61   other changes a
4250: 72 65 20 61 6c 73 6f 20 62 65 69 6e 67 20 6d 61  re also being ma
4260: 64 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 6f  de..*/.void db_o
4270: 70 74 69 6f 6e 61 6c 5f 73 71 6c 28 63 6f 6e 73  ptional_sql(cons
4280: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 63 6f 6e  t char *zDb, con
4290: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2e  st char *zSql, .
42a0: 2e 2e 29 7b 0a 20 20 69 66 28 20 64 62 5f 69 73  ..){.  if( db_is
42b0: 5f 77 72 69 74 65 61 62 6c 65 28 7a 44 62 29 20  _writeable(zDb) 
42c0: 26 26 20 64 62 2e 6e 42 65 66 6f 72 65 43 6f 6d  && db.nBeforeCom
42d0: 6d 69 74 20 3c 20 63 6f 75 6e 74 28 64 62 2e 61  mit < count(db.a
42e0: 7a 42 65 66 6f 72 65 43 6f 6d 6d 69 74 29 20 29  zBeforeCommit) )
42f0: 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70  {.    va_list ap
4300: 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
4310: 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 64 62  p, zSql);.    db
4320: 2e 61 7a 42 65 66 6f 72 65 43 6f 6d 6d 69 74 5b  .azBeforeCommit[
4330: 64 62 2e 6e 42 65 66 6f 72 65 43 6f 6d 6d 69 74  db.nBeforeCommit
4340: 2b 2b 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d  ++] = sqlite3_vm
4350: 70 72 69 6e 74 66 28 7a 53 71 6c 2c 20 61 70 29  printf(zSql, ap)
4360: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
4370: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ;.  }.}../*.** E
4380: 78 65 63 75 74 65 20 61 20 71 75 65 72 79 20 61  xecute a query a
4390: 6e 64 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  nd return a sing
43a0: 6c 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  le integer value
43b0: 2e 0a 2a 2f 0a 69 36 34 20 64 62 5f 69 6e 74 36  ..*/.i64 db_int6
43c0: 34 28 69 36 34 20 69 44 66 6c 74 2c 20 63 6f 6e  4(i64 iDflt, con
43d0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2e  st char *zSql, .
43e0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
43f0: 70 3b 0a 20 20 53 74 6d 74 20 73 3b 0a 20 20 69  p;.  Stmt s;.  i
4400: 36 34 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72  64 rc;.  va_star
4410: 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 64  t(ap, zSql);.  d
4420: 62 5f 76 70 72 65 70 61 72 65 28 26 73 2c 20 30  b_vprepare(&s, 0
4430: 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20 76  , zSql, ap);.  v
4440: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
4450: 20 64 62 5f 73 74 65 70 28 26 73 29 21 3d 53 51   db_step(&s)!=SQ
4460: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
4470: 72 63 20 3d 20 69 44 66 6c 74 3b 0a 20 20 7d 65  rc = iDflt;.  }e
4480: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 64 62  lse{.    rc = db
4490: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 26 73  _column_int64(&s
44a0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66  , 0);.  }.  db_f
44b0: 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20 72  inalize(&s);.  r
44c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
44d0: 64 62 5f 69 6e 74 28 69 6e 74 20 69 44 66 6c 74  db_int(int iDflt
44e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
44f0: 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  ql, ...){.  va_l
4500: 69 73 74 20 61 70 3b 0a 20 20 53 74 6d 74 20 73  ist ap;.  Stmt s
4510: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61  ;.  int rc;.  va
4520: 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29  _start(ap, zSql)
4530: 3b 0a 20 20 64 62 5f 76 70 72 65 70 61 72 65 28  ;.  db_vprepare(
4540: 26 73 2c 20 30 2c 20 7a 53 71 6c 2c 20 61 70 29  &s, 0, zSql, ap)
4550: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
4560: 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 73    if( db_step(&s
4570: 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )!=SQLITE_ROW ){
4580: 0a 20 20 20 20 72 63 20 3d 20 69 44 66 6c 74 3b  .    rc = iDflt;
4590: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
45a0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
45b0: 28 26 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64  (&s, 0);.  }.  d
45c0: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a  b_finalize(&s);.
45d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
45e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
45f0: 45 20 69 66 20 74 68 65 20 71 75 65 72 79 20 77  E if the query w
4600: 6f 75 6c 64 20 72 65 74 75 72 6e 20 31 20 6f 72  ould return 1 or
4610: 20 6d 6f 72 65 20 72 6f 77 73 2e 20 20 52 65 74   more rows.  Ret
4620: 75 72 6e 0a 2a 2a 20 46 41 4c 53 45 20 69 66 20  urn.** FALSE if 
4630: 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
4640: 20 77 6f 75 6c 64 20 62 65 20 61 6e 20 65 6d 70   would be an emp
4650: 74 79 20 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 64  ty set..*/.int d
4660: 62 5f 65 78 69 73 74 73 28 63 6f 6e 73 74 20 63  b_exists(const c
4670: 68 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b  har *zSql, ...){
4680: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
4690: 20 53 74 6d 74 20 73 3b 0a 20 20 69 6e 74 20 72   Stmt s;.  int r
46a0: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  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 21 3d 53 51 4c 49 54 45  step(&s)!=SQLITE
4700: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 63 20 3d  _ROW ){.    rc =
4710: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
4720: 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 64   rc = 1;.  }.  d
4730: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a  b_finalize(&s);.
4740: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4750: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
4760: 20 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72   query and retur
4770: 6e 20 61 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69  n a floating-poi
4780: 6e 74 20 76 61 6c 75 65 2e 0a 2a 2f 0a 64 6f 75  nt value..*/.dou
4790: 62 6c 65 20 64 62 5f 64 6f 75 62 6c 65 28 64 6f  ble db_double(do
47a0: 75 62 6c 65 20 72 44 66 6c 74 2c 20 63 6f 6e 73  uble rDflt, cons
47b0: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e  t char *zSql, ..
47c0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
47d0: 3b 0a 20 20 53 74 6d 74 20 73 3b 0a 20 20 64 6f  ;.  Stmt s;.  do
47e0: 75 62 6c 65 20 72 3b 0a 20 20 76 61 5f 73 74 61  uble r;.  va_sta
47f0: 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a 20 20  rt(ap, zSql);.  
4800: 64 62 5f 76 70 72 65 70 61 72 65 28 26 73 2c 20  db_vprepare(&s, 
4810: 30 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20  0, zSql, ap);.  
4820: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
4830: 28 20 64 62 5f 73 74 65 70 28 26 73 29 21 3d 53  ( db_step(&s)!=S
4840: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
4850: 20 72 20 3d 20 72 44 66 6c 74 3b 0a 20 20 7d 65   r = rDflt;.  }e
4860: 6c 73 65 7b 0a 20 20 20 20 72 20 3d 20 64 62 5f  lse{.    r = db_
4870: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 26 73  column_double(&s
4880: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66  , 0);.  }.  db_f
4890: 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20 72  inalize(&s);.  r
48a0: 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn r;.}../*.*
48b0: 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72  * Execute a quer
48c0: 79 20 61 6e 64 20 61 70 70 65 6e 64 20 74 68 65  y and append the
48d0: 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
48e0: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a 2a   the first row.*
48f0: 2a 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  * of the result 
4900: 73 65 74 20 74 6f 20 62 6c 6f 62 20 67 69 76 65  set to blob give
4910: 6e 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 61  n in the first a
4920: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
4930: 20 64 62 5f 62 6c 6f 62 28 42 6c 6f 62 20 2a 70   db_blob(Blob *p
4940: 52 65 73 75 6c 74 2c 20 63 6f 6e 73 74 20 63 68  Result, const ch
4950: 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a  ar *zSql, ...){.
4960: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
4970: 53 74 6d 74 20 73 3b 0a 20 20 76 61 5f 73 74 61  Stmt s;.  va_sta
4980: 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a 20 20  rt(ap, zSql);.  
4990: 64 62 5f 76 70 72 65 70 61 72 65 28 26 73 2c 20  db_vprepare(&s, 
49a0: 30 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20  0, zSql, ap);.  
49b0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
49c0: 28 20 64 62 5f 73 74 65 70 28 26 73 29 3d 3d 53  ( db_step(&s)==S
49d0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
49e0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 52 65   blob_append(pRe
49f0: 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 6f  sult, sqlite3_co
4a00: 6c 75 6d 6e 5f 62 6c 6f 62 28 73 2e 70 53 74 6d  lumn_blob(s.pStm
4a10: 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20  t, 0),.         
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
4a40: 79 74 65 73 28 73 2e 70 53 74 6d 74 2c 20 30 29  ytes(s.pStmt, 0)
4a50: 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61  );.  }.  db_fina
4a60: 6c 69 7a 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a  lize(&s);.}../*.
4a70: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65  ** Execute a que
4a80: 72 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ry.  Return the 
4a90: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
4aa0: 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a 2a 2a  the first row.**
4ab0: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
4ac0: 65 74 20 61 73 20 61 20 73 74 72 69 6e 67 2e 20  et as a string. 
4ad0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
4ae0: 68 65 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20  he string is.** 
4af0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
4b00: 6c 6c 6f 63 28 29 2e 20 20 49 66 20 74 68 65 20  lloc().  If the 
4b10: 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 65 6d  result set is em
4b20: 70 74 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 7a  pty, return.** z
4b30: 44 65 66 61 75 6c 74 20 69 6e 73 74 65 61 64 2e  Default instead.
4b40: 0a 2a 2f 0a 63 68 61 72 20 2a 64 62 5f 74 65 78  .*/.char *db_tex
4b50: 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  t(const char *zD
4b60: 65 66 61 75 6c 74 2c 20 63 6f 6e 73 74 20 63 68  efault, const ch
4b70: 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a  ar *zSql, ...){.
4b80: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
4b90: 53 74 6d 74 20 73 3b 0a 20 20 63 68 61 72 20 2a  Stmt s;.  char *
4ba0: 7a 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  z;.  va_start(ap
4bb0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 64 62 5f 76 70  , zSql);.  db_vp
4bc0: 72 65 70 61 72 65 28 26 73 2c 20 30 2c 20 7a 53  repare(&s, 0, zS
4bd0: 71 6c 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  ql, ap);.  va_en
4be0: 64 28 61 70 29 3b 0a 20 20 69 66 28 20 64 62 5f  d(ap);.  if( db_
4bf0: 73 74 65 70 28 26 73 29 3d 3d 53 51 4c 49 54 45  step(&s)==SQLITE
4c00: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 20 3d 20  _ROW ){.    z = 
4c10: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
4c20: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
4c30: 74 28 73 2e 70 53 74 6d 74 2c 20 30 29 29 3b 0a  t(s.pStmt, 0));.
4c40: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 65 66    }else if( zDef
4c50: 61 75 6c 74 20 29 7b 0a 20 20 20 20 7a 20 3d 20  ault ){.    z = 
4c60: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 44  mprintf("%s", zD
4c70: 65 66 61 75 6c 74 29 3b 0a 20 20 7d 65 6c 73 65  efault);.  }else
4c80: 7b 0a 20 20 20 20 7a 20 3d 20 30 3b 0a 20 20 7d  {.    z = 0;.  }
4c90: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26  .  db_finalize(&
4ca0: 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  s);.  return z;.
4cb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
4cc0: 69 7a 65 20 61 20 6e 65 77 20 64 61 74 61 62 61  ize a new databa
4cd0: 73 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  se file with the
4ce0: 20 67 69 76 65 6e 20 73 63 68 65 6d 61 2e 20 20   given schema.  
4cf0: 49 66 20 61 6e 79 74 68 69 6e 67 0a 2a 2a 20 67  If anything.** g
4d00: 6f 65 73 20 77 72 6f 6e 67 2c 20 63 61 6c 6c 20  oes wrong, call 
4d10: 64 62 5f 65 72 72 28 29 20 74 6f 20 65 78 69 74  db_err() to exit
4d20: 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 69 6e 69  ..*/.void db_ini
4d30: 74 5f 64 61 74 61 62 61 73 65 28 0a 20 20 63 6f  t_database(.  co
4d40: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 4e  nst char *zFileN
4d50: 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
4d60: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
4d70: 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 63  to create */.  c
4d80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65  onst char *zSche
4d90: 6d 61 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  ma,     /* First
4da0: 20 70 61 72 74 20 6f 66 20 73 63 68 65 6d 61 20   part of schema 
4db0: 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20 20  */.  ...        
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4dd0: 20 41 64 64 69 74 69 6f 6e 61 6c 20 53 51 4c 20   Additional SQL 
4de0: 74 6f 20 72 75 6e 2e 20 20 54 65 72 6d 69 6e 61  to run.  Termina
4df0: 74 65 20 77 69 74 68 20 4e 55 4c 4c 2e 20 2a 2f  te with NULL. */
4e00: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
4e10: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  b;.  int rc;.  c
4e20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
4e30: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 0a  .  va_list ap;..
4e40: 20 20 64 62 20 3d 20 64 62 5f 6f 70 65 6e 28 7a    db = db_open(z
4e50: 46 69 6c 65 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  FileName);.  sql
4e60: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 42  ite3_exec(db, "B
4e70: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 2c  EGIN EXCLUSIVE",
4e80: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 72 63 20   0, 0, 0);.  rc 
4e90: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
4ea0: 62 2c 20 7a 53 63 68 65 6d 61 2c 20 30 2c 20 30  b, zSchema, 0, 0
4eb0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
4ec0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4ed0: 20 64 62 5f 65 72 72 28 22 25 73 22 2c 20 73 71   db_err("%s", sq
4ee0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
4ef0: 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 73 74 61 72  );.  }.  va_star
4f00: 74 28 61 70 2c 20 7a 53 63 68 65 6d 61 29 3b 0a  t(ap, zSchema);.
4f10: 20 20 77 68 69 6c 65 28 20 28 7a 53 71 6c 20 3d    while( (zSql =
4f20: 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
4f30: 74 20 63 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a  t char*))!=0 ){.
4f40: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4f50: 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
4f60: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
4f70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4f80: 29 7b 0a 20 20 20 20 20 20 64 62 5f 65 72 72 28  ){.      db_err(
4f90: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
4fa0: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d  rmsg(db));.    }
4fb0: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
4fc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  );.  sqlite3_exe
4fd0: 63 28 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  c(db, "COMMIT", 
4fe0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  0, 0, 0);.  sqli
4ff0: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 7d  te3_close(db);.}
5000: 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
5010: 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 6e   to return the n
5020: 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
5030: 20 73 69 6e 63 65 20 31 39 37 30 2e 20 20 54 68   since 1970.  Th
5040: 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 73 61 6d  is is.** the sam
5050: 65 20 61 73 20 73 74 72 66 74 69 6d 65 28 27 25  e as strftime('%
5060: 73 27 2c 27 6e 6f 77 27 29 20 62 75 74 20 69 73  s','now') but is
5070: 20 6d 6f 72 65 20 63 6f 6d 70 61 63 74 2e 0a 2a   more compact..*
5080: 2f 0a 76 6f 69 64 20 64 62 5f 6e 6f 77 5f 66 75  /.void db_now_fu
5090: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
50a0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
50b0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
50c0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
50d0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
50e0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
50f0: 28 63 6f 6e 74 65 78 74 2c 20 74 69 6d 65 28 30  (context, time(0
5100: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e  ));.}../*.** Fun
5110: 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20  ction to return 
5120: 74 68 65 20 63 68 65 63 6b 2d 69 6e 20 74 69 6d  the check-in tim
5130: 65 20 66 6f 72 20 61 20 66 69 6c 65 2e 0a 2a 2a  e for a file..**
5140: 0a 2a 2a 20 20 20 20 20 20 63 68 65 63 6b 69 6e  .**      checkin
5150: 5f 6d 74 69 6d 65 28 43 4b 49 4e 49 44 2c 52 49  _mtime(CKINID,RI
5160: 44 29 0a 2a 2a 0a 2a 2a 20 43 4b 49 4e 49 44 3a  D).**.** CKINID:
5170: 20 20 54 68 65 20 52 49 44 20 66 6f 72 20 74 68    The RID for th
5180: 65 20 6d 61 6e 69 66 65 73 74 20 66 6f 72 20 61  e manifest for a
5190: 20 63 68 65 63 6b 2d 69 6e 2e 0a 2a 2a 20 52 49   check-in..** RI
51a0: 44 3a 20 20 20 20 20 54 68 65 20 52 49 44 20 6f  D:     The RID o
51b0: 66 20 61 20 66 69 6c 65 20 69 6e 20 43 4b 49 4e  f a file in CKIN
51c0: 49 44 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ID for which the
51d0: 20 63 68 65 63 6b 2d 69 6e 20 74 69 6d 65 0a 2a   check-in time.*
51e0: 2a 20 20 20 20 20 20 20 20 20 20 69 73 20 64 65  *          is de
51f0: 73 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  sired..**.** Ret
5200: 75 72 6e 73 3a 20 54 68 65 20 63 68 65 63 6b 2d  urns: The check-
5210: 69 6e 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  in time in secon
5220: 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 0a 2a  ds since 1970..*
5230: 2f 0a 76 6f 69 64 20 64 62 5f 63 68 65 63 6b 69  /.void db_checki
5240: 6e 5f 6d 74 69 6d 65 5f 66 75 6e 63 74 69 6f 6e  n_mtime_function
5250: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
5260: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
5270: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
5280: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
5290: 0a 29 7b 0a 20 20 69 36 34 20 6d 74 69 6d 65 3b  .){.  i64 mtime;
52a0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 6d 74 69 6d  .  int rc = mtim
52b0: 65 5f 6f 66 5f 6d 61 6e 69 66 65 73 74 5f 66 69  e_of_manifest_fi
52c0: 6c 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  le(sqlite3_value
52d0: 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 2c 0a 20  _int(argv[0]),. 
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5300: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
5310: 6e 74 28 61 72 67 76 5b 31 5d 29 2c 20 26 6d 74  nt(argv[1]), &mt
5320: 69 6d 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ime);.  if( rc==
5330: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5340: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
5350: 6e 74 65 78 74 2c 20 6d 74 69 6d 65 29 3b 0a 20  ntext, mtime);. 
5360: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20   }.}../*.** SQL 
5370: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74  wrapper around t
5380: 68 65 20 73 79 6d 62 6f 6c 69 63 5f 6e 61 6d 65  he symbolic_name
5390: 5f 74 6f 5f 72 69 64 28 29 20 43 2d 6c 61 6e 67  _to_rid() C-lang
53a0: 75 61 67 65 20 41 50 49 2e 0a 2a 2a 20 45 78 61  uage API..** Exa
53b0: 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
53c0: 20 73 79 6d 62 6f 6c 69 63 5f 6e 61 6d 65 5f 74   symbolic_name_t
53d0: 6f 5f 72 69 64 28 27 74 72 75 6e 6b 27 29 3b 0a  o_rid('trunk');.
53e0: 2a 2a 20 20 20 20 20 73 79 6d 62 6f 6c 69 63 5f  **     symbolic_
53f0: 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 27 74 72 75  name_to_rid('tru
5400: 6e 6b 27 2c 27 77 27 29 3b 0a 2a 2a 0a 2a 2f 0a  nk','w');.**.*/.
5410: 76 6f 69 64 20 64 62 5f 73 79 6d 32 72 69 64 5f  void db_sym2rid_
5420: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
5430: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5440: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
5450: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
5460: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
5470: 6e 73 74 20 63 68 61 72 20 2a 61 72 67 3b 0a 20  nst char *arg;. 
5480: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 79 70   const char *typ
5490: 65 3b 0a 20 20 69 66 28 31 20 21 3d 20 61 72 67  e;.  if(1 != arg
54a0: 63 20 26 26 20 32 20 21 3d 20 61 72 67 63 29 7b  c && 2 != argc){
54b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
54c0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
54d0: 74 2c 20 22 45 78 70 65 63 74 69 6e 67 20 6f 6e  t, "Expecting on
54e0: 65 20 6f 72 20 74 77 6f 20 61 72 67 75 6d 65 6e  e or two argumen
54f0: 74 73 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  ts", -1);.    re
5500: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 72 67 20  turn;.  }.  arg 
5510: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
5520: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5530: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
5540: 28 21 61 72 67 29 7b 0a 20 20 20 20 73 71 6c 69  (!arg){.    sqli
5550: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
5560: 28 63 6f 6e 74 65 78 74 2c 20 22 45 78 70 65 63  (context, "Expec
5570: 74 69 6e 67 20 61 20 53 54 52 49 4e 47 20 61 72  ting a STRING ar
5580: 67 75 6d 65 6e 74 22 2c 20 2d 31 29 3b 0a 20 20  gument", -1);.  
5590: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
55a0: 69 64 3b 0a 20 20 20 20 74 79 70 65 20 3d 20 28  id;.    type = (
55b0: 32 3d 3d 61 72 67 63 29 20 3f 20 28 63 6f 6e 73  2==argc) ? (cons
55c0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
55d0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
55e0: 31 5d 29 20 3a 20 30 3b 0a 20 20 20 20 69 66 28  1]) : 0;.    if(
55f0: 21 74 79 70 65 29 20 74 79 70 65 20 3d 20 22 63  !type) type = "c
5600: 69 22 3b 0a 20 20 20 20 72 69 64 20 3d 20 73 79  i";.    rid = sy
5610: 6d 62 6f 6c 69 63 5f 6e 61 6d 65 5f 74 6f 5f 72  mbolic_name_to_r
5620: 69 64 28 20 61 72 67 2c 20 74 79 70 65 20 29 3b  id( arg, type );
5630: 0a 20 20 20 20 69 66 28 72 69 64 3c 30 29 7b 0a  .    if(rid<0){.
5640: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5650: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
5660: 78 74 2c 20 22 53 79 6d 62 6f 6c 69 63 20 6e 61  xt, "Symbolic na
5670: 6d 65 20 69 73 20 61 6d 62 69 67 75 6f 75 73 2e  me is ambiguous.
5680: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73  ", -1);.    }els
5690: 65 20 69 66 28 30 3d 3d 72 69 64 29 7b 0a 20 20  e if(0==rid){.  
56a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
56b0: 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29  lt_null(context)
56c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
56d0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
56e0: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
56f0: 20 72 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   rid);.    }.  }
5700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f  .}../*.** The to
5710: 4c 6f 63 61 6c 28 29 20 53 51 4c 20 66 75 6e 63  Local() SQL func
5720: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 73  tion returns a s
5730: 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 61 6e  tring that is an
5740: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 61 0a 2a   argument to a.*
5750: 2a 20 64 61 74 65 2f 74 69 6d 65 20 66 75 6e 63  * date/time func
5760: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70  tion that is app
5770: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 6d 6f 64  ropriate for mod
5780: 69 66 79 69 6e 67 20 74 68 65 20 74 69 6d 65 20  ifying the time 
5790: 66 6f 72 20 64 69 73 70 6c 61 79 2e 0a 2a 2a 20  for display..** 
57a0: 49 66 20 55 54 43 20 74 69 6d 65 20 64 69 73 70  If UTC time disp
57b0: 6c 61 79 20 69 73 20 73 65 6c 65 63 74 65 64 2c  lay is selected,
57c0: 20 6e 6f 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e   no modification
57d0: 20 6f 63 63 75 72 73 2e 20 20 49 66 20 6c 6f 63   occurs.  If loc
57e0: 61 6c 20 74 69 6d 65 0a 2a 2a 20 64 69 73 70 6c  al time.** displ
57f0: 61 79 20 69 73 20 73 65 6c 65 63 74 65 64 2c 20  ay is selected, 
5800: 74 68 65 20 74 69 6d 65 20 69 73 20 61 64 6a 75  the time is adju
5810: 73 74 65 64 20 61 70 70 72 6f 70 72 69 61 74 65  sted appropriate
5820: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  ly..**.** Exampl
5830: 65 20 75 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  e usage:.**.**  
5840: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 64 61         SELECT da
5850: 74 65 74 69 6d 65 28 27 6e 6f 77 27 2c 74 6f 4c  tetime('now',toL
5860: 6f 63 61 6c 28 29 29 3b 0a 2a 2f 0a 76 6f 69 64  ocal());.*/.void
5870: 20 64 62 5f 74 6f 6c 6f 63 61 6c 5f 66 75 6e 63   db_tolocal_func
5880: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  tion(.  sqlite3_
5890: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
58a0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
58b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
58c0: 61 72 67 76 0a 29 7b 0a 20 20 69 66 28 20 67 2e  argv.){.  if( g.
58d0: 66 54 69 6d 65 46 6f 72 6d 61 74 3d 3d 30 20 29  fTimeFormat==0 )
58e0: 7b 0a 20 20 20 20 69 66 28 20 64 62 5f 67 65 74  {.    if( db_get
58f0: 5f 69 6e 74 28 22 74 69 6d 65 6c 69 6e 65 2d 75  _int("timeline-u
5900: 74 63 22 2c 20 31 29 20 29 7b 0a 20 20 20 20 20  tc", 1) ){.     
5910: 20 67 2e 66 54 69 6d 65 46 6f 72 6d 61 74 20 3d   g.fTimeFormat =
5920: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
5930: 20 20 20 20 20 67 2e 66 54 69 6d 65 46 6f 72 6d       g.fTimeForm
5940: 61 74 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  at = 2;.    }.  
5950: 7d 0a 20 20 69 66 28 20 67 2e 66 54 69 6d 65 46  }.  if( g.fTimeF
5960: 6f 72 6d 61 74 3d 3d 31 20 29 7b 0a 20 20 20 20  ormat==1 ){.    
5970: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5980: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 22 30 20  ext(context, "0 
5990: 73 65 63 6f 6e 64 73 22 2c 20 2d 31 2c 20 53 51  seconds", -1, SQ
59a0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
59b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
59c0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
59d0: 6f 6e 74 65 78 74 2c 20 22 6c 6f 63 61 6c 74 69  ontext, "localti
59e0: 6d 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  me", -1, SQLITE_
59f0: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a  STATIC);.  }.}..
5a00: 2f 2a 0a 2a 2a 20 54 68 65 20 66 72 6f 6d 4c 6f  /*.** The fromLo
5a10: 63 61 6c 28 29 20 53 51 4c 20 66 75 6e 63 74 69  cal() SQL functi
5a20: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 73 74 72  on returns a str
5a30: 69 6e 67 20 74 68 61 74 20 69 73 20 61 6e 20 61  ing that is an a
5a40: 72 67 75 6d 65 6e 74 20 74 6f 20 61 0a 2a 2a 20  rgument to a.** 
5a50: 64 61 74 65 2f 74 69 6d 65 20 66 75 6e 63 74 69  date/time functi
5a60: 6f 6e 20 74 68 61 74 20 69 73 20 61 70 70 72 6f  on that is appro
5a70: 70 72 69 61 74 65 20 74 6f 20 63 6f 6e 76 65 72  priate to conver
5a80: 74 20 61 6e 20 69 6e 70 75 74 20 74 69 6d 65 20  t an input time 
5a90: 74 6f 20 55 54 43 2e 0a 2a 2a 20 49 66 20 55 54  to UTC..** If UT
5aa0: 43 20 74 69 6d 65 20 64 69 73 70 6c 61 79 20 69  C time display i
5ab0: 73 20 73 65 6c 65 63 74 65 64 2c 20 6e 6f 20 6d  s selected, no m
5ac0: 6f 64 69 66 69 63 61 74 69 6f 6e 20 6f 63 63 75  odification occu
5ad0: 72 73 2e 20 20 49 66 20 6c 6f 63 61 6c 20 74 69  rs.  If local ti
5ae0: 6d 65 0a 2a 2a 20 64 69 73 70 6c 61 79 20 69 73  me.** display is
5af0: 20 73 65 6c 65 63 74 65 64 2c 20 74 68 65 20 74   selected, the t
5b00: 69 6d 65 20 69 73 20 61 64 6a 75 73 74 65 64 20  ime is adjusted 
5b10: 66 72 6f 6d 20 6c 6f 63 61 6c 20 74 6f 20 55 54  from local to UT
5b20: 43 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  C..**.** Example
5b30: 20 75 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   usage:.**.**   
5b40: 20 20 20 20 20 20 53 45 4c 45 43 54 20 6a 75 6c        SELECT jul
5b50: 69 61 6e 64 61 79 28 3a 75 73 65 72 5f 69 6e 70  ianday(:user_inp
5b60: 75 74 2c 66 72 6f 6d 4c 6f 63 61 6c 28 29 29 3b  ut,fromLocal());
5b70: 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 66 72 6f 6d  .*/.void db_from
5b80: 6c 6f 63 61 6c 5f 66 75 6e 63 74 69 6f 6e 28 0a  local_function(.
5b90: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5ba0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
5bb0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
5bc0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5bd0: 7b 0a 20 20 69 66 28 20 67 2e 66 54 69 6d 65 46  {.  if( g.fTimeF
5be0: 6f 72 6d 61 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ormat==0 ){.    
5bf0: 69 66 28 20 64 62 5f 67 65 74 5f 69 6e 74 28 22  if( db_get_int("
5c00: 74 69 6d 65 6c 69 6e 65 2d 75 74 63 22 2c 20 31  timeline-utc", 1
5c10: 29 20 29 7b 0a 20 20 20 20 20 20 67 2e 66 54 69  ) ){.      g.fTi
5c20: 6d 65 46 6f 72 6d 61 74 20 3d 20 31 3b 0a 20 20  meFormat = 1;.  
5c30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
5c40: 2e 66 54 69 6d 65 46 6f 72 6d 61 74 20 3d 20 32  .fTimeFormat = 2
5c50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
5c60: 28 20 67 2e 66 54 69 6d 65 46 6f 72 6d 61 74 3d  ( g.fTimeFormat=
5c70: 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
5c80: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
5c90: 6e 74 65 78 74 2c 20 22 30 20 73 65 63 6f 6e 64  ntext, "0 second
5ca0: 73 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  s", -1, SQLITE_S
5cb0: 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b  TATIC);.  }else{
5cc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
5cd0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
5ce0: 2c 20 22 75 74 63 22 2c 20 2d 31 2c 20 53 51 4c  , "utc", -1, SQL
5cf0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d  ITE_STATIC);.  }
5d00: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  .}.../*.** Regis
5d10: 74 65 72 20 74 68 65 20 53 51 4c 20 66 75 6e 63  ter the SQL func
5d20: 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75  tions that are u
5d30: 73 65 66 75 6c 20 62 6f 74 68 20 74 6f 20 74 68  seful both to th
5d40: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 72 65  e internal.** re
5d50: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 61 6e 64  presentation and
5d60: 20 74 6f 20 74 68 65 20 22 66 6f 73 73 69 6c 20   to the "fossil 
5d70: 73 71 6c 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  sql" command..*/
5d80: 0a 76 6f 69 64 20 64 62 5f 61 64 64 5f 61 75 78  .void db_add_aux
5d90: 5f 66 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74  _functions(sqlit
5da0: 65 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74  e3 *db){.  sqlit
5db0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
5dc0: 6f 6e 28 64 62 2c 20 22 63 68 65 63 6b 69 6e 5f  on(db, "checkin_
5dd0: 6d 74 69 6d 65 22 2c 20 32 2c 20 53 51 4c 49 54  mtime", 2, SQLIT
5de0: 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 20 20 20 20 20 64 62 5f 63 68 65 63 6b 69 6e 5f       db_checkin_
5e10: 6d 74 69 6d 65 5f 66 75 6e 63 74 69 6f 6e 2c 20  mtime_function, 
5e20: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
5e30: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
5e40: 28 64 62 2c 20 22 73 79 6d 62 6f 6c 69 63 5f 6e  (db, "symbolic_n
5e50: 61 6d 65 5f 74 6f 5f 72 69 64 22 2c 20 31 2c 20  ame_to_rid", 1, 
5e60: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 20 20 20 20 20 20 20 64 62 5f 73 79 6d            db_sym
5e90: 32 72 69 64 5f 66 75 6e 63 74 69 6f 6e 2c 20 30  2rid_function, 0
5ea0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
5eb0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
5ec0: 64 62 2c 20 22 73 79 6d 62 6f 6c 69 63 5f 6e 61  db, "symbolic_na
5ed0: 6d 65 5f 74 6f 5f 72 69 64 22 2c 20 32 2c 20 53  me_to_rid", 2, S
5ee0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f00: 20 20 20 20 20 20 20 20 20 64 62 5f 73 79 6d 32           db_sym2
5f10: 72 69 64 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 2c  rid_function, 0,
5f20: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63   0);.  sqlite3_c
5f30: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
5f40: 62 2c 20 22 6e 6f 77 22 2c 20 30 2c 20 53 51 4c  b, "now", 0, SQL
5f50: 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f70: 20 20 20 20 20 20 20 64 62 5f 6e 6f 77 5f 66 75         db_now_fu
5f80: 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20  nction, 0, 0);. 
5f90: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
5fa0: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 6f  function(db, "to
5fb0: 4c 6f 63 61 6c 22 2c 20 30 2c 20 53 51 4c 49 54  Local", 0, SQLIT
5fc0: 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 20 20 20 20 64 62 5f 74 6f 6c 6f 63 61 6c 5f       db_tolocal_
5ff0: 66 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  function, 0, 0);
6000: 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
6010: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
6020: 66 72 6f 6d 4c 6f 63 61 6c 22 2c 20 30 2c 20 53  fromLocal", 0, S
6030: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6050: 20 20 20 20 20 20 20 20 20 64 62 5f 66 72 6f 6d           db_from
6060: 6c 6f 63 61 6c 5f 66 75 6e 63 74 69 6f 6e 2c 20  local_function, 
6070: 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 20 55 53  0, 0);.}..#if US
6080: 45 5f 53 45 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  E_SEE./*.** This
6090: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
60a0: 20 74 68 65 20 73 61 76 65 64 20 64 61 74 61 62   the saved datab
60b0: 61 73 65 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b  ase encryption k
60c0: 65 79 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  ey string..*/.st
60d0: 61 74 69 63 20 63 68 61 72 20 2a 7a 53 61 76 65  atic char *zSave
60e0: 64 4b 65 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  dKey = 0;../*.**
60f0: 20 54 68 69 73 20 69 73 20 74 68 65 20 73 69 7a   This is the siz
6100: 65 20 6f 66 20 74 68 65 20 73 61 76 65 64 20 64  e of the saved d
6110: 61 74 61 62 61 73 65 20 65 6e 63 72 79 70 74 69  atabase encrypti
6120: 6f 6e 20 6b 65 79 2c 20 69 6e 20 62 79 74 65 73  on key, in bytes
6130: 2e 0a 2a 2f 0a 73 69 7a 65 5f 74 20 73 61 76 65  ..*/.size_t save
6140: 64 4b 65 79 53 69 7a 65 20 3d 20 30 3b 0a 0a 2f  dKeySize = 0;../
6150: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6160: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
6170: 61 76 65 64 20 64 61 74 61 62 61 73 65 20 65 6e  aved database en
6180: 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 2d 4f 52  cryption key -OR
6190: 2d 20 7a 65 72 6f 20 69 66 0a 2a 2a 20 6e 6f 20  - zero if.** no 
61a0: 64 61 74 61 62 61 73 65 20 65 6e 63 72 79 70 74  database encrypt
61b0: 69 6f 6e 20 6b 65 79 20 69 73 20 73 61 76 65 64  ion key is saved
61c0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 64 62 5f 67 65  ..*/.char *db_ge
61d0: 74 5f 73 61 76 65 64 5f 65 6e 63 72 79 70 74 69  t_saved_encrypti
61e0: 6f 6e 5f 6b 65 79 28 29 7b 0a 20 20 72 65 74 75  on_key(){.  retu
61f0: 72 6e 20 7a 53 61 76 65 64 4b 65 79 3b 0a 7d 0a  rn zSavedKey;.}.
6200: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6210: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
6220: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 61 76   size of the sav
6230: 65 64 20 64 61 74 61 62 61 73 65 20 65 6e 63 72  ed database encr
6240: 79 70 74 69 6f 6e 20 6b 65 79 0a 2a 2a 20 2d 4f  yption key.** -O
6250: 52 2d 20 7a 65 72 6f 20 69 66 20 6e 6f 20 64 61  R- zero if no da
6260: 74 61 62 61 73 65 20 65 6e 63 72 79 70 74 69 6f  tabase encryptio
6270: 6e 20 6b 65 79 20 69 73 20 73 61 76 65 64 2e 0a  n key is saved..
6280: 2a 2f 0a 73 69 7a 65 5f 74 20 64 62 5f 67 65 74  */.size_t db_get
6290: 5f 73 61 76 65 64 5f 65 6e 63 72 79 70 74 69 6f  _saved_encryptio
62a0: 6e 5f 6b 65 79 5f 73 69 7a 65 28 29 7b 0a 20 20  n_key_size(){.  
62b0: 72 65 74 75 72 6e 20 73 61 76 65 64 4b 65 79 53  return savedKeyS
62c0: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
62d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 72 72 61  is function arra
62e0: 6e 67 65 73 20 66 6f 72 20 74 68 65 20 64 61 74  nges for the dat
62f0: 61 62 61 73 65 20 65 6e 63 72 79 70 74 69 6f 6e  abase encryption
6300: 20 6b 65 79 20 74 6f 20 62 65 20 73 65 63 75 72   key to be secur
6310: 65 6c 79 0a 2a 2a 20 73 61 76 65 64 20 69 6e 20  ely.** saved in 
6320: 6e 6f 6e 2d 70 61 67 61 62 6c 65 20 6d 65 6d 6f  non-pagable memo
6330: 72 79 20 28 6f 6e 20 70 6c 61 74 66 6f 72 6d 73  ry (on platforms
6340: 20 77 68 65 72 65 20 74 68 69 73 20 69 73 20 70   where this is p
6350: 6f 73 73 69 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61  ossible)..*/.sta
6360: 74 69 63 20 76 6f 69 64 20 64 62 5f 73 61 76 65  tic void db_save
6370: 5f 65 6e 63 72 79 70 74 69 6f 6e 5f 6b 65 79 28  _encryption_key(
6380: 0a 20 20 42 6c 6f 62 20 2a 70 4b 65 79 0a 29 7b  .  Blob *pKey.){
6390: 0a 20 20 76 6f 69 64 20 2a 70 20 3d 20 4e 55 4c  .  void *p = NUL
63a0: 4c 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 20 3d 20  L;.  size_t n = 
63b0: 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 67 65  0;.  size_t page
63c0: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 69 7a 65  Size = 0;.  size
63d0: 5f 74 20 62 6c 6f 62 53 69 7a 65 20 3d 20 30 3b  _t blobSize = 0;
63e0: 0a 0a 20 20 62 6c 6f 62 53 69 7a 65 20 3d 20 62  ..  blobSize = b
63f0: 6c 6f 62 5f 73 69 7a 65 28 70 4b 65 79 29 3b 0a  lob_size(pKey);.
6400: 20 20 69 66 28 20 62 6c 6f 62 53 69 7a 65 3d 3d    if( blobSize==
6410: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
6420: 73 73 69 6c 5f 67 65 74 5f 70 61 67 65 5f 73 69  ssil_get_page_si
6430: 7a 65 28 26 70 61 67 65 53 69 7a 65 29 3b 0a 20  ze(&pageSize);. 
6440: 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
6450: 65 3e 30 20 29 3b 0a 20 20 69 66 28 20 62 6c 6f  e>0 );.  if( blo
6460: 62 53 69 7a 65 3e 70 61 67 65 53 69 7a 65 20 29  bSize>pageSize )
6470: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74  {.    fossil_fat
6480: 61 6c 28 22 6b 65 79 20 62 6c 6f 62 20 74 6f 6f  al("key blob too
6490: 20 6c 61 72 67 65 3a 20 25 75 20 76 65 72 73 75   large: %u versu
64a0: 73 20 25 75 22 2c 20 62 6c 6f 62 53 69 7a 65 2c  s %u", blobSize,
64b0: 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a   pageSize);.  }.
64c0: 20 20 70 20 3d 20 66 6f 73 73 69 6c 5f 73 65 63    p = fossil_sec
64d0: 75 72 65 5f 61 6c 6c 6f 63 5f 70 61 67 65 28 26  ure_alloc_page(&
64e0: 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  n);.  assert( p!
64f0: 3d 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72  =NULL );.  asser
6500: 74 28 20 6e 3d 3d 70 61 67 65 53 69 7a 65 20 29  t( n==pageSize )
6510: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 62  ;.  assert( n>=b
6520: 6c 6f 62 53 69 7a 65 20 29 3b 0a 20 20 6d 65 6d  lobSize );.  mem
6530: 63 70 79 28 70 2c 20 62 6c 6f 62 5f 73 74 72 28  cpy(p, blob_str(
6540: 70 4b 65 79 29 2c 20 62 6c 6f 62 53 69 7a 65 29  pKey), blobSize)
6550: 3b 0a 20 20 7a 53 61 76 65 64 4b 65 79 20 3d 20  ;.  zSavedKey = 
6560: 70 3b 0a 20 20 73 61 76 65 64 4b 65 79 53 69 7a  p;.  savedKeySiz
6570: 65 20 3d 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = n;.}../*.** 
6580: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 72  This function ar
6590: 72 61 6e 67 65 73 20 66 6f 72 20 74 68 65 20 73  ranges for the s
65a0: 61 76 65 64 20 64 61 74 61 62 61 73 65 20 65 6e  aved database en
65b0: 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 74 6f 20  cryption key to 
65c0: 62 65 0a 2a 2a 20 73 65 63 75 72 65 6c 79 20 7a  be.** securely z
65d0: 65 72 6f 65 64 2c 20 75 6e 6c 6f 63 6b 65 64 20  eroed, unlocked 
65e0: 28 69 66 20 6e 65 63 65 73 73 61 72 79 29 2c 20  (if necessary), 
65f0: 61 6e 64 20 66 72 65 65 64 2e 0a 2a 2f 0a 76 6f  and freed..*/.vo
6600: 69 64 20 64 62 5f 75 6e 73 61 76 65 5f 65 6e 63  id db_unsave_enc
6610: 72 79 70 74 69 6f 6e 5f 6b 65 79 28 29 7b 0a 20  ryption_key(){. 
6620: 20 66 6f 73 73 69 6c 5f 73 65 63 75 72 65 5f 66   fossil_secure_f
6630: 72 65 65 5f 70 61 67 65 28 7a 53 61 76 65 64 4b  ree_page(zSavedK
6640: 65 79 2c 20 73 61 76 65 64 4b 65 79 53 69 7a 65  ey, savedKeySize
6650: 29 3b 0a 20 20 7a 53 61 76 65 64 4b 65 79 20 3d  );.  zSavedKey =
6660: 20 4e 55 4c 4c 3b 0a 20 20 73 61 76 65 64 4b 65   NULL;.  savedKe
6670: 79 53 69 7a 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ySize = 0;.}../*
6680: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
6690: 6e 20 73 65 74 73 20 74 68 65 20 73 61 76 65 64  n sets the saved
66a0: 20 64 61 74 61 62 61 73 65 20 65 6e 63 72 79 70   database encryp
66b0: 74 69 6f 6e 20 6b 65 79 20 74 6f 20 74 68 65 20  tion key to the 
66c0: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 73 74 72  specified.** str
66d0: 69 6e 67 20 76 61 6c 75 65 2c 20 61 6c 6c 6f 63  ing value, alloc
66e0: 61 74 69 6e 67 20 6f 72 20 66 72 65 65 69 6e 67  ating or freeing
66f0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
6700: 6d 65 6d 6f 72 79 20 69 66 20 6e 65 65 64 65 64  memory if needed
6710: 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 73 65 74  ..*/.void db_set
6720: 5f 73 61 76 65 64 5f 65 6e 63 72 79 70 74 69 6f  _saved_encryptio
6730: 6e 5f 6b 65 79 28 0a 20 20 42 6c 6f 62 20 2a 70  n_key(.  Blob *p
6740: 4b 65 79 0a 29 7b 0a 20 20 69 66 28 20 7a 53 61  Key.){.  if( zSa
6750: 76 65 64 4b 65 79 21 3d 4e 55 4c 4c 20 29 7b 0a  vedKey!=NULL ){.
6760: 20 20 20 20 73 69 7a 65 5f 74 20 62 6c 6f 62 53      size_t blobS
6770: 69 7a 65 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 28  ize = blob_size(
6780: 70 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 62  pKey);.    if( b
6790: 6c 6f 62 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  lobSize==0 ){.  
67a0: 20 20 20 20 64 62 5f 75 6e 73 61 76 65 5f 65 6e      db_unsave_en
67b0: 63 72 79 70 74 69 6f 6e 5f 6b 65 79 28 29 3b 0a  cryption_key();.
67c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
67d0: 20 69 66 28 20 62 6c 6f 62 53 69 7a 65 3e 73 61   if( blobSize>sa
67e0: 76 65 64 4b 65 79 53 69 7a 65 20 29 7b 0a 20 20  vedKeySize ){.  
67f0: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74        fossil_fat
6800: 61 6c 28 22 6b 65 79 20 62 6c 6f 62 20 74 6f 6f  al("key blob too
6810: 20 6c 61 72 67 65 3a 20 25 75 20 76 65 72 73 75   large: %u versu
6820: 73 20 25 75 22 2c 0a 20 20 20 20 20 20 20 20 20  s %u",.         
6830: 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62              blob
6840: 53 69 7a 65 2c 20 73 61 76 65 64 4b 65 79 53 69  Size, savedKeySi
6850: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
6860: 20 20 20 66 6f 73 73 69 6c 5f 73 65 63 75 72 65     fossil_secure
6870: 5f 7a 65 72 6f 28 7a 53 61 76 65 64 4b 65 79 2c  _zero(zSavedKey,
6880: 20 73 61 76 65 64 4b 65 79 53 69 7a 65 29 3b 0a   savedKeySize);.
6890: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 53 61        memcpy(zSa
68a0: 76 65 64 4b 65 79 2c 20 62 6c 6f 62 5f 73 74 72  vedKey, blob_str
68b0: 28 70 4b 65 79 29 2c 20 62 6c 6f 62 53 69 7a 65  (pKey), blobSize
68c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
68d0: 7b 0a 20 20 20 20 64 62 5f 73 61 76 65 5f 65 6e  {.    db_save_en
68e0: 63 72 79 70 74 69 6f 6e 5f 6b 65 79 28 70 4b 65  cryption_key(pKe
68f0: 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64  y);.  }.}..#if d
6900: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 2f  efined(_WIN32)./
6910: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6920: 6f 6e 20 73 65 74 73 20 74 68 65 20 73 61 76 65  on sets the save
6930: 64 20 64 61 74 61 62 61 73 65 20 65 6e 63 72 79  d database encry
6940: 70 74 69 6f 6e 20 6b 65 79 20 74 6f 20 6f 6e 65  ption key to one
6950: 20 74 68 61 74 20 67 65 74 73 0a 2a 2a 20 72 65   that gets.** re
6960: 61 64 20 66 72 6f 6d 20 74 68 65 20 73 70 65 63  ad from the spec
6970: 69 66 69 65 64 20 46 6f 73 73 69 6c 20 70 61 72  ified Fossil par
6980: 65 6e 74 20 70 72 6f 63 65 73 73 2e 20 20 54 68  ent process.  Th
6990: 69 73 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73  is is only neces
69a0: 73 61 72 79 0a 2a 2a 20 28 6f 72 20 66 75 6e 63  sary.** (or func
69b0: 74 69 6f 6e 61 6c 29 20 6f 6e 20 57 69 6e 64 6f  tional) on Windo
69c0: 77 73 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 72  ws..*/.void db_r
69d0: 65 61 64 5f 73 61 76 65 64 5f 65 6e 63 72 79 70  ead_saved_encryp
69e0: 74 69 6f 6e 5f 6b 65 79 5f 66 72 6f 6d 5f 70 72  tion_key_from_pr
69f0: 6f 63 65 73 73 28 0a 20 20 44 57 4f 52 44 20 70  ocess(.  DWORD p
6a00: 72 6f 63 65 73 73 49 64 2c 20 2f 2a 20 49 64 65  rocessId, /* Ide
6a10: 6e 74 69 66 69 65 72 20 66 6f 72 20 46 6f 73 73  ntifier for Foss
6a20: 69 6c 20 70 61 72 65 6e 74 20 70 72 6f 63 65 73  il parent proces
6a30: 73 2e 20 2a 2f 0a 20 20 4c 50 56 4f 49 44 20 70  s. */.  LPVOID p
6a40: 41 64 64 72 65 73 73 2c 20 2f 2a 20 50 6f 69 6e  Address, /* Poin
6a50: 74 65 72 20 74 6f 20 73 61 76 65 64 20 6b 65 79  ter to saved key
6a60: 20 62 75 66 66 65 72 20 69 6e 20 74 68 65 20 70   buffer in the p
6a70: 61 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 20 2a  arent process. *
6a80: 2f 0a 20 20 53 49 5a 45 5f 54 20 6e 53 69 7a 65  /.  SIZE_T nSize
6a90: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
6aa0: 73 61 76 65 64 20 6b 65 79 20 62 75 66 66 65 72  saved key buffer
6ab0: 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
6ac0: 72 6f 63 65 73 73 2e 20 2a 2f 0a 29 7b 0a 20 20  rocess. */.){.  
6ad0: 76 6f 69 64 20 2a 70 20 3d 20 4e 55 4c 4c 3b 0a  void *p = NULL;.
6ae0: 20 20 73 69 7a 65 5f 74 20 6e 20 3d 20 30 3b 0a    size_t n = 0;.
6af0: 20 20 73 69 7a 65 5f 74 20 70 61 67 65 53 69 7a    size_t pageSiz
6b00: 65 20 3d 20 30 3b 0a 20 20 48 41 4e 44 4c 45 20  e = 0;.  HANDLE 
6b10: 68 50 72 6f 63 65 73 73 20 3d 20 4e 55 4c 4c 3b  hProcess = NULL;
6b20: 0a 0a 20 20 66 6f 73 73 69 6c 5f 67 65 74 5f 70  ..  fossil_get_p
6b30: 61 67 65 5f 73 69 7a 65 28 26 70 61 67 65 53 69  age_size(&pageSi
6b40: 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ze);.  assert( p
6b50: 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20 69  ageSize>0 );.  i
6b60: 66 28 20 6e 53 69 7a 65 3e 70 61 67 65 53 69 7a  f( nSize>pageSiz
6b70: 65 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  e ){.    fossil_
6b80: 66 61 74 61 6c 28 22 6b 65 79 20 74 6f 6f 20 6c  fatal("key too l
6b90: 61 72 67 65 3a 20 25 75 20 76 65 72 73 75 73 20  arge: %u versus 
6ba0: 25 75 22 2c 20 6e 53 69 7a 65 2c 20 70 61 67 65  %u", nSize, page
6bb0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 20 3d  Size);.  }.  p =
6bc0: 20 66 6f 73 73 69 6c 5f 73 65 63 75 72 65 5f 61   fossil_secure_a
6bd0: 6c 6c 6f 63 5f 70 61 67 65 28 26 6e 29 3b 0a 20  lloc_page(&n);. 
6be0: 20 61 73 73 65 72 74 28 20 70 21 3d 4e 55 4c 4c   assert( p!=NULL
6bf0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
6c00: 3d 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 61  =pageSize );.  a
6c10: 73 73 65 72 74 28 20 6e 3e 3d 6e 53 69 7a 65 20  ssert( n>=nSize 
6c20: 29 3b 0a 20 20 68 50 72 6f 63 65 73 73 20 3d 20  );.  hProcess = 
6c30: 4f 70 65 6e 50 72 6f 63 65 73 73 28 50 52 4f 43  OpenProcess(PROC
6c40: 45 53 53 5f 56 4d 5f 52 45 41 44 2c 20 46 41 4c  ESS_VM_READ, FAL
6c50: 53 45 2c 20 70 72 6f 63 65 73 73 49 64 29 3b 0a  SE, processId);.
6c60: 20 20 69 66 28 20 68 50 72 6f 63 65 73 73 21 3d    if( hProcess!=
6c70: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 53 49 5a 45  NULL ){.    SIZE
6c80: 5f 54 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20  _T nRead = 0;.  
6c90: 20 20 69 66 28 20 52 65 61 64 50 72 6f 63 65 73    if( ReadProces
6ca0: 73 4d 65 6d 6f 72 79 28 68 50 72 6f 63 65 73 73  sMemory(hProcess
6cb0: 2c 20 70 41 64 64 72 65 73 73 2c 20 70 2c 20 6e  , pAddress, p, n
6cc0: 53 69 7a 65 2c 20 26 6e 52 65 61 64 29 20 29 7b  Size, &nRead) ){
6cd0: 0a 20 20 20 20 20 20 43 6c 6f 73 65 48 61 6e 64  .      CloseHand
6ce0: 6c 65 28 68 50 72 6f 63 65 73 73 29 3b 0a 20 20  le(hProcess);.  
6cf0: 20 20 20 20 69 66 28 20 6e 52 65 61 64 3d 3d 6e      if( nRead==n
6d00: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
6d10: 64 62 5f 75 6e 73 61 76 65 5f 65 6e 63 72 79 70  db_unsave_encryp
6d20: 74 69 6f 6e 5f 6b 65 79 28 29 3b 0a 20 20 20 20  tion_key();.    
6d30: 20 20 20 20 7a 53 61 76 65 64 4b 65 79 20 3d 20      zSavedKey = 
6d40: 70 3b 0a 20 20 20 20 20 20 20 20 73 61 76 65 64  p;.        saved
6d50: 4b 65 79 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20  KeySize = n;.   
6d60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6d70: 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22    fossil_fatal("
6d80: 62 61 64 20 73 69 7a 65 20 72 65 61 64 2c 20 25  bad size read, %
6d90: 75 20 6f 75 74 20 6f 66 20 25 75 20 62 79 74 65  u out of %u byte
6da0: 73 20 61 74 20 25 70 20 66 72 6f 6d 20 70 69 64  s at %p from pid
6db0: 20 25 6c 75 22 2c 0a 20 20 20 20 20 20 20 20 20   %lu",.         
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 65 61              nRea
6dd0: 64 2c 20 6e 53 69 7a 65 2c 20 70 41 64 64 72 65  d, nSize, pAddre
6de0: 73 73 2c 20 70 72 6f 63 65 73 73 49 64 29 3b 0a  ss, processId);.
6df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
6e00: 65 7b 0a 20 20 20 20 20 20 43 6c 6f 73 65 48 61  e{.      CloseHa
6e10: 6e 64 6c 65 28 68 50 72 6f 63 65 73 73 29 3b 0a  ndle(hProcess);.
6e20: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74        fossil_fat
6e30: 61 6c 28 22 66 61 69 6c 65 64 20 72 65 61 64 2c  al("failed read,
6e40: 20 25 75 20 62 79 74 65 73 20 61 74 20 25 70 20   %u bytes at %p 
6e50: 66 72 6f 6d 20 70 69 64 20 25 6c 75 3a 20 25 6c  from pid %lu: %l
6e60: 75 22 2c 20 6e 53 69 7a 65 2c 0a 20 20 20 20 20  u", nSize,.     
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 41                pA
6e80: 64 64 72 65 73 73 2c 20 70 72 6f 63 65 73 73 49  ddress, processI
6e90: 64 2c 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  d, GetLastError(
6ea0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ));.    }.  }els
6eb0: 65 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61  e{.    fossil_fa
6ec0: 74 61 6c 28 22 66 61 69 6c 65 64 20 74 6f 20 6f  tal("failed to o
6ed0: 70 65 6e 20 70 69 64 20 25 6c 75 3a 20 25 6c 75  pen pid %lu: %lu
6ee0: 22 2c 20 70 72 6f 63 65 73 73 49 64 2c 20 47 65  ", processId, Ge
6ef0: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20  tLastError());. 
6f00: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64   }.}.#endif /* d
6f10: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 2a  efined(_WIN32) *
6f20: 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 55 53 45 5f  /.#endif /* USE_
6f30: 53 45 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  SEE */../*.** If
6f40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
6f50: 6c 65 20 7a 44 62 46 69 6c 65 20 68 61 73 20 61  le zDbFile has a
6f60: 20 6e 61 6d 65 20 74 68 61 74 20 73 75 67 67 65   name that sugge
6f70: 73 74 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a  sts that it is.*
6f80: 2a 20 65 6e 63 72 79 70 74 65 64 2c 20 74 68 65  * encrypted, the
6f90: 6e 20 70 72 6f 6d 70 74 20 66 6f 72 20 74 68 65  n prompt for the
6fa0: 20 64 61 74 61 62 61 73 65 20 65 6e 63 72 79 70   database encryp
6fb0: 74 69 6f 6e 20 6b 65 79 20 61 6e 64 20 72 65 74  tion key and ret
6fc0: 75 72 6e 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65  urn it.** in the
6fd0: 20 62 6c 6f 62 20 2a 70 4b 65 79 2e 20 20 4f 72   blob *pKey.  Or
6fe0: 2c 20 69 66 20 74 68 65 20 65 6e 63 72 79 70 74  , if the encrypt
6ff0: 69 6f 6e 20 6b 65 79 20 68 61 73 20 70 72 65 76  ion key has prev
7000: 69 6f 75 73 6c 79 20 62 65 65 6e 0a 2a 2a 20 72  iously been.** r
7010: 65 71 75 65 73 74 65 64 2c 20 6a 75 73 74 20 72  equested, just r
7020: 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20  eturn a copy of 
7030: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 65 73  the previous res
7040: 75 6c 74 2e 20 20 54 68 65 20 62 6c 6f 62 20 69  ult.  The blob i
7050: 6e 0a 2a 2a 20 2a 70 4b 65 79 20 6d 75 73 74 20  n.** *pKey must 
7060: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
7070: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
7080: 62 5f 6d 61 79 62 65 5f 6f 62 74 61 69 6e 5f 65  b_maybe_obtain_e
7090: 6e 63 72 79 70 74 69 6f 6e 5f 6b 65 79 28 0a 20  ncryption_key(. 
70a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
70b0: 46 69 6c 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  File,   /* Name 
70c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
70d0: 66 69 6c 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a  file */.  Blob *
70e0: 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 20 20  pKey            
70f0: 20 2f 2a 20 50 75 74 20 74 68 65 20 65 6e 63 72   /* Put the encr
7100: 79 70 74 69 6f 6e 20 6b 65 79 20 68 65 72 65 20  yption key here 
7110: 2a 2f 0a 29 7b 0a 23 69 66 20 55 53 45 5f 53 45  */.){.#if USE_SE
7120: 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  E.  if( sqlite3_
7130: 73 74 72 67 6c 6f 62 28 22 2a 2e 65 66 6f 73 73  strglob("*.efoss
7140: 69 6c 22 2c 20 7a 44 62 46 69 6c 65 29 3d 3d 30  il", zDbFile)==0
7150: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4b   ){.    char *zK
7160: 65 79 20 3d 20 64 62 5f 67 65 74 5f 73 61 76 65  ey = db_get_save
7170: 64 5f 65 6e 63 72 79 70 74 69 6f 6e 5f 6b 65 79  d_encryption_key
7180: 28 29 3b 0a 20 20 20 20 69 66 28 20 7a 4b 65 79  ();.    if( zKey
7190: 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 73   ){.      blob_s
71a0: 65 74 28 70 4b 65 79 2c 20 7a 4b 65 79 29 3b 0a  et(pKey, zKey);.
71b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
71c0: 20 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 20 3d   char *zPrompt =
71d0: 20 6d 70 72 69 6e 74 66 28 22 5c 72 65 6e 63 72   mprintf("\rencr
71e0: 79 70 74 69 6f 6e 20 6b 65 79 20 66 6f 72 20 27  yption key for '
71f0: 25 73 27 3a 20 22 2c 20 7a 44 62 46 69 6c 65 29  %s': ", zDbFile)
7200: 3b 0a 20 20 20 20 20 20 70 72 6f 6d 70 74 5f 66  ;.      prompt_f
7210: 6f 72 5f 70 61 73 73 77 6f 72 64 28 7a 50 72 6f  or_password(zPro
7220: 6d 70 74 2c 20 70 4b 65 79 2c 20 30 29 3b 0a 20  mpt, pKey, 0);. 
7230: 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 72 65 65       fossil_free
7240: 28 7a 50 72 6f 6d 70 74 29 3b 0a 20 20 20 20 20  (zPrompt);.     
7250: 20 64 62 5f 73 65 74 5f 73 61 76 65 64 5f 65 6e   db_set_saved_en
7260: 63 72 79 70 74 69 6f 6e 5f 6b 65 79 28 70 4b 65  cryption_key(pKe
7270: 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  y);.    }.  }.#e
7280: 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.}.../*.** S
7290: 65 74 73 20 74 68 65 20 65 6e 63 72 79 70 74 69  ets the encrypti
72a0: 6f 6e 20 6b 65 79 20 66 6f 72 20 74 68 65 20 64  on key for the d
72b0: 61 74 61 62 61 73 65 2c 20 69 66 20 6e 65 63 65  atabase, if nece
72c0: 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 64  ssary..*/.void d
72d0: 62 5f 6d 61 79 62 65 5f 73 65 74 5f 65 6e 63 72  b_maybe_set_encr
72e0: 79 70 74 69 6f 6e 5f 6b 65 79 28 73 71 6c 69 74  yption_key(sqlit
72f0: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
7300: 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20  ar *zDbName){.  
7310: 42 6c 6f 62 20 6b 65 79 3b 0a 20 20 62 6c 6f 62  Blob key;.  blob
7320: 5f 69 6e 69 74 28 26 6b 65 79 2c 20 30 2c 20 30  _init(&key, 0, 0
7330: 29 3b 0a 20 20 64 62 5f 6d 61 79 62 65 5f 6f 62  );.  db_maybe_ob
7340: 74 61 69 6e 5f 65 6e 63 72 79 70 74 69 6f 6e 5f  tain_encryption_
7350: 6b 65 79 28 7a 44 62 4e 61 6d 65 2c 20 26 6b 65  key(zDbName, &ke
7360: 79 29 3b 0a 20 20 69 66 28 20 62 6c 6f 62 5f 73  y);.  if( blob_s
7370: 69 7a 65 28 26 6b 65 79 29 3e 30 20 29 7b 0a 20  ize(&key)>0 ){. 
7380: 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 67 65     if( fossil_ge
7390: 74 65 6e 76 28 22 46 4f 53 53 49 4c 5f 55 53 45  tenv("FOSSIL_USE
73a0: 5f 53 45 45 5f 54 45 58 54 4b 45 59 22 29 3d 3d  _SEE_TEXTKEY")==
73b0: 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
73c0: 2a 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f  *zCmd = sqlite3_
73d0: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
73e0: 6b 65 79 28 25 51 29 22 2c 20 62 6c 6f 62 5f 73  key(%Q)", blob_s
73f0: 74 72 28 26 6b 65 79 29 29 3b 0a 20 20 20 20 20  tr(&key));.     
7400: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
7410: 2c 20 7a 43 6d 64 2c 20 30 2c 20 30 2c 20 30 29  , zCmd, 0, 0, 0)
7420: 3b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 73  ;.      fossil_s
7430: 65 63 75 72 65 5f 7a 65 72 6f 28 7a 43 6d 64 2c  ecure_zero(zCmd,
7440: 20 73 74 72 6c 65 6e 28 7a 43 6d 64 29 29 3b 0a   strlen(zCmd));.
7450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
7460: 65 65 28 7a 43 6d 64 29 3b 0a 23 69 66 20 55 53  ee(zCmd);.#if US
7470: 45 5f 53 45 45 0a 20 20 20 20 7d 65 6c 73 65 7b  E_SEE.    }else{
7480: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b  .      sqlite3_k
7490: 65 79 28 64 62 2c 20 62 6c 6f 62 5f 73 74 72 28  ey(db, blob_str(
74a0: 26 6b 65 79 29 2c 20 2d 31 29 3b 0a 23 65 6e 64  &key), -1);.#end
74b0: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  if.    }.  }.  b
74c0: 6c 6f 62 5f 72 65 73 65 74 28 26 6b 65 79 29 3b  lob_reset(&key);
74d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
74e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
74f0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
7500: 72 20 74 6f 20 74 68 65 20 6e 65 77 20 64 61 74  r to the new dat
7510: 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
7520: 69 6f 6e 2e 20 20 41 6e 20 65 72 72 6f 72 20 72  ion.  An error r
7530: 65 73 75 6c 74 73 20 69 6e 20 70 72 6f 63 65 73  esults in proces
7540: 73 20 61 62 6f 72 74 2e 0a 2a 2f 0a 4c 4f 43 41  s abort..*/.LOCA
7550: 4c 20 73 71 6c 69 74 65 33 20 2a 64 62 5f 6f 70  L sqlite3 *db_op
7560: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
7570: 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72  DbName){.  int r
7580: 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
7590: 3b 0a 0a 20 20 69 66 28 20 67 2e 66 53 71 6c 54  ;..  if( g.fSqlT
75a0: 72 61 63 65 20 29 20 66 6f 73 73 69 6c 5f 74 72  race ) fossil_tr
75b0: 61 63 65 28 22 2d 2d 20 73 71 6c 69 74 65 33 5f  ace("-- sqlite3_
75c0: 6f 70 65 6e 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  open: [%s]\n", z
75d0: 44 62 4e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20  DbName);.  rc = 
75e0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
75f0: 0a 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c  .       zDbName,
7600: 20 26 64 62 2c 0a 20 20 20 20 20 20 20 53 51 4c   &db,.       SQL
7610: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
7620: 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
7630: 5f 43 52 45 41 54 45 2c 0a 20 20 20 20 20 20 20  _CREATE,.       
7640: 67 2e 7a 56 66 73 4e 61 6d 65 0a 20 20 29 3b 0a  g.zVfsName.  );.
7650: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7660: 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 5f 65 72  _OK ){.    db_er
7670: 72 28 22 5b 25 73 5d 3a 20 25 73 22 2c 20 7a 44  r("[%s]: %s", zD
7680: 62 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65  bName, sqlite3_e
7690: 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a  rrmsg(db));.  }.
76a0: 20 20 64 62 5f 6d 61 79 62 65 5f 73 65 74 5f 65    db_maybe_set_e
76b0: 6e 63 72 79 70 74 69 6f 6e 5f 6b 65 79 28 64 62  ncryption_key(db
76c0: 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 73 71  , zDbName);.  sq
76d0: 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
76e0: 75 74 28 64 62 2c 20 35 30 30 30 29 3b 0a 20 20  ut(db, 5000);.  
76f0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
7700: 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 31  checkpoint(db, 1
7710: 29 3b 20 20 2f 2a 20 53 65 74 20 74 6f 20 63 68  );  /* Set to ch
7720: 65 63 6b 70 6f 69 6e 74 20 66 72 65 71 75 65 6e  eckpoint frequen
7730: 74 6c 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tly */.  sqlite3
7740: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7750: 28 64 62 2c 20 22 75 73 65 72 22 2c 20 30 2c 20  (db, "user", 0, 
7760: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
7770: 64 62 5f 73 71 6c 5f 75 73 65 72 2c 20 30 2c 20  db_sql_user, 0, 
7780: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72  0);.  sqlite3_cr
7790: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
77a0: 2c 20 22 63 67 69 22 2c 20 31 2c 20 53 51 4c 49  , "cgi", 1, SQLI
77b0: 54 45 5f 55 54 46 38 2c 20 30 2c 20 64 62 5f 73  TE_UTF8, 0, db_s
77c0: 71 6c 5f 63 67 69 2c 20 30 2c 20 30 29 3b 0a 20  ql_cgi, 0, 0);. 
77d0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
77e0: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 63 67  function(db, "cg
77f0: 69 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  i", 2, SQLITE_UT
7800: 46 38 2c 20 30 2c 20 64 62 5f 73 71 6c 5f 63 67  F8, 0, db_sql_cg
7810: 69 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  i, 0, 0);.  sqli
7820: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
7830: 69 6f 6e 28 64 62 2c 20 22 70 72 69 6e 74 22 2c  ion(db, "print",
7840: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
7850: 2c 20 30 2c 64 62 5f 73 71 6c 5f 70 72 69 6e 74  , 0,db_sql_print
7860: 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ,0,0);.  sqlite3
7870: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7880: 28 0a 20 20 20 20 64 62 2c 20 22 69 73 5f 73 65  (.    db, "is_se
7890: 6c 65 63 74 65 64 22 2c 20 31 2c 20 53 51 4c 49  lected", 1, SQLI
78a0: 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 69 6c 65  TE_UTF8, 0, file
78b0: 5f 69 73 5f 73 65 6c 65 63 74 65 64 2c 30 2c 30  _is_selected,0,0
78c0: 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  .  );.  sqlite3_
78d0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
78e0: 0a 20 20 20 20 64 62 2c 20 22 69 66 5f 73 65 6c  .    db, "if_sel
78f0: 65 63 74 65 64 22 2c 20 33 2c 20 53 51 4c 49 54  ected", 3, SQLIT
7900: 45 5f 55 54 46 38 2c 20 30 2c 20 66 69 6c 65 5f  E_UTF8, 0, file_
7910: 69 73 5f 73 65 6c 65 63 74 65 64 2c 30 2c 30 0a  is_selected,0,0.
7920: 20 20 29 3b 0a 20 20 69 66 28 20 67 2e 66 53 71    );.  if( g.fSq
7930: 6c 54 72 61 63 65 20 29 20 73 71 6c 69 74 65 33  lTrace ) sqlite3
7940: 5f 74 72 61 63 65 5f 76 32 28 64 62 2c 20 53 51  _trace_v2(db, SQ
7950: 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54 2c  LITE_TRACE_STMT,
7960: 20 64 62 5f 73 71 6c 5f 74 72 61 63 65 2c 20 30   db_sql_trace, 0
7970: 29 3b 0a 20 20 64 62 5f 61 64 64 5f 61 75 78 5f  );.  db_add_aux_
7980: 66 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 20  functions(db);. 
7990: 20 72 65 5f 61 64 64 5f 73 71 6c 5f 66 75 6e 63   re_add_sql_func
79a0: 28 64 62 29 3b 20 20 2f 2a 20 54 68 65 20 52 45  (db);  /* The RE
79b0: 47 45 58 50 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GEXP operator */
79c0: 0a 20 20 66 6f 63 69 5f 72 65 67 69 73 74 65 72  .  foci_register
79d0: 28 64 62 29 3b 20 20 20 20 2f 2a 20 54 68 65 20  (db);    /* The 
79e0: 22 66 69 6c 65 73 5f 6f 66 5f 63 68 65 63 6b 69  "files_of_checki
79f0: 6e 22 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  n" virtual table
7a00: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 65 78   */.  sqlite3_ex
7a10: 65 63 28 64 62 2c 20 22 50 52 41 47 4d 41 20 66  ec(db, "PRAGMA f
7a20: 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b  oreign_keys=OFF;
7a30: 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 72  ", 0, 0, 0);.  r
7a40: 65 74 75 72 6e 20 64 62 3b 0a 7d 0a 0a 0a 2f 2a  eturn db;.}.../*
7a50: 0a 2a 2a 20 44 65 74 61 63 68 65 73 20 74 68 65  .** Detaches the
7a60: 20 7a 4c 61 62 65 6c 20 64 61 74 61 62 61 73 65   zLabel database
7a70: 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 64 65 74  ..*/.void db_det
7a80: 61 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ach(const char *
7a90: 7a 4c 61 62 65 6c 29 7b 0a 20 20 64 62 5f 6d 75  zLabel){.  db_mu
7aa0: 6c 74 69 5f 65 78 65 63 28 22 44 45 54 41 43 48  lti_exec("DETACH
7ab0: 20 44 41 54 41 42 41 53 45 20 25 51 22 2c 20 7a   DATABASE %Q", z
7ac0: 4c 61 62 65 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Label);.}../*.**
7ad0: 20 7a 44 62 4e 61 6d 65 20 69 73 20 74 68 65 20   zDbName is the 
7ae0: 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61  name of a databa
7af0: 73 65 20 66 69 6c 65 2e 20 20 41 74 74 61 63 68  se file.  Attach
7b00: 20 7a 44 62 4e 61 6d 65 20 75 73 69 6e 67 0a 2a   zDbName using.*
7b10: 2a 20 74 68 65 20 6e 61 6d 65 20 7a 4c 61 62 65  * the name zLabe
7b20: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 61 74  l..*/.void db_at
7b30: 74 61 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20  tach(const char 
7b40: 2a 7a 44 62 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  *zDbName, const 
7b50: 63 68 61 72 20 2a 7a 4c 61 62 65 6c 29 7b 0a 20  char *zLabel){. 
7b60: 20 42 6c 6f 62 20 6b 65 79 3b 0a 20 20 62 6c 6f   Blob key;.  blo
7b70: 62 5f 69 6e 69 74 28 26 6b 65 79 2c 20 30 2c 20  b_init(&key, 0, 
7b80: 30 29 3b 0a 20 20 64 62 5f 6d 61 79 62 65 5f 6f  0);.  db_maybe_o
7b90: 62 74 61 69 6e 5f 65 6e 63 72 79 70 74 69 6f 6e  btain_encryption
7ba0: 5f 6b 65 79 28 7a 44 62 4e 61 6d 65 2c 20 26 6b  _key(zDbName, &k
7bb0: 65 79 29 3b 0a 20 20 69 66 28 20 66 6f 73 73 69  ey);.  if( fossi
7bc0: 6c 5f 67 65 74 65 6e 76 28 22 46 4f 53 53 49 4c  l_getenv("FOSSIL
7bd0: 5f 55 53 45 5f 53 45 45 5f 54 45 58 54 4b 45 59  _USE_SEE_TEXTKEY
7be0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  ")==0 ){.    cha
7bf0: 72 20 2a 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65  r *zCmd = sqlite
7c00: 33 5f 6d 70 72 69 6e 74 66 28 22 41 54 54 41 43  3_mprintf("ATTAC
7c10: 48 20 44 41 54 41 42 41 53 45 20 25 51 20 41 53  H DATABASE %Q AS
7c20: 20 25 51 20 4b 45 59 20 25 51 22 2c 0a 20 20 20   %Q KEY %Q",.   
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 44                zD
7c50: 62 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 2c 20 62  bName, zLabel, b
7c60: 6c 6f 62 5f 73 74 72 28 26 6b 65 79 29 29 3b 0a  lob_str(&key));.
7c70: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
7c80: 63 28 7a 43 6d 64 20 2f 2a 77 6f 72 6b 73 2d 6c  c(zCmd /*works-l
7c90: 69 6b 65 3a 22 22 2a 2f 29 3b 0a 20 20 20 20 66  ike:""*/);.    f
7ca0: 6f 73 73 69 6c 5f 73 65 63 75 72 65 5f 7a 65 72  ossil_secure_zer
7cb0: 6f 28 7a 43 6d 64 2c 20 73 74 72 6c 65 6e 28 7a  o(zCmd, strlen(z
7cc0: 43 6d 64 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  Cmd));.    sqlit
7cd0: 65 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a 20  e3_free(zCmd);. 
7ce0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
7cf0: 20 2a 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33   *zCmd = sqlite3
7d00: 5f 6d 70 72 69 6e 74 66 28 22 41 54 54 41 43 48  _mprintf("ATTACH
7d10: 20 44 41 54 41 42 41 53 45 20 25 51 20 41 53 20   DATABASE %Q AS 
7d20: 25 51 20 4b 45 59 20 27 27 22 2c 0a 20 20 20 20  %Q KEY ''",.    
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 44 62               zDb
7d50: 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20  Name, zLabel);. 
7d60: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
7d70: 28 7a 43 6d 64 20 2f 2a 77 6f 72 6b 73 2d 6c 69  (zCmd /*works-li
7d80: 6b 65 3a 22 22 2a 2f 29 3b 0a 20 20 20 20 73 71  ke:""*/);.    sq
7d90: 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29  lite3_free(zCmd)
7da0: 3b 0a 23 69 66 20 55 53 45 5f 53 45 45 0a 20 20  ;.#if USE_SEE.  
7db0: 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a 65 28    if( blob_size(
7dc0: 26 6b 65 79 29 3e 30 20 29 7b 0a 20 20 20 20 20  &key)>0 ){.     
7dd0: 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28   sqlite3_key_v2(
7de0: 67 2e 64 62 2c 20 7a 4c 61 62 65 6c 2c 20 62 6c  g.db, zLabel, bl
7df0: 6f 62 5f 73 74 72 28 26 6b 65 79 29 2c 20 2d 31  ob_str(&key), -1
7e00: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
7e10: 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74    }.  blob_reset
7e20: 28 26 6b 65 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (&key);.}../*.**
7e30: 20 43 68 61 6e 67 65 20 74 68 65 20 73 63 68 65   Change the sche
7e40: 6d 61 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 22  ma name of the "
7e50: 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65 20 74  main" database t
7e60: 6f 20 7a 4c 61 62 65 6c 2e 0a 2a 2a 20 7a 4c 61  o zLabel..** zLa
7e70: 62 65 6c 20 6d 75 73 74 20 62 65 20 61 20 73 74  bel must be a st
7e80: 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74  atic string that
7e90: 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 66 6f   is unchanged fo
7ea0: 72 20 74 68 65 20 6c 69 66 65 20 6f 66 0a 2a 2a  r the life of.**
7eb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
7ec0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
7ed0: 41 66 74 65 72 20 63 61 6c 6c 69 6e 67 20 74 68  After calling th
7ee0: 69 73 20 72 6f 75 74 69 6e 65 2c 20 64 62 5f 64  is routine, db_d
7ef0: 61 74 61 62 61 73 65 5f 73 6c 6f 74 28 7a 4c 61  atabase_slot(zLa
7f00: 62 65 6c 29 20 73 68 6f 75 6c 64 0a 2a 2a 20 72  bel) should.** r
7f10: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 76 6f 69 64  eturn 0..*/.void
7f20: 20 64 62 5f 73 65 74 5f 6d 61 69 6e 5f 73 63 68   db_set_main_sch
7f30: 65 6d 61 6e 61 6d 65 28 73 71 6c 69 74 65 33 20  emaname(sqlite3 
7f40: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
7f50: 2a 7a 4c 61 62 65 6c 29 7b 0a 20 20 69 66 28 20  *zLabel){.  if( 
7f60: 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
7f70: 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
7f80: 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d 45  ONFIG_MAINDBNAME
7f90: 2c 20 7a 4c 61 62 65 6c 29 20 29 7b 0a 20 20 20  , zLabel) ){.   
7fa0: 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 46   fossil_fatal("F
7fb0: 6f 73 73 69 6c 20 72 65 71 75 69 72 65 73 20 61  ossil requires a
7fc0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c 69   version of SQLi
7fd0: 74 65 20 74 68 61 74 20 73 75 70 70 6f 72 74 73  te that supports
7fe0: 20 74 68 65 20 22 0a 20 20 20 20 20 20 20 20 20   the ".         
7ff0: 20 20 20 20 20 20 20 20 22 53 51 4c 49 54 45 5f          "SQLITE_
8000: 44 42 43 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e  DBCONFIG_MAINDBN
8010: 41 4d 45 20 69 6e 74 65 72 66 61 63 65 2e 22 29  AME interface.")
8020: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
8030: 65 74 75 72 6e 20 74 68 65 20 73 6c 6f 74 20 6e  eturn the slot n
8040: 75 6d 62 65 72 20 66 6f 72 20 64 61 74 61 62 61  umber for databa
8050: 73 65 20 7a 4c 61 62 65 6c 2e 20 20 54 68 65 20  se zLabel.  The 
8060: 66 69 72 73 74 20 64 61 74 61 62 61 73 65 0a 2a  first database.*
8070: 2a 20 6f 70 65 6e 65 64 20 69 73 20 73 6c 6f 74  * opened is slot
8080: 20 30 2e 20 20 54 68 65 20 22 74 65 6d 70 22 20   0.  The "temp" 
8090: 64 61 74 61 62 61 73 65 20 69 73 20 73 6c 6f 74  database is slot
80a0: 20 31 2e 20 20 41 74 74 61 63 68 65 64 20 64 61   1.  Attached da
80b0: 74 61 62 61 73 65 73 0a 2a 2a 20 61 72 65 20 73  tabases.** are s
80c0: 6c 6f 74 73 20 32 20 61 6e 64 20 68 69 67 68 65  lots 2 and highe
80d0: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
80e0: 2d 31 20 69 66 20 7a 4c 61 62 65 6c 20 64 6f 65  -1 if zLabel doe
80f0: 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20  s not match any 
8100: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a  open database..*
8110: 2f 0a 69 6e 74 20 64 62 5f 64 61 74 61 62 61 73  /.int db_databas
8120: 65 5f 73 6c 6f 74 28 63 6f 6e 73 74 20 63 68 61  e_slot(const cha
8130: 72 20 2a 7a 4c 61 62 65 6c 29 7b 0a 20 20 69 6e  r *zLabel){.  in
8140: 74 20 69 53 6c 6f 74 20 3d 20 2d 31 3b 0a 20 20  t iSlot = -1;.  
8150: 69 6e 74 20 72 63 3b 0a 20 20 53 74 6d 74 20 71  int rc;.  Stmt q
8160: 3b 0a 20 20 69 66 28 20 67 2e 64 62 3d 3d 30 20  ;.  if( g.db==0 
8170: 29 20 72 65 74 75 72 6e 20 69 53 6c 6f 74 3b 0a  ) return iSlot;.
8180: 20 20 72 63 20 3d 20 64 62 5f 70 72 65 70 61 72    rc = db_prepar
8190: 65 5f 69 67 6e 6f 72 65 5f 65 72 72 6f 72 28 26  e_ignore_error(&
81a0: 71 2c 20 22 50 52 41 47 4d 41 20 64 61 74 61 62  q, "PRAGMA datab
81b0: 61 73 65 5f 6c 69 73 74 22 29 3b 0a 20 20 69 66  ase_list");.  if
81c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
81d0: 29 20 72 65 74 75 72 6e 20 69 53 6c 6f 74 3b 0a  ) return iSlot;.
81e0: 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70    while( db_step
81f0: 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  (&q)==SQLITE_ROW
8200: 20 29 7b 0a 20 20 20 20 69 66 28 20 66 6f 73 73   ){.    if( foss
8210: 69 6c 5f 73 74 72 63 6d 70 28 64 62 5f 63 6f 6c  il_strcmp(db_col
8220: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 31 29 2c 7a  umn_text(&q,1),z
8230: 4c 61 62 65 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  Label)==0 ){.   
8240: 20 20 20 69 53 6c 6f 74 20 3d 20 64 62 5f 63 6f     iSlot = db_co
8250: 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b  lumn_int(&q, 0);
8260: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8270: 20 20 7d 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e    }.  }.  db_fin
8280: 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 72 65 74  alize(&q);.  ret
8290: 75 72 6e 20 69 53 6c 6f 74 3b 0a 7d 0a 0a 2f 2a  urn iSlot;.}../*
82a0: 0a 2a 2a 20 7a 44 62 4e 61 6d 65 20 69 73 20 74  .** zDbName is t
82b0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
82c0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
82d0: 6e 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  no other databas
82e0: 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 6f 70 65  e.** file is ope
82f0: 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 74 68 69  n, then open thi
8300: 73 20 6f 6e 65 2e 20 20 49 66 20 61 6e 6f 74 68  s one.  If anoth
8310: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
8320: 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f   is.** already o
8330: 70 65 6e 2c 20 74 68 65 6e 20 61 74 74 61 63 68  pen, then attach
8340: 20 7a 44 62 4e 61 6d 65 20 75 73 69 6e 67 20 74   zDbName using t
8350: 68 65 20 6e 61 6d 65 20 7a 4c 61 62 65 6c 2e 0a  he name zLabel..
8360: 2a 2f 0a 76 6f 69 64 20 64 62 5f 6f 70 65 6e 5f  */.void db_open_
8370: 6f 72 5f 61 74 74 61 63 68 28 63 6f 6e 73 74 20  or_attach(const 
8380: 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 63  char *zDbName, c
8390: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65  onst char *zLabe
83a0: 6c 29 7b 0a 20 20 69 66 28 20 21 67 2e 64 62 20  l){.  if( !g.db 
83b0: 29 7b 0a 20 20 20 20 67 2e 64 62 20 3d 20 64 62  ){.    g.db = db
83c0: 5f 6f 70 65 6e 28 7a 44 62 4e 61 6d 65 29 3b 0a  _open(zDbName);.
83d0: 20 20 20 20 64 62 5f 73 65 74 5f 6d 61 69 6e 5f      db_set_main_
83e0: 73 63 68 65 6d 61 6e 61 6d 65 28 67 2e 64 62 2c  schemaname(g.db,
83f0: 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 7d 65 6c 73   zLabel);.  }els
8400: 65 7b 0a 20 20 20 20 64 62 5f 61 74 74 61 63 68  e{.    db_attach
8410: 28 7a 44 62 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c  (zDbName, zLabel
8420: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8430: 43 6c 6f 73 65 20 74 68 65 20 70 65 72 2d 75 73  Close the per-us
8440: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
8450: 20 69 6e 20 7e 2f 2e 66 6f 73 73 69 6c 0a 2a 2f   in ~/.fossil.*/
8460: 0a 76 6f 69 64 20 64 62 5f 63 6c 6f 73 65 5f 63  .void db_close_c
8470: 6f 6e 66 69 67 28 29 7b 0a 20 20 69 6e 74 20 69  onfig(){.  int i
8480: 53 6c 6f 74 20 3d 20 64 62 5f 64 61 74 61 62 61  Slot = db_databa
8490: 73 65 5f 73 6c 6f 74 28 22 63 6f 6e 66 69 67 64  se_slot("configd
84a0: 62 22 29 3b 0a 20 20 69 66 28 20 69 53 6c 6f 74  b");.  if( iSlot
84b0: 3e 30 20 29 7b 0a 20 20 20 20 64 62 5f 64 65 74  >0 ){.    db_det
84c0: 61 63 68 28 22 63 6f 6e 66 69 67 64 62 22 29 3b  ach("configdb");
84d0: 0a 20 20 20 20 67 2e 7a 43 6f 6e 66 69 67 44 62  .    g.zConfigDb
84e0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Name = 0;.  }els
84f0: 65 20 69 66 28 20 67 2e 64 62 43 6f 6e 66 69 67  e if( g.dbConfig
8500: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8510: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 67  wal_checkpoint(g
8520: 2e 64 62 43 6f 6e 66 69 67 2c 20 30 29 3b 0a 20  .dbConfig, 0);. 
8530: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
8540: 28 67 2e 64 62 43 6f 6e 66 69 67 29 3b 0a 20 20  (g.dbConfig);.  
8550: 20 20 67 2e 64 62 43 6f 6e 66 69 67 20 3d 20 30    g.dbConfig = 0
8560: 3b 0a 20 20 20 20 67 2e 7a 43 6f 6e 66 69 67 44  ;.    g.zConfigD
8570: 62 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  bName = 0;.  }el
8580: 73 65 20 69 66 28 20 67 2e 64 62 20 26 26 20 30  se if( g.db && 0
8590: 3d 3d 69 53 6c 6f 74 20 29 7b 0a 20 20 20 20 73  ==iSlot ){.    s
85a0: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
85b0: 70 6f 69 6e 74 28 67 2e 64 62 2c 20 30 29 3b 0a  point(g.db, 0);.
85c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
85d0: 65 28 67 2e 64 62 29 3b 0a 20 20 20 20 67 2e 64  e(g.db);.    g.d
85e0: 62 20 3d 20 30 3b 0a 20 20 20 20 67 2e 7a 43 6f  b = 0;.    g.zCo
85f0: 6e 66 69 67 44 62 4e 61 6d 65 20 3d 20 30 3b 0a  nfigDbName = 0;.
8600: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
8610: 6e 20 74 68 65 20 75 73 65 72 20 64 61 74 61 62  n the user datab
8620: 61 73 65 20 69 6e 20 22 7e 2f 2e 66 6f 73 73 69  ase in "~/.fossi
8630: 6c 22 2e 20 20 43 72 65 61 74 65 20 74 68 65 20  l".  Create the 
8640: 64 61 74 61 62 61 73 65 20 61 6e 65 77 20 69 66  database anew if
8650: 0a 2a 2a 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  .** it does not 
8660: 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a 2a  already exist..*
8670: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 41  *.** If the useA
8680: 74 74 61 63 68 20 66 6c 61 67 20 69 73 20 30 20  ttach flag is 0 
8690: 28 74 68 65 20 75 73 75 61 6c 20 63 61 73 65 29  (the usual case)
86a0: 20 74 68 65 6e 20 74 68 65 20 75 73 65 72 20 64   then the user d
86b0: 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 6f 70  atabase is.** op
86c0: 65 6e 65 64 20 6f 6e 20 61 20 73 65 70 61 72 61  ened on a separa
86d0: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
86e0: 65 63 74 69 6f 6e 20 67 2e 64 62 43 6f 6e 66 69  ection g.dbConfi
86f0: 67 2e 20 20 54 68 69 73 20 70 72 65 76 65 6e 74  g.  This prevent
8700: 73 0a 2a 2a 20 74 68 65 20 7e 2f 2e 66 6f 73 73  s.** the ~/.foss
8710: 69 6c 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  il database from
8720: 20 62 65 63 6f 6d 69 6e 67 20 6c 6f 63 6b 65 64   becoming locked
8730: 20 6f 6e 20 6c 6f 6e 67 20 63 68 65 63 6b 2d 69   on long check-i
8740: 6e 20 6f 72 20 73 79 6e 63 0a 2a 2a 20 6f 70 65  n or sync.** ope
8750: 72 61 74 69 6f 6e 73 20 77 68 69 63 68 20 68 6f  rations which ho
8760: 6c 64 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ld an exclusive 
8770: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 6e  transaction.  In
8780: 20 61 20 66 65 77 20 63 61 73 65 73 2c 20 74 68   a few cases, th
8790: 6f 75 67 68 2c 0a 2a 2a 20 69 74 20 69 73 20 63  ough,.** it is c
87a0: 6f 6e 76 65 6e 69 65 6e 74 20 66 6f 72 20 74 68  onvenient for th
87b0: 65 20 7e 2f 2e 66 6f 73 73 69 6c 20 74 6f 20 62  e ~/.fossil to b
87c0: 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  e attached to th
87d0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
87e0: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 6f  ** connection so
87f0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 6a 6f 69   that we can joi
8800: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 76 61  n between the va
8810: 72 69 6f 75 73 20 64 61 74 61 62 61 73 65 73 2e  rious databases.
8820: 20 20 49 6e 20 74 68 61 74 0a 2a 2a 20 63 61 73    In that.** cas
8830: 65 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72  e, invoke this r
8840: 6f 75 74 69 6e 65 20 77 69 74 68 20 75 73 65 41  outine with useA
8850: 74 74 61 63 68 20 61 73 20 31 2e 0a 2a 2f 0a 69  ttach as 1..*/.i
8860: 6e 74 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e 66 69  nt db_open_confi
8870: 67 28 69 6e 74 20 75 73 65 41 74 74 61 63 68 2c  g(int useAttach,
8880: 20 69 6e 74 20 69 73 4f 70 74 69 6f 6e 61 6c 29   int isOptional)
8890: 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  {.  char *zDbNam
88a0: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 48 6f 6d 65  e;.  char *zHome
88b0: 3b 0a 20 20 69 66 28 20 67 2e 7a 43 6f 6e 66 69  ;.  if( g.zConfi
88c0: 67 44 62 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69  gDbName ){.    i
88d0: 6e 74 20 61 6c 72 65 61 64 79 41 74 74 61 63 68  nt alreadyAttach
88e0: 65 64 20 3d 20 64 62 5f 64 61 74 61 62 61 73 65  ed = db_database
88f0: 5f 73 6c 6f 74 28 22 63 6f 6e 66 69 67 64 62 22  _slot("configdb"
8900: 29 3e 30 3b 0a 20 20 20 20 69 66 28 20 75 73 65  )>0;.    if( use
8910: 41 74 74 61 63 68 3d 3d 61 6c 72 65 61 64 79 41  Attach==alreadyA
8920: 74 74 61 63 68 65 64 20 29 20 72 65 74 75 72 6e  ttached ) return
8930: 20 31 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 6f   1; /* Already o
8940: 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 64 62 5f 63  pen. */.    db_c
8950: 6c 6f 73 65 5f 63 6f 6e 66 69 67 28 29 3b 0a 20  lose_config();. 
8960: 20 7d 0a 20 20 7a 48 6f 6d 65 20 3d 20 66 6f 73   }.  zHome = fos
8970: 73 69 6c 5f 67 65 74 65 6e 76 28 22 46 4f 53 53  sil_getenv("FOSS
8980: 49 4c 5f 48 4f 4d 45 22 29 3b 0a 23 69 66 20 64  IL_HOME");.#if d
8990: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
89a0: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  | defined(__CYGW
89b0: 49 4e 5f 5f 29 0a 20 20 69 66 28 20 7a 48 6f 6d  IN__).  if( zHom
89c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 48 6f 6d  e==0 ){.    zHom
89d0: 65 20 3d 20 66 6f 73 73 69 6c 5f 67 65 74 65 6e  e = fossil_geten
89e0: 76 28 22 4c 4f 43 41 4c 41 50 50 44 41 54 41 22  v("LOCALAPPDATA"
89f0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 48 6f 6d 65  );.    if( zHome
8a00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 48 6f  ==0 ){.      zHo
8a10: 6d 65 20 3d 20 66 6f 73 73 69 6c 5f 67 65 74 65  me = fossil_gete
8a20: 6e 76 28 22 41 50 50 44 41 54 41 22 29 3b 0a 20  nv("APPDATA");. 
8a30: 20 20 20 20 20 69 66 28 20 7a 48 6f 6d 65 3d 3d       if( zHome==
8a40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
8a50: 72 20 2a 7a 44 72 69 76 65 20 3d 20 66 6f 73 73  r *zDrive = foss
8a60: 69 6c 5f 67 65 74 65 6e 76 28 22 48 4f 4d 45 44  il_getenv("HOMED
8a70: 52 49 56 45 22 29 3b 0a 20 20 20 20 20 20 20 20  RIVE");.        
8a80: 63 68 61 72 20 2a 7a 50 61 74 68 20 3d 20 66 6f  char *zPath = fo
8a90: 73 73 69 6c 5f 67 65 74 65 6e 76 28 22 48 4f 4d  ssil_getenv("HOM
8aa0: 45 50 41 54 48 22 29 3b 0a 20 20 20 20 20 20 20  EPATH");.       
8ab0: 20 69 66 28 20 7a 44 72 69 76 65 20 26 26 20 7a   if( zDrive && z
8ac0: 50 61 74 68 20 29 20 7a 48 6f 6d 65 20 3d 20 6d  Path ) zHome = m
8ad0: 70 72 69 6e 74 66 28 22 25 73 25 73 22 2c 20 7a  printf("%s%s", z
8ae0: 44 72 69 76 65 2c 20 7a 50 61 74 68 29 3b 0a 20  Drive, zPath);. 
8af0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8b00: 0a 20 20 69 66 28 20 7a 48 6f 6d 65 3d 3d 30 20  .  if( zHome==0 
8b10: 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 74  ){.    if( isOpt
8b20: 69 6f 6e 61 6c 20 29 20 72 65 74 75 72 6e 20 30  ional ) return 0
8b30: 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74  ;.    fossil_fat
8b40: 61 6c 28 22 63 61 6e 6e 6f 74 20 6c 6f 63 61 74  al("cannot locat
8b50: 65 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79  e home directory
8b60: 20 2d 20 70 6c 65 61 73 65 20 73 65 74 20 74 68   - please set th
8b70: 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  e ".            
8b80: 20 20 20 20 20 22 46 4f 53 53 49 4c 5f 48 4f 4d       "FOSSIL_HOM
8b90: 45 2c 20 4c 4f 43 41 4c 41 50 50 44 41 54 41 2c  E, LOCALAPPDATA,
8ba0: 20 41 50 50 44 41 54 41 2c 20 6f 72 20 48 4f 4d   APPDATA, or HOM
8bb0: 45 50 41 54 48 20 22 0a 20 20 20 20 20 20 20 20  EPATH ".        
8bc0: 20 20 20 20 20 20 20 20 20 22 65 6e 76 69 72 6f           "enviro
8bd0: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 22  nment variables"
8be0: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69  );.  }.#else.  i
8bf0: 66 28 20 7a 48 6f 6d 65 3d 3d 30 20 29 7b 0a 20  f( zHome==0 ){. 
8c00: 20 20 20 7a 48 6f 6d 65 20 3d 20 66 6f 73 73 69     zHome = fossi
8c10: 6c 5f 67 65 74 65 6e 76 28 22 48 4f 4d 45 22 29  l_getenv("HOME")
8c20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 48 6f 6d  ;.  }.  if( zHom
8c30: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
8c40: 69 73 4f 70 74 69 6f 6e 61 6c 20 29 20 72 65 74  isOptional ) ret
8c50: 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 73 73 69  urn 0;.    fossi
8c60: 6c 5f 66 61 74 61 6c 28 22 63 61 6e 6e 6f 74 20  l_fatal("cannot 
8c70: 6c 6f 63 61 74 65 20 68 6f 6d 65 20 64 69 72 65  locate home dire
8c80: 63 74 6f 72 79 20 2d 20 70 6c 65 61 73 65 20 73  ctory - please s
8c90: 65 74 20 74 68 65 20 22 0a 20 20 20 20 20 20 20  et the ".       
8ca0: 20 20 20 20 20 20 20 20 20 20 22 46 4f 53 53 49            "FOSSI
8cb0: 4c 5f 48 4f 4d 45 20 6f 72 20 48 4f 4d 45 20 65  L_HOME or HOME e
8cc0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
8cd0: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 23 65 6e 64  bles");.  }.#end
8ce0: 69 66 0a 20 20 69 66 28 20 66 69 6c 65 5f 69 73  if.  if( file_is
8cf0: 64 69 72 28 7a 48 6f 6d 65 2c 20 45 78 74 46 49  dir(zHome, ExtFI
8d00: 4c 45 29 21 3d 31 20 29 7b 0a 20 20 20 20 69 66  LE)!=1 ){.    if
8d10: 28 20 69 73 4f 70 74 69 6f 6e 61 6c 20 29 20 72  ( isOptional ) r
8d20: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 73  eturn 0;.    fos
8d30: 73 69 6c 5f 66 61 74 61 6c 28 22 69 6e 76 61 6c  sil_fatal("inval
8d40: 69 64 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72  id home director
8d50: 79 3a 20 25 73 22 2c 20 7a 48 6f 6d 65 29 3b 0a  y: %s", zHome);.
8d60: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
8d70: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
8d80: 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
8d90: 20 2f 2a 20 2e 20 66 69 6c 65 6e 61 6d 65 73 20   /* . filenames 
8da0: 67 69 76 65 20 73 6f 6d 65 20 77 69 6e 64 6f 77  give some window
8db0: 20 73 79 73 74 65 6d 73 20 70 72 6f 62 6c 65 6d   systems problem
8dc0: 73 20 61 6e 64 20 6d 61 6e 79 20 61 70 70 73 20  s and many apps 
8dd0: 70 72 6f 62 6c 65 6d 73 20 2a 2f 0a 20 20 7a 44  problems */.  zD
8de0: 62 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28  bName = mprintf(
8df0: 22 25 2f 2f 5f 66 6f 73 73 69 6c 22 2c 20 7a 48  "%//_fossil", zH
8e00: 6f 6d 65 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 44  ome);.#else.  zD
8e10: 62 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28  bName = mprintf(
8e20: 22 25 73 2f 2e 66 6f 73 73 69 6c 22 2c 20 7a 48  "%s/.fossil", zH
8e30: 6f 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  ome);.#endif.  i
8e40: 66 28 20 66 69 6c 65 5f 73 69 7a 65 28 7a 44 62  f( file_size(zDb
8e50: 4e 61 6d 65 2c 20 45 78 74 46 49 4c 45 29 3c 31  Name, ExtFILE)<1
8e60: 30 32 34 2a 33 20 29 7b 0a 20 20 20 20 69 66 28  024*3 ){.    if(
8e70: 20 66 69 6c 65 5f 61 63 63 65 73 73 28 7a 48 6f   file_access(zHo
8e80: 6d 65 2c 20 57 5f 4f 4b 29 20 29 7b 0a 20 20 20  me, W_OK) ){.   
8e90: 20 20 20 69 66 28 20 69 73 4f 70 74 69 6f 6e 61     if( isOptiona
8ea0: 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  l ) return 0;.  
8eb0: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c      fossil_fatal
8ec0: 28 22 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79  ("home directory
8ed0: 20 25 73 20 6d 75 73 74 20 62 65 20 77 72 69 74   %s must be writ
8ee0: 65 61 62 6c 65 22 2c 20 7a 48 6f 6d 65 29 3b 0a  eable", zHome);.
8ef0: 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 69 6e 69      }.    db_ini
8f00: 74 5f 64 61 74 61 62 61 73 65 28 7a 44 62 4e 61  t_database(zDbNa
8f10: 6d 65 2c 20 7a 43 6f 6e 66 69 67 53 63 68 65 6d  me, zConfigSchem
8f20: 61 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  a, (char*)0);.  
8f30: 7d 0a 20 20 69 66 28 20 66 69 6c 65 5f 61 63 63  }.  if( file_acc
8f40: 65 73 73 28 7a 44 62 4e 61 6d 65 2c 20 57 5f 4f  ess(zDbName, W_O
8f50: 4b 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  K) ){.    if( is
8f60: 4f 70 74 69 6f 6e 61 6c 20 29 20 72 65 74 75 72  Optional ) retur
8f70: 6e 20 30 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  n 0;.    fossil_
8f80: 66 61 74 61 6c 28 22 63 6f 6e 66 69 67 75 72 61  fatal("configura
8f90: 74 69 6f 6e 20 66 69 6c 65 20 25 73 20 6d 75 73  tion file %s mus
8fa0: 74 20 62 65 20 77 72 69 74 65 61 62 6c 65 22 2c  t be writeable",
8fb0: 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20   zDbName);.  }. 
8fc0: 20 69 66 28 20 75 73 65 41 74 74 61 63 68 20 29   if( useAttach )
8fd0: 7b 0a 20 20 20 20 64 62 5f 6f 70 65 6e 5f 6f 72  {.    db_open_or
8fe0: 5f 61 74 74 61 63 68 28 7a 44 62 4e 61 6d 65 2c  _attach(zDbName,
8ff0: 20 22 63 6f 6e 66 69 67 64 62 22 29 3b 0a 20 20   "configdb");.  
9000: 20 20 67 2e 64 62 43 6f 6e 66 69 67 20 3d 20 30    g.dbConfig = 0
9010: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67  ;.  }else{.    g
9020: 2e 64 62 43 6f 6e 66 69 67 20 3d 20 64 62 5f 6f  .dbConfig = db_o
9030: 70 65 6e 28 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  pen(zDbName);.  
9040: 20 20 64 62 5f 73 65 74 5f 6d 61 69 6e 5f 73 63    db_set_main_sc
9050: 68 65 6d 61 6e 61 6d 65 28 67 2e 64 62 43 6f 6e  hemaname(g.dbCon
9060: 66 69 67 2c 20 22 63 6f 6e 66 69 67 64 62 22 29  fig, "configdb")
9070: 3b 0a 20 20 7d 0a 20 20 67 2e 7a 43 6f 6e 66 69  ;.  }.  g.zConfi
9080: 67 44 62 4e 61 6d 65 20 3d 20 7a 44 62 4e 61 6d  gDbName = zDbNam
9090: 65 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  e;.  return 1;.}
90a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
90b0: 52 55 45 20 69 66 20 7a 54 61 62 6c 65 20 65 78  RUE if zTable ex
90c0: 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f  ists..*/.int db_
90d0: 74 61 62 6c 65 5f 65 78 69 73 74 73 28 0a 20 20  table_exists(.  
90e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
90f0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 3a        /* One of:
9100: 20 4e 55 4c 4c 2c 20 22 63 6f 6e 66 69 67 64 62   NULL, "configdb
9110: 22 2c 20 22 6c 6f 63 61 6c 64 62 22 2c 20 22 72  ", "localdb", "r
9120: 65 70 6f 73 69 74 6f 72 79 22 20 2a 2f 0a 20 20  epository" */.  
9130: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
9140: 6c 65 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  le    /* Name of
9150: 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 72   table */.){.  r
9160: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 74 61  eturn sqlite3_ta
9170: 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
9180: 61 74 61 28 67 2e 64 62 2c 20 7a 44 62 2c 20 7a  ata(g.db, zDb, z
9190: 54 61 62 6c 65 2c 20 30 2c 0a 20 20 20 20 20 20  Table, 0,.      
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3d   0, 0, 0, 0, 0)=
91d0: 3d 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f  =SQLITE_OK;.}../
91e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
91f0: 20 69 66 20 7a 54 61 62 6c 65 20 65 78 69 73 74   if zTable exist
9200: 73 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73 20 63  s and contains c
9210: 6f 6c 75 6d 6e 20 7a 43 6f 6c 75 6d 6e 2e 0a 2a  olumn zColumn..*
9220: 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69  * Return FALSE i
9230: 66 20 7a 54 61 62 6c 65 20 64 6f 65 73 20 6e 6f  f zTable does no
9240: 74 20 65 78 69 73 74 20 6f 72 20 69 66 20 7a 54  t exist or if zT
9250: 61 62 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 62  able exists.** b
9260: 75 74 20 6c 61 63 6b 73 20 7a 43 6f 6c 75 6d 6e  ut lacks zColumn
9270: 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 74 61 62 6c  ..*/.int db_tabl
9280: 65 5f 68 61 73 5f 63 6f 6c 75 6d 6e 28 0a 20 20  e_has_column(.  
9290: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
92a0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
92b0: 3a 20 4e 55 4c 4c 2c 20 22 63 6f 6e 66 69 67 22  : NULL, "config"
92c0: 2c 20 22 6c 6f 63 61 6c 64 62 22 2c 20 22 72 65  , "localdb", "re
92d0: 70 6f 73 69 74 6f 72 79 22 20 2a 2f 0a 20 20 63  pository" */.  c
92e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
92f0: 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e,    /* Name of
9300: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73   table */.  cons
9310: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 20  t char *zColumn 
9320: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f     /* Name of co
9330: 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 2a 2f  lumn in table */
9340: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
9350: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
9360: 6e 5f 6d 65 74 61 64 61 74 61 28 67 2e 64 62 2c  n_metadata(g.db,
9370: 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43   zDb, zTable, zC
9380: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20  olumn,.         
9390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
93b0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3d 3d 53 51   0, 0, 0, 0)==SQ
93c0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
93d0: 2a 20 52 65 74 75 72 6e 73 20 54 52 55 45 20 69  * Returns TRUE i
93e0: 66 20 7a 54 61 62 6c 65 20 65 78 69 73 74 73 20  f zTable exists 
93f0: 69 6e 20 74 68 65 20 6c 6f 63 61 6c 20 64 61 74  in the local dat
9400: 61 62 61 73 65 20 62 75 74 20 6c 61 63 6b 73 20  abase but lacks 
9410: 63 6f 6c 75 6d 6e 0a 2a 2a 20 7a 43 6f 6c 75 6d  column.** zColum
9420: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
9430: 64 62 5f 6c 6f 63 61 6c 5f 74 61 62 6c 65 5f 65  db_local_table_e
9440: 78 69 73 74 73 5f 62 75 74 5f 6c 61 63 6b 73 5f  xists_but_lacks_
9450: 63 6f 6c 75 6d 6e 28 0a 20 20 63 6f 6e 73 74 20  column(.  const 
9460: 63 68 61 72 20 2a 7a 54 61 62 6c 65 2c 0a 20 20  char *zTable,.  
9470: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
9480: 75 6d 6e 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  umn.){.  return 
9490: 64 62 5f 74 61 62 6c 65 5f 65 78 69 73 74 73 28  db_table_exists(
94a0: 22 6c 6f 63 61 6c 64 62 22 2c 20 7a 54 61 62 6c  "localdb", zTabl
94b0: 65 29 0a 20 20 20 20 20 20 26 26 20 21 64 62 5f  e).      && !db_
94c0: 74 61 62 6c 65 5f 68 61 73 5f 63 6f 6c 75 6d 6e  table_has_column
94d0: 28 22 6c 6f 63 61 6c 64 62 22 2c 20 7a 54 61 62  ("localdb", zTab
94e0: 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 29 3b 0a 7d 0a  le, zColumn);.}.
94f0: 0a 2f 2a 0a 2a 2a 20 49 66 20 7a 44 62 4e 61 6d  ./*.** If zDbNam
9500: 65 20 69 73 20 61 20 76 61 6c 69 64 20 6c 6f 63  e is a valid loc
9510: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
9520: 2c 20 6f 70 65 6e 20 69 74 20 61 6e 64 20 72 65  , open it and re
9530: 74 75 72 6e 0a 2a 2a 20 74 72 75 65 2e 20 20 49  turn.** true.  I
9540: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76 61  f it is not a va
9550: 6c 69 64 20 6c 6f 63 61 6c 20 64 61 74 61 62 61  lid local databa
9560: 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20  se file, return 
9570: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
9580: 20 69 73 56 61 6c 69 64 4c 6f 63 61 6c 44 62 28   isValidLocalDb(
9590: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
95a0: 61 6d 65 29 7b 0a 20 20 69 36 34 20 6c 73 69 7a  ame){.  i64 lsiz
95b0: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 56 46 69 6c  e;.  char *zVFil
95c0: 65 44 65 66 3b 0a 0a 20 20 69 66 28 20 66 69 6c  eDef;..  if( fil
95d0: 65 5f 61 63 63 65 73 73 28 7a 44 62 4e 61 6d 65  e_access(zDbName
95e0: 2c 20 46 5f 4f 4b 29 20 29 20 72 65 74 75 72 6e  , F_OK) ) return
95f0: 20 30 3b 0a 20 20 6c 73 69 7a 65 20 3d 20 66 69   0;.  lsize = fi
9600: 6c 65 5f 73 69 7a 65 28 7a 44 62 4e 61 6d 65 2c  le_size(zDbName,
9610: 20 45 78 74 46 49 4c 45 29 3b 0a 20 20 69 66 28   ExtFILE);.  if(
9620: 20 6c 73 69 7a 65 25 31 30 32 34 21 3d 30 20 7c   lsize%1024!=0 |
9630: 7c 20 6c 73 69 7a 65 3c 34 30 39 36 20 29 20 72  | lsize<4096 ) r
9640: 65 74 75 72 6e 20 30 3b 0a 20 20 64 62 5f 6f 70  eturn 0;.  db_op
9650: 65 6e 5f 6f 72 5f 61 74 74 61 63 68 28 7a 44 62  en_or_attach(zDb
9660: 4e 61 6d 65 2c 20 22 6c 6f 63 61 6c 64 62 22 29  Name, "localdb")
9670: 3b 0a 20 20 7a 56 46 69 6c 65 44 65 66 20 3d 20  ;.  zVFileDef = 
9680: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
9690: 43 54 20 73 71 6c 20 46 52 4f 4d 20 6c 6f 63 61  CT sql FROM loca
96a0: 6c 64 62 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  ldb.sqlite_maste
96b0: 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
96d0: 45 52 45 20 6e 61 6d 65 3d 3d 27 76 66 69 6c 65  ERE name=='vfile
96e0: 27 22 29 3b 0a 20 20 69 66 28 20 7a 56 46 69 6c  '");.  if( zVFil
96f0: 65 44 65 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  eDef==0 ) return
9700: 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   0;..  /* If the
9710: 20 22 69 73 65 78 65 22 20 63 6f 6c 75 6d 6e 20   "isexe" column 
9720: 69 73 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  is missing from 
9730: 74 68 65 20 76 66 69 6c 65 20 74 61 62 6c 65 2c  the vfile table,
9740: 20 74 68 65 6e 0a 20 20 2a 2a 20 61 64 64 20 69   then.  ** add i
9750: 74 20 6e 6f 77 2e 20 20 20 54 68 69 73 20 63 6f  t now.   This co
9760: 64 65 20 61 64 64 65 64 20 6f 6e 20 32 30 31 30  de added on 2010
9770: 2d 30 33 2d 30 36 2e 20 20 41 66 74 65 72 20 61  -03-06.  After a
9780: 6c 6c 20 75 73 65 72 73 20 68 61 76 65 0a 20 20  ll users have.  
9790: 2a 2a 20 75 70 67 72 61 64 65 64 2c 20 74 68 69  ** upgraded, thi
97a0: 73 20 63 6f 64 65 20 63 61 6e 20 62 65 20 73 61  s code can be sa
97b0: 66 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20 20  fely deleted..  
97c0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
97d0: 5f 73 74 72 67 6c 6f 62 28 22 2a 20 69 73 65 78  _strglob("* isex
97e0: 65 20 2a 22 2c 20 7a 56 46 69 6c 65 44 65 66 29  e *", zVFileDef)
97f0: 21 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f 6d 75  !=0 ){.    db_mu
9800: 6c 74 69 5f 65 78 65 63 28 22 41 4c 54 45 52 20  lti_exec("ALTER 
9810: 54 41 42 4c 45 20 76 66 69 6c 65 20 41 44 44 20  TABLE vfile ADD 
9820: 43 4f 4c 55 4d 4e 20 69 73 65 78 65 20 42 4f 4f  COLUMN isexe BOO
9830: 4c 45 41 4e 20 44 45 46 41 55 4c 54 20 30 22 29  LEAN DEFAULT 0")
9840: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 22  ;.  }..  /* If "
9850: 69 73 6c 69 6e 6b 22 2f 22 69 73 4c 69 6e 6b 22  islink"/"isLink"
9860: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6d 69 73   columns are mis
9870: 73 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 73  sing from tables
9880: 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 64 64 20  , then.  ** add 
9890: 74 68 65 6d 20 6e 6f 77 2e 20 20 20 54 68 69 73  them now.   This
98a0: 20 63 6f 64 65 20 61 64 64 65 64 20 6f 6e 20 32   code added on 2
98b0: 30 31 31 2d 30 31 2d 31 37 20 61 6e 64 20 32 30  011-01-17 and 20
98c0: 31 31 2d 30 38 2d 32 37 2e 0a 20 20 2a 2a 20 41  11-08-27..  ** A
98d0: 66 74 65 72 20 61 6c 6c 20 75 73 65 72 73 20 68  fter all users h
98e0: 61 76 65 20 75 70 67 72 61 64 65 64 2c 20 74 68  ave upgraded, th
98f0: 69 73 20 63 6f 64 65 20 63 61 6e 20 62 65 20 73  is code can be s
9900: 61 66 65 6c 79 20 64 65 6c 65 74 65 64 2e 0a 20  afely deleted.. 
9910: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
9920: 33 5f 73 74 72 67 6c 6f 62 28 22 2a 20 69 73 6c  3_strglob("* isl
9930: 69 6e 6b 20 2a 22 2c 20 7a 56 46 69 6c 65 44 65  ink *", zVFileDe
9940: 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f  f)!=0 ){.    db_
9950: 6d 75 6c 74 69 5f 65 78 65 63 28 22 41 4c 54 45  multi_exec("ALTE
9960: 52 20 54 41 42 4c 45 20 76 66 69 6c 65 20 41 44  R TABLE vfile AD
9970: 44 20 43 4f 4c 55 4d 4e 20 69 73 6c 69 6e 6b 20  D COLUMN islink 
9980: 42 4f 4f 4c 45 41 4e 20 44 45 46 41 55 4c 54 20  BOOLEAN DEFAULT 
9990: 30 22 29 3b 0a 20 20 20 20 69 66 28 20 64 62 5f  0");.    if( db_
99a0: 6c 6f 63 61 6c 5f 74 61 62 6c 65 5f 65 78 69 73  local_table_exis
99b0: 74 73 5f 62 75 74 5f 6c 61 63 6b 73 5f 63 6f 6c  ts_but_lacks_col
99c0: 75 6d 6e 28 22 73 74 61 73 68 66 69 6c 65 22 2c  umn("stashfile",
99d0: 20 22 69 73 4c 69 6e 6b 22 29 20 29 7b 0a 20 20   "isLink") ){.  
99e0: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
99f0: 63 28 22 41 4c 54 45 52 20 54 41 42 4c 45 20 73  c("ALTER TABLE s
9a00: 74 61 73 68 66 69 6c 65 20 41 44 44 20 43 4f 4c  tashfile ADD COL
9a10: 55 4d 4e 20 69 73 4c 69 6e 6b 20 42 4f 4f 4c 20  UMN isLink BOOL 
9a20: 44 45 46 41 55 4c 54 20 30 22 29 3b 0a 20 20 20  DEFAULT 0");.   
9a30: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 5f 6c 6f   }.    if( db_lo
9a40: 63 61 6c 5f 74 61 62 6c 65 5f 65 78 69 73 74 73  cal_table_exists
9a50: 5f 62 75 74 5f 6c 61 63 6b 73 5f 63 6f 6c 75 6d  _but_lacks_colum
9a60: 6e 28 22 75 6e 64 6f 22 2c 20 22 69 73 4c 69 6e  n("undo", "isLin
9a70: 6b 22 29 20 29 7b 0a 20 20 20 20 20 20 64 62 5f  k") ){.      db_
9a80: 6d 75 6c 74 69 5f 65 78 65 63 28 22 41 4c 54 45  multi_exec("ALTE
9a90: 52 20 54 41 42 4c 45 20 75 6e 64 6f 20 41 44 44  R TABLE undo ADD
9aa0: 20 43 4f 4c 55 4d 4e 20 69 73 4c 69 6e 6b 20 42   COLUMN isLink B
9ab0: 4f 4f 4c 45 41 4e 20 44 45 46 41 55 4c 54 20 30  OOLEAN DEFAULT 0
9ac0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
9ad0: 28 20 64 62 5f 6c 6f 63 61 6c 5f 74 61 62 6c 65  ( db_local_table
9ae0: 5f 65 78 69 73 74 73 5f 62 75 74 5f 6c 61 63 6b  _exists_but_lack
9af0: 73 5f 63 6f 6c 75 6d 6e 28 22 75 6e 64 6f 5f 76  s_column("undo_v
9b00: 66 69 6c 65 22 2c 20 22 69 73 6c 69 6e 6b 22 29  file", "islink")
9b10: 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 6d 75 6c   ){.      db_mul
9b20: 74 69 5f 65 78 65 63 28 22 41 4c 54 45 52 20 54  ti_exec("ALTER T
9b30: 41 42 4c 45 20 75 6e 64 6f 5f 76 66 69 6c 65 20  ABLE undo_vfile 
9b40: 41 44 44 20 43 4f 4c 55 4d 4e 20 69 73 6c 69 6e  ADD COLUMN islin
9b50: 6b 20 42 4f 4f 4c 20 44 45 46 41 55 4c 54 20 30  k BOOL DEFAULT 0
9b60: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
9b70: 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 56 46 69  fossil_free(zVFi
9b80: 6c 65 44 65 66 29 3b 0a 20 20 72 65 74 75 72 6e  leDef);.  return
9b90: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   1;.}../*.** Loc
9ba0: 61 74 65 20 74 68 65 20 72 6f 6f 74 20 64 69 72  ate the root dir
9bb0: 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6c 6f  ectory of the lo
9bc0: 63 61 6c 20 72 65 70 6f 73 69 74 6f 72 79 20 74  cal repository t
9bd0: 72 65 65 2e 20 20 54 68 65 20 72 6f 6f 74 0a 2a  ree.  The root.*
9be0: 2a 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 66  * directory is f
9bf0: 6f 75 6e 64 20 62 79 20 73 65 61 72 63 68 69 6e  ound by searchin
9c00: 67 20 66 6f 72 20 61 20 66 69 6c 65 20 6e 61 6d  g for a file nam
9c10: 65 64 20 22 5f 46 4f 53 53 49 4c 5f 22 20 6f 72  ed "_FOSSIL_" or
9c20: 20 22 2e 66 73 6c 63 6b 6f 75 74 22 0a 2a 2a 20   ".fslckout".** 
9c30: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
9c40: 76 61 6c 69 64 20 72 65 70 6f 73 69 74 6f 72 79  valid repository
9c50: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
9c60: 20 46 6f 72 20 6c 65 67 61 63 79 2c 20 61 6c 73   For legacy, als
9c70: 6f 20 6c 6f 6f 6b 20 66 6f 72 20 22 2e 66 6f 73  o look for ".fos
9c80: 22 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 22  ".  The use of "
9c90: 2e 66 6f 73 22 20 69 73 20 64 65 70 72 65 63 61  .fos" is depreca
9ca0: 74 65 64 0a 2a 2a 20 73 69 6e 63 65 20 22 66 6f  ted.** since "fo
9cb0: 73 22 20 68 61 73 20 6e 65 67 61 74 69 76 65 20  s" has negative 
9cc0: 63 6f 6e 6e 6f 74 61 74 69 6f 6e 73 20 69 6e 20  connotations in 
9cd0: 48 75 6e 67 61 72 69 61 6e 2c 20 77 65 20 61 72  Hungarian, we ar
9ce0: 65 20 74 6f 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  e told..**.** If
9cf0: 20 6e 6f 20 76 61 6c 69 64 20 5f 46 4f 53 53 49   no valid _FOSSI
9d00: 4c 5f 20 6f 72 20 2e 66 73 6c 63 6b 6f 75 74 20  L_ or .fslckout 
9d10: 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2c 20 77  file is found, w
9d20: 65 20 6d 6f 76 65 20 75 70 20 6f 6e 65 20 6c 65  e move up one le
9d30: 76 65 6c 20 61 6e 64 0a 2a 2a 20 74 72 79 20 61  vel and.** try a
9d40: 67 61 69 6e 2e 20 4f 6e 63 65 20 74 68 65 20 66  gain. Once the f
9d50: 69 6c 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ile is found, th
9d60: 65 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 20 76  e g.zLocalRoot v
9d70: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 0a 2a  ariable is set.*
9d80: 2a 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66  * to the root of
9d90: 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20   the repository 
9da0: 74 72 65 65 20 61 6e 64 20 74 68 69 73 20 72 6f  tree and this ro
9db0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
9dc0: 20 20 49 66 0a 2a 2a 20 6e 6f 20 64 61 74 61 62    If.** no datab
9dd0: 61 73 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ase is found, th
9de0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
9df0: 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
9e00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77  This routine alw
9e10: 61 79 73 20 6f 70 65 6e 73 20 74 68 65 20 75 73  ays opens the us
9e20: 65 72 20 64 61 74 61 62 61 73 65 20 72 65 67 61  er database rega
9e30: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
9e40: 72 20 6f 72 0a 2a 2a 20 6e 6f 74 20 74 68 65 20  r or.** not the 
9e50: 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61 62  repository datab
9e60: 61 73 65 20 69 73 20 66 6f 75 6e 64 2e 20 20 49  ase is found.  I
9e70: 66 20 74 68 65 20 5f 46 4f 53 53 49 4c 5f 20 6f  f the _FOSSIL_ o
9e80: 72 20 2e 66 73 6c 63 6b 6f 75 74 20 66 69 6c 65  r .fslckout file
9e90: 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 2c 20 69 74  .** is found, it
9ea0: 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20   is attached to 
9eb0: 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
9ec0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 6f  e connection too
9ed0: 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 6f 70 65 6e  ..*/.int db_open
9ee0: 5f 6c 6f 63 61 6c 28 63 6f 6e 73 74 20 63 68 61  _local(const cha
9ef0: 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69  r *zDbName){.  i
9f00: 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68 61 72 20  nt i, n;.  char 
9f10: 7a 50 77 64 5b 32 30 30 30 5d 3b 0a 20 20 73 74  zPwd[2000];.  st
9f20: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
9f30: 2a 28 61 44 62 4e 61 6d 65 5b 5d 29 20 3d 20 7b  *(aDbName[]) = {
9f40: 20 22 5f 46 4f 53 53 49 4c 5f 22 2c 20 22 2e 66   "_FOSSIL_", ".f
9f50: 73 6c 63 6b 6f 75 74 22 2c 20 22 2e 66 6f 73 22  slckout", ".fos"
9f60: 20 7d 3b 0a 0a 20 20 69 66 28 20 67 2e 6c 6f 63   };..  if( g.loc
9f70: 61 6c 4f 70 65 6e 20 29 20 72 65 74 75 72 6e 20  alOpen ) return 
9f80: 31 3b 0a 20 20 66 69 6c 65 5f 67 65 74 63 77 64  1;.  file_getcwd
9f90: 28 7a 50 77 64 2c 20 73 69 7a 65 6f 66 28 7a 50  (zPwd, sizeof(zP
9fa0: 77 64 29 2d 32 30 29 3b 0a 20 20 6e 20 3d 20 73  wd)-20);.  n = s
9fb0: 74 72 6c 65 6e 28 7a 50 77 64 29 3b 0a 20 20 77  trlen(zPwd);.  w
9fc0: 68 69 6c 65 28 20 6e 3e 30 20 29 7b 0a 20 20 20  hile( n>0 ){.   
9fd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f 75 6e   for(i=0; i<coun
9fe0: 74 28 61 44 62 4e 61 6d 65 29 3b 20 69 2b 2b 29  t(aDbName); i++)
9ff0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
a000: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
a010: 7a 50 77 64 29 2d 6e 2c 20 26 7a 50 77 64 5b 6e  zPwd)-n, &zPwd[n
a020: 5d 2c 20 22 2f 25 73 22 2c 20 61 44 62 4e 61 6d  ], "/%s", aDbNam
a030: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  e[i]);.      if(
a040: 20 69 73 56 61 6c 69 64 4c 6f 63 61 6c 44 62 28   isValidLocalDb(
a050: 7a 50 77 64 29 20 29 7b 0a 20 20 20 20 20 20 20  zPwd) ){.       
a060: 20 69 66 28 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e   if( db_open_con
a070: 66 69 67 28 30 2c 20 31 29 3d 3d 30 20 29 7b 0a  fig(0, 1)==0 ){.
a080: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a090: 20 30 3b 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61   0; /* Configura
a0a0: 74 69 6f 6e 20 63 6f 75 6c 64 20 6e 6f 74 20 62  tion could not b
a0b0: 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20  e opened */.    
a0c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
a0d0: 20 46 6f 75 6e 64 20 61 20 76 61 6c 69 64 20 63   Found a valid c
a0e0: 68 65 63 6b 6f 75 74 20 64 61 74 61 62 61 73 65  heckout database
a0f0: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20   file */.       
a100: 20 67 2e 7a 4c 6f 63 61 6c 44 62 4e 61 6d 65 20   g.zLocalDbName 
a110: 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  = mprintf("%s", 
a120: 7a 50 77 64 29 3b 0a 20 20 20 20 20 20 20 20 7a  zPwd);.        z
a130: 50 77 64 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  Pwd[n] = 0;.    
a140: 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26      while( n>0 &
a150: 26 20 7a 50 77 64 5b 6e 2d 31 5d 3d 3d 27 2f 27  & zPwd[n-1]=='/'
a160: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 2d   ){.          n-
a170: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 50 77  -;.          zPw
a180: 64 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  d[n] = 0;.      
a190: 20 20 7d 0a 20 20 20 20 20 20 20 20 67 2e 7a 4c    }.        g.zL
a1a0: 6f 63 61 6c 52 6f 6f 74 20 3d 20 6d 70 72 69 6e  ocalRoot = mprin
a1b0: 74 66 28 22 25 73 2f 22 2c 20 7a 50 77 64 29 3b  tf("%s/", zPwd);
a1c0: 0a 20 20 20 20 20 20 20 20 67 2e 6c 6f 63 61 6c  .        g.local
a1d0: 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
a1e0: 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69    db_open_reposi
a1f0: 74 6f 72 79 28 7a 44 62 4e 61 6d 65 29 3b 0a 20  tory(zDbName);. 
a200: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
a210: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a220: 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 77 68 69 6c     n--;.    whil
a230: 65 28 20 6e 3e 31 20 26 26 20 7a 50 77 64 5b 6e  e( n>1 && zPwd[n
a240: 5d 21 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d  ]!='/' ){ n--; }
a250: 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 31 20  .    while( n>1 
a260: 26 26 20 7a 50 77 64 5b 6e 2d 31 5d 3d 3d 27 2f  && zPwd[n-1]=='/
a270: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ n--; }.    
a280: 7a 50 77 64 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d  zPwd[n] = 0;.  }
a290: 0a 0a 20 20 2f 2a 20 41 20 63 68 65 63 6b 6f 75  ..  /* A checkou
a2a0: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  t database file 
a2b0: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 6f 75  could not be fou
a2c0: 6e 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30  nd */.  return 0
a2d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74  ;.}../*.** Get t
a2e0: 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
a2f0: 20 74 6f 20 74 68 65 20 72 65 70 6f 73 69 74 6f   to the reposito
a300: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
a310: 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20  .  The.** local 
a320: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 5f 46  database (the _F
a330: 4f 53 53 49 4c 5f 20 6f 72 20 2e 66 73 6c 63 6b  OSSIL_ or .fslck
a340: 6f 75 74 20 64 61 74 61 62 61 73 65 29 20 6d 75  out database) mu
a350: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  st have already.
a360: 2a 2a 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62  ** been opened b
a370: 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
a380: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
a390: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 5f  .const char *db_
a3a0: 72 65 70 6f 73 69 74 6f 72 79 5f 66 69 6c 65 6e  repository_filen
a3b0: 61 6d 65 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  ame(void){.  sta
a3c0: 74 69 63 20 63 68 61 72 20 2a 7a 52 65 70 6f 20  tic char *zRepo 
a3d0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 67  = 0;.  assert( g
a3e0: 2e 6c 6f 63 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  .localOpen );.  
a3f0: 61 73 73 65 72 74 28 20 67 2e 7a 4c 6f 63 61 6c  assert( g.zLocal
a400: 52 6f 6f 74 20 29 3b 0a 20 20 69 66 28 20 7a 52  Root );.  if( zR
a410: 65 70 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 52  epo==0 ){.    zR
a420: 65 70 6f 20 3d 20 64 62 5f 6c 67 65 74 28 22 72  epo = db_lget("r
a430: 65 70 6f 73 69 74 6f 72 79 22 2c 20 30 29 3b 0a  epository", 0);.
a440: 20 20 20 20 69 66 28 20 7a 52 65 70 6f 20 26 26      if( zRepo &&
a450: 20 21 66 69 6c 65 5f 69 73 5f 61 62 73 6f 6c 75   !file_is_absolu
a460: 74 65 5f 70 61 74 68 28 7a 52 65 70 6f 29 20 29  te_path(zRepo) )
a470: 7b 0a 20 20 20 20 20 20 7a 52 65 70 6f 20 3d 20  {.      zRepo = 
a480: 6d 70 72 69 6e 74 66 28 22 25 73 25 73 22 2c 20  mprintf("%s%s", 
a490: 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 2c 20 7a 52  g.zLocalRoot, zR
a4a0: 65 70 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  epo);.    }.  }.
a4b0: 20 20 72 65 74 75 72 6e 20 7a 52 65 70 6f 3b 0a    return zRepo;.
a4c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  }../*.** Returns
a4d0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
a4e0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
a4f0: 6f 72 20 74 68 65 20 22 61 6c 6c 6f 77 2d 73 79  or the "allow-sy
a500: 6d 6c 69 6e 6b 73 22 20 73 65 74 74 69 6e 67 0a  mlinks" setting.
a510: 2a 2a 20 69 73 20 22 6f 6e 22 2e 20 20 57 68 65  ** is "on".  Whe
a520: 6e 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 74 68  n on Windows, th
a530: 69 73 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  is always return
a540: 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20  s false..*/.int 
a550: 64 62 5f 61 6c 6c 6f 77 5f 73 79 6d 6c 69 6e 6b  db_allow_symlink
a560: 73 5f 62 79 5f 64 65 66 61 75 6c 74 28 76 6f 69  s_by_default(voi
a570: 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  d){.#if defined(
a580: 5f 57 49 4e 33 32 29 0a 20 20 72 65 74 75 72 6e  _WIN32).  return
a590: 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75   0;.#else.  retu
a5a0: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
a5b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f  /*.** Returns no
a5c0: 6e 2d 7a 65 72 6f 20 69 66 20 73 75 70 70 6f 72  n-zero if suppor
a5d0: 74 20 66 6f 72 20 73 79 6d 6c 69 6e 6b 73 20 69  t for symlinks i
a5e0: 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6e 61 62  s currently enab
a5f0: 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 61  led..*/.int db_a
a600: 6c 6c 6f 77 5f 73 79 6d 6c 69 6e 6b 73 28 76 6f  llow_symlinks(vo
a610: 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 2e  id){.  return g.
a620: 61 6c 6c 6f 77 53 79 6d 6c 69 6e 6b 73 3b 0a 7d  allowSymlinks;.}
a630: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
a640: 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61   repository data
a650: 62 61 73 65 20 67 69 76 65 6e 20 62 79 20 7a 44  base given by zD
a660: 62 4e 61 6d 65 2e 20 20 49 66 20 7a 44 62 4e 61  bName.  If zDbNa
a670: 6d 65 3d 3d 4e 55 4c 4c 20 74 68 65 6e 0a 2a 2a  me==NULL then.**
a680: 20 67 65 74 20 74 68 65 20 6e 61 6d 65 20 66 72   get the name fr
a690: 6f 6d 20 74 68 65 20 61 6c 72 65 61 64 79 20 6f  om the already o
a6a0: 70 65 6e 20 6c 6f 63 61 6c 20 64 61 74 61 62 61  pen local databa
a6b0: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 6f  se..*/.void db_o
a6c0: 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 63  pen_repository(c
a6d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
a6e0: 6d 65 29 7b 0a 20 20 69 66 28 20 67 2e 72 65 70  me){.  if( g.rep
a6f0: 6f 73 69 74 6f 72 79 4f 70 65 6e 20 29 20 72 65  ositoryOpen ) re
a700: 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a 44 62 4e  turn;.  if( zDbN
a710: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ame==0 ){.    if
a720: 28 20 67 2e 6c 6f 63 61 6c 4f 70 65 6e 20 29 7b  ( g.localOpen ){
a730: 0a 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d  .      zDbName =
a740: 20 64 62 5f 72 65 70 6f 73 69 74 6f 72 79 5f 66   db_repository_f
a750: 69 6c 65 6e 61 6d 65 28 29 3b 0a 20 20 20 20 7d  ilename();.    }
a760: 0a 20 20 20 20 69 66 28 20 7a 44 62 4e 61 6d 65  .    if( zDbName
a770: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 62 5f  ==0 ){.      db_
a780: 65 72 72 28 22 75 6e 61 62 6c 65 20 74 6f 20 66  err("unable to f
a790: 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ind the name of 
a7a0: 61 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74  a repository dat
a7b0: 61 62 61 73 65 22 29 3b 0a 20 20 20 20 7d 0a 20  abase");.    }. 
a7c0: 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 5f 61 63   }.  if( file_ac
a7d0: 63 65 73 73 28 7a 44 62 4e 61 6d 65 2c 20 52 5f  cess(zDbName, R_
a7e0: 4f 4b 29 20 7c 7c 20 66 69 6c 65 5f 73 69 7a 65  OK) || file_size
a7f0: 28 7a 44 62 4e 61 6d 65 2c 20 45 78 74 46 49 4c  (zDbName, ExtFIL
a800: 45 29 3c 31 30 32 34 20 29 7b 0a 20 20 20 20 69  E)<1024 ){.    i
a810: 66 28 20 66 69 6c 65 5f 61 63 63 65 73 73 28 7a  f( file_access(z
a820: 44 62 4e 61 6d 65 2c 20 46 5f 4f 4b 29 20 29 7b  DbName, F_OK) ){
a830: 0a 23 69 66 64 65 66 20 46 4f 53 53 49 4c 5f 45  .#ifdef FOSSIL_E
a840: 4e 41 42 4c 45 5f 4a 53 4f 4e 0a 20 20 20 20 20  NABLE_JSON.     
a850: 20 67 2e 6a 73 6f 6e 2e 72 65 73 75 6c 74 43 6f   g.json.resultCo
a860: 64 65 20 3d 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f  de = FSL_JSON_E_
a870: 44 42 5f 4e 4f 54 5f 46 4f 55 4e 44 3b 0a 23 65  DB_NOT_FOUND;.#e
a880: 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 73 73 69  ndif.      fossi
a890: 6c 5f 70 61 6e 69 63 28 22 72 65 70 6f 73 69 74  l_panic("reposit
a8a0: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ory does not exi
a8b0: 73 74 20 6f 72 22 0a 20 20 20 20 20 20 20 20 20  st or".         
a8c0: 20 20 20 20 20 20 20 20 20 20 22 20 69 73 20 69            " is i
a8d0: 6e 20 61 6e 20 75 6e 72 65 61 64 61 62 6c 65 20  n an unreadable 
a8e0: 64 69 72 65 63 74 6f 72 79 3a 20 25 73 22 2c 20  directory: %s", 
a8f0: 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  zDbName);.    }e
a900: 6c 73 65 20 69 66 28 20 66 69 6c 65 5f 61 63 63  lse if( file_acc
a910: 65 73 73 28 7a 44 62 4e 61 6d 65 2c 20 52 5f 4f  ess(zDbName, R_O
a920: 4b 29 20 29 7b 0a 23 69 66 64 65 66 20 46 4f 53  K) ){.#ifdef FOS
a930: 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 0a  SIL_ENABLE_JSON.
a940: 20 20 20 20 20 20 67 2e 6a 73 6f 6e 2e 72 65 73        g.json.res
a950: 75 6c 74 43 6f 64 65 20 3d 20 46 53 4c 5f 4a 53  ultCode = FSL_JS
a960: 4f 4e 5f 45 5f 44 45 4e 49 45 44 3b 0a 23 65 6e  ON_E_DENIED;.#en
a970: 64 69 66 0a 20 20 20 20 20 20 66 6f 73 73 69 6c  dif.      fossil
a980: 5f 70 61 6e 69 63 28 22 72 65 61 64 20 70 65 72  _panic("read per
a990: 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 20 66  mission denied f
a9a0: 6f 72 20 72 65 70 6f 73 69 74 6f 72 79 20 25 73  or repository %s
a9b0: 22 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 20  ", zDbName);.   
a9c0: 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 46   }else{.#ifdef F
a9d0: 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f  OSSIL_ENABLE_JSO
a9e0: 4e 0a 20 20 20 20 20 20 67 2e 6a 73 6f 6e 2e 72  N.      g.json.r
a9f0: 65 73 75 6c 74 43 6f 64 65 20 3d 20 46 53 4c 5f  esultCode = FSL_
aa00: 4a 53 4f 4e 5f 45 5f 44 42 5f 4e 4f 54 5f 56 41  JSON_E_DB_NOT_VA
aa10: 4c 49 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LID;.#endif.    
aa20: 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22    fossil_panic("
aa30: 6e 6f 74 20 61 20 76 61 6c 69 64 20 72 65 70 6f  not a valid repo
aa40: 73 69 74 6f 72 79 3a 20 25 73 22 2c 20 7a 44 62  sitory: %s", zDb
aa50: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
aa60: 0a 20 20 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79  .  g.zRepository
aa70: 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22  Name = mprintf("
aa80: 25 73 22 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  %s", zDbName);. 
aa90: 20 64 62 5f 6f 70 65 6e 5f 6f 72 5f 61 74 74 61   db_open_or_atta
aaa0: 63 68 28 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79  ch(g.zRepository
aab0: 4e 61 6d 65 2c 20 22 72 65 70 6f 73 69 74 6f 72  Name, "repositor
aac0: 79 22 29 3b 0a 20 20 67 2e 72 65 70 6f 73 69 74  y");.  g.reposit
aad0: 6f 72 79 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 2f  oryOpen = 1;.  /
aae0: 2a 20 43 61 63 68 65 20 22 61 6c 6c 6f 77 2d 73  * Cache "allow-s
aaf0: 79 6d 6c 69 6e 6b 73 22 20 6f 70 74 69 6f 6e 2c  ymlinks" option,
ab00: 20 62 65 63 61 75 73 65 20 77 65 27 6c 6c 20 6e   because we'll n
ab10: 65 65 64 20 69 74 20 6f 6e 20 65 76 65 72 79 20  eed it on every 
ab20: 73 74 61 74 20 63 61 6c 6c 20 2a 2f 0a 20 20 67  stat call */.  g
ab30: 2e 61 6c 6c 6f 77 53 79 6d 6c 69 6e 6b 73 20 3d  .allowSymlinks =
ab40: 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28   db_get_boolean(
ab50: 22 61 6c 6c 6f 77 2d 73 79 6d 6c 69 6e 6b 73 22  "allow-symlinks"
ab60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab80: 20 20 20 20 20 64 62 5f 61 6c 6c 6f 77 5f 73 79       db_allow_sy
ab90: 6d 6c 69 6e 6b 73 5f 62 79 5f 64 65 66 61 75 6c  mlinks_by_defaul
aba0: 74 28 29 29 3b 0a 20 20 67 2e 7a 41 75 78 53 63  t());.  g.zAuxSc
abb0: 68 65 6d 61 20 3d 20 64 62 5f 67 65 74 28 22 61  hema = db_get("a
abc0: 75 78 2d 73 63 68 65 6d 61 22 2c 22 22 29 3b 0a  ux-schema","");.
abd0: 20 20 67 2e 65 48 61 73 68 50 6f 6c 69 63 79 20    g.eHashPolicy 
abe0: 3d 20 64 62 5f 67 65 74 5f 69 6e 74 28 22 68 61  = db_get_int("ha
abf0: 73 68 2d 70 6f 6c 69 63 79 22 2c 2d 31 29 3b 0a  sh-policy",-1);.
ac00: 20 20 69 66 28 20 67 2e 65 48 61 73 68 50 6f 6c    if( g.eHashPol
ac10: 69 63 79 3c 30 20 29 7b 0a 20 20 20 20 67 2e 65  icy<0 ){.    g.e
ac20: 48 61 73 68 50 6f 6c 69 63 79 20 3d 20 68 6e 61  HashPolicy = hna
ac30: 6d 65 5f 64 65 66 61 75 6c 74 5f 70 6f 6c 69 63  me_default_polic
ac40: 79 28 29 3b 0a 20 20 20 20 64 62 5f 73 65 74 5f  y();.    db_set_
ac50: 69 6e 74 28 22 68 61 73 68 2d 70 6f 6c 69 63 79  int("hash-policy
ac60: 22 2c 20 67 2e 65 48 61 73 68 50 6f 6c 69 63 79  ", g.eHashPolicy
ac70: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
ac80: 4d 61 6b 65 20 61 20 63 68 61 6e 67 65 20 74 6f  Make a change to
ac90: 20 74 68 65 20 43 48 45 43 4b 20 63 6f 6e 73 74   the CHECK const
aca0: 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 42 4c 4f  raint on the BLO
acb0: 42 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a  B table for.  **
acc0: 20 76 65 72 73 69 6f 6e 20 32 2e 30 20 61 6e 64   version 2.0 and
acd0: 20 6c 61 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 72   later..  */.  r
ace0: 65 62 75 69 6c 64 5f 73 63 68 65 6d 61 5f 75 70  ebuild_schema_up
acf0: 64 61 74 65 5f 32 5f 30 28 29 3b 20 20 20 2f 2a  date_2_0();   /*
ad00: 20 44 6f 20 74 68 65 20 46 6f 73 73 69 6c 2d 32   Do the Fossil-2
ad10: 2e 30 20 73 63 68 65 6d 61 20 75 70 64 61 74 65  .0 schema update
ad20: 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  s */.}../*.** Fl
ad30: 61 67 73 20 66 6f 72 20 74 68 65 20 64 62 5f 66  ags for the db_f
ad40: 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f 72 65 70  ind_and_open_rep
ad50: 6f 73 69 74 6f 72 79 28 29 20 66 75 6e 63 74 69  ository() functi
ad60: 6f 6e 2e 0a 2a 2f 0a 23 69 66 20 49 4e 54 45 52  on..*/.#if INTER
ad70: 46 41 43 45 0a 23 64 65 66 69 6e 65 20 4f 50 45  FACE.#define OPE
ad80: 4e 5f 4f 4b 5f 4e 4f 54 5f 46 4f 55 4e 44 20 20  N_OK_NOT_FOUND  
ad90: 20 20 30 78 30 30 31 20 20 20 20 20 20 2f 2a 20    0x001      /* 
ada0: 44 6f 20 6e 6f 74 20 65 72 72 6f 72 20 6f 75 74  Do not error out
adb0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 20 2a 2f   if not found */
adc0: 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f 41 4e  .#define OPEN_AN
add0: 59 5f 53 43 48 45 4d 41 20 20 20 20 20 20 30 78  Y_SCHEMA      0x
ade0: 30 30 32 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  002      /* Do n
adf0: 6f 74 20 65 72 72 6f 72 20 69 66 20 73 63 68 65  ot error if sche
ae00: 6d 61 20 69 73 20 77 72 6f 6e 67 20 2a 2f 0a 23  ma is wrong */.#
ae10: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  endif../*.** Try
ae20: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 72 65 70   to find the rep
ae30: 6f 73 69 74 6f 72 79 20 61 6e 64 20 6f 70 65 6e  ository and open
ae40: 20 69 74 2e 20 20 55 73 65 20 74 68 65 20 2d 52   it.  Use the -R
ae50: 20 6f 72 20 2d 2d 72 65 70 6f 73 69 74 6f 72 79   or --repository
ae60: 0a 2a 2a 20 6f 70 74 69 6f 6e 20 74 6f 20 6c 6f  .** option to lo
ae70: 63 61 74 65 20 74 68 65 20 72 65 70 6f 73 69 74  cate the reposit
ae80: 6f 72 79 2e 20 20 49 66 20 6e 6f 20 73 75 63 68  ory.  If no such
ae90: 20 6f 70 74 69 6f 6e 20 69 73 20 61 76 61 69 6c   option is avail
aea0: 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 75 73  able, then.** us
aeb0: 65 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79  e the repository
aec0: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 63 68 65   of the open che
aed0: 63 6b 6f 75 74 20 69 66 20 74 68 65 72 65 20 69  ckout if there i
aee0: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 45 72 72  s one..**.** Err
aef0: 6f 72 20 6f 75 74 20 69 66 20 74 68 65 20 72 65  or out if the re
af00: 70 6f 73 69 74 6f 72 79 20 63 61 6e 6e 6f 74 20  pository cannot 
af10: 62 65 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f  be opened..*/.vo
af20: 69 64 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f  id db_find_and_o
af30: 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 69  pen_repository(i
af40: 6e 74 20 62 46 6c 61 67 73 2c 20 69 6e 74 20 6e  nt bFlags, int n
af50: 41 72 67 55 73 65 64 29 7b 0a 20 20 63 6f 6e 73  ArgUsed){.  cons
af60: 74 20 63 68 61 72 20 2a 7a 52 65 70 20 3d 20 66  t char *zRep = f
af70: 69 6e 64 5f 72 65 70 6f 73 69 74 6f 72 79 5f 6f  ind_repository_o
af80: 70 74 69 6f 6e 28 29 3b 0a 20 20 69 66 28 20 7a  ption();.  if( z
af90: 52 65 70 20 26 26 20 66 69 6c 65 5f 69 73 64 69  Rep && file_isdi
afa0: 72 28 7a 52 65 70 2c 20 45 78 74 46 49 4c 45 29  r(zRep, ExtFILE)
afb0: 3d 3d 31 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ==1 ){.    goto 
afc0: 72 65 70 5f 6e 6f 74 5f 66 6f 75 6e 64 3b 0a 20  rep_not_found;. 
afd0: 20 7d 0a 20 20 69 66 28 20 7a 52 65 70 3d 3d 30   }.  if( zRep==0
afe0: 20 26 26 20 6e 41 72 67 55 73 65 64 20 26 26 20   && nArgUsed && 
aff0: 67 2e 61 72 67 63 3d 3d 6e 41 72 67 55 73 65 64  g.argc==nArgUsed
b000: 2b 31 20 29 7b 0a 20 20 20 20 7a 52 65 70 20 3d  +1 ){.    zRep =
b010: 20 67 2e 61 72 67 76 5b 6e 41 72 67 55 73 65 64   g.argv[nArgUsed
b020: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 52 65  ];.  }.  if( zRe
b030: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  p==0 ){.    if( 
b040: 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 30 29  db_open_local(0)
b050: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
b060: 6f 20 72 65 70 5f 6e 6f 74 5f 66 6f 75 6e 64 3b  o rep_not_found;
b070: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 70 20  .    }.    zRep 
b080: 3d 20 64 62 5f 72 65 70 6f 73 69 74 6f 72 79 5f  = db_repository_
b090: 66 69 6c 65 6e 61 6d 65 28 29 3b 0a 20 20 20 20  filename();.    
b0a0: 69 66 28 20 7a 52 65 70 3d 3d 30 20 29 7b 0a 20  if( zRep==0 ){. 
b0b0: 20 20 20 20 20 67 6f 74 6f 20 72 65 70 5f 6e 6f       goto rep_no
b0c0: 74 5f 66 6f 75 6e 64 3b 0a 20 20 20 20 7d 0a 20  t_found;.    }. 
b0d0: 20 7d 0a 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70   }.  db_open_rep
b0e0: 6f 73 69 74 6f 72 79 28 7a 52 65 70 29 3b 0a 20  ository(zRep);. 
b0f0: 20 69 66 28 20 67 2e 72 65 70 6f 73 69 74 6f 72   if( g.repositor
b100: 79 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  yOpen ){.    if(
b110: 20 28 62 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f   (bFlags & OPEN_
b120: 41 4e 59 5f 53 43 48 45 4d 41 29 3d 3d 30 20 29  ANY_SCHEMA)==0 )
b130: 20 64 62 5f 76 65 72 69 66 79 5f 73 63 68 65 6d   db_verify_schem
b140: 61 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  a();.    return;
b150: 0a 20 20 7d 0a 72 65 70 5f 6e 6f 74 5f 66 6f 75  .  }.rep_not_fou
b160: 6e 64 3a 0a 20 20 69 66 28 20 28 62 46 6c 61 67  nd:.  if( (bFlag
b170: 73 20 26 20 4f 50 45 4e 5f 4f 4b 5f 4e 4f 54 5f  s & OPEN_OK_NOT_
b180: 46 4f 55 4e 44 29 3d 3d 30 20 29 7b 0a 23 69 66  FOUND)==0 ){.#if
b190: 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c  def FOSSIL_ENABL
b1a0: 45 5f 4a 53 4f 4e 0a 20 20 20 20 67 2e 6a 73 6f  E_JSON.    g.jso
b1b0: 6e 2e 72 65 73 75 6c 74 43 6f 64 65 20 3d 20 46  n.resultCode = F
b1c0: 53 4c 5f 4a 53 4f 4e 5f 45 5f 44 42 5f 4e 4f 54  SL_JSON_E_DB_NOT
b1d0: 5f 46 4f 55 4e 44 3b 0a 23 65 6e 64 69 66 0a 20  _FOUND;.#endif. 
b1e0: 20 20 20 69 66 28 20 6e 41 72 67 55 73 65 64 3d     if( nArgUsed=
b1f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73  =0 ){.      foss
b200: 69 6c 5f 66 61 74 61 6c 28 22 75 73 65 20 2d 2d  il_fatal("use --
b210: 72 65 70 6f 73 69 74 6f 72 79 20 6f 72 20 2d 52  repository or -R
b220: 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 65 20   to specify the 
b230: 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61 62  repository datab
b240: 61 73 65 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ase");.    }else
b250: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66  {.      fossil_f
b260: 61 74 61 6c 28 22 73 70 65 63 69 66 79 20 74 68  atal("specify th
b270: 65 20 72 65 70 6f 73 69 74 6f 72 79 20 6e 61 6d  e repository nam
b280: 65 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c  e as a command-l
b290: 69 6e 65 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a  ine argument");.
b2a0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
b2b0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
b2c0: 66 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  f the schema is 
b2d0: 6f 75 74 2d 6f 66 2d 64 61 74 65 0a 2a 2f 0a 69  out-of-date.*/.i
b2e0: 6e 74 20 64 62 5f 73 63 68 65 6d 61 5f 69 73 5f  nt db_schema_is_
b2f0: 6f 75 74 6f 66 64 61 74 65 28 76 6f 69 64 29 7b  outofdate(void){
b300: 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70  .  return strcmp
b310: 28 67 2e 7a 41 75 78 53 63 68 65 6d 61 2c 41 55  (g.zAuxSchema,AU
b320: 58 5f 53 43 48 45 4d 41 5f 4d 49 4e 29 3c 30 0a  X_SCHEMA_MIN)<0.
b330: 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28        || strcmp(
b340: 67 2e 7a 41 75 78 53 63 68 65 6d 61 2c 41 55 58  g.zAuxSchema,AUX
b350: 5f 53 43 48 45 4d 41 5f 4d 41 58 29 3e 30 3b 0a  _SCHEMA_MAX)>0;.
b360: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
b370: 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61  true if the data
b380: 62 61 73 65 20 69 73 20 77 72 69 74 65 61 62 6c  base is writeabl
b390: 65 0a 2a 2f 0a 69 6e 74 20 64 62 5f 69 73 5f 77  e.*/.int db_is_w
b3a0: 72 69 74 65 61 62 6c 65 28 63 6f 6e 73 74 20 63  riteable(const c
b3b0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 72  har *zName){.  r
b3c0: 65 74 75 72 6e 20 67 2e 64 62 21 3d 30 20 26 26  eturn g.db!=0 &&
b3d0: 20 21 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61   !sqlite3_db_rea
b3e0: 64 6f 6e 6c 79 28 67 2e 64 62 2c 20 7a 4e 61 6d  donly(g.db, zNam
b3f0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72  e);.}../*.** Ver
b400: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 70  ify that the rep
b410: 6f 73 69 74 6f 72 79 20 73 63 68 65 6d 61 20 69  ository schema i
b420: 73 20 63 6f 72 72 65 63 74 2e 20 20 49 66 20 69  s correct.  If i
b430: 74 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 63 74  t is not correct
b440: 2c 0a 2a 2a 20 69 73 73 75 65 20 61 20 66 61 74  ,.** issue a fat
b450: 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 64 69 65  al error and die
b460: 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 76 65 72  ..*/.void db_ver
b470: 69 66 79 5f 73 63 68 65 6d 61 28 76 6f 69 64 29  ify_schema(void)
b480: 7b 0a 20 20 69 66 28 20 64 62 5f 73 63 68 65 6d  {.  if( db_schem
b490: 61 5f 69 73 5f 6f 75 74 6f 66 64 61 74 65 28 29  a_is_outofdate()
b4a0: 20 29 7b 0a 23 69 66 64 65 66 20 46 4f 53 53 49   ){.#ifdef FOSSI
b4b0: 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 0a 20 20  L_ENABLE_JSON.  
b4c0: 20 20 67 2e 6a 73 6f 6e 2e 72 65 73 75 6c 74 43    g.json.resultC
b4d0: 6f 64 65 20 3d 20 46 53 4c 5f 4a 53 4f 4e 5f 45  ode = FSL_JSON_E
b4e0: 5f 44 42 5f 4e 45 45 44 53 5f 52 45 42 55 49 4c  _DB_NEEDS_REBUIL
b4f0: 44 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 66 6f  D;.#endif.    fo
b500: 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22 69 6e  ssil_warning("in
b510: 63 6f 72 72 65 63 74 20 72 65 70 6f 73 69 74 6f  correct reposito
b520: 72 79 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f  ry schema versio
b530: 6e 3a 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  n: ".          "
b540: 63 75 72 72 65 6e 74 20 72 65 70 6f 73 69 74 6f  current reposito
b550: 72 79 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f  ry schema versio
b560: 6e 20 69 73 20 5c 22 25 73 5c 22 20 22 0a 20 20  n is \"%s\" ".  
b570: 20 20 20 20 20 20 20 20 22 62 75 74 20 6e 65 65          "but nee
b580: 64 20 76 65 72 73 69 6f 6e 73 20 62 65 74 77 65  d versions betwe
b590: 65 6e 20 5c 22 25 73 5c 22 20 61 6e 64 20 5c 22  en \"%s\" and \"
b5a0: 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20  %s\".",.        
b5b0: 20 20 67 2e 7a 41 75 78 53 63 68 65 6d 61 2c 20    g.zAuxSchema, 
b5c0: 41 55 58 5f 53 43 48 45 4d 41 5f 4d 49 4e 2c 20  AUX_SCHEMA_MIN, 
b5d0: 41 55 58 5f 53 43 48 45 4d 41 5f 4d 41 58 29 3b  AUX_SCHEMA_MAX);
b5e0: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61  .    fossil_fata
b5f0: 6c 28 22 72 75 6e 20 5c 22 66 6f 73 73 69 6c 20  l("run \"fossil 
b600: 72 65 62 75 69 6c 64 5c 22 20 74 6f 20 66 69 78  rebuild\" to fix
b610: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 22 29 3b   this problem");
b620: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  .  }.}.../*.** C
b630: 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 6d 6f 76  OMMAND: test-mov
b640: 65 2d 72 65 70 6f 73 69 74 6f 72 79 0a 2a 2a 0a  e-repository.**.
b650: 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69  ** Usage: %fossi
b660: 6c 20 74 65 73 74 2d 6d 6f 76 65 2d 72 65 70 6f  l test-move-repo
b670: 73 69 74 6f 72 79 20 50 41 54 48 4e 41 4d 45 0a  sitory PATHNAME.
b680: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  **.** Change the
b690: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
b6a0: 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61   repository data
b6b0: 62 61 73 65 20 6f 6e 20 61 20 6c 6f 63 61 6c 20  base on a local 
b6c0: 63 68 65 63 6b 2d 6f 75 74 2e 0a 2a 2a 20 55 73  check-out..** Us
b6d0: 65 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 74  e this command t
b6e0: 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74  o avoid having t
b6f0: 6f 20 63 6c 6f 73 65 20 61 6e 64 20 72 65 6f 70  o close and reop
b700: 65 6e 20 61 20 63 68 65 63 6b 6f 75 74 0a 2a 2a  en a checkout.**
b710: 20 77 68 65 6e 20 72 65 6c 6f 63 61 74 69 6e 67   when relocating
b720: 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20   the repository 
b730: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69  database..*/.voi
b740: 64 20 6d 6f 76 65 5f 72 65 70 6f 5f 63 6d 64 28  d move_repo_cmd(
b750: 76 6f 69 64 29 7b 0a 20 20 42 6c 6f 62 20 72 65  void){.  Blob re
b760: 70 6f 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 70  po;.  char *zRep
b770: 6f 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63 21  o;.  if( g.argc!
b780: 3d 33 20 29 7b 0a 20 20 20 20 75 73 61 67 65 28  =3 ){.    usage(
b790: 22 50 41 54 48 4e 41 4d 45 22 29 3b 0a 20 20 7d  "PATHNAME");.  }
b7a0: 0a 20 20 66 69 6c 65 5f 63 61 6e 6f 6e 69 63 61  .  file_canonica
b7b0: 6c 5f 6e 61 6d 65 28 67 2e 61 72 67 76 5b 32 5d  l_name(g.argv[2]
b7c0: 2c 20 26 72 65 70 6f 2c 20 30 29 3b 0a 20 20 7a  , &repo, 0);.  z
b7d0: 52 65 70 6f 20 3d 20 62 6c 6f 62 5f 73 74 72 28  Repo = blob_str(
b7e0: 26 72 65 70 6f 29 3b 0a 20 20 69 66 28 20 66 69  &repo);.  if( fi
b7f0: 6c 65 5f 61 63 63 65 73 73 28 7a 52 65 70 6f 2c  le_access(zRepo,
b800: 20 46 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 66 6f   F_OK) ){.    fo
b810: 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e 6f 20 73  ssil_fatal("no s
b820: 75 63 68 20 66 69 6c 65 3a 20 25 73 22 2c 20 7a  uch file: %s", z
b830: 52 65 70 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Repo);.  }.  if(
b840: 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 7a   db_open_local(z
b850: 52 65 70 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Repo)==0 ){.    
b860: 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e 6f  fossil_fatal("no
b870: 74 20 69 6e 20 61 20 6c 6f 63 61 6c 20 63 68 65  t in a local che
b880: 63 6b 6f 75 74 22 29 3b 0a 20 20 20 20 72 65 74  ckout");.    ret
b890: 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62 5f 6f 70  urn;.  }.  db_op
b8a0: 65 6e 5f 6f 72 5f 61 74 74 61 63 68 28 7a 52 65  en_or_attach(zRe
b8b0: 70 6f 2c 20 22 74 65 73 74 5f 72 65 70 6f 22 29  po, "test_repo")
b8c0: 3b 0a 20 20 64 62 5f 6c 73 65 74 28 22 72 65 70  ;.  db_lset("rep
b8d0: 6f 73 69 74 6f 72 79 22 2c 20 62 6c 6f 62 5f 73  ository", blob_s
b8e0: 74 72 28 26 72 65 70 6f 29 29 3b 0a 20 20 64 62  tr(&repo));.  db
b8f0: 5f 72 65 63 6f 72 64 5f 72 65 70 6f 73 69 74 6f  _record_reposito
b900: 72 79 5f 66 69 6c 65 6e 61 6d 65 28 62 6c 6f 62  ry_filename(blob
b910: 5f 73 74 72 28 26 72 65 70 6f 29 29 3b 0a 20 20  _str(&repo));.  
b920: 64 62 5f 63 6c 6f 73 65 28 31 29 3b 0a 7d 0a 0a  db_close(1);.}..
b930: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
b940: 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 2e 20  local database. 
b950: 20 49 66 20 75 6e 61 62 6c 65 2c 20 65 78 69 74   If unable, exit
b960: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a   with an error..
b970: 2a 2f 0a 76 6f 69 64 20 64 62 5f 6d 75 73 74 5f  */.void db_must_
b980: 62 65 5f 77 69 74 68 69 6e 5f 74 72 65 65 28 76  be_within_tree(v
b990: 6f 69 64 29 7b 0a 20 20 69 66 28 20 66 69 6e 64  oid){.  if( find
b9a0: 5f 72 65 70 6f 73 69 74 6f 72 79 5f 6f 70 74 69  _repository_opti
b9b0: 6f 6e 28 29 20 29 7b 0a 20 20 20 20 66 6f 73 73  on() ){.    foss
b9c0: 69 6c 5f 66 61 74 61 6c 28 22 74 68 65 20 5c 22  il_fatal("the \"
b9d0: 25 73 5c 22 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c  %s\" command onl
b9e0: 79 20 77 6f 72 6b 73 20 66 72 6f 6d 20 77 69 74  y works from wit
b9f0: 68 69 6e 20 61 6e 20 6f 70 65 6e 20 63 68 65 63  hin an open chec
ba00: 6b 2d 6f 75 74 22 2c 0a 20 20 20 20 20 20 20 20  k-out",.        
ba10: 20 20 20 20 20 20 20 20 20 67 2e 61 72 67 76 5b           g.argv[
ba20: 31 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  1]);.  }.  if( d
ba30: 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 30 29 3d  b_open_local(0)=
ba40: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c  =0 ){.    fossil
ba50: 5f 66 61 74 61 6c 28 22 63 75 72 72 65 6e 74 20  _fatal("current 
ba60: 64 69 72 65 63 74 6f 72 79 20 69 73 20 6e 6f 74  directory is not
ba70: 20 77 69 74 68 69 6e 20 61 6e 20 6f 70 65 6e 20   within an open 
ba80: 63 68 65 63 6b 6f 75 74 22 29 3b 0a 20 20 7d 0a  checkout");.  }.
ba90: 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69    db_open_reposi
baa0: 74 6f 72 79 28 30 29 3b 0a 20 20 64 62 5f 76 65  tory(0);.  db_ve
bab0: 72 69 66 79 5f 73 63 68 65 6d 61 28 29 3b 0a 7d  rify_schema();.}
bac0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
bad0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
bae0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 43 68 65  ction..**.** Che
baf0: 63 6b 20 66 6f 72 20 75 6e 66 69 6e 61 6c 69 7a  ck for unfinaliz
bb00: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e  ed statements an
bb10: 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20  d report errors 
bb20: 69 66 20 74 68 65 20 72 65 70 6f 72 74 45 72 72  if the reportErr
bb30: 6f 72 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ors.** argument 
bb40: 69 73 20 74 72 75 65 2e 20 20 49 67 6e 6f 72 65  is true.  Ignore
bb50: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 73 74 61   unfinalized sta
bb60: 74 65 6d 65 6e 74 73 20 77 68 65 6e 20 66 61 6c  tements when fal
bb70: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 63  se..*/.void db_c
bb80: 6c 6f 73 65 28 69 6e 74 20 72 65 70 6f 72 74 45  lose(int reportE
bb90: 72 72 6f 72 73 29 7b 0a 20 20 73 71 6c 69 74 65  rrors){.  sqlite
bba0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
bbb0: 20 69 66 28 20 67 2e 64 62 3d 3d 30 20 29 20 72   if( g.db==0 ) r
bbc0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 67 2e 66  eturn;.  if( g.f
bbd0: 53 71 6c 53 74 61 74 73 20 29 7b 0a 20 20 20 20  SqlStats ){.    
bbe0: 69 6e 74 20 63 75 72 2c 20 68 69 77 74 72 3b 0a  int cur, hiwtr;.
bbf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
bc00: 74 61 74 75 73 28 67 2e 64 62 2c 20 53 51 4c 49  tatus(g.db, SQLI
bc10: 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
bc20: 41 53 49 44 45 5f 55 53 45 44 2c 20 26 63 75 72  ASIDE_USED, &cur
bc30: 2c 20 26 68 69 77 74 72 2c 20 30 29 3b 0a 20 20  , &hiwtr, 0);.  
bc40: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
bc50: 2c 20 22 2d 2d 20 4c 4f 4f 4b 41 53 49 44 45 5f  , "-- LOOKASIDE_
bc60: 55 53 45 44 20 20 20 20 20 20 20 20 20 25 31 30  USED         %10
bc70: 64 20 25 31 30 64 5c 6e 22 2c 20 63 75 72 2c 20  d %10d\n", cur, 
bc80: 68 69 77 74 72 29 3b 0a 20 20 20 20 73 71 6c 69  hiwtr);.    sqli
bc90: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 67 2e  te3_db_status(g.
bca0: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
bcb0: 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49  TUS_LOOKASIDE_HI
bcc0: 54 2c 20 26 63 75 72 2c 20 26 68 69 77 74 72 2c  T, &cur, &hiwtr,
bcd0: 20 30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   0);.    fprintf
bce0: 28 73 74 64 65 72 72 2c 20 22 2d 2d 20 4c 4f 4f  (stderr, "-- LOO
bcf0: 4b 41 53 49 44 45 5f 48 49 54 20 20 20 20 20 20  KASIDE_HIT      
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
bd10: 31 30 64 5c 6e 22 2c 20 68 69 77 74 72 29 3b 0a  10d\n", hiwtr);.
bd20: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
bd30: 74 61 74 75 73 28 67 2e 64 62 2c 20 53 51 4c 49  tatus(g.db, SQLI
bd40: 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
bd50: 41 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c  ASIDE_MISS_SIZE,
bd60: 20 26 63 75 72 2c 26 68 69 77 74 72 2c 30 29 3b   &cur,&hiwtr,0);
bd70: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
bd80: 65 72 72 2c 20 22 2d 2d 20 4c 4f 4f 4b 41 53 49  err, "-- LOOKASI
bd90: 44 45 5f 4d 49 53 53 5f 53 49 5a 45 20 20 20 20  DE_MISS_SIZE    
bda0: 20 20 20 20 20 20 20 20 20 20 20 25 31 30 64 5c             %10d\
bdb0: 6e 22 2c 20 68 69 77 74 72 29 3b 0a 20 20 20 20  n", hiwtr);.    
bdc0: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
bdd0: 73 28 67 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44  s(g.db, SQLITE_D
bde0: 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
bdf0: 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 20 26 63 75  E_MISS_FULL, &cu
be00: 72 2c 26 68 69 77 74 72 2c 30 29 3b 0a 20 20 20  r,&hiwtr,0);.   
be10: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
be20: 20 22 2d 2d 20 4c 4f 4f 4b 41 53 49 44 45 5f 4d   "-- LOOKASIDE_M
be30: 49 53 53 5f 46 55 4c 4c 20 20 20 20 20 20 20 20  ISS_FULL        
be40: 20 20 20 20 20 20 20 25 31 30 64 5c 6e 22 2c 20         %10d\n", 
be50: 68 69 77 74 72 29 3b 0a 20 20 20 20 73 71 6c 69  hiwtr);.    sqli
be60: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 67 2e  te3_db_status(g.
be70: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
be80: 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44 2c 20  TUS_CACHE_USED, 
be90: 26 63 75 72 2c 20 26 68 69 77 74 72 2c 20 30 29  &cur, &hiwtr, 0)
bea0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  ;.    fprintf(st
beb0: 64 65 72 72 2c 20 22 2d 2d 20 43 41 43 48 45 5f  derr, "-- CACHE_
bec0: 55 53 45 44 20 20 20 20 20 20 20 20 20 20 20 20  USED            
bed0: 20 25 31 30 64 5c 6e 22 2c 20 63 75 72 29 3b 0a   %10d\n", cur);.
bee0: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
bef0: 74 61 74 75 73 28 67 2e 64 62 2c 20 53 51 4c 49  tatus(g.db, SQLI
bf00: 54 45 5f 44 42 53 54 41 54 55 53 5f 53 43 48 45  TE_DBSTATUS_SCHE
bf10: 4d 41 5f 55 53 45 44 2c 20 26 63 75 72 2c 20 26  MA_USED, &cur, &
bf20: 68 69 77 74 72 2c 20 30 29 3b 0a 20 20 20 20 66  hiwtr, 0);.    f
bf30: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
bf40: 2d 2d 20 53 43 48 45 4d 41 5f 55 53 45 44 20 20  -- SCHEMA_USED  
bf50: 20 20 20 20 20 20 20 20 20 20 25 31 30 64 5c 6e            %10d\n
bf60: 22 2c 20 63 75 72 29 3b 0a 20 20 20 20 73 71 6c  ", cur);.    sql
bf70: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 67  ite3_db_status(g
bf80: 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  .db, SQLITE_DBST
bf90: 41 54 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c 20  ATUS_STMT_USED, 
bfa0: 26 63 75 72 2c 20 26 68 69 77 74 72 2c 20 30 29  &cur, &hiwtr, 0)
bfb0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  ;.    fprintf(st
bfc0: 64 65 72 72 2c 20 22 2d 2d 20 53 54 4d 54 5f 55  derr, "-- STMT_U
bfd0: 53 45 44 20 20 20 20 20 20 20 20 20 20 20 20 20  SED             
bfe0: 20 25 31 30 64 5c 6e 22 2c 20 63 75 72 29 3b 0a   %10d\n", cur);.
bff0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74      sqlite3_stat
c000: 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53  us(SQLITE_STATUS
c010: 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 26 63  _MEMORY_USED, &c
c020: 75 72 2c 20 26 68 69 77 74 72 2c 20 30 29 3b 0a  ur, &hiwtr, 0);.
c030: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
c040: 72 72 2c 20 22 2d 2d 20 4d 45 4d 4f 52 59 5f 55  rr, "-- MEMORY_U
c050: 53 45 44 20 20 20 20 20 20 20 20 20 20 20 20 25  SED            %
c060: 31 30 64 20 25 31 30 64 5c 6e 22 2c 20 63 75 72  10d %10d\n", cur
c070: 2c 20 68 69 77 74 72 29 3b 0a 20 20 20 20 73 71  , hiwtr);.    sq
c080: 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c  lite3_status(SQL
c090: 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f  ITE_STATUS_MALLO
c0a0: 43 5f 53 49 5a 45 2c 20 26 63 75 72 2c 20 26 68  C_SIZE, &cur, &h
c0b0: 69 77 74 72 2c 20 30 29 3b 0a 20 20 20 20 66 70  iwtr, 0);.    fp
c0c0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2d  rintf(stderr, "-
c0d0: 2d 20 4d 41 4c 4c 4f 43 5f 53 49 5a 45 20 20 20  - MALLOC_SIZE   
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 20 20 20 25 31 30 64 5c 6e 22 2c 20 68 69 77      %10d\n", hiw
c100: 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tr);.    sqlite3
c110: 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53  _status(SQLITE_S
c120: 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55  TATUS_MALLOC_COU
c130: 4e 54 2c 20 26 63 75 72 2c 20 26 68 69 77 74 72  NT, &cur, &hiwtr
c140: 2c 20 30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , 0);.    fprint
c150: 66 28 73 74 64 65 72 72 2c 20 22 2d 2d 20 4d 41  f(stderr, "-- MA
c160: 4c 4c 4f 43 5f 43 4f 55 4e 54 20 20 20 20 20 20  LLOC_COUNT      
c170: 20 20 20 20 20 25 31 30 64 20 25 31 30 64 5c 6e       %10d %10d\n
c180: 22 2c 20 63 75 72 2c 20 68 69 77 74 72 29 3b 0a  ", cur, hiwtr);.
c190: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74      sqlite3_stat
c1a0: 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53  us(SQLITE_STATUS
c1b0: 5f 50 41 47 45 43 41 43 48 45 5f 4f 56 45 52 46  _PAGECACHE_OVERF
c1c0: 4c 4f 57 2c 20 26 63 75 72 2c 20 26 68 69 77 74  LOW, &cur, &hiwt
c1d0: 72 2c 20 30 29 3b 0a 20 20 20 20 66 70 72 69 6e  r, 0);.    fprin
c1e0: 74 66 28 73 74 64 65 72 72 2c 20 22 2d 2d 20 50  tf(stderr, "-- P
c1f0: 43 41 43 48 45 5f 4f 56 46 4c 4f 57 20 20 20 20  CACHE_OVFLOW    
c200: 20 20 20 20 20 20 25 31 30 64 20 25 31 30 64 5c        %10d %10d\
c210: 6e 22 2c 20 63 75 72 2c 20 68 69 77 74 72 29 3b  n", cur, hiwtr);
c220: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
c230: 65 72 72 2c 20 22 2d 2d 20 70 72 65 70 61 72 65  err, "-- prepare
c240: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 20 20 20  d statements    
c250: 25 31 30 64 5c 6e 22 2c 20 64 62 2e 6e 50 72 65  %10d\n", db.nPre
c260: 70 61 72 65 29 3b 0a 20 20 7d 0a 20 20 77 68 69  pare);.  }.  whi
c270: 6c 65 28 20 64 62 2e 70 41 6c 6c 53 74 6d 74 20  le( db.pAllStmt 
c280: 29 7b 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69  ){.    db_finali
c290: 7a 65 28 64 62 2e 70 41 6c 6c 53 74 6d 74 29 3b  ze(db.pAllStmt);
c2a0: 0a 20 20 7d 0a 20 20 64 62 5f 65 6e 64 5f 74 72  .  }.  db_end_tr
c2b0: 61 6e 73 61 63 74 69 6f 6e 28 31 29 3b 0a 20 20  ansaction(1);.  
c2c0: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 67 2e 64  pStmt = 0;.  g.d
c2d0: 62 49 67 6e 6f 72 65 45 72 72 6f 72 73 2b 2b 3b  bIgnoreErrors++;
c2e0: 20 20 2f 2a 20 53 74 6f 70 20 22 64 61 74 61 62    /* Stop "datab
c2f0: 61 73 65 20 6c 6f 63 6b 65 64 22 20 77 61 72 6e  ase locked" warn
c300: 69 6e 67 73 20 66 72 6f 6d 20 50 52 41 47 4d 41  ings from PRAGMA
c310: 20 6f 70 74 69 6d 69 7a 65 20 2a 2f 0a 20 20 73   optimize */.  s
c320: 71 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64 62  qlite3_exec(g.db
c330: 2c 20 22 50 52 41 47 4d 41 20 6f 70 74 69 6d 69  , "PRAGMA optimi
c340: 7a 65 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ze", 0, 0, 0);. 
c350: 20 67 2e 64 62 49 67 6e 6f 72 65 45 72 72 6f 72   g.dbIgnoreError
c360: 73 2d 2d 3b 0a 20 20 64 62 5f 63 6c 6f 73 65 5f  s--;.  db_close_
c370: 63 6f 6e 66 69 67 28 29 3b 0a 0a 20 20 2f 2a 20  config();..  /* 
c380: 49 66 20 74 68 65 20 6c 6f 63 61 6c 64 62 20 68  If the localdb h
c390: 61 73 20 61 20 6c 6f 74 20 6f 66 20 75 6e 75 73  as a lot of unus
c3a0: 65 64 20 66 72 65 65 20 73 70 61 63 65 2c 0a 20  ed free space,. 
c3b0: 20 2a 2a 20 74 68 65 6e 20 56 41 43 55 55 4d 20   ** then VACUUM 
c3c0: 69 74 20 61 73 20 77 65 20 73 68 75 74 20 64 6f  it as we shut do
c3d0: 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  wn..  */.  if( d
c3e0: 62 5f 64 61 74 61 62 61 73 65 5f 73 6c 6f 74 28  b_database_slot(
c3f0: 22 6c 6f 63 61 6c 64 62 22 29 3e 3d 30 20 29 7b  "localdb")>=0 ){
c400: 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 20 3d  .    int nFree =
c410: 20 64 62 5f 69 6e 74 28 30 2c 20 22 50 52 41 47   db_int(0, "PRAG
c420: 4d 41 20 6c 6f 63 61 6c 64 62 2e 66 72 65 65 6c  MA localdb.freel
c430: 69 73 74 5f 63 6f 75 6e 74 22 29 3b 0a 20 20 20  ist_count");.   
c440: 20 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20 64 62   int nTotal = db
c450: 5f 69 6e 74 28 30 2c 20 22 50 52 41 47 4d 41 20  _int(0, "PRAGMA 
c460: 6c 6f 63 61 6c 64 62 2e 70 61 67 65 5f 63 6f 75  localdb.page_cou
c470: 6e 74 22 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  nt");.    if( nF
c480: 72 65 65 3e 6e 54 6f 74 61 6c 2f 34 20 29 7b 0a  ree>nTotal/4 ){.
c490: 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65        db_multi_e
c4a0: 78 65 63 28 22 56 41 43 55 55 4d 20 6c 6f 63 61  xec("VACUUM loca
c4b0: 6c 64 62 3b 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ldb;");.    }.  
c4c0: 7d 0a 0a 20 20 69 66 28 20 67 2e 64 62 20 29 7b  }..  if( g.db ){
c4d0: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
c4e0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
c4f0: 63 6b 70 6f 69 6e 74 28 67 2e 64 62 2c 20 30 29  ckpoint(g.db, 0)
c500: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
c510: 65 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b 0a  e3_close(g.db);.
c520: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c530: 54 45 5f 42 55 53 59 20 26 26 20 72 65 70 6f 72  TE_BUSY && repor
c540: 74 45 72 72 6f 72 73 20 29 7b 0a 20 20 20 20 20  tErrors ){.     
c550: 20 77 68 69 6c 65 28 20 28 70 53 74 6d 74 20 3d   while( (pStmt =
c560: 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74   sqlite3_next_st
c570: 6d 74 28 67 2e 64 62 2c 20 70 53 74 6d 74 29 29  mt(g.db, pStmt))
c580: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  !=0 ){.        f
c590: 6f 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22 75  ossil_warning("u
c5a0: 6e 66 69 6e 61 6c 69 7a 65 64 20 53 51 4c 20 73  nfinalized SQL s
c5b0: 74 61 74 65 6d 65 6e 74 3a 20 5b 25 73 5d 22 2c  tatement: [%s]",
c5c0: 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74   sqlite3_sql(pSt
c5d0: 6d 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mt));.      }.  
c5e0: 20 20 7d 0a 20 20 20 20 67 2e 64 62 20 3d 20 30    }.    g.db = 0
c5f0: 3b 0a 20 20 7d 0a 20 20 67 2e 72 65 70 6f 73 69  ;.  }.  g.reposi
c600: 74 6f 72 79 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  toryOpen = 0;.  
c610: 67 2e 6c 6f 63 61 6c 4f 70 65 6e 20 3d 20 30 3b  g.localOpen = 0;
c620: 0a 20 20 61 73 73 65 72 74 28 20 67 2e 64 62 43  .  assert( g.dbC
c630: 6f 6e 66 69 67 3d 3d 30 20 29 3b 0a 20 20 61 73  onfig==0 );.  as
c640: 73 65 72 74 28 20 67 2e 7a 43 6f 6e 66 69 67 44  sert( g.zConfigD
c650: 62 4e 61 6d 65 3d 3d 30 20 29 3b 0a 7d 0a 0a 0a  bName==0 );.}...
c660: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
c670: 65 77 20 65 6d 70 74 79 20 72 65 70 6f 73 69 74  ew empty reposit
c680: 6f 72 79 20 64 61 74 61 62 61 73 65 20 77 69 74  ory database wit
c690: 68 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65  h the given name
c6a0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
c6b0: 20 73 63 68 65 6d 61 20 69 73 20 69 6e 69 74 69   schema is initi
c6c0: 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72 65 71  alized.  The req
c6d0: 75 69 72 65 64 20 56 41 52 20 74 61 62 6c 65 73  uired VAR tables
c6e0: 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 72 65 20   entries.** are 
c6f0: 6e 6f 74 20 73 65 74 20 62 79 20 74 68 69 73 20  not set by this 
c700: 72 6f 75 74 69 6e 65 20 61 6e 64 20 6d 75 73 74  routine and must
c710: 20 62 65 20 73 65 74 20 73 65 70 61 72 61 74 65   be set separate
c720: 6c 79 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74  ly in order.** t
c730: 6f 20 6d 61 6b 65 20 74 68 65 20 6e 65 77 20 66  o make the new f
c740: 69 6c 65 20 61 20 76 61 6c 69 64 20 64 61 74 61  ile a valid data
c750: 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62  base..*/.void db
c760: 5f 63 72 65 61 74 65 5f 72 65 70 6f 73 69 74 6f  _create_reposito
c770: 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ry(const char *z
c780: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 64 62 5f  Filename){.  db_
c790: 69 6e 69 74 5f 64 61 74 61 62 61 73 65 28 0a 20  init_database(. 
c7a0: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20      zFilename,. 
c7b0: 20 20 20 20 7a 52 65 70 6f 73 69 74 6f 72 79 53      zRepositoryS
c7c0: 63 68 65 6d 61 31 2c 0a 20 20 20 20 20 7a 52 65  chema1,.     zRe
c7d0: 70 6f 73 69 74 6f 72 79 53 63 68 65 6d 61 44 65  positorySchemaDe
c7e0: 66 61 75 6c 74 52 65 70 6f 72 74 73 2c 0a 20 20  faultReports,.  
c7f0: 20 20 20 7a 52 65 70 6f 73 69 74 6f 72 79 53 63     zRepositorySc
c800: 68 65 6d 61 32 2c 0a 20 20 20 20 20 28 63 68 61  hema2,.     (cha
c810: 72 2a 29 30 0a 20 20 29 3b 0a 20 20 64 62 5f 64  r*)0.  );.  db_d
c820: 65 6c 65 74 65 5f 6f 6e 5f 66 61 69 6c 75 72 65  elete_on_failure
c830: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 7d 0a 0a  (zFilename);.}..
c840: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
c850: 20 64 65 66 61 75 6c 74 20 75 73 65 72 20 61 63   default user ac
c860: 63 6f 75 6e 74 73 20 69 6e 20 74 68 65 20 55 53  counts in the US
c870: 45 52 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69  ER table..*/.voi
c880: 64 20 64 62 5f 63 72 65 61 74 65 5f 64 65 66 61  d db_create_defa
c890: 75 6c 74 5f 75 73 65 72 73 28 69 6e 74 20 73 65  ult_users(int se
c8a0: 74 75 70 55 73 65 72 4f 6e 6c 79 2c 20 63 6f 6e  tupUserOnly, con
c8b0: 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  st char *zDefaul
c8c0: 74 55 73 65 72 29 7b 0a 20 20 63 6f 6e 73 74 20  tUser){.  const 
c8d0: 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 7a 44  char *zUser = zD
c8e0: 65 66 61 75 6c 74 55 73 65 72 3b 0a 20 20 69 66  efaultUser;.  if
c8f0: 28 20 7a 55 73 65 72 3d 3d 30 20 29 7b 0a 20 20  ( zUser==0 ){.  
c900: 20 20 7a 55 73 65 72 20 3d 20 64 62 5f 67 65 74    zUser = db_get
c910: 28 22 64 65 66 61 75 6c 74 2d 75 73 65 72 22 2c  ("default-user",
c920: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a   0);.  }.  if( z
c930: 55 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  User==0 ){.    z
c940: 55 73 65 72 20 3d 20 66 6f 73 73 69 6c 5f 67 65  User = fossil_ge
c950: 74 65 6e 76 28 22 46 4f 53 53 49 4c 5f 55 53 45  tenv("FOSSIL_USE
c960: 52 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  R");.  }.  if( z
c970: 55 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  User==0 ){.    z
c980: 55 73 65 72 20 3d 20 66 6f 73 73 69 6c 5f 67 65  User = fossil_ge
c990: 74 65 6e 76 28 22 55 53 45 52 22 29 3b 0a 20 20  tenv("USER");.  
c9a0: 7d 0a 20 20 69 66 28 20 7a 55 73 65 72 3d 3d 30  }.  if( zUser==0
c9b0: 20 29 7b 0a 20 20 20 20 7a 55 73 65 72 20 3d 20   ){.    zUser = 
c9c0: 66 6f 73 73 69 6c 5f 67 65 74 65 6e 76 28 22 4c  fossil_getenv("L
c9d0: 4f 47 4e 41 4d 45 22 29 3b 0a 20 20 7d 0a 20 20  OGNAME");.  }.  
c9e0: 69 66 28 20 7a 55 73 65 72 3d 3d 30 20 29 7b 0a  if( zUser==0 ){.
c9f0: 20 20 20 20 7a 55 73 65 72 20 3d 20 66 6f 73 73      zUser = foss
ca00: 69 6c 5f 67 65 74 65 6e 76 28 22 55 53 45 52 4e  il_getenv("USERN
ca10: 41 4d 45 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  AME");.  }.  if(
ca20: 20 7a 55 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20   zUser==0 ){.   
ca30: 20 7a 55 73 65 72 20 3d 20 22 72 6f 6f 74 22 3b   zUser = "root";
ca40: 0a 20 20 7d 0a 20 20 64 62 5f 6d 75 6c 74 69 5f  .  }.  db_multi_
ca50: 65 78 65 63 28 0a 20 20 20 20 20 22 49 4e 53 45  exec(.     "INSE
ca60: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
ca70: 4f 20 75 73 65 72 28 6c 6f 67 69 6e 2c 20 69 6e  O user(login, in
ca80: 66 6f 29 20 56 41 4c 55 45 53 28 25 51 2c 27 27  fo) VALUES(%Q,''
ca90: 29 22 2c 20 7a 55 73 65 72 0a 20 20 29 3b 0a 20  )", zUser.  );. 
caa0: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a   db_multi_exec(.
cab0: 20 20 20 20 20 22 55 50 44 41 54 45 20 75 73 65       "UPDATE use
cac0: 72 20 53 45 54 20 63 61 70 3d 27 73 27 2c 20 70  r SET cap='s', p
cad0: 77 3d 6c 6f 77 65 72 28 68 65 78 28 72 61 6e 64  w=lower(hex(rand
cae0: 6f 6d 62 6c 6f 62 28 33 29 29 29 22 0a 20 20 20  omblob(3)))".   
caf0: 20 20 22 20 57 48 45 52 45 20 6c 6f 67 69 6e 3d    " WHERE login=
cb00: 25 51 22 2c 20 7a 55 73 65 72 0a 20 20 29 3b 0a  %Q", zUser.  );.
cb10: 20 20 69 66 28 20 21 73 65 74 75 70 55 73 65 72    if( !setupUser
cb20: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 64 62 5f 6d  Only ){.    db_m
cb30: 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20  ulti_exec(.     
cb40: 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e    "INSERT OR IGN
cb50: 4f 52 45 20 49 4e 54 4f 20 75 73 65 72 28 6c 6f  ORE INTO user(lo
cb60: 67 69 6e 2c 70 77 2c 63 61 70 2c 69 6e 66 6f 29  gin,pw,cap,info)
cb70: 22 0a 20 20 20 20 20 20 20 22 20 20 20 56 41 4c  ".       "   VAL
cb80: 55 45 53 28 27 61 6e 6f 6e 79 6d 6f 75 73 27 2c  UES('anonymous',
cb90: 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 38  hex(randomblob(8
cba0: 29 29 2c 27 68 6d 6e 63 27 2c 27 41 6e 6f 6e 27  )),'hmnc','Anon'
cbb0: 29 3b 22 0a 20 20 20 20 20 20 20 22 49 4e 53 45  );".       "INSE
cbc0: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
cbd0: 4f 20 75 73 65 72 28 6c 6f 67 69 6e 2c 70 77 2c  O user(login,pw,
cbe0: 63 61 70 2c 69 6e 66 6f 29 22 0a 20 20 20 20 20  cap,info)".     
cbf0: 20 20 22 20 20 20 56 41 4c 55 45 53 28 27 6e 6f    "   VALUES('no
cc00: 62 6f 64 79 27 2c 27 27 2c 27 67 6a 6f 72 7a 27  body','','gjorz'
cc10: 2c 27 4e 6f 62 6f 64 79 27 29 3b 22 0a 20 20 20  ,'Nobody');".   
cc20: 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
cc30: 47 4e 4f 52 45 20 49 4e 54 4f 20 75 73 65 72 28  GNORE INTO user(
cc40: 6c 6f 67 69 6e 2c 70 77 2c 63 61 70 2c 69 6e 66  login,pw,cap,inf
cc50: 6f 29 22 0a 20 20 20 20 20 20 20 22 20 20 20 56  o)".       "   V
cc60: 41 4c 55 45 53 28 27 64 65 76 65 6c 6f 70 65 72  ALUES('developer
cc70: 27 2c 27 27 2c 27 64 65 69 27 2c 27 44 65 76 27  ','','dei','Dev'
cc80: 29 3b 22 0a 20 20 20 20 20 20 20 22 49 4e 53 45  );".       "INSE
cc90: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
cca0: 4f 20 75 73 65 72 28 6c 6f 67 69 6e 2c 70 77 2c  O user(login,pw,
ccb0: 63 61 70 2c 69 6e 66 6f 29 22 0a 20 20 20 20 20  cap,info)".     
ccc0: 20 20 22 20 20 20 56 41 4c 55 45 53 28 27 72 65    "   VALUES('re
ccd0: 61 64 65 72 27 2c 27 27 2c 27 6b 70 74 77 27 2c  ader','','kptw',
cce0: 27 52 65 61 64 65 72 27 29 3b 22 0a 20 20 20 20  'Reader');".    
ccf0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
cd00: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
cd10: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61   to a string tha
cd20: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 52  t contains the R
cd30: 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72  HS of an IN oper
cd40: 61 74 6f 72 0a 2a 2a 20 74 68 61 74 20 77 69 6c  ator.** that wil
cd50: 6c 20 73 65 6c 65 63 74 20 43 4f 4e 46 49 47 20  l select CONFIG 
cd60: 74 61 62 6c 65 20 6e 61 6d 65 73 20 74 68 61 74  table names that
cd70: 20 61 72 65 20 69 6e 20 74 68 65 20 6c 69 73 74   are in the list
cd80: 20 6f 66 20 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 73   of control.** s
cd90: 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a 63 6f 6e 73  ettings..*/.cons
cda0: 74 20 63 68 61 72 20 2a 64 62 5f 73 65 74 74 69  t char *db_setti
cdb0: 6e 67 5f 69 6e 6f 70 5f 72 68 73 28 29 7b 0a 20  ng_inop_rhs(){. 
cdc0: 20 42 6c 6f 62 20 78 3b 0a 20 20 69 6e 74 20 69   Blob x;.  int i
cdd0: 3b 0a 20 20 69 6e 74 20 6e 53 65 74 74 69 6e 67  ;.  int nSetting
cde0: 3b 0a 20 20 63 6f 6e 73 74 20 53 65 74 74 69 6e  ;.  const Settin
cdf0: 67 20 2a 61 53 65 74 74 69 6e 67 20 3d 20 73 65  g *aSetting = se
ce00: 74 74 69 6e 67 5f 69 6e 66 6f 28 26 6e 53 65 74  tting_info(&nSet
ce10: 74 69 6e 67 29 3b 0a 20 20 63 6f 6e 73 74 20 63  ting);.  const c
ce20: 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a  har *zSep = "";.
ce30: 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 78 29  .  blob_zero(&x)
ce40: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 5f  ;.  blob_append_
ce50: 73 71 6c 28 26 78 2c 20 22 28 22 29 3b 0a 20 20  sql(&x, "(");.  
ce60: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 65 74 74  for(i=0; i<nSett
ce70: 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 62  ing; i++){.    b
ce80: 6c 6f 62 5f 61 70 70 65 6e 64 5f 73 71 6c 28 26  lob_append_sql(&
ce90: 78 2c 20 22 25 73 25 51 22 2c 20 7a 53 65 70 2f  x, "%s%Q", zSep/
cea0: 2a 73 61 66 65 2d 66 6f 72 2d 25 73 2a 2f 2c 20  *safe-for-%s*/, 
ceb0: 61 53 65 74 74 69 6e 67 5b 69 5d 2e 6e 61 6d 65  aSetting[i].name
cec0: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 2c  );.    zSep = ",
ced0: 22 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 61 70  ";.  }.  blob_ap
cee0: 70 65 6e 64 5f 73 71 6c 28 26 78 2c 20 22 29 22  pend_sql(&x, ")"
cef0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 6c 6f 62  );.  return blob
cf00: 5f 73 71 6c 5f 74 65 78 74 28 26 78 29 3b 0a 7d  _sql_text(&x);.}
cf10: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 61 6e 20  ../*.** Fill an 
cf20: 65 6d 70 74 79 20 72 65 70 6f 73 69 74 6f 72 79  empty repository
cf30: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
cf40: 68 65 20 62 61 73 69 63 20 69 6e 66 6f 72 6d 61  he basic informa
cf50: 74 69 6f 6e 20 66 6f 72 20 61 0a 2a 2a 20 72 65  tion for a.** re
cf60: 70 6f 73 69 74 6f 72 79 2e 20 54 68 69 73 20 66  pository. This f
cf70: 75 6e 63 74 69 6f 6e 20 69 73 20 73 68 61 72 65  unction is share
cf80: 64 20 62 65 74 77 65 65 6e 20 27 63 72 65 61 74  d between 'creat
cf90: 65 5f 72 65 70 6f 73 69 74 6f 72 79 5f 63 6d 64  e_repository_cmd
cfa0: 27 0a 2a 2a 20 28 27 6e 65 77 27 29 20 61 6e 64  '.** ('new') and
cfb0: 20 27 72 65 63 6f 6e 73 74 72 75 63 74 5f 63 6d   'reconstruct_cm
cfc0: 64 27 20 28 27 72 65 63 6f 6e 73 74 72 75 63 74  d' ('reconstruct
cfd0: 27 29 2c 20 62 6f 74 68 20 6f 66 20 77 68 69 63  '), both of whic
cfe0: 68 20 63 72 65 61 74 65 0a 2a 2a 20 6e 65 77 20  h create.** new 
cff0: 72 65 70 6f 73 69 74 6f 72 69 65 73 2e 0a 2a 2a  repositories..**
d000: 0a 2a 2a 20 54 68 65 20 7a 54 65 6d 70 6c 61 74  .** The zTemplat
d010: 65 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65  e parameter dete
d020: 72 6d 69 6e 65 73 20 69 66 20 74 68 65 20 73 65  rmines if the se
d030: 74 74 69 6e 67 73 20 66 6f 72 20 74 68 65 20 72  ttings for the r
d040: 65 70 6f 73 69 74 6f 72 79 0a 2a 2a 20 73 68 6f  epository.** sho
d050: 75 6c 64 20 62 65 20 63 6f 70 69 65 64 20 66 72  uld be copied fr
d060: 6f 6d 20 61 6e 6f 74 68 65 72 20 72 65 70 6f 73  om another repos
d070: 69 74 6f 72 79 2e 20 20 49 66 20 7a 54 65 6d 70  itory.  If zTemp
d080: 6c 61 74 65 20 69 73 20 30 20 74 68 65 6e 20 74  late is 0 then t
d090: 68 65 0a 2a 2a 20 73 65 74 74 69 6e 67 73 20 77  he.** settings w
d0a0: 69 6c 6c 20 68 61 76 65 20 74 68 65 69 72 20 6e  ill have their n
d0b0: 6f 72 6d 61 6c 20 64 65 66 61 75 6c 74 20 76 61  ormal default va
d0c0: 6c 75 65 73 2e 20 20 49 66 20 7a 54 65 6d 70 6c  lues.  If zTempl
d0d0: 61 74 65 20 69 73 0a 2a 2a 20 6e 6f 6e 2d 7a 65  ate is.** non-ze
d0e0: 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ro, it is assume
d0f0: 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
d100: 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  r of this functi
d110: 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  on has already.*
d120: 2a 20 61 74 74 61 63 68 65 64 20 61 20 64 61 74  * attached a dat
d130: 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
d140: 6c 61 62 65 6c 20 22 73 65 74 74 69 6e 67 53 72  label "settingSr
d150: 63 22 2e 20 20 49 66 20 6e 6f 74 2c 20 74 68 65  c".  If not, the
d160: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73   call to.** this
d170: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 66   function will f
d180: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  ail..**.** The z
d190: 49 6e 69 74 69 61 6c 44 61 74 65 20 70 61 72 61  InitialDate para
d1a0: 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73  meter determines
d1b0: 20 74 68 65 20 64 61 74 65 20 6f 66 20 74 68 65   the date of the
d1c0: 20 69 6e 69 74 69 61 6c 20 63 68 65 63 6b 2d 69   initial check-i
d1d0: 6e 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  n.** that is aut
d1e0: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74  omatically creat
d1f0: 65 64 2e 20 20 49 66 20 7a 49 6e 69 74 69 61 6c  ed.  If zInitial
d200: 44 61 74 65 20 69 73 20 30 20 74 68 65 6e 20 6e  Date is 0 then n
d210: 6f 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 63 68 65  o initial.** che
d220: 63 6b 2d 69 6e 20 69 73 20 63 72 65 61 74 65 64  ck-in is created
d230: 2e 20 54 68 65 20 6d 61 6b 65 53 65 72 76 65 72  . The makeServer
d240: 43 6f 64 65 73 20 66 6c 61 67 20 64 65 74 65 72  Codes flag deter
d250: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72  mines whether or
d260: 0a 2a 2a 20 6e 6f 74 20 73 65 72 76 65 72 20 61  .** not server a
d270: 6e 64 20 70 72 6f 6a 65 63 74 20 63 6f 64 65 73  nd project codes
d280: 20 61 72 65 20 69 6e 76 65 6e 74 65 64 20 66 6f   are invented fo
d290: 72 20 74 68 69 73 20 72 65 70 6f 73 69 74 6f 72  r this repositor
d2a0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 69 6e  y..*/.void db_in
d2b0: 69 74 69 61 6c 5f 73 65 74 75 70 28 0a 20 20 63  itial_setup(.  c
d2c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 6d 70  onst char *zTemp
d2d0: 6c 61 74 65 2c 20 20 20 20 20 20 20 2f 2a 20 52  late,       /* R
d2e0: 65 70 6f 73 69 74 6f 72 79 20 66 72 6f 6d 20 77  epository from w
d2f0: 68 69 63 68 20 74 6f 20 63 6f 70 79 20 73 65 74  hich to copy set
d300: 74 69 6e 67 73 2e 20 2a 2f 0a 20 20 63 6f 6e 73  tings. */.  cons
d310: 74 20 63 68 61 72 20 2a 7a 49 6e 69 74 69 61 6c  t char *zInitial
d320: 44 61 74 65 2c 20 20 20 20 2f 2a 20 49 6e 69 74  Date,    /* Init
d330: 69 61 6c 20 64 61 74 65 20 6f 66 20 72 65 70 6f  ial date of repo
d340: 73 69 74 6f 72 79 2e 20 28 65 78 3a 20 22 6e 6f  sitory. (ex: "no
d350: 77 22 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  w") */.  const c
d360: 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 55 73 65  har *zDefaultUse
d370: 72 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74  r     /* Default
d380: 20 75 73 65 72 20 66 6f 72 20 74 68 65 20 72 65   user for the re
d390: 70 6f 73 69 74 6f 72 79 20 2a 2f 0a 29 7b 0a 20  pository */.){. 
d3a0: 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20   char *zDate;.  
d3b0: 42 6c 6f 62 20 68 61 73 68 3b 0a 20 20 42 6c 6f  Blob hash;.  Blo
d3c0: 62 20 6d 61 6e 69 66 65 73 74 3b 0a 0a 20 20 64  b manifest;..  d
d3d0: 62 5f 73 65 74 28 22 63 6f 6e 74 65 6e 74 2d 73  b_set("content-s
d3e0: 63 68 65 6d 61 22 2c 20 43 4f 4e 54 45 4e 54 5f  chema", CONTENT_
d3f0: 53 43 48 45 4d 41 2c 20 30 29 3b 0a 20 20 64 62  SCHEMA, 0);.  db
d400: 5f 73 65 74 28 22 61 75 78 2d 73 63 68 65 6d 61  _set("aux-schema
d410: 22 2c 20 41 55 58 5f 53 43 48 45 4d 41 5f 4d 41  ", AUX_SCHEMA_MA
d420: 58 2c 20 30 29 3b 0a 20 20 64 62 5f 73 65 74 28  X, 0);.  db_set(
d430: 22 72 65 62 75 69 6c 74 22 2c 20 67 65 74 5f 76  "rebuilt", get_v
d440: 65 72 73 69 6f 6e 28 29 2c 20 30 29 3b 0a 20 20  ersion(), 0);.  
d450: 64 62 5f 73 65 74 28 22 61 64 6d 69 6e 2d 6c 6f  db_set("admin-lo
d460: 67 22 2c 20 22 31 22 2c 20 30 29 3b 0a 20 20 64  g", "1", 0);.  d
d470: 62 5f 73 65 74 28 22 61 63 63 65 73 73 2d 6c 6f  b_set("access-lo
d480: 67 22 2c 20 22 31 22 2c 20 30 29 3b 0a 20 20 64  g", "1", 0);.  d
d490: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20  b_multi_exec(.  
d4a0: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
d4b0: 20 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c   config(name,val
d4c0: 75 65 2c 6d 74 69 6d 65 29 22 0a 20 20 20 20 20  ue,mtime)".     
d4d0: 20 22 20 56 41 4c 55 45 53 28 27 73 65 72 76 65   " VALUES('serve
d4e0: 72 2d 63 6f 64 65 27 2c 20 6c 6f 77 65 72 28 68  r-code', lower(h
d4f0: 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30  ex(randomblob(20
d500: 29 29 29 2c 6e 6f 77 28 29 29 3b 22 0a 20 20 20  ))),now());".   
d510: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
d520: 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c 75  config(name,valu
d530: 65 2c 6d 74 69 6d 65 29 22 0a 20 20 20 20 20 20  e,mtime)".      
d540: 22 20 56 41 4c 55 45 53 28 27 70 72 6f 6a 65 63  " VALUES('projec
d550: 74 2d 63 6f 64 65 27 2c 20 6c 6f 77 65 72 28 68  t-code', lower(h
d560: 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30  ex(randomblob(20
d570: 29 29 29 2c 6e 6f 77 28 29 29 3b 22 0a 20 20 29  ))),now());".  )
d580: 3b 0a 20 20 69 66 28 20 21 64 62 5f 69 73 5f 67  ;.  if( !db_is_g
d590: 6c 6f 62 61 6c 28 22 61 75 74 6f 73 79 6e 63 22  lobal("autosync"
d5a0: 29 20 29 20 64 62 5f 73 65 74 5f 69 6e 74 28 22  ) ) db_set_int("
d5b0: 61 75 74 6f 73 79 6e 63 22 2c 20 31 2c 20 30 29  autosync", 1, 0)
d5c0: 3b 0a 20 20 69 66 28 20 21 64 62 5f 69 73 5f 67  ;.  if( !db_is_g
d5d0: 6c 6f 62 61 6c 28 22 6c 6f 63 61 6c 61 75 74 68  lobal("localauth
d5e0: 22 29 20 29 20 64 62 5f 73 65 74 5f 69 6e 74 28  ") ) db_set_int(
d5f0: 22 6c 6f 63 61 6c 61 75 74 68 22 2c 20 30 2c 20  "localauth", 0, 
d600: 30 29 3b 0a 20 20 69 66 28 20 21 64 62 5f 69 73  0);.  if( !db_is
d610: 5f 67 6c 6f 62 61 6c 28 22 74 69 6d 65 6c 69 6e  _global("timelin
d620: 65 2d 70 6c 61 69 6e 74 65 78 74 22 29 20 29 7b  e-plaintext") ){
d630: 0a 20 20 20 20 64 62 5f 73 65 74 5f 69 6e 74 28  .    db_set_int(
d640: 22 74 69 6d 65 6c 69 6e 65 2d 70 6c 61 69 6e 74  "timeline-plaint
d650: 65 78 74 22 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  ext", 1, 0);.  }
d660: 0a 20 20 64 62 5f 63 72 65 61 74 65 5f 64 65 66  .  db_create_def
d670: 61 75 6c 74 5f 75 73 65 72 73 28 30 2c 20 7a 44  ault_users(0, zD
d680: 65 66 61 75 6c 74 55 73 65 72 29 3b 0a 20 20 69  efaultUser);.  i
d690: 66 28 20 7a 44 65 66 61 75 6c 74 55 73 65 72 20  f( zDefaultUser 
d6a0: 29 20 67 2e 7a 4c 6f 67 69 6e 20 3d 20 7a 44 65  ) g.zLogin = zDe
d6b0: 66 61 75 6c 74 55 73 65 72 3b 0a 20 20 75 73 65  faultUser;.  use
d6c0: 72 5f 73 65 6c 65 63 74 28 29 3b 0a 0a 20 20 69  r_select();..  i
d6d0: 66 28 20 7a 54 65 6d 70 6c 61 74 65 20 29 7b 0a  f( zTemplate ){.
d6e0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 43 6f      /*.    ** Co
d6f0: 70 79 20 61 6c 6c 20 73 65 74 74 69 6e 67 73 20  py all settings 
d700: 66 72 6f 6d 20 74 68 65 20 73 75 70 70 6c 69 65  from the supplie
d710: 64 20 74 65 6d 70 6c 61 74 65 20 72 65 70 6f 73  d template repos
d720: 69 74 6f 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  itory..    */.  
d730: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
d740: 0a 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f  .      "INSERT O
d750: 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 63  R REPLACE INTO c
d760: 6f 6e 66 69 67 22 0a 20 20 20 20 20 20 22 20 53  onfig".      " S
d770: 45 4c 45 43 54 20 6e 61 6d 65 2c 76 61 6c 75 65  ELECT name,value
d780: 2c 6d 74 69 6d 65 20 46 52 4f 4d 20 73 65 74 74  ,mtime FROM sett
d790: 69 6e 67 53 72 63 2e 63 6f 6e 66 69 67 22 0a 20  ingSrc.config". 
d7a0: 20 20 20 20 20 22 20 20 57 48 45 52 45 20 28 6e       "  WHERE (n
d7b0: 61 6d 65 20 49 4e 20 25 73 20 4f 52 20 6e 61 6d  ame IN %s OR nam
d7c0: 65 20 49 4e 20 25 73 20 4f 52 20 6e 61 6d 65 20  e IN %s OR name 
d7d0: 47 4c 4f 42 20 27 77 61 6c 69 61 73 3a 2f 2a 27  GLOB 'walias:/*'
d7e0: 29 22 0a 20 20 20 20 20 20 22 20 20 20 20 41 4e  )".      "    AN
d7f0: 44 20 6e 61 6d 65 20 4e 4f 54 20 47 4c 4f 42 20  D name NOT GLOB 
d800: 27 70 72 6f 6a 65 63 74 2d 2a 27 22 0a 20 20 20  'project-*'".   
d810: 20 20 20 22 20 20 20 20 41 4e 44 20 6e 61 6d 65     "    AND name
d820: 20 4e 4f 54 20 47 4c 4f 42 20 27 73 68 6f 72 74   NOT GLOB 'short
d830: 2d 70 72 6f 6a 65 63 74 2d 2a 27 3b 22 2c 0a 20  -project-*';",. 
d840: 20 20 20 20 20 63 6f 6e 66 69 67 75 72 65 5f 69       configure_i
d850: 6e 6f 70 5f 72 68 73 28 43 4f 4e 46 49 47 53 45  nop_rhs(CONFIGSE
d860: 54 5f 41 4c 4c 29 2c 0a 20 20 20 20 20 20 64 62  T_ALL),.      db
d870: 5f 73 65 74 74 69 6e 67 5f 69 6e 6f 70 5f 72 68  _setting_inop_rh
d880: 73 28 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67  s().    );.    g
d890: 2e 65 48 61 73 68 50 6f 6c 69 63 79 20 3d 20 64  .eHashPolicy = d
d8a0: 62 5f 67 65 74 5f 69 6e 74 28 22 68 61 73 68 2d  b_get_int("hash-
d8b0: 70 6f 6c 69 63 79 22 2c 20 67 2e 65 48 61 73 68  policy", g.eHash
d8c0: 50 6f 6c 69 63 79 29 3b 0a 20 20 20 20 64 62 5f  Policy);.    db_
d8d0: 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20  multi_exec(.    
d8e0: 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
d8f0: 72 65 70 6f 72 74 66 6d 74 20 53 45 4c 45 43 54  reportfmt SELECT
d900: 20 2a 20 46 52 4f 4d 20 73 65 74 74 69 6e 67 53   * FROM settingS
d910: 72 63 2e 72 65 70 6f 72 74 66 6d 74 3b 22 0a 20  rc.reportfmt;". 
d920: 20 20 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20     );..    /*.  
d930: 20 20 2a 2a 20 43 6f 70 79 20 74 68 65 20 75 73    ** Copy the us
d940: 65 72 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20  er permissions, 
d950: 63 6f 6e 74 61 63 74 20 69 6e 66 6f 72 6d 61 74  contact informat
d960: 69 6f 6e 2c 20 6c 61 73 74 20 6d 6f 64 69 66 69  ion, last modifi
d970: 65 64 0a 20 20 20 20 2a 2a 20 74 69 6d 65 2c 20  ed.    ** time, 
d980: 61 6e 64 20 70 68 6f 74 6f 20 66 6f 72 20 61 6c  and photo for al
d990: 6c 20 74 68 65 20 22 73 79 73 74 65 6d 22 20 75  l the "system" u
d9a0: 73 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 75  sers from the su
d9b0: 70 70 6c 69 65 64 0a 20 20 20 20 2a 2a 20 74 65  pplied.    ** te
d9c0: 6d 70 6c 61 74 65 20 72 65 70 6f 73 69 74 6f 72  mplate repositor
d9d0: 79 20 69 6e 74 6f 20 74 68 65 20 6f 6e 65 20 62  y into the one b
d9e0: 65 69 6e 67 20 73 65 74 75 70 2e 20 20 54 68 65  eing setup.  The
d9f0: 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 73 0a 20   other columns. 
da00: 20 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 63 6f     ** are not co
da10: 70 69 65 64 20 62 65 63 61 75 73 65 20 74 68 65  pied because the
da20: 79 20 63 6f 6e 74 61 69 6e 20 73 65 63 75 72 69  y contain securi
da30: 74 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  ty information o
da40: 72 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  r other.    ** d
da50: 61 74 61 20 73 70 65 63 69 66 69 63 20 74 6f 20  ata specific to 
da60: 74 68 65 20 6f 74 68 65 72 20 72 65 70 6f 73 69  the other reposi
da70: 74 6f 72 79 2e 20 20 54 68 65 20 6c 69 73 74 20  tory.  The list 
da80: 6f 66 20 63 6f 6c 75 6d 6e 73 20 63 6f 70 69 65  of columns copie
da90: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
daa0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 6d   SQL statement m
dab0: 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ay need to be re
dac0: 76 69 73 65 64 20 69 6e 20 74 68 65 20 66 75 74  vised in the fut
dad0: 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
dae0: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 55  db_multi_exec("U
daf0: 50 44 41 54 45 20 75 73 65 72 20 53 45 54 22 0a  PDATE user SET".
db00: 20 20 20 20 20 20 22 20 20 63 61 70 20 3d 20 28        "  cap = (
db10: 53 45 4c 45 43 54 20 75 32 2e 63 61 70 20 46 52  SELECT u2.cap FR
db20: 4f 4d 20 73 65 74 74 69 6e 67 53 72 63 2e 75 73  OM settingSrc.us
db30: 65 72 20 75 32 22 0a 20 20 20 20 20 20 22 20 20  er u2".      "  
db40: 20 20 20 20 20 20 20 57 48 45 52 45 20 75 32 2e         WHERE u2.
db50: 6c 6f 67 69 6e 20 3d 20 75 73 65 72 2e 6c 6f 67  login = user.log
db60: 69 6e 29 2c 22 0a 20 20 20 20 20 20 22 20 20 69  in),".      "  i
db70: 6e 66 6f 20 3d 20 28 53 45 4c 45 43 54 20 75 32  nfo = (SELECT u2
db80: 2e 69 6e 66 6f 20 46 52 4f 4d 20 73 65 74 74 69  .info FROM setti
db90: 6e 67 53 72 63 2e 75 73 65 72 20 75 32 22 0a 20  ngSrc.user u2". 
dba0: 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20       "          
dbb0: 57 48 45 52 45 20 75 32 2e 6c 6f 67 69 6e 20 3d  WHERE u2.login =
dbc0: 20 75 73 65 72 2e 6c 6f 67 69 6e 29 2c 22 0a 20   user.login),". 
dbd0: 20 20 20 20 20 22 20 20 6d 74 69 6d 65 20 3d 20       "  mtime = 
dbe0: 28 53 45 4c 45 43 54 20 75 32 2e 6d 74 69 6d 65  (SELECT u2.mtime
dbf0: 20 46 52 4f 4d 20 73 65 74 74 69 6e 67 53 72 63   FROM settingSrc
dc00: 2e 75 73 65 72 20 75 32 22 0a 20 20 20 20 20 20  .user u2".      
dc10: 22 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52  "           WHER
dc20: 45 20 75 32 2e 6c 6f 67 69 6e 20 3d 20 75 73 65  E u2.login = use
dc30: 72 2e 6c 6f 67 69 6e 29 2c 22 0a 20 20 20 20 20  r.login),".     
dc40: 20 22 20 20 70 68 6f 74 6f 20 3d 20 28 53 45 4c   "  photo = (SEL
dc50: 45 43 54 20 75 32 2e 70 68 6f 74 6f 20 46 52 4f  ECT u2.photo FRO
dc60: 4d 20 73 65 74 74 69 6e 67 53 72 63 2e 75 73 65  M settingSrc.use
dc70: 72 20 75 32 22 0a 20 20 20 20 20 20 22 20 20 20  r u2".      "   
dc80: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 75 32          WHERE u2
dc90: 2e 6c 6f 67 69 6e 20 3d 20 75 73 65 72 2e 6c 6f  .login = user.lo
dca0: 67 69 6e 29 22 0a 20 20 20 20 20 20 22 20 57 48  gin)".      " WH
dcb0: 45 52 45 20 75 73 65 72 2e 6c 6f 67 69 6e 20 49  ERE user.login I
dcc0: 4e 20 28 27 61 6e 6f 6e 79 6d 6f 75 73 27 2c 27  N ('anonymous','
dcd0: 6e 6f 62 6f 64 79 27 2c 27 64 65 76 65 6c 6f 70  nobody','develop
dce0: 65 72 27 2c 27 72 65 61 64 65 72 27 29 3b 22 0a  er','reader');".
dcf0: 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66      );.  }..  if
dd00: 28 20 7a 49 6e 69 74 69 61 6c 44 61 74 65 20 29  ( zInitialDate )
dd10: 7b 0a 20 20 20 20 69 6e 74 20 72 69 64 3b 0a 20  {.    int rid;. 
dd20: 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6d 61     blob_zero(&ma
dd30: 6e 69 66 65 73 74 29 3b 0a 20 20 20 20 62 6c 6f  nifest);.    blo
dd40: 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69 66  b_appendf(&manif
dd50: 65 73 74 2c 20 22 43 20 69 6e 69 74 69 61 6c 5c  est, "C initial\
dd60: 5c 73 65 6d 70 74 79 5c 5c 73 63 68 65 63 6b 2d  \sempty\\scheck-
dd70: 69 6e 5c 6e 22 29 3b 0a 20 20 20 20 7a 44 61 74  in\n");.    zDat
dd80: 65 20 3d 20 64 61 74 65 5f 69 6e 5f 73 74 61 6e  e = date_in_stan
dd90: 64 61 72 64 5f 66 6f 72 6d 61 74 28 7a 49 6e 69  dard_format(zIni
dda0: 74 69 61 6c 44 61 74 65 29 3b 0a 20 20 20 20 62  tialDate);.    b
ddb0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e  lob_appendf(&man
ddc0: 69 66 65 73 74 2c 20 22 44 20 25 73 5c 6e 22 2c  ifest, "D %s\n",
ddd0: 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 6d 64 35   zDate);.    md5
dde0: 73 75 6d 5f 69 6e 69 74 28 29 3b 0a 20 20 20 20  sum_init();.    
ddf0: 2f 2a 20 54 68 65 20 52 2d 63 61 72 64 20 69 73  /* The R-card is
de00: 20 6e 65 63 65 73 73 61 72 79 20 68 65 72 65 20   necessary here 
de10: 62 65 63 61 75 73 65 20 77 69 74 68 6f 75 74 20  because without 
de20: 69 74 0a 20 20 20 20 20 2a 20 66 6f 73 73 69 6c  it.     * fossil
de30: 20 76 65 72 73 69 6f 6e 73 20 65 61 72 6c 69 65   versions earlie
de40: 72 20 74 68 61 6e 20 76 65 72 73 69 6f 6e 73 20  r than versions 
de50: 31 2e 32 37 20 77 6f 75 6c 64 0a 20 20 20 20 20  1.27 would.     
de60: 2a 20 69 6e 74 65 72 70 72 65 74 20 74 68 69 73  * interpret this
de70: 20 61 72 74 69 66 61 63 74 20 61 73 20 61 20 22   artifact as a "
de80: 63 6f 6e 74 72 6f 6c 22 2e 20 2a 2f 0a 20 20 20  control". */.   
de90: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d   blob_appendf(&m
dea0: 61 6e 69 66 65 73 74 2c 20 22 52 20 25 73 5c 6e  anifest, "R %s\n
deb0: 22 2c 20 6d 64 35 73 75 6d 5f 66 69 6e 69 73 68  ", md5sum_finish
dec0: 28 30 29 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61  (0));.    blob_a
ded0: 70 70 65 6e 64 66 28 26 6d 61 6e 69 66 65 73 74  ppendf(&manifest
dee0: 2c 20 22 54 20 2a 62 72 61 6e 63 68 20 2a 20 74  , "T *branch * t
def0: 72 75 6e 6b 5c 6e 22 29 3b 0a 20 20 20 20 62 6c  runk\n");.    bl
df00: 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69  ob_appendf(&mani
df10: 66 65 73 74 2c 20 22 54 20 2a 73 79 6d 2d 74 72  fest, "T *sym-tr
df20: 75 6e 6b 20 2a 5c 6e 22 29 3b 0a 20 20 20 20 62  unk *\n");.    b
df30: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e  lob_appendf(&man
df40: 69 66 65 73 74 2c 20 22 55 20 25 46 5c 6e 22 2c  ifest, "U %F\n",
df50: 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 20 20   g.zLogin);.    
df60: 6d 64 35 73 75 6d 5f 62 6c 6f 62 28 26 6d 61 6e  md5sum_blob(&man
df70: 69 66 65 73 74 2c 20 26 68 61 73 68 29 3b 0a 20  ifest, &hash);. 
df80: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
df90: 26 6d 61 6e 69 66 65 73 74 2c 20 22 5a 20 25 62  &manifest, "Z %b
dfa0: 5c 6e 22 2c 20 26 68 61 73 68 29 3b 0a 20 20 20  \n", &hash);.   
dfb0: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 68 61 73   blob_reset(&has
dfc0: 68 29 3b 0a 20 20 20 20 72 69 64 20 3d 20 63 6f  h);.    rid = co
dfd0: 6e 74 65 6e 74 5f 70 75 74 28 26 6d 61 6e 69 66  ntent_put(&manif
dfe0: 65 73 74 29 3b 0a 20 20 20 20 6d 61 6e 69 66 65  est);.    manife
dff0: 73 74 5f 63 72 6f 73 73 6c 69 6e 6b 28 72 69 64  st_crosslink(rid
e000: 2c 20 26 6d 61 6e 69 66 65 73 74 2c 20 4d 43 5f  , &manifest, MC_
e010: 4e 4f 4e 45 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NONE);.  }.}../*
e020: 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 6e 65 77  .** COMMAND: new
e030: 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 69 6e  *.** COMMAND: in
e040: 69 74 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  it.**.** Usage: 
e050: 25 66 6f 73 73 69 6c 20 6e 65 77 20 3f 4f 50 54  %fossil new ?OPT
e060: 49 4f 4e 53 3f 20 46 49 4c 45 4e 41 4d 45 0a 2a  IONS? FILENAME.*
e070: 2a 20 20 20 20 6f 72 3a 20 25 66 6f 73 73 69 6c  *    or: %fossil
e080: 20 69 6e 69 74 20 3f 4f 50 54 49 4f 4e 53 3f 20   init ?OPTIONS? 
e090: 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 43  FILENAME.**.** C
e0a0: 72 65 61 74 65 20 61 20 72 65 70 6f 73 69 74 6f  reate a reposito
e0b0: 72 79 20 66 6f 72 20 61 20 6e 65 77 20 70 72 6f  ry for a new pro
e0c0: 6a 65 63 74 20 69 6e 20 74 68 65 20 66 69 6c 65  ject in the file
e0d0: 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e   named FILENAME.
e0e0: 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
e0f0: 20 69 73 20 64 69 73 74 69 6e 63 74 20 66 72 6f   is distinct fro
e100: 6d 20 22 63 6c 6f 6e 65 22 2e 20 20 54 68 65 20  m "clone".  The 
e110: 22 63 6c 6f 6e 65 22 20 63 6f 6d 6d 61 6e 64 20  "clone" command 
e120: 6d 61 6b 65 73 0a 2a 2a 20 61 20 63 6f 70 79 20  makes.** a copy 
e130: 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70  of an existing p
e140: 72 6f 6a 65 63 74 2e 20 20 54 68 69 73 20 63 6f  roject.  This co
e150: 6d 6d 61 6e 64 20 73 74 61 72 74 73 20 61 20 6e  mmand starts a n
e160: 65 77 20 70 72 6f 6a 65 63 74 2e 0a 2a 2a 0a 2a  ew project..**.*
e170: 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 79 6f  * By default, yo
e180: 75 72 20 63 75 72 72 65 6e 74 20 6c 6f 67 69 6e  ur current login
e190: 20 6e 61 6d 65 20 69 73 20 75 73 65 64 20 74 6f   name is used to
e1a0: 20 63 72 65 61 74 65 20 74 68 65 20 64 65 66 61   create the defa
e1b0: 75 6c 74 0a 2a 2a 20 61 64 6d 69 6e 20 75 73 65  ult.** admin use
e1c0: 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20 6f  r. This can be o
e1d0: 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20  verridden using 
e1e0: 74 68 65 20 2d 41 7c 2d 2d 61 64 6d 69 6e 2d 75  the -A|--admin-u
e1f0: 73 65 72 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ser.** parameter
e200: 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 64 65 66 61 75  ..**.** By defau
e210: 6c 74 2c 20 61 6c 6c 20 73 65 74 74 69 6e 67 73  lt, all settings
e220: 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c   will be initial
e230: 69 7a 65 64 20 74 6f 20 74 68 65 69 72 20 64 65  ized to their de
e240: 66 61 75 6c 74 20 76 61 6c 75 65 73 2e 0a 2a 2a  fault values..**
e250: 20 54 68 69 73 20 63 61 6e 20 62 65 20 6f 76 65   This can be ove
e260: 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68  rridden using th
e270: 65 20 2d 2d 74 65 6d 70 6c 61 74 65 20 70 61 72  e --template par
e280: 61 6d 65 74 65 72 20 74 6f 20 73 70 65 63 69 66  ameter to specif
e290: 79 20 61 0a 2a 2a 20 72 65 70 6f 73 69 74 6f 72  y a.** repositor
e2a0: 79 20 66 69 6c 65 20 66 72 6f 6d 20 77 68 69 63  y file from whic
e2b0: 68 20 74 6f 20 63 6f 70 79 20 74 68 65 20 69 6e  h to copy the in
e2c0: 69 74 69 61 6c 20 73 65 74 74 69 6e 67 73 2e 20  itial settings. 
e2d0: 20 57 68 65 6e 20 61 20 74 65 6d 70 6c 61 74 65   When a template
e2e0: 0a 2a 2a 20 72 65 70 6f 73 69 74 6f 72 79 20 69  .** repository i
e2f0: 73 20 75 73 65 64 2c 20 61 6c 6d 6f 73 74 20 61  s used, almost a
e300: 6c 6c 20 6f 66 20 74 68 65 20 73 65 74 74 69 6e  ll of the settin
e310: 67 73 20 61 63 63 65 73 73 69 62 6c 65 20 66 72  gs accessible fr
e320: 6f 6d 20 74 68 65 20 73 65 74 75 70 0a 2a 2a 20  om the setup.** 
e330: 70 61 67 65 2c 20 65 69 74 68 65 72 20 64 69 72  page, either dir
e340: 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63  ectly or indirec
e350: 74 6c 79 2c 20 77 69 6c 6c 20 62 65 20 63 6f 70  tly, will be cop
e360: 69 65 64 2e 20 20 4e 6f 72 6d 61 6c 20 75 73 65  ied.  Normal use
e370: 72 73 20 61 6e 64 0a 2a 2a 20 74 68 65 69 72 20  rs and.** their 
e380: 61 73 73 6f 63 69 61 74 65 64 20 70 65 72 6d 69  associated permi
e390: 73 73 69 6f 6e 73 20 77 69 6c 6c 20 6e 6f 74 20  ssions will not 
e3a0: 62 65 20 63 6f 70 69 65 64 3b 20 68 6f 77 65 76  be copied; howev
e3b0: 65 72 2c 20 74 68 65 20 73 79 73 74 65 6d 0a 2a  er, the system.*
e3c0: 2a 20 64 65 66 61 75 6c 74 20 75 73 65 72 73 20  * default users 
e3d0: 22 61 6e 6f 6e 79 6d 6f 75 73 22 2c 20 22 6e 6f  "anonymous", "no
e3e0: 62 6f 64 79 22 2c 20 22 72 65 61 64 65 72 22 2c  body", "reader",
e3f0: 20 22 64 65 76 65 6c 6f 70 65 72 22 2c 20 61 6e   "developer", an
e400: 64 20 74 68 65 69 72 0a 2a 2a 20 61 73 73 6f 63  d their.** assoc
e410: 69 61 74 65 64 20 70 65 72 6d 69 73 73 69 6f 6e  iated permission
e420: 73 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64  s will be copied
e430: 2e 0a 2a 2a 0a 2a 2a 20 4f 70 74 69 6f 6e 73 3a  ..**.** Options:
e440: 0a 2a 2a 20 20 20 20 2d 2d 74 65 6d 70 6c 61 74  .**    --templat
e450: 65 20 20 20 20 20 20 46 49 4c 45 20 20 20 20 20  e      FILE     
e460: 20 20 20 20 43 6f 70 79 20 73 65 74 74 69 6e 67      Copy setting
e470: 73 20 66 72 6f 6d 20 72 65 70 6f 73 69 74 6f 72  s from repositor
e480: 79 20 66 69 6c 65 0a 2a 2a 20 20 20 20 2d 2d 61  y file.**    --a
e490: 64 6d 69 6e 2d 75 73 65 72 7c 2d 41 20 55 53 45  dmin-user|-A USE
e4a0: 52 4e 41 4d 45 20 20 20 20 20 53 65 6c 65 63 74  RNAME     Select
e4b0: 20 67 69 76 65 6e 20 55 53 45 52 4e 41 4d 45 20   given USERNAME 
e4c0: 61 73 20 61 64 6d 69 6e 20 75 73 65 72 0a 2a 2a  as admin user.**
e4d0: 20 20 20 20 2d 2d 64 61 74 65 2d 6f 76 65 72 72      --date-overr
e4e0: 69 64 65 20 44 41 54 45 54 49 4d 45 20 20 20 20  ide DATETIME    
e4f0: 20 55 73 65 20 44 41 54 45 54 49 4d 45 20 61 73   Use DATETIME as
e500: 20 74 69 6d 65 20 6f 66 20 74 68 65 20 69 6e 69   time of the ini
e510: 74 69 61 6c 20 63 68 65 63 6b 2d 69 6e 0a 2a 2a  tial check-in.**
e520: 20 20 20 20 2d 2d 73 68 61 31 20 20 20 20 20 20      --sha1      
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 20 55 73 65 20 61 20 69 6e 69 74 69 61 6c 20 68   Use a initial h
e550: 61 73 68 20 70 6f 6c 69 63 79 20 6f 66 20 22 73  ash policy of "s
e560: 68 61 31 22 0a 2a 2a 0a 2a 2a 20 44 41 54 45 54  ha1".**.** DATET
e570: 49 4d 45 20 6d 61 79 20 62 65 20 22 6e 6f 77 22  IME may be "now"
e580: 20 6f 72 20 22 59 59 59 59 2d 4d 4d 2d 44 44 54   or "YYYY-MM-DDT
e590: 48 48 3a 4d 4d 3a 53 53 2e 53 53 53 22 2e 20 49  HH:MM:SS.SSS". I
e5a0: 66 20 69 6e 0a 2a 2a 20 79 65 61 72 2d 6d 6f 6e  f in.** year-mon
e5b0: 74 68 2d 64 61 79 20 66 6f 72 6d 2c 20 69 74 20  th-day form, it 
e5c0: 6d 61 79 20 62 65 20 74 72 75 6e 63 61 74 65 64  may be truncated
e5d0: 2c 20 74 68 65 20 22 54 22 20 6d 61 79 20 62 65  , the "T" may be
e5e0: 20 72 65 70 6c 61 63 65 64 20 62 79 0a 2a 2a 20   replaced by.** 
e5f0: 61 20 73 70 61 63 65 2c 20 61 6e 64 20 69 74 20  a space, and it 
e600: 6d 61 79 20 61 6c 73 6f 20 6e 61 6d 65 20 61 20  may also name a 
e610: 74 69 6d 65 7a 6f 6e 65 20 6f 66 66 73 65 74 20  timezone offset 
e620: 66 72 6f 6d 20 55 54 43 20 61 73 20 22 2d 48 48  from UTC as "-HH
e630: 3a 4d 4d 22 0a 2a 2a 20 28 77 65 73 74 77 61 72  :MM".** (westwar
e640: 64 29 20 6f 72 20 22 2b 48 48 3a 4d 4d 22 20 28  d) or "+HH:MM" (
e650: 65 61 73 74 77 61 72 64 29 2e 20 45 69 74 68 65  eastward). Eithe
e660: 72 20 6e 6f 20 74 69 6d 65 7a 6f 6e 65 20 73 75  r no timezone su
e670: 66 66 69 78 20 6f 72 20 22 5a 22 0a 2a 2a 20 6d  ffix or "Z".** m
e680: 65 61 6e 73 20 55 54 43 2e 0a 2a 2a 0a 2a 2a 20  eans UTC..**.** 
e690: 53 65 65 20 61 6c 73 6f 3a 20 63 6c 6f 6e 65 0a  See also: clone.
e6a0: 2a 2f 0a 76 6f 69 64 20 63 72 65 61 74 65 5f 72  */.void create_r
e6b0: 65 70 6f 73 69 74 6f 72 79 5f 63 6d 64 28 76 6f  epository_cmd(vo
e6c0: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 61  id){.  char *zPa
e6d0: 73 73 77 6f 72 64 3b 0a 20 20 63 6f 6e 73 74 20  ssword;.  const 
e6e0: 63 68 61 72 20 2a 7a 54 65 6d 70 6c 61 74 65 3b  char *zTemplate;
e6f0: 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 73 69 74        /* Reposit
e700: 6f 72 79 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ory from which t
e710: 6f 20 63 6f 70 79 20 73 65 74 74 69 6e 67 73 20  o copy settings 
e720: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e730: 2a 7a 44 61 74 65 3b 20 20 20 20 20 20 20 20 20  *zDate;         
e740: 20 2f 2a 20 44 61 74 65 20 6f 66 20 74 68 65 20   /* Date of the 
e750: 69 6e 69 74 69 61 6c 20 63 68 65 63 6b 2d 69 6e  initial check-in
e760: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e770: 20 2a 7a 44 65 66 61 75 6c 74 55 73 65 72 3b 20   *zDefaultUser; 
e780: 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6e 61    /* Optional na
e790: 6d 65 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  me of the defaul
e7a0: 74 20 75 73 65 72 20 2a 2f 0a 20 20 69 6e 74 20  t user */.  int 
e7b0: 62 55 73 65 53 68 61 31 20 3d 20 30 3b 20 20 20  bUseSha1 = 0;   
e7c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
e7d0: 74 6f 20 73 65 74 20 74 68 65 20 68 61 73 68 2d  to set the hash-
e7e0: 70 6f 6c 69 63 79 20 74 6f 20 73 68 61 31 20 2a  policy to sha1 *
e7f0: 2f 0a 0a 0a 20 20 7a 54 65 6d 70 6c 61 74 65 20  /...  zTemplate 
e800: 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 74  = find_option("t
e810: 65 6d 70 6c 61 74 65 22 2c 30 2c 31 29 3b 0a 20  emplate",0,1);. 
e820: 20 7a 44 61 74 65 20 3d 20 66 69 6e 64 5f 6f 70   zDate = find_op
e830: 74 69 6f 6e 28 22 64 61 74 65 2d 6f 76 65 72 72  tion("date-overr
e840: 69 64 65 22 2c 30 2c 31 29 3b 0a 20 20 7a 44 65  ide",0,1);.  zDe
e850: 66 61 75 6c 74 55 73 65 72 20 3d 20 66 69 6e 64  faultUser = find
e860: 5f 6f 70 74 69 6f 6e 28 22 61 64 6d 69 6e 2d 75  _option("admin-u
e870: 73 65 72 22 2c 22 41 22 2c 31 29 3b 0a 20 20 62  ser","A",1);.  b
e880: 55 73 65 53 68 61 31 20 3d 20 66 69 6e 64 5f 6f  UseSha1 = find_o
e890: 70 74 69 6f 6e 28 22 73 68 61 31 22 2c 30 2c 30  ption("sha1",0,0
e8a0: 29 21 3d 30 3b 0a 20 20 2f 2a 20 57 65 20 73 68  )!=0;.  /* We sh
e8b0: 6f 75 6c 64 20 62 65 20 64 6f 6e 65 20 77 69 74  ould be done wit
e8c0: 68 20 6f 70 74 69 6f 6e 73 2e 2e 20 2a 2f 0a 20  h options.. */. 
e8d0: 20 76 65 72 69 66 79 5f 61 6c 6c 5f 6f 70 74 69   verify_all_opti
e8e0: 6f 6e 73 28 29 3b 0a 0a 20 20 69 66 28 20 67 2e  ons();..  if( g.
e8f0: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 75  argc!=3 ){.    u
e900: 73 61 67 65 28 22 52 45 50 4f 53 49 54 4f 52 59  sage("REPOSITORY
e910: 2d 4e 41 4d 45 22 29 3b 0a 20 20 7d 0a 0a 20 20  -NAME");.  }..  
e920: 69 66 28 20 2d 31 20 21 3d 20 66 69 6c 65 5f 73  if( -1 != file_s
e930: 69 7a 65 28 67 2e 61 72 67 76 5b 32 5d 2c 20 45  ize(g.argv[2], E
e940: 78 74 46 49 4c 45 29 20 29 7b 0a 20 20 20 20 66  xtFILE) ){.    f
e950: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 66 69 6c  ossil_fatal("fil
e960: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
e970: 3a 20 25 73 22 2c 20 67 2e 61 72 67 76 5b 32 5d  : %s", g.argv[2]
e980: 29 3b 0a 20 20 7d 0a 0a 20 20 64 62 5f 63 72 65  );.  }..  db_cre
e990: 61 74 65 5f 72 65 70 6f 73 69 74 6f 72 79 28 67  ate_repository(g
e9a0: 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 64 62 5f  .argv[2]);.  db_
e9b0: 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28  open_repository(
e9c0: 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 64 62  g.argv[2]);.  db
e9d0: 5f 6f 70 65 6e 5f 63 6f 6e 66 69 67 28 30 2c 20  _open_config(0, 
e9e0: 30 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70 6c  0);.  if( zTempl
e9f0: 61 74 65 20 29 20 64 62 5f 61 74 74 61 63 68 28  ate ) db_attach(
ea00: 7a 54 65 6d 70 6c 61 74 65 2c 20 22 73 65 74 74  zTemplate, "sett
ea10: 69 6e 67 53 72 63 22 29 3b 0a 20 20 64 62 5f 62  ingSrc");.  db_b
ea20: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
ea30: 28 29 3b 0a 20 20 69 66 28 20 62 55 73 65 53 68  ();.  if( bUseSh
ea40: 61 31 20 29 7b 0a 20 20 20 20 67 2e 65 48 61 73  a1 ){.    g.eHas
ea50: 68 50 6f 6c 69 63 79 20 3d 20 48 50 4f 4c 49 43  hPolicy = HPOLIC
ea60: 59 5f 53 48 41 31 3b 0a 20 20 20 20 64 62 5f 73  Y_SHA1;.    db_s
ea70: 65 74 5f 69 6e 74 28 22 68 61 73 68 2d 70 6f 6c  et_int("hash-pol
ea80: 69 63 79 22 2c 20 48 50 4f 4c 49 43 59 5f 53 48  icy", HPOLICY_SH
ea90: 41 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  A1, 0);.  }.  if
eaa0: 28 20 7a 44 61 74 65 3d 3d 30 20 29 20 7a 44 61  ( zDate==0 ) zDa
eab0: 74 65 20 3d 20 22 6e 6f 77 22 3b 0a 20 20 64 62  te = "now";.  db
eac0: 5f 69 6e 69 74 69 61 6c 5f 73 65 74 75 70 28 7a  _initial_setup(z
ead0: 54 65 6d 70 6c 61 74 65 2c 20 7a 44 61 74 65 2c  Template, zDate,
eae0: 20 7a 44 65 66 61 75 6c 74 55 73 65 72 29 3b 0a   zDefaultUser);.
eaf0: 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63    db_end_transac
eb00: 74 69 6f 6e 28 30 29 3b 0a 20 20 69 66 28 20 7a  tion(0);.  if( z
eb10: 54 65 6d 70 6c 61 74 65 20 29 20 64 62 5f 64 65  Template ) db_de
eb20: 74 61 63 68 28 22 73 65 74 74 69 6e 67 53 72 63  tach("settingSrc
eb30: 22 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69  ");.  fossil_pri
eb40: 6e 74 28 22 70 72 6f 6a 65 63 74 2d 69 64 3a 20  nt("project-id: 
eb50: 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28 22 70  %s\n", db_get("p
eb60: 72 6f 6a 65 63 74 2d 63 6f 64 65 22 2c 20 30 29  roject-code", 0)
eb70: 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e  );.  fossil_prin
eb80: 74 28 22 73 65 72 76 65 72 2d 69 64 3a 20 20 25  t("server-id:  %
eb90: 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28 22 73 65  s\n", db_get("se
eba0: 72 76 65 72 2d 63 6f 64 65 22 2c 20 30 29 29 3b  rver-code", 0));
ebb0: 0a 20 20 7a 50 61 73 73 77 6f 72 64 20 3d 20 64  .  zPassword = d
ebc0: 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43  b_text(0, "SELEC
ebd0: 54 20 70 77 20 46 52 4f 4d 20 75 73 65 72 20 57  T pw FROM user W
ebe0: 48 45 52 45 20 6c 6f 67 69 6e 3d 25 51 22 2c 20  HERE login=%Q", 
ebf0: 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 66 6f 73  g.zLogin);.  fos
ec00: 73 69 6c 5f 70 72 69 6e 74 28 22 61 64 6d 69 6e  sil_print("admin
ec10: 2d 75 73 65 72 3a 20 25 73 20 28 69 6e 69 74 69  -user: %s (initi
ec20: 61 6c 20 70 61 73 73 77 6f 72 64 20 69 73 20 5c  al password is \
ec30: 22 25 73 5c 22 29 5c 6e 22 2c 0a 20 20 20 20 20  "%s\")\n",.     
ec40: 20 20 20 20 20 20 20 20 20 20 67 2e 7a 4c 6f 67            g.zLog
ec50: 69 6e 2c 20 7a 50 61 73 73 77 6f 72 64 29 3b 0a  in, zPassword);.
ec60: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e  }../*.** SQL fun
ec70: 63 74 69 6f 6e 73 20 66 6f 72 20 64 65 62 75 67  ctions for debug
ec80: 67 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ging..**.** The 
ec90: 70 72 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  print() function
eca0: 20 77 72 69 74 65 73 20 69 74 73 20 61 72 67 75   writes its argu
ecb0: 6d 65 6e 74 73 20 6f 6e 20 73 74 64 6f 75 74 2c  ments on stdout,
ecc0: 20 62 75 74 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20   but only.** if 
ecd0: 74 68 65 20 2d 73 71 6c 70 72 69 6e 74 20 63 6f  the -sqlprint co
ece0: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
ecf0: 6e 20 69 73 20 74 75 72 6e 65 64 20 6f 6e 2e 0a  n is turned on..
ed00: 2a 2f 0a 4c 4f 43 41 4c 20 76 6f 69 64 20 64 62  */.LOCAL void db
ed10: 5f 73 71 6c 5f 70 72 69 6e 74 28 0a 20 20 73 71  _sql_print(.  sq
ed20: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
ed30: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
ed40: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
ed50: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
ed60: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 67 2e 66  int i;.  if( g.f
ed70: 53 71 6c 50 72 69 6e 74 20 29 7b 0a 20 20 20 20  SqlPrint ){.    
ed80: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
ed90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
eda0: 72 20 63 20 3d 20 69 3d 3d 61 72 67 63 2d 31 20  r c = i==argc-1 
edb0: 3f 20 27 5c 6e 27 20 3a 20 27 20 27 3b 0a 20 20  ? '\n' : ' ';.  
edc0: 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74      fossil_print
edd0: 28 22 25 73 25 63 22 2c 20 73 71 6c 69 74 65 33  ("%s%c", sqlite3
ede0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
edf0: 5b 69 5d 29 2c 20 63 29 3b 0a 20 20 20 20 7d 0a  [i]), c);.    }.
ee00: 20 20 7d 0a 7d 0a 4c 4f 43 41 4c 20 69 6e 74 20    }.}.LOCAL int 
ee10: 64 62 5f 73 71 6c 5f 74 72 61 63 65 28 75 6e 73  db_sql_trace(uns
ee20: 69 67 6e 65 64 20 6d 2c 20 76 6f 69 64 20 2a 6e  igned m, void *n
ee30: 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 50  otUsed, void *pP
ee40: 2c 20 76 6f 69 64 20 2a 70 58 29 7b 0a 20 20 73  , void *pX){.  s
ee50: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
ee60: 6d 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74  mt = (sqlite3_st
ee70: 6d 74 2a 29 70 50 3b 0a 20 20 63 68 61 72 20 2a  mt*)pP;.  char *
ee80: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  zSql;.  int n;. 
ee90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
eea0: 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  g = (const char*
eeb0: 29 70 58 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b  )pX;.  if( zArg[
eec0: 30 5d 3d 3d 27 2d 27 20 29 20 72 65 74 75 72 6e  0]=='-' ) return
eed0: 20 30 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c   0;.  zSql = sql
eee0: 69 74 65 33 5f 65 78 70 61 6e 64 65 64 5f 73 71  ite3_expanded_sq
eef0: 6c 28 70 53 74 6d 74 29 3b 0a 20 20 6e 20 3d 20  l(pStmt);.  n = 
ef00: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 53 71 6c  (int)strlen(zSql
ef10: 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 74 72 61 63  );.  fossil_trac
ef20: 65 28 22 25 73 25 73 5c 6e 22 2c 20 7a 53 71 6c  e("%s%s\n", zSql
ef30: 2c 20 28 6e 3e 30 20 26 26 20 7a 53 71 6c 5b 6e  , (n>0 && zSql[n
ef40: 2d 31 5d 3d 3d 27 3b 27 29 20 3f 20 22 22 20 3a  -1]==';') ? "" :
ef50: 20 22 3b 22 29 3b 0a 20 20 73 71 6c 69 74 65 33   ";");.  sqlite3
ef60: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 72  _free(zSql);.  r
ef70: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
ef80: 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
ef90: 75 73 65 72 28 29 20 53 51 4c 20 66 75 6e 63 74  user() SQL funct
efa0: 69 6f 6e 2e 20 20 75 73 65 72 28 29 20 74 61 6b  ion.  user() tak
efb0: 65 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  es no arguments 
efc0: 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74  and.** returns t
efd0: 68 65 20 75 73 65 72 20 49 44 20 6f 66 20 74 68  he user ID of th
efe0: 65 20 63 75 72 72 65 6e 74 20 75 73 65 72 2e 0a  e current user..
eff0: 2a 2f 0a 4c 4f 43 41 4c 20 76 6f 69 64 20 64 62  */.LOCAL void db
f000: 5f 73 71 6c 5f 75 73 65 72 28 0a 20 20 73 71 6c  _sql_user(.  sql
f010: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
f020: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
f030: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
f040: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
f050: 66 28 20 67 2e 7a 4c 6f 67 69 6e 21 3d 30 20 29  f( g.zLogin!=0 )
f060: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
f070: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
f080: 74 2c 20 67 2e 7a 4c 6f 67 69 6e 2c 20 2d 31 2c  t, g.zLogin, -1,
f090: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
f0a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  .  }.}../*.** Im
f0b0: 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 67 69 28  plement the cgi(
f0c0: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  ) SQL function. 
f0d0: 20 63 67 69 28 29 20 74 61 6b 65 73 20 61 6e 20   cgi() takes an 
f0e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
f0f0: 73 0a 2a 2a 20 61 20 6e 61 6d 65 20 6f 66 20 43  s.** a name of C
f100: 47 49 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  GI query paramet
f110: 65 72 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66  er. The value of
f120: 20 74 68 61 74 20 70 61 72 61 6d 65 74 65 72 20   that parameter 
f130: 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20  is returned,.** 
f140: 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 20 4f 70  if available. Op
f150: 74 69 6f 6e 61 6c 20 73 65 63 6f 6e 64 20 61 72  tional second ar
f160: 67 75 6d 65 6e 74 20 77 69 6c 6c 20 62 65 20 72  gument will be r
f170: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 66  eturned if the f
f180: 69 72 73 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  irst.** doesn't 
f190: 65 78 69 73 74 20 61 73 20 61 20 43 47 49 20 70  exist as a CGI p
f1a0: 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 4c 4f 43  arameter..*/.LOC
f1b0: 41 4c 20 76 6f 69 64 20 64 62 5f 73 71 6c 5f 63  AL void db_sql_c
f1c0: 67 69 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  gi(sqlite3_conte
f1d0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
f1e0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
f1f0: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
f200: 63 6f 6e 73 74 20 63 68 61 72 2a 20 7a 50 3b 0a  const char* zP;.
f210: 20 20 69 66 28 20 61 72 67 63 21 3d 31 20 26 26    if( argc!=1 &&
f220: 20 61 72 67 63 21 3d 32 20 29 20 72 65 74 75 72   argc!=2 ) retur
f230: 6e 3b 0a 20 20 7a 50 20 3d 20 50 28 28 63 6f 6e  n;.  zP = P((con
f240: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
f250: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
f260: 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 7a 50 20  [0]));.  if( zP 
f270: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
f280: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
f290: 78 74 2c 20 7a 50 2c 20 2d 31 2c 20 53 51 4c 49  xt, zP, -1, SQLI
f2a0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 65  TE_STATIC);.  }e
f2b0: 6c 73 65 20 69 66 28 20 61 72 67 63 3d 3d 32 20  lse if( argc==2 
f2c0: 29 7b 0a 20 20 20 20 7a 50 20 3d 20 28 63 6f 6e  ){.    zP = (con
f2d0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
f2e0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
f2f0: 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  [1]);.    if( zP
f300: 20 29 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c   ) sqlite3_resul
f310: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
f320: 7a 50 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  zP, -1, SQLITE_T
f330: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d  RANSIENT);.  }.}
f340: 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63  ../*.** SQL func
f350: 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  tion:.**.**     
f360: 20 20 69 73 5f 73 65 6c 65 63 74 65 64 28 69 64    is_selected(id
f370: 29 0a 2a 2a 20 20 20 20 20 20 20 69 66 5f 73 65  ).**       if_se
f380: 6c 65 63 74 65 64 28 69 64 2c 20 58 2c 20 59 29  lected(id, X, Y)
f390: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 74 68 65 20 63 6f  .**.** On the co
f3a0: 6d 6d 69 74 20 63 6f 6d 6d 61 6e 64 2c 20 77 68  mmit command, wh
f3b0: 65 6e 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  en filenames are
f3c0: 20 73 70 65 63 69 66 69 65 64 20 28 69 6e 20 6f   specified (in o
f3d0: 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 61 20  rder to do.** a 
f3e0: 70 61 72 74 69 61 6c 20 63 6f 6d 6d 69 74 29 20  partial commit) 
f3f0: 74 68 65 20 76 66 69 6c 65 2e 69 64 20 76 61 6c  the vfile.id val
f400: 75 65 73 20 66 6f 72 20 74 68 65 20 6e 61 6d 65  ues for the name
f410: 64 20 66 69 6c 65 73 20 61 72 65 20 6c 6f 61 64  d files are load
f420: 65 64 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 67  ed.** into the g
f430: 2e 61 43 6f 6d 6d 69 74 46 69 6c 65 5b 5d 20 61  .aCommitFile[] a
f440: 72 72 61 79 2e 20 20 54 68 69 73 20 66 75 6e 63  rray.  This func
f450: 74 69 6f 6e 20 6c 6f 6f 6b 73 20 61 74 20 74 68  tion looks at th
f460: 61 74 20 61 72 72 61 79 0a 2a 2a 20 74 6f 20 73  at array.** to s
f470: 65 65 20 69 66 20 61 20 66 69 6c 65 20 69 73 20  ee if a file is 
f480: 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d  named on the com
f490: 6d 61 6e 64 2d 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a  mand-line..**.**
f4a0: 20 49 6e 20 74 68 65 20 66 69 72 73 74 20 66 6f   In the first fo
f4b0: 72 6d 20 28 31 20 61 72 67 75 6d 65 6e 74 29 20  rm (1 argument) 
f4c0: 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 65  return TRUE if e
f4d0: 69 74 68 65 72 20 6e 6f 20 66 69 6c 65 73 20 61  ither no files a
f4e0: 72 65 0a 2a 2a 20 6e 61 6d 65 64 20 6f 6e 20 74  re.** named on t
f4f0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
f500: 28 67 2e 61 43 6f 6d 6d 69 74 46 69 6c 65 20 69  (g.aCommitFile i
f510: 73 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74  s NULL meaning t
f520: 68 61 74 20 61 6c 6c 0a 2a 2a 20 63 68 61 6e 67  hat all.** chang
f530: 65 73 20 61 72 65 20 74 6f 20 62 65 20 63 6f 6d  es are to be com
f540: 6d 69 74 74 65 64 29 20 6f 72 20 69 66 20 69 64  mitted) or if id
f550: 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 67 2e 61   is found in g.a
f560: 43 6f 6d 6d 69 74 46 69 6c 65 5b 5d 0a 2a 2a 20  CommitFile[].** 
f570: 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 64  (meaning that id
f580: 20 77 61 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68   was named on th
f590: 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 29 2e  e command-line).
f5a0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 73 65  .**.** In the se
f5b0: 63 6f 6e 64 20 66 6f 72 6d 20 28 33 20 61 72 67  cond form (3 arg
f5c0: 75 6d 65 6e 74 73 29 20 72 65 74 75 72 6e 20 61  uments) return a
f5d0: 72 67 75 6d 65 6e 74 20 58 20 69 66 20 74 72 75  rgument X if tru
f5e0: 65 20 61 6e 64 20 59 0a 2a 2a 20 69 66 20 66 61  e and Y.** if fa
f5f0: 6c 73 65 2e 20 20 45 78 63 65 70 74 20 69 66 20  lse.  Except if 
f600: 59 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  Y is NULL then a
f610: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 58 2e 0a  lways return X..
f620: 2a 2f 0a 4c 4f 43 41 4c 20 76 6f 69 64 20 66 69  */.LOCAL void fi
f630: 6c 65 5f 69 73 5f 73 65 6c 65 63 74 65 64 28 0a  le_is_selected(.
f640: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
f650: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
f660: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
f670: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
f680: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
f690: 0a 20 20 61 73 73 65 72 74 28 61 72 67 63 3d 3d  .  assert(argc==
f6a0: 31 20 7c 7c 20 61 72 67 63 3d 3d 33 29 3b 0a 20  1 || argc==3);. 
f6b0: 20 69 66 28 20 67 2e 61 43 6f 6d 6d 69 74 46 69   if( g.aCommitFi
f6c0: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49  le ){.    int iI
f6d0: 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
f6e0: 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a  e_int(argv[0]);.
f6f0: 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
f700: 66 6f 72 28 69 69 3d 30 3b 20 67 2e 61 43 6f 6d  for(ii=0; g.aCom
f710: 6d 69 74 46 69 6c 65 5b 69 69 5d 3b 20 69 69 2b  mitFile[ii]; ii+
f720: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 49  +){.      if( iI
f730: 64 3d 3d 67 2e 61 43 6f 6d 6d 69 74 46 69 6c 65  d==g.aCommitFile
f740: 5b 69 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  [ii] ){.        
f750: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
f760: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
f770: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
f780: 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20    rc = 1;.  }.  
f790: 69 66 28 20 61 72 67 63 3d 3d 31 20 29 7b 0a 20  if( argc==1 ){. 
f7a0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
f7b0: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 72  t_int(context, r
f7c0: 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  c);.  }else{.   
f7d0: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 33   assert( argc==3
f7e0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f7f0: 72 63 3d 3d 30 20 7c 7c 20 72 63 3d 3d 31 20 29  rc==0 || rc==1 )
f800: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
f810: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
f820: 76 5b 32 2d 72 63 5d 29 3d 3d 53 51 4c 49 54 45  v[2-rc])==SQLITE
f830: 5f 4e 55 4c 4c 20 29 20 72 63 20 3d 20 31 2d 72  _NULL ) rc = 1-r
f840: 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  c;.    sqlite3_r
f850: 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74  esult_value(cont
f860: 65 78 74 2c 20 61 72 67 76 5b 32 2d 72 63 5d 29  ext, argv[2-rc])
f870: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
f880: 6f 6e 76 65 72 74 20 74 68 65 20 69 6e 70 75 74  onvert the input
f890: 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 61   string into a a
f8a0: 72 74 69 66 61 63 74 20 68 61 73 68 2e 20 20 4d  rtifact hash.  M
f8b0: 61 6b 65 20 61 20 6e 6f 74 61 74 69 6f 6e 20 69  ake a notation i
f8c0: 6e 20 74 68 65 0a 2a 2a 20 43 4f 4e 43 45 41 4c  n the.** CONCEAL
f8d0: 45 44 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74  ED table so that
f8e0: 20 74 68 65 20 68 61 73 68 20 63 61 6e 20 62 65   the hash can be
f8f0: 20 75 6e 64 6f 20 75 73 69 6e 67 20 74 68 65 20   undo using the 
f900: 64 62 5f 72 65 76 65 61 6c 28 29 0a 2a 2a 20 66  db_reveal().** f
f910: 75 6e 63 74 69 6f 6e 20 61 74 20 73 6f 6d 65 20  unction at some 
f920: 6c 61 74 65 72 20 74 69 6d 65 2e 0a 2a 2a 0a 2a  later time..**.*
f930: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
f940: 72 6e 65 64 20 69 73 20 73 74 6f 72 65 64 20 69  rned is stored i
f950: 6e 20 73 74 61 74 69 63 20 73 70 61 63 65 20 61  n static space a
f960: 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  nd will be overw
f970: 72 69 74 74 65 6e 0a 2a 2a 20 6f 6e 20 73 75 62  ritten.** on sub
f980: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2e 0a 2a  sequent calls..*
f990: 2a 0a 2a 2a 20 49 66 20 7a 43 6f 6e 74 65 6e 74  *.** If zContent
f9a0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 77 65   is already a we
f9b0: 6c 6c 2d 66 6f 72 6d 65 64 20 61 72 74 69 66 61  ll-formed artifa
f9c0: 63 74 20 68 61 73 68 2c 20 74 68 65 6e 20 72 65  ct hash, then re
f9d0: 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f  turn a copy.** o
f9e0: 66 20 74 68 61 74 20 68 61 73 68 2c 20 6e 6f 74  f that hash, not
f9f0: 20 61 20 68 61 73 68 20 6f 66 20 74 68 65 20 68   a hash of the h
fa00: 61 73 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 43  ash..**.** The C
fa10: 4f 4e 43 45 41 4c 45 44 20 74 61 62 6c 65 20 69  ONCEALED table i
fa20: 73 20 6d 65 61 6e 74 20 74 6f 20 6f 62 73 63 75  s meant to obscu
fa30: 72 65 20 65 6d 61 69 6c 20 61 64 64 72 65 73 73  re email address
fa40: 65 73 2e 20 20 45 76 65 72 79 20 76 61 6c 69 64  es.  Every valid
fa50: 0a 2a 2a 20 65 6d 61 69 6c 20 61 64 64 72 65 73  .** email addres
fa60: 73 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61  s will contain a
fa70: 20 22 40 22 20 63 68 61 72 61 63 74 65 72 20 61   "@" character a
fa80: 6e 64 20 22 40 22 20 69 73 20 6e 6f 74 20 76 61  nd "@" is not va
fa90: 6c 69 64 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20  lid within.** a 
faa0: 53 48 41 31 20 68 61 73 68 20 73 6f 20 74 68 65  SHA1 hash so the
fab0: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
fac0: 74 68 61 74 20 61 20 76 61 6c 69 64 20 65 6d 61  that a valid ema
fad0: 69 6c 20 61 64 64 72 65 73 73 20 77 69 6c 6c 20  il address will 
fae0: 67 6f 0a 2a 2a 20 75 6e 63 6f 6e 63 65 61 6c 65  go.** unconceale
faf0: 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 64 62 5f 63  d..*/.char *db_c
fb00: 6f 6e 63 65 61 6c 28 63 6f 6e 73 74 20 63 68 61  onceal(const cha
fb10: 72 20 2a 7a 43 6f 6e 74 65 6e 74 2c 20 69 6e 74  r *zContent, int
fb20: 20 6e 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68   n){.  static ch
fb30: 61 72 20 7a 48 61 73 68 5b 48 4e 41 4d 45 5f 4d  ar zHash[HNAME_M
fb40: 41 58 2b 31 5d 3b 0a 20 20 42 6c 6f 62 20 6f 75  AX+1];.  Blob ou
fb50: 74 3b 0a 20 20 69 66 28 20 68 6e 61 6d 65 5f 76  t;.  if( hname_v
fb60: 61 6c 69 64 61 74 65 28 7a 43 6f 6e 74 65 6e 74  alidate(zContent
fb70: 2c 20 6e 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63  , n) ){.    memc
fb80: 70 79 28 7a 48 61 73 68 2c 20 7a 43 6f 6e 74 65  py(zHash, zConte
fb90: 6e 74 2c 20 6e 29 3b 0a 20 20 20 20 7a 48 61 73  nt, n);.    zHas
fba0: 68 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  h[n] = 0;.  }els
fbb0: 65 7b 0a 20 20 20 20 73 68 61 31 73 75 6d 5f 73  e{.    sha1sum_s
fbc0: 74 65 70 5f 74 65 78 74 28 7a 43 6f 6e 74 65 6e  tep_text(zConten
fbd0: 74 2c 20 6e 29 3b 0a 20 20 20 20 73 68 61 31 73  t, n);.    sha1s
fbe0: 75 6d 5f 66 69 6e 69 73 68 28 26 6f 75 74 29 3b  um_finish(&out);
fbf0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
fc00: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 61  rintf(sizeof(zHa
fc10: 73 68 29 2c 20 7a 48 61 73 68 2c 20 22 25 73 22  sh), zHash, "%s"
fc20: 2c 20 62 6c 6f 62 5f 73 74 72 28 26 6f 75 74 29  , blob_str(&out)
fc30: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  );.    blob_rese
fc40: 74 28 26 6f 75 74 29 3b 0a 20 20 20 20 64 62 5f  t(&out);.    db_
fc50: 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20  multi_exec(.    
fc60: 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47     "INSERT OR IG
fc70: 4e 4f 52 45 20 49 4e 54 4f 20 63 6f 6e 63 65 61  NORE INTO concea
fc80: 6c 65 64 28 68 61 73 68 2c 63 6f 6e 74 65 6e 74  led(hash,content
fc90: 2c 6d 74 69 6d 65 29 22 0a 20 20 20 20 20 20 20  ,mtime)".       
fca0: 22 20 56 41 4c 55 45 53 28 25 51 2c 25 23 51 2c  " VALUES(%Q,%#Q,
fcb0: 6e 6f 77 28 29 29 22 2c 0a 20 20 20 20 20 20 20  now())",.       
fcc0: 7a 48 61 73 68 2c 20 6e 2c 20 7a 43 6f 6e 74 65  zHash, n, zConte
fcd0: 6e 74 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  nt.    );.  }.  
fce0: 72 65 74 75 72 6e 20 7a 48 61 73 68 3b 0a 7d 0a  return zHash;.}.
fcf0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
fd00: 6f 20 6c 6f 6f 6b 20 75 70 20 74 68 65 20 69 6e  o look up the in
fd10: 70 75 74 20 69 6e 20 74 68 65 20 43 4f 4e 43 45  put in the CONCE
fd20: 41 4c 45 44 20 74 61 62 6c 65 2e 20 20 49 66 20  ALED table.  If 
fd30: 66 6f 75 6e 64 2c 0a 2a 2a 20 61 6e 64 20 69 66  found,.** and if
fd40: 20 74 68 65 20 6f 6b 52 64 41 64 64 72 20 70 65   the okRdAddr pe
fd50: 72 6d 69 73 73 69 6f 6e 20 69 73 20 65 6e 61 62  rmission is enab
fd60: 6c 65 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20  led then return 
fd70: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
fd80: 76 61 6c 75 65 20 66 6f 72 20 77 68 69 63 68 20  value for which 
fd90: 74 68 65 20 69 6e 70 75 74 20 69 73 20 61 20 68  the input is a h
fda0: 61 73 68 2e 20 20 49 66 20 6f 6b 52 64 41 64 64  ash.  If okRdAdd
fdb0: 72 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72  r is.** false or
fdc0: 20 69 66 20 74 68 65 20 6c 6f 6f 6b 75 70 20 66   if the lookup f
fdd0: 61 69 6c 73 2c 20 72 65 74 75 72 6e 20 74 68 65  ails, return the
fde0: 20 6f 72 69 67 69 6e 61 6c 20 73 74 72 69 6e 67   original string
fdf0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
fe00: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
fe10: 74 68 65 20 73 74 72 69 6e 67 20 72 65 74 75 72  the string retur
fe20: 6e 65 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ned is stored in
fe30: 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 0a   space obtained.
fe40: 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61  ** from malloc a
fe50: 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  nd should be fre
fe60: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
fe70: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  g function..*/.c
fe80: 68 61 72 20 2a 64 62 5f 72 65 76 65 61 6c 28 63  har *db_reveal(c
fe90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 29  onst char *zKey)
fea0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a  {.  char *zOut;.
feb0: 20 20 69 66 28 20 67 2e 70 65 72 6d 2e 52 64 41    if( g.perm.RdA
fec0: 64 64 72 20 29 7b 0a 20 20 20 20 7a 4f 75 74 20  ddr ){.    zOut 
fed0: 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45  = db_text(0, "SE
fee0: 4c 45 43 54 20 63 6f 6e 74 65 6e 74 20 46 52 4f  LECT content FRO
fef0: 4d 20 63 6f 6e 63 65 61 6c 65 64 20 57 48 45 52  M concealed WHER
ff00: 45 20 68 61 73 68 3d 25 51 22 2c 20 7a 4b 65 79  E hash=%Q", zKey
ff10: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ff20: 7a 4f 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  zOut = 0;.  }.  
ff30: 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20  if( zOut==0 ){. 
ff40: 20 20 20 7a 4f 75 74 20 3d 20 6d 70 72 69 6e 74     zOut = mprint
ff50: 66 28 22 25 73 22 2c 20 7a 4b 65 79 29 3b 0a 20  f("%s", zKey);. 
ff60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75 74   }.  return zOut
ff70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ff80: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 73 74  n true if the st
ff90: 72 69 6e 67 20 7a 56 61 6c 20 72 65 70 72 65 73  ring zVal repres
ffa0: 65 6e 74 73 20 22 74 72 75 65 22 20 28 6f 72 20  ents "true" (or 
ffb0: 22 66 61 6c 73 65 22 29 2e 0a 2a 2f 0a 69 6e 74  "false")..*/.int
ffc0: 20 69 73 5f 74 72 75 74 68 28 63 6f 6e 73 74 20   is_truth(const 
ffd0: 63 68 61 72 20 2a 7a 56 61 6c 29 7b 0a 20 20 73  char *zVal){.  s
ffe0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
fff0: 20 2a 63 6f 6e 73 74 20 61 7a 4f 6e 5b 5d 20 3d   *const azOn[] =
10000 20 7b 20 22 6f 6e 22 2c 20 22 79 65 73 22 2c 20   { "on", "yes", 
10010 22 74 72 75 65 22 2c 20 22 31 22 20 7d 3b 0a 20  "true", "1" };. 
10020 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
10030 30 3b 20 69 3c 63 6f 75 6e 74 28 61 7a 4f 6e 29  0; i<count(azOn)
10040 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
10050 66 6f 73 73 69 6c 5f 73 74 72 69 63 6d 70 28 7a  fossil_stricmp(z
10060 56 61 6c 2c 61 7a 4f 6e 5b 69 5d 29 3d 3d 30 20  Val,azOn[i])==0 
10070 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
10080 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 69 6e    return 0;.}.in
10090 74 20 69 73 5f 66 61 6c 73 65 28 63 6f 6e 73 74  t is_false(const
100a0 20 63 68 61 72 20 2a 7a 56 61 6c 29 7b 0a 20 20   char *zVal){.  
100b0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
100c0 72 20 2a 63 6f 6e 73 74 20 61 7a 4f 66 66 5b 5d  r *const azOff[]
100d0 20 3d 20 7b 20 22 6f 66 66 22 2c 20 22 6e 6f 22   = { "off", "no"
100e0 2c 20 22 66 61 6c 73 65 22 2c 20 22 30 22 20 7d  , "false", "0" }
100f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
10100 28 69 3d 30 3b 20 69 3c 63 6f 75 6e 74 28 61 7a  (i=0; i<count(az
10110 4f 66 66 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Off); i++){.    
10120 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 69 63  if( fossil_stric
10130 6d 70 28 7a 56 61 6c 2c 61 7a 4f 66 66 5b 69 5d  mp(zVal,azOff[i]
10140 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
10150 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
10160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74  .}../*.** Swap t
10170 68 65 20 67 2e 64 62 20 61 6e 64 20 67 2e 64 62  he g.db and g.db
10180 43 6f 6e 66 69 67 20 63 6f 6e 6e 65 63 74 69 6f  Config connectio
10190 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 76  ns so that the v
101a0 61 72 69 6f 75 73 20 64 62 5f 2a 20 72 6f 75 74  arious db_* rout
101b0 69 6e 65 73 0a 2a 2a 20 77 6f 72 6b 20 6f 6e 20  ines.** work on 
101c0 74 68 65 20 7e 2f 2e 66 6f 73 73 69 6c 20 64 61  the ~/.fossil da
101d0 74 61 62 61 73 65 20 69 6e 73 74 65 61 64 20 6f  tabase instead o
101e0 66 20 6f 6e 20 74 68 65 20 72 65 70 6f 73 69 74  f on the reposit
101f0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
10200 20 42 65 20 73 75 72 65 20 74 6f 20 73 77 61 70   Be sure to swap
10210 20 74 68 65 6d 20 62 61 63 6b 20 61 66 74 65 72   them back after
10220 20 64 6f 69 6e 67 20 74 68 65 20 6f 70 65 72 61   doing the opera
10230 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
10240 68 65 20 7e 2f 2e 66 6f 73 73 69 6c 20 64 61 74  he ~/.fossil dat
10250 61 62 61 73 65 20 68 61 73 20 61 6c 72 65 61 64  abase has alread
10260 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 73  y been opened as
10270 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
10280 73 65 20 6f 72 0a 2a 2a 20 69 73 20 61 74 74 61  se or.** is atta
10290 63 68 65 64 20 74 6f 20 74 68 65 20 6d 61 69 6e  ched to the main
102a0 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 63 6f   database, no co
102b0 6e 6e 65 63 74 69 6f 6e 20 73 77 61 70 73 20 61  nnection swaps a
102c0 72 65 20 72 65 71 75 69 72 65 64 20 73 6f 20 74  re required so t
102d0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
102e0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76 6f  s a no-op..*/.vo
102f0 69 64 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65  id db_swap_conne
10300 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20  ctions(void){.  
10310 2f 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 73 77 61  /*.  ** When swa
10320 70 70 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  pping the main d
10330 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
10340 6f 6e 20 77 69 74 68 20 74 68 65 20 63 6f 6e 66  on with the conf
10350 69 67 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ig database.  **
10360 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 74 68 65   connection, the
10370 20 63 6f 6e 66 69 67 20 64 61 74 61 62 61 73 65   config database
10380 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 75 73 74   connection must
10390 20 62 65 20 6f 70 65 6e 20 28 6e 6f 74 20 73 69   be open (not si
103a0 6d 70 6c 79 0a 20 20 2a 2a 20 61 74 74 61 63 68  mply.  ** attach
103b0 65 64 29 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  ed); otherwise, 
103c0 74 68 65 20 73 77 61 70 20 77 6f 75 6c 64 20 65  the swap would e
103d0 6e 64 20 75 70 20 6c 65 61 76 69 6e 67 20 74 68  nd up leaving th
103e0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
103f0 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20    ** connection 
10400 69 6e 76 61 6c 69 64 2c 20 64 65 66 65 61 74 69  invalid, defeati
10410 6e 67 20 74 68 65 20 76 65 72 79 20 70 75 72 70  ng the very purp
10420 6f 73 65 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ose of this rout
10430 69 6e 65 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20  ine.  This.  ** 
10440 73 61 6d 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  same constraint 
10450 61 6c 73 6f 20 68 6f 6c 64 73 20 74 72 75 65 20  also holds true 
10460 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 74  when restoring t
10470 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 73 77  he previously sw
10480 61 70 70 65 64 0a 20 20 2a 2a 20 64 61 74 61 62  apped.  ** datab
10490 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 3b 20  ase connection; 
104a0 6f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 65  otherwise, it me
104b0 61 6e 73 20 74 68 61 74 20 6e 6f 20 73 77 61 70  ans that no swap
104c0 20 77 61 73 20 70 65 72 66 6f 72 6d 65 64 0a 20   was performed. 
104d0 20 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20   ** because the 
104e0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f  main database co
104f0 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 61 6c 72  nnection was alr
10500 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
10510 20 74 68 65 20 63 6f 6e 66 69 67 0a 20 20 2a 2a   the config.  **
10520 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
10530 20 20 69 66 28 20 67 2e 64 62 43 6f 6e 66 69 67    if( g.dbConfig
10540 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
10550 2a 64 62 54 65 6d 70 20 3d 20 67 2e 64 62 3b 0a  *dbTemp = g.db;.
10560 20 20 20 20 67 2e 64 62 20 3d 20 67 2e 64 62 43      g.db = g.dbC
10570 6f 6e 66 69 67 3b 0a 20 20 20 20 67 2e 64 62 43  onfig;.    g.dbC
10580 6f 6e 66 69 67 20 3d 20 64 62 54 65 6d 70 3b 0a  onfig = dbTemp;.
10590 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79    }.}../*.** Try
105a0 20 74 6f 20 72 65 61 64 20 61 20 76 65 72 73 69   to read a versi
105b0 6f 6e 65 64 20 73 65 74 74 69 6e 67 20 73 74 72  oned setting str
105c0 69 6e 67 20 66 72 6f 6d 20 2e 66 6f 73 73 69 6c  ing from .fossil
105d0 2d 73 65 74 74 69 6e 67 73 2f 3c 6e 61 6d 65 3e  -settings/<name>
105e0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
105f0 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  he text of the s
10600 74 72 69 6e 67 20 69 66 20 69 74 20 69 73 20 66  tring if it is f
10610 6f 75 6e 64 2e 20 20 52 65 74 75 72 6e 20 4e 55  ound.  Return NU
10620 4c 4c 20 69 66 20 6e 6f 74 0a 2a 2a 20 66 6f 75  LL if not.** fou
10630 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  nd..**.** If the
10640 20 7a 4e 6f 6e 56 65 72 73 69 6f 6e 65 64 53 65   zNonVersionedSe
10650 74 74 69 6e 67 20 70 61 72 61 6d 65 74 65 72 20  tting parameter 
10660 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
10670 20 69 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a   it holds the.**
10680 20 6e 6f 6e 2d 76 65 72 73 69 6f 6e 65 64 20 76   non-versioned v
10690 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 73 65  alue for this se
106a0 74 74 69 6e 67 2e 20 20 49 66 20 62 6f 74 68 20  tting.  If both 
106b0 61 20 76 65 72 73 69 6f 6e 65 64 20 61 6e 64 20  a versioned and 
106c0 61 0a 2a 2a 20 6e 6f 6e 2d 76 65 72 73 69 6f 6e  a.** non-version
106d0 65 64 20 76 61 6c 75 65 20 65 78 69 73 74 20 61  ed value exist a
106e0 6e 64 20 61 72 65 20 6e 6f 74 20 65 71 75 61 6c  nd are not equal
106f0 2c 20 74 68 65 6e 20 61 20 77 61 72 6e 69 6e 67  , then a warning
10700 20 6d 65 73 73 61 67 65 0a 2a 2a 20 6d 69 67 68   message.** migh
10710 74 20 62 65 20 67 65 6e 65 72 61 74 65 64 2e 0a  t be generated..
10720 2a 2f 0a 63 68 61 72 20 2a 64 62 5f 67 65 74 5f  */.char *db_get_
10730 76 65 72 73 69 6f 6e 65 64 28 63 6f 6e 73 74 20  versioned(const 
10740 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 68 61  char *zName, cha
10750 72 20 2a 7a 4e 6f 6e 56 65 72 73 69 6f 6e 65 64  r *zNonVersioned
10760 53 65 74 74 69 6e 67 29 7b 0a 20 20 63 68 61 72  Setting){.  char
10770 20 2a 7a 56 65 72 73 69 6f 6e 65 64 53 65 74 74   *zVersionedSett
10780 69 6e 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ing = 0;.  int n
10790 6f 57 61 72 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  oWarn = 0;.  int
107a0 20 66 6f 75 6e 64 20 3d 20 30 3b 0a 20 20 73 74   found = 0;.  st
107b0 72 75 63 74 20 5f 63 61 63 68 65 45 6e 74 72 79  ruct _cacheEntry
107c0 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 5f 63   {.    struct _c
107d0 61 63 68 65 45 6e 74 72 79 20 2a 6e 65 78 74 3b  acheEntry *next;
107e0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
107f0 2a 7a 4e 61 6d 65 2c 20 2a 7a 56 61 6c 75 65 3b  *zName, *zValue;
10800 0a 20 20 7d 20 2a 63 61 63 68 65 45 6e 74 72 79  .  } *cacheEntry
10810 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73   = 0;.  static s
10820 74 72 75 63 74 20 5f 63 61 63 68 65 45 6e 74 72  truct _cacheEntr
10830 79 20 2a 63 61 63 68 65 20 3d 20 30 3b 0a 0a 20  y *cache = 0;.. 
10840 20 69 66 28 20 21 67 2e 6c 6f 63 61 6c 4f 70 65   if( !g.localOpe
10850 6e 20 26 26 20 67 2e 7a 4f 70 65 6e 52 65 76 69  n && g.zOpenRevi
10860 73 69 6f 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  sion==0 ) return
10870 20 7a 4e 6f 6e 56 65 72 73 69 6f 6e 65 64 53 65   zNonVersionedSe
10880 74 74 69 6e 67 3b 0a 20 20 2f 2a 20 4c 6f 6f 6b  tting;.  /* Look
10890 20 75 70 20 6e 61 6d 65 20 69 6e 20 63 61 63 68   up name in cach
108a0 65 20 2a 2f 0a 20 20 63 61 63 68 65 45 6e 74 72  e */.  cacheEntr
108b0 79 20 3d 20 63 61 63 68 65 3b 0a 20 20 77 68 69  y = cache;.  whi
108c0 6c 65 28 20 63 61 63 68 65 45 6e 74 72 79 21 3d  le( cacheEntry!=
108d0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 66 6f 73  0 ){.    if( fos
108e0 73 69 6c 5f 73 74 72 63 6d 70 28 63 61 63 68 65  sil_strcmp(cache
108f0 45 6e 74 72 79 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Entry->zName, zN
10900 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
10910 20 7a 56 65 72 73 69 6f 6e 65 64 53 65 74 74 69   zVersionedSetti
10920 6e 67 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 64  ng = fossil_strd
10930 75 70 28 63 61 63 68 65 45 6e 74 72 79 2d 3e 7a  up(cacheEntry->z
10940 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72  Value);.      br
10950 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
10960 61 63 68 65 45 6e 74 72 79 20 3d 20 63 61 63 68  acheEntry = cach
10970 65 45 6e 74 72 79 2d 3e 6e 65 78 74 3b 0a 20 20  eEntry->next;.  
10980 7d 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74  }.  /* Attempt t
10990 6f 20 72 65 61 64 20 76 61 6c 75 65 20 66 72 6f  o read value fro
109a0 6d 20 66 69 6c 65 20 69 6e 20 63 68 65 63 6b 6f  m file in checko
109b0 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 6e  ut if there wasn
109c0 27 74 20 61 20 63 61 63 68 65 20 68 69 74 2e 20  't a cache hit. 
109d0 2a 2f 0a 20 20 69 66 28 20 63 61 63 68 65 45 6e  */.  if( cacheEn
109e0 74 72 79 3d 3d 30 20 29 7b 0a 20 20 20 20 42 6c  try==0 ){.    Bl
109f0 6f 62 20 76 65 72 73 69 6f 6e 65 64 50 61 74 68  ob versionedPath
10a00 6e 61 6d 65 3b 0a 20 20 20 20 42 6c 6f 62 20 73  name;.    Blob s
10a10 65 74 74 69 6e 67 3b 0a 20 20 20 20 62 6c 6f 62  etting;.    blob
10a20 5f 7a 65 72 6f 28 26 76 65 72 73 69 6f 6e 65 64  _zero(&versioned
10a30 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 62  Pathname);.    b
10a40 6c 6f 62 5f 7a 65 72 6f 28 26 73 65 74 74 69 6e  lob_zero(&settin
10a50 67 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70  g);.    blob_app
10a60 65 6e 64 66 28 26 76 65 72 73 69 6f 6e 65 64 50  endf(&versionedP
10a70 61 74 68 6e 61 6d 65 2c 20 22 25 73 2e 66 6f 73  athname, "%s.fos
10a80 73 69 6c 2d 73 65 74 74 69 6e 67 73 2f 25 73 22  sil-settings/%s"
10a90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10aa0 20 20 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 2c     g.zLocalRoot,
10ab0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
10ac0 20 21 67 2e 6c 6f 63 61 6c 4f 70 65 6e 20 29 7b   !g.localOpen ){
10ad0 0a 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 73 69  .      /* Reposi
10ae0 74 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 70  tory is in the p
10af0 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
10b00 6f 70 65 6e 65 64 2c 20 62 75 74 20 66 69 6c 65  opened, but file
10b10 73 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 0a  s have not been.
10b20 20 20 20 20 20 20 20 2a 20 77 72 69 74 74 65 6e         * written
10b30 20 74 6f 20 64 69 73 6b 2e 20 4c 6f 61 64 20 66   to disk. Load f
10b40 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
10b50 2e 20 2a 2f 0a 20 20 20 20 20 20 42 6c 6f 62 20  . */.      Blob 
10b60 6e 6f 57 61 72 6e 46 69 6c 65 3b 0a 20 20 20 20  noWarnFile;.    
10b70 20 20 69 66 28 20 68 69 73 74 6f 72 69 63 61 6c    if( historical
10b80 5f 62 6c 6f 62 28 67 2e 7a 4f 70 65 6e 52 65 76  _blob(g.zOpenRev
10b90 69 73 69 6f 6e 2c 20 62 6c 6f 62 5f 73 74 72 28  ision, blob_str(
10ba0 26 76 65 72 73 69 6f 6e 65 64 50 61 74 68 6e 61  &versionedPathna
10bb0 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 26  me),.          &
10bc0 73 65 74 74 69 6e 67 2c 20 30 29 20 29 7b 0a 20  setting, 0) ){. 
10bd0 20 20 20 20 20 20 20 66 6f 75 6e 64 20 3d 20 31         found = 1
10be0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10bf0 2f 2a 20 53 65 65 20 69 66 20 74 68 65 72 65 27  /* See if there'
10c00 73 20 61 20 6e 6f 2d 77 61 72 6e 20 66 6c 61 67  s a no-warn flag
10c10 20 2a 2f 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61   */.      blob_a
10c20 70 70 65 6e 64 28 26 76 65 72 73 69 6f 6e 65 64  ppend(&versioned
10c30 50 61 74 68 6e 61 6d 65 2c 20 22 2e 6e 6f 2d 77  Pathname, ".no-w
10c40 61 72 6e 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20  arn", -1);.     
10c50 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6e 6f 57 61   blob_zero(&noWa
10c60 72 6e 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  rnFile);.      i
10c70 66 28 20 68 69 73 74 6f 72 69 63 61 6c 5f 62 6c  f( historical_bl
10c80 6f 62 28 67 2e 7a 4f 70 65 6e 52 65 76 69 73 69  ob(g.zOpenRevisi
10c90 6f 6e 2c 20 62 6c 6f 62 5f 73 74 72 28 26 76 65  on, blob_str(&ve
10ca0 72 73 69 6f 6e 65 64 50 61 74 68 6e 61 6d 65 29  rsionedPathname)
10cb0 2c 0a 20 20 20 20 20 20 20 20 20 20 26 6e 6f 57  ,.          &noW
10cc0 61 72 6e 46 69 6c 65 2c 20 30 29 20 29 7b 0a 20  arnFile, 0) ){. 
10cd0 20 20 20 20 20 20 20 6e 6f 57 61 72 6e 20 3d 20         noWarn = 
10ce0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
10cf0 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 6e 6f 57   blob_reset(&noW
10d00 61 72 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7d 65  arnFile);.    }e
10d10 6c 73 65 20 69 66 28 20 66 69 6c 65 5f 73 69 7a  lse if( file_siz
10d20 65 28 62 6c 6f 62 5f 73 74 72 28 26 76 65 72 73  e(blob_str(&vers
10d30 69 6f 6e 65 64 50 61 74 68 6e 61 6d 65 29 2c 20  ionedPathname), 
10d40 45 78 74 46 49 4c 45 29 3e 3d 30 20 29 7b 0a 20  ExtFILE)>=0 ){. 
10d50 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 65 78 69       /* File exi
10d60 73 74 73 2c 20 61 6e 64 20 63 6f 6e 74 61 69 6e  sts, and contain
10d70 73 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  s the value for 
10d80 74 68 69 73 20 73 65 74 74 69 6e 67 2e 20 4c 6f  this setting. Lo
10d90 61 64 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a  ad from.      **
10da0 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20   the file. */.  
10db0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10dc0 7a 46 69 6c 65 20 3d 20 62 6c 6f 62 5f 73 74 72  zFile = blob_str
10dd0 28 26 76 65 72 73 69 6f 6e 65 64 50 61 74 68 6e  (&versionedPathn
10de0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
10df0 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 66  blob_read_from_f
10e00 69 6c 65 28 26 73 65 74 74 69 6e 67 2c 20 7a 46  ile(&setting, zF
10e10 69 6c 65 2c 20 45 78 74 46 49 4c 45 29 3e 3d 30  ile, ExtFILE)>=0
10e20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 75 6e   ){.        foun
10e30 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
10e40 20 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 74       /* See if t
10e50 68 65 72 65 27 73 20 61 20 6e 6f 2d 77 61 72 6e  here's a no-warn
10e60 20 66 6c 61 67 20 2a 2f 0a 20 20 20 20 20 20 62   flag */.      b
10e70 6c 6f 62 5f 61 70 70 65 6e 64 28 26 76 65 72 73  lob_append(&vers
10e80 69 6f 6e 65 64 50 61 74 68 6e 61 6d 65 2c 20 22  ionedPathname, "
10e90 2e 6e 6f 2d 77 61 72 6e 22 2c 20 2d 31 29 3b 0a  .no-warn", -1);.
10ea0 20 20 20 20 20 20 69 66 28 20 66 69 6c 65 5f 73        if( file_s
10eb0 69 7a 65 28 62 6c 6f 62 5f 73 74 72 28 26 76 65  ize(blob_str(&ve
10ec0 72 73 69 6f 6e 65 64 50 61 74 68 6e 61 6d 65 29  rsionedPathname)
10ed0 2c 20 45 78 74 46 49 4c 45 29 3e 3d 30 20 29 7b  , ExtFILE)>=0 ){
10ee0 0a 20 20 20 20 20 20 20 20 6e 6f 57 61 72 6e 20  .        noWarn 
10ef0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
10f00 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65   }.    blob_rese
10f10 74 28 26 76 65 72 73 69 6f 6e 65 64 50 61 74 68  t(&versionedPath
10f20 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 66  name);.    if( f
10f30 6f 75 6e 64 20 29 7b 0a 20 20 20 20 20 20 62 6c  ound ){.      bl
10f40 6f 62 5f 74 72 69 6d 28 26 73 65 74 74 69 6e 67  ob_trim(&setting
10f50 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6e 6f 6e 2d  ); /* Avoid non-
10f60 6f 62 76 69 6f 75 73 20 70 72 6f 62 6c 65 6d 73  obvious problems
10f70 20 77 69 74 68 20 6c 69 6e 65 20 65 6e 64 69 6e   with line endin
10f80 67 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  gs.             
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
10fa0 20 6f 6e 20 62 6f 6f 6c 65 61 6e 20 70 72 6f 70   on boolean prop
10fb0 65 72 74 69 65 73 20 2a 2f 0a 20 20 20 20 20 20  erties */.      
10fc0 7a 56 65 72 73 69 6f 6e 65 64 53 65 74 74 69 6e  zVersionedSettin
10fd0 67 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 64 75  g = fossil_strdu
10fe0 70 28 62 6c 6f 62 5f 73 74 72 28 26 73 65 74 74  p(blob_str(&sett
10ff0 69 6e 67 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ing));.    }.   
11000 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 73 65 74   blob_reset(&set
11010 74 69 6e 67 29 3b 0a 20 20 20 20 2f 2a 20 53 74  ting);.    /* St
11020 6f 72 65 20 72 65 73 75 6c 74 20 69 6e 20 63 61  ore result in ca
11030 63 68 65 2c 20 77 68 69 63 68 20 63 61 6e 20 62  che, which can b
11040 65 20 74 68 65 20 76 61 6c 75 65 20 6f 72 20 30  e the value or 0
11050 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 20 2a 2f   if not found */
11060 0a 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 20  .    cacheEntry 
11070 3d 20 28 73 74 72 75 63 74 20 5f 63 61 63 68 65  = (struct _cache
11080 45 6e 74 72 79 2a 29 66 6f 73 73 69 6c 5f 6d 61  Entry*)fossil_ma
11090 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 73 74 72 75  lloc(sizeof(stru
110a0 63 74 20 5f 63 61 63 68 65 45 6e 74 72 79 29 29  ct _cacheEntry))
110b0 3b 0a 20 20 20 20 63 61 63 68 65 45 6e 74 72 79  ;.    cacheEntry
110c0 2d 3e 6e 65 78 74 20 3d 20 63 61 63 68 65 3b 0a  ->next = cache;.
110d0 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 2d 3e      cacheEntry->
110e0 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
110f0 20 20 20 63 61 63 68 65 45 6e 74 72 79 2d 3e 7a     cacheEntry->z
11100 56 61 6c 75 65 20 3d 20 66 6f 73 73 69 6c 5f 73  Value = fossil_s
11110 74 72 64 75 70 28 7a 56 65 72 73 69 6f 6e 65 64  trdup(zVersioned
11120 53 65 74 74 69 6e 67 29 3b 0a 20 20 20 20 63 61  Setting);.    ca
11130 63 68 65 20 3d 20 63 61 63 68 65 45 6e 74 72 79  che = cacheEntry
11140 3b 0a 20 20 7d 0a 20 20 2f 2a 20 44 69 73 70 6c  ;.  }.  /* Displ
11150 61 79 20 61 20 77 61 72 6e 69 6e 67 3f 20 2a 2f  ay a warning? */
11160 0a 20 20 69 66 28 20 7a 56 65 72 73 69 6f 6e 65  .  if( zVersione
11170 64 53 65 74 74 69 6e 67 21 3d 30 20 26 26 20 7a  dSetting!=0 && z
11180 4e 6f 6e 56 65 72 73 69 6f 6e 65 64 53 65 74 74  NonVersionedSett
11190 69 6e 67 21 3d 30 0a 20 20 20 26 26 20 7a 4e 6f  ing!=0.   && zNo
111a0 6e 56 65 72 73 69 6f 6e 65 64 53 65 74 74 69 6e  nVersionedSettin
111b0 67 5b 30 5d 21 3d 27 5c 30 27 20 26 26 20 21 6e  g[0]!='\0' && !n
111c0 6f 57 61 72 6e 0a 20 20 29 7b 0a 20 20 20 20 2f  oWarn.  ){.    /
111d0 2a 20 54 68 65 72 65 27 73 20 61 20 76 65 72 73  * There's a vers
111e0 69 6f 6e 65 64 20 73 65 74 74 69 6e 67 2c 20 61  ioned setting, a
111f0 6e 64 20 61 20 6e 6f 6e 2d 76 65 72 73 69 6f 6e  nd a non-version
11200 65 64 20 73 65 74 74 69 6e 67 2e 20 54 65 6c 6c  ed setting. Tell
11210 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72  .    ** the user
11220 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c   about the confl
11230 69 63 74 20 2a 2f 0a 20 20 20 20 66 6f 73 73 69  ict */.    fossi
11240 6c 5f 77 61 72 6e 69 6e 67 28 0a 20 20 20 20 20  l_warning(.     
11250 20 20 20 22 73 65 74 74 69 6e 67 20 25 73 20 68     "setting %s h
11260 61 73 20 62 6f 74 68 20 76 65 72 73 69 6f 6e 65  as both versione
11270 64 20 61 6e 64 20 6e 6f 6e 2d 76 65 72 73 69 6f  d and non-versio
11280 6e 65 64 20 76 61 6c 75 65 73 3a 20 75 73 69 6e  ned values: usin
11290 67 20 22 0a 20 20 20 20 20 20 20 20 22 76 65 72  g ".        "ver
112a0 73 69 6f 6e 65 64 20 76 61 6c 75 65 20 66 72 6f  sioned value fro
112b0 6d 20 66 69 6c 65 20 5c 22 25 2f 2e 66 6f 73 73  m file \"%/.foss
112c0 69 6c 2d 73 65 74 74 69 6e 67 73 2f 25 73 5c 22  il-settings/%s\"
112d0 20 28 74 6f 20 73 69 6c 65 6e 63 65 20 22 0a 20   (to silence ". 
112e0 20 20 20 20 20 20 20 22 74 68 69 73 20 77 61 72         "this war
112f0 6e 69 6e 67 2c 20 65 69 74 68 65 72 20 63 72 65  ning, either cre
11300 61 74 65 20 61 6e 20 65 6d 70 74 79 20 66 69 6c  ate an empty fil
11310 65 20 6e 61 6d 65 64 20 22 0a 20 20 20 20 20 20  e named ".      
11320 20 20 22 5c 22 25 2f 2e 66 6f 73 73 69 6c 2d 73    "\"%/.fossil-s
11330 65 74 74 69 6e 67 73 2f 25 73 2e 6e 6f 2d 77 61  ettings/%s.no-wa
11340 72 6e 5c 22 20 69 6e 20 74 68 65 20 63 68 65 63  rn\" in the chec
11350 6b 2d 6f 75 74 20 72 6f 6f 74 2c 20 6f 72 20 64  k-out root, or d
11360 65 6c 65 74 65 20 22 0a 20 20 20 20 20 20 20 20  elete ".        
11370 22 74 68 65 20 6e 6f 6e 2d 76 65 72 73 69 6f 6e  "the non-version
11380 65 64 20 73 65 74 74 69 6e 67 20 77 69 74 68 20  ed setting with 
11390 5c 22 66 6f 73 73 69 6c 20 75 6e 73 65 74 20 25  \"fossil unset %
113a0 73 5c 22 29 22 2c 20 7a 4e 61 6d 65 2c 0a 20 20  s\")", zName,.  
113b0 20 20 20 20 20 20 67 2e 7a 4c 6f 63 61 6c 52 6f        g.zLocalRo
113c0 6f 74 2c 20 7a 4e 61 6d 65 2c 20 67 2e 7a 4c 6f  ot, zName, g.zLo
113d0 63 61 6c 52 6f 6f 74 2c 20 7a 4e 61 6d 65 2c 20  calRoot, zName, 
113e0 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d  zName.    );.  }
113f0 0a 20 20 2f 2a 20 50 72 65 66 65 72 20 74 68 65  .  /* Prefer the
11400 20 76 65 72 73 69 6f 6e 65 64 20 73 65 74 74 69   versioned setti
11410 6e 67 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  ng */.  return (
11420 20 7a 56 65 72 73 69 6f 6e 65 64 53 65 74 74 69   zVersionedSetti
11430 6e 67 21 3d 30 20 29 20 3f 20 7a 56 65 72 73 69  ng!=0 ) ? zVersi
11440 6f 6e 65 64 53 65 74 74 69 6e 67 20 3a 20 7a 4e  onedSetting : zN
11450 6f 6e 56 65 72 73 69 6f 6e 65 64 53 65 74 74 69  onVersionedSetti
11460 6e 67 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ng;.}.../*.** Ge
11470 74 20 61 6e 64 20 73 65 74 20 76 61 6c 75 65 73  t and set values
11480 20 66 72 6f 6d 20 74 68 65 20 43 4f 4e 46 49 47   from the CONFIG
11490 2c 20 47 4c 4f 42 41 4c 5f 43 4f 4e 46 49 47 20  , GLOBAL_CONFIG 
114a0 61 6e 64 20 56 56 41 52 20 74 61 62 6c 65 20 69  and VVAR table i
114b0 6e 20 74 68 65 0a 2a 2a 20 72 65 70 6f 73 69 74  n the.** reposit
114c0 6f 72 79 20 61 6e 64 20 6c 6f 63 61 6c 20 64 61  ory and local da
114d0 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  tabases..**.** I
114e0 66 20 6e 6f 20 73 75 63 68 20 76 61 72 69 61 62  f no such variab
114f0 6c 65 20 65 78 69 73 74 73 2c 20 72 65 74 75 72  le exists, retur
11500 6e 20 7a 44 65 66 61 75 6c 74 2e 20 20 4f 72 2c  n zDefault.  Or,
11510 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 74 68 65   if zName is the
11520 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 73 65   name.** of a se
11530 74 74 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20  tting, then the 
11540 7a 44 65 66 61 75 6c 74 20 69 73 20 69 67 6e 6f  zDefault is igno
11550 72 65 64 20 61 6e 64 20 74 68 65 20 64 65 66 61  red and the defa
11560 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ult value of the
11570 0a 2a 2a 20 73 65 74 74 69 6e 67 20 69 73 20 72  .** setting is r
11580 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
11590 20 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 61 20    If zName is a 
115a0 76 65 72 73 69 6f 6e 65 64 20 73 65 74 74 69 6e  versioned settin
115b0 67 2c 20 74 68 65 6e 0a 2a 2a 20 76 65 72 73 69  g, then.** versi
115c0 6f 6e 65 64 20 76 61 6c 75 65 20 74 61 6b 65 73  oned value takes
115d0 20 70 72 69 6f 72 69 74 79 2e 0a 2a 2f 0a 63 68   priority..*/.ch
115e0 61 72 20 2a 64 62 5f 67 65 74 28 63 6f 6e 73 74  ar *db_get(const
115f0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
11600 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75  nst char *zDefau
11610 6c 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d  lt){.  char *z =
11620 20 30 3b 0a 20 20 63 6f 6e 73 74 20 53 65 74 74   0;.  const Sett
11630 69 6e 67 20 2a 70 53 65 74 74 69 6e 67 20 3d 20  ing *pSetting = 
11640 64 62 5f 66 69 6e 64 5f 73 65 74 74 69 6e 67 28  db_find_setting(
11650 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28  zName, 0);.  if(
11660 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65   g.repositoryOpe
11670 6e 20 29 7b 0a 20 20 20 20 7a 20 3d 20 64 62 5f  n ){.    z = db_
11680 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20  text(0, "SELECT 
11690 76 61 6c 75 65 20 46 52 4f 4d 20 63 6f 6e 66 69  value FROM confi
116a0 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  g WHERE name=%Q"
116b0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  , zName);.  }.  
116c0 69 66 28 20 7a 3d 3d 30 20 26 26 20 67 2e 7a 43  if( z==0 && g.zC
116d0 6f 6e 66 69 67 44 62 4e 61 6d 65 20 29 7b 0a 20  onfigDbName ){. 
116e0 20 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65     db_swap_conne
116f0 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 7a 20  ctions();.    z 
11700 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45  = db_text(0, "SE
11710 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20  LECT value FROM 
11720 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 57 48  global_config WH
11730 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e  ERE name=%Q", zN
11740 61 6d 65 29 3b 0a 20 20 20 20 64 62 5f 73 77 61  ame);.    db_swa
11750 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 29 3b  p_connections();
11760 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 65 74 74  .  }.  if( pSett
11770 69 6e 67 21 3d 30 20 26 26 20 70 53 65 74 74 69  ing!=0 && pSetti
11780 6e 67 2d 3e 76 65 72 73 69 6f 6e 61 62 6c 65 20  ng->versionable 
11790 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
117a0 73 20 61 20 76 65 72 73 69 6f 6e 61 62 6c 65 20  s a versionable 
117b0 73 65 74 74 69 6e 67 2c 20 74 72 79 20 61 6e 64  setting, try and
117c0 20 67 65 74 20 74 68 65 20 69 6e 66 6f 20 66 72   get the info fr
117d0 6f 6d 20 61 0a 20 20 20 20 2a 2a 20 63 68 65 63  om a.    ** chec
117e0 6b 65 64 20 6f 75 74 20 66 69 6c 65 20 2a 2f 0a  ked out file */.
117f0 20 20 20 20 7a 20 3d 20 64 62 5f 67 65 74 5f 76      z = db_get_v
11800 65 72 73 69 6f 6e 65 64 28 7a 4e 61 6d 65 2c 20  ersioned(zName, 
11810 7a 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 3d  z);.  }.  if( z=
11820 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  =0 ){.    if( zD
11830 65 66 61 75 6c 74 3d 3d 30 20 26 26 20 70 53 65  efault==0 && pSe
11840 74 74 69 6e 67 20 26 26 20 70 53 65 74 74 69 6e  tting && pSettin
11850 67 2d 3e 64 65 66 5b 30 5d 20 29 7b 0a 20 20 20  g->def[0] ){.   
11860 20 20 20 7a 20 3d 20 66 6f 73 73 69 6c 5f 73 74     z = fossil_st
11870 72 64 75 70 28 70 53 65 74 74 69 6e 67 2d 3e 64  rdup(pSetting->d
11880 65 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ef);.    }else{.
11890 20 20 20 20 20 20 7a 20 3d 20 66 6f 73 73 69 6c        z = fossil
118a0 5f 73 74 72 64 75 70 28 7a 44 65 66 61 75 6c 74  _strdup(zDefault
118b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
118c0 65 74 75 72 6e 20 7a 3b 0a 7d 0a 63 68 61 72 20  eturn z;.}.char 
118d0 2a 64 62 5f 67 65 74 5f 6d 74 69 6d 65 28 63 6f  *db_get_mtime(co
118e0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
118f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
11900 72 6d 61 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  rmat, const char
11910 20 2a 7a 44 65 66 61 75 6c 74 29 7b 0a 20 20 63   *zDefault){.  c
11920 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66  har *z = 0;.  if
11930 28 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70  ( g.repositoryOp
11940 65 6e 20 29 7b 0a 20 20 20 20 7a 20 3d 20 64 62  en ){.    z = db
11950 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54  _text(0, "SELECT
11960 20 6d 74 69 6d 65 20 46 52 4f 4d 20 63 6f 6e 66   mtime FROM conf
11970 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ig WHERE name=%Q
11980 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  ", zName);.  }. 
11990 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
119a0 20 7a 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 64   z = fossil_strd
119b0 75 70 28 7a 44 65 66 61 75 6c 74 29 3b 0a 20 20  up(zDefault);.  
119c0 7d 65 6c 73 65 20 69 66 28 20 7a 46 6f 72 6d 61  }else if( zForma
119d0 74 21 3d 30 20 29 7b 0a 20 20 20 20 7a 20 3d 20  t!=0 ){.    z = 
119e0 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
119f0 43 54 20 73 74 72 66 74 69 6d 65 28 25 51 2c 25  CT strftime(%Q,%
11a00 51 2c 27 75 6e 69 78 65 70 6f 63 68 27 29 3b 22  Q,'unixepoch');"
11a10 2c 20 7a 46 6f 72 6d 61 74 2c 20 7a 29 3b 0a 20  , zFormat, z);. 
11a20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
11a30 0a 76 6f 69 64 20 64 62 5f 73 65 74 28 63 6f 6e  .void db_set(con
11a40 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
11a50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
11a60 75 65 2c 20 69 6e 74 20 67 6c 6f 62 61 6c 46 6c  ue, int globalFl
11a70 61 67 29 7b 0a 20 20 64 62 5f 62 65 67 69 6e 5f  ag){.  db_begin_
11a80 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20  transaction();. 
11a90 20 69 66 28 20 67 6c 6f 62 61 6c 46 6c 61 67 20   if( globalFlag 
11aa0 29 7b 0a 20 20 20 20 64 62 5f 73 77 61 70 5f 63  ){.    db_swap_c
11ab0 6f 6e 6e 65 63 74 69 6f 6e 73 28 29 3b 0a 20 20  onnections();.  
11ac0 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
11ad0 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 67 6c  "REPLACE INTO gl
11ae0 6f 62 61 6c 5f 63 6f 6e 66 69 67 28 6e 61 6d 65  obal_config(name
11af0 2c 76 61 6c 75 65 29 20 56 41 4c 55 45 53 28 25  ,value) VALUES(%
11b00 51 2c 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20  Q,%Q)",.        
11b10 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
11b20 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 64  , zValue);.    d
11b30 62 5f 73 77 61 70 5f 63 6f 6e 6e 65 63 74 69 6f  b_swap_connectio
11b40 6e 73 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ns();.  }else{. 
11b50 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
11b60 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 63  ("REPLACE INTO c
11b70 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c 75 65  onfig(name,value
11b80 2c 6d 74 69 6d 65 29 20 56 41 4c 55 45 53 28 25  ,mtime) VALUES(%
11b90 51 2c 25 51 2c 6e 6f 77 28 29 29 22 2c 0a 20 20  Q,%Q,now())",.  
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bb0 20 7a 4e 61 6d 65 2c 20 7a 56 61 6c 75 65 29 3b   zName, zValue);
11bc0 0a 20 20 7d 0a 20 20 69 66 28 20 67 6c 6f 62 61  .  }.  if( globa
11bd0 6c 46 6c 61 67 20 26 26 20 67 2e 72 65 70 6f 73  lFlag && g.repos
11be0 69 74 6f 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20  itoryOpen ){.   
11bf0 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
11c00 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 6f 6e 66  DELETE FROM conf
11c10 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ig WHERE name=%Q
11c20 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  ", zName);.  }. 
11c30 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74   db_end_transact
11c40 69 6f 6e 28 30 29 3b 0a 7d 0a 76 6f 69 64 20 64  ion(0);.}.void d
11c50 62 5f 75 6e 73 65 74 28 63 6f 6e 73 74 20 63 68  b_unset(const ch
11c60 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 67  ar *zName, int g
11c70 6c 6f 62 61 6c 46 6c 61 67 29 7b 0a 20 20 64 62  lobalFlag){.  db
11c80 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
11c90 6f 6e 28 29 3b 0a 20 20 69 66 28 20 67 6c 6f 62  on();.  if( glob
11ca0 61 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 64 62  alFlag ){.    db
11cb0 5f 73 77 61 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e  _swap_connection
11cc0 73 28 29 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74  s();.    db_mult
11cd0 69 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20 46  i_exec("DELETE F
11ce0 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69  ROM global_confi
11cf0 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  g WHERE name=%Q"
11d00 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 64 62  , zName);.    db
11d10 5f 73 77 61 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e  _swap_connection
11d20 73 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s();.  }else{.  
11d30 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
11d40 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 6f 6e  "DELETE FROM con
11d50 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  fig WHERE name=%
11d60 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  Q", zName);.  }.
11d70 20 20 69 66 28 20 67 6c 6f 62 61 6c 46 6c 61 67    if( globalFlag
11d80 20 26 26 20 67 2e 72 65 70 6f 73 69 74 6f 72 79   && g.repository
11d90 4f 70 65 6e 20 29 7b 0a 20 20 20 20 64 62 5f 6d  Open ){.    db_m
11da0 75 6c 74 69 5f 65 78 65 63 28 22 44 45 4c 45 54  ulti_exec("DELET
11db0 45 20 46 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48  E FROM config WH
11dc0 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e  ERE name=%Q", zN
11dd0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 65  ame);.  }.  db_e
11de0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30  nd_transaction(0
11df0 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 69 73 5f 67  );.}.int db_is_g
11e00 6c 6f 62 61 6c 28 63 6f 6e 73 74 20 63 68 61 72  lobal(const char
11e10 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
11e20 72 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 67 2e  rc = 0;.  if( g.
11e30 7a 43 6f 6e 66 69 67 44 62 4e 61 6d 65 20 29 7b  zConfigDbName ){
11e40 0a 20 20 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e  .    db_swap_con
11e50 6e 65 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20  nections();.    
11e60 72 63 20 3d 20 64 62 5f 65 78 69 73 74 73 28 22  rc = db_exists("
11e70 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 67 6c  SELECT 1 FROM gl
11e80 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45 52  obal_config WHER
11e90 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d  E name=%Q", zNam
11ea0 65 29 3b 0a 20 20 20 20 64 62 5f 73 77 61 70 5f  e);.    db_swap_
11eb0 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 29 3b 0a 20  connections();. 
11ec0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11ed0 7d 0a 69 6e 74 20 64 62 5f 67 65 74 5f 69 6e 74  }.int db_get_int
11ee0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
11ef0 6d 65 2c 20 69 6e 74 20 64 66 6c 74 29 7b 0a 20  me, int dflt){. 
11f00 20 69 6e 74 20 76 20 3d 20 64 66 6c 74 3b 0a 20   int v = dflt;. 
11f10 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 67   int rc;.  if( g
11f20 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20  .repositoryOpen 
11f30 29 7b 0a 20 20 20 20 53 74 6d 74 20 71 3b 0a 20  ){.    Stmt q;. 
11f40 20 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71     db_prepare(&q
11f50 2c 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20  , "SELECT value 
11f60 46 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52  FROM config WHER
11f70 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d  E name=%Q", zNam
11f80 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 5f  e);.    rc = db_
11f90 73 74 65 70 28 26 71 29 3b 0a 20 20 20 20 69 66  step(&q);.    if
11fa0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
11fb0 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 64 62   ){.      v = db
11fc0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20  _column_int(&q, 
11fd0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  0);.    }.    db
11fe0 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20  _finalize(&q);. 
11ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
12000 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
12010 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
12020 54 45 5f 44 4f 4e 45 20 26 26 20 67 2e 7a 43 6f  TE_DONE && g.zCo
12030 6e 66 69 67 44 62 4e 61 6d 65 20 29 7b 0a 20 20  nfigDbName ){.  
12040 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65 63    db_swap_connec
12050 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 76 20 3d  tions();.    v =
12060 20 64 62 5f 69 6e 74 28 64 66 6c 74 2c 20 22 53   db_int(dflt, "S
12070 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d  ELECT value FROM
12080 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 57   global_config W
12090 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a  HERE name=%Q", z
120a0 4e 61 6d 65 29 3b 0a 20 20 20 20 64 62 5f 73 77  Name);.    db_sw
120b0 61 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 29  ap_connections()
120c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  ;.  }.  return v
120d0 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 73 65 74 5f  ;.}.void db_set_
120e0 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  int(const char *
120f0 7a 4e 61 6d 65 2c 20 69 6e 74 20 76 61 6c 75 65  zName, int value
12100 2c 20 69 6e 74 20 67 6c 6f 62 61 6c 46 6c 61 67  , int globalFlag
12110 29 7b 0a 20 20 69 66 28 20 67 6c 6f 62 61 6c 46  ){.  if( globalF
12120 6c 61 67 20 29 7b 0a 20 20 20 20 64 62 5f 73 77  lag ){.    db_sw
12130 61 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 29  ap_connections()
12140 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65  ;.    db_multi_e
12150 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54  xec("REPLACE INT
12160 4f 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 28  O global_config(
12170 6e 61 6d 65 2c 76 61 6c 75 65 29 20 56 41 4c 55  name,value) VALU
12180 45 53 28 25 51 2c 25 64 29 22 2c 0a 20 20 20 20  ES(%Q,%d)",.    
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
121a0 61 6d 65 2c 20 76 61 6c 75 65 29 3b 0a 20 20 20  ame, value);.   
121b0 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65 63 74   db_swap_connect
121c0 69 6f 6e 73 28 29 3b 0a 20 20 7d 65 6c 73 65 7b  ions();.  }else{
121d0 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78  .    db_multi_ex
121e0 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f  ec("REPLACE INTO
121f0 20 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c   config(name,val
12200 75 65 2c 6d 74 69 6d 65 29 20 56 41 4c 55 45 53  ue,mtime) VALUES
12210 28 25 51 2c 25 64 2c 6e 6f 77 28 29 29 22 2c 0a  (%Q,%d,now())",.
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 20 20 7a 4e 61 6d 65 2c 20 76 61 6c 75 65 29 3b    zName, value);
12240 0a 20 20 7d 0a 20 20 69 66 28 20 67 6c 6f 62 61  .  }.  if( globa
12250 6c 46 6c 61 67 20 26 26 20 67 2e 72 65 70 6f 73  lFlag && g.repos
12260 69 74 6f 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20  itoryOpen ){.   
12270 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
12280 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 6f 6e 66  DELETE FROM conf
12290 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ig WHERE name=%Q
122a0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d  ", zName);.  }.}
122b0 0a 69 6e 74 20 64 62 5f 67 65 74 5f 62 6f 6f 6c  .int db_get_bool
122c0 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ean(const char *
122d0 7a 4e 61 6d 65 2c 20 69 6e 74 20 64 66 6c 74 29  zName, int dflt)
122e0 7b 0a 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d  {.  char *zVal =
122f0 20 64 62 5f 67 65 74 28 7a 4e 61 6d 65 2c 20 64   db_get(zName, d
12300 66 6c 74 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66  flt ? "on" : "of
12310 66 22 29 3b 0a 20 20 69 66 28 20 69 73 5f 74 72  f");.  if( is_tr
12320 75 74 68 28 7a 56 61 6c 29 20 29 20 72 65 74 75  uth(zVal) ) retu
12330 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 73 5f 66  rn 1;.  if( is_f
12340 61 6c 73 65 28 7a 56 61 6c 29 20 29 20 72 65 74  alse(zVal) ) ret
12350 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
12360 64 66 6c 74 3b 0a 7d 0a 69 6e 74 20 64 62 5f 67  dflt;.}.int db_g
12370 65 74 5f 76 65 72 73 69 6f 6e 65 64 5f 62 6f 6f  et_versioned_boo
12380 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  lean(const char 
12390 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 64 66 6c 74  *zName, int dflt
123a0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 56 61 6c 20  ){.  char *zVal 
123b0 3d 20 64 62 5f 67 65 74 5f 76 65 72 73 69 6f 6e  = db_get_version
123c0 65 64 28 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ed(zName, 0);.  
123d0 69 66 28 20 7a 56 61 6c 3d 3d 30 20 29 20 72 65  if( zVal==0 ) re
123e0 74 75 72 6e 20 64 66 6c 74 3b 0a 20 20 69 66 28  turn dflt;.  if(
123f0 20 69 73 5f 74 72 75 74 68 28 7a 56 61 6c 29 20   is_truth(zVal) 
12400 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
12410 28 20 69 73 5f 66 61 6c 73 65 28 7a 56 61 6c 29  ( is_false(zVal)
12420 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
12430 65 74 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 63 68  eturn dflt;.}.ch
12440 61 72 20 2a 64 62 5f 6c 67 65 74 28 63 6f 6e 73  ar *db_lget(cons
12450 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
12460 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61  onst char *zDefa
12470 75 6c 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  ult){.  return d
12480 62 5f 74 65 78 74 28 7a 44 65 66 61 75 6c 74 2c  b_text(zDefault,
12490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
124a0 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20    "SELECT value 
124b0 46 52 4f 4d 20 76 76 61 72 20 57 48 45 52 45 20  FROM vvar WHERE 
124c0 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29  name=%Q", zName)
124d0 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 6c 73 65 74  ;.}.void db_lset
124e0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
124f0 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
12500 7a 56 61 6c 75 65 29 7b 0a 20 20 64 62 5f 6d 75  zValue){.  db_mu
12510 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43  lti_exec("REPLAC
12520 45 20 49 4e 54 4f 20 76 76 61 72 28 6e 61 6d 65  E INTO vvar(name
12530 2c 76 61 6c 75 65 29 20 56 41 4c 55 45 53 28 25  ,value) VALUES(%
12540 51 2c 25 51 29 22 2c 20 7a 4e 61 6d 65 2c 20 7a  Q,%Q)", zName, z
12550 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e 74 20 64 62  Value);.}.int db
12560 5f 6c 67 65 74 5f 69 6e 74 28 63 6f 6e 73 74 20  _lget_int(const 
12570 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
12580 20 64 66 6c 74 29 7b 0a 20 20 72 65 74 75 72 6e   dflt){.  return
12590 20 64 62 5f 69 6e 74 28 64 66 6c 74 2c 20 22 53   db_int(dflt, "S
125a0 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d  ELECT value FROM
125b0 20 76 76 61 72 20 57 48 45 52 45 20 6e 61 6d 65   vvar WHERE name
125c0 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a  =%Q", zName);.}.
125d0 76 6f 69 64 20 64 62 5f 6c 73 65 74 5f 69 6e 74  void db_lset_int
125e0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
125f0 6d 65 2c 20 69 6e 74 20 76 61 6c 75 65 29 7b 0a  me, int value){.
12600 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
12610 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 76 76  "REPLACE INTO vv
12620 61 72 28 6e 61 6d 65 2c 76 61 6c 75 65 29 20 56  ar(name,value) V
12630 41 4c 55 45 53 28 25 51 2c 25 64 29 22 2c 20 7a  ALUES(%Q,%d)", z
12640 4e 61 6d 65 2c 20 76 61 6c 75 65 29 3b 0a 7d 0a  Name, value);.}.
12650 0a 2f 2a 20 56 61 2d 61 72 67 73 20 76 65 72 73  ./* Va-args vers
12660 69 6f 6e 73 20 6f 66 20 64 62 5f 67 65 74 28 29  ions of db_get()
12670 2c 20 64 62 5f 73 65 74 28 29 2c 20 61 6e 64 20  , db_set(), and 
12680 64 62 5f 75 6e 73 65 74 28 29 0a 2a 2f 0a 63 68  db_unset().*/.ch
12690 61 72 20 2a 64 62 5f 67 65 74 5f 6d 70 72 69 6e  ar *db_get_mprin
126a0 74 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  tf(const char *z
126b0 44 65 66 61 75 6c 74 2c 20 63 6f 6e 73 74 20 63  Default, const c
126c0 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
126d0 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
126e0 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
126f0 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74  .  char *zResult
12700 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
12710 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4e 61   zFormat);.  zNa
12720 6d 65 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a 46  me = vmprintf(zF
12730 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
12740 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7a 52 65 73  _end(ap);.  zRes
12750 75 6c 74 20 3d 20 64 62 5f 67 65 74 28 7a 4e 61  ult = db_get(zNa
12760 6d 65 2c 20 7a 44 65 66 61 75 6c 74 29 3b 0a 20  me, zDefault);. 
12770 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 7a 4e 61   fossil_free(zNa
12780 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52  me);.  return zR
12790 65 73 75 6c 74 3b 0a 7d 0a 76 6f 69 64 20 64 62  esult;.}.void db
127a0 5f 73 65 74 5f 6d 70 72 69 6e 74 66 28 63 6f 6e  _set_mprintf(con
127b0 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 2c 20 69  st char *zNew, i
127c0 6e 74 20 69 47 6c 6f 62 61 6c 2c 20 63 6f 6e 73  nt iGlobal, cons
127d0 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
127e0 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
127f0 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61   ap;.  char *zNa
12800 6d 65 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  me;.  va_start(a
12810 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
12820 4e 61 6d 65 20 3d 20 76 6d 70 72 69 6e 74 66 28  Name = vmprintf(
12830 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
12840 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 64 62  va_end(ap);.  db
12850 5f 73 65 74 28 7a 4e 61 6d 65 2c 20 7a 4e 65 77  _set(zName, zNew
12860 2c 20 69 47 6c 6f 62 61 6c 29 3b 0a 20 20 66 6f  , iGlobal);.  fo
12870 73 73 69 6c 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ssil_free(zName)
12880 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 75 6e 73 65  ;.}.void db_unse
12890 74 5f 6d 70 72 69 6e 74 66 28 69 6e 74 20 69 47  t_mprintf(int iG
128a0 6c 6f 62 61 6c 2c 20 63 6f 6e 73 74 20 63 68 61  lobal, const cha
128b0 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
128c0 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
128d0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
128e0 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
128f0 6f 72 6d 61 74 29 3b 0a 20 20 7a 4e 61 6d 65 20  ormat);.  zName 
12900 3d 20 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  = vmprintf(zForm
12910 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
12920 64 28 61 70 29 3b 0a 20 20 64 62 5f 75 6e 73 65  d(ap);.  db_unse
12930 74 28 7a 4e 61 6d 65 2c 20 69 47 6c 6f 62 61 6c  t(zName, iGlobal
12940 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65  );.  fossil_free
12950 28 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 0a 0a 23 69  (zName);.}....#i
12960 66 20 49 4e 54 45 52 46 41 43 45 0a 2f 2a 20 4d  f INTERFACE./* M
12970 61 6e 69 66 65 73 74 20 67 65 6e 65 72 61 74 69  anifest generati
12980 6f 6e 20 66 6c 61 67 73 20 2a 2f 0a 23 64 65 66  on flags */.#def
12990 69 6e 65 20 4d 46 45 53 54 46 4c 47 5f 52 41 57  ine MFESTFLG_RAW
129a0 20 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 4d    0x01.#define M
129b0 46 45 53 54 46 4c 47 5f 55 55 49 44 20 30 78 30  FESTFLG_UUID 0x0
129c0 32 0a 23 64 65 66 69 6e 65 20 4d 46 45 53 54 46  2.#define MFESTF
129d0 4c 47 5f 54 41 47 53 20 30 78 30 34 0a 23 65 6e  LG_TAGS 0x04.#en
129e0 64 69 66 20 2f 2a 20 49 4e 54 45 52 46 41 43 45  dif /* INTERFACE
129f0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74   */../*.** Get t
12a00 68 65 20 6d 61 6e 69 66 65 73 74 20 73 65 74 74  he manifest sett
12a10 69 6e 67 2e 20 20 46 6f 72 20 62 61 63 6b 77 61  ing.  For backwa
12a20 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
12a30 79 20 66 69 72 73 74 20 63 68 65 63 6b 20 69 66  y first check if
12a40 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73   the.** value is
12a50 20 61 20 62 6f 6f 6c 65 61 6e 2e 20 20 49 66 20   a boolean.  If 
12a60 69 74 27 73 20 6e 6f 74 20 61 20 62 6f 6f 6c 65  it's not a boole
12a70 61 6e 2c 20 74 72 65 61 74 20 65 61 63 68 20 63  an, treat each c
12a80 68 61 72 61 63 74 65 72 20 61 73 20 61 20 66 6c  haracter as a fl
12a90 61 67 0a 2a 2a 20 74 6f 20 65 6e 61 62 6c 65 20  ag.** to enable 
12aa0 61 20 6d 61 6e 69 66 65 73 74 20 74 79 70 65 2e  a manifest type.
12ab0 20 20 54 68 69 73 20 73 79 73 74 65 6d 20 70 75    This system pu
12ac0 74 73 20 63 65 72 74 61 69 6e 20 62 6f 75 6e 64  ts certain bound
12ad0 61 72 79 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f  ary conditions o
12ae0 6e 0a 2a 2a 20 77 68 69 63 68 20 6c 65 74 74 65  n.** which lette
12af0 72 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  rs can be used t
12b00 6f 20 72 65 70 72 65 73 65 6e 74 20 66 6c 61 67  o represent flag
12b10 73 20 28 61 6e 79 20 70 65 72 6d 75 74 61 74 69  s (any permutati
12b20 6f 6e 20 6f 66 20 66 6c 61 67 73 20 6d 75 73 74  on of flags must
12b30 0a 2a 2a 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  .** not be able 
12b40 74 6f 20 66 75 6c 6c 79 20 66 6f 72 6d 20 6f 6e  to fully form on
12b50 65 20 6f 66 20 74 68 65 20 62 6f 6f 6c 65 61 6e  e of the boolean
12b60 20 76 61 6c 75 65 73 29 2e 0a 2a 2f 0a 69 6e 74   values)..*/.int
12b70 20 64 62 5f 67 65 74 5f 6d 61 6e 69 66 65 73 74   db_get_manifest
12b80 5f 73 65 74 74 69 6e 67 28 76 6f 69 64 29 7b 0a  _setting(void){.
12b90 20 20 69 6e 74 20 66 6c 67 3b 0a 20 20 63 68 61    int flg;.  cha
12ba0 72 20 2a 7a 56 61 6c 20 3d 20 64 62 5f 67 65 74  r *zVal = db_get
12bb0 28 22 6d 61 6e 69 66 65 73 74 22 2c 20 30 29 3b  ("manifest", 0);
12bc0 0a 20 20 69 66 28 20 7a 56 61 6c 3d 3d 30 20 7c  .  if( zVal==0 |
12bd0 7c 20 69 73 5f 66 61 6c 73 65 28 7a 56 61 6c 29  | is_false(zVal)
12be0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
12bf0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73  ;.  }else if( is
12c00 5f 74 72 75 74 68 28 7a 56 61 6c 29 20 29 7b 0a  _truth(zVal) ){.
12c10 20 20 20 20 72 65 74 75 72 6e 20 4d 46 45 53 54      return MFEST
12c20 46 4c 47 5f 52 41 57 7c 4d 46 45 53 54 46 4c 47  FLG_RAW|MFESTFLG
12c30 5f 55 55 49 44 3b 0a 20 20 7d 0a 20 20 66 6c 67  _UUID;.  }.  flg
12c40 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a   = 0;.  while( *
12c50 7a 56 61 6c 20 29 7b 0a 20 20 20 20 73 77 69 74  zVal ){.    swit
12c60 63 68 28 20 2a 7a 56 61 6c 20 29 7b 0a 20 20 20  ch( *zVal ){.   
12c70 20 20 20 63 61 73 65 20 27 72 27 3a 20 66 6c 67     case 'r': flg
12c80 20 7c 3d 20 4d 46 45 53 54 46 4c 47 5f 52 41 57   |= MFESTFLG_RAW
12c90 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
12ca0 63 61 73 65 20 27 75 27 3a 20 66 6c 67 20 7c 3d  case 'u': flg |=
12cb0 20 4d 46 45 53 54 46 4c 47 5f 55 55 49 44 3b 20   MFESTFLG_UUID; 
12cc0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
12cd0 65 20 27 74 27 3a 20 66 6c 67 20 7c 3d 20 4d 46  e 't': flg |= MF
12ce0 45 53 54 46 4c 47 5f 54 41 47 53 3b 20 62 72 65  ESTFLG_TAGS; bre
12cf0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 56  ak;.    }.    zV
12d00 61 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  al++;.  }.  retu
12d10 72 6e 20 66 6c 67 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  rn flg;.}.../*.*
12d20 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 61 6d  * Record the nam
12d30 65 20 6f 66 20 61 20 6c 6f 63 61 6c 20 72 65 70  e of a local rep
12d40 6f 73 69 74 6f 72 79 20 69 6e 20 74 68 65 20 67  ository in the g
12d50 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 28 29 20 64  lobal_config() d
12d60 61 74 61 62 61 73 65 2e 0a 2a 2a 20 54 68 65 20  atabase..** The 
12d70 72 65 70 6f 73 69 74 6f 72 79 20 66 69 6c 65 6e  repository filen
12d80 61 6d 65 20 25 73 20 69 73 20 72 65 63 6f 72 64  ame %s is record
12d90 65 64 20 61 73 20 61 6e 20 65 6e 74 72 79 20 77  ed as an entry w
12da0 69 74 68 20 61 20 22 6e 61 6d 65 22 20 66 69 65  ith a "name" fie
12db0 6c 64 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ld.** of the fol
12dc0 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a  lowing form:.**.
12dd0 2a 2a 20 20 20 20 20 20 20 72 65 70 6f 3a 25 73  **       repo:%s
12de0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
12df0 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f   field is set to
12e00 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 75 6e   1..**.** If run
12e10 6e 69 6e 67 20 66 72 6f 6d 20 61 20 6c 6f 63 61  ning from a loca
12e20 6c 20 63 68 65 63 6b 6f 75 74 2c 20 61 6c 73 6f  l checkout, also
12e30 20 72 65 63 6f 72 64 20 74 68 65 20 72 6f 6f 74   record the root
12e40 20 6f 66 20 74 68 65 20 63 68 65 63 6b 6f 75 74   of the checkout
12e50 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  .** as follows:.
12e60 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 63 6b 6f 75  **.**       ckou
12e70 74 3a 25 73 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65  t:%s.**.** Where
12e80 20 25 73 20 69 73 20 74 68 65 20 63 68 65 63 6b   %s is the check
12e90 6f 75 74 20 72 6f 6f 74 2e 20 20 54 68 65 20 76  out root.  The v
12ea0 61 6c 75 65 20 69 73 20 74 68 65 20 72 65 70 6f  alue is the repo
12eb0 73 69 74 6f 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a  sitory file..*/.
12ec0 76 6f 69 64 20 64 62 5f 72 65 63 6f 72 64 5f 72  void db_record_r
12ed0 65 70 6f 73 69 74 6f 72 79 5f 66 69 6c 65 6e 61  epository_filena
12ee0 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  me(const char *z
12ef0 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
12f00 52 65 70 6f 53 65 74 74 69 6e 67 3b 0a 20 20 63  RepoSetting;.  c
12f10 68 61 72 20 2a 7a 43 6b 6f 75 74 53 65 74 74 69  har *zCkoutSetti
12f20 6e 67 3b 0a 20 20 42 6c 6f 62 20 66 75 6c 6c 3b  ng;.  Blob full;
12f30 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
12f40 29 7b 0a 20 20 20 20 69 66 28 20 21 67 2e 6c 6f  ){.    if( !g.lo
12f50 63 61 6c 4f 70 65 6e 20 29 20 72 65 74 75 72 6e  calOpen ) return
12f60 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 64 62  ;.    zName = db
12f70 5f 72 65 70 6f 73 69 74 6f 72 79 5f 66 69 6c 65  _repository_file
12f80 6e 61 6d 65 28 29 3b 0a 20 20 7d 0a 20 20 66 69  name();.  }.  fi
12f90 6c 65 5f 63 61 6e 6f 6e 69 63 61 6c 5f 6e 61 6d  le_canonical_nam
12fa0 65 28 7a 4e 61 6d 65 2c 20 26 66 75 6c 6c 2c 20  e(zName, &full, 
12fb0 30 29 3b 0a 20 20 28 76 6f 69 64 29 66 69 6c 65  0);.  (void)file
12fc0 6e 61 6d 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29  name_collation()
12fd0 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  ;  /* Initialize
12fe0 20 62 65 66 6f 72 65 20 63 6f 6e 6e 65 63 74 69   before connecti
12ff0 6f 6e 20 73 77 61 70 20 2a 2f 0a 20 20 64 62 5f  on swap */.  db_
13000 73 77 61 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73  swap_connections
13010 28 29 3b 0a 20 20 7a 52 65 70 6f 53 65 74 74 69  ();.  zRepoSetti
13020 6e 67 20 3d 20 6d 70 72 69 6e 74 66 28 22 72 65  ng = mprintf("re
13030 70 6f 3a 25 71 22 2c 20 62 6c 6f 62 5f 73 74 72  po:%q", blob_str
13040 28 26 66 75 6c 6c 29 29 3b 0a 20 20 64 62 5f 6d  (&full));.  db_m
13050 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20  ulti_exec(.     
13060 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 67 6c 6f  "DELETE FROM glo
13070 62 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45 52 45  bal_config WHERE
13080 20 6e 61 6d 65 20 25 73 20 3d 20 25 51 3b 22 2c   name %s = %Q;",
13090 0a 20 20 20 20 20 66 69 6c 65 6e 61 6d 65 5f 63  .     filename_c
130a0 6f 6c 6c 61 74 69 6f 6e 28 29 2c 20 7a 52 65 70  ollation(), zRep
130b0 6f 53 65 74 74 69 6e 67 0a 20 20 29 3b 0a 20 20  oSetting.  );.  
130c0 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20  db_multi_exec(. 
130d0 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49      "INSERT OR I
130e0 47 4e 4f 52 45 20 49 4e 54 4f 20 67 6c 6f 62 61  GNORE INTO globa
130f0 6c 5f 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61  l_config(name,va
13100 6c 75 65 29 22 0a 20 20 20 20 20 22 56 41 4c 55  lue)".     "VALU
13110 45 53 28 25 51 2c 31 29 3b 22 2c 0a 20 20 20 20  ES(%Q,1);",.    
13120 20 7a 52 65 70 6f 53 65 74 74 69 6e 67 0a 20 20   zRepoSetting.  
13130 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65  );.  fossil_free
13140 28 7a 52 65 70 6f 53 65 74 74 69 6e 67 29 3b 0a  (zRepoSetting);.
13150 20 20 69 66 28 20 67 2e 6c 6f 63 61 6c 4f 70 65    if( g.localOpe
13160 6e 20 26 26 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f  n && g.zLocalRoo
13170 74 20 26 26 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f  t && g.zLocalRoo
13180 74 5b 30 5d 20 29 7b 0a 20 20 20 20 42 6c 6f 62  t[0] ){.    Blob
13190 20 6c 6f 63 61 6c 52 6f 6f 74 3b 0a 20 20 20 20   localRoot;.    
131a0 66 69 6c 65 5f 63 61 6e 6f 6e 69 63 61 6c 5f 6e  file_canonical_n
131b0 61 6d 65 28 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74  ame(g.zLocalRoot
131c0 2c 20 26 6c 6f 63 61 6c 52 6f 6f 74 2c 20 31 29  , &localRoot, 1)
131d0 3b 0a 20 20 20 20 7a 43 6b 6f 75 74 53 65 74 74  ;.    zCkoutSett
131e0 69 6e 67 20 3d 20 6d 70 72 69 6e 74 66 28 22 63  ing = mprintf("c
131f0 6b 6f 75 74 3a 25 71 22 2c 20 62 6c 6f 62 5f 73  kout:%q", blob_s
13200 74 72 28 26 6c 6f 63 61 6c 52 6f 6f 74 29 29 3b  tr(&localRoot));
13210 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78  .    db_multi_ex
13220 65 63 28 0a 20 20 20 20 20 20 20 22 44 45 4c 45  ec(.       "DELE
13230 54 45 20 46 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63  TE FROM global_c
13240 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65  onfig WHERE name
13250 20 25 73 20 3d 20 25 51 3b 22 2c 0a 20 20 20 20   %s = %Q;",.    
13260 20 20 20 66 69 6c 65 6e 61 6d 65 5f 63 6f 6c 6c     filename_coll
13270 61 74 69 6f 6e 28 29 2c 20 7a 43 6b 6f 75 74 53  ation(), zCkoutS
13280 65 74 74 69 6e 67 0a 20 20 20 20 29 3b 0a 20 20  etting.    );.  
13290 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
132a0 0a 20 20 20 20 20 20 22 52 45 50 4c 41 43 45 20  .      "REPLACE 
132b0 49 4e 54 4f 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66  INTO global_conf
132c0 69 67 28 6e 61 6d 65 2c 20 76 61 6c 75 65 29 22  ig(name, value)"
132d0 0a 20 20 20 20 20 20 22 56 41 4c 55 45 53 28 25  .      "VALUES(%
132e0 51 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 7a  Q,%Q);",.      z
132f0 43 6b 6f 75 74 53 65 74 74 69 6e 67 2c 20 62 6c  CkoutSetting, bl
13300 6f 62 5f 73 74 72 28 26 66 75 6c 6c 29 0a 20 20  ob_str(&full).  
13310 20 20 29 3b 0a 20 20 20 20 64 62 5f 73 77 61 70    );.    db_swap
13320 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 29 3b 0a  _connections();.
13330 20 20 20 20 64 62 5f 6f 70 74 69 6f 6e 61 6c 5f      db_optional_
13340 73 71 6c 28 22 72 65 70 6f 73 69 74 6f 72 79 22  sql("repository"
13350 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
13360 45 20 46 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48  E FROM config WH
13370 45 52 45 20 6e 61 6d 65 20 25 73 20 3d 20 25 51  ERE name %s = %Q
13380 3b 22 2c 0a 20 20 20 20 20 20 20 20 66 69 6c 65  ;",.        file
13390 6e 61 6d 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 29  name_collation()
133a0 2c 20 7a 43 6b 6f 75 74 53 65 74 74 69 6e 67 0a  , zCkoutSetting.
133b0 20 20 20 20 29 3b 0a 20 20 20 20 64 62 5f 6f 70      );.    db_op
133c0 74 69 6f 6e 61 6c 5f 73 71 6c 28 22 72 65 70 6f  tional_sql("repo
133d0 73 69 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 20  sitory",.       
133e0 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 63   "REPLACE INTO c
133f0 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c 75 65  onfig(name,value
13400 2c 6d 74 69 6d 65 29 22 0a 20 20 20 20 20 20 20  ,mtime)".       
13410 20 22 56 41 4c 55 45 53 28 25 51 2c 31 2c 6e 6f   "VALUES(%Q,1,no
13420 77 28 29 29 3b 22 2c 0a 20 20 20 20 20 20 20 20  w());",.        
13430 7a 43 6b 6f 75 74 53 65 74 74 69 6e 67 0a 20 20  zCkoutSetting.  
13440 20 20 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f    );.    fossil_
13450 66 72 65 65 28 7a 43 6b 6f 75 74 53 65 74 74 69  free(zCkoutSetti
13460 6e 67 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65  ng);.    blob_re
13470 73 65 74 28 26 6c 6f 63 61 6c 52 6f 6f 74 29 3b  set(&localRoot);
13480 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
13490 5f 73 77 61 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e  _swap_connection
134a0 73 28 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f  s();.  }.  blob_
134b0 72 65 73 65 74 28 26 66 75 6c 6c 29 3b 0a 7d 0a  reset(&full);.}.
134c0 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20  ./*.** COMMAND: 
134d0 6f 70 65 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  open.**.** Usage
134e0 3a 20 25 66 6f 73 73 69 6c 20 6f 70 65 6e 20 46  : %fossil open F
134f0 49 4c 45 4e 41 4d 45 20 3f 56 45 52 53 49 4f 4e  ILENAME ?VERSION
13500 3f 20 3f 4f 50 54 49 4f 4e 53 3f 0a 2a 2a 0a 2a  ? ?OPTIONS?.**.*
13510 2a 20 4f 70 65 6e 20 61 20 63 6f 6e 6e 65 63 74  * Open a connect
13520 69 6f 6e 20 74 6f 20 74 68 65 20 6c 6f 63 61 6c  ion to the local
13530 20 72 65 70 6f 73 69 74 6f 72 79 20 69 6e 20 46   repository in F
13540 49 4c 45 4e 41 4d 45 2e 20 20 41 20 63 68 65 63  ILENAME.  A chec
13550 6b 6f 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20  kout.** for the 
13560 72 65 70 6f 73 69 74 6f 72 79 20 69 73 20 63 72  repository is cr
13570 65 61 74 65 64 20 77 69 74 68 20 69 74 73 20 72  eated with its r
13580 6f 6f 74 20 61 74 20 74 68 65 20 77 6f 72 6b 69  oot at the worki
13590 6e 67 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2a  ng directory..**
135a0 20 49 66 20 56 45 52 53 49 4f 4e 20 69 73 20 73   If VERSION is s
135b0 70 65 63 69 66 69 65 64 20 74 68 65 6e 20 74 68  pecified then th
135c0 61 74 20 76 65 72 73 69 6f 6e 20 69 73 20 63 68  at version is ch
135d0 65 63 6b 65 64 20 6f 75 74 2e 20 20 4f 74 68 65  ecked out.  Othe
135e0 72 77 69 73 65 0a 2a 2a 20 74 68 65 20 6c 61 74  rwise.** the lat
135f0 65 73 74 20 76 65 72 73 69 6f 6e 20 69 73 20 63  est version is c
13600 68 65 63 6b 65 64 20 6f 75 74 2e 20 20 4e 6f 20  hecked out.  No 
13610 66 69 6c 65 73 20 6f 74 68 65 72 20 74 68 61 6e  files other than
13620 20 22 6d 61 6e 69 66 65 73 74 22 0a 2a 2a 20 61   "manifest".** a
13630 6e 64 20 22 6d 61 6e 69 66 65 73 74 2e 75 75 69  nd "manifest.uui
13640 64 22 20 61 72 65 20 6d 6f 64 69 66 69 65 64 20  d" are modified 
13650 69 66 20 74 68 65 20 2d 2d 6b 65 65 70 20 6f 70  if the --keep op
13660 74 69 6f 6e 20 69 73 20 70 72 65 73 65 6e 74 2e  tion is present.
13670 0a 2a 2a 0a 2a 2a 20 4f 70 74 69 6f 6e 73 3a 0a  .**.** Options:.
13680 2a 2a 20 20 20 2d 2d 65 6d 70 74 79 20 20 20 20  **   --empty    
13690 20 20 20 20 20 20 20 49 6e 69 74 69 61 6c 69 7a         Initializ
136a0 65 20 63 68 65 63 6b 6f 75 74 20 61 73 20 62 65  e checkout as be
136b0 69 6e 67 20 65 6d 70 74 79 2c 20 62 75 74 20 73  ing empty, but s
136c0 74 69 6c 6c 20 63 6f 6e 6e 65 63 74 65 64 0a 2a  till connected.*
136d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
136e0 20 20 20 20 20 20 77 69 74 68 20 74 68 65 20 6c        with the l
136f0 6f 63 61 6c 20 72 65 70 6f 73 69 74 6f 72 79 2e  ocal repository.
13700 20 49 66 20 79 6f 75 20 63 6f 6d 6d 69 74 20 74   If you commit t
13710 68 69 73 20 63 68 65 63 6b 6f 75 74 2c 0a 2a 2a  his checkout,.**
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13730 20 20 20 20 20 69 74 20 77 69 6c 6c 20 62 65 63       it will bec
13740 6f 6d 65 20 61 20 6e 65 77 20 22 69 6e 69 74 69  ome a new "initi
13750 61 6c 22 20 63 6f 6d 6d 69 74 20 69 6e 20 74 68  al" commit in th
13760 65 20 72 65 70 6f 73 69 74 6f 72 79 2e 0a 2a 2a  e repository..**
13770 20 20 20 2d 2d 6b 65 65 70 20 20 20 20 20 20 20     --keep       
13780 20 20 20 20 20 4f 6e 6c 79 20 6d 6f 64 69 66 79       Only modify
13790 20 74 68 65 20 6d 61 6e 69 66 65 73 74 20 61 6e   the manifest an
137a0 64 20 6d 61 6e 69 66 65 73 74 2e 75 75 69 64 20  d manifest.uuid 
137b0 66 69 6c 65 73 0a 2a 2a 20 20 20 2d 2d 6e 65 73  files.**   --nes
137c0 74 65 64 20 20 20 20 20 20 20 20 20 20 41 6c 6c  ted          All
137d0 6f 77 20 6f 70 65 6e 69 6e 67 20 61 20 72 65 70  ow opening a rep
137e0 6f 73 69 74 6f 72 79 20 69 6e 73 69 64 65 20 61  ository inside a
137f0 6e 20 6f 70 65 6e 65 64 20 63 68 65 63 6b 6f 75  n opened checkou
13800 74 0a 2a 2a 20 20 20 2d 2d 66 6f 72 63 65 2d 6d  t.**   --force-m
13810 69 73 73 69 6e 67 20 20 20 46 6f 72 63 65 20 6f  issing   Force o
13820 70 65 6e 69 6e 67 20 61 20 72 65 70 6f 73 69 74  pening a reposit
13830 6f 72 79 20 77 69 74 68 20 6d 69 73 73 69 6e 67  ory with missing
13840 20 63 6f 6e 74 65 6e 74 0a 2a 2a 0a 2a 2a 20 53   content.**.** S
13850 65 65 20 61 6c 73 6f 3a 20 63 6c 6f 73 65 0a 2a  ee also: close.*
13860 2f 0a 76 6f 69 64 20 63 6d 64 5f 6f 70 65 6e 28  /.void cmd_open(
13870 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 65 6d 70  void){.  int emp
13880 74 79 46 6c 61 67 3b 0a 20 20 69 6e 74 20 6b 65  tyFlag;.  int ke
13890 65 70 46 6c 61 67 3b 0a 20 20 69 6e 74 20 66 6f  epFlag;.  int fo
138a0 72 63 65 4d 69 73 73 69 6e 67 46 6c 61 67 3b 0a  rceMissingFlag;.
138b0 20 20 69 6e 74 20 61 6c 6c 6f 77 4e 65 73 74 65    int allowNeste
138c0 64 3b 0a 20 20 69 6e 74 20 61 6c 6c 6f 77 53 79  d;.  int allowSy
138d0 6d 6c 69 6e 6b 73 3b 0a 20 20 73 74 61 74 69 63  mlinks;.  static
138e0 20 63 68 61 72 20 2a 61 7a 4e 65 77 41 72 67 76   char *azNewArgv
138f0 5b 5d 20 3d 20 7b 20 30 2c 20 22 63 68 65 63 6b  [] = { 0, "check
13900 6f 75 74 22 2c 20 22 2d 2d 70 72 6f 6d 70 74 22  out", "--prompt"
13910 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
13920 0a 20 20 75 72 6c 5f 70 72 6f 78 79 5f 6f 70 74  .  url_proxy_opt
13930 69 6f 6e 73 28 29 3b 0a 20 20 65 6d 70 74 79 46  ions();.  emptyF
13940 6c 61 67 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f  lag = find_optio
13950 6e 28 22 65 6d 70 74 79 22 2c 30 2c 30 29 21 3d  n("empty",0,0)!=
13960 30 3b 0a 20 20 6b 65 65 70 46 6c 61 67 20 3d 20  0;.  keepFlag = 
13970 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 6b 65 65  find_option("kee
13980 70 22 2c 30 2c 30 29 21 3d 30 3b 0a 20 20 66 6f  p",0,0)!=0;.  fo
13990 72 63 65 4d 69 73 73 69 6e 67 46 6c 61 67 20 3d  rceMissingFlag =
139a0 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 66 6f   find_option("fo
139b0 72 63 65 2d 6d 69 73 73 69 6e 67 22 2c 30 2c 30  rce-missing",0,0
139c0 29 21 3d 30 3b 0a 20 20 61 6c 6c 6f 77 4e 65 73  )!=0;.  allowNes
139d0 74 65 64 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f  ted = find_optio
139e0 6e 28 22 6e 65 73 74 65 64 22 2c 30 2c 30 29 21  n("nested",0,0)!
139f0 3d 30 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f  =0;..  /* We sho
13a00 75 6c 64 20 62 65 20 64 6f 6e 65 20 77 69 74 68  uld be done with
13a10 20 6f 70 74 69 6f 6e 73 2e 2e 20 2a 2f 0a 20 20   options.. */.  
13a20 76 65 72 69 66 79 5f 61 6c 6c 5f 6f 70 74 69 6f  verify_all_optio
13a30 6e 73 28 29 3b 0a 0a 20 20 69 66 28 20 67 2e 61  ns();..  if( g.a
13a40 72 67 63 21 3d 33 20 26 26 20 67 2e 61 72 67 63  rgc!=3 && g.argc
13a50 21 3d 34 20 29 7b 0a 20 20 20 20 75 73 61 67 65  !=4 ){.    usage
13a60 28 22 52 45 50 4f 53 49 54 4f 52 59 2d 46 49 4c  ("REPOSITORY-FIL
13a70 45 4e 41 4d 45 20 3f 56 45 52 53 49 4f 4e 3f 22  ENAME ?VERSION?"
13a80 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 61 6c  );.  }.  if( !al
13a90 6c 6f 77 4e 65 73 74 65 64 20 26 26 20 64 62 5f  lowNested && db_
13aa0 6f 70 65 6e 5f 6c 6f 63 61 6c 28 30 29 20 29 7b  open_local(0) ){
13ab0 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61  .    fossil_fata
13ac0 6c 28 22 61 6c 72 65 61 64 79 20 77 69 74 68 69  l("already withi
13ad0 6e 20 61 6e 20 6f 70 65 6e 20 74 72 65 65 20 72  n an open tree r
13ae0 6f 6f 74 65 64 20 61 74 20 25 73 22 2c 20 67 2e  ooted at %s", g.
13af0 7a 4c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20 20 7d  zLocalRoot);.  }
13b00 0a 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73  .  db_open_repos
13b10 69 74 6f 72 79 28 67 2e 61 72 67 76 5b 32 5d 29  itory(g.argv[2])
13b20 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
13b30 75 74 20 77 68 69 63 68 20 72 65 76 69 73 69 6f  ut which revisio
13b40 6e 20 74 6f 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20  n to open. */.  
13b50 69 66 28 20 21 65 6d 70 74 79 46 6c 61 67 20 29  if( !emptyFlag )
13b60 7b 0a 20 20 20 20 69 66 28 20 67 2e 61 72 67 63  {.    if( g.argc
13b70 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 67 2e 7a  ==4 ){.      g.z
13b80 4f 70 65 6e 52 65 76 69 73 69 6f 6e 20 3d 20 67  OpenRevision = g
13b90 2e 61 72 67 76 5b 33 5d 3b 0a 20 20 20 20 7d 65  .argv[3];.    }e
13ba0 6c 73 65 20 69 66 28 20 64 62 5f 65 78 69 73 74  lse if( db_exist
13bb0 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  s("SELECT 1 FROM
13bc0 20 65 76 65 6e 74 20 57 48 45 52 45 20 74 79 70   event WHERE typ
13bd0 65 3d 27 63 69 27 22 29 20 29 7b 0a 20 20 20 20  e='ci'") ){.    
13be0 20 20 67 2e 7a 4f 70 65 6e 52 65 76 69 73 69 6f    g.zOpenRevisio
13bf0 6e 20 3d 20 64 62 5f 67 65 74 28 22 6d 61 69 6e  n = db_get("main
13c00 2d 62 72 61 6e 63 68 22 2c 20 22 74 72 75 6e 6b  -branch", "trunk
13c10 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ");.    }.  }.. 
13c20 20 69 66 28 20 67 2e 7a 4f 70 65 6e 52 65 76 69   if( g.zOpenRevi
13c30 73 69 6f 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 53  sion ){.    /* S
13c40 69 6e 63 65 20 74 68 65 20 72 65 70 6f 73 69 74  ince the reposit
13c50 6f 72 79 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ory is open and 
13c60 77 65 20 6b 6e 6f 77 20 74 68 65 20 72 65 76 69  we know the revi
13c70 73 69 6f 6e 20 6e 6f 77 2c 0a 20 20 20 20 2a 2a  sion now,.    **
13c80 20 72 65 66 72 65 73 68 20 74 68 65 20 61 6c 6c   refresh the all
13c90 6f 77 2d 73 79 6d 6c 69 6e 6b 73 20 66 6c 61 67  ow-symlinks flag
13ca0 2e 20 20 53 69 6e 63 65 20 6e 65 69 74 68 65 72  .  Since neither
13cb0 20 74 68 65 20 6c 6f 63 61 6c 0a 20 20 20 20 2a   the local.    *
13cc0 2a 20 63 68 65 63 6b 6f 75 74 20 6e 6f 72 20 74  * checkout nor t
13cd0 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
13ce0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 6f 70   database are op
13cf0 65 6e 20 61 74 20 74 68 69 73 0a 20 20 20 20 2a  en at this.    *
13d00 2a 20 70 6f 69 6e 74 2c 20 74 68 69 73 20 73 68  * point, this sh
13d10 6f 75 6c 64 20 61 6c 77 61 79 73 20 72 65 74 75  ould always retu
13d20 72 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 65 64  rn the versioned
13d30 20 73 65 74 74 69 6e 67 2c 0a 20 20 20 20 2a 2a   setting,.    **
13d40 20 69 66 20 61 6e 79 2c 20 6f 72 20 74 68 65 20   if any, or the 
13d50 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2c 20 77  default value, w
13d60 68 69 63 68 20 69 73 20 6e 65 67 61 74 69 76 65  hich is negative
13d70 20 6f 6e 65 2e 20 20 54 68 65 0a 20 20 20 20 2a   one.  The.    *
13d80 2a 20 76 61 6c 75 65 20 6e 65 67 61 74 69 76 65  * value negative
13d90 20 6f 6e 65 2c 20 69 6e 20 74 68 69 73 20 63 6f   one, in this co
13da0 6e 74 65 78 74 2c 20 6d 65 61 6e 73 20 74 68 61  ntext, means tha
13db0 74 20 74 68 65 20 63 6f 64 65 0a 20 20 20 20 2a  t the code.    *
13dc0 2a 20 62 65 6c 6f 77 20 73 68 6f 75 6c 64 20 66  * below should f
13dd0 61 6c 6c 62 61 63 6b 20 74 6f 20 75 73 69 6e 67  allback to using
13de0 20 74 68 65 20 73 65 74 74 69 6e 67 20 76 61 6c   the setting val
13df0 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ue from the.    
13e00 2a 2a 20 72 65 70 6f 73 69 74 6f 72 79 20 6f 72  ** repository or
13e10 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75 72   global configur
13e20 61 74 69 6f 6e 20 64 61 74 61 62 61 73 65 73 20  ation databases 
13e30 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 61 6c 6c  only. */.    all
13e40 6f 77 53 79 6d 6c 69 6e 6b 73 20 3d 20 64 62 5f  owSymlinks = db_
13e50 67 65 74 5f 76 65 72 73 69 6f 6e 65 64 5f 62 6f  get_versioned_bo
13e60 6f 6c 65 61 6e 28 22 61 6c 6c 6f 77 2d 73 79 6d  olean("allow-sym
13e70 6c 69 6e 6b 73 22 2c 20 2d 31 29 3b 0a 20 20 7d  links", -1);.  }
13e80 65 6c 73 65 7b 0a 20 20 20 20 61 6c 6c 6f 77 53  else{.    allowS
13e90 79 6d 6c 69 6e 6b 73 20 3d 20 2d 31 3b 20 2f 2a  ymlinks = -1; /*
13ea0 20 55 73 65 20 6e 6f 6e 2d 76 65 72 73 69 6f 6e   Use non-version
13eb0 65 64 20 73 65 74 74 69 6e 67 73 20 6f 6e 6c 79  ed settings only
13ec0 2e 20 2a 2f 0a 20 20 7d 0a 0a 23 69 66 20 64 65  . */.  }..#if de
13ed0 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
13ee0 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
13ef0 4e 5f 5f 29 0a 23 20 64 65 66 69 6e 65 20 4c 4f  N__).# define LO
13f00 43 41 4c 44 42 5f 4e 41 4d 45 20 22 2e 2f 5f 46  CALDB_NAME "./_F
13f10 4f 53 53 49 4c 5f 22 0a 23 65 6c 73 65 0a 23 20  OSSIL_".#else.# 
13f20 64 65 66 69 6e 65 20 4c 4f 43 41 4c 44 42 5f 4e  define LOCALDB_N
13f30 41 4d 45 20 22 2e 2f 2e 66 73 6c 63 6b 6f 75 74  AME "./.fslckout
13f40 22 0a 23 65 6e 64 69 66 0a 20 20 64 62 5f 69 6e  ".#endif.  db_in
13f50 69 74 5f 64 61 74 61 62 61 73 65 28 4c 4f 43 41  it_database(LOCA
13f60 4c 44 42 5f 4e 41 4d 45 2c 20 7a 4c 6f 63 61 6c  LDB_NAME, zLocal
13f70 53 63 68 65 6d 61 2c 0a 23 69 66 64 65 66 20 46  Schema,.#ifdef F
13f80 4f 53 53 49 4c 5f 4c 4f 43 41 4c 5f 57 41 4c 0a  OSSIL_LOCAL_WAL.
13f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fa0 20 20 20 22 43 4f 4d 4d 49 54 3b 20 50 52 41 47     "COMMIT; PRAG
13fb0 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
13fc0 57 41 4c 3b 20 42 45 47 49 4e 3b 22 2c 0a 23 65  WAL; BEGIN;",.#e
13fd0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
13fe0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30          (char*)0
13ff0 29 3b 0a 20 20 64 62 5f 64 65 6c 65 74 65 5f 6f  );.  db_delete_o
14000 6e 5f 66 61 69 6c 75 72 65 28 4c 4f 43 41 4c 44  n_failure(LOCALD
14010 42 5f 4e 41 4d 45 29 3b 0a 20 20 64 62 5f 6f 70  B_NAME);.  db_op
14020 65 6e 5f 6c 6f 63 61 6c 28 30 29 3b 0a 20 20 69  en_local(0);.  i
14030 66 28 20 61 6c 6c 6f 77 53 79 6d 6c 69 6e 6b 73  f( allowSymlinks
14040 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 55 73  >=0 ){.    /* Us
14050 65 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  e the value from
14060 20 74 68 65 20 76 65 72 73 69 6f 6e 65 64 20 73   the versioned s
14070 65 74 74 69 6e 67 2c 20 77 68 69 63 68 20 77 61  etting, which wa
14080 73 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 70 72  s read.    ** pr
14090 69 6f 72 20 74 6f 20 6f 70 65 6e 69 6e 67 20 74  ior to opening t
140a0 68 65 20 6c 6f 63 61 6c 20 63 68 65 63 6b 6f 75  he local checkou
140b0 74 20 28 69 2e 65 2e 20 77 68 69 63 68 20 69 73  t (i.e. which is
140c0 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 6c 69 6b   most.    ** lik
140d0 65 6c 79 20 65 6d 70 74 79 20 61 6e 64 20 64 6f  ely empty and do
140e0 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  es not actually 
140f0 63 6f 6e 74 61 69 6e 20 61 6e 79 20 76 65 72 73  contain any vers
14100 69 6f 6e 65 64 0a 20 20 20 20 2a 2a 20 73 65 74  ioned.    ** set
14110 74 69 6e 67 20 66 69 6c 65 73 20 79 65 74 29 2e  ting files yet).
14120 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73    Normally, this
14130 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20   value would be 
14140 67 69 76 65 6e 0a 20 20 20 20 2a 2a 20 66 69 72  given.    ** fir
14150 73 74 20 70 72 69 6f 72 69 74 79 20 77 69 74 68  st priority with
14160 69 6e 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61  in db_get_boolea
14170 6e 28 29 3b 20 68 6f 77 65 76 65 72 2c 20 74 68  n(); however, th
14180 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 61 20 73  is is.    ** a s
14190 70 65 63 69 61 6c 20 63 61 73 65 20 62 65 63 61  pecial case beca
141a0 75 73 65 20 77 65 20 6b 6e 6f 77 20 74 68 65 20  use we know the 
141b0 6f 6e 2d 64 69 73 6b 20 66 69 6c 65 73 20 6d 61  on-disk files ma
141c0 79 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 65 78 69  y not.    ** exi
141d0 73 74 20 79 65 74 2e 20 2a 2f 0a 20 20 20 20 67  st yet. */.    g
141e0 2e 61 6c 6c 6f 77 53 79 6d 6c 69 6e 6b 73 20 3d  .allowSymlinks =
141f0 20 61 6c 6c 6f 77 53 79 6d 6c 69 6e 6b 73 3b 0a   allowSymlinks;.
14200 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
14210 53 69 6e 63 65 20 74 68 65 20 6c 6f 63 61 6c 20  Since the local 
14220 63 68 65 63 6b 6f 75 74 20 6d 61 79 20 6e 6f 74  checkout may not
14230 20 68 61 76 65 20 61 6e 79 20 66 69 6c 65 73 20   have any files 
14240 61 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  at this.    ** p
14250 6f 69 6e 74 2c 20 74 68 69 73 20 77 69 6c 6c 20  oint, this will 
14260 70 72 6f 62 61 62 6c 79 20 62 65 20 74 68 65 20  probably be the 
14270 73 65 74 74 69 6e 67 20 76 61 6c 75 65 20 66 72  setting value fr
14280 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  om the.    ** re
14290 70 6f 73 69 74 6f 72 79 20 6f 72 20 67 6c 6f 62  pository or glob
142a0 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
142b0 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20   databases. */. 
142c0 20 20 20 67 2e 61 6c 6c 6f 77 53 79 6d 6c 69 6e     g.allowSymlin
142d0 6b 73 20 3d 20 64 62 5f 67 65 74 5f 62 6f 6f 6c  ks = db_get_bool
142e0 65 61 6e 28 22 61 6c 6c 6f 77 2d 73 79 6d 6c 69  ean("allow-symli
142f0 6e 6b 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  nks",.          
14300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14310 20 20 20 20 20 20 20 20 20 20 20 64 62 5f 61 6c             db_al
14320 6c 6f 77 5f 73 79 6d 6c 69 6e 6b 73 5f 62 79 5f  low_symlinks_by_
14330 64 65 66 61 75 6c 74 28 29 29 3b 0a 20 20 7d 0a  default());.  }.
14340 20 20 64 62 5f 6c 73 65 74 28 22 72 65 70 6f 73    db_lset("repos
14350 69 74 6f 72 79 22 2c 20 67 2e 61 72 67 76 5b 32  itory", g.argv[2
14360 5d 29 3b 0a 20 20 64 62 5f 72 65 63 6f 72 64 5f  ]);.  db_record_
14370 72 65 70 6f 73 69 74 6f 72 79 5f 66 69 6c 65 6e  repository_filen
14380 61 6d 65 28 67 2e 61 72 67 76 5b 32 5d 29 3b 0a  ame(g.argv[2]);.
14390 20 20 64 62 5f 6c 73 65 74 5f 69 6e 74 28 22 63    db_lset_int("c
143a0 68 65 63 6b 6f 75 74 22 2c 20 30 29 3b 0a 20 20  heckout", 0);.  
143b0 61 7a 4e 65 77 41 72 67 76 5b 30 5d 20 3d 20 67  azNewArgv[0] = g
143c0 2e 61 72 67 76 5b 30 5d 3b 0a 20 20 67 2e 61 72  .argv[0];.  g.ar
143d0 67 76 20 3d 20 61 7a 4e 65 77 41 72 67 76 3b 0a  gv = azNewArgv;.
143e0 20 20 69 66 28 20 21 65 6d 70 74 79 46 6c 61 67    if( !emptyFlag
143f0 20 29 7b 0a 20 20 20 20 67 2e 61 72 67 63 20 3d   ){.    g.argc =
14400 20 33 3b 0a 20 20 20 20 69 66 28 20 67 2e 7a 4f   3;.    if( g.zO
14410 70 65 6e 52 65 76 69 73 69 6f 6e 20 29 7b 0a 20  penRevision ){. 
14420 20 20 20 20 20 61 7a 4e 65 77 41 72 67 76 5b 67       azNewArgv[g
14430 2e 61 72 67 63 2d 31 5d 20 3d 20 67 2e 7a 4f 70  .argc-1] = g.zOp
14440 65 6e 52 65 76 69 73 69 6f 6e 3b 0a 20 20 20 20  enRevision;.    
14450 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a 4e  }else{.      azN
14460 65 77 41 72 67 76 5b 67 2e 61 72 67 63 2d 31 5d  ewArgv[g.argc-1]
14470 20 3d 20 22 2d 2d 6c 61 74 65 73 74 22 3b 0a 20   = "--latest";. 
14480 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6b 65 65     }.    if( kee
14490 70 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61  pFlag ){.      a
144a0 7a 4e 65 77 41 72 67 76 5b 67 2e 61 72 67 63 2b  zNewArgv[g.argc+
144b0 2b 5d 20 3d 20 22 2d 2d 6b 65 65 70 22 3b 0a 20  +] = "--keep";. 
144c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 6f 72     }.    if( for
144d0 63 65 4d 69 73 73 69 6e 67 46 6c 61 67 20 29 7b  ceMissingFlag ){
144e0 0a 20 20 20 20 20 20 61 7a 4e 65 77 41 72 67 76  .      azNewArgv
144f0 5b 67 2e 61 72 67 63 2b 2b 5d 20 3d 20 22 2d 2d  [g.argc++] = "--
14500 66 6f 72 63 65 2d 6d 69 73 73 69 6e 67 22 3b 0a  force-missing";.
14510 20 20 20 20 7d 0a 20 20 20 20 63 68 65 63 6b 6f      }.    checko
14520 75 74 5f 63 6d 64 28 29 3b 0a 20 20 7d 0a 20 20  ut_cmd();.  }.  
14530 67 2e 61 72 67 63 20 3d 20 32 3b 0a 20 20 69 6e  g.argc = 2;.  in
14540 66 6f 5f 63 6d 64 28 29 3b 0a 7d 0a 0a 2f 2a 0a  fo_cmd();.}../*.
14550 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 75 72  ** Print the cur
14560 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 61 20  rent value of a 
14570 73 65 74 74 69 6e 67 20 69 64 65 6e 74 69 66 69  setting identifi
14580 65 64 20 62 79 20 74 68 65 20 70 53 65 74 74 69  ed by the pSetti
14590 6e 67 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a  ng.** pointer..*
145a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
145b0 69 6e 74 5f 73 65 74 74 69 6e 67 28 63 6f 6e 73  int_setting(cons
145c0 74 20 53 65 74 74 69 6e 67 20 2a 70 53 65 74 74  t Setting *pSett
145d0 69 6e 67 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a  ing){.  Stmt q;.
145e0 20 20 69 66 28 20 67 2e 72 65 70 6f 73 69 74 6f    if( g.reposito
145f0 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20 20 64 62  ryOpen ){.    db
14600 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20  _prepare(&q,.   
14610 20 20 20 20 22 53 45 4c 45 43 54 20 27 28 6c 6f      "SELECT '(lo
14620 63 61 6c 29 27 2c 20 76 61 6c 75 65 20 46 52 4f  cal)', value FRO
14630 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e  M config WHERE n
14640 61 6d 65 3d 25 51 22 0a 20 20 20 20 20 20 20 22  ame=%Q".       "
14650 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20   UNION ALL ".   
14660 20 20 20 20 22 53 45 4c 45 43 54 20 27 28 67 6c      "SELECT '(gl
14670 6f 62 61 6c 29 27 2c 20 76 61 6c 75 65 20 46 52  obal)', value FR
14680 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67  OM global_config
14690 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
146a0 0a 20 20 20 20 20 20 20 70 53 65 74 74 69 6e 67  .       pSetting
146b0 2d 3e 6e 61 6d 65 2c 20 70 53 65 74 74 69 6e 67  ->name, pSetting
146c0 2d 3e 6e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  ->name.    );.  
146d0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 5f 70 72  }else{.    db_pr
146e0 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20 20 20  epare(&q,.      
146f0 22 53 45 4c 45 43 54 20 27 28 67 6c 6f 62 61 6c  "SELECT '(global
14700 29 27 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20 67  )', value FROM g
14710 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45  lobal_config WHE
14720 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
14730 20 20 20 70 53 65 74 74 69 6e 67 2d 3e 6e 61 6d     pSetting->nam
14740 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69  e.    );.  }.  i
14750 66 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  f( db_step(&q)==
14760 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
14770 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
14780 25 2d 32 30 73 20 25 2d 38 73 20 25 73 5c 6e 22  %-20s %-8s %s\n"
14790 2c 20 70 53 65 74 74 69 6e 67 2d 3e 6e 61 6d 65  , pSetting->name
147a0 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  , db_column_text
147b0 28 26 71 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  (&q, 0),.       
147c0 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
147d0 26 71 2c 20 31 29 29 3b 0a 20 20 7d 65 6c 73 65  &q, 1));.  }else
147e0 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69  {.    fossil_pri
147f0 6e 74 28 22 25 2d 32 30 73 5c 6e 22 2c 20 70 53  nt("%-20s\n", pS
14800 65 74 74 69 6e 67 2d 3e 6e 61 6d 65 29 3b 0a 20  etting->name);. 
14810 20 7d 0a 20 20 69 66 28 20 70 53 65 74 74 69 6e   }.  if( pSettin
14820 67 2d 3e 76 65 72 73 69 6f 6e 61 62 6c 65 20 26  g->versionable &
14830 26 20 67 2e 6c 6f 63 61 6c 4f 70 65 6e 20 29 7b  & g.localOpen ){
14840 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
14850 20 73 65 65 20 69 66 20 74 68 69 73 20 69 73 20   see if this is 
14860 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20  overridden by a 
14870 76 65 72 73 69 6f 6e 61 62 6c 65 20 73 65 74 74  versionable sett
14880 69 6e 67 73 20 66 69 6c 65 20 2a 2f 0a 20 20 20  ings file */.   
14890 20 42 6c 6f 62 20 76 65 72 73 69 6f 6e 65 64 50   Blob versionedP
148a0 61 74 68 6e 61 6d 65 3b 0a 20 20 20 20 62 6c 6f  athname;.    blo
148b0 62 5f 7a 65 72 6f 28 26 76 65 72 73 69 6f 6e 65  b_zero(&versione
148c0 64 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  dPathname);.    
148d0 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 76 65  blob_appendf(&ve
148e0 72 73 69 6f 6e 65 64 50 61 74 68 6e 61 6d 65 2c  rsionedPathname,
148f0 20 22 25 73 2e 66 6f 73 73 69 6c 2d 73 65 74 74   "%s.fossil-sett
14900 69 6e 67 73 2f 25 73 22 2c 0a 20 20 20 20 20 20  ings/%s",.      
14910 20 20 20 20 20 20 20 20 20 20 20 67 2e 7a 4c 6f             g.zLo
14920 63 61 6c 52 6f 6f 74 2c 20 70 53 65 74 74 69 6e  calRoot, pSettin
14930 67 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  g->name);.    if
14940 28 20 66 69 6c 65 5f 73 69 7a 65 28 62 6c 6f 62  ( file_size(blob
14950 5f 73 74 72 28 26 76 65 72 73 69 6f 6e 65 64 50  _str(&versionedP
14960 61 74 68 6e 61 6d 65 29 2c 20 45 78 74 46 49 4c  athname), ExtFIL
14970 45 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  E)>=0 ){.      f
14980 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20 20 28  ossil_print("  (
14990 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 63 6f  overridden by co
149a0 6e 74 65 6e 74 73 20 6f 66 20 66 69 6c 65 20 2e  ntents of file .
149b0 66 6f 73 73 69 6c 2d 73 65 74 74 69 6e 67 73 2f  fossil-settings/
149c0 25 73 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %s)\n",.        
149d0 20 20 20 20 20 20 20 20 20 20 20 70 53 65 74 74             pSett
149e0 69 6e 67 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  ing->name);.    
149f0 7d 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c  }.  }.  db_final
14a00 69 7a 65 28 26 71 29 3b 0a 7d 0a 0a 23 69 66 20  ize(&q);.}..#if 
14a10 49 4e 54 45 52 46 41 43 45 0a 2f 2a 0a 2a 2a 20  INTERFACE./*.** 
14a20 44 65 66 69 6e 65 20 61 6c 6c 20 73 65 74 74 69  Define all setti
14a30 6e 67 73 2c 20 77 68 69 63 68 20 63 61 6e 20 62  ngs, which can b
14a40 65 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 76 69 61  e controlled via
14a50 20 74 68 65 20 73 65 74 2f 75 6e 73 65 74 0a 2a   the set/unset.*
14a60 2a 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  * command..**.**
14a70 20 76 61 72 20 69 73 20 74 68 65 20 6e 61 6d 65   var is the name
14a80 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   of the internal
14a90 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6e   configuration n
14aa0 61 6d 65 20 66 6f 72 20 64 62 5f 28 75 6e 29 73  ame for db_(un)s
14ab0 65 74 2e 0a 2a 2a 20 49 66 20 76 61 72 20 69 73  et..** If var is
14ac0 20 30 2c 20 74 68 65 20 73 65 74 74 69 6e 67 73   0, the settings
14ad0 20 6e 61 6d 65 20 69 73 20 75 73 65 64 2e 0a 2a   name is used..*
14ae0 2a 0a 2a 2a 20 77 69 64 74 68 20 69 73 20 74 68  *.** width is th
14af0 65 20 6c 65 6e 67 74 68 20 66 6f 72 20 74 68 65  e length for the
14b00 20 65 64 69 74 20 66 69 65 6c 64 20 6f 6e 20 74   edit field on t
14b10 68 65 20 62 65 68 61 76 69 6f 72 20 70 61 67 65  he behavior page
14b20 2c 20 30 0a 2a 2a 20 69 73 20 75 73 65 64 20 66  , 0.** is used f
14b30 6f 72 20 6f 6e 2f 6f 66 66 20 63 68 65 63 6b 62  or on/off checkb
14b40 6f 78 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oxes..**.** The 
14b50 62 65 68 61 76 69 6f 75 72 20 70 61 67 65 20 64  behaviour page d
14b60 6f 65 73 6e 27 74 20 75 73 65 20 61 20 73 70 65  oesn't use a spe
14b70 63 69 61 6c 20 6c 61 79 6f 75 74 2e 20 49 74 20  cial layout. It 
14b80 6c 69 73 74 73 20 61 6c 6c 0a 2a 2a 20 73 65 74  lists all.** set
14b90 2d 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 20 64 69  -commands and di
14ba0 73 70 6c 61 79 73 20 74 68 65 20 27 73 65 74 27  splays the 'set'
14bb0 2d 68 65 6c 70 20 61 73 20 69 6e 66 6f 2e 0a 2a  -help as info..*
14bc0 2f 0a 73 74 72 75 63 74 20 53 65 74 74 69 6e 67  /.struct Setting
14bd0 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
14be0 2a 6e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  *name;     /* Na
14bf0 6d 65 20 6f 66 20 74 68 65 20 73 65 74 74 69 6e  me of the settin
14c00 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  g */.  const cha
14c10 72 20 2a 76 61 72 3b 20 20 20 20 20 20 2f 2a 20  r *var;      /* 
14c20 49 6e 74 65 72 6e 61 6c 20 76 61 72 69 61 62 6c  Internal variabl
14c30 65 20 6e 61 6d 65 20 75 73 65 64 20 62 79 20 64  e name used by d
14c40 62 5f 73 65 74 28 29 20 2a 2f 0a 20 20 69 6e 74  b_set() */.  int
14c50 20 77 69 64 74 68 3b 20 20 20 20 20 20 20 20 20   width;         
14c60 20 20 20 2f 2a 20 57 69 64 74 68 20 6f 66 20 64     /* Width of d
14c70 69 73 70 6c 61 79 2e 20 20 30 20 66 6f 72 20 62  isplay.  0 for b
14c80 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 2a  oolean values. *
14c90 2f 0a 20 20 69 6e 74 20 76 65 72 73 69 6f 6e 61  /.  int versiona
14ca0 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20 49 73 20  ble;      /* Is 
14cb0 74 68 69 73 20 73 65 74 74 69 6e 67 20 76 65 72  this setting ver
14cc0 73 69 6f 6e 61 62 6c 65 3f 20 2a 2f 0a 20 20 69  sionable? */.  i
14cd0 6e 74 20 66 6f 72 63 65 54 65 78 74 41 72 65 61  nt forceTextArea
14ce0 3b 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 75 73  ;    /* Force us
14cf0 69 6e 67 20 61 20 74 65 78 74 20 61 72 65 61 20  ing a text area 
14d00 66 6f 72 20 64 69 73 70 6c 61 79 3f 20 2a 2f 0a  for display? */.
14d10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 65    const char *de
14d20 66 3b 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75  f;      /* Defau
14d30 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 3b 0a 23  lt value */.};.#
14d40 65 6e 64 69 66 20 2f 2a 20 49 4e 54 45 52 46 41  endif /* INTERFA
14d50 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 45 54  CE */../*.** SET
14d60 54 49 4e 47 3a 20 61 63 63 65 73 73 2d 6c 6f 67  TING: access-log
14d70 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 20 64 65        boolean de
14d80 66 61 75 6c 74 3d 6f 66 66 0a 2a 2a 0a 2a 2a 20  fault=off.**.** 
14d90 57 68 65 6e 20 74 68 65 20 61 63 63 65 73 73 2d  When the access-
14da0 6c 6f 67 20 73 65 74 74 69 6e 67 20 69 73 20 65  log setting is e
14db0 6e 61 62 6c 65 64 2c 20 61 6c 6c 20 6c 6f 67 69  nabled, all logi
14dc0 6e 20 61 74 74 65 6d 70 74 73 20 28 73 75 63 63  n attempts (succ
14dd0 65 73 73 66 75 6c 0a 2a 2a 20 61 6e 64 20 75 6e  essful.** and un
14de0 73 75 63 63 65 73 73 66 75 6c 29 20 6f 6e 20 74  successful) on t
14df0 68 65 20 77 65 62 20 69 6e 74 65 72 66 61 63 65  he web interface
14e00 20 61 72 65 20 72 65 63 6f 72 64 65 64 20 69 6e   are recorded in
14e10 20 74 68 65 20 22 61 63 63 65 73 73 22 20 74 61   the "access" ta
14e20 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65  ble.** of the re
14e30 70 6f 73 69 74 6f 72 79 2e 0a 2a 2f 0a 2f 2a 0a  pository..*/./*.
14e40 2a 2a 20 53 45 54 54 49 4e 47 3a 20 61 64 6d 69  ** SETTING: admi
14e50 6e 2d 6c 6f 67 20 20 20 20 20 20 20 62 6f 6f 6c  n-log       bool
14e60 65 61 6e 20 64 65 66 61 75 6c 74 3d 6f 66 66 0a  ean default=off.
14e70 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 61  **.** When the a
14e80 64 6d 69 6e 2d 6c 6f 67 20 73 65 74 74 69 6e 67  dmin-log setting
14e90 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 63 6f 6e   is enabled, con
14ea0 66 69 67 75 72 61 74 69 6f 6e 20 63 68 61 6e 67  figuration chang
14eb0 65 73 20 61 72 65 20 72 65 63 6f 72 64 65 64 0a  es are recorded.
14ec0 2a 2a 20 69 6e 20 74 68 65 20 22 61 64 6d 69 6e  ** in the "admin
14ed0 5f 6c 6f 67 22 20 74 61 62 6c 65 20 6f 66 20 74  _log" table of t
14ee0 68 65 20 72 65 70 6f 73 69 74 6f 72 79 2e 0a 2a  he repository..*
14ef0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  /.#if defined(_W
14f00 49 4e 33 32 29 0a 2f 2a 0a 2a 2a 20 53 45 54 54  IN32)./*.** SETT
14f10 49 4e 47 3a 20 61 6c 6c 6f 77 2d 73 79 6d 6c 69  ING: allow-symli
14f20 6e 6b 73 20 20 62 6f 6f 6c 65 61 6e 20 64 65 66  nks  boolean def
14f30 61 75 6c 74 3d 6f 66 66 20 76 65 72 73 69 6f 6e  ault=off version
14f40 61 62 6c 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  able.**.** When 
14f50 61 6c 6c 6f 77 2d 73 79 6d 6c 69 6e 6b 73 20 69  allow-symlinks i
14f60 73 20 4f 46 46 2c 20 73 79 6d 62 6f 6c 69 63 20  s OFF, symbolic 
14f70 6c 69 6e 6b 73 20 69 6e 20 74 68 65 20 72 65 70  links in the rep
14f80 6f 73 69 74 6f 72 79 20 61 72 65 20 66 6f 6c 6c  ository are foll
14f90 6f 77 65 64 0a 2a 2a 20 61 6e 64 20 74 72 65 61  owed.** and trea
14fa0 74 65 64 20 6e 6f 20 64 69 66 66 65 72 65 6e 74  ted no different
14fb0 6c 79 20 66 72 6f 6d 20 72 65 61 6c 20 66 69 6c  ly from real fil
14fc0 65 73 2e 20 20 57 68 65 6e 20 61 6c 6c 6f 77 2d  es.  When allow-
14fd0 73 79 6d 6c 69 6e 6b 73 20 69 73 20 4f 4e 2c 0a  symlinks is ON,.
14fe0 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  ** the object to
14ff0 20 77 68 69 63 68 20 74 68 65 20 73 79 6d 62 6f   which the symbo
15000 6c 69 63 20 6c 69 6e 6b 20 70 6f 69 6e 74 73 20  lic link points 
15010 69 73 20 69 67 6e 6f 72 65 64 2c 20 61 6e 64 20  is ignored, and 
15020 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f  the content.** o
15030 66 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c  f the symbolic l
15040 69 6e 6b 20 74 68 61 74 20 69 73 20 73 74 6f 72  ink that is stor
15050 65 64 20 69 6e 20 74 68 65 20 72 65 70 6f 73 69  ed in the reposi
15060 74 6f 72 79 20 69 73 20 74 68 65 20 6e 61 6d 65  tory is the name
15070 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 62 6a 65 63   of the.** objec
15080 74 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 73  t to which the s
15090 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 70 6f 69  ymbolic link poi
150a0 6e 74 73 2e 0a 2a 2f 0a 23 65 6e 64 69 66 0a 23  nts..*/.#endif.#
150b0 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e  if !defined(_WIN
150c0 33 32 29 0a 2f 2a 0a 2a 2a 20 53 45 54 54 49 4e  32)./*.** SETTIN
150d0 47 3a 20 61 6c 6c 6f 77 2d 73 79 6d 6c 69 6e 6b  G: allow-symlink
150e0 73 20 20 62 6f 6f 6c 65 61 6e 20 64 65 66 61 75  s  boolean defau
150f0 6c 74 3d 6f 6e 20 76 65 72 73 69 6f 6e 61 62 6c  lt=on versionabl
15100 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 6c 6c  e.**.** When all
15110 6f 77 2d 73 79 6d 6c 69 6e 6b 73 20 69 73 20 4f  ow-symlinks is O
15120 46 46 2c 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e  FF, symbolic lin
15130 6b 73 20 69 6e 20 74 68 65 20 72 65 70 6f 73 69  ks in the reposi
15140 74 6f 72 79 20 61 72 65 20 66 6f 6c 6c 6f 77 65  tory are followe
15150 64 0a 2a 2a 20 61 6e 64 20 74 72 65 61 74 65 64  d.** and treated
15160 20 6e 6f 20 64 69 66 66 65 72 65 6e 74 6c 79 20   no differently 
15170 66 72 6f 6d 20 72 65 61 6c 20 66 69 6c 65 73 2e  from real files.
15180 20 20 57 68 65 6e 20 61 6c 6c 6f 77 2d 73 79 6d    When allow-sym
15190 6c 69 6e 6b 73 20 69 73 20 4f 4e 2c 0a 2a 2a 20  links is ON,.** 
151a0 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 77 68  the object to wh
151b0 69 63 68 20 74 68 65 20 73 79 6d 62 6f 6c 69 63  ich the symbolic
151c0 20 6c 69 6e 6b 20 70 6f 69 6e 74 73 20 69 73 20   link points is 
151d0 69 67 6e 6f 72 65 64 2c 20 61 6e 64 20 74 68 65  ignored, and the
151e0 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74   content.** of t
151f0 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  he symbolic link
15200 20 74 68 61 74 20 69 73 20 73 74 6f 72 65 64 20   that is stored 
15210 69 6e 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72  in the repositor
15220 79 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  y is the name of
15230 20 74 68 65 0a 2a 2a 20 6f 62 6a 65 63 74 20 74   the.** object t
15240 6f 20 77 68 69 63 68 20 74 68 65 20 73 79 6d 62  o which the symb
15250 6f 6c 69 63 20 6c 69 6e 6b 20 70 6f 69 6e 74 73  olic link points
15260 2e 0a 2a 2f 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a  ..*/.#endif./*.*
15270 2a 20 53 45 54 54 49 4e 47 3a 20 61 75 74 6f 2d  * SETTING: auto-
15280 63 61 70 74 63 68 61 20 20 20 20 62 6f 6f 6c 65  captcha    boole
15290 61 6e 20 64 65 66 61 75 6c 74 3d 6f 6e 20 76 61  an default=on va
152a0 72 69 61 62 6c 65 3d 61 75 74 6f 63 61 70 74 63  riable=autocaptc
152b0 68 61 0a 2a 2a 20 49 66 20 65 6e 61 62 6c 65 64  ha.** If enabled
152c0 2c 20 74 68 65 20 2f 6c 6f 67 69 6e 20 70 61 67  , the /login pag
152d0 65 20 70 72 6f 76 69 64 65 73 20 61 20 62 75 74  e provides a but
152e0 74 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 61 75  ton that will au
152f0 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 66  tomatically.** f
15300 69 6c 6c 20 69 6e 20 74 68 65 20 63 61 70 74 63  ill in the captc
15310 68 61 20 70 61 73 73 77 6f 72 64 2e 20 20 54 68  ha password.  Th
15320 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20  is makes things 
15330 65 61 73 69 65 72 20 66 6f 72 20 68 75 6d 61 6e  easier for human
15340 20 75 73 65 72 73 2c 0a 2a 2a 20 61 74 20 74 68   users,.** at th
15350 65 20 65 78 70 65 6e 73 65 20 6f 66 20 61 6c 73  e expense of als
15360 6f 20 6d 61 6b 69 6e 67 20 6c 6f 67 69 6e 73 20  o making logins 
15370 65 61 73 69 65 72 20 66 6f 72 20 6d 61 6c 65 63  easier for malec
15380 69 6f 75 73 20 72 6f 62 6f 74 73 2e 0a 2a 2f 0a  ious robots..*/.
15390 2f 2a 0a 2a 2a 20 53 45 54 54 49 4e 47 3a 20 61  /*.** SETTING: a
153a0 75 74 6f 2d 68 79 70 65 72 6c 69 6e 6b 20 20 62  uto-hyperlink  b
153b0 6f 6f 6c 65 61 6e 20 64 65 66 61 75 6c 74 3d 6f  oolean default=o
153c0 6e 0a 2a 2a 20 55 73 65 20 6a 61 76 61 73 63 72  n.** Use javascr
153d0 69 70 74 20 74 6f 20 65 6e 61 62 6c 65 20 68 79  ipt to enable hy
153e0 70 65 72 6c 69 6e 6b 73 20 6f 6e 20 77 65 62 20  perlinks on web 
153f0 70 61 67 65 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c  pages.** for all
15400 20 75 73 65 72 73 20 28 72 65 67 61 72 64 6c 65   users (regardle
15410 73 73 20 6f 66 20 74 68 65 20 22 68 22 20 70 72  ss of the "h" pr
15420 69 76 69 6c 65 67 65 29 20 69 66 20 74 68 65 0a  ivilege) if the.
15430 2a 2a 20 55 73 65 72 2d 41 67 65 6e 74 20 73 74  ** User-Agent st
15440 72 69 6e 67 20 69 6e 20 74 68 65 20 48 54 54 50  ring in the HTTP
15450 20 68 65 61 64 65 72 20 6c 6f 6f 6b 20 6c 69 6b   header look lik
15460 65 20 69 74 20 63 61 6d 65 0a 2a 2a 20 66 72 6f  e it came.** fro
15470 6d 20 72 65 61 6c 20 70 65 72 73 6f 6e 2c 20 6e  m real person, n
15480 6f 74 20 61 20 73 70 69 64 65 72 20 6f 72 20 62  ot a spider or b
15490 6f 74 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45 54  ot..*/./*.** SET
154a0 54 49 4e 47 3a 20 61 75 74 6f 2d 73 68 75 6e 20  TING: auto-shun 
154b0 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 20 64 65        boolean de
154c0 66 61 75 6c 74 3d 6f 6e 0a 2a 2a 20 49 66 20 65  fault=on.** If e
154d0 6e 61 62 6c 65 64 2c 20 61 75 74 6f 6d 61 74 69  nabled, automati
154e0 63 61 6c 6c 79 20 70 75 6c 6c 20 74 68 65 20 73  cally pull the s
154f0 68 75 6e 6e 69 6e 67 20 6c 69 73 74 0a 2a 2a 20  hunning list.** 
15500 66 72 6f 6d 20 61 20 73 65 72 76 65 72 20 74 6f  from a server to
15510 20 77 68 69 63 68 20 74 68 65 20 63 6c 69 65 6e   which the clien
15520 74 20 61 75 74 6f 73 79 6e 63 73 2e 0a 2a 2f 0a  t autosyncs..*/.
15530 2f 2a 0a 2a 2a 20 53 45 54 54 49 4e 47 3a 20 61  /*.** SETTING: a
15540 75 74 6f 73 79 6e 63 20 20 20 20 20 20 20 20 77  utosync        w
15550 69 64 74 68 3d 31 36 20 64 65 66 61 75 6c 74 3d  idth=16 default=
15560 6f 6e 0a 2a 2a 20 54 68 69 73 20 73 65 74 74 69  on.** This setti
15570 6e 67 20 63 61 6e 20 74 61 6b 65 20 65 69 74 68  ng can take eith
15580 65 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  er a boolean val
15590 75 65 20 6f 72 20 22 70 75 6c 6c 6f 6e 6c 79 22  ue or "pullonly"
155a0 0a 2a 2a 20 49 66 20 65 6e 61 62 6c 65 64 2c 20  .** If enabled, 
155b0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 70 75  automatically pu
155c0 6c 6c 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 6d  ll prior to comm
155d0 69 74 0a 2a 2a 20 6f 72 20 75 70 64 61 74 65 20  it.** or update 
155e0 61 6e 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  and automaticall
155f0 79 20 70 75 73 68 20 61 66 74 65 72 20 63 6f 6d  y push after com
15600 6d 69 74 20 6f 72 0a 2a 2a 20 74 61 67 20 6f 72  mit or.** tag or
15610 20 62 72 61 6e 63 68 20 63 72 65 61 74 69 6f 6e   branch creation
15620 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  .  If the value 
15630 69 73 20 22 70 75 6c 6c 6f 6e 6c 79 22 0a 2a 2a  is "pullonly".**
15640 20 74 68 65 6e 20 6f 6e 6c 79 20 70 75 6c 6c 20   then only pull 
15650 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72  operations occur
15660 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a   automatically..
15670 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45 54 54 49 4e 47  */./*.** SETTING
15680 3a 20 61 75 74 6f 73 79 6e 63 2d 74 72 69 65 73  : autosync-tries
15690 20 20 77 69 64 74 68 3d 31 36 20 64 65 66 61 75    width=16 defau
156a0 6c 74 3d 31 0a 2a 2a 20 49 66 20 61 75 74 6f 73  lt=1.** If autos
156b0 79 6e 63 20 69 73 20 65 6e 61 62 6c 65 64 20 73  ync is enabled s
156c0 65 74 74 69 6e 67 20 74 68 69 73 20 74 6f 20 61  etting this to a
156d0 20 76 61 6c 75 65 20 67 72 65 61 74 65 72 0a 2a   value greater.*
156e0 2a 20 74 68 61 6e 20 7a 65 72 6f 20 77 69 6c 6c  * than zero will
156f0 20 63 61 75 73 65 20 61 75 74 6f 73 79 6e 63 20   cause autosync 
15700 74 6f 20 74 72 79 20 6e 6f 20 6d 6f 72 65 20 74  to try no more t
15710 68 61 6e 20 74 68 69 73 0a 2a 2a 20 6e 75 6d 62  han this.** numb
15720 65 72 20 6f 66 20 61 74 74 65 6d 70 74 73 20 69  er of attempts i
15730 66 20 74 68 65 72 65 20 69 73 20 61 20 73 79 6e  f there is a syn
15740 63 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 2f 2a  c failure..*/./*
15750 0a 2a 2a 20 53 45 54 54 49 4e 47 3a 20 62 69 6e  .** SETTING: bin
15760 61 72 79 2d 67 6c 6f 62 20 20 20 20 20 77 69 64  ary-glob     wid
15770 74 68 3d 34 30 20 76 65 72 73 69 6f 6e 61 62 6c  th=40 versionabl
15780 65 20 62 6c 6f 63 6b 2d 74 65 78 74 0a 2a 2a 20  e block-text.** 
15790 54 68 65 20 56 41 4c 55 45 20 6f 66 20 74 68 69  The VALUE of thi
157a0 73 20 73 65 74 74 69 6e 67 20 69 73 20 61 20 63  s setting is a c
157b0 6f 6d 6d 61 20 6f 72 20 6e 65 77 6c 69 6e 65 2d  omma or newline-
157c0 73 65 70 61 72 61 74 65 64 20 6c 69 73 74 20 6f  separated list o
157d0 66 0a 2a 2a 20 47 4c 4f 42 20 70 61 74 74 65 72  f.** GLOB patter
157e0 6e 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ns that should b
157f0 65 20 74 72 65 61 74 65 64 20 61 73 20 62 69 6e  e treated as bin
15800 61 72 79 20 66 69 6c 65 73 0a 2a 2a 20 66 6f 72  ary files.** for
15810 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 6e 64 20   committing and 
15820 6d 65 72 67 69 6e 67 20 70 75 72 70 6f 73 65 73  merging purposes
15830 2e 20 20 45 78 61 6d 70 6c 65 3a 20 2a 2e 6a 70  .  Example: *.jp
15840 67 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  g.*/.#if defined
15850 28 5f 57 49 4e 33 32 29 7c 7c 64 65 66 69 6e 65  (_WIN32)||define
15860 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 7c 7c 64  d(__CYGWIN__)||d
15870 65 66 69 6e 65 64 28 5f 5f 44 41 52 57 49 4e 5f  efined(__DARWIN_
15880 5f 29 0a 2f 2a 0a 2a 2a 20 53 45 54 54 49 4e 47  _)./*.** SETTING
15890 3a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65  : case-sensitive
158a0 20 20 62 6f 6f 6c 65 61 6e 20 64 65 66 61 75 6c    boolean defaul
158b0 74 3d 6f 66 66 0a 2a 2a 20 49 66 20 54 52 55 45  t=off.** If TRUE
158c0 2c 20 74 68 65 20 66 69 6c 65 73 20 77 68 6f 73  , the files whos
158d0 65 20 6e 61 6d 65 73 20 64 69 66 66 65 72 20 6f  e names differ o
158e0 6e 6c 79 20 69 6e 20 63 61 73 65 0a 2a 2a 20 61  nly in case.** a
158f0 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  re considered di
15900 73 74 69 6e 63 74 2e 20 20 49 66 20 46 41 4c 53  stinct.  If FALS
15910 45 20 66 69 6c 65 73 20 77 68 6f 73 65 20 6e 61  E files whose na
15920 6d 65 73 0a 2a 2a 20 64 69 66 66 65 72 20 6f 6e  mes.** differ on
15930 6c 79 20 69 6e 20 63 61 73 65 20 61 72 65 20 74  ly in case are t
15940 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 44  he same file.  D
15950 65 66 61 75 6c 74 73 20 74 6f 0a 2a 2a 20 54 52  efaults to.** TR
15960 55 45 20 66 6f 72 20 75 6e 69 78 20 61 6e 64 20  UE for unix and 
15970 46 41 4c 53 45 20 66 6f 72 20 43 79 67 77 69 6e  FALSE for Cygwin
15980 2c 20 4d 61 63 20 61 6e 64 20 57 69 6e 64 6f 77  , Mac and Window
15990 73 2e 0a 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  s..*/.#endif.#if
159a0 20 21 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33   !(defined(_WIN3
159b0 32 29 7c 7c 64 65 66 69 6e 65 64 28 5f 5f 43 59  2)||defined(__CY
159c0 47 57 49 4e 5f 5f 29 7c 7c 64 65 66 69 6e 65 64  GWIN__)||defined
159d0 28 5f 5f 44 41 52 57 49 4e 5f 5f 29 29 0a 2f 2a  (__DARWIN__))./*
159e0 0a 2a 2a 20 53 45 54 54 49 4e 47 3a 20 63 61 73  .** SETTING: cas
159f0 65 2d 73 65 6e 73 69 74 69 76 65 20 20 62 6f 6f  e-sensitive  boo
15a00 6c 65 61 6e 20 64 65 66 61 75 6c 74 3d 6f 6e 0a  lean default=on.
15a10 2a 2a 20 49 66 20 54 52 55 45 2c 20 74 68 65 20  ** If TRUE, the 
15a20 66 69 6c 65 73 20 77 68 6f 73 65 20 6e 61 6d 65  files whose name
15a30 73 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e  s differ only in
15a40 20 63 61 73 65 0a 2a 2a 20 61 72 65 20 63 6f 6e   case.** are con
15a50 73 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74  sidered distinct
15a60 2e 20 20 49 66 20 46 41 4c 53 45 20 66 69 6c 65  .  If FALSE file
15a70 73 20 77 68 6f 73 65 20 6e 61 6d 65 73 0a 2a 2a  s whose names.**
15a80 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e 20   differ only in 
15a90 63 61 73 65 20 61 72 65 20 74 68 65 20 73 61 6d  case are the sam
15aa0 65 20 66 69 6c 65 2e 20 20 44 65 66 61 75 6c 74  e file.  Default
15ab0 73 20 74 6f 0a 2a 2a 20 54 52 55 45 20 66 6f 72  s to.** TRUE for
15ac0 20 75 6e 69 78 20 61 6e 64 20 46 41 4c 53 45 20   unix and FALSE 
15ad0 66 6f 72 20 43 79 67 77 69 6e 2c 20 4d 61 63 20  for Cygwin, Mac 
15ae0 61 6e 64 20 57 69 6e 64 6f 77 73 2e 0a 2a 2f 0a  and Windows..*/.
15af0 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 53 45 54  #endif./*.** SET
15b00 54 49 4e 47 3a 20 63 6c 65 61 6e 2d 67 6c 6f 62  TING: clean-glob
15b10 20 20 20 20 20 20 77 69 64 74 68 3d 34 30 20 76        width=40 v
15b20 65 72 73 69 6f 6e 61 62 6c 65 20 62 6c 6f 63 6b  ersionable block
15b30 2d 74 65 78 74 0a 2a 2a 20 54 68 65 20 56 41 4c  -text.** The VAL
15b40 55 45 20 6f 66 20 74 68 69 73 20 73 65 74 74 69  UE of this setti
15b50 6e 67 20 69 73 20 61 20 63 6f 6d 6d 61 20 6f 72  ng is a comma or
15b60 20 6e 65 77 6c 69 6e 65 2d 73 65 70 61 72 61 74   newline-separat
15b70 65 64 20 6c 69 73 74 20 6f 66 20 47 4c 4f 42 0a  ed list of GLOB.
15b80 2a 2a 20 70 61 74 74 65 72 6e 73 20 73 70 65 63  ** patterns spec
15b90 69 66 79 69 6e 67 20 66 69 6c 65 73 20 74 68 61  ifying files tha
15ba0 74 20 74 68 65 20 22 63 6c 65 61 6e 22 20 63 6f  t the "clean" co
15bb0 6d 6d 61 6e 64 20 77 69 6c 6c 0a 2a 2a 20 64 65  mmand will.** de
15bc0 6c 65 74 65 20 77 69 74 68 6f 75 74 20 70 72 6f  lete without pro
15bd0 6d 70 74 69 6e 67 20 6f 72 20 61 6c 6c 6f 77 69  mpting or allowi
15be0 6e 67 20 75 6e 64 6f 2e 0a 2a 2a 20 45 78 61 6d  ng undo..** Exam
15bf0 70 6c 65 3a 20 2a 2e 61 2c 2a 2e 6c 69 62 2c 2a  ple: *.a,*.lib,*
15c00 2e 6f 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45 54 54  .o.*/./*.** SETT
15c10 49 4e 47 3a 20 63 6c 65 61 72 73 69 67 6e 20 20  ING: clearsign  
15c20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 20 64 65 66       boolean def
15c30 61 75 6c 74 3d 6f 66 66 0a 2a 2a 20 57 68 65 6e  ault=off.** When
15c40 20 65 6e 61 62 6c 65 64 2c 20 66 6f 73 73 69 6c   enabled, fossil
15c50 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f   will attempt to
15c60 20 73 69 67 6e 20 61 6c 6c 20 63 6f 6d 6d 69 74   sign all commit
15c70 73 0a 2a 2a 20 77 69 74 68 20 67 70 67 2e 20 20  s.** with gpg.  
15c80 57 68 65 6e 20 64 69 73 61 62 6c 65 64 2c 20 63  When disabled, c
15c90 6f 6d 6d 69 74 73 20 77 69 6c 6c 20 62 65 20 75  ommits will be u
15ca0 6e 73 69 67 6e 65 64 2e 0a 2a 2f 0a 2f 2a 0a 2a  nsigned..*/./*.*
15cb0 2a 20 53 45 54 54 49 4e 47 3a 20 63 72 6c 66 2d  * SETTING: crlf-
15cc0 67 6c 6f 62 20 20 20 20 20 20 20 77 69 64 74 68  glob       width
15cd0 3d 34 30 20 76 65 72 73 69 6f 6e 61 62 6c 65 20  =40 versionable 
15ce0 62 6c 6f 63 6b 2d 74 65 78 74 0a 2a 2a 20 54 68  block-text.** Th
15cf0 65 20 76 61 6c 75 65 20 69 73 20 61 20 63 6f 6d  e value is a com
15d00 6d 61 20 6f 72 20 6e 65 77 6c 69 6e 65 2d 73 65  ma or newline-se
15d10 70 61 72 61 74 65 64 20 6c 69 73 74 20 6f 66 20  parated list of 
15d20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20 66 6f  GLOB patterns fo
15d30 72 0a 2a 2a 20 74 65 78 74 20 66 69 6c 65 73 20  r.** text files 
15d40 69 6e 20 77 68 69 63 68 20 69 74 20 69 73 20 6f  in which it is o
15d50 6b 20 74 6f 20 68 61 76 65 20 43 52 2c 20 43 52  k to have CR, CR
15d60 2b 4c 46 20 6f 72 20 6d 69 78 65 64 0a 2a 2a 20  +LF or mixed.** 
15d70 6c 69 6e 65 20 65 6e 64 69 6e 67 73 2e 20 53 65  line endings. Se
15d80 74 20 74 6f 20 22 2a 22 20 74 6f 20 64 69 73 61  t to "*" to disa
15d90 62 6c 65 20 43 52 2b 4c 46 20 63 68 65 63 6b 69  ble CR+LF checki
15da0 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 72 6e 6c 2d  ng..** The crnl-
15db0 67 6c 6f 62 20 73 65 74 74 69 6e 67 20 69 73 20  glob setting is 
15dc0 61 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  a compatibility 
15dd0 61 6c 69 61 73 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  alias..*/./*.** 
15de0 53 45 54 54 49 4e 47 3a 20 63 72 6e 6c 2d 67 6c  SETTING: crnl-gl
15df0 6f 62 20 20 20 20 20 20 20 77 69 64 74 68 3d 34  ob       width=4
15e00 30 20 76 65 72 73 69 6f 6e 61 62 6c 65 20 62 6c  0 versionable bl
15e10 6f 63 6b 2d 74 65 78 74 0a 2a 2a 20 54 68 69 73  ock-text.** This
15e20 20 69 73 20 61 6e 20 61 6c 69 61 73 20 66 6f 72   is an alias for
15e30 20 74 68 65 20 63 72 6c 66 2d 67 6c 6f 62 20 73   the crlf-glob s
15e40 65 74 74 69 6e 67 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  etting.*/./*.** 
15e50 53 45 54 54 49 4e 47 3a 20 64 65 66 61 75 6c 74  SETTING: default
15e60 2d 70 65 72 6d 73 20 20 20 77 69 64 74 68 3d 31  -perms   width=1
15e70 36 20 64 65 66 61 75 6c 74 3d 75 0a 2a 2a 20 50  6 default=u.** P
15e80 65 72 6d 69 73 73 69 6f 6e 73 20 67 69 76 65 6e  ermissions given
15e90 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74   automatically t
15ea0 6f 20 6e 65 77 20 75 73 65 72 73 2e 20 20 46 6f  o new users.  Fo
15eb0 72 20 6d 6f 72 65 0a 2a 2a 20 69 6e 66 6f 72 6d  r more.** inform
15ec0 61 74 69 6f 6e 20 6f 6e 20 70 65 72 6d 69 73 73  ation on permiss
15ed0 69 6f 6e 73 20 73 65 65 20 74 68 65 20 55 73 65  ions see the Use
15ee0 72 73 20 70 61 67 65 20 69 6e 20 53 65 72 76 65  rs page in Serve
15ef0 72 0a 2a 2a 20 41 64 6d 69 6e 69 73 74 72 61 74  r.** Administrat
15f00 69 6f 6e 20 6f 66 20 74 68 65 20 48 54 54 50 20  ion of the HTTP 
15f10 55 49 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45 54  UI..*/./*.** SET
15f20 54 49 4e 47 3a 20 64 69 66 66 2d 62 69 6e 61 72  TING: diff-binar
15f30 79 20 20 20 20 20 62 6f 6f 6c 65 61 6e 20 64 65  y     boolean de
15f40 66 61 75 6c 74 3d 6f 6e 0a 2a 2a 20 49 66 20 65  fault=on.** If e
15f50 6e 61 62 6c 65 64 2c 20 70 65 72 6d 69 74 20 66  nabled, permit f
15f60 69 6c 65 73 20 74 68 61 74 20 6d 61 79 20 62 65  iles that may be
15f70 20 62 69 6e 61 72 79 0a 2a 2a 20 6f 72 20 74 68   binary.** or th
15f80 61 74 20 6d 61 74 63 68 20 74 68 65 20 22 62 69  at match the "bi
15f90 6e 61 72 79 2d 67 6c 6f 62 22 20 73 65 74 74 69  nary-glob" setti
15fa0 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ng to be used wi
15fb0 74 68 0a 2a 2a 20 65 78 74 65 72 6e 61 6c 20 64  th.** external d
15fc0 69 66 66 20 70 72 6f 67 72 61 6d 73 2e 20 20 49  iff programs.  I
15fd0 66 20 64 69 73 61 62 6c 65 64 2c 20 73 6b 69 70  f disabled, skip
15fe0 20 74 68 65 73 65 20 66 69 6c 65 73 2e 0a 2a 2f   these files..*/
15ff0 0a 2f 2a 0a 2a 2a 20 53 45 54 54 49 4e 47 3a 20  ./*.** SETTING: 
16000 64 69 66 66 2d 63 6f 6d 6d 61 6e 64 20 20 20 20  diff-command    
16010 77 69 64 74 68 3d 34 30 0a 2a 2a 20 54 68 65 20  width=40.** The 
16020 76 61 6c 75 65 20 69 73 20 61 6e 20 65 78 74 65  value is an exte
16030 72 6e 61 6c 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  rnal command to 
16040 72 75 6e 20 77 68 65 6e 20 70 65 72 66 6f 72 6d  run when perform
16050 69 6e 67 20 61 20 64 69 66 66 2e 0a 2a 2a 20 49  ing a diff..** I
16060 66 20 75 6e 64 65 66 69 6e 65 64 2c 20 74 68 65  f undefined, the
16070 20 69 6e 74 65 72 6e 61 6c 20 74 65 78 74 20 64   internal text d
16080 69 66 66 20 77 69 6c 6c 20 62 65 20 75 73 65 64  iff will be used
16090 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45 54 54 49  ..*/./*.** SETTI
160a0 4e 47 3a 20 64 6f 6e 74 2d 70 75 73 68 20 20 20  NG: dont-push   
160b0 20 20 20 20 62 6f 6f 6c 65 61 6e 20 64 65 66 61      boolean defa
160c0 75 6c 74 3d 6f 66 66 0a 2a 2a 20 49 66 20 65 6e  ult=off.** If en
160d0 61 62 6c 65 64 2c 20 70 72 65 76 65 6e 74 20 74  abled, prevent t
160e0 68 69 73 20 72 65 70 6f 73 69 74 6f 72 79 20 66  his repository f
160f0 72 6f 6d 20 70 75 73 68 69 6e 67 20 66 72 6f 6d  rom pushing from
16100 20 63 6c 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 65   client to.** se
16110 72 76 65 72 2e 20 20 54 68 69 73 20 63 61 6e 20  rver.  This can 
16120 62 65 20 75 73 65 64 20 61 73 20 61 6e 20 65 78  be used as an ex
16130 74 72 61 20 70 72 65 63 61 75 74 69 6f 6e 20 74  tra precaution t
16140 6f 20 70 72 65 76 65 6e 74 0a 2a 2a 20 61 63 63  o prevent.** acc
16150 69 64 65 6e 74 61 6c 20 70 75 73 68 65 73 20 74  idental pushes t
16160 6f 20 61 20 70 75 62 6c 69 63 20 73 65 72 76 65  o a public serve
16170 72 20 66 72 6f 6d 20 61 20 70 72 69 76 61 74 65  r from a private
16180 20 63 6c 6f 6e 65 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a   clone..*/./*.**
16190 20 53 45 54 54 49 4e 47 3a 20 64 6f 74 66 69 6c   SETTING: dotfil
161a0 65 73 20 20 20 20 20 20 20 20 62 6f 6f 6c 65 61  es        boolea
161b0 6e 20 76 65 72 73 69 6f 6e 61 62 6c 65 20 64 65  n versionable de
161c0 66 61 75 6c 74 3d 6f 66 66 0a 2a 2a 20 49 66 20  fault=off.** If 
161d0 65 6e 61 62 6c 65 64 2c 20 69 6e 63 6c 75 64 65  enabled, include
161e0 20 2d 2d 64 6f 74 66 69 6c 65 73 20 6f 70 74 69   --dotfiles opti
161f0 6f 6e 20 66 6f 72 20 61 6c 6c 20 63 6f 6d 70 61  on for all compa
16200 74 69 62 6c 65 20 63 6f 6d 6d 61 6e 64 73 2e 0a  tible commands..
16210 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45 54 54 49 4e 47  */./*.** SETTING
16220 3a 20 65 64 69 74 6f 72 20 20 20 20 20 20 20 20  : editor        
16230 20 20 77 69 64 74 68 3d 33 32 0a 2a 2a 20 54 68    width=32.** Th
16240 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 65 78  e value is an ex
16250 74 65 72 6e 61 6c 20 63 6f 6d 6d 61 6e 64 20 74  ternal command t
16260 68 61 74 20 77 69 6c 6c 20 6c 61 75 6e 63 68 20  hat will launch 
16270 74 68 65 0a 2a 2a 20 74 65 78 74 20 65 64 69 74  the.** text edit
16280 6f 72 20 63 6f 6d 6d 61 6e 64 20 75 73 65 64 20  or command used 
16290 66 6f 72 20 63 68 65 63 6b 2d 69 6e 20 63 6f 6d  for check-in com
162a0 6d 65 6e 74 73 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  ments..*/./*.** 
162b0 53 45 54 54 49 4e 47 3a 20 65 6d 70 74 79 2d 64  SETTING: empty-d
162c0 69 72 73 20 20 20 20 20 20 77 69 64 74 68 3d 34  irs      width=4
162d0 30 20 76 65 72 73 69 6f 6e 61 62 6c 65 20 62 6c  0 versionable bl
162e0 6f 63 6b 2d 74 65 78 74 0a 2a 2a 20 54 68 65 20  ock-text.** The 
162f0 76 61 6c 75 65 20 69 73 20 61 20 63 6f 6d 6d 61  value is a comma
16300 20 6f 72 20 6e 65 77 6c 69 6e 65 2d 73 65 70 61   or newline-sepa
16310 72 61 74 65 64 20 6c 69 73 74 20 6f 66 20 70 61  rated list of pa
16320 74 68 6e 61 6d 65 73 2e 20 4f 6e 0a 2a 2a 20 75  thnames. On.** u
16330 70 64 61 74 65 20 61 6e 64 20 63 68 65 63 6b 6f  pdate and checko
16340 75 74 20 63 6f 6d 6d 61 6e 64 73 2c 20 69 66 20  ut commands, if 
16350 6e 6f 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63  no file or direc
16360 74 6f 72 79 0a 2a 2a 20 65 78 69 73 74 73 20 77  tory.** exists w
16370 69 74 68 20 74 68 61 74 20 6e 61 6d 65 2c 20 61  ith that name, a
16380 6e 20 65 6d 70 74 79 20 64 69 72 65 63 74 6f 72  n empty director
16390 79 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 72 65  y will be.** cre
163a0 61 74 65 64 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53  ated..*/./*.** S
163b0 45 54 54 49 4e 47 3a 20 65 6e 63 6f 64 69 6e 67  ETTING: encoding
163c0 2d 67 6c 6f 62 20 20 20 77 69 64 74 68 3d 34 30  -glob   width=40
163d0 20 76 65 72 73 69 6f 6e 61 62 6c 65 20 62 6c 6f   versionable blo
163e0 63 6b 2d 74 65 78 74 0a 2a 2a 20 54 68 65 20 76  ck-text.** The v
163f0 61 6c 75 65 20 69 73 20 61 20 63 6f 6d 6d 61 20  alue is a comma 
16400 6f 72 20 6e 65 77 6c 69 6e 65 2d 73 65 70 61 72  or newline-separ
16410 61 74 65 64 20 6c 69 73 74 20 6f 66 20 47 4c 4f  ated list of GLO
16420 42 0a 2a 2a 20 70 61 74 74 65 72 6e 73 20 73 70  B.** patterns sp
16430 65 63 69 66 79 69 6e 67 20 66 69 6c 65 73 20 74  ecifying files t
16440 68 61 74 20 74 68 65 20 22 63 6f 6d 6d 69 74 22  hat the "commit"
16450 20 63 6f 6d 6d 61 6e 64 20 77 69 6c 6c 0a 2a 2a   command will.**
16460 20 69 67 6e 6f 72 65 20 77 68 65 6e 20 69 73 73   ignore when iss
16470 75 69 6e 67 20 77 61 72 6e 69 6e 67 73 20 61 62  uing warnings ab
16480 6f 75 74 20 74 65 78 74 20 66 69 6c 65 73 20 74  out text files t
16490 68 61 74 20 6d 61 79 0a 2a 2a 20 75 73 65 20 61  hat may.** use a
164a0 6e 6f 74 68 65 72 20 65 6e 63 6f 64 69 6e 67 20  nother encoding 
164b0 74 68 61 6e 20 41 53 43 49 49 20 6f 72 20 55 54  than ASCII or UT
164c0 46 2d 38 2e 20 53 65 74 20 74 6f 20 22 2a 22 0a  F-8. Set to "*".
164d0 2a 2a 20 74 6f 20 64 69 73 61 62 6c 65 20 65 6e  ** to disable en
164e0 63 6f 64 69 6e 67 20 63 68 65 63 6b 69 6e 67 2e  coding checking.
164f0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
16500 46 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 45 58  FOSSIL_ENABLE_EX
16510 45 43 5f 52 45 4c 5f 50 41 54 48 53 29 0a 2f 2a  EC_REL_PATHS)./*
16520 0a 2a 2a 20 53 45 54 54 49 4e 47 3a 20 65 78 65  .** SETTING: exe
16530 63 2d 72 65 6c 2d 70 61 74 68 73 20 20 20 62 6f  c-rel-paths   bo
16540 6f 6c 65 61 6e 20 64 65 66 61 75 6c 74 3d 6f 6e  olean default=on
16550 0a 2a 2a 20 57 68 65 6e 20 65 78 65 63 75 74 69  .** When executi
16560 6e 67 20 63 65 72 74 61 69 6e 20 65 78 74 65 72  ng certain exter
16570 6e 61 6c 20 63 6f 6d 6d 61 6e 64 73 20 28 65 2e  nal commands (e.
16580 67 2e 20 64 69 66 66 20 61 6e 64 0a 2a 2a 20 67  g. diff and.** g
16590 64 69 66 66 29 2c 20 75 73 65 20 72 65 6c 61 74  diff), use relat
165a0 69 76 65 20 70 61 74 68 73 2e 0a 2a 2f 0a 23 65  ive paths..*/.#e
165b0 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
165c0 64 28 46 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f  d(FOSSIL_ENABLE_
165d0 45 58 45 43 5f 52 45 4c 5f 50 41 54 48 53 29 0a  EXEC_REL_PATHS).
165e0 2f 2a 0a 2a 2a 20 53 45 54 54 49 4e 47 3a 20 65  /*.** SETTING: e
165f0 78 65 63 2d 72 65 6c 2d 70 61 74 68 73 20 20 20  xec-rel-paths   
16600 62 6f 6f 6c 65 61 6e 20 64 65 66 61 75 6c 74 3d  boolean default=
16610 6f 66 66 0a 2a 2a 20 57 68 65 6e 20 65 78 65 63  off.** When exec
16620 75 74 69 6e 67 20 63 65 72 74 61 69 6e 20 65 78  uting certain ex
16630 74 65 72 6e 61 6c 20 63 6f 6d 6d 61 6e 64 73 20  ternal commands 
16640 28 65 2e 67 2e 20 64 69 66 66 20 61 6e 64 0a 2a  (e.g. diff and.*
16650 2a 20 67 64 69 66 66 29 2c 20 75 73 65 20 72 65  * gdiff), use re
16660 6c 61 74 69 76 65 20 70 61 74 68 73 2e 0a 2a 2f  lative paths..*/
16670 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 53 45  .#endif./*.** SE
16680 54 54 49 4e 47 3a 20 67 64 69 66 66 2d 63 6f 6d  TTING: gdiff-com
16690 6d 61 6e 64 20 20 20 20 77 69 64 74 68 3d 34 30  mand    width=40
166a0 20 64 65 66 61 75 6c 74 3d 67 64 69 66 66 0a 2a   default=gdiff.*
166b0 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 61  * The value is a
166c0 6e 20 65 78 74 65 72 6e 61 6c 20 63 6f 6d 6d 61  n external comma
166d0 6e 64 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 70  nd to run when p
166e0 65 72 66 6f 72 6d 69 6e 67 20 61 20 67 72 61 70  erforming a grap
166f0 68 69 63 61 6c 0a 2a 2a 20 64 69 66 66 2e 20 49  hical.** diff. I
16700 66 20 75 6e 64 65 66 69 6e 65 64 2c 20 74 65 78  f undefined, tex
16710 74 20 64 69 66 66 20 77 69 6c 6c 20 62 65 20 75  t diff will be u
16720 73 65 64 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45  sed..*/./*.** SE
16730 54 54 49 4e 47 3a 20 67 6d 65 72 67 65 2d 63 6f  TTING: gmerge-co
16740 6d 6d 61 6e 64 20 20 20 77 69 64 74 68 3d 34 30  mmand   width=40
16750 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73  .** The value is
16760 20 61 20 67 72 61 70 68 69 63 61 6c 20 6d 65 72   a graphical mer
16770 67 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  ge conflict reso
16780 6c 76 65 72 20 63 6f 6d 6d 61 6e 64 20 6f 70 65  lver command ope
16790 72 61 74 69 6e 67 0a 2a 2a 20 6f 6e 20 66 6f 75  rating.** on fou
167a0 72 20 66 69 6c 65 73 2e 20 20 45 78 61 6d 70 6c  r files.  Exampl
167b0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 6b 64  es:.**.**     kd
167c0 69 66 66 33 20 22 25 62 61 73 65 6c 69 6e 65 22  iff3 "%baseline"
167d0 20 22 25 6f 72 69 67 69 6e 61 6c 22 20 22 25 6d   "%original" "%m
167e0 65 72 67 65 22 20 2d 6f 20 22 25 6f 75 74 70 75  erge" -o "%outpu
167f0 74 22 0a 2a 2a 20 20 20 20 20 78 78 64 69 66 66  t".**     xxdiff
16800 20 22 25 6f 72 69 67 69 6e 61 6c 22 20 22 25 62   "%original" "%b
16810 61 73 65 6c 69 6e 65 22 20 22 25 6d 65 72 67 65  aseline" "%merge
16820 22 20 2d 4d 20 22 25 6f 75 74 70 75 74 22 0a 2a  " -M "%output".*
16830 2a 20 20 20 20 20 6d 65 6c 64 20 22 25 62 61 73  *     meld "%bas
16840 65 6c 69 6e 65 22 20 22 25 6f 72 69 67 69 6e 61  eline" "%origina
16850 6c 22 20 22 25 6d 65 72 67 65 22 20 22 25 6f 75  l" "%merge" "%ou
16860 74 70 75 74 22 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53  tput".*/./*.** S
16870 45 54 54 49 4e 47 3a 20 68 61 73 68 2d 64 69 67  ETTING: hash-dig
16880 69 74 73 20 20 20 20 20 20 77 69 64 74 68 3d 35  its      width=5
16890 20 64 65 66 61 75 6c 74 3d 31 30 0a 2a 2a 20 54   default=10.** T
168a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 68 65 78  he number of hex
168b0 61 64 65 63 69 6d 61 6c 20 64 69 67 69 74 73 20  adecimal digits 
168c0 6f 66 20 74 68 65 20 53 48 41 33 20 68 61 73 68  of the SHA3 hash
168d0 20 74 6f 20 64 69 73 70 6c 61 79 2e 0a 2a 2f 0a   to display..*/.
168e0 2f 2a 0a 2a 2a 20 53 45 54 54 49 4e 47 3a 20 68  /*.** SETTING: h
168f0 74 74 70 2d 70 6f 72 74 20 20 20 20 20 20 20 20  ttp-port        
16900 77 69 64 74 68 3d 31 36 20 64 65 66 61 75 6c 74  width=16 default
16910 3d 38 30 38 30 0a 2a 2a 20 54 68 65 20 64 65 66  =8080.** The def
16920 61 75 6c 74 20 54 43 50 2f 49 50 20 70 6f 72 74  ault TCP/IP port
16930 20 6e 75 6d 62 65 72 20 74 6f 20 75 73 65 20 62   number to use b
16940 79 20 74 68 65 20 22 73 65 72 76 65 72 22 0a 2a  y the "server".*
16950 2a 20 61 6e 64 20 22 75 69 22 20 63 6f 6d 6d 61  * and "ui" comma
16960 6e 64 73 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45  nds..*/./*.** SE
16970 54 54 49 4e 47 3a 20 68 74 74 70 73 2d 6c 6f 67  TTING: https-log
16980 69 6e 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 20  in      boolean 
16990 64 65 66 61 75 6c 74 3d 6f 66 66 0a 2a 2a 20 49  default=off.** I
169a0 66 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  f true, then the
169b0 20 46 6f 73 73 69 6c 20 77 65 62 20 73 65 72 76   Fossil web serv
169c0 65 72 20 77 69 6c 6c 20 72 65 64 69 72 65 63 74  er will redirect
169d0 20 75 6e 65 6e 63 72 79 70 74 65 64 0a 2a 2a 20   unencrypted.** 
169e0 6c 6f 67 69 6e 20 73 63 72 65 65 65 6e 20 72 65  login screeen re
169f0 71 75 65 73 74 73 20 74 6f 20 48 54 54 50 53 2e  quests to HTTPS.
16a00 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45 54 54 49 4e  .*/./*.** SETTIN
16a10 47 3a 20 69 67 6e 6f 72 65 2d 67 6c 6f 62 20 20  G: ignore-glob  
16a20 20 20 20 20 77 69 64 74 68 3d 34 30 20 76 65 72      width=40 ver
16a30 73 69 6f 6e 61 62 6c 65 20 62 6c 6f 63 6b 2d 74  sionable block-t
16a40 65 78 74 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ext.** The value
16a50 20 69 73 20 61 20 63 6f 6d 6d 61 20 6f 72 20 6e   is a comma or n
16a60 65 77 6c 69 6e 65 2d 73 65 70 61 72 61 74 65 64  ewline-separated
16a70 20 6c 69 73 74 20 6f 66 20 47 4c 4f 42 0a 2a 2a   list of GLOB.**
16a80 20 70 61 74 74 65 72 6e 73 20 73 70 65 63 69 66   patterns specif
16a90 79 69 6e 67 20 66 69 6c 65 73 20 74 68 61 74 20  ying files that 
16aa0 74 68 65 20 22 61 64 64 22 2c 20 22 61 64 64 72  the "add", "addr
16ab0 65 6d 6f 76 65 22 2c 0a 2a 2a 20 22 63 6c 65 61  emove",.** "clea
16ac0 6e 22 2c 20 61 6e 64 20 22 65 78 74 72 61 73 22  n", and "extras"
16ad0 20 63 6f 6d 6d 61 6e 64 73 20 77 69 6c 6c 20 69   commands will i
16ae0 67 6e 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  gnore..**.** Exa
16af0 6d 70 6c 65 3a 20 20 2a 2e 6c 6f 67 20 63 75 73  mple:  *.log cus
16b00 74 6f 6d 43 6f 64 65 2e 63 20 6e 6f 74 65 73 2e  tomCode.c notes.
16b10 74 78 74 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45 54  txt.*/./*.** SET
16b20 54 49 4e 47 3a 20 6b 65 65 70 2d 67 6c 6f 62 20  TING: keep-glob 
16b30 20 20 20 20 20 20 20 77 69 64 74 68 3d 34 30 20         width=40 
16b40 76 65 72 73 69 6f 6e 61 62 6c 65 20 62 6c 6f 63  versionable bloc
16b50 6b 2d 74 65 78 74 0a 2a 2a 20 54 68 65 20 76 61  k-text.** The va
16b60 6c 75 65 20 69 73 20 61 20 63 6f 6d 6d 61 20 6f  lue is a comma o
16b70 72 20 6e 65 77 6c 69 6e 65 2d 73 65 70 61 72 61  r newline-separa
16b80 74 65 64 20 6c 69 73 74 20 6f 66 20 47 4c 4f 42  ted list of GLOB
16b90 0a 2a 2a 20 70 61 74 74 65 72 6e 73 20 73 70 65  .** patterns spe
16ba0 63 69 66 79 69 6e 67 20 66 69 6c 65 73 20 74 68  cifying files th
16bb0 61 74 20 74 68 65 20 22 63 6c 65 61 6e 22 20 63  at the "clean" c
16bc0 6f 6d 6d 61 6e 64 20 77 69 6c 6c 20 6b 65 65 70  ommand will keep
16bd0 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45 54 54 49 4e  .*/./*.** SETTIN
16be0 47 3a 20 6c 6f 63 61 6c 61 75 74 68 20 20 20 20  G: localauth    
16bf0 20 20 20 20 62 6f 6f 6c 65 61 6e 20 64 65 66 61      boolean defa
16c00 75 6c 74 3d 6f 66 66 0a 2a 2a 20 49 66 20 65 6e  ult=off.** If en
16c10 61 62 6c 65 64 2c 20 72 65 71 75 69 72 65 20 74  abled, require t
16c20 68 61 74 20 48 54 54 50 20 63 6f 6e 6e 65 63 74  hat HTTP connect
16c30 69 6f 6e 73 20 66 72 6f 6d 0a 2a 2a 20 31 32 37  ions from.** 127
16c40 2e 30 2e 30 2e 31 20 62 65 20 61 75 74 68 65 6e  .0.0.1 be authen
16c50 74 69 63 61 74 65 64 20 62 79 20 70 61 73 73 77  ticated by passw
16c60 6f 72 64 2e 20 20 49 66 0a 2a 2a 20 66 61 6c 73  ord.  If.** fals
16c70 65 2c 20 61 6c 6c 20 48 54 54 50 20 72 65 71 75  e, all HTTP requ
16c80 65 73 74 73 20 66 72 6f 6d 20 6c 6f 63 61 6c 68  ests from localh
16c90 6f 73 74 20 68 61 76 65 0a 2a 2a 20 75 6e 72 65  ost have.** unre
16ca0 73 74 72 69 63 74 65 64 20 61 63 63 65 73 73 20  stricted access 
16cb0 74 6f 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72  to the repositor
16cc0 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45 54 54  y..*/./*.** SETT
16cd0 49 4e 47 3a 20 6d 61 69 6e 2d 62 72 61 6e 63 68  ING: main-branch
16ce0 20 20 20 20 20 20 77 69 64 74 68 3d 34 30 20 64        width=40 d
16cf0 65 66 61 75 6c 74 3d 74 72 75 6e 6b 0a 2a 2a 20  efault=trunk.** 
16d00 54 68 65 20 76 61 6c 75 65 20 69 73 20 74 68 65  The value is the
16d10 20 70 72 69 6d 61 72 79 20 62 72 61 6e 63 68 20   primary branch 
16d20 66 6f 72 20 74 68 65 20 70 72 6f 6a 65 63 74 2e  for the project.
16d30 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45 54 54 49 4e  .*/./*.** SETTIN
16d40 47 3a 20 6d 61 6e 69 66 65 73 74 20 20 20 20 20  G: manifest     
16d50 20 20 20 20 77 69 64 74 68 3d 35 20 76 65 72 73      width=5 vers
16d60 69 6f 6e 61 62 6c 65 0a 2a 2a 20 49 66 20 65 6e  ionable.** If en
16d70 61 62 6c 65 64 2c 20 61 75 74 6f 6d 61 74 69 63  abled, automatic
16d80 61 6c 6c 79 20 63 72 65 61 74 65 20 66 69 6c 65  ally create file
16d90 73 20 22 6d 61 6e 69 66 65 73 74 22 20 61 6e 64  s "manifest" and
16da0 20 22 6d 61 6e 69 66 65 73 74 2e 75 75 69 64 22   "manifest.uuid"
16db0 0a 2a 2a 20 69 6e 20 65 76 65 72 79 20 63 68 65  .** in every che
16dc0 63 6b 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 70 74  ckout..**.** Opt
16dd0 69 6f 6e 61 6c 6c 79 20 75 73 65 20 63 6f 6d 62  ionally use comb
16de0 69 6e 61 74 69 6f 6e 73 20 6f 66 20 63 68 61 72  inations of char
16df0 61 63 74 65 72 73 20 27 72 27 20 66 6f 72 20 22  acters 'r' for "
16e00 6d 61 6e 69 66 65 73 74 22 2c 0a 2a 2a 20 27 75  manifest",.** 'u
16e10 27 20 66 6f 72 20 22 6d 61 6e 69 66 65 73 74 2e  ' for "manifest.
16e20 75 75 69 64 22 20 61 6e 64 20 27 74 27 20 66 6f  uuid" and 't' fo
16e30 72 20 22 6d 61 6e 69 66 65 73 74 2e 74 61 67 73  r "manifest.tags
16e40 22 2e 20 20 54 68 65 20 53 51 4c 69 74 65 0a 2a  ".  The SQLite.*
16e50 2a 20 61 6e 64 20 46 6f 73 73 69 6c 20 72 65 70  * and Fossil rep
16e60 6f 73 69 74 6f 72 69 65 73 20 62 6f 74 68 20 72  ositories both r
16e70 65 71 75 69 72 65 20 6d 61 6e 69 66 65 73 74 73  equire manifests
16e80 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45 54 54 49  ..*/./*.** SETTI
16e90 4e 47 3a 20 6d 61 78 2d 6c 6f 61 64 61 76 67 20  NG: max-loadavg 
16ea0 20 20 20 20 20 77 69 64 74 68 3d 32 35 20 64 65       width=25 de
16eb0 66 61 75 6c 74 3d 30 2e 30 0a 2a 2a 20 53 6f 6d  fault=0.0.** Som
16ec0 65 20 43 50 55 2d 69 6e 74 65 6e 73 69 76 65 20  e CPU-intensive 
16ed0 77 65 62 20 70 61 67 65 73 20 28 65 78 3a 20 2f  web pages (ex: /
16ee0 7a 69 70 2c 20 2f 74 61 72 62 61 6c 6c 2c 20 2f  zip, /tarball, /
16ef0 62 6c 61 6d 65 29 0a 2a 2a 20 61 72 65 20 64 69  blame).** are di
16f00 73 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 20  sallowed if the 
16f10 73 79 73 74 65 6d 20 6c 6f 61 64 20 61 76 65 72  system load aver
16f20 61 67 65 20 67 6f 65 73 20 61 62 6f 76 65 20 74  age goes above t
16f30 68 69 73 0a 2a 2a 20 76 61 6c 75 65 2e 20 20 22  his.** value.  "
16f40 30 2e 30 22 20 6d 65 61 6e 73 20 6e 6f 20 6c 69  0.0" means no li
16f50 6d 69 74 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  mit.  This only 
16f60 77 6f 72 6b 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a  works on unix..*
16f70 2a 20 4f 6e 6c 79 20 6c 6f 63 61 6c 20 73 65 74  * Only local set
16f80 74 69 6e 67 73 20 6f 66 20 74 68 69 73 20 76 61  tings of this va
16f90 6c 75 65 20 6d 61 6b 65 20 61 20 64 69 66 66 65  lue make a diffe
16fa0 72 65 6e 63 65 20 73 69 6e 63 65 0a 2a 2a 20 77  rence since.** w
16fb0 68 65 6e 20 72 75 6e 6e 69 6e 67 20 61 73 20 61  hen running as a
16fc0 20 77 65 62 2d 73 65 72 76 65 72 2c 20 46 6f 73   web-server, Fos
16fd0 73 69 6c 20 64 6f 65 73 20 6e 6f 74 20 6f 70 65  sil does not ope
16fe0 6e 20 74 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  n the.** global 
16ff0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 64 61  configuration da
17000 74 61 62 61 73 65 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  tabase..*/./*.**
17010 20 53 45 54 54 49 4e 47 3a 20 6d 61 78 2d 75 70   SETTING: max-up
17020 6c 6f 61 64 20 20 20 20 20 20 20 77 69 64 74 68  load       width
17030 3d 32 35 20 64 65 66 61 75 6c 74 3d 32 35 30 30  =25 default=2500
17040 30 30 0a 2a 2a 20 41 20 6c 69 6d 69 74 20 6f 6e  00.** A limit on
17050 20 74 68 65 20 73 69 7a 65 20 6f 66 20 75 70 6c   the size of upl
17060 69 6e 6b 20 48 54 54 50 20 72 65 71 75 65 73 74  ink HTTP request
17070 73 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45 54 54  s..*/./*.** SETT
17080 49 4e 47 3a 20 6d 74 69 6d 65 2d 63 68 61 6e 67  ING: mtime-chang
17090 65 73 20 20 20 20 62 6f 6f 6c 65 61 6e 20 64 65  es    boolean de
170a0 66 61 75 6c 74 3d 6f 6e 0a 2a 2a 20 55 73 65 20  fault=on.** Use 
170b0 66 69 6c 65 20 6d 6f 64 69 66 69 63 61 74 69 6f  file modificatio
170c0 6e 20 74 69 6d 65 73 20 28 6d 74 69 6d 65 73 29  n times (mtimes)
170d0 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 0a   to detect when.
170e0 2a 2a 20 66 69 6c 65 73 20 68 61 76 65 20 62 65  ** files have be
170f0 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
17100 20 64 69 73 61 62 6c 65 64 2c 20 61 6c 6c 20 6d   disabled, all m
17110 61 6e 61 67 65 64 20 66 69 6c 65 73 0a 2a 2a 20  anaged files.** 
17120 61 72 65 20 68 61 73 68 65 64 20 74 6f 20 64 65  are hashed to de
17130 74 65 63 74 20 63 68 61 6e 67 65 73 2c 20 77 68  tect changes, wh
17140 69 63 68 20 63 61 6e 20 62 65 20 73 6c 6f 77 20  ich can be slow 
17150 66 6f 72 20 6c 61 72 67 65 0a 2a 2a 20 70 72 6f  for large.** pro
17160 6a 65 63 74 73 2e 0a 2a 2f 0a 23 69 66 20 46 4f  jects..*/.#if FO
17170 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4c 45 47 41  SSIL_ENABLE_LEGA
17180 43 59 5f 4d 56 5f 52 4d 0a 2f 2a 0a 2a 2a 20 53  CY_MV_RM./*.** S
17190 45 54 54 49 4e 47 3a 20 6d 76 2d 72 6d 2d 66 69  ETTING: mv-rm-fi
171a0 6c 65 73 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e  les      boolean
171b0 20 64 65 66 61 75 6c 74 3d 6f 66 66 0a 2a 2a 20   default=off.** 
171c0 49 66 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 20  If enabled, the 
171d0 22 6d 76 22 20 61 6e 64 20 22 72 65 6e 61 6d 65  "mv" and "rename
171e0 22 20 63 6f 6d 6d 61 6e 64 73 20 77 69 6c 6c 20  " commands will 
171f0 61 6c 73 6f 20 6d 6f 76 65 0a 2a 2a 20 74 68 65  also move.** the
17200 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
17210 73 20 77 69 74 68 69 6e 20 74 68 65 20 63 68 65  s within the che
17220 63 6b 6f 75 74 20 2d 41 4e 44 2d 20 74 68 65 20  ckout -AND- the 
17230 22 72 6d 22 0a 2a 2a 20 61 6e 64 20 22 64 65 6c  "rm".** and "del
17240 65 74 65 22 20 63 6f 6d 6d 61 6e 64 73 20 77 69  ete" commands wi
17250 6c 6c 20 61 6c 73 6f 20 72 65 6d 6f 76 65 20 74  ll also remove t
17260 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  he associated.**
17270 20 66 69 6c 65 73 20 66 72 6f 6d 20 77 69 74 68   files from with
17280 69 6e 20 74 68 65 20 63 68 65 63 6b 6f 75 74 2e  in the checkout.
17290 0a 2a 2f 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a  .*/.#endif./*.**
172a0 20 53 45 54 54 49 4e 47 3a 20 70 67 70 2d 63 6f   SETTING: pgp-co
172b0 6d 6d 61 6e 64 20 20 20 20 20 20 77 69 64 74 68  mmand      width
172c0 3d 34 30 0a 2a 2a 20 43 6f 6d 6d 61 6e 64 20 75  =40.** Command u
172d0 73 65 64 20 74 6f 20 63 6c 65 61 72 2d 73 69 67  sed to clear-sig
172e0 6e 20 6d 61 6e 69 66 65 73 74 73 20 61 74 20 63  n manifests at c
172f0 68 65 63 6b 2d 69 6e 2e 0a 2a 2a 20 44 65 66 61  heck-in..** Defa
17300 75 6c 74 20 76 61 6c 75 65 20 69 73 20 22 67 70  ult value is "gp
17310 67 20 2d 2d 63 6c 65 61 72 73 69 67 6e 20 2d 6f  g --clearsign -o
17320 22 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45 54 54 49  ".*/./*.** SETTI
17330 4e 47 3a 20 70 72 6f 78 79 20 20 20 20 20 20 20  NG: proxy       
17340 20 20 20 20 20 77 69 64 74 68 3d 33 32 20 64 65       width=32 de
17350 66 61 75 6c 74 3d 6f 66 66 0a 2a 2a 20 55 52 4c  fault=off.** URL
17360 20 6f 66 20 74 68 65 20 48 54 54 50 20 70 72 6f   of the HTTP pro
17370 78 79 2e 20 20 49 66 20 75 6e 64 65 66 69 6e 65  xy.  If undefine
17380 64 20 6f 72 20 22 6f 66 66 22 20 74 68 65 6e 0a  d or "off" then.
17390 2a 2a 20 74 68 65 20 22 68 74 74 70 5f 70 72 6f  ** the "http_pro
173a0 78 79 22 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  xy" environment 
173b0 76 61 72 69 61 62 6c 65 20 69 73 20 63 6f 6e 73  variable is cons
173c0 75 6c 74 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65  ulted..** If the
173d0 20 68 74 74 70 5f 70 72 6f 78 79 20 65 6e 76 69   http_proxy envi
173e0 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
173f0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a   is undefined.**
17400 20 74 68 65 6e 20 61 20 64 69 72 65 63 74 20 48   then a direct H
17410 54 54 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  TTP connection i
17420 73 20 75 73 65 64 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  s used..*/./*.**
17430 20 53 45 54 54 49 4e 47 3a 20 72 65 6c 61 74 69   SETTING: relati
17440 76 65 2d 70 61 74 68 73 20 20 20 62 6f 6f 6c 65  ve-paths   boole
17450 61 6e 20 64 65 66 61 75 6c 74 3d 6f 6e 0a 2a 2a  an default=on.**
17460 20 57 68 65 6e 20 73 68 6f 77 69 6e 67 20 63 68   When showing ch
17470 61 6e 67 65 73 20 61 6e 64 20 65 78 74 72 61 73  anges and extras
17480 2c 20 72 65 70 6f 72 74 20 70 61 74 68 73 20 72  , report paths r
17490 65 6c 61 74 69 76 65 0a 2a 2a 20 74 6f 20 74 68  elative.** to th
174a0 65 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  e current workin
174b0 67 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a  g directory..*/.
174c0 2f 2a 0a 2a 2a 20 53 45 54 54 49 4e 47 3a 20 72  /*.** SETTING: r
174d0 65 70 6f 2d 63 6b 73 75 6d 20 20 20 20 20 20 20  epo-cksum       
174e0 62 6f 6f 6c 65 61 6e 20 64 65 66 61 75 6c 74 3d  boolean default=
174f0 6f 6e 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 63 68  on.** Compute ch
17500 65 63 6b 73 75 6d 73 20 6f 76 65 72 20 61 6c 6c  ecksums over all
17510 20 66 69 6c 65 73 20 69 6e 20 65 61 63 68 20 63   files in each c
17520 68 65 63 6b 6f 75 74 20 61 73 20 61 20 64 6f 75  heckout as a dou
17530 62 6c 65 2d 63 68 65 63 6b 0a 2a 2a 20 6f 66 20  ble-check.** of 
17540 63 6f 72 72 65 63 74 6e 65 73 73 2e 20 20 44 69  correctness.  Di
17550 73 61 62 6c 65 20 74 68 69 73 20 6f 6e 20 6c 61  sable this on la
17560 72 67 65 20 72 65 70 6f 73 69 74 6f 72 69 65 73  rge repositories
17570 20 66 6f 72 20 61 20 70 65 72 66 6f 72 6d 61 6e   for a performan
17580 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e  ce.** improvemen
17590 74 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45 54 54  t..*/./*.** SETT
175a0 49 4e 47 3a 20 73 65 6c 66 2d 72 65 67 69 73 74  ING: self-regist
175b0 65 72 20 20 20 20 62 6f 6f 6c 65 61 6e 20 64 65  er    boolean de
175c0 66 61 75 6c 74 3d 6f 66 66 0a 2a 2a 20 41 6c 6c  fault=off.** All
175d0 6f 77 20 75 73 65 72 73 20 74 6f 20 72 65 67 69  ow users to regi
175e0 73 74 65 72 20 74 68 65 6d 73 65 6c 76 65 73 20  ster themselves 
175f0 74 68 72 6f 75 67 68 20 74 68 65 20 48 54 54 50  through the HTTP
17600 20 55 49 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20   UI..** This is 
17610 75 73 65 66 75 6c 20 69 66 20 79 6f 75 20 77 61  useful if you wa
17620 6e 74 20 74 6f 20 73 65 65 20 6f 74 68 65 72 20  nt to see other 
17630 6e 61 6d 65 73 20 74 68 61 6e 0a 2a 2a 20 22 41  names than.** "A
17640 6e 6f 6e 79 6d 6f 75 73 22 20 69 6e 20 65 2e 67  nonymous" in e.g
17650 2e 20 74 69 63 6b 65 74 69 6e 67 20 73 79 73 74  . ticketing syst
17660 65 6d 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  em. On the other
17670 20 68 61 6e 64 0a 2a 2a 20 75 73 65 72 73 20 63   hand.** users c
17680 61 6e 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65  an not be delete
17690 64 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45 54 54  d..*/./*.** SETT
176a0 49 4e 47 3a 20 73 73 68 2d 63 6f 6d 6d 61 6e 64  ING: ssh-command
176b0 20 20 20 20 20 20 77 69 64 74 68 3d 34 30 0a 2a        width=40.*
176c0 2a 20 54 68 65 20 63 6f 6d 6d 61 6e 64 20 75 73  * The command us
176d0 65 64 20 74 6f 20 74 61 6c 6b 20 74 6f 20 61 20  ed to talk to a 
176e0 72 65 6d 6f 74 65 20 6d 61 63 68 69 6e 65 20 77  remote machine w
176f0 69 74 68 20 20 74 68 65 20 22 73 73 68 3a 2f 2f  ith  the "ssh://
17700 22 20 70 72 6f 74 6f 63 6f 6c 2e 0a 2a 2f 0a 2f  " protocol..*/./
17710 2a 0a 2a 2a 20 53 45 54 54 49 4e 47 3a 20 73 73  *.** SETTING: ss
17720 6c 2d 63 61 2d 6c 6f 63 61 74 69 6f 6e 20 20 77  l-ca-location  w
17730 69 64 74 68 3d 34 30 0a 2a 2a 20 54 68 65 20 66  idth=40.** The f
17740 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 74 6f 20  ull pathname to 
17750 61 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  a file containin
17760 67 20 50 45 4d 20 65 6e 63 6f 64 65 64 0a 2a 2a  g PEM encoded.**
17770 20 43 41 20 72 6f 6f 74 20 63 65 72 74 69 66 69   CA root certifi
17780 63 61 74 65 73 2c 20 6f 72 20 61 20 64 69 72 65  cates, or a dire
17790 63 74 6f 72 79 20 6f 66 20 63 65 72 74 69 66 69  ctory of certifi
177a0 63 61 74 65 73 0a 2a 2a 20 77 69 74 68 20 66 69  cates.** with fi
177b0 6c 65 6e 61 6d 65 73 20 66 6f 72 6d 65 64 20 66  lenames formed f
177c0 72 6f 6d 20 74 68 65 20 63 65 72 74 69 66 69 63  rom the certific
177d0 61 74 65 20 68 61 73 68 65 73 20 61 73 0a 2a 2a  ate hashes as.**
177e0 20 72 65 71 75 69 72 65 64 20 62 79 20 4f 70 65   required by Ope
177f0 6e 53 53 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  nSSL..**.** If s
17800 65 74 2c 20 74 68 69 73 20 77 69 6c 6c 20 6f 76  et, this will ov
17810 65 72 72 69 64 65 20 74 68 65 20 4f 53 20 64 65  erride the OS de
17820 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 0a 2a 2a  fault list of.**
17830 20 4f 70 65 6e 53 53 4c 20 43 41 73 2e 20 49 66   OpenSSL CAs. If
17840 20 75 6e 73 65 74 2c 20 74 68 65 20 64 65 66 61   unset, the defa
17850 75 6c 74 20 6c 69 73 74 20 77 69 6c 6c 20 62 65  ult list will be
17860 20 75 73 65 64 2e 0a 2a 2a 20 53 6f 6d 65 20 70   used..** Some p
17870 6c 61 74 66 6f 72 6d 73 20 6d 61 79 20 61 64 64  latforms may add
17880 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 65 72 74   additional cert
17890 69 66 69 63 61 74 65 73 2e 0a 2a 2a 20 43 68 65  ificates..** Che
178a0 63 6b 69 6e 67 20 79 6f 75 72 20 70 6c 61 74 66  cking your platf
178b0 6f 72 6d 20 62 65 68 61 76 69 6f 75 72 20 69 73  orm behaviour is
178c0 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
178d0 0a 2a 2a 20 65 78 61 63 74 20 63 6f 6e 74 65 6e  .** exact conten
178e0 74 73 20 6f 66 20 74 68 65 20 43 41 20 72 6f 6f  ts of the CA roo
178f0 74 20 69 73 20 63 72 69 74 69 63 61 6c 20 66 6f  t is critical fo
17900 72 20 79 6f 75 72 0a 2a 2a 20 61 70 70 6c 69 63  r your.** applic
17910 61 74 69 6f 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  ation..*/./*.** 
17920 53 45 54 54 49 4e 47 3a 20 73 73 6c 2d 69 64 65  SETTING: ssl-ide
17930 6e 74 69 74 79 20 20 20 20 20 77 69 64 74 68 3d  ntity     width=
17940 34 30 0a 2a 2a 20 54 68 65 20 66 75 6c 6c 20 70  40.** The full p
17950 61 74 68 6e 61 6d 65 20 74 6f 20 61 20 66 69 6c  athname to a fil
17960 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63  e containing a c
17970 65 72 74 69 66 69 63 61 74 65 0a 2a 2a 20 61 6e  ertificate.** an
17980 64 20 70 72 69 76 61 74 65 20 6b 65 79 20 69 6e  d private key in
17990 20 50 45 4d 20 66 6f 72 6d 61 74 2e 20 43 72 65   PEM format. Cre
179a0 61 74 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61  ate by concatena
179b0 74 69 6e 67 0a 2a 2a 20 74 68 65 20 63 65 72 74  ting.** the cert
179c0 69 66 69 63 61 74 65 20 61 6e 64 20 70 72 69 76  ificate and priv
179d0 61 74 65 20 6b 65 79 20 66 69 6c 65 73 2e 0a 2a  ate key files..*
179e0 2a 0a 2a 2a 20 54 68 69 73 20 69 64 65 6e 74 69  *.** This identi
179f0 74 79 20 77 69 6c 6c 20 62 65 20 70 72 65 73 65  ty will be prese
17a00 6e 74 65 64 20 74 6f 20 53 53 4c 20 73 65 72 76  nted to SSL serv
17a10 65 72 73 20 74 6f 0a 2a 2a 20 61 75 74 68 65 6e  ers to.** authen
17a20 74 69 63 61 74 65 20 74 68 69 73 20 63 6c 69 65  ticate this clie
17a30 6e 74 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20  nt, in addition 
17a40 74 6f 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a  to the normal.**
17a50 20 70 61 73 73 77 6f 72 64 20 61 75 74 68 65 6e   password authen
17a60 74 69 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  tication..*/.#if
17a70 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c  def FOSSIL_ENABL
17a80 45 5f 54 43 4c 0a 2f 2a 0a 2a 2a 20 53 45 54 54  E_TCL./*.** SETT
17a90 49 4e 47 3a 20 74 63 6c 20 20 20 20 20 20 20 20  ING: tcl        
17aa0 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 20 64 65        boolean de
17ab0 66 61 75 6c 74 3d 6f 66 66 0a 2a 2a 20 49 66 20  fault=off.** If 
17ac0 65 6e 61 62 6c 65 64 20 54 63 6c 20 69 6e 74 65  enabled Tcl inte
17ad0 67 72 61 74 69 6f 6e 20 63 6f 6d 6d 61 6e 64 73  gration commands
17ae0 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74   will be added t
17af0 6f 20 74 68 65 20 54 48 31 0a 2a 2a 20 69 6e 74  o the TH1.** int
17b00 65 72 70 72 65 74 65 72 2c 20 61 6c 6c 6f 77 69  erpreter, allowi
17b10 6e 67 20 61 72 62 69 74 72 61 72 79 20 54 63 6c  ng arbitrary Tcl
17b20 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
17b30 0a 2a 2a 20 73 63 72 69 70 74 73 20 74 6f 20 62  .** scripts to b
17b40 65 20 65 76 61 6c 75 61 74 65 64 20 66 72 6f 6d  e evaluated from
17b50 20 54 48 31 2e 20 20 41 64 64 69 74 69 6f 6e 61   TH1.  Additiona
17b60 6c 6c 79 2c 20 74 68 65 20 54 63 6c 0a 2a 2a 20  lly, the Tcl.** 
17b70 69 6e 74 65 72 70 72 65 74 65 72 20 77 69 6c 6c  interpreter will
17b80 20 62 65 20 61 62 6c 65 20 74 6f 20 65 76 61 6c   be able to eval
17b90 75 61 74 65 20 61 72 62 69 74 72 61 72 79 20 54  uate arbitrary T
17ba0 48 31 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  H1.** expression
17bb0 73 20 61 6e 64 20 73 63 72 69 70 74 73 2e 0a 2a  s and scripts..*
17bc0 2f 0a 2f 2a 0a 2a 2a 20 53 45 54 54 49 4e 47 3a  /./*.** SETTING:
17bd0 20 74 63 6c 2d 73 65 74 75 70 20 20 20 20 20 20   tcl-setup      
17be0 20 20 77 69 64 74 68 3d 34 30 20 76 65 72 73 69    width=40 versi
17bf0 6f 6e 61 62 6c 65 20 62 6c 6f 63 6b 2d 74 65 78  onable block-tex
17c00 74 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  t.** This is the
17c10 20 73 65 74 75 70 20 73 63 72 69 70 74 20 74 6f   setup script to
17c20 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 61 66   be evaluated af
17c30 74 65 72 20 63 72 65 61 74 69 6e 67 0a 2a 2a 20  ter creating.** 
17c40 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  and initializing
17c50 20 74 68 65 20 54 63 6c 20 69 6e 74 65 72 70 72   the Tcl interpr
17c60 65 74 65 72 2e 20 20 42 79 20 64 65 66 61 75 6c  eter.  By defaul
17c70 74 2c 20 74 68 69 73 0a 2a 2a 20 69 73 20 65 6d  t, this.** is em
17c80 70 74 79 20 61 6e 64 20 6e 6f 20 65 78 74 72 61  pty and no extra
17c90 20 73 65 74 75 70 20 69 73 20 70 65 72 66 6f 72   setup is perfor
17ca0 6d 65 64 2e 0a 2a 2f 0a 23 65 6e 64 69 66 20 2f  med..*/.#endif /
17cb0 2a 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f  * FOSSIL_ENABLE_
17cc0 54 43 4c 20 2a 2f 0a 23 69 66 64 65 66 20 46 4f  TCL */.#ifdef FO
17cd0 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 54 48 31 5f  SSIL_ENABLE_TH1_
17ce0 44 4f 43 53 0a 2f 2a 0a 2a 2a 20 53 45 54 54 49  DOCS./*.** SETTI
17cf0 4e 47 3a 20 74 68 31 2d 64 6f 63 73 20 20 20 20  NG: th1-docs    
17d00 20 20 20 20 20 62 6f 6f 6c 65 61 6e 20 64 65 66       boolean def
17d10 61 75 6c 74 3d 6f 66 66 0a 2a 2a 20 49 66 20 65  ault=off.** If e
17d20 6e 61 62 6c 65 64 2c 20 74 68 69 73 20 61 6c 6c  nabled, this all
17d30 6f 77 73 20 65 6d 62 65 64 64 65 64 20 64 6f 63  ows embedded doc
17d40 75 6d 65 6e 74 61 74 69 6f 6e 20 66 69 6c 65 73  umentation files
17d50 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61   to contain.** a
17d60 72 62 69 74 72 61 72 79 20 54 48 31 20 73 63 72  rbitrary TH1 scr
17d70 69 70 74 73 20 74 68 61 74 20 61 72 65 20 65 76  ipts that are ev
17d80 61 6c 75 61 74 65 64 20 6f 6e 20 74 68 65 20 73  aluated on the s
17d90 65 72 76 65 72 2e 20 20 49 66 20 6e 61 74 69 76  erver.  If nativ
17da0 65 0a 2a 2a 20 54 63 6c 20 69 6e 74 65 67 72 61  e.** Tcl integra
17db0 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 65 6e 61  tion is also ena
17dc0 62 6c 65 64 2c 20 74 68 69 73 20 73 65 74 74 69  bled, this setti
17dd0 6e 67 20 68 61 73 20 74 68 65 0a 2a 2a 20 70 6f  ng has the.** po
17de0 74 65 6e 74 69 61 6c 20 74 6f 20 61 6c 6c 6f 77  tential to allow
17df0 20 61 6e 79 62 6f 64 79 20 77 69 74 68 20 63 68   anybody with ch
17e00 65 63 6b 2d 69 6e 20 70 72 69 76 69 6c 65 67 65  eck-in privilege
17e10 73 20 74 6f 0a 2a 2a 20 64 6f 20 61 6c 6d 6f 73  s to.** do almos
17e20 74 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20  t anything that 
17e30 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 6f  the associated o
17e40 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 0a  perating system.
17e50 2a 2a 20 75 73 65 72 20 61 63 63 6f 75 6e 74 20  ** user account 
17e60 63 6f 75 6c 64 20 64 6f 2e 20 20 45 78 74 72 65  could do.  Extre
17e70 6d 65 20 63 61 75 74 69 6f 6e 20 73 68 6f 75 6c  me caution shoul
17e80 64 20 62 65 20 75 73 65 64 0a 2a 2a 20 77 68 65  d be used.** whe
17e90 6e 20 65 6e 61 62 6c 69 6e 67 20 74 68 69 73 20  n enabling this 
17ea0 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 23 65 6e 64  setting..*/.#end
17eb0 69 66 0a 23 69 66 64 65 66 20 46 4f 53 53 49 4c  if.#ifdef FOSSIL
17ec0 5f 45 4e 41 42 4c 45 5f 54 48 31 5f 48 4f 4f 4b  _ENABLE_TH1_HOOK
17ed0 53 0a 2f 2a 0a 2a 2a 20 53 45 54 54 49 4e 47 3a  S./*.** SETTING:
17ee0 20 74 68 31 2d 68 6f 6f 6b 73 20 20 20 20 20 20   th1-hooks      
17ef0 20 20 62 6f 6f 6c 65 61 6e 20 64 65 66 61 75 6c    boolean defaul
17f00 74 3d 6f 66 66 0a 2a 2a 20 49 66 20 65 6e 61 62  t=off.** If enab
17f10 6c 65 64 2c 20 73 70 65 63 69 61 6c 20 54 48 31  led, special TH1
17f20 20 63 6f 6d 6d 61 6e 64 73 20 77 69 6c 6c 20 62   commands will b
17f30 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
17f40 61 6e 64 0a 2a 2a 20 61 66 74 65 72 20 61 6e 79  and.** after any
17f50 20 46 6f 73 73 69 6c 20 63 6f 6d 6d 61 6e 64 20   Fossil command 
17f60 6f 72 20 77 65 62 20 70 61 67 65 2e 0a 2a 2f 0a  or web page..*/.
17f70 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 53 45 54  #endif./*.** SET
17f80 54 49 4e 47 3a 20 74 68 31 2d 73 65 74 75 70 20  TING: th1-setup 
17f90 20 20 20 20 20 20 20 77 69 64 74 68 3d 34 30 20         width=40 
17fa0 76 65 72 73 69 6f 6e 61 62 6c 65 20 62 6c 6f 63  versionable bloc
17fb0 6b 2d 74 65 78 74 0a 2a 2a 20 54 68 69 73 20 69  k-text.** This i
17fc0 73 20 74 68 65 20 73 65 74 75 70 20 73 63 72 69  s the setup scri
17fd0 70 74 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74  pt to be evaluat
17fe0 65 64 20 61 66 74 65 72 20 63 72 65 61 74 69 6e  ed after creatin
17ff0 67 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  g.** and initial
18000 69 7a 69 6e 67 20 74 68 65 20 54 48 31 20 69 6e  izing the TH1 in
18010 74 65 72 70 72 65 74 65 72 2e 20 20 42 79 20 64  terpreter.  By d
18020 65 66 61 75 6c 74 2c 20 74 68 69 73 0a 2a 2a 20  efault, this.** 
18030 69 73 20 65 6d 70 74 79 20 61 6e 64 20 6e 6f 20  is empty and no 
18040 65 78 74 72 61 20 73 65 74 75 70 20 69 73 20 70  extra setup is p
18050 65 72 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 2f 2a 0a  erformed..*/./*.
18060 2a 2a 20 53 45 54 54 49 4e 47 3a 20 74 68 31 2d  ** SETTING: th1-
18070 75 72 69 2d 72 65 67 65 78 70 20 20 20 77 69 64  uri-regexp   wid
18080 74 68 3d 34 30 20 76 65 72 73 69 6f 6e 61 62 6c  th=40 versionabl
18090 65 20 62 6c 6f 63 6b 2d 74 65 78 74 0a 2a 2a 20  e block-text.** 
180a0 53 70 65 63 69 66 79 20 77 68 69 63 68 20 55 52  Specify which UR
180b0 49 27 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  I's are allowed 
180c0 69 6e 20 48 54 54 50 20 72 65 71 75 65 73 74 73  in HTTP requests
180d0 20 66 72 6f 6d 0a 2a 2a 20 54 48 31 20 73 63 72   from.** TH1 scr
180e0 69 70 74 73 2e 20 20 49 66 20 65 6d 70 74 79 2c  ipts.  If empty,
180f0 20 6e 6f 20 48 54 54 50 20 72 65 71 75 65 73 74   no HTTP request
18100 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s are allowed.**
18110 20 77 68 61 74 73 6f 65 76 65 72 2e 0a 2a 2f 0a   whatsoever..*/.
18120 2f 2a 0a 2a 2a 20 53 45 54 54 49 4e 47 3a 20 75  /*.** SETTING: u
18130 76 2d 73 79 6e 63 20 20 20 20 20 20 20 20 20 20  v-sync          
18140 62 6f 6f 6c 65 61 6e 20 64 65 66 61 75 6c 74 3d  boolean default=
18150 6f 66 66 0a 2a 2a 20 49 66 20 74 72 75 65 2c 20  off.** If true, 
18160 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
18170 6e 64 20 75 6e 76 65 72 73 69 6f 6e 65 64 20 66  nd unversioned f
18180 69 6c 65 73 20 61 73 20 70 61 72 74 0a 2a 2a 20  iles as part.** 
18190 6f 66 20 61 20 22 66 6f 73 73 69 6c 20 63 6c 6f  of a "fossil clo
181a0 6e 65 22 20 6f 72 20 22 66 6f 73 73 69 6c 20 73  ne" or "fossil s
181b0 79 6e 63 22 20 63 6f 6d 6d 61 6e 64 2e 20 20 54  ync" command.  T
181c0 68 65 0a 2a 2a 20 64 65 66 61 75 6c 74 20 69 73  he.** default is
181d0 20 66 61 6c 73 65 2c 20 69 6e 20 77 68 69 63 68   false, in which
181e0 20 63 61 73 65 20 74 68 65 20 2d 75 20 6f 70 74   case the -u opt
181f0 69 6f 6e 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64  ion is.** needed
18200 20 74 6f 20 63 6c 6f 6e 65 20 6f 72 20 73 79 6e   to clone or syn
18210 63 20 75 6e 76 65 72 73 69 6f 6e 65 64 20 66 69  c unversioned fi
18220 6c 65 73 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 45  les..*/./*.** SE
18230 54 54 49 4e 47 3a 20 77 65 62 2d 62 72 6f 77 73  TTING: web-brows
18240 65 72 20 20 20 20 20 20 77 69 64 74 68 3d 33 30  er      width=30
18250 0a 2a 2a 20 41 20 73 68 65 6c 6c 20 63 6f 6d 6d  .** A shell comm
18260 61 6e 64 20 75 73 65 64 20 74 6f 20 6c 61 75 6e  and used to laun
18270 63 68 20 79 6f 75 72 20 70 72 65 66 65 72 72 65  ch your preferre
18280 64 0a 2a 2a 20 77 65 62 20 62 72 6f 77 73 65 72  d.** web browser
18290 20 77 68 65 6e 20 67 69 76 65 6e 20 61 20 55 52   when given a UR
182a0 4c 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  L as an argument
182b0 2e 0a 2a 2a 20 44 65 66 61 75 6c 74 73 20 74 6f  ..** Defaults to
182c0 20 22 73 74 61 72 74 22 20 6f 6e 20 77 69 6e 64   "start" on wind
182d0 6f 77 73 2c 20 22 6f 70 65 6e 22 20 6f 6e 20 4d  ows, "open" on M
182e0 61 63 2c 0a 2a 2a 20 61 6e 64 20 22 66 69 72 65  ac,.** and "fire
182f0 66 6f 78 22 20 6f 6e 20 55 6e 69 78 2e 0a 2a 2f  fox" on Unix..*/
18300 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 75 70 20  ../*.** Look up 
18310 61 20 63 6f 6e 74 72 6f 6c 20 73 65 74 74 69 6e  a control settin
18320 67 20 62 79 20 69 74 73 20 6e 61 6d 65 2e 20 20  g by its name.  
18330 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
18340 20 74 6f 20 74 68 65 20 53 65 74 74 69 6e 67 0a   to the Setting.
18350 2a 2a 20 6f 62 6a 65 63 74 2c 20 6f 72 20 4e 55  ** object, or NU
18360 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  LL if there is n
18370 6f 20 73 75 63 68 20 73 65 74 74 69 6e 67 2e 0a  o such setting..
18380 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 6f 77 50 72  **.** If allowPr
18390 65 66 69 78 20 69 73 20 74 72 75 65 2c 20 74 68  efix is true, th
183a0 65 6e 20 74 68 65 20 53 65 74 74 69 6e 67 20 72  en the Setting r
183b0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 66  eturned is the f
183c0 69 72 73 74 20 6f 6e 65 20 66 6f 72 0a 2a 2a 20  irst one for.** 
183d0 77 68 69 63 68 20 7a 4e 61 6d 65 20 69 73 20 61  which zName is a
183e0 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 53   prefix of the S
183f0 65 74 74 69 6e 67 20 6e 61 6d 65 2e 0a 2a 2f 0a  etting name..*/.
18400 53 65 74 74 69 6e 67 20 2a 64 62 5f 66 69 6e 64  Setting *db_find
18410 5f 73 65 74 74 69 6e 67 28 63 6f 6e 73 74 20 63  _setting(const c
18420 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
18430 61 6c 6c 6f 77 50 72 65 66 69 78 29 7b 0a 20 20  allowPrefix){.  
18440 69 6e 74 20 6c 77 72 2c 20 6d 69 64 2c 20 75 70  int lwr, mid, up
18450 72 2c 20 63 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  r, c;.  int n = 
18460 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4e 61 6d  (int)strlen(zNam
18470 65 29 20 2b 20 21 61 6c 6c 6f 77 50 72 65 66 69  e) + !allowPrefi
18480 78 3b 0a 20 20 69 6e 74 20 6e 53 65 74 74 69 6e  x;.  int nSettin
18490 67 3b 0a 20 20 63 6f 6e 73 74 20 53 65 74 74 69  g;.  const Setti
184a0 6e 67 20 2a 61 53 65 74 74 69 6e 67 20 3d 20 73  ng *aSetting = s
184b0 65 74 74 69 6e 67 5f 69 6e 66 6f 28 26 6e 53 65  etting_info(&nSe
184c0 74 74 69 6e 67 29 3b 0a 20 20 6c 77 72 20 3d 20  tting);.  lwr = 
184d0 30 3b 0a 20 20 75 70 72 20 3d 20 6e 53 65 74 74  0;.  upr = nSett
184e0 69 6e 67 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65  ing - 1;.  while
184f0 28 20 75 70 72 3e 3d 6c 77 72 20 29 7b 0a 20 20  ( upr>=lwr ){.  
18500 20 20 6d 69 64 20 3d 20 28 75 70 72 2b 6c 77 72    mid = (upr+lwr
18510 29 2f 32 3b 0a 20 20 20 20 63 20 3d 20 66 6f 73  )/2;.    c = fos
18520 73 69 6c 5f 73 74 72 6e 63 6d 70 28 7a 4e 61 6d  sil_strncmp(zNam
18530 65 2c 20 61 53 65 74 74 69 6e 67 5b 6d 69 64 5d  e, aSetting[mid]
18540 2e 6e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69  .name, n);.    i
18550 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
18560 75 70 72 20 3d 20 6d 69 64 20 2d 20 31 3b 0a 20  upr = mid - 1;. 
18570 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
18580 20 29 7b 0a 20 20 20 20 20 20 6c 77 72 20 3d 20   ){.      lwr = 
18590 6d 69 64 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c  mid + 1;.    }el
185a0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 61 6c  se{.      if( al
185b0 6c 6f 77 50 72 65 66 69 78 20 29 7b 0a 20 20 20  lowPrefix ){.   
185c0 20 20 20 20 20 77 68 69 6c 65 28 20 6d 69 64 3e       while( mid>
185d0 6c 77 72 20 26 26 20 66 6f 73 73 69 6c 5f 73 74  lwr && fossil_st
185e0 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 65  rncmp(zName, aSe
185f0 74 74 69 6e 67 5b 6d 69 64 2d 31 5d 2e 6e 61 6d  tting[mid-1].nam
18600 65 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  e, n)==0 ){.    
18610 20 20 20 20 20 20 6d 69 64 2d 2d 3b 0a 20 20 20        mid--;.   
18620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18630 20 20 20 20 20 72 65 74 75 72 6e 20 28 53 65 74       return (Set
18640 74 69 6e 67 2a 29 26 61 53 65 74 74 69 6e 67 5b  ting*)&aSetting[
18650 6d 69 64 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  mid];.    }.  }.
18660 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
18670 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 73 65  *.** COMMAND: se
18680 74 74 69 6e 67 73 0a 2a 2a 20 43 4f 4d 4d 41 4e  ttings.** COMMAN
18690 44 3a 20 75 6e 73 65 74 2a 0a 2a 2a 0a 2a 2a 20  D: unset*.**.** 
186a0 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 73  Usage: %fossil s
186b0 65 74 74 69 6e 67 73 20 3f 53 45 54 54 49 4e 47  ettings ?SETTING
186c0 3f 20 3f 56 41 4c 55 45 3f 20 3f 4f 50 54 49 4f  ? ?VALUE? ?OPTIO
186d0 4e 53 3f 0a 2a 2a 20 20 20 20 6f 72 3a 20 25 66  NS?.**    or: %f
186e0 6f 73 73 69 6c 20 75 6e 73 65 74 20 53 45 54 54  ossil unset SETT
186f0 49 4e 47 20 3f 4f 50 54 49 4f 4e 53 3f 0a 2a 2a  ING ?OPTIONS?.**
18700 0a 2a 2a 20 54 68 65 20 22 73 65 74 74 69 6e 67  .** The "setting
18710 73 22 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 20  s" command with 
18720 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6c 69 73  no arguments lis
18730 74 73 20 61 6c 6c 20 73 65 74 74 69 6e 67 73 20  ts all settings 
18740 61 6e 64 20 74 68 65 69 72 0a 2a 2a 20 76 61 6c  and their.** val
18750 75 65 73 2e 20 20 57 69 74 68 20 6a 75 73 74 20  ues.  With just 
18760 61 20 53 45 54 54 49 4e 47 20 6e 61 6d 65 20 69  a SETTING name i
18770 74 20 73 68 6f 77 73 20 74 68 65 20 63 75 72 72  t shows the curr
18780 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 61  ent value of tha
18790 74 20 73 65 74 74 69 6e 67 2e 0a 2a 2a 20 57 69  t setting..** Wi
187a0 74 68 20 61 20 56 41 4c 55 45 20 61 72 67 75 6d  th a VALUE argum
187b0 65 6e 74 20 69 74 20 63 68 61 6e 67 65 73 20 74  ent it changes t
187c0 68 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 20  he property for 
187d0 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 70 6f  the current repo
187e0 73 69 74 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 53 65  sitory..**.** Se
187f0 74 74 69 6e 67 73 20 6d 61 72 6b 65 64 20 61 73  ttings marked as
18800 20 76 65 72 73 69 6f 6e 61 62 6c 65 20 61 72 65   versionable are
18810 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74   overridden by t
18820 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
18830 68 65 0a 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 64  he.** file named
18840 20 2e 66 6f 73 73 69 6c 2d 73 65 74 74 69 6e 67   .fossil-setting
18850 73 2f 50 52 4f 50 45 52 54 59 20 69 6e 20 74 68  s/PROPERTY in th
18860 65 20 63 68 65 63 6b 2d 6f 75 74 20 72 6f 6f 74  e check-out root
18870 2c 20 69 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c  , if that.** fil
18880 65 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  e exists..**.** 
18890 54 68 65 20 22 75 6e 73 65 74 22 20 63 6f 6d 6d  The "unset" comm
188a0 61 6e 64 20 63 6c 65 61 72 73 20 61 20 73 65 74  and clears a set
188b0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74  ting..**.** Sett
188c0 69 6e 67 73 20 63 61 6e 20 68 61 76 65 20 62 6f  ings can have bo
188d0 74 68 20 61 20 22 6c 6f 63 61 6c 22 20 72 65 70  th a "local" rep
188e0 6f 73 69 74 6f 72 79 2d 6f 6e 6c 79 20 76 61 6c  ository-only val
188f0 75 65 20 61 6e 64 20 22 67 6c 6f 62 61 6c 22 20  ue and "global" 
18900 76 61 6c 75 65 0a 2a 2a 20 74 68 61 74 20 61 70  value.** that ap
18910 70 6c 69 65 73 20 74 6f 20 61 6c 6c 20 72 65 70  plies to all rep
18920 6f 73 69 74 6f 72 69 65 73 2e 20 20 54 68 65 20  ositories.  The 
18930 6c 6f 63 61 6c 20 76 61 6c 75 65 73 20 61 72 65  local values are
18940 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a   stored in the.*
18950 2a 20 22 63 6f 6e 66 69 67 22 20 74 61 62 6c 65  * "config" table
18960 20 6f 66 20 74 68 65 20 72 65 70 6f 73 69 74 6f   of the reposito
18970 72 79 20 61 6e 64 20 74 68 65 20 67 6c 6f 62 61  ry and the globa
18980 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
18990 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 24 48  red in the.** $H
189a0 4f 4d 45 2f 2e 66 6f 73 73 69 6c 20 66 69 6c 65  OME/.fossil file
189b0 20 6f 6e 20 75 6e 69 78 20 6f 72 20 69 6e 20 74   on unix or in t
189c0 68 65 20 25 4c 4f 43 41 4c 41 50 50 44 41 54 41  he %LOCALAPPDATA
189d0 25 2f 5f 66 6f 73 73 69 6c 20 66 69 6c 65 20 6f  %/_fossil file o
189e0 6e 20 57 69 6e 64 6f 77 73 2e 0a 2a 2a 20 49 66  n Windows..** If
189f0 20 62 6f 74 68 20 61 20 6c 6f 63 61 6c 20 61 6e   both a local an
18a00 64 20 61 20 67 6c 6f 62 61 6c 20 76 61 6c 75 65  d a global value
18a10 20 65 78 69 73 74 73 20 66 6f 72 20 61 20 73 65   exists for a se
18a20 74 74 69 6e 67 2c 20 74 68 65 20 6c 6f 63 61 6c  tting, the local
18a30 20 76 61 6c 75 65 0a 2a 2a 20 74 61 6b 65 73 20   value.** takes 
18a40 70 72 65 63 65 64 65 6e 63 65 2e 20 20 54 68 69  precedence.  Thi
18a50 73 20 63 6f 6d 6d 61 6e 64 20 6e 6f 72 6d 61 6c  s command normal
18a60 6c 79 20 6f 70 65 72 61 74 65 73 20 6f 6e 20 74  ly operates on t
18a70 68 65 20 6c 6f 63 61 6c 20 73 65 74 74 69 6e 67  he local setting
18a80 73 2e 0a 2a 2a 20 55 73 65 20 74 68 65 20 2d 2d  s..** Use the --
18a90 67 6c 6f 62 61 6c 20 6f 70 74 69 6f 6e 20 74 6f  global option to
18aa0 20 63 68 61 6e 67 65 20 67 6c 6f 62 61 6c 20 73   change global s
18ab0 65 74 74 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 4f  ettings..**.** O
18ac0 70 74 69 6f 6e 73 3a 0a 2a 2a 20 20 20 2d 2d 67  ptions:.**   --g
18ad0 6c 6f 62 61 6c 20 20 20 73 65 74 20 6f 72 20 75  lobal   set or u
18ae0 6e 73 65 74 20 74 68 65 20 67 69 76 65 6e 20 70  nset the given p
18af0 72 6f 70 65 72 74 79 20 67 6c 6f 62 61 6c 6c 79  roperty globally
18b00 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 20   instead of.**  
18b10 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 74              sett
18b20 69 6e 67 20 6f 72 20 75 6e 73 65 74 74 69 6e 67  ing or unsetting
18b30 20 69 74 20 66 6f 72 20 74 68 65 20 6f 70 65 6e   it for the open
18b40 20 72 65 70 6f 73 69 74 6f 72 79 20 6f 6e 6c 79   repository only
18b50 2e 0a 2a 2a 0a 2a 2a 20 20 20 2d 2d 65 78 61 63  ..**.**   --exac
18b60 74 20 20 20 20 6f 6e 6c 79 20 63 6f 6e 73 69 64  t    only consid
18b70 65 72 20 65 78 61 63 74 20 6e 61 6d 65 20 6d 61  er exact name ma
18b80 74 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  tches..**.** See
18b90 20 61 6c 73 6f 3a 20 63 6f 6e 66 69 67 75 72 61   also: configura
18ba0 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 65 74  tion.*/.void set
18bb0 74 69 6e 67 5f 63 6d 64 28 76 6f 69 64 29 7b 0a  ting_cmd(void){.
18bc0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 67    int i;.  int g
18bd0 6c 6f 62 61 6c 46 6c 61 67 20 3d 20 66 69 6e 64  lobalFlag = find
18be0 5f 6f 70 74 69 6f 6e 28 22 67 6c 6f 62 61 6c 22  _option("global"
18bf0 2c 22 67 22 2c 30 29 21 3d 30 3b 0a 20 20 69 6e  ,"g",0)!=0;.  in
18c00 74 20 65 78 61 63 74 46 6c 61 67 20 3d 20 66 69  t exactFlag = fi
18c10 6e 64 5f 6f 70 74 69 6f 6e 28 22 65 78 61 63 74  nd_option("exact
18c20 22 2c 30 2c 30 29 21 3d 30 3b 0a 20 20 69 6e 74  ",0,0)!=0;.  int
18c30 20 75 6e 73 65 74 46 6c 61 67 20 3d 20 67 2e 61   unsetFlag = g.a
18c40 72 67 76 5b 31 5d 5b 30 5d 3d 3d 27 75 27 3b 0a  rgv[1][0]=='u';.
18c50 20 20 69 6e 74 20 6e 53 65 74 74 69 6e 67 3b 0a    int nSetting;.
18c60 20 20 63 6f 6e 73 74 20 53 65 74 74 69 6e 67 20    const Setting 
18c70 2a 61 53 65 74 74 69 6e 67 20 3d 20 73 65 74 74  *aSetting = sett
18c80 69 6e 67 5f 69 6e 66 6f 28 26 6e 53 65 74 74 69  ing_info(&nSetti
18c90 6e 67 29 3b 0a 20 20 66 69 6e 64 5f 72 65 70 6f  ng);.  find_repo
18ca0 73 69 74 6f 72 79 5f 6f 70 74 69 6f 6e 28 29 3b  sitory_option();
18cb0 0a 20 20 76 65 72 69 66 79 5f 61 6c 6c 5f 6f 70  .  verify_all_op
18cc0 74 69 6f 6e 73 28 29 3b 0a 20 20 64 62 5f 6f 70  tions();.  db_op
18cd0 65 6e 5f 63 6f 6e 66 69 67 28 31 2c 20 30 29 3b  en_config(1, 0);
18ce0 0a 20 20 69 66 28 20 21 67 6c 6f 62 61 6c 46 6c  .  if( !globalFl
18cf0 61 67 20 29 7b 0a 20 20 20 20 64 62 5f 66 69 6e  ag ){.    db_fin
18d00 64 5f 61 6e 64 5f 6f 70 65 6e 5f 72 65 70 6f 73  d_and_open_repos
18d10 69 74 6f 72 79 28 4f 50 45 4e 5f 41 4e 59 5f 53  itory(OPEN_ANY_S
18d20 43 48 45 4d 41 20 7c 20 4f 50 45 4e 5f 4f 4b 5f  CHEMA | OPEN_OK_
18d30 4e 4f 54 5f 46 4f 55 4e 44 2c 20 30 29 3b 0a 20  NOT_FOUND, 0);. 
18d40 20 7d 0a 20 20 69 66 28 20 21 67 2e 72 65 70 6f   }.  if( !g.repo
18d50 73 69 74 6f 72 79 4f 70 65 6e 20 29 7b 0a 20 20  sitoryOpen ){.  
18d60 20 20 67 6c 6f 62 61 6c 46 6c 61 67 20 3d 20 31    globalFlag = 1
18d70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 6e 73 65  ;.  }.  if( unse
18d80 74 46 6c 61 67 20 26 26 20 67 2e 61 72 67 63 21  tFlag && g.argc!
18d90 3d 33 20 29 7b 0a 20 20 20 20 75 73 61 67 65 28  =3 ){.    usage(
18da0 22 50 52 4f 50 45 52 54 59 20 3f 2d 67 6c 6f 62  "PROPERTY ?-glob
18db0 61 6c 3f 22 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  al?");.  }..  if
18dc0 28 20 67 2e 61 72 67 63 3d 3d 32 20 29 7b 0a 20  ( g.argc==2 ){. 
18dd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
18de0 65 74 74 69 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20  etting; i++){.  
18df0 20 20 20 20 70 72 69 6e 74 5f 73 65 74 74 69 6e      print_settin
18e00 67 28 26 61 53 65 74 74 69 6e 67 5b 69 5d 29 3b  g(&aSetting[i]);
18e10 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
18e20 66 28 20 67 2e 61 72 67 63 3d 3d 33 20 7c 7c 20  f( g.argc==3 || 
18e30 67 2e 61 72 67 63 3d 3d 34 20 29 7b 0a 20 20 20  g.argc==4 ){.   
18e40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
18e50 6d 65 20 3d 20 67 2e 61 72 67 76 5b 32 5d 3b 0a  me = g.argv[2];.
18e60 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74      int n = (int
18e70 29 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a  )strlen(zName);.
18e80 20 20 20 20 63 6f 6e 73 74 20 53 65 74 74 69 6e      const Settin
18e90 67 20 2a 70 53 65 74 74 69 6e 67 20 3d 20 64 62  g *pSetting = db
18ea0 5f 66 69 6e 64 5f 73 65 74 74 69 6e 67 28 7a 4e  _find_setting(zN
18eb0 61 6d 65 2c 20 21 65 78 61 63 74 46 6c 61 67 29  ame, !exactFlag)
18ec0 3b 0a 20 20 20 20 69 66 28 20 70 53 65 74 74 69  ;.    if( pSetti
18ed0 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ng==0 ){.      f
18ee0 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e 6f 20  ossil_fatal("no 
18ef0 73 75 63 68 20 73 65 74 74 69 6e 67 3a 20 25 73  such setting: %s
18f00 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  ", zName);.    }
18f10 0a 20 20 20 20 69 66 28 20 67 6c 6f 62 61 6c 46  .    if( globalF
18f20 6c 61 67 20 26 26 20 66 6f 73 73 69 6c 5f 73 74  lag && fossil_st
18f30 72 63 6d 70 28 70 53 65 74 74 69 6e 67 2d 3e 6e  rcmp(pSetting->n
18f40 61 6d 65 2c 20 22 6d 61 6e 69 66 65 73 74 22 29  ame, "manifest")
18f50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 73  ==0 ){.      fos
18f60 73 69 6c 5f 66 61 74 61 6c 28 22 63 61 6e 6e 6f  sil_fatal("canno
18f70 74 20 73 65 74 20 27 6d 61 6e 69 66 65 73 74 27  t set 'manifest'
18f80 20 67 6c 6f 62 61 6c 6c 79 22 29 3b 0a 20 20 20   globally");.   
18f90 20 7d 0a 20 20 20 20 69 66 28 20 75 6e 73 65 74   }.    if( unset
18fa0 46 6c 61 67 20 7c 7c 20 67 2e 61 72 67 63 3d 3d  Flag || g.argc==
18fb0 34 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  4 ){.      int i
18fc0 73 4d 61 6e 69 66 65 73 74 20 3d 20 66 6f 73 73  sManifest = foss
18fd0 69 6c 5f 73 74 72 63 6d 70 28 70 53 65 74 74 69  il_strcmp(pSetti
18fe0 6e 67 2d 3e 6e 61 6d 65 2c 20 22 6d 61 6e 69 66  ng->name, "manif
18ff0 65 73 74 22 29 3d 3d 30 3b 0a 20 20 20 20 20 20  est")==0;.      
19000 69 66 28 20 6e 21 3d 73 74 72 6c 65 6e 28 70 53  if( n!=strlen(pS
19010 65 74 74 69 6e 67 5b 30 5d 2e 6e 61 6d 65 29 20  etting[0].name) 
19020 26 26 20 70 53 65 74 74 69 6e 67 5b 31 5d 2e 6e  && pSetting[1].n
19030 61 6d 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ame &&.         
19040 20 66 6f 73 73 69 6c 5f 73 74 72 6e 63 6d 70 28   fossil_strncmp(
19050 70 53 65 74 74 69 6e 67 5b 31 5d 2e 6e 61 6d 65  pSetting[1].name
19060 2c 20 7a 4e 61 6d 65 2c 20 6e 29 3d 3d 30 20 29  , zName, n)==0 )
19070 7b 0a 20 20 20 20 20 20 20 20 42 6c 6f 62 20 78  {.        Blob x
19080 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  ;.        int i;
19090 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 69 6e  .        blob_in
190a0 69 74 28 26 78 2c 30 2c 30 29 3b 0a 20 20 20 20  it(&x,0,0);.    
190b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 53 65      for(i=0; pSe
190c0 74 74 69 6e 67 5b 69 5d 2e 6e 61 6d 65 3b 20 69  tting[i].name; i
190d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
190e0 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 6e 63 6d  f( fossil_strncm
190f0 70 28 70 53 65 74 74 69 6e 67 5b 69 5d 2e 6e 61  p(pSetting[i].na
19100 6d 65 2c 7a 4e 61 6d 65 2c 6e 29 21 3d 30 20 29  me,zName,n)!=0 )
19110 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19120 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
19130 78 2c 20 22 20 25 73 22 2c 20 70 53 65 74 74 69  x, " %s", pSetti
19140 6e 67 5b 69 5d 2e 6e 61 6d 65 29 3b 0a 20 20 20  ng[i].name);.   
19150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
19160 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 61 6d 62  ossil_fatal("amb
19170 69 67 75 6f 75 73 20 73 65 74 74 69 6e 67 20 5c  iguous setting \
19180 22 25 73 5c 22 20 2d 20 6d 69 67 68 74 20 62 65  "%s\" - might be
19190 3a 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  :%s",.          
191a0 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
191b0 2c 20 62 6c 6f 62 5f 73 74 72 28 26 78 29 29 3b  , blob_str(&x));
191c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
191d0 66 28 20 67 6c 6f 62 61 6c 46 6c 61 67 20 26 26  f( globalFlag &&
191e0 20 69 73 4d 61 6e 69 66 65 73 74 20 29 7b 0a 20   isManifest ){. 
191f0 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61         fossil_fa
19200 74 61 6c 28 22 63 61 6e 6e 6f 74 20 73 65 74 20  tal("cannot set 
19210 27 6d 61 6e 69 66 65 73 74 27 20 67 6c 6f 62 61  'manifest' globa
19220 6c 6c 79 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lly");.      }. 
19230 20 20 20 20 20 69 66 28 20 75 6e 73 65 74 46 6c       if( unsetFl
19240 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62  ag ){.        db
19250 5f 75 6e 73 65 74 28 70 53 65 74 74 69 6e 67 2d  _unset(pSetting-
19260 3e 6e 61 6d 65 2c 20 67 6c 6f 62 61 6c 46 6c 61  >name, globalFla
19270 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
19280 0a 20 20 20 20 20 20 20 20 64 62 5f 73 65 74 28  .        db_set(
19290 70 53 65 74 74 69 6e 67 2d 3e 6e 61 6d 65 2c 20  pSetting->name, 
192a0 67 2e 61 72 67 76 5b 33 5d 2c 20 67 6c 6f 62 61  g.argv[3], globa
192b0 6c 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 7d 0a  lFlag);.      }.
192c0 20 20 20 20 20 20 69 66 28 20 69 73 4d 61 6e 69        if( isMani
192d0 66 65 73 74 20 26 26 20 67 2e 6c 6f 63 61 6c 4f  fest && g.localO
192e0 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  pen ){.        m
192f0 61 6e 69 66 65 73 74 5f 74 6f 5f 64 69 73 6b 28  anifest_to_disk(
19300 64 62 5f 6c 67 65 74 5f 69 6e 74 28 22 63 68 65  db_lget_int("che
19310 63 6b 6f 75 74 22 2c 20 30 29 29 3b 0a 20 20 20  ckout", 0));.   
19320 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
19330 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
19340 74 74 69 6e 67 2d 3e 6e 61 6d 65 20 29 7b 0a 20  tting->name ){. 
19350 20 20 20 20 20 20 20 69 66 28 20 65 78 61 63 74         if( exact
19360 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
19370 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72    if( fossil_str
19380 63 6d 70 28 70 53 65 74 74 69 6e 67 2d 3e 6e 61  cmp(pSetting->na
19390 6d 65 2c 7a 4e 61 6d 65 29 21 3d 30 20 29 20 62  me,zName)!=0 ) b
193a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
193b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
193c0 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 6e 63 6d  f( fossil_strncm
193d0 70 28 70 53 65 74 74 69 6e 67 2d 3e 6e 61 6d 65  p(pSetting->name
193e0 2c 7a 4e 61 6d 65 2c 6e 29 21 3d 30 20 29 20 62  ,zName,n)!=0 ) b
193f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
19400 20 20 20 20 20 20 20 20 70 72 69 6e 74 5f 73 65          print_se
19410 74 74 69 6e 67 28 70 53 65 74 74 69 6e 67 29 3b  tting(pSetting);
19420 0a 20 20 20 20 20 20 20 20 70 53 65 74 74 69 6e  .        pSettin
19430 67 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  g++;.      }.   
19440 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
19450 75 73 61 67 65 28 22 3f 50 52 4f 50 45 52 54 59  usage("?PROPERTY
19460 3f 20 3f 56 41 4c 55 45 3f 20 3f 2d 67 6c 6f 62  ? ?VALUE? ?-glob
19470 61 6c 3f 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  al?");.  }.}../*
19480 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 69 6e  .** The input in
19490 20 61 20 74 69 6d 65 73 70 61 6e 20 6d 65 61 73   a timespan meas
194a0 75 72 65 64 20 69 6e 20 64 61 79 73 2e 20 20 52  ured in days.  R
194b0 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 77  eturn a string w
194c0 68 69 63 68 0a 2a 2a 20 64 65 73 63 72 69 62 65  hich.** describe
194d0 73 20 74 68 61 74 20 74 69 6d 65 73 70 61 6e 20  s that timespan 
194e0 69 6e 20 75 6e 69 74 73 20 6f 66 20 73 65 63 6f  in units of seco
194f0 6e 64 73 2c 20 6d 69 6e 75 74 65 73 2c 20 68 6f  nds, minutes, ho
19500 75 72 73 2c 20 64 61 79 73 2c 0a 2a 2a 20 6f 72  urs, days,.** or
19510 20 79 65 61 72 73 2c 20 64 65 70 65 6e 64 69 6e   years, dependin
19520 67 20 6f 6e 20 69 74 73 20 64 75 72 61 74 69 6f  g on its duratio
19530 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 64 62 5f 74  n..*/.char *db_t
19540 69 6d 65 73 70 61 6e 5f 6e 61 6d 65 28 64 6f 75  imespan_name(dou
19550 62 6c 65 20 72 53 70 61 6e 29 7b 0a 20 20 69 66  ble rSpan){.  if
19560 28 20 72 53 70 61 6e 3c 30 20 29 20 72 53 70 61  ( rSpan<0 ) rSpa
19570 6e 20 3d 20 2d 72 53 70 61 6e 3b 0a 20 20 72 53  n = -rSpan;.  rS
19580 70 61 6e 20 2a 3d 20 32 34 2e 30 2a 33 36 30 30  pan *= 24.0*3600
19590 2e 30 3b 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .0;  /* Convert 
195a0 75 6e 69 74 73 20 74 6f 20 73 65 63 6f 6e 64 73  units to seconds
195b0 20 2a 2f 0a 20 20 69 66 28 20 72 53 70 61 6e 3c   */.  if( rSpan<
195c0 31 32 30 2e 30 20 29 7b 0a 20 20 20 20 72 65 74  120.0 ){.    ret
195d0 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  urn sqlite3_mpri
195e0 6e 74 66 28 22 25 2e 31 66 20 73 65 63 6f 6e 64  ntf("%.1f second
195f0 73 22 2c 20 72 53 70 61 6e 29 3b 0a 20 20 7d 0a  s", rSpan);.  }.
19600 20 20 72 53 70 61 6e 20 2f 3d 20 36 30 2e 30 3b    rSpan /= 60.0;
19610 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76           /* Conv
19620 65 72 74 20 75 6e 69 74 73 20 74 6f 20 6d 69 6e  ert units to min
19630 75 74 65 73 20 2a 2f 0a 20 20 69 66 28 20 72 53  utes */.  if( rS
19640 70 61 6e 3c 39 30 2e 30 20 29 7b 0a 20 20 20 20  pan<90.0 ){.    
19650 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
19660 70 72 69 6e 74 66 28 22 25 2e 31 66 20 6d 69 6e  printf("%.1f min
19670 75 74 65 73 22 2c 20 72 53 70 61 6e 29 3b 0a 20  utes", rSpan);. 
19680 20 7d 0a 20 20 72 53 70 61 6e 20 2f 3d 20 36 30   }.  rSpan /= 60
19690 2e 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  .0;         /* C
196a0 6f 6e 76 65 72 74 20 75 6e 69 74 73 20 74 6f 20  onvert units to 
196b0 68 6f 75 72 73 20 2a 2f 0a 20 20 69 66 28 20 72  hours */.  if( r
196c0 53 70 61 6e 3c 3d 34 38 2e 30 20 29 7b 0a 20 20  Span<=48.0 ){.  
196d0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
196e0 5f 6d 70 72 69 6e 74 66 28 22 25 2e 31 66 20 68  _mprintf("%.1f h
196f0 6f 75 72 73 22 2c 20 72 53 70 61 6e 29 3b 0a 20  ours", rSpan);. 
19700 20 7d 0a 20 20 72 53 70 61 6e 20 2f 3d 20 32 34   }.  rSpan /= 24
19710 2e 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  .0;         /* C
19720 6f 6e 76 65 72 74 20 75 6e 69 74 73 20 74 6f 20  onvert units to 
19730 64 61 79 73 20 2a 2f 0a 20 20 69 66 28 20 72 53  days */.  if( rS
19740 70 61 6e 3c 3d 33 36 35 2e 30 20 29 7b 0a 20 20  pan<=365.0 ){.  
19750 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
19760 5f 6d 70 72 69 6e 74 66 28 22 25 2e 31 66 20 64  _mprintf("%.1f d
19770 61 79 73 22 2c 20 72 53 70 61 6e 29 3b 0a 20 20  ays", rSpan);.  
19780 7d 0a 20 20 72 53 70 61 6e 20 2f 3d 20 33 35 36  }.  rSpan /= 356
19790 2e 32 34 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  .24;         /* 
197a0 43 6f 6e 76 65 72 74 20 75 6e 69 74 73 20 74 6f  Convert units to
197b0 20 79 65 61 72 73 20 2a 2f 0a 20 20 72 65 74 75   years */.  retu
197c0 72 6e 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  rn sqlite3_mprin
197d0 74 66 28 22 25 2e 31 66 20 79 65 61 72 73 22 2c  tf("%.1f years",
197e0 20 72 53 70 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   rSpan);.}../*.*
197f0 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d  * COMMAND: test-
19800 74 69 6d 65 73 70 61 6e 0a 2a 2a 0a 2a 2a 20 55  timespan.**.** U
19810 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 74 65  sage: %fossil te
19820 73 74 2d 74 69 6d 65 73 70 61 6e 20 54 49 4d 45  st-timespan TIME
19830 53 54 41 4d 50 0a 2a 2a 0a 2a 2a 20 50 72 69 6e  STAMP.**.** Prin
19840 74 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74  t the approximat
19850 65 20 73 70 61 6e 20 6f 66 20 74 69 6d 65 20 66  e span of time f
19860 72 6f 6d 20 6e 6f 77 20 74 6f 20 54 49 4d 45 53  rom now to TIMES
19870 54 41 4d 50 2e 0a 2a 2f 0a 76 6f 69 64 20 74 65  TAMP..*/.void te
19880 73 74 5f 74 69 6d 65 73 70 61 6e 5f 63 6d 64 28  st_timespan_cmd(
19890 76 6f 69 64 29 7b 0a 20 20 64 6f 75 62 6c 65 20  void){.  double 
198a0 72 44 69 66 66 3b 0a 20 20 69 66 28 20 67 2e 61  rDiff;.  if( g.a
198b0 72 67 63 21 3d 33 20 29 20 75 73 61 67 65 28 22  rgc!=3 ) usage("
198c0 54 49 4d 45 53 54 41 4d 50 22 29 3b 0a 20 20 73  TIMESTAMP");.  s
198d0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65  qlite3_open(":me
198e0 6d 6f 72 79 3a 22 2c 20 26 67 2e 64 62 29 3b 0a  mory:", &g.db);.
198f0 20 20 72 44 69 66 66 20 3d 20 64 62 5f 64 6f 75    rDiff = db_dou
19900 62 6c 65 28 30 2e 30 2c 20 22 53 45 4c 45 43 54  ble(0.0, "SELECT
19910 20 6a 75 6c 69 61 6e 64 61 79 28 27 6e 6f 77 27   julianday('now'
19920 29 20 2d 20 6a 75 6c 69 61 6e 64 61 79 28 25 51  ) - julianday(%Q
19930 29 22 2c 20 67 2e 61 72 67 76 5b 32 5d 29 3b 0a  )", g.argv[2]);.
19940 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
19950 54 69 6d 65 20 64 69 66 66 65 72 65 6e 63 65 73  Time differences
19960 3a 20 25 73 5c 6e 22 2c 20 64 62 5f 74 69 6d 65  : %s\n", db_time
19970 73 70 61 6e 5f 6e 61 6d 65 28 72 44 69 66 66 29  span_name(rDiff)
19980 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  );.  sqlite3_clo
19990 73 65 28 67 2e 64 62 29 3b 0a 20 20 67 2e 64 62  se(g.db);.  g.db
199a0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
199b0 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 77 69 74  OMMAND: test-wit
199c0 68 6f 75 74 2d 72 6f 77 69 64 0a 2a 2a 0a 2a 2a  hout-rowid.**.**
199d0 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20   Usage: %fossil 
199e0 74 65 73 74 2d 77 69 74 68 6f 75 74 2d 72 6f 77  test-without-row
199f0 69 64 20 46 49 4c 45 4e 41 4d 45 2e 2e 2e 0a 2a  id FILENAME....*
19a00 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
19a10 46 6f 73 73 69 6c 20 72 65 70 6f 73 69 74 6f 72  Fossil repositor
19a20 79 20 46 49 4c 45 4e 41 4d 45 20 74 6f 20 6d 61  y FILENAME to ma
19a30 6b 65 20 75 73 65 20 6f 66 20 74 68 65 20 57 49  ke use of the WI
19a40 54 48 4f 55 54 20 52 4f 57 49 44 0a 2a 2a 20 6f  THOUT ROWID.** o
19a50 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 46 49  ptimization.  FI
19a60 4c 45 4e 41 4d 45 20 63 61 6e 20 61 6c 73 6f 20  LENAME can also 
19a70 62 65 20 74 68 65 20 7e 2f 2e 66 6f 73 73 69 6c  be the ~/.fossil
19a80 20 66 69 6c 65 20 6f 72 20 61 20 6c 6f 63 61 6c   file or a local
19a90 0a 2a 2a 20 2e 66 73 6c 63 6b 6f 75 74 20 6f 72  .** .fslckout or
19aa0 20 5f 46 4f 53 53 49 4c 5f 20 66 69 6c 65 2e 0a   _FOSSIL_ file..
19ab0 2a 2a 0a 2a 2a 20 54 68 65 20 70 75 72 70 6f 73  **.** The purpos
19ac0 65 20 6f 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e  e of this comman
19ad0 64 20 69 73 20 66 6f 72 20 74 65 73 74 69 6e 67  d is for testing
19ae0 20 74 68 65 20 57 49 54 48 4f 55 54 20 52 4f 57   the WITHOUT ROW
19af0 49 44 20 63 61 70 61 62 69 6c 69 74 69 65 73 0a  ID capabilities.
19b00 2a 2a 20 6f 66 20 53 51 4c 69 74 65 2e 20 20 54  ** of SQLite.  T
19b10 68 65 72 65 20 69 73 20 6e 6f 20 62 69 67 20 61  here is no big a
19b20 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e  dvantage to usin
19b30 67 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  g WITHOUT ROWID 
19b40 69 6e 20 46 6f 73 73 69 6c 2e 0a 2a 2a 0a 2a 2a  in Fossil..**.**
19b50 20 4f 70 74 69 6f 6e 73 3a 0a 2a 2a 20 20 20 20   Options:.**    
19b60 2d 2d 64 72 79 72 75 6e 20 7c 20 2d 6e 20 20 20  --dryrun | -n   
19b70 20 20 20 20 20 20 4e 6f 20 63 68 61 6e 67 65 73        No changes
19b80 2e 20 20 4a 75 73 74 20 70 72 69 6e 74 20 77 68  .  Just print wh
19b90 61 74 20 77 6f 75 6c 64 20 68 61 70 70 65 6e 2e  at would happen.
19ba0 0a 2a 2f 0a 76 6f 69 64 20 74 65 73 74 5f 77 69  .*/.void test_wi
19bb0 74 68 6f 75 74 5f 72 6f 77 69 64 28 76 6f 69 64  thout_rowid(void
19bc0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
19bd0 20 53 74 6d 74 20 71 3b 0a 20 20 42 6c 6f 62 20   Stmt q;.  Blob 
19be0 61 6c 6c 53 71 6c 3b 0a 20 20 69 6e 74 20 64 72  allSql;.  int dr
19bf0 79 52 75 6e 20 3d 20 66 69 6e 64 5f 6f 70 74 69  yRun = find_opti
19c00 6f 6e 28 22 64 72 79 2d 72 75 6e 22 2c 20 22 6e  on("dry-run", "n
19c10 22 2c 20 30 29 21 3d 30 3b 0a 20 20 66 6f 72 28  ", 0)!=0;.  for(
19c20 69 3d 32 3b 20 69 3c 67 2e 61 72 67 63 3b 20 69  i=2; i<g.argc; i
19c30 2b 2b 29 7b 0a 20 20 20 20 64 62 5f 6f 70 65 6e  ++){.    db_open
19c40 5f 6f 72 5f 61 74 74 61 63 68 28 67 2e 61 72 67  _or_attach(g.arg
19c50 76 5b 69 5d 2c 20 22 6d 61 69 6e 22 29 3b 0a 20  v[i], "main");. 
19c60 20 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 61 6c     blob_init(&al
19c70 6c 53 71 6c 2c 20 22 42 45 47 49 4e 3b 5c 6e 22  lSql, "BEGIN;\n"
19c80 2c 20 2d 31 29 3b 0a 20 20 20 20 64 62 5f 70 72  , -1);.    db_pr
19c90 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20 20 20  epare(&q,.      
19ca0 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71  "SELECT name, sq
19cb0 6c 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69  l FROM main.sqli
19cc0 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
19cd0 20 20 22 20 57 48 45 52 45 20 74 79 70 65 3d 27    " WHERE type='
19ce0 74 61 62 6c 65 27 20 41 4e 44 20 73 71 6c 20 4e  table' AND sql N
19cf0 4f 54 20 4c 49 4b 45 20 27 25 25 57 49 54 48 4f  OT LIKE '%%WITHO
19d00 55 54 20 52 4f 57 49 44 25 25 27 22 0a 20 20 20  UT ROWID%%'".   
19d10 20 20 20 22 20 20 20 41 4e 44 20 6e 61 6d 65 20     "   AND name 
19d20 49 4e 20 28 27 67 6c 6f 62 61 6c 5f 63 6f 6e 66  IN ('global_conf
19d30 69 67 27 2c 27 73 68 75 6e 27 2c 27 63 6f 6e 63  ig','shun','conc
19d40 65 61 6c 65 64 27 2c 27 63 6f 6e 66 69 67 27 2c  ealed','config',
19d50 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
19d60 20 20 20 20 20 20 22 20 20 27 70 6c 69 6e 6b 27        "  'plink'
19d70 2c 27 74 61 67 78 72 65 66 27 2c 27 62 61 63 6b  ,'tagxref','back
19d80 6c 69 6e 6b 27 2c 27 76 63 61 63 68 65 27 29 3b  link','vcache');
19d90 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69  ".    );.    whi
19da0 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d  le( db_step(&q)=
19db0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
19dc0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
19dd0 2a 7a 54 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c  *zTName = db_col
19de0 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b  umn_text(&q, 0);
19df0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
19e00 72 20 2a 7a 4f 72 69 67 53 71 6c 20 3d 20 64 62  r *zOrigSql = db
19e10 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
19e20 20 31 29 3b 0a 20 20 20 20 20 20 42 6c 6f 62 20   1);.      Blob 
19e30 6e 65 77 53 71 6c 3b 0a 20 20 20 20 20 20 62 6c  newSql;.      bl
19e40 6f 62 5f 69 6e 69 74 28 26 6e 65 77 53 71 6c 2c  ob_init(&newSql,
19e50 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f   0, 0);.      fo
19e60 72 28 6a 3d 30 3b 20 7a 4f 72 69 67 53 71 6c 5b  r(j=0; zOrigSql[
19e70 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  j]; j++){.      
19e80 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72    if( fossil_str
19e90 6e 69 63 6d 70 28 7a 4f 72 69 67 53 71 6c 2b 6a  nicmp(zOrigSql+j
19ea0 2c 22 75 6e 69 71 75 65 22 2c 36 29 3d 3d 30 20  ,"unique",6)==0 
19eb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f  ){.          blo
19ec0 62 5f 61 70 70 65 6e 64 28 26 6e 65 77 53 71 6c  b_append(&newSql
19ed0 2c 20 7a 4f 72 69 67 53 71 6c 2c 20 6a 29 3b 0a  , zOrigSql, j);.
19ee0 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61            blob_a
19ef0 70 70 65 6e 64 28 26 6e 65 77 53 71 6c 2c 20 22  ppend(&newSql, "
19f00 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 2d 31  PRIMARY KEY", -1
19f10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  );.          zOr
19f20 69 67 53 71 6c 20 2b 3d 20 6a 2b 36 3b 0a 20 20  igSql += j+6;.  
19f30 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a          j = -1;.
19f40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19f50 7d 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  }.      blob_app
19f60 65 6e 64 28 26 6e 65 77 53 71 6c 2c 20 7a 4f 72  end(&newSql, zOr
19f70 69 67 53 71 6c 2c 20 2d 31 29 3b 0a 20 20 20 20  igSql, -1);.    
19f80 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 5f 73 71    blob_append_sq
19f90 6c 28 26 61 6c 6c 53 71 6c 2c 0a 20 20 20 20 20  l(&allSql,.     
19fa0 20 20 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45      "ALTER TABLE
19fb0 20 5c 22 25 77 5c 22 20 52 45 4e 41 4d 45 20 54   \"%w\" RENAME T
19fc0 4f 20 5c 22 78 5f 25 77 5c 22 3b 5c 6e 22 0a 20  O \"x_%w\";\n". 
19fd0 20 20 20 20 20 20 20 20 22 25 73 20 57 49 54 48          "%s WITH
19fe0 4f 55 54 20 52 4f 57 49 44 3b 5c 6e 22 0a 20 20  OUT ROWID;\n".  
19ff0 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
1a000 4e 54 4f 20 5c 22 25 77 5c 22 20 53 45 4c 45 43  NTO \"%w\" SELEC
1a010 54 20 2a 20 46 52 4f 4d 20 5c 22 78 5f 25 77 5c  T * FROM \"x_%w\
1a020 22 3b 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22  ";\n".         "
1a030 44 52 4f 50 20 54 41 42 4c 45 20 5c 22 78 5f 25  DROP TABLE \"x_%
1a040 77 5c 22 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  w\";\n",.       
1a050 20 20 7a 54 4e 61 6d 65 2c 20 7a 54 4e 61 6d 65    zTName, zTName
1a060 2c 20 62 6c 6f 62 5f 73 71 6c 5f 74 65 78 74 28  , blob_sql_text(
1a070 26 6e 65 77 53 71 6c 29 2c 20 7a 54 4e 61 6d 65  &newSql), zTName
1a080 2c 20 7a 54 4e 61 6d 65 2c 20 7a 54 4e 61 6d 65  , zTName, zTName
1a090 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
1a0a0 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 43 6f  fossil_print("Co
1a0b0 6e 76 65 72 74 69 6e 67 20 74 61 62 6c 65 20 25  nverting table %
1a0c0 73 20 6f 66 20 25 73 20 74 6f 20 57 49 54 48 4f  s of %s to WITHO
1a0d0 55 54 20 52 4f 57 49 44 2e 5c 6e 22 2c 0a 20 20  UT ROWID.\n",.  
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0f0 20 20 7a 54 4e 61 6d 65 2c 20 67 2e 61 72 67 76    zTName, g.argv
1a100 5b 69 5d 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62  [i]);.      blob
1a110 5f 72 65 73 65 74 28 26 6e 65 77 53 71 6c 29 3b  _reset(&newSql);
1a120 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f  .    }.    blob_
1a130 61 70 70 65 6e 64 5f 73 71 6c 28 26 61 6c 6c 53  append_sql(&allS
1a140 71 6c 2c 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29  ql, "COMMIT;\n")
1a150 3b 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a  ;.    db_finaliz
1a160 65 28 26 71 29 3b 0a 20 20 20 20 69 66 28 20 64  e(&q);.    if( d
1a170 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20 20 66  ryRun ){.      f
1a180 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 53 51 4c  ossil_print("SQL
1a190 20 74 68 61 74 20 77 6f 75 6c 64 20 68 61 76 65   that would have
1a1a0 20 62 65 65 6e 20 65 76 61 6c 75 61 74 65 64 3a   been evaluated:
1a1b0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 73 73  \n");.      foss
1a1c0 69 6c 5f 70 72 69 6e 74 28 22 25 2e 37 38 63 5c  il_print("%.78c\
1a1d0 6e 22 2c 20 27 2d 27 29 3b 0a 20 20 20 20 20 20  n", '-');.      
1a1e0 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 25 73  fossil_print("%s
1a1f0 22 2c 20 62 6c 6f 62 5f 73 71 6c 5f 74 65 78 74  ", blob_sql_text
1a200 28 26 61 6c 6c 53 71 6c 29 29 3b 0a 20 20 20 20  (&allSql));.    
1a210 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 5f  }else{.      db_
1a220 6d 75 6c 74 69 5f 65 78 65 63 28 22 25 73 22 2c  multi_exec("%s",
1a230 20 62 6c 6f 62 5f 73 71 6c 5f 74 65 78 74 28 26   blob_sql_text(&
1a240 61 6c 6c 53 71 6c 29 29 3b 0a 20 20 20 20 7d 0a  allSql));.    }.
1a250 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26      blob_reset(&
1a260 61 6c 6c 53 71 6c 29 3b 0a 20 20 20 20 64 62 5f  allSql);.    db_
1a270 63 6c 6f 73 65 28 31 29 3b 0a 20 20 7d 0a 7d 0a  close(1);.  }.}.
1a280 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1a290 20 74 68 65 20 61 64 6d 69 6e 6c 6f 67 20 74 61   the adminlog ta
1a2a0 62 6c 65 20 65 78 69 73 74 73 2e 20 20 43 72 65  ble exists.  Cre
1a2b0 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
1a2c0 73 20 6e 6f 74 0a 2a 2f 0a 76 6f 69 64 20 63 72  s not.*/.void cr
1a2d0 65 61 74 65 5f 61 64 6d 69 6e 5f 6c 6f 67 5f 74  eate_admin_log_t
1a2e0 61 62 6c 65 28 76 6f 69 64 29 7b 0a 20 20 73 74  able(void){.  st
1a2f0 61 74 69 63 20 69 6e 74 20 6f 6e 63 65 20 3d 20  atic int once = 
1a300 30 3b 0a 20 20 69 66 28 20 6f 6e 63 65 20 29 20  0;.  if( once ) 
1a310 72 65 74 75 72 6e 3b 0a 20 20 6f 6e 63 65 20 3d  return;.  once =
1a320 20 31 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65   1;.  db_multi_e
1a330 78 65 63 28 0a 20 20 20 20 22 43 52 45 41 54 45  xec(.    "CREATE
1a340 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
1a350 49 53 54 53 20 72 65 70 6f 73 69 74 6f 72 79 2e  ISTS repository.
1a360 61 64 6d 69 6e 5f 6c 6f 67 28 5c 6e 22 0a 20 20  admin_log(\n".  
1a370 20 20 22 20 69 64 20 49 4e 54 45 47 45 52 20 50    " id INTEGER P
1a380 52 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 0a 20  RIMARY KEY,\n". 
1a390 20 20 20 22 20 74 69 6d 65 20 49 4e 54 45 47 45     " time INTEGE
1a3a0 52 2c 20 2d 2d 20 53 65 63 6f 6e 64 73 20 73 69  R, -- Seconds si
1a3b0 6e 63 65 20 31 39 37 30 5c 6e 22 0a 20 20 20 20  nce 1970\n".    
1a3c0 22 20 70 61 67 65 20 54 45 58 54 2c 20 20 20 20  " page TEXT,    
1a3d0 2d 2d 20 70 61 74 68 20 6f 66 20 70 61 67 65 5c  -- path of page\
1a3e0 6e 22 0a 20 20 20 20 22 20 77 68 6f 20 54 45 58  n".    " who TEX
1a3f0 54 2c 20 20 20 20 20 2d 2d 20 55 73 65 72 20 77  T,     -- User w
1a400 68 6f 20 6d 61 64 65 20 74 68 65 20 63 68 61 6e  ho made the chan
1a410 67 65 5c 6e 22 0a 20 20 20 20 22 20 77 68 61 74  ge\n".    " what
1a420 20 54 45 58 54 20 20 20 20 20 2d 2d 20 57 68 61   TEXT     -- Wha
1a430 74 20 63 68 61 6e 67 65 64 5c 6e 22 0a 20 20 20  t changed\n".   
1a440 20 22 29 22 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a   ")".  );.}../*.
1a450 2a 2a 20 57 72 69 74 65 20 61 20 6d 65 73 73 61  ** Write a messa
1a460 67 65 20 69 6e 74 6f 20 74 68 65 20 61 64 6d 69  ge into the admi
1a470 6e 5f 65 76 65 6e 74 20 74 61 62 6c 65 2c 20 69  n_event table, i
1a480 66 20 61 64 6d 69 6e 20 6c 6f 67 67 69 6e 67 20  f admin logging 
1a490 69 73 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 76 69  is.** enabled vi
1a4a0 61 20 74 68 65 20 61 64 6d 69 6e 2d 6c 6f 67 20  a the admin-log 
1a4b0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70  configuration op
1a4c0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 61 64  tion..*/.void ad
1a4d0 6d 69 6e 5f 6c 6f 67 28 63 6f 6e 73 74 20 63 68  min_log(const ch
1a4e0 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
1a4f0 29 7b 0a 20 20 42 6c 6f 62 20 77 68 61 74 20 3d  ){.  Blob what =
1a500 20 65 6d 70 74 79 5f 62 6c 6f 62 3b 0a 20 20 76   empty_blob;.  v
1a510 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
1a520 20 21 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e   !db_get_boolean
1a530 28 22 61 64 6d 69 6e 2d 6c 6f 67 22 2c 20 30 29  ("admin-log", 0)
1a540 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 50 6f 74   ){.      /* Pot
1a550 65 6e 74 69 61 6c 20 6c 65 61 6b 20 68 65 72 65  ential leak here
1a560 20 28 6f 6e 20 25 7a 20 70 61 72 61 6d 73 29 20   (on %z params) 
1a570 62 75 74 0a 20 20 20 20 20 20 20 20 20 74 68 65  but.         the
1a580 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
1a590 74 6f 20 6c 65 74 20 62 6c 6f 62 5f 76 61 70 70  to let blob_vapp
1a5a0 65 6e 64 66 28 29 0a 20 20 20 20 20 20 20 20 20  endf().         
1a5b0 64 6f 20 69 74 20 62 65 6c 6f 77 2e 20 2a 2f 0a  do it below. */.
1a5c0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
1a5d0 7d 0a 20 20 63 72 65 61 74 65 5f 61 64 6d 69 6e  }.  create_admin
1a5e0 5f 6c 6f 67 5f 74 61 62 6c 65 28 29 3b 0a 20 20  _log_table();.  
1a5f0 76 61 5f 73 74 61 72 74 28 61 70 2c 7a 46 6f 72  va_start(ap,zFor
1a600 6d 61 74 29 3b 0a 20 20 62 6c 6f 62 5f 76 61 70  mat);.  blob_vap
1a610 70 65 6e 64 66 28 20 26 77 68 61 74 2c 20 7a 46  pendf( &what, zF
1a620 6f 72 6d 61 74 2c 20 61 70 20 29 3b 0a 20 20 76  ormat, ap );.  v
1a630 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 64 62 5f  a_end(ap);.  db_
1a640 6d 75 6c 74 69 5f 65 78 65 63 28 22 49 4e 53 45  multi_exec("INSE
1a650 52 54 20 49 4e 54 4f 20 61 64 6d 69 6e 5f 6c 6f  RT INTO admin_lo
1a660 67 28 74 69 6d 65 2c 70 61 67 65 2c 77 68 6f 2c  g(time,page,who,
1a670 77 68 61 74 29 22 0a 20 20 20 20 20 20 20 20 20  what)".         
1a680 20 20 20 20 20 20 20 22 20 56 41 4c 55 45 53 28         " VALUES(
1a690 6e 6f 77 28 29 2c 20 25 51 2c 20 25 51 2c 20 25  now(), %Q, %Q, %
1a6a0 42 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  B)",.           
1a6b0 20 20 20 20 20 67 2e 7a 50 61 74 68 2c 20 67 2e       g.zPath, g.
1a6c0 7a 4c 6f 67 69 6e 2c 20 26 77 68 61 74 29 3b 0a  zLogin, &what);.
1a6d0 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 77 68    blob_reset(&wh
1a6e0 61 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f  at);.}../*.** CO
1a6f0 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 64 61 74 61  MMAND: test-data
1a700 62 61 73 65 2d 6e 61 6d 65 73 0a 2a 2a 0a 2a 2a  base-names.**.**
1a710 20 50 72 69 6e 74 20 74 68 65 20 6e 61 6d 65 73   Print the names
1a720 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   of the various 
1a730 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a  database files:.
1a740 2a 2a 20 28 31 29 20 54 68 65 20 6d 61 69 6e 20  ** (1) The main 
1a750 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61 62  repository datab
1a760 61 73 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 6c  ase.** (2) The l
1a770 6f 63 61 6c 20 63 68 65 63 6b 6f 75 74 20 64 61  ocal checkout da
1a780 74 61 62 61 73 65 0a 2a 2a 20 28 33 29 20 54 68  tabase.** (3) Th
1a790 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75  e global configu
1a7a0 72 61 74 69 6f 6e 20 64 61 74 61 62 61 73 65 0a  ration database.
1a7b0 2a 2f 0a 76 6f 69 64 20 74 65 73 74 5f 64 61 74  */.void test_dat
1a7c0 61 62 61 73 65 5f 6e 61 6d 65 5f 63 6d 64 28 76  abase_name_cmd(v
1a7d0 6f 69 64 29 7b 0a 20 20 64 62 5f 66 69 6e 64 5f  oid){.  db_find_
1a7e0 61 6e 64 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74  and_open_reposit
1a7f0 6f 72 79 28 4f 50 45 4e 5f 41 4e 59 5f 53 43 48  ory(OPEN_ANY_SCH
1a800 45 4d 41 2c 20 30 29 3b 0a 20 20 66 6f 73 73 69  EMA, 0);.  fossi
1a810 6c 5f 70 72 69 6e 74 28 22 52 65 70 6f 73 69 74  l_print("Reposit
1a820 6f 72 79 20 64 61 74 61 62 61 73 65 3a 20 25 73  ory database: %s
1a830 5c 6e 22 2c 20 67 2e 7a 52 65 70 6f 73 69 74 6f  \n", g.zReposito
1a840 72 79 4e 61 6d 65 29 3b 0a 20 20 66 6f 73 73 69  ryName);.  fossi
1a850 6c 5f 70 72 69 6e 74 28 22 4c 6f 63 61 6c 20 64  l_print("Local d
1a860 61 74 61 62 61 73 65 3a 20 20 20 20 20 20 25 73  atabase:      %s
1a870 5c 6e 22 2c 20 67 2e 7a 4c 6f 63 61 6c 44 62 4e  \n", g.zLocalDbN
1a880 61 6d 65 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70  ame);.  fossil_p
1a890 72 69 6e 74 28 22 43 6f 6e 66 69 67 20 64 61 74  rint("Config dat
1a8a0 61 62 61 73 65 3a 20 20 20 20 20 25 73 5c 6e 22  abase:     %s\n"
1a8b0 2c 20 67 2e 7a 43 6f 6e 66 69 67 44 62 4e 61 6d  , g.zConfigDbNam
1a8c0 65 29 3b 0a 7d 0a                                e);.}.