Hex Artifact Content
Not logged in

Artifact fafbfe094b256d2e7d6380fe938e1c13831c2349:

File src/db.c part of check-in [573a464cb7] - Complete rework of the xfer mechanism. Compiles but not yet working. by drh on 2007-08-10 00:08:25.

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 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 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 2a  ****************
0360: 0a 2a 2a 20 0a 2a 2a 20 43 6f 64 65 20 66 6f 72  .** .** Code for
0370: 20 69 6e 74 65 72 66 61 63 69 6e 67 20 74 6f 20   interfacing to 
0380: 74 68 65 20 76 61 72 69 6f 75 73 20 64 61 74 61  the various data
0390: 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bases..**.** The
03a0: 72 65 20 61 72 65 20 74 68 72 65 65 20 73 65 70  re are three sep
03b0: 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20 66  arate database f
03c0: 69 6c 65 73 20 74 68 61 74 20 66 6f 73 73 69 6c  iles that fossil
03d0: 20 69 6e 74 65 72 61 63 74 73 0a 2a 2a 20 77 69   interacts.** wi
03e0: 74 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  th:.**.**    (1)
03f0: 20 20 54 68 65 20 22 75 73 65 72 22 20 64 61 74    The "user" dat
0400: 61 62 61 73 65 20 69 6e 20 7e 2f 2e 66 6f 73 73  abase in ~/.foss
0410: 69 6c 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  il.**.**    (2) 
0420: 20 54 68 65 20 22 72 65 70 6f 73 69 74 6f 72 79   The "repository
0430: 22 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a  " database.**.**
0440: 20 20 20 20 28 33 29 20 20 41 20 6c 6f 63 61 6c      (3)  A local
0450: 20 63 68 65 63 6b 6f 75 74 20 64 61 74 61 62 61   checkout databa
0460: 73 65 20 6e 61 6d 65 64 20 22 46 4f 53 53 49 4c  se named "FOSSIL
0470: 22 20 61 6e 64 20 6c 6f 63 61 74 65 64 20 61 74  " and located at
0480: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0490: 72 6f 6f 74 20 6f 66 20 74 68 65 20 6c 6f 63 61  root of the loca
04a0: 6c 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 6f  l copy of the so
04b0: 75 72 63 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2f  urce tree..**.*/
04c0: 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69  .#include "confi
04d0: 67 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73  g.h".#include <s
04e0: 71 6c 69 74 65 33 2e 68 3e 0a 23 69 6e 63 6c 75  qlite3.h>.#inclu
04f0: 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e  de <sys/types.h>
0500: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73  .#include <sys/s
0510: 74 61 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  tat.h>.#include 
0520: 3c 70 77 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  <pwd.h>.#include
0530: 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63   <unistd.h>.#inc
0540: 6c 75 64 65 20 22 64 62 2e 68 22 0a 0a 23 69 66  lude "db.h"..#if
0550: 20 49 4e 54 45 52 46 41 43 45 0a 2f 2a 0a 2a 2a   INTERFACE./*.**
0560: 20 41 6e 20 73 69 6e 67 6c 65 20 53 51 4c 20 73   An single SQL s
0570: 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 70 72  tatement is repr
0580: 65 73 65 6e 74 65 64 20 61 73 20 61 6e 20 69 6e  esented as an in
0590: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
05a0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
05b0: 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
05c0: 53 74 6d 74 20 7b 0a 20 20 42 6c 6f 62 20 73 71  Stmt {.  Blob sq
05d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
05e0: 20 2f 2a 20 54 68 65 20 53 51 4c 20 66 6f 72 20   /* The SQL for 
05f0: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
0600: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
0610: 20 2a 70 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54   *pStmt;    /* T
0620: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 73 71  he results of sq
0630: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20  lite3_prepare() 
0640: 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  */.};.#endif /* 
0650: 49 4e 54 45 52 46 41 43 45 20 2a 2f 0a 0a 2f 2a  INTERFACE */../*
0660: 0a 2a 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f  .** Call this ro
0670: 75 74 69 6e 65 20 77 68 65 6e 20 61 20 64 61 74  utine when a dat
0680: 61 62 61 73 65 20 65 72 72 6f 72 20 6f 63 63 75  abase error occu
0690: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
06a0: 69 64 20 64 62 5f 65 72 72 28 63 6f 6e 73 74 20  id db_err(const 
06b0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
06c0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
06d0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  p;.  char *z;.  
06e0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
06f0: 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 76 6d 70  rmat);.  z = vmp
0700: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
0710: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
0720: 3b 0a 20 20 69 66 28 20 67 2e 63 67 69 50 61 6e  ;.  if( g.cgiPan
0730: 69 63 20 29 7b 0a 20 20 20 20 67 2e 63 67 69 50  ic ){.    g.cgiP
0740: 61 6e 69 63 20 3d 20 30 3b 0a 20 20 20 20 63 67  anic = 0;.    cg
0750: 69 5f 70 72 69 6e 74 66 28 22 3c 70 3e 3c 66 6f  i_printf("<p><fo
0760: 6e 74 20 63 6f 6c 6f 72 3d 5c 22 72 65 64 5c 22  nt color=\"red\"
0770: 3e 25 68 3c 2f 66 6f 6e 74 3e 3c 2f 70 3e 22 2c  >%h</font></p>",
0780: 20 7a 29 3b 0a 20 20 20 20 73 74 79 6c 65 5f 66   z);.    style_f
0790: 6f 6f 74 65 72 28 29 3b 0a 20 20 20 20 63 67 69  ooter();.    cgi
07a0: 5f 72 65 70 6c 79 28 29 3b 0a 20 20 7d 65 6c 73  _reply();.  }els
07b0: 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  e{.    fprintf(s
07c0: 74 64 65 72 72 2c 20 22 25 73 3a 20 25 73 5c 6e  tderr, "%s: %s\n
07d0: 22 2c 20 67 2e 61 72 67 76 5b 30 5d 2c 20 7a 29  ", g.argv[0], z)
07e0: 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 6f 72 63 65  ;.  }.  db_force
07f0: 5f 72 6f 6c 6c 62 61 63 6b 28 29 3b 0a 20 20 65  _rollback();.  e
0800: 78 69 74 28 31 29 3b 0a 20 20 65 78 69 74 28 31  xit(1);.  exit(1
0810: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
0820: 20 6e 42 65 67 69 6e 20 3d 20 30 3b 20 20 20 20   nBegin = 0;    
0830: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 64 65 70    /* Nesting dep
0840: 74 68 20 6f 66 20 42 45 47 49 4e 20 2a 2f 0a 73  th of BEGIN */.s
0850: 74 61 74 69 63 20 69 6e 74 20 64 6f 52 6f 6c 6c  tatic int doRoll
0860: 62 61 63 6b 20 3d 20 30 3b 20 20 2f 2a 20 54 72  back = 0;  /* Tr
0870: 75 65 20 74 6f 20 66 6f 72 63 65 20 61 20 72 6f  ue to force a ro
0880: 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  llback */../*.**
0890: 20 42 65 67 69 6e 20 61 6e 64 20 65 6e 64 20 61   Begin and end a
08a0: 20 6e 65 73 74 65 64 20 74 72 61 6e 73 61 63 74   nested transact
08b0: 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 62  ion.*/.void db_b
08c0: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
08d0: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 6e 42  (void){.  if( nB
08e0: 65 67 69 6e 3d 3d 30 20 29 20 64 62 5f 6d 75 6c  egin==0 ) db_mul
08f0: 74 69 5f 65 78 65 63 28 22 42 45 47 49 4e 22 29  ti_exec("BEGIN")
0900: 3b 0a 20 20 6e 42 65 67 69 6e 2b 2b 3b 0a 7d 0a  ;.  nBegin++;.}.
0910: 76 6f 69 64 20 64 62 5f 65 6e 64 5f 74 72 61 6e  void db_end_tran
0920: 73 61 63 74 69 6f 6e 28 69 6e 74 20 72 6f 6c 6c  saction(int roll
0930: 62 61 63 6b 46 6c 61 67 29 7b 0a 20 20 69 66 28  backFlag){.  if(
0940: 20 72 6f 6c 6c 62 61 63 6b 46 6c 61 67 20 29 20   rollbackFlag ) 
0950: 64 6f 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  doRollback = 1;.
0960: 20 20 6e 42 65 67 69 6e 2d 2d 3b 0a 20 20 69 66    nBegin--;.  if
0970: 28 20 6e 42 65 67 69 6e 3d 3d 30 20 29 7b 0a 20  ( nBegin==0 ){. 
0980: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
0990: 28 64 6f 52 6f 6c 6c 62 61 63 6b 20 3f 20 22 52  (doRollback ? "R
09a0: 4f 4c 4c 42 41 43 4b 22 20 3a 20 22 43 4f 4d 4d  OLLBACK" : "COMM
09b0: 49 54 22 29 3b 0a 20 20 20 20 64 6f 52 6f 6c 6c  IT");.    doRoll
09c0: 62 61 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  back = 0;.  }.}.
09d0: 76 6f 69 64 20 64 62 5f 66 6f 72 63 65 5f 72 6f  void db_force_ro
09e0: 6c 6c 62 61 63 6b 28 76 6f 69 64 29 7b 0a 20 20  llback(void){.  
09f0: 69 66 28 20 6e 42 65 67 69 6e 20 29 7b 0a 20 20  if( nBegin ){.  
0a00: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67    sqlite3_exec(g
0a10: 2e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c  .db, "ROLLBACK",
0a20: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
0a30: 20 6e 42 65 67 69 6e 20 3d 20 30 3b 0a 7d 0a 20   nBegin = 0;.}. 
0a40: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 6f  ./*.** Prepare o
0a50: 72 20 72 65 70 72 65 70 61 72 65 20 74 68 65 20  r reprepare the 
0a60: 73 71 6c 69 74 65 33 20 73 74 61 74 65 6d 65 6e  sqlite3 statemen
0a70: 74 20 66 72 6f 6d 20 74 68 65 20 72 61 77 20 53  t from the raw S
0a80: 51 4c 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74  QL text..*/.stat
0a90: 69 63 20 76 6f 69 64 20 72 65 70 72 65 70 61 72  ic void reprepar
0aa0: 65 28 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a  e(Stmt *pStmt){.
0ab0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
0ac0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pNew;.  int rc;.
0ad0: 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69    if( (rc = sqli
0ae0: 74 65 33 5f 70 72 65 70 61 72 65 28 67 2e 64 62  te3_prepare(g.db
0af0: 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 70  , blob_buffer(&p
0b00: 53 74 6d 74 2d 3e 73 71 6c 29 2c 20 2d 31 2c 20  Stmt->sql), -1, 
0b10: 26 70 4e 65 77 2c 20 30 29 29 21 3d 30 20 29 7b  &pNew, 0))!=0 ){
0b20: 0a 20 20 20 20 64 62 5f 65 72 72 28 22 25 73 5c  .    db_err("%s\
0b30: 6e 25 73 22 2c 20 62 6c 6f 62 5f 73 74 72 28 26  n%s", blob_str(&
0b40: 70 53 74 6d 74 2d 3e 73 71 6c 29 2c 20 73 71 6c  pStmt->sql), sql
0b50: 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62  ite3_errmsg(g.db
0b60: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ));.  }.  if( pS
0b70: 74 6d 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  tmt->pStmt ){.  
0b80: 20 20 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66    sqlite3_transf
0b90: 65 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d  er_bindings(pStm
0ba0: 74 2d 3e 70 53 74 6d 74 2c 20 70 4e 65 77 29 3b  t->pStmt, pNew);
0bb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
0bc0: 61 6c 69 7a 65 28 70 53 74 6d 74 2d 3e 70 53 74  alize(pStmt->pSt
0bd0: 6d 74 29 3b 0a 20 20 7d 0a 20 20 70 53 74 6d 74  mt);.  }.  pStmt
0be0: 2d 3e 70 53 74 6d 74 20 3d 20 70 4e 65 77 3b 0a  ->pStmt = pNew;.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
0c00: 20 61 20 53 74 6d 74 2e 20 20 41 73 73 75 6d 65   a Stmt.  Assume
0c10: 20 74 68 61 74 20 74 68 65 20 53 74 6d 74 20 69   that the Stmt i
0c20: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 69  s previously uni
0c30: 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 20 49  nitialized..** I
0c40: 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  f the input stri
0c50: 6e 67 20 63 6f 6e 74 61 69 6e 73 20 6d 75 6c 74  ng contains mult
0c60: 69 70 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  iple SQL stateme
0c70: 6e 74 73 2c 20 6f 6e 6c 79 20 74 68 65 20 66 69  nts, only the fi
0c80: 72 73 74 0a 2a 2a 20 6f 6e 65 20 69 73 20 70 72  rst.** one is pr
0c90: 6f 63 65 73 73 65 64 2e 20 20 41 6c 6c 20 73 74  ocessed.  All st
0ca0: 61 74 65 6d 65 6e 74 73 20 62 65 79 6f 6e 64 20  atements beyond 
0cb0: 74 68 65 20 66 69 72 73 74 20 61 72 65 20 73 69  the first are si
0cc0: 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 64 2e 0a  lently ignored..
0cd0: 2a 2f 0a 69 6e 74 20 64 62 5f 76 70 72 65 70 61  */.int db_vprepa
0ce0: 72 65 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20  re(Stmt *pStmt, 
0cf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
0d00: 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29  mat, va_list ap)
0d10: 7b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 70  {.  blob_zero(&p
0d20: 53 74 6d 74 2d 3e 73 71 6c 29 3b 0a 20 20 62 6c  Stmt->sql);.  bl
0d30: 6f 62 5f 76 61 70 70 65 6e 64 66 28 26 70 53 74  ob_vappendf(&pSt
0d40: 6d 74 2d 3e 73 71 6c 2c 20 7a 46 6f 72 6d 61 74  mt->sql, zFormat
0d50: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
0d60: 61 70 29 3b 0a 20 20 70 53 74 6d 74 2d 3e 70 53  ap);.  pStmt->pS
0d70: 74 6d 74 20 3d 20 30 3b 0a 20 20 72 65 70 72 65  tmt = 0;.  repre
0d80: 70 61 72 65 28 70 53 74 6d 74 29 3b 0a 20 20 72  pare(pStmt);.  r
0d90: 65 74 75 72 6e 20 30 3b 0a 7d 0a 69 6e 74 20 64  eturn 0;.}.int d
0da0: 62 5f 70 72 65 70 61 72 65 28 53 74 6d 74 20 2a  b_prepare(Stmt *
0db0: 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61  pStmt, const cha
0dc0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
0dd0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61  {.  int rc;.  va
0de0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
0df0: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
0e00: 29 3b 0a 20 20 72 63 20 3d 20 64 62 5f 76 70 72  );.  rc = db_vpr
0e10: 65 70 61 72 65 28 70 53 74 6d 74 2c 20 7a 46 6f  epare(pStmt, zFo
0e20: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
0e30: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
0e40: 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 64 62 5f 73  n rc;.}.int db_s
0e50: 74 61 74 69 63 5f 70 72 65 70 61 72 65 28 53 74  tatic_prepare(St
0e60: 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74  mt *pStmt, const
0e70: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
0e80: 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ...){.  int rc =
0e90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
0ea0: 28 20 62 6c 6f 62 5f 73 69 7a 65 28 26 70 53 74  ( blob_size(&pSt
0eb0: 6d 74 2d 3e 73 71 6c 29 3d 3d 30 20 29 7b 0a 20  mt->sql)==0 ){. 
0ec0: 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20     va_list ap;. 
0ed0: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
0ee0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 72 63  zFormat);.    rc
0ef0: 20 3d 20 64 62 5f 76 70 72 65 70 61 72 65 28 70   = db_vprepare(p
0f00: 53 74 6d 74 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  Stmt, zFormat, a
0f10: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
0f20: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
0f30: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
0f40: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
0f50: 66 20 61 20 62 69 6e 64 20 70 61 72 61 6d 65 74  f a bind paramet
0f60: 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  er.*/.static int
0f70: 20 70 61 72 61 6d 49 64 78 28 53 74 6d 74 20 2a   paramIdx(Stmt *
0f80: 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61  pStmt, const cha
0f90: 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 29 7b 0a  r *zParamName){.
0fa0: 20 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65    int i = sqlite
0fb0: 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
0fc0: 5f 69 6e 64 65 78 28 70 53 74 6d 74 2d 3e 70 53  _index(pStmt->pS
0fd0: 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29  tmt, zParamName)
0fe0: 3b 0a 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a  ;.  if( i==0 ){.
0ff0: 20 20 20 20 64 62 5f 65 72 72 28 22 6e 6f 20 73      db_err("no s
1000: 75 63 68 20 62 69 6e 64 20 70 61 72 61 6d 65 74  uch bind paramet
1010: 65 72 3a 20 25 73 5c 6e 25 62 22 2c 20 7a 50 61  er: %s\n%b", zPa
1020: 72 61 6d 4e 61 6d 65 2c 20 26 70 53 74 6d 74 2d  ramName, &pStmt-
1030: 3e 73 71 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74  >sql);.  }.  ret
1040: 75 72 6e 20 69 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 42  urn i;.}./*.** B
1050: 69 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 2c 20  ind an integer, 
1060: 73 74 72 69 6e 67 2c 20 6f 72 20 42 6c 6f 62 20  string, or Blob 
1070: 76 61 6c 75 65 20 74 6f 20 61 20 6e 61 6d 65 64  value to a named
1080: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69   parameter..*/.i
1090: 6e 74 20 64 62 5f 62 69 6e 64 5f 69 6e 74 28 53  nt db_bind_int(S
10a0: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73  tmt *pStmt, cons
10b0: 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61  t char *zParamNa
10c0: 6d 65 2c 20 69 6e 74 20 69 56 61 6c 75 65 29 7b  me, int iValue){
10d0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
10e0: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
10f0: 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d 49 64  ->pStmt, paramId
1100: 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e  x(pStmt, zParamN
1110: 61 6d 65 29 2c 20 69 56 61 6c 75 65 29 3b 0a 7d  ame), iValue);.}
1120: 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 69 6e 74  .int db_bind_int
1130: 36 34 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20  64(Stmt *pStmt, 
1140: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
1150: 61 6d 4e 61 6d 65 2c 20 69 36 34 20 69 56 61 6c  amName, i64 iVal
1160: 75 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ue){.  return sq
1170: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
1180: 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 70  (pStmt->pStmt, p
1190: 61 72 61 6d 49 64 78 28 70 53 74 6d 74 2c 20 7a  aramIdx(pStmt, z
11a0: 50 61 72 61 6d 4e 61 6d 65 29 2c 20 69 56 61 6c  ParamName), iVal
11b0: 75 65 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 62 69  ue);.}.int db_bi
11c0: 6e 64 5f 74 65 78 74 28 53 74 6d 74 20 2a 70 53  nd_text(Stmt *pS
11d0: 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  tmt, const char 
11e0: 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c 20 63 6f 6e  *zParamName, con
11f0: 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 29  st char *zValue)
1200: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1210: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
1220: 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d  mt->pStmt, param
1230: 49 64 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61  Idx(pStmt, zPara
1240: 6d 4e 61 6d 65 29 2c 20 7a 56 61 6c 75 65 2c 0a  mName), zValue,.
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1260: 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53             -1, S
1270: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d  QLITE_STATIC);.}
1280: 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 6e 75 6c  .int db_bind_nul
1290: 6c 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63  l(Stmt *pStmt, c
12a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
12b0: 6d 4e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e  mName){.  return
12c0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
12d0: 6c 6c 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c  ll(pStmt->pStmt,
12e0: 20 70 61 72 61 6d 49 64 78 28 70 53 74 6d 74 2c   paramIdx(pStmt,
12f0: 20 7a 50 61 72 61 6d 4e 61 6d 65 29 29 3b 0a 7d   zParamName));.}
1300: 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 62 6c 6f  .int db_bind_blo
1310: 62 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63  b(Stmt *pStmt, c
1320: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
1330: 6d 4e 61 6d 65 2c 20 42 6c 6f 62 20 2a 70 42 6c  mName, Blob *pBl
1340: 6f 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ob){.  return sq
1350: 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
1360: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61  pStmt->pStmt, pa
1370: 72 61 6d 49 64 78 28 70 53 74 6d 74 2c 20 7a 50  ramIdx(pStmt, zP
1380: 61 72 61 6d 4e 61 6d 65 29 2c 0a 20 20 20 20 20  aramName),.     
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 20 20 20 20 20 62 6c 6f 62 5f 62 75 66 66 65 72       blob_buffer
13b0: 28 70 42 6c 6f 62 29 2c 20 62 6c 6f 62 5f 73 69  (pBlob), blob_si
13c0: 7a 65 28 70 42 6c 6f 62 29 2c 20 53 51 4c 49 54  ze(pBlob), SQLIT
13d0: 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a  E_STATIC);.}../*
13e0: 20 62 69 6e 64 5f 73 74 72 28 29 20 74 72 65 61   bind_str() trea
13f0: 74 73 20 61 20 42 6c 6f 62 20 6f 62 6a 65 63 74  ts a Blob object
1400: 20 6c 69 6b 65 20 61 20 54 45 58 54 20 73 74 72   like a TEXT str
1410: 69 6e 67 20 61 6e 64 20 62 69 6e 64 73 20 69 74  ing and binds it
1420: 0a 2a 2a 20 74 6f 20 74 68 65 20 53 51 4c 20 76  .** to the SQL v
1430: 61 72 69 61 62 6c 65 2e 20 20 43 6f 6e 73 74 72  ariable.  Constr
1440: 61 73 74 20 74 68 69 73 20 74 6f 20 62 69 6e 64  ast this to bind
1450: 5f 62 6c 6f 62 28 29 20 77 68 69 63 68 20 74 72  _blob() which tr
1460: 65 61 74 73 0a 2a 2a 20 74 68 65 20 42 6c 6f 62  eats.** the Blob
1470: 20 6f 62 6a 65 63 74 20 6c 69 6b 65 20 61 6e 20   object like an 
1480: 53 51 4c 20 42 4c 4f 42 2e 0a 2a 2f 0a 69 6e 74  SQL BLOB..*/.int
1490: 20 64 62 5f 62 69 6e 64 5f 73 74 72 28 53 74 6d   db_bind_str(Stm
14a0: 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20  t *pStmt, const 
14b0: 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65  char *zParamName
14c0: 2c 20 42 6c 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a  , Blob *pBlob){.
14d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
14e0: 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
14f0: 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d 49 64  ->pStmt, paramId
1500: 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e  x(pStmt, zParamN
1510: 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 42 6c 6f  blob_buffer(pBlo
1540: 62 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 70 42  b), blob_size(pB
1550: 6c 6f 62 29 2c 20 53 51 4c 49 54 45 5f 53 54 41  lob), SQLITE_STA
1560: 54 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  TIC);.}../*.** S
1570: 74 65 70 20 74 68 65 20 53 51 4c 20 73 74 61 74  tep the SQL stat
1580: 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 65  ement.  Return e
1590: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 52 4f 57  ither SQLITE_ROW
15a0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
15b0: 65 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4f  e.** or SQLITE_O
15c0: 4b 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  K if the stateme
15d0: 6e 74 20 66 69 6e 69 73 68 65 73 20 73 75 63 63  nt finishes succ
15e0: 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  essfully..*/.int
15f0: 20 64 62 5f 73 74 65 70 28 53 74 6d 74 20 2a 70   db_step(Stmt *p
1600: 53 74 6d 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Stmt){.  int rc;
1610: 0a 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 33  .  int limit = 3
1620: 3b 0a 20 20 77 68 69 6c 65 28 20 6c 69 6d 69 74  ;.  while( limit
1630: 2d 2d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  -- ){.    rc = s
1640: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1650: 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  t->pStmt);.    i
1660: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  f( rc==SQLITE_ER
1670: 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ROR ){.      rc 
1680: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
1690: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pStmt->pStmt);. 
16a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
16b0: 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 29  =SQLITE_SCHEMA )
16c0: 7b 0a 20 20 20 20 20 20 72 65 70 72 65 70 61 72  {.      reprepar
16d0: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 65  e(pStmt);.    }e
16e0: 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  lse{.      break
16f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1700: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1710: 2a 20 52 65 73 65 74 20 6f 72 20 66 69 6e 61 6c  * Reset or final
1720: 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  ize a statement.
1730: 0a 2a 2f 0a 69 6e 74 20 64 62 5f 72 65 73 65 74  .*/.int db_reset
1740: 28 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  (Stmt *pStmt){. 
1750: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1760: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 2d 3e 70  3_reset(pStmt->p
1770: 53 74 6d 74 29 3b 0a 20 20 64 62 5f 63 68 65 63  Stmt);.  db_chec
1780: 6b 5f 72 65 73 75 6c 74 28 72 63 29 3b 0a 20 20  k_result(rc);.  
1790: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
17a0: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 53 74 6d   db_finalize(Stm
17b0: 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69 6e 74  t *pStmt){.  int
17c0: 20 72 63 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65   rc;.  blob_rese
17d0: 74 28 26 70 53 74 6d 74 2d 3e 73 71 6c 29 3b 0a  t(&pStmt->sql);.
17e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
17f0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 2d 3e 70  inalize(pStmt->p
1800: 53 74 6d 74 29 3b 0a 20 20 64 62 5f 63 68 65 63  Stmt);.  db_chec
1810: 6b 5f 72 65 73 75 6c 74 28 72 63 29 3b 0a 20 20  k_result(rc);.  
1820: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1830: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
1840: 6f 77 69 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  owid of the most
1850: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
1860: 2f 0a 69 36 34 20 64 62 5f 6c 61 73 74 5f 69 6e  /.i64 db_last_in
1870: 73 65 72 74 5f 72 6f 77 69 64 28 76 6f 69 64 29  sert_rowid(void)
1880: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1890: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
18a0: 6f 77 69 64 28 67 2e 64 62 29 3b 0a 7d 0a 0a 2f  owid(g.db);.}../
18b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18c0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
18d0: 68 61 74 20 77 65 72 65 20 63 68 61 6e 67 65 64  hat were changed
18e0: 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
18f0: 65 6e 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  ent.** INSERT, U
1900: 50 44 41 54 45 2c 20 6f 72 20 44 45 4c 45 54 45  PDATE, or DELETE
1910: 2e 20 20 41 75 78 69 6c 69 61 72 79 20 63 68 61  .  Auxiliary cha
1920: 6e 67 65 73 20 63 61 75 73 65 64 20 62 79 20 74  nges caused by t
1930: 72 69 67 67 65 72 73 0a 2a 2a 20 6f 72 20 6f 74  riggers.** or ot
1940: 68 65 72 20 73 69 64 65 20 65 66 66 65 63 74 73  her side effects
1950: 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64   are not counted
1960: 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 63 68 61 6e  ..*/.int db_chan
1970: 67 65 73 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ges(void){.  ret
1980: 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  urn sqlite3_chan
1990: 67 65 73 28 67 2e 64 62 29 3b 0a 7d 0a 0a 2f 2a  ges(g.db);.}../*
19a0: 0a 2a 2a 20 45 78 74 72 61 63 74 20 74 65 78 74  .** Extract text
19b0: 2c 20 69 6e 74 65 67 65 72 2c 20 6f 72 20 62 6c  , integer, or bl
19c0: 6f 62 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74  ob values from t
19d0: 68 65 20 4e 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  he N-th column o
19e0: 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  f the.** current
19f0: 20 72 6f 77 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f   row..*/.int db_
1a00: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 53 74 6d  column_bytes(Stm
1a10: 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29  t *pStmt, int N)
1a20: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1a30: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
1a40: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29  pStmt->pStmt, N)
1a50: 3b 0a 7d 0a 69 6e 74 20 64 62 5f 63 6f 6c 75 6d  ;.}.int db_colum
1a60: 6e 5f 69 6e 74 28 53 74 6d 74 20 2a 70 53 74 6d  n_int(Stmt *pStm
1a70: 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 74  t, int N){.  ret
1a80: 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  urn sqlite3_colu
1a90: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2d 3e 70 53  mn_int(pStmt->pS
1aa0: 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 69 36 34 20 64  tmt, N);.}.i64 d
1ab0: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 53  b_column_int64(S
1ac0: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20  tmt *pStmt, int 
1ad0: 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  N){.  return sql
1ae0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
1af0: 34 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20  4(pStmt->pStmt, 
1b00: 4e 29 3b 0a 7d 0a 64 6f 75 62 6c 65 20 64 62 5f  N);.}.double db_
1b10: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 53 74  column_double(St
1b20: 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e  mt *pStmt, int N
1b30: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1b40: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
1b50: 65 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20  e(pStmt->pStmt, 
1b60: 4e 29 3b 0a 7d 0a 63 6f 6e 73 74 20 63 68 61 72  N);.}.const char
1b70: 20 2a 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74   *db_column_text
1b80: 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e  (Stmt *pStmt, in
1b90: 74 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  t N){.  return (
1ba0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
1bb0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2d  lumn_text(pStmt-
1bc0: 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 63 6f  >pStmt, N);.}.co
1bd0: 6e 73 74 20 63 68 61 72 20 2a 64 62 5f 63 6f 6c  nst char *db_col
1be0: 75 6d 6e 5f 6d 61 6c 6c 6f 63 28 53 74 6d 74 20  umn_malloc(Stmt 
1bf0: 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a  *pStmt, int N){.
1c00: 20 20 72 65 74 75 72 6e 20 6d 70 72 69 6e 74 66    return mprintf
1c10: 28 22 25 73 22 2c 20 64 62 5f 63 6f 6c 75 6d 6e  ("%s", db_column
1c20: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 4e 29 29  _text(pStmt, N))
1c30: 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 63 6f 6c 75  ;.}.void db_colu
1c40: 6d 6e 5f 62 6c 6f 62 28 53 74 6d 74 20 2a 70 53  mn_blob(Stmt *pS
1c50: 74 6d 74 2c 20 69 6e 74 20 4e 2c 20 42 6c 6f 62  tmt, int N, Blob
1c60: 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 62 6c 6f 62   *pBlob){.  blob
1c70: 5f 61 70 70 65 6e 64 28 70 42 6c 6f 62 2c 20 73  _append(pBlob, s
1c80: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
1c90: 6f 62 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c  ob(pStmt->pStmt,
1ca0: 20 4e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   N),.           
1cb0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
1cc0: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2d 3e 70  n_bytes(pStmt->p
1cd0: 53 74 6d 74 2c 20 4e 29 29 3b 0a 7d 0a 0a 2f 2a  Stmt, N));.}../*
1ce0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
1cf0: 20 62 6c 6f 62 20 74 6f 20 61 6e 20 65 70 68 65   blob to an ephe
1d00: 72 6d 65 72 61 6c 20 63 6f 70 79 20 6f 66 20 74  rmeral copy of t
1d10: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 0a  he content of a.
1d20: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ** column in the
1d30: 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 20 54   current row.  T
1d40: 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 62  he data in the b
1d50: 6c 6f 62 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a  lob will become.
1d60: 2a 2a 20 69 6e 76 61 6c 69 64 20 77 68 65 6e 20  ** invalid when 
1d70: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
1d80: 20 73 74 65 70 70 65 64 20 6f 72 20 72 65 73 65   stepped or rese
1d90: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 65 70  t..*/.void db_ep
1da0: 68 65 6d 65 72 61 6c 5f 62 6c 6f 62 28 53 74 6d  hemeral_blob(Stm
1db0: 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 4e 2c  t *pStmt, int N,
1dc0: 20 42 6c 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a 20   Blob *pBlob){. 
1dd0: 20 62 6c 6f 62 5f 69 6e 69 74 28 70 42 6c 6f 62   blob_init(pBlob
1de0: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
1df0: 5f 62 6c 6f 62 28 70 53 74 6d 74 2d 3e 70 53 74  _blob(pStmt->pSt
1e00: 6d 74 2c 20 4e 29 2c 0a 20 20 20 20 20 20 20 20  mt, N),.        
1e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
1e20: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
1e30: 2d 3e 70 53 74 6d 74 2c 20 4e 29 29 3b 0a 7d 0a  ->pStmt, N));.}.
1e40: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 72  ./*.** Check a r
1e50: 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 49 66 20  esult code.  If 
1e60: 69 74 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  it is not SQLITE
1e70: 5f 4f 4b 2c 20 70 72 69 6e 74 20 74 68 65 0a 2a  _OK, print the.*
1e80: 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
1e90: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e  error message an
1ea0: 64 20 65 78 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20  d exit..*/.void 
1eb0: 64 62 5f 63 68 65 63 6b 5f 72 65 73 75 6c 74 28  db_check_result(
1ec0: 69 6e 74 20 72 63 29 7b 0a 20 20 69 66 28 20 72  int rc){.  if( r
1ed0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ee0: 20 20 20 20 64 62 5f 65 72 72 28 22 53 51 4c 20      db_err("SQL 
1ef0: 65 72 72 6f 72 3a 20 25 73 22 2c 20 73 71 6c 69  error: %s", sqli
1f00: 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29  te3_errmsg(g.db)
1f10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1f20: 45 78 65 63 75 74 65 20 61 20 73 69 6e 67 6c 65  Execute a single
1f30: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
1f40: 65 6e 74 20 75 6e 74 69 6c 20 69 74 20 66 69 6e  ent until it fin
1f50: 69 73 68 65 73 2e 0a 2a 2f 0a 69 6e 74 20 64 62  ishes..*/.int db
1f60: 5f 65 78 65 63 28 53 74 6d 74 20 2a 70 53 74 6d  _exec(Stmt *pStm
1f70: 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
1f80: 77 68 69 6c 65 28 20 28 72 63 20 3d 20 64 62 5f  while( (rc = db_
1f90: 73 74 65 70 28 70 53 74 6d 74 29 29 3d 3d 53 51  step(pStmt))==SQ
1fa0: 4c 49 54 45 5f 52 4f 57 20 29 7b 7d 0a 20 20 72  LITE_ROW ){}.  r
1fb0: 63 20 3d 20 64 62 5f 72 65 73 65 74 28 70 53 74  c = db_reset(pSt
1fc0: 6d 74 29 3b 0a 20 20 64 62 5f 63 68 65 63 6b 5f  mt);.  db_check_
1fd0: 72 65 73 75 6c 74 28 72 63 29 3b 0a 20 20 72 65  result(rc);.  re
1fe0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ff0: 2a 20 45 78 65 63 75 74 65 20 6d 75 6c 74 69 70  * Execute multip
2000: 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  le SQL statement
2010: 73 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 6d 75 6c  s..*/.int db_mul
2020: 74 69 5f 65 78 65 63 28 63 6f 6e 73 74 20 63 68  ti_exec(const ch
2030: 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a  ar *zSql, ...){.
2040: 20 20 42 6c 6f 62 20 73 71 6c 3b 0a 20 20 69 6e    Blob sql;.  in
2050: 74 20 72 63 3b 0a 20 20 76 61 5f 6c 69 73 74 20  t rc;.  va_list 
2060: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ap;.  char *zErr
2070: 20 3d 20 30 3b 0a 20 20 62 6c 6f 62 5f 69 6e 69   = 0;.  blob_ini
2080: 74 28 26 73 71 6c 2c 20 30 2c 20 30 29 3b 0a 20  t(&sql, 0, 0);. 
2090: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53   va_start(ap, zS
20a0: 71 6c 29 3b 0a 20 20 62 6c 6f 62 5f 76 61 70 70  ql);.  blob_vapp
20b0: 65 6e 64 66 28 26 73 71 6c 2c 20 7a 53 71 6c 2c  endf(&sql, zSql,
20c0: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
20d0: 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
20e0: 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 62 6c  e3_exec(g.db, bl
20f0: 6f 62 5f 62 75 66 66 65 72 28 26 73 71 6c 29 2c  ob_buffer(&sql),
2100: 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20   0, 0, &zErr);. 
2110: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2120: 4f 4b 20 29 7b 0a 20 20 20 20 64 62 5f 65 72 72  OK ){.    db_err
2130: 28 22 25 73 5c 6e 25 73 22 2c 20 7a 45 72 72 2c  ("%s\n%s", zErr,
2140: 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 73 71   blob_buffer(&sq
2150: 6c 29 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f  l));.  }.  blob_
2160: 72 65 73 65 74 28 26 73 71 6c 29 3b 0a 20 20 72  reset(&sql);.  r
2170: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2180: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65  ** Execute a que
2190: 72 79 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  ry and return a 
21a0: 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 76  single integer v
21b0: 61 6c 75 65 2e 0a 2a 2f 0a 69 36 34 20 64 62 5f  alue..*/.i64 db_
21c0: 69 6e 74 36 34 28 69 36 34 20 69 44 66 6c 74 2c  int64(i64 iDflt,
21d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
21e0: 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  l, ...){.  va_li
21f0: 73 74 20 61 70 3b 0a 20 20 53 74 6d 74 20 73 3b  st ap;.  Stmt s;
2200: 0a 20 20 69 36 34 20 72 63 3b 0a 20 20 76 61 5f  .  i64 rc;.  va_
2210: 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b  start(ap, zSql);
2220: 0a 20 20 64 62 5f 76 70 72 65 70 61 72 65 28 26  .  db_vprepare(&
2230: 73 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20  s, zSql, ap);.  
2240: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
2250: 28 20 64 62 5f 73 74 65 70 28 26 73 29 21 3d 53  ( db_step(&s)!=S
2260: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
2270: 20 72 63 20 3d 20 69 44 66 6c 74 3b 0a 20 20 7d   rc = iDflt;.  }
2280: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 64  else{.    rc = d
2290: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 26  b_column_int64(&
22a0: 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 5f  s, 0);.  }.  db_
22b0: 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20  finalize(&s);.  
22c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
22d0: 20 64 62 5f 69 6e 74 28 69 6e 74 20 69 44 66 6c   db_int(int iDfl
22e0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
22f0: 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  Sql, ...){.  va_
2300: 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d 74 20  list ap;.  Stmt 
2310: 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76  s;.  int rc;.  v
2320: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c  a_start(ap, zSql
2330: 29 3b 0a 20 20 64 62 5f 76 70 72 65 70 61 72 65  );.  db_vprepare
2340: 28 26 73 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a  (&s, zSql, ap);.
2350: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
2360: 69 66 28 20 64 62 5f 73 74 65 70 28 26 73 29 21  if( db_step(&s)!
2370: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
2380: 20 20 20 72 63 20 3d 20 69 44 66 6c 74 3b 0a 20     rc = iDflt;. 
2390: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
23a0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26   db_column_int(&
23b0: 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 5f  s, 0);.  }.  db_
23c0: 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20  finalize(&s);.  
23d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
23f0: 69 66 20 74 68 65 20 71 75 65 72 79 20 77 6f 75  if the query wou
2400: 6c 64 20 72 65 74 75 72 6e 20 31 20 6f 72 20 6d  ld return 1 or m
2410: 6f 72 65 20 72 6f 77 73 2e 20 20 52 65 74 75 72  ore rows.  Retur
2420: 6e 0a 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68  n.** FALSE if th
2430: 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 77  e query result w
2440: 6f 75 6c 64 20 62 65 20 61 6e 20 65 6d 70 74 79  ould be an empty
2450: 20 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f   set..*/.int db_
2460: 65 78 69 73 74 73 28 63 6f 6e 73 74 20 63 68 61  exists(const cha
2470: 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20  r *zSql, ...){. 
2480: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 53   va_list ap;.  S
2490: 74 6d 74 20 73 3b 0a 20 20 69 6e 74 20 72 63 3b  tmt s;.  int rc;
24a0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
24b0: 7a 53 71 6c 29 3b 0a 20 20 64 62 5f 76 70 72 65  zSql);.  db_vpre
24c0: 70 61 72 65 28 26 73 2c 20 7a 53 71 6c 2c 20 61  pare(&s, zSql, a
24d0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
24e0: 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70 28  ;.  if( db_step(
24f0: 26 73 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &s)!=SQLITE_ROW 
2500: 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
2510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2520: 20 31 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e   1;.  }.  db_fin
2530: 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20 72 65 74  alize(&s);.  ret
2540: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2550: 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65 72  * Execute a quer
2560: 79 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 66  y and return a f
2570: 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 76 61  loating-point va
2580: 6c 75 65 2e 0a 2a 2f 0a 64 6f 75 62 6c 65 20 64  lue..*/.double d
2590: 62 5f 64 6f 75 62 6c 65 28 64 6f 75 62 6c 65 20  b_double(double 
25a0: 72 44 66 6c 74 2c 20 63 6f 6e 73 74 20 63 68 61  rDflt, const cha
25b0: 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20  r *zSql, ...){. 
25c0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 53   va_list ap;.  S
25d0: 74 6d 74 20 73 3b 0a 20 20 64 6f 75 62 6c 65 20  tmt s;.  double 
25e0: 72 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  r;.  va_start(ap
25f0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 64 62 5f 76 70  , zSql);.  db_vp
2600: 72 65 70 61 72 65 28 26 73 2c 20 7a 53 71 6c 2c  repare(&s, zSql,
2610: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
2620: 70 29 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65  p);.  if( db_ste
2630: 70 28 26 73 29 21 3d 53 51 4c 49 54 45 5f 52 4f  p(&s)!=SQLITE_RO
2640: 57 20 29 7b 0a 20 20 20 20 72 20 3d 20 72 44 66  W ){.    r = rDf
2650: 6c 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  lt;.  }else{.   
2660: 20 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 64   r = db_column_d
2670: 6f 75 62 6c 65 28 26 73 2c 20 30 29 3b 0a 20 20  ouble(&s, 0);.  
2680: 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28  }.  db_finalize(
2690: 26 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 3b  &s);.  return r;
26a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
26b0: 65 20 61 20 71 75 65 72 79 20 61 6e 64 20 61 70  e a query and ap
26c0: 70 65 6e 64 20 74 68 65 20 66 69 72 73 74 20 63  pend the first c
26d0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72  olumn of the fir
26e0: 73 74 20 72 6f 77 0a 2a 2a 20 6f 66 20 74 68 65  st row.** of the
26f0: 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 62   result set to b
2700: 6c 6f 62 20 67 69 76 65 6e 20 69 6e 20 74 68 65  lob given in the
2710: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
2720: 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 62 6c 6f 62  .*/.void db_blob
2730: 28 42 6c 6f 62 20 2a 70 52 65 73 75 6c 74 2c 20  (Blob *pResult, 
2740: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2750: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
2760: 74 20 61 70 3b 0a 20 20 53 74 6d 74 20 73 3b 0a  t ap;.  Stmt s;.
2770: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
2780: 53 71 6c 29 3b 0a 20 20 64 62 5f 76 70 72 65 70  Sql);.  db_vprep
2790: 61 72 65 28 26 73 2c 20 7a 53 71 6c 2c 20 61 70  are(&s, zSql, ap
27a0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
27b0: 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26  .  if( db_step(&
27c0: 73 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  s)==SQLITE_ROW )
27d0: 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e  {.    blob_appen
27e0: 64 28 70 52 65 73 75 6c 74 2c 20 73 71 6c 69 74  d(pResult, sqlit
27f0: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 73  e3_column_blob(s
2800: 2e 70 53 74 6d 74 2c 20 30 29 2c 0a 20 20 20 20  .pStmt, 0),.    
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
2830: 75 6d 6e 5f 62 79 74 65 73 28 73 2e 70 53 74 6d  umn_bytes(s.pStm
2840: 74 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20 64 62  t, 0));.  }.  db
2850: 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 7d  _finalize(&s);.}
2860: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
2870: 61 20 71 75 65 72 79 2e 20 20 52 65 74 75 72 6e  a query.  Return
2880: 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   the first colum
2890: 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  n of the first r
28a0: 6f 77 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 73  ow.** of the res
28b0: 75 6c 74 20 73 65 74 20 61 73 20 61 20 73 74 72  ult set as a str
28c0: 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ing.  Space to h
28d0: 6f 6c 64 20 74 68 65 20 73 74 72 69 6e 67 20 69  old the string i
28e0: 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  s.** obtained fr
28f0: 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 49 66  om malloc().  If
2900: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
2910: 69 73 20 65 6d 70 74 79 2c 20 72 65 74 75 72 6e  is empty, return
2920: 0a 2a 2a 20 7a 44 65 66 61 75 6c 74 20 69 6e 73  .** zDefault ins
2930: 74 65 61 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 64  tead..*/.char *d
2940: 62 5f 74 65 78 74 28 63 68 61 72 20 2a 7a 44 65  b_text(char *zDe
2950: 66 61 75 6c 74 2c 20 63 6f 6e 73 74 20 63 68 61  fault, const cha
2960: 72 20 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20  r *zSql, ...){. 
2970: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 53   va_list ap;.  S
2980: 74 6d 74 20 73 3b 0a 20 20 63 68 61 72 20 2a 7a  tmt s;.  char *z
2990: 20 3d 20 7a 44 65 66 61 75 6c 74 3b 0a 20 20 76   = zDefault;.  v
29a0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c  a_start(ap, zSql
29b0: 29 3b 0a 20 20 64 62 5f 76 70 72 65 70 61 72 65  );.  db_vprepare
29c0: 28 26 73 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a  (&s, zSql, ap);.
29d0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
29e0: 69 66 28 20 64 62 5f 73 74 65 70 28 26 73 29 3d  if( db_step(&s)=
29f0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
2a00: 20 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22     z = mprintf("
2a10: 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  %s", sqlite3_col
2a20: 75 6d 6e 5f 74 65 78 74 28 73 2e 70 53 74 6d 74  umn_text(s.pStmt
2a30: 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20 64 62 5f  , 0));.  }.  db_
2a40: 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20  finalize(&s);.  
2a50: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a  return z;.}../*.
2a60: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
2a70: 6e 65 77 20 64 61 74 61 62 61 73 65 20 66 69 6c  new database fil
2a80: 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  e with the given
2a90: 20 73 63 68 65 6d 61 2e 20 20 49 66 20 61 6e 79   schema.  If any
2aa0: 74 68 69 6e 67 0a 2a 2a 20 67 6f 65 73 20 77 72  thing.** goes wr
2ab0: 6f 6e 67 2c 20 63 61 6c 6c 20 64 62 5f 65 72 72  ong, call db_err
2ac0: 28 29 20 74 6f 20 65 78 69 74 2e 0a 2a 2f 0a 76  () to exit..*/.v
2ad0: 6f 69 64 20 64 62 5f 69 6e 69 74 5f 64 61 74 61  oid db_init_data
2ae0: 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  base(.  const ch
2af0: 61 72 20 2a 7a 46 69 6c 65 4e 61 6d 65 2c 20 20  ar *zFileName,  
2b00: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61   /* Name of data
2b10: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 72 65  base file to cre
2b20: 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ate */.  const c
2b30: 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c 20 20 20  har *zSchema,   
2b40: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20    /* First part 
2b50: 6f 66 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 2e  of schema */.  .
2b60: 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2b70: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 69 74          /* Addit
2b80: 69 6f 6e 61 6c 20 53 51 4c 20 74 6f 20 72 75 6e  ional SQL to run
2b90: 2e 20 20 54 65 72 6d 69 6e 61 74 65 20 77 69 74  .  Terminate wit
2ba0: 68 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20  h NULL. */.){.  
2bb0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
2bc0: 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63  nt rc;.  const c
2bd0: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 76 61 5f  har *zSql;.  va_
2be0: 6c 69 73 74 20 61 70 3b 0a 0a 20 20 72 63 20 3d  list ap;..  rc =
2bf0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46   sqlite3_open(zF
2c00: 69 6c 65 4e 61 6d 65 2c 20 26 64 62 29 3b 0a 20  ileName, &db);. 
2c10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c20: 4f 4b 20 29 7b 0a 20 20 20 20 64 62 5f 65 72 72  OK ){.    db_err
2c30: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
2c40: 67 2e 64 62 29 29 3b 0a 20 20 7d 0a 20 20 73 71  g.db));.  }.  sq
2c50: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22  lite3_exec(db, "
2c60: 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 22  BEGIN EXCLUSIVE"
2c70: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 72 63  , 0, 0, 0);.  rc
2c80: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2c90: 64 62 2c 20 7a 53 63 68 65 6d 61 2c 20 30 2c 20  db, zSchema, 0, 
2ca0: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
2cb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cc0: 20 20 64 62 5f 65 72 72 28 73 71 6c 69 74 65 33    db_err(sqlite3
2cd0: 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 29 3b 0a  _errmsg(g.db));.
2ce0: 20 20 7d 0a 20 20 76 61 5f 73 74 61 72 74 28 61    }.  va_start(a
2cf0: 70 2c 20 7a 53 63 68 65 6d 61 29 3b 0a 20 20 77  p, zSchema);.  w
2d00: 68 69 6c 65 28 20 28 7a 53 71 6c 20 3d 20 76 61  hile( (zSql = va
2d10: 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63  _arg(ap, const c
2d20: 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20  har*))!=0 ){.   
2d30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2d40: 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  ec(db, zSql, 0, 
2d50: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
2d60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d70: 20 20 20 20 20 20 64 62 5f 65 72 72 28 73 71 6c        db_err(sql
2d80: 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62  ite3_errmsg(g.db
2d90: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
2da0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73 71  va_end(ap);.  sq
2db0: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22  lite3_exec(db, "
2dc0: 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30  COMMIT", 0, 0, 0
2dd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  );.  sqlite3_clo
2de0: 73 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se(db);.}../*.**
2df0: 20 7a 44 62 4e 61 6d 65 20 69 73 20 74 68 65 20   zDbName is the 
2e00: 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61  name of a databa
2e10: 73 65 20 66 69 6c 65 2e 20 20 49 66 20 6e 6f 20  se file.  If no 
2e20: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 0a 2a  other database.*
2e30: 2a 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  * file is open, 
2e40: 74 68 65 6e 20 6f 70 65 6e 20 74 68 69 73 20 6f  then open this o
2e50: 6e 65 2e 20 20 49 66 20 61 6e 6f 74 68 65 72 20  ne.  If another 
2e60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2e70: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  .** already open
2e80: 2c 20 74 68 65 6e 20 61 74 74 61 63 68 20 7a 44  , then attach zD
2e90: 62 4e 61 6d 65 20 75 73 69 6e 67 20 74 68 65 20  bName using the 
2ea0: 6e 61 6d 65 20 7a 4c 61 62 65 6c 2e 0a 2a 2f 0a  name zLabel..*/.
2eb0: 76 6f 69 64 20 64 62 5f 6f 70 65 6e 5f 6f 72 5f  void db_open_or_
2ec0: 61 74 74 61 63 68 28 63 6f 6e 73 74 20 63 68 61  attach(const cha
2ed0: 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 63 6f 6e 73  r *zDbName, cons
2ee0: 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 29 7b  t char *zLabel){
2ef0: 0a 20 20 69 66 28 20 21 67 2e 64 62 20 29 7b 0a  .  if( !g.db ){.
2f00: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
2f10: 69 74 65 33 5f 6f 70 65 6e 28 7a 44 62 4e 61 6d  ite3_open(zDbNam
2f20: 65 2c 20 26 67 2e 64 62 29 3b 0a 20 20 20 20 69  e, &g.db);.    i
2f30: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f40: 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 65 72 72   ){.      db_err
2f50: 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
2f60: 67 2e 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20  g.db));.    }.  
2f70: 20 20 64 62 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f    db_connection_
2f80: 69 6e 69 74 28 29 3b 0a 20 20 7d 65 6c 73 65 7b  init();.  }else{
2f90: 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78  .    db_multi_ex
2fa0: 65 63 28 22 41 54 54 41 43 48 20 44 41 54 41 42  ec("ATTACH DATAB
2fb0: 41 53 45 20 25 51 20 41 53 20 25 73 22 2c 20 7a  ASE %Q AS %s", z
2fc0: 44 62 4e 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3b  DbName, zLabel);
2fd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  .  }.}../*.** Op
2fe0: 65 6e 20 74 68 65 20 75 73 65 72 20 64 61 74 61  en the user data
2ff0: 62 61 73 65 20 69 6e 20 22 7e 2f 2e 66 6f 73 73  base in "~/.foss
3000: 69 6c 22 2e 20 20 43 72 65 61 74 65 20 74 68 65  il".  Create the
3010: 20 64 61 74 61 62 61 73 65 20 61 6e 65 77 20 69   database anew i
3020: 66 0a 2a 2a 20 69 74 20 64 6f 65 73 20 6e 6f 74  f.** it does not
3030: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a   already exist..
3040: 2a 2f 0a 76 6f 69 64 20 64 62 5f 6f 70 65 6e 5f  */.void db_open_
3050: 63 6f 6e 66 69 67 28 76 6f 69 64 29 7b 0a 20 20  config(void){.  
3060: 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20  char *zDbName;. 
3070: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 48 6f   const char *zHo
3080: 6d 65 20 3d 20 67 65 74 65 6e 76 28 22 48 4f 4d  me = getenv("HOM
3090: 45 22 29 3b 0a 20 20 69 66 28 20 7a 48 6f 6d 65  E");.  if( zHome
30a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f 65 72  ==0 ){.    db_er
30b0: 72 28 22 63 61 6e 6e 6f 74 20 6c 6f 63 61 6c 20  r("cannot local 
30c0: 68 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 22 29  home directory")
30d0: 3b 0a 20 20 7d 0a 20 20 7a 44 62 4e 61 6d 65 20  ;.  }.  zDbName 
30e0: 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 2f 2e 66  = mprintf("%s/.f
30f0: 6f 73 73 69 6c 22 2c 20 7a 48 6f 6d 65 29 3b 0a  ossil", zHome);.
3100: 20 20 69 66 28 20 67 2e 63 6f 6e 66 69 67 4f 70    if( g.configOp
3110: 65 6e 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  en ) return;.  i
3120: 66 28 20 66 69 6c 65 5f 73 69 7a 65 28 7a 44 62  f( file_size(zDb
3130: 4e 61 6d 65 29 3c 31 30 32 34 2a 33 20 29 7b 0a  Name)<1024*3 ){.
3140: 20 20 20 20 64 62 5f 69 6e 69 74 5f 64 61 74 61      db_init_data
3150: 62 61 73 65 28 7a 44 62 4e 61 6d 65 2c 20 7a 43  base(zDbName, zC
3160: 6f 6e 66 69 67 53 63 68 65 6d 61 2c 20 28 63 68  onfigSchema, (ch
3170: 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 64 62  ar*)0);.  }.  db
3180: 5f 6f 70 65 6e 5f 6f 72 5f 61 74 74 61 63 68 28  _open_or_attach(
3190: 7a 44 62 4e 61 6d 65 2c 20 22 63 6f 6e 66 69 67  zDbName, "config
31a0: 64 62 22 29 3b 0a 20 20 67 2e 63 6f 6e 66 69 67  db");.  g.config
31b0: 4f 70 65 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  Open = 1;.}../*.
31c0: 2a 2a 20 49 66 20 7a 44 62 4e 61 6d 65 20 69 73  ** If zDbName is
31d0: 20 61 20 76 61 6c 69 64 20 6c 6f 63 61 6c 20 64   a valid local d
31e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 6f 70  atabase file, op
31f0: 65 6e 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e  en it and return
3200: 0a 2a 2a 20 74 72 75 65 2e 20 20 49 66 20 69 74  .** true.  If it
3210: 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
3220: 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 66  local database f
3230: 69 6c 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ile, return 0..*
3240: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 56  /.static int isV
3250: 61 6c 69 64 4c 6f 63 61 6c 44 62 28 63 6f 6e 73  alidLocalDb(cons
3260: 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29  t char *zDbName)
3270: 7b 0a 20 20 69 36 34 20 6c 73 69 7a 65 3b 0a 20  {.  i64 lsize;. 
3280: 20 69 66 28 20 61 63 63 65 73 73 28 7a 44 62 4e   if( access(zDbN
3290: 61 6d 65 2c 20 46 5f 4f 4b 29 20 29 20 72 65 74  ame, F_OK) ) ret
32a0: 75 72 6e 20 30 3b 0a 20 20 6c 73 69 7a 65 20 3d  urn 0;.  lsize =
32b0: 20 66 69 6c 65 5f 73 69 7a 65 28 7a 44 62 4e 61   file_size(zDbNa
32c0: 6d 65 29 3b 0a 20 20 69 66 28 20 6c 73 69 7a 65  me);.  if( lsize
32d0: 25 31 30 32 34 21 3d 30 20 7c 7c 20 6c 73 69 7a  %1024!=0 || lsiz
32e0: 65 3c 34 30 39 36 20 29 20 72 65 74 75 72 6e 20  e<4096 ) return 
32f0: 30 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 6f 72 5f  0;.  db_open_or_
3300: 61 74 74 61 63 68 28 7a 44 62 4e 61 6d 65 2c 20  attach(zDbName, 
3310: 22 6c 6f 63 61 6c 64 62 22 29 3b 0a 20 20 67 2e  "localdb");.  g.
3320: 6c 6f 63 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  localOpen = 1;. 
3330: 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e 66 69 67 28   db_open_config(
3340: 29 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70  );.  db_open_rep
3350: 6f 73 69 74 6f 72 79 28 30 29 3b 0a 20 20 72 65  ository(0);.  re
3360: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
3370: 20 4c 6f 63 61 74 65 20 74 68 65 20 72 6f 6f 74   Locate the root
3380: 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
3390: 65 20 6c 6f 63 61 6c 20 72 65 70 6f 73 69 74 6f  e local reposito
33a0: 72 79 20 74 72 65 65 2e 20 20 54 68 65 20 72 6f  ry tree.  The ro
33b0: 6f 74 0a 2a 2a 20 64 69 72 65 63 74 6f 72 79 20  ot.** directory 
33c0: 69 73 20 66 6f 75 6e 64 20 62 79 20 73 65 61 72  is found by sear
33d0: 63 68 69 6e 67 20 66 6f 72 20 61 20 66 69 6c 65  ching for a file
33e0: 20 6e 61 6d 65 64 20 22 46 4f 53 53 49 4c 22 20   named "FOSSIL" 
33f0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
3400: 20 61 20 76 61 6c 69 64 20 72 65 70 6f 73 69 74   a valid reposit
3410: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
3420: 0a 2a 2a 20 49 66 20 6e 6f 20 76 61 6c 69 64 20  .** If no valid 
3430: 46 4f 53 53 49 4c 20 66 69 6c 65 20 69 73 20 66  FOSSIL file is f
3440: 6f 75 6e 64 2c 20 77 65 20 6d 6f 76 65 20 75 70  ound, we move up
3450: 20 6f 6e 65 20 6c 65 76 65 6c 20 61 6e 64 20 74   one level and t
3460: 72 79 20 61 67 61 69 6e 2e 20 20 0a 2a 2a 20 4f  ry again.  .** O
3470: 6e 63 65 20 74 68 65 20 66 69 6c 65 20 69 73 20  nce the file is 
3480: 66 6f 75 6e 64 2c 20 74 68 65 20 67 2e 7a 4c 6f  found, the g.zLo
3490: 63 61 6c 52 6f 6f 74 20 76 61 72 69 61 62 6c 65  calRoot variable
34a0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 72   is set to the r
34b0: 6f 6f 74 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65  oot of.** the re
34c0: 70 6f 73 69 74 6f 72 79 20 74 72 65 65 20 61 6e  pository tree an
34d0: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
34e0: 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20 6e 6f  eturns 1.  If no
34f0: 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
3500: 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 69 73  found, then this
3510: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20   routine return 
3520: 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  0..**.** This ro
3530: 75 74 69 6e 65 20 61 6c 77 61 79 73 20 6f 70 65  utine always ope
3540: 6e 73 20 74 68 65 20 75 73 65 72 20 64 61 74 61  ns the user data
3550: 62 61 73 65 20 72 65 67 61 72 64 6c 65 73 73 20  base regardless 
3560: 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a 2a 2a  of whether or.**
3570: 20 6e 6f 74 20 74 68 65 20 72 65 70 6f 73 69 74   not the reposit
3580: 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
3590: 66 6f 75 6e 64 2e 20 20 49 66 20 74 68 65 20 46  found.  If the F
35a0: 4f 53 53 49 4c 20 66 69 6c 65 20 69 73 20 66 6f  OSSIL file is fo
35b0: 75 6e 64 2c 0a 2a 2a 20 69 74 20 69 73 20 61 74  und,.** it is at
35c0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 70  tached to the op
35d0: 65 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  en database conn
35e0: 65 63 74 69 6f 6e 20 74 6f 6f 2e 0a 2a 2f 0a 69  ection too..*/.i
35f0: 6e 74 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c  nt db_open_local
3600: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 6e 3b  (void){.  int n;
3610: 0a 20 20 63 68 61 72 20 7a 50 77 64 5b 32 30 30  .  char zPwd[200
3620: 30 5d 3b 0a 20 20 69 66 28 20 67 2e 6c 6f 63 61  0];.  if( g.loca
3630: 6c 4f 70 65 6e 29 20 72 65 74 75 72 6e 20 31 3b  lOpen) return 1;
3640: 0a 20 20 69 66 28 20 67 65 74 63 77 64 28 7a 50  .  if( getcwd(zP
3650: 77 64 2c 20 73 69 7a 65 6f 66 28 7a 50 77 64 29  wd, sizeof(zPwd)
3660: 2d 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64  -20)==0 ){.    d
3670: 62 5f 65 72 72 28 22 70 77 64 20 74 6f 6f 20 62  b_err("pwd too b
3680: 69 67 3a 20 6d 61 78 20 25 64 22 2c 20 73 69 7a  ig: max %d", siz
3690: 65 6f 66 28 7a 50 77 64 29 2d 32 30 29 3b 0a 20  eof(zPwd)-20);. 
36a0: 20 7d 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28   }.  n = strlen(
36b0: 7a 50 77 64 29 3b 0a 20 20 77 68 69 6c 65 28 20  zPwd);.  while( 
36c0: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 61  n>0 ){.    if( a
36d0: 63 63 65 73 73 28 7a 50 77 64 2c 20 57 5f 4f 4b  ccess(zPwd, W_OK
36e0: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73  ) ) break;.    s
36f0: 74 72 63 70 79 28 26 7a 50 77 64 5b 6e 5d 2c 20  trcpy(&zPwd[n], 
3700: 22 2f 5f 46 4f 53 53 49 4c 5f 22 29 3b 0a 20 20  "/_FOSSIL_");.  
3710: 20 20 69 66 28 20 69 73 56 61 6c 69 64 4c 6f 63    if( isValidLoc
3720: 61 6c 44 62 28 7a 50 77 64 29 20 29 7b 0a 20 20  alDb(zPwd) ){.  
3730: 20 20 20 20 2f 2a 20 46 6f 75 6e 64 20 61 20 76      /* Found a v
3740: 61 6c 69 64 20 5f 46 4f 53 53 49 4c 5f 20 66 69  alid _FOSSIL_ fi
3750: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 50 77 64  le */.      zPwd
3760: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 67  [n] = 0;.      g
3770: 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 20 3d 20 6d 70  .zLocalRoot = mp
3780: 72 69 6e 74 66 28 22 25 73 2f 22 2c 20 7a 50 77  rintf("%s/", zPw
3790: 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
37a0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 2d   1;.    }.    n-
37b0: 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 3e  -;.    while( n>
37c0: 30 20 26 26 20 7a 50 77 64 5b 6e 5d 21 3d 27 2f  0 && zPwd[n]!='/
37d0: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20  ' ){ n--; }.    
37e0: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 50  while( n>0 && zP
37f0: 77 64 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20  wd[n-1]=='/' ){ 
3800: 6e 2d 2d 3b 20 7d 0a 20 20 20 20 7a 50 77 64 5b  n--; }.    zPwd[
3810: 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  n] = 0;.  }..  /
3820: 2a 20 41 20 5f 46 4f 53 53 49 4c 5f 20 66 69 6c  * A _FOSSIL_ fil
3830: 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66  e could not be f
3840: 6f 75 6e 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ound */.  return
3850: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65   0;.}../*.** Ope
3860: 6e 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79  n the repository
3870: 20 64 61 74 61 62 61 73 65 20 67 69 76 65 6e 20   database given 
3880: 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20 49 66 20  by zDbName.  If 
3890: 7a 44 62 4e 61 6d 65 3d 3d 4e 55 4c 4c 20 74 68  zDbName==NULL th
38a0: 65 6e 0a 2a 2a 20 67 65 74 20 74 68 65 20 6e 61  en.** get the na
38b0: 6d 65 20 66 72 6f 6d 20 74 68 65 20 61 6c 72 65  me from the alre
38c0: 61 64 79 20 6f 70 65 6e 20 6c 6f 63 61 6c 20 64  ady open local d
38d0: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64  atabase..*/.void
38e0: 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74   db_open_reposit
38f0: 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ory(const char *
3900: 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20  zDbName){.  if( 
3910: 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e  g.repositoryOpen
3920: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
3930: 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20   zDbName==0 ){. 
3940: 20 20 20 69 66 28 20 67 2e 6c 6f 63 61 6c 4f 70     if( g.localOp
3950: 65 6e 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 4e  en ){.      zDbN
3960: 61 6d 65 20 3d 20 64 62 5f 6c 67 65 74 28 22 72  ame = db_lget("r
3970: 65 70 6f 73 69 74 6f 72 79 22 2c 20 30 29 3b 0a  epository", 0);.
3980: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44      }.    if( zD
3990: 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
39a0: 20 20 64 62 5f 65 72 72 28 22 75 6e 61 62 6c 65    db_err("unable
39b0: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 61 6d   to find the nam
39c0: 65 20 6f 66 20 61 20 72 65 70 6f 73 69 74 6f 72  e of a repositor
39d0: 79 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  y database");.  
39e0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 63    }.  }.  if( ac
39f0: 63 65 73 73 28 7a 44 62 4e 61 6d 65 2c 20 52 5f  cess(zDbName, R_
3a00: 4f 4b 29 20 7c 7c 20 66 69 6c 65 5f 73 69 7a 65  OK) || file_size
3a10: 28 7a 44 62 4e 61 6d 65 29 3c 31 30 32 34 20 29  (zDbName)<1024 )
3a20: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e  {.    fossil_pan
3a30: 69 63 28 22 6e 6f 20 73 75 63 68 20 72 65 70 6f  ic("no such repo
3a40: 73 69 74 6f 72 79 3a 20 25 73 22 2c 20 7a 44 62  sitory: %s", zDb
3a50: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 64 62 5f  Name);.  }.  db_
3a60: 6f 70 65 6e 5f 6f 72 5f 61 74 74 61 63 68 28 7a  open_or_attach(z
3a70: 44 62 4e 61 6d 65 2c 20 22 72 65 70 6f 73 69 74  DbName, "reposit
3a80: 6f 72 79 22 29 3b 0a 20 20 67 2e 72 65 70 6f 73  ory");.  g.repos
3a90: 69 74 6f 72 79 4f 70 65 6e 20 3d 20 31 3b 0a 20  itoryOpen = 1;. 
3aa0: 20 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79 4e 61   g.zRepositoryNa
3ab0: 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73  me = mprintf("%s
3ac0: 22 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 7d 0a 0a  ", zDbName);.}..
3ad0: 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e  /*.** Try to fin
3ae0: 64 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79  d the repository
3af0: 20 61 6e 64 20 6f 70 65 6e 20 69 74 2e 20 20 49   and open it.  I
3b00: 66 20 77 65 20 61 72 65 20 69 6e 20 61 20 6c 6f  f we are in a lo
3b10: 63 61 6c 0a 2a 2a 20 74 72 65 65 2c 20 74 68 65  cal.** tree, the
3b20: 6e 20 75 73 65 20 74 68 65 20 72 65 70 6f 73 69  n use the reposi
3b30: 74 6f 72 79 20 6f 66 20 74 68 65 20 6c 6f 63 61  tory of the loca
3b40: 6c 20 74 72 65 65 2e 20 20 4f 74 68 65 72 77 69  l tree.  Otherwi
3b50: 73 65 2c 0a 2a 2a 20 66 61 6c 6c 20 62 61 63 6b  se,.** fall back
3b60: 20 74 6f 20 74 68 65 20 2d 52 20 6f 72 20 2d 2d   to the -R or --
3b70: 72 65 70 6f 73 69 74 6f 72 79 20 6f 70 74 69 6f  repository optio
3b80: 6e 2e 0a 2a 2a 0a 2a 2a 20 45 72 72 6f 72 20 6f  n..**.** Error o
3b90: 75 74 20 69 66 20 74 68 65 20 72 65 70 6f 73 69  ut if the reposi
3ba0: 74 6f 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 6f  tory cannot be o
3bb0: 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 64  pened..*/.void d
3bc0: 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f  b_find_and_open_
3bd0: 72 65 70 6f 73 69 74 6f 72 79 28 76 6f 69 64 29  repository(void)
3be0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
3bf0: 7a 52 65 70 20 3d 20 66 69 6e 64 5f 6f 70 74 69  zRep = find_opti
3c00: 6f 6e 28 22 72 65 70 6f 73 69 74 6f 72 79 22 2c  on("repository",
3c10: 20 22 52 22 2c 20 31 29 3b 0a 20 20 69 66 28 20   "R", 1);.  if( 
3c20: 7a 52 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 69  zRep==0 ){.    i
3c30: 66 28 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c  f( db_open_local
3c40: 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  ()==0 ){.      g
3c50: 6f 74 6f 20 72 65 70 5f 6e 6f 74 5f 66 6f 75 6e  oto rep_not_foun
3c60: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 52 65  d;.    }.    zRe
3c70: 70 20 3d 20 64 62 5f 6c 67 65 74 28 22 72 65 70  p = db_lget("rep
3c80: 6f 73 69 74 6f 72 79 22 2c 20 30 29 3b 0a 20 20  ository", 0);.  
3c90: 20 20 69 66 28 20 7a 52 65 70 3d 3d 30 20 29 7b    if( zRep==0 ){
3ca0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 72 65 70 5f  .      goto rep_
3cb0: 6e 6f 74 5f 66 6f 75 6e 64 3b 0a 20 20 20 20 7d  not_found;.    }
3cc0: 0a 20 20 7d 0a 20 20 64 62 5f 6f 70 65 6e 5f 72  .  }.  db_open_r
3cd0: 65 70 6f 73 69 74 6f 72 79 28 7a 52 65 70 29 3b  epository(zRep);
3ce0: 0a 20 20 69 66 28 20 67 2e 72 65 70 6f 73 69 74  .  if( g.reposit
3cf0: 6f 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  oryOpen ){.    r
3d00: 65 74 75 72 6e 3b 0a 20 20 7d 0a 72 65 70 5f 6e  eturn;.  }.rep_n
3d10: 6f 74 5f 66 6f 75 6e 64 3a 0a 20 20 66 6f 73 73  ot_found:.  foss
3d20: 69 6c 5f 66 61 74 61 6c 28 22 75 73 65 20 2d 2d  il_fatal("use --
3d30: 72 65 70 6f 73 69 74 6f 72 79 20 6f 72 20 2d 52  repository or -R
3d40: 20 74 6f 20 73 70 65 63 69 66 69 63 20 74 68 65   to specific the
3d50: 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61   repository data
3d60: 62 61 73 65 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  base");.}../*.**
3d70: 20 4f 70 65 6e 20 74 68 65 20 6c 6f 63 61 6c 20   Open the local 
3d80: 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 75 6e  database.  If un
3d90: 61 62 6c 65 2c 20 65 78 69 74 20 77 69 74 68 20  able, exit with 
3da0: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 76 6f 69  an error..*/.voi
3db0: 64 20 64 62 5f 6d 75 73 74 5f 62 65 5f 77 69 74  d db_must_be_wit
3dc0: 68 69 6e 5f 74 72 65 65 28 76 6f 69 64 29 7b 0a  hin_tree(void){.
3dd0: 20 20 69 66 28 20 64 62 5f 6f 70 65 6e 5f 6c 6f    if( db_open_lo
3de0: 63 61 6c 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20  cal()==0 ){.    
3df0: 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e 6f  fossil_fatal("no
3e00: 74 20 77 69 74 68 69 6e 20 61 6e 20 6f 70 65 6e  t within an open
3e10: 20 63 68 65 63 6b 6f 75 74 22 29 3b 0a 20 20 7d   checkout");.  }
3e20: 0a 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73  .  db_open_repos
3e30: 69 74 6f 72 79 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a  itory(0);.}../*.
3e40: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 64 61 74  ** Close the dat
3e50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
3e60: 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 63 6c 6f  ..*/.void db_clo
3e70: 73 65 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  se(void){.  if( 
3e80: 67 2e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  g.db==0 ) return
3e90: 3b 0a 20 20 67 2e 72 65 70 6f 73 69 74 6f 72 79  ;.  g.repository
3ea0: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 67 2e 6c 6f  Open = 0;.  g.lo
3eb0: 63 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 67  calOpen = 0;.  g
3ec0: 2e 63 6f 6e 66 69 67 4f 70 65 6e 20 3d 20 30 3b  .configOpen = 0;
3ed0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
3ee0: 28 67 2e 64 62 29 3b 0a 20 20 67 2e 64 62 20 3d  (g.db);.  g.db =
3ef0: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72   0;.}.../*.** Cr
3f00: 65 61 74 65 20 61 20 6e 65 77 20 65 6d 70 74 79  eate a new empty
3f10: 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61   repository data
3f20: 62 61 73 65 20 77 69 74 68 20 74 68 65 20 67 69  base with the gi
3f30: 76 65 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ven name..**.** 
3f40: 4f 6e 6c 79 20 74 68 65 20 73 63 68 65 6d 61 20  Only the schema 
3f50: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  is initialized. 
3f60: 20 54 68 65 20 72 65 71 75 69 72 65 64 20 56 41   The required VA
3f70: 52 20 74 61 62 6c 65 73 20 65 6e 74 72 69 65 73  R tables entries
3f80: 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 73 65 74 20  .** are not set 
3f90: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
3fa0: 61 6e 64 20 6d 75 73 74 20 62 65 20 73 65 74 20  and must be set 
3fb0: 73 65 70 61 72 61 74 65 6c 79 20 69 6e 20 6f 72  separately in or
3fc0: 64 65 72 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 74  der.** to make t
3fd0: 68 65 20 6e 65 77 20 66 69 6c 65 20 61 20 76 61  he new file a va
3fe0: 6c 69 64 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  lid database..*/
3ff0: 0a 76 6f 69 64 20 64 62 5f 63 72 65 61 74 65 5f  .void db_create_
4000: 72 65 70 6f 73 69 74 6f 72 79 28 63 6f 6e 73 74  repository(const
4010: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
4020: 29 7b 0a 20 20 64 62 5f 69 6e 69 74 5f 64 61 74  ){.  db_init_dat
4030: 61 62 61 73 65 28 0a 20 20 20 20 20 7a 46 69 6c  abase(.     zFil
4040: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 7a 52 65 70  ename,.     zRep
4050: 6f 73 69 74 6f 72 79 53 63 68 65 6d 61 31 2c 0a  ositorySchema1,.
4060: 20 20 20 20 20 7a 52 65 70 6f 73 69 74 6f 72 79       zRepository
4070: 53 63 68 65 6d 61 32 2c 0a 20 20 20 20 20 28 63  Schema2,.     (c
4080: 68 61 72 2a 29 30 0a 20 20 29 3b 0a 7d 0a 0a 0a  har*)0.  );.}...
4090: 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 6e  /*.** COMMAND: n
40a0: 65 77 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20  ew.**.** Create 
40b0: 61 20 6e 65 77 20 72 65 70 6f 73 69 74 6f 72 79  a new repository
40c0: 0a 2a 2f 0a 76 6f 69 64 20 63 72 65 61 74 65 5f  .*/.void create_
40d0: 72 65 70 6f 73 69 74 6f 72 79 5f 63 6d 64 28 76  repository_cmd(v
40e0: 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  oid){.  char *zD
40f0: 61 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 55 73  ate;.  char *zUs
4100: 65 72 3b 0a 20 20 42 6c 6f 62 20 68 61 73 68 3b  er;.  Blob hash;
4110: 0a 20 20 42 6c 6f 62 20 6d 61 6e 69 66 65 73 74  .  Blob manifest
4120: 3b 0a 0a 20 20 69 66 28 20 67 2e 61 72 67 63 21  ;..  if( g.argc!
4130: 3d 33 20 29 7b 0a 20 20 20 20 75 73 61 67 65 28  =3 ){.    usage(
4140: 22 52 45 50 4f 53 49 54 4f 52 59 2d 4e 41 4d 45  "REPOSITORY-NAME
4150: 22 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 63 72 65  ");.  }.  db_cre
4160: 61 74 65 5f 72 65 70 6f 73 69 74 6f 72 79 28 67  ate_repository(g
4170: 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 64 62 5f  .argv[2]);.  db_
4180: 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28  open_repository(
4190: 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 64 62  g.argv[2]);.  db
41a0: 5f 6f 70 65 6e 5f 63 6f 6e 66 69 67 28 29 3b 0a  _open_config();.
41b0: 20 20 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73    db_begin_trans
41c0: 61 63 74 69 6f 6e 28 29 3b 0a 20 20 64 62 5f 73  action();.  db_s
41d0: 65 74 28 22 63 6f 6e 74 65 6e 74 2d 73 63 68 65  et("content-sche
41e0: 6d 61 22 2c 20 43 4f 4e 54 45 4e 54 5f 53 43 48  ma", CONTENT_SCH
41f0: 45 4d 41 29 3b 0a 20 20 64 62 5f 73 65 74 28 22  EMA);.  db_set("
4200: 61 75 78 2d 73 63 68 65 6d 61 22 2c 20 41 55 58  aux-schema", AUX
4210: 5f 53 43 48 45 4d 41 29 3b 0a 20 20 64 62 5f 73  _SCHEMA);.  db_s
4220: 65 74 5f 69 6e 74 28 22 61 75 74 68 65 6e 74 69  et_int("authenti
4230: 63 61 74 65 2d 6c 6f 63 61 6c 68 6f 73 74 22 2c  cate-localhost",
4240: 20 30 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f   0);.  db_multi_
4250: 65 78 65 63 28 0a 20 20 20 20 22 49 4e 53 45 52  exec(.    "INSER
4260: 54 20 49 4e 54 4f 20 63 6f 6e 66 69 67 28 6e 61  T INTO config(na
4270: 6d 65 2c 76 61 6c 75 65 29 20 56 41 4c 55 45 53  me,value) VALUES
4280: 28 27 73 65 72 76 65 72 2d 63 6f 64 65 27 2c 20  ('server-code', 
4290: 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32  hex(randomblob(2
42a0: 30 29 29 29 3b 22 0a 20 20 20 20 22 49 4e 53 45  0)));".    "INSE
42b0: 52 54 20 49 4e 54 4f 20 63 6f 6e 66 69 67 28 6e  RT INTO config(n
42c0: 61 6d 65 2c 76 61 6c 75 65 29 20 56 41 4c 55 45  ame,value) VALUE
42d0: 53 28 27 70 72 6f 6a 65 63 74 2d 63 6f 64 65 27  S('project-code'
42e0: 2c 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  ,hex(randomblob(
42f0: 32 30 29 29 29 3b 22 0a 20 20 29 3b 0a 20 20 7a  20)));".  );.  z
4300: 55 73 65 72 20 3d 20 64 62 5f 67 6c 6f 62 61 6c  User = db_global
4310: 5f 67 65 74 28 22 64 65 66 61 75 6c 74 2d 75 73  _get("default-us
4320: 65 72 22 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a  er", 0);.  if( z
4330: 55 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  User==0 ){.    z
4340: 55 73 65 72 20 3d 20 67 65 74 65 6e 76 28 22 55  User = getenv("U
4350: 53 45 52 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  SER");.  }.  if(
4360: 20 7a 55 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20   zUser==0 ){.   
4370: 20 7a 55 73 65 72 20 3d 20 22 72 6f 6f 74 22 3b   zUser = "root";
4380: 0a 20 20 7d 0a 20 20 64 62 5f 6d 75 6c 74 69 5f  .  }.  db_multi_
4390: 65 78 65 63 28 0a 20 20 20 20 20 22 49 4e 53 45  exec(.     "INSE
43a0: 52 54 20 49 4e 54 4f 20 75 73 65 72 28 6c 6f 67  RT INTO user(log
43b0: 69 6e 2c 20 70 77 2c 20 63 61 70 2c 20 69 6e 66  in, pw, cap, inf
43c0: 6f 29 22 0a 20 20 20 20 20 22 56 41 4c 55 45 53  o)".     "VALUES
43d0: 28 25 51 2c 27 27 2c 27 73 27 2c 27 27 29 22 2c  (%Q,'','s','')",
43e0: 20 7a 55 73 65 72 0a 20 20 29 3b 0a 20 20 64 62   zUser.  );.  db
43f0: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20  _multi_exec(.   
4400: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 75    "INSERT INTO u
4410: 73 65 72 28 6c 6f 67 69 6e 2c 70 77 2c 63 61 70  ser(login,pw,cap
4420: 2c 69 6e 66 6f 29 22 0a 20 20 20 20 20 22 20 20  ,info)".     "  
4430: 20 56 41 4c 55 45 53 28 27 61 6e 6f 6e 79 6d 6f   VALUES('anonymo
4440: 75 73 27 2c 27 61 6e 6f 6e 79 6d 6f 75 73 27 2c  us','anonymous',
4450: 27 68 6a 6b 6f 72 77 27 2c 27 41 6e 6f 6e 27 29  'hjkorw','Anon')
4460: 3b 22 0a 20 20 20 20 20 22 49 4e 53 45 52 54 20  ;".     "INSERT 
4470: 49 4e 54 4f 20 75 73 65 72 28 6c 6f 67 69 6e 2c  INTO user(login,
4480: 70 77 2c 63 61 70 2c 69 6e 66 6f 29 22 0a 20 20  pw,cap,info)".  
4490: 20 20 20 22 20 20 20 56 41 4c 55 45 53 28 27 6e     "   VALUES('n
44a0: 6f 62 6f 64 79 27 2c 27 27 2c 27 6a 6f 72 27 2c  obody','','jor',
44b0: 27 4e 6f 62 6f 64 79 27 29 3b 22 0a 20 20 29 3b  'Nobody');".  );
44c0: 0a 20 20 75 73 65 72 5f 73 65 6c 65 63 74 28 29  .  user_select()
44d0: 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6d  ;.  blob_zero(&m
44e0: 61 6e 69 66 65 73 74 29 3b 0a 20 20 62 6c 6f 62  anifest);.  blob
44f0: 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69 66 65  _appendf(&manife
4500: 73 74 2c 20 22 43 20 69 6e 69 74 69 61 6c 5c 5c  st, "C initial\\
4510: 73 65 6d 70 74 79 5c 5c 73 62 61 73 65 6c 69 6e  sempty\\sbaselin
4520: 65 5c 6e 22 29 3b 0a 20 20 7a 44 61 74 65 20 3d  e\n");.  zDate =
4530: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
4540: 45 43 54 20 64 61 74 65 74 69 6d 65 28 27 6e 6f  ECT datetime('no
4550: 77 27 29 22 29 3b 0a 20 20 7a 44 61 74 65 5b 31  w')");.  zDate[1
4560: 30 5d 3d 27 54 27 3b 0a 20 20 62 6c 6f 62 5f 61  0]='T';.  blob_a
4570: 70 70 65 6e 64 66 28 26 6d 61 6e 69 66 65 73 74  ppendf(&manifest
4580: 2c 20 22 44 20 25 73 5c 6e 22 2c 20 7a 44 61 74  , "D %s\n", zDat
4590: 65 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e  e);.  blob_appen
45a0: 64 66 28 26 6d 61 6e 69 66 65 73 74 2c 20 22 50  df(&manifest, "P
45b0: 5c 6e 22 29 3b 0a 20 20 6d 64 35 73 75 6d 5f 69  \n");.  md5sum_i
45c0: 6e 69 74 28 29 3b 0a 20 20 62 6c 6f 62 5f 61 70  nit();.  blob_ap
45d0: 70 65 6e 64 66 28 26 6d 61 6e 69 66 65 73 74 2c  pendf(&manifest,
45e0: 20 22 52 20 25 73 5c 6e 22 2c 20 6d 64 35 73 75   "R %s\n", md5su
45f0: 6d 5f 66 69 6e 69 73 68 28 30 29 29 3b 0a 20 20  m_finish(0));.  
4600: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61  blob_appendf(&ma
4610: 6e 69 66 65 73 74 2c 20 22 55 20 25 46 5c 6e 22  nifest, "U %F\n"
4620: 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 6d  , g.zLogin);.  m
4630: 64 35 73 75 6d 5f 62 6c 6f 62 28 26 6d 61 6e 69  d5sum_blob(&mani
4640: 66 65 73 74 2c 20 26 68 61 73 68 29 3b 0a 20 20  fest, &hash);.  
4650: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61  blob_appendf(&ma
4660: 6e 69 66 65 73 74 2c 20 22 5a 20 25 62 5c 6e 22  nifest, "Z %b\n"
4670: 2c 20 26 68 61 73 68 29 3b 0a 20 20 62 6c 6f 62  , &hash);.  blob
4680: 5f 72 65 73 65 74 28 26 68 61 73 68 29 3b 0a 20  _reset(&hash);. 
4690: 20 63 6f 6e 74 65 6e 74 5f 70 75 74 28 26 6d 61   content_put(&ma
46a0: 6e 69 66 65 73 74 2c 20 30 2c 20 30 29 3b 0a 20  nifest, 0, 0);. 
46b0: 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74   db_end_transact
46c0: 69 6f 6e 28 30 29 3b 0a 20 20 70 72 69 6e 74 66  ion(0);.  printf
46d0: 28 22 70 72 6f 6a 65 63 74 2d 69 64 3a 20 25 73  ("project-id: %s
46e0: 5c 6e 22 2c 20 64 62 5f 67 65 74 28 22 70 72 6f  \n", db_get("pro
46f0: 6a 65 63 74 2d 63 6f 64 65 22 2c 20 30 29 29 3b  ject-code", 0));
4700: 0a 20 20 70 72 69 6e 74 66 28 22 73 65 72 76 65  .  printf("serve
4710: 72 2d 69 64 3a 20 20 25 73 5c 6e 22 2c 20 64 62  r-id:  %s\n", db
4720: 5f 67 65 74 28 22 73 65 72 76 65 72 2d 63 6f 64  _get("server-cod
4730: 65 22 2c 20 30 29 29 3b 0a 20 20 70 72 69 6e 74  e", 0));.  print
4740: 66 28 22 61 64 6d 69 6e 2d 75 73 65 72 3a 20 25  f("admin-user: %
4750: 73 20 28 6e 6f 20 70 61 73 73 77 6f 72 64 20 73  s (no password s
4760: 65 74 20 79 65 74 21 29 5c 6e 22 2c 20 67 2e 7a  et yet!)\n", g.z
4770: 4c 6f 67 69 6e 29 3b 0a 20 20 70 72 69 6e 74 66  Login);.  printf
4780: 28 22 62 61 73 65 6c 69 6e 65 3a 20 20 20 25 73  ("baseline:   %s
4790: 5c 6e 22 2c 20 64 62 5f 74 65 78 74 28 30 2c 20  \n", db_text(0, 
47a0: 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f  "SELECT uuid FRO
47b0: 4d 20 62 6c 6f 62 22 29 29 3b 0a 7d 0a 0a 2f 2a  M blob"));.}../*
47c0: 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  .** SQL function
47d0: 73 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e  s for debugging.
47e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 69 6e 74  .**.** The print
47f0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  () function writ
4800: 65 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 73  es its arguments
4810: 20 6f 6e 20 73 74 64 6f 75 74 2c 20 62 75 74 20   on stdout, but 
4820: 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 65 20 2d  only.** if the -
4830: 73 71 6c 70 72 69 6e 74 20 63 6f 6d 6d 61 6e 64  sqlprint command
4840: 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 69 73 20  -line option is 
4850: 74 75 72 6e 65 64 20 6f 6e 2e 0a 2a 2f 0a 73 74  turned on..*/.st
4860: 61 74 69 63 20 76 6f 69 64 20 64 62 5f 73 71 6c  atic void db_sql
4870: 5f 70 72 69 6e 74 28 0a 20 20 73 71 6c 69 74 65  _print(.  sqlite
4880: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
4890: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
48a0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
48b0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
48c0: 69 3b 0a 20 20 69 66 28 20 67 2e 66 53 71 6c 50  i;.  if( g.fSqlP
48d0: 72 69 6e 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  rint ){.    for(
48e0: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
48f0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 63 20  ){.      char c 
4900: 3d 20 69 3d 3d 61 72 67 63 2d 31 20 3f 20 27 5c  = i==argc-1 ? '\
4910: 6e 27 20 3a 20 27 20 27 3b 0a 20 20 20 20 20 20  n' : ' ';.      
4920: 70 72 69 6e 74 66 28 22 25 73 25 63 22 2c 20 73  printf("%s%c", s
4930: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
4940: 74 28 61 72 67 76 5b 69 5d 29 2c 20 63 29 3b 0a  t(argv[i]), c);.
4950: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
4960: 69 63 20 76 6f 69 64 20 64 62 5f 73 71 6c 5f 74  ic void db_sql_t
4970: 72 61 63 65 28 76 6f 69 64 20 2a 6e 6f 74 55 73  race(void *notUs
4980: 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ed, const char *
4990: 7a 53 71 6c 29 7b 0a 20 20 70 72 69 6e 74 66 28  zSql){.  printf(
49a0: 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 7d  "%s\n", zSql);.}
49b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
49c0: 75 73 65 64 20 62 79 20 74 68 65 20 5b 63 6f 6d  used by the [com
49d0: 6d 69 74 5d 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  mit] command..**
49e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
49f0: 69 66 20 65 69 74 68 65 72 3a 0a 2a 2a 0a 2a 2a  if either:.**.**
4a00: 20 20 20 20 20 61 29 20 47 6c 6f 62 61 6c 2e 61       a) Global.a
4a10: 43 6f 6d 6d 69 74 46 69 6c 65 20 69 73 20 4e 55  CommitFile is NU
4a20: 4c 4c 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 62 29  LL, or.**     b)
4a30: 20 47 6c 6f 62 61 6c 2e 61 43 6f 6d 6d 69 74 46   Global.aCommitF
4a40: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ile contains the
4a50: 20 69 6e 74 65 67 65 72 20 70 61 73 73 65 64 20   integer passed 
4a60: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
4a70: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  **.** Otherwise 
4a80: 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f  return false..*/
4a90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6c  .static void fil
4aa0: 65 5f 69 73 5f 73 65 6c 65 63 74 65 64 28 0a 20  e_is_selected(. 
4ab0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
4ac0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
4ad0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
4ae0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
4af0: 0a 20 20 61 73 73 65 72 74 28 61 72 67 63 3d 3d  .  assert(argc==
4b00: 31 29 3b 0a 20 20 69 66 28 20 67 2e 61 43 6f 6d  1);.  if( g.aCom
4b10: 6d 69 74 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  mitFile ){.    i
4b20: 6e 74 20 69 49 64 20 3d 20 73 71 6c 69 74 65 33  nt iId = sqlite3
4b30: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
4b40: 30 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b  0]);.    int ii;
4b50: 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 67  .    for(ii=0; g
4b60: 2e 61 43 6f 6d 6d 69 74 46 69 6c 65 5b 69 69 5d  .aCommitFile[ii]
4b70: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ; ii++){.      i
4b80: 66 28 20 69 49 64 3d 3d 67 2e 61 43 6f 6d 6d 69  f( iId==g.aCommi
4b90: 74 46 69 6c 65 5b 69 69 5d 20 29 7b 0a 20 20 20  tFile[ii] ){.   
4ba0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
4bb0: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
4bc0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   1);.        ret
4bd0: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
4be0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72   }.    sqlite3_r
4bf0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
4c00: 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t, 0);.  }else{.
4c10: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4c20: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
4c30: 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
4c40: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4c50: 65 67 69 73 74 65 72 73 20 61 75 78 69 6c 69 61  egisters auxilia
4c60: 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65  ry functions whe
4c70: 6e 20 74 68 65 20 53 51 4c 69 74 65 0a 2a 2a 20  n the SQLite.** 
4c80: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4c90: 69 6f 6e 20 69 73 20 66 69 72 73 74 20 65 73 74  ion is first est
4ca0: 61 62 6c 69 73 68 65 64 2e 0a 2a 2f 0a 4c 4f 43  ablished..*/.LOC
4cb0: 41 4c 20 76 6f 69 64 20 64 62 5f 63 6f 6e 6e 65  AL void db_conne
4cc0: 63 74 69 6f 6e 5f 69 6e 69 74 28 76 6f 69 64 29  ction_init(void)
4cd0: 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6f  {.  static int o
4ce0: 6e 63 65 20 3d 20 31 3b 0a 20 20 69 66 28 20 6f  nce = 1;.  if( o
4cf0: 6e 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nce ){.    sqlit
4d00: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
4d10: 6f 6e 28 67 2e 64 62 2c 20 22 70 72 69 6e 74 22  on(g.db, "print"
4d20: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
4d30: 38 2c 20 30 2c 64 62 5f 73 71 6c 5f 70 72 69 6e  8, 0,db_sql_prin
4d40: 74 2c 30 2c 30 29 3b 0a 20 20 20 20 73 71 6c 69  t,0,0);.    sqli
4d50: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
4d60: 69 6f 6e 28 0a 20 20 20 20 20 20 67 2e 64 62 2c  ion(.      g.db,
4d70: 20 22 66 69 6c 65 5f 69 73 5f 73 65 6c 65 63 74   "file_is_select
4d80: 65 64 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  ed", 1, SQLITE_U
4d90: 54 46 38 2c 20 30 2c 20 66 69 6c 65 5f 69 73 5f  TF8, 0, file_is_
4da0: 73 65 6c 65 63 74 65 64 2c 30 2c 30 0a 20 20 20  selected,0,0.   
4db0: 20 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 66 53   );.    if( g.fS
4dc0: 71 6c 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  qlTrace ){.     
4dd0: 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 67   sqlite3_trace(g
4de0: 2e 64 62 2c 20 64 62 5f 73 71 6c 5f 74 72 61 63  .db, db_sql_trac
4df0: 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 0);.    }.   
4e00: 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d   once = 0;.  }.}
4e10: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 64 20  ../*.** Get and 
4e20: 73 65 74 20 76 61 6c 75 65 73 20 66 72 6f 6d 20  set values from 
4e30: 74 68 65 20 43 4f 4e 46 49 47 2c 20 47 4c 4f 42  the CONFIG, GLOB
4e40: 41 4c 5f 43 4f 4e 46 49 47 20 61 6e 64 20 56 56  AL_CONFIG and VV
4e50: 41 52 20 74 61 62 6c 65 20 69 6e 20 74 68 65 0a  AR table in the.
4e60: 2a 2a 20 72 65 70 6f 73 69 74 6f 72 79 20 61 6e  ** repository an
4e70: 64 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65  d local database
4e80: 73 2e 0a 2a 2f 0a 63 68 61 72 20 2a 64 62 5f 67  s..*/.char *db_g
4e90: 65 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  et(const char *z
4ea0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
4eb0: 20 2a 7a 44 65 66 61 75 6c 74 29 7b 0a 20 20 72   *zDefault){.  r
4ec0: 65 74 75 72 6e 20 64 62 5f 74 65 78 74 28 28 63  eturn db_text((c
4ed0: 68 61 72 2a 29 7a 44 65 66 61 75 6c 74 2c 20 0a  har*)zDefault, .
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46   "SELECT value F
4f00: 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45  ROM config WHERE
4f10: 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65   name=%Q", zName
4f20: 29 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 73 65 74  );.}.void db_set
4f30: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
4f40: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
4f50: 7a 56 61 6c 75 65 29 7b 0a 20 20 64 62 5f 6d 75  zValue){.  db_mu
4f60: 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43  lti_exec("REPLAC
4f70: 45 20 49 4e 54 4f 20 63 6f 6e 66 69 67 28 6e 61  E INTO config(na
4f80: 6d 65 2c 76 61 6c 75 65 29 20 56 41 4c 55 45 53  me,value) VALUES
4f90: 28 25 51 2c 25 51 29 22 2c 20 7a 4e 61 6d 65 2c  (%Q,%Q)", zName,
4fa0: 20 7a 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e 74 20   zValue);.}.int 
4fb0: 64 62 5f 67 65 74 5f 69 6e 74 28 63 6f 6e 73 74  db_get_int(const
4fc0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
4fd0: 74 20 64 66 6c 74 29 7b 0a 20 20 72 65 74 75 72  t dflt){.  retur
4fe0: 6e 20 64 62 5f 69 6e 74 28 64 66 6c 74 2c 20 22  n db_int(dflt, "
4ff0: 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f  SELECT value FRO
5000: 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e  M config WHERE n
5010: 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b  ame=%Q", zName);
5020: 0a 7d 0a 76 6f 69 64 20 64 62 5f 73 65 74 5f 69  .}.void db_set_i
5030: 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  nt(const char *z
5040: 4e 61 6d 65 2c 20 69 6e 74 20 76 61 6c 75 65 29  Name, int value)
5050: 7b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65  {.  db_multi_exe
5060: 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  c("REPLACE INTO 
5070: 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c 75  config(name,valu
5080: 65 29 20 56 41 4c 55 45 53 28 25 51 2c 25 64 29  e) VALUES(%Q,%d)
5090: 22 2c 20 7a 4e 61 6d 65 2c 20 76 61 6c 75 65 29  ", zName, value)
50a0: 3b 0a 7d 0a 63 68 61 72 20 2a 64 62 5f 67 6c 6f  ;.}.char *db_glo
50b0: 62 61 6c 5f 67 65 74 28 63 6f 6e 73 74 20 63 68  bal_get(const ch
50c0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
50d0: 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 29   char *zDefault)
50e0: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 5f 74 65  {.  return db_te
50f0: 78 74 28 28 63 68 61 72 2a 29 7a 44 65 66 61 75  xt((char*)zDefau
5100: 6c 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  lt, .           
5110: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 76 61        "SELECT va
5120: 6c 75 65 20 46 52 4f 4d 20 67 6c 6f 62 61 6c 5f  lue FROM global_
5130: 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d  config WHERE nam
5140: 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 7d  e=%Q", zName);.}
5150: 0a 76 6f 69 64 20 64 62 5f 67 6c 6f 62 61 6c 5f  .void db_global_
5160: 73 65 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  set(const char *
5170: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
5180: 72 20 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 64 62  r *zValue){.  db
5190: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 52 45 50  _multi_exec("REP
51a0: 4c 41 43 45 20 49 4e 54 4f 20 67 6c 6f 62 61 6c  LACE INTO global
51b0: 5f 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c  _config(name,val
51c0: 75 65 29 22 0a 20 20 20 20 20 20 20 20 20 20 20  ue)".           
51d0: 20 20 20 20 20 22 56 41 4c 55 45 53 28 25 51 2c       "VALUES(%Q,
51e0: 25 51 29 22 2c 20 7a 4e 61 6d 65 2c 20 7a 56 61  %Q)", zName, zVa
51f0: 6c 75 65 29 3b 0a 7d 0a 63 68 61 72 20 2a 64 62  lue);.}.char *db
5200: 5f 6c 67 65 74 28 63 6f 6e 73 74 20 63 68 61 72  _lget(const char
5210: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
5220: 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 29 7b 0a  har *zDefault){.
5230: 20 20 72 65 74 75 72 6e 20 64 62 5f 74 65 78 74    return db_text
5240: 28 28 63 68 61 72 2a 29 7a 44 65 66 61 75 6c 74  ((char*)zDefault
5250: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
5260: 20 20 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75      "SELECT valu
5270: 65 20 46 52 4f 4d 20 76 76 61 72 20 57 48 45 52  e FROM vvar WHER
5280: 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d  E name=%Q", zNam
5290: 65 29 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 6c 73  e);.}.void db_ls
52a0: 65 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  et(const char *z
52b0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
52c0: 20 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 64 62 5f   *zValue){.  db_
52d0: 6d 75 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c  multi_exec("REPL
52e0: 41 43 45 20 49 4e 54 4f 20 76 76 61 72 28 6e 61  ACE INTO vvar(na
52f0: 6d 65 2c 76 61 6c 75 65 29 20 56 41 4c 55 45 53  me,value) VALUES
5300: 28 25 51 2c 25 51 29 22 2c 20 7a 4e 61 6d 65 2c  (%Q,%Q)", zName,
5310: 20 7a 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e 74 20   zValue);.}.int 
5320: 64 62 5f 6c 67 65 74 5f 69 6e 74 28 63 6f 6e 73  db_lget_int(cons
5330: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
5340: 6e 74 20 64 66 6c 74 29 7b 0a 20 20 72 65 74 75  nt dflt){.  retu
5350: 72 6e 20 64 62 5f 69 6e 74 28 64 66 6c 74 2c 20  rn db_int(dflt, 
5360: 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52  "SELECT value FR
5370: 4f 4d 20 76 76 61 72 20 57 48 45 52 45 20 6e 61  OM vvar WHERE na
5380: 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a  me=%Q", zName);.
5390: 7d 0a 76 6f 69 64 20 64 62 5f 6c 73 65 74 5f 69  }.void db_lset_i
53a0: 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  nt(const char *z
53b0: 4e 61 6d 65 2c 20 69 6e 74 20 76 61 6c 75 65 29  Name, int value)
53c0: 7b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65  {.  db_multi_exe
53d0: 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  c("REPLACE INTO 
53e0: 76 76 61 72 28 6e 61 6d 65 2c 76 61 6c 75 65 29  vvar(name,value)
53f0: 20 56 41 4c 55 45 53 28 25 51 2c 25 64 29 22 2c   VALUES(%Q,%d)",
5400: 20 7a 4e 61 6d 65 2c 20 76 61 6c 75 65 29 3b 0a   zName, value);.
5410: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44  }../*.** COMMAND
5420: 3a 20 6f 70 65 6e 0a 2a 2a 0a 2a 2a 20 43 72 65  : open.**.** Cre
5430: 61 74 65 20 61 20 6e 65 77 20 6c 6f 63 61 6c 20  ate a new local 
5440: 72 65 70 6f 73 69 74 6f 72 79 2e 0a 2a 2f 0a 76  repository..*/.v
5450: 6f 69 64 20 63 6d 64 5f 6f 70 65 6e 28 76 6f 69  oid cmd_open(voi
5460: 64 29 7b 0a 20 20 42 6c 6f 62 20 70 61 74 68 3b  d){.  Blob path;
5470: 0a 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d 33  .  if( g.argc!=3
5480: 20 29 7b 0a 20 20 20 20 75 73 61 67 65 28 22 52   ){.    usage("R
5490: 45 50 4f 53 49 54 4f 52 59 2d 46 49 4c 45 4e 41  EPOSITORY-FILENA
54a0: 4d 45 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ME");.  }.  if( 
54b0: 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 29 20  db_open_local() 
54c0: 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61  ){.    fossil_pa
54d0: 6e 69 63 28 22 61 6c 72 65 61 64 79 20 77 69 74  nic("already wit
54e0: 68 69 6e 20 61 6e 20 6f 70 65 6e 20 74 72 65 65  hin an open tree
54f0: 20 72 6f 6f 74 65 64 20 61 74 20 25 73 22 2c 20   rooted at %s", 
5500: 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20  g.zLocalRoot);. 
5510: 20 7d 0a 20 20 66 69 6c 65 5f 63 61 6e 6f 6e 69   }.  file_canoni
5520: 63 61 6c 5f 6e 61 6d 65 28 67 2e 61 72 67 76 5b  cal_name(g.argv[
5530: 32 5d 2c 20 26 70 61 74 68 29 3b 0a 20 20 64 62  2], &path);.  db
5540: 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79  _open_repository
5550: 28 62 6c 6f 62 5f 73 74 72 28 26 70 61 74 68 29  (blob_str(&path)
5560: 29 3b 0a 20 20 64 62 5f 69 6e 69 74 5f 64 61 74  );.  db_init_dat
5570: 61 62 61 73 65 28 22 2e 2f 5f 46 4f 53 53 49 4c  abase("./_FOSSIL
5580: 5f 22 2c 20 7a 4c 6f 63 61 6c 53 63 68 65 6d 61  _", zLocalSchema
5590: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 64  , (char*)0);.  d
55a0: 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 29 3b 0a  b_open_local();.
55b0: 20 20 64 62 5f 6c 73 65 74 28 22 72 65 70 6f 73    db_lset("repos
55c0: 69 74 6f 72 79 22 2c 20 62 6c 6f 62 5f 73 74 72  itory", blob_str
55d0: 28 26 70 61 74 68 29 29 3b 0a 20 20 64 62 5f 6c  (&path));.  db_l
55e0: 73 65 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75  set_int("checkou
55f0: 74 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  t", 1);.}../*.**
5600: 20 43 4f 4d 4d 41 4e 44 3a 20 63 6f 6e 66 69 67   COMMAND: config
5610: 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 72 20 63  .**.** List or c
5620: 68 61 6e 67 65 20 74 68 65 20 67 6c 6f 62 61 6c  hange the global
5630: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   configuration s
5640: 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a 76 6f 69 64  ettings..*/.void
5650: 20 63 6d 64 5f 63 6f 6e 66 69 67 28 76 6f 69 64   cmd_config(void
5660: 29 7b 0a 20 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e  ){.  db_open_con
5670: 66 69 67 28 29 3b 0a 20 20 69 66 28 20 67 2e 61  fig();.  if( g.a
5680: 72 67 63 3e 32 20 29 7b 0a 20 20 20 20 69 6e 74  rgc>2 ){.    int
5690: 20 69 3b 0a 20 20 20 20 64 62 5f 62 65 67 69 6e   i;.    db_begin
56a0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a  _transaction();.
56b0: 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 67      for(i=2; i<g
56c0: 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  .argc; i++){.   
56d0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20     char *zName, 
56e0: 2a 7a 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 69  *zValue;.      i
56f0: 6e 74 20 6a 3b 0a 0a 20 20 20 20 20 20 7a 4e 61  nt j;..      zNa
5700: 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73  me = mprintf("%s
5710: 22 2c 20 67 2e 61 72 67 76 5b 69 5d 29 3b 0a 20  ", g.argv[i]);. 
5720: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 4e       for(j=0; zN
5730: 61 6d 65 5b 6a 5d 20 26 26 20 7a 4e 61 6d 65 5b  ame[j] && zName[
5740: 6a 5d 21 3d 27 3d 27 3b 20 6a 2b 2b 29 7b 7d 0a  j]!='='; j++){}.
5750: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b        if( zName[
5760: 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e  j] ){.        zN
5770: 61 6d 65 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  ame[j] = 0;.    
5780: 20 20 20 20 7a 56 61 6c 75 65 20 3d 20 26 7a 4e      zValue = &zN
5790: 61 6d 65 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20 20  ame[j+1];.      
57a0: 20 20 69 66 28 20 7a 56 61 6c 75 65 5b 30 5d 20    if( zValue[0] 
57b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 5f  ){.          db_
57c0: 67 6c 6f 62 61 6c 5f 73 65 74 28 7a 4e 61 6d 65  global_set(zName
57d0: 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  , zValue);.     
57e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
57f0: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
5800: 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 67  c("DELETE FROM g
5810: 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 57 48 45  lobal_config WHE
5820: 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61  RE name=%Q", zNa
5830: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
5840: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 56 61       }.      zVa
5850: 6c 75 65 20 3d 20 64 62 5f 67 6c 6f 62 61 6c 5f  lue = db_global_
5860: 67 65 74 28 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  get(zName, 0);. 
5870: 20 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 20       if( zValue 
5880: 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
5890: 66 28 22 25 73 3d 25 73 5c 6e 22 2c 20 7a 4e 61  f("%s=%s\n", zNa
58a0: 6d 65 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20 20  me, zValue);.   
58b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
58c0: 20 20 70 72 69 6e 74 66 28 22 25 73 20 69 73 20    printf("%s is 
58d0: 75 6e 64 65 66 69 6e 65 64 5c 6e 22 2c 20 7a 4e  undefined\n", zN
58e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
58f0: 20 20 7d 0a 20 20 20 20 64 62 5f 65 6e 64 5f 74    }.    db_end_t
5900: 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20  ransaction(0);. 
5910: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53 74 6d 74   }else{.    Stmt
5920: 20 71 3b 0a 20 20 20 20 64 62 5f 70 72 65 70 61   q;.    db_prepa
5930: 72 65 28 26 71 2c 20 22 53 45 4c 45 43 54 20 6e  re(&q, "SELECT n
5940: 61 6d 65 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20  ame, value FROM 
5950: 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 4f 52  global_config OR
5960: 44 45 52 20 42 59 20 6e 61 6d 65 22 29 3b 0a 20  DER BY name");. 
5970: 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65     while( db_ste
5980: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
5990: 57 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74  W ){.      print
59a0: 66 28 22 25 73 3d 25 73 5c 6e 22 2c 20 64 62 5f  f("%s=%s\n", db_
59b0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
59c0: 30 29 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  0), db_column_te
59d0: 78 74 28 26 71 2c 20 31 29 29 3b 0a 20 20 20 20  xt(&q, 1));.    
59e0: 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a  }.    db_finaliz
59f0: 65 28 26 71 29 3b 0a 20 20 7d 0a 7d 0a           e(&q);.  }.}.