Hex Artifact Content
Not logged in

Artifact 339157982571135214867359963c9ae1972c254b:

File src/db.c part of check-in [2dffce041d] - Add the ability to detect file changes using only the mtime. This is turned on using the "fossil setting mtime-changes ON" command. It is off by default, but it does make many operations go much faster, especially on large repositories, so we might want to start turning it on by default. by drh on 2008-12-06 18:02:21.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 36 20 44 2e 20 52 69 63 68  (c) 2006 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c 64  **.** You should
01f0: 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 61   have received a
0200: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e 55   copy of the GNU
0210: 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 0a   General Public.
0220: 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e 67  ** License along
0230: 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72 61   with this libra
0240: 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69 74  ry; if not, writ
0250: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65 65  e to the.** Free
0260: 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 61   Software Founda
0270: 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20 54  tion, Inc., 59 T
0280: 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53 75  emple Place - Su
0290: 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73 74  ite 330,.** Bost
02a0: 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31 33  on, MA  02111-13
02b0: 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20 41  07, USA..**.** A
02c0: 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e  uthor contact in
02d0: 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20  formation:.**   
02e0: 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a  drh@hwaci.com.**
02f0: 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77     http://www.hw
0300: 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a  aci.com/drh/.**.
0310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0360: 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 69  **.** Code for i
0370: 6e 74 65 72 66 61 63 69 6e 67 20 74 6f 20 74 68  nterfacing to th
0380: 65 20 76 61 72 69 6f 75 73 20 64 61 74 61 62 61  e various databa
0390: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ses..**.** There
03a0: 20 61 72 65 20 74 68 72 65 65 20 73 65 70 61 72   are three separ
03b0: 61 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ate database fil
03c0: 65 73 20 74 68 61 74 20 66 6f 73 73 69 6c 20 69  es that fossil i
03d0: 6e 74 65 72 61 63 74 73 0a 2a 2a 20 77 69 74 68  nteracts.** with
03e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
03f0: 54 68 65 20 22 75 73 65 72 22 20 64 61 74 61 62  The "user" datab
0400: 61 73 65 20 69 6e 20 7e 2f 2e 66 6f 73 73 69 6c  ase in ~/.fossil
0410: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 54  .**.**    (2)  T
0420: 68 65 20 22 72 65 70 6f 73 69 74 6f 72 79 22 20  he "repository" 
0430: 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20  database.**.**  
0440: 20 20 28 33 29 20 20 41 20 6c 6f 63 61 6c 20 63    (3)  A local c
0450: 68 65 63 6b 6f 75 74 20 64 61 74 61 62 61 73 65  heckout database
0460: 20 6e 61 6d 65 64 20 22 5f 46 4f 53 53 49 4c 5f   named "_FOSSIL_
0470: 22 20 6f 72 20 22 2e 66 6f 73 22 0a 2a 2a 20 20  " or ".fos".**  
0480: 20 20 20 20 20 20 20 61 6e 64 20 6c 6f 63 61 74         and locat
0490: 65 64 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f  ed at the root o
04a0: 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 70 79  f the local copy
04b0: 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20 74   of the source t
04c0: 72 65 65 2e 0a 2a 2a 0a 2a 2f 0a 23 69 6e 63 6c  ree..**.*/.#incl
04d0: 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23  ude "config.h".#
04e0: 69 66 6e 64 65 66 20 5f 5f 4d 49 4e 47 57 33 32  ifndef __MINGW32
04f0: 5f 5f 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 70  __.#  include <p
0500: 77 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  wd.h>.#endif.#if
0510: 64 65 66 20 5f 5f 4d 49 4e 47 57 33 32 5f 5f 0a  def __MINGW32__.
0520: 23 20 20 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64  #  include <wind
0530: 6f 77 73 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69  ows.h>.#endif.#i
0540: 6e 63 6c 75 64 65 20 3c 73 71 6c 69 74 65 33 2e  nclude <sqlite3.
0550: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0560: 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75  /types.h>.#inclu
0570: 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a  de <sys/stat.h>.
0580: 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64  #include <unistd
0590: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 64 62  .h>.#include "db
05a0: 2e 68 22 0a 0a 23 69 66 20 49 4e 54 45 52 46 41  .h"..#if INTERFA
05b0: 43 45 0a 2f 2a 0a 2a 2a 20 41 6e 20 73 69 6e 67  CE./*.** An sing
05c0: 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  le SQL statement
05d0: 20 69 73 20 72 65 70 72 65 73 65 6e 74 65 64 20   is represented 
05e0: 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  as an instance o
05f0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0600: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0610: 0a 73 74 72 75 63 74 20 53 74 6d 74 20 7b 0a 20  .struct Stmt {. 
0620: 20 42 6c 6f 62 20 73 71 6c 3b 20 20 20 20 20 20   Blob sql;      
0630: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
0640: 53 51 4c 20 66 6f 72 20 74 68 69 73 20 73 74 61  SQL for this sta
0650: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  tement */.  sqli
0660: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
0670: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
0680: 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 70 72  ts of sqlite3_pr
0690: 65 70 61 72 65 28 29 20 2a 2f 0a 20 20 53 74 6d  epare() */.  Stm
06a0: 74 20 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65 76  t *pNext, *pPrev
06b0: 3b 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  ;    /* List of 
06c0: 61 6c 6c 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20  all unfinalized 
06d0: 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 7d 3b  statements */.};
06e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 49 4e 54 45 52  .#endif /* INTER
06f0: 46 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  FACE */../*.** C
0700: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
0710: 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
0720: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
0730: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 62  /.static void db
0740: 5f 65 72 72 28 63 6f 6e 73 74 20 63 68 61 72 20  _err(const char 
0750: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
0760: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
0770: 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73 74  char *z;.  va_st
0780: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
0790: 3b 0a 20 20 7a 20 3d 20 76 6d 70 72 69 6e 74 66  ;.  z = vmprintf
07a0: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
07b0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
07c0: 66 28 20 67 2e 63 67 69 50 61 6e 69 63 20 29 7b  f( g.cgiPanic ){
07d0: 0a 20 20 20 20 67 2e 63 67 69 50 61 6e 69 63 20  .    g.cgiPanic 
07e0: 3d 20 30 3b 0a 20 20 20 20 63 67 69 5f 70 72 69  = 0;.    cgi_pri
07f0: 6e 74 66 28 22 3c 68 31 3e 44 61 74 61 62 61 73  ntf("<h1>Databas
0800: 65 20 45 72 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a  e Error</h1>\n".
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
0820: 3c 70 72 65 3e 25 68 3c 2f 70 72 65 3e 22 2c 20  <pre>%h</pre>", 
0830: 7a 29 3b 0a 20 20 20 20 63 67 69 5f 72 65 70 6c  z);.    cgi_repl
0840: 79 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  y();.  }else{.  
0850: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
0860: 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 67 2e  , "%s: %s\n", g.
0870: 61 72 67 76 5b 30 5d 2c 20 7a 29 3b 0a 20 20 7d  argv[0], z);.  }
0880: 0a 20 20 64 62 5f 66 6f 72 63 65 5f 72 6f 6c 6c  .  db_force_roll
0890: 62 61 63 6b 28 29 3b 0a 20 20 65 78 69 74 28 31  back();.  exit(1
08a0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
08b0: 20 6e 42 65 67 69 6e 20 3d 20 30 3b 20 20 20 20   nBegin = 0;    
08c0: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 64 65 70    /* Nesting dep
08d0: 74 68 20 6f 66 20 42 45 47 49 4e 20 2a 2f 0a 73  th of BEGIN */.s
08e0: 74 61 74 69 63 20 69 6e 74 20 69 73 4e 65 77 52  tatic int isNewR
08f0: 65 70 6f 20 3d 20 30 3b 20 20 20 2f 2a 20 54 72  epo = 0;   /* Tr
0900: 75 65 20 69 66 20 74 68 65 20 72 65 70 6f 73 69  ue if the reposi
0910: 74 6f 72 79 20 69 73 20 6e 65 77 6c 79 20 63 72  tory is newly cr
0920: 65 61 74 65 64 20 2a 2f 0a 73 74 61 74 69 63 20  eated */.static 
0930: 69 6e 74 20 64 6f 52 6f 6c 6c 62 61 63 6b 20 3d  int doRollback =
0940: 20 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20   0;  /* True to 
0950: 66 6f 72 63 65 20 61 20 72 6f 6c 6c 62 61 63 6b  force a rollback
0960: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
0970: 43 6f 6d 6d 69 74 48 6f 6f 6b 20 3d 20 30 3b 20  CommitHook = 0; 
0980: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d  /* Number of com
0990: 6d 69 74 20 68 6f 6f 6b 73 20 2a 2f 0a 73 74 61  mit hooks */.sta
09a0: 74 69 63 20 73 74 72 75 63 74 20 73 43 6f 6d 6d  tic struct sComm
09b0: 69 74 48 6f 6f 6b 20 7b 0a 20 20 69 6e 74 20 28  itHook {.  int (
09c0: 2a 78 48 6f 6f 6b 29 28 76 6f 69 64 29 3b 20 20  *xHook)(void);  
09d0: 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 74 6f 20  /* Functions to 
09e0: 63 61 6c 6c 20 61 74 20 64 62 5f 65 6e 64 5f 74  call at db_end_t
09f0: 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 2a 2f 0a  ransaction() */.
0a00: 20 20 69 6e 74 20 73 65 71 75 65 6e 63 65 3b 20    int sequence; 
0a10: 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66         /* Call f
0a20: 75 6e 63 74 69 6f 6e 73 20 69 6e 20 73 65 71 75  unctions in sequ
0a30: 65 6e 63 65 20 6f 72 64 65 72 20 2a 2f 0a 7d 20  ence order */.} 
0a40: 61 48 6f 6f 6b 5b 35 5d 3b 0a 73 74 61 74 69 63  aHook[5];.static
0a50: 20 53 74 6d 74 20 2a 70 41 6c 6c 53 74 6d 74 20   Stmt *pAllStmt 
0a60: 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  = 0;  /* List of
0a70: 20 61 6c 6c 20 75 6e 66 69 6e 61 6c 69 7a 65 64   all unfinalized
0a80: 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
0a90: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
0aa0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
0ab0: 74 68 65 20 53 51 4c 69 74 65 20 63 6f 6d 6d 69  the SQLite commi
0ac0: 74 2d 68 6f 6f 6b 20 6d 65 63 68 61 6e 69 73 6d  t-hook mechanism
0ad0: 0a 2a 2a 20 6a 75 73 74 20 70 72 69 6f 72 20 74  .** just prior t
0ae0: 6f 20 65 61 63 68 20 6f 6d 69 74 2e 20 20 41 6c  o each omit.  Al
0af0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64  l this routine d
0b00: 6f 65 73 20 69 73 20 76 65 72 69 66 79 0a 2a 2a  oes is verify.**
0b10: 20 74 68 61 74 20 6e 42 65 67 69 6e 20 72 65 61   that nBegin rea
0b20: 6c 6c 79 20 69 73 20 7a 65 72 6f 2e 20 20 54 68  lly is zero.  Th
0b30: 61 74 20 69 6e 73 75 72 65 73 20 74 68 61 74 20  at insures that 
0b40: 74 72 61 6e 73 61 63 74 69 6f 6e 73 0a 2a 2a 20  transactions.** 
0b50: 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 62 79  cannot commit by
0b60: 20 61 6e 79 20 6d 65 61 6e 73 20 6f 74 68 65 72   any means other
0b70: 20 74 68 61 6e 20 62 79 20 63 61 6c 6c 69 6e 67   than by calling
0b80: 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74   db_end_transact
0b90: 69 6f 6e 28 29 0a 2a 2a 20 62 65 6c 6f 77 2e 0a  ion().** below..
0ba0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6a 75  **.** This is ju
0bb0: 73 74 20 61 20 73 61 66 65 74 79 20 61 6e 64 20  st a safety and 
0bc0: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2f  sanity check..*/
0bd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f 76  .static int db_v
0be0: 65 72 69 66 79 5f 61 74 5f 63 6f 6d 6d 69 74 28  erify_at_commit(
0bf0: 76 6f 69 64 20 2a 6e 6f 74 55 73 65 64 29 7b 0a  void *notUsed){.
0c00: 20 20 69 66 28 20 6e 42 65 67 69 6e 20 29 7b 0a    if( nBegin ){.
0c10: 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63      fossil_panic
0c20: 28 22 69 6c 6c 65 67 61 6c 20 63 6f 6d 6d 69 74  ("illegal commit
0c30: 20 61 74 74 65 6d 70 74 22 29 3b 0a 20 20 20 20   attempt");.    
0c40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
0c50: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
0c60: 2a 2a 20 42 65 67 69 6e 20 61 6e 64 20 65 6e 64  ** Begin and end
0c70: 20 61 20 6e 65 73 74 65 64 20 74 72 61 6e 73 61   a nested transa
0c80: 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 64 62  ction.*/.void db
0c90: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
0ca0: 6f 6e 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  on(void){.  if( 
0cb0: 6e 42 65 67 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  nBegin==0 ){.   
0cc0: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
0cd0: 42 45 47 49 4e 22 29 3b 0a 20 20 20 20 73 71 6c  BEGIN");.    sql
0ce0: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
0cf0: 28 67 2e 64 62 2c 20 64 62 5f 76 65 72 69 66 79  (g.db, db_verify
0d00: 5f 61 74 5f 63 6f 6d 6d 69 74 2c 20 30 29 3b 0a  _at_commit, 0);.
0d10: 20 20 7d 0a 20 20 6e 42 65 67 69 6e 2b 2b 3b 0a    }.  nBegin++;.
0d20: 7d 0a 76 6f 69 64 20 64 62 5f 65 6e 64 5f 74 72  }.void db_end_tr
0d30: 61 6e 73 61 63 74 69 6f 6e 28 69 6e 74 20 72 6f  ansaction(int ro
0d40: 6c 6c 62 61 63 6b 46 6c 61 67 29 7b 0a 20 20 69  llbackFlag){.  i
0d50: 66 28 20 6e 42 65 67 69 6e 3c 3d 30 20 29 20 72  f( nBegin<=0 ) r
0d60: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 72 6f 6c  eturn;.  if( rol
0d70: 6c 62 61 63 6b 46 6c 61 67 20 29 20 64 6f 52 6f  lbackFlag ) doRo
0d80: 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 6e 42  llback = 1;.  nB
0d90: 65 67 69 6e 2d 2d 3b 0a 20 20 69 66 28 20 6e 42  egin--;.  if( nB
0da0: 65 67 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69  egin==0 ){.    i
0db0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
0dc0: 30 3b 20 64 6f 52 6f 6c 6c 62 61 63 6b 3d 3d 30  0; doRollback==0
0dd0: 20 26 26 20 69 3c 6e 43 6f 6d 6d 69 74 48 6f 6f   && i<nCommitHoo
0de0: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 64  k; i++){.      d
0df0: 6f 52 6f 6c 6c 62 61 63 6b 20 7c 3d 20 61 48 6f  oRollback |= aHo
0e00: 6f 6b 5b 69 5d 2e 78 48 6f 6f 6b 28 29 3b 0a 20  ok[i].xHook();. 
0e10: 20 20 20 7d 0a 20 20 20 20 64 62 5f 6d 75 6c 74     }.    db_mult
0e20: 69 5f 65 78 65 63 28 64 6f 52 6f 6c 6c 62 61 63  i_exec(doRollbac
0e30: 6b 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a  k ? "ROLLBACK" :
0e40: 20 22 43 4f 4d 4d 49 54 22 29 3b 0a 20 20 20 20   "COMMIT");.    
0e50: 64 6f 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  doRollback = 0;.
0e60: 20 20 7d 0a 7d 0a 76 6f 69 64 20 64 62 5f 66 6f    }.}.void db_fo
0e70: 72 63 65 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69  rce_rollback(voi
0e80: 64 29 7b 0a 20 20 69 66 28 20 6e 42 65 67 69 6e  d){.  if( nBegin
0e90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
0ea0: 65 78 65 63 28 67 2e 64 62 2c 20 22 52 4f 4c 4c  exec(g.db, "ROLL
0eb0: 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  BACK", 0, 0, 0);
0ec0: 0a 20 20 20 20 69 66 28 20 69 73 4e 65 77 52 65  .    if( isNewRe
0ed0: 70 6f 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 63  po ){.      db_c
0ee0: 6c 6f 73 65 28 29 3b 0a 20 20 20 20 20 20 75 6e  lose();.      un
0ef0: 6c 69 6e 6b 28 67 2e 7a 52 65 70 6f 73 69 74 6f  link(g.zReposito
0f00: 72 79 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  ryName);.    }. 
0f10: 20 7d 0a 20 20 6e 42 65 67 69 6e 20 3d 20 30 3b   }.  nBegin = 0;
0f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 74 61 6c  .}../*.** Instal
0f30: 6c 20 61 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 2e  l a commit hook.
0f40: 20 20 48 6f 6f 6b 73 20 61 72 65 20 69 6e 73 74    Hooks are inst
0f50: 61 6c 6c 65 64 20 69 6e 20 73 65 71 75 65 6e 63  alled in sequenc
0f60: 65 20 6f 72 64 65 72 2e 0a 2a 2a 20 49 74 20 69  e order..** It i
0f70: 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 69 6e  s an error to in
0f80: 73 74 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 63  stall the same c
0f90: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 6d 6f 72 65 20  ommit hook more 
0fa0: 74 68 61 6e 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a  than once..**.**
0fb0: 20 45 61 63 68 20 63 6f 6d 6d 69 74 20 68 6f 6f   Each commit hoo
0fc0: 6b 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 20  k is called (in 
0fd0: 6f 72 64 65 72 20 6f 66 20 61 63 63 65 6e 64 69  order of accendi
0fe0: 6e 67 20 73 65 71 75 65 6e 63 65 29 20 61 74 0a  ng sequence) at.
0ff0: 2a 2a 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f  ** each commit o
1000: 70 65 72 61 74 69 6f 6e 2e 20 20 49 66 20 61 6e  peration.  If an
1010: 79 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 72 65  y commit hook re
1020: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a  turns non-zero,.
1030: 2a 2a 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  ** the subsequen
1040: 63 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 73 20  ce commit hooks 
1050: 61 72 65 20 6f 6d 69 74 74 65 64 20 61 6e 64 20  are omitted and 
1060: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
1070: 2a 2a 20 72 6f 6c 6c 73 20 62 61 63 6b 20 72 61  ** rolls back ra
1080: 74 68 65 72 20 74 68 61 6e 20 63 6f 6d 6d 69 74  ther than commit
1090: 2e 20 20 49 74 20 69 73 20 74 68 65 20 72 65 73  .  It is the res
10a0: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
10b0: 68 65 0a 2a 2a 20 68 6f 6f 6b 73 20 74 68 65 6d  he.** hooks them
10c0: 73 65 6c 76 65 73 20 74 6f 20 69 73 73 75 65 20  selves to issue 
10d0: 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
10e0: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 63  es..*/.void db_c
10f0: 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 69 6e 74 20 28  ommit_hook(int (
1100: 2a 78 29 28 76 6f 69 64 29 2c 20 69 6e 74 20 73  *x)(void), int s
1110: 65 71 75 65 6e 63 65 29 7b 0a 20 20 69 6e 74 20  equence){.  int 
1120: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f  i;.  assert( nCo
1130: 6d 6d 69 74 48 6f 6f 6b 20 3c 20 73 69 7a 65 6f  mmitHook < sizeo
1140: 66 28 61 48 6f 6f 6b 29 2f 73 69 7a 65 6f 66 28  f(aHook)/sizeof(
1150: 61 48 6f 6f 6b 5b 31 5d 29 20 29 3b 0a 20 20 66  aHook[1]) );.  f
1160: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6d 6d 69  or(i=0; i<nCommi
1170: 74 48 6f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  tHook; i++){.   
1180: 20 61 73 73 65 72 74 28 20 78 21 3d 61 48 6f 6f   assert( x!=aHoo
1190: 6b 5b 69 5d 2e 78 48 6f 6f 6b 20 29 3b 0a 20 20  k[i].xHook );.  
11a0: 20 20 69 66 28 20 61 48 6f 6f 6b 5b 69 5d 2e 73    if( aHook[i].s
11b0: 65 71 75 65 6e 63 65 3e 73 65 71 75 65 6e 63 65  equence>sequence
11c0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 20   ){.      int s 
11d0: 3d 20 73 65 71 75 65 6e 63 65 3b 0a 20 20 20 20  = sequence;.    
11e0: 20 20 69 6e 74 20 28 2a 78 53 29 28 76 6f 69 64    int (*xS)(void
11f0: 29 20 3d 20 78 3b 0a 20 20 20 20 20 20 73 65 71  ) = x;.      seq
1200: 75 65 6e 63 65 20 3d 20 61 48 6f 6f 6b 5b 69 5d  uence = aHook[i]
1210: 2e 73 65 71 75 65 6e 63 65 3b 0a 20 20 20 20 20  .sequence;.     
1220: 20 78 20 3d 20 61 48 6f 6f 6b 5b 69 5d 2e 78 48   x = aHook[i].xH
1230: 6f 6f 6b 3b 0a 20 20 20 20 20 20 61 48 6f 6f 6b  ook;.      aHook
1240: 5b 69 5d 2e 73 65 71 75 65 6e 63 65 20 3d 20 73  [i].sequence = s
1250: 3b 0a 20 20 20 20 20 20 61 48 6f 6f 6b 5b 69 5d  ;.      aHook[i]
1260: 2e 78 48 6f 6f 6b 20 3d 20 78 53 3b 0a 20 20 20  .xHook = xS;.   
1270: 20 7d 0a 20 20 7d 0a 20 20 61 48 6f 6f 6b 5b 6e   }.  }.  aHook[n
1280: 43 6f 6d 6d 69 74 48 6f 6f 6b 5d 2e 73 65 71 75  CommitHook].sequ
1290: 65 6e 63 65 20 3d 20 73 65 71 75 65 6e 63 65 3b  ence = sequence;
12a0: 0a 20 20 61 48 6f 6f 6b 5b 6e 43 6f 6d 6d 69 74  .  aHook[nCommit
12b0: 48 6f 6f 6b 5d 2e 78 48 6f 6f 6b 20 3d 20 78 3b  Hook].xHook = x;
12c0: 0a 20 20 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 2b 2b  .  nCommitHook++
12d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  ;.}../*.** Prepa
12e0: 72 65 20 61 20 53 74 6d 74 2e 20 20 41 73 73 75  re a Stmt.  Assu
12f0: 6d 65 20 74 68 61 74 20 74 68 65 20 53 74 6d 74  me that the Stmt
1300: 20 69 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75   is previously u
1310: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a  ninitialized..**
1320: 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 73 74   If the input st
1330: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 73 20 6d 75  ring contains mu
1340: 6c 74 69 70 6c 65 20 53 51 4c 20 73 74 61 74 65  ltiple SQL state
1350: 6d 65 6e 74 73 2c 20 6f 6e 6c 79 20 74 68 65 20  ments, only the 
1360: 66 69 72 73 74 0a 2a 2a 20 6f 6e 65 20 69 73 20  first.** one is 
1370: 70 72 6f 63 65 73 73 65 64 2e 20 20 41 6c 6c 20  processed.  All 
1380: 73 74 61 74 65 6d 65 6e 74 73 20 62 65 79 6f 6e  statements beyon
1390: 64 20 74 68 65 20 66 69 72 73 74 20 61 72 65 20  d the first are 
13a0: 73 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 64  silently ignored
13b0: 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 76 70 72 65  ..*/.int db_vpre
13c0: 70 61 72 65 28 53 74 6d 74 20 2a 70 53 74 6d 74  pare(Stmt *pStmt
13d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
13e0: 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61  ormat, va_list a
13f0: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  p){.  char *zSql
1400: 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 70  ;.  blob_zero(&p
1410: 53 74 6d 74 2d 3e 73 71 6c 29 3b 0a 20 20 62 6c  Stmt->sql);.  bl
1420: 6f 62 5f 76 61 70 70 65 6e 64 66 28 26 70 53 74  ob_vappendf(&pSt
1430: 6d 74 2d 3e 73 71 6c 2c 20 7a 46 6f 72 6d 61 74  mt->sql, zFormat
1440: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
1450: 61 70 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 62 6c  ap);.  zSql = bl
1460: 6f 62 5f 73 74 72 28 26 70 53 74 6d 74 2d 3e 73  ob_str(&pStmt->s
1470: 71 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ql);.  if( sqlit
1480: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67 2e  e3_prepare_v2(g.
1490: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
14a0: 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 30 29 21  Stmt->pStmt, 0)!
14b0: 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f 65 72 72  =0 ){.    db_err
14c0: 28 22 25 73 5c 6e 25 73 22 2c 20 73 71 6c 69 74  ("%s\n%s", sqlit
14d0: 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 2c  e3_errmsg(g.db),
14e0: 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 70 53   zSql);.  }.  pS
14f0: 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 70 53 74  tmt->pNext = pSt
1500: 6d 74 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  mt->pPrev = 0;. 
1510: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 69 6e 74   return 0;.}.int
1520: 20 64 62 5f 70 72 65 70 61 72 65 28 53 74 6d 74   db_prepare(Stmt
1530: 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63   *pStmt, const c
1540: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
1550: 2e 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1560: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
1570: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
1580: 61 74 29 3b 0a 20 20 72 63 20 3d 20 64 62 5f 76  at);.  rc = db_v
1590: 70 72 65 70 61 72 65 28 70 53 74 6d 74 2c 20 7a  prepare(pStmt, z
15a0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
15b0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
15c0: 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 64 62  urn rc;.}.int db
15d0: 5f 73 74 61 74 69 63 5f 70 72 65 70 61 72 65 28  _static_prepare(
15e0: 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e  Stmt *pStmt, con
15f0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1600: 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63  , ...){.  int rc
1610: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1620: 69 66 28 20 62 6c 6f 62 5f 73 69 7a 65 28 26 70  if( blob_size(&p
1630: 53 74 6d 74 2d 3e 73 71 6c 29 3d 3d 30 20 29 7b  Stmt->sql)==0 ){
1640: 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  .    va_list ap;
1650: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
1660: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
1670: 72 63 20 3d 20 64 62 5f 76 70 72 65 70 61 72 65  rc = db_vprepare
1680: 28 70 53 74 6d 74 2c 20 7a 46 6f 72 6d 61 74 2c  (pStmt, zFormat,
1690: 20 61 70 29 3b 0a 20 20 20 20 70 53 74 6d 74 2d   ap);.    pStmt-
16a0: 3e 70 4e 65 78 74 20 3d 20 70 41 6c 6c 53 74 6d  >pNext = pAllStm
16b0: 74 3b 0a 20 20 20 20 70 53 74 6d 74 2d 3e 70 50  t;.    pStmt->pP
16c0: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rev = 0;.    if(
16d0: 20 70 41 6c 6c 53 74 6d 74 20 29 20 70 41 6c 6c   pAllStmt ) pAll
16e0: 53 74 6d 74 2d 3e 70 50 72 65 76 20 3d 20 70 53  Stmt->pPrev = pS
16f0: 74 6d 74 3b 0a 20 20 20 20 70 41 6c 6c 53 74 6d  tmt;.    pAllStm
1700: 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 76  t = pStmt;.    v
1710: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 20  a_end(ap);.  }. 
1720: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1730: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1740: 69 6e 64 65 78 20 6f 66 20 61 20 62 69 6e 64 20  index of a bind 
1750: 70 61 72 61 6d 65 74 65 72 0a 2a 2f 0a 73 74 61  parameter.*/.sta
1760: 74 69 63 20 69 6e 74 20 70 61 72 61 6d 49 64 78  tic int paramIdx
1770: 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f  (Stmt *pStmt, co
1780: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
1790: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
17a0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
17b0: 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 53  rameter_index(pS
17c0: 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 7a 50 61 72  tmt->pStmt, zPar
17d0: 61 6d 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  amName);.  if( i
17e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f 65 72  ==0 ){.    db_er
17f0: 72 28 22 6e 6f 20 73 75 63 68 20 62 69 6e 64 20  r("no such bind 
1800: 70 61 72 61 6d 65 74 65 72 3a 20 25 73 5c 6e 53  parameter: %s\nS
1810: 51 4c 3a 20 25 62 22 2c 20 7a 50 61 72 61 6d 4e  QL: %b", zParamN
1820: 61 6d 65 2c 20 26 70 53 74 6d 74 2d 3e 73 71 6c  ame, &pStmt->sql
1830: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1840: 69 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 42 69 6e 64 20  i;.}./*.** Bind 
1850: 61 6e 20 69 6e 74 65 67 65 72 2c 20 73 74 72 69  an integer, stri
1860: 6e 67 2c 20 6f 72 20 42 6c 6f 62 20 76 61 6c 75  ng, or Blob valu
1870: 65 20 74 6f 20 61 20 6e 61 6d 65 64 20 70 61 72  e to a named par
1880: 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 64  ameter..*/.int d
1890: 62 5f 62 69 6e 64 5f 69 6e 74 28 53 74 6d 74 20  b_bind_int(Stmt 
18a0: 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68  *pStmt, const ch
18b0: 61 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c 20  ar *zParamName, 
18c0: 69 6e 74 20 69 56 61 6c 75 65 29 7b 0a 20 20 72  int iValue){.  r
18d0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 62 69  eturn sqlite3_bi
18e0: 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2d 3e 70 53  nd_int(pStmt->pS
18f0: 74 6d 74 2c 20 70 61 72 61 6d 49 64 78 28 70 53  tmt, paramIdx(pS
1900: 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29  tmt, zParamName)
1910: 2c 20 69 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e 74  , iValue);.}.int
1920: 20 64 62 5f 62 69 6e 64 5f 69 6e 74 36 34 28 53   db_bind_int64(S
1930: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73  tmt *pStmt, cons
1940: 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61  t char *zParamNa
1950: 6d 65 2c 20 69 36 34 20 69 56 61 6c 75 65 29 7b  me, i64 iValue){
1960: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1970: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74  3_bind_int64(pSt
1980: 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d  mt->pStmt, param
1990: 49 64 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61  Idx(pStmt, zPara
19a0: 6d 4e 61 6d 65 29 2c 20 69 56 61 6c 75 65 29 3b  mName), iValue);
19b0: 0a 7d 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 64  .}.int db_bind_d
19c0: 6f 75 62 6c 65 28 53 74 6d 74 20 2a 70 53 74 6d  ouble(Stmt *pStm
19d0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
19e0: 50 61 72 61 6d 4e 61 6d 65 2c 20 64 6f 75 62 6c  ParamName, doubl
19f0: 65 20 72 56 61 6c 75 65 29 7b 0a 20 20 72 65 74  e rValue){.  ret
1a00: 75 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  urn sqlite3_bind
1a10: 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2d 3e 70  _double(pStmt->p
1a20: 53 74 6d 74 2c 20 70 61 72 61 6d 49 64 78 28 70  Stmt, paramIdx(p
1a30: 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65  Stmt, zParamName
1a40: 29 2c 20 72 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e  ), rValue);.}.in
1a50: 74 20 64 62 5f 62 69 6e 64 5f 74 65 78 74 28 53  t db_bind_text(S
1a60: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73  tmt *pStmt, cons
1a70: 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61  t char *zParamNa
1a80: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1a90: 7a 56 61 6c 75 65 29 7b 0a 20 20 72 65 74 75 72  zValue){.  retur
1aa0: 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  n sqlite3_bind_t
1ab0: 65 78 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74  ext(pStmt->pStmt
1ac0: 2c 20 70 61 72 61 6d 49 64 78 28 70 53 74 6d 74  , paramIdx(pStmt
1ad0: 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29 2c 20 7a  , zParamName), z
1ae0: 56 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20  Value,.         
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41    -1, SQLITE_STA
1b10: 54 49 43 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 62  TIC);.}.int db_b
1b20: 69 6e 64 5f 6e 75 6c 6c 28 53 74 6d 74 20 2a 70  ind_null(Stmt *p
1b30: 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  Stmt, const char
1b40: 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 29 7b 0a 20   *zParamName){. 
1b50: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
1b60: 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2d  bind_null(pStmt-
1b70: 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d 49 64 78  >pStmt, paramIdx
1b80: 28 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61  (pStmt, zParamNa
1b90: 6d 65 29 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 62  me));.}.int db_b
1ba0: 69 6e 64 5f 62 6c 6f 62 28 53 74 6d 74 20 2a 70  ind_blob(Stmt *p
1bb0: 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  Stmt, const char
1bc0: 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c 20 42 6c   *zParamName, Bl
1bd0: 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 72 65  ob *pBlob){.  re
1be0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e  turn sqlite3_bin
1bf0: 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2d 3e 70 53  d_blob(pStmt->pS
1c00: 74 6d 74 2c 20 70 61 72 61 6d 49 64 78 28 70 53  tmt, paramIdx(pS
1c10: 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29  tmt, zParamName)
1c20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62              blob
1c40: 5f 62 75 66 66 65 72 28 70 42 6c 6f 62 29 2c 20  _buffer(pBlob), 
1c50: 62 6c 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62 29  blob_size(pBlob)
1c60: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
1c70: 3b 0a 7d 0a 0a 2f 2a 20 62 69 6e 64 5f 73 74 72  ;.}../* bind_str
1c80: 28 29 20 74 72 65 61 74 73 20 61 20 42 6c 6f 62  () treats a Blob
1c90: 20 6f 62 6a 65 63 74 20 6c 69 6b 65 20 61 20 54   object like a T
1ca0: 45 58 54 20 73 74 72 69 6e 67 20 61 6e 64 20 62  EXT string and b
1cb0: 69 6e 64 73 20 69 74 0a 2a 2a 20 74 6f 20 74 68  inds it.** to th
1cc0: 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 2e 20  e SQL variable. 
1cd0: 20 43 6f 6e 73 74 72 61 73 74 20 74 68 69 73 20   Constrast this 
1ce0: 74 6f 20 62 69 6e 64 5f 62 6c 6f 62 28 29 20 77  to bind_blob() w
1cf0: 68 69 63 68 20 74 72 65 61 74 73 0a 2a 2a 20 74  hich treats.** t
1d00: 68 65 20 42 6c 6f 62 20 6f 62 6a 65 63 74 20 6c  he Blob object l
1d10: 69 6b 65 20 61 6e 20 53 51 4c 20 42 4c 4f 42 2e  ike an SQL BLOB.
1d20: 0a 2a 2f 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f  .*/.int db_bind_
1d30: 73 74 72 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c  str(Stmt *pStmt,
1d40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1d50: 72 61 6d 4e 61 6d 65 2c 20 42 6c 6f 62 20 2a 70  ramName, Blob *p
1d60: 42 6c 6f 62 29 7b 0a 20 20 72 65 74 75 72 6e 20  Blob){.  return 
1d70: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
1d80: 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20  t(pStmt->pStmt, 
1d90: 70 61 72 61 6d 49 64 78 28 70 53 74 6d 74 2c 20  paramIdx(pStmt, 
1da0: 7a 50 61 72 61 6d 4e 61 6d 65 29 2c 0a 20 20 20  zParamName),.   
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 20 20 20 20 20 20 20 62 6c 6f 62 5f 62 75 66 66         blob_buff
1dd0: 65 72 28 70 42 6c 6f 62 29 2c 20 62 6c 6f 62 5f  er(pBlob), blob_
1de0: 73 69 7a 65 28 70 42 6c 6f 62 29 2c 20 53 51 4c  size(pBlob), SQL
1df0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a  ITE_STATIC);.}..
1e00: 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 53  /*.** Step the S
1e10: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52  QL statement.  R
1e20: 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c  eturn either SQL
1e30: 49 54 45 5f 52 4f 57 20 6f 72 20 61 6e 20 65 72  ITE_ROW or an er
1e40: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 6f 72 20 53  ror code.** or S
1e50: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20  QLITE_OK if the 
1e60: 73 74 61 74 65 6d 65 6e 74 20 66 69 6e 69 73 68  statement finish
1e70: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  es successfully.
1e80: 0a 2a 2f 0a 69 6e 74 20 64 62 5f 73 74 65 70 28  .*/.int db_step(
1e90: 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20  Stmt *pStmt){.  
1ea0: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
1eb0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1ec0: 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 72 65 74  t->pStmt);.  ret
1ed0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ee0: 20 52 65 73 65 74 20 6f 72 20 66 69 6e 61 6c 69   Reset or finali
1ef0: 7a 65 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ze a statement..
1f00: 2a 2f 0a 69 6e 74 20 64 62 5f 72 65 73 65 74 28  */.int db_reset(
1f10: 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20  Stmt *pStmt){.  
1f20: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1f30: 5f 72 65 73 65 74 28 70 53 74 6d 74 2d 3e 70 53  _reset(pStmt->pS
1f40: 74 6d 74 29 3b 0a 20 20 64 62 5f 63 68 65 63 6b  tmt);.  db_check
1f50: 5f 72 65 73 75 6c 74 28 72 63 29 3b 0a 20 20 72  _result(rc);.  r
1f60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
1f70: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 53 74 6d 74  db_finalize(Stmt
1f80: 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69 6e 74 20   *pStmt){.  int 
1f90: 72 63 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74  rc;.  blob_reset
1fa0: 28 26 70 53 74 6d 74 2d 3e 73 71 6c 29 3b 0a 20  (&pStmt->sql);. 
1fb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
1fc0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 2d 3e 70 53  nalize(pStmt->pS
1fd0: 74 6d 74 29 3b 0a 20 20 64 62 5f 63 68 65 63 6b  tmt);.  db_check
1fe0: 5f 72 65 73 75 6c 74 28 72 63 29 3b 0a 20 20 70  _result(rc);.  p
1ff0: 53 74 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Stmt->pStmt = 0;
2000: 0a 20 20 69 66 28 20 70 53 74 6d 74 2d 3e 70 4e  .  if( pStmt->pN
2010: 65 78 74 20 29 7b 0a 20 20 20 20 70 53 74 6d 74  ext ){.    pStmt
2020: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
2030: 20 70 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20   pStmt->pPrev;. 
2040: 20 7d 0a 20 20 69 66 28 20 70 53 74 6d 74 2d 3e   }.  if( pStmt->
2050: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 53 74  pPrev ){.    pSt
2060: 6d 74 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  mt->pPrev->pNext
2070: 20 3d 20 70 53 74 6d 74 2d 3e 70 4e 65 78 74 3b   = pStmt->pNext;
2080: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 6c  .  }else if( pAl
2090: 6c 53 74 6d 74 3d 3d 70 53 74 6d 74 20 29 7b 0a  lStmt==pStmt ){.
20a0: 20 20 20 20 70 41 6c 6c 53 74 6d 74 20 3d 20 70      pAllStmt = p
20b0: 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  Stmt->pNext;.  }
20c0: 0a 20 20 70 53 74 6d 74 2d 3e 70 4e 65 78 74 20  .  pStmt->pNext 
20d0: 3d 20 30 3b 0a 20 20 70 53 74 6d 74 2d 3e 70 50  = 0;.  pStmt->pP
20e0: 72 65 76 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  rev = 0;.  retur
20f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2100: 65 74 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20  eturn the rowid 
2110: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
2120: 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 69 36 34  nt insert.*/.i64
2130: 20 64 62 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f   db_last_insert_
2140: 72 6f 77 69 64 28 76 6f 69 64 29 7b 0a 20 20 72  rowid(void){.  r
2150: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6c 61  eturn sqlite3_la
2160: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
2170: 67 2e 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g.db);.}../*.** 
2180: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2190: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
21a0: 65 72 65 20 63 68 61 6e 67 65 64 20 62 79 20 74  ere changed by t
21b0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a  he most recent.*
21c0: 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  * INSERT, UPDATE
21d0: 2c 20 6f 72 20 44 45 4c 45 54 45 2e 20 20 41 75  , or DELETE.  Au
21e0: 78 69 6c 69 61 72 79 20 63 68 61 6e 67 65 73 20  xiliary changes 
21f0: 63 61 75 73 65 64 20 62 79 20 74 72 69 67 67 65  caused by trigge
2200: 72 73 0a 2a 2a 20 6f 72 20 6f 74 68 65 72 20 73  rs.** or other s
2210: 69 64 65 20 65 66 66 65 63 74 73 20 61 72 65 20  ide effects are 
2220: 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
2230: 69 6e 74 20 64 62 5f 63 68 61 6e 67 65 73 28 76  int db_changes(v
2240: 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  oid){.  return s
2250: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 67  qlite3_changes(g
2260: 2e 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  .db);.}../*.** E
2270: 78 74 72 61 63 74 20 74 65 78 74 2c 20 69 6e 74  xtract text, int
2280: 65 67 65 72 2c 20 6f 72 20 62 6c 6f 62 20 76 61  eger, or blob va
2290: 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20 4e 2d  lues from the N-
22a0: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
22b0: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  .** current row.
22c0: 0a 2a 2f 0a 69 6e 74 20 64 62 5f 63 6f 6c 75 6d  .*/.int db_colum
22d0: 6e 5f 62 79 74 65 73 28 53 74 6d 74 20 2a 70 53  n_bytes(Stmt *pS
22e0: 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72  tmt, int N){.  r
22f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 6f  eturn sqlite3_co
2300: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
2310: 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 69  ->pStmt, N);.}.i
2320: 6e 74 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  nt db_column_int
2330: 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e  (Stmt *pStmt, in
2340: 74 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  t N){.  return s
2350: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2360: 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20  t(pStmt->pStmt, 
2370: 4e 29 3b 0a 7d 0a 69 36 34 20 64 62 5f 63 6f 6c  N);.}.i64 db_col
2380: 75 6d 6e 5f 69 6e 74 36 34 28 53 74 6d 74 20 2a  umn_int64(Stmt *
2390: 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20  pStmt, int N){. 
23a0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
23b0: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
23c0: 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d  mt->pStmt, N);.}
23d0: 0a 64 6f 75 62 6c 65 20 64 62 5f 63 6f 6c 75 6d  .double db_colum
23e0: 6e 5f 64 6f 75 62 6c 65 28 53 74 6d 74 20 2a 70  n_double(Stmt *p
23f0: 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  Stmt, int N){.  
2400: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
2410: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74  olumn_double(pSt
2420: 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d  mt->pStmt, N);.}
2430: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 5f  .const char *db_
2440: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 53 74 6d 74  column_text(Stmt
2450: 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b   *pStmt, int N){
2460: 0a 20 20 72 65 74 75 72 6e 20 28 63 68 61 72 2a  .  return (char*
2470: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2480: 74 65 78 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d  text(pStmt->pStm
2490: 74 2c 20 4e 29 3b 0a 7d 0a 63 6f 6e 73 74 20 63  t, N);.}.const c
24a0: 68 61 72 20 2a 64 62 5f 63 6f 6c 75 6d 6e 5f 6e  har *db_column_n
24b0: 61 6d 65 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c  ame(Stmt *pStmt,
24c0: 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 74 75 72   int N){.  retur
24d0: 6e 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  n (char*)sqlite3
24e0: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74  _column_name(pSt
24f0: 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d  mt->pStmt, N);.}
2500: 0a 69 6e 74 20 64 62 5f 63 6f 6c 75 6d 6e 5f 63  .int db_column_c
2510: 6f 75 6e 74 28 53 74 6d 74 20 2a 70 53 74 6d 74  ount(Stmt *pStmt
2520: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
2530: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
2540: 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pStmt->pStmt);.
2550: 7d 0a 63 68 61 72 20 2a 64 62 5f 63 6f 6c 75 6d  }.char *db_colum
2560: 6e 5f 6d 61 6c 6c 6f 63 28 53 74 6d 74 20 2a 70  n_malloc(Stmt *p
2570: 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  Stmt, int N){.  
2580: 72 65 74 75 72 6e 20 6d 70 72 69 6e 74 66 28 22  return mprintf("
2590: 25 73 22 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  %s", db_column_t
25a0: 65 78 74 28 70 53 74 6d 74 2c 20 4e 29 29 3b 0a  ext(pStmt, N));.
25b0: 7d 0a 76 6f 69 64 20 64 62 5f 63 6f 6c 75 6d 6e  }.void db_column
25c0: 5f 62 6c 6f 62 28 53 74 6d 74 20 2a 70 53 74 6d  _blob(Stmt *pStm
25d0: 74 2c 20 69 6e 74 20 4e 2c 20 42 6c 6f 62 20 2a  t, int N, Blob *
25e0: 70 42 6c 6f 62 29 7b 0a 20 20 62 6c 6f 62 5f 61  pBlob){.  blob_a
25f0: 70 70 65 6e 64 28 70 42 6c 6f 62 2c 20 73 71 6c  ppend(pBlob, sql
2600: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
2610: 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e  (pStmt->pStmt, N
2620: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2630: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2640: 62 79 74 65 73 28 70 53 74 6d 74 2d 3e 70 53 74  bytes(pStmt->pSt
2650: 6d 74 2c 20 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mt, N));.}../*.*
2660: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 62  * Initialize a b
2670: 6c 6f 62 20 74 6f 20 61 6e 20 65 70 68 65 72 6d  lob to an epherm
2680: 65 72 61 6c 20 63 6f 70 79 20 6f 66 20 74 68 65  eral copy of the
2690: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 0a 2a 2a   content of a.**
26a0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 63   column in the c
26b0: 75 72 72 65 6e 74 20 72 6f 77 2e 20 20 54 68 65  urrent row.  The
26c0: 20 64 61 74 61 20 69 6e 20 74 68 65 20 62 6c 6f   data in the blo
26d0: 62 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a  b will become.**
26e0: 20 69 6e 76 61 6c 69 64 20 77 68 65 6e 20 74 68   invalid when th
26f0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  e statement is s
2700: 74 65 70 70 65 64 20 6f 72 20 72 65 73 65 74 2e  tepped or reset.
2710: 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 65 70 68 65  .*/.void db_ephe
2720: 6d 65 72 61 6c 5f 62 6c 6f 62 28 53 74 6d 74 20  meral_blob(Stmt 
2730: 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e 2c 20 42  *pStmt, int N, B
2740: 6c 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 62  lob *pBlob){.  b
2750: 6c 6f 62 5f 69 6e 69 74 28 70 42 6c 6f 62 2c 20  lob_init(pBlob, 
2760: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
2770: 6c 6f 62 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74  lob(pStmt->pStmt
2780: 2c 20 4e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  , N),.          
2790: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
27a0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2d 3e  mn_bytes(pStmt->
27b0: 70 53 74 6d 74 2c 20 4e 29 29 3b 0a 7d 0a 0a 2f  pStmt, N));.}../
27c0: 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 72 65 73  *.** Check a res
27d0: 75 6c 74 20 63 6f 64 65 2e 20 20 49 66 20 69 74  ult code.  If it
27e0: 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
27f0: 4b 2c 20 70 72 69 6e 74 20 74 68 65 0a 2a 2a 20  K, print the.** 
2800: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 72  corresponding er
2810: 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
2820: 65 78 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62  exit..*/.void db
2830: 5f 63 68 65 63 6b 5f 72 65 73 75 6c 74 28 69 6e  _check_result(in
2840: 74 20 72 63 29 7b 0a 20 20 69 66 28 20 72 63 21  t rc){.  if( rc!
2850: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2860: 20 20 64 62 5f 65 72 72 28 22 53 51 4c 20 65 72    db_err("SQL er
2870: 72 6f 72 3a 20 25 73 22 2c 20 73 71 6c 69 74 65  ror: %s", sqlite
2880: 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 29 3b  3_errmsg(g.db));
2890: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
28a0: 65 63 75 74 65 20 61 20 73 69 6e 67 6c 65 20 70  ecute a single p
28b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
28c0: 74 20 75 6e 74 69 6c 20 69 74 20 66 69 6e 69 73  t until it finis
28d0: 68 65 73 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 65  hes..*/.int db_e
28e0: 78 65 63 28 53 74 6d 74 20 2a 70 53 74 6d 74 29  xec(Stmt *pStmt)
28f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 68  {.  int rc;.  wh
2900: 69 6c 65 28 20 28 72 63 20 3d 20 64 62 5f 73 74  ile( (rc = db_st
2910: 65 70 28 70 53 74 6d 74 29 29 3d 3d 53 51 4c 49  ep(pStmt))==SQLI
2920: 54 45 5f 52 4f 57 20 29 7b 7d 0a 20 20 72 63 20  TE_ROW ){}.  rc 
2930: 3d 20 64 62 5f 72 65 73 65 74 28 70 53 74 6d 74  = db_reset(pStmt
2940: 29 3b 0a 20 20 64 62 5f 63 68 65 63 6b 5f 72 65  );.  db_check_re
2950: 73 75 6c 74 28 72 63 29 3b 0a 20 20 72 65 74 75  sult(rc);.  retu
2960: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2970: 45 78 65 63 75 74 65 20 6d 75 6c 74 69 70 6c 65  Execute multiple
2980: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
2990: 0a 2a 2f 0a 69 6e 74 20 64 62 5f 6d 75 6c 74 69  .*/.int db_multi
29a0: 5f 65 78 65 63 28 63 6f 6e 73 74 20 63 68 61 72  _exec(const char
29b0: 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20   *zSql, ...){.  
29c0: 42 6c 6f 62 20 73 71 6c 3b 0a 20 20 69 6e 74 20  Blob sql;.  int 
29d0: 72 63 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  rc;.  va_list ap
29e0: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
29f0: 20 30 3b 0a 20 20 62 6c 6f 62 5f 69 6e 69 74 28   0;.  blob_init(
2a00: 26 73 71 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 76  &sql, 0, 0);.  v
2a10: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c  a_start(ap, zSql
2a20: 29 3b 0a 20 20 62 6c 6f 62 5f 76 61 70 70 65 6e  );.  blob_vappen
2a30: 64 66 28 26 73 71 6c 2c 20 7a 53 71 6c 2c 20 61  df(&sql, zSql, a
2a40: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2a50: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2a60: 5f 65 78 65 63 28 67 2e 64 62 2c 20 62 6c 6f 62  _exec(g.db, blob
2a70: 5f 62 75 66 66 65 72 28 26 73 71 6c 29 2c 20 30  _buffer(&sql), 0
2a80: 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69  , 0, &zErr);.  i
2a90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2aa0: 20 29 7b 0a 20 20 20 20 64 62 5f 65 72 72 28 22   ){.    db_err("
2ab0: 25 73 5c 6e 25 73 22 2c 20 7a 45 72 72 2c 20 62  %s\n%s", zErr, b
2ac0: 6c 6f 62 5f 62 75 66 66 65 72 28 26 73 71 6c 29  lob_buffer(&sql)
2ad0: 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 65  );.  }.  blob_re
2ae0: 73 65 74 28 26 73 71 6c 29 3b 0a 20 20 72 65 74  set(&sql);.  ret
2af0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2b00: 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72 79   Execute a query
2b10: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 73 69   and return a si
2b20: 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 76 61 6c  ngle integer val
2b30: 75 65 2e 0a 2a 2f 0a 69 36 34 20 64 62 5f 69 6e  ue..*/.i64 db_in
2b40: 74 36 34 28 69 36 34 20 69 44 66 6c 74 2c 20 63  t64(i64 iDflt, c
2b50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
2b60: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
2b70: 20 61 70 3b 0a 20 20 53 74 6d 74 20 73 3b 0a 20   ap;.  Stmt s;. 
2b80: 20 69 36 34 20 72 63 3b 0a 20 20 76 61 5f 73 74   i64 rc;.  va_st
2b90: 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a 20  art(ap, zSql);. 
2ba0: 20 64 62 5f 76 70 72 65 70 61 72 65 28 26 73 2c   db_vprepare(&s,
2bb0: 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20 76 61   zSql, ap);.  va
2bc0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
2bd0: 64 62 5f 73 74 65 70 28 26 73 29 21 3d 53 51 4c  db_step(&s)!=SQL
2be0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72  ITE_ROW ){.    r
2bf0: 63 20 3d 20 69 44 66 6c 74 3b 0a 20 20 7d 65 6c  c = iDflt;.  }el
2c00: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 5f  se{.    rc = db_
2c10: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 26 73 2c  column_int64(&s,
2c20: 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69   0);.  }.  db_fi
2c30: 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20 72 65  nalize(&s);.  re
2c40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 64  turn rc;.}.int d
2c50: 62 5f 69 6e 74 28 69 6e 74 20 69 44 66 6c 74 2c  b_int(int iDflt,
2c60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
2c70: 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  l, ...){.  va_li
2c80: 73 74 20 61 70 3b 0a 20 20 53 74 6d 74 20 73 3b  st ap;.  Stmt s;
2c90: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f  .  int rc;.  va_
2ca0: 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b  start(ap, zSql);
2cb0: 0a 20 20 64 62 5f 76 70 72 65 70 61 72 65 28 26  .  db_vprepare(&
2cc0: 73 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20  s, zSql, ap);.  
2cd0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
2ce0: 28 20 64 62 5f 73 74 65 70 28 26 73 29 21 3d 53  ( db_step(&s)!=S
2cf0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
2d00: 20 72 63 20 3d 20 69 44 66 6c 74 3b 0a 20 20 7d   rc = iDflt;.  }
2d10: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 64  else{.    rc = d
2d20: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 73 2c  b_column_int(&s,
2d30: 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69   0);.  }.  db_fi
2d40: 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20 72 65  nalize(&s);.  re
2d50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2d60: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2d70: 20 74 68 65 20 71 75 65 72 79 20 77 6f 75 6c 64   the query would
2d80: 20 72 65 74 75 72 6e 20 31 20 6f 72 20 6d 6f 72   return 1 or mor
2d90: 65 20 72 6f 77 73 2e 20 20 52 65 74 75 72 6e 0a  e rows.  Return.
2da0: 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20  ** FALSE if the 
2db0: 71 75 65 72 79 20 72 65 73 75 6c 74 20 77 6f 75  query result wou
2dc0: 6c 64 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73  ld be an empty s
2dd0: 65 74 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 65 78  et..*/.int db_ex
2de0: 69 73 74 73 28 63 6f 6e 73 74 20 63 68 61 72 20  ists(const char 
2df0: 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76  *zSql, ...){.  v
2e00: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d  a_list ap;.  Stm
2e10: 74 20 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  t s;.  int rc;. 
2e20: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53   va_start(ap, zS
2e30: 71 6c 29 3b 0a 20 20 64 62 5f 76 70 72 65 70 61  ql);.  db_vprepa
2e40: 72 65 28 26 73 2c 20 7a 53 71 6c 2c 20 61 70 29  re(&s, zSql, ap)
2e50: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
2e60: 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 73    if( db_step(&s
2e70: 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )!=SQLITE_ROW ){
2e80: 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d  .    rc = 0;.  }
2e90: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
2ea0: 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c  ;.  }.  db_final
2eb0: 69 7a 65 28 26 73 29 3b 0a 20 20 72 65 74 75 72  ize(&s);.  retur
2ec0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2ed0: 45 78 65 63 75 74 65 20 61 20 71 75 65 72 79 20  Execute a query 
2ee0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 66 6c 6f  and return a flo
2ef0: 61 74 69 6e 67 2d 70 6f 69 6e 74 20 76 61 6c 75  ating-point valu
2f00: 65 2e 0a 2a 2f 0a 64 6f 75 62 6c 65 20 64 62 5f  e..*/.double db_
2f10: 64 6f 75 62 6c 65 28 64 6f 75 62 6c 65 20 72 44  double(double rD
2f20: 66 6c 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  flt, const char 
2f30: 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76  *zSql, ...){.  v
2f40: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d  a_list ap;.  Stm
2f50: 74 20 73 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b  t s;.  double r;
2f60: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
2f70: 7a 53 71 6c 29 3b 0a 20 20 64 62 5f 76 70 72 65  zSql);.  db_vpre
2f80: 70 61 72 65 28 26 73 2c 20 7a 53 71 6c 2c 20 61  pare(&s, zSql, a
2f90: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
2fa0: 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70 28  ;.  if( db_step(
2fb0: 26 73 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &s)!=SQLITE_ROW 
2fc0: 29 7b 0a 20 20 20 20 72 20 3d 20 72 44 66 6c 74  ){.    r = rDflt
2fd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2fe0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 64 6f 75   = db_column_dou
2ff0: 62 6c 65 28 26 73 2c 20 30 29 3b 0a 20 20 7d 0a  ble(&s, 0);.  }.
3000: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73    db_finalize(&s
3010: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d  );.  return r;.}
3020: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
3030: 61 20 71 75 65 72 79 20 61 6e 64 20 61 70 70 65  a query and appe
3040: 6e 64 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c  nd the first col
3050: 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74  umn of the first
3060: 20 72 6f 77 0a 2a 2a 20 6f 66 20 74 68 65 20 72   row.** of the r
3070: 65 73 75 6c 74 20 73 65 74 20 74 6f 20 62 6c 6f  esult set to blo
3080: 62 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 66  b given in the f
3090: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
30a0: 2f 0a 76 6f 69 64 20 64 62 5f 62 6c 6f 62 28 42  /.void db_blob(B
30b0: 6c 6f 62 20 2a 70 52 65 73 75 6c 74 2c 20 63 6f  lob *pResult, co
30c0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
30d0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
30e0: 61 70 3b 0a 20 20 53 74 6d 74 20 73 3b 0a 20 20  ap;.  Stmt s;.  
30f0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 71  va_start(ap, zSq
3100: 6c 29 3b 0a 20 20 64 62 5f 76 70 72 65 70 61 72  l);.  db_vprepar
3110: 65 28 26 73 2c 20 7a 53 71 6c 2c 20 61 70 29 3b  e(&s, zSql, ap);
3120: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
3130: 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 73 29   if( db_step(&s)
3140: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
3150: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
3160: 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33  pResult, sqlite3
3170: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 73 2e 70  _column_blob(s.p
3180: 53 74 6d 74 2c 20 30 29 2c 0a 20 20 20 20 20 20  Stmt, 0),.      
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
31b0: 6e 5f 62 79 74 65 73 28 73 2e 70 53 74 6d 74 2c  n_bytes(s.pStmt,
31c0: 20 30 29 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66   0));.  }.  db_f
31d0: 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 7d 0a 0a  inalize(&s);.}..
31e0: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
31f0: 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74  query.  Return t
3200: 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  he first column 
3210: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
3220: 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 73 75 6c  .** of the resul
3230: 74 20 73 65 74 20 61 73 20 61 20 73 74 72 69 6e  t set as a strin
3240: 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  g.  Space to hol
3250: 64 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 0a  d the string is.
3260: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
3270: 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 49 66 20 74   malloc().  If t
3280: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  he result set is
3290: 20 65 6d 70 74 79 2c 20 72 65 74 75 72 6e 0a 2a   empty, return.*
32a0: 2a 20 7a 44 65 66 61 75 6c 74 20 69 6e 73 74 65  * zDefault inste
32b0: 61 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 64 62 5f  ad..*/.char *db_
32c0: 74 65 78 74 28 63 68 61 72 20 2a 7a 44 65 66 61  text(char *zDefa
32d0: 75 6c 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ult, const char 
32e0: 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76  *zSql, ...){.  v
32f0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d  a_list ap;.  Stm
3300: 74 20 73 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d  t s;.  char *z =
3310: 20 7a 44 65 66 61 75 6c 74 3b 0a 20 20 76 61 5f   zDefault;.  va_
3320: 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b  start(ap, zSql);
3330: 0a 20 20 64 62 5f 76 70 72 65 70 61 72 65 28 26  .  db_vprepare(&
3340: 73 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20  s, zSql, ap);.  
3350: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
3360: 28 20 64 62 5f 73 74 65 70 28 26 73 29 3d 3d 53  ( db_step(&s)==S
3370: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
3380: 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73   z = mprintf("%s
3390: 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
33a0: 6e 5f 74 65 78 74 28 73 2e 70 53 74 6d 74 2c 20  n_text(s.pStmt, 
33b0: 30 29 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69  0));.  }.  db_fi
33c0: 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20 72 65  nalize(&s);.  re
33d0: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 64 65  turn z;.}..#ifde
33e0: 66 20 5f 5f 4d 49 4e 47 57 33 32 5f 5f 0a 2f 2a  f __MINGW32__./*
33f0: 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
3400: 65 73 20 28 63 6f 70 69 65 64 20 6f 75 74 20 6f  es (copied out o
3410: 66 20 74 68 65 20 6f 73 5f 77 69 6e 2e 63 20 64  f the os_win.c d
3420: 72 69 76 65 72 20 66 6f 72 20 53 51 4c 69 74 65  river for SQLite
3430: 29 20 63 6f 6e 76 65 72 74 0a 2a 2a 20 63 68 61  ) convert.** cha
3440: 72 61 63 74 65 72 20 73 74 72 69 6e 67 73 20 69  racter strings i
3450: 6e 20 76 61 72 69 6f 75 73 20 6d 69 63 72 6f 73  n various micros
3460: 6f 66 74 20 6d 75 6c 74 69 2d 62 79 74 65 20 63  oft multi-byte c
3470: 68 61 72 61 63 74 65 72 20 66 6f 72 6d 61 74 73  haracter formats
3480: 0a 2a 2a 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20  .** into UTF-8. 
3490: 20 46 6f 73 73 69 6c 20 61 6e 64 20 53 51 4c 69   Fossil and SQLi
34a0: 74 65 20 61 6c 77 61 79 73 20 75 73 65 20 6f 6e  te always use on
34b0: 6c 79 20 55 54 46 2d 38 20 69 6e 74 65 72 6e 61  ly UTF-8 interna
34c0: 6c 6c 79 2e 20 20 54 68 65 73 65 0a 2a 2a 20 72  lly.  These.** r
34d0: 6f 75 74 69 6e 65 73 20 61 72 65 20 6e 65 65 64  outines are need
34e0: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ed in order to c
34f0: 6f 6e 76 65 72 74 20 66 72 6f 6d 20 74 68 65 20  onvert from the 
3500: 64 65 66 61 75 6c 74 20 63 68 61 72 61 63 74 65  default characte
3510: 72 20 73 65 74 0a 2a 2a 20 63 75 72 72 65 6e 74  r set.** current
3520: 6c 79 20 69 6e 20 75 73 65 20 62 79 20 77 69 6e  ly in use by win
3530: 64 6f 77 73 20 69 6e 74 6f 20 55 54 46 2d 38 20  dows into UTF-8 
3540: 77 68 65 6e 20 73 74 72 69 6e 67 73 20 61 72 65  when strings are
3550: 20 69 6d 70 6f 72 74 65 64 20 66 72 6f 6d 0a 2a   imported from.*
3560: 2a 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f  * the outside wo
3570: 72 6c 64 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f  rld..*/./*.** Co
3580: 6e 76 65 72 74 20 6d 69 63 72 6f 73 6f 66 74 20  nvert microsoft 
3590: 75 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38  unicode to UTF-8
35a0: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
35b0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
35c0: 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69  ring is.** obtai
35d0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
35e0: 29 2e 0a 2a 2a 20 43 6f 70 69 65 64 20 66 72 6f  )..** Copied fro
35f0: 6d 20 73 71 6c 69 74 65 33 2e 63 20 61 73 20 69  m sqlite3.c as i
3600: 73 20 28 70 65 74 72 29 0a 2a 2f 0a 73 74 61 74  s (petr).*/.stat
3610: 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65  ic char *unicode
3620: 54 6f 55 74 66 38 28 63 6f 6e 73 74 20 57 43 48  ToUtf8(const WCH
3630: 41 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e 61 6d  AR *zWideFilenam
3640: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
3650: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
3660: 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 57  me;..  nByte = W
3670: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
3680: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
3690: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
36a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
36b0: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6d 61 6c   zFilename = mal
36c0: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
36d0: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
36e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
36f0: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
3700: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
3710: 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  yte(CP_UTF8, 0, 
3720: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
3730: 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42  1, zFilename, nB
3740: 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  yte,.           
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3760: 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20     0, 0);.  if( 
3770: 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20  nByte == 0 ){.  
3780: 20 20 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65    free(zFilename
3790: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
37a0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
37b0: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
37c0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e  /*.** Convert an
37d0: 20 61 6e 73 69 20 73 74 72 69 6e 67 20 74 6f 20   ansi string to 
37e0: 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f 64  microsoft unicod
37f0: 65 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  e, based on the.
3800: 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70  ** current codep
3810: 61 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72  age settings for
3820: 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a   file apis..** .
3830: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
3840: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
3850: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
3860: 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  .** from malloc.
3870: 0a 2a 2f 0a 73 74 61 74 69 63 20 57 43 48 41 52  .*/.static WCHAR
3880: 20 2a 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28   *mbcsToUnicode(
3890: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
38a0: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
38b0: 79 74 65 3b 0a 20 20 57 43 48 41 52 20 2a 7a 4d  yte;.  WCHAR *zM
38c0: 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69  bcsFilename;.  i
38d0: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 43 50  nt codepage = CP
38e0: 5f 41 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  _ACP;..  nByte =
38f0: 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65   MultiByteToWide
3900: 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30  Char(codepage, 0
3910: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
3920: 20 4e 55 4c 4c 2c 30 29 2a 73 69 7a 65 6f 66 28   NULL,0)*sizeof(
3930: 57 43 48 41 52 29 3b 0a 20 20 7a 4d 62 63 73 46  WCHAR);.  zMbcsF
3940: 69 6c 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63  ilename = malloc
3950: 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
3960: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  MbcsFilename[0])
3970: 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46   );.  if( zMbcsF
3980: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
3990: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
39a0: 0a 20 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69  .  nByte = Multi
39b0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63  ByteToWideChar(c
39c0: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c  odepage, 0, zFil
39d0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73  ename, -1, zMbcs
39e0: 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 29  Filename, nByte)
39f0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
3a00: 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 4d 62   ){.    free(zMb
3a10: 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  csFilename);.   
3a20: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d   zMbcsFilename =
3a30: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
3a40: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a   zMbcsFilename;.
3a50: 7d 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  }./*.** Convert 
3a60: 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63  multibyte charac
3a70: 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54  ter string to UT
3a80: 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68  F-8.  Space to h
3a90: 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  old the.** retur
3aa0: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
3ab0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
3ac0: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
3ad0: 63 68 61 72 20 2a 6d 62 63 73 54 6f 55 74 66 38  char *mbcsToUtf8
3ae0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
3af0: 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  lename){.  char 
3b00: 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a  *zFilenameUtf8;.
3b10: 20 20 57 43 48 41 52 20 2a 7a 54 6d 70 57 69 64    WCHAR *zTmpWid
3b20: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
3b30: 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a   mbcsToUnicode(z
3b40: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
3b50: 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a   zTmpWide==0 ){.
3b60: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3b70: 7d 0a 20 20 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  }.  .  zFilename
3b80: 55 74 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f  Utf8 = unicodeTo
3b90: 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a  Utf8(zTmpWide);.
3ba0: 20 20 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29    free(zTmpWide)
3bb0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  ;.  return zFile
3bc0: 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a 23 65 6e 64  nameUtf8;.}.#end
3bd0: 69 66 20 2f 2a 20 5f 5f 4d 49 4e 47 57 33 32 5f  if /* __MINGW32_
3be0: 5f 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  _ */.../*.** Ini
3bf0: 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 64 61  tialize a new da
3c00: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68  tabase file with
3c10: 20 74 68 65 20 67 69 76 65 6e 20 73 63 68 65 6d   the given schem
3c20: 61 2e 20 20 49 66 20 61 6e 79 74 68 69 6e 67 0a  a.  If anything.
3c30: 2a 2a 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 63  ** goes wrong, c
3c40: 61 6c 6c 20 64 62 5f 65 72 72 28 29 20 74 6f 20  all db_err() to 
3c50: 65 78 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62  exit..*/.void db
3c60: 5f 69 6e 69 74 5f 64 61 74 61 62 61 73 65 28 0a  _init_database(.
3c70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
3c80: 69 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ileName,   /* Na
3c90: 6d 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  me of database f
3ca0: 69 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  ile to create */
3cb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3cc0: 53 63 68 65 6d 61 2c 20 20 20 20 20 2f 2a 20 46  Schema,     /* F
3cd0: 69 72 73 74 20 70 61 72 74 20 6f 66 20 73 63 68  irst part of sch
3ce0: 65 6d 61 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20  ema */.  ...    
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d00: 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20    /* Additional 
3d10: 53 51 4c 20 74 6f 20 72 75 6e 2e 20 20 54 65 72  SQL to run.  Ter
3d20: 6d 69 6e 61 74 65 20 77 69 74 68 20 4e 55 4c 4c  minate with NULL
3d30: 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  . */.){.  sqlite
3d40: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
3d50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3d60: 53 71 6c 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61  Sql;.  va_list a
3d70: 70 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 4d 49 4e  p;..#ifdef __MIN
3d80: 47 57 33 32 5f 5f 0a 20 20 7a 46 69 6c 65 4e 61  GW32__.  zFileNa
3d90: 6d 65 20 3d 20 6d 62 63 73 54 6f 55 74 66 38 28  me = mbcsToUtf8(
3da0: 7a 46 69 6c 65 4e 61 6d 65 29 3b 0a 23 65 6e 64  zFileName);.#end
3db0: 69 66 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  if.  rc = sqlite
3dc0: 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 4e 61 6d 65  3_open(zFileName
3dd0: 2c 20 26 64 62 29 3b 0a 20 20 69 66 28 20 72 63  , &db);.  if( rc
3de0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
3df0: 20 20 20 64 62 5f 65 72 72 28 73 71 6c 69 74 65     db_err(sqlite
3e00: 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
3e10: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 62 75 73   }.  sqlite3_bus
3e20: 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 35 30  y_timeout(db, 50
3e30: 30 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65  00);.  sqlite3_e
3e40: 78 65 63 28 64 62 2c 20 22 42 45 47 49 4e 20 45  xec(db, "BEGIN E
3e50: 58 43 4c 55 53 49 56 45 22 2c 20 30 2c 20 30 2c  XCLUSIVE", 0, 0,
3e60: 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
3e70: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 63  te3_exec(db, zSc
3e80: 68 65 6d 61 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  hema, 0, 0, 0);.
3e90: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3ea0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 5f 65 72  _OK ){.    db_er
3eb0: 72 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  r(sqlite3_errmsg
3ec0: 28 64 62 29 29 3b 0a 20 20 7d 0a 20 20 76 61 5f  (db));.  }.  va_
3ed0: 73 74 61 72 74 28 61 70 2c 20 7a 53 63 68 65 6d  start(ap, zSchem
3ee0: 61 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 53  a);.  while( (zS
3ef0: 71 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ql = va_arg(ap, 
3f00: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 21 3d 30  const char*))!=0
3f10: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
3f20: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
3f30: 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ql, 0, 0, 0);.  
3f40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3f50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 5f  _OK ){.      db_
3f60: 65 72 72 28 73 71 6c 69 74 65 33 5f 65 72 72 6d  err(sqlite3_errm
3f70: 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20  sg(db));.    }. 
3f80: 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
3f90: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  .  sqlite3_exec(
3fa0: 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  db, "COMMIT", 0,
3fb0: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
3fc0: 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 7d 0a 0a  3_close(db);.}..
3fd0: 2f 2a 0a 2a 2a 20 7a 44 62 4e 61 6d 65 20 69 73  /*.** zDbName is
3fe0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
3ff0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
4000: 66 20 6e 6f 20 6f 74 68 65 72 20 64 61 74 61 62  f no other datab
4010: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 6f  ase.** file is o
4020: 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 74  pen, then open t
4030: 68 69 73 20 6f 6e 65 2e 20 20 49 66 20 61 6e 6f  his one.  If ano
4040: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ther database fi
4050: 6c 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79  le is.** already
4060: 20 6f 70 65 6e 2c 20 74 68 65 6e 20 61 74 74 61   open, then atta
4070: 63 68 20 7a 44 62 4e 61 6d 65 20 75 73 69 6e 67  ch zDbName using
4080: 20 74 68 65 20 6e 61 6d 65 20 7a 4c 61 62 65 6c   the name zLabel
4090: 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 6f 70 65  ..*/.void db_ope
40a0: 6e 5f 6f 72 5f 61 74 74 61 63 68 28 63 6f 6e 73  n_or_attach(cons
40b0: 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c  t char *zDbName,
40c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61   const char *zLa
40d0: 62 65 6c 29 7b 0a 23 69 66 64 65 66 20 5f 5f 4d  bel){.#ifdef __M
40e0: 49 4e 47 57 33 32 5f 5f 0a 20 20 7a 44 62 4e 61  INGW32__.  zDbNa
40f0: 6d 65 20 3d 20 6d 62 63 73 54 6f 55 74 66 38 28  me = mbcsToUtf8(
4100: 7a 44 62 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  zDbName);.#endif
4110: 0a 20 20 69 66 28 20 21 67 2e 64 62 20 29 7b 0a  .  if( !g.db ){.
4120: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
4130: 69 74 65 33 5f 6f 70 65 6e 28 7a 44 62 4e 61 6d  ite3_open(zDbNam
4140: 65 2c 20 26 67 2e 64 62 29 3b 0a 20 20 20 20 69  e, &g.db);.    i
4150: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4160: 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 65 72 72   ){.      db_err
4170: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
4180: 67 2e 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20  g.db));.    }.  
4190: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74    sqlite3_busy_t
41a0: 69 6d 65 6f 75 74 28 67 2e 64 62 2c 20 35 30 30  imeout(g.db, 500
41b0: 30 29 3b 0a 20 20 20 20 64 62 5f 63 6f 6e 6e 65  0);.    db_conne
41c0: 63 74 69 6f 6e 5f 69 6e 69 74 28 29 3b 0a 20 20  ction_init();.  
41d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 5f 6d 75  }else{.    db_mu
41e0: 6c 74 69 5f 65 78 65 63 28 22 41 54 54 41 43 48  lti_exec("ATTACH
41f0: 20 44 41 54 41 42 41 53 45 20 25 51 20 41 53 20   DATABASE %Q AS 
4200: 25 73 22 2c 20 7a 44 62 4e 61 6d 65 2c 20 7a 4c  %s", zDbName, zL
4210: 61 62 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  abel);.  }.}../*
4220: 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 75 73 65  .** Open the use
4230: 72 20 64 61 74 61 62 61 73 65 20 69 6e 20 22 7e  r database in "~
4240: 2f 2e 66 6f 73 73 69 6c 22 2e 20 20 43 72 65 61  /.fossil".  Crea
4250: 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
4260: 61 6e 65 77 20 69 66 0a 2a 2a 20 69 74 20 64 6f  anew if.** it do
4270: 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
4280: 78 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62  xist..*/.void db
4290: 5f 6f 70 65 6e 5f 63 6f 6e 66 69 67 28 76 6f 69  _open_config(voi
42a0: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 4e  d){.  char *zDbN
42b0: 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame;.  const cha
42c0: 72 20 2a 7a 48 6f 6d 65 3b 0a 20 20 69 66 28 20  r *zHome;.  if( 
42d0: 67 2e 63 6f 6e 66 69 67 4f 70 65 6e 20 29 20 72  g.configOpen ) r
42e0: 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 5f 5f  eturn;.#ifdef __
42f0: 4d 49 4e 47 57 33 32 5f 5f 0a 20 20 7a 48 6f 6d  MINGW32__.  zHom
4300: 65 20 3d 20 67 65 74 65 6e 76 28 22 4c 4f 43 41  e = getenv("LOCA
4310: 4c 41 50 50 44 41 54 41 22 29 3b 0a 20 20 69 66  LAPPDATA");.  if
4320: 28 20 7a 48 6f 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zHome==0 ){.  
4330: 20 20 7a 48 6f 6d 65 20 3d 20 67 65 74 65 6e 76    zHome = getenv
4340: 28 22 41 50 50 44 41 54 41 22 29 3b 0a 20 20 20  ("APPDATA");.   
4350: 20 69 66 28 20 7a 48 6f 6d 65 3d 3d 30 20 29 7b   if( zHome==0 ){
4360: 0a 20 20 20 20 20 20 7a 48 6f 6d 65 20 3d 20 67  .      zHome = g
4370: 65 74 65 6e 76 28 22 48 4f 4d 45 50 41 54 48 22  etenv("HOMEPATH"
4380: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
4390: 73 65 0a 20 20 7a 48 6f 6d 65 20 3d 20 67 65 74  se.  zHome = get
43a0: 65 6e 76 28 22 48 4f 4d 45 22 29 3b 0a 23 65 6e  env("HOME");.#en
43b0: 64 69 66 0a 20 20 69 66 28 20 7a 48 6f 6d 65 3d  dif.  if( zHome=
43c0: 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f 65 72 72  =0 ){.    db_err
43d0: 28 22 63 61 6e 6e 6f 74 20 6c 6f 63 61 6c 20 68  ("cannot local h
43e0: 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b  ome directory");
43f0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 5f 5f 4d 49  .  }.#ifdef __MI
4400: 4e 47 57 33 32 5f 5f 0a 20 20 2f 2a 20 2e 20 66  NGW32__.  /* . f
4410: 69 6c 65 6e 61 6d 65 73 20 67 69 76 65 20 73 6f  ilenames give so
4420: 6d 65 20 77 69 6e 64 6f 77 20 73 79 73 74 65 6d  me window system
4430: 73 20 70 72 6f 62 6c 65 6d 73 20 61 6e 64 20 6d  s problems and m
4440: 61 6e 79 20 61 70 70 73 20 70 72 6f 62 6c 65 6d  any apps problem
4450: 73 20 2a 2f 0a 20 20 7a 44 62 4e 61 6d 65 20 3d  s */.  zDbName =
4460: 20 6d 70 72 69 6e 74 66 28 22 25 2f 2f 5f 66 6f   mprintf("%//_fo
4470: 73 73 69 6c 22 2c 20 7a 48 6f 6d 65 29 3b 0a 23  ssil", zHome);.#
4480: 65 6c 73 65 0a 20 20 7a 44 62 4e 61 6d 65 20 3d  else.  zDbName =
4490: 20 6d 70 72 69 6e 74 66 28 22 25 73 2f 2e 66 6f   mprintf("%s/.fo
44a0: 73 73 69 6c 22 2c 20 7a 48 6f 6d 65 29 3b 0a 23  ssil", zHome);.#
44b0: 65 6e 64 69 66 0a 20 20 69 66 28 20 66 69 6c 65  endif.  if( file
44c0: 5f 73 69 7a 65 28 7a 44 62 4e 61 6d 65 29 3c 31  _size(zDbName)<1
44d0: 30 32 34 2a 33 20 29 7b 0a 20 20 20 20 64 62 5f  024*3 ){.    db_
44e0: 69 6e 69 74 5f 64 61 74 61 62 61 73 65 28 7a 44  init_database(zD
44f0: 62 4e 61 6d 65 2c 20 7a 43 6f 6e 66 69 67 53 63  bName, zConfigSc
4500: 68 65 6d 61 2c 20 28 63 68 61 72 2a 29 30 29 3b  hema, (char*)0);
4510: 0a 20 20 7d 0a 20 20 64 62 5f 6f 70 65 6e 5f 6f  .  }.  db_open_o
4520: 72 5f 61 74 74 61 63 68 28 7a 44 62 4e 61 6d 65  r_attach(zDbName
4530: 2c 20 22 63 6f 6e 66 69 67 64 62 22 29 3b 0a 20  , "configdb");. 
4540: 20 67 2e 63 6f 6e 66 69 67 4f 70 65 6e 20 3d 20   g.configOpen = 
4550: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 7a  1;.}../*.** If z
4560: 44 62 4e 61 6d 65 20 69 73 20 61 20 76 61 6c 69  DbName is a vali
4570: 64 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65  d local database
4580: 20 66 69 6c 65 2c 20 6f 70 65 6e 20 69 74 20 61   file, open it a
4590: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 72 75  nd return.** tru
45a0: 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
45b0: 20 61 20 76 61 6c 69 64 20 6c 6f 63 61 6c 20 64   a valid local d
45c0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65  atabase file, re
45d0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
45e0: 63 20 69 6e 74 20 69 73 56 61 6c 69 64 4c 6f 63  c int isValidLoc
45f0: 61 6c 44 62 28 63 6f 6e 73 74 20 63 68 61 72 20  alDb(const char 
4600: 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 36 34  *zDbName){.  i64
4610: 20 6c 73 69 7a 65 3b 0a 20 20 69 6e 74 20 72 63   lsize;.  int rc
4620: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
4630: 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
4640: 61 63 63 65 73 73 28 7a 44 62 4e 61 6d 65 2c 20  access(zDbName, 
4650: 46 5f 4f 4b 29 20 29 20 72 65 74 75 72 6e 20 30  F_OK) ) return 0
4660: 3b 0a 20 20 6c 73 69 7a 65 20 3d 20 66 69 6c 65  ;.  lsize = file
4670: 5f 73 69 7a 65 28 7a 44 62 4e 61 6d 65 29 3b 0a  _size(zDbName);.
4680: 20 20 69 66 28 20 6c 73 69 7a 65 25 31 30 32 34    if( lsize%1024
4690: 21 3d 30 20 7c 7c 20 6c 73 69 7a 65 3c 34 30 39  !=0 || lsize<409
46a0: 36 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  6 ) return 0;.  
46b0: 64 62 5f 6f 70 65 6e 5f 6f 72 5f 61 74 74 61 63  db_open_or_attac
46c0: 68 28 7a 44 62 4e 61 6d 65 2c 20 22 6c 6f 63 61  h(zDbName, "loca
46d0: 6c 64 62 22 29 3b 0a 20 20 67 2e 6c 6f 63 61 6c  ldb");.  g.local
46e0: 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 64 62 5f 6f  Open = 1;.  db_o
46f0: 70 65 6e 5f 63 6f 6e 66 69 67 28 29 3b 0a 20 20  pen_config();.  
4700: 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f  db_open_reposito
4710: 72 79 28 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ry(0);..  /* If 
4720: 74 68 65 20 22 6d 74 69 6d 65 22 20 63 6f 6c 75  the "mtime" colu
4730: 6d 6e 20 69 73 20 6d 69 73 73 69 6e 67 20 66 72  mn is missing fr
4740: 6f 6d 20 74 68 65 20 76 66 69 6c 65 20 74 61 62  om the vfile tab
4750: 6c 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 64  le, then.  ** ad
4760: 64 20 69 74 20 6e 6f 77 2e 20 20 20 54 68 69 73  d it now.   This
4770: 20 63 6f 64 65 20 61 64 64 65 64 20 6f 6e 20 32   code added on 2
4780: 30 30 38 2d 31 32 2d 30 36 2e 20 20 41 66 74 65  008-12-06.  Afte
4790: 72 20 61 6c 6c 20 75 73 65 72 73 20 68 61 76 65  r all users have
47a0: 0a 20 20 2a 2a 20 75 70 67 72 61 64 65 64 2c 20  .  ** upgraded, 
47b0: 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 62 65  this code can be
47c0: 20 73 61 66 65 6c 79 20 64 65 6c 65 74 65 64 2e   safely deleted.
47d0: 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71   .  */.  rc = sq
47e0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 67 2e  lite3_prepare(g.
47f0: 64 62 2c 20 22 53 45 4c 45 43 54 20 6d 74 69 6d  db, "SELECT mtim
4800: 65 20 46 52 4f 4d 20 76 66 69 6c 65 22 2c 20 2d  e FROM vfile", -
4810: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
4820: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
4830: 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  e(pStmt);.  if( 
4840: 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
4850: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
4860: 65 78 65 63 28 67 2e 64 62 2c 20 22 41 4c 54 45  exec(g.db, "ALTE
4870: 52 20 54 41 42 4c 45 20 76 66 69 6c 65 20 41 44  R TABLE vfile AD
4880: 44 20 43 4f 4c 55 4d 4e 20 6d 74 69 6d 65 20 49  D COLUMN mtime I
4890: 4e 54 45 47 45 52 22 2c 20 30 2c 20 30 2c 20 30  NTEGER", 0, 0, 0
48a0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
48b0: 74 68 65 20 22 6f 72 69 67 6e 61 6d 65 22 20 63  the "origname" c
48c0: 6f 6c 75 6d 6e 20 69 73 20 6d 69 73 73 69 6e 67  olumn is missing
48d0: 20 66 72 6f 6d 20 74 68 65 20 76 66 69 6c 65 20   from the vfile 
48e0: 74 61 62 6c 65 2c 20 74 68 65 6e 0a 20 20 2a 2a  table, then.  **
48f0: 20 61 64 64 20 69 74 20 6e 6f 77 2e 20 20 20 54   add it now.   T
4900: 68 69 73 20 63 6f 64 65 20 61 64 64 65 64 20 6f  his code added o
4910: 6e 20 32 30 30 38 2d 31 31 2d 30 39 2e 20 20 41  n 2008-11-09.  A
4920: 66 74 65 72 20 61 6c 6c 20 75 73 65 72 73 20 68  fter all users h
4930: 61 76 65 0a 20 20 2a 2a 20 75 70 67 72 61 64 65  ave.  ** upgrade
4940: 64 2c 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e  d, this code can
4950: 20 62 65 20 73 61 66 65 6c 79 20 64 65 6c 65 74   be safely delet
4960: 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ed. .  */.  rc =
4970: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
4980: 28 67 2e 64 62 2c 20 22 53 45 4c 45 43 54 20 6f  (g.db, "SELECT o
4990: 72 69 67 6e 61 6d 65 20 46 52 4f 4d 20 76 66 69  rigname FROM vfi
49a0: 6c 65 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  le", -1, &pStmt,
49b0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
49c0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
49d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
49e0: 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 73 71  _ERROR ){.    sq
49f0: 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64 62 2c  lite3_exec(g.db,
4a00: 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 76 66   "ALTER TABLE vf
4a10: 69 6c 65 20 41 44 44 20 43 4f 4c 55 4d 4e 20 6f  ile ADD COLUMN o
4a20: 72 69 67 6e 61 6d 65 20 54 45 58 54 22 2c 20 30  rigname TEXT", 0
4a30: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
4a40: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
4a50: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 72 6f  ** Locate the ro
4a60: 6f 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  ot directory of 
4a70: 74 68 65 20 6c 6f 63 61 6c 20 72 65 70 6f 73 69  the local reposi
4a80: 74 6f 72 79 20 74 72 65 65 2e 20 20 54 68 65 20  tory tree.  The 
4a90: 72 6f 6f 74 0a 2a 2a 20 64 69 72 65 63 74 6f 72  root.** director
4aa0: 79 20 69 73 20 66 6f 75 6e 64 20 62 79 20 73 65  y is found by se
4ab0: 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 66 69  arching for a fi
4ac0: 6c 65 20 6e 61 6d 65 64 20 22 5f 46 4f 53 53 49  le named "_FOSSI
4ad0: 4c 5f 22 20 6f 72 20 22 2e 66 6f 73 22 0a 2a 2a  L_" or ".fos".**
4ae0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
4af0: 20 76 61 6c 69 64 20 72 65 70 6f 73 69 74 6f 72   valid repositor
4b00: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
4b10: 2a 20 49 66 20 6e 6f 20 76 61 6c 69 64 20 5f 46  * If no valid _F
4b20: 4f 53 53 49 4c 5f 20 6f 72 20 2e 66 6f 73 20 66  OSSIL_ or .fos f
4b30: 69 6c 65 20 69 73 20 66 6f 75 6e 64 2c 20 77 65  ile is found, we
4b40: 20 6d 6f 76 65 20 75 70 20 6f 6e 65 20 6c 65 76   move up one lev
4b50: 65 6c 20 61 6e 64 20 0a 2a 2a 20 74 72 79 20 61  el and .** try a
4b60: 67 61 69 6e 2e 20 4f 6e 63 65 20 74 68 65 20 66  gain. Once the f
4b70: 69 6c 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ile is found, th
4b80: 65 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 20 76  e g.zLocalRoot v
4b90: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 0a 2a  ariable is set.*
4ba0: 2a 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66  * to the root of
4bb0: 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20   the repository 
4bc0: 74 72 65 65 20 61 6e 64 20 74 68 69 73 20 72 6f  tree and this ro
4bd0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
4be0: 20 20 49 66 0a 2a 2a 20 6e 6f 20 64 61 74 61 62    If.** no datab
4bf0: 61 73 65 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ase is found, th
4c00: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
4c10: 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
4c20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77  This routine alw
4c30: 61 79 73 20 6f 70 65 6e 73 20 74 68 65 20 75 73  ays opens the us
4c40: 65 72 20 64 61 74 61 62 61 73 65 20 72 65 67 61  er database rega
4c50: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
4c60: 72 20 6f 72 0a 2a 2a 20 6e 6f 74 20 74 68 65 20  r or.** not the 
4c70: 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61 62  repository datab
4c80: 61 73 65 20 69 73 20 66 6f 75 6e 64 2e 20 20 49  ase is found.  I
4c90: 66 20 74 68 65 20 5f 46 4f 53 53 49 4c 5f 20 6f  f the _FOSSIL_ o
4ca0: 72 20 2e 66 6f 73 20 66 69 6c 65 0a 2a 2a 20 69  r .fos file.** i
4cb0: 73 20 66 6f 75 6e 64 2c 20 69 74 20 69 73 20 61  s found, it is a
4cc0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f  ttached to the o
4cd0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e  pen database con
4ce0: 6e 65 63 74 69 6f 6e 20 74 6f 6f 2e 0a 2a 2f 0a  nection too..*/.
4cf0: 69 6e 74 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61  int db_open_loca
4d00: 6c 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69  l(void){.  int i
4d10: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 7a 50 77 64  , n;.  char zPwd
4d20: 5b 32 30 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a  [2000];.  char *
4d30: 7a 50 77 64 43 6f 6e 76 3b 0a 20 20 73 74 61 74  zPwdConv;.  stat
4d40: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
4d50: 44 62 4e 61 6d 65 5b 5d 20 3d 20 7b 20 22 2f 5f  DbName[] = { "/_
4d60: 46 4f 53 53 49 4c 5f 22 2c 20 22 2f 2e 66 6f 73  FOSSIL_", "/.fos
4d70: 22 20 7d 3b 0a 20 20 0a 20 20 69 66 28 20 67 2e  " };.  .  if( g.
4d80: 6c 6f 63 61 6c 4f 70 65 6e 29 20 72 65 74 75 72  localOpen) retur
4d90: 6e 20 31 3b 0a 20 20 69 66 28 20 67 65 74 63 77  n 1;.  if( getcw
4da0: 64 28 7a 50 77 64 2c 20 73 69 7a 65 6f 66 28 7a  d(zPwd, sizeof(z
4db0: 50 77 64 29 2d 32 30 29 3d 3d 30 20 29 7b 0a 20  Pwd)-20)==0 ){. 
4dc0: 20 20 20 64 62 5f 65 72 72 28 22 70 77 64 20 74     db_err("pwd t
4dd0: 6f 6f 20 62 69 67 3a 20 6d 61 78 20 25 64 22 2c  oo big: max %d",
4de0: 20 73 69 7a 65 6f 66 28 7a 50 77 64 29 2d 32 30   sizeof(zPwd)-20
4df0: 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 74 72  );.  }.  n = str
4e00: 6c 65 6e 28 7a 50 77 64 29 3b 0a 20 20 7a 50 77  len(zPwd);.  zPw
4e10: 64 43 6f 6e 76 20 3d 20 6d 70 72 69 6e 74 66 28  dConv = mprintf(
4e20: 22 25 2f 22 2c 20 7a 50 77 64 29 3b 0a 20 20 73  "%/", zPwd);.  s
4e30: 74 72 6e 63 70 79 28 7a 50 77 64 2c 20 7a 50 77  trncpy(zPwd, zPw
4e40: 64 43 6f 6e 76 2c 20 32 30 30 30 2d 32 30 29 3b  dConv, 2000-20);
4e50: 0a 20 20 66 72 65 65 28 7a 50 77 64 43 6f 6e 76  .  free(zPwdConv
4e60: 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  );.  while( n>0 
4e70: 29 7b 0a 20 20 20 20 69 66 28 20 61 63 63 65 73  ){.    if( acces
4e80: 73 28 7a 50 77 64 2c 20 57 5f 4f 4b 29 20 29 20  s(zPwd, W_OK) ) 
4e90: 62 72 65 61 6b 3b 0a 20 20 20 20 66 6f 72 28 69  break;.    for(i
4ea0: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 44 62  =0; i<sizeof(aDb
4eb0: 4e 61 6d 65 29 2f 73 69 7a 65 6f 66 28 61 44 62  Name)/sizeof(aDb
4ec0: 4e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  Name[0]); i++){.
4ed0: 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 50        strcpy(&zP
4ee0: 77 64 5b 6e 5d 2c 20 61 44 62 4e 61 6d 65 5b 69  wd[n], aDbName[i
4ef0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  ]);.      if( is
4f00: 56 61 6c 69 64 4c 6f 63 61 6c 44 62 28 7a 50 77  ValidLocalDb(zPw
4f10: 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  d) ){.        /*
4f20: 20 46 6f 75 6e 64 20 61 20 76 61 6c 69 64 20 63   Found a valid c
4f30: 68 65 63 6b 6f 75 74 20 64 61 74 61 62 61 73 65  heckout database
4f40: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20   file */.       
4f50: 20 7a 50 77 64 5b 6e 5d 20 3d 20 30 3b 0a 20 20   zPwd[n] = 0;.  
4f60: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 31        while( n>1
4f70: 20 26 26 20 7a 50 77 64 5b 6e 2d 31 5d 3d 3d 27   && zPwd[n-1]=='
4f80: 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  /' ){.          
4f90: 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  n--;.          z
4fa0: 50 77 64 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  Pwd[n] = 0;.    
4fb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 2e      }.        g.
4fc0: 7a 4c 6f 63 61 6c 52 6f 6f 74 20 3d 20 6d 70 72  zLocalRoot = mpr
4fd0: 69 6e 74 66 28 22 25 73 2f 22 2c 20 7a 50 77 64  intf("%s/", zPwd
4fe0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
4ff0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
5000: 20 7d 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20   }.    n--;.    
5010: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 50  while( n>0 && zP
5020: 77 64 5b 6e 5d 21 3d 27 2f 27 20 29 7b 20 6e 2d  wd[n]!='/' ){ n-
5030: 2d 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20  -; }.    while( 
5040: 6e 3e 30 20 26 26 20 7a 50 77 64 5b 6e 2d 31 5d  n>0 && zPwd[n-1]
5050: 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  =='/' ){ n--; }.
5060: 20 20 20 20 7a 50 77 64 5b 6e 5d 20 3d 20 30 3b      zPwd[n] = 0;
5070: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 20 63 68 65  .  }..  /* A che
5080: 63 6b 6f 75 74 20 64 61 74 61 62 61 73 65 20 66  ckout database f
5090: 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
50a0: 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 72 65 74 75   found */.  retu
50b0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  rn 0;.}../*.** O
50c0: 70 65 6e 20 74 68 65 20 72 65 70 6f 73 69 74 6f  pen the reposito
50d0: 72 79 20 64 61 74 61 62 61 73 65 20 67 69 76 65  ry database give
50e0: 6e 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20 49  n by zDbName.  I
50f0: 66 20 7a 44 62 4e 61 6d 65 3d 3d 4e 55 4c 4c 20  f zDbName==NULL 
5100: 74 68 65 6e 0a 2a 2a 20 67 65 74 20 74 68 65 20  then.** get the 
5110: 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 61 6c  name from the al
5120: 72 65 61 64 79 20 6f 70 65 6e 20 6c 6f 63 61 6c  ready open local
5130: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f   database..*/.vo
5140: 69 64 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73  id db_open_repos
5150: 69 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72  itory(const char
5160: 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 66   *zDbName){.  if
5170: 28 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70  ( g.repositoryOp
5180: 65 6e 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  en ) return;.  i
5190: 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 7b  f( zDbName==0 ){
51a0: 0a 20 20 20 20 69 66 28 20 67 2e 6c 6f 63 61 6c  .    if( g.local
51b0: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 7a 44  Open ){.      zD
51c0: 62 4e 61 6d 65 20 3d 20 64 62 5f 6c 67 65 74 28  bName = db_lget(
51d0: 22 72 65 70 6f 73 69 74 6f 72 79 22 2c 20 30 29  "repository", 0)
51e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
51f0: 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  zDbName==0 ){.  
5200: 20 20 20 20 64 62 5f 65 72 72 28 22 75 6e 61 62      db_err("unab
5210: 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  le to find the n
5220: 61 6d 65 20 6f 66 20 61 20 72 65 70 6f 73 69 74  ame of a reposit
5230: 6f 72 79 20 64 61 74 61 62 61 73 65 22 29 3b 0a  ory database");.
5240: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
5250: 61 63 63 65 73 73 28 7a 44 62 4e 61 6d 65 2c 20  access(zDbName, 
5260: 52 5f 4f 4b 29 20 7c 7c 20 66 69 6c 65 5f 73 69  R_OK) || file_si
5270: 7a 65 28 7a 44 62 4e 61 6d 65 29 3c 31 30 32 34  ze(zDbName)<1024
5280: 20 29 7b 0a 20 20 20 20 69 66 28 20 61 63 63 65   ){.    if( acce
5290: 73 73 28 7a 44 62 4e 61 6d 65 2c 20 30 29 20 29  ss(zDbName, 0) )
52a0: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70  {.      fossil_p
52b0: 61 6e 69 63 28 22 72 65 70 6f 73 69 74 6f 72 79  anic("repository
52c0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 73   does not exists
52d0: 20 6f 72 22 0a 20 20 20 20 20 20 20 20 20 20 20   or".           
52e0: 20 20 20 20 20 20 20 20 22 20 69 73 20 69 6e 20          " is in 
52f0: 61 6e 20 75 6e 72 65 61 64 61 62 6c 65 20 64 69  an unreadable di
5300: 72 65 63 74 6f 72 79 3a 20 25 73 22 2c 20 7a 44  rectory: %s", zD
5310: 62 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  bName);.    }els
5320: 65 20 69 66 28 20 61 63 63 65 73 73 28 7a 44 62  e if( access(zDb
5330: 4e 61 6d 65 2c 20 52 5f 4f 4b 29 20 29 7b 0a 20  Name, R_OK) ){. 
5340: 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69       fossil_pani
5350: 63 28 22 72 65 61 64 20 70 65 72 6d 69 73 73 69  c("read permissi
5360: 6f 6e 20 64 65 6e 69 65 64 20 66 6f 72 20 72 65  on denied for re
5370: 70 6f 73 69 74 6f 72 79 20 25 73 22 2c 20 7a 44  pository %s", zD
5380: 62 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  bName);.    }els
5390: 65 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f  e{.      fossil_
53a0: 70 61 6e 69 63 28 22 6e 6f 74 20 61 20 76 61 6c  panic("not a val
53b0: 69 64 20 72 65 70 6f 73 69 74 6f 72 79 3a 20 25  id repository: %
53c0: 73 22 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  s", zDbName);.  
53d0: 20 20 7d 0a 20 20 7d 0a 20 20 64 62 5f 6f 70 65    }.  }.  db_ope
53e0: 6e 5f 6f 72 5f 61 74 74 61 63 68 28 7a 44 62 4e  n_or_attach(zDbN
53f0: 61 6d 65 2c 20 22 72 65 70 6f 73 69 74 6f 72 79  ame, "repository
5400: 22 29 3b 0a 20 20 67 2e 72 65 70 6f 73 69 74 6f  ");.  g.reposito
5410: 72 79 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 67 2e  ryOpen = 1;.  g.
5420: 7a 52 65 70 6f 73 69 74 6f 72 79 4e 61 6d 65 20  zRepositoryName 
5430: 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  = mprintf("%s", 
5440: 7a 44 62 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  zDbName);.}../*.
5450: 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  ** Try to find t
5460: 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20 61 6e  he repository an
5470: 64 20 6f 70 65 6e 20 69 74 2e 20 20 55 73 65 20  d open it.  Use 
5480: 74 68 65 20 2d 52 20 6f 72 20 2d 2d 72 65 70 6f  the -R or --repo
5490: 73 69 74 6f 72 79 0a 2a 2a 20 6f 70 74 69 6f 6e  sitory.** option
54a0: 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 72   to locate the r
54b0: 65 70 6f 73 69 74 6f 72 79 2e 20 20 49 66 20 6e  epository.  If n
54c0: 6f 20 73 75 63 68 20 6f 70 74 69 6f 6e 20 69 73  o such option is
54d0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 65 6e   available, then
54e0: 0a 2a 2a 20 75 73 65 20 74 68 65 20 72 65 70 6f  .** use the repo
54f0: 73 69 74 6f 72 79 20 6f 66 20 74 68 65 20 6f 70  sitory of the op
5500: 65 6e 20 63 68 65 63 6b 6f 75 74 20 69 66 20 74  en checkout if t
5510: 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a  here is one..**.
5520: 2a 2a 20 45 72 72 6f 72 20 6f 75 74 20 69 66 20  ** Error out if 
5530: 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20 63  the repository c
5540: 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
5550: 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 66 69 6e 64  .*/.void db_find
5560: 5f 61 6e 64 5f 6f 70 65 6e 5f 72 65 70 6f 73 69  _and_open_reposi
5570: 74 6f 72 79 28 69 6e 74 20 65 72 72 49 66 4e 6f  tory(int errIfNo
5580: 74 46 6f 75 6e 64 29 7b 0a 20 20 63 6f 6e 73 74  tFound){.  const
5590: 20 63 68 61 72 20 2a 7a 52 65 70 20 3d 20 66 69   char *zRep = fi
55a0: 6e 64 5f 6f 70 74 69 6f 6e 28 22 72 65 70 6f 73  nd_option("repos
55b0: 69 74 6f 72 79 22 2c 20 22 52 22 2c 20 31 29 3b  itory", "R", 1);
55c0: 0a 20 20 69 66 28 20 7a 52 65 70 3d 3d 30 20 29  .  if( zRep==0 )
55d0: 7b 0a 20 20 20 20 69 66 28 20 64 62 5f 6f 70 65  {.    if( db_ope
55e0: 6e 5f 6c 6f 63 61 6c 28 29 3d 3d 30 20 29 7b 0a  n_local()==0 ){.
55f0: 20 20 20 20 20 20 67 6f 74 6f 20 72 65 70 5f 6e        goto rep_n
5600: 6f 74 5f 66 6f 75 6e 64 3b 0a 20 20 20 20 7d 0a  ot_found;.    }.
5610: 20 20 20 20 7a 52 65 70 20 3d 20 64 62 5f 6c 67      zRep = db_lg
5620: 65 74 28 22 72 65 70 6f 73 69 74 6f 72 79 22 2c  et("repository",
5630: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65   0);.    if( zRe
5640: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  p==0 ){.      go
5650: 74 6f 20 72 65 70 5f 6e 6f 74 5f 66 6f 75 6e 64  to rep_not_found
5660: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  ;.    }.  }.  db
5670: 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79  _open_repository
5680: 28 7a 52 65 70 29 3b 0a 20 20 69 66 28 20 67 2e  (zRep);.  if( g.
5690: 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20 29  repositoryOpen )
56a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
56b0: 7d 0a 72 65 70 5f 6e 6f 74 5f 66 6f 75 6e 64 3a  }.rep_not_found:
56c0: 0a 20 20 69 66 28 20 65 72 72 49 66 4e 6f 74 46  .  if( errIfNotF
56d0: 6f 75 6e 64 20 29 7b 0a 20 20 20 20 66 6f 73 73  ound ){.    foss
56e0: 69 6c 5f 66 61 74 61 6c 28 22 75 73 65 20 2d 2d  il_fatal("use --
56f0: 72 65 70 6f 73 69 74 6f 72 79 20 6f 72 20 2d 52  repository or -R
5700: 20 74 6f 20 73 70 65 63 69 66 69 63 20 74 68 65   to specific the
5710: 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61   repository data
5720: 62 61 73 65 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  base");.  }.}../
5730: 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6c 6f  *.** Open the lo
5740: 63 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20 49  cal database.  I
5750: 66 20 75 6e 61 62 6c 65 2c 20 65 78 69 74 20 77  f unable, exit w
5760: 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ith an error..*/
5770: 0a 76 6f 69 64 20 64 62 5f 6d 75 73 74 5f 62 65  .void db_must_be
5780: 5f 77 69 74 68 69 6e 5f 74 72 65 65 28 76 6f 69  _within_tree(voi
5790: 64 29 7b 0a 20 20 69 66 28 20 64 62 5f 6f 70 65  d){.  if( db_ope
57a0: 6e 5f 6c 6f 63 61 6c 28 29 3d 3d 30 20 29 7b 0a  n_local()==0 ){.
57b0: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c      fossil_fatal
57c0: 28 22 6e 6f 74 20 77 69 74 68 69 6e 20 61 6e 20  ("not within an 
57d0: 6f 70 65 6e 20 63 68 65 63 6b 6f 75 74 22 29 3b  open checkout");
57e0: 0a 20 20 7d 0a 20 20 64 62 5f 6f 70 65 6e 5f 72  .  }.  db_open_r
57f0: 65 70 6f 73 69 74 6f 72 79 28 30 29 3b 0a 7d 0a  epository(0);.}.
5800: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
5810: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
5820: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62  tion..*/.void db
5830: 5f 63 6c 6f 73 65 28 76 6f 69 64 29 7b 0a 20 20  _close(void){.  
5840: 69 66 28 20 67 2e 64 62 3d 3d 30 20 29 20 72 65  if( g.db==0 ) re
5850: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 70  turn;.  while( p
5860: 41 6c 6c 53 74 6d 74 20 29 7b 0a 20 20 20 20 64  AllStmt ){.    d
5870: 62 5f 66 69 6e 61 6c 69 7a 65 28 70 41 6c 6c 53  b_finalize(pAllS
5880: 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 67 2e 72 65  tmt);.  }.  g.re
5890: 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20 3d 20 30  positoryOpen = 0
58a0: 3b 0a 20 20 67 2e 6c 6f 63 61 6c 4f 70 65 6e 20  ;.  g.localOpen 
58b0: 3d 20 30 3b 0a 20 20 67 2e 63 6f 6e 66 69 67 4f  = 0;.  g.configO
58c0: 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  pen = 0;.  sqlit
58d0: 65 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b 0a  e3_close(g.db);.
58e0: 20 20 67 2e 64 62 20 3d 20 30 3b 0a 7d 0a 0a 0a    g.db = 0;.}...
58f0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
5900: 65 77 20 65 6d 70 74 79 20 72 65 70 6f 73 69 74  ew empty reposit
5910: 6f 72 79 20 64 61 74 61 62 61 73 65 20 77 69 74  ory database wit
5920: 68 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65  h the given name
5930: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
5940: 20 73 63 68 65 6d 61 20 69 73 20 69 6e 69 74 69   schema is initi
5950: 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72 65 71  alized.  The req
5960: 75 69 72 65 64 20 56 41 52 20 74 61 62 6c 65 73  uired VAR tables
5970: 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 72 65 20   entries.** are 
5980: 6e 6f 74 20 73 65 74 20 62 79 20 74 68 69 73 20  not set by this 
5990: 72 6f 75 74 69 6e 65 20 61 6e 64 20 6d 75 73 74  routine and must
59a0: 20 62 65 20 73 65 74 20 73 65 70 61 72 61 74 65   be set separate
59b0: 6c 79 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74  ly in order.** t
59c0: 6f 20 6d 61 6b 65 20 74 68 65 20 6e 65 77 20 66  o make the new f
59d0: 69 6c 65 20 61 20 76 61 6c 69 64 20 64 61 74 61  ile a valid data
59e0: 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62  base..*/.void db
59f0: 5f 63 72 65 61 74 65 5f 72 65 70 6f 73 69 74 6f  _create_reposito
5a00: 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ry(const char *z
5a10: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 64 62 5f  Filename){.  db_
5a20: 69 6e 69 74 5f 64 61 74 61 62 61 73 65 28 0a 20  init_database(. 
5a30: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20      zFilename,. 
5a40: 20 20 20 20 7a 52 65 70 6f 73 69 74 6f 72 79 53      zRepositoryS
5a50: 63 68 65 6d 61 31 2c 0a 20 20 20 20 20 7a 52 65  chema1,.     zRe
5a60: 70 6f 73 69 74 6f 72 79 53 63 68 65 6d 61 32 2c  positorySchema2,
5a70: 0a 20 20 20 20 20 28 63 68 61 72 2a 29 30 0a 20  .     (char*)0. 
5a80: 20 29 3b 0a 20 20 69 73 4e 65 77 52 65 70 6f 20   );.  isNewRepo 
5a90: 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  = 1;.}../*.** Cr
5aa0: 65 61 74 65 20 74 68 65 20 64 65 66 61 75 6c 74  eate the default
5ab0: 20 75 73 65 72 20 61 63 63 6f 75 6e 74 73 20 69   user accounts i
5ac0: 6e 20 74 68 65 20 55 53 45 52 20 74 61 62 6c 65  n the USER table
5ad0: 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 63 72 65  ..*/.void db_cre
5ae0: 61 74 65 5f 64 65 66 61 75 6c 74 5f 75 73 65 72  ate_default_user
5af0: 73 28 69 6e 74 20 73 65 74 75 70 55 73 65 72 4f  s(int setupUserO
5b00: 6e 6c 79 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  nly){.  const ch
5b10: 61 72 20 2a 7a 55 73 65 72 3b 0a 20 20 7a 55 73  ar *zUser;.  zUs
5b20: 65 72 20 3d 20 64 62 5f 67 65 74 28 22 64 65 66  er = db_get("def
5b30: 61 75 6c 74 2d 75 73 65 72 22 2c 20 30 29 3b 0a  ault-user", 0);.
5b40: 20 20 69 66 28 20 7a 55 73 65 72 3d 3d 30 20 29    if( zUser==0 )
5b50: 7b 0a 23 69 66 64 65 66 20 5f 5f 4d 49 4e 47 57  {.#ifdef __MINGW
5b60: 33 32 5f 5f 0a 20 20 20 20 7a 55 73 65 72 20 3d  32__.    zUser =
5b70: 20 67 65 74 65 6e 76 28 22 55 53 45 52 4e 41 4d   getenv("USERNAM
5b80: 45 22 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a  E");.#else.    z
5b90: 55 73 65 72 20 3d 20 67 65 74 65 6e 76 28 22 55  User = getenv("U
5ba0: 53 45 52 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  SER");.#endif.  
5bb0: 7d 0a 20 20 69 66 28 20 7a 55 73 65 72 3d 3d 30  }.  if( zUser==0
5bc0: 20 29 7b 0a 20 20 20 20 7a 55 73 65 72 20 3d 20   ){.    zUser = 
5bd0: 22 72 6f 6f 74 22 3b 0a 20 20 7d 0a 20 20 64 62  "root";.  }.  db
5be0: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20  _multi_exec(.   
5bf0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 75    "INSERT INTO u
5c00: 73 65 72 28 6c 6f 67 69 6e 2c 20 70 77 2c 20 63  ser(login, pw, c
5c10: 61 70 2c 20 69 6e 66 6f 29 22 0a 20 20 20 20 20  ap, info)".     
5c20: 22 56 41 4c 55 45 53 28 25 51 2c 6c 6f 77 65 72  "VALUES(%Q,lower
5c30: 28 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  (hex(randomblob(
5c40: 33 29 29 29 2c 27 73 27 2c 27 27 29 22 2c 20 7a  3))),'s','')", z
5c50: 55 73 65 72 0a 20 20 29 3b 0a 20 20 69 66 28 20  User.  );.  if( 
5c60: 21 73 65 74 75 70 55 73 65 72 4f 6e 6c 79 20 29  !setupUserOnly )
5c70: 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65  {.    db_multi_e
5c80: 78 65 63 28 0a 20 20 20 20 20 20 20 22 49 4e 53  xec(.       "INS
5c90: 45 52 54 20 49 4e 54 4f 20 75 73 65 72 28 6c 6f  ERT INTO user(lo
5ca0: 67 69 6e 2c 70 77 2c 63 61 70 2c 69 6e 66 6f 29  gin,pw,cap,info)
5cb0: 22 0a 20 20 20 20 20 20 20 22 20 20 20 56 41 4c  ".       "   VAL
5cc0: 55 45 53 28 27 61 6e 6f 6e 79 6d 6f 75 73 27 2c  UES('anonymous',
5cd0: 27 61 6e 6f 6e 79 6d 6f 75 73 27 2c 27 67 68 6b  'anonymous','ghk
5ce0: 6e 77 27 2c 27 41 6e 6f 6e 27 29 3b 22 0a 20 20  nw','Anon');".  
5cf0: 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
5d00: 4f 20 75 73 65 72 28 6c 6f 67 69 6e 2c 70 77 2c  O user(login,pw,
5d10: 63 61 70 2c 69 6e 66 6f 29 22 0a 20 20 20 20 20  cap,info)".     
5d20: 20 20 22 20 20 20 56 41 4c 55 45 53 28 27 6e 6f    "   VALUES('no
5d30: 62 6f 64 79 27 2c 27 27 2c 27 6a 6f 72 27 2c 27  body','','jor','
5d40: 4e 6f 62 6f 64 79 27 29 3b 22 0a 20 20 20 20 20  Nobody');".     
5d50: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 75    "INSERT INTO u
5d60: 73 65 72 28 6c 6f 67 69 6e 2c 70 77 2c 63 61 70  ser(login,pw,cap
5d70: 2c 69 6e 66 6f 29 22 0a 20 20 20 20 20 20 20 22  ,info)".       "
5d80: 20 20 20 56 41 4c 55 45 53 28 27 64 65 76 65 6c     VALUES('devel
5d90: 6f 70 65 72 27 2c 27 27 2c 27 64 65 69 70 74 27  oper','','deipt'
5da0: 2c 27 44 65 76 27 29 3b 22 0a 20 20 20 20 29 3b  ,'Dev');".    );
5db0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  .  }.}../*.** Fi
5dc0: 6c 6c 20 61 6e 20 65 6d 70 74 79 20 72 65 70 6f  ll an empty repo
5dd0: 73 69 74 6f 72 79 20 64 61 74 61 62 61 73 65 20  sitory database 
5de0: 77 69 74 68 20 74 68 65 20 62 61 73 69 63 20 69  with the basic i
5df0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
5e00: 0a 2a 2a 20 72 65 70 6f 73 69 74 6f 72 79 2e 20  .** repository. 
5e10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5e20: 20 73 68 61 72 65 64 20 62 65 74 77 65 65 6e 20   shared between 
5e30: 27 63 72 65 61 74 65 5f 72 65 70 6f 73 69 74 6f  'create_reposito
5e40: 72 79 5f 63 6d 64 27 0a 2a 2a 20 28 27 6e 65 77  ry_cmd'.** ('new
5e50: 27 29 20 61 6e 64 20 27 72 65 63 6f 6e 73 74 72  ') and 'reconstr
5e60: 75 63 74 5f 63 6d 64 27 20 28 27 72 65 63 6f 6e  uct_cmd' ('recon
5e70: 73 74 72 75 63 74 27 29 2c 20 62 6f 74 68 20 6f  struct'), both o
5e80: 66 20 77 68 69 63 68 20 63 72 65 61 74 65 0a 2a  f which create.*
5e90: 2a 20 6e 65 77 20 72 65 70 6f 73 69 74 6f 72 69  * new repositori
5ea0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  es..**.** The ma
5eb0: 6b 65 49 6e 69 74 69 61 6c 56 65 72 73 69 6f 6e  keInitialVersion
5ec0: 20 66 6c 61 67 20 64 65 74 65 72 6d 69 6e 65 73   flag determines
5ed0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
5ee0: 61 6e 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 6d 61  an initial.** ma
5ef0: 6e 69 66 65 73 74 20 69 73 20 63 72 65 61 74 65  nifest is create
5f00: 64 2e 20 20 54 68 65 20 6d 61 6b 65 53 65 72 76  d.  The makeServ
5f10: 65 72 43 6f 64 65 73 20 66 6c 61 67 20 64 65 74  erCodes flag det
5f20: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
5f30: 6f 72 0a 2a 2a 20 6e 6f 74 20 73 65 72 76 65 72  or.** not server
5f40: 20 61 6e 64 20 70 72 6f 6a 65 63 74 20 63 6f 64   and project cod
5f50: 65 73 20 61 72 65 20 69 6e 76 65 6e 74 65 64 20  es are invented 
5f60: 66 6f 72 20 74 68 69 73 20 72 65 70 6f 73 69 74  for this reposit
5f70: 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f  ory..*/.void db_
5f80: 69 6e 69 74 69 61 6c 5f 73 65 74 75 70 20 28 69  initial_setup (i
5f90: 6e 74 20 6d 61 6b 65 49 6e 69 74 69 61 6c 56 65  nt makeInitialVe
5fa0: 72 73 69 6f 6e 2c 20 69 6e 74 20 6d 61 6b 65 53  rsion, int makeS
5fb0: 65 72 76 65 72 43 6f 64 65 73 29 7b 0a 20 20 63  erverCodes){.  c
5fc0: 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20 42 6c  har *zDate;.  Bl
5fd0: 6f 62 20 68 61 73 68 3b 0a 20 20 42 6c 6f 62 20  ob hash;.  Blob 
5fe0: 6d 61 6e 69 66 65 73 74 3b 0a 0a 20 20 64 62 5f  manifest;..  db_
5ff0: 73 65 74 28 22 63 6f 6e 74 65 6e 74 2d 73 63 68  set("content-sch
6000: 65 6d 61 22 2c 20 43 4f 4e 54 45 4e 54 5f 53 43  ema", CONTENT_SC
6010: 48 45 4d 41 2c 20 30 29 3b 0a 20 20 64 62 5f 73  HEMA, 0);.  db_s
6020: 65 74 28 22 61 75 78 2d 73 63 68 65 6d 61 22 2c  et("aux-schema",
6030: 20 41 55 58 5f 53 43 48 45 4d 41 2c 20 30 29 3b   AUX_SCHEMA, 0);
6040: 0a 20 20 69 66 28 20 6d 61 6b 65 53 65 72 76 65  .  if( makeServe
6050: 72 43 6f 64 65 73 20 29 7b 0a 20 20 20 20 64 62  rCodes ){.    db
6060: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20  _multi_exec(.   
6070: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
6080: 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c 75  config(name,valu
6090: 65 29 22 0a 20 20 20 20 20 20 22 20 56 41 4c 55  e)".      " VALU
60a0: 45 53 28 27 73 65 72 76 65 72 2d 63 6f 64 65 27  ES('server-code'
60b0: 2c 20 6c 6f 77 65 72 28 68 65 78 28 72 61 6e 64  , lower(hex(rand
60c0: 6f 6d 62 6c 6f 62 28 32 30 29 29 29 29 3b 22 0a  omblob(20))));".
60d0: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
60e0: 54 4f 20 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76  TO config(name,v
60f0: 61 6c 75 65 29 22 0a 20 20 20 20 20 20 22 20 56  alue)".      " V
6100: 41 4c 55 45 53 28 27 70 72 6f 6a 65 63 74 2d 63  ALUES('project-c
6110: 6f 64 65 27 2c 20 6c 6f 77 65 72 28 68 65 78 28  ode', lower(hex(
6120: 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 29 29 29  randomblob(20)))
6130: 29 3b 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  );".    );.  }. 
6140: 20 69 66 28 20 21 64 62 5f 69 73 5f 67 6c 6f 62   if( !db_is_glob
6150: 61 6c 28 22 61 75 74 6f 73 79 6e 63 22 29 20 29  al("autosync") )
6160: 20 64 62 5f 73 65 74 5f 69 6e 74 28 22 61 75 74   db_set_int("aut
6170: 6f 73 79 6e 63 22 2c 20 31 2c 20 30 29 3b 0a 20  osync", 1, 0);. 
6180: 20 69 66 28 20 21 64 62 5f 69 73 5f 67 6c 6f 62   if( !db_is_glob
6190: 61 6c 28 22 6c 6f 63 61 6c 61 75 74 68 22 29 20  al("localauth") 
61a0: 29 20 64 62 5f 73 65 74 5f 69 6e 74 28 22 6c 6f  ) db_set_int("lo
61b0: 63 61 6c 61 75 74 68 22 2c 20 30 2c 20 30 29 3b  calauth", 0, 0);
61c0: 0a 20 20 64 62 5f 63 72 65 61 74 65 5f 64 65 66  .  db_create_def
61d0: 61 75 6c 74 5f 75 73 65 72 73 28 30 29 3b 0a 20  ault_users(0);. 
61e0: 20 75 73 65 72 5f 73 65 6c 65 63 74 28 29 3b 0a   user_select();.
61f0: 0a 20 20 69 66 20 28 6d 61 6b 65 49 6e 69 74 69  .  if (makeIniti
6200: 61 6c 56 65 72 73 69 6f 6e 29 7b 0a 20 20 20 20  alVersion){.    
6210: 62 6c 6f 62 5f 7a 65 72 6f 28 26 6d 61 6e 69 66  blob_zero(&manif
6220: 65 73 74 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61  est);.    blob_a
6230: 70 70 65 6e 64 66 28 26 6d 61 6e 69 66 65 73 74  ppendf(&manifest
6240: 2c 20 22 43 20 69 6e 69 74 69 61 6c 5c 5c 73 65  , "C initial\\se
6250: 6d 70 74 79 5c 5c 73 62 61 73 65 6c 69 6e 65 5c  mpty\\sbaseline\
6260: 6e 22 29 3b 0a 20 20 20 20 7a 44 61 74 65 20 3d  n");.    zDate =
6270: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
6280: 45 43 54 20 64 61 74 65 74 69 6d 65 28 27 6e 6f  ECT datetime('no
6290: 77 27 29 22 29 3b 0a 20 20 20 20 7a 44 61 74 65  w')");.    zDate
62a0: 5b 31 30 5d 3d 27 54 27 3b 0a 20 20 20 20 62 6c  [10]='T';.    bl
62b0: 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69  ob_appendf(&mani
62c0: 66 65 73 74 2c 20 22 44 20 25 73 5c 6e 22 2c 20  fest, "D %s\n", 
62d0: 7a 44 61 74 65 29 3b 0a 20 20 20 20 62 6c 6f 62  zDate);.    blob
62e0: 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69 66 65  _appendf(&manife
62f0: 73 74 2c 20 22 50 5c 6e 22 29 3b 0a 20 20 20 20  st, "P\n");.    
6300: 6d 64 35 73 75 6d 5f 69 6e 69 74 28 29 3b 0a 20  md5sum_init();. 
6310: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
6320: 26 6d 61 6e 69 66 65 73 74 2c 20 22 52 20 25 73  &manifest, "R %s
6330: 5c 6e 22 2c 20 6d 64 35 73 75 6d 5f 66 69 6e 69  \n", md5sum_fini
6340: 73 68 28 30 29 29 3b 0a 20 20 20 20 62 6c 6f 62  sh(0));.    blob
6350: 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69 66 65  _appendf(&manife
6360: 73 74 2c 20 22 55 20 25 46 5c 6e 22 2c 20 67 2e  st, "U %F\n", g.
6370: 7a 4c 6f 67 69 6e 29 3b 0a 20 20 20 20 6d 64 35  zLogin);.    md5
6380: 73 75 6d 5f 62 6c 6f 62 28 26 6d 61 6e 69 66 65  sum_blob(&manife
6390: 73 74 2c 20 26 68 61 73 68 29 3b 0a 20 20 20 20  st, &hash);.    
63a0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61  blob_appendf(&ma
63b0: 6e 69 66 65 73 74 2c 20 22 5a 20 25 62 5c 6e 22  nifest, "Z %b\n"
63c0: 2c 20 26 68 61 73 68 29 3b 0a 20 20 20 20 62 6c  , &hash);.    bl
63d0: 6f 62 5f 72 65 73 65 74 28 26 68 61 73 68 29 3b  ob_reset(&hash);
63e0: 0a 20 20 20 20 63 6f 6e 74 65 6e 74 5f 70 75 74  .    content_put
63f0: 28 26 6d 61 6e 69 66 65 73 74 2c 20 30 2c 20 30  (&manifest, 0, 0
6400: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6410: 43 4f 4d 4d 41 4e 44 3a 20 6e 65 77 0a 2a 2a 0a  COMMAND: new.**.
6420: 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69  ** Usage: %fossi
6430: 6c 20 6e 65 77 20 46 49 4c 45 4e 41 4d 45 0a 2a  l new FILENAME.*
6440: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 72 65  *.** Create a re
6450: 70 6f 73 69 74 6f 72 79 20 66 6f 72 20 61 20 6e  pository for a n
6460: 65 77 20 70 72 6f 6a 65 63 74 20 69 6e 20 74 68  ew project in th
6470: 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 49 4c  e file named FIL
6480: 45 4e 41 4d 45 2e 0a 2a 2a 20 54 68 69 73 20 63  ENAME..** This c
6490: 6f 6d 6d 61 6e 64 20 69 73 20 64 69 73 74 69 6e  ommand is distin
64a0: 63 74 20 66 72 6f 6d 20 22 63 6c 6f 6e 65 22 2e  ct from "clone".
64b0: 20 20 54 68 65 20 22 63 6c 6f 6e 65 22 20 63 6f    The "clone" co
64c0: 6d 6d 61 6e 64 20 6d 61 6b 65 73 0a 2a 2a 20 61  mmand makes.** a
64d0: 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 69 73   copy of an exis
64e0: 74 69 6e 67 20 70 72 6f 6a 65 63 74 2e 20 20 54  ting project.  T
64f0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 73 74 61 72  his command star
6500: 74 73 20 61 20 6e 65 77 20 70 72 6f 6a 65 63 74  ts a new project
6510: 2e 0a 2a 2f 0a 76 6f 69 64 20 63 72 65 61 74 65  ..*/.void create
6520: 5f 72 65 70 6f 73 69 74 6f 72 79 5f 63 6d 64 28  _repository_cmd(
6530: 76 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  void){.  char *z
6540: 50 61 73 73 77 6f 72 64 3b 0a 20 20 69 66 28 20  Password;.  if( 
6550: 67 2e 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  g.argc!=3 ){.   
6560: 20 75 73 61 67 65 28 22 52 45 50 4f 53 49 54 4f   usage("REPOSITO
6570: 52 59 2d 4e 41 4d 45 22 29 3b 0a 20 20 7d 0a 20  RY-NAME");.  }. 
6580: 20 64 62 5f 63 72 65 61 74 65 5f 72 65 70 6f 73   db_create_repos
6590: 69 74 6f 72 79 28 67 2e 61 72 67 76 5b 32 5d 29  itory(g.argv[2])
65a0: 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f  ;.  db_open_repo
65b0: 73 69 74 6f 72 79 28 67 2e 61 72 67 76 5b 32 5d  sitory(g.argv[2]
65c0: 29 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e  );.  db_open_con
65d0: 66 69 67 28 29 3b 0a 20 20 64 62 5f 62 65 67 69  fig();.  db_begi
65e0: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b  n_transaction();
65f0: 0a 20 20 64 62 5f 69 6e 69 74 69 61 6c 5f 73 65  .  db_initial_se
6600: 74 75 70 28 31 2c 20 31 29 3b 0a 20 20 64 62 5f  tup(1, 1);.  db_
6610: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
6620: 30 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 70 72  0);.  printf("pr
6630: 6f 6a 65 63 74 2d 69 64 3a 20 25 73 5c 6e 22 2c  oject-id: %s\n",
6640: 20 64 62 5f 67 65 74 28 22 70 72 6f 6a 65 63 74   db_get("project
6650: 2d 63 6f 64 65 22 2c 20 30 29 29 3b 0a 20 20 70  -code", 0));.  p
6660: 72 69 6e 74 66 28 22 73 65 72 76 65 72 2d 69 64  rintf("server-id
6670: 3a 20 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74  :  %s\n", db_get
6680: 28 22 73 65 72 76 65 72 2d 63 6f 64 65 22 2c 20  ("server-code", 
6690: 30 29 29 3b 0a 20 20 7a 50 61 73 73 77 6f 72 64  0));.  zPassword
66a0: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53   = db_text(0, "S
66b0: 45 4c 45 43 54 20 70 77 20 46 52 4f 4d 20 75 73  ELECT pw FROM us
66c0: 65 72 20 57 48 45 52 45 20 6c 6f 67 69 6e 3d 25  er WHERE login=%
66d0: 51 22 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20  Q", g.zLogin);. 
66e0: 20 70 72 69 6e 74 66 28 22 61 64 6d 69 6e 2d 75   printf("admin-u
66f0: 73 65 72 3a 20 25 73 20 28 69 6e 69 74 69 61 6c  ser: %s (initial
6700: 20 70 61 73 73 77 6f 72 64 20 69 73 20 5c 22 25   password is \"%
6710: 73 5c 22 29 5c 6e 22 2c 20 67 2e 7a 4c 6f 67 69  s\")\n", g.zLogi
6720: 6e 2c 20 7a 50 61 73 73 77 6f 72 64 29 3b 0a 20  n, zPassword);. 
6730: 20 70 72 69 6e 74 66 28 22 62 61 73 65 6c 69 6e   printf("baselin
6740: 65 3a 20 20 20 25 73 5c 6e 22 2c 20 64 62 5f 74  e:   %s\n", db_t
6750: 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 75  ext(0, "SELECT u
6760: 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 22 29 29  uid FROM blob"))
6770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66  ;.}../*.** SQL f
6780: 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 64 65 62  unctions for deb
6790: 75 67 67 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ugging..**.** Th
67a0: 65 20 70 72 69 6e 74 28 29 20 66 75 6e 63 74 69  e print() functi
67b0: 6f 6e 20 77 72 69 74 65 73 20 69 74 73 20 61 72  on writes its ar
67c0: 67 75 6d 65 6e 74 73 20 6f 6e 20 73 74 64 6f 75  guments on stdou
67d0: 74 2c 20 62 75 74 20 6f 6e 6c 79 0a 2a 2a 20 69  t, but only.** i
67e0: 66 20 74 68 65 20 2d 73 71 6c 70 72 69 6e 74 20  f the -sqlprint 
67f0: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
6800: 69 6f 6e 20 69 73 20 74 75 72 6e 65 64 20 6f 6e  ion is turned on
6810: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6820: 20 64 62 5f 73 71 6c 5f 70 72 69 6e 74 28 0a 20   db_sql_print(. 
6830: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
6840: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
6850: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
6860: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
6870: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
6880: 67 2e 66 53 71 6c 50 72 69 6e 74 20 29 7b 0a 20  g.fSqlPrint ){. 
6890: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72     for(i=0; i<ar
68a0: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gc; i++){.      
68b0: 63 68 61 72 20 63 20 3d 20 69 3d 3d 61 72 67 63  char c = i==argc
68c0: 2d 31 20 3f 20 27 5c 6e 27 20 3a 20 27 20 27 3b  -1 ? '\n' : ' ';
68d0: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25  .      printf("%
68e0: 73 25 63 22 2c 20 73 71 6c 69 74 65 33 5f 76 61  s%c", sqlite3_va
68f0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d  lue_text(argv[i]
6900: 29 2c 20 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ), c);.    }.  }
6910: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  .}.static void d
6920: 62 5f 73 71 6c 5f 74 72 61 63 65 28 76 6f 69 64  b_sql_trace(void
6930: 20 2a 6e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74   *notUsed, const
6940: 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20   char *zSql){.  
6950: 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 7a  printf("%s\n", z
6960: 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Sql);.}../*.** T
6970: 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74  his is used by t
6980: 68 65 20 5b 63 6f 6d 6d 69 74 5d 20 63 6f 6d 6d  he [commit] comm
6990: 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  and..**.** Retur
69a0: 6e 20 74 72 75 65 20 69 66 20 65 69 74 68 65 72  n true if either
69b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 29 20 47  :.**.**     a) G
69c0: 6c 6f 62 61 6c 2e 61 43 6f 6d 6d 69 74 46 69 6c  lobal.aCommitFil
69d0: 65 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 0a 2a 2a  e is NULL, or.**
69e0: 20 20 20 20 20 62 29 20 47 6c 6f 62 61 6c 2e 61       b) Global.a
69f0: 43 6f 6d 6d 69 74 46 69 6c 65 20 63 6f 6e 74 61  CommitFile conta
6a00: 69 6e 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  ins the integer 
6a10: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
6a20: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  ument..**.** Oth
6a30: 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 66 61  erwise return fa
6a40: 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lse..*/.static v
6a50: 6f 69 64 20 66 69 6c 65 5f 69 73 5f 73 65 6c 65  oid file_is_sele
6a60: 63 74 65 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  cted(.  sqlite3_
6a70: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
6a80: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
6a90: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6aa0: 61 72 67 76 0a 29 7b 0a 20 20 61 73 73 65 72 74  argv.){.  assert
6ab0: 28 61 72 67 63 3d 3d 31 29 3b 0a 20 20 69 66 28  (argc==1);.  if(
6ac0: 20 67 2e 61 43 6f 6d 6d 69 74 46 69 6c 65 20 29   g.aCommitFile )
6ad0: 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20  {.    int iId = 
6ae0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
6af0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
6b00: 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
6b10: 69 69 3d 30 3b 20 67 2e 61 43 6f 6d 6d 69 74 46  ii=0; g.aCommitF
6b20: 69 6c 65 5b 69 69 5d 3b 20 69 69 2b 2b 29 7b 0a  ile[ii]; ii++){.
6b30: 20 20 20 20 20 20 69 66 28 20 69 49 64 3d 3d 67        if( iId==g
6b40: 2e 61 43 6f 6d 6d 69 74 46 69 6c 65 5b 69 69 5d  .aCommitFile[ii]
6b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6b60: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
6b70: 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20 20 20  ontext, 1);.    
6b80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
6b90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
6ba0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
6bb0: 28 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20  (context, 0);.  
6bc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
6bd0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
6be0: 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d  ntext, 1);.  }.}
6bf0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
6c00: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
6c10: 20 69 6e 74 6f 20 61 6e 20 53 48 41 31 2e 20 20   into an SHA1.  
6c20: 4d 61 6b 65 20 61 20 6e 6f 74 61 74 69 6f 6e 20  Make a notation 
6c30: 69 6e 20 74 68 65 0a 2a 2a 20 43 4f 4e 43 45 41  in the.** CONCEA
6c40: 4c 45 44 20 74 61 62 6c 65 20 73 6f 20 74 68 61  LED table so tha
6c50: 74 20 74 68 65 20 68 61 73 68 20 63 61 6e 20 62  t the hash can b
6c60: 65 20 75 6e 64 6f 20 75 73 69 6e 67 20 74 68 65  e undo using the
6c70: 20 64 62 5f 72 65 76 65 61 6c 28 29 0a 2a 2a 20   db_reveal().** 
6c80: 66 75 6e 63 74 69 6f 6e 20 61 74 20 73 6f 6d 65  function at some
6c90: 20 6c 61 74 65 72 20 74 69 6d 65 2e 0a 2a 2a 0a   later time..**.
6ca0: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
6cb0: 75 72 6e 65 64 20 69 73 20 73 74 6f 72 65 64 20  urned is stored 
6cc0: 69 6e 20 73 74 61 74 69 63 20 73 70 61 63 65 20  in static space 
6cd0: 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72  and will be over
6ce0: 77 72 69 74 74 65 6e 0a 2a 2a 20 6f 6e 20 73 75  written.** on su
6cf0: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2e 0a  bsequent calls..
6d00: 2a 2a 0a 2a 2a 20 49 66 20 7a 43 6f 6e 74 65 6e  **.** If zConten
6d10: 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 77  t is already a w
6d20: 65 6c 6c 2d 66 6f 72 6d 65 64 20 53 48 41 31 20  ell-formed SHA1 
6d30: 68 61 73 68 2c 20 74 68 65 6e 20 72 65 74 75 72  hash, then retur
6d40: 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74  n a copy.** of t
6d50: 68 61 74 20 68 61 73 68 2c 20 6e 6f 74 20 61 20  hat hash, not a 
6d60: 68 61 73 68 20 6f 66 20 74 68 65 20 68 61 73 68  hash of the hash
6d70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 43 4f 4e 43  ..**.** The CONC
6d80: 45 41 4c 45 44 20 74 61 62 6c 65 20 69 73 20 6d  EALED table is m
6d90: 65 61 6e 74 20 74 6f 20 6f 62 73 63 75 72 65 20  eant to obscure 
6da0: 65 6d 61 69 6c 20 61 64 64 72 65 73 73 65 73 2e  email addresses.
6db0: 20 20 45 76 65 72 79 20 76 61 6c 69 64 0a 2a 2a    Every valid.**
6dc0: 20 65 6d 61 69 6c 20 61 64 64 72 65 73 73 20 77   email address w
6dd0: 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 20 22 40  ill contain a "@
6de0: 22 20 63 68 61 72 61 63 74 65 72 20 61 6e 64 20  " character and 
6df0: 22 40 22 20 69 73 20 6e 6f 74 20 76 61 6c 69 64  "@" is not valid
6e00: 20 77 69 74 68 69 6e 0a 2a 2a 20 61 6e 20 53 48   within.** an SH
6e10: 41 31 20 68 61 73 68 20 73 6f 20 74 68 65 72 65  A1 hash so there
6e20: 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
6e30: 61 74 20 61 20 76 61 6c 69 64 20 65 6d 61 69 6c  at a valid email
6e40: 20 61 64 64 72 65 73 73 20 77 69 6c 6c 20 67 6f   address will go
6e50: 0a 2a 2a 20 75 6e 63 6f 6e 63 65 61 6c 65 64 2e  .** unconcealed.
6e60: 0a 2a 2f 0a 63 68 61 72 20 2a 64 62 5f 63 6f 6e  .*/.char *db_con
6e70: 63 65 61 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  ceal(const char 
6e80: 2a 7a 43 6f 6e 74 65 6e 74 2c 20 69 6e 74 20 6e  *zContent, int n
6e90: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
6ea0: 20 7a 48 61 73 68 5b 34 32 5d 3b 0a 20 20 42 6c   zHash[42];.  Bl
6eb0: 6f 62 20 6f 75 74 3b 0a 20 20 69 66 28 20 6e 3d  ob out;.  if( n=
6ec0: 3d 34 30 20 26 26 20 76 61 6c 69 64 61 74 65 31  =40 && validate1
6ed0: 36 28 7a 43 6f 6e 74 65 6e 74 2c 20 6e 29 20 29  6(zContent, n) )
6ee0: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 61  {.    memcpy(zHa
6ef0: 73 68 2c 20 7a 43 6f 6e 74 65 6e 74 2c 20 6e 29  sh, zContent, n)
6f00: 3b 0a 20 20 20 20 7a 48 61 73 68 5b 6e 5d 20 3d  ;.    zHash[n] =
6f10: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
6f20: 20 73 68 61 31 73 75 6d 5f 73 74 65 70 5f 74 65   sha1sum_step_te
6f30: 78 74 28 7a 43 6f 6e 74 65 6e 74 2c 20 6e 29 3b  xt(zContent, n);
6f40: 0a 20 20 20 20 73 68 61 31 73 75 6d 5f 66 69 6e  .    sha1sum_fin
6f50: 69 73 68 28 26 6f 75 74 29 3b 0a 20 20 20 20 73  ish(&out);.    s
6f60: 74 72 63 70 79 28 7a 48 61 73 68 2c 20 62 6c 6f  trcpy(zHash, blo
6f70: 62 5f 73 74 72 28 26 6f 75 74 29 29 3b 0a 20 20  b_str(&out));.  
6f80: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 6f 75    blob_reset(&ou
6f90: 74 29 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69  t);.    db_multi
6fa0: 5f 65 78 65 63 28 0a 20 20 20 20 20 20 20 22 49  _exec(.       "I
6fb0: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
6fc0: 49 4e 54 4f 20 63 6f 6e 63 65 61 6c 65 64 20 56  INTO concealed V
6fd0: 41 4c 55 45 53 28 25 51 2c 25 23 51 29 22 2c 0a  ALUES(%Q,%#Q)",.
6fe0: 20 20 20 20 20 20 20 7a 48 61 73 68 2c 20 6e 2c         zHash, n,
6ff0: 20 7a 43 6f 6e 74 65 6e 74 0a 20 20 20 20 29 3b   zContent.    );
7000: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 48  .  }.  return zH
7010: 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ash;.}../*.** At
7020: 74 65 6d 70 74 20 74 6f 20 6c 6f 6f 6b 20 75 70  tempt to look up
7030: 20 74 68 65 20 69 6e 70 75 74 20 69 6e 20 74 68   the input in th
7040: 65 20 43 4f 4e 43 45 41 4c 45 44 20 74 61 62 6c  e CONCEALED tabl
7050: 65 2e 20 20 49 66 20 66 6f 75 6e 64 2c 0a 2a 2a  e.  If found,.**
7060: 20 61 6e 64 20 69 66 20 74 68 65 20 6f 6b 52 64   and if the okRd
7070: 41 64 64 72 20 70 65 72 6d 69 73 73 69 6f 6e 20  Addr permission 
7080: 69 73 20 65 6e 61 62 6c 65 64 20 74 68 65 6e 20  is enabled then 
7090: 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6f 72  return the.** or
70a0: 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 66 6f 72  iginal value for
70b0: 20 77 68 69 63 68 20 74 68 65 20 69 6e 70 75 74   which the input
70c0: 20 69 73 20 61 20 68 61 73 68 2e 20 20 49 66 20   is a hash.  If 
70d0: 6f 6b 52 64 41 64 64 72 20 69 73 0a 2a 2a 20 66  okRdAddr is.** f
70e0: 61 6c 73 65 20 6f 72 20 69 66 20 74 68 65 20 6c  alse or if the l
70f0: 6f 6f 6b 75 70 20 66 61 69 6c 73 2c 20 72 65 74  ookup fails, ret
7100: 75 72 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  urn the original
7110: 20 73 74 72 69 6e 67 20 63 6f 6e 74 65 6e 74 2e   string content.
7120: 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72  .**.** In either
7130: 20 63 61 73 65 2c 20 74 68 65 20 73 74 72 69 6e   case, the strin
7140: 67 20 72 65 74 75 72 6e 65 64 20 69 73 20 73 74  g returned is st
7150: 6f 72 65 64 20 69 6e 20 73 70 61 63 65 20 6f 62  ored in space ob
7160: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d  tained.** from m
7170: 61 6c 6c 6f 63 20 61 6e 64 20 73 68 6f 75 6c 64  alloc and should
7180: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
7190: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
71a0: 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 64 62 5f 72  n..*/.char *db_r
71b0: 65 76 65 61 6c 28 63 6f 6e 73 74 20 63 68 61 72  eveal(const char
71c0: 20 2a 7a 4b 65 79 29 7b 0a 20 20 63 68 61 72 20   *zKey){.  char 
71d0: 2a 7a 4f 75 74 3b 0a 20 20 69 66 28 20 67 2e 6f  *zOut;.  if( g.o
71e0: 6b 52 64 41 64 64 72 20 29 7b 0a 20 20 20 20 7a  kRdAddr ){.    z
71f0: 4f 75 74 20 3d 20 64 62 5f 74 65 78 74 28 30 2c  Out = db_text(0,
7200: 20 22 53 45 4c 45 43 54 20 63 6f 6e 74 65 6e 74   "SELECT content
7210: 20 46 52 4f 4d 20 63 6f 6e 63 65 61 6c 65 64 20   FROM concealed 
7220: 57 48 45 52 45 20 68 61 73 68 3d 25 51 22 2c 20  WHERE hash=%Q", 
7230: 7a 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zKey);.  }else{.
7240: 20 20 20 20 7a 4f 75 74 20 3d 20 30 3b 0a 20 20      zOut = 0;.  
7250: 7d 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20  }.  if( zOut==0 
7260: 29 7b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 6d 70  ){.    zOut = mp
7270: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4b 65 79  rintf("%s", zKey
7280: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7290: 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zOut;.}../*.** T
72a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 67  his function reg
72b0: 69 73 74 65 72 73 20 61 75 78 69 6c 69 61 72 79  isters auxiliary
72c0: 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20   functions when 
72d0: 74 68 65 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61  the SQLite.** da
72e0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
72f0: 6e 20 69 73 20 66 69 72 73 74 20 65 73 74 61 62  n is first estab
7300: 6c 69 73 68 65 64 2e 0a 2a 2f 0a 4c 4f 43 41 4c  lished..*/.LOCAL
7310: 20 76 6f 69 64 20 64 62 5f 63 6f 6e 6e 65 63 74   void db_connect
7320: 69 6f 6e 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a  ion_init(void){.
7330: 20 20 73 74 61 74 69 63 20 69 6e 74 20 6f 6e 63    static int onc
7340: 65 20 3d 20 31 3b 0a 20 20 69 66 28 20 6f 6e 63  e = 1;.  if( onc
7350: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
7360: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7370: 28 67 2e 64 62 2c 20 22 70 72 69 6e 74 22 2c 20  (g.db, "print", 
7380: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
7390: 20 30 2c 64 62 5f 73 71 6c 5f 70 72 69 6e 74 2c   0,db_sql_print,
73a0: 30 2c 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  0,0);.    sqlite
73b0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
73c0: 6e 28 0a 20 20 20 20 20 20 67 2e 64 62 2c 20 22  n(.      g.db, "
73d0: 66 69 6c 65 5f 69 73 5f 73 65 6c 65 63 74 65 64  file_is_selected
73e0: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
73f0: 38 2c 20 30 2c 20 66 69 6c 65 5f 69 73 5f 73 65  8, 0, file_is_se
7400: 6c 65 63 74 65 64 2c 30 2c 30 0a 20 20 20 20 29  lected,0,0.    )
7410: 3b 0a 20 20 20 20 69 66 28 20 67 2e 66 53 71 6c  ;.    if( g.fSql
7420: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73  Trace ){.      s
7430: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 67 2e 64  qlite3_trace(g.d
7440: 62 2c 20 64 62 5f 73 71 6c 5f 74 72 61 63 65 2c  b, db_sql_trace,
7450: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f   0);.    }.    o
7460: 6e 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  nce = 0;.  }.}..
7470: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
7480: 65 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20  e if the string 
7490: 7a 56 61 6c 20 72 65 70 72 65 73 65 6e 74 73 20  zVal represents 
74a0: 22 74 72 75 65 22 20 28 6f 72 20 22 66 61 6c 73  "true" (or "fals
74b0: 65 22 29 2e 0a 2a 2f 0a 69 6e 74 20 69 73 5f 74  e")..*/.int is_t
74c0: 72 75 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  ruth(const char 
74d0: 2a 7a 56 61 6c 29 7b 0a 20 20 73 74 61 74 69 63  *zVal){.  static
74e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4f   const char *azO
74f0: 6e 5b 5d 20 3d 20 7b 20 22 6f 6e 22 2c 20 22 79  n[] = { "on", "y
7500: 65 73 22 2c 20 22 74 72 75 65 22 2c 20 22 31 22  es", "true", "1"
7510: 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   };.  int i;.  f
7520: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
7530: 28 61 7a 4f 6e 29 2f 73 69 7a 65 6f 66 28 61 7a  (azOn)/sizeof(az
7540: 4f 6e 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  On[0]); i++){.  
7550: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 56 61    if( strcmp(zVa
7560: 6c 2c 61 7a 4f 6e 5b 69 5d 29 3d 3d 30 20 29 20  l,azOn[i])==0 ) 
7570: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
7580: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 69 6e 74 20  return 0;.}.int 
7590: 69 73 5f 66 61 6c 73 65 28 63 6f 6e 73 74 20 63  is_false(const c
75a0: 68 61 72 20 2a 7a 56 61 6c 29 7b 0a 20 20 73 74  har *zVal){.  st
75b0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
75c0: 2a 61 7a 4f 66 66 5b 5d 20 3d 20 7b 20 22 6f 66  *azOff[] = { "of
75d0: 66 22 2c 20 22 6e 6f 22 2c 20 22 66 61 6c 73 65  f", "no", "false
75e0: 22 2c 20 22 30 22 20 7d 3b 0a 20 20 69 6e 74 20  ", "0" };.  int 
75f0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
7600: 73 69 7a 65 6f 66 28 61 7a 4f 66 66 29 2f 73 69  sizeof(azOff)/si
7610: 7a 65 6f 66 28 61 7a 4f 66 66 5b 30 5d 29 3b 20  zeof(azOff[0]); 
7620: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
7630: 72 63 6d 70 28 7a 56 61 6c 2c 61 7a 4f 66 66 5b  rcmp(zVal,azOff[
7640: 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  i])==0 ) return 
7650: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
7660: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  0;.}../*.** Get 
7670: 61 6e 64 20 73 65 74 20 76 61 6c 75 65 73 20 66  and set values f
7680: 72 6f 6d 20 74 68 65 20 43 4f 4e 46 49 47 2c 20  rom the CONFIG, 
7690: 47 4c 4f 42 41 4c 5f 43 4f 4e 46 49 47 20 61 6e  GLOBAL_CONFIG an
76a0: 64 20 56 56 41 52 20 74 61 62 6c 65 20 69 6e 20  d VVAR table in 
76b0: 74 68 65 0a 2a 2a 20 72 65 70 6f 73 69 74 6f 72  the.** repositor
76c0: 79 20 61 6e 64 20 6c 6f 63 61 6c 20 64 61 74 61  y and local data
76d0: 62 61 73 65 73 2e 0a 2a 2f 0a 63 68 61 72 20 2a  bases..*/.char *
76e0: 64 62 5f 67 65 74 28 63 6f 6e 73 74 20 63 68 61  db_get(const cha
76f0: 72 20 2a 7a 4e 61 6d 65 2c 20 63 68 61 72 20 2a  r *zName, char *
7700: 7a 44 65 66 61 75 6c 74 29 7b 0a 20 20 63 68 61  zDefault){.  cha
7710: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  r *z = 0;.  if( 
7720: 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e  g.repositoryOpen
7730: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 64 62 5f 74   ){.    z = db_t
7740: 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 76  ext(0, "SELECT v
7750: 61 6c 75 65 20 46 52 4f 4d 20 63 6f 6e 66 69 67  alue FROM config
7760: 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
7770: 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69   zName);.  }.  i
7780: 66 28 20 7a 3d 3d 30 20 26 26 20 67 2e 63 6f 6e  f( z==0 && g.con
7790: 66 69 67 4f 70 65 6e 20 29 7b 0a 20 20 20 20 7a  figOpen ){.    z
77a0: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53   = db_text(0, "S
77b0: 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d  ELECT value FROM
77c0: 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 57   global_config W
77d0: 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a  HERE name=%Q", z
77e0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Name);.  }.  if(
77f0: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 20 3d   z==0 ){.    z =
7800: 20 7a 44 65 66 61 75 6c 74 3b 0a 20 20 7d 0a 20   zDefault;.  }. 
7810: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 76 6f 69   return z;.}.voi
7820: 64 20 64 62 5f 73 65 74 28 63 6f 6e 73 74 20 63  d db_set(const c
7830: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
7840: 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 2c 20  t char *zValue, 
7850: 69 6e 74 20 67 6c 6f 62 61 6c 46 6c 61 67 29 7b  int globalFlag){
7860: 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e  .  db_begin_tran
7870: 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 64 62 5f  saction();.  db_
7880: 6d 75 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c  multi_exec("REPL
7890: 41 43 45 20 49 4e 54 4f 20 25 73 63 6f 6e 66 69  ACE INTO %sconfi
78a0: 67 28 6e 61 6d 65 2c 76 61 6c 75 65 29 20 56 41  g(name,value) VA
78b0: 4c 55 45 53 28 25 51 2c 25 51 29 22 2c 0a 20 20  LUES(%Q,%Q)",.  
78c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
78d0: 6c 6f 62 61 6c 46 6c 61 67 20 3f 20 22 67 6c 6f  lobalFlag ? "glo
78e0: 62 61 6c 5f 22 20 3a 20 22 22 2c 20 7a 4e 61 6d  bal_" : "", zNam
78f0: 65 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20 69 66  e, zValue);.  if
7900: 28 20 67 6c 6f 62 61 6c 46 6c 61 67 20 26 26 20  ( globalFlag && 
7910: 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e  g.repositoryOpen
7920: 20 29 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69   ){.    db_multi
7930: 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20 46 52  _exec("DELETE FR
7940: 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20  OM config WHERE 
7950: 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29  name=%Q", zName)
7960: 3b 0a 20 20 7d 0a 20 20 64 62 5f 65 6e 64 5f 74  ;.  }.  db_end_t
7970: 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 7d  ransaction(0);.}
7980: 0a 76 6f 69 64 20 64 62 5f 75 6e 73 65 74 28 63  .void db_unset(c
7990: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
79a0: 2c 20 69 6e 74 20 67 6c 6f 62 61 6c 46 6c 61 67  , int globalFlag
79b0: 29 7b 0a 20 20 64 62 5f 62 65 67 69 6e 5f 74 72  ){.  db_begin_tr
79c0: 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 64  ansaction();.  d
79d0: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 45  b_multi_exec("DE
79e0: 4c 45 54 45 20 46 52 4f 4d 20 25 73 63 6f 6e 66  LETE FROM %sconf
79f0: 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ig WHERE name=%Q
7a00: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
7a10: 20 20 20 20 67 6c 6f 62 61 6c 46 6c 61 67 20 3f      globalFlag ?
7a20: 20 22 67 6c 6f 62 61 6c 5f 22 20 3a 20 22 22 2c   "global_" : "",
7a30: 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 67   zName);.  if( g
7a40: 6c 6f 62 61 6c 46 6c 61 67 20 26 26 20 67 2e 72  lobalFlag && g.r
7a50: 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20 29 7b  epositoryOpen ){
7a60: 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78  .    db_multi_ex
7a70: 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  ec("DELETE FROM 
7a80: 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d  config WHERE nam
7a90: 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e=%Q", zName);. 
7aa0: 20 7d 0a 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e   }.  db_end_tran
7ab0: 73 61 63 74 69 6f 6e 28 30 29 3b 0a 7d 0a 69 6e  saction(0);.}.in
7ac0: 74 20 64 62 5f 69 73 5f 67 6c 6f 62 61 6c 28 63  t db_is_global(c
7ad0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
7ae0: 29 7b 0a 20 20 69 66 28 20 67 2e 63 6f 6e 66 69  ){.  if( g.confi
7af0: 67 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 65 74  gOpen ){.    ret
7b00: 75 72 6e 20 64 62 5f 65 78 69 73 74 73 28 22 53  urn db_exists("S
7b10: 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 67 6c 6f  ELECT 1 FROM glo
7b20: 62 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45 52 45  bal_config WHERE
7b30: 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65   name=%Q", zName
7b40: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7b50: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
7b60: 69 6e 74 20 64 62 5f 67 65 74 5f 69 6e 74 28 63  int db_get_int(c
7b70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
7b80: 2c 20 69 6e 74 20 64 66 6c 74 29 7b 0a 20 20 69  , int dflt){.  i
7b90: 6e 74 20 76 20 3d 20 64 66 6c 74 3b 0a 20 20 69  nt v = dflt;.  i
7ba0: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 67 2e 72  nt rc;.  if( g.r
7bb0: 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20 29 7b  epositoryOpen ){
7bc0: 0a 20 20 20 20 53 74 6d 74 20 71 3b 0a 20 20 20  .    Stmt q;.   
7bd0: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20   db_prepare(&q, 
7be0: 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52  "SELECT value FR
7bf0: 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20  OM config WHERE 
7c00: 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29  name=%Q", zName)
7c10: 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 5f 73 74  ;.    rc = db_st
7c20: 65 70 28 26 71 29 3b 0a 20 20 20 20 69 66 28 20  ep(&q);.    if( 
7c30: 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
7c40: 7b 0a 20 20 20 20 20 20 76 20 3d 20 64 62 5f 63  {.      v = db_c
7c50: 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 30 29  olumn_int(&q, 0)
7c60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 66  ;.    }.    db_f
7c70: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 7d  inalize(&q);.  }
7c80: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
7c90: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
7ca0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7cb0: 5f 44 4f 4e 45 20 26 26 20 67 2e 63 6f 6e 66 69  _DONE && g.confi
7cc0: 67 4f 70 65 6e 20 29 7b 0a 20 20 20 20 76 20 3d  gOpen ){.    v =
7cd0: 20 64 62 5f 69 6e 74 28 64 66 6c 74 2c 20 22 53   db_int(dflt, "S
7ce0: 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d  ELECT value FROM
7cf0: 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 57   global_config W
7d00: 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a  HERE name=%Q", z
7d10: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Name);.  }.  ret
7d20: 75 72 6e 20 76 3b 0a 7d 0a 76 6f 69 64 20 64 62  urn v;.}.void db
7d30: 5f 73 65 74 5f 69 6e 74 28 63 6f 6e 73 74 20 63  _set_int(const c
7d40: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
7d50: 76 61 6c 75 65 2c 20 69 6e 74 20 67 6c 6f 62 61  value, int globa
7d60: 6c 46 6c 61 67 29 7b 0a 20 20 64 62 5f 62 65 67  lFlag){.  db_beg
7d70: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29  in_transaction()
7d80: 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65  ;.  db_multi_exe
7d90: 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  c("REPLACE INTO 
7da0: 25 73 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61  %sconfig(name,va
7db0: 6c 75 65 29 20 56 41 4c 55 45 53 28 25 51 2c 25  lue) VALUES(%Q,%
7dc0: 64 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d)",.           
7dd0: 20 20 20 20 20 67 6c 6f 62 61 6c 46 6c 61 67 20       globalFlag 
7de0: 3f 20 22 67 6c 6f 62 61 6c 5f 22 20 3a 20 22 22  ? "global_" : ""
7df0: 2c 20 7a 4e 61 6d 65 2c 20 76 61 6c 75 65 29 3b  , zName, value);
7e00: 0a 20 20 69 66 28 20 67 6c 6f 62 61 6c 46 6c 61  .  if( globalFla
7e10: 67 20 26 26 20 67 2e 72 65 70 6f 73 69 74 6f 72  g && g.repositor
7e20: 79 4f 70 65 6e 20 29 7b 0a 20 20 20 20 64 62 5f  yOpen ){.    db_
7e30: 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 45 4c 45  multi_exec("DELE
7e40: 54 45 20 46 52 4f 4d 20 63 6f 6e 66 69 67 20 57  TE FROM config W
7e50: 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a  HERE name=%Q", z
7e60: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 64 62 5f  Name);.  }.  db_
7e70: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
7e80: 30 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 67 65 74  0);.}.int db_get
7e90: 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63  _boolean(const c
7ea0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
7eb0: 64 66 6c 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a  dflt){.  char *z
7ec0: 56 61 6c 20 3d 20 64 62 5f 67 65 74 28 7a 4e 61  Val = db_get(zNa
7ed0: 6d 65 2c 20 64 66 6c 74 20 3f 20 22 6f 6e 22 20  me, dflt ? "on" 
7ee0: 3a 20 22 6f 66 66 22 29 3b 0a 20 20 69 66 28 20  : "off");.  if( 
7ef0: 69 73 5f 74 72 75 74 68 28 7a 56 61 6c 29 20 29  is_truth(zVal) )
7f00: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
7f10: 20 69 73 5f 66 61 6c 73 65 28 7a 56 61 6c 29 20   is_false(zVal) 
7f20: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
7f30: 74 75 72 6e 20 64 66 6c 74 3b 0a 7d 0a 63 68 61  turn dflt;.}.cha
7f40: 72 20 2a 64 62 5f 6c 67 65 74 28 63 6f 6e 73 74  r *db_lget(const
7f50: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 68   char *zName, ch
7f60: 61 72 20 2a 7a 44 65 66 61 75 6c 74 29 7b 0a 20  ar *zDefault){. 
7f70: 20 72 65 74 75 72 6e 20 64 62 5f 74 65 78 74 28   return db_text(
7f80: 28 63 68 61 72 2a 29 7a 44 65 66 61 75 6c 74 2c  (char*)zDefault,
7f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7fa0: 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20    "SELECT value 
7fb0: 46 52 4f 4d 20 76 76 61 72 20 57 48 45 52 45 20  FROM vvar WHERE 
7fc0: 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29  name=%Q", zName)
7fd0: 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 6c 73 65 74  ;.}.void db_lset
7fe0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
7ff0: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
8000: 7a 56 61 6c 75 65 29 7b 0a 20 20 64 62 5f 6d 75  zValue){.  db_mu
8010: 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43  lti_exec("REPLAC
8020: 45 20 49 4e 54 4f 20 76 76 61 72 28 6e 61 6d 65  E INTO vvar(name
8030: 2c 76 61 6c 75 65 29 20 56 41 4c 55 45 53 28 25  ,value) VALUES(%
8040: 51 2c 25 51 29 22 2c 20 7a 4e 61 6d 65 2c 20 7a  Q,%Q)", zName, z
8050: 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e 74 20 64 62  Value);.}.int db
8060: 5f 6c 67 65 74 5f 69 6e 74 28 63 6f 6e 73 74 20  _lget_int(const 
8070: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
8080: 20 64 66 6c 74 29 7b 0a 20 20 72 65 74 75 72 6e   dflt){.  return
8090: 20 64 62 5f 69 6e 74 28 64 66 6c 74 2c 20 22 53   db_int(dflt, "S
80a0: 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d  ELECT value FROM
80b0: 20 76 76 61 72 20 57 48 45 52 45 20 6e 61 6d 65   vvar WHERE name
80c0: 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a  =%Q", zName);.}.
80d0: 76 6f 69 64 20 64 62 5f 6c 73 65 74 5f 69 6e 74  void db_lset_int
80e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
80f0: 6d 65 2c 20 69 6e 74 20 76 61 6c 75 65 29 7b 0a  me, int value){.
8100: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
8110: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 76 76  "REPLACE INTO vv
8120: 61 72 28 6e 61 6d 65 2c 76 61 6c 75 65 29 20 56  ar(name,value) V
8130: 41 4c 55 45 53 28 25 51 2c 25 64 29 22 2c 20 7a  ALUES(%Q,%d)", z
8140: 4e 61 6d 65 2c 20 76 61 6c 75 65 29 3b 0a 7d 0a  Name, value);.}.
8150: 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
8160: 65 20 6e 61 6d 65 20 6f 66 20 61 20 6c 6f 63 61  e name of a loca
8170: 6c 20 72 65 70 6f 73 69 74 6f 72 79 20 69 6e 20  l repository in 
8180: 74 68 65 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69  the global_confi
8190: 67 28 29 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  g() database..**
81a0: 20 54 68 65 20 72 65 70 6f 73 74 69 72 6f 79 20   The repostiroy 
81b0: 66 69 6c 65 6e 61 6d 65 20 25 73 20 69 73 20 72  filename %s is r
81c0: 65 63 6f 72 64 65 64 20 61 73 20 61 6e 20 65 6e  ecorded as an en
81d0: 74 72 79 20 77 69 74 68 20 61 20 22 6e 61 6d 65  try with a "name
81e0: 22 20 66 69 65 6c 64 0a 2a 2a 20 6f 66 20 74 68  " field.** of th
81f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
8200: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 72 65  :.**.**       re
8210: 70 6f 3a 25 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20  po:%s.**.** The 
8220: 76 61 6c 75 65 20 66 69 65 6c 64 20 69 73 20 73  value field is s
8230: 65 74 20 74 6f 20 31 2e 0a 2a 2f 0a 76 6f 69 64  et to 1..*/.void
8240: 20 64 62 5f 72 65 63 6f 72 64 5f 72 65 70 6f 73   db_record_repos
8250: 69 74 6f 72 79 5f 66 69 6c 65 6e 61 6d 65 28 63  itory_filename(c
8260: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
8270: 29 7b 0a 20 20 42 6c 6f 62 20 66 75 6c 6c 3b 0a  ){.  Blob full;.
8280: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
8290: 7b 0a 20 20 20 20 69 66 28 20 21 67 2e 6c 6f 63  {.    if( !g.loc
82a0: 61 6c 4f 70 65 6e 20 29 20 72 65 74 75 72 6e 3b  alOpen ) return;
82b0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 64 62 5f  .    zName = db_
82c0: 6c 67 65 74 28 22 72 65 70 6f 73 69 74 6f 72 79  lget("repository
82d0: 22 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 69 6c  ", 0);.  }.  fil
82e0: 65 5f 63 61 6e 6f 6e 69 63 61 6c 5f 6e 61 6d 65  e_canonical_name
82f0: 28 7a 4e 61 6d 65 2c 20 26 66 75 6c 6c 29 3b 0a  (zName, &full);.
8300: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
8310: 0a 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52  .     "INSERT OR
8320: 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 67 6c 6f   IGNORE INTO glo
8330: 62 61 6c 5f 63 6f 6e 66 69 67 28 6e 61 6d 65 2c  bal_config(name,
8340: 76 61 6c 75 65 29 22 0a 20 20 20 20 20 22 56 41  value)".     "VA
8350: 4c 55 45 53 28 27 72 65 70 6f 3a 25 71 27 2c 31  LUES('repo:%q',1
8360: 29 22 2c 0a 20 20 20 20 20 62 6c 6f 62 5f 73 74  )",.     blob_st
8370: 72 28 26 66 75 6c 6c 29 0a 20 20 29 3b 0a 20 20  r(&full).  );.  
8380: 62 6c 6f 62 5f 72 65 73 65 74 28 26 66 75 6c 6c  blob_reset(&full
8390: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d  );.}../*.** COMM
83a0: 41 4e 44 3a 20 6f 70 65 6e 0a 2a 2a 0a 2a 2a 20  AND: open.**.** 
83b0: 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 6f  Usage: %fossil o
83c0: 70 65 6e 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a  pen FILENAME.**.
83d0: 2a 2a 20 4f 70 65 6e 20 61 20 63 6f 6e 6e 65 63  ** Open a connec
83e0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 6f 63 61  tion to the loca
83f0: 6c 20 72 65 70 6f 73 69 74 6f 72 79 20 69 6e 20  l repository in 
8400: 46 49 4c 45 4e 41 4d 45 2e 20 20 41 20 63 68 65  FILENAME.  A che
8410: 63 6b 6f 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65  ckout.** for the
8420: 20 72 65 70 6f 73 69 74 6f 72 79 20 69 73 20 63   repository is c
8430: 72 65 61 74 65 64 20 77 69 74 68 20 69 74 73 20  reated with its 
8440: 72 6f 6f 74 20 61 74 20 74 68 65 20 77 6f 72 6b  root at the work
8450: 69 6e 67 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a  ing directory..*
8460: 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 22  * See also the "
8470: 63 6c 6f 73 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a  close" command..
8480: 2a 2f 0a 76 6f 69 64 20 63 6d 64 5f 6f 70 65 6e  */.void cmd_open
8490: 28 76 6f 69 64 29 7b 0a 20 20 42 6c 6f 62 20 70  (void){.  Blob p
84a0: 61 74 68 3b 0a 20 20 69 6e 74 20 76 69 64 3b 0a  ath;.  int vid;.
84b0: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 61    static char *a
84c0: 7a 4e 65 77 41 72 67 76 5b 5d 20 3d 20 7b 20 30  zNewArgv[] = { 0
84d0: 2c 20 22 75 70 64 61 74 65 22 2c 20 22 2d 2d 6c  , "update", "--l
84e0: 61 74 65 73 74 22 2c 20 30 20 7d 3b 0a 20 20 75  atest", 0 };.  u
84f0: 72 6c 5f 70 72 6f 78 79 5f 6f 70 74 69 6f 6e 73  rl_proxy_options
8500: 28 29 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63  ();.  if( g.argc
8510: 21 3d 33 20 29 7b 0a 20 20 20 20 75 73 61 67 65  !=3 ){.    usage
8520: 28 22 52 45 50 4f 53 49 54 4f 52 59 2d 46 49 4c  ("REPOSITORY-FIL
8530: 45 4e 41 4d 45 22 29 3b 0a 20 20 7d 0a 20 20 69  ENAME");.  }.  i
8540: 66 28 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c  f( db_open_local
8550: 28 29 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c  () ){.    fossil
8560: 5f 70 61 6e 69 63 28 22 61 6c 72 65 61 64 79 20  _panic("already 
8570: 77 69 74 68 69 6e 20 61 6e 20 6f 70 65 6e 20 74  within an open t
8580: 72 65 65 20 72 6f 6f 74 65 64 20 61 74 20 25 73  ree rooted at %s
8590: 22 2c 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 29  ", g.zLocalRoot)
85a0: 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 5f 63 61 6e  ;.  }.  file_can
85b0: 6f 6e 69 63 61 6c 5f 6e 61 6d 65 28 67 2e 61 72  onical_name(g.ar
85c0: 67 76 5b 32 5d 2c 20 26 70 61 74 68 29 3b 0a 20  gv[2], &path);. 
85d0: 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74   db_open_reposit
85e0: 6f 72 79 28 62 6c 6f 62 5f 73 74 72 28 26 70 61  ory(blob_str(&pa
85f0: 74 68 29 29 3b 0a 20 20 64 62 5f 69 6e 69 74 5f  th));.  db_init_
8600: 64 61 74 61 62 61 73 65 28 22 2e 2f 5f 46 4f 53  database("./_FOS
8610: 53 49 4c 5f 22 2c 20 7a 4c 6f 63 61 6c 53 63 68  SIL_", zLocalSch
8620: 65 6d 61 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ema, (char*)0);.
8630: 20 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28    db_open_local(
8640: 29 3b 0a 20 20 64 62 5f 6c 73 65 74 28 22 72 65  );.  db_lset("re
8650: 70 6f 73 69 74 6f 72 79 22 2c 20 62 6c 6f 62 5f  pository", blob_
8660: 73 74 72 28 26 70 61 74 68 29 29 3b 0a 20 20 64  str(&path));.  d
8670: 62 5f 72 65 63 6f 72 64 5f 72 65 70 6f 73 69 74  b_record_reposit
8680: 6f 72 79 5f 66 69 6c 65 6e 61 6d 65 28 62 6c 6f  ory_filename(blo
8690: 62 5f 73 74 72 28 26 70 61 74 68 29 29 3b 0a 20  b_str(&path));. 
86a0: 20 76 69 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c   vid = db_int(0,
86b0: 20 22 53 45 4c 45 43 54 20 70 69 64 20 46 52 4f   "SELECT pid FRO
86c0: 4d 20 70 6c 69 6e 6b 20 79 22 0a 20 20 20 20 20  M plink y".     
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
86e0: 48 45 52 45 20 4e 4f 54 20 45 58 49 53 54 53 28  HERE NOT EXISTS(
86f0: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 6c  SELECT 1 FROM pl
8700: 69 6e 6b 20 78 20 57 48 45 52 45 20 78 2e 63 69  ink x WHERE x.ci
8710: 64 3d 79 2e 70 69 64 29 22 29 3b 0a 20 20 69 66  d=y.pid)");.  if
8720: 28 20 76 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ( vid==0 ){.    
8730: 64 62 5f 6c 73 65 74 5f 69 6e 74 28 22 63 68 65  db_lset_int("che
8740: 63 6b 6f 75 74 22 2c 20 31 29 3b 0a 20 20 7d 65  ckout", 1);.  }e
8750: 6c 73 65 7b 0a 20 20 20 20 64 62 5f 6c 73 65 74  lse{.    db_lset
8760: 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75 74 22 2c  _int("checkout",
8770: 20 76 69 64 29 3b 0a 20 20 20 20 67 2e 61 72 67   vid);.    g.arg
8780: 76 20 3d 20 61 7a 4e 65 77 41 72 67 76 3b 0a 20  v = azNewArgv;. 
8790: 20 20 20 67 2e 61 72 67 63 20 3d 20 33 3b 0a 20     g.argc = 3;. 
87a0: 20 20 20 75 70 64 61 74 65 5f 63 6d 64 28 29 3b     update_cmd();
87b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  .  }.}../*.** Pr
87c0: 69 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  int the value of
87d0: 20 61 20 73 65 74 74 69 6e 67 20 6e 61 6d 65 64   a setting named
87e0: 20 7a 4e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63   zName.*/.static
87f0: 20 76 6f 69 64 20 70 72 69 6e 74 5f 73 65 74 74   void print_sett
8800: 69 6e 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ing(const char *
8810: 7a 4e 61 6d 65 29 7b 0a 20 20 53 74 6d 74 20 71  zName){.  Stmt q
8820: 3b 0a 20 20 69 66 28 20 67 2e 72 65 70 6f 73 69  ;.  if( g.reposi
8830: 74 6f 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20 20  toryOpen ){.    
8840: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20  db_prepare(&q,. 
8850: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 27 28        "SELECT '(
8860: 6c 6f 63 61 6c 29 27 2c 20 76 61 6c 75 65 20 46  local)', value F
8870: 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45  ROM config WHERE
8880: 20 6e 61 6d 65 3d 25 51 22 0a 20 20 20 20 20 20   name=%Q".      
8890: 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 0a 20   " UNION ALL ". 
88a0: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 27 28        "SELECT '(
88b0: 67 6c 6f 62 61 6c 29 27 2c 20 76 61 6c 75 65 20  global)', value 
88c0: 46 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66  FROM global_conf
88d0: 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ig WHERE name=%Q
88e0: 22 2c 0a 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c  ",.       zName,
88f0: 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20   zName.    );.  
8900: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 5f 70 72  }else{.    db_pr
8910: 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20 20 20  epare(&q,.      
8920: 22 53 45 4c 45 43 54 20 27 28 67 6c 6f 62 61 6c  "SELECT '(global
8930: 29 27 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20 67  )', value FROM g
8940: 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45  lobal_config WHE
8950: 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
8960: 20 20 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a     zName.    );.
8970: 20 20 7d 0a 20 20 69 66 28 20 64 62 5f 73 74 65    }.  if( db_ste
8980: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
8990: 57 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  W ){.    printf(
89a0: 22 25 2d 32 30 73 20 25 2d 38 73 20 25 73 5c 6e  "%-20s %-8s %s\n
89b0: 22 2c 20 7a 4e 61 6d 65 2c 20 64 62 5f 63 6f 6c  ", zName, db_col
89c0: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 2c  umn_text(&q, 0),
89d0: 0a 20 20 20 20 20 20 20 20 64 62 5f 63 6f 6c 75  .        db_colu
89e0: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 29 3b  mn_text(&q, 1));
89f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72  .  }else{.    pr
8a00: 69 6e 74 66 28 22 25 2d 32 30 73 5c 6e 22 2c 20  intf("%-20s\n", 
8a10: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 64 62  zName);.  }.  db
8a20: 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 7d  _finalize(&q);.}
8a30: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44  .../*.** COMMAND
8a40: 3a 20 73 65 74 74 69 6e 67 73 0a 2a 2a 20 43 4f  : settings.** CO
8a50: 4d 4d 41 4e 44 3a 20 75 6e 73 65 74 0a 2a 2a 20  MMAND: unset.** 
8a60: 25 66 6f 73 73 69 6c 20 73 65 74 74 69 6e 67 20  %fossil setting 
8a70: 3f 50 52 4f 50 45 52 54 59 3f 20 3f 56 41 4c 55  ?PROPERTY? ?VALU
8a80: 45 3f 20 3f 2d 67 6c 6f 62 61 6c 3f 0a 2a 2a 20  E? ?-global?.** 
8a90: 25 66 6f 73 73 69 6c 20 75 6e 73 65 74 20 50 52  %fossil unset PR
8aa0: 4f 50 45 52 54 59 20 3f 2d 67 6c 6f 62 61 6c 3f  OPERTY ?-global?
8ab0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 73 65 74 74  .**.** The "sett
8ac0: 69 6e 67 22 20 63 6f 6d 6d 61 6e 64 20 77 69 74  ing" command wit
8ad0: 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6c  h no arguments l
8ae0: 69 73 74 73 20 61 6c 6c 20 70 72 6f 70 65 72 74  ists all propert
8af0: 69 65 73 20 61 6e 64 20 74 68 65 69 72 0a 2a 2a  ies and their.**
8b00: 20 76 61 6c 75 65 73 2e 20 20 57 69 74 68 20 6a   values.  With j
8b10: 75 73 74 20 61 20 70 72 6f 70 65 72 74 79 20 6e  ust a property n
8b20: 61 6d 65 20 69 74 20 73 68 6f 77 73 20 74 68 65  ame it shows the
8b30: 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 70   value of that p
8b40: 72 6f 70 65 72 74 79 2e 0a 2a 2a 20 57 69 74 68  roperty..** With
8b50: 20 61 20 76 61 6c 75 65 20 61 72 67 75 6d 65 6e   a value argumen
8b60: 74 20 69 74 20 63 68 61 6e 67 65 73 20 74 68 65  t it changes the
8b70: 20 70 72 6f 70 65 72 74 79 20 66 6f 72 20 74 68   property for th
8b80: 65 20 63 75 72 72 65 6e 74 20 72 65 70 6f 73 69  e current reposi
8b90: 74 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tory..**.** The 
8ba0: 22 75 6e 73 65 74 22 20 63 6f 6d 6d 61 6e 64 20  "unset" command 
8bb0: 63 6c 65 61 72 73 20 61 20 70 72 6f 70 65 72 74  clears a propert
8bc0: 79 20 73 65 74 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  y setting..**.**
8bd0: 20 20 20 20 61 75 74 6f 73 79 6e 63 20 20 20 20      autosync    
8be0: 20 20 20 20 20 49 66 20 65 6e 61 62 6c 65 64 2c       If enabled,
8bf0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 70   automatically p
8c00: 75 6c 6c 20 70 72 69 6f 72 20 74 6f 0a 2a 2a 20  ull prior to.** 
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c20: 20 20 20 20 63 6f 6d 6d 69 74 20 6f 72 20 75 70      commit or up
8c30: 64 61 74 65 20 61 6e 64 20 61 75 74 6f 6d 61 74  date and automat
8c40: 69 63 61 6c 6c 79 20 70 75 73 68 0a 2a 2a 20 20  ically push.**  
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c60: 20 20 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 20     after commit 
8c70: 6f 72 20 74 61 67 20 6f 72 20 62 72 61 6e 63 68  or tag or branch
8c80: 20 63 72 65 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   creation..**.**
8c90: 20 20 20 20 64 69 66 66 2d 63 6f 6d 6d 61 6e 64      diff-command
8ca0: 20 20 20 20 20 45 78 74 65 72 6e 61 6c 20 63 6f       External co
8cb0: 6d 6d 61 6e 64 20 74 6f 20 72 75 6e 20 77 68 65  mmand to run whe
8cc0: 6e 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 64  n performing a d
8cd0: 69 66 66 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  iff..**         
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 75              If u
8cf0: 6e 64 65 66 69 6e 65 64 2c 20 74 68 65 20 69 6e  ndefined, the in
8d00: 74 65 72 6e 61 6c 20 74 65 78 74 20 64 69 66 66  ternal text diff
8d10: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a   will be used..*
8d20: 2a 0a 2a 2a 20 20 20 20 65 64 69 74 6f 72 20 20  *.**    editor  
8d30: 20 20 20 20 20 20 20 20 20 54 65 78 74 20 65 64           Text ed
8d40: 69 74 6f 72 20 63 6f 6d 6d 61 6e 64 20 75 73 65  itor command use
8d50: 64 20 66 6f 72 20 63 68 65 63 6b 2d 69 6e 20 63  d for check-in c
8d60: 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 20  omments..**.**  
8d70: 20 20 68 74 74 70 2d 70 6f 72 74 20 20 20 20 20    http-port     
8d80: 20 20 20 54 68 65 20 54 43 50 2f 49 50 20 70 6f     The TCP/IP po
8d90: 72 74 20 6e 75 6d 62 65 72 20 74 6f 20 75 73 65  rt number to use
8da0: 20 62 79 20 74 68 65 20 22 73 65 72 76 65 72 22   by the "server"
8db0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
8dc0: 20 20 20 20 20 20 20 20 61 6e 64 20 22 75 69 22          and "ui"
8dd0: 20 63 6f 6d 6d 61 6e 64 73 2e 20 20 44 65 66 61   commands.  Defa
8de0: 75 6c 74 3a 20 38 30 38 30 0a 2a 2a 0a 2a 2a 20  ult: 8080.**.** 
8df0: 20 20 20 67 64 69 66 66 2d 63 6f 6d 6d 61 6e 64     gdiff-command
8e00: 20 20 20 20 45 78 74 65 72 6e 61 6c 20 63 6f 6d      External com
8e10: 6d 61 6e 64 20 74 6f 20 72 75 6e 20 77 68 65 6e  mand to run when
8e20: 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 67 72   performing a gr
8e30: 61 70 68 69 63 61 6c 0a 2a 2a 20 20 20 20 20 20  aphical.**      
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
8e50: 69 66 66 2e 20 49 66 20 75 6e 64 65 66 69 6e 65  iff. If undefine
8e60: 64 2c 20 74 65 78 74 20 64 69 66 66 20 77 69 6c  d, text diff wil
8e70: 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  l be used..**.**
8e80: 20 20 20 20 6c 6f 63 61 6c 61 75 74 68 20 20 20      localauth   
8e90: 20 20 20 20 20 49 66 20 65 6e 61 62 6c 65 64 2c       If enabled,
8ea0: 20 72 65 71 75 69 72 65 20 74 68 61 74 20 48 54   require that HT
8eb0: 54 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66  TP connections f
8ec0: 72 6f 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rom.**          
8ed0: 20 20 20 20 20 20 20 20 20 20 20 31 32 37 2e 30             127.0
8ee0: 2e 30 2e 31 20 62 65 20 61 75 74 68 65 6e 74 69  .0.1 be authenti
8ef0: 63 61 74 65 64 20 62 79 20 70 61 73 73 77 6f 72  cated by passwor
8f00: 64 2e 20 20 49 66 0a 2a 2a 20 20 20 20 20 20 20  d.  If.**       
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61                fa
8f20: 6c 73 65 2c 20 61 6c 6c 20 48 54 54 50 20 72 65  lse, all HTTP re
8f30: 71 75 65 73 74 73 20 66 72 6f 6d 20 6c 6f 63 61  quests from loca
8f40: 6c 68 6f 73 74 20 68 61 76 65 0a 2a 2a 20 20 20  lhost have.**   
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f60: 20 20 75 6e 72 65 73 74 72 69 63 74 65 64 20 61    unrestricted a
8f70: 63 63 65 73 73 20 74 6f 20 74 68 65 20 72 65 70  ccess to the rep
8f80: 6f 73 69 74 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  ository..**.**  
8f90: 20 20 63 6c 65 61 72 73 69 67 6e 20 20 20 20 20    clearsign     
8fa0: 20 20 20 57 68 65 6e 20 65 6e 61 62 6c 65 64 20     When enabled 
8fb0: 28 74 68 65 20 64 65 66 61 75 6c 74 29 2c 20 66  (the default), f
8fc0: 6f 73 73 69 6c 20 77 69 6c 6c 20 61 74 74 65 6d  ossil will attem
8fd0: 70 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  pt to.**        
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67               sig
8ff0: 6e 20 61 6c 6c 20 63 6f 6d 6d 69 74 73 20 77 69  n all commits wi
9000: 74 68 20 67 70 67 2e 20 20 57 68 65 6e 20 64 69  th gpg.  When di
9010: 73 61 62 6c 65 64 2c 20 63 6f 6d 6d 69 74 73 20  sabled, commits 
9020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  will.**         
9030: 20 20 20 20 20 20 20 20 20 20 20 20 62 65 20 75              be u
9040: 6e 73 69 67 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  nsigned..**.**  
9050: 20 20 70 67 70 2d 63 6f 6d 6d 61 6e 64 20 20 20    pgp-command   
9060: 20 20 20 43 6f 6d 6d 61 6e 64 20 75 73 65 64 20     Command used 
9070: 74 6f 20 63 6c 65 61 72 2d 73 69 67 6e 20 6d 61  to clear-sign ma
9080: 6e 69 66 65 73 74 73 20 61 74 20 63 68 65 63 6b  nifests at check
9090: 2d 69 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  -in..**         
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20              The 
90b0: 64 65 66 61 75 6c 74 20 69 73 20 22 67 70 67 20  default is "gpg 
90c0: 2d 2d 63 6c 65 61 72 73 69 67 6e 20 2d 6f 20 22  --clearsign -o "
90d0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6d 74 69 6d 65  ..**.**    mtime
90e0: 2d 63 68 61 6e 67 65 73 20 20 20 20 55 73 65 20  -changes    Use 
90f0: 66 69 6c 65 20 6d 6f 64 69 66 69 63 61 74 69 6f  file modificatio
9100: 6e 20 74 69 6d 65 73 20 28 6d 74 69 6d 65 73 29  n times (mtimes)
9110: 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 0a   to detect when.
9120: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
9130: 20 20 20 20 20 20 20 66 69 6c 65 73 20 68 61 76         files hav
9140: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  e been modified.
9150: 20 20 0a 2a 2a 0a 2a 2a 20 20 20 20 70 72 6f 78    .**.**    prox
9160: 79 20 20 20 20 20 20 20 20 20 20 20 20 55 52 4c  y            URL
9170: 20 6f 66 20 74 68 65 20 48 54 54 50 20 70 72 6f   of the HTTP pro
9180: 78 79 2e 20 20 49 66 20 75 6e 64 65 66 69 6e 65  xy.  If undefine
9190: 64 20 6f 72 20 22 6f 66 66 22 20 74 68 65 6e 0a  d or "off" then.
91a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
91b0: 20 20 20 20 20 20 20 74 68 65 20 22 68 74 74 70         the "http
91c0: 5f 70 72 6f 78 79 22 20 65 6e 76 69 72 6f 6e 6d  _proxy" environm
91d0: 65 6e 74 20 76 61 72 69 61 62 6c 65 20 69 73 20  ent variable is 
91e0: 63 6f 6e 73 75 6c 74 65 64 2e 0a 2a 2a 20 20 20  consulted..**   
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 20 20 49 66 20 74 68 65 20 68 74 74 70 5f 70 72    If the http_pr
9210: 6f 78 79 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  oxy environment 
9220: 76 61 72 69 61 62 6c 65 20 69 73 20 75 6e 64 65  variable is unde
9230: 66 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  fined.**        
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
9250: 6e 20 61 20 64 69 72 65 63 74 20 48 54 54 50 20  n a direct HTTP 
9260: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 75 73  connection is us
9270: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 77 65 62  ed..**.**    web
9280: 2d 62 72 6f 77 73 65 72 20 20 20 20 20 20 41 20  -browser      A 
9290: 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 20 75 73  shell command us
92a0: 65 64 20 74 6f 20 6c 61 75 6e 63 68 20 79 6f 75  ed to launch you
92b0: 72 20 70 72 65 66 65 72 72 65 64 0a 2a 2a 20 20  r preferred.**  
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 20 20 77 65 62 20 62 72 6f 77 73 65 72 20 77     web browser w
92e0: 68 65 6e 20 67 69 76 65 6e 20 61 20 55 52 4c 20  hen given a URL 
92f0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
9300: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
9310: 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 73 20         Defaults 
9320: 74 6f 20 22 73 74 61 72 74 22 20 6f 6e 20 77 69  to "start" on wi
9330: 6e 64 6f 77 73 2c 20 22 6f 70 65 6e 22 20 6f 6e  ndows, "open" on
9340: 20 4d 61 63 2c 0a 2a 2a 20 20 20 20 20 20 20 20   Mac,.**        
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
9360: 20 22 66 69 72 65 66 6f 78 22 20 6f 6e 20 55 6e   "firefox" on Un
9370: 69 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 65 74 74  ix..*/.void sett
9380: 69 6e 67 5f 63 6d 64 28 76 6f 69 64 29 7b 0a 20  ing_cmd(void){. 
9390: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
93a0: 61 72 20 2a 61 7a 4e 61 6d 65 5b 5d 20 3d 20 7b  ar *azName[] = {
93b0: 0a 20 20 20 20 22 61 75 74 6f 73 79 6e 63 22 2c  .    "autosync",
93c0: 0a 20 20 20 20 22 64 69 66 66 2d 63 6f 6d 6d 61  .    "diff-comma
93d0: 6e 64 22 2c 0a 20 20 20 20 22 65 64 69 74 6f 72  nd",.    "editor
93e0: 22 2c 0a 20 20 20 20 22 67 64 69 66 66 2d 63 6f  ",.    "gdiff-co
93f0: 6d 6d 61 6e 64 22 2c 0a 20 20 20 20 22 68 74 74  mmand",.    "htt
9400: 70 2d 70 6f 72 74 22 2c 0a 20 20 20 20 22 6c 6f  p-port",.    "lo
9410: 63 61 6c 61 75 74 68 22 2c 0a 20 20 20 20 22 63  calauth",.    "c
9420: 6c 65 61 72 73 69 67 6e 22 2c 0a 20 20 20 20 22  learsign",.    "
9430: 70 67 70 2d 63 6f 6d 6d 61 6e 64 22 2c 0a 20 20  pgp-command",.  
9440: 20 20 22 6d 74 69 6d 65 2d 63 68 61 6e 67 65 73    "mtime-changes
9450: 22 2c 0a 20 20 20 20 22 70 72 6f 78 79 22 2c 0a  ",.    "proxy",.
9460: 20 20 20 20 22 77 65 62 2d 62 72 6f 77 73 65 72      "web-browser
9470: 22 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  ",.  };.  int i;
9480: 0a 20 20 69 6e 74 20 67 6c 6f 62 61 6c 46 6c 61  .  int globalFla
9490: 67 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28  g = find_option(
94a0: 22 67 6c 6f 62 61 6c 22 2c 22 67 22 2c 30 29 21  "global","g",0)!
94b0: 3d 30 3b 0a 20 20 69 6e 74 20 75 6e 73 65 74 46  =0;.  int unsetF
94c0: 6c 61 67 20 3d 20 67 2e 61 72 67 76 5b 31 5d 5b  lag = g.argv[1][
94d0: 30 5d 3d 3d 27 75 27 3b 0a 20 20 64 62 5f 66 69  0]=='u';.  db_fi
94e0: 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f 72 65 70 6f  nd_and_open_repo
94f0: 73 69 74 6f 72 79 28 30 29 3b 0a 20 20 69 66 28  sitory(0);.  if(
9500: 20 21 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70   !g.repositoryOp
9510: 65 6e 20 29 7b 0a 20 20 20 20 67 6c 6f 62 61 6c  en ){.    global
9520: 46 6c 61 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Flag = 1;.  }.  
9530: 64 62 5f 6f 70 65 6e 5f 63 6f 6e 66 69 67 28 29  db_open_config()
9540: 3b 0a 20 20 69 66 28 20 75 6e 73 65 74 46 6c 61  ;.  if( unsetFla
9550: 67 20 26 26 20 67 2e 61 72 67 63 21 3d 33 20 29  g && g.argc!=3 )
9560: 7b 0a 20 20 20 20 75 73 61 67 65 28 22 50 52 4f  {.    usage("PRO
9570: 50 45 52 54 59 20 3f 2d 67 6c 6f 62 61 6c 3f 22  PERTY ?-global?"
9580: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e 61  );.  }.  if( g.a
9590: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 66 6f  rgc==2 ){.    fo
95a0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
95b0: 61 7a 4e 61 6d 65 29 2f 73 69 7a 65 6f 66 28 61  azName)/sizeof(a
95c0: 7a 4e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 7b  zName[0]); i++){
95d0: 0a 20 20 20 20 20 20 70 72 69 6e 74 5f 73 65 74  .      print_set
95e0: 74 69 6e 67 28 61 7a 4e 61 6d 65 5b 69 5d 29 3b  ting(azName[i]);
95f0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
9600: 66 28 20 67 2e 61 72 67 63 3d 3d 33 20 7c 7c 20  f( g.argc==3 || 
9610: 67 2e 61 72 67 63 3d 3d 34 20 29 7b 0a 20 20 20  g.argc==4 ){.   
9620: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
9630: 6d 65 20 3d 20 67 2e 61 72 67 76 5b 32 5d 3b 0a  me = g.argv[2];.
9640: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
9650: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  en(zName);.    f
9660: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
9670: 28 61 7a 4e 61 6d 65 29 2f 73 69 7a 65 6f 66 28  (azName)/sizeof(
9680: 61 7a 4e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29  azName[0]); i++)
9690: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  {.      if( strn
96a0: 63 6d 70 28 61 7a 4e 61 6d 65 5b 69 5d 2c 20 7a  cmp(azName[i], z
96b0: 4e 61 6d 65 2c 20 6e 29 3d 3d 30 20 29 20 62 72  Name, n)==0 ) br
96c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
96d0: 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 7a 4e  f( i>=sizeof(azN
96e0: 61 6d 65 29 2f 73 69 7a 65 6f 66 28 61 7a 4e 61  ame)/sizeof(azNa
96f0: 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  me[0]) ){.      
9700: 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e 6f  fossil_fatal("no
9710: 20 73 75 63 68 20 73 65 74 74 69 6e 67 3a 20 25   such setting: %
9720: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
9730: 7d 0a 20 20 20 20 69 66 28 20 75 6e 73 65 74 46  }.    if( unsetF
9740: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 64 62 5f  lag ){.      db_
9750: 75 6e 73 65 74 28 61 7a 4e 61 6d 65 5b 69 5d 2c  unset(azName[i],
9760: 20 67 6c 6f 62 61 6c 46 6c 61 67 29 3b 0a 20 20   globalFlag);.  
9770: 20 20 7d 65 6c 73 65 20 69 66 28 20 67 2e 61 72    }else if( g.ar
9780: 67 63 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 64  gc==4 ){.      d
9790: 62 5f 73 65 74 28 61 7a 4e 61 6d 65 5b 69 5d 2c  b_set(azName[i],
97a0: 20 67 2e 61 72 67 76 5b 33 5d 2c 20 67 6c 6f 62   g.argv[3], glob
97b0: 61 6c 46 6c 61 67 29 3b 0a 20 20 20 20 7d 65 6c  alFlag);.    }el
97c0: 73 65 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 5f  se{.      print_
97d0: 73 65 74 74 69 6e 67 28 61 7a 4e 61 6d 65 5b 69  setting(azName[i
97e0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ]);.    }.  }els
97f0: 65 7b 0a 20 20 20 20 75 73 61 67 65 28 22 3f 50  e{.    usage("?P
9800: 52 4f 50 45 52 54 59 3f 20 3f 56 41 4c 55 45 3f  ROPERTY? ?VALUE?
9810: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
9820: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 6f   SQL function to
9830: 20 72 65 6e 64 65 72 20 61 20 55 55 49 44 20 61   render a UUID a
9840: 73 20 61 20 68 79 70 65 72 6c 69 6e 6b 20 74 6f  s a hyperlink to
9850: 20 61 20 70 61 67 65 20 64 65 73 63 72 69 62 69   a page describi
9860: 6e 67 0a 2a 2a 20 74 68 61 74 20 55 55 49 44 2e  ng.** that UUID.
9870: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9880: 68 79 70 65 72 6c 69 6e 6b 55 75 69 64 46 75 6e  hyperlinkUuidFun
9890: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
98a0: 74 65 78 74 20 2a 70 43 78 74 2c 20 20 20 20 20  text *pCxt,     
98b0: 2f 2a 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74  /* function cont
98c0: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  ext */.  int arg
98d0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
98e0: 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66      /* number of
98f0: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
9900: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
9910: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
9920: 61 72 67 76 20 20 20 20 20 20 20 2f 2a 20 76 61  argv       /* va
9930: 6c 75 65 73 20 6f 66 20 61 6c 6c 20 66 75 6e 63  lues of all func
9940: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
9950: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
9960: 72 20 2a 7a 55 75 69 64 3b 20 20 20 20 20 20 20  r *zUuid;       
9970: 20 20 2f 2a 20 54 68 65 20 55 55 49 44 20 74 6f    /* The UUID to
9980: 20 72 65 6e 64 65 72 20 2a 2f 0a 20 20 63 68 61   render */.  cha
9990: 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
99a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6e 64 65          /* Rende
99b0: 72 65 64 20 48 54 4d 4c 20 74 65 78 74 20 2a 2f  red HTML text */
99c0: 0a 0a 20 20 7a 55 75 69 64 20 3d 20 28 63 6f 6e  ..  zUuid = (con
99d0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
99e0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
99f0: 5b 30 5d 29 3b 0a 20 20 69 66 28 20 67 2e 6f 6b  [0]);.  if( g.ok
9a00: 48 69 73 74 6f 72 79 20 26 26 20 7a 55 75 69 64  History && zUuid
9a10: 20 26 26 20 73 74 72 6c 65 6e 28 7a 55 75 69 64   && strlen(zUuid
9a20: 29 3e 3d 31 30 20 29 7b 0a 20 20 20 20 7a 20 3d  )>=10 ){.    z =
9a30: 20 6d 70 72 69 6e 74 66 28 22 3c 74 74 3e 3c 61   mprintf("<tt><a
9a40: 20 68 72 65 66 3d 27 25 73 2f 69 6e 66 6f 2f 25   href='%s/info/%
9a50: 74 27 3e 3c 73 70 61 6e 20 73 74 79 6c 65 3d 27  t'><span style='
9a60: 66 6f 6e 74 2d 73 69 7a 65 3a 31 2e 35 65 6d 27  font-size:1.5em'
9a70: 3e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  >".             
9a80: 20 20 20 22 25 23 68 3c 2f 73 70 61 6e 3e 25 68     "%#h</span>%h
9a90: 3c 2f 61 3e 3c 2f 74 74 3e 22 2c 0a 20 20 20 20  </a></tt>",.    
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 67 2e 7a 42              g.zB
9ab0: 61 73 65 55 52 4c 2c 20 7a 55 75 69 64 2c 20 31  aseURL, zUuid, 1
9ac0: 30 2c 20 7a 55 75 69 64 2c 20 26 7a 55 75 69 64  0, zUuid, &zUuid
9ad0: 5b 31 30 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74  [10]);.    sqlit
9ae0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
9af0: 43 78 74 2c 20 7a 2c 20 2d 31 2c 20 66 72 65 65  Cxt, z, -1, free
9b00: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9b10: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
9b20: 65 78 74 28 70 43 78 74 2c 20 7a 55 75 69 64 2c  ext(pCxt, zUuid,
9b30: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
9b40: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  SIENT);.  }.}../
9b50: 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  *.** SQL functio
9b60: 6e 20 74 6f 20 72 65 6e 64 65 72 20 61 20 54 41  n to render a TA
9b70: 47 49 44 20 61 73 20 61 20 68 79 70 65 72 6c 69  GID as a hyperli
9b80: 6e 6b 20 74 6f 20 61 20 70 61 67 65 20 64 65 73  nk to a page des
9b90: 63 72 69 62 69 6e 67 0a 2a 2a 20 74 68 61 74 20  cribing.** that 
9ba0: 74 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tag..*/.static v
9bb0: 6f 69 64 20 68 79 70 65 72 6c 69 6e 6b 54 61 67  oid hyperlinkTag
9bc0: 69 64 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  idFunc(.  sqlite
9bd0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 78 74 2c  3_context *pCxt,
9be0: 20 20 20 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e       /* function
9bf0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
9c00: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
9c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62           /* numb
9c20: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
9c30: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
9c40: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
9c50: 75 65 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ue **argv       
9c60: 2f 2a 20 76 61 6c 75 65 73 20 6f 66 20 61 6c 6c  /* values of all
9c70: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
9c80: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
9c90: 74 61 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  tagid;          
9ca0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
9cb0: 67 69 64 20 74 6f 20 72 65 6e 64 65 72 20 2a 2f  gid to render */
9cc0: 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9ce0: 20 72 65 6e 64 65 72 65 64 20 68 74 6d 6c 20 74   rendered html t
9cf0: 65 78 74 20 2a 2f 0a 0a 20 20 74 61 67 69 64 20  ext */..  tagid 
9d00: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
9d10: 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  int(argv[0]);.  
9d20: 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20  if( g.okHistory 
9d30: 29 7b 0a 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e  ){.    z = mprin
9d40: 74 66 28 22 3c 61 20 68 72 65 66 3d 27 25 73 2f  tf("<a href='%s/
9d50: 74 61 67 76 69 65 77 3f 74 61 67 69 64 3d 25 64  tagview?tagid=%d
9d60: 27 3e 25 64 3c 2f 61 3e 22 2c 20 0a 20 20 20 20  '>%d</a>", .    
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 2e                g.
9d80: 7a 42 61 73 65 55 52 4c 2c 20 74 61 67 69 64 2c  zBaseURL, tagid,
9d90: 20 74 61 67 69 64 29 3b 0a 20 20 7d 65 6c 73 65   tagid);.  }else
9da0: 7b 0a 20 20 20 20 7a 20 3d 20 6d 70 72 69 6e 74  {.    z = mprint
9db0: 66 28 22 25 64 22 2c 20 74 61 67 69 64 29 3b 0a  f("%d", tagid);.
9dc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65    }.  sqlite3_re
9dd0: 73 75 6c 74 5f 74 65 78 74 28 70 43 78 74 2c 20  sult_text(pCxt, 
9de0: 7a 2c 20 2d 31 2c 20 66 72 65 65 29 3b 0a 7d 0a  z, -1, free);.}.
9df0: 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74  ./*.** SQL funct
9e00: 69 6f 6e 20 74 6f 20 72 65 6e 64 65 72 20 61 20  ion to render a 
9e10: 54 41 47 4e 41 4d 45 20 61 73 20 61 20 68 79 70  TAGNAME as a hyp
9e20: 65 72 6c 69 6e 6b 20 74 6f 20 61 20 70 61 67 65  erlink to a page
9e30: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 74   describing.** t
9e40: 68 61 74 20 74 61 67 2e 0a 2a 2f 0a 73 74 61 74  hat tag..*/.stat
9e50: 69 63 20 76 6f 69 64 20 68 79 70 65 72 6c 69 6e  ic void hyperlin
9e60: 6b 54 61 67 6e 61 6d 65 46 75 6e 63 28 0a 20 20  kTagnameFunc(.  
9e70: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
9e80: 2a 70 43 78 74 2c 20 20 20 20 20 2f 2a 20 66 75  *pCxt,     /* fu
9e90: 6e 63 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a  nction context *
9ea0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9ec0: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * number of argu
9ed0: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e  ments to the fun
9ee0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ction */.  sqlit
9ef0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 20  e3_value **argv 
9f00: 20 20 20 20 20 20 2f 2a 20 76 61 6c 75 65 73 20        /* values 
9f10: 6f 66 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20  of all function 
9f20: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
9f30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
9f40: 61 67 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ag;          /* 
9f50: 54 68 65 20 74 61 67 20 74 6f 20 72 65 6e 64 65  The tag to rende
9f60: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  r */.  char *z; 
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 2f 2a 20 72 65 6e 64 65 72 65 64 20 68 74    /* rendered ht
9f90: 6d 6c 20 74 65 78 74 20 2a 2f 0a 0a 20 20 7a 54  ml text */..  zT
9fa0: 61 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ag = (const char
9fb0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
9fc0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
9fd0: 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72 79   if( g.okHistory
9fe0: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 6d 70 72 69   ){.    z = mpri
9ff0: 6e 74 66 28 22 3c 61 20 68 72 65 66 3d 27 25 73  ntf("<a href='%s
a000: 2f 74 61 67 76 69 65 77 3f 6e 61 6d 65 3d 25 54  /tagview?name=%T
a010: 26 72 61 77 3d 79 27 3e 25 68 3c 2f 61 3e 22 2c  &raw=y'>%h</a>",
a020: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
a030: 20 20 20 20 67 2e 7a 42 61 73 65 55 52 4c 2c 20      g.zBaseURL, 
a040: 7a 54 61 67 2c 20 7a 54 61 67 29 3b 0a 20 20 7d  zTag, zTag);.  }
a050: 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 6d 70  else{.    z = mp
a060: 72 69 6e 74 66 28 22 25 68 22 2c 20 7a 54 61 67  rintf("%h", zTag
a070: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
a080: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 78  _result_text(pCx
a090: 74 2c 20 7a 2c 20 2d 31 2c 20 66 72 65 65 29 3b  t, z, -1, free);
a0a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75  .}../*.** SQL fu
a0b0: 6e 63 74 69 6f 6e 20 74 6f 20 65 73 63 61 70 65  nction to escape
a0c0: 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20   all characters 
a0d0: 69 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  in a string that
a0e0: 20 68 61 76 65 20 73 70 65 63 69 61 6c 0a 2a 2a   have special.**
a0f0: 20 6d 65 61 6e 69 6e 67 20 74 6f 20 48 54 4d 4c   meaning to HTML
a100: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a110: 20 68 74 6d 6c 69 7a 65 46 75 6e 63 28 0a 20 20   htmlizeFunc(.  
a120: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
a130: 2a 70 43 78 74 2c 20 20 20 20 20 2f 2a 20 66 75  *pCxt,     /* fu
a140: 6e 63 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a  nction context *
a150: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a170: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * number of argu
a180: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e  ments to the fun
a190: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ction */.  sqlit
a1a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 20  e3_value **argv 
a1b0: 20 20 20 20 20 20 2f 2a 20 76 61 6c 75 65 73 20        /* values 
a1c0: 6f 66 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20  of all function 
a1d0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
a1e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
a1f0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ext;         /* 
a200: 54 65 78 74 20 74 6f 20 62 65 20 68 74 6d 6c 69  Text to be htmli
a210: 7a 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  zed */.  char *z
a220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a230: 20 20 20 20 2f 2a 20 72 65 6e 64 65 72 65 64 20      /* rendered 
a240: 68 74 6d 6c 20 74 65 78 74 20 2a 2f 0a 0a 20 20  html text */..  
a250: 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63  zText = (const c
a260: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
a270: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
a280: 3b 0a 20 20 7a 20 3d 20 68 74 6d 6c 69 7a 65 28  ;.  z = htmlize(
a290: 7a 54 65 78 74 2c 20 2d 31 29 3b 0a 20 20 73 71  zText, -1);.  sq
a2a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
a2b0: 74 28 70 43 78 74 2c 20 7a 2c 20 2d 31 2c 20 66  t(pCxt, z, -1, f
a2c0: 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ree);.}../*.** T
a2d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
a2e0: 20 68 65 6c 70 65 72 20 74 6f 20 72 75 6e 20 61   helper to run a
a2f0: 6e 20 53 51 4c 20 71 75 65 72 79 20 61 6e 64 20  n SQL query and 
a300: 74 61 62 6c 65 2d 69 7a 65 20 74 68 65 0a 2a 2a  table-ize the.**
a310: 20 72 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20   results..**.** 
a320: 54 68 65 20 7a 53 71 6c 20 70 61 72 61 6d 65 74  The zSql paramet
a330: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  er should be a s
a340: 69 6e 67 6c 65 2c 20 63 6f 6d 70 6c 65 74 65 20  ingle, complete 
a350: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
a360: 2a 20 54 61 62 6c 65 69 7a 65 64 20 6f 75 74 70  * Tableized outp
a370: 75 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  ut of the SQL st
a380: 61 74 65 6d 65 6e 74 20 69 73 20 72 65 6e 64 65  atement is rende
a390: 72 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20  red back to the 
a3a0: 63 6c 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  client..**.** Th
a3b0: 65 20 69 73 53 61 66 65 20 66 6c 61 67 20 69 73  e isSafe flag is
a3c0: 20 74 72 75 65 20 69 66 20 61 6c 6c 20 71 75 65   true if all que
a3d0: 72 79 20 72 65 73 75 6c 74 73 20 68 61 76 65 20  ry results have 
a3e0: 62 65 65 6e 20 70 72 6f 63 65 73 73 65 64 20 0a  been processed .
a3f0: 2a 2a 20 62 79 20 72 6f 75 74 69 6e 65 73 20 73  ** by routines s
a400: 75 63 68 20 61 73 0a 2a 2a 0a 2a 2a 20 20 20 20  uch as.**.**    
a410: 20 20 20 20 6c 69 6e 6b 75 75 69 64 28 29 0a 2a      linkuuid().*
a420: 2a 20 20 20 20 20 20 20 20 6c 69 6e 6b 74 61 67  *        linktag
a430: 69 64 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 6c  id().**        l
a440: 69 6e 6b 74 61 67 6e 61 6d 65 28 29 0a 2a 2a 20  inktagname().** 
a450: 20 20 20 20 20 20 20 68 74 6d 6c 69 7a 65 28 29         htmlize()
a460: 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 61 72 65 20 74  .**.** and are t
a470: 68 65 72 65 66 6f 72 65 20 73 61 66 65 20 66 6f  herefore safe fo
a480: 72 20 64 69 72 65 63 74 20 72 65 6e 64 65 72 69  r direct renderi
a490: 6e 67 2e 20 20 49 66 20 69 73 53 61 66 65 20 69  ng.  If isSafe i
a4a0: 73 20 66 61 6c 73 65 2c 0a 2a 2a 20 74 68 65 6e  s false,.** then
a4b0: 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20   all characters 
a4c0: 69 6e 20 74 68 65 20 71 75 65 72 79 20 72 65 73  in the query res
a4d0: 75 6c 74 20 74 68 61 74 20 68 61 76 65 20 73 70  ult that have sp
a4e0: 65 63 69 61 6c 20 6d 65 61 6e 69 6e 67 0a 2a 2a  ecial meaning.**
a4f0: 20 74 6f 20 48 54 4d 4c 20 61 72 65 20 65 73 63   to HTML are esc
a500: 61 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  aped..**.** Retu
a510: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  rns SQLITE_OK on
a520: 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 79   success and any
a530: 20 6f 74 68 65 72 20 76 61 6c 75 65 20 6f 6e 20   other value on 
a540: 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 64 62  error..*/.int db
a550: 5f 67 65 6e 65 72 69 63 5f 71 75 65 72 79 5f 76  _generic_query_v
a560: 69 65 77 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  iew(const char *
a570: 7a 53 71 6c 2c 20 69 6e 74 20 69 73 53 61 66 65  zSql, int isSafe
a580: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
a590: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
a5a0: 72 63 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20  rc;.  int nCol, 
a5b0: 69 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 0a 20  i;.  int nRow;. 
a5c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 6f   const char *zRo
a5d0: 77 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  w;.  static int 
a5e0: 6f 6e 63 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  once = 1;..  /* 
a5f0: 49 6e 73 74 61 6c 6c 20 74 68 65 20 73 70 65 63  Install the spec
a600: 69 61 6c 20 66 75 6e 63 74 69 6f 6e 73 20 6f 6e  ial functions on
a610: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
a620: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
a630: 2a 2f 0a 20 20 69 66 28 20 6f 6e 63 65 20 29 7b  */.  if( once ){
a640: 0a 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20  .    once = 0;. 
a650: 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
a660: 65 5f 66 75 6e 63 74 69 6f 6e 28 67 2e 64 62 2c  e_function(g.db,
a670: 20 22 6c 69 6e 6b 75 75 69 64 22 2c 20 31 2c 20   "linkuuid", 1, 
a680: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
a690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 79 70               hyp
a6b0: 65 72 6c 69 6e 6b 55 75 69 64 46 75 6e 63 2c 20  erlinkUuidFunc, 
a6c0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
a6d0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
a6e0: 6f 6e 28 67 2e 64 62 2c 20 22 6c 69 6e 6b 74 61  on(g.db, "linkta
a6f0: 67 69 64 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  gid", 1, SQLITE_
a700: 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20 20 20  UTF8, 0, .      
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 54        hyperlinkT
a730: 61 67 69 64 46 75 6e 63 2c 20 30 2c 20 30 29 3b  agidFunc, 0, 0);
a740: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
a750: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 67 2e 64  ate_function(g.d
a760: 62 2c 20 22 6c 69 6e 6b 74 61 67 6e 61 6d 65 22  b, "linktagname"
a770: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
a780: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7a0: 20 20 68 79 70 65 72 6c 69 6e 6b 54 61 67 6e 61    hyperlinkTagna
a7b0: 6d 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  meFunc, 0, 0);. 
a7c0: 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
a7d0: 65 5f 66 75 6e 63 74 69 6f 6e 28 67 2e 64 62 2c  e_function(g.db,
a7e0: 20 22 68 74 6d 6c 69 7a 65 22 2c 20 31 2c 20 53   "htmlize", 1, S
a7f0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a  QLITE_UTF8, 0, .
a800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a810: 20 20 20 20 20 20 20 20 20 20 20 20 68 74 6d 6c              html
a820: 69 7a 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  izeFunc, 0, 0);.
a830: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55    }..  /*.  ** U
a840: 73 65 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  se sqlite3_stmt 
a850: 64 69 72 65 63 74 6c 79 20 72 61 74 68 65 72 20  directly rather 
a860: 74 68 61 6e 20 67 6f 69 6e 67 20 74 68 72 6f 75  than going throu
a870: 67 68 20 64 62 5f 70 72 65 70 61 72 65 28 29 2c  gh db_prepare(),
a880: 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 77 65  .  ** so that we
a890: 20 63 61 6e 20 74 72 65 61 74 20 65 72 72 6f 72   can treat error
a8a0: 73 20 61 20 6e 6f 6e 2d 66 61 74 61 6c 2e 0a 20  s a non-fatal.. 
a8b0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
a8c0: 65 33 5f 70 72 65 70 61 72 65 28 67 2e 64 62 2c  e3_prepare(g.db,
a8d0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
a8e0: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 53 51 4c  t, 0);.  if( SQL
a8f0: 49 54 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a  ITE_OK != rc ){.
a900: 20 20 20 20 40 20 3c 73 70 61 6e 20 73 74 79 6c      @ <span styl
a910: 65 3d 27 63 6f 6c 6f 72 3a 72 65 64 27 3e 64 62  e='color:red'>db
a920: 5f 67 65 6e 65 72 69 63 5f 71 75 65 72 79 5f 76  _generic_query_v
a930: 69 65 77 28 29 20 53 51 4c 20 65 72 72 6f 72 3a  iew() SQL error:
a940: 0a 20 20 20 20 40 20 25 68 28 73 71 6c 69 74 65  .    @ %h(sqlite
a950: 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 29 3c  3_errmsg(g.db))<
a960: 2f 73 70 61 6e 3e 0a 20 20 20 20 72 65 74 75 72  /span>.    retur
a970: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c  n rc;.  }.  nCol
a980: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
a990: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
a9a0: 20 20 40 20 3c 74 61 62 6c 65 20 63 6c 61 73 73    @ <table class
a9b0: 3d 27 66 6f 73 73 69 6c 5f 64 62 5f 67 65 6e 65  ='fossil_db_gene
a9c0: 72 69 63 5f 71 75 65 72 79 5f 76 69 65 77 27 3e  ric_query_view'>
a9d0: 3c 74 62 6f 64 79 3e 0a 20 20 40 20 3c 74 72 20  <tbody>.  @ <tr 
a9e0: 63 6c 61 73 73 3d 27 68 65 61 64 65 72 27 3e 0a  class='header'>.
a9f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
aa00: 6c 3b 20 2b 2b 69 29 7b 0a 20 20 20 20 40 20 3c  l; ++i){.    @ <
aa10: 74 64 3e 25 68 28 73 71 6c 69 74 65 33 5f 63 6f  td>%h(sqlite3_co
aa20: 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  lumn_name(pStmt,
aa30: 69 29 29 3c 2f 74 64 3e 0a 20 20 7d 0a 20 20 40  i))</td>.  }.  @
aa40: 20 3c 2f 74 72 3e 0a 0a 20 20 6e 52 6f 77 20 3d   </tr>..  nRow =
aa50: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c   0;.  while( SQL
aa60: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
aa70: 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
aa80: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
aa90: 61 7a 43 6c 61 73 73 5b 5d 20 3d 20 7b 20 22 65  azClass[] = { "e
aaa0: 76 65 6e 22 2c 20 22 6f 64 64 22 20 7d 3b 0a 20  ven", "odd" };. 
aab0: 20 20 20 40 20 3c 74 72 20 63 6c 61 73 73 3d 27     @ <tr class='
aac0: 25 73 28 61 7a 43 6c 61 73 73 5b 28 6e 52 6f 77  %s(azClass[(nRow
aad0: 2b 2b 29 26 31 5d 29 27 3e 0a 20 20 20 20 20 20  ++)&1])'>.      
aae0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
aaf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a   i++){.        z
ab00: 52 6f 77 20 3d 20 28 63 68 61 72 20 63 6f 6e 73  Row = (char cons
ab10: 74 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  t*)sqlite3_colum
ab20: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 69 29 3b  n_text(pStmt,i);
ab30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 53  .        if( isS
ab40: 61 66 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  afe ){.         
ab50: 20 40 20 3c 74 64 3e 25 73 28 7a 52 6f 77 29 3c   @ <td>%s(zRow)<
ab60: 2f 74 64 3e 0a 20 20 20 20 20 20 20 20 7d 65 6c  /td>.        }el
ab70: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 40 20  se{.          @ 
ab80: 3c 74 64 3e 25 68 28 7a 52 6f 77 29 3c 2f 74 64  <td>%h(zRow)</td
ab90: 3e 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  >.        }.    
aba0: 20 20 7d 0a 20 20 20 20 40 20 3c 2f 74 72 3e 0a    }.    @ </tr>.
abb0: 20 20 7d 0a 20 20 40 20 3c 2f 74 62 6f 64 79 3e    }.  @ </tbody>
abc0: 3c 2f 74 61 62 6c 65 3e 0a 20 20 73 71 6c 69 74  </table>.  sqlit
abd0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
abe0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
abf0: 49 54 45 5f 4f 4b 3b 0a 7d 0a                    ITE_OK;.}.