Hex Artifact Content
Not logged in

Artifact b821ea8fc707817becb11469a45356664abc9dcd:

File src/db.c part of check-in [bf75ea9852] - The "configuration" command will now sync ticket report formats, shunned UUIDs, and user information (but not user passwords). Added the "config merge" method. Fix an initialization bug that was given Admin privilege to anonymous by default. by drh on 2008-10-04 20:40:27.

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 23  t char *zHome;.#
39c0: 69 66 64 65 66 20 5f 5f 4d 49 4e 47 57 33 32 5f  ifdef __MINGW32_
39d0: 5f 0a 20 20 7a 48 6f 6d 65 20 3d 20 67 65 74 65  _.  zHome = gete
39e0: 6e 76 28 22 4c 4f 43 41 4c 41 50 50 44 41 54 41  nv("LOCALAPPDATA
39f0: 22 29 3b 0a 20 20 69 66 28 20 7a 48 6f 6d 65 3d  ");.  if( zHome=
3a00: 3d 30 20 29 7b 0a 20 20 20 20 7a 48 6f 6d 65 20  =0 ){.    zHome 
3a10: 3d 20 67 65 74 65 6e 76 28 22 41 50 50 44 41 54  = getenv("APPDAT
3a20: 41 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 48 6f  A");.    if( zHo
3a30: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  me==0 ){.      z
3a40: 48 6f 6d 65 20 3d 20 67 65 74 65 6e 76 28 22 48  Home = getenv("H
3a50: 4f 4d 45 50 41 54 48 22 29 3b 0a 20 20 20 20 7d  OMEPATH");.    }
3a60: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7a 48 6f  .  }.#else.  zHo
3a70: 6d 65 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d  me = getenv("HOM
3a80: 45 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  E");.#endif.  if
3a90: 28 20 7a 48 6f 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zHome==0 ){.  
3aa0: 20 20 64 62 5f 65 72 72 28 22 63 61 6e 6e 6f 74    db_err("cannot
3ab0: 20 6c 6f 63 61 6c 20 68 6f 6d 65 20 64 69 72 65   local home dire
3ac0: 63 74 6f 72 79 22 29 3b 0a 20 20 7d 0a 23 69 66  ctory");.  }.#if
3ad0: 64 65 66 20 5f 5f 4d 49 4e 47 57 33 32 5f 5f 0a  def __MINGW32__.
3ae0: 20 20 2f 2a 20 2e 20 66 69 6c 65 6e 61 6d 65 73    /* . filenames
3af0: 20 67 69 76 65 20 73 6f 6d 65 20 77 69 6e 64 6f   give some windo
3b00: 77 20 73 79 73 74 65 6d 73 20 70 72 6f 62 6c 65  w systems proble
3b10: 6d 73 20 61 6e 64 20 6d 61 6e 79 20 61 70 70 73  ms and many apps
3b20: 20 70 72 6f 62 6c 65 6d 73 20 2a 2f 0a 20 20 7a   problems */.  z
3b30: 44 62 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66  DbName = mprintf
3b40: 28 22 25 2f 2f 5f 66 6f 73 73 69 6c 22 2c 20 7a  ("%//_fossil", z
3b50: 48 6f 6d 65 29 3b 0a 23 65 6c 73 65 0a 20 20 7a  Home);.#else.  z
3b60: 44 62 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66  DbName = mprintf
3b70: 28 22 25 73 2f 2e 66 6f 73 73 69 6c 22 2c 20 7a  ("%s/.fossil", z
3b80: 48 6f 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Home);.#endif.  
3b90: 69 66 28 20 67 2e 63 6f 6e 66 69 67 4f 70 65 6e  if( g.configOpen
3ba0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  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: 43 4f 4d 4d 41 4e 44 3a 20 6f 70 65 6e 0a 2a 2a  COMMAND: open.**
7580: 0a 2a 2a 20 55 73 61 67 65 3a 20 6f 70 65 6e 20  .** Usage: open 
7590: 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 4f  FILENAME.**.** O
75a0: 70 65 6e 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  pen a connection
75b0: 20 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 72 65   to the local re
75c0: 70 6f 73 69 74 6f 72 79 20 69 6e 20 46 49 4c 45  pository in FILE
75d0: 4e 41 4d 45 2e 20 20 41 20 63 68 65 63 6b 6f 75  NAME.  A checkou
75e0: 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 72 65 70  t.** for the rep
75f0: 6f 73 69 74 6f 72 79 20 69 73 20 63 72 65 61 74  ository is creat
7600: 65 64 20 77 69 74 68 20 69 74 73 20 72 6f 6f 74  ed with its root
7610: 20 61 74 20 74 68 65 20 77 6f 72 6b 69 6e 67 20   at the working 
7620: 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2a 20 53 65  directory..** Se
7630: 65 20 61 6c 73 6f 20 74 68 65 20 22 63 6c 6f 73  e also the "clos
7640: 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 76  e" command..*/.v
7650: 6f 69 64 20 63 6d 64 5f 6f 70 65 6e 28 76 6f 69  oid cmd_open(voi
7660: 64 29 7b 0a 20 20 42 6c 6f 62 20 70 61 74 68 3b  d){.  Blob path;
7670: 0a 20 20 69 6e 74 20 76 69 64 3b 0a 20 20 73 74  .  int vid;.  st
7680: 61 74 69 63 20 63 68 61 72 20 2a 61 7a 4e 65 77  atic char *azNew
7690: 41 72 67 76 5b 5d 20 3d 20 7b 20 30 2c 20 22 75  Argv[] = { 0, "u
76a0: 70 64 61 74 65 22 2c 20 22 2d 2d 6c 61 74 65 73  pdate", "--lates
76b0: 74 22 2c 20 30 20 7d 3b 0a 20 20 75 72 6c 5f 70  t", 0 };.  url_p
76c0: 72 6f 78 79 5f 6f 70 74 69 6f 6e 73 28 29 3b 0a  roxy_options();.
76d0: 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d 33 20    if( g.argc!=3 
76e0: 29 7b 0a 20 20 20 20 75 73 61 67 65 28 22 52 45  ){.    usage("RE
76f0: 50 4f 53 49 54 4f 52 59 2d 46 49 4c 45 4e 41 4d  POSITORY-FILENAM
7700: 45 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  E");.  }.  if( d
7710: 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 29 20 29  b_open_local() )
7720: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e  {.    fossil_pan
7730: 69 63 28 22 61 6c 72 65 61 64 79 20 77 69 74 68  ic("already with
7740: 69 6e 20 61 6e 20 6f 70 65 6e 20 74 72 65 65 20  in an open tree 
7750: 72 6f 6f 74 65 64 20 61 74 20 25 73 22 2c 20 67  rooted at %s", g
7760: 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20 20  .zLocalRoot);.  
7770: 7d 0a 20 20 66 69 6c 65 5f 63 61 6e 6f 6e 69 63  }.  file_canonic
7780: 61 6c 5f 6e 61 6d 65 28 67 2e 61 72 67 76 5b 32  al_name(g.argv[2
7790: 5d 2c 20 26 70 61 74 68 29 3b 0a 20 20 64 62 5f  ], &path);.  db_
77a0: 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28  open_repository(
77b0: 62 6c 6f 62 5f 73 74 72 28 26 70 61 74 68 29 29  blob_str(&path))
77c0: 3b 0a 20 20 64 62 5f 69 6e 69 74 5f 64 61 74 61  ;.  db_init_data
77d0: 62 61 73 65 28 22 2e 2f 5f 46 4f 53 53 49 4c 5f  base("./_FOSSIL_
77e0: 22 2c 20 7a 4c 6f 63 61 6c 53 63 68 65 6d 61 2c  ", zLocalSchema,
77f0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 64 62   (char*)0);.  db
7800: 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 29 3b 0a 20  _open_local();. 
7810: 20 64 62 5f 6c 73 65 74 28 22 72 65 70 6f 73 69   db_lset("reposi
7820: 74 6f 72 79 22 2c 20 62 6c 6f 62 5f 73 74 72 28  tory", blob_str(
7830: 26 70 61 74 68 29 29 3b 0a 20 20 76 69 64 20 3d  &path));.  vid =
7840: 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45   db_int(0, "SELE
7850: 43 54 20 70 69 64 20 46 52 4f 4d 20 70 6c 69 6e  CT pid FROM plin
7860: 6b 20 79 22 0a 20 20 20 20 20 20 20 20 20 20 20  k y".           
7870: 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 4e         " WHERE N
7880: 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45 43 54  OT EXISTS(SELECT
7890: 20 31 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 78 20   1 FROM plink x 
78a0: 57 48 45 52 45 20 78 2e 63 69 64 3d 79 2e 70 69  WHERE x.cid=y.pi
78b0: 64 29 22 29 3b 0a 20 20 69 66 28 20 76 69 64 3d  d)");.  if( vid=
78c0: 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f 6c 73 65  =0 ){.    db_lse
78d0: 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75 74 22  t_int("checkout"
78e0: 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
78f0: 20 20 20 64 62 5f 6c 73 65 74 5f 69 6e 74 28 22     db_lset_int("
7900: 63 68 65 63 6b 6f 75 74 22 2c 20 76 69 64 29 3b  checkout", vid);
7910: 0a 20 20 20 20 67 2e 61 72 67 76 20 3d 20 61 7a  .    g.argv = az
7920: 4e 65 77 41 72 67 76 3b 0a 20 20 20 20 67 2e 61  NewArgv;.    g.a
7930: 72 67 63 20 3d 20 33 3b 0a 20 20 20 20 75 70 64  rgc = 3;.    upd
7940: 61 74 65 5f 63 6d 64 28 29 3b 0a 20 20 7d 0a 7d  ate_cmd();.  }.}
7950: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  ../*.** Print th
7960: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 65 74  e value of a set
7970: 74 69 6e 67 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  ting named zName
7980: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7990: 70 72 69 6e 74 5f 73 65 74 74 69 6e 67 28 63 6f  print_setting(co
79a0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
79b0: 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 66  {.  Stmt q;.  if
79c0: 28 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70  ( g.repositoryOp
79d0: 65 6e 20 29 7b 0a 20 20 20 20 64 62 5f 70 72 65  en ){.    db_pre
79e0: 70 61 72 65 28 26 71 2c 0a 20 20 20 20 20 20 20  pare(&q,.       
79f0: 22 53 45 4c 45 43 54 20 27 28 6c 6f 63 61 6c 29  "SELECT '(local)
7a00: 27 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20 63 6f  ', value FROM co
7a10: 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d  nfig WHERE name=
7a20: 25 51 22 0a 20 20 20 20 20 20 20 22 20 55 4e 49  %Q".       " UNI
7a30: 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 20  ON ALL ".       
7a40: 22 53 45 4c 45 43 54 20 27 28 67 6c 6f 62 61 6c  "SELECT '(global
7a50: 29 27 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20 67  )', value FROM g
7a60: 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45  lobal_config WHE
7a70: 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
7a80: 20 20 20 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65      zName, zName
7a90: 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
7aa0: 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 28  .    db_prepare(
7ab0: 26 71 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43  &q,.      "SELEC
7ac0: 54 20 27 28 67 6c 6f 62 61 6c 29 27 2c 20 76 61  T '(global)', va
7ad0: 6c 75 65 20 46 52 4f 4d 20 67 6c 6f 62 61 6c 5f  lue FROM global_
7ae0: 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d  config WHERE nam
7af0: 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 7a 4e 61  e=%Q",.      zNa
7b00: 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  me.    );.  }.  
7b10: 69 66 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d  if( db_step(&q)=
7b20: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
7b30: 20 20 20 70 72 69 6e 74 66 28 22 25 2d 32 30 73     printf("%-20s
7b40: 20 25 2d 38 73 20 25 73 5c 6e 22 2c 20 7a 4e 61   %-8s %s\n", zNa
7b50: 6d 65 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  me, db_column_te
7b60: 78 74 28 26 71 2c 20 30 29 2c 0a 20 20 20 20 20  xt(&q, 0),.     
7b70: 20 20 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78     db_column_tex
7b80: 74 28 26 71 2c 20 31 29 29 3b 0a 20 20 7d 65 6c  t(&q, 1));.  }el
7b90: 73 65 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  se{.    printf("
7ba0: 25 2d 32 30 73 5c 6e 22 2c 20 7a 4e 61 6d 65 29  %-20s\n", zName)
7bb0: 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c  ;.  }.  db_final
7bc0: 69 7a 65 28 26 71 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ize(&q);.}.../*.
7bd0: 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 73 65 74 74  ** COMMAND: sett
7be0: 69 6e 67 73 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a  ings.** COMMAND:
7bf0: 20 75 6e 73 65 74 0a 2a 2a 20 25 66 6f 73 73 69   unset.** %fossi
7c00: 6c 20 73 65 74 74 69 6e 67 20 3f 50 52 4f 50 45  l setting ?PROPE
7c10: 52 54 59 3f 20 3f 56 41 4c 55 45 3f 20 3f 2d 67  RTY? ?VALUE? ?-g
7c20: 6c 6f 62 61 6c 3f 0a 2a 2a 20 25 66 6f 73 73 69  lobal?.** %fossi
7c30: 6c 20 75 6e 73 65 74 20 50 52 4f 50 45 52 54 59  l unset PROPERTY
7c40: 20 3f 2d 67 6c 6f 62 61 6c 3f 0a 2a 2a 0a 2a 2a   ?-global?.**.**
7c50: 20 54 68 65 20 22 73 65 74 74 69 6e 67 22 20 63   The "setting" c
7c60: 6f 6d 6d 61 6e 64 20 77 69 74 68 20 6e 6f 20 61  ommand with no a
7c70: 72 67 75 6d 65 6e 74 73 20 6c 69 73 74 73 20 61  rguments lists a
7c80: 6c 6c 20 70 72 6f 70 65 72 74 69 65 73 20 61 6e  ll properties an
7c90: 64 20 74 68 65 69 72 0a 2a 2a 20 76 61 6c 75 65  d their.** value
7ca0: 73 2e 20 20 57 69 74 68 20 6a 75 73 74 20 61 20  s.  With just a 
7cb0: 70 72 6f 70 65 72 74 79 20 6e 61 6d 65 20 69 74  property name it
7cc0: 20 73 68 6f 77 73 20 74 68 65 20 76 61 6c 75 65   shows the value
7cd0: 20 6f 66 20 74 68 61 74 20 70 72 6f 70 65 72 74   of that propert
7ce0: 79 2e 0a 2a 2a 20 57 69 74 68 20 61 20 76 61 6c  y..** With a val
7cf0: 75 65 20 61 72 67 75 6d 65 6e 74 20 69 74 20 63  ue argument it c
7d00: 68 61 6e 67 65 73 20 74 68 65 20 70 72 6f 70 65  hanges the prope
7d10: 72 74 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  rty for the curr
7d20: 65 6e 74 20 72 65 70 6f 73 69 74 6f 72 79 2e 0a  ent repository..
7d30: 2a 2a 0a 2a 2a 20 54 68 65 20 22 75 6e 73 65 74  **.** The "unset
7d40: 22 20 63 6f 6d 6d 61 6e 64 20 63 6c 65 61 72 73  " command clears
7d50: 20 61 20 70 72 6f 70 65 72 74 79 20 73 65 74 74   a property sett
7d60: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 61 75  ing..**.**    au
7d70: 74 6f 73 79 6e 63 20 20 20 20 20 20 20 20 20 49  tosync         I
7d80: 66 20 65 6e 61 62 6c 65 64 2c 20 61 75 74 6f 6d  f enabled, autom
7d90: 61 74 69 63 61 6c 6c 79 20 70 75 6c 6c 20 70 72  atically pull pr
7da0: 69 6f 72 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ior to.**       
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
7dc0: 6d 6d 69 74 20 6f 72 20 75 70 64 61 74 65 20 61  mmit or update a
7dd0: 6e 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  nd automatically
7de0: 20 70 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 20   push.**        
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74               aft
7e00: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 74 61 67  er commit or tag
7e10: 20 6f 72 20 62 72 61 6e 63 68 20 63 72 65 61 74   or branch creat
7e20: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 64 69  ion..**.**    di
7e30: 66 66 2d 63 6f 6d 6d 61 6e 64 20 20 20 20 20 45  ff-command     E
7e40: 78 74 65 72 6e 61 6c 20 63 6f 6d 6d 61 6e 64 20  xternal command 
7e50: 74 6f 20 72 75 6e 20 77 68 65 6e 20 70 65 72 66  to run when perf
7e60: 6f 72 6d 69 6e 67 20 61 20 64 69 66 66 2e 0a 2a  orming a diff..*
7e70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
7e80: 20 20 20 20 20 20 49 66 20 75 6e 64 65 66 69 6e        If undefin
7e90: 65 64 2c 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ed, the internal
7ea0: 20 74 65 78 74 20 64 69 66 66 20 77 69 6c 6c 20   text diff will 
7eb0: 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  be used..**.**  
7ec0: 20 20 65 64 69 74 6f 72 20 20 20 20 20 20 20 20    editor        
7ed0: 20 20 20 54 65 78 74 20 65 64 69 74 6f 72 20 63     Text editor c
7ee0: 6f 6d 6d 61 6e 64 20 75 73 65 64 20 66 6f 72 20  ommand used for 
7ef0: 63 68 65 63 6b 2d 69 6e 20 63 6f 6d 6d 65 6e 74  check-in comment
7f00: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 67 64 69 66  s..**.**    gdif
7f10: 66 2d 63 6f 6d 6d 61 6e 64 20 20 20 20 45 78 74  f-command    Ext
7f20: 65 72 6e 61 6c 20 63 6f 6d 6d 61 6e 64 20 74 6f  ernal command to
7f30: 20 72 75 6e 20 77 68 65 6e 20 70 65 72 66 6f 72   run when perfor
7f40: 6d 69 6e 67 20 61 20 67 72 61 70 68 69 63 61 6c  ming a graphical
7f50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
7f60: 20 20 20 20 20 20 20 20 64 69 66 66 2e 20 49 66          diff. If
7f70: 20 75 6e 64 65 66 69 6e 65 64 2c 20 74 65 78 74   undefined, text
7f80: 20 64 69 66 66 20 77 69 6c 6c 20 62 65 20 75 73   diff will be us
7f90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 69 6e 68  ed..**.**    inh
7fa0: 65 72 69 74 2d 61 6e 6f 6e 20 20 20 20 20 49 66  erit-anon     If
7fb0: 20 65 6e 61 62 6c 65 64 2c 20 61 6e 79 20 77 65   enabled, any we
7fc0: 62 20 75 73 65 72 20 69 6e 68 65 72 69 74 73 20  b user inherits 
7fd0: 63 61 70 61 62 69 6c 69 74 69 65 73 20 66 72 6f  capabilities fro
7fe0: 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  m.**            
7ff0: 20 20 20 20 20 20 20 20 20 61 6e 6f 6e 79 6d 6f           anonymo
8000: 75 73 20 61 73 20 77 65 6c 6c 20 61 73 20 6e 6f  us as well as no
8010: 62 6f 64 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6c  body..**.**    l
8020: 6f 63 61 6c 61 75 74 68 20 20 20 20 20 20 20 20  ocalauth        
8030: 49 66 20 65 6e 61 62 6c 65 64 2c 20 72 65 71 75  If enabled, requ
8040: 69 72 65 20 74 68 61 74 20 48 54 54 50 20 63 6f  ire that HTTP co
8050: 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 0a 2a  nnections from.*
8060: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
8070: 20 20 20 20 20 20 31 32 37 2e 30 2e 30 2e 31 20        127.0.0.1 
8080: 62 65 20 61 75 74 68 65 6e 74 69 63 61 74 65 64  be authenticated
8090: 20 62 79 20 70 61 73 73 77 6f 72 64 2e 20 20 49   by password.  I
80a0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  f.**            
80b0: 20 20 20 20 20 20 20 20 20 66 61 6c 73 65 2c 20           false, 
80c0: 61 6c 6c 20 48 54 54 50 20 72 65 71 75 65 73 74  all HTTP request
80d0: 73 20 66 72 6f 6d 20 6c 6f 63 61 6c 68 6f 73 74  s from localhost
80e0: 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 20 20 20   have.**        
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 72               unr
8100: 65 73 74 72 69 63 74 65 64 20 61 63 63 65 73 73  estricted access
8110: 20 74 6f 20 74 68 65 20 72 65 70 6f 73 69 74 6f   to the reposito
8120: 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 63 6c 65  ry..**.**    cle
8130: 61 72 73 69 67 6e 20 20 20 20 20 20 20 20 57 68  arsign        Wh
8140: 65 6e 20 65 6e 61 62 6c 65 64 20 28 74 68 65 20  en enabled (the 
8150: 64 65 66 61 75 6c 74 29 2c 20 66 6f 73 73 69 6c  default), fossil
8160: 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f   will attempt to
8170: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
8180: 20 20 20 20 20 20 20 20 73 69 67 6e 20 61 6c 6c          sign all
8190: 20 63 6f 6d 6d 69 74 73 20 77 69 74 68 20 67 70   commits with gp
81a0: 67 2e 20 20 57 68 65 6e 20 64 69 73 61 62 6c 65  g.  When disable
81b0: 64 2c 20 63 6f 6d 6d 69 74 73 20 77 69 6c 6c 0a  d, commits will.
81c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
81d0: 20 20 20 20 20 20 20 62 65 20 75 6e 73 69 67 6e         be unsign
81e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 67 70  ed..**.**    pgp
81f0: 2d 63 6f 6d 6d 61 6e 64 20 20 20 20 20 20 43 6f  -command      Co
8200: 6d 6d 61 6e 64 20 75 73 65 64 20 74 6f 20 63 6c  mmand used to cl
8210: 65 61 72 2d 73 69 67 6e 20 6d 61 6e 69 66 65 73  ear-sign manifes
8220: 74 73 20 61 74 20 63 68 65 63 6b 2d 69 6e 2e 0a  ts at check-in..
8230: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
8240: 20 20 20 20 20 20 20 54 68 65 20 64 65 66 61 75         The defau
8250: 6c 74 20 69 73 20 22 67 70 67 20 2d 2d 63 6c 65  lt is "gpg --cle
8260: 61 72 73 69 67 6e 20 2d 6f 20 22 2e 0a 2a 2a 0a  arsign -o "..**.
8270: 2a 2a 20 20 20 20 70 72 6f 78 79 20 20 20 20 20  **    proxy     
8280: 20 20 20 20 20 20 20 55 52 4c 20 6f 66 20 74 68         URL of th
8290: 65 20 48 54 54 50 20 70 72 6f 78 79 2e 20 20 49  e HTTP proxy.  I
82a0: 66 20 75 6e 64 65 66 69 6e 65 64 20 6f 72 20 22  f undefined or "
82b0: 6f 66 66 22 20 74 68 65 6e 0a 2a 2a 20 20 20 20  off" then.**    
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 74 68 65 20 22 68 74 74 70 5f 70 72 6f 78 79   the "http_proxy
82e0: 22 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  " environment va
82f0: 72 69 61 62 6c 65 20 69 73 20 63 6f 6e 73 75 6c  riable is consul
8300: 74 65 64 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ted..**         
8310: 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 74              If t
8320: 68 65 20 68 74 74 70 5f 70 72 6f 78 79 20 65 6e  he http_proxy en
8330: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
8340: 6c 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 0a  le is undefined.
8350: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
8360: 20 20 20 20 20 20 20 74 68 65 6e 20 61 20 64 69         then a di
8370: 72 65 63 74 20 48 54 54 50 20 63 6f 6e 6e 65 63  rect HTTP connec
8380: 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2a  tion is used..**
8390: 0a 2a 2a 20 20 20 20 77 65 62 2d 62 72 6f 77 73  .**    web-brows
83a0: 65 72 20 20 20 20 20 20 41 20 73 68 65 6c 6c 20  er      A shell 
83b0: 63 6f 6d 6d 61 6e 64 20 75 73 65 64 20 74 6f 20  command used to 
83c0: 6c 61 75 6e 63 68 20 79 6f 75 72 20 70 72 65 66  launch your pref
83d0: 65 72 72 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  erred.**        
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 65 62               web
83f0: 20 62 72 6f 77 73 65 72 20 77 68 65 6e 20 67 69   browser when gi
8400: 76 65 6e 20 61 20 55 52 4c 20 61 73 20 61 6e 20  ven a URL as an 
8410: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 20 20 20  argument..**    
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 20 44 65 66 61 75 6c 74 73 20 74 6f 20 22 73 74   Defaults to "st
8440: 61 72 74 22 20 6f 6e 20 77 69 6e 64 6f 77 73 2c  art" on windows,
8450: 20 22 6f 70 65 6e 22 20 6f 6e 20 4d 61 63 2c 0a   "open" on Mac,.
8460: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
8470: 20 20 20 20 20 20 20 61 6e 64 20 22 66 69 72 65         and "fire
8480: 66 6f 78 22 20 6f 6e 20 55 6e 69 78 2e 0a 2a 2f  fox" on Unix..*/
8490: 0a 76 6f 69 64 20 73 65 74 74 69 6e 67 5f 63 6d  .void setting_cm
84a0: 64 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  d(void){.  stati
84b0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
84c0: 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  Name[] = {.    "
84d0: 61 75 74 6f 73 79 6e 63 22 2c 0a 20 20 20 20 22  autosync",.    "
84e0: 64 69 66 66 2d 63 6f 6d 6d 61 6e 64 22 2c 0a 20  diff-command",. 
84f0: 20 20 20 22 65 64 69 74 6f 72 22 2c 0a 20 20 20     "editor",.   
8500: 20 22 67 64 69 66 66 2d 63 6f 6d 6d 61 6e 64 22   "gdiff-command"
8510: 2c 0a 20 20 20 20 22 69 6e 68 65 72 69 74 2d 61  ,.    "inherit-a
8520: 6e 6f 6e 22 2c 0a 20 20 20 20 22 6c 6f 63 61 6c  non",.    "local
8530: 61 75 74 68 22 2c 0a 20 20 20 20 22 63 6c 65 61  auth",.    "clea
8540: 72 73 69 67 6e 22 2c 0a 20 20 20 20 22 70 67 70  rsign",.    "pgp
8550: 2d 63 6f 6d 6d 61 6e 64 22 2c 0a 20 20 20 20 22  -command",.    "
8560: 70 72 6f 78 79 22 2c 0a 20 20 20 20 22 77 65 62  proxy",.    "web
8570: 2d 62 72 6f 77 73 65 72 22 2c 0a 20 20 7d 3b 0a  -browser",.  };.
8580: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 67    int i;.  int g
8590: 6c 6f 62 61 6c 46 6c 61 67 20 3d 20 66 69 6e 64  lobalFlag = find
85a0: 5f 6f 70 74 69 6f 6e 28 22 67 6c 6f 62 61 6c 22  _option("global"
85b0: 2c 22 67 22 2c 30 29 21 3d 30 3b 0a 20 20 69 6e  ,"g",0)!=0;.  in
85c0: 74 20 75 6e 73 65 74 46 6c 61 67 20 3d 20 67 2e  t unsetFlag = g.
85d0: 61 72 67 76 5b 31 5d 5b 30 5d 3d 3d 27 75 27 3b  argv[1][0]=='u';
85e0: 0a 20 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f  .  db_find_and_o
85f0: 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 30  pen_repository(0
8600: 29 3b 0a 20 20 69 66 28 20 21 67 2e 72 65 70 6f  );.  if( !g.repo
8610: 73 69 74 6f 72 79 4f 70 65 6e 20 29 7b 0a 20 20  sitoryOpen ){.  
8620: 20 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e 66 69 67    db_open_config
8630: 28 29 3b 0a 20 20 20 20 67 6c 6f 62 61 6c 46 6c  ();.    globalFl
8640: 61 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  ag = 1;.  }.  if
8650: 28 20 75 6e 73 65 74 46 6c 61 67 20 26 26 20 67  ( unsetFlag && g
8660: 2e 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20  .argc!=3 ){.    
8670: 75 73 61 67 65 28 22 50 52 4f 50 45 52 54 59 20  usage("PROPERTY 
8680: 3f 2d 67 6c 6f 62 61 6c 3f 22 29 3b 0a 20 20 7d  ?-global?");.  }
8690: 0a 20 20 69 66 28 20 67 2e 61 72 67 63 3d 3d 32  .  if( g.argc==2
86a0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
86b0: 20 69 3c 73 69 7a 65 6f 66 28 61 7a 4e 61 6d 65   i<sizeof(azName
86c0: 29 2f 73 69 7a 65 6f 66 28 61 7a 4e 61 6d 65 5b  )/sizeof(azName[
86d0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
86e0: 20 70 72 69 6e 74 5f 73 65 74 74 69 6e 67 28 61   print_setting(a
86f0: 7a 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  zName[i]);.    }
8700: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 2e 61  .  }else if( g.a
8710: 72 67 63 3d 3d 33 20 7c 7c 20 67 2e 61 72 67 63  rgc==3 || g.argc
8720: 3d 3d 34 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==4 ){.    const
8730: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 67   char *zName = g
8740: 2e 61 72 67 76 5b 32 5d 3b 0a 20 20 20 20 69 6e  .argv[2];.    in
8750: 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61  t n = strlen(zNa
8760: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  me);.    for(i=0
8770: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 4e 61 6d  ; i<sizeof(azNam
8780: 65 29 2f 73 69 7a 65 6f 66 28 61 7a 4e 61 6d 65  e)/sizeof(azName
8790: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
87a0: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a    if( strncmp(az
87b0: 4e 61 6d 65 5b 69 5d 2c 20 7a 4e 61 6d 65 2c 20  Name[i], zName, 
87c0: 6e 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  n)==0 ) break;. 
87d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d     }.    if( i>=
87e0: 73 69 7a 65 6f 66 28 61 7a 4e 61 6d 65 29 2f 73  sizeof(azName)/s
87f0: 69 7a 65 6f 66 28 61 7a 4e 61 6d 65 5b 30 5d 29  izeof(azName[0])
8800: 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c   ){.      fossil
8810: 5f 66 61 74 61 6c 28 22 6e 6f 20 73 75 63 68 20  _fatal("no such 
8820: 73 65 74 74 69 6e 67 3a 20 25 73 22 2c 20 7a 4e  setting: %s", zN
8830: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
8840: 69 66 28 20 75 6e 73 65 74 46 6c 61 67 20 29 7b  if( unsetFlag ){
8850: 0a 20 20 20 20 20 20 64 62 5f 75 6e 73 65 74 28  .      db_unset(
8860: 61 7a 4e 61 6d 65 5b 69 5d 2c 20 67 6c 6f 62 61  azName[i], globa
8870: 6c 46 6c 61 67 29 3b 0a 20 20 20 20 7d 65 6c 73  lFlag);.    }els
8880: 65 20 69 66 28 20 67 2e 61 72 67 63 3d 3d 34 20  e if( g.argc==4 
8890: 29 7b 0a 20 20 20 20 20 20 64 62 5f 73 65 74 28  ){.      db_set(
88a0: 61 7a 4e 61 6d 65 5b 69 5d 2c 20 67 2e 61 72 67  azName[i], g.arg
88b0: 76 5b 33 5d 2c 20 67 6c 6f 62 61 6c 46 6c 61 67  v[3], globalFlag
88c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
88d0: 20 20 20 20 70 72 69 6e 74 5f 73 65 74 74 69 6e      print_settin
88e0: 67 28 61 7a 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  g(azName[i]);.  
88f0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
8900: 20 75 73 61 67 65 28 22 3f 50 52 4f 50 45 52 54   usage("?PROPERT
8910: 59 3f 20 3f 56 41 4c 55 45 3f 22 29 3b 0a 20 20  Y? ?VALUE?");.  
8920: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66  }.}../*.** SQL f
8930: 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 6e 64 65  unction to rende
8940: 72 20 61 20 55 55 49 44 20 61 73 20 61 20 68 79  r a UUID as a hy
8950: 70 65 72 6c 69 6e 6b 20 74 6f 20 61 20 70 61 67  perlink to a pag
8960: 65 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20  e describing.** 
8970: 74 68 61 74 20 55 55 49 44 2e 0a 2a 2f 0a 73 74  that UUID..*/.st
8980: 61 74 69 63 20 76 6f 69 64 20 68 79 70 65 72 6c  atic void hyperl
8990: 69 6e 6b 55 75 69 64 46 75 6e 63 28 0a 20 20 73  inkUuidFunc(.  s
89a0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
89b0: 70 43 78 74 2c 20 20 20 20 20 2f 2a 20 66 75 6e  pCxt,     /* fun
89c0: 63 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f  ction context */
89d0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
89f0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
8a00: 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63  ents to the func
8a10: 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
8a20: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 20 20  3_value **argv  
8a30: 20 20 20 20 20 2f 2a 20 76 61 6c 75 65 73 20 6f       /* values o
8a40: 66 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 61  f all function a
8a50: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
8a60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75   const char *zUu
8a70: 69 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  id;         /* T
8a80: 68 65 20 55 55 49 44 20 74 6f 20 72 65 6e 64 65  he UUID to rende
8a90: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  r */.  char *z; 
8aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ab0: 20 20 2f 2a 20 52 65 6e 64 65 72 65 64 20 48 54    /* Rendered HT
8ac0: 4d 4c 20 74 65 78 74 20 2a 2f 0a 0a 20 20 7a 55  ML text */..  zU
8ad0: 75 69 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  uid = (const cha
8ae0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
8af0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
8b00: 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72    if( g.okHistor
8b10: 79 20 26 26 20 7a 55 75 69 64 20 26 26 20 73 74  y && zUuid && st
8b20: 72 6c 65 6e 28 7a 55 75 69 64 29 3e 3d 31 30 20  rlen(zUuid)>=10 
8b30: 29 7b 0a 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e  ){.    z = mprin
8b40: 74 66 28 22 3c 74 74 3e 3c 61 20 68 72 65 66 3d  tf("<tt><a href=
8b50: 27 25 73 2f 76 69 6e 66 6f 2f 25 74 27 3e 3c 73  '%s/vinfo/%t'><s
8b60: 70 61 6e 20 73 74 79 6c 65 3d 27 66 6f 6e 74 2d  pan style='font-
8b70: 73 69 7a 65 3a 31 2e 35 65 6d 27 3e 22 0a 20 20  size:1.5em'>".  
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
8b90: 23 68 3c 2f 73 70 61 6e 3e 25 68 3c 2f 61 3e 3c  #h</span>%h</a><
8ba0: 2f 74 74 3e 22 2c 0a 20 20 20 20 20 20 20 20 20  /tt>",.         
8bb0: 20 20 20 20 20 20 20 67 2e 7a 42 61 73 65 55 52         g.zBaseUR
8bc0: 4c 2c 20 7a 55 75 69 64 2c 20 31 30 2c 20 7a 55  L, zUuid, 10, zU
8bd0: 75 69 64 2c 20 26 7a 55 75 69 64 5b 31 30 5d 29  uid, &zUuid[10])
8be0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
8bf0: 73 75 6c 74 5f 74 65 78 74 28 70 43 78 74 2c 20  sult_text(pCxt, 
8c00: 7a 2c 20 2d 31 2c 20 66 72 65 65 29 3b 0a 20 20  z, -1, free);.  
8c10: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
8c20: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
8c30: 43 78 74 2c 20 7a 55 75 69 64 2c 20 2d 31 2c 20  Cxt, zUuid, -1, 
8c40: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
8c50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8c60: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  SQL function to 
8c70: 72 65 6e 64 65 72 20 61 20 54 41 47 49 44 20 61  render a TAGID a
8c80: 73 20 61 20 68 79 70 65 72 6c 69 6e 6b 20 74 6f  s a hyperlink to
8c90: 20 61 20 70 61 67 65 20 64 65 73 63 72 69 62 69   a page describi
8ca0: 6e 67 0a 2a 2a 20 74 68 61 74 20 74 61 67 2e 0a  ng.** that tag..
8cb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
8cc0: 79 70 65 72 6c 69 6e 6b 54 61 67 69 64 46 75 6e  yperlinkTagidFun
8cd0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
8ce0: 74 65 78 74 20 2a 70 43 78 74 2c 20 20 20 20 20  text *pCxt,     
8cf0: 2f 2a 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74  /* function cont
8d00: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  ext */.  int arg
8d10: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
8d20: 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66      /* number of
8d30: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
8d40: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
8d50: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8d60: 61 72 67 76 20 20 20 20 20 20 20 2f 2a 20 76 61  argv       /* va
8d70: 6c 75 65 73 20 6f 66 20 61 6c 6c 20 66 75 6e 63  lues of all func
8d80: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
8d90: 2f 0a 29 7b 0a 20 20 69 6e 74 20 74 61 67 69 64  /.){.  int tagid
8da0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8db0: 20 20 2f 2a 20 54 68 65 20 74 61 67 69 64 20 74    /* The tagid t
8dc0: 6f 20 72 65 6e 64 65 72 20 2a 2f 0a 20 20 63 68  o render */.  ch
8dd0: 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
8de0: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 6e 64           /* rend
8df0: 65 72 65 64 20 68 74 6d 6c 20 74 65 78 74 20 2a  ered html text *
8e00: 2f 0a 0a 20 20 74 61 67 69 64 20 3d 20 73 71 6c  /..  tagid = sql
8e10: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
8e20: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 67  rgv[0]);.  if( g
8e30: 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20 20  .okHistory ){.  
8e40: 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22 3c    z = mprintf("<
8e50: 61 20 68 72 65 66 3d 27 25 73 2f 74 61 67 76 69  a href='%s/tagvi
8e60: 65 77 3f 74 61 67 69 64 3d 25 64 27 3e 25 64 3c  ew?tagid=%d'>%d<
8e70: 2f 61 3e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  /a>", .         
8e80: 20 20 20 20 20 20 20 20 20 67 2e 7a 42 61 73 65           g.zBase
8e90: 55 52 4c 2c 20 74 61 67 69 64 2c 20 74 61 67 69  URL, tagid, tagi
8ea0: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
8eb0: 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 64   z = mprintf("%d
8ec0: 22 2c 20 74 61 67 69 64 29 3b 0a 20 20 7d 0a 20  ", tagid);.  }. 
8ed0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8ee0: 74 65 78 74 28 70 43 78 74 2c 20 7a 2c 20 2d 31  text(pCxt, z, -1
8ef0: 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , free);.}../*.*
8f00: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74  * SQL function t
8f10: 6f 20 72 65 6e 64 65 72 20 61 20 54 41 47 4e 41  o render a TAGNA
8f20: 4d 45 20 61 73 20 61 20 68 79 70 65 72 6c 69 6e  ME as a hyperlin
8f30: 6b 20 74 6f 20 61 20 70 61 67 65 20 64 65 73 63  k to a page desc
8f40: 72 69 62 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74  ribing.** that t
8f50: 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ag..*/.static vo
8f60: 69 64 20 68 79 70 65 72 6c 69 6e 6b 54 61 67 6e  id hyperlinkTagn
8f70: 61 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ameFunc(.  sqlit
8f80: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 78 74  e3_context *pCxt
8f90: 2c 20 20 20 20 20 2f 2a 20 66 75 6e 63 74 69 6f  ,     /* functio
8fa0: 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  n context */.  i
8fb0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d            /* num
8fd0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8fe0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
8ff0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
9000: 6c 75 65 20 2a 2a 61 72 67 76 20 20 20 20 20 20  lue **argv      
9010: 20 2f 2a 20 76 61 6c 75 65 73 20 6f 66 20 61 6c   /* values of al
9020: 6c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  l function argum
9030: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ents */.){.  con
9040: 73 74 20 63 68 61 72 20 2a 7a 54 61 67 3b 20 20  st char *zTag;  
9050: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
9060: 61 67 20 74 6f 20 72 65 6e 64 65 72 20 2a 2f 0a  ag to render */.
9070: 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
9080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9090: 72 65 6e 64 65 72 65 64 20 68 74 6d 6c 20 74 65  rendered html te
90a0: 78 74 20 2a 2f 0a 0a 20 20 7a 54 61 67 20 3d 20  xt */..  zTag = 
90b0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
90c0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
90d0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
90e0: 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20  g.okHistory ){. 
90f0: 20 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22     z = mprintf("
9100: 3c 61 20 68 72 65 66 3d 27 25 73 2f 74 61 67 76  <a href='%s/tagv
9110: 69 65 77 3f 6e 61 6d 65 3d 25 54 27 3e 25 68 3c  iew?name=%T'>%h<
9120: 2f 61 3e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  /a>", .         
9130: 20 20 20 20 20 20 20 20 20 67 2e 7a 42 61 73 65           g.zBase
9140: 55 52 4c 2c 20 7a 54 61 67 2c 20 7a 54 61 67 29  URL, zTag, zTag)
9150: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
9160: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 68 22 2c   = mprintf("%h",
9170: 20 7a 54 61 67 29 3b 0a 20 20 7d 0a 20 20 73 71   zTag);.  }.  sq
9180: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
9190: 74 28 70 43 78 74 2c 20 7a 2c 20 2d 31 2c 20 66  t(pCxt, z, -1, f
91a0: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ree);.}../*.** S
91b0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 65  QL function to e
91c0: 73 63 61 70 65 20 61 6c 6c 20 63 68 61 72 61 63  scape all charac
91d0: 74 65 72 73 20 69 6e 20 61 20 73 74 72 69 6e 67  ters in a string
91e0: 20 74 68 61 74 20 68 61 76 65 20 73 70 65 63 69   that have speci
91f0: 61 6c 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 6f  al.** meaning to
9200: 20 48 54 4d 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   HTML..*/.static
9210: 20 76 6f 69 64 20 68 74 6d 6c 69 7a 65 46 75 6e   void htmlizeFun
9220: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
9230: 74 65 78 74 20 2a 70 43 78 74 2c 20 20 20 20 20  text *pCxt,     
9240: 2f 2a 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74  /* function cont
9250: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  ext */.  int arg
9260: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
9270: 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66      /* number of
9280: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
9290: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
92a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
92b0: 61 72 67 76 20 20 20 20 20 20 20 2f 2a 20 76 61  argv       /* va
92c0: 6c 75 65 73 20 6f 66 20 61 6c 6c 20 66 75 6e 63  lues of all func
92d0: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
92e0: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
92f0: 72 20 2a 7a 54 65 78 74 3b 20 20 20 20 20 20 20  r *zText;       
9300: 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 62 65 20    /* Text to be 
9310: 68 74 6d 6c 69 7a 65 64 20 2a 2f 0a 20 20 63 68  htmlized */.  ch
9320: 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
9330: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 6e 64           /* rend
9340: 65 72 65 64 20 68 74 6d 6c 20 74 65 78 74 20 2a  ered html text *
9350: 2f 0a 0a 20 20 7a 54 65 78 74 20 3d 20 28 63 6f  /..  zText = (co
9360: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
9370: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
9380: 76 5b 30 5d 29 3b 0a 20 20 7a 20 3d 20 68 74 6d  v[0]);.  z = htm
9390: 6c 69 7a 65 28 7a 54 65 78 74 2c 20 2d 31 29 3b  lize(zText, -1);
93a0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
93b0: 74 5f 74 65 78 74 28 70 43 78 74 2c 20 7a 2c 20  t_text(pCxt, z, 
93c0: 2d 31 2c 20 66 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  -1, free);.}../*
93d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
93e0: 20 69 73 20 61 20 68 65 6c 70 65 72 20 74 6f 20   is a helper to 
93f0: 72 75 6e 20 61 6e 20 53 51 4c 20 71 75 65 72 79  run an SQL query
9400: 20 61 6e 64 20 74 61 62 6c 65 2d 69 7a 65 20 74   and table-ize t
9410: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 2e 0a 2a  he.** results..*
9420: 2a 0a 2a 2a 20 54 68 65 20 7a 53 71 6c 20 70 61  *.** The zSql pa
9430: 72 61 6d 65 74 65 72 20 73 68 6f 75 6c 64 20 62  rameter should b
9440: 65 20 61 20 73 69 6e 67 6c 65 2c 20 63 6f 6d 70  e a single, comp
9450: 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65  lete SQL stateme
9460: 6e 74 2e 0a 2a 2a 20 54 61 62 6c 65 69 7a 65 64  nt..** Tableized
9470: 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 53   output of the S
9480: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  QL statement is 
9490: 72 65 6e 64 65 72 65 64 20 62 61 63 6b 20 74 6f  rendered back to
94a0: 20 74 68 65 20 63 6c 69 65 6e 74 2e 0a 2a 2a 0a   the client..**.
94b0: 2a 2a 20 54 68 65 20 69 73 53 61 66 65 20 66 6c  ** The isSafe fl
94c0: 61 67 20 69 73 20 74 72 75 65 20 69 66 20 61 6c  ag is true if al
94d0: 6c 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  l query results 
94e0: 68 61 76 65 20 62 65 65 6e 20 70 72 6f 63 65 73  have been proces
94f0: 73 65 64 20 0a 2a 2a 20 62 79 20 72 6f 75 74 69  sed .** by routi
9500: 6e 65 73 20 73 75 63 68 20 61 73 0a 2a 2a 0a 2a  nes such as.**.*
9510: 2a 20 20 20 20 20 20 20 20 6c 69 6e 6b 75 75 69  *        linkuui
9520: 64 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 6c 69  d().**        li
9530: 6e 6b 74 61 67 69 64 28 29 0a 2a 2a 20 20 20 20  nktagid().**    
9540: 20 20 20 20 6c 69 6e 6b 74 61 67 6e 61 6d 65 28      linktagname(
9550: 29 0a 2a 2a 20 20 20 20 20 20 20 20 68 74 6d 6c  ).**        html
9560: 69 7a 65 28 29 0a 2a 2a 0a 2a 2a 20 61 6e 64 20  ize().**.** and 
9570: 61 72 65 20 74 68 65 72 65 66 6f 72 65 20 73 61  are therefore sa
9580: 66 65 20 66 6f 72 20 64 69 72 65 63 74 20 72 65  fe for direct re
9590: 6e 64 65 72 69 6e 67 2e 20 20 49 66 20 69 73 53  ndering.  If isS
95a0: 61 66 65 20 69 73 20 66 61 6c 73 65 2c 0a 2a 2a  afe is false,.**
95b0: 20 74 68 65 6e 20 61 6c 6c 20 63 68 61 72 61 63   then all charac
95c0: 74 65 72 73 20 69 6e 20 74 68 65 20 71 75 65 72  ters in the quer
95d0: 79 20 72 65 73 75 6c 74 20 74 68 61 74 20 68 61  y result that ha
95e0: 76 65 20 73 70 65 63 69 61 6c 20 6d 65 61 6e 69  ve special meani
95f0: 6e 67 0a 2a 2a 20 74 6f 20 48 54 4d 4c 20 61 72  ng.** to HTML ar
9600: 65 20 65 73 63 61 70 65 64 2e 0a 2a 2a 0a 2a 2a  e escaped..**.**
9610: 20 52 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   Returns SQLITE_
9620: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
9630: 64 20 61 6e 79 20 6f 74 68 65 72 20 76 61 6c 75  d any other valu
9640: 65 20 6f 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69  e on error..*/.i
9650: 6e 74 20 64 62 5f 67 65 6e 65 72 69 63 5f 71 75  nt db_generic_qu
9660: 65 72 79 5f 76 69 65 77 28 63 6f 6e 73 74 20 63  ery_view(const c
9670: 68 61 72 20 2a 7a 53 71 6c 2c 20 69 6e 74 20 69  har *zSql, int i
9680: 73 53 61 66 65 29 7b 0a 20 20 73 71 6c 69 74 65  sSafe){.  sqlite
9690: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
96a0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
96b0: 43 6f 6c 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 52  Col, i;.  int nR
96c0: 6f 77 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ow;.  const char
96d0: 20 2a 7a 52 6f 77 3b 0a 20 20 73 74 61 74 69 63   *zRow;.  static
96e0: 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 0a   int once = 1;..
96f0: 20 20 2f 2a 20 49 6e 73 74 61 6c 6c 20 74 68 65    /* Install the
9700: 20 73 70 65 63 69 61 6c 20 66 75 6e 63 74 69 6f   special functio
9710: 6e 73 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  ns on the first 
9720: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
9730: 74 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 6f 6e  tine */.  if( on
9740: 63 65 20 29 7b 0a 20 20 20 20 6f 6e 63 65 20 3d  ce ){.    once =
9750: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
9760: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
9770: 67 2e 64 62 2c 20 22 6c 69 6e 6b 75 75 69 64 22  g.db, "linkuuid"
9780: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
9790: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97b0: 20 20 68 79 70 65 72 6c 69 6e 6b 55 75 69 64 46    hyperlinkUuidF
97c0: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  unc, 0, 0);.    
97d0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
97e0: 75 6e 63 74 69 6f 6e 28 67 2e 64 62 2c 20 22 6c  unction(g.db, "l
97f0: 69 6e 6b 74 61 67 69 64 22 2c 20 31 2c 20 53 51  inktagid", 1, SQ
9800: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20  LITE_UTF8, 0, . 
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 20 20 20 20 20 20 20 20 20 20 20 68 79 70 65 72             hyper
9830: 6c 69 6e 6b 54 61 67 69 64 46 75 6e 63 2c 20 30  linkTagidFunc, 0
9840: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
9850: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
9860: 6e 28 67 2e 64 62 2c 20 22 6c 69 6e 6b 74 61 67  n(g.db, "linktag
9870: 6e 61 6d 65 22 2c 20 31 2c 20 53 51 4c 49 54 45  name", 1, SQLITE
9880: 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20 20  _UTF8, 0, .     
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98a0: 20 20 20 20 20 20 20 68 79 70 65 72 6c 69 6e 6b         hyperlink
98b0: 54 61 67 6e 61 6d 65 46 75 6e 63 2c 20 30 2c 20  TagnameFunc, 0, 
98c0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
98d0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
98e0: 67 2e 64 62 2c 20 22 68 74 6d 6c 69 7a 65 22 2c  g.db, "htmlize",
98f0: 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
9900: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9920: 20 68 74 6d 6c 69 7a 65 46 75 6e 63 2c 20 30 2c   htmlizeFunc, 0,
9930: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20   0);.  }..  /*. 
9940: 20 2a 2a 20 55 73 65 20 73 71 6c 69 74 65 33 5f   ** Use sqlite3_
9950: 73 74 6d 74 20 64 69 72 65 63 74 6c 79 20 72 61  stmt directly ra
9960: 74 68 65 72 20 74 68 61 6e 20 67 6f 69 6e 67 20  ther than going 
9970: 74 68 72 6f 75 67 68 20 64 62 5f 70 72 65 70 61  through db_prepa
9980: 72 65 28 29 2c 0a 20 20 2a 2a 20 73 6f 20 74 68  re(),.  ** so th
9990: 61 74 20 77 65 20 63 61 6e 20 74 72 65 61 74 20  at we can treat 
99a0: 65 72 72 6f 72 73 20 61 20 6e 6f 6e 2d 66 61 74  errors a non-fat
99b0: 61 6c 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  al..  */.  rc = 
99c0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
99d0: 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  g.db, zSql, -1, 
99e0: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
99f0: 28 20 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20 72  ( SQLITE_OK != r
9a00: 63 20 29 7b 0a 20 20 20 20 40 20 3c 73 70 61 6e  c ){.    @ <span
9a10: 20 73 74 79 6c 65 3d 27 63 6f 6c 6f 72 3a 72 65   style='color:re
9a20: 64 27 3e 64 62 5f 67 65 6e 65 72 69 63 5f 71 75  d'>db_generic_qu
9a30: 65 72 79 5f 76 69 65 77 28 29 20 53 51 4c 20 65  ery_view() SQL e
9a40: 72 72 6f 72 3a 0a 20 20 20 20 40 20 25 68 28 73  rror:.    @ %h(s
9a50: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e  qlite3_errmsg(g.
9a60: 64 62 29 29 3c 2f 73 70 61 6e 3e 0a 20 20 20 20  db))</span>.    
9a70: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
9a80: 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   nCol = sqlite3_
9a90: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74  column_count(pSt
9aa0: 6d 74 29 3b 0a 20 20 40 20 3c 74 61 62 6c 65 20  mt);.  @ <table 
9ab0: 63 6c 61 73 73 3d 27 66 6f 73 73 69 6c 5f 64 62  class='fossil_db
9ac0: 5f 67 65 6e 65 72 69 63 5f 71 75 65 72 79 5f 76  _generic_query_v
9ad0: 69 65 77 27 3e 3c 74 62 6f 64 79 3e 0a 20 20 40  iew'><tbody>.  @
9ae0: 20 3c 74 72 20 63 6c 61 73 73 3d 27 68 65 61 64   <tr class='head
9af0: 65 72 27 3e 0a 20 20 66 6f 72 28 69 3d 30 3b 20  er'>.  for(i=0; 
9b00: 69 3c 6e 43 6f 6c 3b 20 2b 2b 69 29 7b 0a 20 20  i<nCol; ++i){.  
9b10: 20 20 40 20 3c 74 64 3e 25 68 28 73 71 6c 69 74    @ <td>%h(sqlit
9b20: 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70  e3_column_name(p
9b30: 53 74 6d 74 2c 69 29 29 3c 2f 74 64 3e 0a 20 20  Stmt,i))</td>.  
9b40: 7d 0a 20 20 40 20 3c 2f 74 72 3e 0a 0a 20 20 6e  }.  @ </tr>..  n
9b50: 52 6f 77 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  Row = 0;.  while
9b60: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
9b70: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
9b80: 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ) ){.    const c
9b90: 68 61 72 20 2a 61 7a 43 6c 61 73 73 5b 5d 20 3d  har *azClass[] =
9ba0: 20 7b 20 22 65 76 65 6e 22 2c 20 22 6f 64 64 22   { "even", "odd"
9bb0: 20 7d 3b 0a 20 20 20 20 40 20 3c 74 72 20 63 6c   };.    @ <tr cl
9bc0: 61 73 73 3d 27 25 73 28 61 7a 43 6c 61 73 73 5b  ass='%s(azClass[
9bd0: 28 6e 52 6f 77 2b 2b 29 26 31 5d 29 27 3e 0a 20  (nRow++)&1])'>. 
9be0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
9bf0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
9c00: 20 20 20 20 7a 52 6f 77 20 3d 20 28 63 68 61 72      zRow = (char
9c10: 20 63 6f 6e 73 74 2a 29 73 71 6c 69 74 65 33 5f   const*)sqlite3_
9c20: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
9c30: 74 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  t,i);.        if
9c40: 28 20 69 73 53 61 66 65 20 29 7b 0a 20 20 20 20  ( isSafe ){.    
9c50: 20 20 20 20 20 20 40 20 3c 74 64 3e 25 73 28 7a        @ <td>%s(z
9c60: 52 6f 77 29 3c 2f 74 64 3e 0a 20 20 20 20 20 20  Row)</td>.      
9c70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9c80: 20 20 20 40 20 3c 74 64 3e 25 68 28 7a 52 6f 77     @ <td>%h(zRow
9c90: 29 3c 2f 74 64 3e 0a 20 20 20 20 20 20 20 20 7d  )</td>.        }
9ca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 40 20 3c  .      }.    @ <
9cb0: 2f 74 72 3e 0a 20 20 7d 0a 20 20 40 20 3c 2f 74  /tr>.  }.  @ </t
9cc0: 62 6f 64 79 3e 3c 2f 74 61 62 6c 65 3e 0a 20 20  body></table>.  
9cd0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
9ce0: 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72  (pStmt);.  retur
9cf0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a     n SQLITE_OK;.}.