Hex Artifact Content
Not logged in

Artifact d2615a7db8e0546ab29ad3ceaae0c4ab936e5cda:

File src/db.c part of check-in [9346f2290c] - Added the "all" command for things like "fossil all sync". I am not sure "all" is quite the right name for this command, so I may yet change it. by drh on 2008-10-17 00:20:21.

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 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c 64  **.** You should
01f0: 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 61   have received a
0200: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e 55   copy of the GNU
0210: 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 0a   General Public.
0220: 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e 67  ** License along
0230: 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72 61   with this libra
0240: 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69 74  ry; if not, writ
0250: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65 65  e to the.** Free
0260: 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 61   Software Founda
0270: 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20 54  tion, Inc., 59 T
0280: 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53 75  emple Place - Su
0290: 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73 74  ite 330,.** Bost
02a0: 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31 33  on, MA  02111-13
02b0: 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20 41  07, USA..**.** A
02c0: 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e  uthor contact in
02d0: 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20  formation:.**   
02e0: 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a  drh@hwaci.com.**
02f0: 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77     http://www.hw
0300: 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a  aci.com/drh/.**.
0310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0360: 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 69  **.** Code for i
0370: 6e 74 65 72 66 61 63 69 6e 67 20 74 6f 20 74 68  nterfacing to th
0380: 65 20 76 61 72 69 6f 75 73 20 64 61 74 61 62 61  e various databa
0390: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ses..**.** There
03a0: 20 61 72 65 20 74 68 72 65 65 20 73 65 70 61 72   are three separ
03b0: 61 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ate database fil
03c0: 65 73 20 74 68 61 74 20 66 6f 73 73 69 6c 20 69  es that fossil i
03d0: 6e 74 65 72 61 63 74 73 0a 2a 2a 20 77 69 74 68  nteracts.** with
03e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
03f0: 54 68 65 20 22 75 73 65 72 22 20 64 61 74 61 62  The "user" datab
0400: 61 73 65 20 69 6e 20 7e 2f 2e 66 6f 73 73 69 6c  ase in ~/.fossil
0410: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 54  .**.**    (2)  T
0420: 68 65 20 22 72 65 70 6f 73 69 74 6f 72 79 22 20  he "repository" 
0430: 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20  database.**.**  
0440: 20 20 28 33 29 20 20 41 20 6c 6f 63 61 6c 20 63    (3)  A local c
0450: 68 65 63 6b 6f 75 74 20 64 61 74 61 62 61 73 65  heckout database
0460: 20 6e 61 6d 65 64 20 22 46 4f 53 53 49 4c 22 20   named "FOSSIL" 
0470: 61 6e 64 20 6c 6f 63 61 74 65 64 20 61 74 20 74  and located at t
0480: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 6f  he.**         ro
0490: 6f 74 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20  ot of the local 
04a0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 6f 75 72  copy of the sour
04b0: 63 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2f 0a 23  ce tree..**.*/.#
04c0: 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e  include "config.
04d0: 68 22 0a 23 69 66 6e 64 65 66 20 5f 5f 4d 49 4e  h".#ifndef __MIN
04e0: 47 57 33 32 5f 5f 0a 23 20 20 69 6e 63 6c 75 64  GW32__.#  includ
04f0: 65 20 3c 70 77 64 2e 68 3e 0a 23 65 6e 64 69 66  e <pwd.h>.#endif
0500: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 71 6c 69 74  .#include <sqlit
0510: 65 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  e3.h>.#include <
0520: 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e  sys/types.h>.#in
0530: 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e  clude <sys/stat.
0540: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69  h>.#include <uni
0550: 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  std.h>.#include 
0560: 22 64 62 2e 68 22 0a 0a 23 69 66 20 49 4e 54 45  "db.h"..#if INTE
0570: 52 46 41 43 45 0a 2f 2a 0a 2a 2a 20 41 6e 20 73  RFACE./*.** An s
0580: 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d  ingle SQL statem
0590: 65 6e 74 20 69 73 20 72 65 70 72 65 73 65 6e 74  ent is represent
05a0: 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63  ed as an instanc
05b0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
05c0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
05d0: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 74 6d 74 20  .*/.struct Stmt 
05e0: 7b 0a 20 20 42 6c 6f 62 20 73 71 6c 3b 20 20 20  {.  Blob sql;   
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0600: 68 65 20 53 51 4c 20 66 6f 72 20 74 68 69 73 20  he SQL for this 
0610: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 73  statement */.  s
0620: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
0630: 6d 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65  mt;    /* The re
0640: 73 75 6c 74 73 20 6f 66 20 73 71 6c 69 74 65 33  sults of sqlite3
0650: 5f 70 72 65 70 61 72 65 28 29 20 2a 2f 0a 20 20  _prepare() */.  
0660: 53 74 6d 74 20 2a 70 4e 65 78 74 2c 20 2a 70 50  Stmt *pNext, *pP
0670: 72 65 76 3b 20 20 20 20 2f 2a 20 4c 69 73 74 20  rev;    /* List 
0680: 6f 66 20 61 6c 6c 20 75 6e 66 69 6e 61 6c 69 7a  of all unfinaliz
0690: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  ed statements */
06a0: 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 49 4e  .};.#endif /* IN
06b0: 54 45 52 46 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  TERFACE */../*.*
06c0: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
06d0: 69 6e 65 20 77 68 65 6e 20 61 20 64 61 74 61 62  ine when a datab
06e0: 61 73 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ase error occurs
06f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0700: 20 64 62 5f 65 72 72 28 63 6f 6e 73 74 20 63 68   db_err(const ch
0710: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
0720: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
0730: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61  .  char *z;.  va
0740: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
0750: 61 74 29 3b 0a 20 20 7a 20 3d 20 76 6d 70 72 69  at);.  z = vmpri
0760: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ntf(zFormat, ap)
0770: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
0780: 20 20 69 66 28 20 67 2e 63 67 69 50 61 6e 69 63    if( g.cgiPanic
0790: 20 29 7b 0a 20 20 20 20 67 2e 63 67 69 50 61 6e   ){.    g.cgiPan
07a0: 69 63 20 3d 20 30 3b 0a 20 20 20 20 63 67 69 5f  ic = 0;.    cgi_
07b0: 70 72 69 6e 74 66 28 22 3c 68 31 3e 44 61 74 61  printf("<h1>Data
07c0: 62 61 73 65 20 45 72 72 6f 72 3c 2f 68 31 3e 5c  base Error</h1>\
07d0: 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
07e0: 20 20 22 3c 70 72 65 3e 25 68 3c 2f 70 72 65 3e    "<pre>%h</pre>
07f0: 22 2c 20 7a 29 3b 0a 20 20 20 20 63 67 69 5f 72  ", z);.    cgi_r
0800: 65 70 6c 79 28 29 3b 0a 20 20 7d 65 6c 73 65 7b  eply();.  }else{
0810: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
0820: 65 72 72 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c  err, "%s: %s\n",
0830: 20 67 2e 61 72 67 76 5b 30 5d 2c 20 7a 29 3b 0a   g.argv[0], z);.
0840: 20 20 7d 0a 20 20 64 62 5f 66 6f 72 63 65 5f 72    }.  db_force_r
0850: 6f 6c 6c 62 61 63 6b 28 29 3b 0a 20 20 65 78 69  ollback();.  exi
0860: 74 28 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  t(1);.}..static 
0870: 69 6e 74 20 6e 42 65 67 69 6e 20 3d 20 30 3b 20  int nBegin = 0; 
0880: 20 20 20 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20       /* Nesting 
0890: 64 65 70 74 68 20 6f 66 20 42 45 47 49 4e 20 2a  depth of BEGIN *
08a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e  /.static int isN
08b0: 65 77 52 65 70 6f 20 3d 20 30 3b 20 20 20 2f 2a  ewRepo = 0;   /*
08c0: 20 54 72 75 65 20 69 66 20 74 68 65 20 72 65 70   True if the rep
08d0: 6f 73 69 74 6f 72 79 20 69 73 20 6e 65 77 6c 79  ository is newly
08e0: 20 63 72 65 61 74 65 64 20 2a 2f 0a 73 74 61 74   created */.stat
08f0: 69 63 20 69 6e 74 20 64 6f 52 6f 6c 6c 62 61 63  ic int doRollbac
0900: 6b 20 3d 20 30 3b 20 20 2f 2a 20 54 72 75 65 20  k = 0;  /* True 
0910: 74 6f 20 66 6f 72 63 65 20 61 20 72 6f 6c 6c 62  to force a rollb
0920: 61 63 6b 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ack */.static in
0930: 74 20 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 20 3d 20  t nCommitHook = 
0940: 30 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0; /* Number of 
0950: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 73 20 2a 2f 0a  commit hooks */.
0960: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 43  static struct sC
0970: 6f 6d 6d 69 74 48 6f 6f 6b 20 7b 0a 20 20 69 6e  ommitHook {.  in
0980: 74 20 28 2a 78 48 6f 6f 6b 29 28 76 6f 69 64 29  t (*xHook)(void)
0990: 3b 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20  ;  /* Functions 
09a0: 74 6f 20 63 61 6c 6c 20 61 74 20 64 62 5f 65 6e  to call at db_en
09b0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 20  d_transaction() 
09c0: 2a 2f 0a 20 20 69 6e 74 20 73 65 71 75 65 6e 63  */.  int sequenc
09d0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c  e;        /* Cal
09e0: 6c 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73  l functions in s
09f0: 65 71 75 65 6e 63 65 20 6f 72 64 65 72 20 2a 2f  equence order */
0a00: 0a 7d 20 61 48 6f 6f 6b 5b 35 5d 3b 0a 73 74 61  .} aHook[5];.sta
0a10: 74 69 63 20 53 74 6d 74 20 2a 70 41 6c 6c 53 74  tic Stmt *pAllSt
0a20: 6d 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74  mt = 0;  /* List
0a30: 20 6f 66 20 61 6c 6c 20 75 6e 66 69 6e 61 6c 69   of all unfinali
0a40: 7a 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  zed statements *
0a50: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
0a60: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
0a70: 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  by the SQLite co
0a80: 6d 6d 69 74 2d 68 6f 6f 6b 20 6d 65 63 68 61 6e  mmit-hook mechan
0a90: 69 73 6d 0a 2a 2a 20 6a 75 73 74 20 70 72 69 6f  ism.** just prio
0aa0: 72 20 74 6f 20 65 61 63 68 20 6f 6d 69 74 2e 20  r to each omit. 
0ab0: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
0ac0: 65 20 64 6f 65 73 20 69 73 20 76 65 72 69 66 79  e does is verify
0ad0: 0a 2a 2a 20 74 68 61 74 20 6e 42 65 67 69 6e 20  .** that nBegin 
0ae0: 72 65 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2e 20  really is zero. 
0af0: 20 54 68 61 74 20 69 6e 73 75 72 65 73 20 74 68   That insures th
0b00: 61 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 0a  at transactions.
0b10: 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74  ** cannot commit
0b20: 20 62 79 20 61 6e 79 20 6d 65 61 6e 73 20 6f 74   by any means ot
0b30: 68 65 72 20 74 68 61 6e 20 62 79 20 63 61 6c 6c  her than by call
0b40: 69 6e 67 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73  ing db_end_trans
0b50: 61 63 74 69 6f 6e 28 29 0a 2a 2a 20 62 65 6c 6f  action().** belo
0b60: 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  w..**.** This is
0b70: 20 6a 75 73 74 20 61 20 73 61 66 65 74 79 20 61   just a safety a
0b80: 6e 64 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e  nd sanity check.
0b90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
0ba0: 62 5f 76 65 72 69 66 79 5f 61 74 5f 63 6f 6d 6d  b_verify_at_comm
0bb0: 69 74 28 76 6f 69 64 20 2a 6e 6f 74 55 73 65 64  it(void *notUsed
0bc0: 29 7b 0a 20 20 69 66 28 20 6e 42 65 67 69 6e 20  ){.  if( nBegin 
0bd0: 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61  ){.    fossil_pa
0be0: 6e 69 63 28 22 69 6c 6c 65 67 61 6c 20 63 6f 6d  nic("illegal com
0bf0: 6d 69 74 20 61 74 74 65 6d 70 74 22 29 3b 0a 20  mit attempt");. 
0c00: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
0c10: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
0c20: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 6e 64 20  /*.** Begin and 
0c30: 65 6e 64 20 61 20 6e 65 73 74 65 64 20 74 72 61  end a nested tra
0c40: 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
0c50: 20 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61   db_begin_transa
0c60: 63 74 69 6f 6e 28 76 6f 69 64 29 7b 0a 20 20 69  ction(void){.  i
0c70: 66 28 20 6e 42 65 67 69 6e 3d 3d 30 20 29 7b 0a  f( nBegin==0 ){.
0c80: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
0c90: 63 28 22 42 45 47 49 4e 22 29 3b 0a 20 20 20 20  c("BEGIN");.    
0ca0: 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68  sqlite3_commit_h
0cb0: 6f 6f 6b 28 67 2e 64 62 2c 20 64 62 5f 76 65 72  ook(g.db, db_ver
0cc0: 69 66 79 5f 61 74 5f 63 6f 6d 6d 69 74 2c 20 30  ify_at_commit, 0
0cd0: 29 3b 0a 20 20 7d 0a 20 20 6e 42 65 67 69 6e 2b  );.  }.  nBegin+
0ce0: 2b 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 65 6e 64  +;.}.void db_end
0cf0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 69 6e 74  _transaction(int
0d00: 20 72 6f 6c 6c 62 61 63 6b 46 6c 61 67 29 7b 0a   rollbackFlag){.
0d10: 20 20 69 66 28 20 6e 42 65 67 69 6e 3c 3d 30 20    if( nBegin<=0 
0d20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
0d30: 72 6f 6c 6c 62 61 63 6b 46 6c 61 67 20 29 20 64  rollbackFlag ) d
0d40: 6f 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  oRollback = 1;. 
0d50: 20 6e 42 65 67 69 6e 2d 2d 3b 0a 20 20 69 66 28   nBegin--;.  if(
0d60: 20 6e 42 65 67 69 6e 3d 3d 30 20 29 7b 0a 20 20   nBegin==0 ){.  
0d70: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
0d80: 28 69 3d 30 3b 20 64 6f 52 6f 6c 6c 62 61 63 6b  (i=0; doRollback
0d90: 3d 3d 30 20 26 26 20 69 3c 6e 43 6f 6d 6d 69 74  ==0 && i<nCommit
0da0: 48 6f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Hook; i++){.    
0db0: 20 20 64 6f 52 6f 6c 6c 62 61 63 6b 20 7c 3d 20    doRollback |= 
0dc0: 61 48 6f 6f 6b 5b 69 5d 2e 78 48 6f 6f 6b 28 29  aHook[i].xHook()
0dd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 6d  ;.    }.    db_m
0de0: 75 6c 74 69 5f 65 78 65 63 28 64 6f 52 6f 6c 6c  ulti_exec(doRoll
0df0: 62 61 63 6b 20 3f 20 22 52 4f 4c 4c 42 41 43 4b  back ? "ROLLBACK
0e00: 22 20 3a 20 22 43 4f 4d 4d 49 54 22 29 3b 0a 20  " : "COMMIT");. 
0e10: 20 20 20 64 6f 52 6f 6c 6c 62 61 63 6b 20 3d 20     doRollback = 
0e20: 30 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 64 62  0;.  }.}.void db
0e30: 5f 66 6f 72 63 65 5f 72 6f 6c 6c 62 61 63 6b 28  _force_rollback(
0e40: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 6e 42 65  void){.  if( nBe
0e50: 67 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  gin ){.    sqlit
0e60: 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 22 52  e3_exec(g.db, "R
0e70: 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20  OLLBACK", 0, 0, 
0e80: 30 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4e 65  0);.    if( isNe
0e90: 77 52 65 70 6f 20 29 7b 0a 20 20 20 20 20 20 64  wRepo ){.      d
0ea0: 62 5f 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20 20  b_close();.     
0eb0: 20 75 6e 6c 69 6e 6b 28 67 2e 7a 52 65 70 6f 73   unlink(g.zRepos
0ec0: 69 74 6f 72 79 4e 61 6d 65 29 3b 0a 20 20 20 20  itoryName);.    
0ed0: 7d 0a 20 20 7d 0a 20 20 6e 42 65 67 69 6e 20 3d  }.  }.  nBegin =
0ee0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
0ef0: 74 61 6c 6c 20 61 20 63 6f 6d 6d 69 74 20 68 6f  tall a commit ho
0f00: 6f 6b 2e 20 20 48 6f 6f 6b 73 20 61 72 65 20 69  ok.  Hooks are i
0f10: 6e 73 74 61 6c 6c 65 64 20 69 6e 20 73 65 71 75  nstalled in sequ
0f20: 65 6e 63 65 20 6f 72 64 65 72 2e 0a 2a 2a 20 49  ence order..** I
0f30: 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f  t is an error to
0f40: 20 69 6e 73 74 61 6c 6c 20 74 68 65 20 73 61 6d   install the sam
0f50: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 6d 6f  e commit hook mo
0f60: 72 65 20 74 68 61 6e 20 6f 6e 63 65 2e 0a 2a 2a  re than once..**
0f70: 0a 2a 2a 20 45 61 63 68 20 63 6f 6d 6d 69 74 20  .** Each commit 
0f80: 68 6f 6f 6b 20 69 73 20 63 61 6c 6c 65 64 20 28  hook is called (
0f90: 69 6e 20 6f 72 64 65 72 20 6f 66 20 61 63 63 65  in order of acce
0fa0: 6e 64 69 6e 67 20 73 65 71 75 65 6e 63 65 29 20  nding sequence) 
0fb0: 61 74 0a 2a 2a 20 65 61 63 68 20 63 6f 6d 6d 69  at.** each commi
0fc0: 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 66  t operation.  If
0fd0: 20 61 6e 79 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   any commit hook
0fe0: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
0ff0: 6f 2c 0a 2a 2a 20 74 68 65 20 73 75 62 73 65 71  o,.** the subseq
1000: 75 65 6e 63 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  uence commit hoo
1010: 6b 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 61  ks are omitted a
1020: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
1030: 6f 6e 0a 2a 2a 20 72 6f 6c 6c 73 20 62 61 63 6b  on.** rolls back
1040: 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 6f 6d   rather than com
1050: 6d 69 74 2e 20 20 49 74 20 69 73 20 74 68 65 20  mit.  It is the 
1060: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
1070: 66 20 74 68 65 0a 2a 2a 20 68 6f 6f 6b 73 20 74  f the.** hooks t
1080: 68 65 6d 73 65 6c 76 65 73 20 74 6f 20 69 73 73  hemselves to iss
1090: 75 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  ue any error mes
10a0: 73 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 64  sages..*/.void d
10b0: 62 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 69 6e  b_commit_hook(in
10c0: 74 20 28 2a 78 29 28 76 6f 69 64 29 2c 20 69 6e  t (*x)(void), in
10d0: 74 20 73 65 71 75 65 6e 63 65 29 7b 0a 20 20 69  t sequence){.  i
10e0: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
10f0: 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 20 3c 20 73 69  nCommitHook < si
1100: 7a 65 6f 66 28 61 48 6f 6f 6b 29 2f 73 69 7a 65  zeof(aHook)/size
1110: 6f 66 28 61 48 6f 6f 6b 5b 31 5d 29 20 29 3b 0a  of(aHook[1]) );.
1120: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
1130: 6d 6d 69 74 48 6f 6f 6b 3b 20 69 2b 2b 29 7b 0a  mmitHook; i++){.
1140: 20 20 20 20 61 73 73 65 72 74 28 20 78 21 3d 61      assert( x!=a
1150: 48 6f 6f 6b 5b 69 5d 2e 78 48 6f 6f 6b 20 29 3b  Hook[i].xHook );
1160: 0a 20 20 20 20 69 66 28 20 61 48 6f 6f 6b 5b 69  .    if( aHook[i
1170: 5d 2e 73 65 71 75 65 6e 63 65 3e 73 65 71 75 65  ].sequence>seque
1180: 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  nce ){.      int
1190: 20 73 20 3d 20 73 65 71 75 65 6e 63 65 3b 0a 20   s = sequence;. 
11a0: 20 20 20 20 20 69 6e 74 20 28 2a 78 53 29 28 76       int (*xS)(v
11b0: 6f 69 64 29 20 3d 20 78 3b 0a 20 20 20 20 20 20  oid) = x;.      
11c0: 73 65 71 75 65 6e 63 65 20 3d 20 61 48 6f 6f 6b  sequence = aHook
11d0: 5b 69 5d 2e 73 65 71 75 65 6e 63 65 3b 0a 20 20  [i].sequence;.  
11e0: 20 20 20 20 78 20 3d 20 61 48 6f 6f 6b 5b 69 5d      x = aHook[i]
11f0: 2e 78 48 6f 6f 6b 3b 0a 20 20 20 20 20 20 61 48  .xHook;.      aH
1200: 6f 6f 6b 5b 69 5d 2e 73 65 71 75 65 6e 63 65 20  ook[i].sequence 
1210: 3d 20 73 3b 0a 20 20 20 20 20 20 61 48 6f 6f 6b  = s;.      aHook
1220: 5b 69 5d 2e 78 48 6f 6f 6b 20 3d 20 78 53 3b 0a  [i].xHook = xS;.
1230: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 48 6f 6f      }.  }.  aHoo
1240: 6b 5b 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 5d 2e 73  k[nCommitHook].s
1250: 65 71 75 65 6e 63 65 20 3d 20 73 65 71 75 65 6e  equence = sequen
1260: 63 65 3b 0a 20 20 61 48 6f 6f 6b 5b 6e 43 6f 6d  ce;.  aHook[nCom
1270: 6d 69 74 48 6f 6f 6b 5d 2e 78 48 6f 6f 6b 20 3d  mitHook].xHook =
1280: 20 78 3b 0a 20 20 6e 43 6f 6d 6d 69 74 48 6f 6f   x;.  nCommitHoo
1290: 6b 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  k++;.}../*.** Pr
12a0: 65 70 61 72 65 20 61 20 53 74 6d 74 2e 20 20 41  epare a Stmt.  A
12b0: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 53  ssume that the S
12c0: 74 6d 74 20 69 73 20 70 72 65 76 69 6f 75 73 6c  tmt is previousl
12d0: 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
12e0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
12f0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73   string contains
1300: 20 6d 75 6c 74 69 70 6c 65 20 53 51 4c 20 73 74   multiple SQL st
1310: 61 74 65 6d 65 6e 74 73 2c 20 6f 6e 6c 79 20 74  atements, only t
1320: 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 6e 65 20  he first.** one 
1330: 69 73 20 70 72 6f 63 65 73 73 65 64 2e 20 20 41  is processed.  A
1340: 6c 6c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65  ll statements be
1350: 79 6f 6e 64 20 74 68 65 20 66 69 72 73 74 20 61  yond the first a
1360: 72 65 20 73 69 6c 65 6e 74 6c 79 20 69 67 6e 6f  re silently igno
1370: 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 76  red..*/.int db_v
1380: 70 72 65 70 61 72 65 28 53 74 6d 74 20 2a 70 53  prepare(Stmt *pS
1390: 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  tmt, const char 
13a0: 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73  *zFormat, va_lis
13b0: 74 20 61 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  t ap){.  char *z
13c0: 53 71 6c 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f  Sql;.  blob_zero
13d0: 28 26 70 53 74 6d 74 2d 3e 73 71 6c 29 3b 0a 20  (&pStmt->sql);. 
13e0: 20 62 6c 6f 62 5f 76 61 70 70 65 6e 64 66 28 26   blob_vappendf(&
13f0: 70 53 74 6d 74 2d 3e 73 71 6c 2c 20 7a 46 6f 72  pStmt->sql, zFor
1400: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
1410: 6e 64 28 61 70 29 3b 0a 20 20 7a 53 71 6c 20 3d  nd(ap);.  zSql =
1420: 20 62 6c 6f 62 5f 73 74 72 28 26 70 53 74 6d 74   blob_str(&pStmt
1430: 2d 3e 73 71 6c 29 3b 0a 20 20 69 66 28 20 73 71  ->sql);.  if( sq
1440: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1450: 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  (g.db, zSql, -1,
1460: 20 26 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20   &pStmt->pStmt, 
1470: 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f  0)!=0 ){.    db_
1480: 65 72 72 28 22 25 73 5c 6e 25 73 22 2c 20 73 71  err("%s\n%s", sq
1490: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64  lite3_errmsg(g.d
14a0: 62 29 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20  b), zSql);.  }. 
14b0: 20 70 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20   pStmt->pNext = 
14c0: 70 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30  pStmt->pPrev = 0
14d0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
14e0: 69 6e 74 20 64 62 5f 70 72 65 70 61 72 65 28 53  int db_prepare(S
14f0: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73  tmt *pStmt, cons
1500: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
1510: 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 3b   ...){.  int rc;
1520: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
1530: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1540: 6f 72 6d 61 74 29 3b 0a 20 20 72 63 20 3d 20 64  ormat);.  rc = d
1550: 62 5f 76 70 72 65 70 61 72 65 28 70 53 74 6d 74  b_vprepare(pStmt
1560: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
1570: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
1580: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
1590: 20 64 62 5f 73 74 61 74 69 63 5f 70 72 65 70 61   db_static_prepa
15a0: 72 65 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20  re(Stmt *pStmt, 
15b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
15c0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74  mat, ...){.  int
15d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15e0: 0a 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a 65  .  if( blob_size
15f0: 28 26 70 53 74 6d 74 2d 3e 73 71 6c 29 3d 3d 30  (&pStmt->sql)==0
1600: 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20   ){.    va_list 
1610: 61 70 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  ap;.    va_start
1620: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
1630: 20 20 20 72 63 20 3d 20 64 62 5f 76 70 72 65 70     rc = db_vprep
1640: 61 72 65 28 70 53 74 6d 74 2c 20 7a 46 6f 72 6d  are(pStmt, zForm
1650: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 70 53 74  at, ap);.    pSt
1660: 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 41 6c 6c  mt->pNext = pAll
1670: 53 74 6d 74 3b 0a 20 20 20 20 70 53 74 6d 74 2d  Stmt;.    pStmt-
1680: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
1690: 69 66 28 20 70 41 6c 6c 53 74 6d 74 20 29 20 70  if( pAllStmt ) p
16a0: 41 6c 6c 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d  AllStmt->pPrev =
16b0: 20 70 53 74 6d 74 3b 0a 20 20 20 20 70 41 6c 6c   pStmt;.    pAll
16c0: 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
16d0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
16e0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
16f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1700: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 62 69  he index of a bi
1710: 6e 64 20 70 61 72 61 6d 65 74 65 72 0a 2a 2f 0a  nd parameter.*/.
1720: 73 74 61 74 69 63 20 69 6e 74 20 70 61 72 61 6d  static int param
1730: 49 64 78 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c  Idx(Stmt *pStmt,
1740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1750: 72 61 6d 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ramName){.  int 
1760: 69 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  i = sqlite3_bind
1770: 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
1780: 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 7a  (pStmt->pStmt, z
1790: 50 61 72 61 6d 4e 61 6d 65 29 3b 0a 20 20 69 66  ParamName);.  if
17a0: 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  ( i==0 ){.    db
17b0: 5f 65 72 72 28 22 6e 6f 20 73 75 63 68 20 62 69  _err("no such bi
17c0: 6e 64 20 70 61 72 61 6d 65 74 65 72 3a 20 25 73  nd parameter: %s
17d0: 5c 6e 53 51 4c 3a 20 25 62 22 2c 20 7a 50 61 72  \nSQL: %b", zPar
17e0: 61 6d 4e 61 6d 65 2c 20 26 70 53 74 6d 74 2d 3e  amName, &pStmt->
17f0: 73 71 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sql);.  }.  retu
1800: 72 6e 20 69 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 42 69  rn i;.}./*.** Bi
1810: 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 73  nd an integer, s
1820: 74 72 69 6e 67 2c 20 6f 72 20 42 6c 6f 62 20 76  tring, or Blob v
1830: 61 6c 75 65 20 74 6f 20 61 20 6e 61 6d 65 64 20  alue to a named 
1840: 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e  parameter..*/.in
1850: 74 20 64 62 5f 62 69 6e 64 5f 69 6e 74 28 53 74  t db_bind_int(St
1860: 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74  mt *pStmt, const
1870: 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61 6d   char *zParamNam
1880: 65 2c 20 69 6e 74 20 69 56 61 6c 75 65 29 7b 0a  e, int iValue){.
1890: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
18a0: 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2d  _bind_int(pStmt-
18b0: 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d 49 64 78  >pStmt, paramIdx
18c0: 28 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61  (pStmt, zParamNa
18d0: 6d 65 29 2c 20 69 56 61 6c 75 65 29 3b 0a 7d 0a  me), iValue);.}.
18e0: 69 6e 74 20 64 62 5f 62 69 6e 64 5f 69 6e 74 36  int db_bind_int6
18f0: 34 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63  4(Stmt *pStmt, c
1900: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
1910: 6d 4e 61 6d 65 2c 20 69 36 34 20 69 56 61 6c 75  mName, i64 iValu
1920: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
1930: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
1940: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61  pStmt->pStmt, pa
1950: 72 61 6d 49 64 78 28 70 53 74 6d 74 2c 20 7a 50  ramIdx(pStmt, zP
1960: 61 72 61 6d 4e 61 6d 65 29 2c 20 69 56 61 6c 75  aramName), iValu
1970: 65 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 62 69 6e  e);.}.int db_bin
1980: 64 5f 64 6f 75 62 6c 65 28 53 74 6d 74 20 2a 70  d_double(Stmt *p
1990: 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  Stmt, const char
19a0: 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c 20 64 6f   *zParamName, do
19b0: 75 62 6c 65 20 72 56 61 6c 75 65 29 7b 0a 20 20  uble rValue){.  
19c0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 62  return sqlite3_b
19d0: 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  ind_double(pStmt
19e0: 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d 49 64  ->pStmt, paramId
19f0: 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e  x(pStmt, zParamN
1a00: 61 6d 65 29 2c 20 72 56 61 6c 75 65 29 3b 0a 7d  ame), rValue);.}
1a10: 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 74 65 78  .int db_bind_tex
1a20: 74 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63  t(Stmt *pStmt, c
1a30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
1a40: 6d 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  mName, const cha
1a50: 72 20 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 72 65  r *zValue){.  re
1a60: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e  turn sqlite3_bin
1a70: 64 5f 74 65 78 74 28 70 53 74 6d 74 2d 3e 70 53  d_text(pStmt->pS
1a80: 74 6d 74 2c 20 70 61 72 61 6d 49 64 78 28 70 53  tmt, paramIdx(pS
1a90: 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29  tmt, zParamName)
1aa0: 2c 20 7a 56 61 6c 75 65 2c 0a 20 20 20 20 20 20  , zValue,.      
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f       -1, SQLITE_
1ad0: 53 54 41 54 49 43 29 3b 0a 7d 0a 69 6e 74 20 64  STATIC);.}.int d
1ae0: 62 5f 62 69 6e 64 5f 6e 75 6c 6c 28 53 74 6d 74  b_bind_null(Stmt
1af0: 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63   *pStmt, const c
1b00: 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 29  har *zParamName)
1b10: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1b20: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
1b30: 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d  mt->pStmt, param
1b40: 49 64 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61  Idx(pStmt, zPara
1b50: 6d 4e 61 6d 65 29 29 3b 0a 7d 0a 69 6e 74 20 64  mName));.}.int d
1b60: 62 5f 62 69 6e 64 5f 62 6c 6f 62 28 53 74 6d 74  b_bind_blob(Stmt
1b70: 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63   *pStmt, const c
1b80: 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c  har *zParamName,
1b90: 20 42 6c 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a 20   Blob *pBlob){. 
1ba0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
1bb0: 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2d  bind_blob(pStmt-
1bc0: 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d 49 64 78  >pStmt, paramIdx
1bd0: 28 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61  (pStmt, zParamNa
1be0: 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
1c00: 6c 6f 62 5f 62 75 66 66 65 72 28 70 42 6c 6f 62  lob_buffer(pBlob
1c10: 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 70 42 6c  ), blob_size(pBl
1c20: 6f 62 29 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  ob), SQLITE_STAT
1c30: 49 43 29 3b 0a 7d 0a 0a 2f 2a 20 62 69 6e 64 5f  IC);.}../* bind_
1c40: 73 74 72 28 29 20 74 72 65 61 74 73 20 61 20 42  str() treats a B
1c50: 6c 6f 62 20 6f 62 6a 65 63 74 20 6c 69 6b 65 20  lob object like 
1c60: 61 20 54 45 58 54 20 73 74 72 69 6e 67 20 61 6e  a TEXT string an
1c70: 64 20 62 69 6e 64 73 20 69 74 0a 2a 2a 20 74 6f  d binds it.** to
1c80: 20 74 68 65 20 53 51 4c 20 76 61 72 69 61 62 6c   the SQL variabl
1c90: 65 2e 20 20 43 6f 6e 73 74 72 61 73 74 20 74 68  e.  Constrast th
1ca0: 69 73 20 74 6f 20 62 69 6e 64 5f 62 6c 6f 62 28  is to bind_blob(
1cb0: 29 20 77 68 69 63 68 20 74 72 65 61 74 73 0a 2a  ) which treats.*
1cc0: 2a 20 74 68 65 20 42 6c 6f 62 20 6f 62 6a 65 63  * the Blob objec
1cd0: 74 20 6c 69 6b 65 20 61 6e 20 53 51 4c 20 42 4c  t like an SQL BL
1ce0: 4f 42 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 62 69  OB..*/.int db_bi
1cf0: 6e 64 5f 73 74 72 28 53 74 6d 74 20 2a 70 53 74  nd_str(Stmt *pSt
1d00: 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  mt, const char *
1d10: 7a 50 61 72 61 6d 4e 61 6d 65 2c 20 42 6c 6f 62  zParamName, Blob
1d20: 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 72 65 74 75   *pBlob){.  retu
1d30: 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  rn sqlite3_bind_
1d40: 74 65 78 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d  text(pStmt->pStm
1d50: 74 2c 20 70 61 72 61 6d 49 64 78 28 70 53 74 6d  t, paramIdx(pStm
1d60: 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29 2c 0a  t, zParamName),.
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 62            blob_b
1d90: 75 66 66 65 72 28 70 42 6c 6f 62 29 2c 20 62 6c  uffer(pBlob), bl
1da0: 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62 29 2c 20  ob_size(pBlob), 
1db0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
1dc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
1dd0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
1de0: 20 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20    Return either 
1df0: 53 51 4c 49 54 45 5f 52 4f 57 20 6f 72 20 61 6e  SQLITE_ROW or an
1e00: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 6f   error code.** o
1e10: 72 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  r SQLITE_OK if t
1e20: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 66 69 6e  he statement fin
1e30: 69 73 68 65 73 20 73 75 63 63 65 73 73 66 75 6c  ishes successful
1e40: 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 73 74  ly..*/.int db_st
1e50: 65 70 28 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b  ep(Stmt *pStmt){
1e60: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
1e70: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
1e80: 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Stmt->pStmt);.  
1e90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ea0: 0a 2a 2a 20 52 65 73 65 74 20 6f 72 20 66 69 6e  .** Reset or fin
1eb0: 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e  alize a statemen
1ec0: 74 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 72 65 73  t..*/.int db_res
1ed0: 65 74 28 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b  et(Stmt *pStmt){
1ee0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
1ef0: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 2d  te3_reset(pStmt-
1f00: 3e 70 53 74 6d 74 29 3b 0a 20 20 64 62 5f 63 68  >pStmt);.  db_ch
1f10: 65 63 6b 5f 72 65 73 75 6c 74 28 72 63 29 3b 0a  eck_result(rc);.
1f20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
1f30: 6e 74 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 53  nt db_finalize(S
1f40: 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69  tmt *pStmt){.  i
1f50: 6e 74 20 72 63 3b 0a 20 20 62 6c 6f 62 5f 72 65  nt rc;.  blob_re
1f60: 73 65 74 28 26 70 53 74 6d 74 2d 3e 73 71 6c 29  set(&pStmt->sql)
1f70: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1f80: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 2d  _finalize(pStmt-
1f90: 3e 70 53 74 6d 74 29 3b 0a 20 20 64 62 5f 63 68  >pStmt);.  db_ch
1fa0: 65 63 6b 5f 72 65 73 75 6c 74 28 72 63 29 3b 0a  eck_result(rc);.
1fb0: 20 20 70 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d    pStmt->pStmt =
1fc0: 20 30 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 2d   0;.  if( pStmt-
1fd0: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 53  >pNext ){.    pS
1fe0: 74 6d 74 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  tmt->pNext->pPre
1ff0: 76 20 3d 20 70 53 74 6d 74 2d 3e 70 50 72 65 76  v = pStmt->pPrev
2000: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 74 6d  ;.  }.  if( pStm
2010: 74 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  t->pPrev ){.    
2020: 70 53 74 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e  pStmt->pPrev->pN
2030: 65 78 74 20 3d 20 70 53 74 6d 74 2d 3e 70 4e 65  ext = pStmt->pNe
2040: 78 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  xt;.  }else if( 
2050: 70 41 6c 6c 53 74 6d 74 3d 3d 70 53 74 6d 74 20  pAllStmt==pStmt 
2060: 29 7b 0a 20 20 20 20 70 41 6c 6c 53 74 6d 74 20  ){.    pAllStmt 
2070: 3d 20 70 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a  = pStmt->pNext;.
2080: 20 20 7d 0a 20 20 70 53 74 6d 74 2d 3e 70 4e 65    }.  pStmt->pNe
2090: 78 74 20 3d 20 30 3b 0a 20 20 70 53 74 6d 74 2d  xt = 0;.  pStmt-
20a0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 72 65  >pPrev = 0;.  re
20b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77  * Return the row
20d0: 69 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  id of the most r
20e0: 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a  ecent insert.*/.
20f0: 69 36 34 20 64 62 5f 6c 61 73 74 5f 69 6e 73 65  i64 db_last_inse
2100: 72 74 5f 72 6f 77 69 64 28 76 6f 69 64 29 7b 0a  rt_rowid(void){.
2110: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2120: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
2130: 69 64 28 67 2e 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a  id(g.db);.}../*.
2140: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
2150: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61  mber of rows tha
2160: 74 20 77 65 72 65 20 63 68 61 6e 67 65 64 20 62  t were changed b
2170: 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  y the most recen
2180: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
2190: 41 54 45 2c 20 6f 72 20 44 45 4c 45 54 45 2e 20  ATE, or DELETE. 
21a0: 20 41 75 78 69 6c 69 61 72 79 20 63 68 61 6e 67   Auxiliary chang
21b0: 65 73 20 63 61 75 73 65 64 20 62 79 20 74 72 69  es caused by tri
21c0: 67 67 65 72 73 0a 2a 2a 20 6f 72 20 6f 74 68 65  ggers.** or othe
21d0: 72 20 73 69 64 65 20 65 66 66 65 63 74 73 20 61  r side effects a
21e0: 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a  re not counted..
21f0: 2a 2f 0a 69 6e 74 20 64 62 5f 63 68 61 6e 67 65  */.int db_change
2200: 73 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  s(void){.  retur
2210: 6e 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  n sqlite3_change
2220: 73 28 67 2e 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  s(g.db);.}../*.*
2230: 2a 20 45 78 74 72 61 63 74 20 74 65 78 74 2c 20  * Extract text, 
2240: 69 6e 74 65 67 65 72 2c 20 6f 72 20 62 6c 6f 62  integer, or blob
2250: 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65   values from the
2260: 20 4e 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   N-th column of 
2270: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 72  the.** current r
2280: 6f 77 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 63 6f  ow..*/.int db_co
2290: 6c 75 6d 6e 5f 62 79 74 65 73 28 53 74 6d 74 20  lumn_bytes(Stmt 
22a0: 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a  *pStmt, int N){.
22b0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
22c0: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
22d0: 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a  tmt->pStmt, N);.
22e0: 7d 0a 69 6e 74 20 64 62 5f 63 6f 6c 75 6d 6e 5f  }.int db_column_
22f0: 69 6e 74 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c  int(Stmt *pStmt,
2300: 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 74 75 72   int N){.  retur
2310: 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  n sqlite3_column
2320: 5f 69 6e 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d  _int(pStmt->pStm
2330: 74 2c 20 4e 29 3b 0a 7d 0a 69 36 34 20 64 62 5f  t, N);.}.i64 db_
2340: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 53 74 6d  column_int64(Stm
2350: 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29  t *pStmt, int N)
2360: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2370: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
2380: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29  pStmt->pStmt, N)
2390: 3b 0a 7d 0a 64 6f 75 62 6c 65 20 64 62 5f 63 6f  ;.}.double db_co
23a0: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 53 74 6d 74  lumn_double(Stmt
23b0: 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b   *pStmt, int N){
23c0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
23d0: 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
23e0: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29  pStmt->pStmt, N)
23f0: 3b 0a 7d 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.}.const char *
2400: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 53  db_column_text(S
2410: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20  tmt *pStmt, int 
2420: 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 63 68  N){.  return (ch
2430: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
2440: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2d 3e 70  mn_text(pStmt->p
2450: 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 63 6f 6e 73  Stmt, N);.}.cons
2460: 74 20 63 68 61 72 20 2a 64 62 5f 63 6f 6c 75 6d  t char *db_colum
2470: 6e 5f 6e 61 6d 65 28 53 74 6d 74 20 2a 70 53 74  n_name(Stmt *pSt
2480: 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65  mt, int N){.  re
2490: 74 75 72 6e 20 28 63 68 61 72 2a 29 73 71 6c 69  turn (char*)sqli
24a0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
24b0: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29  pStmt->pStmt, N)
24c0: 3b 0a 7d 0a 69 6e 74 20 64 62 5f 63 6f 6c 75 6d  ;.}.int db_colum
24d0: 6e 5f 63 6f 75 6e 74 28 53 74 6d 74 20 2a 70 53  n_count(Stmt *pS
24e0: 74 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  tmt){.  return s
24f0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
2500: 75 6e 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74  unt(pStmt->pStmt
2510: 29 3b 0a 7d 0a 63 68 61 72 20 2a 64 62 5f 63 6f  );.}.char *db_co
2520: 6c 75 6d 6e 5f 6d 61 6c 6c 6f 63 28 53 74 6d 74  lumn_malloc(Stmt
2530: 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b   *pStmt, int N){
2540: 0a 20 20 72 65 74 75 72 6e 20 6d 70 72 69 6e 74  .  return mprint
2550: 66 28 22 25 73 22 2c 20 64 62 5f 63 6f 6c 75 6d  f("%s", db_colum
2560: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 4e 29  n_text(pStmt, N)
2570: 29 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 63 6f 6c  );.}.void db_col
2580: 75 6d 6e 5f 62 6c 6f 62 28 53 74 6d 74 20 2a 70  umn_blob(Stmt *p
2590: 53 74 6d 74 2c 20 69 6e 74 20 4e 2c 20 42 6c 6f  Stmt, int N, Blo
25a0: 62 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 62 6c 6f  b *pBlob){.  blo
25b0: 62 5f 61 70 70 65 6e 64 28 70 42 6c 6f 62 2c 20  b_append(pBlob, 
25c0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
25d0: 6c 6f 62 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74  lob(pStmt->pStmt
25e0: 2c 20 4e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , N),.          
25f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
2600: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2d 3e  mn_bytes(pStmt->
2610: 70 53 74 6d 74 2c 20 4e 29 29 3b 0a 7d 0a 0a 2f  pStmt, N));.}../
2620: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
2630: 61 20 62 6c 6f 62 20 74 6f 20 61 6e 20 65 70 68  a blob to an eph
2640: 65 72 6d 65 72 61 6c 20 63 6f 70 79 20 6f 66 20  ermeral copy of 
2650: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
2660: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  .** column in th
2670: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 20  e current row.  
2680: 54 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20  The data in the 
2690: 62 6c 6f 62 20 77 69 6c 6c 20 62 65 63 6f 6d 65  blob will become
26a0: 0a 2a 2a 20 69 6e 76 61 6c 69 64 20 77 68 65 6e  .** invalid when
26b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
26c0: 73 20 73 74 65 70 70 65 64 20 6f 72 20 72 65 73  s stepped or res
26d0: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 65  et..*/.void db_e
26e0: 70 68 65 6d 65 72 61 6c 5f 62 6c 6f 62 28 53 74  phemeral_blob(St
26f0: 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e  mt *pStmt, int N
2700: 2c 20 42 6c 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a  , Blob *pBlob){.
2710: 20 20 62 6c 6f 62 5f 69 6e 69 74 28 70 42 6c 6f    blob_init(pBlo
2720: 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  b, sqlite3_colum
2730: 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2d 3e 70 53  n_blob(pStmt->pS
2740: 74 6d 74 2c 20 4e 29 2c 0a 20 20 20 20 20 20 20  tmt, N),.       
2750: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
2760: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
2770: 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 29 3b 0a 7d  t->pStmt, N));.}
2780: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20  ../*.** Check a 
2790: 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 49 66  result code.  If
27a0: 20 69 74 20 69 73 20 6e 6f 74 20 53 51 4c 49 54   it is not SQLIT
27b0: 45 5f 4f 4b 2c 20 70 72 69 6e 74 20 74 68 65 0a  E_OK, print the.
27c0: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
27d0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
27e0: 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 76 6f 69 64  nd exit..*/.void
27f0: 20 64 62 5f 63 68 65 63 6b 5f 72 65 73 75 6c 74   db_check_result
2800: 28 69 6e 74 20 72 63 29 7b 0a 20 20 69 66 28 20  (int rc){.  if( 
2810: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2820: 0a 20 20 20 20 64 62 5f 65 72 72 28 22 53 51 4c  .    db_err("SQL
2830: 20 65 72 72 6f 72 3a 20 25 73 22 2c 20 73 71 6c   error: %s", sql
2840: 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62  ite3_errmsg(g.db
2850: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
2860: 20 45 78 65 63 75 74 65 20 61 20 73 69 6e 67 6c   Execute a singl
2870: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
2880: 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74 20 66 69  ment until it fi
2890: 6e 69 73 68 65 73 2e 0a 2a 2f 0a 69 6e 74 20 64  nishes..*/.int d
28a0: 62 5f 65 78 65 63 28 53 74 6d 74 20 2a 70 53 74  b_exec(Stmt *pSt
28b0: 6d 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  mt){.  int rc;. 
28c0: 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 64 62   while( (rc = db
28d0: 5f 73 74 65 70 28 70 53 74 6d 74 29 29 3d 3d 53  _step(pStmt))==S
28e0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 7d 0a 20 20  QLITE_ROW ){}.  
28f0: 72 63 20 3d 20 64 62 5f 72 65 73 65 74 28 70 53  rc = db_reset(pS
2900: 74 6d 74 29 3b 0a 20 20 64 62 5f 63 68 65 63 6b  tmt);.  db_check
2910: 5f 72 65 73 75 6c 74 28 72 63 29 3b 0a 20 20 72  _result(rc);.  r
2920: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2930: 2a 2a 20 45 78 65 63 75 74 65 20 6d 75 6c 74 69  ** Execute multi
2940: 70 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ple SQL statemen
2950: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 6d 75  ts..*/.int db_mu
2960: 6c 74 69 5f 65 78 65 63 28 63 6f 6e 73 74 20 63  lti_exec(const c
2970: 68 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b  har *zSql, ...){
2980: 0a 20 20 42 6c 6f 62 20 73 71 6c 3b 0a 20 20 69  .  Blob sql;.  i
2990: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 6c 69 73 74  nt rc;.  va_list
29a0: 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   ap;.  char *zEr
29b0: 72 20 3d 20 30 3b 0a 20 20 62 6c 6f 62 5f 69 6e  r = 0;.  blob_in
29c0: 69 74 28 26 73 71 6c 2c 20 30 2c 20 30 29 3b 0a  it(&sql, 0, 0);.
29d0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
29e0: 53 71 6c 29 3b 0a 20 20 62 6c 6f 62 5f 76 61 70  Sql);.  blob_vap
29f0: 70 65 6e 64 66 28 26 73 71 6c 2c 20 7a 53 71 6c  pendf(&sql, zSql
2a00: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
2a10: 61 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ap);.  rc = sqli
2a20: 74 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 62  te3_exec(g.db, b
2a30: 6c 6f 62 5f 62 75 66 66 65 72 28 26 73 71 6c 29  lob_buffer(&sql)
2a40: 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a  , 0, 0, &zErr);.
2a50: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a60: 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 5f 65 72  _OK ){.    db_er
2a70: 72 28 22 25 73 5c 6e 25 73 22 2c 20 7a 45 72 72  r("%s\n%s", zErr
2a80: 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 73  , blob_buffer(&s
2a90: 71 6c 29 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62  ql));.  }.  blob
2aa0: 5f 72 65 73 65 74 28 26 73 71 6c 29 3b 0a 20 20  _reset(&sql);.  
2ab0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2ac0: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71 75  .** Execute a qu
2ad0: 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ery and return a
2ae0: 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
2af0: 76 61 6c 75 65 2e 0a 2a 2f 0a 69 36 34 20 64 62  value..*/.i64 db
2b00: 5f 69 6e 74 36 34 28 69 36 34 20 69 44 66 6c 74  _int64(i64 iDflt
2b10: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
2b20: 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  ql, ...){.  va_l
2b30: 69 73 74 20 61 70 3b 0a 20 20 53 74 6d 74 20 73  ist ap;.  Stmt s
2b40: 3b 0a 20 20 69 36 34 20 72 63 3b 0a 20 20 76 61  ;.  i64 rc;.  va
2b50: 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29  _start(ap, zSql)
2b60: 3b 0a 20 20 64 62 5f 76 70 72 65 70 61 72 65 28  ;.  db_vprepare(
2b70: 26 73 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20  &s, zSql, ap);. 
2b80: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
2b90: 66 28 20 64 62 5f 73 74 65 70 28 26 73 29 21 3d  f( db_step(&s)!=
2ba0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
2bb0: 20 20 72 63 20 3d 20 69 44 66 6c 74 3b 0a 20 20    rc = iDflt;.  
2bc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2bd0: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  db_column_int64(
2be0: 26 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62  &s, 0);.  }.  db
2bf0: 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 20  _finalize(&s);. 
2c00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
2c10: 74 20 64 62 5f 69 6e 74 28 69 6e 74 20 69 44 66  t db_int(int iDf
2c20: 6c 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  lt, const char *
2c30: 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  zSql, ...){.  va
2c40: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d 74  _list ap;.  Stmt
2c50: 20 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   s;.  int rc;.  
2c60: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 71  va_start(ap, zSq
2c70: 6c 29 3b 0a 20 20 64 62 5f 76 70 72 65 70 61 72  l);.  db_vprepar
2c80: 65 28 26 73 2c 20 7a 53 71 6c 2c 20 61 70 29 3b  e(&s, zSql, ap);
2c90: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
2ca0: 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 73 29   if( db_step(&s)
2cb0: 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  !=SQLITE_ROW ){.
2cc0: 20 20 20 20 72 63 20 3d 20 69 44 66 6c 74 3b 0a      rc = iDflt;.
2cd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2ce0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  = db_column_int(
2cf0: 26 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62  &s, 0);.  }.  db
2d00: 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 20  _finalize(&s);. 
2d10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d20: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2d30: 20 69 66 20 74 68 65 20 71 75 65 72 79 20 77 6f   if the query wo
2d40: 75 6c 64 20 72 65 74 75 72 6e 20 31 20 6f 72 20  uld return 1 or 
2d50: 6d 6f 72 65 20 72 6f 77 73 2e 20 20 52 65 74 75  more rows.  Retu
2d60: 72 6e 0a 2a 2a 20 46 41 4c 53 45 20 69 66 20 74  rn.** FALSE if t
2d70: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  he query result 
2d80: 77 6f 75 6c 64 20 62 65 20 61 6e 20 65 6d 70 74  would be an empt
2d90: 79 20 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 64 62  y set..*/.int db
2da0: 5f 65 78 69 73 74 73 28 63 6f 6e 73 74 20 63 68  _exists(const ch
2db0: 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a  ar *zSql, ...){.
2dc0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
2dd0: 53 74 6d 74 20 73 3b 0a 20 20 69 6e 74 20 72 63  Stmt s;.  int rc
2de0: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
2df0: 20 7a 53 71 6c 29 3b 0a 20 20 64 62 5f 76 70 72   zSql);.  db_vpr
2e00: 65 70 61 72 65 28 26 73 2c 20 7a 53 71 6c 2c 20  epare(&s, zSql, 
2e10: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
2e20: 29 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70  );.  if( db_step
2e30: 28 26 73 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57  (&s)!=SQLITE_ROW
2e40: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
2e50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2e60: 3d 20 31 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69  = 1;.  }.  db_fi
2e70: 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20 72 65  nalize(&s);.  re
2e80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2e90: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65  ** Execute a que
2ea0: 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  ry and return a 
2eb0: 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 76  floating-point v
2ec0: 61 6c 75 65 2e 0a 2a 2f 0a 64 6f 75 62 6c 65 20  alue..*/.double 
2ed0: 64 62 5f 64 6f 75 62 6c 65 28 64 6f 75 62 6c 65  db_double(double
2ee0: 20 72 44 66 6c 74 2c 20 63 6f 6e 73 74 20 63 68   rDflt, const ch
2ef0: 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a  ar *zSql, ...){.
2f00: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
2f10: 53 74 6d 74 20 73 3b 0a 20 20 64 6f 75 62 6c 65  Stmt s;.  double
2f20: 20 72 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61   r;.  va_start(a
2f30: 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 64 62 5f 76  p, zSql);.  db_v
2f40: 70 72 65 70 61 72 65 28 26 73 2c 20 7a 53 71 6c  prepare(&s, zSql
2f50: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
2f60: 61 70 29 3b 0a 20 20 69 66 28 20 64 62 5f 73 74  ap);.  if( db_st
2f70: 65 70 28 26 73 29 21 3d 53 51 4c 49 54 45 5f 52  ep(&s)!=SQLITE_R
2f80: 4f 57 20 29 7b 0a 20 20 20 20 72 20 3d 20 72 44  OW ){.    r = rD
2f90: 66 6c 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  flt;.  }else{.  
2fa0: 20 20 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f    r = db_column_
2fb0: 64 6f 75 62 6c 65 28 26 73 2c 20 30 29 3b 0a 20  double(&s, 0);. 
2fc0: 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65   }.  db_finalize
2fd0: 28 26 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (&s);.  return r
2fe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
2ff0: 74 65 20 61 20 71 75 65 72 79 20 61 6e 64 20 61  te a query and a
3000: 70 70 65 6e 64 20 74 68 65 20 66 69 72 73 74 20  ppend the first 
3010: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69  column of the fi
3020: 72 73 74 20 72 6f 77 0a 2a 2a 20 6f 66 20 74 68  rst row.** of th
3030: 65 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20  e result set to 
3040: 62 6c 6f 62 20 67 69 76 65 6e 20 69 6e 20 74 68  blob given in th
3050: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
3060: 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 62 6c 6f  ..*/.void db_blo
3070: 62 28 42 6c 6f 62 20 2a 70 52 65 73 75 6c 74 2c  b(Blob *pResult,
3080: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
3090: 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  l, ...){.  va_li
30a0: 73 74 20 61 70 3b 0a 20 20 53 74 6d 74 20 73 3b  st ap;.  Stmt s;
30b0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
30c0: 7a 53 71 6c 29 3b 0a 20 20 64 62 5f 76 70 72 65  zSql);.  db_vpre
30d0: 70 61 72 65 28 26 73 2c 20 7a 53 71 6c 2c 20 61  pare(&s, zSql, a
30e0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
30f0: 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70 28  ;.  if( db_step(
3100: 26 73 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &s)==SQLITE_ROW 
3110: 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  ){.    blob_appe
3120: 6e 64 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69  nd(pResult, sqli
3130: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
3140: 73 2e 70 53 74 6d 74 2c 20 30 29 2c 0a 20 20 20  s.pStmt, 0),.   
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
3170: 6c 75 6d 6e 5f 62 79 74 65 73 28 73 2e 70 53 74  lumn_bytes(s.pSt
3180: 6d 74 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20 64  mt, 0));.  }.  d
3190: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a  b_finalize(&s);.
31a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
31b0: 20 61 20 71 75 65 72 79 2e 20 20 52 65 74 75 72   a query.  Retur
31c0: 6e 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75  n the first colu
31d0: 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  mn of the first 
31e0: 72 6f 77 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65  row.** of the re
31f0: 73 75 6c 74 20 73 65 74 20 61 73 20 61 20 73 74  sult set as a st
3200: 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20  ring.  Space to 
3210: 68 6f 6c 64 20 74 68 65 20 73 74 72 69 6e 67 20  hold the string 
3220: 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  is.** obtained f
3230: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 49  rom malloc().  I
3240: 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
3250: 20 69 73 20 65 6d 70 74 79 2c 20 72 65 74 75 72   is empty, retur
3260: 6e 0a 2a 2a 20 7a 44 65 66 61 75 6c 74 20 69 6e  n.** zDefault in
3270: 73 74 65 61 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stead..*/.char *
3280: 64 62 5f 74 65 78 74 28 63 68 61 72 20 2a 7a 44  db_text(char *zD
3290: 65 66 61 75 6c 74 2c 20 63 6f 6e 73 74 20 63 68  efault, const ch
32a0: 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a  ar *zSql, ...){.
32b0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
32c0: 53 74 6d 74 20 73 3b 0a 20 20 63 68 61 72 20 2a  Stmt s;.  char *
32d0: 7a 20 3d 20 7a 44 65 66 61 75 6c 74 3b 0a 20 20  z = zDefault;.  
32e0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 71  va_start(ap, zSq
32f0: 6c 29 3b 0a 20 20 64 62 5f 76 70 72 65 70 61 72  l);.  db_vprepar
3300: 65 28 26 73 2c 20 7a 53 71 6c 2c 20 61 70 29 3b  e(&s, zSql, ap);
3310: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
3320: 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 73 29   if( db_step(&s)
3330: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
3340: 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28      z = mprintf(
3350: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  "%s", sqlite3_co
3360: 6c 75 6d 6e 5f 74 65 78 74 28 73 2e 70 53 74 6d  lumn_text(s.pStm
3370: 74 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20 64 62  t, 0));.  }.  db
3380: 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 20  _finalize(&s);. 
3390: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
33a0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
33b0: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 66 69   new database fi
33c0: 6c 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65  le with the give
33d0: 6e 20 73 63 68 65 6d 61 2e 20 20 49 66 20 61 6e  n schema.  If an
33e0: 79 74 68 69 6e 67 0a 2a 2a 20 67 6f 65 73 20 77  ything.** goes w
33f0: 72 6f 6e 67 2c 20 63 61 6c 6c 20 64 62 5f 65 72  rong, call db_er
3400: 72 28 29 20 74 6f 20 65 78 69 74 2e 0a 2a 2f 0a  r() to exit..*/.
3410: 76 6f 69 64 20 64 62 5f 69 6e 69 74 5f 64 61 74  void db_init_dat
3420: 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63  abase(.  const c
3430: 68 61 72 20 2a 7a 46 69 6c 65 4e 61 6d 65 2c 20  har *zFileName, 
3440: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74    /* Name of dat
3450: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 72  abase file to cr
3460: 65 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  eate */.  const 
3470: 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c 20 20  char *zSchema,  
3480: 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
3490: 20 6f 66 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20   of schema */.  
34a0: 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
34b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 69           /* Addi
34c0: 74 69 6f 6e 61 6c 20 53 51 4c 20 74 6f 20 72 75  tional SQL to ru
34d0: 6e 2e 20 20 54 65 72 6d 69 6e 61 74 65 20 77 69  n.  Terminate wi
34e0: 74 68 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20  th NULL. */.){. 
34f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
3500: 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
3510: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 76 61  char *zSql;.  va
3520: 5f 6c 69 73 74 20 61 70 3b 0a 0a 20 20 72 63 20  _list ap;..  rc 
3530: 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
3540: 46 69 6c 65 4e 61 6d 65 2c 20 26 64 62 29 3b 0a  FileName, &db);.
3550: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3560: 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 5f 65 72  _OK ){.    db_er
3570: 72 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  r(sqlite3_errmsg
3580: 28 64 62 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  (db));.  }.  sql
3590: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 42  ite3_exec(db, "B
35a0: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22 2c  EGIN EXCLUSIVE",
35b0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 72 63 20   0, 0, 0);.  rc 
35c0: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
35d0: 62 2c 20 7a 53 63 68 65 6d 61 2c 20 30 2c 20 30  b, zSchema, 0, 0
35e0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
35f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3600: 20 64 62 5f 65 72 72 28 73 71 6c 69 74 65 33 5f   db_err(sqlite3_
3610: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d  errmsg(db));.  }
3620: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
3630: 7a 53 63 68 65 6d 61 29 3b 0a 20 20 77 68 69 6c  zSchema);.  whil
3640: 65 28 20 28 7a 53 71 6c 20 3d 20 76 61 5f 61 72  e( (zSql = va_ar
3650: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
3660: 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  *))!=0 ){.    rc
3670: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
3680: 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  db, zSql, 0, 0, 
3690: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
36a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36b0: 20 20 20 64 62 5f 65 72 72 28 73 71 6c 69 74 65     db_err(sqlite
36c0: 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
36d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
36e0: 64 28 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  d(ap);.  sqlite3
36f0: 5f 65 78 65 63 28 64 62 2c 20 22 43 4f 4d 4d 49  _exec(db, "COMMI
3700: 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  T", 0, 0, 0);.  
3710: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
3720: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a 44 62 4e  );.}../*.** zDbN
3730: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
3740: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  of a database fi
3750: 6c 65 2e 20 20 49 66 20 6e 6f 20 6f 74 68 65 72  le.  If no other
3760: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
3770: 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20  e is open, then 
3780: 6f 70 65 6e 20 74 68 69 73 20 6f 6e 65 2e 20 20  open this one.  
3790: 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
37a0: 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 61  ase file is.** a
37b0: 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
37c0: 6e 20 61 74 74 61 63 68 20 7a 44 62 4e 61 6d 65  n attach zDbName
37d0: 20 75 73 69 6e 67 20 74 68 65 20 6e 61 6d 65 20   using the name 
37e0: 7a 4c 61 62 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  zLabel..*/.void 
37f0: 64 62 5f 6f 70 65 6e 5f 6f 72 5f 61 74 74 61 63  db_open_or_attac
3800: 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  h(const char *zD
3810: 62 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  bName, const cha
3820: 72 20 2a 7a 4c 61 62 65 6c 29 7b 0a 20 20 69 66  r *zLabel){.  if
3830: 28 20 21 67 2e 64 62 20 29 7b 0a 20 20 20 20 69  ( !g.db ){.    i
3840: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
3850: 6f 70 65 6e 28 7a 44 62 4e 61 6d 65 2c 20 26 67  open(zDbName, &g
3860: 2e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63  .db);.    if( rc
3870: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
3880: 20 20 20 20 20 64 62 5f 65 72 72 28 73 71 6c 69       db_err(sqli
3890: 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29  te3_errmsg(g.db)
38a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f  );.    }.    db_
38b0: 63 6f 6e 6e 65 63 74 69 6f 6e 5f 69 6e 69 74 28  connection_init(
38c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
38d0: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 41  db_multi_exec("A
38e0: 54 54 41 43 48 20 44 41 54 41 42 41 53 45 20 25  TTACH DATABASE %
38f0: 51 20 41 53 20 25 73 22 2c 20 7a 44 62 4e 61 6d  Q AS %s", zDbNam
3900: 65 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 7d 0a  e, zLabel);.  }.
3910: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
3920: 65 20 75 73 65 72 20 64 61 74 61 62 61 73 65 20  e user database 
3930: 69 6e 20 22 7e 2f 2e 66 6f 73 73 69 6c 22 2e 20  in "~/.fossil". 
3940: 20 43 72 65 61 74 65 20 74 68 65 20 64 61 74 61   Create the data
3950: 62 61 73 65 20 61 6e 65 77 20 69 66 0a 2a 2a 20  base anew if.** 
3960: 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
3970: 61 64 79 20 65 78 69 73 74 2e 0a 2a 2f 0a 76 6f  ady exist..*/.vo
3980: 69 64 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e 66 69  id db_open_confi
3990: 67 28 76 6f 69 64 29 7b 0a 20 20 63 68 61 72 20  g(void){.  char 
39a0: 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  *zDbName;.  cons
39b0: 74 20 63 68 61 72 20 2a 7a 48 6f 6d 65 3b 0a 20  t char *zHome;. 
39c0: 20 69 66 28 20 67 2e 63 6f 6e 66 69 67 4f 70 65   if( g.configOpe
39d0: 6e 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64  n ) return;.#ifd
39e0: 65 66 20 5f 5f 4d 49 4e 47 57 33 32 5f 5f 0a 20  ef __MINGW32__. 
39f0: 20 7a 48 6f 6d 65 20 3d 20 67 65 74 65 6e 76 28   zHome = getenv(
3a00: 22 4c 4f 43 41 4c 41 50 50 44 41 54 41 22 29 3b  "LOCALAPPDATA");
3a10: 0a 20 20 69 66 28 20 7a 48 6f 6d 65 3d 3d 30 20  .  if( zHome==0 
3a20: 29 7b 0a 20 20 20 20 7a 48 6f 6d 65 20 3d 20 67  ){.    zHome = g
3a30: 65 74 65 6e 76 28 22 41 50 50 44 41 54 41 22 29  etenv("APPDATA")
3a40: 3b 0a 20 20 20 20 69 66 28 20 7a 48 6f 6d 65 3d  ;.    if( zHome=
3a50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 48 6f 6d  =0 ){.      zHom
3a60: 65 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45  e = getenv("HOME
3a70: 50 41 54 48 22 29 3b 0a 20 20 20 20 7d 0a 20 20  PATH");.    }.  
3a80: 7d 0a 23 65 6c 73 65 0a 20 20 7a 48 6f 6d 65 20  }.#else.  zHome 
3a90: 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d 45 22 29  = getenv("HOME")
3aa0: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a  ;.#endif.  if( z
3ab0: 48 6f 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64  Home==0 ){.    d
3ac0: 62 5f 65 72 72 28 22 63 61 6e 6e 6f 74 20 6c 6f  b_err("cannot lo
3ad0: 63 61 6c 20 68 6f 6d 65 20 64 69 72 65 63 74 6f  cal home directo
3ae0: 72 79 22 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  ry");.  }.#ifdef
3af0: 20 5f 5f 4d 49 4e 47 57 33 32 5f 5f 0a 20 20 2f   __MINGW32__.  /
3b00: 2a 20 2e 20 66 69 6c 65 6e 61 6d 65 73 20 67 69  * . filenames gi
3b10: 76 65 20 73 6f 6d 65 20 77 69 6e 64 6f 77 20 73  ve some window s
3b20: 79 73 74 65 6d 73 20 70 72 6f 62 6c 65 6d 73 20  ystems problems 
3b30: 61 6e 64 20 6d 61 6e 79 20 61 70 70 73 20 70 72  and many apps pr
3b40: 6f 62 6c 65 6d 73 20 2a 2f 0a 20 20 7a 44 62 4e  oblems */.  zDbN
3b50: 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 25  ame = mprintf("%
3b60: 2f 2f 5f 66 6f 73 73 69 6c 22 2c 20 7a 48 6f 6d  //_fossil", zHom
3b70: 65 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 44 62 4e  e);.#else.  zDbN
3b80: 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 25  ame = mprintf("%
3b90: 73 2f 2e 66 6f 73 73 69 6c 22 2c 20 7a 48 6f 6d  s/.fossil", zHom
3ba0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  e);.#endif.  if(
3bb0: 20 66 69 6c 65 5f 73 69 7a 65 28 7a 44 62 4e 61   file_size(zDbNa
3bc0: 6d 65 29 3c 31 30 32 34 2a 33 20 29 7b 0a 20 20  me)<1024*3 ){.  
3bd0: 20 20 64 62 5f 69 6e 69 74 5f 64 61 74 61 62 61    db_init_databa
3be0: 73 65 28 7a 44 62 4e 61 6d 65 2c 20 7a 43 6f 6e  se(zDbName, zCon
3bf0: 66 69 67 53 63 68 65 6d 61 2c 20 28 63 68 61 72  figSchema, (char
3c00: 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 6f  *)0);.  }.  db_o
3c10: 70 65 6e 5f 6f 72 5f 61 74 74 61 63 68 28 7a 44  pen_or_attach(zD
3c20: 62 4e 61 6d 65 2c 20 22 63 6f 6e 66 69 67 64 62  bName, "configdb
3c30: 22 29 3b 0a 20 20 67 2e 63 6f 6e 66 69 67 4f 70  ");.  g.configOp
3c40: 65 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  en = 1;.}../*.**
3c50: 20 49 66 20 7a 44 62 4e 61 6d 65 20 69 73 20 61   If zDbName is a
3c60: 20 76 61 6c 69 64 20 6c 6f 63 61 6c 20 64 61 74   valid local dat
3c70: 61 62 61 73 65 20 66 69 6c 65 2c 20 6f 70 65 6e  abase file, open
3c80: 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a   it and return.*
3c90: 2a 20 74 72 75 65 2e 20 20 49 66 20 69 74 20 69  * true.  If it i
3ca0: 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6c 6f  s not a valid lo
3cb0: 63 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  cal database fil
3cc0: 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  e, return 0..*/.
3cd0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 56 61 6c  static int isVal
3ce0: 69 64 4c 6f 63 61 6c 44 62 28 63 6f 6e 73 74 20  idLocalDb(const 
3cf0: 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
3d00: 20 20 69 36 34 20 6c 73 69 7a 65 3b 0a 20 20 69    i64 lsize;.  i
3d10: 66 28 20 61 63 63 65 73 73 28 7a 44 62 4e 61 6d  f( access(zDbNam
3d20: 65 2c 20 46 5f 4f 4b 29 20 29 20 72 65 74 75 72  e, F_OK) ) retur
3d30: 6e 20 30 3b 0a 20 20 6c 73 69 7a 65 20 3d 20 66  n 0;.  lsize = f
3d40: 69 6c 65 5f 73 69 7a 65 28 7a 44 62 4e 61 6d 65  ile_size(zDbName
3d50: 29 3b 0a 20 20 69 66 28 20 6c 73 69 7a 65 25 31  );.  if( lsize%1
3d60: 30 32 34 21 3d 30 20 7c 7c 20 6c 73 69 7a 65 3c  024!=0 || lsize<
3d70: 34 30 39 36 20 29 20 72 65 74 75 72 6e 20 30 3b  4096 ) return 0;
3d80: 0a 20 20 64 62 5f 6f 70 65 6e 5f 6f 72 5f 61 74  .  db_open_or_at
3d90: 74 61 63 68 28 7a 44 62 4e 61 6d 65 2c 20 22 6c  tach(zDbName, "l
3da0: 6f 63 61 6c 64 62 22 29 3b 0a 20 20 67 2e 6c 6f  ocaldb");.  g.lo
3db0: 63 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 64  calOpen = 1;.  d
3dc0: 62 5f 6f 70 65 6e 5f 63 6f 6e 66 69 67 28 29 3b  b_open_config();
3dd0: 0a 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73  .  db_open_repos
3de0: 69 74 6f 72 79 28 30 29 3b 0a 20 20 72 65 74 75  itory(0);.  retu
3df0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn 1;.}../*.** L
3e00: 6f 63 61 74 65 20 74 68 65 20 72 6f 6f 74 20 64  ocate the root d
3e10: 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
3e20: 6c 6f 63 61 6c 20 72 65 70 6f 73 69 74 6f 72 79  local repository
3e30: 20 74 72 65 65 2e 20 20 54 68 65 20 72 6f 6f 74   tree.  The root
3e40: 0a 2a 2a 20 64 69 72 65 63 74 6f 72 79 20 69 73  .** directory is
3e50: 20 66 6f 75 6e 64 20 62 79 20 73 65 61 72 63 68   found by search
3e60: 69 6e 67 20 66 6f 72 20 61 20 66 69 6c 65 20 6e  ing for a file n
3e70: 61 6d 65 64 20 22 46 4f 53 53 49 4c 22 20 74 68  amed "FOSSIL" th
3e80: 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61  at contains.** a
3e90: 20 76 61 6c 69 64 20 72 65 70 6f 73 69 74 6f 72   valid repositor
3ea0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
3eb0: 2a 20 49 66 20 6e 6f 20 76 61 6c 69 64 20 46 4f  * If no valid FO
3ec0: 53 53 49 4c 20 66 69 6c 65 20 69 73 20 66 6f 75  SSIL file is fou
3ed0: 6e 64 2c 20 77 65 20 6d 6f 76 65 20 75 70 20 6f  nd, we move up o
3ee0: 6e 65 20 6c 65 76 65 6c 20 61 6e 64 20 74 72 79  ne level and try
3ef0: 20 61 67 61 69 6e 2e 0a 2a 2a 20 4f 6e 63 65 20   again..** Once 
3f00: 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
3f10: 64 2c 20 74 68 65 20 67 2e 7a 4c 6f 63 61 6c 52  d, the g.zLocalR
3f20: 6f 6f 74 20 76 61 72 69 61 62 6c 65 20 69 73 20  oot variable is 
3f30: 73 65 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  set to the root 
3f40: 6f 66 0a 2a 2a 20 74 68 65 20 72 65 70 6f 73 69  of.** the reposi
3f50: 74 6f 72 79 20 74 72 65 65 20 61 6e 64 20 74 68  tory tree and th
3f60: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
3f70: 6e 73 20 31 2e 20 20 49 66 20 6e 6f 20 64 61 74  ns 1.  If no dat
3f80: 61 62 61 73 65 20 69 73 0a 2a 2a 20 66 6f 75 6e  abase is.** foun
3f90: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  d, then this rou
3fa0: 74 69 6e 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  tine return 0..*
3fb0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3fc0: 65 20 61 6c 77 61 79 73 20 6f 70 65 6e 73 20 74  e always opens t
3fd0: 68 65 20 75 73 65 72 20 64 61 74 61 62 61 73 65  he user database
3fe0: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
3ff0: 68 65 74 68 65 72 20 6f 72 0a 2a 2a 20 6e 6f 74  hether or.** not
4000: 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20   the repository 
4010: 64 61 74 61 62 61 73 65 20 69 73 20 66 6f 75 6e  database is foun
4020: 64 2e 20 20 49 66 20 74 68 65 20 46 4f 53 53 49  d.  If the FOSSI
4030: 4c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2c  L file is found,
4040: 0a 2a 2a 20 69 74 20 69 73 20 61 74 74 61 63 68  .** it is attach
4050: 65 64 20 74 6f 20 74 68 65 20 6f 70 65 6e 20 64  ed to the open d
4060: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
4070: 6f 6e 20 74 6f 6f 2e 0a 2a 2f 0a 69 6e 74 20 64  on too..*/.int d
4080: 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 76 6f 69  b_open_local(voi
4090: 64 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  d){.  int n;.  c
40a0: 68 61 72 20 7a 50 77 64 5b 32 30 30 30 5d 3b 0a  har zPwd[2000];.
40b0: 20 20 63 68 61 72 20 2a 7a 50 77 64 43 6f 6e 76    char *zPwdConv
40c0: 3b 0a 20 20 69 66 28 20 67 2e 6c 6f 63 61 6c 4f  ;.  if( g.localO
40d0: 70 65 6e 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pen) return 1;. 
40e0: 20 69 66 28 20 67 65 74 63 77 64 28 7a 50 77 64   if( getcwd(zPwd
40f0: 2c 20 73 69 7a 65 6f 66 28 7a 50 77 64 29 2d 32  , sizeof(zPwd)-2
4100: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f  0)==0 ){.    db_
4110: 65 72 72 28 22 70 77 64 20 74 6f 6f 20 62 69 67  err("pwd too big
4120: 3a 20 6d 61 78 20 25 64 22 2c 20 73 69 7a 65 6f  : max %d", sizeo
4130: 66 28 7a 50 77 64 29 2d 32 30 29 3b 0a 20 20 7d  f(zPwd)-20);.  }
4140: 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50  .  n = strlen(zP
4150: 77 64 29 3b 0a 20 20 7a 50 77 64 43 6f 6e 76 20  wd);.  zPwdConv 
4160: 3d 20 6d 70 72 69 6e 74 66 28 22 25 2f 22 2c 20  = mprintf("%/", 
4170: 7a 50 77 64 29 3b 0a 20 20 73 74 72 6e 63 70 79  zPwd);.  strncpy
4180: 28 7a 50 77 64 2c 20 7a 50 77 64 43 6f 6e 76 2c  (zPwd, zPwdConv,
4190: 20 32 30 30 30 2d 32 30 29 3b 0a 20 20 66 72 65   2000-20);.  fre
41a0: 65 28 7a 50 77 64 43 6f 6e 76 29 3b 0a 20 20 77  e(zPwdConv);.  w
41b0: 68 69 6c 65 28 20 6e 3e 30 20 29 7b 0a 20 20 20  hile( n>0 ){.   
41c0: 20 69 66 28 20 61 63 63 65 73 73 28 7a 50 77 64   if( access(zPwd
41d0: 2c 20 57 5f 4f 4b 29 20 29 20 62 72 65 61 6b 3b  , W_OK) ) break;
41e0: 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 50 77  .    strcpy(&zPw
41f0: 64 5b 6e 5d 2c 20 22 2f 5f 46 4f 53 53 49 4c 5f  d[n], "/_FOSSIL_
4200: 22 29 3b 0a 20 20 20 20 69 66 28 20 69 73 56 61  ");.    if( isVa
4210: 6c 69 64 4c 6f 63 61 6c 44 62 28 7a 50 77 64 29  lidLocalDb(zPwd)
4220: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 75   ){.      /* Fou
4230: 6e 64 20 61 20 76 61 6c 69 64 20 5f 46 4f 53 53  nd a valid _FOSS
4240: 49 4c 5f 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  IL_ file */.    
4250: 20 20 7a 50 77 64 5b 6e 5d 20 3d 20 30 3b 0a 20    zPwd[n] = 0;. 
4260: 20 20 20 20 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f       g.zLocalRoo
4270: 74 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 2f  t = mprintf("%s/
4280: 22 2c 20 7a 50 77 64 29 3b 0a 20 20 20 20 20 20  ", zPwd);.      
4290: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
42a0: 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 77 68 69      n--;.    whi
42b0: 6c 65 28 20 6e 3e 30 20 26 26 20 7a 50 77 64 5b  le( n>0 && zPwd[
42c0: 6e 5d 21 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20  n]!='/' ){ n--; 
42d0: 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30  }.    while( n>0
42e0: 20 26 26 20 7a 50 77 64 5b 6e 2d 31 5d 3d 3d 27   && zPwd[n-1]=='
42f0: 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 20  /' ){ n--; }.   
4300: 20 7a 50 77 64 5b 6e 5d 20 3d 20 30 3b 0a 20 20   zPwd[n] = 0;.  
4310: 7d 0a 0a 20 20 2f 2a 20 41 20 5f 46 4f 53 53 49  }..  /* A _FOSSI
4320: 4c 5f 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  L_ file could no
4330: 74 20 62 65 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  t be found */.  
4340: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4350: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 72 65 70 6f  ** Open the repo
4360: 73 69 74 6f 72 79 20 64 61 74 61 62 61 73 65 20  sitory database 
4370: 67 69 76 65 6e 20 62 79 20 7a 44 62 4e 61 6d 65  given by zDbName
4380: 2e 20 20 49 66 20 7a 44 62 4e 61 6d 65 3d 3d 4e  .  If zDbName==N
4390: 55 4c 4c 20 74 68 65 6e 0a 2a 2a 20 67 65 74 20  ULL then.** get 
43a0: 74 68 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  the name from th
43b0: 65 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 6c  e already open l
43c0: 6f 63 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 2a  ocal database..*
43d0: 2f 0a 76 6f 69 64 20 64 62 5f 6f 70 65 6e 5f 72  /.void db_open_r
43e0: 65 70 6f 73 69 74 6f 72 79 28 63 6f 6e 73 74 20  epository(const 
43f0: 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
4400: 20 20 69 66 28 20 67 2e 72 65 70 6f 73 69 74 6f    if( g.reposito
4410: 72 79 4f 70 65 6e 20 29 20 72 65 74 75 72 6e 3b  ryOpen ) return;
4420: 0a 20 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d  .  if( zDbName==
4430: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 67 2e 6c  0 ){.    if( g.l
4440: 6f 63 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  ocalOpen ){.    
4450: 20 20 7a 44 62 4e 61 6d 65 20 3d 20 64 62 5f 6c    zDbName = db_l
4460: 67 65 74 28 22 72 65 70 6f 73 69 74 6f 72 79 22  get("repository"
4470: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
4480: 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29  if( zDbName==0 )
4490: 7b 0a 20 20 20 20 20 20 64 62 5f 65 72 72 28 22  {.      db_err("
44a0: 75 6e 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  unable to find t
44b0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 72 65 70  he name of a rep
44c0: 6f 73 69 74 6f 72 79 20 64 61 74 61 62 61 73 65  ository database
44d0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
44e0: 69 66 28 20 61 63 63 65 73 73 28 7a 44 62 4e 61  if( access(zDbNa
44f0: 6d 65 2c 20 52 5f 4f 4b 29 20 7c 7c 20 66 69 6c  me, R_OK) || fil
4500: 65 5f 73 69 7a 65 28 7a 44 62 4e 61 6d 65 29 3c  e_size(zDbName)<
4510: 31 30 32 34 20 29 7b 0a 20 20 20 20 69 66 28 20  1024 ){.    if( 
4520: 61 63 63 65 73 73 28 7a 44 62 4e 61 6d 65 2c 20  access(zDbName, 
4530: 30 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73  0) ){.      foss
4540: 69 6c 5f 70 61 6e 69 63 28 22 72 65 70 6f 73 69  il_panic("reposi
4550: 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 65 78  tory does not ex
4560: 69 73 74 73 20 6f 72 22 0a 20 20 20 20 20 20 20  ists or".       
4570: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 69 73              " is
4580: 20 69 6e 20 61 6e 20 75 6e 72 65 61 64 61 62 6c   in an unreadabl
4590: 65 20 64 69 72 65 63 74 6f 72 79 3a 20 25 73 22  e directory: %s"
45a0: 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 20 20  , zDbName);.    
45b0: 7d 65 6c 73 65 20 69 66 28 20 61 63 63 65 73 73  }else if( access
45c0: 28 7a 44 62 4e 61 6d 65 2c 20 52 5f 4f 4b 29 20  (zDbName, R_OK) 
45d0: 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f  ){.      fossil_
45e0: 70 61 6e 69 63 28 22 72 65 61 64 20 70 65 72 6d  panic("read perm
45f0: 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 20 66 6f  ission denied fo
4600: 72 20 72 65 70 6f 73 69 74 6f 72 79 20 25 73 22  r repository %s"
4610: 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 20 20  , zDbName);.    
4620: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 73  }else{.      fos
4630: 73 69 6c 5f 70 61 6e 69 63 28 22 6e 6f 74 20 61  sil_panic("not a
4640: 20 76 61 6c 69 64 20 72 65 70 6f 73 69 74 6f 72   valid repositor
4650: 79 3a 20 25 73 22 2c 20 7a 44 62 4e 61 6d 65 29  y: %s", zDbName)
4660: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  ;.    }.  }.  db
4670: 5f 6f 70 65 6e 5f 6f 72 5f 61 74 74 61 63 68 28  _open_or_attach(
4680: 7a 44 62 4e 61 6d 65 2c 20 22 72 65 70 6f 73 69  zDbName, "reposi
4690: 74 6f 72 79 22 29 3b 0a 20 20 67 2e 72 65 70 6f  tory");.  g.repo
46a0: 73 69 74 6f 72 79 4f 70 65 6e 20 3d 20 31 3b 0a  sitoryOpen = 1;.
46b0: 20 20 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79 4e    g.zRepositoryN
46c0: 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 25  ame = mprintf("%
46d0: 73 22 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 7d 0a  s", zDbName);.}.
46e0: 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69  ./*.** Try to fi
46f0: 6e 64 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72  nd the repositor
4700: 79 20 61 6e 64 20 6f 70 65 6e 20 69 74 2e 20 20  y and open it.  
4710: 55 73 65 20 74 68 65 20 2d 52 20 6f 72 20 2d 2d  Use the -R or --
4720: 72 65 70 6f 73 69 74 6f 72 79 0a 2a 2a 20 6f 70  repository.** op
4730: 74 69 6f 6e 20 74 6f 20 6c 6f 63 61 74 65 20 74  tion to locate t
4740: 68 65 20 72 65 70 6f 73 69 74 6f 72 79 2e 20 20  he repository.  
4750: 49 66 20 6e 6f 20 73 75 63 68 20 6f 70 74 69 6f  If no such optio
4760: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  n is available, 
4770: 74 68 65 6e 0a 2a 2a 20 75 73 65 20 74 68 65 20  then.** use the 
4780: 72 65 70 6f 73 69 74 6f 72 79 20 6f 66 20 74 68  repository of th
4790: 65 20 6f 70 65 6e 20 63 68 65 63 6b 6f 75 74 20  e open checkout 
47a0: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
47b0: 0a 2a 2a 0a 2a 2a 20 45 72 72 6f 72 20 6f 75 74  .**.** Error out
47c0: 20 69 66 20 74 68 65 20 72 65 70 6f 73 69 74 6f   if the reposito
47d0: 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  ry cannot be ope
47e0: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f  ned..*/.void db_
47f0: 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f 72 65  find_and_open_re
4800: 70 6f 73 69 74 6f 72 79 28 69 6e 74 20 65 72 72  pository(int err
4810: 49 66 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20 20 63  IfNotFound){.  c
4820: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 70 20  onst char *zRep 
4830: 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 72  = find_option("r
4840: 65 70 6f 73 69 74 6f 72 79 22 2c 20 22 52 22 2c  epository", "R",
4850: 20 31 29 3b 0a 20 20 69 66 28 20 7a 52 65 70 3d   1);.  if( zRep=
4860: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  =0 ){.    if( db
4870: 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 29 3d 3d 30  _open_local()==0
4880: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 72   ){.      goto r
4890: 65 70 5f 6e 6f 74 5f 66 6f 75 6e 64 3b 0a 20 20  ep_not_found;.  
48a0: 20 20 7d 0a 20 20 20 20 7a 52 65 70 20 3d 20 64    }.    zRep = d
48b0: 62 5f 6c 67 65 74 28 22 72 65 70 6f 73 69 74 6f  b_lget("reposito
48c0: 72 79 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ry", 0);.    if(
48d0: 20 7a 52 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20   zRep==0 ){.    
48e0: 20 20 67 6f 74 6f 20 72 65 70 5f 6e 6f 74 5f 66    goto rep_not_f
48f0: 6f 75 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ound;.    }.  }.
4900: 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69    db_open_reposi
4910: 74 6f 72 79 28 7a 52 65 70 29 3b 0a 20 20 69 66  tory(zRep);.  if
4920: 28 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70  ( g.repositoryOp
4930: 65 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  en ){.    return
4940: 3b 0a 20 20 7d 0a 72 65 70 5f 6e 6f 74 5f 66 6f  ;.  }.rep_not_fo
4950: 75 6e 64 3a 0a 20 20 69 66 28 20 65 72 72 49 66  und:.  if( errIf
4960: 4e 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20  NotFound ){.    
4970: 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 75 73  fossil_fatal("us
4980: 65 20 2d 2d 72 65 70 6f 73 69 74 6f 72 79 20 6f  e --repository o
4990: 72 20 2d 52 20 74 6f 20 73 70 65 63 69 66 69 63  r -R to specific
49a0: 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20   the repository 
49b0: 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a  database");.  }.
49c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
49d0: 65 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65  e local database
49e0: 2e 20 20 49 66 20 75 6e 61 62 6c 65 2c 20 65 78  .  If unable, ex
49f0: 69 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  it with an error
4a00: 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 6d 75 73  ..*/.void db_mus
4a10: 74 5f 62 65 5f 77 69 74 68 69 6e 5f 74 72 65 65  t_be_within_tree
4a20: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 64 62  (void){.  if( db
4a30: 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 29 3d 3d 30  _open_local()==0
4a40: 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66   ){.    fossil_f
4a50: 61 74 61 6c 28 22 6e 6f 74 20 77 69 74 68 69 6e  atal("not within
4a60: 20 61 6e 20 6f 70 65 6e 20 63 68 65 63 6b 6f 75   an open checkou
4a70: 74 22 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 6f 70  t");.  }.  db_op
4a80: 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 30 29  en_repository(0)
4a90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
4aa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
4ab0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
4ac0: 64 20 64 62 5f 63 6c 6f 73 65 28 76 6f 69 64 29  d db_close(void)
4ad0: 7b 0a 20 20 69 66 28 20 67 2e 64 62 3d 3d 30 20  {.  if( g.db==0 
4ae0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c  ) return;.  whil
4af0: 65 28 20 70 41 6c 6c 53 74 6d 74 20 29 7b 0a 20  e( pAllStmt ){. 
4b00: 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 70     db_finalize(p
4b10: 41 6c 6c 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20  AllStmt);.  }.  
4b20: 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e  g.repositoryOpen
4b30: 20 3d 20 30 3b 0a 20 20 67 2e 6c 6f 63 61 6c 4f   = 0;.  g.localO
4b40: 70 65 6e 20 3d 20 30 3b 0a 20 20 67 2e 63 6f 6e  pen = 0;.  g.con
4b50: 66 69 67 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 73  figOpen = 0;.  s
4b60: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 67 2e 64  qlite3_close(g.d
4b70: 62 29 3b 0a 20 20 67 2e 64 62 20 3d 20 30 3b 0a  b);.  g.db = 0;.
4b80: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  }.../*.** Create
4b90: 20 61 20 6e 65 77 20 65 6d 70 74 79 20 72 65 70   a new empty rep
4ba0: 6f 73 69 74 6f 72 79 20 64 61 74 61 62 61 73 65  ository database
4bb0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
4bc0: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  name..**.** Only
4bd0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 69   the schema is i
4be0: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
4bf0: 20 72 65 71 75 69 72 65 64 20 56 41 52 20 74 61   required VAR ta
4c00: 62 6c 65 73 20 65 6e 74 72 69 65 73 0a 2a 2a 20  bles entries.** 
4c10: 61 72 65 20 6e 6f 74 20 73 65 74 20 62 79 20 74  are not set by t
4c20: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
4c30: 6d 75 73 74 20 62 65 20 73 65 74 20 73 65 70 61  must be set sepa
4c40: 72 61 74 65 6c 79 20 69 6e 20 6f 72 64 65 72 0a  rately in order.
4c50: 2a 2a 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e  ** to make the n
4c60: 65 77 20 66 69 6c 65 20 61 20 76 61 6c 69 64 20  ew file a valid 
4c70: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69  database..*/.voi
4c80: 64 20 64 62 5f 63 72 65 61 74 65 5f 72 65 70 6f  d db_create_repo
4c90: 73 69 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  sitory(const cha
4ca0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
4cb0: 20 64 62 5f 69 6e 69 74 5f 64 61 74 61 62 61 73   db_init_databas
4cc0: 65 28 0a 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  e(.     zFilenam
4cd0: 65 2c 0a 20 20 20 20 20 7a 52 65 70 6f 73 69 74  e,.     zReposit
4ce0: 6f 72 79 53 63 68 65 6d 61 31 2c 0a 20 20 20 20  orySchema1,.    
4cf0: 20 7a 52 65 70 6f 73 69 74 6f 72 79 53 63 68 65   zRepositorySche
4d00: 6d 61 32 2c 0a 20 20 20 20 20 28 63 68 61 72 2a  ma2,.     (char*
4d10: 29 30 0a 20 20 29 3b 0a 20 20 69 73 4e 65 77 52  )0.  );.  isNewR
4d20: 65 70 6f 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  epo = 1;.}../*.*
4d30: 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 66  * Create the def
4d40: 61 75 6c 74 20 75 73 65 72 20 61 63 63 6f 75 6e  ault user accoun
4d50: 74 73 20 69 6e 20 74 68 65 20 55 53 45 52 20 74  ts in the USER t
4d60: 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62  able..*/.void db
4d70: 5f 63 72 65 61 74 65 5f 64 65 66 61 75 6c 74 5f  _create_default_
4d80: 75 73 65 72 73 28 76 6f 69 64 29 7b 0a 20 20 63  users(void){.  c
4d90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72  onst char *zUser
4da0: 3b 0a 20 20 7a 55 73 65 72 20 3d 20 64 62 5f 67  ;.  zUser = db_g
4db0: 65 74 28 22 64 65 66 61 75 6c 74 2d 75 73 65 72  et("default-user
4dc0: 22 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a 55 73  ", 0);.  if( zUs
4dd0: 65 72 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  er==0 ){.#ifdef 
4de0: 5f 5f 4d 49 4e 47 57 33 32 5f 5f 0a 20 20 20 20  __MINGW32__.    
4df0: 7a 55 73 65 72 20 3d 20 67 65 74 65 6e 76 28 22  zUser = getenv("
4e00: 55 53 45 52 4e 41 4d 45 22 29 3b 0a 23 65 6c 73  USERNAME");.#els
4e10: 65 0a 20 20 20 20 7a 55 73 65 72 20 3d 20 67 65  e.    zUser = ge
4e20: 74 65 6e 76 28 22 55 53 45 52 22 29 3b 0a 23 65  tenv("USER");.#e
4e30: 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ndif.  }.  if( z
4e40: 55 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  User==0 ){.    z
4e50: 55 73 65 72 20 3d 20 22 72 6f 6f 74 22 3b 0a 20  User = "root";. 
4e60: 20 7d 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78   }.  db_multi_ex
4e70: 65 63 28 0a 20 20 20 20 20 22 49 4e 53 45 52 54  ec(.     "INSERT
4e80: 20 49 4e 54 4f 20 75 73 65 72 28 6c 6f 67 69 6e   INTO user(login
4e90: 2c 20 70 77 2c 20 63 61 70 2c 20 69 6e 66 6f 29  , pw, cap, info)
4ea0: 22 0a 20 20 20 20 20 22 56 41 4c 55 45 53 28 25  ".     "VALUES(%
4eb0: 51 2c 27 27 2c 27 73 27 2c 27 27 29 22 2c 20 7a  Q,'','s','')", z
4ec0: 55 73 65 72 0a 20 20 29 3b 0a 20 20 64 62 5f 6d  User.  );.  db_m
4ed0: 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20  ulti_exec(.     
4ee0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 75 73 65  "INSERT INTO use
4ef0: 72 28 6c 6f 67 69 6e 2c 70 77 2c 63 61 70 2c 69  r(login,pw,cap,i
4f00: 6e 66 6f 29 22 0a 20 20 20 20 20 22 20 20 20 56  nfo)".     "   V
4f10: 41 4c 55 45 53 28 27 61 6e 6f 6e 79 6d 6f 75 73  ALUES('anonymous
4f20: 27 2c 27 61 6e 6f 6e 79 6d 6f 75 73 27 2c 27 67  ','anonymous','g
4f30: 68 6b 6e 77 27 2c 27 41 6e 6f 6e 27 29 3b 22 0a  hknw','Anon');".
4f40: 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
4f50: 4f 20 75 73 65 72 28 6c 6f 67 69 6e 2c 70 77 2c  O user(login,pw,
4f60: 63 61 70 2c 69 6e 66 6f 29 22 0a 20 20 20 20 20  cap,info)".     
4f70: 22 20 20 20 56 41 4c 55 45 53 28 27 6e 6f 62 6f  "   VALUES('nobo
4f80: 64 79 27 2c 27 27 2c 27 6a 6f 72 27 2c 27 4e 6f  dy','','jor','No
4f90: 62 6f 64 79 27 29 3b 22 0a 20 20 20 20 20 22 49  body');".     "I
4fa0: 4e 53 45 52 54 20 49 4e 54 4f 20 75 73 65 72 28  NSERT INTO user(
4fb0: 6c 6f 67 69 6e 2c 70 77 2c 63 61 70 2c 69 6e 66  login,pw,cap,inf
4fc0: 6f 29 22 0a 20 20 20 20 20 22 20 20 20 56 41 4c  o)".     "   VAL
4fd0: 55 45 53 28 27 64 65 76 65 6c 6f 70 65 72 27 2c  UES('developer',
4fe0: 27 27 2c 27 64 65 69 70 74 27 2c 27 44 65 76 27  '','deipt','Dev'
4ff0: 29 3b 22 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  );".  );.}../*.*
5000: 2a 20 46 69 6c 6c 20 61 6e 20 65 6d 70 74 79 20  * Fill an empty 
5010: 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61 62  repository datab
5020: 61 73 65 20 77 69 74 68 20 74 68 65 20 62 61 73  ase with the bas
5030: 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ic information f
5040: 6f 72 20 61 0a 2a 2a 20 72 65 70 6f 73 69 74 6f  or a.** reposito
5050: 72 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ry. This functio
5060: 6e 20 69 73 20 73 68 61 72 65 64 20 62 65 74 77  n is shared betw
5070: 65 65 6e 20 27 63 72 65 61 74 65 5f 72 65 70 6f  een 'create_repo
5080: 73 69 74 6f 72 79 5f 63 6d 64 27 0a 2a 2a 20 28  sitory_cmd'.** (
5090: 27 6e 65 77 27 29 20 61 6e 64 20 27 72 65 63 6f  'new') and 'reco
50a0: 6e 73 74 72 75 63 74 5f 63 6d 64 27 20 28 27 72  nstruct_cmd' ('r
50b0: 65 63 6f 6e 73 74 72 75 63 74 27 29 2c 20 62 6f  econstruct'), bo
50c0: 74 68 20 6f 66 20 77 68 69 63 68 20 63 72 65 61  th of which crea
50d0: 74 65 0a 2a 2a 20 6e 65 77 20 72 65 70 6f 73 69  te.** new reposi
50e0: 74 6f 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tories..**.** Th
50f0: 65 20 6d 61 6b 65 49 6e 69 74 69 61 6c 56 65 72  e makeInitialVer
5100: 73 69 6f 6e 20 66 6c 61 67 20 64 65 74 65 72 6d  sion flag determ
5110: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
5120: 6e 6f 74 20 61 6e 20 69 6e 69 74 69 61 6c 0a 2a  not an initial.*
5130: 2a 20 6d 61 6e 69 66 65 73 74 20 69 73 20 63 72  * manifest is cr
5140: 65 61 74 65 64 2e 20 20 54 68 65 20 6d 61 6b 65  eated.  The make
5150: 53 65 72 76 65 72 43 6f 64 65 73 20 66 6c 61 67  ServerCodes flag
5160: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
5170: 68 65 72 20 6f 72 0a 2a 2a 20 6e 6f 74 20 73 65  her or.** not se
5180: 72 76 65 72 20 61 6e 64 20 70 72 6f 6a 65 63 74  rver and project
5190: 20 63 6f 64 65 73 20 61 72 65 20 69 6e 76 65 6e   codes are inven
51a0: 74 65 64 20 66 6f 72 20 74 68 69 73 20 72 65 70  ted for this rep
51b0: 6f 73 69 74 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64  ository..*/.void
51c0: 20 64 62 5f 69 6e 69 74 69 61 6c 5f 73 65 74 75   db_initial_setu
51d0: 70 20 28 69 6e 74 20 6d 61 6b 65 49 6e 69 74 69  p (int makeIniti
51e0: 61 6c 56 65 72 73 69 6f 6e 2c 20 69 6e 74 20 6d  alVersion, int m
51f0: 61 6b 65 53 65 72 76 65 72 43 6f 64 65 73 29 7b  akeServerCodes){
5200: 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a  .  char *zDate;.
5210: 20 20 42 6c 6f 62 20 68 61 73 68 3b 0a 20 20 42    Blob hash;.  B
5220: 6c 6f 62 20 6d 61 6e 69 66 65 73 74 3b 0a 0a 20  lob manifest;.. 
5230: 20 64 62 5f 73 65 74 28 22 63 6f 6e 74 65 6e 74   db_set("content
5240: 2d 73 63 68 65 6d 61 22 2c 20 43 4f 4e 54 45 4e  -schema", CONTEN
5250: 54 5f 53 43 48 45 4d 41 2c 20 30 29 3b 0a 20 20  T_SCHEMA, 0);.  
5260: 64 62 5f 73 65 74 28 22 61 75 78 2d 73 63 68 65  db_set("aux-sche
5270: 6d 61 22 2c 20 41 55 58 5f 53 43 48 45 4d 41 2c  ma", AUX_SCHEMA,
5280: 20 30 29 3b 0a 20 20 69 66 28 20 6d 61 6b 65 53   0);.  if( makeS
5290: 65 72 76 65 72 43 6f 64 65 73 20 29 7b 0a 20 20  erverCodes ){.  
52a0: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
52b0: 0a 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49  .      "INSERT I
52c0: 4e 54 4f 20 63 6f 6e 66 69 67 28 6e 61 6d 65 2c  NTO config(name,
52d0: 76 61 6c 75 65 29 22 0a 20 20 20 20 20 20 22 20  value)".      " 
52e0: 56 41 4c 55 45 53 28 27 73 65 72 76 65 72 2d 63  VALUES('server-c
52f0: 6f 64 65 27 2c 20 6c 6f 77 65 72 28 68 65 78 28  ode', lower(hex(
5300: 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 29 29 29  randomblob(20)))
5310: 29 3b 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52  );".      "INSER
5320: 54 20 49 4e 54 4f 20 63 6f 6e 66 69 67 28 6e 61  T INTO config(na
5330: 6d 65 2c 76 61 6c 75 65 29 22 0a 20 20 20 20 20  me,value)".     
5340: 20 22 20 56 41 4c 55 45 53 28 27 70 72 6f 6a 65   " VALUES('proje
5350: 63 74 2d 63 6f 64 65 27 2c 20 6c 6f 77 65 72 28  ct-code', lower(
5360: 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32  hex(randomblob(2
5370: 30 29 29 29 29 3b 22 0a 20 20 20 20 29 3b 0a 20  0))));".    );. 
5380: 20 7d 0a 20 20 69 66 28 20 21 64 62 5f 69 73 5f   }.  if( !db_is_
5390: 67 6c 6f 62 61 6c 28 22 61 75 74 6f 73 79 6e 63  global("autosync
53a0: 22 29 20 29 20 64 62 5f 73 65 74 5f 69 6e 74 28  ") ) db_set_int(
53b0: 22 61 75 74 6f 73 79 6e 63 22 2c 20 31 2c 20 30  "autosync", 1, 0
53c0: 29 3b 0a 20 20 69 66 28 20 21 64 62 5f 69 73 5f  );.  if( !db_is_
53d0: 67 6c 6f 62 61 6c 28 22 6c 6f 63 61 6c 61 75 74  global("localaut
53e0: 68 22 29 20 29 20 64 62 5f 73 65 74 5f 69 6e 74  h") ) db_set_int
53f0: 28 22 6c 6f 63 61 6c 61 75 74 68 22 2c 20 30 2c  ("localauth", 0,
5400: 20 30 29 3b 0a 20 20 64 62 5f 63 72 65 61 74 65   0);.  db_create
5410: 5f 64 65 66 61 75 6c 74 5f 75 73 65 72 73 28 29  _default_users()
5420: 3b 0a 20 20 75 73 65 72 5f 73 65 6c 65 63 74 28  ;.  user_select(
5430: 29 3b 0a 0a 20 20 69 66 20 28 6d 61 6b 65 49 6e  );..  if (makeIn
5440: 69 74 69 61 6c 56 65 72 73 69 6f 6e 29 7b 0a 20  itialVersion){. 
5450: 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6d 61     blob_zero(&ma
5460: 6e 69 66 65 73 74 29 3b 0a 20 20 20 20 62 6c 6f  nifest);.    blo
5470: 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69 66  b_appendf(&manif
5480: 65 73 74 2c 20 22 43 20 69 6e 69 74 69 61 6c 5c  est, "C initial\
5490: 5c 73 65 6d 70 74 79 5c 5c 73 62 61 73 65 6c 69  \sempty\\sbaseli
54a0: 6e 65 5c 6e 22 29 3b 0a 20 20 20 20 7a 44 61 74  ne\n");.    zDat
54b0: 65 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22  e = db_text(0, "
54c0: 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28  SELECT datetime(
54d0: 27 6e 6f 77 27 29 22 29 3b 0a 20 20 20 20 7a 44  'now')");.    zD
54e0: 61 74 65 5b 31 30 5d 3d 27 54 27 3b 0a 20 20 20  ate[10]='T';.   
54f0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d   blob_appendf(&m
5500: 61 6e 69 66 65 73 74 2c 20 22 44 20 25 73 5c 6e  anifest, "D %s\n
5510: 22 2c 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 62  ", zDate);.    b
5520: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e  lob_appendf(&man
5530: 69 66 65 73 74 2c 20 22 50 5c 6e 22 29 3b 0a 20  ifest, "P\n");. 
5540: 20 20 20 6d 64 35 73 75 6d 5f 69 6e 69 74 28 29     md5sum_init()
5550: 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  ;.    blob_appen
5560: 64 66 28 26 6d 61 6e 69 66 65 73 74 2c 20 22 52  df(&manifest, "R
5570: 20 25 73 5c 6e 22 2c 20 6d 64 35 73 75 6d 5f 66   %s\n", md5sum_f
5580: 69 6e 69 73 68 28 30 29 29 3b 0a 20 20 20 20 62  inish(0));.    b
5590: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e  lob_appendf(&man
55a0: 69 66 65 73 74 2c 20 22 55 20 25 46 5c 6e 22 2c  ifest, "U %F\n",
55b0: 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 20 20   g.zLogin);.    
55c0: 6d 64 35 73 75 6d 5f 62 6c 6f 62 28 26 6d 61 6e  md5sum_blob(&man
55d0: 69 66 65 73 74 2c 20 26 68 61 73 68 29 3b 0a 20  ifest, &hash);. 
55e0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
55f0: 26 6d 61 6e 69 66 65 73 74 2c 20 22 5a 20 25 62  &manifest, "Z %b
5600: 5c 6e 22 2c 20 26 68 61 73 68 29 3b 0a 20 20 20  \n", &hash);.   
5610: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 68 61 73   blob_reset(&has
5620: 68 29 3b 0a 20 20 20 20 63 6f 6e 74 65 6e 74 5f  h);.    content_
5630: 70 75 74 28 26 6d 61 6e 69 66 65 73 74 2c 20 30  put(&manifest, 0
5640: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
5650: 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 6e 65 77 0a  ** COMMAND: new.
5660: 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f  **.** Usage: %fo
5670: 73 73 69 6c 20 6e 65 77 20 46 49 4c 45 4e 41 4d  ssil new FILENAM
5680: 45 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  E.**.** Create a
5690: 20 72 65 70 6f 73 69 74 6f 72 79 20 66 6f 72 20   repository for 
56a0: 61 20 6e 65 77 20 70 72 6f 6a 65 63 74 20 69 6e  a new project in
56b0: 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20   the file named 
56c0: 46 49 4c 45 4e 41 4d 45 2e 0a 2a 2a 20 54 68 69  FILENAME..** Thi
56d0: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 69 73  s command is dis
56e0: 74 69 6e 63 74 20 66 72 6f 6d 20 22 63 6c 6f 6e  tinct from "clon
56f0: 65 22 2e 20 20 54 68 65 20 22 63 6c 6f 6e 65 22  e".  The "clone"
5700: 20 63 6f 6d 6d 61 6e 64 20 6d 61 6b 65 73 0a 2a   command makes.*
5710: 2a 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65  * a copy of an e
5720: 78 69 73 74 69 6e 67 20 70 72 6f 6a 65 63 74 2e  xisting project.
5730: 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 73    This command s
5740: 74 61 72 74 73 20 61 20 6e 65 77 20 70 72 6f 6a  tarts a new proj
5750: 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 63 72 65  ect..*/.void cre
5760: 61 74 65 5f 72 65 70 6f 73 69 74 6f 72 79 5f 63  ate_repository_c
5770: 6d 64 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  md(void){.  if( 
5780: 67 2e 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  g.argc!=3 ){.   
5790: 20 75 73 61 67 65 28 22 52 45 50 4f 53 49 54 4f   usage("REPOSITO
57a0: 52 59 2d 4e 41 4d 45 22 29 3b 0a 20 20 7d 0a 20  RY-NAME");.  }. 
57b0: 20 64 62 5f 63 72 65 61 74 65 5f 72 65 70 6f 73   db_create_repos
57c0: 69 74 6f 72 79 28 67 2e 61 72 67 76 5b 32 5d 29  itory(g.argv[2])
57d0: 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f  ;.  db_open_repo
57e0: 73 69 74 6f 72 79 28 67 2e 61 72 67 76 5b 32 5d  sitory(g.argv[2]
57f0: 29 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e  );.  db_open_con
5800: 66 69 67 28 29 3b 0a 20 20 64 62 5f 62 65 67 69  fig();.  db_begi
5810: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b  n_transaction();
5820: 0a 20 20 64 62 5f 69 6e 69 74 69 61 6c 5f 73 65  .  db_initial_se
5830: 74 75 70 28 31 2c 20 31 29 3b 0a 20 20 64 62 5f  tup(1, 1);.  db_
5840: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
5850: 30 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 70 72  0);.  printf("pr
5860: 6f 6a 65 63 74 2d 69 64 3a 20 25 73 5c 6e 22 2c  oject-id: %s\n",
5870: 20 64 62 5f 67 65 74 28 22 70 72 6f 6a 65 63 74   db_get("project
5880: 2d 63 6f 64 65 22 2c 20 30 29 29 3b 0a 20 20 70  -code", 0));.  p
5890: 72 69 6e 74 66 28 22 73 65 72 76 65 72 2d 69 64  rintf("server-id
58a0: 3a 20 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74  :  %s\n", db_get
58b0: 28 22 73 65 72 76 65 72 2d 63 6f 64 65 22 2c 20  ("server-code", 
58c0: 30 29 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 61  0));.  printf("a
58d0: 64 6d 69 6e 2d 75 73 65 72 3a 20 25 73 20 28 6e  dmin-user: %s (n
58e0: 6f 20 70 61 73 73 77 6f 72 64 20 73 65 74 20 79  o password set y
58f0: 65 74 21 29 5c 6e 22 2c 20 67 2e 7a 4c 6f 67 69  et!)\n", g.zLogi
5900: 6e 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 62 61  n);.  printf("ba
5910: 73 65 6c 69 6e 65 3a 20 20 20 25 73 5c 6e 22 2c  seline:   %s\n",
5920: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
5930: 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c  ECT uuid FROM bl
5940: 6f 62 22 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ob"));.}../*.** 
5950: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f  SQL functions fo
5960: 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2a 0a  r debugging..**.
5970: 2a 2a 20 54 68 65 20 70 72 69 6e 74 28 29 20 66  ** The print() f
5980: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 69  unction writes i
5990: 74 73 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20  ts arguments on 
59a0: 73 74 64 6f 75 74 2c 20 62 75 74 20 6f 6e 6c 79  stdout, but only
59b0: 0a 2a 2a 20 69 66 20 74 68 65 20 2d 73 71 6c 70  .** if the -sqlp
59c0: 72 69 6e 74 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  rint command-lin
59d0: 65 20 6f 70 74 69 6f 6e 20 69 73 20 74 75 72 6e  e option is turn
59e0: 65 64 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ed on..*/.static
59f0: 20 76 6f 69 64 20 64 62 5f 73 71 6c 5f 70 72 69   void db_sql_pri
5a00: 6e 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nt(.  sqlite3_co
5a10: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
5a20: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
5a30: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
5a40: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  gv.){.  int i;. 
5a50: 20 69 66 28 20 67 2e 66 53 71 6c 50 72 69 6e 74   if( g.fSqlPrint
5a60: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
5a70: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
5a80: 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 69 3d       char c = i=
5a90: 3d 61 72 67 63 2d 31 20 3f 20 27 5c 6e 27 20 3a  =argc-1 ? '\n' :
5aa0: 20 27 20 27 3b 0a 20 20 20 20 20 20 70 72 69 6e   ' ';.      prin
5ab0: 74 66 28 22 25 73 25 63 22 2c 20 73 71 6c 69 74  tf("%s%c", sqlit
5ac0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
5ad0: 67 76 5b 69 5d 29 2c 20 63 29 3b 0a 20 20 20 20  gv[i]), c);.    
5ae0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
5af0: 6f 69 64 20 64 62 5f 73 71 6c 5f 74 72 61 63 65  oid db_sql_trace
5b00: 28 76 6f 69 64 20 2a 6e 6f 74 55 73 65 64 2c 20  (void *notUsed, 
5b10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
5b20: 29 7b 0a 20 20 70 72 69 6e 74 66 28 22 25 73 5c  ){.  printf("%s\
5b30: 6e 22 2c 20 7a 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a  n", zSql);.}../*
5b40: 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64  .** This is used
5b50: 20 62 79 20 74 68 65 20 5b 63 6f 6d 6d 69 74 5d   by the [commit]
5b60: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
5b70: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 65  Return true if e
5b80: 69 74 68 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ither:.**.**    
5b90: 20 61 29 20 47 6c 6f 62 61 6c 2e 61 43 6f 6d 6d   a) Global.aComm
5ba0: 69 74 46 69 6c 65 20 69 73 20 4e 55 4c 4c 2c 20  itFile is NULL, 
5bb0: 6f 72 0a 2a 2a 20 20 20 20 20 62 29 20 47 6c 6f  or.**     b) Glo
5bc0: 62 61 6c 2e 61 43 6f 6d 6d 69 74 46 69 6c 65 20  bal.aCommitFile 
5bd0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 74  contains the int
5be0: 65 67 65 72 20 70 61 73 73 65 64 20 61 73 20 61  eger passed as a
5bf0: 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  n argument..**.*
5c00: 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75  * Otherwise retu
5c10: 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61  rn false..*/.sta
5c20: 74 69 63 20 76 6f 69 64 20 66 69 6c 65 5f 69 73  tic void file_is
5c30: 5f 73 65 6c 65 63 74 65 64 28 0a 20 20 73 71 6c  _selected(.  sql
5c40: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
5c50: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
5c60: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
5c70: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 61  ue **argv.){.  a
5c80: 73 73 65 72 74 28 61 72 67 63 3d 3d 31 29 3b 0a  ssert(argc==1);.
5c90: 20 20 69 66 28 20 67 2e 61 43 6f 6d 6d 69 74 46    if( g.aCommitF
5ca0: 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ile ){.    int i
5cb0: 49 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  Id = sqlite3_val
5cc0: 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b  ue_int(argv[0]);
5cd0: 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
5ce0: 20 66 6f 72 28 69 69 3d 30 3b 20 67 2e 61 43 6f   for(ii=0; g.aCo
5cf0: 6d 6d 69 74 46 69 6c 65 5b 69 69 5d 3b 20 69 69  mmitFile[ii]; ii
5d00: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ++){.      if( i
5d10: 49 64 3d 3d 67 2e 61 43 6f 6d 6d 69 74 46 69 6c  Id==g.aCommitFil
5d20: 65 5b 69 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  e[ii] ){.       
5d30: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5d40: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b  int(context, 1);
5d50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
5d60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5d70: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5d80: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 30  t_int(context, 0
5d90: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5da0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
5db0: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a  nt(context, 1);.
5dc0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
5dd0: 76 65 72 74 20 74 68 65 20 69 6e 70 75 74 20 73  vert the input s
5de0: 74 72 69 6e 67 20 69 6e 74 6f 20 61 6e 20 53 48  tring into an SH
5df0: 41 31 2e 20 20 4d 61 6b 65 20 61 20 6e 6f 74 61  A1.  Make a nota
5e00: 74 69 6f 6e 20 69 6e 20 74 68 65 0a 2a 2a 20 43  tion in the.** C
5e10: 4f 4e 43 45 41 4c 45 44 20 74 61 62 6c 65 20 73  ONCEALED table s
5e20: 6f 20 74 68 61 74 20 74 68 65 20 68 61 73 68 20  o that the hash 
5e30: 63 61 6e 20 62 65 20 75 6e 64 6f 20 75 73 69 6e  can be undo usin
5e40: 67 20 74 68 65 20 64 62 5f 72 65 76 65 61 6c 28  g the db_reveal(
5e50: 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74  ).** function at
5e60: 20 73 6f 6d 65 20 6c 61 74 65 72 20 74 69 6d 65   some later time
5e70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
5e80: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 73 74  e returned is st
5e90: 6f 72 65 64 20 69 6e 20 73 74 61 74 69 63 20 73  ored in static s
5ea0: 70 61 63 65 20 61 6e 64 20 77 69 6c 6c 20 62 65  pace and will be
5eb0: 20 6f 76 65 72 77 72 69 74 74 65 6e 0a 2a 2a 20   overwritten.** 
5ec0: 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  on subsequent ca
5ed0: 6c 6c 73 2e 0a 2a 2f 0a 63 68 61 72 20 2a 64 62  lls..*/.char *db
5ee0: 5f 63 6f 6e 63 65 61 6c 28 63 6f 6e 73 74 20 63  _conceal(const c
5ef0: 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 2c 20 69  har *zContent, i
5f00: 6e 74 20 6e 29 7b 0a 20 20 73 74 61 74 69 63 20  nt n){.  static 
5f10: 63 68 61 72 20 7a 48 61 73 68 5b 34 32 5d 3b 0a  char zHash[42];.
5f20: 20 20 42 6c 6f 62 20 6f 75 74 3b 0a 20 20 73 68    Blob out;.  sh
5f30: 61 31 73 75 6d 5f 73 74 65 70 5f 74 65 78 74 28  a1sum_step_text(
5f40: 7a 43 6f 6e 74 65 6e 74 2c 20 6e 29 3b 0a 20 20  zContent, n);.  
5f50: 73 68 61 31 73 75 6d 5f 66 69 6e 69 73 68 28 26  sha1sum_finish(&
5f60: 6f 75 74 29 3b 0a 20 20 73 74 72 63 70 79 28 7a  out);.  strcpy(z
5f70: 48 61 73 68 2c 20 62 6c 6f 62 5f 73 74 72 28 26  Hash, blob_str(&
5f80: 6f 75 74 29 29 3b 0a 20 20 62 6c 6f 62 5f 72 65  out));.  blob_re
5f90: 73 65 74 28 26 6f 75 74 29 3b 0a 20 20 64 62 5f  set(&out);.  db_
5fa0: 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20  multi_exec(.    
5fb0: 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f   "INSERT OR IGNO
5fc0: 52 45 20 49 4e 54 4f 20 63 6f 6e 63 65 61 6c 65  RE INTO conceale
5fd0: 64 20 56 41 4c 55 45 53 28 25 51 2c 25 23 51 29  d VALUES(%Q,%#Q)
5fe0: 22 2c 0a 20 20 20 20 20 7a 48 61 73 68 2c 20 6e  ",.     zHash, n
5ff0: 2c 20 7a 43 6f 6e 74 65 6e 74 0a 20 20 29 3b 0a  , zContent.  );.
6000: 20 20 72 65 74 75 72 6e 20 7a 48 61 73 68 3b 0a    return zHash;.
6010: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
6020: 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 74 68 65 20   to look up the 
6030: 69 6e 70 75 74 20 69 6e 20 74 68 65 20 43 4f 4e  input in the CON
6040: 43 45 41 4c 45 44 20 74 61 62 6c 65 2e 20 20 49  CEALED table.  I
6050: 66 20 66 6f 75 6e 64 2c 0a 2a 2a 20 61 6e 64 20  f found,.** and 
6060: 69 66 20 74 68 65 20 6f 6b 52 64 41 64 64 72 20  if the okRdAddr 
6070: 70 65 72 6d 69 73 73 69 6f 6e 20 69 73 20 65 6e  permission is en
6080: 61 62 6c 65 64 20 74 68 65 6e 20 72 65 74 75 72  abled then retur
6090: 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61  n the.** origina
60a0: 6c 20 76 61 6c 75 65 20 66 6f 72 20 77 68 69 63  l value for whic
60b0: 68 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 61  h the input is a
60c0: 20 68 61 73 68 2e 20 20 49 66 20 6f 6b 52 64 41   hash.  If okRdA
60d0: 64 64 72 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20  ddr is.** false 
60e0: 6f 72 20 69 66 20 74 68 65 20 6c 6f 6f 6b 75 70  or if the lookup
60f0: 20 66 61 69 6c 73 2c 20 72 65 74 75 72 6e 20 74   fails, return t
6100: 68 65 20 6f 72 69 67 69 6e 61 6c 20 69 6e 70 75  he original inpu
6110: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68  t..**.** In eith
6120: 65 72 20 63 61 73 65 2c 20 74 68 65 20 73 74 72  er case, the str
6130: 69 6e 67 20 72 65 74 75 72 6e 65 64 20 69 73 20  ing returned is 
6140: 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63 65 20  stored in space 
6150: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
6160: 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 73 68 6f 75   malloc and shou
6170: 6c 64 20 62 65 20 66 72 65 65 64 20 62 79 20 74  ld be freed by t
6180: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
6190: 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 64 62  ion..*/.char *db
61a0: 5f 72 65 76 65 61 6c 28 63 6f 6e 73 74 20 63 68  _reveal(const ch
61b0: 61 72 20 2a 7a 4b 65 79 29 7b 0a 20 20 63 68 61  ar *zKey){.  cha
61c0: 72 20 2a 7a 4f 75 74 3b 0a 20 20 69 66 28 20 67  r *zOut;.  if( g
61d0: 2e 6f 6b 52 64 41 64 64 72 20 29 7b 0a 20 20 20  .okRdAddr ){.   
61e0: 20 7a 4f 75 74 20 3d 20 64 62 5f 74 65 78 74 28   zOut = db_text(
61f0: 30 2c 20 22 53 45 4c 45 43 54 20 63 6f 6e 74 65  0, "SELECT conte
6200: 6e 74 20 46 52 4f 4d 20 63 6f 6e 63 65 61 6c 65  nt FROM conceale
6210: 64 20 57 48 45 52 45 20 68 61 73 68 3d 25 51 22  d WHERE hash=%Q"
6220: 2c 20 7a 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65  , zKey);.  }else
6230: 7b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 30 3b 0a  {.    zOut = 0;.
6240: 20 20 7d 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d    }.  if( zOut==
6250: 30 20 29 7b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  0 ){.    zOut = 
6260: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4b  mprintf("%s", zK
6270: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
6280: 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zOut;.}../*.**
6290: 20 54 68 65 20 63 6f 6e 63 65 61 6c 28 29 20 53   The conceal() S
62a0: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 43 6f  QL function.  Co
62b0: 6d 70 75 74 65 20 61 6e 20 53 48 41 31 20 68 61  mpute an SHA1 ha
62c0: 73 68 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  sh of the argume
62d0: 6e 74 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  nt.** and return
62e0: 20 74 68 61 74 20 68 61 73 68 20 61 73 20 61 20   that hash as a 
62f0: 34 30 2d 63 68 61 72 61 63 74 65 72 20 6c 6f 77  40-character low
6300: 65 72 2d 63 61 73 65 20 68 65 78 20 6e 75 6d 62  er-case hex numb
6310: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
6320: 69 64 20 73 68 61 31 5f 66 75 6e 63 74 69 6f 6e  id sha1_function
6330: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
6340: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
6350: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
6360: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
6370: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
6380: 20 2a 7a 49 6e 3b 0a 20 20 69 6e 74 20 6e 49 6e   *zIn;.  int nIn
6390: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a  ;.  char *zOut;.
63a0: 20 20 61 73 73 65 72 74 28 61 72 67 63 3d 3d 31    assert(argc==1
63b0: 29 3b 0a 20 20 0a 20 20 7a 49 6e 20 3d 20 28 63  );.  .  zIn = (c
63c0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
63d0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
63e0: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49  gv[0]);.  if( zI
63f0: 6e 20 29 7b 0a 20 20 20 20 6e 49 6e 20 3d 20 73  n ){.    nIn = s
6400: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6410: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  es(argv[0]);.   
6420: 20 7a 4f 75 74 20 3d 20 64 62 5f 63 6f 6e 63 65   zOut = db_conce
6430: 61 6c 28 7a 49 6e 2c 20 6e 49 6e 29 3b 0a 20 20  al(zIn, nIn);.  
6440: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6450: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
6460: 4f 75 74 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Out, -1, SQLITE_
6470: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
6480: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 76  }../*.** The rev
6490: 65 61 6c 28 29 20 53 51 4c 20 66 75 6e 63 74 69  eal() SQL functi
64a0: 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 64  on invokes the d
64b0: 62 5f 72 65 76 65 61 6c 28 29 20 66 75 6e 63 74  b_reveal() funct
64c0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
64d0: 6f 69 64 20 72 65 76 65 61 6c 5f 66 75 6e 63 74  oid reveal_funct
64e0: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
64f0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6500: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
6510: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6520: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  rgv.){.  const c
6530: 68 61 72 20 2a 7a 49 6e 3b 0a 20 20 63 68 61 72  har *zIn;.  char
6540: 20 2a 7a 4f 75 74 3b 0a 20 20 61 73 73 65 72 74   *zOut;.  assert
6550: 28 61 72 67 63 3d 3d 31 29 3b 0a 20 20 0a 20 20  (argc==1);.  .  
6560: 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zIn = (const cha
6570: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
6580: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
6590: 20 20 69 66 28 20 7a 49 6e 20 29 7b 0a 20 20 20    if( zIn ){.   
65a0: 20 7a 4f 75 74 20 3d 20 64 62 5f 72 65 76 65 61   zOut = db_revea
65b0: 6c 28 7a 49 6e 29 3b 0a 20 20 20 20 73 71 6c 69  l(zIn);.    sqli
65c0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
65d0: 63 6f 6e 74 65 78 74 2c 20 7a 4f 75 74 2c 20 2d  context, zOut, -
65e0: 31 2c 20 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a  1, free);.  }.}.
65f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6600: 74 69 6f 6e 20 72 65 67 69 73 74 65 72 73 20 61  tion registers a
6610: 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f  uxiliary functio
6620: 6e 73 20 77 68 65 6e 20 74 68 65 20 53 51 4c 69  ns when the SQLi
6630: 74 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  te.** database c
6640: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 66 69 72  onnection is fir
6650: 73 74 20 65 73 74 61 62 6c 69 73 68 65 64 2e 0a  st established..
6660: 2a 2f 0a 4c 4f 43 41 4c 20 76 6f 69 64 20 64 62  */.LOCAL void db
6670: 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 69 6e 69 74  _connection_init
6680: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
6690: 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20   int once = 1;. 
66a0: 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
66b0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
66c0: 66 75 6e 63 74 69 6f 6e 28 67 2e 64 62 2c 20 22  function(g.db, "
66d0: 70 72 69 6e 74 22 2c 20 2d 31 2c 20 53 51 4c 49  print", -1, SQLI
66e0: 54 45 5f 55 54 46 38 2c 20 30 2c 64 62 5f 73 71  TE_UTF8, 0,db_sq
66f0: 6c 5f 70 72 69 6e 74 2c 30 2c 30 29 3b 0a 20 20  l_print,0,0);.  
6700: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
6710: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20  _function(.     
6720: 20 67 2e 64 62 2c 20 22 66 69 6c 65 5f 69 73 5f   g.db, "file_is_
6730: 73 65 6c 65 63 74 65 64 22 2c 20 31 2c 20 53 51  selected", 1, SQ
6740: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 69  LITE_UTF8, 0, fi
6750: 6c 65 5f 69 73 5f 73 65 6c 65 63 74 65 64 2c 30  le_is_selected,0
6760: 2c 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  ,0.    );.    sq
6770: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6780: 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 67 2e 64  ction(.      g.d
6790: 62 2c 20 22 63 6f 6e 63 65 61 6c 22 2c 20 31 2c  b, "conceal", 1,
67a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
67b0: 20 73 68 61 31 5f 66 75 6e 63 74 69 6f 6e 2c 30   sha1_function,0
67c0: 2c 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  ,0.    );.    sq
67d0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
67e0: 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 67 2e 64  ction(.      g.d
67f0: 62 2c 20 22 72 65 76 65 61 6c 22 2c 20 31 2c 20  b, "reveal", 1, 
6800: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
6810: 72 65 76 65 61 6c 5f 66 75 6e 63 74 69 6f 6e 2c  reveal_function,
6820: 30 2c 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  0,0.    );.    i
6830: 66 28 20 67 2e 66 53 71 6c 54 72 61 63 65 20 29  f( g.fSqlTrace )
6840: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
6850: 74 72 61 63 65 28 67 2e 64 62 2c 20 64 62 5f 73  trace(g.db, db_s
6860: 71 6c 5f 74 72 61 63 65 2c 20 30 29 3b 0a 20 20  ql_trace, 0);.  
6870: 20 20 7d 0a 20 20 20 20 6f 6e 63 65 20 3d 20 30    }.    once = 0
6880: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
6890: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
68a0: 65 20 73 74 72 69 6e 67 20 7a 56 61 6c 20 72 65  e string zVal re
68b0: 70 72 65 73 65 6e 74 73 20 22 74 72 75 65 22 20  presents "true" 
68c0: 28 6f 72 20 22 66 61 6c 73 65 22 29 2e 0a 2a 2f  (or "false")..*/
68d0: 0a 69 6e 74 20 69 73 5f 74 72 75 74 68 28 63 6f  .int is_truth(co
68e0: 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 29 7b  nst char *zVal){
68f0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
6900: 63 68 61 72 20 2a 61 7a 4f 6e 5b 5d 20 3d 20 7b  char *azOn[] = {
6910: 20 22 6f 6e 22 2c 20 22 79 65 73 22 2c 20 22 74   "on", "yes", "t
6920: 72 75 65 22 2c 20 22 31 22 20 7d 3b 0a 20 20 69  rue", "1" };.  i
6930: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
6940: 20 69 3c 73 69 7a 65 6f 66 28 61 7a 4f 6e 29 2f   i<sizeof(azOn)/
6950: 73 69 7a 65 6f 66 28 61 7a 4f 6e 5b 30 5d 29 3b  sizeof(azOn[0]);
6960: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
6970: 74 72 63 6d 70 28 7a 56 61 6c 2c 61 7a 4f 6e 5b  trcmp(zVal,azOn[
6980: 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  i])==0 ) return 
6990: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
69a0: 30 3b 0a 7d 0a 69 6e 74 20 69 73 5f 66 61 6c 73  0;.}.int is_fals
69b0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56  e(const char *zV
69c0: 61 6c 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  al){.  static co
69d0: 6e 73 74 20 63 68 61 72 20 2a 61 7a 4f 66 66 5b  nst char *azOff[
69e0: 5d 20 3d 20 7b 20 22 6f 66 66 22 2c 20 22 6e 6f  ] = { "off", "no
69f0: 22 2c 20 22 66 61 6c 73 65 22 2c 20 22 30 22 20  ", "false", "0" 
6a00: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  };.  int i;.  fo
6a10: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
6a20: 61 7a 4f 66 66 29 2f 73 69 7a 65 6f 66 28 61 7a  azOff)/sizeof(az
6a30: 4f 66 66 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Off[0]); i++){. 
6a40: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 56     if( strcmp(zV
6a50: 61 6c 2c 61 7a 4f 66 66 5b 69 5d 29 3d 3d 30 20  al,azOff[i])==0 
6a60: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
6a70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
6a80: 2a 0a 2a 2a 20 47 65 74 20 61 6e 64 20 73 65 74  *.** Get and set
6a90: 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65   values from the
6aa0: 20 43 4f 4e 46 49 47 2c 20 47 4c 4f 42 41 4c 5f   CONFIG, GLOBAL_
6ab0: 43 4f 4e 46 49 47 20 61 6e 64 20 56 56 41 52 20  CONFIG and VVAR 
6ac0: 74 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20  table in the.** 
6ad0: 72 65 70 6f 73 69 74 6f 72 79 20 61 6e 64 20 6c  repository and l
6ae0: 6f 63 61 6c 20 64 61 74 61 62 61 73 65 73 2e 0a  ocal databases..
6af0: 2a 2f 0a 63 68 61 72 20 2a 64 62 5f 67 65 74 28  */.char *db_get(
6b00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
6b10: 65 2c 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  e, char *zDefaul
6b20: 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20  t){.  char *z = 
6b30: 30 3b 0a 20 20 69 66 28 20 67 2e 72 65 70 6f 73  0;.  if( g.repos
6b40: 69 74 6f 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20  itoryOpen ){.   
6b50: 20 7a 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20   z = db_text(0, 
6b60: 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52  "SELECT value FR
6b70: 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20  OM config WHERE 
6b80: 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29  name=%Q", zName)
6b90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 3d 3d 30  ;.  }.  if( z==0
6ba0: 20 26 26 20 67 2e 63 6f 6e 66 69 67 4f 70 65 6e   && g.configOpen
6bb0: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 64 62 5f 74   ){.    z = db_t
6bc0: 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 76  ext(0, "SELECT v
6bd0: 61 6c 75 65 20 46 52 4f 4d 20 67 6c 6f 62 61 6c  alue FROM global
6be0: 5f 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61  _config WHERE na
6bf0: 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a  me=%Q", zName);.
6c00: 20 20 7d 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29    }.  if( z==0 )
6c10: 7b 0a 20 20 20 20 7a 20 3d 20 7a 44 65 66 61 75  {.    z = zDefau
6c20: 6c 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  lt;.  }.  return
6c30: 20 7a 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 73 65   z;.}.void db_se
6c40: 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  t(const char *zN
6c50: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
6c60: 2a 7a 56 61 6c 75 65 2c 20 69 6e 74 20 67 6c 6f  *zValue, int glo
6c70: 62 61 6c 46 6c 61 67 29 7b 0a 20 20 64 62 5f 62  balFlag){.  db_b
6c80: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
6c90: 28 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65  ();.  db_multi_e
6ca0: 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54  xec("REPLACE INT
6cb0: 4f 20 25 73 63 6f 6e 66 69 67 28 6e 61 6d 65 2c  O %sconfig(name,
6cc0: 76 61 6c 75 65 29 20 56 41 4c 55 45 53 28 25 51  value) VALUES(%Q
6cd0: 2c 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20  ,%Q)",.         
6ce0: 20 20 20 20 20 20 20 20 67 6c 6f 62 61 6c 46 6c          globalFl
6cf0: 61 67 20 3f 20 22 67 6c 6f 62 61 6c 5f 22 20 3a  ag ? "global_" :
6d00: 20 22 22 2c 20 7a 4e 61 6d 65 2c 20 7a 56 61 6c   "", zName, zVal
6d10: 75 65 29 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61  ue);.  if( globa
6d20: 6c 46 6c 61 67 20 26 26 20 67 2e 72 65 70 6f 73  lFlag && g.repos
6d30: 69 74 6f 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20  itoryOpen ){.   
6d40: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
6d50: 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 6f 6e 66  DELETE FROM conf
6d60: 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ig WHERE name=%Q
6d70: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  ", zName);.  }. 
6d80: 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74   db_end_transact
6d90: 69 6f 6e 28 30 29 3b 0a 7d 0a 76 6f 69 64 20 64  ion(0);.}.void d
6da0: 62 5f 75 6e 73 65 74 28 63 6f 6e 73 74 20 63 68  b_unset(const ch
6db0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 67  ar *zName, int g
6dc0: 6c 6f 62 61 6c 46 6c 61 67 29 7b 0a 20 20 64 62  lobalFlag){.  db
6dd0: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
6de0: 6f 6e 28 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69  on();.  db_multi
6df0: 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20 46 52  _exec("DELETE FR
6e00: 4f 4d 20 25 73 63 6f 6e 66 69 67 20 57 48 45 52  OM %sconfig WHER
6e10: 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20  E name=%Q",.    
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6c 6f               glo
6e30: 62 61 6c 46 6c 61 67 20 3f 20 22 67 6c 6f 62 61  balFlag ? "globa
6e40: 6c 5f 22 20 3a 20 22 22 2c 20 7a 4e 61 6d 65 29  l_" : "", zName)
6e50: 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61 6c 46 6c  ;.  if( globalFl
6e60: 61 67 20 26 26 20 67 2e 72 65 70 6f 73 69 74 6f  ag && g.reposito
6e70: 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20 20 64 62  ryOpen ){.    db
6e80: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 45 4c  _multi_exec("DEL
6e90: 45 54 45 20 46 52 4f 4d 20 63 6f 6e 66 69 67 20  ETE FROM config 
6ea0: 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20  WHERE name=%Q", 
6eb0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 64 62  zName);.  }.  db
6ec0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
6ed0: 28 30 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 69 73  (0);.}.int db_is
6ee0: 5f 67 6c 6f 62 61 6c 28 63 6f 6e 73 74 20 63 68  _global(const ch
6ef0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
6f00: 28 20 67 2e 63 6f 6e 66 69 67 4f 70 65 6e 20 29  ( g.configOpen )
6f10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 64 62 5f  {.    return db_
6f20: 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20 31  exists("SELECT 1
6f30: 20 46 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e   FROM global_con
6f40: 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  fig WHERE name=%
6f50: 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  Q", zName);.  }e
6f60: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
6f70: 30 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 64 62 5f  0;.  }.}.int db_
6f80: 67 65 74 5f 69 6e 74 28 63 6f 6e 73 74 20 63 68  get_int(const ch
6f90: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 64  ar *zName, int d
6fa0: 66 6c 74 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20  flt){.  int v = 
6fb0: 64 66 6c 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  dflt;.  int rc;.
6fc0: 20 20 69 66 28 20 67 2e 72 65 70 6f 73 69 74 6f    if( g.reposito
6fd0: 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20 20 53 74  ryOpen ){.    St
6fe0: 6d 74 20 71 3b 0a 20 20 20 20 64 62 5f 70 72 65  mt q;.    db_pre
6ff0: 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43 54  pare(&q, "SELECT
7000: 20 76 61 6c 75 65 20 46 52 4f 4d 20 63 6f 6e 66   value FROM conf
7010: 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ig WHERE name=%Q
7020: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
7030: 63 20 3d 20 64 62 5f 73 74 65 70 28 26 71 29 3b  c = db_step(&q);
7040: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
7050: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
7060: 20 76 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69   v = db_column_i
7070: 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 7d  nt(&q, 0);.    }
7080: 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65  .    db_finalize
7090: 28 26 71 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  (&q);.  }else{. 
70a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
70b0: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ONE;.  }.  if( r
70c0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26  c==SQLITE_DONE &
70d0: 26 20 67 2e 63 6f 6e 66 69 67 4f 70 65 6e 20 29  & g.configOpen )
70e0: 7b 0a 20 20 20 20 76 20 3d 20 64 62 5f 69 6e 74  {.    v = db_int
70f0: 28 64 66 6c 74 2c 20 22 53 45 4c 45 43 54 20 76  (dflt, "SELECT v
7100: 61 6c 75 65 20 46 52 4f 4d 20 67 6c 6f 62 61 6c  alue FROM global
7110: 5f 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61  _config WHERE na
7120: 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a  me=%Q", zName);.
7130: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
7140: 7d 0a 76 6f 69 64 20 64 62 5f 73 65 74 5f 69 6e  }.void db_set_in
7150: 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  t(const char *zN
7160: 61 6d 65 2c 20 69 6e 74 20 76 61 6c 75 65 2c 20  ame, int value, 
7170: 69 6e 74 20 67 6c 6f 62 61 6c 46 6c 61 67 29 7b  int globalFlag){
7180: 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e  .  db_begin_tran
7190: 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 64 62 5f  saction();.  db_
71a0: 6d 75 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c  multi_exec("REPL
71b0: 41 43 45 20 49 4e 54 4f 20 25 73 63 6f 6e 66 69  ACE INTO %sconfi
71c0: 67 28 6e 61 6d 65 2c 76 61 6c 75 65 29 20 56 41  g(name,value) VA
71d0: 4c 55 45 53 28 25 51 2c 25 64 29 22 2c 0a 20 20  LUES(%Q,%d)",.  
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6c                gl
71f0: 6f 62 61 6c 46 6c 61 67 20 3f 20 22 67 6c 6f 62  obalFlag ? "glob
7200: 61 6c 5f 22 20 3a 20 22 22 2c 20 7a 4e 61 6d 65  al_" : "", zName
7210: 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20  , value);.  if( 
7220: 67 6c 6f 62 61 6c 46 6c 61 67 20 26 26 20 67 2e  globalFlag && g.
7230: 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20 29  repositoryOpen )
7240: 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65  {.    db_multi_e
7250: 78 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d  xec("DELETE FROM
7260: 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61   config WHERE na
7270: 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a  me=%Q", zName);.
7280: 20 20 7d 0a 20 20 64 62 5f 65 6e 64 5f 74 72 61    }.  db_end_tra
7290: 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 7d 0a 69  nsaction(0);.}.i
72a0: 6e 74 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61  nt db_get_boolea
72b0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  n(const char *zN
72c0: 61 6d 65 2c 20 69 6e 74 20 64 66 6c 74 29 7b 0a  ame, int dflt){.
72d0: 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 64    char *zVal = d
72e0: 62 5f 67 65 74 28 7a 4e 61 6d 65 2c 20 64 66 6c  b_get(zName, dfl
72f0: 74 20 3f 20 22 6f 6e 22 20 3a 20 22 6f 66 66 22  t ? "on" : "off"
7300: 29 3b 0a 20 20 69 66 28 20 69 73 5f 74 72 75 74  );.  if( is_trut
7310: 68 28 7a 56 61 6c 29 20 29 20 72 65 74 75 72 6e  h(zVal) ) return
7320: 20 31 3b 0a 20 20 69 66 28 20 69 73 5f 66 61 6c   1;.  if( is_fal
7330: 73 65 28 7a 56 61 6c 29 20 29 20 72 65 74 75 72  se(zVal) ) retur
7340: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 64 66  n 0;.  return df
7350: 6c 74 3b 0a 7d 0a 63 68 61 72 20 2a 64 62 5f 6c  lt;.}.char *db_l
7360: 67 65 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  get(const char *
7370: 7a 4e 61 6d 65 2c 20 63 68 61 72 20 2a 7a 44 65  zName, char *zDe
7380: 66 61 75 6c 74 29 7b 0a 20 20 72 65 74 75 72 6e  fault){.  return
7390: 20 64 62 5f 74 65 78 74 28 28 63 68 61 72 2a 29   db_text((char*)
73a0: 7a 44 65 66 61 75 6c 74 2c 0a 20 20 20 20 20 20  zDefault,.      
73b0: 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
73c0: 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 76 76  CT value FROM vv
73d0: 61 72 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ar WHERE name=%Q
73e0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 76 6f 69  ", zName);.}.voi
73f0: 64 20 64 62 5f 6c 73 65 74 28 63 6f 6e 73 74 20  d db_lset(const 
7400: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
7410: 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 29  st char *zValue)
7420: 7b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65  {.  db_multi_exe
7430: 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  c("REPLACE INTO 
7440: 76 76 61 72 28 6e 61 6d 65 2c 76 61 6c 75 65 29  vvar(name,value)
7450: 20 56 41 4c 55 45 53 28 25 51 2c 25 51 29 22 2c   VALUES(%Q,%Q)",
7460: 20 7a 4e 61 6d 65 2c 20 7a 56 61 6c 75 65 29 3b   zName, zValue);
7470: 0a 7d 0a 69 6e 74 20 64 62 5f 6c 67 65 74 5f 69  .}.int db_lget_i
7480: 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  nt(const char *z
7490: 4e 61 6d 65 2c 20 69 6e 74 20 64 66 6c 74 29 7b  Name, int dflt){
74a0: 0a 20 20 72 65 74 75 72 6e 20 64 62 5f 69 6e 74  .  return db_int
74b0: 28 64 66 6c 74 2c 20 22 53 45 4c 45 43 54 20 76  (dflt, "SELECT v
74c0: 61 6c 75 65 20 46 52 4f 4d 20 76 76 61 72 20 57  alue FROM vvar W
74d0: 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a  HERE name=%Q", z
74e0: 4e 61 6d 65 29 3b 0a 7d 0a 76 6f 69 64 20 64 62  Name);.}.void db
74f0: 5f 6c 73 65 74 5f 69 6e 74 28 63 6f 6e 73 74 20  _lset_int(const 
7500: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
7510: 20 76 61 6c 75 65 29 7b 0a 20 20 64 62 5f 6d 75   value){.  db_mu
7520: 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43  lti_exec("REPLAC
7530: 45 20 49 4e 54 4f 20 76 76 61 72 28 6e 61 6d 65  E INTO vvar(name
7540: 2c 76 61 6c 75 65 29 20 56 41 4c 55 45 53 28 25  ,value) VALUES(%
7550: 51 2c 25 64 29 22 2c 20 7a 4e 61 6d 65 2c 20 76  Q,%d)", zName, v
7560: 61 6c 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  alue);.}../*.** 
7570: 52 65 63 6f 72 64 20 74 68 65 20 6e 61 6d 65 20  Record the name 
7580: 6f 66 20 61 20 6c 6f 63 61 6c 20 72 65 70 6f 73  of a local repos
7590: 69 74 6f 72 79 20 69 6e 20 74 68 65 20 67 6c 6f  itory in the glo
75a0: 62 61 6c 5f 63 6f 6e 66 69 67 28 29 20 64 61 74  bal_config() dat
75b0: 61 62 61 73 65 2e 0a 2a 2a 20 54 68 65 20 72 65  abase..** The re
75c0: 70 6f 73 74 69 72 6f 79 20 66 69 6c 65 6e 61 6d  postiroy filenam
75d0: 65 20 25 73 20 69 73 20 72 65 63 6f 72 64 65 64  e %s is recorded
75e0: 20 61 73 20 61 6e 20 65 6e 74 72 79 20 77 69 74   as an entry wit
75f0: 68 20 61 20 22 6e 61 6d 65 22 20 66 69 65 6c 64  h a "name" field
7600: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
7610: 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
7620: 20 20 20 20 20 20 20 72 65 70 6f 3a 25 73 0a 2a         repo:%s.*
7630: 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 66  *.** The value f
7640: 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31  ield is set to 1
7650: 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 72 65 63  ..*/.void db_rec
7660: 6f 72 64 5f 72 65 70 6f 73 69 74 6f 72 79 5f 66  ord_repository_f
7670: 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68  ilename(const ch
7680: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
7690: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
76a0: 20 20 69 66 28 20 21 67 2e 6c 6f 63 61 6c 4f 70    if( !g.localOp
76b0: 65 6e 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  en ) return;.   
76c0: 20 7a 4e 61 6d 65 20 3d 20 64 62 5f 6c 67 65 74   zName = db_lget
76d0: 28 22 72 65 70 6f 73 69 74 6f 72 79 22 2c 20 30  ("repository", 0
76e0: 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 6d 75 6c 74  );.  }.  db_mult
76f0: 69 5f 65 78 65 63 28 0a 20 20 20 20 20 22 49 4e  i_exec(.     "IN
7700: 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49  SERT OR IGNORE I
7710: 4e 54 4f 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69  NTO global_confi
7720: 67 28 6e 61 6d 65 2c 76 61 6c 75 65 29 22 0a 20  g(name,value)". 
7730: 20 20 20 20 22 56 41 4c 55 45 53 28 27 72 65 70      "VALUES('rep
7740: 6f 3a 25 71 27 2c 31 29 22 2c 0a 20 20 20 20 20  o:%q',1)",.     
7750: 7a 4e 61 6d 65 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a  zName.  );.}../*
7760: 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 6f 70 65  .** COMMAND: ope
7770: 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 6f  n.**.** Usage: o
7780: 70 65 6e 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a  pen FILENAME.**.
7790: 2a 2a 20 4f 70 65 6e 20 61 20 63 6f 6e 6e 65 63  ** Open a connec
77a0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 6f 63 61  tion to the loca
77b0: 6c 20 72 65 70 6f 73 69 74 6f 72 79 20 69 6e 20  l repository in 
77c0: 46 49 4c 45 4e 41 4d 45 2e 20 20 41 20 63 68 65  FILENAME.  A che
77d0: 63 6b 6f 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65  ckout.** for the
77e0: 20 72 65 70 6f 73 69 74 6f 72 79 20 69 73 20 63   repository is c
77f0: 72 65 61 74 65 64 20 77 69 74 68 20 69 74 73 20  reated with its 
7800: 72 6f 6f 74 20 61 74 20 74 68 65 20 77 6f 72 6b  root at the work
7810: 69 6e 67 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a  ing directory..*
7820: 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22  * See also the "
7830: 63 6c 6f 73 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a  close" command..
7840: 2a 2f 0a 76 6f 69 64 20 63 6d 64 5f 6f 70 65 6e  */.void cmd_open
7850: 28 76 6f 69 64 29 7b 0a 20 20 42 6c 6f 62 20 70  (void){.  Blob p
7860: 61 74 68 3b 0a 20 20 69 6e 74 20 76 69 64 3b 0a  ath;.  int vid;.
7870: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 61    static char *a
7880: 7a 4e 65 77 41 72 67 76 5b 5d 20 3d 20 7b 20 30  zNewArgv[] = { 0
7890: 2c 20 22 75 70 64 61 74 65 22 2c 20 22 2d 2d 6c  , "update", "--l
78a0: 61 74 65 73 74 22 2c 20 30 20 7d 3b 0a 20 20 75  atest", 0 };.  u
78b0: 72 6c 5f 70 72 6f 78 79 5f 6f 70 74 69 6f 6e 73  rl_proxy_options
78c0: 28 29 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63  ();.  if( g.argc
78d0: 21 3d 33 20 29 7b 0a 20 20 20 20 75 73 61 67 65  !=3 ){.    usage
78e0: 28 22 52 45 50 4f 53 49 54 4f 52 59 2d 46 49 4c  ("REPOSITORY-FIL
78f0: 45 4e 41 4d 45 22 29 3b 0a 20 20 7d 0a 20 20 69  ENAME");.  }.  i
7900: 66 28 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c  f( db_open_local
7910: 28 29 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c  () ){.    fossil
7920: 5f 70 61 6e 69 63 28 22 61 6c 72 65 61 64 79 20  _panic("already 
7930: 77 69 74 68 69 6e 20 61 6e 20 6f 70 65 6e 20 74  within an open t
7940: 72 65 65 20 72 6f 6f 74 65 64 20 61 74 20 25 73  ree rooted at %s
7950: 22 2c 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 29  ", g.zLocalRoot)
7960: 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 5f 63 61 6e  ;.  }.  file_can
7970: 6f 6e 69 63 61 6c 5f 6e 61 6d 65 28 67 2e 61 72  onical_name(g.ar
7980: 67 76 5b 32 5d 2c 20 26 70 61 74 68 29 3b 0a 20  gv[2], &path);. 
7990: 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74   db_open_reposit
79a0: 6f 72 79 28 62 6c 6f 62 5f 73 74 72 28 26 70 61  ory(blob_str(&pa
79b0: 74 68 29 29 3b 0a 20 20 64 62 5f 69 6e 69 74 5f  th));.  db_init_
79c0: 64 61 74 61 62 61 73 65 28 22 2e 2f 5f 46 4f 53  database("./_FOS
79d0: 53 49 4c 5f 22 2c 20 7a 4c 6f 63 61 6c 53 63 68  SIL_", zLocalSch
79e0: 65 6d 61 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ema, (char*)0);.
79f0: 20 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28    db_open_local(
7a00: 29 3b 0a 20 20 64 62 5f 6c 73 65 74 28 22 72 65  );.  db_lset("re
7a10: 70 6f 73 69 74 6f 72 79 22 2c 20 62 6c 6f 62 5f  pository", blob_
7a20: 73 74 72 28 26 70 61 74 68 29 29 3b 0a 20 20 64  str(&path));.  d
7a30: 62 5f 72 65 63 6f 72 64 5f 72 65 70 6f 73 69 74  b_record_reposit
7a40: 6f 72 79 5f 66 69 6c 65 6e 61 6d 65 28 62 6c 6f  ory_filename(blo
7a50: 62 5f 73 74 72 28 26 70 61 74 68 29 29 3b 0a 20  b_str(&path));. 
7a60: 20 76 69 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c   vid = db_int(0,
7a70: 20 22 53 45 4c 45 43 54 20 70 69 64 20 46 52 4f   "SELECT pid FRO
7a80: 4d 20 70 6c 69 6e 6b 20 79 22 0a 20 20 20 20 20  M plink y".     
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
7aa0: 48 45 52 45 20 4e 4f 54 20 45 58 49 53 54 53 28  HERE NOT EXISTS(
7ab0: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 6c  SELECT 1 FROM pl
7ac0: 69 6e 6b 20 78 20 57 48 45 52 45 20 78 2e 63 69  ink x WHERE x.ci
7ad0: 64 3d 79 2e 70 69 64 29 22 29 3b 0a 20 20 69 66  d=y.pid)");.  if
7ae0: 28 20 76 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ( vid==0 ){.    
7af0: 64 62 5f 6c 73 65 74 5f 69 6e 74 28 22 63 68 65  db_lset_int("che
7b00: 63 6b 6f 75 74 22 2c 20 31 29 3b 0a 20 20 7d 65  ckout", 1);.  }e
7b10: 6c 73 65 7b 0a 20 20 20 20 64 62 5f 6c 73 65 74  lse{.    db_lset
7b20: 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75 74 22 2c  _int("checkout",
7b30: 20 76 69 64 29 3b 0a 20 20 20 20 67 2e 61 72 67   vid);.    g.arg
7b40: 76 20 3d 20 61 7a 4e 65 77 41 72 67 76 3b 0a 20  v = azNewArgv;. 
7b50: 20 20 20 67 2e 61 72 67 63 20 3d 20 33 3b 0a 20     g.argc = 3;. 
7b60: 20 20 20 75 70 64 61 74 65 5f 63 6d 64 28 29 3b     update_cmd();
7b70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  .  }.}../*.** Pr
7b80: 69 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  int the value of
7b90: 20 61 20 73 65 74 74 69 6e 67 20 6e 61 6d 65 64   a setting named
7ba0: 20 7a 4e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63   zName.*/.static
7bb0: 20 76 6f 69 64 20 70 72 69 6e 74 5f 73 65 74 74   void print_sett
7bc0: 69 6e 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ing(const char *
7bd0: 7a 4e 61 6d 65 29 7b 0a 20 20 53 74 6d 74 20 71  zName){.  Stmt q
7be0: 3b 0a 20 20 69 66 28 20 67 2e 72 65 70 6f 73 69  ;.  if( g.reposi
7bf0: 74 6f 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20 20  toryOpen ){.    
7c00: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20  db_prepare(&q,. 
7c10: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 27 28        "SELECT '(
7c20: 6c 6f 63 61 6c 29 27 2c 20 76 61 6c 75 65 20 46  local)', value F
7c30: 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45  ROM config WHERE
7c40: 20 6e 61 6d 65 3d 25 51 22 0a 20 20 20 20 20 20   name=%Q".      
7c50: 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20   " UNION ALL ". 
7c60: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 27 28        "SELECT '(
7c70: 67 6c 6f 62 61 6c 29 27 2c 20 76 61 6c 75 65 20  global)', value 
7c80: 46 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66  FROM global_conf
7c90: 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ig WHERE name=%Q
7ca0: 22 2c 0a 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c  ",.       zName,
7cb0: 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20   zName.    );.  
7cc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 5f 70 72  }else{.    db_pr
7cd0: 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20 20 20  epare(&q,.      
7ce0: 22 53 45 4c 45 43 54 20 27 28 67 6c 6f 62 61 6c  "SELECT '(global
7cf0: 29 27 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20 67  )', value FROM g
7d00: 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45  lobal_config WHE
7d10: 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
7d20: 20 20 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a     zName.    );.
7d30: 20 20 7d 0a 20 20 69 66 28 20 64 62 5f 73 74 65    }.  if( db_ste
7d40: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
7d50: 57 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  W ){.    printf(
7d60: 22 25 2d 32 30 73 20 25 2d 38 73 20 25 73 5c 6e  "%-20s %-8s %s\n
7d70: 22 2c 20 7a 4e 61 6d 65 2c 20 64 62 5f 63 6f 6c  ", zName, db_col
7d80: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 2c  umn_text(&q, 0),
7d90: 0a 20 20 20 20 20 20 20 20 64 62 5f 63 6f 6c 75  .        db_colu
7da0: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 29 3b  mn_text(&q, 1));
7db0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72  .  }else{.    pr
7dc0: 69 6e 74 66 28 22 25 2d 32 30 73 5c 6e 22 2c 20  intf("%-20s\n", 
7dd0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 64 62  zName);.  }.  db
7de0: 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 7d  _finalize(&q);.}
7df0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44  .../*.** COMMAND
7e00: 3a 20 73 65 74 74 69 6e 67 73 0a 2a 2a 20 43 4f  : settings.** CO
7e10: 4d 4d 41 4e 44 3a 20 75 6e 73 65 74 0a 2a 2a 20  MMAND: unset.** 
7e20: 25 66 6f 73 73 69 6c 20 73 65 74 74 69 6e 67 20  %fossil setting 
7e30: 3f 50 52 4f 50 45 52 54 59 3f 20 3f 56 41 4c 55  ?PROPERTY? ?VALU
7e40: 45 3f 20 3f 2d 67 6c 6f 62 61 6c 3f 0a 2a 2a 20  E? ?-global?.** 
7e50: 25 66 6f 73 73 69 6c 20 75 6e 73 65 74 20 50 52  %fossil unset PR
7e60: 4f 50 45 52 54 59 20 3f 2d 67 6c 6f 62 61 6c 3f  OPERTY ?-global?
7e70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 73 65 74 74  .**.** The "sett
7e80: 69 6e 67 22 20 63 6f 6d 6d 61 6e 64 20 77 69 74  ing" command wit
7e90: 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6c  h no arguments l
7ea0: 69 73 74 73 20 61 6c 6c 20 70 72 6f 70 65 72 74  ists all propert
7eb0: 69 65 73 20 61 6e 64 20 74 68 65 69 72 0a 2a 2a  ies and their.**
7ec0: 20 76 61 6c 75 65 73 2e 20 20 57 69 74 68 20 6a   values.  With j
7ed0: 75 73 74 20 61 20 70 72 6f 70 65 72 74 79 20 6e  ust a property n
7ee0: 61 6d 65 20 69 74 20 73 68 6f 77 73 20 74 68 65  ame it shows the
7ef0: 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 70   value of that p
7f00: 72 6f 70 65 72 74 79 2e 0a 2a 2a 20 57 69 74 68  roperty..** With
7f10: 20 61 20 76 61 6c 75 65 20 61 72 67 75 6d 65 6e   a value argumen
7f20: 74 20 69 74 20 63 68 61 6e 67 65 73 20 74 68 65  t it changes the
7f30: 20 70 72 6f 70 65 72 74 79 20 66 6f 72 20 74 68   property for th
7f40: 65 20 63 75 72 72 65 6e 74 20 72 65 70 6f 73 69  e current reposi
7f50: 74 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tory..**.** The 
7f60: 22 75 6e 73 65 74 22 20 63 6f 6d 6d 61 6e 64 20  "unset" command 
7f70: 63 6c 65 61 72 73 20 61 20 70 72 6f 70 65 72 74  clears a propert
7f80: 79 20 73 65 74 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  y setting..**.**
7f90: 20 20 20 20 61 75 74 6f 73 79 6e 63 20 20 20 20      autosync    
7fa0: 20 20 20 20 20 49 66 20 65 6e 61 62 6c 65 64 2c       If enabled,
7fb0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 70   automatically p
7fc0: 75 6c 6c 20 70 72 69 6f 72 20 74 6f 0a 2a 2a 20  ull prior to.** 
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fe0: 20 20 20 20 63 6f 6d 6d 69 74 20 6f 72 20 75 70      commit or up
7ff0: 64 61 74 65 20 61 6e 64 20 61 75 74 6f 6d 61 74  date and automat
8000: 69 63 61 6c 6c 79 20 70 75 73 68 0a 2a 2a 20 20  ically push.**  
8010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8020: 20 20 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 20     after commit 
8030: 6f 72 20 74 61 67 20 6f 72 20 62 72 61 6e 63 68  or tag or branch
8040: 20 63 72 65 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   creation..**.**
8050: 20 20 20 20 64 69 66 66 2d 63 6f 6d 6d 61 6e 64      diff-command
8060: 20 20 20 20 20 45 78 74 65 72 6e 61 6c 20 63 6f       External co
8070: 6d 6d 61 6e 64 20 74 6f 20 72 75 6e 20 77 68 65  mmand to run whe
8080: 6e 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 64  n performing a d
8090: 69 66 66 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  iff..**         
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 75              If u
80b0: 6e 64 65 66 69 6e 65 64 2c 20 74 68 65 20 69 6e  ndefined, the in
80c0: 74 65 72 6e 61 6c 20 74 65 78 74 20 64 69 66 66  ternal text diff
80d0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a   will be used..*
80e0: 2a 0a 2a 2a 20 20 20 20 65 64 69 74 6f 72 20 20  *.**    editor  
80f0: 20 20 20 20 20 20 20 20 20 54 65 78 74 20 65 64           Text ed
8100: 69 74 6f 72 20 63 6f 6d 6d 61 6e 64 20 75 73 65  itor command use
8110: 64 20 66 6f 72 20 63 68 65 63 6b 2d 69 6e 20 63  d for check-in c
8120: 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 20  omments..**.**  
8130: 20 20 67 64 69 66 66 2d 63 6f 6d 6d 61 6e 64 20    gdiff-command 
8140: 20 20 20 45 78 74 65 72 6e 61 6c 20 63 6f 6d 6d     External comm
8150: 61 6e 64 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  and to run when 
8160: 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 67 72 61  performing a gra
8170: 70 68 69 63 61 6c 0a 2a 2a 20 20 20 20 20 20 20  phical.**       
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
8190: 66 66 2e 20 49 66 20 75 6e 64 65 66 69 6e 65 64  ff. If undefined
81a0: 2c 20 74 65 78 74 20 64 69 66 66 20 77 69 6c 6c  , text diff will
81b0: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
81c0: 20 20 20 69 6e 68 65 72 69 74 2d 61 6e 6f 6e 20     inherit-anon 
81d0: 20 20 20 20 49 66 20 65 6e 61 62 6c 65 64 2c 20      If enabled, 
81e0: 61 6e 79 20 77 65 62 20 75 73 65 72 20 69 6e 68  any web user inh
81f0: 65 72 69 74 73 20 63 61 70 61 62 69 6c 69 74 69  erits capabiliti
8200: 65 73 20 66 72 6f 6d 0a 2a 2a 20 20 20 20 20 20  es from.**      
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
8220: 6e 6f 6e 79 6d 6f 75 73 20 61 73 20 77 65 6c 6c  nonymous as well
8230: 20 61 73 20 6e 6f 62 6f 64 79 2e 0a 2a 2a 0a 2a   as nobody..**.*
8240: 2a 20 20 20 20 6c 6f 63 61 6c 61 75 74 68 20 20  *    localauth  
8250: 20 20 20 20 20 20 49 66 20 65 6e 61 62 6c 65 64        If enabled
8260: 2c 20 72 65 71 75 69 72 65 20 74 68 61 74 20 48  , require that H
8270: 54 54 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  TTP connections 
8280: 66 72 6f 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20  from.**         
8290: 20 20 20 20 20 20 20 20 20 20 20 20 31 32 37 2e              127.
82a0: 30 2e 30 2e 31 20 62 65 20 61 75 74 68 65 6e 74  0.0.1 be authent
82b0: 69 63 61 74 65 64 20 62 79 20 70 61 73 73 77 6f  icated by passwo
82c0: 72 64 2e 20 20 49 66 0a 2a 2a 20 20 20 20 20 20  rd.  If.**      
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
82e0: 61 6c 73 65 2c 20 61 6c 6c 20 48 54 54 50 20 72  alse, all HTTP r
82f0: 65 71 75 65 73 74 73 20 66 72 6f 6d 20 6c 6f 63  equests from loc
8300: 61 6c 68 6f 73 74 20 68 61 76 65 0a 2a 2a 20 20  alhost have.**  
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8320: 20 20 20 75 6e 72 65 73 74 72 69 63 74 65 64 20     unrestricted 
8330: 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 72 65  access to the re
8340: 70 6f 73 69 74 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  pository..**.** 
8350: 20 20 20 63 6c 65 61 72 73 69 67 6e 20 20 20 20     clearsign    
8360: 20 20 20 20 57 68 65 6e 20 65 6e 61 62 6c 65 64      When enabled
8370: 20 28 74 68 65 20 64 65 66 61 75 6c 74 29 2c 20   (the default), 
8380: 66 6f 73 73 69 6c 20 77 69 6c 6c 20 61 74 74 65  fossil will atte
8390: 6d 70 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  mpt to.**       
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
83b0: 67 6e 20 61 6c 6c 20 63 6f 6d 6d 69 74 73 20 77  gn all commits w
83c0: 69 74 68 20 67 70 67 2e 20 20 57 68 65 6e 20 64  ith gpg.  When d
83d0: 69 73 61 62 6c 65 64 2c 20 63 6f 6d 6d 69 74 73  isabled, commits
83e0: 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 20 20 20   will.**        
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65 20               be 
8400: 75 6e 73 69 67 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  unsigned..**.** 
8410: 20 20 20 70 67 70 2d 63 6f 6d 6d 61 6e 64 20 20     pgp-command  
8420: 20 20 20 20 43 6f 6d 6d 61 6e 64 20 75 73 65 64      Command used
8430: 20 74 6f 20 63 6c 65 61 72 2d 73 69 67 6e 20 6d   to clear-sign m
8440: 61 6e 69 66 65 73 74 73 20 61 74 20 63 68 65 63  anifests at chec
8450: 6b 2d 69 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20  k-in..**        
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65               The
8470: 20 64 65 66 61 75 6c 74 20 69 73 20 22 67 70 67   default is "gpg
8480: 20 2d 2d 63 6c 65 61 72 73 69 67 6e 20 2d 6f 20   --clearsign -o 
8490: 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 72 6f 78  "..**.**    prox
84a0: 79 20 20 20 20 20 20 20 20 20 20 20 20 55 52 4c  y            URL
84b0: 20 6f 66 20 74 68 65 20 48 54 54 50 20 70 72 6f   of the HTTP pro
84c0: 78 79 2e 20 20 49 66 20 75 6e 64 65 66 69 6e 65  xy.  If undefine
84d0: 64 20 6f 72 20 22 6f 66 66 22 20 74 68 65 6e 0a  d or "off" then.
84e0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
84f0: 20 20 20 20 20 20 20 74 68 65 20 22 68 74 74 70         the "http
8500: 5f 70 72 6f 78 79 22 20 65 6e 76 69 72 6f 6e 6d  _proxy" environm
8510: 65 6e 74 20 76 61 72 69 61 62 6c 65 20 69 73 20  ent variable is 
8520: 63 6f 6e 73 75 6c 74 65 64 2e 0a 2a 2a 20 20 20  consulted..**   
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 49 66 20 74 68 65 20 68 74 74 70 5f 70 72    If the http_pr
8550: 6f 78 79 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  oxy environment 
8560: 76 61 72 69 61 62 6c 65 20 69 73 20 75 6e 64 65  variable is unde
8570: 66 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  fined.**        
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
8590: 6e 20 61 20 64 69 72 65 63 74 20 48 54 54 50 20  n a direct HTTP 
85a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 75 73  connection is us
85b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 77 65 62  ed..**.**    web
85c0: 2d 62 72 6f 77 73 65 72 20 20 20 20 20 20 41 20  -browser      A 
85d0: 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 20 75 73  shell command us
85e0: 65 64 20 74 6f 20 6c 61 75 6e 63 68 20 79 6f 75  ed to launch you
85f0: 72 20 70 72 65 66 65 72 72 65 64 0a 2a 2a 20 20  r preferred.**  
8600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8610: 20 20 20 77 65 62 20 62 72 6f 77 73 65 72 20 77     web browser w
8620: 68 65 6e 20 67 69 76 65 6e 20 61 20 55 52 4c 20  hen given a URL 
8630: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
8640: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
8650: 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 73 20         Defaults 
8660: 74 6f 20 22 73 74 61 72 74 22 20 6f 6e 20 77 69  to "start" on wi
8670: 6e 64 6f 77 73 2c 20 22 6f 70 65 6e 22 20 6f 6e  ndows, "open" on
8680: 20 4d 61 63 2c 0a 2a 2a 20 20 20 20 20 20 20 20   Mac,.**        
8690: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
86a0: 20 22 66 69 72 65 66 6f 78 22 20 6f 6e 20 55 6e   "firefox" on Un
86b0: 69 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 65 74 74  ix..*/.void sett
86c0: 69 6e 67 5f 63 6d 64 28 76 6f 69 64 29 7b 0a 20  ing_cmd(void){. 
86d0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
86e0: 61 72 20 2a 61 7a 4e 61 6d 65 5b 5d 20 3d 20 7b  ar *azName[] = {
86f0: 0a 20 20 20 20 22 61 75 74 6f 73 79 6e 63 22 2c  .    "autosync",
8700: 0a 20 20 20 20 22 64 69 66 66 2d 63 6f 6d 6d 61  .    "diff-comma
8710: 6e 64 22 2c 0a 20 20 20 20 22 65 64 69 74 6f 72  nd",.    "editor
8720: 22 2c 0a 20 20 20 20 22 67 64 69 66 66 2d 63 6f  ",.    "gdiff-co
8730: 6d 6d 61 6e 64 22 2c 0a 20 20 20 20 22 69 6e 68  mmand",.    "inh
8740: 65 72 69 74 2d 61 6e 6f 6e 22 2c 0a 20 20 20 20  erit-anon",.    
8750: 22 6c 6f 63 61 6c 61 75 74 68 22 2c 0a 20 20 20  "localauth",.   
8760: 20 22 63 6c 65 61 72 73 69 67 6e 22 2c 0a 20 20   "clearsign",.  
8770: 20 20 22 70 67 70 2d 63 6f 6d 6d 61 6e 64 22 2c    "pgp-command",
8780: 0a 20 20 20 20 22 70 72 6f 78 79 22 2c 0a 20 20  .    "proxy",.  
8790: 20 20 22 77 65 62 2d 62 72 6f 77 73 65 72 22 2c    "web-browser",
87a0: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
87b0: 20 69 6e 74 20 67 6c 6f 62 61 6c 46 6c 61 67 20   int globalFlag 
87c0: 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 67  = find_option("g
87d0: 6c 6f 62 61 6c 22 2c 22 67 22 2c 30 29 21 3d 30  lobal","g",0)!=0
87e0: 3b 0a 20 20 69 6e 74 20 75 6e 73 65 74 46 6c 61  ;.  int unsetFla
87f0: 67 20 3d 20 67 2e 61 72 67 76 5b 31 5d 5b 30 5d  g = g.argv[1][0]
8800: 3d 3d 27 75 27 3b 0a 20 20 64 62 5f 66 69 6e 64  =='u';.  db_find
8810: 5f 61 6e 64 5f 6f 70 65 6e 5f 72 65 70 6f 73 69  _and_open_reposi
8820: 74 6f 72 79 28 30 29 3b 0a 20 20 69 66 28 20 21  tory(0);.  if( !
8830: 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e  g.repositoryOpen
8840: 20 29 7b 0a 20 20 20 20 64 62 5f 6f 70 65 6e 5f   ){.    db_open_
8850: 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 67 6c  config();.    gl
8860: 6f 62 61 6c 46 6c 61 67 20 3d 20 31 3b 0a 20 20  obalFlag = 1;.  
8870: 7d 0a 20 20 69 66 28 20 75 6e 73 65 74 46 6c 61  }.  if( unsetFla
8880: 67 20 26 26 20 67 2e 61 72 67 63 21 3d 33 20 29  g && g.argc!=3 )
8890: 7b 0a 20 20 20 20 75 73 61 67 65 28 22 50 52 4f  {.    usage("PRO
88a0: 50 45 52 54 59 20 3f 2d 67 6c 6f 62 61 6c 3f 22  PERTY ?-global?"
88b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e 61  );.  }.  if( g.a
88c0: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 66 6f  rgc==2 ){.    fo
88d0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
88e0: 61 7a 4e 61 6d 65 29 2f 73 69 7a 65 6f 66 28 61  azName)/sizeof(a
88f0: 7a 4e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b  zName[0]); i++){
8900: 0a 20 20 20 20 20 20 70 72 69 6e 74 5f 73 65 74  .      print_set
8910: 74 69 6e 67 28 61 7a 4e 61 6d 65 5b 69 5d 29 3b  ting(azName[i]);
8920: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
8930: 66 28 20 67 2e 61 72 67 63 3d 3d 33 20 7c 7c 20  f( g.argc==3 || 
8940: 67 2e 61 72 67 63 3d 3d 34 20 29 7b 0a 20 20 20  g.argc==4 ){.   
8950: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
8960: 6d 65 20 3d 20 67 2e 61 72 67 76 5b 32 5d 3b 0a  me = g.argv[2];.
8970: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
8980: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  en(zName);.    f
8990: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
89a0: 28 61 7a 4e 61 6d 65 29 2f 73 69 7a 65 6f 66 28  (azName)/sizeof(
89b0: 61 7a 4e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29  azName[0]); i++)
89c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
89d0: 63 6d 70 28 61 7a 4e 61 6d 65 5b 69 5d 2c 20 7a  cmp(azName[i], z
89e0: 4e 61 6d 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72  Name, n)==0 ) br
89f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
8a00: 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 7a 4e  f( i>=sizeof(azN
8a10: 61 6d 65 29 2f 73 69 7a 65 6f 66 28 61 7a 4e 61  ame)/sizeof(azNa
8a20: 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  me[0]) ){.      
8a30: 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e 6f  fossil_fatal("no
8a40: 20 73 75 63 68 20 73 65 74 74 69 6e 67 3a 20 25   such setting: %
8a50: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
8a60: 7d 0a 20 20 20 20 69 66 28 20 75 6e 73 65 74 46  }.    if( unsetF
8a70: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 64 62 5f  lag ){.      db_
8a80: 75 6e 73 65 74 28 61 7a 4e 61 6d 65 5b 69 5d 2c  unset(azName[i],
8a90: 20 67 6c 6f 62 61 6c 46 6c 61 67 29 3b 0a 20 20   globalFlag);.  
8aa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 67 2e 61 72    }else if( g.ar
8ab0: 67 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 64  gc==4 ){.      d
8ac0: 62 5f 73 65 74 28 61 7a 4e 61 6d 65 5b 69 5d 2c  b_set(azName[i],
8ad0: 20 67 2e 61 72 67 76 5b 33 5d 2c 20 67 6c 6f 62   g.argv[3], glob
8ae0: 61 6c 46 6c 61 67 29 3b 0a 20 20 20 20 7d 65 6c  alFlag);.    }el
8af0: 73 65 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 5f  se{.      print_
8b00: 73 65 74 74 69 6e 67 28 61 7a 4e 61 6d 65 5b 69  setting(azName[i
8b10: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ]);.    }.  }els
8b20: 65 7b 0a 20 20 20 20 75 73 61 67 65 28 22 3f 50  e{.    usage("?P
8b30: 52 4f 50 45 52 54 59 3f 20 3f 56 41 4c 55 45 3f  ROPERTY? ?VALUE?
8b40: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
8b50: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 6f   SQL function to
8b60: 20 72 65 6e 64 65 72 20 61 20 55 55 49 44 20 61   render a UUID a
8b70: 73 20 61 20 68 79 70 65 72 6c 69 6e 6b 20 74 6f  s a hyperlink to
8b80: 20 61 20 70 61 67 65 20 64 65 73 63 72 69 62 69   a page describi
8b90: 6e 67 0a 2a 2a 20 74 68 61 74 20 55 55 49 44 2e  ng.** that UUID.
8ba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8bb0: 68 79 70 65 72 6c 69 6e 6b 55 75 69 64 46 75 6e  hyperlinkUuidFun
8bc0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
8bd0: 74 65 78 74 20 2a 70 43 78 74 2c 20 20 20 20 20  text *pCxt,     
8be0: 2f 2a 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74  /* function cont
8bf0: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  ext */.  int arg
8c00: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
8c10: 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66      /* number of
8c20: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
8c30: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
8c40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8c50: 61 72 67 76 20 20 20 20 20 20 20 2f 2a 20 76 61  argv       /* va
8c60: 6c 75 65 73 20 6f 66 20 61 6c 6c 20 66 75 6e 63  lues of all func
8c70: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
8c80: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
8c90: 72 20 2a 7a 55 75 69 64 3b 20 20 20 20 20 20 20  r *zUuid;       
8ca0: 20 20 2f 2a 20 54 68 65 20 55 55 49 44 20 74 6f    /* The UUID to
8cb0: 20 72 65 6e 64 65 72 20 2a 2f 0a 20 20 63 68 61   render */.  cha
8cc0: 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
8cd0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6e 64 65          /* Rende
8ce0: 72 65 64 20 48 54 4d 4c 20 74 65 78 74 20 2a 2f  red HTML text */
8cf0: 0a 0a 20 20 7a 55 75 69 64 20 3d 20 28 63 6f 6e  ..  zUuid = (con
8d00: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
8d10: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8d20: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 67 2e 6f 6b  [0]);.  if( g.ok
8d30: 48 69 73 74 6f 72 79 20 26 26 20 7a 55 75 69 64  History && zUuid
8d40: 20 26 26 20 73 74 72 6c 65 6e 28 7a 55 75 69 64   && strlen(zUuid
8d50: 29 3e 3d 31 30 20 29 7b 0a 20 20 20 20 7a 20 3d  )>=10 ){.    z =
8d60: 20 6d 70 72 69 6e 74 66 28 22 3c 74 74 3e 3c 61   mprintf("<tt><a
8d70: 20 68 72 65 66 3d 27 25 73 2f 76 69 6e 66 6f 2f   href='%s/vinfo/
8d80: 25 74 27 3e 3c 73 70 61 6e 20 73 74 79 6c 65 3d  %t'><span style=
8d90: 27 66 6f 6e 74 2d 73 69 7a 65 3a 31 2e 35 65 6d  'font-size:1.5em
8da0: 27 3e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  '>".            
8db0: 20 20 20 20 22 25 23 68 3c 2f 73 70 61 6e 3e 25      "%#h</span>%
8dc0: 68 3c 2f 61 3e 3c 2f 74 74 3e 22 2c 0a 20 20 20  h</a></tt>",.   
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 2e 7a               g.z
8de0: 42 61 73 65 55 52 4c 2c 20 7a 55 75 69 64 2c 20  BaseURL, zUuid, 
8df0: 31 30 2c 20 7a 55 75 69 64 2c 20 26 7a 55 75 69  10, zUuid, &zUui
8e00: 64 5b 31 30 5d 29 3b 0a 20 20 20 20 73 71 6c 69  d[10]);.    sqli
8e10: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
8e20: 70 43 78 74 2c 20 7a 2c 20 2d 31 2c 20 66 72 65  pCxt, z, -1, fre
8e30: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
8e40: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8e50: 74 65 78 74 28 70 43 78 74 2c 20 7a 55 75 69 64  text(pCxt, zUuid
8e60: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
8e70: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a  NSIENT);.  }.}..
8e80: 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  /*.** SQL functi
8e90: 6f 6e 20 74 6f 20 72 65 6e 64 65 72 20 61 20 54  on to render a T
8ea0: 41 47 49 44 20 61 73 20 61 20 68 79 70 65 72 6c  AGID as a hyperl
8eb0: 69 6e 6b 20 74 6f 20 61 20 70 61 67 65 20 64 65  ink to a page de
8ec0: 73 63 72 69 62 69 6e 67 0a 2a 2a 20 74 68 61 74  scribing.** that
8ed0: 20 74 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   tag..*/.static 
8ee0: 76 6f 69 64 20 68 79 70 65 72 6c 69 6e 6b 54 61  void hyperlinkTa
8ef0: 67 69 64 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  gidFunc(.  sqlit
8f00: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 78 74  e3_context *pCxt
8f10: 2c 20 20 20 20 20 2f 2a 20 66 75 6e 63 74 69 6f  ,     /* functio
8f20: 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  n context */.  i
8f30: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d            /* num
8f50: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8f60: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
8f70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
8f80: 6c 75 65 20 2a 2a 61 72 67 76 20 20 20 20 20 20  lue **argv      
8f90: 20 2f 2a 20 76 61 6c 75 65 73 20 6f 66 20 61 6c   /* values of al
8fa0: 6c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  l function argum
8fb0: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
8fc0: 20 74 61 67 69 64 3b 20 20 20 20 20 20 20 20 20   tagid;         
8fd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
8fe0: 61 67 69 64 20 74 6f 20 72 65 6e 64 65 72 20 2a  agid to render *
8ff0: 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9010: 2a 20 72 65 6e 64 65 72 65 64 20 68 74 6d 6c 20  * rendered html 
9020: 74 65 78 74 20 2a 2f 0a 0a 20 20 74 61 67 69 64  text */..  tagid
9030: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
9040: 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  _int(argv[0]);. 
9050: 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72 79   if( g.okHistory
9060: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 6d 70 72 69   ){.    z = mpri
9070: 6e 74 66 28 22 3c 61 20 68 72 65 66 3d 27 25 73  ntf("<a href='%s
9080: 2f 74 61 67 76 69 65 77 3f 74 61 67 69 64 3d 25  /tagview?tagid=%
9090: 64 27 3e 25 64 3c 2f 61 3e 22 2c 20 0a 20 20 20  d'>%d</a>", .   
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
90b0: 2e 7a 42 61 73 65 55 52 4c 2c 20 74 61 67 69 64  .zBaseURL, tagid
90c0: 2c 20 74 61 67 69 64 29 3b 0a 20 20 7d 65 6c 73  , tagid);.  }els
90d0: 65 7b 0a 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e  e{.    z = mprin
90e0: 74 66 28 22 25 64 22 2c 20 74 61 67 69 64 29 3b  tf("%d", tagid);
90f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
9100: 65 73 75 6c 74 5f 74 65 78 74 28 70 43 78 74 2c  esult_text(pCxt,
9110: 20 7a 2c 20 2d 31 2c 20 66 72 65 65 29 3b 0a 7d   z, -1, free);.}
9120: 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63  ../*.** SQL func
9130: 74 69 6f 6e 20 74 6f 20 72 65 6e 64 65 72 20 61  tion to render a
9140: 20 54 41 47 4e 41 4d 45 20 61 73 20 61 20 68 79   TAGNAME as a hy
9150: 70 65 72 6c 69 6e 6b 20 74 6f 20 61 20 70 61 67  perlink to a pag
9160: 65 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20  e describing.** 
9170: 74 68 61 74 20 74 61 67 2e 0a 2a 2f 0a 73 74 61  that tag..*/.sta
9180: 74 69 63 20 76 6f 69 64 20 68 79 70 65 72 6c 69  tic void hyperli
9190: 6e 6b 54 61 67 6e 61 6d 65 46 75 6e 63 28 0a 20  nkTagnameFunc(. 
91a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
91b0: 20 2a 70 43 78 74 2c 20 20 20 20 20 2f 2a 20 66   *pCxt,     /* f
91c0: 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20  unction context 
91d0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* number of arg
9200: 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75  uments to the fu
9210: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  nction */.  sqli
9220: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
9230: 20 20 20 20 20 20 20 2f 2a 20 76 61 6c 75 65 73         /* values
9240: 20 6f 66 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e   of all function
9250: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
9260: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9270: 54 61 67 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Tag;          /*
9280: 20 54 68 65 20 74 61 67 20 74 6f 20 72 65 6e 64   The tag to rend
9290: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  er */.  char *z;
92a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92b0: 20 20 20 2f 2a 20 72 65 6e 64 65 72 65 64 20 68     /* rendered h
92c0: 74 6d 6c 20 74 65 78 74 20 2a 2f 0a 0a 20 20 7a  tml text */..  z
92d0: 54 61 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Tag = (const cha
92e0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
92f0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
9300: 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72    if( g.okHistor
9310: 79 20 29 7b 0a 20 20 20 20 7a 20 3d 20 6d 70 72  y ){.    z = mpr
9320: 69 6e 74 66 28 22 3c 61 20 68 72 65 66 3d 27 25  intf("<a href='%
9330: 73 2f 74 61 67 76 69 65 77 3f 6e 61 6d 65 3d 25  s/tagview?name=%
9340: 54 27 3e 25 68 3c 2f 61 3e 22 2c 20 0a 20 20 20  T'>%h</a>", .   
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
9360: 2e 7a 42 61 73 65 55 52 4c 2c 20 7a 54 61 67 2c  .zBaseURL, zTag,
9370: 20 7a 54 61 67 29 3b 0a 20 20 7d 65 6c 73 65 7b   zTag);.  }else{
9380: 0a 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66  .    z = mprintf
9390: 28 22 25 68 22 2c 20 7a 54 61 67 29 3b 0a 20 20  ("%h", zTag);.  
93a0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
93b0: 6c 74 5f 74 65 78 74 28 70 43 78 74 2c 20 7a 2c  lt_text(pCxt, z,
93c0: 20 2d 31 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 2f   -1, free);.}../
93d0: 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  *.** SQL functio
93e0: 6e 20 74 6f 20 65 73 63 61 70 65 20 61 6c 6c 20  n to escape all 
93f0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 61 20  characters in a 
9400: 73 74 72 69 6e 67 20 74 68 61 74 20 68 61 76 65  string that have
9410: 20 73 70 65 63 69 61 6c 0a 2a 2a 20 6d 65 61 6e   special.** mean
9420: 69 6e 67 20 74 6f 20 48 54 4d 4c 2e 0a 2a 2f 0a  ing to HTML..*/.
9430: 73 74 61 74 69 63 20 76 6f 69 64 20 68 74 6d 6c  static void html
9440: 69 7a 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  izeFunc(.  sqlit
9450: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 78 74  e3_context *pCxt
9460: 2c 20 20 20 20 20 2f 2a 20 66 75 6e 63 74 69 6f  ,     /* functio
9470: 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  n context */.  i
9480: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
9490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d            /* num
94a0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
94b0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
94c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
94d0: 6c 75 65 20 2a 2a 61 72 67 76 20 20 20 20 20 20  lue **argv      
94e0: 20 2f 2a 20 76 61 6c 75 65 73 20 6f 66 20 61 6c   /* values of al
94f0: 6c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  l function argum
9500: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ents */.){.  con
9510: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 3b 20  st char *zText; 
9520: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
9530: 74 6f 20 62 65 20 68 74 6d 6c 69 7a 65 64 20 2a  to be htmlized *
9540: 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9560: 2a 20 72 65 6e 64 65 72 65 64 20 68 74 6d 6c 20  * rendered html 
9570: 74 65 78 74 20 2a 2f 0a 0a 20 20 7a 54 65 78 74  text */..  zText
9580: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
9590: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
95a0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  xt(argv[0]);.  z
95b0: 20 3d 20 68 74 6d 6c 69 7a 65 28 7a 54 65 78 74   = htmlize(zText
95c0: 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , -1);.  sqlite3
95d0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 78  _result_text(pCx
95e0: 74 2c 20 7a 2c 20 2d 31 2c 20 66 72 65 65 29 3b  t, z, -1, free);
95f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9600: 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65 6c 70  outine is a help
9610: 65 72 20 74 6f 20 72 75 6e 20 61 6e 20 53 51 4c  er to run an SQL
9620: 20 71 75 65 72 79 20 61 6e 64 20 74 61 62 6c 65   query and table
9630: 2d 69 7a 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  -ize the.** resu
9640: 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  lts..**.** The z
9650: 53 71 6c 20 70 61 72 61 6d 65 74 65 72 20 73 68  Sql parameter sh
9660: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
9670: 2c 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73  , complete SQL s
9680: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 54 61 62  tatement..** Tab
9690: 6c 65 69 7a 65 64 20 6f 75 74 70 75 74 20 6f 66  leized output of
96a0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
96b0: 6e 74 20 69 73 20 72 65 6e 64 65 72 65 64 20 62  nt is rendered b
96c0: 61 63 6b 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  ack to the clien
96d0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 53  t..**.** The isS
96e0: 61 66 65 20 66 6c 61 67 20 69 73 20 74 72 75 65  afe flag is true
96f0: 20 69 66 20 61 6c 6c 20 71 75 65 72 79 20 72 65   if all query re
9700: 73 75 6c 74 73 20 68 61 76 65 20 62 65 65 6e 20  sults have been 
9710: 70 72 6f 63 65 73 73 65 64 20 0a 2a 2a 20 62 79  processed .** by
9720: 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20 61   routines such a
9730: 73 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 6c  s.**.**        l
9740: 69 6e 6b 75 75 69 64 28 29 0a 2a 2a 20 20 20 20  inkuuid().**    
9750: 20 20 20 20 6c 69 6e 6b 74 61 67 69 64 28 29 0a      linktagid().
9760: 2a 2a 20 20 20 20 20 20 20 20 6c 69 6e 6b 74 61  **        linkta
9770: 67 6e 61 6d 65 28 29 0a 2a 2a 20 20 20 20 20 20  gname().**      
9780: 20 20 68 74 6d 6c 69 7a 65 28 29 0a 2a 2a 0a 2a    htmlize().**.*
9790: 2a 20 61 6e 64 20 61 72 65 20 74 68 65 72 65 66  * and are theref
97a0: 6f 72 65 20 73 61 66 65 20 66 6f 72 20 64 69 72  ore safe for dir
97b0: 65 63 74 20 72 65 6e 64 65 72 69 6e 67 2e 20 20  ect rendering.  
97c0: 49 66 20 69 73 53 61 66 65 20 69 73 20 66 61 6c  If isSafe is fal
97d0: 73 65 2c 0a 2a 2a 20 74 68 65 6e 20 61 6c 6c 20  se,.** then all 
97e0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
97f0: 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74  e query result t
9800: 68 61 74 20 68 61 76 65 20 73 70 65 63 69 61 6c  hat have special
9810: 20 6d 65 61 6e 69 6e 67 0a 2a 2a 20 74 6f 20 48   meaning.** to H
9820: 54 4d 4c 20 61 72 65 20 65 73 63 61 70 65 64 2e  TML are escaped.
9830: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 53  .**.** Returns S
9840: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
9850: 65 73 73 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  ess and any othe
9860: 72 20 76 61 6c 75 65 20 6f 6e 20 65 72 72 6f 72  r value on error
9870: 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 67 65 6e 65  ..*/.int db_gene
9880: 72 69 63 5f 71 75 65 72 79 5f 76 69 65 77 28 63  ric_query_view(c
9890: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
98a0: 20 69 6e 74 20 69 73 53 61 66 65 29 7b 0a 20 20   int isSafe){.  
98b0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
98c0: 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  tmt;.  int rc;. 
98d0: 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 3b 0a 20 20   int nCol, i;.  
98e0: 69 6e 74 20 6e 52 6f 77 3b 0a 20 20 63 6f 6e 73  int nRow;.  cons
98f0: 74 20 63 68 61 72 20 2a 7a 52 6f 77 3b 0a 20 20  t char *zRow;.  
9900: 73 74 61 74 69 63 20 69 6e 74 20 6f 6e 63 65 20  static int once 
9910: 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 6e 73 74 61  = 1;..  /* Insta
9920: 6c 6c 20 74 68 65 20 73 70 65 63 69 61 6c 20 66  ll the special f
9930: 75 6e 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  unctions on the 
9940: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 74 68  first call to th
9950: 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
9960: 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20  if( once ){.    
9970: 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  once = 0;.    sq
9980: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
9990: 63 74 69 6f 6e 28 67 2e 64 62 2c 20 22 6c 69 6e  ction(g.db, "lin
99a0: 6b 75 75 69 64 22 2c 20 31 2c 20 53 51 4c 49 54  kuuid", 1, SQLIT
99b0: 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20  E_UTF8, 0, .    
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99d0: 20 20 20 20 20 20 20 20 68 79 70 65 72 6c 69 6e          hyperlin
99e0: 6b 55 75 69 64 46 75 6e 63 2c 20 30 2c 20 30 29  kUuidFunc, 0, 0)
99f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ;.    sqlite3_cr
9a00: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 67 2e  eate_function(g.
9a10: 64 62 2c 20 22 6c 69 6e 6b 74 61 67 69 64 22 2c  db, "linktagid",
9a20: 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
9a30: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a50: 20 68 79 70 65 72 6c 69 6e 6b 54 61 67 69 64 46   hyperlinkTagidF
9a60: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  unc, 0, 0);.    
9a70: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
9a80: 75 6e 63 74 69 6f 6e 28 67 2e 64 62 2c 20 22 6c  unction(g.db, "l
9a90: 69 6e 6b 74 61 67 6e 61 6d 65 22 2c 20 31 2c 20  inktagname", 1, 
9aa0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
9ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 79 70               hyp
9ad0: 65 72 6c 69 6e 6b 54 61 67 6e 61 6d 65 46 75 6e  erlinkTagnameFun
9ae0: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  c, 0, 0);.    sq
9af0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
9b00: 63 74 69 6f 6e 28 67 2e 64 62 2c 20 22 68 74 6d  ction(g.db, "htm
9b10: 6c 69 7a 65 22 2c 20 31 2c 20 53 51 4c 49 54 45  lize", 1, SQLITE
9b20: 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20 20  _UTF8, 0, .     
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b40: 20 20 20 20 20 20 20 68 74 6d 6c 69 7a 65 46 75         htmlizeFu
9b50: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  nc, 0, 0);.  }..
9b60: 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 20 73 71    /*.  ** Use sq
9b70: 6c 69 74 65 33 5f 73 74 6d 74 20 64 69 72 65 63  lite3_stmt direc
9b80: 74 6c 79 20 72 61 74 68 65 72 20 74 68 61 6e 20  tly rather than 
9b90: 67 6f 69 6e 67 20 74 68 72 6f 75 67 68 20 64 62  going through db
9ba0: 5f 70 72 65 70 61 72 65 28 29 2c 0a 20 20 2a 2a  _prepare(),.  **
9bb0: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
9bc0: 74 72 65 61 74 20 65 72 72 6f 72 73 20 61 20 6e  treat errors a n
9bd0: 6f 6e 2d 66 61 74 61 6c 2e 0a 20 20 2a 2f 0a 20  on-fatal..  */. 
9be0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
9bf0: 65 70 61 72 65 28 67 2e 64 62 2c 20 7a 53 71 6c  epare(g.db, zSql
9c00: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
9c10: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
9c20: 4b 20 21 3d 20 72 63 20 29 7b 0a 20 20 20 20 40  K != rc ){.    @
9c30: 20 3c 73 70 61 6e 20 73 74 79 6c 65 3d 27 63 6f   <span style='co
9c40: 6c 6f 72 3a 72 65 64 27 3e 64 62 5f 67 65 6e 65  lor:red'>db_gene
9c50: 72 69 63 5f 71 75 65 72 79 5f 76 69 65 77 28 29  ric_query_view()
9c60: 20 53 51 4c 20 65 72 72 6f 72 3a 0a 20 20 20 20   SQL error:.    
9c70: 40 20 25 68 28 73 71 6c 69 74 65 33 5f 65 72 72  @ %h(sqlite3_err
9c80: 6d 73 67 28 67 2e 64 62 29 29 3c 2f 73 70 61 6e  msg(g.db))</span
9c90: 3e 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  >.    return rc;
9ca0: 0a 20 20 7d 0a 20 20 6e 43 6f 6c 20 3d 20 73 71  .  }.  nCol = sq
9cb0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
9cc0: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 40 20 3c  nt(pStmt);.  @ <
9cd0: 74 61 62 6c 65 20 63 6c 61 73 73 3d 27 66 6f 73  table class='fos
9ce0: 73 69 6c 5f 64 62 5f 67 65 6e 65 72 69 63 5f 71  sil_db_generic_q
9cf0: 75 65 72 79 5f 76 69 65 77 27 3e 3c 74 62 6f 64  uery_view'><tbod
9d00: 79 3e 0a 20 20 40 20 3c 74 72 20 63 6c 61 73 73  y>.  @ <tr class
9d10: 3d 27 68 65 61 64 65 72 27 3e 0a 20 20 66 6f 72  ='header'>.  for
9d20: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 2b 2b  (i=0; i<nCol; ++
9d30: 69 29 7b 0a 20 20 20 20 40 20 3c 74 64 3e 25 68  i){.    @ <td>%h
9d40: 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  (sqlite3_column_
9d50: 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3c 2f  name(pStmt,i))</
9d60: 74 64 3e 0a 20 20 7d 0a 20 20 40 20 3c 2f 74 72  td>.  }.  @ </tr
9d70: 3e 0a 0a 20 20 6e 52 6f 77 20 3d 20 30 3b 0a 20  >..  nRow = 0;. 
9d80: 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
9d90: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
9da0: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 63  (pStmt) ){.    c
9db0: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6c 61  onst char *azCla
9dc0: 73 73 5b 5d 20 3d 20 7b 20 22 65 76 65 6e 22 2c  ss[] = { "even",
9dd0: 20 22 6f 64 64 22 20 7d 3b 0a 20 20 20 20 40 20   "odd" };.    @ 
9de0: 3c 74 72 20 63 6c 61 73 73 3d 27 25 73 28 61 7a  <tr class='%s(az
9df0: 43 6c 61 73 73 5b 28 6e 52 6f 77 2b 2b 29 26 31  Class[(nRow++)&1
9e00: 5d 29 27 3e 0a 20 20 20 20 20 20 66 6f 72 28 69  ])'>.      for(i
9e10: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
9e20: 7b 0a 20 20 20 20 20 20 20 20 7a 52 6f 77 20 3d  {.        zRow =
9e30: 20 28 63 68 61 72 20 63 6f 6e 73 74 2a 29 73 71   (char const*)sq
9e40: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
9e50: 74 28 70 53 74 6d 74 2c 69 29 3b 0a 20 20 20 20  t(pStmt,i);.    
9e60: 20 20 20 20 69 66 28 20 69 73 53 61 66 65 20 29      if( isSafe )
9e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 40 20 3c 74  {.          @ <t
9e80: 64 3e 25 73 28 7a 52 6f 77 29 3c 2f 74 64 3e 0a  d>%s(zRow)</td>.
9e90: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9ea0: 20 20 20 20 20 20 20 20 20 40 20 3c 74 64 3e 25           @ <td>%
9eb0: 68 28 7a 52 6f 77 29 3c 2f 74 64 3e 0a 20 20 20  h(zRow)</td>.   
9ec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9ed0: 20 20 20 40 20 3c 2f 74 72 3e 0a 20 20 7d 0a 20     @ </tr>.  }. 
9ee0: 20 40 20 3c 2f 74 62 6f 64 79 3e 3c 2f 74 61 62   @ </tbody></tab
9ef0: 6c 65 3e 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  le>.  sqlite3_fi
9f00: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
9f10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9f20: 4b 3b 0a 7d 0a                                   K;.}.