Fossil

Hex Artifact Content
Login

Artifact d95d2e82a62176fb22eb4446d602ee12b75c4c41:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 36 20 44 2e 20 52 69 63 68  (c) 2006 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20   Simplified BSD 
00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a  License (also.**
00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32   known as the "2
00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22  -Clause License"
00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63   or "FreeBSD Lic
00e0: 65 6e 73 65 22 2e 29 0a 0a 2a 2a 20 54 68 69 73  ense".)..** This
00f0: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74   program is dist
0100: 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68  ributed in the h
0110: 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c  ope that it will
0120: 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62   be useful,.** b
0130: 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79 20 77  ut without any w
0140: 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f 75 74  arranty; without
0150: 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65   even the implie
0160: 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a  d warranty of.**
0170: 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 74 79   merchantability
0180: 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f 72 20   or fitness for 
0190: 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 72  a particular pur
01a0: 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 74 68  pose..**.** Auth
01b0: 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 6f 72  or contact infor
01c0: 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 72 68  mation:.**   drh
01d0: 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 20 20  @hwaci.com.**   
01e0: 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 63 69  http://www.hwaci
01f0: 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a  .com/drh/.**.***
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
0250: 2a 2a 20 43 6f 64 65 20 66 6f 72 20 69 6e 74 65  ** Code for inte
0260: 72 66 61 63 69 6e 67 20 74 6f 20 74 68 65 20 76  rfacing to the v
0270: 61 72 69 6f 75 73 20 64 61 74 61 62 61 73 65 73  arious databases
0280: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
0290: 65 20 74 68 72 65 65 20 73 65 70 61 72 61 74 65  e three separate
02a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
02b0: 74 68 61 74 20 66 6f 73 73 69 6c 20 69 6e 74 65  that fossil inte
02c0: 72 61 63 74 73 0a 2a 2a 20 77 69 74 68 3a 0a 2a  racts.** with:.*
02d0: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
02e0: 20 22 75 73 65 72 22 20 64 61 74 61 62 61 73 65   "user" database
02f0: 20 69 6e 20 7e 2f 2e 66 6f 73 73 69 6c 0a 2a 2a   in ~/.fossil.**
0300: 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68 65 20  .**    (2)  The 
0310: 22 72 65 70 6f 73 69 74 6f 72 79 22 20 64 61 74  "repository" dat
0320: 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 28  abase.**.**    (
0330: 33 29 20 20 41 20 6c 6f 63 61 6c 20 63 68 65 63  3)  A local chec
0340: 6b 6f 75 74 20 64 61 74 61 62 61 73 65 20 6e 61  kout database na
0350: 6d 65 64 20 22 5f 46 4f 53 53 49 4c 5f 22 20 6f  med "_FOSSIL_" o
0360: 72 20 22 2e 66 6f 73 22 0a 2a 2a 20 20 20 20 20  r ".fos".**     
0370: 20 20 20 20 61 6e 64 20 6c 6f 63 61 74 65 64 20      and located 
0380: 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  at the root of t
0390: 68 65 20 6c 6f 63 61 6c 20 63 6f 70 79 20 6f 66  he local copy of
03a0: 20 74 68 65 20 73 6f 75 72 63 65 20 74 72 65 65   the source tree
03b0: 2e 0a 2a 2a 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ..**.*/.#include
03c0: 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 66 20   "config.h".#if 
03d0: 21 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  ! defined(_WIN32
03e0: 29 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77  ).#  include <pw
03f0: 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 6e 63  d.h>.#endif.#inc
0400: 6c 75 64 65 20 3c 73 71 6c 69 74 65 33 2e 68 3e  lude <sqlite3.h>
0410: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0420: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
0430: 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69   <sys/stat.h>.#i
0440: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68  nclude <unistd.h
0450: 3e 0a 23 69 6e 63 6c 75 64 65 20 22 64 62 2e 68  >.#include "db.h
0460: 22 0a 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45  "..#if INTERFACE
0470: 0a 2f 2a 0a 2a 2a 20 41 6e 20 73 69 6e 67 6c 65  ./*.** An single
0480: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
0490: 73 20 72 65 70 72 65 73 65 6e 74 65 64 20 61 73  s represented as
04a0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
04b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
04c0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
04d0: 74 72 75 63 74 20 53 74 6d 74 20 7b 0a 20 20 42  truct Stmt {.  B
04e0: 6c 6f 62 20 73 71 6c 3b 20 20 20 20 20 20 20 20  lob sql;        
04f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 51         /* The SQ
0500: 4c 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  L for this state
0510: 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ment */.  sqlite
0520: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
0530: 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73    /* The results
0540: 20 6f 66 20 73 71 6c 69 74 65 33 5f 70 72 65 70   of sqlite3_prep
0550: 61 72 65 28 29 20 2a 2f 0a 20 20 53 74 6d 74 20  are() */.  Stmt 
0560: 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65 76 3b 20  *pNext, *pPrev; 
0570: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
0580: 6c 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 73 74  l unfinalized st
0590: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  atements */.  in
05a0: 74 20 6e 53 74 65 70 3b 20 20 20 20 20 20 20 20  t nStep;        
05b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
05c0: 6f 66 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  of sqlite3_step(
05d0: 29 20 63 61 6c 6c 73 20 2a 2f 0a 7d 3b 0a 23 65  ) calls */.};.#e
05e0: 6e 64 69 66 20 2f 2a 20 49 4e 54 45 52 46 41 43  ndif /* INTERFAC
05f0: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  E */../*.** Call
0600: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
0610: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 65 72  en a database er
0620: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
0630: 74 61 74 69 63 20 76 6f 69 64 20 64 62 5f 65 72  tatic void db_er
0640: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  r(const char *zF
0650: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
0660: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
0670: 72 20 2a 7a 3b 0a 20 20 73 74 61 74 69 63 20 63  r *z;.  static c
0680: 6f 6e 73 74 20 63 68 61 72 20 7a 52 65 62 75 69  onst char zRebui
0690: 6c 64 4d 73 67 5b 5d 20 3d 20 0a 20 20 20 20 20  ldMsg[] = .     
06a0: 20 22 49 66 20 79 6f 75 20 68 61 76 65 20 72 65   "If you have re
06b0: 63 65 6e 74 6c 79 20 75 70 64 61 74 65 64 20 79  cently updated y
06c0: 6f 75 72 20 66 6f 73 73 69 6c 20 65 78 65 63 75  our fossil execu
06d0: 74 61 62 6c 65 2c 20 79 6f 75 20 6d 69 67 68 74  table, you might
06e0: 5c 6e 22 0a 20 20 20 20 20 20 22 6e 65 65 64 20  \n".      "need 
06f0: 74 6f 20 72 75 6e 20 5c 22 66 6f 73 73 69 6c 20  to run \"fossil 
0700: 61 6c 6c 20 72 65 62 75 69 6c 64 5c 22 20 74 6f  all rebuild\" to
0710: 20 62 72 69 6e 67 20 74 68 65 20 72 65 70 6f 73   bring the repos
0720: 69 74 6f 72 79 5c 6e 22 0a 20 20 20 20 20 20 22  itory\n".      "
0730: 73 63 68 65 6d 61 73 20 75 70 20 74 6f 20 64 61  schemas up to da
0740: 74 65 2e 5c 6e 22 3b 0a 20 20 76 61 5f 73 74 61  te.\n";.  va_sta
0750: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
0760: 0a 20 20 7a 20 3d 20 76 6d 70 72 69 6e 74 66 28  .  z = vmprintf(
0770: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
0780: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
0790: 28 20 67 2e 78 66 65 72 50 61 6e 69 63 20 29 7b  ( g.xferPanic ){
07a0: 0a 20 20 20 20 63 67 69 5f 72 65 73 65 74 5f 63  .    cgi_reset_c
07b0: 6f 6e 74 65 6e 74 28 29 3b 0a 20 20 20 20 40 20  ontent();.    @ 
07c0: 65 72 72 6f 72 20 44 61 74 61 62 61 73 65 5c 73  error Database\s
07d0: 65 72 72 6f 72 3a 5c 73 25 46 28 7a 29 0a 20 20  error:\s%F(z).  
07e0: 20 20 63 67 69 5f 72 65 70 6c 79 28 29 3b 0a 20    cgi_reply();. 
07f0: 20 7d 0a 20 20 69 66 28 20 67 2e 63 67 69 4f 75   }.  if( g.cgiOu
0800: 74 70 75 74 20 29 7b 0a 20 20 20 20 67 2e 63 67  tput ){.    g.cg
0810: 69 4f 75 74 70 75 74 20 3d 20 30 3b 0a 20 20 20  iOutput = 0;.   
0820: 20 63 67 69 5f 70 72 69 6e 74 66 28 22 3c 68 31   cgi_printf("<h1
0830: 3e 44 61 74 61 62 61 73 65 20 45 72 72 6f 72 3c  >Database Error<
0840: 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 20 20 20 20  /h1>\n".        
0850: 20 20 20 20 20 20 20 22 3c 70 72 65 3e 25 68 3c         "<pre>%h<
0860: 2f 70 72 65 3e 3c 70 3e 25 73 3c 2f 70 3e 22 2c  /pre><p>%s</p>",
0870: 20 7a 2c 20 7a 52 65 62 75 69 6c 64 4d 73 67 29   z, zRebuildMsg)
0880: 3b 0a 20 20 20 20 63 67 69 5f 72 65 70 6c 79 28  ;.    cgi_reply(
0890: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
08a0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
08b0: 22 25 73 3a 20 25 73 5c 6e 5c 6e 25 73 22 2c 20  "%s: %s\n\n%s", 
08c0: 66 6f 73 73 69 6c 5f 6e 61 6d 65 6f 66 65 78 65  fossil_nameofexe
08d0: 28 29 2c 20 7a 2c 20 7a 52 65 62 75 69 6c 64 4d  (), z, zRebuildM
08e0: 73 67 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 6f  sg);.  }.  db_fo
08f0: 72 63 65 5f 72 6f 6c 6c 62 61 63 6b 28 29 3b 0a  rce_rollback();.
0900: 20 20 66 6f 73 73 69 6c 5f 65 78 69 74 28 31 29    fossil_exit(1)
0910: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
0920: 6e 42 65 67 69 6e 20 3d 20 30 3b 20 20 20 20 20  nBegin = 0;     
0930: 20 2f 2a 20 4e 65 73 74 69 6e 67 20 64 65 70 74   /* Nesting dept
0940: 68 20 6f 66 20 42 45 47 49 4e 20 2a 2f 0a 73 74  h of BEGIN */.st
0950: 61 74 69 63 20 69 6e 74 20 69 73 4e 65 77 52 65  atic int isNewRe
0960: 70 6f 20 3d 20 30 3b 20 20 20 2f 2a 20 54 72 75  po = 0;   /* Tru
0970: 65 20 69 66 20 74 68 65 20 72 65 70 6f 73 69 74  e if the reposit
0980: 6f 72 79 20 69 73 20 6e 65 77 6c 79 20 63 72 65  ory is newly cre
0990: 61 74 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 69  ated */.static i
09a0: 6e 74 20 64 6f 52 6f 6c 6c 62 61 63 6b 20 3d 20  nt doRollback = 
09b0: 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 66  0;  /* True to f
09c0: 6f 72 63 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  orce a rollback 
09d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 43  */.static int nC
09e0: 6f 6d 6d 69 74 48 6f 6f 6b 20 3d 20 30 3b 20 2f  ommitHook = 0; /
09f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 6d  * Number of comm
0a00: 69 74 20 68 6f 6f 6b 73 20 2a 2f 0a 73 74 61 74  it hooks */.stat
0a10: 69 63 20 73 74 72 75 63 74 20 73 43 6f 6d 6d 69  ic struct sCommi
0a20: 74 48 6f 6f 6b 20 7b 0a 20 20 69 6e 74 20 28 2a  tHook {.  int (*
0a30: 78 48 6f 6f 6b 29 28 76 6f 69 64 29 3b 20 20 2f  xHook)(void);  /
0a40: 2a 20 46 75 6e 63 74 69 6f 6e 73 20 74 6f 20 63  * Functions to c
0a50: 61 6c 6c 20 61 74 20 64 62 5f 65 6e 64 5f 74 72  all at db_end_tr
0a60: 61 6e 73 61 63 74 69 6f 6e 28 29 20 2a 2f 0a 20  ansaction() */. 
0a70: 20 69 6e 74 20 73 65 71 75 65 6e 63 65 3b 20 20   int sequence;  
0a80: 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 75        /* Call fu
0a90: 6e 63 74 69 6f 6e 73 20 69 6e 20 73 65 71 75 65  nctions in seque
0aa0: 6e 63 65 20 6f 72 64 65 72 20 2a 2f 0a 7d 20 61  nce order */.} a
0ab0: 48 6f 6f 6b 5b 35 5d 3b 0a 73 74 61 74 69 63 20  Hook[5];.static 
0ac0: 53 74 6d 74 20 2a 70 41 6c 6c 53 74 6d 74 20 3d  Stmt *pAllStmt =
0ad0: 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20   0;  /* List of 
0ae0: 61 6c 6c 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20  all unfinalized 
0af0: 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 2f  statements */../
0b00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0b10: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
0b20: 68 65 20 53 51 4c 69 74 65 20 63 6f 6d 6d 69 74  he SQLite commit
0b30: 2d 68 6f 6f 6b 20 6d 65 63 68 61 6e 69 73 6d 0a  -hook mechanism.
0b40: 2a 2a 20 6a 75 73 74 20 70 72 69 6f 72 20 74 6f  ** just prior to
0b50: 20 65 61 63 68 20 63 6f 6d 6d 69 74 2e 20 20 41   each commit.  A
0b60: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
0b70: 64 6f 65 73 20 69 73 20 76 65 72 69 66 79 0a 2a  does is verify.*
0b80: 2a 20 74 68 61 74 20 6e 42 65 67 69 6e 20 72 65  * that nBegin re
0b90: 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2e 20 20 54  ally is zero.  T
0ba0: 68 61 74 20 69 6e 73 75 72 65 73 20 74 68 61 74  hat insures that
0bb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 0a 2a 2a   transactions.**
0bc0: 20 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 62   cannot commit b
0bd0: 79 20 61 6e 79 20 6d 65 61 6e 73 20 6f 74 68 65  y any means othe
0be0: 72 20 74 68 61 6e 20 62 79 20 63 61 6c 6c 69 6e  r than by callin
0bf0: 67 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63  g db_end_transac
0c00: 74 69 6f 6e 28 29 0a 2a 2a 20 62 65 6c 6f 77 2e  tion().** below.
0c10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6a  .**.** This is j
0c20: 75 73 74 20 61 20 73 61 66 65 74 79 20 61 6e 64  ust a safety and
0c30: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
0c40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f  /.static int db_
0c50: 76 65 72 69 66 79 5f 61 74 5f 63 6f 6d 6d 69 74  verify_at_commit
0c60: 28 76 6f 69 64 20 2a 6e 6f 74 55 73 65 64 29 7b  (void *notUsed){
0c70: 0a 20 20 69 66 28 20 6e 42 65 67 69 6e 20 29 7b  .  if( nBegin ){
0c80: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69  .    fossil_pani
0c90: 63 28 22 69 6c 6c 65 67 61 6c 20 63 6f 6d 6d 69  c("illegal commi
0ca0: 74 20 61 74 74 65 6d 70 74 22 29 3b 0a 20 20 20  t attempt");.   
0cb0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
0cc0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
0cd0: 0a 2a 2a 20 42 65 67 69 6e 20 61 6e 64 20 65 6e  .** Begin and en
0ce0: 64 20 61 20 6e 65 73 74 65 64 20 74 72 61 6e 73  d a nested trans
0cf0: 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 64  action.*/.void d
0d00: 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  b_begin_transact
0d10: 69 6f 6e 28 76 6f 69 64 29 7b 0a 20 20 69 66 28  ion(void){.  if(
0d20: 20 6e 42 65 67 69 6e 3d 3d 30 20 29 7b 0a 20 20   nBegin==0 ){.  
0d30: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
0d40: 22 42 45 47 49 4e 22 29 3b 0a 20 20 20 20 73 71  "BEGIN");.    sq
0d50: 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f  lite3_commit_hoo
0d60: 6b 28 67 2e 64 62 2c 20 64 62 5f 76 65 72 69 66  k(g.db, db_verif
0d70: 79 5f 61 74 5f 63 6f 6d 6d 69 74 2c 20 30 29 3b  y_at_commit, 0);
0d80: 0a 20 20 7d 0a 20 20 6e 42 65 67 69 6e 2b 2b 3b  .  }.  nBegin++;
0d90: 0a 7d 0a 76 6f 69 64 20 64 62 5f 65 6e 64 5f 74  .}.void db_end_t
0da0: 72 61 6e 73 61 63 74 69 6f 6e 28 69 6e 74 20 72  ransaction(int r
0db0: 6f 6c 6c 62 61 63 6b 46 6c 61 67 29 7b 0a 20 20  ollbackFlag){.  
0dc0: 69 66 28 20 67 2e 64 62 3d 3d 30 20 29 20 72 65  if( g.db==0 ) re
0dd0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 42 65 67  turn;.  if( nBeg
0de0: 69 6e 3c 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  in<=0 ) return;.
0df0: 20 20 69 66 28 20 72 6f 6c 6c 62 61 63 6b 46 6c    if( rollbackFl
0e00: 61 67 20 29 20 64 6f 52 6f 6c 6c 62 61 63 6b 20  ag ) doRollback 
0e10: 3d 20 31 3b 0a 20 20 6e 42 65 67 69 6e 2d 2d 3b  = 1;.  nBegin--;
0e20: 0a 20 20 69 66 28 20 6e 42 65 67 69 6e 3d 3d 30  .  if( nBegin==0
0e30: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
0e40: 20 20 20 69 66 28 20 64 6f 52 6f 6c 6c 62 61 63     if( doRollbac
0e50: 6b 3d 3d 30 20 29 20 6c 65 61 66 5f 64 6f 5f 70  k==0 ) leaf_do_p
0e60: 65 6e 64 69 6e 67 5f 63 68 65 63 6b 73 28 29 3b  ending_checks();
0e70: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 64 6f  .    for(i=0; do
0e80: 52 6f 6c 6c 62 61 63 6b 3d 3d 30 20 26 26 20 69  Rollback==0 && i
0e90: 3c 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 3b 20 69 2b  <nCommitHook; i+
0ea0: 2b 29 7b 0a 20 20 20 20 20 20 64 6f 52 6f 6c 6c  +){.      doRoll
0eb0: 62 61 63 6b 20 7c 3d 20 61 48 6f 6f 6b 5b 69 5d  back |= aHook[i]
0ec0: 2e 78 48 6f 6f 6b 28 29 3b 0a 20 20 20 20 7d 0a  .xHook();.    }.
0ed0: 20 20 20 20 77 68 69 6c 65 28 20 70 41 6c 6c 53      while( pAllS
0ee0: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 64 62 5f  tmt ){.      db_
0ef0: 66 69 6e 61 6c 69 7a 65 28 70 41 6c 6c 53 74 6d  finalize(pAllStm
0f00: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  t);.    }.    db
0f10: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 64 6f 52 6f  _multi_exec(doRo
0f20: 6c 6c 62 61 63 6b 20 3f 20 22 52 4f 4c 4c 42 41  llback ? "ROLLBA
0f30: 43 4b 22 20 3a 20 22 43 4f 4d 4d 49 54 22 29 3b  CK" : "COMMIT");
0f40: 0a 20 20 20 20 64 6f 52 6f 6c 6c 62 61 63 6b 20  .    doRollback 
0f50: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
0f60: 2a 20 46 6f 72 63 65 20 61 20 72 6f 6c 6c 62 61  * Force a rollba
0f70: 63 6b 20 61 6e 64 20 73 68 75 74 64 6f 77 6e 20  ck and shutdown 
0f80: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a  the database.*/.
0f90: 76 6f 69 64 20 64 62 5f 66 6f 72 63 65 5f 72 6f  void db_force_ro
0fa0: 6c 6c 62 61 63 6b 28 76 6f 69 64 29 7b 0a 20 20  llback(void){.  
0fb0: 73 74 61 74 69 63 20 69 6e 74 20 62 75 73 79 20  static int busy 
0fc0: 3d 20 30 3b 0a 20 20 69 66 28 20 62 75 73 79 20  = 0;.  if( busy 
0fd0: 7c 7c 20 67 2e 64 62 3d 3d 30 20 29 20 72 65 74  || g.db==0 ) ret
0fe0: 75 72 6e 3b 0a 20 20 62 75 73 79 20 3d 20 31 3b  urn;.  busy = 1;
0ff0: 0a 20 20 75 6e 64 6f 5f 72 6f 6c 6c 62 61 63 6b  .  undo_rollback
1000: 28 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 6c  ();.  while( pAl
1010: 6c 53 74 6d 74 20 29 7b 0a 20 20 20 20 64 62 5f  lStmt ){.    db_
1020: 66 69 6e 61 6c 69 7a 65 28 70 41 6c 6c 53 74 6d  finalize(pAllStm
1030: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 42  t);.  }.  if( nB
1040: 65 67 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  egin ){.    sqli
1050: 74 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 22  te3_exec(g.db, "
1060: 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 2c  ROLLBACK", 0, 0,
1070: 20 30 29 3b 0a 20 20 20 20 6e 42 65 67 69 6e 20   0);.    nBegin 
1080: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 73 4e  = 0;.    if( isN
1090: 65 77 52 65 70 6f 20 29 7b 0a 20 20 20 20 20 20  ewRepo ){.      
10a0: 64 62 5f 63 6c 6f 73 65 28 30 29 3b 0a 20 20 20  db_close(0);.   
10b0: 20 20 20 75 6e 6c 69 6e 6b 28 67 2e 7a 52 65 70     unlink(g.zRep
10c0: 6f 73 69 74 6f 72 79 4e 61 6d 65 29 3b 0a 20 20  ositoryName);.  
10d0: 20 20 7d 0a 20 20 7d 0a 20 20 62 75 73 79 20 3d    }.  }.  busy =
10e0: 20 30 3b 0a 20 20 64 62 5f 63 6c 6f 73 65 28 30   0;.  db_close(0
10f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 74  );.}../*.** Inst
1100: 61 6c 6c 20 61 20 63 6f 6d 6d 69 74 20 68 6f 6f  all a commit hoo
1110: 6b 2e 20 20 48 6f 6f 6b 73 20 61 72 65 20 69 6e  k.  Hooks are in
1120: 73 74 61 6c 6c 65 64 20 69 6e 20 73 65 71 75 65  stalled in seque
1130: 6e 63 65 20 6f 72 64 65 72 2e 0a 2a 2a 20 49 74  nce order..** It
1140: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20   is an error to 
1150: 69 6e 73 74 61 6c 6c 20 74 68 65 20 73 61 6d 65  install the same
1160: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 6d 6f 72   commit hook mor
1170: 65 20 74 68 61 6e 20 6f 6e 63 65 2e 0a 2a 2a 0a  e than once..**.
1180: 2a 2a 20 45 61 63 68 20 63 6f 6d 6d 69 74 20 68  ** Each commit h
1190: 6f 6f 6b 20 69 73 20 63 61 6c 6c 65 64 20 28 69  ook is called (i
11a0: 6e 20 6f 72 64 65 72 20 6f 66 20 61 63 63 65 6e  n order of accen
11b0: 64 69 6e 67 20 73 65 71 75 65 6e 63 65 29 20 61  ding sequence) a
11c0: 74 0a 2a 2a 20 65 61 63 68 20 63 6f 6d 6d 69 74  t.** each commit
11d0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 66 20   operation.  If 
11e0: 61 6e 79 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  any commit hook 
11f0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
1200: 2c 0a 2a 2a 20 74 68 65 20 73 75 62 73 65 71 75  ,.** the subsequ
1210: 65 6e 63 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b  ence commit hook
1220: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 61 6e  s are omitted an
1230: 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
1240: 6e 0a 2a 2a 20 72 6f 6c 6c 73 20 62 61 63 6b 20  n.** rolls back 
1250: 72 61 74 68 65 72 20 74 68 61 6e 20 63 6f 6d 6d  rather than comm
1260: 69 74 2e 20 20 49 74 20 69 73 20 74 68 65 20 72  it.  It is the r
1270: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
1280: 20 74 68 65 0a 2a 2a 20 68 6f 6f 6b 73 20 74 68   the.** hooks th
1290: 65 6d 73 65 6c 76 65 73 20 74 6f 20 69 73 73 75  emselves to issu
12a0: 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
12b0: 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62  ages..*/.void db
12c0: 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 69 6e 74  _commit_hook(int
12d0: 20 28 2a 78 29 28 76 6f 69 64 29 2c 20 69 6e 74   (*x)(void), int
12e0: 20 73 65 71 75 65 6e 63 65 29 7b 0a 20 20 69 6e   sequence){.  in
12f0: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  t i;.  assert( n
1300: 43 6f 6d 6d 69 74 48 6f 6f 6b 20 3c 20 73 69 7a  CommitHook < siz
1310: 65 6f 66 28 61 48 6f 6f 6b 29 2f 73 69 7a 65 6f  eof(aHook)/sizeo
1320: 66 28 61 48 6f 6f 6b 5b 31 5d 29 20 29 3b 0a 20  f(aHook[1]) );. 
1330: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6d   for(i=0; i<nCom
1340: 6d 69 74 48 6f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20  mitHook; i++){. 
1350: 20 20 20 61 73 73 65 72 74 28 20 78 21 3d 61 48     assert( x!=aH
1360: 6f 6f 6b 5b 69 5d 2e 78 48 6f 6f 6b 20 29 3b 0a  ook[i].xHook );.
1370: 20 20 20 20 69 66 28 20 61 48 6f 6f 6b 5b 69 5d      if( aHook[i]
1380: 2e 73 65 71 75 65 6e 63 65 3e 73 65 71 75 65 6e  .sequence>sequen
1390: 63 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ce ){.      int 
13a0: 73 20 3d 20 73 65 71 75 65 6e 63 65 3b 0a 20 20  s = sequence;.  
13b0: 20 20 20 20 69 6e 74 20 28 2a 78 53 29 28 76 6f      int (*xS)(vo
13c0: 69 64 29 20 3d 20 78 3b 0a 20 20 20 20 20 20 73  id) = x;.      s
13d0: 65 71 75 65 6e 63 65 20 3d 20 61 48 6f 6f 6b 5b  equence = aHook[
13e0: 69 5d 2e 73 65 71 75 65 6e 63 65 3b 0a 20 20 20  i].sequence;.   
13f0: 20 20 20 78 20 3d 20 61 48 6f 6f 6b 5b 69 5d 2e     x = aHook[i].
1400: 78 48 6f 6f 6b 3b 0a 20 20 20 20 20 20 61 48 6f  xHook;.      aHo
1410: 6f 6b 5b 69 5d 2e 73 65 71 75 65 6e 63 65 20 3d  ok[i].sequence =
1420: 20 73 3b 0a 20 20 20 20 20 20 61 48 6f 6f 6b 5b   s;.      aHook[
1430: 69 5d 2e 78 48 6f 6f 6b 20 3d 20 78 53 3b 0a 20  i].xHook = xS;. 
1440: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 48 6f 6f 6b     }.  }.  aHook
1450: 5b 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 5d 2e 73 65  [nCommitHook].se
1460: 71 75 65 6e 63 65 20 3d 20 73 65 71 75 65 6e 63  quence = sequenc
1470: 65 3b 0a 20 20 61 48 6f 6f 6b 5b 6e 43 6f 6d 6d  e;.  aHook[nComm
1480: 69 74 48 6f 6f 6b 5d 2e 78 48 6f 6f 6b 20 3d 20  itHook].xHook = 
1490: 78 3b 0a 20 20 6e 43 6f 6d 6d 69 74 48 6f 6f 6b  x;.  nCommitHook
14a0: 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  ++;.}../*.** Pre
14b0: 70 61 72 65 20 61 20 53 74 6d 74 2e 20 20 41 73  pare a Stmt.  As
14c0: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 53 74  sume that the St
14d0: 6d 74 20 69 73 20 70 72 65 76 69 6f 75 73 6c 79  mt is previously
14e0: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
14f0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
1500: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20  string contains 
1510: 6d 75 6c 74 69 70 6c 65 20 53 51 4c 20 73 74 61  multiple SQL sta
1520: 74 65 6d 65 6e 74 73 2c 20 6f 6e 6c 79 20 74 68  tements, only th
1530: 65 20 66 69 72 73 74 0a 2a 2a 20 6f 6e 65 20 69  e first.** one i
1540: 73 20 70 72 6f 63 65 73 73 65 64 2e 20 20 41 6c  s processed.  Al
1550: 6c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 79  l statements bey
1560: 6f 6e 64 20 74 68 65 20 66 69 72 73 74 20 61 72  ond the first ar
1570: 65 20 73 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72  e silently ignor
1580: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 76 70  ed..*/.int db_vp
1590: 72 65 70 61 72 65 28 53 74 6d 74 20 2a 70 53 74  repare(Stmt *pSt
15a0: 6d 74 2c 20 69 6e 74 20 65 72 72 4f 6b 2c 20 63  mt, int errOk, c
15b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
15c0: 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b  at, va_list ap){
15d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
15e0: 72 20 2a 7a 53 71 6c 3b 0a 20 20 62 6c 6f 62 5f  r *zSql;.  blob_
15f0: 7a 65 72 6f 28 26 70 53 74 6d 74 2d 3e 73 71 6c  zero(&pStmt->sql
1600: 29 3b 0a 20 20 62 6c 6f 62 5f 76 61 70 70 65 6e  );.  blob_vappen
1610: 64 66 28 26 70 53 74 6d 74 2d 3e 73 71 6c 2c 20  df(&pStmt->sql, 
1620: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
1630: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7a 53  va_end(ap);.  zS
1640: 71 6c 20 3d 20 62 6c 6f 62 5f 73 74 72 28 26 70  ql = blob_str(&p
1650: 53 74 6d 74 2d 3e 73 71 6c 29 3b 0a 20 20 72 63  Stmt->sql);.  rc
1660: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1670: 72 65 5f 76 32 28 67 2e 64 62 2c 20 7a 53 71 6c  re_v2(g.db, zSql
1680: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2d 3e 70 53  , -1, &pStmt->pS
1690: 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
16a0: 63 21 3d 30 20 26 26 20 21 65 72 72 4f 6b 20 29  c!=0 && !errOk )
16b0: 7b 0a 20 20 20 20 64 62 5f 65 72 72 28 22 25 73  {.    db_err("%s
16c0: 5c 6e 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  \n%s", sqlite3_e
16d0: 72 72 6d 73 67 28 67 2e 64 62 29 2c 20 7a 53 71  rrmsg(g.db), zSq
16e0: 6c 29 3b 0a 20 20 7d 0a 20 20 70 53 74 6d 74 2d  l);.  }.  pStmt-
16f0: 3e 70 4e 65 78 74 20 3d 20 70 53 74 6d 74 2d 3e  >pNext = pStmt->
1700: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 70 53 74  pPrev = 0;.  pSt
1710: 6d 74 2d 3e 6e 53 74 65 70 20 3d 20 30 3b 0a 20  mt->nStep = 0;. 
1720: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
1730: 74 20 64 62 5f 70 72 65 70 61 72 65 28 53 74 6d  t db_prepare(Stm
1740: 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20  t *pStmt, const 
1750: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
1760: 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ..){.  int rc;. 
1770: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76   va_list ap;.  v
1780: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
1790: 6d 61 74 29 3b 0a 20 20 72 63 20 3d 20 64 62 5f  mat);.  rc = db_
17a0: 76 70 72 65 70 61 72 65 28 70 53 74 6d 74 2c 20  vprepare(pStmt, 
17b0: 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  0, zFormat, ap);
17c0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
17d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
17e0: 74 20 64 62 5f 70 72 65 70 61 72 65 5f 69 67 6e  t db_prepare_ign
17f0: 6f 72 65 5f 65 72 72 6f 72 28 53 74 6d 74 20 2a  ore_error(Stmt *
1800: 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61  pStmt, const cha
1810: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
1820: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61  {.  int rc;.  va
1830: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
1840: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
1850: 29 3b 0a 20 20 72 63 20 3d 20 64 62 5f 76 70 72  );.  rc = db_vpr
1860: 65 70 61 72 65 28 70 53 74 6d 74 2c 20 31 2c 20  epare(pStmt, 1, 
1870: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
1880: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
1890: 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 64  turn rc;.}.int d
18a0: 62 5f 73 74 61 74 69 63 5f 70 72 65 70 61 72 65  b_static_prepare
18b0: 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f  (Stmt *pStmt, co
18c0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
18d0: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72  t, ...){.  int r
18e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
18f0: 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a 65 28 26   if( blob_size(&
1900: 70 53 74 6d 74 2d 3e 73 71 6c 29 3d 3d 30 20 29  pStmt->sql)==0 )
1910: 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70  {.    va_list ap
1920: 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
1930: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
1940: 20 72 63 20 3d 20 64 62 5f 76 70 72 65 70 61 72   rc = db_vprepar
1950: 65 28 70 53 74 6d 74 2c 20 30 2c 20 7a 46 6f 72  e(pStmt, 0, zFor
1960: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 70 53  mat, ap);.    pS
1970: 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 41 6c  tmt->pNext = pAl
1980: 6c 53 74 6d 74 3b 0a 20 20 20 20 70 53 74 6d 74  lStmt;.    pStmt
1990: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
19a0: 20 69 66 28 20 70 41 6c 6c 53 74 6d 74 20 29 20   if( pAllStmt ) 
19b0: 70 41 6c 6c 53 74 6d 74 2d 3e 70 50 72 65 76 20  pAllStmt->pPrev 
19c0: 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 70 41 6c  = pStmt;.    pAl
19d0: 6c 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20  lStmt = pStmt;. 
19e0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
19f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a10: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 62  the index of a b
1a20: 69 6e 64 20 70 61 72 61 6d 65 74 65 72 0a 2a 2f  ind parameter.*/
1a30: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 72 61  .static int para
1a40: 6d 49 64 78 28 53 74 6d 74 20 2a 70 53 74 6d 74  mIdx(Stmt *pStmt
1a50: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
1a60: 61 72 61 6d 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  aramName){.  int
1a70: 20 69 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e   i = sqlite3_bin
1a80: 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
1a90: 78 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20  x(pStmt->pStmt, 
1aa0: 7a 50 61 72 61 6d 4e 61 6d 65 29 3b 0a 20 20 69  zParamName);.  i
1ab0: 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 64  f( i==0 ){.    d
1ac0: 62 5f 65 72 72 28 22 6e 6f 20 73 75 63 68 20 62  b_err("no such b
1ad0: 69 6e 64 20 70 61 72 61 6d 65 74 65 72 3a 20 25  ind parameter: %
1ae0: 73 5c 6e 53 51 4c 3a 20 25 62 22 2c 20 7a 50 61  s\nSQL: %b", zPa
1af0: 72 61 6d 4e 61 6d 65 2c 20 26 70 53 74 6d 74 2d  ramName, &pStmt-
1b00: 3e 73 71 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74  >sql);.  }.  ret
1b10: 75 72 6e 20 69 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 42  urn i;.}./*.** B
1b20: 69 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 2c 20  ind an integer, 
1b30: 73 74 72 69 6e 67 2c 20 6f 72 20 42 6c 6f 62 20  string, or Blob 
1b40: 76 61 6c 75 65 20 74 6f 20 61 20 6e 61 6d 65 64  value to a named
1b50: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69   parameter..*/.i
1b60: 6e 74 20 64 62 5f 62 69 6e 64 5f 69 6e 74 28 53  nt db_bind_int(S
1b70: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73  tmt *pStmt, cons
1b80: 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61  t char *zParamNa
1b90: 6d 65 2c 20 69 6e 74 20 69 56 61 6c 75 65 29 7b  me, int iValue){
1ba0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1bb0: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
1bc0: 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d 49 64  ->pStmt, paramId
1bd0: 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e  x(pStmt, zParamN
1be0: 61 6d 65 29 2c 20 69 56 61 6c 75 65 29 3b 0a 7d  ame), iValue);.}
1bf0: 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 69 6e 74  .int db_bind_int
1c00: 36 34 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20  64(Stmt *pStmt, 
1c10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
1c20: 61 6d 4e 61 6d 65 2c 20 69 36 34 20 69 56 61 6c  amName, i64 iVal
1c30: 75 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ue){.  return sq
1c40: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
1c50: 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 70  (pStmt->pStmt, p
1c60: 61 72 61 6d 49 64 78 28 70 53 74 6d 74 2c 20 7a  aramIdx(pStmt, z
1c70: 50 61 72 61 6d 4e 61 6d 65 29 2c 20 69 56 61 6c  ParamName), iVal
1c80: 75 65 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 62 69  ue);.}.int db_bi
1c90: 6e 64 5f 64 6f 75 62 6c 65 28 53 74 6d 74 20 2a  nd_double(Stmt *
1ca0: 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61  pStmt, const cha
1cb0: 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c 20 64  r *zParamName, d
1cc0: 6f 75 62 6c 65 20 72 56 61 6c 75 65 29 7b 0a 20  ouble rValue){. 
1cd0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
1ce0: 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d  bind_double(pStm
1cf0: 74 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d 49  t->pStmt, paramI
1d00: 64 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d  dx(pStmt, zParam
1d10: 4e 61 6d 65 29 2c 20 72 56 61 6c 75 65 29 3b 0a  Name), rValue);.
1d20: 7d 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 74 65  }.int db_bind_te
1d30: 78 74 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20  xt(Stmt *pStmt, 
1d40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
1d50: 61 6d 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  amName, const ch
1d60: 61 72 20 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 72  ar *zValue){.  r
1d70: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 62 69  eturn sqlite3_bi
1d80: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2d 3e 70  nd_text(pStmt->p
1d90: 53 74 6d 74 2c 20 70 61 72 61 6d 49 64 78 28 70  Stmt, paramIdx(p
1da0: 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65  Stmt, zParamName
1db0: 29 2c 20 7a 56 61 6c 75 65 2c 0a 20 20 20 20 20  ), zValue,.     
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd0: 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45        -1, SQLITE
1de0: 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 69 6e 74 20  _STATIC);.}.int 
1df0: 64 62 5f 62 69 6e 64 5f 6e 75 6c 6c 28 53 74 6d  db_bind_null(Stm
1e00: 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20  t *pStmt, const 
1e10: 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65  char *zParamName
1e20: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1e30: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53  te3_bind_null(pS
1e40: 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61  tmt->pStmt, para
1e50: 6d 49 64 78 28 70 53 74 6d 74 2c 20 7a 50 61 72  mIdx(pStmt, zPar
1e60: 61 6d 4e 61 6d 65 29 29 3b 0a 7d 0a 69 6e 74 20  amName));.}.int 
1e70: 64 62 5f 62 69 6e 64 5f 62 6c 6f 62 28 53 74 6d  db_bind_blob(Stm
1e80: 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20  t *pStmt, const 
1e90: 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65  char *zParamName
1ea0: 2c 20 42 6c 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a  , Blob *pBlob){.
1eb0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1ec0: 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74  _bind_blob(pStmt
1ed0: 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d 49 64  ->pStmt, paramId
1ee0: 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e  x(pStmt, zParamN
1ef0: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f10: 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 42 6c 6f  blob_buffer(pBlo
1f20: 62 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 70 42  b), blob_size(pB
1f30: 6c 6f 62 29 2c 20 53 51 4c 49 54 45 5f 53 54 41  lob), SQLITE_STA
1f40: 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 20 62 69 6e 64  TIC);.}../* bind
1f50: 5f 73 74 72 28 29 20 74 72 65 61 74 73 20 61 20  _str() treats a 
1f60: 42 6c 6f 62 20 6f 62 6a 65 63 74 20 6c 69 6b 65  Blob object like
1f70: 20 61 20 54 45 58 54 20 73 74 72 69 6e 67 20 61   a TEXT string a
1f80: 6e 64 20 62 69 6e 64 73 20 69 74 0a 2a 2a 20 74  nd binds it.** t
1f90: 6f 20 74 68 65 20 53 51 4c 20 76 61 72 69 61 62  o the SQL variab
1fa0: 6c 65 2e 20 20 43 6f 6e 73 74 72 61 73 74 20 74  le.  Constrast t
1fb0: 68 69 73 20 74 6f 20 62 69 6e 64 5f 62 6c 6f 62  his to bind_blob
1fc0: 28 29 20 77 68 69 63 68 20 74 72 65 61 74 73 0a  () which treats.
1fd0: 2a 2a 20 74 68 65 20 42 6c 6f 62 20 6f 62 6a 65  ** the Blob obje
1fe0: 63 74 20 6c 69 6b 65 20 61 6e 20 53 51 4c 20 42  ct like an SQL B
1ff0: 4c 4f 42 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 62  LOB..*/.int db_b
2000: 69 6e 64 5f 73 74 72 28 53 74 6d 74 20 2a 70 53  ind_str(Stmt *pS
2010: 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  tmt, const char 
2020: 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c 20 42 6c 6f  *zParamName, Blo
2030: 62 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 72 65 74  b *pBlob){.  ret
2040: 75 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  urn sqlite3_bind
2050: 5f 74 65 78 74 28 70 53 74 6d 74 2d 3e 70 53 74  _text(pStmt->pSt
2060: 6d 74 2c 20 70 61 72 61 6d 49 64 78 28 70 53 74  mt, paramIdx(pSt
2070: 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29 2c  mt, zParamName),
2080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2090: 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f             blob_
20a0: 62 75 66 66 65 72 28 70 42 6c 6f 62 29 2c 20 62  buffer(pBlob), b
20b0: 6c 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62 29 2c  lob_size(pBlob),
20c0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
20d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  .}../*.** Step t
20e0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
20f0: 2e 20 20 52 65 74 75 72 6e 20 65 69 74 68 65 72  .  Return either
2100: 20 53 51 4c 49 54 45 5f 52 4f 57 20 6f 72 20 61   SQLITE_ROW or a
2110: 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  n error code.** 
2120: 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  or SQLITE_OK if 
2130: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 66 69  the statement fi
2140: 6e 69 73 68 65 73 20 73 75 63 63 65 73 73 66 75  nishes successfu
2150: 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 73  lly..*/.int db_s
2160: 74 65 70 28 53 74 6d 74 20 2a 70 53 74 6d 74 29  tep(Stmt *pStmt)
2170: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
2180: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
2190: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pStmt->pStmt);. 
21a0: 20 70 53 74 6d 74 2d 3e 6e 53 74 65 70 2b 2b 3b   pStmt->nStep++;
21b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21c0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 77 61 72  ./*.** Print war
21d0: 6e 69 6e 67 73 20 69 66 20 61 20 71 75 65 72 79  nings if a query
21e0: 20 69 73 20 69 6e 65 66 66 69 63 69 65 6e 74 2e   is inefficient.
21f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2200: 64 62 5f 73 74 61 74 73 28 53 74 6d 74 20 2a 70  db_stats(Stmt *p
2210: 53 74 6d 74 29 7b 0a 23 69 66 64 65 66 20 46 4f  Stmt){.#ifdef FO
2220: 53 53 49 4c 5f 44 45 42 55 47 0a 20 20 69 6e 74  SSIL_DEBUG.  int
2230: 20 63 31 2c 20 63 32 2c 20 63 33 3b 0a 20 20 63   c1, c2, c3;.  c
2240: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
2250: 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  = sqlite3_sql(pS
2260: 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 69  tmt->pStmt);.  i
2270: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  f( zSql==0 ) ret
2280: 75 72 6e 3b 0a 20 20 63 31 20 3d 20 73 71 6c 69  urn;.  c1 = sqli
2290: 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
22a0: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 53 51  pStmt->pStmt, SQ
22b0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
22c0: 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 20 31  FULLSCAN_STEP, 1
22d0: 29 3b 0a 20 20 63 32 20 3d 20 73 71 6c 69 74 65  );.  c2 = sqlite
22e0: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53  3_stmt_status(pS
22f0: 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  tmt->pStmt, SQLI
2300: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
2310: 54 4f 49 4e 44 45 58 2c 20 31 29 3b 0a 20 20 63  TOINDEX, 1);.  c
2320: 33 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  3 = sqlite3_stmt
2330: 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2d 3e 70  _status(pStmt->p
2340: 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d  Stmt, SQLITE_STM
2350: 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 31 29  TSTATUS_SORT, 1)
2360: 3b 0a 20 20 69 66 28 20 63 31 3e 70 53 74 6d 74  ;.  if( c1>pStmt
2370: 2d 3e 6e 53 74 65 70 2a 34 20 26 26 20 73 74 72  ->nStep*4 && str
2380: 73 74 72 28 7a 53 71 6c 2c 22 2f 2a 73 63 61 6e  str(zSql,"/*scan
2390: 2a 2f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  */")==0 ){.    f
23a0: 6f 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22 25  ossil_warning("%
23b0: 64 20 73 63 61 6e 20 73 74 65 70 73 20 66 6f 72  d scan steps for
23c0: 20 25 64 20 72 6f 77 73 20 69 6e 20 5b 25 73 5d   %d rows in [%s]
23d0: 22 2c 20 63 31 2c 20 70 53 74 6d 74 2d 3e 6e 53  ", c1, pStmt->nS
23e0: 74 65 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d 65  tep, zSql);.  }e
23f0: 6c 73 65 20 69 66 28 20 63 32 20 29 7b 0a 20 20  lse if( c2 ){.  
2400: 20 20 66 6f 73 73 69 6c 5f 77 61 72 6e 69 6e 67    fossil_warning
2410: 28 22 25 64 20 61 75 74 6f 6d 61 74 69 63 20 69  ("%d automatic i
2420: 6e 64 65 78 20 72 6f 77 73 20 69 6e 20 5b 25 73  ndex rows in [%s
2430: 5d 22 2c 20 63 32 2c 20 7a 53 71 6c 29 3b 0a 20  ]", c2, zSql);. 
2440: 20 7d 65 6c 73 65 20 69 66 28 20 63 33 20 26 26   }else if( c3 &&
2450: 20 73 74 72 73 74 72 28 7a 53 71 6c 2c 22 2f 2a   strstr(zSql,"/*
2460: 73 6f 72 74 2a 2f 22 29 3d 3d 30 20 26 26 20 73  sort*/")==0 && s
2470: 74 72 73 74 72 28 7a 53 71 6c 2c 22 2f 2a 73 63  trstr(zSql,"/*sc
2480: 61 6e 2a 2f 22 29 3d 3d 30 20 29 7b 0a 20 20 20  an*/")==0 ){.   
2490: 20 66 6f 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28   fossil_warning(
24a0: 22 73 6f 72 74 20 77 2f 6f 20 69 6e 64 65 78 20  "sort w/o index 
24b0: 69 6e 20 5b 25 73 5d 22 2c 20 7a 53 71 6c 29 3b  in [%s]", zSql);
24c0: 0a 20 20 7d 0a 20 20 70 53 74 6d 74 2d 3e 6e 53  .  }.  pStmt->nS
24d0: 74 65 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  tep = 0;.#endif.
24e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 6f  }../*.** Reset o
24f0: 72 20 66 69 6e 61 6c 69 7a 65 20 61 20 73 74 61  r finalize a sta
2500: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 64  tement..*/.int d
2510: 62 5f 72 65 73 65 74 28 53 74 6d 74 20 2a 70 53  b_reset(Stmt *pS
2520: 74 6d 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  tmt){.  int rc;.
2530: 20 20 64 62 5f 73 74 61 74 73 28 70 53 74 6d 74    db_stats(pStmt
2540: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2550: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 2d 3e 70  3_reset(pStmt->p
2560: 53 74 6d 74 29 3b 0a 20 20 64 62 5f 63 68 65 63  Stmt);.  db_chec
2570: 6b 5f 72 65 73 75 6c 74 28 72 63 29 3b 0a 20 20  k_result(rc);.  
2580: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
2590: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 53 74 6d   db_finalize(Stm
25a0: 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69 6e 74  t *pStmt){.  int
25b0: 20 72 63 3b 0a 20 20 64 62 5f 73 74 61 74 73 28   rc;.  db_stats(
25c0: 70 53 74 6d 74 29 3b 0a 20 20 62 6c 6f 62 5f 72  pStmt);.  blob_r
25d0: 65 73 65 74 28 26 70 53 74 6d 74 2d 3e 73 71 6c  eset(&pStmt->sql
25e0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
25f0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2600: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 64 62 5f 63  ->pStmt);.  db_c
2610: 68 65 63 6b 5f 72 65 73 75 6c 74 28 72 63 29 3b  heck_result(rc);
2620: 0a 20 20 70 53 74 6d 74 2d 3e 70 53 74 6d 74 20  .  pStmt->pStmt 
2630: 3d 20 30 3b 0a 20 20 69 66 28 20 70 53 74 6d 74  = 0;.  if( pStmt
2640: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
2650: 53 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  Stmt->pNext->pPr
2660: 65 76 20 3d 20 70 53 74 6d 74 2d 3e 70 50 72 65  ev = pStmt->pPre
2670: 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 74  v;.  }.  if( pSt
2680: 6d 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  mt->pPrev ){.   
2690: 20 70 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70   pStmt->pPrev->p
26a0: 4e 65 78 74 20 3d 20 70 53 74 6d 74 2d 3e 70 4e  Next = pStmt->pN
26b0: 65 78 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ext;.  }else if(
26c0: 20 70 41 6c 6c 53 74 6d 74 3d 3d 70 53 74 6d 74   pAllStmt==pStmt
26d0: 20 29 7b 0a 20 20 20 20 70 41 6c 6c 53 74 6d 74   ){.    pAllStmt
26e0: 20 3d 20 70 53 74 6d 74 2d 3e 70 4e 65 78 74 3b   = pStmt->pNext;
26f0: 0a 20 20 7d 0a 20 20 70 53 74 6d 74 2d 3e 70 4e  .  }.  pStmt->pN
2700: 65 78 74 20 3d 20 30 3b 0a 20 20 70 53 74 6d 74  ext = 0;.  pStmt
2710: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 72  ->pPrev = 0;.  r
2720: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2730: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f  ** Return the ro
2740: 77 69 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  wid of the most 
2750: 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f  recent insert.*/
2760: 0a 69 36 34 20 64 62 5f 6c 61 73 74 5f 69 6e 73  .i64 db_last_ins
2770: 65 72 74 5f 72 6f 77 69 64 28 76 6f 69 64 29 7b  ert_rowid(void){
2780: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2790: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
27a0: 77 69 64 28 67 2e 64 62 29 3b 0a 7d 0a 0a 2f 2a  wid(g.db);.}../*
27b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
27c0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
27d0: 61 74 20 77 65 72 65 20 63 68 61 6e 67 65 64 20  at were changed 
27e0: 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  by the most rece
27f0: 6e 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50  nt.** INSERT, UP
2800: 44 41 54 45 2c 20 6f 72 20 44 45 4c 45 54 45 2e  DATE, or DELETE.
2810: 20 20 41 75 78 69 6c 69 61 72 79 20 63 68 61 6e    Auxiliary chan
2820: 67 65 73 20 63 61 75 73 65 64 20 62 79 20 74 72  ges caused by tr
2830: 69 67 67 65 72 73 0a 2a 2a 20 6f 72 20 6f 74 68  iggers.** or oth
2840: 65 72 20 73 69 64 65 20 65 66 66 65 63 74 73 20  er side effects 
2850: 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e  are not counted.
2860: 0a 2a 2f 0a 69 6e 74 20 64 62 5f 63 68 61 6e 67  .*/.int db_chang
2870: 65 73 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  es(void){.  retu
2880: 72 6e 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  rn sqlite3_chang
2890: 65 73 28 67 2e 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a  es(g.db);.}../*.
28a0: 2a 2a 20 45 78 74 72 61 63 74 20 74 65 78 74 2c  ** Extract text,
28b0: 20 69 6e 74 65 67 65 72 2c 20 6f 72 20 62 6c 6f   integer, or blo
28c0: 62 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68  b values from th
28d0: 65 20 4e 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e N-th column of
28e0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
28f0: 72 6f 77 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 63  row..*/.int db_c
2900: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 53 74 6d 74  olumn_bytes(Stmt
2910: 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b   *pStmt, int N){
2920: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2930: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
2940: 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b  Stmt->pStmt, N);
2950: 0a 7d 0a 69 6e 74 20 64 62 5f 63 6f 6c 75 6d 6e  .}.int db_column
2960: 5f 69 6e 74 28 53 74 6d 74 20 2a 70 53 74 6d 74  _int(Stmt *pStmt
2970: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 74 75  , int N){.  retu
2980: 72 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  rn sqlite3_colum
2990: 6e 5f 69 6e 74 28 70 53 74 6d 74 2d 3e 70 53 74  n_int(pStmt->pSt
29a0: 6d 74 2c 20 4e 29 3b 0a 7d 0a 69 36 34 20 64 62  mt, N);.}.i64 db
29b0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 53 74  _column_int64(St
29c0: 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e  mt *pStmt, int N
29d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
29e0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
29f0: 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e  (pStmt->pStmt, N
2a00: 29 3b 0a 7d 0a 64 6f 75 62 6c 65 20 64 62 5f 63  );.}.double db_c
2a10: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 53 74 6d  olumn_double(Stm
2a20: 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29  t *pStmt, int N)
2a30: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2a40: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
2a50: 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e  (pStmt->pStmt, N
2a60: 29 3b 0a 7d 0a 63 6f 6e 73 74 20 63 68 61 72 20  );.}.const char 
2a70: 2a 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  *db_column_text(
2a80: 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74  Stmt *pStmt, int
2a90: 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 63   N){.  return (c
2aa0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
2ab0: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2d 3e  umn_text(pStmt->
2ac0: 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 63 6f 6e  pStmt, N);.}.con
2ad0: 73 74 20 63 68 61 72 20 2a 64 62 5f 63 6f 6c 75  st char *db_colu
2ae0: 6d 6e 5f 72 61 77 28 53 74 6d 74 20 2a 70 53 74  mn_raw(Stmt *pSt
2af0: 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65  mt, int N){.  re
2b00: 74 75 72 6e 20 28 63 6f 6e 73 74 20 63 68 61 72  turn (const char
2b10: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2b20: 5f 62 6c 6f 62 28 70 53 74 6d 74 2d 3e 70 53 74  _blob(pStmt->pSt
2b30: 6d 74 2c 20 4e 29 3b 0a 7d 0a 63 6f 6e 73 74 20  mt, N);.}.const 
2b40: 63 68 61 72 20 2a 64 62 5f 63 6f 6c 75 6d 6e 5f  char *db_column_
2b50: 6e 61 6d 65 28 53 74 6d 74 20 2a 70 53 74 6d 74  name(Stmt *pStmt
2b60: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 74 75  , int N){.  retu
2b70: 72 6e 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  rn (char*)sqlite
2b80: 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
2b90: 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a  tmt->pStmt, N);.
2ba0: 7d 0a 69 6e 74 20 64 62 5f 63 6f 6c 75 6d 6e 5f  }.int db_column_
2bb0: 63 6f 75 6e 74 28 53 74 6d 74 20 2a 70 53 74 6d  count(Stmt *pStm
2bc0: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  t){.  return sql
2bd0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
2be0: 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b  t(pStmt->pStmt);
2bf0: 0a 7d 0a 63 68 61 72 20 2a 64 62 5f 63 6f 6c 75  .}.char *db_colu
2c00: 6d 6e 5f 6d 61 6c 6c 6f 63 28 53 74 6d 74 20 2a  mn_malloc(Stmt *
2c10: 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20  pStmt, int N){. 
2c20: 20 72 65 74 75 72 6e 20 6d 70 72 69 6e 74 66 28   return mprintf(
2c30: 22 25 73 22 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f  "%s", db_column_
2c40: 74 65 78 74 28 70 53 74 6d 74 2c 20 4e 29 29 3b  text(pStmt, N));
2c50: 0a 7d 0a 76 6f 69 64 20 64 62 5f 63 6f 6c 75 6d  .}.void db_colum
2c60: 6e 5f 62 6c 6f 62 28 53 74 6d 74 20 2a 70 53 74  n_blob(Stmt *pSt
2c70: 6d 74 2c 20 69 6e 74 20 4e 2c 20 42 6c 6f 62 20  mt, int N, Blob 
2c80: 2a 70 42 6c 6f 62 29 7b 0a 20 20 62 6c 6f 62 5f  *pBlob){.  blob_
2c90: 61 70 70 65 6e 64 28 70 42 6c 6f 62 2c 20 73 71  append(pBlob, sq
2ca0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
2cb0: 62 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20  b(pStmt->pStmt, 
2cc0: 4e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  N),.            
2cd0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
2ce0: 5f 62 79 74 65 73 28 70 53 74 6d 74 2d 3e 70 53  _bytes(pStmt->pS
2cf0: 74 6d 74 2c 20 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a  tmt, N));.}../*.
2d00: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
2d10: 62 6c 6f 62 20 74 6f 20 61 6e 20 65 70 68 65 72  blob to an epher
2d20: 6d 65 72 61 6c 20 63 6f 70 79 20 6f 66 20 74 68  meral copy of th
2d30: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 0a 2a  e content of a.*
2d40: 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  * column in the 
2d50: 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 20 54 68  current row.  Th
2d60: 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 62 6c  e data in the bl
2d70: 6f 62 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a  ob will become.*
2d80: 2a 20 69 6e 76 61 6c 69 64 20 77 68 65 6e 20 74  * invalid when t
2d90: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
2da0: 73 74 65 70 70 65 64 20 6f 72 20 72 65 73 65 74  stepped or reset
2db0: 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 65 70 68  ..*/.void db_eph
2dc0: 65 6d 65 72 61 6c 5f 62 6c 6f 62 28 53 74 6d 74  emeral_blob(Stmt
2dd0: 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e 2c 20   *pStmt, int N, 
2de0: 42 6c 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a 20 20  Blob *pBlob){.  
2df0: 62 6c 6f 62 5f 69 6e 69 74 28 70 42 6c 6f 62 2c  blob_init(pBlob,
2e00: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2e10: 62 6c 6f 62 28 70 53 74 6d 74 2d 3e 70 53 74 6d  blob(pStmt->pStm
2e20: 74 2c 20 4e 29 2c 0a 20 20 20 20 20 20 20 20 20  t, N),.         
2e30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
2e40: 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2d  umn_bytes(pStmt-
2e50: 3e 70 53 74 6d 74 2c 20 4e 29 29 3b 0a 7d 0a 0a  >pStmt, N));.}..
2e60: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 72 65  /*.** Check a re
2e70: 73 75 6c 74 20 63 6f 64 65 2e 20 20 49 66 20 69  sult code.  If i
2e80: 74 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  t is not SQLITE_
2e90: 4f 4b 2c 20 70 72 69 6e 74 20 74 68 65 0a 2a 2a  OK, print the.**
2ea0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65   corresponding e
2eb0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
2ec0: 20 65 78 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 64   exit..*/.void d
2ed0: 62 5f 63 68 65 63 6b 5f 72 65 73 75 6c 74 28 69  b_check_result(i
2ee0: 6e 74 20 72 63 29 7b 0a 20 20 69 66 28 20 72 63  nt rc){.  if( rc
2ef0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f00: 20 20 20 64 62 5f 65 72 72 28 22 53 51 4c 20 65     db_err("SQL e
2f10: 72 72 6f 72 3a 20 25 73 22 2c 20 73 71 6c 69 74  rror: %s", sqlit
2f20: 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 29  e3_errmsg(g.db))
2f30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ;.  }.}../*.** E
2f40: 78 65 63 75 74 65 20 61 20 73 69 6e 67 6c 65 20  xecute a single 
2f50: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
2f60: 6e 74 20 75 6e 74 69 6c 20 69 74 20 66 69 6e 69  nt until it fini
2f70: 73 68 65 73 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f  shes..*/.int db_
2f80: 65 78 65 63 28 53 74 6d 74 20 2a 70 53 74 6d 74  exec(Stmt *pStmt
2f90: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77  ){.  int rc;.  w
2fa0: 68 69 6c 65 28 20 28 72 63 20 3d 20 64 62 5f 73  hile( (rc = db_s
2fb0: 74 65 70 28 70 53 74 6d 74 29 29 3d 3d 53 51 4c  tep(pStmt))==SQL
2fc0: 49 54 45 5f 52 4f 57 20 29 7b 7d 0a 20 20 72 63  ITE_ROW ){}.  rc
2fd0: 20 3d 20 64 62 5f 72 65 73 65 74 28 70 53 74 6d   = db_reset(pStm
2fe0: 74 29 3b 0a 20 20 64 62 5f 63 68 65 63 6b 5f 72  t);.  db_check_r
2ff0: 65 73 75 6c 74 28 72 63 29 3b 0a 20 20 72 65 74  esult(rc);.  ret
3000: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3010: 20 45 78 65 63 75 74 65 20 6d 75 6c 74 69 70 6c   Execute multipl
3020: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  e SQL statements
3030: 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 6d 75 6c 74  ..*/.int db_mult
3040: 69 5f 65 78 65 63 28 63 6f 6e 73 74 20 63 68 61  i_exec(const cha
3050: 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20  r *zSql, ...){. 
3060: 20 42 6c 6f 62 20 73 71 6c 3b 0a 20 20 69 6e 74   Blob sql;.  int
3070: 20 72 63 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61   rc;.  va_list a
3080: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  p;.  char *zErr 
3090: 3d 20 30 3b 0a 20 20 62 6c 6f 62 5f 69 6e 69 74  = 0;.  blob_init
30a0: 28 26 73 71 6c 2c 20 30 2c 20 30 29 3b 0a 20 20  (&sql, 0, 0);.  
30b0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 71  va_start(ap, zSq
30c0: 6c 29 3b 0a 20 20 62 6c 6f 62 5f 76 61 70 70 65  l);.  blob_vappe
30d0: 6e 64 66 28 26 73 71 6c 2c 20 7a 53 71 6c 2c 20  ndf(&sql, zSql, 
30e0: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
30f0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
3100: 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 62 6c 6f  3_exec(g.db, blo
3110: 62 5f 62 75 66 66 65 72 28 26 73 71 6c 29 2c 20  b_buffer(&sql), 
3120: 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20  0, 0, &zErr);.  
3130: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3140: 4b 20 29 7b 0a 20 20 20 20 64 62 5f 65 72 72 28  K ){.    db_err(
3150: 22 25 73 5c 6e 25 73 22 2c 20 7a 45 72 72 2c 20  "%s\n%s", zErr, 
3160: 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 73 71 6c  blob_buffer(&sql
3170: 29 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 72  ));.  }.  blob_r
3180: 65 73 65 74 28 26 73 71 6c 29 3b 0a 20 20 72 65  eset(&sql);.  re
3190: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
31a0: 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72  * Execute a quer
31b0: 79 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 73  y and return a s
31c0: 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 76 61  ingle integer va
31d0: 6c 75 65 2e 0a 2a 2f 0a 69 36 34 20 64 62 5f 69  lue..*/.i64 db_i
31e0: 6e 74 36 34 28 69 36 34 20 69 44 66 6c 74 2c 20  nt64(i64 iDflt, 
31f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
3200: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
3210: 74 20 61 70 3b 0a 20 20 53 74 6d 74 20 73 3b 0a  t ap;.  Stmt s;.
3220: 20 20 69 36 34 20 72 63 3b 0a 20 20 76 61 5f 73    i64 rc;.  va_s
3230: 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a  tart(ap, zSql);.
3240: 20 20 64 62 5f 76 70 72 65 70 61 72 65 28 26 73    db_vprepare(&s
3250: 2c 20 30 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a  , 0, zSql, ap);.
3260: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
3270: 69 66 28 20 64 62 5f 73 74 65 70 28 26 73 29 21  if( db_step(&s)!
3280: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
3290: 20 20 20 72 63 20 3d 20 69 44 66 6c 74 3b 0a 20     rc = iDflt;. 
32a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
32b0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34   db_column_int64
32c0: 28 26 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64  (&s, 0);.  }.  d
32d0: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a  b_finalize(&s);.
32e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
32f0: 6e 74 20 64 62 5f 69 6e 74 28 69 6e 74 20 69 44  nt db_int(int iD
3300: 66 6c 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  flt, const char 
3310: 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76  *zSql, ...){.  v
3320: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d  a_list ap;.  Stm
3330: 74 20 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  t s;.  int rc;. 
3340: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53   va_start(ap, zS
3350: 71 6c 29 3b 0a 20 20 64 62 5f 76 70 72 65 70 61  ql);.  db_vprepa
3360: 72 65 28 26 73 2c 20 30 2c 20 7a 53 71 6c 2c 20  re(&s, 0, zSql, 
3370: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
3380: 29 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70  );.  if( db_step
3390: 28 26 73 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57  (&s)!=SQLITE_ROW
33a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 44 66   ){.    rc = iDf
33b0: 6c 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  lt;.  }else{.   
33c0: 20 72 63 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f   rc = db_column_
33d0: 69 6e 74 28 26 73 2c 20 30 29 3b 0a 20 20 7d 0a  int(&s, 0);.  }.
33e0: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73    db_finalize(&s
33f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
3400: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3410: 54 52 55 45 20 69 66 20 74 68 65 20 71 75 65 72  TRUE if the quer
3420: 79 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 31  y would return 1
3430: 20 6f 72 20 6d 6f 72 65 20 72 6f 77 73 2e 20 20   or more rows.  
3440: 52 65 74 75 72 6e 0a 2a 2a 20 46 41 4c 53 45 20  Return.** FALSE 
3450: 69 66 20 74 68 65 20 71 75 65 72 79 20 72 65 73  if the query res
3460: 75 6c 74 20 77 6f 75 6c 64 20 62 65 20 61 6e 20  ult would be an 
3470: 65 6d 70 74 79 20 73 65 74 2e 0a 2a 2f 0a 69 6e  empty set..*/.in
3480: 74 20 64 62 5f 65 78 69 73 74 73 28 63 6f 6e 73  t db_exists(cons
3490: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e  t char *zSql, ..
34a0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
34b0: 3b 0a 20 20 53 74 6d 74 20 73 3b 0a 20 20 69 6e  ;.  Stmt s;.  in
34c0: 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  t rc;.  va_start
34d0: 28 61 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 64 62  (ap, zSql);.  db
34e0: 5f 76 70 72 65 70 61 72 65 28 26 73 2c 20 30 2c  _vprepare(&s, 0,
34f0: 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20 76 61   zSql, ap);.  va
3500: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
3510: 64 62 5f 73 74 65 70 28 26 73 29 21 3d 53 51 4c  db_step(&s)!=SQL
3520: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72  ITE_ROW ){.    r
3530: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
3540: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
3550: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73    db_finalize(&s
3560: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
3570: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  }.../*.** Execut
3580: 65 20 61 20 71 75 65 72 79 20 61 6e 64 20 72 65  e a query and re
3590: 74 75 72 6e 20 61 20 66 6c 6f 61 74 69 6e 67 2d  turn a floating-
35a0: 70 6f 69 6e 74 20 76 61 6c 75 65 2e 0a 2a 2f 0a  point value..*/.
35b0: 64 6f 75 62 6c 65 20 64 62 5f 64 6f 75 62 6c 65  double db_double
35c0: 28 64 6f 75 62 6c 65 20 72 44 66 6c 74 2c 20 63  (double rDflt, c
35d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
35e0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
35f0: 20 61 70 3b 0a 20 20 53 74 6d 74 20 73 3b 0a 20   ap;.  Stmt s;. 
3600: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 76 61 5f   double r;.  va_
3610: 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b  start(ap, zSql);
3620: 0a 20 20 64 62 5f 76 70 72 65 70 61 72 65 28 26  .  db_vprepare(&
3630: 73 2c 20 30 2c 20 7a 53 71 6c 2c 20 61 70 29 3b  s, 0, zSql, ap);
3640: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
3650: 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 73 29   if( db_step(&s)
3660: 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  !=SQLITE_ROW ){.
3670: 20 20 20 20 72 20 3d 20 72 44 66 6c 74 3b 0a 20      r = rDflt;. 
3680: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 20 3d 20   }else{.    r = 
3690: 64 62 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  db_column_double
36a0: 28 26 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64  (&s, 0);.  }.  d
36b0: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a  b_finalize(&s);.
36c0: 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f    return r;.}../
36d0: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71  *.** Execute a q
36e0: 75 65 72 79 20 61 6e 64 20 61 70 70 65 6e 64 20  uery and append 
36f0: 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  the first column
3700: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f   of the first ro
3710: 77 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 73 75  w.** of the resu
3720: 6c 74 20 73 65 74 20 74 6f 20 62 6c 6f 62 20 67  lt set to blob g
3730: 69 76 65 6e 20 69 6e 20 74 68 65 20 66 69 72 73  iven in the firs
3740: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76  t argument..*/.v
3750: 6f 69 64 20 64 62 5f 62 6c 6f 62 28 42 6c 6f 62  oid db_blob(Blob
3760: 20 2a 70 52 65 73 75 6c 74 2c 20 63 6f 6e 73 74   *pResult, const
3770: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e   char *zSql, ...
3780: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
3790: 0a 20 20 53 74 6d 74 20 73 3b 0a 20 20 76 61 5f  .  Stmt s;.  va_
37a0: 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b  start(ap, zSql);
37b0: 0a 20 20 64 62 5f 76 70 72 65 70 61 72 65 28 26  .  db_vprepare(&
37c0: 73 2c 20 30 2c 20 7a 53 71 6c 2c 20 61 70 29 3b  s, 0, zSql, ap);
37d0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
37e0: 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 73 29   if( db_step(&s)
37f0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
3800: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
3810: 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
3820: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 73 2e 70  _column_blob(s.p
3830: 53 74 6d 74 2c 20 30 29 2c 0a 20 20 20 20 20 20  Stmt, 0),.      
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
3860: 6e 5f 62 79 74 65 73 28 73 2e 70 53 74 6d 74 2c  n_bytes(s.pStmt,
3870: 20 30 29 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66   0));.  }.  db_f
3880: 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 7d 0a 0a  inalize(&s);.}..
3890: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
38a0: 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74  query.  Return t
38b0: 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  he first column 
38c0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
38d0: 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 73 75 6c  .** of the resul
38e0: 74 20 73 65 74 20 61 73 20 61 20 73 74 72 69 6e  t set as a strin
38f0: 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  g.  Space to hol
3900: 64 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 0a  d the string is.
3910: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
3920: 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 49 66 20 74   malloc().  If t
3930: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  he result set is
3940: 20 65 6d 70 74 79 2c 20 72 65 74 75 72 6e 0a 2a   empty, return.*
3950: 2a 20 7a 44 65 66 61 75 6c 74 20 69 6e 73 74 65  * zDefault inste
3960: 61 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 64 62 5f  ad..*/.char *db_
3970: 74 65 78 74 28 63 68 61 72 20 2a 7a 44 65 66 61  text(char *zDefa
3980: 75 6c 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ult, const char 
3990: 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76  *zSql, ...){.  v
39a0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d  a_list ap;.  Stm
39b0: 74 20 73 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  t s;.  char *z;.
39c0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
39d0: 53 71 6c 29 3b 0a 20 20 64 62 5f 76 70 72 65 70  Sql);.  db_vprep
39e0: 61 72 65 28 26 73 2c 20 30 2c 20 7a 53 71 6c 2c  are(&s, 0, zSql,
39f0: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
3a00: 70 29 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65  p);.  if( db_ste
3a10: 70 28 26 73 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&s)==SQLITE_RO
3a20: 57 20 29 7b 0a 20 20 20 20 7a 20 3d 20 6d 70 72  W ){.    z = mpr
3a30: 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
3a40: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 73  e3_column_text(s
3a50: 2e 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 7d  .pStmt, 0));.  }
3a60: 65 6c 73 65 20 69 66 28 20 7a 44 65 66 61 75 6c  else if( zDefaul
3a70: 74 20 29 7b 0a 20 20 20 20 7a 20 3d 20 6d 70 72  t ){.    z = mpr
3a80: 69 6e 74 66 28 22 25 73 22 2c 20 7a 44 65 66 61  intf("%s", zDefa
3a90: 75 6c 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ult);.  }else{. 
3aa0: 20 20 20 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20     z = 0;.  }.  
3ab0: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b  db_finalize(&s);
3ac0: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
3ad0: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
3ae0: 33 32 29 0a 65 78 74 65 72 6e 20 63 68 61 72 20  32).extern char 
3af0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d  *sqlite3_win32_m
3b00: 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73  bcs_to_utf8(cons
3b10: 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66  t char*);.#endif
3b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
3b30: 7a 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  ze a new databas
3b40: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
3b50: 67 69 76 65 6e 20 73 63 68 65 6d 61 2e 20 20 49  given schema.  I
3b60: 66 20 61 6e 79 74 68 69 6e 67 0a 2a 2a 20 67 6f  f anything.** go
3b70: 65 73 20 77 72 6f 6e 67 2c 20 63 61 6c 6c 20 64  es wrong, call d
3b80: 62 5f 65 72 72 28 29 20 74 6f 20 65 78 69 74 2e  b_err() to exit.
3b90: 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 69 6e 69 74  .*/.void db_init
3ba0: 5f 64 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e  _database(.  con
3bb0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 4e 61  st char *zFileNa
3bc0: 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
3bd0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
3be0: 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 63 6f  o create */.  co
3bf0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  nst char *zSchem
3c00: 61 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  a,     /* First 
3c10: 70 61 72 74 20 6f 66 20 73 63 68 65 6d 61 20 2a  part of schema *
3c20: 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20  /.  ...         
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3c40: 41 64 64 69 74 69 6f 6e 61 6c 20 53 51 4c 20 74  Additional SQL t
3c50: 6f 20 72 75 6e 2e 20 20 54 65 72 6d 69 6e 61 74  o run.  Terminat
3c60: 65 20 77 69 74 68 20 4e 55 4c 4c 2e 20 2a 2f 0a  e with NULL. */.
3c70: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
3c80: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  ;.  int rc;.  co
3c90: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  nst char *zSql;.
3ca0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 0a 23    va_list ap;..#
3cb0: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
3cc0: 32 29 0a 20 20 7a 46 69 6c 65 4e 61 6d 65 20 3d  2).  zFileName =
3cd0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
3ce0: 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 46 69 6c  bcs_to_utf8(zFil
3cf0: 65 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  eName);.#endif. 
3d00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
3d10: 65 6e 28 7a 46 69 6c 65 4e 61 6d 65 2c 20 26 64  en(zFileName, &d
3d20: 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  b);.  if( rc!=SQ
3d30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64  LITE_OK ){.    d
3d40: 62 5f 65 72 72 28 73 71 6c 69 74 65 33 5f 65 72  b_err(sqlite3_er
3d50: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 20  rmsg(db));.  }. 
3d60: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
3d70: 6d 65 6f 75 74 28 64 62 2c 20 35 30 30 30 29 3b  meout(db, 5000);
3d80: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  .  sqlite3_exec(
3d90: 64 62 2c 20 22 42 45 47 49 4e 20 45 58 43 4c 55  db, "BEGIN EXCLU
3da0: 53 49 56 45 22 2c 20 30 2c 20 30 2c 20 30 29 3b  SIVE", 0, 0, 0);
3db0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
3dc0: 65 78 65 63 28 64 62 2c 20 7a 53 63 68 65 6d 61  exec(db, zSchema
3dd0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
3de0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3df0: 29 7b 0a 20 20 20 20 64 62 5f 65 72 72 28 73 71  ){.    db_err(sq
3e00: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
3e10: 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 73 74 61 72  );.  }.  va_star
3e20: 74 28 61 70 2c 20 7a 53 63 68 65 6d 61 29 3b 0a  t(ap, zSchema);.
3e30: 20 20 77 68 69 6c 65 28 20 28 7a 53 71 6c 20 3d    while( (zSql =
3e40: 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
3e50: 74 20 63 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a  t char*))!=0 ){.
3e60: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3e70: 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
3e80: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
3e90: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3ea0: 29 7b 0a 20 20 20 20 20 20 64 62 5f 65 72 72 28  ){.      db_err(
3eb0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
3ec0: 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  b));.    }.  }. 
3ed0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73   va_end(ap);.  s
3ee0: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
3ef0: 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
3f00: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c  0);.  sqlite3_cl
3f10: 6f 73 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ose(db);.}../*.*
3f20: 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
3f30: 65 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  e file.  Return 
3f40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
3f50: 20 6e 65 77 20 64 61 74 61 62 61 73 65 0a 2a 2a   new database.**
3f60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 41 6e   connection.  An
3f70: 20 65 72 72 6f 72 20 72 65 73 75 6c 74 73 20 69   error results i
3f80: 6e 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74 2e  n process abort.
3f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
3fa0: 65 33 20 2a 6f 70 65 6e 44 61 74 61 62 61 73 65  e3 *openDatabase
3fb0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62  (const char *zDb
3fc0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Name){.  int rc;
3fd0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3fe0: 56 66 73 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Vfs;.  sqlite3 *
3ff0: 64 62 3b 0a 0a 20 20 7a 56 66 73 20 3d 20 67 65  db;..  zVfs = ge
4000: 74 65 6e 76 28 22 46 4f 53 53 49 4c 5f 56 46 53  tenv("FOSSIL_VFS
4010: 22 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ");.#if defined(
4020: 5f 57 49 4e 33 32 29 0a 20 20 7a 44 62 4e 61 6d  _WIN32).  zDbNam
4030: 65 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  e = sqlite3_win3
4040: 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
4050: 44 62 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  DbName);.#endif.
4060: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
4070: 70 65 6e 5f 76 32 28 0a 20 20 20 20 20 20 20 7a  pen_v2(.       z
4080: 44 62 4e 61 6d 65 2c 20 26 64 62 2c 0a 20 20 20  DbName, &db,.   
4090: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
40a0: 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
40b0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a  TE_OPEN_CREATE,.
40c0: 20 20 20 20 20 20 20 7a 56 66 73 0a 20 20 29 3b         zVfs.  );
40d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
40e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 5f 65  E_OK ){.    db_e
40f0: 72 72 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  rr(sqlite3_errms
4100: 67 28 64 62 29 29 3b 0a 20 20 7d 0a 20 20 73 71  g(db));.  }.  sq
4110: 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
4120: 75 74 28 64 62 2c 20 35 30 30 30 29 3b 20 0a 20  ut(db, 5000); . 
4130: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
4140: 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  ocheckpoint(db, 
4150: 31 29 3b 20 20 2f 2a 20 53 65 74 20 74 6f 20 63  1);  /* Set to c
4160: 68 65 63 6b 70 6f 69 6e 74 20 66 72 65 71 75 65  heckpoint freque
4170: 6e 74 6c 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ntly */.  return
4180: 20 64 62 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 7a   db;.}.../*.** z
4190: 44 62 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  DbName is the na
41a0: 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
41b0: 20 66 69 6c 65 2e 20 20 49 66 20 6e 6f 20 6f 74   file.  If no ot
41c0: 68 65 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  her database.** 
41d0: 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68  file is open, th
41e0: 65 6e 20 6f 70 65 6e 20 74 68 69 73 20 6f 6e 65  en open this one
41f0: 2e 20 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  .  If another da
4200: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a  tabase file is.*
4210: 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  * already open, 
4220: 74 68 65 6e 20 61 74 74 61 63 68 20 7a 44 62 4e  then attach zDbN
4230: 61 6d 65 20 75 73 69 6e 67 20 74 68 65 20 6e 61  ame using the na
4240: 6d 65 20 7a 4c 61 62 65 6c 2e 0a 2a 2f 0a 73 74  me zLabel..*/.st
4250: 61 74 69 63 20 76 6f 69 64 20 64 62 5f 6f 70 65  atic void db_ope
4260: 6e 5f 6f 72 5f 61 74 74 61 63 68 28 63 6f 6e 73  n_or_attach(cons
4270: 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c  t char *zDbName,
4280: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61   const char *zLa
4290: 62 65 6c 29 7b 0a 20 20 69 66 28 20 21 67 2e 64  bel){.  if( !g.d
42a0: 62 20 29 7b 0a 20 20 20 20 67 2e 64 62 20 3d 20  b ){.    g.db = 
42b0: 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 44 62  openDatabase(zDb
42c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 2e 7a 4d 61  Name);.    g.zMa
42d0: 69 6e 44 62 54 79 70 65 20 3d 20 7a 4c 61 62 65  inDbType = zLabe
42e0: 6c 3b 0a 20 20 20 20 64 62 5f 63 6f 6e 6e 65 63  l;.    db_connec
42f0: 74 69 6f 6e 5f 69 6e 69 74 28 29 3b 0a 20 20 7d  tion_init();.  }
4300: 65 6c 73 65 7b 0a 23 69 66 20 64 65 66 69 6e 65  else{.#if define
4310: 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 7a 44  d(_WIN32).    zD
4320: 62 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  bName = sqlite3_
4330: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
4340: 66 38 28 7a 44 62 4e 61 6d 65 29 3b 0a 23 65 6e  f8(zDbName);.#en
4350: 64 69 66 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69  dif.    db_multi
4360: 5f 65 78 65 63 28 22 41 54 54 41 43 48 20 44 41  _exec("ATTACH DA
4370: 54 41 42 41 53 45 20 25 51 20 41 53 20 25 73 22  TABASE %Q AS %s"
4380: 2c 20 7a 44 62 4e 61 6d 65 2c 20 7a 4c 61 62 65  , zDbName, zLabe
4390: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
43a0: 20 4f 70 65 6e 20 74 68 65 20 75 73 65 72 20 64   Open the user d
43b0: 61 74 61 62 61 73 65 20 69 6e 20 22 7e 2f 2e 66  atabase in "~/.f
43c0: 6f 73 73 69 6c 22 2e 20 20 43 72 65 61 74 65 20  ossil".  Create 
43d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 65  the database ane
43e0: 77 20 69 66 0a 2a 2a 20 69 74 20 64 6f 65 73 20  w if.** it does 
43f0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
4400: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
4410: 75 73 65 41 74 74 61 63 68 20 66 6c 61 67 20 69  useAttach flag i
4420: 73 20 30 20 28 74 68 65 20 75 73 75 61 6c 20 63  s 0 (the usual c
4430: 61 73 65 29 20 74 68 65 6e 20 74 68 65 20 75 73  ase) then the us
4440: 65 72 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  er database is.*
4450: 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 65  * opened on a se
4460: 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20  parate database 
4470: 63 6f 6e 6e 65 63 74 69 6f 6e 20 67 2e 64 62 43  connection g.dbC
4480: 6f 6e 66 69 67 2e 20 20 54 68 69 73 20 70 72 65  onfig.  This pre
4490: 76 65 6e 74 73 0a 2a 2a 20 74 68 65 20 7e 2f 2e  vents.** the ~/.
44a0: 66 6f 73 73 69 6c 20 64 61 74 61 62 61 73 65 20  fossil database 
44b0: 66 72 6f 6d 20 62 65 63 6f 6d 69 6e 67 20 6c 6f  from becoming lo
44c0: 63 6b 65 64 20 6f 6e 20 6c 6f 6e 67 20 63 68 65  cked on long che
44d0: 63 6b 2d 69 6e 20 6f 72 20 73 79 6e 63 0a 2a 2a  ck-in or sync.**
44e0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 69 63   operations whic
44f0: 68 20 68 6f 6c 64 20 61 6e 20 65 78 63 6c 75 73  h hold an exclus
4500: 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
4510: 20 20 49 6e 20 61 20 66 65 77 20 63 61 73 65 73    In a few cases
4520: 2c 20 74 68 6f 75 67 68 2c 0a 2a 2a 20 69 74 20  , though,.** it 
4530: 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 66 6f  is convenient fo
4540: 72 20 74 68 65 20 7e 2f 2e 66 6f 73 73 69 6c 20  r the ~/.fossil 
4550: 74 6f 20 62 65 20 61 74 74 61 63 68 65 64 20 74  to be attached t
4560: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
4570: 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
4580: 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  n so that we can
4590: 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 20 74 68   join between th
45a0: 65 20 76 61 72 69 6f 75 73 20 64 61 74 61 62 61  e various databa
45b0: 73 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 2a 2a  ses.  In that.**
45c0: 20 63 61 73 65 2c 20 69 6e 76 6f 6b 65 20 74 68   case, invoke th
45d0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  is routine with 
45e0: 75 73 65 41 74 74 61 63 68 20 61 73 20 31 2e 0a  useAttach as 1..
45f0: 2a 2f 0a 76 6f 69 64 20 64 62 5f 6f 70 65 6e 5f  */.void db_open_
4600: 63 6f 6e 66 69 67 28 69 6e 74 20 75 73 65 41 74  config(int useAt
4610: 74 61 63 68 29 7b 0a 20 20 63 68 61 72 20 2a 7a  tach){.  char *z
4620: 44 62 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20  DbName;.  const 
4630: 63 68 61 72 20 2a 7a 48 6f 6d 65 3b 0a 20 20 69  char *zHome;.  i
4640: 66 28 20 67 2e 63 6f 6e 66 69 67 4f 70 65 6e 20  f( g.configOpen 
4650: 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 64 65  ) return;.#if de
4660: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20  fined(_WIN32).  
4670: 7a 48 6f 6d 65 20 3d 20 67 65 74 65 6e 76 28 22  zHome = getenv("
4680: 4c 4f 43 41 4c 41 50 50 44 41 54 41 22 29 3b 0a  LOCALAPPDATA");.
4690: 20 20 69 66 28 20 7a 48 6f 6d 65 3d 3d 30 20 29    if( zHome==0 )
46a0: 7b 0a 20 20 20 20 7a 48 6f 6d 65 20 3d 20 67 65  {.    zHome = ge
46b0: 74 65 6e 76 28 22 41 50 50 44 41 54 41 22 29 3b  tenv("APPDATA");
46c0: 0a 20 20 20 20 69 66 28 20 7a 48 6f 6d 65 3d 3d  .    if( zHome==
46d0: 30 20 29 7b 0a 20 20 20 20 20 20 7a 48 6f 6d 65  0 ){.      zHome
46e0: 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45 50   = getenv("HOMEP
46f0: 41 54 48 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ATH");.    }.  }
4700: 0a 20 20 69 66 28 20 7a 48 6f 6d 65 3d 3d 30 20  .  if( zHome==0 
4710: 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61  ){.    fossil_fa
4720: 74 61 6c 28 22 63 61 6e 6e 6f 74 20 6c 6f 63 61  tal("cannot loca
4730: 74 65 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72  te home director
4740: 79 20 2d 20 22 0a 20 20 20 20 20 20 20 20 20 20  y - ".          
4750: 20 20 20 20 20 20 22 70 6c 65 61 73 65 20 73 65        "please se
4760: 74 20 74 68 65 20 48 4f 4d 45 50 41 54 48 20 65  t the HOMEPATH e
4770: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
4780: 62 6c 65 22 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ble");.  }.#else
4790: 0a 20 20 7a 48 6f 6d 65 20 3d 20 67 65 74 65 6e  .  zHome = geten
47a0: 76 28 22 48 4f 4d 45 22 29 3b 0a 20 20 69 66 28  v("HOME");.  if(
47b0: 20 7a 48 6f 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zHome==0 ){.   
47c0: 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 63   fossil_fatal("c
47d0: 61 6e 6e 6f 74 20 6c 6f 63 61 74 65 20 68 6f 6d  annot locate hom
47e0: 65 20 64 69 72 65 63 74 6f 72 79 20 2d 20 22 0a  e directory - ".
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4800: 20 22 70 6c 65 61 73 65 20 73 65 74 20 74 68 65   "please set the
4810: 20 48 4f 4d 45 20 65 6e 76 69 72 6f 6e 6d 65 6e   HOME environmen
4820: 74 20 76 61 72 69 61 62 6c 65 22 29 3b 0a 20 20  t variable");.  
4830: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 66  }.#endif.  if( f
4840: 69 6c 65 5f 69 73 64 69 72 28 7a 48 6f 6d 65 29  ile_isdir(zHome)
4850: 21 3d 31 20 29 7b 0a 20 20 20 20 66 6f 73 73 69  !=1 ){.    fossi
4860: 6c 5f 66 61 74 61 6c 28 22 69 6e 76 61 6c 69 64  l_fatal("invalid
4870: 20 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 3a   home directory:
4880: 20 25 73 22 2c 20 7a 48 6f 6d 65 29 3b 0a 20 20   %s", zHome);.  
4890: 7d 0a 23 69 66 6e 64 65 66 20 5f 57 49 4e 33 32  }.#ifndef _WIN32
48a0: 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 48  .  if( access(zH
48b0: 6f 6d 65 2c 20 57 5f 4f 4b 29 20 29 7b 0a 20 20  ome, W_OK) ){.  
48c0: 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22    fossil_fatal("
48d0: 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 20 25  home directory %
48e0: 73 20 6d 75 73 74 20 62 65 20 77 72 69 74 65 61  s must be writea
48f0: 62 6c 65 22 2c 20 7a 48 6f 6d 65 29 3b 0a 20 20  ble", zHome);.  
4900: 7d 0a 23 65 6e 64 69 66 0a 20 20 67 2e 7a 48 6f  }.#endif.  g.zHo
4910: 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 2f  me = mprintf("%/
4920: 22 2c 20 7a 48 6f 6d 65 29 3b 0a 23 69 66 20 64  ", zHome);.#if d
4930: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20  efined(_WIN32). 
4940: 20 2f 2a 20 2e 20 66 69 6c 65 6e 61 6d 65 73 20   /* . filenames 
4950: 67 69 76 65 20 73 6f 6d 65 20 77 69 6e 64 6f 77  give some window
4960: 20 73 79 73 74 65 6d 73 20 70 72 6f 62 6c 65 6d   systems problem
4970: 73 20 61 6e 64 20 6d 61 6e 79 20 61 70 70 73 20  s and many apps 
4980: 70 72 6f 62 6c 65 6d 73 20 2a 2f 0a 20 20 7a 44  problems */.  zD
4990: 62 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28  bName = mprintf(
49a0: 22 25 2f 2f 5f 66 6f 73 73 69 6c 22 2c 20 7a 48  "%//_fossil", zH
49b0: 6f 6d 65 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 44  ome);.#else.  zD
49c0: 62 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28  bName = mprintf(
49d0: 22 25 73 2f 2e 66 6f 73 73 69 6c 22 2c 20 7a 48  "%s/.fossil", zH
49e0: 6f 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  ome);.#endif.  i
49f0: 66 28 20 66 69 6c 65 5f 73 69 7a 65 28 7a 44 62  f( file_size(zDb
4a00: 4e 61 6d 65 29 3c 31 30 32 34 2a 33 20 29 7b 0a  Name)<1024*3 ){.
4a10: 20 20 20 20 64 62 5f 69 6e 69 74 5f 64 61 74 61      db_init_data
4a20: 62 61 73 65 28 7a 44 62 4e 61 6d 65 2c 20 7a 43  base(zDbName, zC
4a30: 6f 6e 66 69 67 53 63 68 65 6d 61 2c 20 28 63 68  onfigSchema, (ch
4a40: 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 67 2e  ar*)0);.  }.  g.
4a50: 75 73 65 41 74 74 61 63 68 20 3d 20 75 73 65 41  useAttach = useA
4a60: 74 74 61 63 68 3b 0a 20 20 69 66 28 20 75 73 65  ttach;.  if( use
4a70: 41 74 74 61 63 68 20 29 7b 0a 20 20 20 20 64 62  Attach ){.    db
4a80: 5f 6f 70 65 6e 5f 6f 72 5f 61 74 74 61 63 68 28  _open_or_attach(
4a90: 7a 44 62 4e 61 6d 65 2c 20 22 63 6f 6e 66 69 67  zDbName, "config
4aa0: 64 62 22 29 3b 0a 20 20 20 20 67 2e 64 62 43 6f  db");.    g.dbCo
4ab0: 6e 66 69 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nfig = 0;.  }els
4ac0: 65 7b 0a 20 20 20 20 67 2e 64 62 43 6f 6e 66 69  e{.    g.dbConfi
4ad0: 67 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65  g = openDatabase
4ae0: 28 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  (zDbName);.  }. 
4af0: 20 67 2e 63 6f 6e 66 69 67 4f 70 65 6e 20 3d 20   g.configOpen = 
4b00: 31 3b 0a 20 20 66 72 65 65 28 7a 44 62 4e 61 6d  1;.  free(zDbNam
4b10: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  e);.}../*.** If 
4b20: 7a 44 62 4e 61 6d 65 20 69 73 20 61 20 76 61 6c  zDbName is a val
4b30: 69 64 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73  id local databas
4b40: 65 20 66 69 6c 65 2c 20 6f 70 65 6e 20 69 74 20  e file, open it 
4b50: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 72  and return.** tr
4b60: 75 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ue.  If it is no
4b70: 74 20 61 20 76 61 6c 69 64 20 6c 6f 63 61 6c 20  t a valid local 
4b80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
4b90: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
4ba0: 69 63 20 69 6e 74 20 69 73 56 61 6c 69 64 4c 6f  ic int isValidLo
4bb0: 63 61 6c 44 62 28 63 6f 6e 73 74 20 63 68 61 72  calDb(const char
4bc0: 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 36   *zDbName){.  i6
4bd0: 34 20 6c 73 69 7a 65 3b 0a 20 20 69 6e 74 20 72  4 lsize;.  int r
4be0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  c;.  sqlite3_stm
4bf0: 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
4c00: 20 61 63 63 65 73 73 28 7a 44 62 4e 61 6d 65 2c   access(zDbName,
4c10: 20 46 5f 4f 4b 29 20 29 20 72 65 74 75 72 6e 20   F_OK) ) return 
4c20: 30 3b 0a 20 20 6c 73 69 7a 65 20 3d 20 66 69 6c  0;.  lsize = fil
4c30: 65 5f 73 69 7a 65 28 7a 44 62 4e 61 6d 65 29 3b  e_size(zDbName);
4c40: 0a 20 20 69 66 28 20 6c 73 69 7a 65 25 31 30 32  .  if( lsize%102
4c50: 34 21 3d 30 20 7c 7c 20 6c 73 69 7a 65 3c 34 30  4!=0 || lsize<40
4c60: 39 36 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  96 ) return 0;. 
4c70: 20 64 62 5f 6f 70 65 6e 5f 6f 72 5f 61 74 74 61   db_open_or_atta
4c80: 63 68 28 7a 44 62 4e 61 6d 65 2c 20 22 6c 6f 63  ch(zDbName, "loc
4c90: 61 6c 64 62 22 29 3b 0a 20 20 67 2e 6c 6f 63 61  aldb");.  g.loca
4ca0: 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 64 62 5f  lOpen = 1;.  db_
4cb0: 6f 70 65 6e 5f 63 6f 6e 66 69 67 28 30 29 3b 0a  open_config(0);.
4cc0: 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69    db_open_reposi
4cd0: 74 6f 72 79 28 30 29 3b 0a 0a 20 20 2f 2a 20 49  tory(0);..  /* I
4ce0: 66 20 74 68 65 20 22 69 73 65 78 65 22 20 63 6f  f the "isexe" co
4cf0: 6c 75 6d 6e 20 69 73 20 6d 69 73 73 69 6e 67 20  lumn is missing 
4d00: 66 72 6f 6d 20 74 68 65 20 76 66 69 6c 65 20 74  from the vfile t
4d10: 61 62 6c 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  able, then.  ** 
4d20: 61 64 64 20 69 74 20 6e 6f 77 2e 20 20 20 54 68  add it now.   Th
4d30: 69 73 20 63 6f 64 65 20 61 64 64 65 64 20 6f 6e  is code added on
4d40: 20 32 30 31 30 2d 30 33 2d 30 36 2e 20 20 41 66   2010-03-06.  Af
4d50: 74 65 72 20 61 6c 6c 20 75 73 65 72 73 20 68 61  ter all users ha
4d60: 76 65 0a 20 20 2a 2a 20 75 70 67 72 61 64 65 64  ve.  ** upgraded
4d70: 2c 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20  , this code can 
4d80: 62 65 20 73 61 66 65 6c 79 20 64 65 6c 65 74 65  be safely delete
4d90: 64 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  d. .  */.  rc = 
4da0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
4db0: 67 2e 64 62 2c 20 22 53 45 4c 45 43 54 20 69 73  g.db, "SELECT is
4dc0: 65 78 65 20 46 52 4f 4d 20 76 66 69 6c 65 22 2c  exe FROM vfile",
4dd0: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
4de0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
4df0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  ize(pStmt);.  if
4e00: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ( rc==SQLITE_ERR
4e10: 4f 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OR ){.    sqlite
4e20: 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 22 41 4c  3_exec(g.db, "AL
4e30: 54 45 52 20 54 41 42 4c 45 20 76 66 69 6c 65 20  TER TABLE vfile 
4e40: 41 44 44 20 43 4f 4c 55 4d 4e 20 69 73 65 78 65  ADD COLUMN isexe
4e50: 20 42 4f 4f 4c 45 41 4e 22 2c 20 30 2c 20 30 2c   BOOLEAN", 0, 0,
4e60: 20 30 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 30 0a   0);.  }..#if 0.
4e70: 20 20 2f 2a 20 49 66 20 74 68 65 20 22 6d 74 69    /* If the "mti
4e80: 6d 65 22 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 69  me" column is mi
4e90: 73 73 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 76  ssing from the v
4ea0: 66 69 6c 65 20 74 61 62 6c 65 2c 20 74 68 65 6e  file table, then
4eb0: 0a 20 20 2a 2a 20 61 64 64 20 69 74 20 6e 6f 77  .  ** add it now
4ec0: 2e 20 20 20 54 68 69 73 20 63 6f 64 65 20 61 64  .   This code ad
4ed0: 64 65 64 20 6f 6e 20 32 30 30 38 2d 31 32 2d 30  ded on 2008-12-0
4ee0: 36 2e 20 20 41 66 74 65 72 20 61 6c 6c 20 75 73  6.  After all us
4ef0: 65 72 73 20 68 61 76 65 0a 20 20 2a 2a 20 75 70  ers have.  ** up
4f00: 67 72 61 64 65 64 2c 20 74 68 69 73 20 63 6f 64  graded, this cod
4f10: 65 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20  e can be safely 
4f20: 64 65 6c 65 74 65 64 2e 20 0a 20 20 2a 2f 0a 20  deleted. .  */. 
4f30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
4f40: 65 70 61 72 65 28 67 2e 64 62 2c 20 22 53 45 4c  epare(g.db, "SEL
4f50: 45 43 54 20 6d 74 69 6d 65 20 46 52 4f 4d 20 76  ECT mtime FROM v
4f60: 66 69 6c 65 22 2c 20 2d 31 2c 20 26 70 53 74 6d  file", -1, &pStm
4f70: 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
4f80: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
4f90: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
4fa0: 54 45 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  TE_ERROR ){.    
4fb0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64  sqlite3_exec(g.d
4fc0: 62 2c 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20  b, "ALTER TABLE 
4fd0: 76 66 69 6c 65 20 41 44 44 20 43 4f 4c 55 4d 4e  vfile ADD COLUMN
4fe0: 20 6d 74 69 6d 65 20 49 4e 54 45 47 45 52 22 2c   mtime INTEGER",
4ff0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23   0, 0, 0);.  }.#
5000: 65 6e 64 69 66 0a 0a 23 69 66 20 30 0a 20 20 2f  endif..#if 0.  /
5010: 2a 20 49 66 20 74 68 65 20 22 6f 72 69 67 6e 61  * If the "origna
5020: 6d 65 22 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 69  me" column is mi
5030: 73 73 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 76  ssing from the v
5040: 66 69 6c 65 20 74 61 62 6c 65 2c 20 74 68 65 6e  file table, then
5050: 0a 20 20 2a 2a 20 61 64 64 20 69 74 20 6e 6f 77  .  ** add it now
5060: 2e 20 20 20 54 68 69 73 20 63 6f 64 65 20 61 64  .   This code ad
5070: 64 65 64 20 6f 6e 20 32 30 30 38 2d 31 31 2d 30  ded on 2008-11-0
5080: 39 2e 20 20 41 66 74 65 72 20 61 6c 6c 20 75 73  9.  After all us
5090: 65 72 73 20 68 61 76 65 0a 20 20 2a 2a 20 75 70  ers have.  ** up
50a0: 67 72 61 64 65 64 2c 20 74 68 69 73 20 63 6f 64  graded, this cod
50b0: 65 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20  e can be safely 
50c0: 64 65 6c 65 74 65 64 2e 20 0a 20 20 2a 2f 0a 20  deleted. .  */. 
50d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
50e0: 65 70 61 72 65 28 67 2e 64 62 2c 20 22 53 45 4c  epare(g.db, "SEL
50f0: 45 43 54 20 6f 72 69 67 6e 61 6d 65 20 46 52 4f  ECT origname FRO
5100: 4d 20 76 66 69 6c 65 22 2c 20 2d 31 2c 20 26 70  M vfile", -1, &p
5110: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Stmt, 0);.  sqli
5120: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
5130: 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  mt);.  if( rc==S
5140: 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 7b 0a 20  QLITE_ERROR ){. 
5150: 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
5160: 67 2e 64 62 2c 20 22 41 4c 54 45 52 20 54 41 42  g.db, "ALTER TAB
5170: 4c 45 20 76 66 69 6c 65 20 41 44 44 20 43 4f 4c  LE vfile ADD COL
5180: 55 4d 4e 20 6f 72 69 67 6e 61 6d 65 20 54 45 58  UMN origname TEX
5190: 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  T", 0, 0, 0);.  
51a0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
51b0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn 1;.}../*.** L
51c0: 6f 63 61 74 65 20 74 68 65 20 72 6f 6f 74 20 64  ocate the root d
51d0: 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
51e0: 6c 6f 63 61 6c 20 72 65 70 6f 73 69 74 6f 72 79  local repository
51f0: 20 74 72 65 65 2e 20 20 54 68 65 20 72 6f 6f 74   tree.  The root
5200: 0a 2a 2a 20 64 69 72 65 63 74 6f 72 79 20 69 73  .** directory is
5210: 20 66 6f 75 6e 64 20 62 79 20 73 65 61 72 63 68   found by search
5220: 69 6e 67 20 66 6f 72 20 61 20 66 69 6c 65 20 6e  ing for a file n
5230: 61 6d 65 64 20 22 5f 46 4f 53 53 49 4c 5f 22 20  amed "_FOSSIL_" 
5240: 6f 72 20 22 2e 66 6f 73 22 0a 2a 2a 20 74 68 61  or ".fos".** tha
5250: 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 76 61 6c  t contains a val
5260: 69 64 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61  id repository da
5270: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
5280: 20 6e 6f 20 76 61 6c 69 64 20 5f 46 4f 53 53 49   no valid _FOSSI
5290: 4c 5f 20 6f 72 20 2e 66 6f 73 20 66 69 6c 65 20  L_ or .fos file 
52a0: 69 73 20 66 6f 75 6e 64 2c 20 77 65 20 6d 6f 76  is found, we mov
52b0: 65 20 75 70 20 6f 6e 65 20 6c 65 76 65 6c 20 61  e up one level a
52c0: 6e 64 20 0a 2a 2a 20 74 72 79 20 61 67 61 69 6e  nd .** try again
52d0: 2e 20 4f 6e 63 65 20 74 68 65 20 66 69 6c 65 20  . Once the file 
52e0: 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 67 2e  is found, the g.
52f0: 7a 4c 6f 63 61 6c 52 6f 6f 74 20 76 61 72 69 61  zLocalRoot varia
5300: 62 6c 65 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f  ble is set.** to
5310: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
5320: 20 72 65 70 6f 73 69 74 6f 72 79 20 74 72 65 65   repository tree
5330: 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
5340: 65 20 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66  e returns 1.  If
5350: 0a 2a 2a 20 6e 6f 20 64 61 74 61 62 61 73 65 20  .** no database 
5360: 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  is found, then t
5370: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
5380: 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rn 0..**.** This
5390: 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20   routine always 
53a0: 6f 70 65 6e 73 20 74 68 65 20 75 73 65 72 20 64  opens the user d
53b0: 61 74 61 62 61 73 65 20 72 65 67 61 72 64 6c 65  atabase regardle
53c0: 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
53d0: 0a 2a 2a 20 6e 6f 74 20 74 68 65 20 72 65 70 6f  .** not the repo
53e0: 73 69 74 6f 72 79 20 64 61 74 61 62 61 73 65 20  sitory database 
53f0: 69 73 20 66 6f 75 6e 64 2e 20 20 49 66 20 74 68  is found.  If th
5400: 65 20 5f 46 4f 53 53 49 4c 5f 20 6f 72 20 2e 66  e _FOSSIL_ or .f
5410: 6f 73 20 66 69 6c 65 0a 2a 2a 20 69 73 20 66 6f  os file.** is fo
5420: 75 6e 64 2c 20 69 74 20 69 73 20 61 74 74 61 63  und, it is attac
5430: 68 65 64 20 74 6f 20 74 68 65 20 6f 70 65 6e 20  hed to the open 
5440: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
5450: 69 6f 6e 20 74 6f 6f 2e 0a 2a 2f 0a 69 6e 74 20  ion too..*/.int 
5460: 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 76 6f  db_open_local(vo
5470: 69 64 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  id){.  int i, n;
5480: 0a 20 20 63 68 61 72 20 7a 50 77 64 5b 32 30 30  .  char zPwd[200
5490: 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 50 77 64  0];.  char *zPwd
54a0: 43 6f 6e 76 3b 0a 20 20 73 74 61 74 69 63 20 63  Conv;.  static c
54b0: 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 62 4e 61  onst char *aDbNa
54c0: 6d 65 5b 5d 20 3d 20 7b 20 22 2f 5f 46 4f 53 53  me[] = { "/_FOSS
54d0: 49 4c 5f 22 2c 20 22 2f 2e 66 6f 73 22 20 7d 3b  IL_", "/.fos" };
54e0: 0a 20 20 0a 20 20 69 66 28 20 67 2e 6c 6f 63 61  .  .  if( g.loca
54f0: 6c 4f 70 65 6e 29 20 72 65 74 75 72 6e 20 31 3b  lOpen) return 1;
5500: 0a 20 20 69 66 28 20 67 65 74 63 77 64 28 7a 50  .  if( getcwd(zP
5510: 77 64 2c 20 73 69 7a 65 6f 66 28 7a 50 77 64 29  wd, sizeof(zPwd)
5520: 2d 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64  -20)==0 ){.    d
5530: 62 5f 65 72 72 28 22 70 77 64 20 74 6f 6f 20 62  b_err("pwd too b
5540: 69 67 3a 20 6d 61 78 20 25 64 22 2c 20 73 69 7a  ig: max %d", siz
5550: 65 6f 66 28 7a 50 77 64 29 2d 32 30 29 3b 0a 20  eof(zPwd)-20);. 
5560: 20 7d 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28   }.  n = strlen(
5570: 7a 50 77 64 29 3b 0a 20 20 7a 50 77 64 43 6f 6e  zPwd);.  zPwdCon
5580: 76 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 2f 22  v = mprintf("%/"
5590: 2c 20 7a 50 77 64 29 3b 0a 20 20 73 74 72 6e 63  , zPwd);.  strnc
55a0: 70 79 28 7a 50 77 64 2c 20 7a 50 77 64 43 6f 6e  py(zPwd, zPwdCon
55b0: 76 2c 20 32 30 30 30 2d 32 30 29 3b 0a 20 20 66  v, 2000-20);.  f
55c0: 72 65 65 28 7a 50 77 64 43 6f 6e 76 29 3b 0a 20  ree(zPwdConv);. 
55d0: 20 77 68 69 6c 65 28 20 6e 3e 30 20 29 7b 0a 20   while( n>0 ){. 
55e0: 20 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 50     if( access(zP
55f0: 77 64 2c 20 57 5f 4f 4b 29 20 29 20 62 72 65 61  wd, W_OK) ) brea
5600: 6b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  k;.    for(i=0; 
5610: 69 3c 73 69 7a 65 6f 66 28 61 44 62 4e 61 6d 65  i<sizeof(aDbName
5620: 29 2f 73 69 7a 65 6f 66 28 61 44 62 4e 61 6d 65  )/sizeof(aDbName
5630: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
5640: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
5650: 74 66 28 73 69 7a 65 6f 66 28 7a 50 77 64 29 2d  tf(sizeof(zPwd)-
5660: 6e 2c 20 26 7a 50 77 64 5b 6e 5d 2c 20 22 25 73  n, &zPwd[n], "%s
5670: 22 2c 20 61 44 62 4e 61 6d 65 5b 69 5d 29 3b 0a  ", aDbName[i]);.
5680: 20 20 20 20 20 20 69 66 28 20 69 73 56 61 6c 69        if( isVali
5690: 64 4c 6f 63 61 6c 44 62 28 7a 50 77 64 29 20 29  dLocalDb(zPwd) )
56a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 75  {.        /* Fou
56b0: 6e 64 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b  nd a valid check
56c0: 6f 75 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  out database fil
56d0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 50 77  e */.        zPw
56e0: 64 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  d[n] = 0;.      
56f0: 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20    while( n>1 && 
5700: 7a 50 77 64 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29  zPwd[n-1]=='/' )
5710: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 2d 2d 3b  {.          n--;
5720: 0a 20 20 20 20 20 20 20 20 20 20 7a 50 77 64 5b  .          zPwd[
5730: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  n] = 0;.        
5740: 7d 0a 20 20 20 20 20 20 20 20 67 2e 7a 4c 6f 63  }.        g.zLoc
5750: 61 6c 52 6f 6f 74 20 3d 20 6d 70 72 69 6e 74 66  alRoot = mprintf
5760: 28 22 25 73 2f 22 2c 20 7a 50 77 64 29 3b 0a 20  ("%s/", zPwd);. 
5770: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
5780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5790: 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 77 68 69 6c     n--;.    whil
57a0: 65 28 20 6e 3e 30 20 26 26 20 7a 50 77 64 5b 6e  e( n>0 && zPwd[n
57b0: 5d 21 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d  ]!='/' ){ n--; }
57c0: 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  .    while( n>0 
57d0: 26 26 20 7a 50 77 64 5b 6e 2d 31 5d 3d 3d 27 2f  && zPwd[n-1]=='/
57e0: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ n--; }.    
57f0: 7a 50 77 64 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d  zPwd[n] = 0;.  }
5800: 0a 0a 20 20 2f 2a 20 41 20 63 68 65 63 6b 6f 75  ..  /* A checkou
5810: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  t database file 
5820: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 6f 75  could not be fou
5830: 6e 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30  nd */.  return 0
5840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
5850: 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20 64  the repository d
5860: 61 74 61 62 61 73 65 20 67 69 76 65 6e 20 62 79  atabase given by
5870: 20 7a 44 62 4e 61 6d 65 2e 20 20 49 66 20 7a 44   zDbName.  If zD
5880: 62 4e 61 6d 65 3d 3d 4e 55 4c 4c 20 74 68 65 6e  bName==NULL then
5890: 0a 2a 2a 20 67 65 74 20 74 68 65 20 6e 61 6d 65  .** get the name
58a0: 20 66 72 6f 6d 20 74 68 65 20 61 6c 72 65 61 64   from the alread
58b0: 79 20 6f 70 65 6e 20 6c 6f 63 61 6c 20 64 61 74  y open local dat
58c0: 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64  abase..*/.void d
58d0: 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72  b_open_repositor
58e0: 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  y(const char *zD
58f0: 62 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 67 2e  bName){.  if( g.
5900: 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20 29  repositoryOpen )
5910: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a   return;.  if( z
5920: 44 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  DbName==0 ){.   
5930: 20 69 66 28 20 67 2e 6c 6f 63 61 6c 4f 70 65 6e   if( g.localOpen
5940: 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 4e 61 6d   ){.      zDbNam
5950: 65 20 3d 20 64 62 5f 6c 67 65 74 28 22 72 65 70  e = db_lget("rep
5960: 6f 73 69 74 6f 72 79 22 2c 20 30 29 3b 0a 20 20  ository", 0);.  
5970: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 62 4e    }.    if( zDbN
5980: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
5990: 64 62 5f 65 72 72 28 22 75 6e 61 62 6c 65 20 74  db_err("unable t
59a0: 6f 20 66 69 6e 64 20 74 68 65 20 6e 61 6d 65 20  o find the name 
59b0: 6f 66 20 61 20 72 65 70 6f 73 69 74 6f 72 79 20  of a repository 
59c0: 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20  database");.    
59d0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 63 63 65  }.  }.  if( acce
59e0: 73 73 28 7a 44 62 4e 61 6d 65 2c 20 52 5f 4f 4b  ss(zDbName, R_OK
59f0: 29 20 7c 7c 20 66 69 6c 65 5f 73 69 7a 65 28 7a  ) || file_size(z
5a00: 44 62 4e 61 6d 65 29 3c 31 30 32 34 20 29 7b 0a  DbName)<1024 ){.
5a10: 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28 7a      if( access(z
5a20: 44 62 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20  DbName, 0) ){.  
5a30: 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63      fossil_panic
5a40: 28 22 72 65 70 6f 73 69 74 6f 72 79 20 64 6f 65  ("repository doe
5a50: 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 22 0a  s not exist or".
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 20 20 20 22 20 69 73 20 69 6e 20 61 6e 20 75 6e     " is in an un
5a80: 72 65 61 64 61 62 6c 65 20 64 69 72 65 63 74 6f  readable directo
5a90: 72 79 3a 20 25 73 22 2c 20 7a 44 62 4e 61 6d 65  ry: %s", zDbName
5aa0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
5ab0: 20 61 63 63 65 73 73 28 7a 44 62 4e 61 6d 65 2c   access(zDbName,
5ac0: 20 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20   R_OK) ){.      
5ad0: 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 72 65  fossil_panic("re
5ae0: 61 64 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65  ad permission de
5af0: 6e 69 65 64 20 66 6f 72 20 72 65 70 6f 73 69 74  nied for reposit
5b00: 6f 72 79 20 25 73 22 2c 20 7a 44 62 4e 61 6d 65  ory %s", zDbName
5b10: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
5b20: 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63      fossil_panic
5b30: 28 22 6e 6f 74 20 61 20 76 61 6c 69 64 20 72 65  ("not a valid re
5b40: 70 6f 73 69 74 6f 72 79 3a 20 25 73 22 2c 20 7a  pository: %s", z
5b50: 44 62 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  DbName);.    }. 
5b60: 20 7d 0a 20 20 64 62 5f 6f 70 65 6e 5f 6f 72 5f   }.  db_open_or_
5b70: 61 74 74 61 63 68 28 7a 44 62 4e 61 6d 65 2c 20  attach(zDbName, 
5b80: 22 72 65 70 6f 73 69 74 6f 72 79 22 29 3b 0a 20  "repository");. 
5b90: 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65   g.repositoryOpe
5ba0: 6e 20 3d 20 31 3b 0a 20 20 67 2e 7a 52 65 70 6f  n = 1;.  g.zRepo
5bb0: 73 69 74 6f 72 79 4e 61 6d 65 20 3d 20 6d 70 72  sitoryName = mpr
5bc0: 69 6e 74 66 28 22 25 73 22 2c 20 7a 44 62 4e 61  intf("%s", zDbNa
5bd0: 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  me);.}../*.** Fl
5be0: 61 67 73 20 66 6f 72 20 74 68 65 20 64 62 5f 66  ags for the db_f
5bf0: 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f 72 65 70  ind_and_open_rep
5c00: 6f 73 69 74 6f 72 79 28 29 20 66 75 6e 63 74 69  ository() functi
5c10: 6f 6e 2e 0a 2a 2f 0a 23 69 66 20 49 4e 54 45 52  on..*/.#if INTER
5c20: 46 41 43 45 0a 23 64 65 66 69 6e 65 20 4f 50 45  FACE.#define OPE
5c30: 4e 5f 4f 4b 5f 4e 4f 54 5f 46 4f 55 4e 44 20 20  N_OK_NOT_FOUND  
5c40: 20 20 30 78 30 30 31 20 20 20 20 20 20 2f 2a 20    0x001      /* 
5c50: 44 6f 20 6e 6f 74 20 65 72 72 6f 72 20 6f 75 74  Do not error out
5c60: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 20 2a 2f   if not found */
5c70: 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f 41 4e  .#define OPEN_AN
5c80: 59 5f 53 43 48 45 4d 41 20 20 20 20 20 20 30 78  Y_SCHEMA      0x
5c90: 30 30 32 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  002      /* Do n
5ca0: 6f 74 20 65 72 72 6f 72 20 69 66 20 73 63 68 65  ot error if sche
5cb0: 6d 61 20 69 73 20 77 72 6f 6e 67 20 2a 2f 0a 23  ma is wrong */.#
5cc0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  endif../*.** Try
5cd0: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 72 65 70   to find the rep
5ce0: 6f 73 69 74 6f 72 79 20 61 6e 64 20 6f 70 65 6e  ository and open
5cf0: 20 69 74 2e 20 20 55 73 65 20 74 68 65 20 2d 52   it.  Use the -R
5d00: 20 6f 72 20 2d 2d 72 65 70 6f 73 69 74 6f 72 79   or --repository
5d10: 0a 2a 2a 20 6f 70 74 69 6f 6e 20 74 6f 20 6c 6f  .** option to lo
5d20: 63 61 74 65 20 74 68 65 20 72 65 70 6f 73 69 74  cate the reposit
5d30: 6f 72 79 2e 20 20 49 66 20 6e 6f 20 73 75 63 68  ory.  If no such
5d40: 20 6f 70 74 69 6f 6e 20 69 73 20 61 76 61 69 6c   option is avail
5d50: 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 75 73  able, then.** us
5d60: 65 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79  e the repository
5d70: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 63 68 65   of the open che
5d80: 63 6b 6f 75 74 20 69 66 20 74 68 65 72 65 20 69  ckout if there i
5d90: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 45 72 72  s one..**.** Err
5da0: 6f 72 20 6f 75 74 20 69 66 20 74 68 65 20 72 65  or out if the re
5db0: 70 6f 73 69 74 6f 72 79 20 63 61 6e 6e 6f 74 20  pository cannot 
5dc0: 62 65 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f  be opened..*/.vo
5dd0: 69 64 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f  id db_find_and_o
5de0: 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 69  pen_repository(i
5df0: 6e 74 20 62 46 6c 61 67 73 2c 20 69 6e 74 20 6e  nt bFlags, int n
5e00: 41 72 67 55 73 65 64 29 7b 0a 20 20 63 6f 6e 73  ArgUsed){.  cons
5e10: 74 20 63 68 61 72 20 2a 7a 52 65 70 20 3d 20 66  t char *zRep = f
5e20: 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 72 65 70 6f  ind_option("repo
5e30: 73 69 74 6f 72 79 22 2c 20 22 52 22 2c 20 31 29  sitory", "R", 1)
5e40: 3b 0a 20 20 69 66 28 20 7a 52 65 70 3d 3d 30 20  ;.  if( zRep==0 
5e50: 26 26 20 6e 41 72 67 55 73 65 64 20 26 26 20 67  && nArgUsed && g
5e60: 2e 61 72 67 63 3d 3d 6e 41 72 67 55 73 65 64 2b  .argc==nArgUsed+
5e70: 31 20 29 7b 0a 20 20 20 20 7a 52 65 70 20 3d 20  1 ){.    zRep = 
5e80: 67 2e 61 72 67 76 5b 6e 41 72 67 55 73 65 64 5d  g.argv[nArgUsed]
5e90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 52 65 70  ;.  }.  if( zRep
5ea0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ==0 ){.    if( d
5eb0: 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 29 3d 3d  b_open_local()==
5ec0: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
5ed0: 72 65 70 5f 6e 6f 74 5f 66 6f 75 6e 64 3b 0a 20  rep_not_found;. 
5ee0: 20 20 20 7d 0a 20 20 20 20 7a 52 65 70 20 3d 20     }.    zRep = 
5ef0: 64 62 5f 6c 67 65 74 28 22 72 65 70 6f 73 69 74  db_lget("reposit
5f00: 6f 72 79 22 2c 20 30 29 3b 0a 20 20 20 20 69 66  ory", 0);.    if
5f10: 28 20 7a 52 65 70 3d 3d 30 20 29 7b 0a 20 20 20  ( zRep==0 ){.   
5f20: 20 20 20 67 6f 74 6f 20 72 65 70 5f 6e 6f 74 5f     goto rep_not_
5f30: 66 6f 75 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  found;.    }.  }
5f40: 0a 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73  .  db_open_repos
5f50: 69 74 6f 72 79 28 7a 52 65 70 29 3b 0a 20 20 69  itory(zRep);.  i
5f60: 66 28 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f  f( g.repositoryO
5f70: 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 28  pen ){.    if( (
5f80: 62 46 6c 61 67 73 20 26 20 4f 50 45 4e 5f 41 4e  bFlags & OPEN_AN
5f90: 59 5f 53 43 48 45 4d 41 29 3d 3d 30 20 29 20 64  Y_SCHEMA)==0 ) d
5fa0: 62 5f 76 65 72 69 66 79 5f 73 63 68 65 6d 61 28  b_verify_schema(
5fb0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
5fc0: 20 7d 0a 72 65 70 5f 6e 6f 74 5f 66 6f 75 6e 64   }.rep_not_found
5fd0: 3a 0a 20 20 69 66 28 20 28 62 46 6c 61 67 73 20  :.  if( (bFlags 
5fe0: 26 20 4f 50 45 4e 5f 4f 4b 5f 4e 4f 54 5f 46 4f  & OPEN_OK_NOT_FO
5ff0: 55 4e 44 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  UND)==0 ){.    f
6000: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 75 73 65  ossil_fatal("use
6010: 20 2d 2d 72 65 70 6f 73 69 74 6f 72 79 20 6f 72   --repository or
6020: 20 2d 52 20 74 6f 20 73 70 65 63 69 66 79 20 74   -R to specify t
6030: 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61  he repository da
6040: 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 7d 0a  tabase");.  }.}.
6050: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
6060: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
6070: 74 61 62 61 73 65 20 22 6c 6f 63 61 6c 64 62 22  tabase "localdb"
6080: 2c 20 22 63 6f 6e 66 69 67 64 62 22 2c 20 6f 72  , "configdb", or
6090: 20 22 72 65 70 6f 73 69 74 6f 72 79 22 2e 0a 2a   "repository"..*
60a0: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62  /.const char *db
60b0: 5f 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72  _name(const char
60c0: 20 2a 7a 44 62 29 7b 0a 20 20 61 73 73 65 72 74   *zDb){.  assert
60d0: 28 20 73 74 72 63 6d 70 28 7a 44 62 2c 22 6c 6f  ( strcmp(zDb,"lo
60e0: 63 61 6c 64 62 22 29 3d 3d 30 0a 20 20 20 20 20  caldb")==0.     
60f0: 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a 44 62 2c    || strcmp(zDb,
6100: 22 63 6f 6e 66 69 67 64 62 22 29 3d 3d 30 0a 20  "configdb")==0. 
6110: 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28        || strcmp(
6120: 7a 44 62 2c 22 72 65 70 6f 73 69 74 6f 72 79 22  zDb,"repository"
6130: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 74  )==0 );.  if( st
6140: 72 63 6d 70 28 7a 44 62 2c 20 67 2e 7a 4d 61 69  rcmp(zDb, g.zMai
6150: 6e 44 62 54 79 70 65 29 3d 3d 30 20 29 20 7a 44  nDbType)==0 ) zD
6160: 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 72 65  b = "main";.  re
6170: 74 75 72 6e 20 7a 44 62 3b 0a 7d 0a 0a 2f 2a 0a  turn zDb;.}../*.
6180: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
6190: 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20 73 63  he repository sc
61a0: 68 65 6d 61 20 69 73 20 63 6f 72 72 65 63 74 2e  hema is correct.
61b0: 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 63    If it is not c
61c0: 6f 72 72 65 63 74 2c 0a 2a 2a 20 69 73 73 75 65  orrect,.** issue
61d0: 20 61 20 66 61 74 61 6c 20 65 72 72 6f 72 20 61   a fatal error a
61e0: 6e 64 20 64 69 65 2e 0a 2a 2f 0a 76 6f 69 64 20  nd die..*/.void 
61f0: 64 62 5f 76 65 72 69 66 79 5f 73 63 68 65 6d 61  db_verify_schema
6200: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 64 62  (void){.  if( db
6210: 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20  _exists("SELECT 
6220: 31 20 46 52 4f 4d 20 63 6f 6e 66 69 67 22 0a 20  1 FROM config". 
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
6240: 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 61 75 78   WHERE name='aux
6250: 2d 73 63 68 65 6d 61 27 22 0a 20 20 20 20 20 20  -schema'".      
6260: 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e            "   AN
6270: 44 20 76 61 6c 75 65 3c 3e 27 25 73 27 22 2c 20  D value<>'%s'", 
6280: 41 55 58 5f 53 43 48 45 4d 41 29 20 29 7b 0a 20  AUX_SCHEMA) ){. 
6290: 20 20 20 66 6f 73 73 69 6c 5f 77 61 72 6e 69 6e     fossil_warnin
62a0: 67 28 22 69 6e 63 6f 72 72 65 63 74 20 72 65 70  g("incorrect rep
62b0: 6f 73 69 74 6f 72 79 20 73 63 68 65 6d 61 20 76  ository schema v
62c0: 65 72 73 69 6f 6e 22 29 3b 0a 20 20 20 20 66 6f  ersion");.    fo
62d0: 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22 79 6f  ssil_warning("yo
62e0: 75 20 68 61 76 65 20 76 65 72 73 69 6f 6e 20 5c  u have version \
62f0: 22 25 73 5c 22 20 62 75 74 20 79 6f 75 20 6e 65  "%s\" but you ne
6300: 65 64 20 76 65 72 73 69 6f 6e 20 5c 22 25 73 5c  ed version \"%s\
6310: 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62  "",.          db
6320: 5f 67 65 74 28 22 61 75 78 2d 73 63 68 65 6d 61  _get("aux-schema
6330: 22 2c 30 29 2c 20 41 55 58 5f 53 43 48 45 4d 41  ",0), AUX_SCHEMA
6340: 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61  );.    fossil_fa
6350: 74 61 6c 28 22 72 75 6e 20 5c 22 66 6f 73 73 69  tal("run \"fossi
6360: 6c 20 72 65 62 75 69 6c 64 5c 22 20 74 6f 20 66  l rebuild\" to f
6370: 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 22  ix this problem"
6380: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6390: 43 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 6d 6f  COMMAND: test-mo
63a0: 76 65 2d 72 65 70 6f 73 69 74 6f 72 79 0a 2a 2a  ve-repository.**
63b0: 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73  .** Usage: %foss
63c0: 69 6c 20 74 65 73 74 2d 6d 6f 76 65 2d 72 65 70  il test-move-rep
63d0: 6f 73 69 74 6f 72 79 20 50 41 54 48 4e 41 4d 45  ository PATHNAME
63e0: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  .**.** Change th
63f0: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
6400: 65 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74  e repository dat
6410: 61 62 61 73 65 20 6f 6e 20 61 20 6c 6f 63 61 6c  abase on a local
6420: 20 63 68 65 63 6b 2d 6f 75 74 2e 0a 2a 2a 20 55   check-out..** U
6430: 73 65 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  se this command 
6440: 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20  to avoid having 
6450: 74 6f 20 63 6c 6f 73 65 20 61 6e 64 20 72 65 6f  to close and reo
6460: 70 65 6e 20 61 20 63 68 65 63 6b 6f 75 74 0a 2a  pen a checkout.*
6470: 2a 20 77 68 65 6e 20 72 65 6c 6f 63 61 74 69 6e  * when relocatin
6480: 67 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79  g the repository
6490: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f   database..*/.vo
64a0: 69 64 20 6d 6f 76 65 5f 72 65 70 6f 5f 63 6d 64  id move_repo_cmd
64b0: 28 76 6f 69 64 29 7b 0a 20 20 42 6c 6f 62 20 72  (void){.  Blob r
64c0: 65 70 6f 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  epo;.  char *zRe
64d0: 70 6f 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63  po;.  if( g.argc
64e0: 21 3d 33 20 29 7b 0a 20 20 20 20 75 73 61 67 65  !=3 ){.    usage
64f0: 28 22 50 41 54 48 4e 41 4d 45 22 29 3b 0a 20 20  ("PATHNAME");.  
6500: 7d 0a 20 20 69 66 28 20 64 62 5f 6f 70 65 6e 5f  }.  if( db_open_
6510: 6c 6f 63 61 6c 28 29 3d 3d 30 20 29 7b 0a 20 20  local()==0 ){.  
6520: 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22    fossil_fatal("
6530: 6e 6f 74 20 69 6e 20 61 20 6c 6f 63 61 6c 20 63  not in a local c
6540: 68 65 63 6b 6f 75 74 22 29 3b 0a 20 20 20 20 72  heckout");.    r
6550: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 69 6c  eturn;.  }.  fil
6560: 65 5f 63 61 6e 6f 6e 69 63 61 6c 5f 6e 61 6d 65  e_canonical_name
6570: 28 67 2e 61 72 67 76 5b 32 5d 2c 20 26 72 65 70  (g.argv[2], &rep
6580: 6f 29 3b 0a 20 20 7a 52 65 70 6f 20 3d 20 62 6c  o);.  zRepo = bl
6590: 6f 62 5f 73 74 72 28 26 72 65 70 6f 29 3b 0a 20  ob_str(&repo);. 
65a0: 20 69 66 28 20 61 63 63 65 73 73 28 7a 52 65 70   if( access(zRep
65b0: 6f 2c 20 30 29 20 29 7b 0a 20 20 20 20 66 6f 73  o, 0) ){.    fos
65c0: 73 69 6c 5f 66 61 74 61 6c 28 22 6e 6f 20 73 75  sil_fatal("no su
65d0: 63 68 20 66 69 6c 65 3a 20 25 73 22 2c 20 7a 52  ch file: %s", zR
65e0: 65 70 6f 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 6f  epo);.  }.  db_o
65f0: 70 65 6e 5f 6f 72 5f 61 74 74 61 63 68 28 7a 52  pen_or_attach(zR
6600: 65 70 6f 2c 20 22 74 65 73 74 5f 72 65 70 6f 22  epo, "test_repo"
6610: 29 3b 0a 20 20 64 62 5f 6c 73 65 74 28 22 72 65  );.  db_lset("re
6620: 70 6f 73 69 74 6f 72 79 22 2c 20 62 6c 6f 62 5f  pository", blob_
6630: 73 74 72 28 26 72 65 70 6f 29 29 3b 0a 20 20 64  str(&repo));.  d
6640: 62 5f 63 6c 6f 73 65 28 31 29 3b 0a 7d 0a 0a 0a  b_close(1);.}...
6650: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6c  /*.** Open the l
6660: 6f 63 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20  ocal database.  
6670: 49 66 20 75 6e 61 62 6c 65 2c 20 65 78 69 74 20  If unable, exit 
6680: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  with an error..*
6690: 2f 0a 76 6f 69 64 20 64 62 5f 6d 75 73 74 5f 62  /.void db_must_b
66a0: 65 5f 77 69 74 68 69 6e 5f 74 72 65 65 28 76 6f  e_within_tree(vo
66b0: 69 64 29 7b 0a 20 20 69 66 28 20 64 62 5f 6f 70  id){.  if( db_op
66c0: 65 6e 5f 6c 6f 63 61 6c 28 29 3d 3d 30 20 29 7b  en_local()==0 ){
66d0: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61  .    fossil_fata
66e0: 6c 28 22 6e 6f 74 20 77 69 74 68 69 6e 20 61 6e  l("not within an
66f0: 20 6f 70 65 6e 20 63 68 65 63 6b 6f 75 74 22 29   open checkout")
6700: 3b 0a 20 20 7d 0a 20 20 64 62 5f 6f 70 65 6e 5f  ;.  }.  db_open_
6710: 72 65 70 6f 73 69 74 6f 72 79 28 30 29 3b 0a 20  repository(0);. 
6720: 20 64 62 5f 76 65 72 69 66 79 5f 73 63 68 65 6d   db_verify_schem
6730: 61 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  a();.}../*.** Cl
6740: 6f 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ose the database
6750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
6760: 2a 2a 20 43 68 65 63 6b 20 66 6f 72 20 75 6e 66  ** Check for unf
6770: 69 6e 61 6c 69 7a 65 64 20 73 74 61 74 65 6d 65  inalized stateme
6780: 6e 74 73 20 61 6e 64 20 72 65 70 6f 72 74 20 65  nts and report e
6790: 72 72 6f 72 73 20 69 66 20 74 68 65 20 72 65 70  rrors if the rep
67a0: 6f 72 74 45 72 72 6f 72 73 0a 2a 2a 20 61 72 67  ortErrors.** arg
67b0: 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2e 20 20  ument is true.  
67c0: 49 67 6e 6f 72 65 20 75 6e 66 69 6e 61 6c 69 7a  Ignore unfinaliz
67d0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 77 68  ed statements wh
67e0: 65 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69  en false..*/.voi
67f0: 64 20 64 62 5f 63 6c 6f 73 65 28 69 6e 74 20 72  d db_close(int r
6800: 65 70 6f 72 74 45 72 72 6f 72 73 29 7b 0a 20 20  eportErrors){.  
6810: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
6820: 74 6d 74 3b 0a 20 20 69 66 28 20 67 2e 64 62 3d  tmt;.  if( g.db=
6830: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
6840: 66 28 20 67 2e 66 53 71 6c 54 72 61 63 65 20 29  f( g.fSqlTrace )
6850: 7b 0a 20 20 20 20 69 6e 74 20 63 75 72 2c 20 68  {.    int cur, h
6860: 69 77 74 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  iwtr;.    sqlite
6870: 33 5f 64 62 5f 73 74 61 74 75 73 28 67 2e 64 62  3_db_status(g.db
6880: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
6890: 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44  S_LOOKASIDE_USED
68a0: 2c 20 26 63 75 72 2c 20 26 68 69 77 74 72 2c 20  , &cur, &hiwtr, 
68b0: 30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  0);.    fprintf(
68c0: 73 74 64 65 72 72 2c 20 22 2d 2d 20 4c 4f 4f 4b  stderr, "-- LOOK
68d0: 41 53 49 44 45 5f 55 53 45 44 20 25 31 30 64 20  ASIDE_USED %10d 
68e0: 25 31 30 64 5c 6e 22 2c 20 63 75 72 2c 20 68 69  %10d\n", cur, hi
68f0: 77 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  wtr);.    sqlite
6900: 33 5f 64 62 5f 73 74 61 74 75 73 28 67 2e 64 62  3_db_status(g.db
6910: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
6920: 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54 2c  S_LOOKASIDE_HIT,
6930: 20 26 63 75 72 2c 20 26 68 69 77 74 72 2c 20 30   &cur, &hiwtr, 0
6940: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  );.    fprintf(s
6950: 74 64 65 72 72 2c 20 22 2d 2d 20 4c 4f 4f 4b 41  tderr, "-- LOOKA
6960: 53 49 44 45 5f 48 49 54 20 20 20 20 20 20 20 20  SIDE_HIT        
6970: 20 20 20 20 20 25 31 30 64 5c 6e 22 2c 20 68 69       %10d\n", hi
6980: 77 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  wtr);.    sqlite
6990: 33 5f 64 62 5f 73 74 61 74 75 73 28 67 2e 64 62  3_db_status(g.db
69a0: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
69b0: 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53  S_LOOKASIDE_MISS
69c0: 5f 53 49 5a 45 2c 20 26 63 75 72 2c 26 68 69 77  _SIZE, &cur,&hiw
69d0: 74 72 2c 30 29 3b 0a 20 20 20 20 66 70 72 69 6e  tr,0);.    fprin
69e0: 74 66 28 73 74 64 65 72 72 2c 20 22 2d 2d 20 4c  tf(stderr, "-- L
69f0: 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 53 49  OOKASIDE_MISS_SI
6a00: 5a 45 20 20 20 20 20 20 20 25 31 30 64 5c 6e 22  ZE       %10d\n"
6a10: 2c 20 68 69 77 74 72 29 3b 0a 20 20 20 20 73 71  , hiwtr);.    sq
6a20: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
6a30: 67 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  g.db, SQLITE_DBS
6a40: 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
6a50: 4d 49 53 53 5f 46 55 4c 4c 2c 20 26 63 75 72 2c  MISS_FULL, &cur,
6a60: 26 68 69 77 74 72 2c 30 29 3b 0a 20 20 20 20 66  &hiwtr,0);.    f
6a70: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
6a80: 2d 2d 20 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53  -- LOOKASIDE_MIS
6a90: 53 5f 46 55 4c 4c 20 20 20 20 20 20 20 25 31 30  S_FULL       %10
6aa0: 64 5c 6e 22 2c 20 68 69 77 74 72 29 3b 0a 20 20  d\n", hiwtr);.  
6ab0: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
6ac0: 74 75 73 28 67 2e 64 62 2c 20 53 51 4c 49 54 45  tus(g.db, SQLITE
6ad0: 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
6ae0: 55 53 45 44 2c 20 26 63 75 72 2c 20 26 68 69 77  USED, &cur, &hiw
6af0: 74 72 2c 20 30 29 3b 0a 20 20 20 20 66 70 72 69  tr, 0);.    fpri
6b00: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2d 2d 20  ntf(stderr, "-- 
6b10: 43 41 43 48 45 5f 55 53 45 44 20 20 20 20 20 25  CACHE_USED     %
6b20: 31 30 64 5c 6e 22 2c 20 63 75 72 29 3b 0a 20 20  10d\n", cur);.  
6b30: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
6b40: 74 75 73 28 67 2e 64 62 2c 20 53 51 4c 49 54 45  tus(g.db, SQLITE
6b50: 5f 44 42 53 54 41 54 55 53 5f 53 43 48 45 4d 41  _DBSTATUS_SCHEMA
6b60: 5f 55 53 45 44 2c 20 26 63 75 72 2c 20 26 68 69  _USED, &cur, &hi
6b70: 77 74 72 2c 20 30 29 3b 0a 20 20 20 20 66 70 72  wtr, 0);.    fpr
6b80: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2d 2d  intf(stderr, "--
6b90: 20 53 43 48 45 4d 41 5f 55 53 45 44 20 20 20 20   SCHEMA_USED    
6ba0: 25 31 30 64 5c 6e 22 2c 20 63 75 72 29 3b 0a 20  %10d\n", cur);. 
6bb0: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
6bc0: 61 74 75 73 28 67 2e 64 62 2c 20 53 51 4c 49 54  atus(g.db, SQLIT
6bd0: 45 5f 44 42 53 54 41 54 55 53 5f 53 54 4d 54 5f  E_DBSTATUS_STMT_
6be0: 55 53 45 44 2c 20 26 63 75 72 2c 20 26 68 69 77  USED, &cur, &hiw
6bf0: 74 72 2c 20 30 29 3b 0a 20 20 20 20 66 70 72 69  tr, 0);.    fpri
6c00: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2d 2d 20  ntf(stderr, "-- 
6c10: 53 54 4d 54 5f 55 53 45 44 20 20 20 20 20 20 25  STMT_USED      %
6c20: 31 30 64 5c 6e 22 2c 20 63 75 72 29 3b 0a 20 20  10d\n", cur);.  
6c30: 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73    sqlite3_status
6c40: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d  (SQLITE_STATUS_M
6c50: 45 4d 4f 52 59 5f 55 53 45 44 2c 20 26 63 75 72  EMORY_USED, &cur
6c60: 2c 20 26 68 69 77 74 72 2c 20 30 29 3b 0a 20 20  , &hiwtr, 0);.  
6c70: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
6c80: 2c 20 22 2d 2d 20 4d 45 4d 4f 52 59 5f 55 53 45  , "-- MEMORY_USE
6c90: 44 20 20 20 20 25 31 30 64 20 25 31 30 64 5c 6e  D    %10d %10d\n
6ca0: 22 2c 20 63 75 72 2c 20 68 69 77 74 72 29 3b 0a  ", cur, hiwtr);.
6cb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74      sqlite3_stat
6cc0: 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53  us(SQLITE_STATUS
6cd0: 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 26 63  _MALLOC_SIZE, &c
6ce0: 75 72 2c 20 26 68 69 77 74 72 2c 20 30 29 3b 0a  ur, &hiwtr, 0);.
6cf0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
6d00: 72 72 2c 20 22 2d 2d 20 4d 41 4c 4c 4f 43 5f 53  rr, "-- MALLOC_S
6d10: 49 5a 45 20 20 20 20 20 20 20 20 20 20 20 20 20  IZE             
6d20: 20 20 25 31 30 64 5c 6e 22 2c 20 68 69 77 74 72    %10d\n", hiwtr
6d30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
6d40: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
6d50: 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54  TUS_MALLOC_COUNT
6d60: 2c 20 26 63 75 72 2c 20 26 68 69 77 74 72 2c 20  , &cur, &hiwtr, 
6d70: 30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  0);.    fprintf(
6d80: 73 74 64 65 72 72 2c 20 22 2d 2d 20 4d 41 4c 4c  stderr, "-- MALL
6d90: 4f 43 5f 43 4f 55 4e 54 20 20 20 25 31 30 64 20  OC_COUNT   %10d 
6da0: 25 31 30 64 5c 6e 22 2c 20 63 75 72 2c 20 68 69  %10d\n", cur, hi
6db0: 77 74 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  wtr);.    sqlite
6dc0: 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f  3_status(SQLITE_
6dd0: 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45  STATUS_PAGECACHE
6de0: 5f 4f 56 45 52 46 4c 4f 57 2c 20 26 63 75 72 2c  _OVERFLOW, &cur,
6df0: 20 26 68 69 77 74 72 2c 20 30 29 3b 0a 20 20 20   &hiwtr, 0);.   
6e00: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
6e10: 20 22 2d 2d 20 50 43 41 43 48 45 5f 4f 56 46 4c   "-- PCACHE_OVFL
6e20: 4f 57 20 20 25 31 30 64 20 25 31 30 64 5c 6e 22  OW  %10d %10d\n"
6e30: 2c 20 63 75 72 2c 20 68 69 77 74 72 29 3b 0a 20  , cur, hiwtr);. 
6e40: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 41 6c 6c   }.  while( pAll
6e50: 53 74 6d 74 20 29 7b 0a 20 20 20 20 64 62 5f 66  Stmt ){.    db_f
6e60: 69 6e 61 6c 69 7a 65 28 70 41 6c 6c 53 74 6d 74  inalize(pAllStmt
6e70: 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 65 6e 64 5f  );.  }.  db_end_
6e80: 74 72 61 6e 73 61 63 74 69 6f 6e 28 31 29 3b 0a  transaction(1);.
6e90: 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69    pStmt = 0;.  i
6ea0: 66 28 20 72 65 70 6f 72 74 45 72 72 6f 72 73 20  f( reportErrors 
6eb0: 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70  ){.    while( (p
6ec0: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 6e  Stmt = sqlite3_n
6ed0: 65 78 74 5f 73 74 6d 74 28 67 2e 64 62 2c 20 70  ext_stmt(g.db, p
6ee0: 53 74 6d 74 29 29 21 3d 30 20 29 7b 0a 20 20 20  Stmt))!=0 ){.   
6ef0: 20 20 20 66 6f 73 73 69 6c 5f 77 61 72 6e 69 6e     fossil_warnin
6f00: 67 28 22 75 6e 66 69 6e 61 6c 69 7a 65 64 20 53  g("unfinalized S
6f10: 51 4c 20 73 74 61 74 65 6d 65 6e 74 3a 20 5b 25  QL statement: [%
6f20: 73 5d 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c  s]", sqlite3_sql
6f30: 28 70 53 74 6d 74 29 29 3b 0a 20 20 20 20 7d 0a  (pStmt));.    }.
6f40: 20 20 7d 0a 20 20 67 2e 72 65 70 6f 73 69 74 6f    }.  g.reposito
6f50: 72 79 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 67 2e  ryOpen = 0;.  g.
6f60: 6c 6f 63 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  localOpen = 0;. 
6f70: 20 67 2e 63 6f 6e 66 69 67 4f 70 65 6e 20 3d 20   g.configOpen = 
6f80: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  0;.  sqlite3_wal
6f90: 5f 63 68 65 63 6b 70 6f 69 6e 74 28 67 2e 64 62  _checkpoint(g.db
6fa0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
6fb0: 63 6c 6f 73 65 28 67 2e 64 62 29 3b 0a 20 20 67  close(g.db);.  g
6fc0: 2e 64 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 67  .db = 0;.  if( g
6fd0: 2e 64 62 43 6f 6e 66 69 67 20 29 7b 0a 20 20 20  .dbConfig ){.   
6fe0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 67   sqlite3_close(g
6ff0: 2e 64 62 43 6f 6e 66 69 67 29 3b 0a 20 20 20 20  .dbConfig);.    
7000: 67 2e 64 62 43 6f 6e 66 69 67 20 3d 20 30 3b 0a  g.dbConfig = 0;.
7010: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72    }.}.../*.** Cr
7020: 65 61 74 65 20 61 20 6e 65 77 20 65 6d 70 74 79  eate a new empty
7030: 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61   repository data
7040: 62 61 73 65 20 77 69 74 68 20 74 68 65 20 67 69  base with the gi
7050: 76 65 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ven name..**.** 
7060: 4f 6e 6c 79 20 74 68 65 20 73 63 68 65 6d 61 20  Only the schema 
7070: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  is initialized. 
7080: 20 54 68 65 20 72 65 71 75 69 72 65 64 20 56 41   The required VA
7090: 52 20 74 61 62 6c 65 73 20 65 6e 74 72 69 65 73  R tables entries
70a0: 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 73 65 74 20  .** are not set 
70b0: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
70c0: 61 6e 64 20 6d 75 73 74 20 62 65 20 73 65 74 20  and must be set 
70d0: 73 65 70 61 72 61 74 65 6c 79 20 69 6e 20 6f 72  separately in or
70e0: 64 65 72 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 74  der.** to make t
70f0: 68 65 20 6e 65 77 20 66 69 6c 65 20 61 20 76 61  he new file a va
7100: 6c 69 64 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  lid database..*/
7110: 0a 76 6f 69 64 20 64 62 5f 63 72 65 61 74 65 5f  .void db_create_
7120: 72 65 70 6f 73 69 74 6f 72 79 28 63 6f 6e 73 74  repository(const
7130: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
7140: 29 7b 0a 20 20 64 62 5f 69 6e 69 74 5f 64 61 74  ){.  db_init_dat
7150: 61 62 61 73 65 28 0a 20 20 20 20 20 7a 46 69 6c  abase(.     zFil
7160: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 7a 52 65 70  ename,.     zRep
7170: 6f 73 69 74 6f 72 79 53 63 68 65 6d 61 31 2c 0a  ositorySchema1,.
7180: 20 20 20 20 20 7a 52 65 70 6f 73 69 74 6f 72 79       zRepository
7190: 53 63 68 65 6d 61 32 2c 0a 20 20 20 20 20 28 63  Schema2,.     (c
71a0: 68 61 72 2a 29 30 0a 20 20 29 3b 0a 20 20 69 73  har*)0.  );.  is
71b0: 4e 65 77 52 65 70 6f 20 3d 20 31 3b 0a 7d 0a 0a  NewRepo = 1;.}..
71c0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
71d0: 20 64 65 66 61 75 6c 74 20 75 73 65 72 20 61 63   default user ac
71e0: 63 6f 75 6e 74 73 20 69 6e 20 74 68 65 20 55 53  counts in the US
71f0: 45 52 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69  ER table..*/.voi
7200: 64 20 64 62 5f 63 72 65 61 74 65 5f 64 65 66 61  d db_create_defa
7210: 75 6c 74 5f 75 73 65 72 73 28 69 6e 74 20 73 65  ult_users(int se
7220: 74 75 70 55 73 65 72 4f 6e 6c 79 2c 20 63 6f 6e  tupUserOnly, con
7230: 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  st char *zDefaul
7240: 74 55 73 65 72 29 7b 0a 20 20 63 6f 6e 73 74 20  tUser){.  const 
7250: 63 68 61 72 20 2a 7a 55 73 65 72 3b 0a 20 20 7a  char *zUser;.  z
7260: 55 73 65 72 20 3d 20 64 62 5f 67 65 74 28 22 64  User = db_get("d
7270: 65 66 61 75 6c 74 2d 75 73 65 72 22 2c 20 30 29  efault-user", 0)
7280: 3b 0a 20 20 69 66 28 20 7a 55 73 65 72 3d 3d 30  ;.  if( zUser==0
7290: 20 29 7b 0a 20 20 20 20 7a 55 73 65 72 20 3d 20   ){.    zUser = 
72a0: 7a 44 65 66 61 75 6c 74 55 73 65 72 3b 0a 20 20  zDefaultUser;.  
72b0: 7d 0a 20 20 69 66 28 20 7a 55 73 65 72 3d 3d 30  }.  if( zUser==0
72c0: 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   ){.#if defined(
72d0: 5f 57 49 4e 33 32 29 0a 20 20 20 20 7a 55 73 65  _WIN32).    zUse
72e0: 72 20 3d 20 67 65 74 65 6e 76 28 22 55 53 45 52  r = getenv("USER
72f0: 4e 41 4d 45 22 29 3b 0a 23 65 6c 73 65 0a 20 20  NAME");.#else.  
7300: 20 20 7a 55 73 65 72 20 3d 20 67 65 74 65 6e 76    zUser = getenv
7310: 28 22 55 53 45 52 22 29 3b 0a 23 65 6e 64 69 66  ("USER");.#endif
7320: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 55 73 65 72  .  }.  if( zUser
7330: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 55 73 65 72  ==0 ){.    zUser
7340: 20 3d 20 22 72 6f 6f 74 22 3b 0a 20 20 7d 0a 20   = "root";.  }. 
7350: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a   db_multi_exec(.
7360: 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
7370: 4f 20 75 73 65 72 28 6c 6f 67 69 6e 2c 20 70 77  O user(login, pw
7380: 2c 20 63 61 70 2c 20 69 6e 66 6f 29 22 0a 20 20  , cap, info)".  
7390: 20 20 20 22 56 41 4c 55 45 53 28 25 51 2c 6c 6f     "VALUES(%Q,lo
73a0: 77 65 72 28 68 65 78 28 72 61 6e 64 6f 6d 62 6c  wer(hex(randombl
73b0: 6f 62 28 33 29 29 29 2c 27 73 27 2c 27 27 29 22  ob(3))),'s','')"
73c0: 2c 20 7a 55 73 65 72 0a 20 20 29 3b 0a 20 20 69  , zUser.  );.  i
73d0: 66 28 20 21 73 65 74 75 70 55 73 65 72 4f 6e 6c  f( !setupUserOnl
73e0: 79 20 29 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74  y ){.    db_mult
73f0: 69 5f 65 78 65 63 28 0a 20 20 20 20 20 20 20 22  i_exec(.       "
7400: 49 4e 53 45 52 54 20 49 4e 54 4f 20 75 73 65 72  INSERT INTO user
7410: 28 6c 6f 67 69 6e 2c 70 77 2c 63 61 70 2c 69 6e  (login,pw,cap,in
7420: 66 6f 29 22 0a 20 20 20 20 20 20 20 22 20 20 20  fo)".       "   
7430: 56 41 4c 55 45 53 28 27 61 6e 6f 6e 79 6d 6f 75  VALUES('anonymou
7440: 73 27 2c 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f  s',hex(randomblo
7450: 62 28 38 29 29 2c 27 68 6d 6e 63 7a 27 2c 27 41  b(8)),'hmncz','A
7460: 6e 6f 6e 27 29 3b 22 0a 20 20 20 20 20 20 20 22  non');".       "
7470: 49 4e 53 45 52 54 20 49 4e 54 4f 20 75 73 65 72  INSERT INTO user
7480: 28 6c 6f 67 69 6e 2c 70 77 2c 63 61 70 2c 69 6e  (login,pw,cap,in
7490: 66 6f 29 22 0a 20 20 20 20 20 20 20 22 20 20 20  fo)".       "   
74a0: 56 41 4c 55 45 53 28 27 6e 6f 62 6f 64 79 27 2c  VALUES('nobody',
74b0: 27 27 2c 27 67 6a 6f 72 27 2c 27 4e 6f 62 6f 64  '','gjor','Nobod
74c0: 79 27 29 3b 22 0a 20 20 20 20 20 20 20 22 49 4e  y');".       "IN
74d0: 53 45 52 54 20 49 4e 54 4f 20 75 73 65 72 28 6c  SERT INTO user(l
74e0: 6f 67 69 6e 2c 70 77 2c 63 61 70 2c 69 6e 66 6f  ogin,pw,cap,info
74f0: 29 22 0a 20 20 20 20 20 20 20 22 20 20 20 56 41  )".       "   VA
7500: 4c 55 45 53 28 27 64 65 76 65 6c 6f 70 65 72 27  LUES('developer'
7510: 2c 27 27 2c 27 64 65 69 27 2c 27 44 65 76 27 29  ,'','dei','Dev')
7520: 3b 22 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52  ;".       "INSER
7530: 54 20 49 4e 54 4f 20 75 73 65 72 28 6c 6f 67 69  T INTO user(logi
7540: 6e 2c 70 77 2c 63 61 70 2c 69 6e 66 6f 29 22 0a  n,pw,cap,info)".
7550: 20 20 20 20 20 20 20 22 20 20 20 56 41 4c 55 45         "   VALUE
7560: 53 28 27 72 65 61 64 65 72 27 2c 27 27 2c 27 6b  S('reader','','k
7570: 70 74 77 27 2c 27 52 65 61 64 65 72 27 29 3b 22  ptw','Reader');"
7580: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  .    );.  }.}../
7590: 2a 0a 2a 2a 20 46 69 6c 6c 20 61 6e 20 65 6d 70  *.** Fill an emp
75a0: 74 79 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61  ty repository da
75b0: 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
75c0: 62 61 73 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f  basic informatio
75d0: 6e 20 66 6f 72 20 61 0a 2a 2a 20 72 65 70 6f 73  n for a.** repos
75e0: 69 74 6f 72 79 2e 20 54 68 69 73 20 66 75 6e 63  itory. This func
75f0: 74 69 6f 6e 20 69 73 20 73 68 61 72 65 64 20 62  tion is shared b
7600: 65 74 77 65 65 6e 20 27 63 72 65 61 74 65 5f 72  etween 'create_r
7610: 65 70 6f 73 69 74 6f 72 79 5f 63 6d 64 27 0a 2a  epository_cmd'.*
7620: 2a 20 28 27 6e 65 77 27 29 20 61 6e 64 20 27 72  * ('new') and 'r
7630: 65 63 6f 6e 73 74 72 75 63 74 5f 63 6d 64 27 20  econstruct_cmd' 
7640: 28 27 72 65 63 6f 6e 73 74 72 75 63 74 27 29 2c  ('reconstruct'),
7650: 20 62 6f 74 68 20 6f 66 20 77 68 69 63 68 20 63   both of which c
7660: 72 65 61 74 65 0a 2a 2a 20 6e 65 77 20 72 65 70  reate.** new rep
7670: 6f 73 69 74 6f 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  ositories..**.**
7680: 20 54 68 65 20 7a 49 6e 69 74 69 61 6c 44 61 74   The zInitialDat
7690: 65 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65  e parameter dete
76a0: 72 6d 69 6e 65 73 20 74 68 65 20 64 61 74 65 20  rmines the date 
76b0: 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20 63  of the initial c
76c0: 68 65 63 6b 2d 69 6e 0a 2a 2a 20 74 68 61 74 20  heck-in.** that 
76d0: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
76e0: 20 63 72 65 61 74 65 64 2e 20 20 49 66 20 7a 49   created.  If zI
76f0: 6e 69 74 69 61 6c 44 61 74 65 20 69 73 20 30 20  nitialDate is 0 
7700: 74 68 65 6e 20 6e 6f 20 69 6e 69 74 69 61 6c 0a  then no initial.
7710: 2a 2a 20 63 68 65 63 6b 2d 69 6e 20 69 73 20 63  ** check-in is c
7720: 72 65 61 74 65 64 2e 20 54 68 65 20 6d 61 6b 65  reated. The make
7730: 53 65 72 76 65 72 43 6f 64 65 73 20 66 6c 61 67  ServerCodes flag
7740: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
7750: 68 65 72 20 6f 72 0a 2a 2a 20 6e 6f 74 20 73 65  her or.** not se
7760: 72 76 65 72 20 61 6e 64 20 70 72 6f 6a 65 63 74  rver and project
7770: 20 63 6f 64 65 73 20 61 72 65 20 69 6e 76 65 6e   codes are inven
7780: 74 65 64 20 66 6f 72 20 74 68 69 73 20 72 65 70  ted for this rep
7790: 6f 73 69 74 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64  ository..*/.void
77a0: 20 64 62 5f 69 6e 69 74 69 61 6c 5f 73 65 74 75   db_initial_setu
77b0: 70 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p(.  const char 
77c0: 2a 7a 49 6e 69 74 69 61 6c 44 61 74 65 2c 20 20  *zInitialDate,  
77d0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 64 61 74    /* Initial dat
77e0: 65 20 6f 66 20 72 65 70 6f 73 69 74 6f 72 79 2e  e of repository.
77f0: 20 28 65 78 3a 20 22 6e 6f 77 22 29 20 2a 2f 0a   (ex: "now") */.
7800: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
7810: 65 66 61 75 6c 74 55 73 65 72 2c 20 20 20 20 2f  efaultUser,    /
7820: 2a 20 44 65 66 61 75 6c 74 20 75 73 65 72 20 66  * Default user f
7830: 6f 72 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72  or the repositor
7840: 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 6b 65 53  y */.  int makeS
7850: 65 72 76 65 72 43 6f 64 65 73 20 20 20 20 20 20  erverCodes      
7860: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6d      /* True to m
7870: 61 6b 65 20 6e 65 77 20 73 65 72 76 65 72 20 26  ake new server &
7880: 20 70 72 6f 6a 65 63 74 20 63 6f 64 65 73 20 2a   project codes *
7890: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 61  /.){.  char *zDa
78a0: 74 65 3b 0a 20 20 42 6c 6f 62 20 68 61 73 68 3b  te;.  Blob hash;
78b0: 0a 20 20 42 6c 6f 62 20 6d 61 6e 69 66 65 73 74  .  Blob manifest
78c0: 3b 0a 0a 20 20 64 62 5f 73 65 74 28 22 63 6f 6e  ;..  db_set("con
78d0: 74 65 6e 74 2d 73 63 68 65 6d 61 22 2c 20 43 4f  tent-schema", CO
78e0: 4e 54 45 4e 54 5f 53 43 48 45 4d 41 2c 20 30 29  NTENT_SCHEMA, 0)
78f0: 3b 0a 20 20 64 62 5f 73 65 74 28 22 61 75 78 2d  ;.  db_set("aux-
7900: 73 63 68 65 6d 61 22 2c 20 41 55 58 5f 53 43 48  schema", AUX_SCH
7910: 45 4d 41 2c 20 30 29 3b 0a 20 20 69 66 28 20 6d  EMA, 0);.  if( m
7920: 61 6b 65 53 65 72 76 65 72 43 6f 64 65 73 20 29  akeServerCodes )
7930: 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65  {.    db_multi_e
7940: 78 65 63 28 0a 20 20 20 20 20 20 22 49 4e 53 45  xec(.      "INSE
7950: 52 54 20 49 4e 54 4f 20 63 6f 6e 66 69 67 28 6e  RT INTO config(n
7960: 61 6d 65 2c 76 61 6c 75 65 29 22 0a 20 20 20 20  ame,value)".    
7970: 20 20 22 20 56 41 4c 55 45 53 28 27 73 65 72 76    " VALUES('serv
7980: 65 72 2d 63 6f 64 65 27 2c 20 6c 6f 77 65 72 28  er-code', lower(
7990: 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32  hex(randomblob(2
79a0: 30 29 29 29 29 3b 22 0a 20 20 20 20 20 20 22 49  0))));".      "I
79b0: 4e 53 45 52 54 20 49 4e 54 4f 20 63 6f 6e 66 69  NSERT INTO confi
79c0: 67 28 6e 61 6d 65 2c 76 61 6c 75 65 29 22 0a 20  g(name,value)". 
79d0: 20 20 20 20 20 22 20 56 41 4c 55 45 53 28 27 70       " VALUES('p
79e0: 72 6f 6a 65 63 74 2d 63 6f 64 65 27 2c 20 6c 6f  roject-code', lo
79f0: 77 65 72 28 68 65 78 28 72 61 6e 64 6f 6d 62 6c  wer(hex(randombl
7a00: 6f 62 28 32 30 29 29 29 29 3b 22 0a 20 20 20 20  ob(20))));".    
7a10: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  );.  }.  if( !db
7a20: 5f 69 73 5f 67 6c 6f 62 61 6c 28 22 61 75 74 6f  _is_global("auto
7a30: 73 79 6e 63 22 29 20 29 20 64 62 5f 73 65 74 5f  sync") ) db_set_
7a40: 69 6e 74 28 22 61 75 74 6f 73 79 6e 63 22 2c 20  int("autosync", 
7a50: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 64 62  1, 0);.  if( !db
7a60: 5f 69 73 5f 67 6c 6f 62 61 6c 28 22 6c 6f 63 61  _is_global("loca
7a70: 6c 61 75 74 68 22 29 20 29 20 64 62 5f 73 65 74  lauth") ) db_set
7a80: 5f 69 6e 74 28 22 6c 6f 63 61 6c 61 75 74 68 22  _int("localauth"
7a90: 2c 20 30 2c 20 30 29 3b 0a 20 20 64 62 5f 63 72  , 0, 0);.  db_cr
7aa0: 65 61 74 65 5f 64 65 66 61 75 6c 74 5f 75 73 65  eate_default_use
7ab0: 72 73 28 30 2c 20 7a 44 65 66 61 75 6c 74 55 73  rs(0, zDefaultUs
7ac0: 65 72 29 3b 0a 20 20 75 73 65 72 5f 73 65 6c 65  er);.  user_sele
7ad0: 63 74 28 29 3b 0a 0a 20 20 69 66 28 20 7a 49 6e  ct();..  if( zIn
7ae0: 69 74 69 61 6c 44 61 74 65 20 29 7b 0a 20 20 20  itialDate ){.   
7af0: 20 69 6e 74 20 72 69 64 3b 0a 20 20 20 20 62 6c   int rid;.    bl
7b00: 6f 62 5f 7a 65 72 6f 28 26 6d 61 6e 69 66 65 73  ob_zero(&manifes
7b10: 74 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70  t);.    blob_app
7b20: 65 6e 64 66 28 26 6d 61 6e 69 66 65 73 74 2c 20  endf(&manifest, 
7b30: 22 43 20 69 6e 69 74 69 61 6c 5c 5c 73 65 6d 70  "C initial\\semp
7b40: 74 79 5c 5c 73 63 68 65 63 6b 2d 69 6e 5c 6e 22  ty\\scheck-in\n"
7b50: 29 3b 0a 20 20 20 20 7a 44 61 74 65 20 3d 20 64  );.    zDate = d
7b60: 61 74 65 5f 69 6e 5f 73 74 61 6e 64 61 72 64 5f  ate_in_standard_
7b70: 66 6f 72 6d 61 74 28 7a 49 6e 69 74 69 61 6c 44  format(zInitialD
7b80: 61 74 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61  ate);.    blob_a
7b90: 70 70 65 6e 64 66 28 26 6d 61 6e 69 66 65 73 74  ppendf(&manifest
7ba0: 2c 20 22 44 20 25 73 5c 6e 22 2c 20 7a 44 61 74  , "D %s\n", zDat
7bb0: 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70  e);.    blob_app
7bc0: 65 6e 64 66 28 26 6d 61 6e 69 66 65 73 74 2c 20  endf(&manifest, 
7bd0: 22 50 5c 6e 22 29 3b 0a 20 20 20 20 6d 64 35 73  "P\n");.    md5s
7be0: 75 6d 5f 69 6e 69 74 28 29 3b 0a 20 20 20 20 62  um_init();.    b
7bf0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e  lob_appendf(&man
7c00: 69 66 65 73 74 2c 20 22 52 20 25 73 5c 6e 22 2c  ifest, "R %s\n",
7c10: 20 6d 64 35 73 75 6d 5f 66 69 6e 69 73 68 28 30   md5sum_finish(0
7c20: 29 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70  ));.    blob_app
7c30: 65 6e 64 66 28 26 6d 61 6e 69 66 65 73 74 2c 20  endf(&manifest, 
7c40: 22 54 20 2a 62 72 61 6e 63 68 20 2a 20 74 72 75  "T *branch * tru
7c50: 6e 6b 5c 6e 22 29 3b 0a 20 20 20 20 62 6c 6f 62  nk\n");.    blob
7c60: 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69 66 65  _appendf(&manife
7c70: 73 74 2c 20 22 54 20 2a 73 79 6d 2d 74 72 75 6e  st, "T *sym-trun
7c80: 6b 20 2a 5c 6e 22 29 3b 0a 20 20 20 20 62 6c 6f  k *\n");.    blo
7c90: 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69 66  b_appendf(&manif
7ca0: 65 73 74 2c 20 22 55 20 25 46 5c 6e 22 2c 20 67  est, "U %F\n", g
7cb0: 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 20 20 6d 64  .zLogin);.    md
7cc0: 35 73 75 6d 5f 62 6c 6f 62 28 26 6d 61 6e 69 66  5sum_blob(&manif
7cd0: 65 73 74 2c 20 26 68 61 73 68 29 3b 0a 20 20 20  est, &hash);.   
7ce0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d   blob_appendf(&m
7cf0: 61 6e 69 66 65 73 74 2c 20 22 5a 20 25 62 5c 6e  anifest, "Z %b\n
7d00: 22 2c 20 26 68 61 73 68 29 3b 0a 20 20 20 20 62  ", &hash);.    b
7d10: 6c 6f 62 5f 72 65 73 65 74 28 26 68 61 73 68 29  lob_reset(&hash)
7d20: 3b 0a 20 20 20 20 72 69 64 20 3d 20 63 6f 6e 74  ;.    rid = cont
7d30: 65 6e 74 5f 70 75 74 28 26 6d 61 6e 69 66 65 73  ent_put(&manifes
7d40: 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  t, 0, 0, 0);.   
7d50: 20 6d 61 6e 69 66 65 73 74 5f 63 72 6f 73 73 6c   manifest_crossl
7d60: 69 6e 6b 28 72 69 64 2c 20 26 6d 61 6e 69 66 65  ink(rid, &manife
7d70: 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  st);.  }.}../*.*
7d80: 2a 20 43 4f 4d 4d 41 4e 44 3a 20 6e 65 77 0a 2a  * COMMAND: new.*
7d90: 2a 20 43 4f 4d 4d 41 4e 44 3a 20 69 6e 69 74 0a  * COMMAND: init.
7da0: 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f  **.** Usage: %fo
7db0: 73 73 69 6c 20 6e 65 77 20 3f 4f 50 54 49 4f 4e  ssil new ?OPTION
7dc0: 53 3f 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 20 20  S? FILENAME.**  
7dd0: 20 20 4f 72 3a 20 25 66 6f 73 73 69 6c 20 69 6e    Or: %fossil in
7de0: 69 74 20 3f 4f 50 54 49 4f 4e 53 3f 20 46 49 4c  it ?OPTIONS? FIL
7df0: 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 43 72 65 61  ENAME.**.** Crea
7e00: 74 65 20 61 20 72 65 70 6f 73 69 74 6f 72 79 20  te a repository 
7e10: 66 6f 72 20 61 20 6e 65 77 20 70 72 6f 6a 65 63  for a new projec
7e20: 74 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e 61  t in the file na
7e30: 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e 0a 2a 2a  med FILENAME..**
7e40: 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73   This command is
7e50: 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20 22   distinct from "
7e60: 63 6c 6f 6e 65 22 2e 20 20 54 68 65 20 22 63 6c  clone".  The "cl
7e70: 6f 6e 65 22 20 63 6f 6d 6d 61 6e 64 20 6d 61 6b  one" command mak
7e80: 65 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20  es.** a copy of 
7e90: 61 6e 20 65 78 69 73 74 69 6e 67 20 70 72 6f 6a  an existing proj
7ea0: 65 63 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ect.  This comma
7eb0: 6e 64 20 73 74 61 72 74 73 20 61 20 6e 65 77 20  nd starts a new 
7ec0: 70 72 6f 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 42  project..**.** B
7ed0: 79 20 64 65 66 61 75 6c 74 2c 20 79 6f 75 72 20  y default, your 
7ee0: 63 75 72 72 65 6e 74 20 6c 6f 67 69 6e 20 6e 61  current login na
7ef0: 6d 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 72  me is used to cr
7f00: 65 61 74 65 20 74 68 65 20 64 65 66 61 75 6c 74  eate the default
7f10: 0a 2a 2a 20 61 64 6d 69 6e 20 75 73 65 72 2e 20  .** admin user. 
7f20: 54 68 69 73 20 63 61 6e 20 62 65 20 6f 76 65 72  This can be over
7f30: 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65  ridden using the
7f40: 20 2d 41 7c 2d 2d 61 64 6d 69 6e 2d 75 73 65 72   -A|--admin-user
7f50: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  .** parameter..*
7f60: 2a 0a 2a 2a 20 4f 70 74 69 6f 6e 73 3a 0a 2a 2a  *.** Options:.**
7f70: 0a 2a 2a 20 20 20 20 2d 2d 61 64 6d 69 6e 2d 75  .**    --admin-u
7f80: 73 65 72 7c 2d 41 20 55 53 45 52 4e 41 4d 45 0a  ser|-A USERNAME.
7f90: 2a 2a 20 20 20 20 2d 2d 64 61 74 65 2d 6f 76 65  **    --date-ove
7fa0: 72 72 69 64 65 20 44 41 54 45 54 49 4d 45 0a 2a  rride DATETIME.*
7fb0: 2a 0a 2a 2f 0a 76 6f 69 64 20 63 72 65 61 74 65  *.*/.void create
7fc0: 5f 72 65 70 6f 73 69 74 6f 72 79 5f 63 6d 64 28  _repository_cmd(
7fd0: 76 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  void){.  char *z
7fe0: 50 61 73 73 77 6f 72 64 3b 0a 20 20 63 6f 6e 73  Password;.  cons
7ff0: 74 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 20 20  t char *zDate;  
8000: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 65 20          /* Date 
8010: 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20 63  of the initial c
8020: 68 65 63 6b 2d 69 6e 20 2a 2f 0a 20 20 63 6f 6e  heck-in */.  con
8030: 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  st char *zDefaul
8040: 74 55 73 65 72 3b 20 20 20 2f 2a 20 4f 70 74 69  tUser;   /* Opti
8050: 6f 6e 61 6c 20 6e 61 6d 65 20 6f 66 20 74 68 65  onal name of the
8060: 20 64 65 66 61 75 6c 74 20 75 73 65 72 20 2a 2f   default user */
8070: 0a 0a 20 20 7a 44 61 74 65 20 3d 20 66 69 6e 64  ..  zDate = find
8080: 5f 6f 70 74 69 6f 6e 28 22 64 61 74 65 2d 6f 76  _option("date-ov
8090: 65 72 72 69 64 65 22 2c 30 2c 31 29 3b 0a 20 20  erride",0,1);.  
80a0: 7a 44 65 66 61 75 6c 74 55 73 65 72 20 3d 20 66  zDefaultUser = f
80b0: 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 61 64 6d 69  ind_option("admi
80c0: 6e 2d 75 73 65 72 22 2c 22 41 22 2c 31 29 3b 0a  n-user","A",1);.
80d0: 20 20 69 66 28 20 7a 44 61 74 65 3d 3d 30 20 29    if( zDate==0 )
80e0: 20 7a 44 61 74 65 20 3d 20 22 6e 6f 77 22 3b 0a   zDate = "now";.
80f0: 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d 33 20    if( g.argc!=3 
8100: 29 7b 0a 20 20 20 20 75 73 61 67 65 28 22 52 45  ){.    usage("RE
8110: 50 4f 53 49 54 4f 52 59 2d 4e 41 4d 45 22 29 3b  POSITORY-NAME");
8120: 0a 20 20 7d 0a 20 20 64 62 5f 63 72 65 61 74 65  .  }.  db_create
8130: 5f 72 65 70 6f 73 69 74 6f 72 79 28 67 2e 61 72  _repository(g.ar
8140: 67 76 5b 32 5d 29 3b 0a 20 20 64 62 5f 6f 70 65  gv[2]);.  db_ope
8150: 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 67 2e 61  n_repository(g.a
8160: 72 67 76 5b 32 5d 29 3b 0a 20 20 64 62 5f 6f 70  rgv[2]);.  db_op
8170: 65 6e 5f 63 6f 6e 66 69 67 28 30 29 3b 0a 20 20  en_config(0);.  
8180: 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  db_begin_transac
8190: 74 69 6f 6e 28 29 3b 0a 20 20 64 62 5f 69 6e 69  tion();.  db_ini
81a0: 74 69 61 6c 5f 73 65 74 75 70 28 7a 44 61 74 65  tial_setup(zDate
81b0: 2c 20 7a 44 65 66 61 75 6c 74 55 73 65 72 2c 20  , zDefaultUser, 
81c0: 31 29 3b 0a 20 20 64 62 5f 65 6e 64 5f 74 72 61  1);.  db_end_tra
81d0: 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20 70  nsaction(0);.  p
81e0: 72 69 6e 74 66 28 22 70 72 6f 6a 65 63 74 2d 69  rintf("project-i
81f0: 64 3a 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74  d: %s\n", db_get
8200: 28 22 70 72 6f 6a 65 63 74 2d 63 6f 64 65 22 2c  ("project-code",
8210: 20 30 29 29 3b 0a 20 20 70 72 69 6e 74 66 28 22   0));.  printf("
8220: 73 65 72 76 65 72 2d 69 64 3a 20 20 25 73 5c 6e  server-id:  %s\n
8230: 22 2c 20 64 62 5f 67 65 74 28 22 73 65 72 76 65  ", db_get("serve
8240: 72 2d 63 6f 64 65 22 2c 20 30 29 29 3b 0a 20 20  r-code", 0));.  
8250: 7a 50 61 73 73 77 6f 72 64 20 3d 20 64 62 5f 74  zPassword = db_t
8260: 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 70  ext(0, "SELECT p
8270: 77 20 46 52 4f 4d 20 75 73 65 72 20 57 48 45 52  w FROM user WHER
8280: 45 20 6c 6f 67 69 6e 3d 25 51 22 2c 20 67 2e 7a  E login=%Q", g.z
8290: 4c 6f 67 69 6e 29 3b 0a 20 20 70 72 69 6e 74 66  Login);.  printf
82a0: 28 22 61 64 6d 69 6e 2d 75 73 65 72 3a 20 25 73  ("admin-user: %s
82b0: 20 28 69 6e 69 74 69 61 6c 20 70 61 73 73 77 6f   (initial passwo
82c0: 72 64 20 69 73 20 5c 22 25 73 5c 22 29 5c 6e 22  rd is \"%s\")\n"
82d0: 2c 20 67 2e 7a 4c 6f 67 69 6e 2c 20 7a 50 61 73  , g.zLogin, zPas
82e0: 73 77 6f 72 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sword);.}../*.**
82f0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 66   SQL functions f
8300: 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2a  or debugging..**
8310: 0a 2a 2a 20 54 68 65 20 70 72 69 6e 74 28 29 20  .** The print() 
8320: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20  function writes 
8330: 69 74 73 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e  its arguments on
8340: 20 73 74 64 6f 75 74 2c 20 62 75 74 20 6f 6e 6c   stdout, but onl
8350: 79 0a 2a 2a 20 69 66 20 74 68 65 20 2d 73 71 6c  y.** if the -sql
8360: 70 72 69 6e 74 20 63 6f 6d 6d 61 6e 64 2d 6c 69  print command-li
8370: 6e 65 20 6f 70 74 69 6f 6e 20 69 73 20 74 75 72  ne option is tur
8380: 6e 65 64 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ned on..*/.stati
8390: 63 20 76 6f 69 64 20 64 62 5f 73 71 6c 5f 70 72  c void db_sql_pr
83a0: 69 6e 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  int(.  sqlite3_c
83b0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
83c0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
83d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
83e0: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rgv.){.  int i;.
83f0: 20 20 69 66 28 20 67 2e 66 53 71 6c 50 72 69 6e    if( g.fSqlPrin
8400: 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
8410: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
8420: 20 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 69        char c = i
8430: 3d 3d 61 72 67 63 2d 31 20 3f 20 27 5c 6e 27 20  ==argc-1 ? '\n' 
8440: 3a 20 27 20 27 3b 0a 20 20 20 20 20 20 70 72 69  : ' ';.      pri
8450: 6e 74 66 28 22 25 73 25 63 22 2c 20 73 71 6c 69  ntf("%s%c", sqli
8460: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
8470: 72 67 76 5b 69 5d 29 2c 20 63 29 3b 0a 20 20 20  rgv[i]), c);.   
8480: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
8490: 76 6f 69 64 20 64 62 5f 73 71 6c 5f 74 72 61 63  void db_sql_trac
84a0: 65 28 76 6f 69 64 20 2a 6e 6f 74 55 73 65 64 2c  e(void *notUsed,
84b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
84c0: 6c 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74  l){.  int n = st
84d0: 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 66 70  rlen(zSql);.  fp
84e0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
84f0: 73 25 73 5c 6e 22 2c 20 7a 53 71 6c 2c 20 28 6e  s%s\n", zSql, (n
8500: 3e 30 20 26 26 20 7a 53 71 6c 5b 6e 2d 31 5d 3d  >0 && zSql[n-1]=
8510: 3d 27 3b 27 29 20 3f 20 22 22 20 3a 20 22 3b 22  =';') ? "" : ";"
8520: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
8530: 65 6d 65 6e 74 20 74 68 65 20 75 73 65 72 28 29  ement the user()
8540: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20   SQL function.  
8550: 75 73 65 72 28 29 20 74 61 6b 65 73 20 6e 6f 20  user() takes no 
8560: 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 0a 2a 2a  arguments and.**
8570: 20 72 65 74 75 72 6e 73 20 74 68 65 20 75 73 65   returns the use
8580: 72 20 49 44 20 6f 66 20 74 68 65 20 63 75 72 72  r ID of the curr
8590: 65 6e 74 20 75 73 65 72 2e 0a 2a 2f 0a 73 74 61  ent user..*/.sta
85a0: 74 69 63 20 76 6f 69 64 20 64 62 5f 73 71 6c 5f  tic void db_sql_
85b0: 75 73 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  user(.  sqlite3_
85c0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
85d0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
85e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
85f0: 61 72 67 76 0a 29 7b 0a 20 20 69 66 28 20 67 2e  argv.){.  if( g.
8600: 7a 4c 6f 67 69 6e 21 3d 30 20 29 7b 0a 20 20 20  zLogin!=0 ){.   
8610: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8620: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 67 2e  text(context, g.
8630: 7a 4c 6f 67 69 6e 2c 20 2d 31 2c 20 53 51 4c 49  zLogin, -1, SQLI
8640: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a  TE_STATIC);.  }.
8650: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
8660: 6e 74 20 74 68 65 20 63 67 69 28 29 20 53 51 4c  nt the cgi() SQL
8670: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 63 67 69 28   function.  cgi(
8680: 29 20 74 61 6b 65 73 20 61 20 61 6e 20 61 72 67  ) takes a an arg
8690: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 0a 2a  ument which is.*
86a0: 2a 20 61 20 6e 61 6d 65 20 6f 66 20 43 47 49 20  * a name of CGI 
86b0: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
86c0: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   The value of th
86d0: 61 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  at parameter is 
86e0: 72 65 74 75 72 6e 65 64 2c 20 0a 2a 2a 20 69 66  returned, .** if
86f0: 20 61 76 61 69 6c 61 62 6c 65 2e 20 6f 70 74 69   available. opti
8700: 6f 6e 61 6c 20 73 65 63 6f 6e 64 20 61 72 67 75  onal second argu
8710: 6d 65 6e 74 20 77 69 6c 6c 20 62 65 20 72 65 74  ment will be ret
8720: 75 72 6e 65 64 20 69 66 20 74 68 65 20 66 69 72  urned if the fir
8730: 73 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 65 78  st.** doesn't ex
8740: 69 73 74 20 61 73 20 61 20 43 47 49 20 70 61 72  ist as a CGI par
8750: 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ameter..*/.stati
8760: 63 20 76 6f 69 64 20 64 62 5f 73 71 6c 5f 63 67  c void db_sql_cg
8770: 69 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  i(sqlite3_contex
8780: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  t *context, int 
8790: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
87a0: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63  lue **argv){.  c
87b0: 6f 6e 73 74 20 63 68 61 72 2a 20 7a 50 3b 0a 20  onst char* zP;. 
87c0: 20 69 66 28 20 61 72 67 63 21 3d 31 20 26 26 20   if( argc!=1 && 
87d0: 61 72 67 63 21 3d 32 20 29 20 72 65 74 75 72 6e  argc!=2 ) return
87e0: 3b 0a 20 20 7a 50 20 3d 20 50 28 28 63 6f 6e 73  ;.  zP = P((cons
87f0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
8800: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
8810: 30 5d 29 29 3b 0a 20 20 69 66 28 20 7a 50 20 29  0]));.  if( zP )
8820: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8830: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
8840: 74 2c 20 7a 50 2c 20 2d 31 2c 20 53 51 4c 49 54  t, zP, -1, SQLIT
8850: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c  E_STATIC);.  }el
8860: 73 65 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29  se if( argc==2 )
8870: 7b 0a 20 20 20 20 7a 50 20 3d 20 28 63 6f 6e 73  {.    zP = (cons
8880: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
8890: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
88a0: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 20  1]);.    if( zP 
88b0: 29 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  ) sqlite3_result
88c0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
88d0: 50 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  P, -1, SQLITE_TR
88e0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a  ANSIENT);.  }.}.
88f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  ./*.** This is u
8900: 73 65 64 20 62 79 20 74 68 65 20 5b 63 6f 6d 6d  sed by the [comm
8910: 69 74 5d 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  it] command..**.
8920: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
8930: 66 20 65 69 74 68 65 72 3a 0a 2a 2a 0a 2a 2a 20  f either:.**.** 
8940: 20 20 20 20 61 29 20 47 6c 6f 62 61 6c 2e 61 43      a) Global.aC
8950: 6f 6d 6d 69 74 46 69 6c 65 20 69 73 20 4e 55 4c  ommitFile is NUL
8960: 4c 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 62 29 20  L, or.**     b) 
8970: 47 6c 6f 62 61 6c 2e 61 43 6f 6d 6d 69 74 46 69  Global.aCommitFi
8980: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
8990: 69 6e 74 65 67 65 72 20 70 61 73 73 65 64 20 61  integer passed a
89a0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  s an argument..*
89b0: 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72  *.** Otherwise r
89c0: 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a  eturn false..*/.
89d0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c 65  static void file
89e0: 5f 69 73 5f 73 65 6c 65 63 74 65 64 28 0a 20 20  _is_selected(.  
89f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8a00: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
8a10: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
8a20: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
8a30: 20 20 61 73 73 65 72 74 28 61 72 67 63 3d 3d 31    assert(argc==1
8a40: 29 3b 0a 20 20 69 66 28 20 67 2e 61 43 6f 6d 6d  );.  if( g.aComm
8a50: 69 74 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  itFile ){.    in
8a60: 74 20 69 49 64 20 3d 20 73 71 6c 69 74 65 33 5f  t iId = sqlite3_
8a70: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30  value_int(argv[0
8a80: 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a  ]);.    int ii;.
8a90: 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 67 2e      for(ii=0; g.
8aa0: 61 43 6f 6d 6d 69 74 46 69 6c 65 5b 69 69 5d 3b  aCommitFile[ii];
8ab0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66   ii++){.      if
8ac0: 28 20 69 49 64 3d 3d 67 2e 61 43 6f 6d 6d 69 74  ( iId==g.aCommit
8ad0: 46 69 6c 65 5b 69 69 5d 20 29 7b 0a 20 20 20 20  File[ii] ){.    
8ae0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8af0: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
8b00: 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  1);.        retu
8b10: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
8b20: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  }.    sqlite3_re
8b30: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
8b40: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
8b50: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8b60: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 31  t_int(context, 1
8b70: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8b80: 43 6f 6e 76 65 72 74 20 74 68 65 20 69 6e 70 75  Convert the inpu
8b90: 74 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 6e  t string into an
8ba0: 20 53 48 41 31 2e 20 20 4d 61 6b 65 20 61 20 6e   SHA1.  Make a n
8bb0: 6f 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 0a 2a  otation in the.*
8bc0: 2a 20 43 4f 4e 43 45 41 4c 45 44 20 74 61 62 6c  * CONCEALED tabl
8bd0: 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 68 61  e so that the ha
8be0: 73 68 20 63 61 6e 20 62 65 20 75 6e 64 6f 20 75  sh can be undo u
8bf0: 73 69 6e 67 20 74 68 65 20 64 62 5f 72 65 76 65  sing the db_reve
8c00: 61 6c 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  al().** function
8c10: 20 61 74 20 73 6f 6d 65 20 6c 61 74 65 72 20 74   at some later t
8c20: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ime..**.** The v
8c30: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
8c40: 20 73 74 6f 72 65 64 20 69 6e 20 73 74 61 74 69   stored in stati
8c50: 63 20 73 70 61 63 65 20 61 6e 64 20 77 69 6c 6c  c space and will
8c60: 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 0a   be overwritten.
8c70: 2a 2a 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74  ** on subsequent
8c80: 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   calls..**.** If
8c90: 20 7a 43 6f 6e 74 65 6e 74 20 69 73 20 61 6c 72   zContent is alr
8ca0: 65 61 64 79 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  eady a well-form
8cb0: 65 64 20 53 48 41 31 20 68 61 73 68 2c 20 74 68  ed SHA1 hash, th
8cc0: 65 6e 20 72 65 74 75 72 6e 20 61 20 63 6f 70 79  en return a copy
8cd0: 0a 2a 2a 20 6f 66 20 74 68 61 74 20 68 61 73 68  .** of that hash
8ce0: 2c 20 6e 6f 74 20 61 20 68 61 73 68 20 6f 66 20  , not a hash of 
8cf0: 74 68 65 20 68 61 73 68 2e 0a 2a 2a 0a 2a 2a 20  the hash..**.** 
8d00: 54 68 65 20 43 4f 4e 43 45 41 4c 45 44 20 74 61  The CONCEALED ta
8d10: 62 6c 65 20 69 73 20 6d 65 61 6e 74 20 74 6f 20  ble is meant to 
8d20: 6f 62 73 63 75 72 65 20 65 6d 61 69 6c 20 61 64  obscure email ad
8d30: 64 72 65 73 73 65 73 2e 20 20 45 76 65 72 79 20  dresses.  Every 
8d40: 76 61 6c 69 64 0a 2a 2a 20 65 6d 61 69 6c 20 61  valid.** email a
8d50: 64 64 72 65 73 73 20 77 69 6c 6c 20 63 6f 6e 74  ddress will cont
8d60: 61 69 6e 20 61 20 22 40 22 20 63 68 61 72 61 63  ain a "@" charac
8d70: 74 65 72 20 61 6e 64 20 22 40 22 20 69 73 20 6e  ter and "@" is n
8d80: 6f 74 20 76 61 6c 69 64 20 77 69 74 68 69 6e 0a  ot valid within.
8d90: 2a 2a 20 61 6e 20 53 48 41 31 20 68 61 73 68 20  ** an SHA1 hash 
8da0: 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  so there is no c
8db0: 68 61 6e 63 65 20 74 68 61 74 20 61 20 76 61 6c  hance that a val
8dc0: 69 64 20 65 6d 61 69 6c 20 61 64 64 72 65 73 73  id email address
8dd0: 20 77 69 6c 6c 20 67 6f 0a 2a 2a 20 75 6e 63 6f   will go.** unco
8de0: 6e 63 65 61 6c 65 64 2e 0a 2a 2f 0a 63 68 61 72  ncealed..*/.char
8df0: 20 2a 64 62 5f 63 6f 6e 63 65 61 6c 28 63 6f 6e   *db_conceal(con
8e00: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e  st char *zConten
8e10: 74 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 73 74 61  t, int n){.  sta
8e20: 74 69 63 20 63 68 61 72 20 7a 48 61 73 68 5b 34  tic char zHash[4
8e30: 32 5d 3b 0a 20 20 42 6c 6f 62 20 6f 75 74 3b 0a  2];.  Blob out;.
8e40: 20 20 69 66 28 20 6e 3d 3d 34 30 20 26 26 20 76    if( n==40 && v
8e50: 61 6c 69 64 61 74 65 31 36 28 7a 43 6f 6e 74 65  alidate16(zConte
8e60: 6e 74 2c 20 6e 29 20 29 7b 0a 20 20 20 20 6d 65  nt, n) ){.    me
8e70: 6d 63 70 79 28 7a 48 61 73 68 2c 20 7a 43 6f 6e  mcpy(zHash, zCon
8e80: 74 65 6e 74 2c 20 6e 29 3b 0a 20 20 20 20 7a 48  tent, n);.    zH
8e90: 61 73 68 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 65  ash[n] = 0;.  }e
8ea0: 6c 73 65 7b 0a 20 20 20 20 73 68 61 31 73 75 6d  lse{.    sha1sum
8eb0: 5f 73 74 65 70 5f 74 65 78 74 28 7a 43 6f 6e 74  _step_text(zCont
8ec0: 65 6e 74 2c 20 6e 29 3b 0a 20 20 20 20 73 68 61  ent, n);.    sha
8ed0: 31 73 75 6d 5f 66 69 6e 69 73 68 28 26 6f 75 74  1sum_finish(&out
8ee0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
8ef0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
8f00: 48 61 73 68 29 2c 20 7a 48 61 73 68 2c 20 22 25  Hash), zHash, "%
8f10: 73 22 2c 20 62 6c 6f 62 5f 73 74 72 28 26 6f 75  s", blob_str(&ou
8f20: 74 29 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65  t));.    blob_re
8f30: 73 65 74 28 26 6f 75 74 29 3b 0a 20 20 20 20 64  set(&out);.    d
8f40: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20  b_multi_exec(.  
8f50: 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20       "INSERT OR 
8f60: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 63 6f 6e 63  IGNORE INTO conc
8f70: 65 61 6c 65 64 20 56 41 4c 55 45 53 28 25 51 2c  ealed VALUES(%Q,
8f80: 25 23 51 29 22 2c 0a 20 20 20 20 20 20 20 7a 48  %#Q)",.       zH
8f90: 61 73 68 2c 20 6e 2c 20 7a 43 6f 6e 74 65 6e 74  ash, n, zContent
8fa0: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65  .    );.  }.  re
8fb0: 74 75 72 6e 20 7a 48 61 73 68 3b 0a 7d 0a 0a 2f  turn zHash;.}../
8fc0: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
8fd0: 6c 6f 6f 6b 20 75 70 20 74 68 65 20 69 6e 70 75  look up the inpu
8fe0: 74 20 69 6e 20 74 68 65 20 43 4f 4e 43 45 41 4c  t in the CONCEAL
8ff0: 45 44 20 74 61 62 6c 65 2e 20 20 49 66 20 66 6f  ED table.  If fo
9000: 75 6e 64 2c 0a 2a 2a 20 61 6e 64 20 69 66 20 74  und,.** and if t
9010: 68 65 20 6f 6b 52 64 41 64 64 72 20 70 65 72 6d  he okRdAddr perm
9020: 69 73 73 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  ission is enable
9030: 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  d then return th
9040: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 76 61  e.** original va
9050: 6c 75 65 20 66 6f 72 20 77 68 69 63 68 20 74 68  lue for which th
9060: 65 20 69 6e 70 75 74 20 69 73 20 61 20 68 61 73  e input is a has
9070: 68 2e 20 20 49 66 20 6f 6b 52 64 41 64 64 72 20  h.  If okRdAddr 
9080: 69 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 69  is.** false or i
9090: 66 20 74 68 65 20 6c 6f 6f 6b 75 70 20 66 61 69  f the lookup fai
90a0: 6c 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6f  ls, return the o
90b0: 72 69 67 69 6e 61 6c 20 73 74 72 69 6e 67 20 63  riginal string c
90c0: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ontent..**.** In
90d0: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68   either case, th
90e0: 65 20 73 74 72 69 6e 67 20 72 65 74 75 72 6e 65  e string returne
90f0: 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 73  d is stored in s
9100: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  pace obtained.**
9110: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64   from malloc and
9120: 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64   should be freed
9130: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
9140: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61  function..*/.cha
9150: 72 20 2a 64 62 5f 72 65 76 65 61 6c 28 63 6f 6e  r *db_reveal(con
9160: 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 29 7b 0a  st char *zKey){.
9170: 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20    char *zOut;.  
9180: 69 66 28 20 67 2e 6f 6b 52 64 41 64 64 72 20 29  if( g.okRdAddr )
9190: 7b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 64 62 5f  {.    zOut = db_
91a0: 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20  text(0, "SELECT 
91b0: 63 6f 6e 74 65 6e 74 20 46 52 4f 4d 20 63 6f 6e  content FROM con
91c0: 63 65 61 6c 65 64 20 57 48 45 52 45 20 68 61 73  cealed WHERE has
91d0: 68 3d 25 51 22 2c 20 7a 4b 65 79 29 3b 0a 20 20  h=%Q", zKey);.  
91e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4f 75 74 20  }else{.    zOut 
91f0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  = 0;.  }.  if( z
9200: 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 4f  Out==0 ){.    zO
9210: 75 74 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73  ut = mprintf("%s
9220: 22 2c 20 7a 4b 65 79 29 3b 0a 20 20 7d 0a 20 20  ", zKey);.  }.  
9230: 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a  return zOut;.}..
9240: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
9250: 69 6f 6e 20 72 65 67 69 73 74 65 72 73 20 61 75  ion registers au
9260: 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f 6e  xiliary function
9270: 73 20 77 68 65 6e 20 74 68 65 20 53 51 4c 69 74  s when the SQLit
9280: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
9290: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 66 69 72 73  nnection is firs
92a0: 74 20 65 73 74 61 62 6c 69 73 68 65 64 2e 0a 2a  t established..*
92b0: 2f 0a 4c 4f 43 41 4c 20 76 6f 69 64 20 64 62 5f  /.LOCAL void db_
92c0: 63 6f 6e 6e 65 63 74 69 6f 6e 5f 69 6e 69 74 28  connection_init(
92d0: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
92e0: 5f 65 78 65 63 28 67 2e 64 62 2c 20 22 50 52 41  _exec(g.db, "PRA
92f0: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
9300: 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20 30 29  =OFF;", 0, 0, 0)
9310: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ;.  sqlite3_crea
9320: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 67 2e 64 62  te_function(g.db
9330: 2c 20 22 75 73 65 72 22 2c 20 30 2c 20 53 51 4c  , "user", 0, SQL
9340: 49 54 45 5f 41 4e 59 2c 20 30 2c 20 64 62 5f 73  ITE_ANY, 0, db_s
9350: 71 6c 5f 75 73 65 72 2c 20 30 2c 20 30 29 3b 0a  ql_user, 0, 0);.
9360: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
9370: 5f 66 75 6e 63 74 69 6f 6e 28 67 2e 64 62 2c 20  _function(g.db, 
9380: 22 63 67 69 22 2c 20 31 2c 20 53 51 4c 49 54 45  "cgi", 1, SQLITE
9390: 5f 41 4e 59 2c 20 30 2c 20 64 62 5f 73 71 6c 5f  _ANY, 0, db_sql_
93a0: 63 67 69 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  cgi, 0, 0);.  sq
93b0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
93c0: 63 74 69 6f 6e 28 67 2e 64 62 2c 20 22 63 67 69  ction(g.db, "cgi
93d0: 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 41 4e 59  ", 2, SQLITE_ANY
93e0: 2c 20 30 2c 20 64 62 5f 73 71 6c 5f 63 67 69 2c  , 0, db_sql_cgi,
93f0: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
9400: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
9410: 6e 28 67 2e 64 62 2c 20 22 70 72 69 6e 74 22 2c  n(g.db, "print",
9420: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
9430: 2c 20 30 2c 64 62 5f 73 71 6c 5f 70 72 69 6e 74  , 0,db_sql_print
9440: 2c 30 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ,0,0);.  sqlite3
9450: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
9460: 28 0a 20 20 20 20 67 2e 64 62 2c 20 22 66 69 6c  (.    g.db, "fil
9470: 65 5f 69 73 5f 73 65 6c 65 63 74 65 64 22 2c 20  e_is_selected", 
9480: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
9490: 30 2c 20 66 69 6c 65 5f 69 73 5f 73 65 6c 65 63  0, file_is_selec
94a0: 74 65 64 2c 30 2c 30 0a 20 20 29 3b 0a 20 20 69  ted,0,0.  );.  i
94b0: 66 28 20 67 2e 66 53 71 6c 54 72 61 63 65 20 29  f( g.fSqlTrace )
94c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72  {.    sqlite3_tr
94d0: 61 63 65 28 67 2e 64 62 2c 20 64 62 5f 73 71 6c  ace(g.db, db_sql
94e0: 5f 74 72 61 63 65 2c 20 30 29 3b 0a 20 20 7d 0a  _trace, 0);.  }.
94f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9500: 74 72 75 65 20 69 66 20 74 68 65 20 73 74 72 69  true if the stri
9510: 6e 67 20 7a 56 61 6c 20 72 65 70 72 65 73 65 6e  ng zVal represen
9520: 74 73 20 22 74 72 75 65 22 20 28 6f 72 20 22 66  ts "true" (or "f
9530: 61 6c 73 65 22 29 2e 0a 2a 2f 0a 69 6e 74 20 69  alse")..*/.int i
9540: 73 5f 74 72 75 74 68 28 63 6f 6e 73 74 20 63 68  s_truth(const ch
9550: 61 72 20 2a 7a 56 61 6c 29 7b 0a 20 20 73 74 61  ar *zVal){.  sta
9560: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
9570: 61 7a 4f 6e 5b 5d 20 3d 20 7b 20 22 6f 6e 22 2c  azOn[] = { "on",
9580: 20 22 79 65 73 22 2c 20 22 74 72 75 65 22 2c 20   "yes", "true", 
9590: 22 31 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  "1" };.  int i;.
95a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
95b0: 65 6f 66 28 61 7a 4f 6e 29 2f 73 69 7a 65 6f 66  eof(azOn)/sizeof
95c0: 28 61 7a 4f 6e 5b 30 5d 29 3b 20 69 2b 2b 29 7b  (azOn[0]); i++){
95d0: 0a 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f  .    if( fossil_
95e0: 73 74 72 63 6d 70 28 7a 56 61 6c 2c 61 7a 4f 6e  strcmp(zVal,azOn
95f0: 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  [i])==0 ) return
9600: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
9610: 20 30 3b 0a 7d 0a 69 6e 74 20 69 73 5f 66 61 6c   0;.}.int is_fal
9620: 73 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  se(const char *z
9630: 56 61 6c 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Val){.  static c
9640: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4f 66 66  onst char *azOff
9650: 5b 5d 20 3d 20 7b 20 22 6f 66 66 22 2c 20 22 6e  [] = { "off", "n
9660: 6f 22 2c 20 22 66 61 6c 73 65 22 2c 20 22 30 22  o", "false", "0"
9670: 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   };.  int i;.  f
9680: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
9690: 28 61 7a 4f 66 66 29 2f 73 69 7a 65 6f 66 28 61  (azOff)/sizeof(a
96a0: 7a 4f 66 66 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  zOff[0]); i++){.
96b0: 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73      if( fossil_s
96c0: 74 72 63 6d 70 28 7a 56 61 6c 2c 61 7a 4f 66 66  trcmp(zVal,azOff
96d0: 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  [i])==0 ) return
96e0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
96f0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61   0;.}../*.** Swa
9700: 70 20 74 68 65 20 67 2e 64 62 20 61 6e 64 20 67  p the g.db and g
9710: 2e 64 62 43 6f 6e 66 69 67 20 63 6f 6e 6e 65 63  .dbConfig connec
9720: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68  tions so that th
9730: 65 20 76 61 72 69 6f 75 73 20 64 62 5f 2a 20 72  e various db_* r
9740: 6f 75 74 69 6e 65 73 0a 2a 2a 20 77 6f 72 6b 20  outines.** work 
9750: 6f 6e 20 74 68 65 20 7e 2f 2e 66 6f 73 73 69 6c  on the ~/.fossil
9760: 20 64 61 74 61 62 61 73 65 20 69 6e 73 74 65 61   database instea
9770: 64 20 6f 66 20 6f 6e 20 74 68 65 20 72 65 70 6f  d of on the repo
9780: 73 69 74 6f 72 79 20 64 61 74 61 62 61 73 65 2e  sitory database.
9790: 0a 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 73  .** Be sure to s
97a0: 77 61 70 20 74 68 65 6d 20 62 61 63 6b 20 61 66  wap them back af
97b0: 74 65 72 20 64 6f 69 6e 67 20 74 68 65 20 6f 70  ter doing the op
97c0: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
97d0: 66 20 67 2e 75 73 65 41 74 74 61 63 68 20 74 68  f g.useAttach th
97e0: 61 74 20 6d 65 61 6e 73 20 74 68 65 20 7e 2f 2e  at means the ~/.
97f0: 66 6f 73 73 69 6c 20 64 61 74 61 62 61 73 65 20  fossil database 
9800: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 0a  was opened with.
9810: 2a 2a 20 74 68 65 20 75 73 65 41 74 74 61 63 68  ** the useAttach
9820: 20 66 6c 61 67 20 73 65 74 20 74 6f 20 31 2e 20   flag set to 1. 
9830: 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6e 6f   In that case no
9840: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 77 61 70   connection swap
9850: 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20   is required.** 
9860: 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
9870: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76  is a no-op..*/.v
9880: 6f 69 64 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e  oid db_swap_conn
9890: 65 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20  ections(void){. 
98a0: 20 69 66 28 20 21 67 2e 75 73 65 41 74 74 61 63   if( !g.useAttac
98b0: 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  h ){.    sqlite3
98c0: 20 2a 64 62 54 65 6d 70 20 3d 20 67 2e 64 62 3b   *dbTemp = g.db;
98d0: 0a 20 20 20 20 67 2e 64 62 20 3d 20 67 2e 64 62  .    g.db = g.db
98e0: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 67 2e 64 62  Config;.    g.db
98f0: 43 6f 6e 66 69 67 20 3d 20 64 62 54 65 6d 70 3b  Config = dbTemp;
9900: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
9910: 74 20 61 6e 64 20 73 65 74 20 76 61 6c 75 65 73  t and set values
9920: 20 66 72 6f 6d 20 74 68 65 20 43 4f 4e 46 49 47   from the CONFIG
9930: 2c 20 47 4c 4f 42 41 4c 5f 43 4f 4e 46 49 47 20  , GLOBAL_CONFIG 
9940: 61 6e 64 20 56 56 41 52 20 74 61 62 6c 65 20 69  and VVAR table i
9950: 6e 20 74 68 65 0a 2a 2a 20 72 65 70 6f 73 69 74  n the.** reposit
9960: 6f 72 79 20 61 6e 64 20 6c 6f 63 61 6c 20 64 61  ory and local da
9970: 74 61 62 61 73 65 73 2e 0a 2a 2f 0a 63 68 61 72  tabases..*/.char
9980: 20 2a 64 62 5f 67 65 74 28 63 6f 6e 73 74 20 63   *db_get(const c
9990: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 68 61 72  har *zName, char
99a0: 20 2a 7a 44 65 66 61 75 6c 74 29 7b 0a 20 20 63   *zDefault){.  c
99b0: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66  har *z = 0;.  if
99c0: 28 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70  ( g.repositoryOp
99d0: 65 6e 20 29 7b 0a 20 20 20 20 7a 20 3d 20 64 62  en ){.    z = db
99e0: 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54  _text(0, "SELECT
99f0: 20 76 61 6c 75 65 20 46 52 4f 4d 20 63 6f 6e 66   value FROM conf
9a00: 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ig WHERE name=%Q
9a10: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  ", zName);.  }. 
9a20: 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 67 2e 63   if( z==0 && g.c
9a30: 6f 6e 66 69 67 4f 70 65 6e 20 29 7b 0a 20 20 20  onfigOpen ){.   
9a40: 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65 63 74   db_swap_connect
9a50: 69 6f 6e 73 28 29 3b 0a 20 20 20 20 7a 20 3d 20  ions();.    z = 
9a60: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
9a70: 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 67 6c  CT value FROM gl
9a80: 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45 52  obal_config WHER
9a90: 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d  E name=%Q", zNam
9aa0: 65 29 3b 0a 20 20 20 20 64 62 5f 73 77 61 70 5f  e);.    db_swap_
9ab0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 29 3b 0a 20  connections();. 
9ac0: 20 7d 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b   }.  if( z==0 ){
9ad0: 0a 20 20 20 20 7a 20 3d 20 7a 44 65 66 61 75 6c  .    z = zDefaul
9ae0: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
9af0: 7a 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 73 65 74  z;.}.void db_set
9b00: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
9b10: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
9b20: 7a 56 61 6c 75 65 2c 20 69 6e 74 20 67 6c 6f 62  zValue, int glob
9b30: 61 6c 46 6c 61 67 29 7b 0a 20 20 64 62 5f 62 65  alFlag){.  db_be
9b40: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
9b50: 29 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61 6c 46  );.  if( globalF
9b60: 6c 61 67 20 29 7b 0a 20 20 20 20 64 62 5f 73 77  lag ){.    db_sw
9b70: 61 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 29  ap_connections()
9b80: 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65  ;.    db_multi_e
9b90: 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54  xec("REPLACE INT
9ba0: 4f 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 28  O global_config(
9bb0: 6e 61 6d 65 2c 76 61 6c 75 65 29 20 56 41 4c 55  name,value) VALU
9bc0: 45 53 28 25 51 2c 25 51 29 22 2c 0a 20 20 20 20  ES(%Q,%Q)",.    
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
9be0: 4e 61 6d 65 2c 20 7a 56 61 6c 75 65 29 3b 0a 20  Name, zValue);. 
9bf0: 20 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65     db_swap_conne
9c00: 63 74 69 6f 6e 73 28 29 3b 0a 20 20 7d 65 6c 73  ctions();.  }els
9c10: 65 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  e{.    db_multi_
9c20: 65 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e  exec("REPLACE IN
9c30: 54 4f 20 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76  TO config(name,v
9c40: 61 6c 75 65 29 20 56 41 4c 55 45 53 28 25 51 2c  alue) VALUES(%Q,
9c50: 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %Q)",.          
9c60: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
9c70: 7a 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 20 20 69  zValue);.  }.  i
9c80: 66 28 20 67 6c 6f 62 61 6c 46 6c 61 67 20 26 26  f( globalFlag &&
9c90: 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65   g.repositoryOpe
9ca0: 6e 20 29 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74  n ){.    db_mult
9cb0: 69 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20 46  i_exec("DELETE F
9cc0: 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45  ROM config WHERE
9cd0: 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65   name=%Q", zName
9ce0: 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 65 6e 64 5f  );.  }.  db_end_
9cf0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a  transaction(0);.
9d00: 7d 0a 76 6f 69 64 20 64 62 5f 75 6e 73 65 74 28  }.void db_unset(
9d10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
9d20: 65 2c 20 69 6e 74 20 67 6c 6f 62 61 6c 46 6c 61  e, int globalFla
9d30: 67 29 7b 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74  g){.  db_begin_t
9d40: 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20  ransaction();.  
9d50: 69 66 28 20 67 6c 6f 62 61 6c 46 6c 61 67 20 29  if( globalFlag )
9d60: 7b 0a 20 20 20 20 64 62 5f 73 77 61 70 5f 63 6f  {.    db_swap_co
9d70: 6e 6e 65 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20  nnections();.   
9d80: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
9d90: 44 45 4c 45 54 45 20 46 52 4f 4d 20 67 6c 6f 62  DELETE FROM glob
9da0: 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45 52 45 20  al_config WHERE 
9db0: 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29  name=%Q", zName)
9dc0: 3b 0a 20 20 20 20 64 62 5f 73 77 61 70 5f 63 6f  ;.    db_swap_co
9dd0: 6e 6e 65 63 74 69 6f 6e 73 28 29 3b 0a 20 20 7d  nnections();.  }
9de0: 65 6c 73 65 7b 0a 20 20 20 20 64 62 5f 6d 75 6c  else{.    db_mul
9df0: 74 69 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20  ti_exec("DELETE 
9e00: 46 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52  FROM config WHER
9e10: 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d  E name=%Q", zNam
9e20: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 6c  e);.  }.  if( gl
9e30: 6f 62 61 6c 46 6c 61 67 20 26 26 20 67 2e 72 65  obalFlag && g.re
9e40: 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20 29 7b 0a  positoryOpen ){.
9e50: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
9e60: 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 63  c("DELETE FROM c
9e70: 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65  onfig WHERE name
9e80: 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  =%Q", zName);.  
9e90: 7d 0a 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73  }.  db_end_trans
9ea0: 61 63 74 69 6f 6e 28 30 29 3b 0a 7d 0a 69 6e 74  action(0);.}.int
9eb0: 20 64 62 5f 69 73 5f 67 6c 6f 62 61 6c 28 63 6f   db_is_global(co
9ec0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
9ed0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
9ee0: 20 20 69 66 28 20 67 2e 63 6f 6e 66 69 67 4f 70    if( g.configOp
9ef0: 65 6e 20 29 7b 0a 20 20 20 20 64 62 5f 73 77 61  en ){.    db_swa
9f00: 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 29 3b  p_connections();
9f10: 0a 20 20 20 20 72 63 20 3d 20 64 62 5f 65 78 69  .    rc = db_exi
9f20: 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52  sts("SELECT 1 FR
9f30: 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67  OM global_config
9f40: 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
9f50: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 64 62 5f   zName);.    db_
9f60: 73 77 61 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73  swap_connections
9f70: 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
9f80: 20 72 63 3b 0a 7d 0a 69 6e 74 20 64 62 5f 67 65   rc;.}.int db_ge
9f90: 74 5f 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72  t_int(const char
9fa0: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 64 66 6c   *zName, int dfl
9fb0: 74 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 64 66  t){.  int v = df
9fc0: 6c 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lt;.  int rc;.  
9fd0: 69 66 28 20 67 2e 72 65 70 6f 73 69 74 6f 72 79  if( g.repository
9fe0: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 53 74 6d 74  Open ){.    Stmt
9ff0: 20 71 3b 0a 20 20 20 20 64 62 5f 70 72 65 70 61   q;.    db_prepa
a000: 72 65 28 26 71 2c 20 22 53 45 4c 45 43 54 20 76  re(&q, "SELECT v
a010: 61 6c 75 65 20 46 52 4f 4d 20 63 6f 6e 66 69 67  alue FROM config
a020: 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
a030: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20   zName);.    rc 
a040: 3d 20 64 62 5f 73 74 65 70 28 26 71 29 3b 0a 20  = db_step(&q);. 
a050: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
a060: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 76  E_ROW ){.      v
a070: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
a080: 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  (&q, 0);.    }. 
a090: 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26     db_finalize(&
a0a0: 71 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  q);.  }else{.   
a0b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
a0c0: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  E;.  }.  if( rc=
a0d0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20  =SQLITE_DONE && 
a0e0: 67 2e 63 6f 6e 66 69 67 4f 70 65 6e 20 29 7b 0a  g.configOpen ){.
a0f0: 20 20 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e      db_swap_conn
a100: 65 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 76  ections();.    v
a110: 20 3d 20 64 62 5f 69 6e 74 28 64 66 6c 74 2c 20   = db_int(dflt, 
a120: 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52  "SELECT value FR
a130: 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67  OM global_config
a140: 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
a150: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 64 62 5f   zName);.    db_
a160: 73 77 61 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73  swap_connections
a170: 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
a180: 20 76 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 73 65   v;.}.void db_se
a190: 74 5f 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72  t_int(const char
a1a0: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 76 61 6c   *zName, int val
a1b0: 75 65 2c 20 69 6e 74 20 67 6c 6f 62 61 6c 46 6c  ue, int globalFl
a1c0: 61 67 29 7b 0a 20 20 69 66 28 20 67 6c 6f 62 61  ag){.  if( globa
a1d0: 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 64 62 5f  lFlag ){.    db_
a1e0: 73 77 61 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73  swap_connections
a1f0: 28 29 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69  ();.    db_multi
a200: 5f 65 78 65 63 28 22 52 45 50 4c 41 43 45 20 49  _exec("REPLACE I
a210: 4e 54 4f 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69  NTO global_confi
a220: 67 28 6e 61 6d 65 2c 76 61 6c 75 65 29 20 56 41  g(name,value) VA
a230: 4c 55 45 53 28 25 51 2c 25 64 29 22 2c 0a 20 20  LUES(%Q,%d)",.  
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a250: 7a 4e 61 6d 65 2c 20 76 61 6c 75 65 29 3b 0a 20  zName, value);. 
a260: 20 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65     db_swap_conne
a270: 63 74 69 6f 6e 73 28 29 3b 0a 20 20 7d 65 6c 73  ctions();.  }els
a280: 65 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  e{.    db_multi_
a290: 65 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e  exec("REPLACE IN
a2a0: 54 4f 20 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76  TO config(name,v
a2b0: 61 6c 75 65 29 20 56 41 4c 55 45 53 28 25 51 2c  alue) VALUES(%Q,
a2c0: 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %d)",.          
a2d0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 76          zName, v
a2e0: 61 6c 75 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  alue);.  }.  if(
a2f0: 20 67 6c 6f 62 61 6c 46 6c 61 67 20 26 26 20 67   globalFlag && g
a300: 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20  .repositoryOpen 
a310: 29 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  ){.    db_multi_
a320: 65 78 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f  exec("DELETE FRO
a330: 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e  M config WHERE n
a340: 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b  ame=%Q", zName);
a350: 0a 20 20 7d 0a 7d 0a 69 6e 74 20 64 62 5f 67 65  .  }.}.int db_ge
a360: 74 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  t_boolean(const 
a370: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
a380: 20 64 66 6c 74 29 7b 0a 20 20 63 68 61 72 20 2a   dflt){.  char *
a390: 7a 56 61 6c 20 3d 20 64 62 5f 67 65 74 28 7a 4e  zVal = db_get(zN
a3a0: 61 6d 65 2c 20 64 66 6c 74 20 3f 20 22 6f 6e 22  ame, dflt ? "on"
a3b0: 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 69 66 28   : "off");.  if(
a3c0: 20 69 73 5f 74 72 75 74 68 28 7a 56 61 6c 29 20   is_truth(zVal) 
a3d0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
a3e0: 28 20 69 73 5f 66 61 6c 73 65 28 7a 56 61 6c 29  ( is_false(zVal)
a3f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
a400: 65 74 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 63 68  eturn dflt;.}.ch
a410: 61 72 20 2a 64 62 5f 6c 67 65 74 28 63 6f 6e 73  ar *db_lget(cons
a420: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
a430: 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 29 7b 0a  har *zDefault){.
a440: 20 20 72 65 74 75 72 6e 20 64 62 5f 74 65 78 74    return db_text
a450: 28 28 63 68 61 72 2a 29 7a 44 65 66 61 75 6c 74  ((char*)zDefault
a460: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a470: 20 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65     "SELECT value
a480: 20 46 52 4f 4d 20 76 76 61 72 20 57 48 45 52 45   FROM vvar WHERE
a490: 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65   name=%Q", zName
a4a0: 29 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 6c 73 65  );.}.void db_lse
a4b0: 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  t(const char *zN
a4c0: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
a4d0: 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 64 62 5f 6d  *zValue){.  db_m
a4e0: 75 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41  ulti_exec("REPLA
a4f0: 43 45 20 49 4e 54 4f 20 76 76 61 72 28 6e 61 6d  CE INTO vvar(nam
a500: 65 2c 76 61 6c 75 65 29 20 56 41 4c 55 45 53 28  e,value) VALUES(
a510: 25 51 2c 25 51 29 22 2c 20 7a 4e 61 6d 65 2c 20  %Q,%Q)", zName, 
a520: 7a 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e 74 20 64  zValue);.}.int d
a530: 62 5f 6c 67 65 74 5f 69 6e 74 28 63 6f 6e 73 74  b_lget_int(const
a540: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
a550: 74 20 64 66 6c 74 29 7b 0a 20 20 72 65 74 75 72  t dflt){.  retur
a560: 6e 20 64 62 5f 69 6e 74 28 64 66 6c 74 2c 20 22  n db_int(dflt, "
a570: 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f  SELECT value FRO
a580: 4d 20 76 76 61 72 20 57 48 45 52 45 20 6e 61 6d  M vvar WHERE nam
a590: 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 7d  e=%Q", zName);.}
a5a0: 0a 76 6f 69 64 20 64 62 5f 6c 73 65 74 5f 69 6e  .void db_lset_in
a5b0: 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  t(const char *zN
a5c0: 61 6d 65 2c 20 69 6e 74 20 76 61 6c 75 65 29 7b  ame, int value){
a5d0: 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63  .  db_multi_exec
a5e0: 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 76  ("REPLACE INTO v
a5f0: 76 61 72 28 6e 61 6d 65 2c 76 61 6c 75 65 29 20  var(name,value) 
a600: 56 41 4c 55 45 53 28 25 51 2c 25 64 29 22 2c 20  VALUES(%Q,%d)", 
a610: 7a 4e 61 6d 65 2c 20 76 61 6c 75 65 29 3b 0a 7d  zName, value);.}
a620: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
a630: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6c 6f 63  he name of a loc
a640: 61 6c 20 72 65 70 6f 73 69 74 6f 72 79 20 69 6e  al repository in
a650: 20 74 68 65 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66   the global_conf
a660: 69 67 28 29 20 64 61 74 61 62 61 73 65 2e 0a 2a  ig() database..*
a670: 2a 20 54 68 65 20 72 65 70 6f 73 69 74 6f 72 79  * The repository
a680: 20 66 69 6c 65 6e 61 6d 65 20 25 73 20 69 73 20   filename %s is 
a690: 72 65 63 6f 72 64 65 64 20 61 73 20 61 6e 20 65  recorded as an e
a6a0: 6e 74 72 79 20 77 69 74 68 20 61 20 22 6e 61 6d  ntry with a "nam
a6b0: 65 22 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74  e" field.** of t
a6c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
a6d0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 72  m:.**.**       r
a6e0: 65 70 6f 3a 25 73 0a 2a 2a 0a 2a 2a 20 54 68 65  epo:%s.**.** The
a6f0: 20 76 61 6c 75 65 20 66 69 65 6c 64 20 69 73 20   value field is 
a700: 73 65 74 20 74 6f 20 31 2e 0a 2a 2f 0a 76 6f 69  set to 1..*/.voi
a710: 64 20 64 62 5f 72 65 63 6f 72 64 5f 72 65 70 6f  d db_record_repo
a720: 73 69 74 6f 72 79 5f 66 69 6c 65 6e 61 6d 65 28  sitory_filename(
a730: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
a740: 65 29 7b 0a 20 20 42 6c 6f 62 20 66 75 6c 6c 3b  e){.  Blob full;
a750: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
a760: 29 7b 0a 20 20 20 20 69 66 28 20 21 67 2e 6c 6f  ){.    if( !g.lo
a770: 63 61 6c 4f 70 65 6e 20 29 20 72 65 74 75 72 6e  calOpen ) return
a780: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 64 62  ;.    zName = db
a790: 5f 6c 67 65 74 28 22 72 65 70 6f 73 69 74 6f 72  _lget("repositor
a7a0: 79 22 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 69  y", 0);.  }.  fi
a7b0: 6c 65 5f 63 61 6e 6f 6e 69 63 61 6c 5f 6e 61 6d  le_canonical_nam
a7c0: 65 28 7a 4e 61 6d 65 2c 20 26 66 75 6c 6c 29 3b  e(zName, &full);
a7d0: 0a 20 20 64 62 5f 73 77 61 70 5f 63 6f 6e 6e 65  .  db_swap_conne
a7e0: 63 74 69 6f 6e 73 28 29 3b 0a 20 20 64 62 5f 6d  ctions();.  db_m
a7f0: 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20  ulti_exec(.     
a800: 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52  "INSERT OR IGNOR
a810: 45 20 49 4e 54 4f 20 67 6c 6f 62 61 6c 5f 63 6f  E INTO global_co
a820: 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c 75 65 29  nfig(name,value)
a830: 22 0a 20 20 20 20 20 22 56 41 4c 55 45 53 28 27  ".     "VALUES('
a840: 72 65 70 6f 3a 25 71 27 2c 31 29 22 2c 0a 20 20  repo:%q',1)",.  
a850: 20 20 20 62 6c 6f 62 5f 73 74 72 28 26 66 75 6c     blob_str(&ful
a860: 6c 29 0a 20 20 29 3b 0a 20 20 64 62 5f 73 77 61  l).  );.  db_swa
a870: 70 5f 63 6f 6e 6e 65 63 74 69 6f 6e 73 28 29 3b  p_connections();
a880: 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 66  .  blob_reset(&f
a890: 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ull);.}../*.** C
a8a0: 4f 4d 4d 41 4e 44 3a 20 6f 70 65 6e 0a 2a 2a 0a  OMMAND: open.**.
a8b0: 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69  ** Usage: %fossi
a8c0: 6c 20 6f 70 65 6e 20 46 49 4c 45 4e 41 4d 45 20  l open FILENAME 
a8d0: 3f 56 45 52 53 49 4f 4e 3f 20 3f 2d 2d 6b 65 65  ?VERSION? ?--kee
a8e0: 70 3f 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  p?.**.** Open a 
a8f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
a900: 65 20 6c 6f 63 61 6c 20 72 65 70 6f 73 69 74 6f  e local reposito
a910: 72 79 20 69 6e 20 46 49 4c 45 4e 41 4d 45 2e 20  ry in FILENAME. 
a920: 20 41 20 63 68 65 63 6b 6f 75 74 0a 2a 2a 20 66   A checkout.** f
a930: 6f 72 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72  or the repositor
a940: 79 20 69 73 20 63 72 65 61 74 65 64 20 77 69 74  y is created wit
a950: 68 20 69 74 73 20 72 6f 6f 74 20 61 74 20 74 68  h its root at th
a960: 65 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  e working direct
a970: 6f 72 79 2e 0a 2a 2a 20 49 66 20 56 45 52 53 49  ory..** If VERSI
a980: 4f 4e 20 69 73 20 73 70 65 63 69 66 69 65 64 20  ON is specified 
a990: 74 68 65 6e 20 74 68 61 74 20 76 65 72 73 69 6f  then that versio
a9a0: 6e 20 69 73 20 63 68 65 63 6b 65 64 20 6f 75 74  n is checked out
a9b0: 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
a9c0: 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
a9d0: 6f 6e 20 69 73 20 63 68 65 63 6b 65 64 20 6f 75  on is checked ou
a9e0: 74 2e 20 20 4e 6f 20 66 69 6c 65 73 20 6f 74 68  t.  No files oth
a9f0: 65 72 20 74 68 61 6e 20 22 6d 61 6e 69 66 65 73  er than "manifes
aa00: 74 22 0a 2a 2a 20 61 6e 64 20 22 6d 61 6e 69 66  t".** and "manif
aa10: 65 73 74 2e 75 75 69 64 22 20 61 72 65 20 6d 6f  est.uuid" are mo
aa20: 64 69 66 69 65 64 20 69 66 20 74 68 65 20 2d 2d  dified if the --
aa30: 6b 65 65 70 20 6f 70 74 69 6f 6e 20 69 73 20 70  keep option is p
aa40: 72 65 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53 65  resent..**.** Se
aa50: 65 20 61 6c 73 6f 20 74 68 65 20 22 63 6c 6f 73  e also the "clos
aa60: 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 76  e" command..*/.v
aa70: 6f 69 64 20 63 6d 64 5f 6f 70 65 6e 28 76 6f 69  oid cmd_open(voi
aa80: 64 29 7b 0a 20 20 42 6c 6f 62 20 70 61 74 68 3b  d){.  Blob path;
aa90: 0a 20 20 69 6e 74 20 76 69 64 3b 0a 20 20 69 6e  .  int vid;.  in
aaa0: 74 20 6b 65 65 70 46 6c 61 67 3b 0a 20 20 73 74  t keepFlag;.  st
aab0: 61 74 69 63 20 63 68 61 72 20 2a 61 7a 4e 65 77  atic char *azNew
aac0: 41 72 67 76 5b 5d 20 3d 20 7b 20 30 2c 20 22 63  Argv[] = { 0, "c
aad0: 68 65 63 6b 6f 75 74 22 2c 20 22 2d 2d 70 72 6f  heckout", "--pro
aae0: 6d 70 74 22 2c 20 22 2d 2d 6c 61 74 65 73 74 22  mpt", "--latest"
aaf0: 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 75 72 6c 5f  , 0, 0 };.  url_
ab00: 70 72 6f 78 79 5f 6f 70 74 69 6f 6e 73 28 29 3b  proxy_options();
ab10: 0a 20 20 6b 65 65 70 46 6c 61 67 20 3d 20 66 69  .  keepFlag = fi
ab20: 6e 64 5f 6f 70 74 69 6f 6e 28 22 6b 65 65 70 22  nd_option("keep"
ab30: 2c 30 2c 30 29 21 3d 30 3b 0a 20 20 69 66 28 20  ,0,0)!=0;.  if( 
ab40: 67 2e 61 72 67 63 21 3d 33 20 26 26 20 67 2e 61  g.argc!=3 && g.a
ab50: 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 75 73  rgc!=4 ){.    us
ab60: 61 67 65 28 22 52 45 50 4f 53 49 54 4f 52 59 2d  age("REPOSITORY-
ab70: 46 49 4c 45 4e 41 4d 45 20 3f 56 45 52 53 49 4f  FILENAME ?VERSIO
ab80: 4e 3f 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  N?");.  }.  if( 
ab90: 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 29 20  db_open_local() 
aba0: 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61  ){.    fossil_pa
abb0: 6e 69 63 28 22 61 6c 72 65 61 64 79 20 77 69 74  nic("already wit
abc0: 68 69 6e 20 61 6e 20 6f 70 65 6e 20 74 72 65 65  hin an open tree
abd0: 20 72 6f 6f 74 65 64 20 61 74 20 25 73 22 2c 20   rooted at %s", 
abe0: 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20  g.zLocalRoot);. 
abf0: 20 7d 0a 20 20 66 69 6c 65 5f 63 61 6e 6f 6e 69   }.  file_canoni
ac00: 63 61 6c 5f 6e 61 6d 65 28 67 2e 61 72 67 76 5b  cal_name(g.argv[
ac10: 32 5d 2c 20 26 70 61 74 68 29 3b 0a 20 20 64 62  2], &path);.  db
ac20: 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79  _open_repository
ac30: 28 62 6c 6f 62 5f 73 74 72 28 26 70 61 74 68 29  (blob_str(&path)
ac40: 29 3b 0a 20 20 64 62 5f 69 6e 69 74 5f 64 61 74  );.  db_init_dat
ac50: 61 62 61 73 65 28 22 2e 2f 5f 46 4f 53 53 49 4c  abase("./_FOSSIL
ac60: 5f 22 2c 20 7a 4c 6f 63 61 6c 53 63 68 65 6d 61  _", zLocalSchema
ac70: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 64  , (char*)0);.  d
ac80: 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 29 3b 0a  b_open_local();.
ac90: 20 20 64 62 5f 6c 73 65 74 28 22 72 65 70 6f 73    db_lset("repos
aca0: 69 74 6f 72 79 22 2c 20 62 6c 6f 62 5f 73 74 72  itory", blob_str
acb0: 28 26 70 61 74 68 29 29 3b 0a 20 20 64 62 5f 72  (&path));.  db_r
acc0: 65 63 6f 72 64 5f 72 65 70 6f 73 69 74 6f 72 79  ecord_repository
acd0: 5f 66 69 6c 65 6e 61 6d 65 28 62 6c 6f 62 5f 73  _filename(blob_s
ace0: 74 72 28 26 70 61 74 68 29 29 3b 0a 20 20 76 69  tr(&path));.  vi
acf0: 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53  d = db_int(0, "S
ad00: 45 4c 45 43 54 20 70 69 64 20 46 52 4f 4d 20 70  ELECT pid FROM p
ad10: 6c 69 6e 6b 20 79 22 0a 20 20 20 20 20 20 20 20  link y".        
ad20: 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
ad30: 45 20 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c  E NOT EXISTS(SEL
ad40: 45 43 54 20 31 20 46 52 4f 4d 20 70 6c 69 6e 6b  ECT 1 FROM plink
ad50: 20 78 20 57 48 45 52 45 20 78 2e 63 69 64 3d 79   x WHERE x.cid=y
ad60: 2e 70 69 64 29 22 29 3b 0a 20 20 69 66 28 20 76  .pid)");.  if( v
ad70: 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f  id==0 ){.    db_
ad80: 6c 73 65 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f  lset_int("checko
ad90: 75 74 22 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  ut", 1);.  }else
ada0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 6f 6c 64  {.    char **old
adb0: 41 72 67 76 20 3d 20 67 2e 61 72 67 76 3b 0a 20  Argv = g.argv;. 
adc0: 20 20 20 69 6e 74 20 6f 6c 64 41 72 67 63 20 3d     int oldArgc =
add0: 20 67 2e 61 72 67 63 3b 0a 20 20 20 20 64 62 5f   g.argc;.    db_
ade0: 6c 73 65 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f  lset_int("checko
adf0: 75 74 22 2c 20 76 69 64 29 3b 0a 20 20 20 20 61  ut", vid);.    a
ae00: 7a 4e 65 77 41 72 67 76 5b 30 5d 20 3d 20 67 2e  zNewArgv[0] = g.
ae10: 61 72 67 76 5b 30 5d 3b 0a 20 20 20 20 67 2e 61  argv[0];.    g.a
ae20: 72 67 76 20 3d 20 61 7a 4e 65 77 41 72 67 76 3b  rgv = azNewArgv;
ae30: 0a 20 20 20 20 67 2e 61 72 67 63 20 3d 20 34 3b  .    g.argc = 4;
ae40: 0a 20 20 20 20 69 66 28 20 6f 6c 64 41 72 67 63  .    if( oldArgc
ae50: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 61 7a 4e  ==4 ){.      azN
ae60: 65 77 41 72 67 76 5b 67 2e 61 72 67 63 2d 31 5d  ewArgv[g.argc-1]
ae70: 20 3d 20 6f 6c 64 41 72 67 76 5b 33 5d 3b 0a 20   = oldArgv[3];. 
ae80: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6b 65 65     }.    if( kee
ae90: 70 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61  pFlag ){.      a
aea0: 7a 4e 65 77 41 72 67 76 5b 67 2e 61 72 67 63 2b  zNewArgv[g.argc+
aeb0: 2b 5d 20 3d 20 22 2d 2d 6b 65 65 70 22 3b 0a 20  +] = "--keep";. 
aec0: 20 20 20 7d 0a 20 20 20 20 63 68 65 63 6b 6f 75     }.    checkou
aed0: 74 5f 63 6d 64 28 29 3b 0a 20 20 20 20 67 2e 61  t_cmd();.    g.a
aee0: 72 67 63 20 3d 20 32 3b 0a 20 20 20 20 69 6e 66  rgc = 2;.    inf
aef0: 6f 5f 63 6d 64 28 29 3b 0a 20 20 7d 0a 7d 0a 0a  o_cmd();.  }.}..
af00: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
af10: 76 61 6c 75 65 20 6f 66 20 61 20 73 65 74 74 69  value of a setti
af20: 6e 67 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 0a 2a  ng named zName.*
af30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
af40: 69 6e 74 5f 73 65 74 74 69 6e 67 28 63 6f 6e 73  int_setting(cons
af50: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
af60: 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 66 28 20    Stmt q;.  if( 
af70: 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e  g.repositoryOpen
af80: 20 29 7b 0a 20 20 20 20 64 62 5f 70 72 65 70 61   ){.    db_prepa
af90: 72 65 28 26 71 2c 0a 20 20 20 20 20 20 20 22 53  re(&q,.       "S
afa0: 45 4c 45 43 54 20 27 28 6c 6f 63 61 6c 29 27 2c  ELECT '(local)',
afb0: 20 76 61 6c 75 65 20 46 52 4f 4d 20 63 6f 6e 66   value FROM conf
afc0: 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ig WHERE name=%Q
afd0: 22 0a 20 20 20 20 20 20 20 22 20 55 4e 49 4f 4e  ".       " UNION
afe0: 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 20 22 53   ALL ".       "S
aff0: 45 4c 45 43 54 20 27 28 67 6c 6f 62 61 6c 29 27  ELECT '(global)'
b000: 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20 67 6c 6f  , value FROM glo
b010: 62 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45 52 45  bal_config WHERE
b020: 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
b030: 20 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20    zName, zName. 
b040: 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
b050: 20 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71     db_prepare(&q
b060: 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  ,.      "SELECT 
b070: 27 28 67 6c 6f 62 61 6c 29 27 2c 20 76 61 6c 75  '(global)', valu
b080: 65 20 46 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f  e FROM global_co
b090: 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d  nfig WHERE name=
b0a0: 25 51 22 2c 0a 20 20 20 20 20 20 7a 4e 61 6d 65  %Q",.      zName
b0b0: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66  .    );.  }.  if
b0c0: 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53  ( db_step(&q)==S
b0d0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
b0e0: 20 70 72 69 6e 74 66 28 22 25 2d 32 30 73 20 25   printf("%-20s %
b0f0: 2d 38 73 20 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65  -8s %s\n", zName
b100: 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  , db_column_text
b110: 28 26 71 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  (&q, 0),.       
b120: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
b130: 26 71 2c 20 31 29 29 3b 0a 20 20 7d 65 6c 73 65  &q, 1));.  }else
b140: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 2d  {.    printf("%-
b150: 32 30 73 5c 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a  20s\n", zName);.
b160: 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a    }.  db_finaliz
b170: 65 28 26 71 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  e(&q);.}.../*.**
b180: 20 64 65 66 69 6e 65 20 61 6c 6c 20 73 65 74 74   define all sett
b190: 69 6e 67 73 2c 20 77 68 69 63 68 20 63 61 6e 20  ings, which can 
b1a0: 62 65 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 76 69  be controlled vi
b1b0: 61 20 74 68 65 20 73 65 74 2f 75 6e 73 65 74 0a  a the set/unset.
b1c0: 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 76 61 72 20  ** command. var 
b1d0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
b1e0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 66  he internal conf
b1f0: 69 67 75 72 61 74 69 6f 6e 20 6e 61 6d 65 20 66  iguration name f
b200: 6f 72 20 64 62 5f 28 75 6e 29 73 65 74 2e 0a 2a  or db_(un)set..*
b210: 2a 20 49 66 20 76 61 72 20 69 73 20 30 2c 20 74  * If var is 0, t
b220: 68 65 20 73 65 74 74 69 6e 67 73 20 6e 61 6d 65  he settings name
b230: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 20 77 69 64   is used..** wid
b240: 74 68 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68  th is the length
b250: 20 66 6f 72 20 74 68 65 20 65 64 69 74 20 66 69   for the edit fi
b260: 65 6c 64 20 6f 6e 20 74 68 65 20 62 65 68 61 76  eld on the behav
b270: 69 6f 72 20 70 61 67 65 2c 20 30 0a 2a 2a 20 69  ior page, 0.** i
b280: 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 2f 6f 66  s used for on/of
b290: 66 20 63 68 65 63 6b 62 6f 78 65 73 2e 0a 2a 2a  f checkboxes..**
b2a0: 20 54 68 65 20 62 65 68 61 76 69 6f 75 72 20 70   The behaviour p
b2b0: 61 67 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20  age doesn't use 
b2c0: 61 20 73 70 65 63 69 61 6c 20 6c 61 79 6f 75 74  a special layout
b2d0: 2e 20 49 74 20 6c 69 73 74 73 20 61 6c 6c 0a 2a  . It lists all.*
b2e0: 2a 20 73 65 74 2d 63 6f 6d 6d 61 6e 64 73 20 61  * set-commands a
b2f0: 6e 64 20 64 69 73 70 6c 61 79 73 20 74 68 65 20  nd displays the 
b300: 27 73 65 74 27 2d 68 65 6c 70 20 61 73 20 69 6e  'set'-help as in
b310: 66 6f 2e 0a 2a 2f 0a 23 69 66 20 49 4e 54 45 52  fo..*/.#if INTER
b320: 46 41 43 45 0a 73 74 72 75 63 74 20 73 74 43 6f  FACE.struct stCo
b330: 6e 74 72 6f 6c 53 65 74 74 69 6e 67 73 20 7b 0a  ntrolSettings {.
b340: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 6e 61    char const *na
b350: 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
b360: 6f 66 20 74 68 65 20 73 65 74 74 69 6e 67 20 2a  of the setting *
b370: 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
b380: 76 61 72 3b 20 20 20 20 20 20 2f 2a 20 49 6e 74  var;      /* Int
b390: 65 72 6e 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  ernal variable n
b3a0: 61 6d 65 20 75 73 65 64 20 62 79 20 64 62 5f 73  ame used by db_s
b3b0: 65 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20 77 69  et() */.  int wi
b3c0: 64 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  dth;            
b3d0: 2f 2a 20 57 69 64 74 68 20 6f 66 20 64 69 73 70  /* Width of disp
b3e0: 6c 61 79 2e 20 20 30 20 66 6f 72 20 62 6f 6f 6c  lay.  0 for bool
b3f0: 65 61 6e 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ean values */.  
b400: 63 68 61 72 20 63 6f 6e 73 74 20 2a 64 65 66 3b  char const *def;
b410: 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
b420: 20 76 61 6c 75 65 20 2a 2f 0a 7d 3b 0a 23 65 6e   value */.};.#en
b430: 64 69 66 20 2f 2a 20 49 4e 54 45 52 46 41 43 45  dif /* INTERFACE
b440: 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 43 6f 6e   */.struct stCon
b450: 74 72 6f 6c 53 65 74 74 69 6e 67 73 20 63 6f 6e  trolSettings con
b460: 73 74 20 63 74 72 6c 53 65 74 74 69 6e 67 73 5b  st ctrlSettings[
b470: 5d 20 3d 20 7b 0a 20 20 7b 20 22 61 63 63 65 73  ] = {.  { "acces
b480: 73 2d 6c 6f 67 22 2c 20 20 20 20 30 2c 20 20 20  s-log",    0,   
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
b4a0: 22 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20  "off"           
b4b0: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 61 75        },.  { "au
b4c0: 74 6f 2d 63 61 70 74 63 68 61 22 2c 20 20 22 61  to-captcha",  "a
b4d0: 75 74 6f 63 61 70 74 63 68 61 22 2c 20 20 20 20  utocaptcha",    
b4e0: 30 2c 20 22 6f 6e 22 20 20 20 20 20 20 20 20 20  0, "on"         
b4f0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
b500: 22 61 75 74 6f 2d 73 68 75 6e 22 2c 20 20 20 20  "auto-shun",    
b510: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
b520: 20 20 20 30 2c 20 22 6f 6e 22 20 20 20 20 20 20     0, "on"      
b530: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
b540: 20 7b 20 22 61 75 74 6f 73 79 6e 63 22 2c 20 20   { "autosync",  
b550: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
b560: 20 20 20 20 20 20 30 2c 20 22 6f 6e 22 20 20 20        0, "on"   
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
b580: 2c 0a 20 20 7b 20 22 62 69 6e 61 72 79 2d 67 6c  ,.  { "binary-gl
b590: 6f 62 22 2c 20 20 20 30 2c 20 20 20 20 20 20 20  ob",   0,       
b5a0: 20 20 20 20 20 20 20 20 33 32 2c 20 22 22 20 20          32, ""  
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5c0: 20 20 7d 2c 0a 20 20 7b 20 22 63 6c 65 61 72 73    },.  { "clears
b5d0: 69 67 6e 22 2c 20 20 20 20 20 30 2c 20 20 20 20  ign",     0,    
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 22              0, "
b5f0: 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20  off"            
b600: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 64 65 66       },.  { "def
b610: 61 75 6c 74 2d 70 65 72 6d 73 22 2c 20 30 2c 20  ault-perms", 0, 
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 36                16
b630: 2c 20 22 75 22 20 20 20 20 20 20 20 20 20 20 20  , "u"           
b640: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
b650: 64 69 66 66 2d 63 6f 6d 6d 61 6e 64 22 2c 20 20  diff-command",  
b660: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
b670: 20 31 36 2c 20 22 22 20 20 20 20 20 20 20 20 20   16, ""         
b680: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
b690: 7b 20 22 64 6f 6e 74 2d 70 75 73 68 22 2c 20 20  { "dont-push",  
b6a0: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
b6b0: 20 20 20 20 20 30 2c 20 22 6f 66 66 22 20 20 20       0, "off"   
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
b6d0: 0a 20 20 7b 20 22 65 64 69 74 6f 72 22 2c 20 20  .  { "editor",  
b6e0: 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
b6f0: 20 20 20 20 20 20 20 31 36 2c 20 22 22 20 20 20         16, ""   
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b710: 20 7d 2c 0a 20 20 7b 20 22 67 64 69 66 66 2d 63   },.  { "gdiff-c
b720: 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 20 20 20 20  ommand", 0,     
b730: 20 20 20 20 20 20 20 20 20 20 31 36 2c 20 22 67            16, "g
b740: 64 69 66 66 22 20 20 20 20 20 20 20 20 20 20 20  diff"           
b750: 20 20 20 20 7d 2c 0a 20 20 7b 20 22 69 67 6e 6f      },.  { "igno
b760: 72 65 2d 67 6c 6f 62 22 2c 20 20 20 30 2c 20 20  re-glob",   0,  
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 34 30 2c               40,
b780: 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20 20   ""             
b790: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 68         },.  { "h
b7a0: 74 74 70 2d 70 6f 72 74 22 2c 20 20 20 20 20 30  ttp-port",     0
b7b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b7c0: 31 36 2c 20 22 38 30 38 30 22 20 20 20 20 20 20  16, "8080"      
b7d0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
b7e0: 20 22 6c 6f 63 61 6c 61 75 74 68 22 2c 20 20 20   "localauth",   
b7f0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
b800: 20 20 20 20 30 2c 20 22 6f 66 66 22 20 20 20 20      0, "off"    
b810: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
b820: 20 20 7b 20 22 6d 61 6e 69 66 65 73 74 22 2c 20    { "manifest", 
b830: 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20       0,         
b840: 20 20 20 20 20 20 20 30 2c 20 22 6f 66 66 22 20         0, "off" 
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b860: 7d 2c 0a 20 20 7b 20 22 6d 74 69 6d 65 2d 63 68  },.  { "mtime-ch
b870: 61 6e 67 65 73 22 2c 20 30 2c 20 20 20 20 20 20  anges", 0,      
b880: 20 20 20 20 20 20 20 20 20 20 30 2c 20 22 6f 6e            0, "on
b890: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
b8a0: 20 20 20 7d 2c 0a 20 20 7b 20 22 70 67 70 2d 63     },.  { "pgp-c
b8b0: 6f 6d 6d 61 6e 64 22 2c 20 20 20 30 2c 20 20 20  ommand",   0,   
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 33 32 2c 20              32, 
b8d0: 22 67 70 67 20 2d 2d 63 6c 65 61 72 73 69 67 6e  "gpg --clearsign
b8e0: 20 2d 6f 20 22 20 7d 2c 0a 20 20 7b 20 22 70 72   -o " },.  { "pr
b8f0: 6f 78 79 22 2c 20 20 20 20 20 20 20 20 20 30 2c  oxy",         0,
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33                 3
b910: 32 2c 20 22 6f 66 66 22 20 20 20 20 20 20 20 20  2, "off"        
b920: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
b930: 22 72 65 70 6f 2d 63 6b 73 75 6d 22 2c 20 20 20  "repo-cksum",   
b940: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
b950: 20 20 20 30 2c 20 22 6f 6e 22 20 20 20 20 20 20     0, "on"      
b960: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
b970: 20 7b 20 22 73 65 6c 66 2d 72 65 67 69 73 74 65   { "self-registe
b980: 72 22 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20  r", 0,          
b990: 20 20 20 20 20 20 30 2c 20 22 6f 66 66 22 20 20        0, "off"  
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
b9b0: 2c 0a 20 20 7b 20 22 73 73 68 2d 63 6f 6d 6d 61  ,.  { "ssh-comma
b9c0: 6e 64 22 2c 20 20 20 30 2c 20 20 20 20 20 20 20  nd",   0,       
b9d0: 20 20 20 20 20 20 20 20 33 32 2c 20 22 22 20 20          32, ""  
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 7d 2c 0a 20 20 7b 20 22 77 65 62 2d 62 72    },.  { "web-br
ba00: 6f 77 73 65 72 22 2c 20 20 20 30 2c 20 20 20 20  owser",   0,    
ba10: 20 20 20 20 20 20 20 20 20 20 20 33 32 2c 20 22             32, "
ba20: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
ba30: 20 20 20 20 20 7d 2c 0a 20 20 7b 20 30 2c 30 2c       },.  { 0,0,
ba40: 30 2c 30 20 7d 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0,0 }.};../*.** 
ba50: 43 4f 4d 4d 41 4e 44 3a 20 73 65 74 74 69 6e 67  COMMAND: setting
ba60: 73 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 75 6e  s.** COMMAND: un
ba70: 73 65 74 0a 2a 2a 0a 2a 2a 20 25 66 6f 73 73 69  set.**.** %fossi
ba80: 6c 20 73 65 74 74 69 6e 67 73 20 3f 50 52 4f 50  l settings ?PROP
ba90: 45 52 54 59 3f 20 3f 56 41 4c 55 45 3f 20 3f 2d  ERTY? ?VALUE? ?-
baa0: 67 6c 6f 62 61 6c 3f 0a 2a 2a 20 25 66 6f 73 73  global?.** %foss
bab0: 69 6c 20 75 6e 73 65 74 20 50 52 4f 50 45 52 54  il unset PROPERT
bac0: 59 20 3f 2d 67 6c 6f 62 61 6c 3f 0a 2a 2a 0a 2a  Y ?-global?.**.*
bad0: 2a 20 54 68 65 20 22 73 65 74 74 69 6e 67 73 22  * The "settings"
bae0: 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 20 6e 6f   command with no
baf0: 20 61 72 67 75 6d 65 6e 74 73 20 6c 69 73 74 73   arguments lists
bb00: 20 61 6c 6c 20 70 72 6f 70 65 72 74 69 65 73 20   all properties 
bb10: 61 6e 64 20 74 68 65 69 72 0a 2a 2a 20 76 61 6c  and their.** val
bb20: 75 65 73 2e 20 20 57 69 74 68 20 6a 75 73 74 20  ues.  With just 
bb30: 61 20 70 72 6f 70 65 72 74 79 20 6e 61 6d 65 20  a property name 
bb40: 69 74 20 73 68 6f 77 73 20 74 68 65 20 76 61 6c  it shows the val
bb50: 75 65 20 6f 66 20 74 68 61 74 20 70 72 6f 70 65  ue of that prope
bb60: 72 74 79 2e 0a 2a 2a 20 57 69 74 68 20 61 20 76  rty..** With a v
bb70: 61 6c 75 65 20 61 72 67 75 6d 65 6e 74 20 69 74  alue argument it
bb80: 20 63 68 61 6e 67 65 73 20 74 68 65 20 70 72 6f   changes the pro
bb90: 70 65 72 74 79 20 66 6f 72 20 74 68 65 20 63 75  perty for the cu
bba0: 72 72 65 6e 74 20 72 65 70 6f 73 69 74 6f 72 79  rrent repository
bbb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 75 6e 73  ..**.** The "uns
bbc0: 65 74 22 20 63 6f 6d 6d 61 6e 64 20 63 6c 65 61  et" command clea
bbd0: 72 73 20 61 20 70 72 6f 70 65 72 74 79 20 73 65  rs a property se
bbe0: 74 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  tting..**.**.** 
bbf0: 20 20 20 61 75 74 6f 2d 63 61 70 74 63 68 61 20     auto-captcha 
bc00: 20 20 20 20 49 66 20 65 6e 61 62 6c 65 64 2c 20      If enabled, 
bc10: 74 68 65 20 4c 6f 67 69 6e 20 70 61 67 65 20 70  the Login page p
bc20: 72 6f 76 69 64 65 73 20 61 20 62 75 74 74 6f 6e  rovides a button
bc30: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
bc40: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20             fill 
bc50: 69 6e 20 74 68 65 20 63 61 70 74 63 68 61 20 70  in the captcha p
bc60: 61 73 73 77 6f 72 64 2e 20 20 44 65 66 61 75 6c  assword.  Defaul
bc70: 74 3a 20 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 61  t: on.**.**    a
bc80: 75 74 6f 2d 73 68 75 6e 20 20 20 20 20 20 20 20  uto-shun        
bc90: 49 66 20 65 6e 61 62 6c 65 64 2c 20 61 75 74 6f  If enabled, auto
bca0: 6d 61 74 69 63 61 6c 6c 79 20 70 75 6c 6c 20 74  matically pull t
bcb0: 68 65 20 73 68 75 6e 6e 69 6e 67 20 6c 69 73 74  he shunning list
bcc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
bcd0: 20 20 20 20 20 20 20 20 66 72 6f 6d 20 61 20 73          from a s
bce0: 65 72 76 65 72 20 74 6f 20 77 68 69 63 68 20 74  erver to which t
bcf0: 68 65 20 63 6c 69 65 6e 74 20 61 75 74 6f 73 79  he client autosy
bd00: 6e 63 73 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ncs..**         
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 44 65 66 61              Defa
bd20: 75 6c 74 3a 20 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  ult: on.**.**   
bd30: 20 61 75 74 6f 73 79 6e 63 20 20 20 20 20 20 20   autosync       
bd40: 20 20 49 66 20 65 6e 61 62 6c 65 64 2c 20 61 75    If enabled, au
bd50: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 70 75 6c 6c  tomatically pull
bd60: 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 6d 69 74   prior to commit
bd70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
bd80: 20 20 20 20 20 20 20 20 6f 72 20 75 70 64 61 74          or updat
bd90: 65 20 61 6e 64 20 61 75 74 6f 6d 61 74 69 63 61  e and automatica
bda0: 6c 6c 79 20 70 75 73 68 20 61 66 74 65 72 20 63  lly push after c
bdb0: 6f 6d 6d 69 74 20 6f 72 0a 2a 2a 20 20 20 20 20  ommit or.**     
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 74 61 67 20 6f 72 20 62 72 61 6e 63 68 20 63 72  tag or branch cr
bde0: 65 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  eation.  If the 
bdf0: 76 61 6c 75 65 20 69 73 20 22 70 75 6c 6c 6f 6e  value is "pullon
be00: 6c 79 22 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly".**          
be10: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 6e 20             then 
be20: 6f 6e 6c 79 20 70 75 6c 6c 20 6f 70 65 72 61 74  only pull operat
be30: 69 6f 6e 73 20 6f 63 63 75 72 20 61 75 74 6f 6d  ions occur autom
be40: 61 74 69 63 61 6c 6c 79 2e 0a 2a 2a 20 20 20 20  atically..**    
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be60: 20 44 65 66 61 75 6c 74 3a 20 6f 6e 0a 2a 2a 0a   Default: on.**.
be70: 2a 2a 20 20 20 20 62 69 6e 61 72 79 2d 67 6c 6f  **    binary-glo
be80: 62 20 20 20 20 20 20 54 68 65 20 56 41 4c 55 45  b      The VALUE
be90: 20 69 73 20 61 20 63 6f 6d 6d 61 2d 73 65 70 61   is a comma-sepa
bea0: 72 61 74 65 64 20 6c 69 73 74 20 6f 66 20 47 4c  rated list of GL
beb0: 4f 42 20 70 61 74 74 65 72 6e 73 0a 2a 2a 20 20  OB patterns.**  
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bed0: 20 20 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62     that should b
bee0: 65 20 74 72 65 61 74 65 64 20 61 73 20 62 69 6e  e treated as bin
bef0: 61 72 79 20 66 69 6c 65 73 20 66 6f 72 20 6d 65  ary files for me
bf00: 72 67 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  rging.**        
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 75 72               pur
bf20: 70 6f 73 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a  poses.  Example:
bf30: 20 20 20 2a 2e 78 6d 6c 0a 2a 2a 0a 2a 2a 20 20     *.xml.**.**  
bf40: 20 20 63 6c 65 61 72 73 69 67 6e 20 20 20 20 20    clearsign     
bf50: 20 20 20 57 68 65 6e 20 65 6e 61 62 6c 65 64 2c     When enabled,
bf60: 20 66 6f 73 73 69 6c 20 77 69 6c 6c 20 61 74 74   fossil will att
bf70: 65 6d 70 74 20 74 6f 20 73 69 67 6e 20 61 6c 6c  empt to sign all
bf80: 20 63 6f 6d 6d 69 74 73 0a 2a 2a 20 20 20 20 20   commits.**     
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 77 69 74 68 20 67 70 67 2e 20 20 57 68 65 6e 20  with gpg.  When 
bfb0: 64 69 73 61 62 6c 65 64 20 28 74 68 65 20 64 65  disabled (the de
bfc0: 66 61 75 6c 74 29 2c 20 63 6f 6d 6d 69 74 73 20  fault), commits 
bfd0: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  will.**         
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 20 75              be u
bff0: 6e 73 69 67 6e 65 64 2e 20 20 44 65 66 61 75 6c  nsigned.  Defaul
c000: 74 3a 20 6f 66 66 0a 2a 2a 0a 2a 2a 20 20 20 20  t: off.**.**    
c010: 64 65 66 61 75 6c 74 2d 70 65 72 6d 73 20 20 20  default-perms   
c020: 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 67 69 76   Permissions giv
c030: 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  en automatically
c040: 20 74 6f 20 6e 65 77 20 75 73 65 72 73 2e 20 20   to new users.  
c050: 46 6f 72 20 6d 6f 72 65 0a 2a 2a 20 20 20 20 20  For more.**     
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c070: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
c080: 65 72 6d 69 73 73 69 6f 6e 73 20 73 65 65 20 55  ermissions see U
c090: 73 65 72 73 20 70 61 67 65 20 69 6e 20 53 65 72  sers page in Ser
c0a0: 76 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ver.**          
c0b0: 20 20 20 20 20 20 20 20 20 20 20 41 64 6d 69 6e             Admin
c0c0: 69 73 74 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  istration of the
c0d0: 20 48 54 54 50 20 55 49 2e 20 44 65 66 61 75 6c   HTTP UI. Defaul
c0e0: 74 3a 20 75 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 64  t: u..**.**    d
c0f0: 69 66 66 2d 63 6f 6d 6d 61 6e 64 20 20 20 20 20  iff-command     
c100: 45 78 74 65 72 6e 61 6c 20 63 6f 6d 6d 61 6e 64  External command
c110: 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 70 65 72   to run when per
c120: 66 6f 72 6d 69 6e 67 20 61 20 64 69 66 66 2e 0a  forming a diff..
c130: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c140: 20 20 20 20 20 20 20 49 66 20 75 6e 64 65 66 69         If undefi
c150: 6e 65 64 2c 20 74 68 65 20 69 6e 74 65 72 6e 61  ned, the interna
c160: 6c 20 74 65 78 74 20 64 69 66 66 20 77 69 6c 6c  l text diff will
c170: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
c180: 20 20 20 64 6f 6e 74 2d 70 75 73 68 20 20 20 20     dont-push    
c190: 20 20 20 20 50 72 65 76 65 6e 74 20 74 68 69 73      Prevent this
c1a0: 20 72 65 70 6f 73 69 74 6f 72 79 20 66 72 6f 6d   repository from
c1b0: 20 70 75 73 68 69 6e 67 20 66 72 6f 6d 20 63 6c   pushing from cl
c1c0: 69 65 6e 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20  ient to.**      
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
c1e0: 65 72 76 65 72 2e 20 20 55 73 65 66 75 6c 20 77  erver.  Useful w
c1f0: 68 65 6e 20 73 65 74 74 69 6e 67 20 75 70 20 61  hen setting up a
c200: 20 70 72 69 76 61 74 65 20 62 72 61 6e 63 68 2e   private branch.
c210: 0a 2a 2a 0a 2a 2a 20 20 20 20 65 64 69 74 6f 72  .**.**    editor
c220: 20 20 20 20 20 20 20 20 20 20 20 54 65 78 74 20             Text 
c230: 65 64 69 74 6f 72 20 63 6f 6d 6d 61 6e 64 20 75  editor command u
c240: 73 65 64 20 66 6f 72 20 63 68 65 63 6b 2d 69 6e  sed for check-in
c250: 20 63 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   comments..**.**
c260: 20 20 20 20 67 64 69 66 66 2d 63 6f 6d 6d 61 6e      gdiff-comman
c270: 64 20 20 20 20 45 78 74 65 72 6e 61 6c 20 63 6f  d    External co
c280: 6d 6d 61 6e 64 20 74 6f 20 72 75 6e 20 77 68 65  mmand to run whe
c290: 6e 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 67  n performing a g
c2a0: 72 61 70 68 69 63 61 6c 0a 2a 2a 20 20 20 20 20  raphical.**     
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 64 69 66 66 2e 20 49 66 20 75 6e 64 65 66 69 6e  diff. If undefin
c2d0: 65 64 2c 20 74 65 78 74 20 64 69 66 66 20 77 69  ed, text diff wi
c2e0: 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a  ll be used..**.*
c2f0: 2a 20 20 20 20 68 74 74 70 2d 70 6f 72 74 20 20  *    http-port  
c300: 20 20 20 20 20 20 54 68 65 20 54 43 50 2f 49 50        The TCP/IP
c310: 20 70 6f 72 74 20 6e 75 6d 62 65 72 20 74 6f 20   port number to 
c320: 75 73 65 20 62 79 20 74 68 65 20 22 73 65 72 76  use by the "serv
c330: 65 72 22 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  er".**          
c340: 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 22             and "
c350: 75 69 22 20 63 6f 6d 6d 61 6e 64 73 2e 20 20 44  ui" commands.  D
c360: 65 66 61 75 6c 74 3a 20 38 30 38 30 0a 2a 2a 0a  efault: 8080.**.
c370: 2a 2a 20 20 20 20 69 67 6e 6f 72 65 2d 67 6c 6f  **    ignore-glo
c380: 62 20 20 20 20 20 20 54 68 65 20 56 41 4c 55 45  b      The VALUE
c390: 20 69 73 20 61 20 63 6f 6d 6d 61 2d 73 65 70 61   is a comma-sepa
c3a0: 72 61 74 65 64 20 6c 69 73 74 20 6f 66 20 47 4c  rated list of GL
c3b0: 4f 42 20 70 61 74 74 65 72 6e 73 0a 2a 2a 20 20  OB patterns.**  
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 20 20 20 73 70 65 63 69 66 79 69 6e 67 20 66 69     specifying fi
c3e0: 6c 65 73 20 74 68 61 74 20 74 68 65 20 22 65 78  les that the "ex
c3f0: 74 72 61 22 20 63 6f 6d 6d 61 6e 64 20 77 69 6c  tra" command wil
c400: 6c 20 69 67 6e 6f 72 65 2e 0a 2a 2a 20 20 20 20  l ignore..**    
c410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c420: 20 45 78 61 6d 70 6c 65 3a 20 20 2a 2e 6f 2c 2a   Example:  *.o,*
c430: 2e 6f 62 6a 2c 2a 2e 65 78 65 0a 2a 2a 0a 2a 2a  .obj,*.exe.**.**
c440: 20 20 20 20 6c 6f 63 61 6c 61 75 74 68 20 20 20      localauth   
c450: 20 20 20 20 20 49 66 20 65 6e 61 62 6c 65 64 2c       If enabled,
c460: 20 72 65 71 75 69 72 65 20 74 68 61 74 20 48 54   require that HT
c470: 54 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66  TP connections f
c480: 72 6f 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rom.**          
c490: 20 20 20 20 20 20 20 20 20 20 20 31 32 37 2e 30             127.0
c4a0: 2e 30 2e 31 20 62 65 20 61 75 74 68 65 6e 74 69  .0.1 be authenti
c4b0: 63 61 74 65 64 20 62 79 20 70 61 73 73 77 6f 72  cated by passwor
c4c0: 64 2e 20 20 49 66 0a 2a 2a 20 20 20 20 20 20 20  d.  If.**       
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61                fa
c4e0: 6c 73 65 2c 20 61 6c 6c 20 48 54 54 50 20 72 65  lse, all HTTP re
c4f0: 71 75 65 73 74 73 20 66 72 6f 6d 20 6c 6f 63 61  quests from loca
c500: 6c 68 6f 73 74 20 68 61 76 65 0a 2a 2a 20 20 20  lhost have.**   
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c520: 20 20 75 6e 72 65 73 74 72 69 63 74 65 64 20 61    unrestricted a
c530: 63 63 65 73 73 20 74 6f 20 74 68 65 20 72 65 70  ccess to the rep
c540: 6f 73 69 74 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  ository..**.**  
c550: 20 20 6d 61 6e 69 66 65 73 74 20 20 20 20 20 20    manifest      
c560: 20 20 20 49 66 20 65 6e 61 62 6c 65 64 2c 20 61     If enabled, a
c570: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
c580: 61 74 65 20 66 69 6c 65 73 20 22 6d 61 6e 69 66  ate files "manif
c590: 65 73 74 22 20 61 6e 64 0a 2a 2a 20 20 20 20 20  est" and.**     
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5b0: 22 6d 61 6e 69 66 65 73 74 2e 75 75 69 64 22 20  "manifest.uuid" 
c5c0: 69 6e 20 65 76 65 72 79 20 63 68 65 63 6b 6f 75  in every checkou
c5d0: 74 2e 20 20 54 68 65 20 53 51 4c 69 74 65 20 61  t.  The SQLite a
c5e0: 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
c5f0: 20 20 20 20 20 20 20 20 20 20 46 6f 73 73 69 6c            Fossil
c600: 20 72 65 70 6f 73 69 74 6f 72 69 65 73 20 62 6f   repositories bo
c610: 74 68 20 72 65 71 75 69 72 65 20 74 68 69 73 2e  th require this.
c620: 20 20 44 65 66 61 75 6c 74 3a 20 6f 66 66 2e 0a    Default: off..
c630: 2a 2a 0a 2a 2a 20 20 20 20 6d 74 69 6d 65 2d 63  **.**    mtime-c
c640: 68 61 6e 67 65 73 20 20 20 20 55 73 65 20 66 69  hanges    Use fi
c650: 6c 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  le modification 
c660: 74 69 6d 65 73 20 28 6d 74 69 6d 65 73 29 20 74  times (mtimes) t
c670: 6f 20 64 65 74 65 63 74 20 77 68 65 6e 0a 2a 2a  o detect when.**
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c690: 20 20 20 20 20 66 69 6c 65 73 20 68 61 76 65 20       files have 
c6a0: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
c6b0: 28 44 65 66 61 75 6c 74 20 22 6f 6e 22 2e 29 0a  (Default "on".).
c6c0: 2a 2a 0a 2a 2a 20 20 20 20 70 67 70 2d 63 6f 6d  **.**    pgp-com
c6d0: 6d 61 6e 64 20 20 20 20 20 20 43 6f 6d 6d 61 6e  mand      Comman
c6e0: 64 20 75 73 65 64 20 74 6f 20 63 6c 65 61 72 2d  d used to clear-
c6f0: 73 69 67 6e 20 6d 61 6e 69 66 65 73 74 73 20 61  sign manifests a
c700: 74 20 63 68 65 63 6b 2d 69 6e 2e 0a 2a 2a 20 20  t check-in..**  
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 20 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69     The default i
c730: 73 20 22 67 70 67 20 2d 2d 63 6c 65 61 72 73 69  s "gpg --clearsi
c740: 67 6e 20 2d 6f 20 22 2e 0a 2a 2a 0a 2a 2a 20 20  gn -o "..**.**  
c750: 20 20 70 72 6f 78 79 20 20 20 20 20 20 20 20 20    proxy         
c760: 20 20 20 55 52 4c 20 6f 66 20 74 68 65 20 48 54     URL of the HT
c770: 54 50 20 70 72 6f 78 79 2e 20 20 49 66 20 75 6e  TP proxy.  If un
c780: 64 65 66 69 6e 65 64 20 6f 72 20 22 6f 66 66 22  defined or "off"
c790: 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20   then.**        
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
c7b0: 20 22 68 74 74 70 5f 70 72 6f 78 79 22 20 65 6e   "http_proxy" en
c7c0: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
c7d0: 6c 65 20 69 73 20 63 6f 6e 73 75 6c 74 65 64 2e  le is consulted.
c7e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c7f0: 20 20 20 20 20 20 20 20 49 66 20 74 68 65 20 68          If the h
c800: 74 74 70 5f 70 72 6f 78 79 20 65 6e 76 69 72 6f  ttp_proxy enviro
c810: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 69  nment variable i
c820: 73 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 20  s undefined.**  
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 20 20 74 68 65 6e 20 61 20 64 69 72 65 63 74     then a direct
c850: 20 48 54 54 50 20 63 6f 6e 6e 65 63 74 69 6f 6e   HTTP connection
c860: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   is used..**.** 
c870: 20 20 20 72 65 70 6f 2d 63 6b 73 75 6d 20 20 20     repo-cksum   
c880: 20 20 20 20 43 6f 6d 70 75 74 65 20 63 68 65 63      Compute chec
c890: 6b 73 75 6d 73 20 6f 76 65 72 20 61 6c 6c 20 66  ksums over all f
c8a0: 69 6c 65 73 20 69 6e 20 65 61 63 68 20 63 68 65  iles in each che
c8b0: 63 6b 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  ckout.**        
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 20               as 
c8d0: 61 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 20 6f  a double-check o
c8e0: 66 20 63 6f 72 72 65 63 74 6e 65 73 73 2e 20 20  f correctness.  
c8f0: 44 65 66 61 75 6c 74 73 20 74 6f 20 22 6f 6e 22  Defaults to "on"
c900: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
c910: 20 20 20 20 20 20 20 20 20 44 69 73 61 62 6c 65           Disable
c920: 20 6f 6e 20 6c 61 72 67 65 20 72 65 70 6f 73 69   on large reposi
c930: 74 6f 72 69 65 73 20 66 6f 72 20 61 20 70 65 72  tories for a per
c940: 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 20 20 20 20  formance.**     
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c960: 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 0a 2a 2a 0a  improvement..**.
c970: 2a 2a 20 20 20 20 73 65 6c 66 2d 72 65 67 69 73  **    self-regis
c980: 74 65 72 20 20 20 20 41 6c 6c 6f 77 20 75 73 65  ter    Allow use
c990: 72 73 20 74 6f 20 72 65 67 69 73 74 65 72 20 74  rs to register t
c9a0: 68 65 6d 73 65 6c 76 65 73 20 74 68 72 6f 75 67  hemselves throug
c9b0: 68 20 74 68 65 20 48 54 54 50 20 55 49 2e 0a 2a  h the HTTP UI..*
c9c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
c9d0: 20 20 20 20 20 20 54 68 69 73 20 69 73 20 75 73        This is us
c9e0: 65 66 75 6c 20 69 66 20 79 6f 75 20 77 61 6e 74  eful if you want
c9f0: 20 74 6f 20 73 65 65 20 6f 74 68 65 72 20 6e 61   to see other na
ca00: 6d 65 73 20 74 68 61 6e 0a 2a 2a 20 20 20 20 20  mes than.**     
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 22 41 6e 6f 6e 79 6d 6f 75 73 22 20 69 6e 20 65  "Anonymous" in e
ca30: 2e 67 2e 20 74 69 63 6b 65 74 69 6e 67 20 73 79  .g. ticketing sy
ca40: 73 74 65 6d 2e 20 4f 6e 20 74 68 65 20 6f 74 68  stem. On the oth
ca50: 65 72 20 68 61 6e 64 0a 2a 2a 20 20 20 20 20 20  er hand.**      
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
ca70: 73 65 72 73 20 63 61 6e 20 6e 6f 74 20 62 65 20  sers can not be 
ca80: 64 65 6c 65 74 65 64 2e 20 44 65 66 61 75 6c 74  deleted. Default
ca90: 3a 20 6f 66 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  : off..**.**    
caa0: 73 73 68 2d 63 6f 6d 6d 61 6e 64 20 20 20 20 20  ssh-command     
cab0: 20 43 6f 6d 6d 61 6e 64 20 75 73 65 64 20 74 6f   Command used to
cac0: 20 74 61 6c 6b 20 74 6f 20 61 20 72 65 6d 6f 74   talk to a remot
cad0: 65 20 6d 61 63 68 69 6e 65 20 77 69 74 68 0a 2a  e machine with.*
cae0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
caf0: 20 20 20 20 20 20 74 68 65 20 22 73 73 68 3a 2f        the "ssh:/
cb00: 2f 22 20 70 72 6f 74 6f 63 6f 6c 2e 0a 2a 2a 0a  /" protocol..**.
cb10: 2a 2a 20 20 20 20 77 65 62 2d 62 72 6f 77 73 65  **    web-browse
cb20: 72 20 20 20 20 20 20 41 20 73 68 65 6c 6c 20 63  r      A shell c
cb30: 6f 6d 6d 61 6e 64 20 75 73 65 64 20 74 6f 20 6c  ommand used to l
cb40: 61 75 6e 63 68 20 79 6f 75 72 20 70 72 65 66 65  aunch your prefe
cb50: 72 72 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  rred.**         
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 77 65 62 20              web 
cb70: 62 72 6f 77 73 65 72 20 77 68 65 6e 20 67 69 76  browser when giv
cb80: 65 6e 20 61 20 55 52 4c 20 61 73 20 61 6e 20 61  en a URL as an a
cb90: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 20 20 20 20  rgument..**     
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 44 65 66 61 75 6c 74 73 20 74 6f 20 22 73 74 61  Defaults to "sta
cbc0: 72 74 22 20 6f 6e 20 77 69 6e 64 6f 77 73 2c 20  rt" on windows, 
cbd0: 22 6f 70 65 6e 22 20 6f 6e 20 4d 61 63 2c 0a 2a  "open" on Mac,.*
cbe0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
cbf0: 20 20 20 20 20 20 61 6e 64 20 22 66 69 72 65 66        and "firef
cc00: 6f 78 22 20 6f 6e 20 55 6e 69 78 2e 0a 2a 2f 0a  ox" on Unix..*/.
cc10: 76 6f 69 64 20 73 65 74 74 69 6e 67 5f 63 6d 64  void setting_cmd
cc20: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b  (void){.  int i;
cc30: 0a 20 20 69 6e 74 20 67 6c 6f 62 61 6c 46 6c 61  .  int globalFla
cc40: 67 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28  g = find_option(
cc50: 22 67 6c 6f 62 61 6c 22 2c 22 67 22 2c 30 29 21  "global","g",0)!
cc60: 3d 30 3b 0a 20 20 69 6e 74 20 75 6e 73 65 74 46  =0;.  int unsetF
cc70: 6c 61 67 20 3d 20 67 2e 61 72 67 76 5b 31 5d 5b  lag = g.argv[1][
cc80: 30 5d 3d 3d 27 75 27 3b 0a 20 20 64 62 5f 6f 70  0]=='u';.  db_op
cc90: 65 6e 5f 63 6f 6e 66 69 67 28 31 29 3b 0a 20 20  en_config(1);.  
cca0: 69 66 28 20 21 67 6c 6f 62 61 6c 46 6c 61 67 20  if( !globalFlag 
ccb0: 29 7b 0a 20 20 20 20 64 62 5f 66 69 6e 64 5f 61  ){.    db_find_a
ccc0: 6e 64 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f  nd_open_reposito
ccd0: 72 79 28 4f 50 45 4e 5f 41 4e 59 5f 53 43 48 45  ry(OPEN_ANY_SCHE
cce0: 4d 41 20 7c 20 4f 50 45 4e 5f 4f 4b 5f 4e 4f 54  MA | OPEN_OK_NOT
ccf0: 5f 46 4f 55 4e 44 2c 20 30 29 3b 0a 20 20 7d 0a  _FOUND, 0);.  }.
cd00: 20 20 69 66 28 20 21 67 2e 72 65 70 6f 73 69 74    if( !g.reposit
cd10: 6f 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20 20 67  oryOpen ){.    g
cd20: 6c 6f 62 61 6c 46 6c 61 67 20 3d 20 31 3b 0a 20  lobalFlag = 1;. 
cd30: 20 7d 0a 20 20 69 66 28 20 75 6e 73 65 74 46 6c   }.  if( unsetFl
cd40: 61 67 20 26 26 20 67 2e 61 72 67 63 21 3d 33 20  ag && g.argc!=3 
cd50: 29 7b 0a 20 20 20 20 75 73 61 67 65 28 22 50 52  ){.    usage("PR
cd60: 4f 50 45 52 54 59 20 3f 2d 67 6c 6f 62 61 6c 3f  OPERTY ?-global?
cd70: 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e  ");.  }.  if( g.
cd80: 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 66  argc==2 ){.    f
cd90: 6f 72 28 69 3d 30 3b 20 63 74 72 6c 53 65 74 74  or(i=0; ctrlSett
cda0: 69 6e 67 73 5b 69 5d 2e 6e 61 6d 65 3b 20 69 2b  ings[i].name; i+
cdb0: 2b 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 5f  +){.      print_
cdc0: 73 65 74 74 69 6e 67 28 63 74 72 6c 53 65 74 74  setting(ctrlSett
cdd0: 69 6e 67 73 5b 69 5d 2e 6e 61 6d 65 29 3b 0a 20  ings[i].name);. 
cde0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
cdf0: 20 67 2e 61 72 67 63 3d 3d 33 20 7c 7c 20 67 2e   g.argc==3 || g.
ce00: 61 72 67 63 3d 3d 34 20 29 7b 0a 20 20 20 20 63  argc==4 ){.    c
ce10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
ce20: 20 3d 20 67 2e 61 72 67 76 5b 32 5d 3b 0a 20 20   = g.argv[2];.  
ce30: 20 20 69 6e 74 20 69 73 4d 61 6e 69 66 65 73 74    int isManifest
ce40: 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74  ;.    int n = st
ce50: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  rlen(zName);.   
ce60: 20 66 6f 72 28 69 3d 30 3b 20 63 74 72 6c 53 65   for(i=0; ctrlSe
ce70: 74 74 69 6e 67 73 5b 69 5d 2e 6e 61 6d 65 3b 20  ttings[i].name; 
ce80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
ce90: 73 74 72 6e 63 6d 70 28 63 74 72 6c 53 65 74 74  strncmp(ctrlSett
cea0: 69 6e 67 73 5b 69 5d 2e 6e 61 6d 65 2c 20 7a 4e  ings[i].name, zN
ceb0: 61 6d 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72 65  ame, n)==0 ) bre
cec0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
ced0: 28 20 21 63 74 72 6c 53 65 74 74 69 6e 67 73 5b  ( !ctrlSettings[
cee0: 69 5d 2e 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  i].name ){.     
cef0: 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e   fossil_fatal("n
cf00: 6f 20 73 75 63 68 20 73 65 74 74 69 6e 67 3a 20  o such setting: 
cf10: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
cf20: 20 7d 0a 20 20 20 20 69 73 4d 61 6e 69 66 65 73   }.    isManifes
cf30: 74 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d  t = fossil_strcm
cf40: 70 28 63 74 72 6c 53 65 74 74 69 6e 67 73 5b 69  p(ctrlSettings[i
cf50: 5d 2e 6e 61 6d 65 2c 20 22 6d 61 6e 69 66 65 73  ].name, "manifes
cf60: 74 22 29 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20  t")==0;.    if( 
cf70: 69 73 4d 61 6e 69 66 65 73 74 20 26 26 20 67 6c  isManifest && gl
cf80: 6f 62 61 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20  obalFlag ){.    
cf90: 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22    fossil_fatal("
cfa0: 63 61 6e 6e 6f 74 20 73 65 74 20 27 6d 61 6e 69  cannot set 'mani
cfb0: 66 65 73 74 27 20 67 6c 6f 62 61 6c 6c 79 22 29  fest' globally")
cfc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cfd0: 75 6e 73 65 74 46 6c 61 67 20 29 7b 0a 20 20 20  unsetFlag ){.   
cfe0: 20 20 20 64 62 5f 75 6e 73 65 74 28 63 74 72 6c     db_unset(ctrl
cff0: 53 65 74 74 69 6e 67 73 5b 69 5d 2e 6e 61 6d 65  Settings[i].name
d000: 2c 20 67 6c 6f 62 61 6c 46 6c 61 67 29 3b 0a 20  , globalFlag);. 
d010: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 67 2e 61     }else if( g.a
d020: 72 67 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  rgc==4 ){.      
d030: 64 62 5f 73 65 74 28 63 74 72 6c 53 65 74 74 69  db_set(ctrlSetti
d040: 6e 67 73 5b 69 5d 2e 6e 61 6d 65 2c 20 67 2e 61  ngs[i].name, g.a
d050: 72 67 76 5b 33 5d 2c 20 67 6c 6f 62 61 6c 46 6c  rgv[3], globalFl
d060: 61 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ag);.    }else{.
d070: 20 20 20 20 20 20 69 73 4d 61 6e 69 66 65 73 74        isManifest
d080: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 72 69 6e   = 0;.      prin
d090: 74 5f 73 65 74 74 69 6e 67 28 63 74 72 6c 53 65  t_setting(ctrlSe
d0a0: 74 74 69 6e 67 73 5b 69 5d 2e 6e 61 6d 65 29 3b  ttings[i].name);
d0b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
d0c0: 73 4d 61 6e 69 66 65 73 74 20 29 7b 0a 20 20 20  sManifest ){.   
d0d0: 20 20 20 6d 61 6e 69 66 65 73 74 5f 74 6f 5f 64     manifest_to_d
d0e0: 69 73 6b 28 64 62 5f 6c 67 65 74 5f 69 6e 74 28  isk(db_lget_int(
d0f0: 22 63 68 65 63 6b 6f 75 74 22 2c 20 30 29 29 3b  "checkout", 0));
d100: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
d110: 20 20 20 20 75 73 61 67 65 28 22 3f 50 52 4f 50      usage("?PROP
d120: 45 52 54 59 3f 20 3f 56 41 4c 55 45 3f 22 29 3b  ERTY? ?VALUE?");
d130: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
d140: 65 20 69 6e 70 75 74 20 69 6e 20 61 20 61 20 74  e input in a a t
d150: 69 6d 65 73 70 61 6e 20 6d 65 61 73 75 72 65 64  imespan measured
d160: 20 69 6e 20 64 61 79 73 2e 20 20 52 65 74 75 72   in days.  Retur
d170: 6e 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68  n a string which
d180: 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68  .** describes th
d190: 61 74 20 74 69 6d 65 73 70 61 6e 20 69 6e 20 75  at timespan in u
d1a0: 6e 69 74 73 20 6f 66 20 73 65 63 6f 6e 64 73 2c  nits of seconds,
d1b0: 20 6d 69 6e 75 74 65 73 2c 20 68 6f 75 72 73 2c   minutes, hours,
d1c0: 20 64 61 79 73 2c 0a 2a 2a 20 6f 72 20 79 65 61   days,.** or yea
d1d0: 72 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  rs, depending on
d1e0: 20 69 74 73 20 64 75 72 61 74 69 6f 6e 2e 0a 2a   its duration..*
d1f0: 2f 0a 63 68 61 72 20 2a 64 62 5f 74 69 6d 65 73  /.char *db_times
d200: 70 61 6e 5f 6e 61 6d 65 28 64 6f 75 62 6c 65 20  pan_name(double 
d210: 72 53 70 61 6e 29 7b 0a 20 20 69 66 28 20 72 53  rSpan){.  if( rS
d220: 70 61 6e 3c 30 20 29 20 72 53 70 61 6e 20 3d 20  pan<0 ) rSpan = 
d230: 2d 72 53 70 61 6e 3b 0a 20 20 72 53 70 61 6e 20  -rSpan;.  rSpan 
d240: 2a 3d 20 32 34 2e 30 2a 33 36 30 30 2e 30 3b 20  *= 24.0*3600.0; 
d250: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 75 6e 69 74   /* Convert unit
d260: 73 20 74 6f 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  s to seconds */.
d270: 20 20 69 66 28 20 72 53 70 61 6e 3c 31 32 30 2e    if( rSpan<120.
d280: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
d290: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
d2a0: 22 25 2e 31 66 20 73 65 63 6f 6e 64 73 22 2c 20  "%.1f seconds", 
d2b0: 72 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 53  rSpan);.  }.  rS
d2c0: 70 61 6e 20 2f 3d 20 36 30 2e 30 3b 20 20 20 20  pan /= 60.0;    
d2d0: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
d2e0: 75 6e 69 74 73 20 74 6f 20 6d 69 6e 75 74 65 73  units to minutes
d2f0: 20 2a 2f 0a 20 20 69 66 28 20 72 53 70 61 6e 3c   */.  if( rSpan<
d300: 39 30 2e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  90.0 ){.    retu
d310: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  rn sqlite3_mprin
d320: 74 66 28 22 25 2e 31 66 20 6d 69 6e 75 74 65 73  tf("%.1f minutes
d330: 22 2c 20 72 53 70 61 6e 29 3b 0a 20 20 7d 0a 20  ", rSpan);.  }. 
d340: 20 72 53 70 61 6e 20 2f 3d 20 36 30 2e 30 3b 20   rSpan /= 60.0; 
d350: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65          /* Conve
d360: 72 74 20 75 6e 69 74 73 20 74 6f 20 68 6f 75 72  rt units to hour
d370: 73 20 2a 2f 0a 20 20 69 66 28 20 72 53 70 61 6e  s */.  if( rSpan
d380: 3c 3d 34 38 2e 30 20 29 7b 0a 20 20 20 20 72 65  <=48.0 ){.    re
d390: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 70 72  turn sqlite3_mpr
d3a0: 69 6e 74 66 28 22 25 2e 31 66 20 68 6f 75 72 73  intf("%.1f hours
d3b0: 22 2c 20 72 53 70 61 6e 29 3b 0a 20 20 7d 0a 20  ", rSpan);.  }. 
d3c0: 20 72 53 70 61 6e 20 2f 3d 20 32 34 2e 30 3b 20   rSpan /= 24.0; 
d3d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65          /* Conve
d3e0: 72 74 20 75 6e 69 74 73 20 74 6f 20 64 61 79 73  rt units to days
d3f0: 20 2a 2f 0a 20 20 69 66 28 20 72 53 70 61 6e 3c   */.  if( rSpan<
d400: 3d 33 36 35 2e 30 20 29 7b 0a 20 20 20 20 72 65  =365.0 ){.    re
d410: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 70 72  turn sqlite3_mpr
d420: 69 6e 74 66 28 22 25 2e 31 66 20 64 61 79 73 22  intf("%.1f days"
d430: 2c 20 72 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20  , rSpan);.  }.  
d440: 72 53 70 61 6e 20 2f 3d 20 33 35 36 2e 32 34 3b  rSpan /= 356.24;
d450: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76           /* Conv
d460: 65 72 74 20 75 6e 69 74 73 20 74 6f 20 79 65 61  ert units to yea
d470: 72 73 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  rs */.  return s
d480: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
d490: 25 2e 31 66 20 79 65 61 72 73 22 2c 20 72 53 70  %.1f years", rSp
d4a0: 61 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f  an);.}../*.** CO
d4b0: 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 74 69 6d 65  MMAND: test-time
d4c0: 73 70 61 6e 0a 2a 2a 20 25 66 6f 73 73 69 6c 20  span.** %fossil 
d4d0: 74 65 73 74 2d 74 69 6d 65 73 70 61 6e 20 54 49  test-timespan TI
d4e0: 4d 45 53 54 41 4d 50 0a 2a 2a 0a 2a 2a 20 50 72  MESTAMP.**.** Pr
d4f0: 69 6e 74 20 74 68 65 20 61 70 70 72 6f 78 69 6d  int the approxim
d500: 61 74 65 20 73 70 61 6e 20 6f 66 20 74 69 6d 65  ate span of time
d510: 20 66 72 6f 6d 20 6e 6f 77 20 74 6f 20 54 49 4d   from now to TIM
d520: 45 53 54 41 4d 50 2e 0a 2a 2f 0a 76 6f 69 64 20  ESTAMP..*/.void 
d530: 74 65 73 74 5f 74 69 6d 65 73 70 61 6e 5f 63 6d  test_timespan_cm
d540: 64 28 76 6f 69 64 29 7b 0a 20 20 64 6f 75 62 6c  d(void){.  doubl
d550: 65 20 72 44 69 66 66 3b 0a 20 20 69 66 28 20 67  e rDiff;.  if( g
d560: 2e 61 72 67 63 21 3d 33 20 29 20 75 73 61 67 65  .argc!=3 ) usage
d570: 28 22 54 49 4d 45 53 54 41 4d 50 22 29 3b 0a 20  ("TIMESTAMP");. 
d580: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a   sqlite3_open(":
d590: 6d 65 6d 6f 72 79 3a 22 2c 20 26 67 2e 64 62 29  memory:", &g.db)
d5a0: 3b 20 20 0a 20 20 72 44 69 66 66 20 3d 20 64 62  ;  .  rDiff = db
d5b0: 5f 64 6f 75 62 6c 65 28 30 2e 30 2c 20 22 53 45  _double(0.0, "SE
d5c0: 4c 45 43 54 20 6a 75 6c 69 61 6e 64 61 79 28 27  LECT julianday('
d5d0: 6e 6f 77 27 29 20 2d 20 6a 75 6c 69 61 6e 64 61  now') - julianda
d5e0: 79 28 25 51 29 22 2c 20 67 2e 61 72 67 76 5b 32  y(%Q)", g.argv[2
d5f0: 5d 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 54 69  ]);.  printf("Ti
d600: 6d 65 20 64 69 66 66 65 72 65 6e 63 65 73 3a 20  me differences: 
d610: 25 73 5c 6e 22 2c 20 64 62 5f 74 69 6d 65 73 70  %s\n", db_timesp
d620: 61 6e 5f 6e 61 6d 65 28 72 44 69 66 66 29 29 3b  an_name(rDiff));
d630: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
d640: 28 67 2e 64 62 29 3b 0a 20 20 67 2e 64 62 20 3d  (g.db);.  g.db =
d650: 20 30 3b 0a 7d 0a                                 0;.}.