Hex Artifact Content
Not logged in

Artifact c864ef2a7b20278ab053c54129f79d26f8bb79ae:

File src/db.c part of check-in [55dc2abc60] - Some elements moved to correct order in wiki AllowedMarkup array. Removed hardcoded link in resolveHyperlink and also made it handle outside links, such as http, ftp, mailto, etc... When looking for valid HTML codes, I changed isalpha to isalnum so that H1, H2, etc... would be recognized. Better code for setting inital checkout db entry. by jnc on 2007-09-24 01:38:45.

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 66 6e 64 65 66 20 5f 5f 4d  g.h".#ifndef __M
04e0: 49 4e 47 57 33 32 5f 5f 0a 23 20 20 69 6e 63 6c  INGW32__.#  incl
04f0: 75 64 65 20 3c 70 77 64 2e 68 3e 0a 23 65 6e 64  ude <pwd.h>.#end
0500: 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 73 71 6c  if.#include <sql
0510: 69 74 65 33 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ite3.h>.#include
0520: 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23   <sys/types.h>.#
0530: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61  include <sys/sta
0540: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75  t.h>.#include <u
0550: 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64  nistd.h>.#includ
0560: 65 20 22 64 62 2e 68 22 0a 0a 23 69 66 20 49 4e  e "db.h"..#if IN
0570: 54 45 52 46 41 43 45 0a 2f 2a 0a 2a 2a 20 41 6e  TERFACE./*.** An
0580: 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74   single SQL stat
0590: 65 6d 65 6e 74 20 69 73 20 72 65 70 72 65 73 65  ement is represe
05a0: 6e 74 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61  nted as an insta
05b0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
05c0: 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  wing.** structur
05d0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 74 6d  e..*/.struct Stm
05e0: 74 20 7b 0a 20 20 42 6c 6f 62 20 73 71 6c 3b 20  t {.  Blob sql; 
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0600: 20 54 68 65 20 53 51 4c 20 66 6f 72 20 74 68 69   The SQL for thi
0610: 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  s statement */. 
0620: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
0630: 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  Stmt;    /* The 
0640: 72 65 73 75 6c 74 73 20 6f 66 20 73 71 6c 69 74  results of sqlit
0650: 65 33 5f 70 72 65 70 61 72 65 28 29 20 2a 2f 0a  e3_prepare() */.
0660: 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 49 4e 54  };.#endif /* INT
0670: 45 52 46 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ERFACE */../*.**
0680: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
0690: 6e 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61  ne when a databa
06a0: 73 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  se error occurs.
06b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
06c0: 64 62 5f 65 72 72 28 63 6f 6e 73 74 20 63 68 61  db_err(const cha
06d0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
06e0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
06f0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f    char *z;.  va_
0700: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
0710: 74 29 3b 0a 20 20 7a 20 3d 20 76 6d 70 72 69 6e  t);.  z = vmprin
0720: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
0730: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
0740: 20 69 66 28 20 67 2e 63 67 69 50 61 6e 69 63 20   if( g.cgiPanic 
0750: 29 7b 0a 20 20 20 20 67 2e 63 67 69 50 61 6e 69  ){.    g.cgiPani
0760: 63 20 3d 20 30 3b 0a 20 20 20 20 63 67 69 5f 70  c = 0;.    cgi_p
0770: 72 69 6e 74 66 28 22 3c 70 3e 3c 66 6f 6e 74 20  rintf("<p><font 
0780: 63 6f 6c 6f 72 3d 5c 22 72 65 64 5c 22 3e 25 68  color=\"red\">%h
0790: 3c 2f 66 6f 6e 74 3e 3c 2f 70 3e 22 2c 20 7a 29  </font></p>", z)
07a0: 3b 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74  ;.    style_foot
07b0: 65 72 28 29 3b 0a 20 20 20 20 63 67 69 5f 72 65  er();.    cgi_re
07c0: 70 6c 79 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ply();.  }else{.
07d0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
07e0: 72 72 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20  rr, "%s: %s\n", 
07f0: 67 2e 61 72 67 76 5b 30 5d 2c 20 7a 29 3b 0a 20  g.argv[0], z);. 
0800: 20 7d 0a 20 20 64 62 5f 66 6f 72 63 65 5f 72 6f   }.  db_force_ro
0810: 6c 6c 62 61 63 6b 28 29 3b 0a 20 20 65 78 69 74  llback();.  exit
0820: 28 31 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a  (1);.  exit(1);.
0830: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 42  }..static int nB
0840: 65 67 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f  egin = 0;      /
0850: 2a 20 4e 65 73 74 69 6e 67 20 64 65 70 74 68 20  * Nesting depth 
0860: 6f 66 20 42 45 47 49 4e 20 2a 2f 0a 73 74 61 74  of BEGIN */.stat
0870: 69 63 20 69 6e 74 20 64 6f 52 6f 6c 6c 62 61 63  ic int doRollbac
0880: 6b 20 3d 20 30 3b 20 20 2f 2a 20 54 72 75 65 20  k = 0;  /* True 
0890: 74 6f 20 66 6f 72 63 65 20 61 20 72 6f 6c 6c 62  to force a rollb
08a0: 61 63 6b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 65  ack */../*.** Be
08b0: 67 69 6e 20 61 6e 64 20 65 6e 64 20 61 20 6e 65  gin and end a ne
08c0: 73 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  sted transaction
08d0: 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 62 65 67 69  .*/.void db_begi
08e0: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 76 6f  n_transaction(vo
08f0: 69 64 29 7b 0a 20 20 69 66 28 20 6e 42 65 67 69  id){.  if( nBegi
0900: 6e 3d 3d 30 20 29 20 64 62 5f 6d 75 6c 74 69 5f  n==0 ) db_multi_
0910: 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b 0a 20  exec("BEGIN");. 
0920: 20 6e 42 65 67 69 6e 2b 2b 3b 0a 7d 0a 76 6f 69   nBegin++;.}.voi
0930: 64 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63  d db_end_transac
0940: 74 69 6f 6e 28 69 6e 74 20 72 6f 6c 6c 62 61 63  tion(int rollbac
0950: 6b 46 6c 61 67 29 7b 0a 20 20 69 66 28 20 72 6f  kFlag){.  if( ro
0960: 6c 6c 62 61 63 6b 46 6c 61 67 20 29 20 64 6f 52  llbackFlag ) doR
0970: 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 6e  ollback = 1;.  n
0980: 42 65 67 69 6e 2d 2d 3b 0a 20 20 69 66 28 20 6e  Begin--;.  if( n
0990: 42 65 67 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  Begin==0 ){.    
09a0: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 64 6f  db_multi_exec(do
09b0: 52 6f 6c 6c 62 61 63 6b 20 3f 20 22 52 4f 4c 4c  Rollback ? "ROLL
09c0: 42 41 43 4b 22 20 3a 20 22 43 4f 4d 4d 49 54 22  BACK" : "COMMIT"
09d0: 29 3b 0a 20 20 20 20 64 6f 52 6f 6c 6c 62 61 63  );.    doRollbac
09e0: 6b 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  k = 0;.  }.}.voi
09f0: 64 20 64 62 5f 66 6f 72 63 65 5f 72 6f 6c 6c 62  d db_force_rollb
0a00: 61 63 6b 28 76 6f 69 64 29 7b 0a 20 20 69 66 28  ack(void){.  if(
0a10: 20 6e 42 65 67 69 6e 20 29 7b 0a 20 20 20 20 73   nBegin ){.    s
0a20: 71 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64 62  qlite3_exec(g.db
0a30: 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
0a40: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 6e 42   0, 0);.  }.  nB
0a50: 65 67 69 6e 20 3d 20 30 3b 0a 7d 0a 20 0a 2f 2a  egin = 0;.}. ./*
0a60: 0a 2a 2a 20 50 72 65 70 61 72 65 20 6f 72 20 72  .** Prepare or r
0a70: 65 70 72 65 70 61 72 65 20 74 68 65 20 73 71 6c  eprepare the sql
0a80: 69 74 65 33 20 73 74 61 74 65 6d 65 6e 74 20 66  ite3 statement f
0a90: 72 6f 6d 20 74 68 65 20 72 61 77 20 53 51 4c 20  rom the raw SQL 
0aa0: 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  text..*/.static 
0ab0: 76 6f 69 64 20 72 65 70 72 65 70 61 72 65 28 53  void reprepare(S
0ac0: 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 73  tmt *pStmt){.  s
0ad0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4e 65  qlite3_stmt *pNe
0ae0: 77 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  w;.  if( sqlite3
0af0: 5f 70 72 65 70 61 72 65 28 67 2e 64 62 2c 20 62  _prepare(g.db, b
0b00: 6c 6f 62 5f 62 75 66 66 65 72 28 26 70 53 74 6d  lob_buffer(&pStm
0b10: 74 2d 3e 73 71 6c 29 2c 20 2d 31 2c 20 26 70 4e  t->sql), -1, &pN
0b20: 65 77 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20  ew, 0)!=0 ){.   
0b30: 20 64 62 5f 65 72 72 28 22 25 73 5c 6e 25 73 22   db_err("%s\n%s"
0b40: 2c 20 62 6c 6f 62 5f 73 74 72 28 26 70 53 74 6d  , blob_str(&pStm
0b50: 74 2d 3e 73 71 6c 29 2c 20 73 71 6c 69 74 65 33  t->sql), sqlite3
0b60: 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 29 3b 0a  _errmsg(g.db));.
0b70: 20 20 7d 0a 20 20 69 66 28 20 70 53 74 6d 74 2d    }.  if( pStmt-
0b80: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71  >pStmt ){.    sq
0b90: 6c 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62  lite3_transfer_b
0ba0: 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 2d 3e 70  indings(pStmt->p
0bb0: 53 74 6d 74 2c 20 70 4e 65 77 29 3b 0a 20 20 20  Stmt, pNew);.   
0bc0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
0bd0: 65 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b  e(pStmt->pStmt);
0be0: 0a 20 20 7d 0a 20 20 70 53 74 6d 74 2d 3e 70 53  .  }.  pStmt->pS
0bf0: 74 6d 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  tmt = pNew;.}../
0c00: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 53  *.** Prepare a S
0c10: 74 6d 74 2e 20 20 41 73 73 75 6d 65 20 74 68 61  tmt.  Assume tha
0c20: 74 20 74 68 65 20 53 74 6d 74 20 69 73 20 70 72  t the Stmt is pr
0c30: 65 76 69 6f 75 73 6c 79 20 75 6e 69 6e 69 74 69  eviously uniniti
0c40: 61 6c 69 7a 65 64 2e 0a 2a 2a 20 49 66 20 74 68  alized..** If th
0c50: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 63  e input string c
0c60: 6f 6e 74 61 69 6e 73 20 6d 75 6c 74 69 70 6c 65  ontains multiple
0c70: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2c   SQL statements,
0c80: 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 0a   only the first.
0c90: 2a 2a 20 6f 6e 65 20 69 73 20 70 72 6f 63 65 73  ** one is proces
0ca0: 73 65 64 2e 20 20 41 6c 6c 20 73 74 61 74 65 6d  sed.  All statem
0cb0: 65 6e 74 73 20 62 65 79 6f 6e 64 20 74 68 65 20  ents beyond the 
0cc0: 66 69 72 73 74 20 61 72 65 20 73 69 6c 65 6e 74  first are silent
0cd0: 6c 79 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  ly ignored..*/.i
0ce0: 6e 74 20 64 62 5f 76 70 72 65 70 61 72 65 28 53  nt db_vprepare(S
0cf0: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73  tmt *pStmt, cons
0d00: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
0d10: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
0d20: 62 6c 6f 62 5f 7a 65 72 6f 28 26 70 53 74 6d 74  blob_zero(&pStmt
0d30: 2d 3e 73 71 6c 29 3b 0a 20 20 62 6c 6f 62 5f 76  ->sql);.  blob_v
0d40: 61 70 70 65 6e 64 66 28 26 70 53 74 6d 74 2d 3e  appendf(&pStmt->
0d50: 73 71 6c 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  sql, zFormat, ap
0d60: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
0d70: 0a 20 20 70 53 74 6d 74 2d 3e 70 53 74 6d 74 20  .  pStmt->pStmt 
0d80: 3d 20 30 3b 0a 20 20 72 65 70 72 65 70 61 72 65  = 0;.  reprepare
0d90: 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72  (pStmt);.  retur
0da0: 6e 20 30 3b 0a 7d 0a 69 6e 74 20 64 62 5f 70 72  n 0;.}.int db_pr
0db0: 65 70 61 72 65 28 53 74 6d 74 20 2a 70 53 74 6d  epare(Stmt *pStm
0dc0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
0dd0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
0de0: 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 6c 69 73  int rc;.  va_lis
0df0: 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
0e00: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
0e10: 20 72 63 20 3d 20 64 62 5f 76 70 72 65 70 61 72   rc = db_vprepar
0e20: 65 28 70 53 74 6d 74 2c 20 7a 46 6f 72 6d 61 74  e(pStmt, zFormat
0e30: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
0e40: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ap);.  return rc
0e50: 3b 0a 7d 0a 69 6e 74 20 64 62 5f 73 74 61 74 69  ;.}.int db_stati
0e60: 63 5f 70 72 65 70 61 72 65 28 53 74 6d 74 20 2a  c_prepare(Stmt *
0e70: 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61  pStmt, const cha
0e80: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
0e90: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
0ea0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 62 6c  ITE_OK;.  if( bl
0eb0: 6f 62 5f 73 69 7a 65 28 26 70 53 74 6d 74 2d 3e  ob_size(&pStmt->
0ec0: 73 71 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 76  sql)==0 ){.    v
0ed0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 76  a_list ap;.    v
0ee0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
0ef0: 6d 61 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  mat);.    rc = d
0f00: 62 5f 76 70 72 65 70 61 72 65 28 70 53 74 6d 74  b_vprepare(pStmt
0f10: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
0f20: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
0f30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
0f40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0f50: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
0f60: 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72 0a 2a  bind parameter.*
0f70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 72  /.static int par
0f80: 61 6d 49 64 78 28 53 74 6d 74 20 2a 70 53 74 6d  amIdx(Stmt *pStm
0f90: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
0fa0: 50 61 72 61 6d 4e 61 6d 65 29 7b 0a 20 20 69 6e  ParamName){.  in
0fb0: 74 20 69 20 3d 20 73 71 6c 69 74 65 33 5f 62 69  t i = sqlite3_bi
0fc0: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
0fd0: 65 78 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c  ex(pStmt->pStmt,
0fe0: 20 7a 50 61 72 61 6d 4e 61 6d 65 29 3b 0a 20 20   zParamName);.  
0ff0: 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
1000: 64 62 5f 65 72 72 28 22 6e 6f 20 73 75 63 68 20  db_err("no such 
1010: 62 69 6e 64 20 70 61 72 61 6d 65 74 65 72 3a 20  bind parameter: 
1020: 25 73 5c 6e 25 62 22 2c 20 7a 50 61 72 61 6d 4e  %s\n%b", zParamN
1030: 61 6d 65 2c 20 26 70 53 74 6d 74 2d 3e 73 71 6c  ame, &pStmt->sql
1040: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1050: 69 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 42 69 6e 64 20  i;.}./*.** Bind 
1060: 61 6e 20 69 6e 74 65 67 65 72 2c 20 73 74 72 69  an integer, stri
1070: 6e 67 2c 20 6f 72 20 42 6c 6f 62 20 76 61 6c 75  ng, or Blob valu
1080: 65 20 74 6f 20 61 20 6e 61 6d 65 64 20 70 61 72  e to a named par
1090: 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 64  ameter..*/.int d
10a0: 62 5f 62 69 6e 64 5f 69 6e 74 28 53 74 6d 74 20  b_bind_int(Stmt 
10b0: 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68  *pStmt, const ch
10c0: 61 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c 20  ar *zParamName, 
10d0: 69 6e 74 20 69 56 61 6c 75 65 29 7b 0a 20 20 72  int iValue){.  r
10e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 62 69  eturn sqlite3_bi
10f0: 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2d 3e 70 53  nd_int(pStmt->pS
1100: 74 6d 74 2c 20 70 61 72 61 6d 49 64 78 28 70 53  tmt, paramIdx(pS
1110: 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29  tmt, zParamName)
1120: 2c 20 69 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e 74  , iValue);.}.int
1130: 20 64 62 5f 62 69 6e 64 5f 69 6e 74 36 34 28 53   db_bind_int64(S
1140: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73  tmt *pStmt, cons
1150: 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61  t char *zParamNa
1160: 6d 65 2c 20 69 36 34 20 69 56 61 6c 75 65 29 7b  me, i64 iValue){
1170: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1180: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74  3_bind_int64(pSt
1190: 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d  mt->pStmt, param
11a0: 49 64 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61  Idx(pStmt, zPara
11b0: 6d 4e 61 6d 65 29 2c 20 69 56 61 6c 75 65 29 3b  mName), iValue);
11c0: 0a 7d 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 64  .}.int db_bind_d
11d0: 6f 75 62 6c 65 28 53 74 6d 74 20 2a 70 53 74 6d  ouble(Stmt *pStm
11e0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
11f0: 50 61 72 61 6d 4e 61 6d 65 2c 20 64 6f 75 62 6c  ParamName, doubl
1200: 65 20 72 56 61 6c 75 65 29 7b 0a 20 20 72 65 74  e rValue){.  ret
1210: 75 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  urn sqlite3_bind
1220: 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2d 3e 70  _double(pStmt->p
1230: 53 74 6d 74 2c 20 70 61 72 61 6d 49 64 78 28 70  Stmt, paramIdx(p
1240: 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65  Stmt, zParamName
1250: 29 2c 20 72 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e  ), rValue);.}.in
1260: 74 20 64 62 5f 62 69 6e 64 5f 74 65 78 74 28 53  t db_bind_text(S
1270: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73  tmt *pStmt, cons
1280: 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61  t char *zParamNa
1290: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
12a0: 7a 56 61 6c 75 65 29 7b 0a 20 20 72 65 74 75 72  zValue){.  retur
12b0: 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  n sqlite3_bind_t
12c0: 65 78 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74  ext(pStmt->pStmt
12d0: 2c 20 70 61 72 61 6d 49 64 78 28 70 53 74 6d 74  , paramIdx(pStmt
12e0: 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29 2c 20 7a  , zParamName), z
12f0: 56 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20  Value,.         
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1310: 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41    -1, SQLITE_STA
1320: 54 49 43 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 62  TIC);.}.int db_b
1330: 69 6e 64 5f 6e 75 6c 6c 28 53 74 6d 74 20 2a 70  ind_null(Stmt *p
1340: 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  Stmt, const char
1350: 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 29 7b 0a 20   *zParamName){. 
1360: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
1370: 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2d  bind_null(pStmt-
1380: 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d 49 64 78  >pStmt, paramIdx
1390: 28 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61  (pStmt, zParamNa
13a0: 6d 65 29 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 62  me));.}.int db_b
13b0: 69 6e 64 5f 62 6c 6f 62 28 53 74 6d 74 20 2a 70  ind_blob(Stmt *p
13c0: 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  Stmt, const char
13d0: 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c 20 42 6c   *zParamName, Bl
13e0: 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 72 65  ob *pBlob){.  re
13f0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e  turn sqlite3_bin
1400: 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2d 3e 70 53  d_blob(pStmt->pS
1410: 74 6d 74 2c 20 70 61 72 61 6d 49 64 78 28 70 53  tmt, paramIdx(pS
1420: 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29  tmt, zParamName)
1430: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1440: 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62              blob
1450: 5f 62 75 66 66 65 72 28 70 42 6c 6f 62 29 2c 20  _buffer(pBlob), 
1460: 62 6c 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62 29  blob_size(pBlob)
1470: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
1480: 3b 0a 7d 0a 0a 2f 2a 20 62 69 6e 64 5f 73 74 72  ;.}../* bind_str
1490: 28 29 20 74 72 65 61 74 73 20 61 20 42 6c 6f 62  () treats a Blob
14a0: 20 6f 62 6a 65 63 74 20 6c 69 6b 65 20 61 20 54   object like a T
14b0: 45 58 54 20 73 74 72 69 6e 67 20 61 6e 64 20 62  EXT string and b
14c0: 69 6e 64 73 20 69 74 0a 2a 2a 20 74 6f 20 74 68  inds it.** to th
14d0: 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 2e 20  e SQL variable. 
14e0: 20 43 6f 6e 73 74 72 61 73 74 20 74 68 69 73 20   Constrast this 
14f0: 74 6f 20 62 69 6e 64 5f 62 6c 6f 62 28 29 20 77  to bind_blob() w
1500: 68 69 63 68 20 74 72 65 61 74 73 0a 2a 2a 20 74  hich treats.** t
1510: 68 65 20 42 6c 6f 62 20 6f 62 6a 65 63 74 20 6c  he Blob object l
1520: 69 6b 65 20 61 6e 20 53 51 4c 20 42 4c 4f 42 2e  ike an SQL BLOB.
1530: 0a 2a 2f 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f  .*/.int db_bind_
1540: 73 74 72 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c  str(Stmt *pStmt,
1550: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1560: 72 61 6d 4e 61 6d 65 2c 20 42 6c 6f 62 20 2a 70  ramName, Blob *p
1570: 42 6c 6f 62 29 7b 0a 20 20 72 65 74 75 72 6e 20  Blob){.  return 
1580: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
1590: 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20  t(pStmt->pStmt, 
15a0: 70 61 72 61 6d 49 64 78 28 70 53 74 6d 74 2c 20  paramIdx(pStmt, 
15b0: 7a 50 61 72 61 6d 4e 61 6d 65 29 2c 0a 20 20 20  zParamName),.   
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 20 20 20 20 20 62 6c 6f 62 5f 62 75 66 66         blob_buff
15e0: 65 72 28 70 42 6c 6f 62 29 2c 20 62 6c 6f 62 5f  er(pBlob), blob_
15f0: 73 69 7a 65 28 70 42 6c 6f 62 29 2c 20 53 51 4c  size(pBlob), SQL
1600: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a  ITE_STATIC);.}..
1610: 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 53  /*.** Step the S
1620: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52  QL statement.  R
1630: 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c  eturn either SQL
1640: 49 54 45 5f 52 4f 57 20 6f 72 20 61 6e 20 65 72  ITE_ROW or an er
1650: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 6f 72 20 53  ror code.** or S
1660: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20  QLITE_OK if the 
1670: 73 74 61 74 65 6d 65 6e 74 20 66 69 6e 69 73 68  statement finish
1680: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  es successfully.
1690: 0a 2a 2f 0a 69 6e 74 20 64 62 5f 73 74 65 70 28  .*/.int db_step(
16a0: 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20  Stmt *pStmt){.  
16b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16c0: 4f 4b 3b 0a 20 20 69 6e 74 20 6c 69 6d 69 74 20  OK;.  int limit 
16d0: 3d 20 33 3b 0a 20 20 77 68 69 6c 65 28 20 6c 69  = 3;.  while( li
16e0: 6d 69 74 2d 2d 20 29 7b 0a 20 20 20 20 72 63 20  mit-- ){.    rc 
16f0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
1700: 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Stmt->pStmt);.  
1710: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1720: 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
1730: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
1740: 65 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 29  et(pStmt->pStmt)
1750: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1760: 72 63 3d 3d 53 51 4c 49 54 45 5f 53 43 48 45 4d  rc==SQLITE_SCHEM
1770: 41 20 29 7b 0a 20 20 20 20 20 20 72 65 70 72 65  A ){.      repre
1780: 70 61 72 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  pare(pStmt);.   
1790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72   }else{.      br
17a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
17b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17c0: 2a 0a 2a 2a 20 52 65 73 65 74 20 6f 72 20 66 69  *.** Reset or fi
17d0: 6e 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d 65  nalize a stateme
17e0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 72 65  nt..*/.int db_re
17f0: 73 65 74 28 53 74 6d 74 20 2a 70 53 74 6d 74 29  set(Stmt *pStmt)
1800: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
1810: 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
1820: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 64 62 5f 63  ->pStmt);.  db_c
1830: 68 65 63 6b 5f 72 65 73 75 6c 74 28 72 63 29 3b  heck_result(rc);
1840: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1850: 69 6e 74 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28  int db_finalize(
1860: 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20  Stmt *pStmt){.  
1870: 69 6e 74 20 72 63 3b 0a 20 20 62 6c 6f 62 5f 72  int rc;.  blob_r
1880: 65 73 65 74 28 26 70 53 74 6d 74 2d 3e 73 71 6c  eset(&pStmt->sql
1890: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
18a0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
18b0: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 64 62 5f 63  ->pStmt);.  db_c
18c0: 68 65 63 6b 5f 72 65 73 75 6c 74 28 72 63 29 3b  heck_result(rc);
18d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
18f0: 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 6d  e rowid of the m
1900: 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72  ost recent inser
1910: 74 0a 2a 2f 0a 69 36 34 20 64 62 5f 6c 61 73 74  t.*/.i64 db_last
1920: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 76 6f  _insert_rowid(vo
1930: 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  id){.  return sq
1940: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
1950: 74 5f 72 6f 77 69 64 28 67 2e 64 62 29 3b 0a 7d  t_rowid(g.db);.}
1960: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1970: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
1980: 73 20 74 68 61 74 20 77 65 72 65 20 63 68 61 6e  s that were chan
1990: 67 65 64 20 62 79 20 74 68 65 20 6d 6f 73 74 20  ged by the most 
19a0: 72 65 63 65 6e 74 0a 2a 2a 20 49 4e 53 45 52 54  recent.** INSERT
19b0: 2c 20 55 50 44 41 54 45 2c 20 6f 72 20 44 45 4c  , UPDATE, or DEL
19c0: 45 54 45 2e 20 20 41 75 78 69 6c 69 61 72 79 20  ETE.  Auxiliary 
19d0: 63 68 61 6e 67 65 73 20 63 61 75 73 65 64 20 62  changes caused b
19e0: 79 20 74 72 69 67 67 65 72 73 0a 2a 2a 20 6f 72  y triggers.** or
19f0: 20 6f 74 68 65 72 20 73 69 64 65 20 65 66 66 65   other side effe
1a00: 63 74 73 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e  cts are not coun
1a10: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 63  ted..*/.int db_c
1a20: 68 61 6e 67 65 73 28 76 6f 69 64 29 7b 0a 20 20  hanges(void){.  
1a30: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
1a40: 68 61 6e 67 65 73 28 67 2e 64 62 29 3b 0a 7d 0a  hanges(g.db);.}.
1a50: 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20 74  ./*.** Extract t
1a60: 65 78 74 2c 20 69 6e 74 65 67 65 72 2c 20 6f 72  ext, integer, or
1a70: 20 62 6c 6f 62 20 76 61 6c 75 65 73 20 66 72 6f   blob values fro
1a80: 6d 20 74 68 65 20 4e 2d 74 68 20 63 6f 6c 75 6d  m the N-th colum
1a90: 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72  n of the.** curr
1aa0: 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 69 6e 74 20  ent row..*/.int 
1ab0: 64 62 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  db_column_bytes(
1ac0: 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74  Stmt *pStmt, int
1ad0: 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71   N){.  return sq
1ae0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
1af0: 65 73 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c  es(pStmt->pStmt,
1b00: 20 4e 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 63 6f   N);.}.int db_co
1b10: 6c 75 6d 6e 5f 69 6e 74 28 53 74 6d 74 20 2a 70  lumn_int(Stmt *p
1b20: 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  Stmt, int N){.  
1b30: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
1b40: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2d  olumn_int(pStmt-
1b50: 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 69 36  >pStmt, N);.}.i6
1b60: 34 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  4 db_column_int6
1b70: 34 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69  4(Stmt *pStmt, i
1b80: 6e 74 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20  nt N){.  return 
1b90: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
1ba0: 6e 74 36 34 28 70 53 74 6d 74 2d 3e 70 53 74 6d  nt64(pStmt->pStm
1bb0: 74 2c 20 4e 29 3b 0a 7d 0a 64 6f 75 62 6c 65 20  t, N);.}.double 
1bc0: 64 62 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  db_column_double
1bd0: 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e  (Stmt *pStmt, in
1be0: 74 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  t N){.  return s
1bf0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
1c00: 75 62 6c 65 28 70 53 74 6d 74 2d 3e 70 53 74 6d  uble(pStmt->pStm
1c10: 74 2c 20 4e 29 3b 0a 7d 0a 63 6f 6e 73 74 20 63  t, N);.}.const c
1c20: 68 61 72 20 2a 64 62 5f 63 6f 6c 75 6d 6e 5f 74  har *db_column_t
1c30: 65 78 74 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c  ext(Stmt *pStmt,
1c40: 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 74 75 72   int N){.  retur
1c50: 6e 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  n (char*)sqlite3
1c60: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
1c70: 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d  mt->pStmt, N);.}
1c80: 0a 63 68 61 72 20 2a 64 62 5f 63 6f 6c 75 6d 6e  .char *db_column
1c90: 5f 6d 61 6c 6c 6f 63 28 53 74 6d 74 20 2a 70 53  _malloc(Stmt *pS
1ca0: 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72  tmt, int N){.  r
1cb0: 65 74 75 72 6e 20 6d 70 72 69 6e 74 66 28 22 25  eturn mprintf("%
1cc0: 73 22 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  s", db_column_te
1cd0: 78 74 28 70 53 74 6d 74 2c 20 4e 29 29 3b 0a 7d  xt(pStmt, N));.}
1ce0: 0a 76 6f 69 64 20 64 62 5f 63 6f 6c 75 6d 6e 5f  .void db_column_
1cf0: 62 6c 6f 62 28 53 74 6d 74 20 2a 70 53 74 6d 74  blob(Stmt *pStmt
1d00: 2c 20 69 6e 74 20 4e 2c 20 42 6c 6f 62 20 2a 70  , int N, Blob *p
1d10: 42 6c 6f 62 29 7b 0a 20 20 62 6c 6f 62 5f 61 70  Blob){.  blob_ap
1d20: 70 65 6e 64 28 70 42 6c 6f 62 2c 20 73 71 6c 69  pend(pBlob, sqli
1d30: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  te3_column_blob(
1d40: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29  pStmt->pStmt, N)
1d50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d60: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1d70: 79 74 65 73 28 70 53 74 6d 74 2d 3e 70 53 74 6d  ytes(pStmt->pStm
1d80: 74 2c 20 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  t, N));.}../*.**
1d90: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 62 6c   Initialize a bl
1da0: 6f 62 20 74 6f 20 61 6e 20 65 70 68 65 72 6d 65  ob to an epherme
1db0: 72 61 6c 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ral copy of the 
1dc0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 0a 2a 2a 20  content of a.** 
1dd0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 63 75  column in the cu
1de0: 72 72 65 6e 74 20 72 6f 77 2e 20 20 54 68 65 20  rrent row.  The 
1df0: 64 61 74 61 20 69 6e 20 74 68 65 20 62 6c 6f 62  data in the blob
1e00: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20   will become.** 
1e10: 69 6e 76 61 6c 69 64 20 77 68 65 6e 20 74 68 65  invalid when the
1e20: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74   statement is st
1e30: 65 70 70 65 64 20 6f 72 20 72 65 73 65 74 2e 0a  epped or reset..
1e40: 2a 2f 0a 76 6f 69 64 20 64 62 5f 65 70 68 65 6d  */.void db_ephem
1e50: 65 72 61 6c 5f 62 6c 6f 62 28 53 74 6d 74 20 2a  eral_blob(Stmt *
1e60: 70 53 74 6d 74 2c 20 69 6e 74 20 4e 2c 20 42 6c  pStmt, int N, Bl
1e70: 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 62 6c  ob *pBlob){.  bl
1e80: 6f 62 5f 69 6e 69 74 28 70 42 6c 6f 62 2c 20 73  ob_init(pBlob, s
1e90: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
1ea0: 6f 62 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c  ob(pStmt->pStmt,
1eb0: 20 4e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   N),.           
1ec0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
1ed0: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2d 3e 70  n_bytes(pStmt->p
1ee0: 53 74 6d 74 2c 20 4e 29 29 3b 0a 7d 0a 0a 2f 2a  Stmt, N));.}../*
1ef0: 0a 2a 2a 20 43 68 65 63 6b 20 61 20 72 65 73 75  .** Check a resu
1f00: 6c 74 20 63 6f 64 65 2e 20 20 49 66 20 69 74 20  lt code.  If it 
1f10: 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
1f20: 2c 20 70 72 69 6e 74 20 74 68 65 0a 2a 2a 20 63  , print the.** c
1f30: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 72 72  orresponding err
1f40: 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 65  or message and e
1f50: 78 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f  xit..*/.void db_
1f60: 63 68 65 63 6b 5f 72 65 73 75 6c 74 28 69 6e 74  check_result(int
1f70: 20 72 63 29 7b 0a 20 20 69 66 28 20 72 63 21 3d   rc){.  if( rc!=
1f80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f90: 20 64 62 5f 65 72 72 28 22 53 51 4c 20 65 72 72   db_err("SQL err
1fa0: 6f 72 3a 20 25 73 22 2c 20 73 71 6c 69 74 65 33  or: %s", sqlite3
1fb0: 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 29 3b 0a  _errmsg(g.db));.
1fc0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65    }.}../*.** Exe
1fd0: 63 75 74 65 20 61 20 73 69 6e 67 6c 65 20 70 72  cute a single pr
1fe0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1ff0: 20 75 6e 74 69 6c 20 69 74 20 66 69 6e 69 73 68   until it finish
2000: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 65 78  es..*/.int db_ex
2010: 65 63 28 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b  ec(Stmt *pStmt){
2020: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 68 69  .  int rc;.  whi
2030: 6c 65 28 20 28 72 63 20 3d 20 64 62 5f 73 74 65  le( (rc = db_ste
2040: 70 28 70 53 74 6d 74 29 29 3d 3d 53 51 4c 49 54  p(pStmt))==SQLIT
2050: 45 5f 52 4f 57 20 29 7b 7d 0a 20 20 72 63 20 3d  E_ROW ){}.  rc =
2060: 20 64 62 5f 72 65 73 65 74 28 70 53 74 6d 74 29   db_reset(pStmt)
2070: 3b 0a 20 20 64 62 5f 63 68 65 63 6b 5f 72 65 73  ;.  db_check_res
2080: 75 6c 74 28 72 63 29 3b 0a 20 20 72 65 74 75 72  ult(rc);.  retur
2090: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
20a0: 78 65 63 75 74 65 20 6d 75 6c 74 69 70 6c 65 20  xecute multiple 
20b0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  SQL statements..
20c0: 2a 2f 0a 69 6e 74 20 64 62 5f 6d 75 6c 74 69 5f  */.int db_multi_
20d0: 65 78 65 63 28 63 6f 6e 73 74 20 63 68 61 72 20  exec(const char 
20e0: 2a 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 42  *zSql, ...){.  B
20f0: 6c 6f 62 20 73 71 6c 3b 0a 20 20 69 6e 74 20 72  lob sql;.  int r
2100: 63 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  c;.  va_list ap;
2110: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
2120: 30 3b 0a 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26  0;.  blob_init(&
2130: 73 71 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 76 61  sql, 0, 0);.  va
2140: 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29  _start(ap, zSql)
2150: 3b 0a 20 20 62 6c 6f 62 5f 76 61 70 70 65 6e 64  ;.  blob_vappend
2160: 66 28 26 73 71 6c 2c 20 7a 53 71 6c 2c 20 61 70  f(&sql, zSql, ap
2170: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
2180: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2190: 65 78 65 63 28 67 2e 64 62 2c 20 62 6c 6f 62 5f  exec(g.db, blob_
21a0: 62 75 66 66 65 72 28 26 73 71 6c 29 2c 20 30 2c  buffer(&sql), 0,
21b0: 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66   0, &zErr);.  if
21c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21d0: 29 7b 0a 20 20 20 20 64 62 5f 65 72 72 28 22 25  ){.    db_err("%
21e0: 73 5c 6e 25 73 22 2c 20 7a 45 72 72 2c 20 62 6c  s\n%s", zErr, bl
21f0: 6f 62 5f 62 75 66 66 65 72 28 26 73 71 6c 29 29  ob_buffer(&sql))
2200: 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73  ;.  }.  blob_res
2210: 65 74 28 26 73 71 6c 29 3b 0a 20 20 72 65 74 75  et(&sql);.  retu
2220: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2230: 45 78 65 63 75 74 65 20 61 20 71 75 65 72 79 20  Execute a query 
2240: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 73 69 6e  and return a sin
2250: 67 6c 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  gle integer valu
2260: 65 2e 0a 2a 2f 0a 69 36 34 20 64 62 5f 69 6e 74  e..*/.i64 db_int
2270: 36 34 28 69 36 34 20 69 44 66 6c 74 2c 20 63 6f  64(i64 iDflt, co
2280: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
2290: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
22a0: 61 70 3b 0a 20 20 53 74 6d 74 20 73 3b 0a 20 20  ap;.  Stmt s;.  
22b0: 69 36 34 20 72 63 3b 0a 20 20 76 61 5f 73 74 61  i64 rc;.  va_sta
22c0: 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a 20 20  rt(ap, zSql);.  
22d0: 64 62 5f 76 70 72 65 70 61 72 65 28 26 73 2c 20  db_vprepare(&s, 
22e0: 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20 76 61 5f  zSql, ap);.  va_
22f0: 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 64  end(ap);.  if( d
2300: 62 5f 73 74 65 70 28 26 73 29 21 3d 53 51 4c 49  b_step(&s)!=SQLI
2310: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 63  TE_ROW ){.    rc
2320: 20 3d 20 69 44 66 6c 74 3b 0a 20 20 7d 65 6c 73   = iDflt;.  }els
2330: 65 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 5f 63  e{.    rc = db_c
2340: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 26 73 2c 20  olumn_int64(&s, 
2350: 30 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e  0);.  }.  db_fin
2360: 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20 72 65 74  alize(&s);.  ret
2370: 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 64 62  urn rc;.}.int db
2380: 5f 69 6e 74 28 69 6e 74 20 69 44 66 6c 74 2c 20  _int(int iDflt, 
2390: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
23a0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
23b0: 74 20 61 70 3b 0a 20 20 53 74 6d 74 20 73 3b 0a  t ap;.  Stmt s;.
23c0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73    int rc;.  va_s
23d0: 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a  tart(ap, zSql);.
23e0: 20 20 64 62 5f 76 70 72 65 70 61 72 65 28 26 73    db_vprepare(&s
23f0: 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20 76  , zSql, ap);.  v
2400: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2410: 20 64 62 5f 73 74 65 70 28 26 73 29 21 3d 53 51   db_step(&s)!=SQ
2420: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
2430: 72 63 20 3d 20 69 44 66 6c 74 3b 0a 20 20 7d 65  rc = iDflt;.  }e
2440: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 64 62  lse{.    rc = db
2450: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 73 2c 20  _column_int(&s, 
2460: 30 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e  0);.  }.  db_fin
2470: 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20 72 65 74  alize(&s);.  ret
2480: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2490: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
24a0: 74 68 65 20 71 75 65 72 79 20 77 6f 75 6c 64 20  the query would 
24b0: 72 65 74 75 72 6e 20 31 20 6f 72 20 6d 6f 72 65  return 1 or more
24c0: 20 72 6f 77 73 2e 20 20 52 65 74 75 72 6e 0a 2a   rows.  Return.*
24d0: 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 71  * FALSE if the q
24e0: 75 65 72 79 20 72 65 73 75 6c 74 20 77 6f 75 6c  uery result woul
24f0: 64 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 65  d be an empty se
2500: 74 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 65 78 69  t..*/.int db_exi
2510: 73 74 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  sts(const char *
2520: 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  zSql, ...){.  va
2530: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d 74  _list ap;.  Stmt
2540: 20 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   s;.  int rc;.  
2550: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 71  va_start(ap, zSq
2560: 6c 29 3b 0a 20 20 64 62 5f 76 70 72 65 70 61 72  l);.  db_vprepar
2570: 65 28 26 73 2c 20 7a 53 71 6c 2c 20 61 70 29 3b  e(&s, zSql, ap);
2580: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
2590: 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 73 29   if( db_step(&s)
25a0: 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  !=SQLITE_ROW ){.
25b0: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 65      rc = 0;.  }e
25c0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  lse{.    rc = 1;
25d0: 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69  .  }.  db_finali
25e0: 7a 65 28 26 73 29 3b 0a 20 20 72 65 74 75 72 6e  ze(&s);.  return
25f0: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45   rc;.}.../*.** E
2600: 78 65 63 75 74 65 20 61 20 71 75 65 72 79 20 61  xecute a query a
2610: 6e 64 20 72 65 74 75 72 6e 20 61 20 66 6c 6f 61  nd return a floa
2620: 74 69 6e 67 2d 70 6f 69 6e 74 20 76 61 6c 75 65  ting-point value
2630: 2e 0a 2a 2f 0a 64 6f 75 62 6c 65 20 64 62 5f 64  ..*/.double db_d
2640: 6f 75 62 6c 65 28 64 6f 75 62 6c 65 20 72 44 66  ouble(double rDf
2650: 6c 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  lt, const char *
2660: 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  zSql, ...){.  va
2670: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d 74  _list ap;.  Stmt
2680: 20 73 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a   s;.  double r;.
2690: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
26a0: 53 71 6c 29 3b 0a 20 20 64 62 5f 76 70 72 65 70  Sql);.  db_vprep
26b0: 61 72 65 28 26 73 2c 20 7a 53 71 6c 2c 20 61 70  are(&s, zSql, ap
26c0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
26d0: 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26  .  if( db_step(&
26e0: 73 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  s)!=SQLITE_ROW )
26f0: 7b 0a 20 20 20 20 72 20 3d 20 72 44 66 6c 74 3b  {.    r = rDflt;
2700: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 20  .  }else{.    r 
2710: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  = db_column_doub
2720: 6c 65 28 26 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  le(&s, 0);.  }. 
2730: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29   db_finalize(&s)
2740: 3b 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  ;.  return r;.}.
2750: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
2760: 20 71 75 65 72 79 20 61 6e 64 20 61 70 70 65 6e   query and appen
2770: 64 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75  d the first colu
2780: 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  mn of the first 
2790: 72 6f 77 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65  row.** of the re
27a0: 73 75 6c 74 20 73 65 74 20 74 6f 20 62 6c 6f 62  sult set to blob
27b0: 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 66 69   given in the fi
27c0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
27d0: 0a 76 6f 69 64 20 64 62 5f 62 6c 6f 62 28 42 6c  .void db_blob(Bl
27e0: 6f 62 20 2a 70 52 65 73 75 6c 74 2c 20 63 6f 6e  ob *pResult, con
27f0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2e  st char *zSql, .
2800: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
2810: 70 3b 0a 20 20 53 74 6d 74 20 73 3b 0a 20 20 76  p;.  Stmt s;.  v
2820: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c  a_start(ap, zSql
2830: 29 3b 0a 20 20 64 62 5f 76 70 72 65 70 61 72 65  );.  db_vprepare
2840: 28 26 73 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a  (&s, zSql, ap);.
2850: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
2860: 69 66 28 20 64 62 5f 73 74 65 70 28 26 73 29 3d  if( db_step(&s)=
2870: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
2880: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70     blob_append(p
2890: 52 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f  Result, sqlite3_
28a0: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 73 2e 70 53  column_blob(s.pS
28b0: 74 6d 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  tmt, 0),.       
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
28e0: 5f 62 79 74 65 73 28 73 2e 70 53 74 6d 74 2c 20  _bytes(s.pStmt, 
28f0: 30 29 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69  0));.  }.  db_fi
2900: 6e 61 6c 69 7a 65 28 26 73 29 3b 0a 7d 0a 0a 2f  nalize(&s);.}../
2910: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71  *.** Execute a q
2920: 75 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 68  uery.  Return th
2930: 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  e first column o
2940: 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a  f the first row.
2950: 2a 2a 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ** of the result
2960: 20 73 65 74 20 61 73 20 61 20 73 74 72 69 6e 67   set as a string
2970: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
2980: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 0a 2a   the string is.*
2990: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
29a0: 6d 61 6c 6c 6f 63 28 29 2e 20 20 49 66 20 74 68  malloc().  If th
29b0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20  e result set is 
29c0: 65 6d 70 74 79 2c 20 72 65 74 75 72 6e 0a 2a 2a  empty, return.**
29d0: 20 7a 44 65 66 61 75 6c 74 20 69 6e 73 74 65 61   zDefault instea
29e0: 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 64 62 5f 74  d..*/.char *db_t
29f0: 65 78 74 28 63 68 61 72 20 2a 7a 44 65 66 61 75  ext(char *zDefau
2a00: 6c 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  lt, const char *
2a10: 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  zSql, ...){.  va
2a20: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d 74  _list ap;.  Stmt
2a30: 20 73 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20   s;.  char *z = 
2a40: 7a 44 65 66 61 75 6c 74 3b 0a 20 20 76 61 5f 73  zDefault;.  va_s
2a50: 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a  tart(ap, zSql);.
2a60: 20 20 64 62 5f 76 70 72 65 70 61 72 65 28 26 73    db_vprepare(&s
2a70: 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20 76  , zSql, ap);.  v
2a80: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2a90: 20 64 62 5f 73 74 65 70 28 26 73 29 3d 3d 53 51   db_step(&s)==SQ
2aa0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
2ab0: 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 22  z = mprintf("%s"
2ac0: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
2ad0: 5f 74 65 78 74 28 73 2e 70 53 74 6d 74 2c 20 30  _text(s.pStmt, 0
2ae0: 29 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e  ));.  }.  db_fin
2af0: 61 6c 69 7a 65 28 26 73 29 3b 0a 20 20 72 65 74  alize(&s);.  ret
2b00: 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
2b10: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  Initialize a new
2b20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
2b30: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 73 63  ith the given sc
2b40: 68 65 6d 61 2e 20 20 49 66 20 61 6e 79 74 68 69  hema.  If anythi
2b50: 6e 67 0a 2a 2a 20 67 6f 65 73 20 77 72 6f 6e 67  ng.** goes wrong
2b60: 2c 20 63 61 6c 6c 20 64 62 5f 65 72 72 28 29 20  , call db_err() 
2b70: 74 6f 20 65 78 69 74 2e 0a 2a 2f 0a 76 6f 69 64  to exit..*/.void
2b80: 20 64 62 5f 69 6e 69 74 5f 64 61 74 61 62 61 73   db_init_databas
2b90: 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
2ba0: 2a 7a 46 69 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a  *zFileName,   /*
2bb0: 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73   Name of databas
2bc0: 65 20 66 69 6c 65 20 74 6f 20 63 72 65 61 74 65  e file to create
2bd0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2be0: 20 2a 7a 53 63 68 65 6d 61 2c 20 20 20 20 20 2f   *zSchema,     /
2bf0: 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
2c00: 73 63 68 65 6d 61 20 2a 2f 0a 20 20 2e 2e 2e 20  schema */.  ... 
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c20: 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e       /* Addition
2c30: 61 6c 20 53 51 4c 20 74 6f 20 72 75 6e 2e 20 20  al SQL to run.  
2c40: 54 65 72 6d 69 6e 61 74 65 20 77 69 74 68 20 4e  Terminate with N
2c50: 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ULL. */.){.  sql
2c60: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
2c70: 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rc;.  const char
2c80: 20 2a 7a 53 71 6c 3b 0a 20 20 76 61 5f 6c 69 73   *zSql;.  va_lis
2c90: 74 20 61 70 3b 0a 0a 20 20 72 63 20 3d 20 73 71  t ap;..  rc = sq
2ca0: 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65  lite3_open(zFile
2cb0: 4e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 69 66  Name, &db);.  if
2cc0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cd0: 29 7b 0a 20 20 20 20 64 62 5f 65 72 72 28 73 71  ){.    db_err(sq
2ce0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64  lite3_errmsg(g.d
2cf0: 62 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  b));.  }.  sqlit
2d00: 65 33 5f 65 78 65 63 28 64 62 2c 20 22 42 45 47  e3_exec(db, "BEG
2d10: 49 4e 20 45 58 43 4c 55 53 49 56 45 22 2c 20 30  IN EXCLUSIVE", 0
2d20: 2c 20 30 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20  , 0, 0);.  rc = 
2d30: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
2d40: 20 7a 53 63 68 65 6d 61 2c 20 30 2c 20 30 2c 20   zSchema, 0, 0, 
2d50: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
2d60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64  LITE_OK ){.    d
2d70: 62 5f 65 72 72 28 73 71 6c 69 74 65 33 5f 65 72  b_err(sqlite3_er
2d80: 72 6d 73 67 28 67 2e 64 62 29 29 3b 0a 20 20 7d  rmsg(g.db));.  }
2d90: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
2da0: 7a 53 63 68 65 6d 61 29 3b 0a 20 20 77 68 69 6c  zSchema);.  whil
2db0: 65 28 20 28 7a 53 71 6c 20 3d 20 76 61 5f 61 72  e( (zSql = va_ar
2dc0: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
2dd0: 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  *))!=0 ){.    rc
2de0: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2df0: 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  db, zSql, 0, 0, 
2e00: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
2e10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e20: 20 20 20 64 62 5f 65 72 72 28 73 71 6c 69 74 65     db_err(sqlite
2e30: 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 29 3b  3_errmsg(g.db));
2e40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
2e50: 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c 69 74  end(ap);.  sqlit
2e60: 65 33 5f 65 78 65 63 28 64 62 2c 20 22 43 4f 4d  e3_exec(db, "COM
2e70: 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  MIT", 0, 0, 0);.
2e80: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
2e90: 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a 44  db);.}../*.** zD
2ea0: 62 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d  bName is the nam
2eb0: 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  e of a database 
2ec0: 66 69 6c 65 2e 20 20 49 66 20 6e 6f 20 6f 74 68  file.  If no oth
2ed0: 65 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  er database.** f
2ee0: 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65  ile is open, the
2ef0: 6e 20 6f 70 65 6e 20 74 68 69 73 20 6f 6e 65 2e  n open this one.
2f00: 20 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74    If another dat
2f10: 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a  abase file is.**
2f20: 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
2f30: 68 65 6e 20 61 74 74 61 63 68 20 7a 44 62 4e 61  hen attach zDbNa
2f40: 6d 65 20 75 73 69 6e 67 20 74 68 65 20 6e 61 6d  me using the nam
2f50: 65 20 7a 4c 61 62 65 6c 2e 0a 2a 2f 0a 76 6f 69  e zLabel..*/.voi
2f60: 64 20 64 62 5f 6f 70 65 6e 5f 6f 72 5f 61 74 74  d db_open_or_att
2f70: 61 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ach(const char *
2f80: 7a 44 62 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  zDbName, const c
2f90: 68 61 72 20 2a 7a 4c 61 62 65 6c 29 7b 0a 20 20  har *zLabel){.  
2fa0: 69 66 28 20 21 67 2e 64 62 20 29 7b 0a 20 20 20  if( !g.db ){.   
2fb0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2fc0: 33 5f 6f 70 65 6e 28 7a 44 62 4e 61 6d 65 2c 20  3_open(zDbName, 
2fd0: 26 67 2e 64 62 29 3b 0a 20 20 20 20 69 66 28 20  &g.db);.    if( 
2fe0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ff0: 0a 20 20 20 20 20 20 64 62 5f 65 72 72 28 73 71  .      db_err(sq
3000: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64  lite3_errmsg(g.d
3010: 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  b));.    }.    d
3020: 62 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 69 6e 69  b_connection_ini
3030: 74 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t();.  }else{.  
3040: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
3050: 22 41 54 54 41 43 48 20 44 41 54 41 42 41 53 45  "ATTACH DATABASE
3060: 20 25 51 20 41 53 20 25 73 22 2c 20 7a 44 62 4e   %Q AS %s", zDbN
3070: 61 6d 65 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20  ame, zLabel);.  
3080: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  }.}../*.** Open 
3090: 74 68 65 20 75 73 65 72 20 64 61 74 61 62 61 73  the user databas
30a0: 65 20 69 6e 20 22 7e 2f 2e 66 6f 73 73 69 6c 22  e in "~/.fossil"
30b0: 2e 20 20 43 72 65 61 74 65 20 74 68 65 20 64 61  .  Create the da
30c0: 74 61 62 61 73 65 20 61 6e 65 77 20 69 66 0a 2a  tabase anew if.*
30d0: 2a 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  * it does not al
30e0: 72 65 61 64 79 20 65 78 69 73 74 2e 0a 2a 2f 0a  ready exist..*/.
30f0: 76 6f 69 64 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e  void db_open_con
3100: 66 69 67 28 76 6f 69 64 29 7b 0a 20 20 63 68 61  fig(void){.  cha
3110: 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 63 6f  r *zDbName;.  co
3120: 6e 73 74 20 63 68 61 72 20 2a 7a 48 6f 6d 65 3b  nst char *zHome;
3130: 0a 23 69 66 64 65 66 20 5f 5f 4d 49 4e 47 57 33  .#ifdef __MINGW3
3140: 32 5f 5f 0a 20 20 7a 48 6f 6d 65 20 3d 20 67 65  2__.  zHome = ge
3150: 74 65 6e 76 28 22 4c 4f 43 41 4c 41 50 50 44 41  tenv("LOCALAPPDA
3160: 54 41 22 29 3b 0a 20 20 69 66 28 20 7a 48 6f 6d  TA");.  if( zHom
3170: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 48 6f 6d  e==0 ){.    zHom
3180: 65 20 3d 20 67 65 74 65 6e 76 28 22 41 50 50 44  e = getenv("APPD
3190: 41 54 41 22 29 3b 0a 20 20 20 20 69 66 28 20 7a  ATA");.    if( z
31a0: 48 6f 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Home==0 ){.     
31b0: 20 7a 48 6f 6d 65 20 3d 20 67 65 74 65 6e 76 28   zHome = getenv(
31c0: 22 48 4f 4d 45 50 41 54 48 22 29 3b 0a 20 20 20  "HOMEPATH");.   
31d0: 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7a   }.  }.#else.  z
31e0: 48 6f 6d 65 20 3d 20 67 65 74 65 6e 76 28 22 48  Home = getenv("H
31f0: 4f 4d 45 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  OME");.#endif.  
3200: 69 66 28 20 7a 48 6f 6d 65 3d 3d 30 20 29 7b 0a  if( zHome==0 ){.
3210: 20 20 20 20 64 62 5f 65 72 72 28 22 63 61 6e 6e      db_err("cann
3220: 6f 74 20 6c 6f 63 61 6c 20 68 6f 6d 65 20 64 69  ot local home di
3230: 72 65 63 74 6f 72 79 22 29 3b 0a 20 20 7d 0a 23  rectory");.  }.#
3240: 69 66 64 65 66 20 5f 5f 4d 49 4e 47 57 33 32 5f  ifdef __MINGW32_
3250: 5f 0a 20 20 2f 2a 20 2e 20 66 69 6c 65 6e 61 6d  _.  /* . filenam
3260: 65 73 20 67 69 76 65 20 73 6f 6d 65 20 77 69 6e  es give some win
3270: 64 6f 77 20 73 79 73 74 65 6d 73 20 70 72 6f 62  dow systems prob
3280: 6c 65 6d 73 20 61 6e 64 20 6d 61 6e 79 20 61 70  lems and many ap
3290: 70 73 20 70 72 6f 62 6c 65 6d 73 20 2a 2f 0a 20  ps problems */. 
32a0: 20 7a 44 62 4e 61 6d 65 20 3d 20 6d 70 72 69 6e   zDbName = mprin
32b0: 74 66 28 22 25 73 2f 5f 66 6f 73 73 69 6c 22 2c  tf("%s/_fossil",
32c0: 20 7a 48 6f 6d 65 29 3b 0a 23 65 6c 73 65 0a 20   zHome);.#else. 
32d0: 20 7a 44 62 4e 61 6d 65 20 3d 20 6d 70 72 69 6e   zDbName = mprin
32e0: 74 66 28 22 25 73 2f 2e 66 6f 73 73 69 6c 22 2c  tf("%s/.fossil",
32f0: 20 7a 48 6f 6d 65 29 3b 0a 23 65 6e 64 69 66 0a   zHome);.#endif.
3300: 20 20 69 66 28 20 67 2e 63 6f 6e 66 69 67 4f 70    if( g.configOp
3310: 65 6e 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  en ) return;.  i
3320: 66 28 20 66 69 6c 65 5f 73 69 7a 65 28 7a 44 62  f( file_size(zDb
3330: 4e 61 6d 65 29 3c 31 30 32 34 2a 33 20 29 7b 0a  Name)<1024*3 ){.
3340: 20 20 20 20 64 62 5f 69 6e 69 74 5f 64 61 74 61      db_init_data
3350: 62 61 73 65 28 7a 44 62 4e 61 6d 65 2c 20 7a 43  base(zDbName, zC
3360: 6f 6e 66 69 67 53 63 68 65 6d 61 2c 20 28 63 68  onfigSchema, (ch
3370: 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 64 62  ar*)0);.  }.  db
3380: 5f 6f 70 65 6e 5f 6f 72 5f 61 74 74 61 63 68 28  _open_or_attach(
3390: 7a 44 62 4e 61 6d 65 2c 20 22 63 6f 6e 66 69 67  zDbName, "config
33a0: 64 62 22 29 3b 0a 20 20 67 2e 63 6f 6e 66 69 67  db");.  g.config
33b0: 4f 70 65 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  Open = 1;.}../*.
33c0: 2a 2a 20 49 66 20 7a 44 62 4e 61 6d 65 20 69 73  ** If zDbName is
33d0: 20 61 20 76 61 6c 69 64 20 6c 6f 63 61 6c 20 64   a valid local d
33e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 6f 70  atabase file, op
33f0: 65 6e 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e  en it and return
3400: 0a 2a 2a 20 74 72 75 65 2e 20 20 49 66 20 69 74  .** true.  If it
3410: 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
3420: 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 20 66  local database f
3430: 69 6c 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ile, return 0..*
3440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 56  /.static int isV
3450: 61 6c 69 64 4c 6f 63 61 6c 44 62 28 63 6f 6e 73  alidLocalDb(cons
3460: 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29  t char *zDbName)
3470: 7b 0a 20 20 69 36 34 20 6c 73 69 7a 65 3b 0a 20  {.  i64 lsize;. 
3480: 20 69 66 28 20 61 63 63 65 73 73 28 7a 44 62 4e   if( access(zDbN
3490: 61 6d 65 2c 20 46 5f 4f 4b 29 20 29 20 72 65 74  ame, F_OK) ) ret
34a0: 75 72 6e 20 30 3b 0a 20 20 6c 73 69 7a 65 20 3d  urn 0;.  lsize =
34b0: 20 66 69 6c 65 5f 73 69 7a 65 28 7a 44 62 4e 61   file_size(zDbNa
34c0: 6d 65 29 3b 0a 20 20 69 66 28 20 6c 73 69 7a 65  me);.  if( lsize
34d0: 25 31 30 32 34 21 3d 30 20 7c 7c 20 6c 73 69 7a  %1024!=0 || lsiz
34e0: 65 3c 34 30 39 36 20 29 20 72 65 74 75 72 6e 20  e<4096 ) return 
34f0: 30 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 6f 72 5f  0;.  db_open_or_
3500: 61 74 74 61 63 68 28 7a 44 62 4e 61 6d 65 2c 20  attach(zDbName, 
3510: 22 6c 6f 63 61 6c 64 62 22 29 3b 0a 20 20 67 2e  "localdb");.  g.
3520: 6c 6f 63 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  localOpen = 1;. 
3530: 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e 66 69 67 28   db_open_config(
3540: 29 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70  );.  db_open_rep
3550: 6f 73 69 74 6f 72 79 28 30 29 3b 0a 20 20 72 65  ository(0);.  re
3560: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
3570: 20 4c 6f 63 61 74 65 20 74 68 65 20 72 6f 6f 74   Locate the root
3580: 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
3590: 65 20 6c 6f 63 61 6c 20 72 65 70 6f 73 69 74 6f  e local reposito
35a0: 72 79 20 74 72 65 65 2e 20 20 54 68 65 20 72 6f  ry tree.  The ro
35b0: 6f 74 0a 2a 2a 20 64 69 72 65 63 74 6f 72 79 20  ot.** directory 
35c0: 69 73 20 66 6f 75 6e 64 20 62 79 20 73 65 61 72  is found by sear
35d0: 63 68 69 6e 67 20 66 6f 72 20 61 20 66 69 6c 65  ching for a file
35e0: 20 6e 61 6d 65 64 20 22 46 4f 53 53 49 4c 22 20   named "FOSSIL" 
35f0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
3600: 20 61 20 76 61 6c 69 64 20 72 65 70 6f 73 69 74   a valid reposit
3610: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
3620: 0a 2a 2a 20 49 66 20 6e 6f 20 76 61 6c 69 64 20  .** If no valid 
3630: 46 4f 53 53 49 4c 20 66 69 6c 65 20 69 73 20 66  FOSSIL file is f
3640: 6f 75 6e 64 2c 20 77 65 20 6d 6f 76 65 20 75 70  ound, we move up
3650: 20 6f 6e 65 20 6c 65 76 65 6c 20 61 6e 64 20 74   one level and t
3660: 72 79 20 61 67 61 69 6e 2e 20 20 0a 2a 2a 20 4f  ry again.  .** O
3670: 6e 63 65 20 74 68 65 20 66 69 6c 65 20 69 73 20  nce the file is 
3680: 66 6f 75 6e 64 2c 20 74 68 65 20 67 2e 7a 4c 6f  found, the g.zLo
3690: 63 61 6c 52 6f 6f 74 20 76 61 72 69 61 62 6c 65  calRoot variable
36a0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 72   is set to the r
36b0: 6f 6f 74 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65  oot of.** the re
36c0: 70 6f 73 69 74 6f 72 79 20 74 72 65 65 20 61 6e  pository tree an
36d0: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
36e0: 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20 6e 6f  eturns 1.  If no
36f0: 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
3700: 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 69 73  found, then this
3710: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20   routine return 
3720: 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  0..**.** This ro
3730: 75 74 69 6e 65 20 61 6c 77 61 79 73 20 6f 70 65  utine always ope
3740: 6e 73 20 74 68 65 20 75 73 65 72 20 64 61 74 61  ns the user data
3750: 62 61 73 65 20 72 65 67 61 72 64 6c 65 73 73 20  base regardless 
3760: 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a 2a 2a  of whether or.**
3770: 20 6e 6f 74 20 74 68 65 20 72 65 70 6f 73 69 74   not the reposit
3780: 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
3790: 66 6f 75 6e 64 2e 20 20 49 66 20 74 68 65 20 46  found.  If the F
37a0: 4f 53 53 49 4c 20 66 69 6c 65 20 69 73 20 66 6f  OSSIL file is fo
37b0: 75 6e 64 2c 0a 2a 2a 20 69 74 20 69 73 20 61 74  und,.** it is at
37c0: 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 70  tached to the op
37d0: 65 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  en database conn
37e0: 65 63 74 69 6f 6e 20 74 6f 6f 2e 0a 2a 2f 0a 69  ection too..*/.i
37f0: 6e 74 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c  nt db_open_local
3800: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 6e 3b  (void){.  int n;
3810: 0a 20 20 63 68 61 72 20 7a 50 77 64 5b 32 30 30  .  char zPwd[200
3820: 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 50 77 64  0];.  char *zPwd
3830: 43 6f 6e 76 3b 0a 20 20 69 66 28 20 67 2e 6c 6f  Conv;.  if( g.lo
3840: 63 61 6c 4f 70 65 6e 29 20 72 65 74 75 72 6e 20  calOpen) return 
3850: 31 3b 0a 20 20 69 66 28 20 67 65 74 63 77 64 28  1;.  if( getcwd(
3860: 7a 50 77 64 2c 20 73 69 7a 65 6f 66 28 7a 50 77  zPwd, sizeof(zPw
3870: 64 29 2d 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20  d)-20)==0 ){.   
3880: 20 64 62 5f 65 72 72 28 22 70 77 64 20 74 6f 6f   db_err("pwd too
3890: 20 62 69 67 3a 20 6d 61 78 20 25 64 22 2c 20 73   big: max %d", s
38a0: 69 7a 65 6f 66 28 7a 50 77 64 29 2d 32 30 29 3b  izeof(zPwd)-20);
38b0: 0a 20 20 7d 0a 20 20 6e 20 3d 20 73 74 72 6c 65  .  }.  n = strle
38c0: 6e 28 7a 50 77 64 29 3b 0a 20 20 7a 50 77 64 43  n(zPwd);.  zPwdC
38d0: 6f 6e 76 20 3d 20 6d 70 72 69 6e 74 66 28 22 25  onv = mprintf("%
38e0: 2f 22 2c 20 7a 50 77 64 29 3b 0a 20 20 73 74 72  /", zPwd);.  str
38f0: 6e 63 70 79 28 7a 50 77 64 2c 20 7a 50 77 64 43  ncpy(zPwd, zPwdC
3900: 6f 6e 76 2c 20 32 30 30 30 2d 32 30 29 3b 0a 20  onv, 2000-20);. 
3910: 20 66 72 65 65 28 7a 50 77 64 43 6f 6e 76 29 3b   free(zPwdConv);
3920: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 29 7b  .  while( n>0 ){
3930: 0a 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28  .    if( access(
3940: 7a 50 77 64 2c 20 57 5f 4f 4b 29 20 29 20 62 72  zPwd, W_OK) ) br
3950: 65 61 6b 3b 0a 20 20 20 20 73 74 72 63 70 79 28  eak;.    strcpy(
3960: 26 7a 50 77 64 5b 6e 5d 2c 20 22 2f 5f 46 4f 53  &zPwd[n], "/_FOS
3970: 53 49 4c 5f 22 29 3b 0a 20 20 20 20 69 66 28 20  SIL_");.    if( 
3980: 69 73 56 61 6c 69 64 4c 6f 63 61 6c 44 62 28 7a  isValidLocalDb(z
3990: 50 77 64 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Pwd) ){.      /*
39a0: 20 46 6f 75 6e 64 20 61 20 76 61 6c 69 64 20 5f   Found a valid _
39b0: 46 4f 53 53 49 4c 5f 20 66 69 6c 65 20 2a 2f 0a  FOSSIL_ file */.
39c0: 20 20 20 20 20 20 7a 50 77 64 5b 6e 5d 20 3d 20        zPwd[n] = 
39d0: 30 3b 0a 20 20 20 20 20 20 67 2e 7a 4c 6f 63 61  0;.      g.zLoca
39e0: 6c 52 6f 6f 74 20 3d 20 6d 70 72 69 6e 74 66 28  lRoot = mprintf(
39f0: 22 25 73 2f 22 2c 20 7a 50 77 64 29 3b 0a 20 20  "%s/", zPwd);.  
3a00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3a10: 20 20 7d 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20    }.    n--;.   
3a20: 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
3a30: 50 77 64 5b 6e 5d 21 3d 27 2f 27 20 29 7b 20 6e  Pwd[n]!='/' ){ n
3a40: 2d 2d 3b 20 7d 0a 20 20 20 20 77 68 69 6c 65 28  --; }.    while(
3a50: 20 6e 3e 30 20 26 26 20 7a 50 77 64 5b 6e 2d 31   n>0 && zPwd[n-1
3a60: 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d  ]=='/' ){ n--; }
3a70: 0a 20 20 20 20 7a 50 77 64 5b 6e 5d 20 3d 20 30  .    zPwd[n] = 0
3a80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 20 5f 46  ;.  }..  /* A _F
3a90: 4f 53 53 49 4c 5f 20 66 69 6c 65 20 63 6f 75 6c  OSSIL_ file coul
3aa0: 64 20 6e 6f 74 20 62 65 20 66 6f 75 6e 64 20 2a  d not be found *
3ab0: 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
3ac0: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
3ad0: 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61 62  repository datab
3ae0: 61 73 65 20 67 69 76 65 6e 20 62 79 20 7a 44 62  ase given by zDb
3af0: 4e 61 6d 65 2e 20 20 49 66 20 7a 44 62 4e 61 6d  Name.  If zDbNam
3b00: 65 3d 3d 4e 55 4c 4c 20 74 68 65 6e 0a 2a 2a 20  e==NULL then.** 
3b10: 67 65 74 20 74 68 65 20 6e 61 6d 65 20 66 72 6f  get the name fro
3b20: 6d 20 74 68 65 20 61 6c 72 65 61 64 79 20 6f 70  m the already op
3b30: 65 6e 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73  en local databas
3b40: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 6f 70  e..*/.void db_op
3b50: 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 63 6f  en_repository(co
3b60: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
3b70: 65 29 7b 0a 20 20 69 66 28 20 67 2e 72 65 70 6f  e){.  if( g.repo
3b80: 73 69 74 6f 72 79 4f 70 65 6e 20 29 20 72 65 74  sitoryOpen ) ret
3b90: 75 72 6e 3b 0a 20 20 69 66 28 20 7a 44 62 4e 61  urn;.  if( zDbNa
3ba0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  me==0 ){.    if(
3bb0: 20 67 2e 6c 6f 63 61 6c 4f 70 65 6e 20 29 7b 0a   g.localOpen ){.
3bc0: 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20        zDbName = 
3bd0: 64 62 5f 6c 67 65 74 28 22 72 65 70 6f 73 69 74  db_lget("reposit
3be0: 6f 72 79 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ory", 0);.    }.
3bf0: 20 20 20 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d      if( zDbName=
3c00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 65  =0 ){.      db_e
3c10: 72 72 28 22 75 6e 61 62 6c 65 20 74 6f 20 66 69  rr("unable to fi
3c20: 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  nd the name of a
3c30: 20 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61   repository data
3c40: 62 61 73 65 22 29 3b 0a 20 20 20 20 7d 0a 20 20  base");.    }.  
3c50: 7d 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 7a  }.  if( access(z
3c60: 44 62 4e 61 6d 65 2c 20 52 5f 4f 4b 29 20 7c 7c  DbName, R_OK) ||
3c70: 20 66 69 6c 65 5f 73 69 7a 65 28 7a 44 62 4e 61   file_size(zDbNa
3c80: 6d 65 29 3c 31 30 32 34 20 29 7b 0a 20 20 20 20  me)<1024 ){.    
3c90: 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 6e 6f  fossil_panic("no
3ca0: 20 73 75 63 68 20 72 65 70 6f 73 69 74 6f 72 79   such repository
3cb0: 3a 20 25 73 22 2c 20 7a 44 62 4e 61 6d 65 29 3b  : %s", zDbName);
3cc0: 0a 20 20 7d 0a 20 20 64 62 5f 6f 70 65 6e 5f 6f  .  }.  db_open_o
3cd0: 72 5f 61 74 74 61 63 68 28 7a 44 62 4e 61 6d 65  r_attach(zDbName
3ce0: 2c 20 22 72 65 70 6f 73 69 74 6f 72 79 22 29 3b  , "repository");
3cf0: 0a 20 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f  .  g.repositoryO
3d00: 70 65 6e 20 3d 20 31 3b 0a 20 20 67 2e 7a 52 65  pen = 1;.  g.zRe
3d10: 70 6f 73 69 74 6f 72 79 4e 61 6d 65 20 3d 20 6d  positoryName = m
3d20: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 44 62  printf("%s", zDb
3d30: 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
3d40: 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20  Try to find the 
3d50: 72 65 70 6f 73 69 74 6f 72 79 20 61 6e 64 20 6f  repository and o
3d60: 70 65 6e 20 69 74 2e 20 20 55 73 65 20 74 68 65  pen it.  Use the
3d70: 20 2d 52 20 6f 72 20 2d 2d 72 65 70 6f 73 69 74   -R or --reposit
3d80: 6f 72 79 0a 2a 2a 20 6f 70 74 69 6f 6e 20 74 6f  ory.** option to
3d90: 20 6c 6f 63 61 74 65 20 74 68 65 20 72 65 70 6f   locate the repo
3da0: 73 69 74 6f 72 79 2e 20 20 49 66 20 6e 6f 20 73  sitory.  If no s
3db0: 75 63 68 20 6f 70 74 69 6f 6e 20 69 73 20 61 76  uch option is av
3dc0: 61 69 6c 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  ailable, then.**
3dd0: 20 75 73 65 20 74 68 65 20 72 65 70 6f 73 69 74   use the reposit
3de0: 6f 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ory of the open 
3df0: 63 68 65 63 6b 6f 75 74 20 69 66 20 74 68 65 72  checkout if ther
3e00: 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  e is one..**.** 
3e10: 45 72 72 6f 72 20 6f 75 74 20 69 66 20 74 68 65  Error out if the
3e20: 20 72 65 70 6f 73 69 74 6f 72 79 20 63 61 6e 6e   repository cann
3e30: 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 0a 2a 2f  ot be opened..*/
3e40: 0a 76 6f 69 64 20 64 62 5f 66 69 6e 64 5f 61 6e  .void db_find_an
3e50: 64 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72  d_open_repositor
3e60: 79 28 76 6f 69 64 29 7b 0a 20 20 63 6f 6e 73 74  y(void){.  const
3e70: 20 63 68 61 72 20 2a 7a 52 65 70 20 3d 20 66 69   char *zRep = fi
3e80: 6e 64 5f 6f 70 74 69 6f 6e 28 22 72 65 70 6f 73  nd_option("repos
3e90: 69 74 6f 72 79 22 2c 20 22 52 22 2c 20 31 29 3b  itory", "R", 1);
3ea0: 0a 20 20 69 66 28 20 7a 52 65 70 3d 3d 30 20 29  .  if( zRep==0 )
3eb0: 7b 0a 20 20 20 20 69 66 28 20 64 62 5f 6f 70 65  {.    if( db_ope
3ec0: 6e 5f 6c 6f 63 61 6c 28 29 3d 3d 30 20 29 7b 0a  n_local()==0 ){.
3ed0: 20 20 20 20 20 20 67 6f 74 6f 20 72 65 70 5f 6e        goto rep_n
3ee0: 6f 74 5f 66 6f 75 6e 64 3b 0a 20 20 20 20 7d 0a  ot_found;.    }.
3ef0: 20 20 20 20 7a 52 65 70 20 3d 20 64 62 5f 6c 67      zRep = db_lg
3f00: 65 74 28 22 72 65 70 6f 73 69 74 6f 72 79 22 2c  et("repository",
3f10: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65   0);.    if( zRe
3f20: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  p==0 ){.      go
3f30: 74 6f 20 72 65 70 5f 6e 6f 74 5f 66 6f 75 6e 64  to rep_not_found
3f40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  ;.    }.  }.  db
3f50: 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79  _open_repository
3f60: 28 7a 52 65 70 29 3b 0a 20 20 69 66 28 20 67 2e  (zRep);.  if( g.
3f70: 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20 29  repositoryOpen )
3f80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
3f90: 7d 0a 72 65 70 5f 6e 6f 74 5f 66 6f 75 6e 64 3a  }.rep_not_found:
3fa0: 0a 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28  .  fossil_fatal(
3fb0: 22 75 73 65 20 2d 2d 72 65 70 6f 73 69 74 6f 72  "use --repositor
3fc0: 79 20 6f 72 20 2d 52 20 74 6f 20 73 70 65 63 69  y or -R to speci
3fd0: 66 69 63 20 74 68 65 20 72 65 70 6f 73 69 74 6f  fic the reposito
3fe0: 72 79 20 64 61 74 61 62 61 73 65 22 29 3b 0a 7d  ry database");.}
3ff0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
4000: 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 2e   local database.
4010: 20 20 49 66 20 75 6e 61 62 6c 65 2c 20 65 78 69    If unable, exi
4020: 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e  t with an error.
4030: 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 6d 75 73 74  .*/.void db_must
4040: 5f 62 65 5f 77 69 74 68 69 6e 5f 74 72 65 65 28  _be_within_tree(
4050: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 64 62 5f  void){.  if( db_
4060: 6f 70 65 6e 5f 6c 6f 63 61 6c 28 29 3d 3d 30 20  open_local()==0 
4070: 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61  ){.    fossil_fa
4080: 74 61 6c 28 22 6e 6f 74 20 77 69 74 68 69 6e 20  tal("not within 
4090: 61 6e 20 6f 70 65 6e 20 63 68 65 63 6b 6f 75 74  an open checkout
40a0: 22 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 6f 70 65  ");.  }.  db_ope
40b0: 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 30 29 3b  n_repository(0);
40c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
40d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
40e0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
40f0: 20 64 62 5f 63 6c 6f 73 65 28 76 6f 69 64 29 7b   db_close(void){
4100: 0a 20 20 69 66 28 20 67 2e 64 62 3d 3d 30 20 29  .  if( g.db==0 )
4110: 20 72 65 74 75 72 6e 3b 0a 20 20 67 2e 72 65 70   return;.  g.rep
4120: 6f 73 69 74 6f 72 79 4f 70 65 6e 20 3d 20 30 3b  ositoryOpen = 0;
4130: 0a 20 20 67 2e 6c 6f 63 61 6c 4f 70 65 6e 20 3d  .  g.localOpen =
4140: 20 30 3b 0a 20 20 67 2e 63 6f 6e 66 69 67 4f 70   0;.  g.configOp
4150: 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  en = 0;.  sqlite
4160: 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b 0a 20  3_close(g.db);. 
4170: 20 67 2e 64 62 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f   g.db = 0;.}.../
4180: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
4190: 77 20 65 6d 70 74 79 20 72 65 70 6f 73 69 74 6f  w empty reposito
41a0: 72 79 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ry database with
41b0: 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 2e   the given name.
41c0: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
41d0: 73 63 68 65 6d 61 20 69 73 20 69 6e 69 74 69 61  schema is initia
41e0: 6c 69 7a 65 64 2e 20 20 54 68 65 20 72 65 71 75  lized.  The requ
41f0: 69 72 65 64 20 56 41 52 20 74 61 62 6c 65 73 20  ired VAR tables 
4200: 65 6e 74 72 69 65 73 0a 2a 2a 20 61 72 65 20 6e  entries.** are n
4210: 6f 74 20 73 65 74 20 62 79 20 74 68 69 73 20 72  ot set by this r
4220: 6f 75 74 69 6e 65 20 61 6e 64 20 6d 75 73 74 20  outine and must 
4230: 62 65 20 73 65 74 20 73 65 70 61 72 61 74 65 6c  be set separatel
4240: 79 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  y in order.** to
4250: 20 6d 61 6b 65 20 74 68 65 20 6e 65 77 20 66 69   make the new fi
4260: 6c 65 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  le a valid datab
4270: 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f  ase..*/.void db_
4280: 63 72 65 61 74 65 5f 72 65 70 6f 73 69 74 6f 72  create_repositor
4290: 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  y(const char *zF
42a0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 64 62 5f 69  ilename){.  db_i
42b0: 6e 69 74 5f 64 61 74 61 62 61 73 65 28 0a 20 20  nit_database(.  
42c0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20     zFilename,.  
42d0: 20 20 20 7a 52 65 70 6f 73 69 74 6f 72 79 53 63     zRepositorySc
42e0: 68 65 6d 61 31 2c 0a 20 20 20 20 20 7a 52 65 70  hema1,.     zRep
42f0: 6f 73 69 74 6f 72 79 53 63 68 65 6d 61 32 2c 0a  ositorySchema2,.
4300: 20 20 20 20 20 28 63 68 61 72 2a 29 30 0a 20 20       (char*)0.  
4310: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c  );.}../*.** Fill
4320: 20 61 6e 20 65 6d 70 74 79 20 72 65 70 6f 73 69   an empty reposi
4330: 74 6f 72 79 20 64 61 74 61 62 61 73 65 20 77 69  tory database wi
4340: 74 68 20 74 68 65 20 62 61 73 69 63 20 69 6e 66  th the basic inf
4350: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 0a 2a  ormation for a.*
4360: 2a 20 72 65 70 6f 73 69 74 6f 72 79 2e 20 54 68  * repository. Th
4370: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
4380: 68 61 72 65 64 20 62 65 74 77 65 65 6e 20 27 63  hared between 'c
4390: 72 65 61 74 65 5f 72 65 70 6f 73 69 74 6f 72 79  reate_repository
43a0: 5f 63 6d 64 27 0a 2a 2a 20 28 27 6e 65 77 27 29  _cmd'.** ('new')
43b0: 20 61 6e 64 20 27 72 65 63 6f 6e 73 74 72 75 63   and 'reconstruc
43c0: 74 5f 63 6d 64 27 20 28 27 72 65 63 6f 6e 73 74  t_cmd' ('reconst
43d0: 72 75 63 74 27 29 2c 20 62 6f 74 68 20 6f 66 20  ruct'), both of 
43e0: 77 68 69 63 68 20 63 72 65 61 74 65 0a 2a 2a 20  which create.** 
43f0: 6e 65 77 20 72 65 70 6f 73 69 74 6f 72 69 65 73  new repositories
4400: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
4410: 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  er determines wh
4420: 65 74 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f  eter the functio
4430: 6e 20 69 6e 73 65 72 74 73 20 61 6e 20 65 6d 70  n inserts an emp
4440: 74 79 20 72 6f 6f 74 0a 2a 2a 20 6d 61 6e 69 66  ty root.** manif
4450: 65 73 74 20 28 7a 52 6f 6f 74 20 3d 3d 20 54 52  est (zRoot == TR
4460: 55 45 29 2c 20 6f 72 20 6e 6f 74 20 28 7a 52 6f  UE), or not (zRo
4470: 6f 74 20 3d 3d 20 46 41 4c 53 45 29 2e 0a 2a 2f  ot == FALSE)..*/
4480: 0a 0a 76 6f 69 64 20 64 62 5f 69 6e 69 74 69 61  ..void db_initia
4490: 6c 5f 73 65 74 75 70 20 28 69 6e 74 20 7a 52 6f  l_setup (int zRo
44a0: 6f 74 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 61  ot){.  char *zDa
44b0: 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 55 73 65  te;.  char *zUse
44c0: 72 3b 0a 20 20 42 6c 6f 62 20 68 61 73 68 3b 0a  r;.  Blob hash;.
44d0: 20 20 42 6c 6f 62 20 6d 61 6e 69 66 65 73 74 3b    Blob manifest;
44e0: 0a 0a 20 20 64 62 5f 73 65 74 28 22 63 6f 6e 74  ..  db_set("cont
44f0: 65 6e 74 2d 73 63 68 65 6d 61 22 2c 20 43 4f 4e  ent-schema", CON
4500: 54 45 4e 54 5f 53 43 48 45 4d 41 29 3b 0a 20 20  TENT_SCHEMA);.  
4510: 64 62 5f 73 65 74 28 22 61 75 78 2d 73 63 68 65  db_set("aux-sche
4520: 6d 61 22 2c 20 41 55 58 5f 53 43 48 45 4d 41 29  ma", AUX_SCHEMA)
4530: 3b 0a 20 20 64 62 5f 73 65 74 5f 69 6e 74 28 22  ;.  db_set_int("
4540: 61 75 74 68 65 6e 74 69 63 61 74 65 2d 6c 6f 63  authenticate-loc
4550: 61 6c 68 6f 73 74 22 2c 20 30 29 3b 0a 20 20 64  alhost", 0);.  d
4560: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20  b_multi_exec(.  
4570: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63    "INSERT INTO c
4580: 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c 75 65  onfig(name,value
4590: 29 20 56 41 4c 55 45 53 28 27 73 65 72 76 65 72  ) VALUES('server
45a0: 2d 63 6f 64 65 27 2c 20 68 65 78 28 72 61 6e 64  -code', hex(rand
45b0: 6f 6d 62 6c 6f 62 28 32 30 29 29 29 3b 22 0a 20  omblob(20)));". 
45c0: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
45d0: 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c 75  config(name,valu
45e0: 65 29 20 56 41 4c 55 45 53 28 27 70 72 6f 6a 65  e) VALUES('proje
45f0: 63 74 2d 63 6f 64 65 27 2c 68 65 78 28 72 61 6e  ct-code',hex(ran
4600: 64 6f 6d 62 6c 6f 62 28 32 30 29 29 29 3b 22 0a  domblob(20)));".
4610: 20 20 29 3b 0a 20 20 7a 55 73 65 72 20 3d 20 64    );.  zUser = d
4620: 62 5f 67 6c 6f 62 61 6c 5f 67 65 74 28 22 64 65  b_global_get("de
4630: 66 61 75 6c 74 2d 75 73 65 72 22 2c 20 30 29 3b  fault-user", 0);
4640: 0a 20 20 69 66 28 20 7a 55 73 65 72 3d 3d 30 20  .  if( zUser==0 
4650: 29 7b 0a 20 20 20 20 7a 55 73 65 72 20 3d 20 67  ){.    zUser = g
4660: 65 74 65 6e 76 28 22 55 53 45 52 22 29 3b 0a 20  etenv("USER");. 
4670: 20 7d 0a 20 20 69 66 28 20 7a 55 73 65 72 3d 3d   }.  if( zUser==
4680: 30 20 29 7b 0a 20 20 20 20 7a 55 73 65 72 20 3d  0 ){.    zUser =
4690: 20 22 72 6f 6f 74 22 3b 0a 20 20 7d 0a 20 20 64   "root";.  }.  d
46a0: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20  b_multi_exec(.  
46b0: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
46c0: 75 73 65 72 28 6c 6f 67 69 6e 2c 20 70 77 2c 20  user(login, pw, 
46d0: 63 61 70 2c 20 69 6e 66 6f 29 22 0a 20 20 20 20  cap, info)".    
46e0: 20 22 56 41 4c 55 45 53 28 25 51 2c 27 27 2c 27   "VALUES(%Q,'','
46f0: 73 27 2c 27 27 29 22 2c 20 7a 55 73 65 72 0a 20  s','')", zUser. 
4700: 20 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65   );.  db_multi_e
4710: 78 65 63 28 0a 20 20 20 20 20 22 49 4e 53 45 52  xec(.     "INSER
4720: 54 20 49 4e 54 4f 20 75 73 65 72 28 6c 6f 67 69  T INTO user(logi
4730: 6e 2c 70 77 2c 63 61 70 2c 69 6e 66 6f 29 22 0a  n,pw,cap,info)".
4740: 20 20 20 20 20 22 20 20 20 56 41 4c 55 45 53 28       "   VALUES(
4750: 27 61 6e 6f 6e 79 6d 6f 75 73 27 2c 27 61 6e 6f  'anonymous','ano
4760: 6e 79 6d 6f 75 73 27 2c 27 68 6a 6b 6f 72 77 27  nymous','hjkorw'
4770: 2c 27 41 6e 6f 6e 27 29 3b 22 0a 20 20 20 20 20  ,'Anon');".     
4780: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 75 73 65  "INSERT INTO use
4790: 72 28 6c 6f 67 69 6e 2c 70 77 2c 63 61 70 2c 69  r(login,pw,cap,i
47a0: 6e 66 6f 29 22 0a 20 20 20 20 20 22 20 20 20 56  nfo)".     "   V
47b0: 41 4c 55 45 53 28 27 6e 6f 62 6f 64 79 27 2c 27  ALUES('nobody','
47c0: 27 2c 27 6a 6f 72 27 2c 27 4e 6f 62 6f 64 79 27  ','jor','Nobody'
47d0: 29 3b 22 0a 20 20 29 3b 0a 20 20 75 73 65 72 5f  );".  );.  user_
47e0: 73 65 6c 65 63 74 28 29 3b 0a 0a 20 20 69 66 20  select();..  if 
47f0: 28 7a 52 6f 6f 74 29 7b 0a 20 20 20 20 62 6c 6f  (zRoot){.    blo
4800: 62 5f 7a 65 72 6f 28 26 6d 61 6e 69 66 65 73 74  b_zero(&manifest
4810: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  );.    blob_appe
4820: 6e 64 66 28 26 6d 61 6e 69 66 65 73 74 2c 20 22  ndf(&manifest, "
4830: 43 20 69 6e 69 74 69 61 6c 5c 5c 73 65 6d 70 74  C initial\\sempt
4840: 79 5c 5c 73 62 61 73 65 6c 69 6e 65 5c 6e 22 29  y\\sbaseline\n")
4850: 3b 0a 20 20 20 20 7a 44 61 74 65 20 3d 20 64 62  ;.    zDate = db
4860: 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54  _text(0, "SELECT
4870: 20 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 27 29   datetime('now')
4880: 22 29 3b 0a 20 20 20 20 7a 44 61 74 65 5b 31 30  ");.    zDate[10
4890: 5d 3d 27 54 27 3b 0a 20 20 20 20 62 6c 6f 62 5f  ]='T';.    blob_
48a0: 61 70 70 65 6e 64 66 28 26 6d 61 6e 69 66 65 73  appendf(&manifes
48b0: 74 2c 20 22 44 20 25 73 5c 6e 22 2c 20 7a 44 61  t, "D %s\n", zDa
48c0: 74 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70  te);.    blob_ap
48d0: 70 65 6e 64 66 28 26 6d 61 6e 69 66 65 73 74 2c  pendf(&manifest,
48e0: 20 22 50 5c 6e 22 29 3b 0a 20 20 20 20 6d 64 35   "P\n");.    md5
48f0: 73 75 6d 5f 69 6e 69 74 28 29 3b 0a 20 20 20 20  sum_init();.    
4900: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61  blob_appendf(&ma
4910: 6e 69 66 65 73 74 2c 20 22 52 20 25 73 5c 6e 22  nifest, "R %s\n"
4920: 2c 20 6d 64 35 73 75 6d 5f 66 69 6e 69 73 68 28  , md5sum_finish(
4930: 30 29 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70  0));.    blob_ap
4940: 70 65 6e 64 66 28 26 6d 61 6e 69 66 65 73 74 2c  pendf(&manifest,
4950: 20 22 55 20 25 46 5c 6e 22 2c 20 67 2e 7a 4c 6f   "U %F\n", g.zLo
4960: 67 69 6e 29 3b 0a 20 20 20 20 6d 64 35 73 75 6d  gin);.    md5sum
4970: 5f 62 6c 6f 62 28 26 6d 61 6e 69 66 65 73 74 2c  _blob(&manifest,
4980: 20 26 68 61 73 68 29 3b 0a 20 20 20 20 62 6c 6f   &hash);.    blo
4990: 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69 66  b_appendf(&manif
49a0: 65 73 74 2c 20 22 5a 20 25 62 5c 6e 22 2c 20 26  est, "Z %b\n", &
49b0: 68 61 73 68 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  hash);.    blob_
49c0: 72 65 73 65 74 28 26 68 61 73 68 29 3b 0a 20 20  reset(&hash);.  
49d0: 20 20 63 6f 6e 74 65 6e 74 5f 70 75 74 28 26 6d    content_put(&m
49e0: 61 6e 69 66 65 73 74 2c 20 30 2c 20 30 29 3b 0a  anifest, 0, 0);.
49f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d    }.}../*.** COM
4a00: 4d 41 4e 44 3a 20 6e 65 77 0a 2a 2a 0a 2a 2a 20  MAND: new.**.** 
4a10: 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 6e  Usage: %fossil n
4a20: 65 77 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 20 43  ew FILENAME.** C
4a30: 72 65 61 74 65 20 61 20 72 65 70 6f 73 69 74 6f  reate a reposito
4a40: 72 79 20 66 6f 72 20 61 20 6e 65 77 20 70 72 6f  ry for a new pro
4a50: 6a 65 63 74 20 69 6e 20 74 68 65 20 66 69 6c 65  ject in the file
4a60: 20 6e 61 6d 65 64 20 46 49 4c 45 4e 41 4d 45 2e   named FILENAME.
4a70: 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
4a80: 20 69 73 20 64 69 73 74 69 6e 63 74 20 66 72 6f   is distinct fro
4a90: 6d 20 22 63 6c 6f 6e 65 22 2e 20 20 54 68 65 20  m "clone".  The 
4aa0: 22 63 6c 6f 6e 65 22 20 63 6f 6d 6d 61 6e 64 20  "clone" command 
4ab0: 6d 61 6b 65 73 0a 2a 2a 20 61 20 63 6f 70 79 20  makes.** a copy 
4ac0: 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70  of an existing p
4ad0: 72 6f 6a 65 63 74 2e 20 20 54 68 69 73 20 63 6f  roject.  This co
4ae0: 6d 6d 61 6e 64 20 73 74 61 72 74 73 20 61 20 6e  mmand starts a n
4af0: 65 77 20 70 72 6f 6a 65 63 74 2e 0a 2a 2f 0a 76  ew project..*/.v
4b00: 6f 69 64 20 63 72 65 61 74 65 5f 72 65 70 6f 73  oid create_repos
4b10: 69 74 6f 72 79 5f 63 6d 64 28 76 6f 69 64 29 7b  itory_cmd(void){
4b20: 0a 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d 33  .  if( g.argc!=3
4b30: 20 29 7b 0a 20 20 20 20 75 73 61 67 65 28 22 52   ){.    usage("R
4b40: 45 50 4f 53 49 54 4f 52 59 2d 4e 41 4d 45 22 29  EPOSITORY-NAME")
4b50: 3b 0a 20 20 7d 0a 20 20 64 62 5f 63 72 65 61 74  ;.  }.  db_creat
4b60: 65 5f 72 65 70 6f 73 69 74 6f 72 79 28 67 2e 61  e_repository(g.a
4b70: 72 67 76 5b 32 5d 29 3b 0a 20 20 64 62 5f 6f 70  rgv[2]);.  db_op
4b80: 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 67 2e  en_repository(g.
4b90: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 64 62 5f 6f  argv[2]);.  db_o
4ba0: 70 65 6e 5f 63 6f 6e 66 69 67 28 29 3b 0a 20 20  pen_config();.  
4bb0: 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63  db_begin_transac
4bc0: 74 69 6f 6e 28 29 3b 0a 20 20 64 62 5f 69 6e 69  tion();.  db_ini
4bd0: 74 69 61 6c 5f 73 65 74 75 70 20 28 31 29 3b 0a  tial_setup (1);.
4be0: 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63    db_end_transac
4bf0: 74 69 6f 6e 28 30 29 3b 0a 20 20 70 72 69 6e 74  tion(0);.  print
4c00: 66 28 22 70 72 6f 6a 65 63 74 2d 69 64 3a 20 25  f("project-id: %
4c10: 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28 22 70 72  s\n", db_get("pr
4c20: 6f 6a 65 63 74 2d 63 6f 64 65 22 2c 20 30 29 29  oject-code", 0))
4c30: 3b 0a 20 20 70 72 69 6e 74 66 28 22 73 65 72 76  ;.  printf("serv
4c40: 65 72 2d 69 64 3a 20 20 25 73 5c 6e 22 2c 20 64  er-id:  %s\n", d
4c50: 62 5f 67 65 74 28 22 73 65 72 76 65 72 2d 63 6f  b_get("server-co
4c60: 64 65 22 2c 20 30 29 29 3b 0a 20 20 70 72 69 6e  de", 0));.  prin
4c70: 74 66 28 22 61 64 6d 69 6e 2d 75 73 65 72 3a 20  tf("admin-user: 
4c80: 25 73 20 28 6e 6f 20 70 61 73 73 77 6f 72 64 20  %s (no password 
4c90: 73 65 74 20 79 65 74 21 29 5c 6e 22 2c 20 67 2e  set yet!)\n", g.
4ca0: 7a 4c 6f 67 69 6e 29 3b 0a 20 20 70 72 69 6e 74  zLogin);.  print
4cb0: 66 28 22 62 61 73 65 6c 69 6e 65 3a 20 20 20 25  f("baseline:   %
4cc0: 73 5c 6e 22 2c 20 64 62 5f 74 65 78 74 28 30 2c  s\n", db_text(0,
4cd0: 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52   "SELECT uuid FR
4ce0: 4f 4d 20 62 6c 6f 62 22 29 29 3b 0a 7d 0a 0a 2f  OM blob"));.}../
4cf0: 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  *.** SQL functio
4d00: 6e 73 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ns for debugging
4d10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 69 6e  ..**.** The prin
4d20: 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  t() function wri
4d30: 74 65 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74  tes its argument
4d40: 73 20 6f 6e 20 73 74 64 6f 75 74 2c 20 62 75 74  s on stdout, but
4d50: 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 65 20   only.** if the 
4d60: 2d 73 71 6c 70 72 69 6e 74 20 63 6f 6d 6d 61 6e  -sqlprint comman
4d70: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 69 73  d-line option is
4d80: 20 74 75 72 6e 65 64 20 6f 6e 2e 0a 2a 2f 0a 73   turned on..*/.s
4d90: 74 61 74 69 63 20 76 6f 69 64 20 64 62 5f 73 71  tatic void db_sq
4da0: 6c 5f 70 72 69 6e 74 28 0a 20 20 73 71 6c 69 74  l_print(.  sqlit
4db0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
4dc0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
4dd0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
4de0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
4df0: 20 69 3b 0a 20 20 69 66 28 20 67 2e 66 53 71 6c   i;.  if( g.fSql
4e00: 50 72 69 6e 74 20 29 7b 0a 20 20 20 20 66 6f 72  Print ){.    for
4e10: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
4e20: 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 63  +){.      char c
4e30: 20 3d 20 69 3d 3d 61 72 67 63 2d 31 20 3f 20 27   = i==argc-1 ? '
4e40: 5c 6e 27 20 3a 20 27 20 27 3b 0a 20 20 20 20 20  \n' : ' ';.     
4e50: 20 70 72 69 6e 74 66 28 22 25 73 25 63 22 2c 20   printf("%s%c", 
4e60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
4e70: 78 74 28 61 72 67 76 5b 69 5d 29 2c 20 63 29 3b  xt(argv[i]), c);
4e80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61  .    }.  }.}.sta
4e90: 74 69 63 20 76 6f 69 64 20 64 62 5f 73 71 6c 5f  tic void db_sql_
4ea0: 74 72 61 63 65 28 76 6f 69 64 20 2a 6e 6f 74 55  trace(void *notU
4eb0: 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  sed, const char 
4ec0: 2a 7a 53 71 6c 29 7b 0a 20 20 70 72 69 6e 74 66  *zSql){.  printf
4ed0: 28 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a  ("%s\n", zSql);.
4ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
4ef0: 20 75 73 65 64 20 62 79 20 74 68 65 20 5b 63 6f   used by the [co
4f00: 6d 6d 69 74 5d 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  mmit] command..*
4f10: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
4f20: 20 69 66 20 65 69 74 68 65 72 3a 0a 2a 2a 0a 2a   if either:.**.*
4f30: 2a 20 20 20 20 20 61 29 20 47 6c 6f 62 61 6c 2e  *     a) Global.
4f40: 61 43 6f 6d 6d 69 74 46 69 6c 65 20 69 73 20 4e  aCommitFile is N
4f50: 55 4c 4c 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 62  ULL, or.**     b
4f60: 29 20 47 6c 6f 62 61 6c 2e 61 43 6f 6d 6d 69 74  ) Global.aCommit
4f70: 46 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  File contains th
4f80: 65 20 69 6e 74 65 67 65 72 20 70 61 73 73 65 64  e integer passed
4f90: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
4fa0: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
4fb0: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a   return false..*
4fc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 69  /.static void fi
4fd0: 6c 65 5f 69 73 5f 73 65 6c 65 63 74 65 64 28 0a  le_is_selected(.
4fe0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
4ff0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
5000: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
5010: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5020: 7b 0a 20 20 61 73 73 65 72 74 28 61 72 67 63 3d  {.  assert(argc=
5030: 3d 31 29 3b 0a 20 20 69 66 28 20 67 2e 61 43 6f  =1);.  if( g.aCo
5040: 6d 6d 69 74 46 69 6c 65 20 29 7b 0a 20 20 20 20  mmitFile ){.    
5050: 69 6e 74 20 69 49 64 20 3d 20 73 71 6c 69 74 65  int iId = sqlite
5060: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
5070: 5b 30 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69 69  [0]);.    int ii
5080: 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
5090: 67 2e 61 43 6f 6d 6d 69 74 46 69 6c 65 5b 69 69  g.aCommitFile[ii
50a0: 5d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]; ii++){.      
50b0: 69 66 28 20 69 49 64 3d 3d 67 2e 61 43 6f 6d 6d  if( iId==g.aComm
50c0: 69 74 46 69 6c 65 5b 69 69 5d 20 29 7b 0a 20 20  itFile[ii] ){.  
50d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
50e0: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
50f0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65  , 1);.        re
5100: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
5110: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
5120: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
5130: 78 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  xt, 0);.  }else{
5140: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
5150: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
5160: 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
5170: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5180: 72 65 67 69 73 74 65 72 73 20 61 75 78 69 6c 69  registers auxili
5190: 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 77 68  ary functions wh
51a0: 65 6e 20 74 68 65 20 53 51 4c 69 74 65 0a 2a 2a  en the SQLite.**
51b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
51c0: 74 69 6f 6e 20 69 73 20 66 69 72 73 74 20 65 73  tion is first es
51d0: 74 61 62 6c 69 73 68 65 64 2e 0a 2a 2f 0a 4c 4f  tablished..*/.LO
51e0: 43 41 4c 20 76 6f 69 64 20 64 62 5f 63 6f 6e 6e  CAL void db_conn
51f0: 65 63 74 69 6f 6e 5f 69 6e 69 74 28 76 6f 69 64  ection_init(void
5200: 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
5210: 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 69 66 28 20  once = 1;.  if( 
5220: 6f 6e 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  once ){.    sqli
5230: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
5240: 69 6f 6e 28 67 2e 64 62 2c 20 22 70 72 69 6e 74  ion(g.db, "print
5250: 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ", -1, SQLITE_UT
5260: 46 38 2c 20 30 2c 64 62 5f 73 71 6c 5f 70 72 69  F8, 0,db_sql_pri
5270: 6e 74 2c 30 2c 30 29 3b 0a 20 20 20 20 73 71 6c  nt,0,0);.    sql
5280: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
5290: 74 69 6f 6e 28 0a 20 20 20 20 20 20 67 2e 64 62  tion(.      g.db
52a0: 2c 20 22 66 69 6c 65 5f 69 73 5f 73 65 6c 65 63  , "file_is_selec
52b0: 74 65 64 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ted", 1, SQLITE_
52c0: 55 54 46 38 2c 20 30 2c 20 66 69 6c 65 5f 69 73  UTF8, 0, file_is
52d0: 5f 73 65 6c 65 63 74 65 64 2c 30 2c 30 0a 20 20  _selected,0,0.  
52e0: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 66    );.    if( g.f
52f0: 53 71 6c 54 72 61 63 65 20 29 7b 0a 20 20 20 20  SqlTrace ){.    
5300: 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28    sqlite3_trace(
5310: 67 2e 64 62 2c 20 64 62 5f 73 71 6c 5f 74 72 61  g.db, db_sql_tra
5320: 63 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ce, 0);.    }.  
5330: 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 7d 0a    once = 0;.  }.
5340: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 64  }../*.** Get and
5350: 20 73 65 74 20 76 61 6c 75 65 73 20 66 72 6f 6d   set values from
5360: 20 74 68 65 20 43 4f 4e 46 49 47 2c 20 47 4c 4f   the CONFIG, GLO
5370: 42 41 4c 5f 43 4f 4e 46 49 47 20 61 6e 64 20 56  BAL_CONFIG and V
5380: 56 41 52 20 74 61 62 6c 65 20 69 6e 20 74 68 65  VAR table in the
5390: 0a 2a 2a 20 72 65 70 6f 73 69 74 6f 72 79 20 61  .** repository a
53a0: 6e 64 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73  nd local databas
53b0: 65 73 2e 0a 2a 2f 0a 63 68 61 72 20 2a 64 62 5f  es..*/.char *db_
53c0: 67 65 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  get(const char *
53d0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
53e0: 72 20 2a 7a 44 65 66 61 75 6c 74 29 7b 0a 20 20  r *zDefault){.  
53f0: 72 65 74 75 72 6e 20 64 62 5f 74 65 78 74 28 28  return db_text((
5400: 63 68 61 72 2a 29 7a 44 65 66 61 75 6c 74 2c 20  char*)zDefault, 
5410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5420: 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20    "SELECT value 
5430: 46 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52  FROM config WHER
5440: 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d  E name=%Q", zNam
5450: 65 29 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 73 65  e);.}.void db_se
5460: 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  t(const char *zN
5470: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
5480: 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 64 62 5f 6d  *zValue){.  db_m
5490: 75 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41  ulti_exec("REPLA
54a0: 43 45 20 49 4e 54 4f 20 63 6f 6e 66 69 67 28 6e  CE INTO config(n
54b0: 61 6d 65 2c 76 61 6c 75 65 29 20 56 41 4c 55 45  ame,value) VALUE
54c0: 53 28 25 51 2c 25 51 29 22 2c 20 7a 4e 61 6d 65  S(%Q,%Q)", zName
54d0: 2c 20 7a 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e 74  , zValue);.}.int
54e0: 20 64 62 5f 67 65 74 5f 69 6e 74 28 63 6f 6e 73   db_get_int(cons
54f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
5500: 6e 74 20 64 66 6c 74 29 7b 0a 20 20 72 65 74 75  nt dflt){.  retu
5510: 72 6e 20 64 62 5f 69 6e 74 28 64 66 6c 74 2c 20  rn db_int(dflt, 
5520: 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52  "SELECT value FR
5530: 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20  OM config WHERE 
5540: 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29  name=%Q", zName)
5550: 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 73 65 74 5f  ;.}.void db_set_
5560: 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  int(const char *
5570: 7a 4e 61 6d 65 2c 20 69 6e 74 20 76 61 6c 75 65  zName, int value
5580: 29 7b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78  ){.  db_multi_ex
5590: 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f  ec("REPLACE INTO
55a0: 20 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c   config(name,val
55b0: 75 65 29 20 56 41 4c 55 45 53 28 25 51 2c 25 64  ue) VALUES(%Q,%d
55c0: 29 22 2c 20 7a 4e 61 6d 65 2c 20 76 61 6c 75 65  )", zName, value
55d0: 29 3b 0a 7d 0a 63 68 61 72 20 2a 64 62 5f 67 6c  );.}.char *db_gl
55e0: 6f 62 61 6c 5f 67 65 74 28 63 6f 6e 73 74 20 63  obal_get(const c
55f0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
5600: 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74  t char *zDefault
5610: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 5f 74  ){.  return db_t
5620: 65 78 74 28 28 63 68 61 72 2a 29 7a 44 65 66 61  ext((char*)zDefa
5630: 75 6c 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ult, .          
5640: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 76         "SELECT v
5650: 61 6c 75 65 20 46 52 4f 4d 20 67 6c 6f 62 61 6c  alue FROM global
5660: 5f 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61  _config WHERE na
5670: 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a  me=%Q", zName);.
5680: 7d 0a 76 6f 69 64 20 64 62 5f 67 6c 6f 62 61 6c  }.void db_global
5690: 5f 73 65 74 28 63 6f 6e 73 74 20 63 68 61 72 20  _set(const char 
56a0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
56b0: 61 72 20 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 64  ar *zValue){.  d
56c0: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 52 45  b_multi_exec("RE
56d0: 50 4c 41 43 45 20 49 4e 54 4f 20 67 6c 6f 62 61  PLACE INTO globa
56e0: 6c 5f 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61  l_config(name,va
56f0: 6c 75 65 29 22 0a 20 20 20 20 20 20 20 20 20 20  lue)".          
5700: 20 20 20 20 20 20 22 56 41 4c 55 45 53 28 25 51        "VALUES(%Q
5710: 2c 25 51 29 22 2c 20 7a 4e 61 6d 65 2c 20 7a 56  ,%Q)", zName, zV
5720: 61 6c 75 65 29 3b 0a 7d 0a 63 68 61 72 20 2a 64  alue);.}.char *d
5730: 62 5f 6c 67 65 74 28 63 6f 6e 73 74 20 63 68 61  b_lget(const cha
5740: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
5750: 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 29 7b  char *zDefault){
5760: 0a 20 20 72 65 74 75 72 6e 20 64 62 5f 74 65 78  .  return db_tex
5770: 74 28 28 63 68 61 72 2a 29 7a 44 65 66 61 75 6c  t((char*)zDefaul
5780: 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
5790: 20 20 20 20 20 22 53 45 4c 45 43 54 20 76 61 6c       "SELECT val
57a0: 75 65 20 46 52 4f 4d 20 76 76 61 72 20 57 48 45  ue FROM vvar WHE
57b0: 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61  RE name=%Q", zNa
57c0: 6d 65 29 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 6c  me);.}.void db_l
57d0: 73 65 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  set(const char *
57e0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  zName, const cha
57f0: 72 20 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 64 62  r *zValue){.  db
5800: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 52 45 50  _multi_exec("REP
5810: 4c 41 43 45 20 49 4e 54 4f 20 76 76 61 72 28 6e  LACE INTO vvar(n
5820: 61 6d 65 2c 76 61 6c 75 65 29 20 56 41 4c 55 45  ame,value) VALUE
5830: 53 28 25 51 2c 25 51 29 22 2c 20 7a 4e 61 6d 65  S(%Q,%Q)", zName
5840: 2c 20 7a 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e 74  , zValue);.}.int
5850: 20 64 62 5f 6c 67 65 74 5f 69 6e 74 28 63 6f 6e   db_lget_int(con
5860: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
5870: 69 6e 74 20 64 66 6c 74 29 7b 0a 20 20 72 65 74  int dflt){.  ret
5880: 75 72 6e 20 64 62 5f 69 6e 74 28 64 66 6c 74 2c  urn db_int(dflt,
5890: 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46   "SELECT value F
58a0: 52 4f 4d 20 76 76 61 72 20 57 48 45 52 45 20 6e  ROM vvar WHERE n
58b0: 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b  ame=%Q", zName);
58c0: 0a 7d 0a 76 6f 69 64 20 64 62 5f 6c 73 65 74 5f  .}.void db_lset_
58d0: 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  int(const char *
58e0: 7a 4e 61 6d 65 2c 20 69 6e 74 20 76 61 6c 75 65  zName, int value
58f0: 29 7b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78  ){.  db_multi_ex
5900: 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f  ec("REPLACE INTO
5910: 20 76 76 61 72 28 6e 61 6d 65 2c 76 61 6c 75 65   vvar(name,value
5920: 29 20 56 41 4c 55 45 53 28 25 51 2c 25 64 29 22  ) VALUES(%Q,%d)"
5930: 2c 20 7a 4e 61 6d 65 2c 20 76 61 6c 75 65 29 3b  , zName, value);
5940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e  .}../*.** COMMAN
5950: 44 3a 20 6f 70 65 6e 0a 2a 2a 0a 2a 2a 20 55 73  D: open.**.** Us
5960: 61 67 65 3a 20 6f 70 65 6e 20 46 49 4c 45 4e 41  age: open FILENA
5970: 4d 45 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  ME.**.** Open a 
5980: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
5990: 65 20 6c 6f 63 61 6c 20 72 65 70 6f 73 69 74 6f  e local reposito
59a0: 72 79 20 69 6e 20 46 49 4c 45 4e 41 4d 45 2e 20  ry in FILENAME. 
59b0: 20 41 20 63 68 65 63 6b 6f 75 74 0a 2a 2a 20 66   A checkout.** f
59c0: 6f 72 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72  or the repositor
59d0: 79 20 69 73 20 63 72 65 61 74 65 64 20 77 69 74  y is created wit
59e0: 68 20 69 74 73 20 72 6f 6f 74 20 61 74 20 74 68  h its root at th
59f0: 65 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  e working direct
5a00: 6f 72 79 2e 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ory..** See also
5a10: 20 74 68 65 20 22 63 6c 6f 73 65 22 20 63 6f 6d   the "close" com
5a20: 6d 61 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6d  mand..*/.void cm
5a30: 64 5f 6f 70 65 6e 28 76 6f 69 64 29 7b 0a 20 20  d_open(void){.  
5a40: 42 6c 6f 62 20 70 61 74 68 3b 0a 20 20 69 6e 74  Blob path;.  int
5a50: 20 76 69 64 3b 0a 20 20 73 74 61 74 69 63 20 63   vid;.  static c
5a60: 68 61 72 20 2a 61 7a 4e 65 77 41 72 67 76 5b 5d  har *azNewArgv[]
5a70: 20 3d 20 7b 20 30 2c 20 22 75 70 64 61 74 65 22   = { 0, "update"
5a80: 2c 20 22 2d 2d 6c 61 74 65 73 74 22 2c 20 30 20  , "--latest", 0 
5a90: 7d 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63 21  };.  if( g.argc!
5aa0: 3d 33 20 29 7b 0a 20 20 20 20 75 73 61 67 65 28  =3 ){.    usage(
5ab0: 22 52 45 50 4f 53 49 54 4f 52 59 2d 46 49 4c 45  "REPOSITORY-FILE
5ac0: 4e 41 4d 45 22 29 3b 0a 20 20 7d 0a 20 20 69 66  NAME");.  }.  if
5ad0: 28 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28  ( db_open_local(
5ae0: 29 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  ) ){.    fossil_
5af0: 70 61 6e 69 63 28 22 61 6c 72 65 61 64 79 20 77  panic("already w
5b00: 69 74 68 69 6e 20 61 6e 20 6f 70 65 6e 20 74 72  ithin an open tr
5b10: 65 65 20 72 6f 6f 74 65 64 20 61 74 20 25 73 22  ee rooted at %s"
5b20: 2c 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 29 3b  , g.zLocalRoot);
5b30: 0a 20 20 7d 0a 20 20 66 69 6c 65 5f 63 61 6e 6f  .  }.  file_cano
5b40: 6e 69 63 61 6c 5f 6e 61 6d 65 28 67 2e 61 72 67  nical_name(g.arg
5b50: 76 5b 32 5d 2c 20 26 70 61 74 68 29 3b 0a 20 20  v[2], &path);.  
5b60: 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f  db_open_reposito
5b70: 72 79 28 62 6c 6f 62 5f 73 74 72 28 26 70 61 74  ry(blob_str(&pat
5b80: 68 29 29 3b 0a 20 20 64 62 5f 69 6e 69 74 5f 64  h));.  db_init_d
5b90: 61 74 61 62 61 73 65 28 22 2e 2f 5f 46 4f 53 53  atabase("./_FOSS
5ba0: 49 4c 5f 22 2c 20 7a 4c 6f 63 61 6c 53 63 68 65  IL_", zLocalSche
5bb0: 6d 61 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ma, (char*)0);. 
5bc0: 20 64 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 29   db_open_local()
5bd0: 3b 0a 20 20 64 62 5f 6c 73 65 74 28 22 72 65 70  ;.  db_lset("rep
5be0: 6f 73 69 74 6f 72 79 22 2c 20 62 6c 6f 62 5f 73  ository", blob_s
5bf0: 74 72 28 26 70 61 74 68 29 29 3b 0a 20 20 76 69  tr(&path));.  vi
5c00: 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53  d = db_int(0, "S
5c10: 45 4c 45 43 54 20 70 69 64 20 46 52 4f 4d 20 70  ELECT pid FROM p
5c20: 6c 69 6e 6b 20 79 22 0a 20 20 20 20 20 20 20 20  link y".        
5c30: 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
5c40: 45 20 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c  E NOT EXISTS(SEL
5c50: 45 43 54 20 31 20 46 52 4f 4d 20 70 6c 69 6e 6b  ECT 1 FROM plink
5c60: 20 78 20 57 48 45 52 45 20 78 2e 63 69 64 3d 79   x WHERE x.cid=y
5c70: 2e 70 69 64 29 22 29 3b 0a 20 20 69 66 28 20 76  .pid)");.  if( v
5c80: 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f  id==0 ){.    db_
5c90: 6c 73 65 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f  lset_int("checko
5ca0: 75 74 22 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  ut", 1);.  }else
5cb0: 7b 0a 20 20 20 20 64 62 5f 6c 73 65 74 5f 69 6e  {.    db_lset_in
5cc0: 74 28 22 63 68 65 63 6b 6f 75 74 22 2c 20 76 69  t("checkout", vi
5cd0: 64 29 3b 0a 20 20 20 20 67 2e 61 72 67 76 20 3d  d);.    g.argv =
5ce0: 20 61 7a 4e 65 77 41 72 67 76 3b 0a 20 20 20 20   azNewArgv;.    
5cf0: 67 2e 61 72 67 63 20 3d 20 33 3b 0a 20 20 20 20  g.argc = 3;.    
5d00: 75 70 64 61 74 65 5f 63 6d 64 28 29 3b 0a 20 20  update_cmd();.  
5d10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41  }.}../*.** COMMA
5d20: 4e 44 3a 20 63 6f 6e 66 69 67 0a 2a 2a 0a 2a 2a  ND: config.**.**
5d30: 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20   Usage: %fossil 
5d40: 63 6f 6e 66 69 67 20 4e 41 4d 45 3d 56 41 4c 55  config NAME=VALU
5d50: 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  E ....**.** List
5d60: 20 6f 72 20 63 68 61 6e 67 65 20 74 68 65 20 67   or change the g
5d70: 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  lobal configurat
5d80: 69 6f 6e 20 73 65 74 74 69 6e 67 73 2e 20 20 57  ion settings.  W
5d90: 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
5da0: 2c 0a 2a 2a 20 61 6c 6c 20 73 65 74 74 69 6e 67  ,.** all setting
5db0: 73 20 61 72 65 20 6c 69 73 74 65 64 2e 20 20 41  s are listed.  A
5dc0: 72 67 75 6d 65 6e 74 73 20 6f 66 20 73 69 6d 70  rguments of simp
5dd0: 6c 79 20 4e 41 4d 45 20 63 61 75 73 65 20 74 68  ly NAME cause th
5de0: 61 74 20 73 65 74 74 69 6e 67 0a 2a 2a 20 74 6f  at setting.** to
5df0: 20 62 65 20 64 69 73 70 6c 61 79 65 64 2e 20 20   be displayed.  
5e00: 41 72 67 75 6d 65 6e 74 73 20 6f 66 20 74 68 65  Arguments of the
5e10: 20 66 6f 72 6d 20 4e 41 4d 45 3d 56 41 4c 55 45   form NAME=VALUE
5e20: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
5e30: 65 20 6f 66 0a 2a 2a 20 61 20 73 65 74 74 69 6e  e of.** a settin
5e40: 67 2e 20 20 41 72 67 75 6d 65 6e 74 73 20 6f 66  g.  Arguments of
5e50: 20 74 68 65 20 66 6f 72 6d 20 4e 41 4d 45 3d 20   the form NAME= 
5e60: 64 65 6c 65 74 65 20 61 20 73 65 74 74 69 6e 67  delete a setting
5e70: 2e 0a 2a 2a 0a 2a 2a 20 52 65 63 6f 67 6e 69 7a  ..**.** Recogniz
5e80: 65 64 20 73 65 74 74 69 6e 67 73 20 69 6e 63 6c  ed settings incl
5e90: 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 65 64 69  ude:.**.**   edi
5ea0: 74 6f 72 20 20 20 20 20 20 20 20 54 65 78 74 20  tor        Text 
5eb0: 65 64 69 74 6f 72 20 63 6f 6d 6d 61 6e 64 20 75  editor command u
5ec0: 73 65 64 20 66 6f 72 20 63 68 65 63 6b 2d 69 6e  sed for check-in
5ed0: 20 63 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   comments..**.**
5ee0: 20 20 20 63 6c 65 61 72 2d 73 69 67 6e 20 20 20     clear-sign   
5ef0: 20 43 6f 6d 6d 61 6e 64 20 75 73 65 64 20 74 6f   Command used to
5f00: 20 63 6c 65 61 72 2d 73 69 67 6e 20 6d 61 6e 69   clear-sign mani
5f10: 66 65 73 74 73 20 61 74 20 63 68 65 63 6b 2d 69  fests at check-i
5f20: 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  n..**           
5f30: 20 20 20 20 20 20 54 68 65 20 64 65 66 61 75 6c        The defaul
5f40: 74 20 69 73 20 22 67 70 67 20 2d 2d 63 6c 65 61  t is "gpg --clea
5f50: 72 73 69 67 6e 20 2d 6f 20 22 2e 0a 2a 2f 0a 76  rsign -o "..*/.v
5f60: 6f 69 64 20 63 6d 64 5f 63 6f 6e 66 69 67 28 76  oid cmd_config(v
5f70: 6f 69 64 29 7b 0a 20 20 64 62 5f 6f 70 65 6e 5f  oid){.  db_open_
5f80: 63 6f 6e 66 69 67 28 29 3b 0a 20 20 69 66 28 20  config();.  if( 
5f90: 67 2e 61 72 67 63 3e 32 20 29 7b 0a 20 20 20 20  g.argc>2 ){.    
5fa0: 69 6e 74 20 69 3b 0a 20 20 20 20 64 62 5f 62 65  int i;.    db_be
5fb0: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
5fc0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20  );.    for(i=2; 
5fd0: 69 3c 67 2e 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  i<g.argc; i++){.
5fe0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
5ff0: 65 2c 20 2a 7a 56 61 6c 75 65 3b 0a 20 20 20 20  e, *zValue;.    
6000: 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 20 20 20 20    int j;..      
6010: 7a 4e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28  zName = mprintf(
6020: 22 25 73 22 2c 20 67 2e 61 72 67 76 5b 69 5d 29  "%s", g.argv[i])
6030: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
6040: 20 7a 4e 61 6d 65 5b 6a 5d 20 26 26 20 7a 4e 61   zName[j] && zNa
6050: 6d 65 5b 6a 5d 21 3d 27 3d 27 3b 20 6a 2b 2b 29  me[j]!='='; j++)
6060: 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61  {}.      if( zNa
6070: 6d 65 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20  me[j] ){.       
6080: 20 7a 4e 61 6d 65 5b 6a 5d 20 3d 20 30 3b 0a 20   zName[j] = 0;. 
6090: 20 20 20 20 20 20 20 7a 56 61 6c 75 65 20 3d 20         zValue = 
60a0: 26 7a 4e 61 6d 65 5b 6a 2b 31 5d 3b 0a 20 20 20  &zName[j+1];.   
60b0: 20 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 5b       if( zValue[
60c0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0] ){.          
60d0: 64 62 5f 67 6c 6f 62 61 6c 5f 73 65 74 28 7a 4e  db_global_set(zN
60e0: 61 6d 65 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20  ame, zValue);.  
60f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6100: 20 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f         db_multi_
6110: 65 78 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f  exec("DELETE FRO
6120: 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20  M global_config 
6130: 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20  WHERE name=%Q", 
6140: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
6150: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
6160: 7a 56 61 6c 75 65 20 3d 20 64 62 5f 67 6c 6f 62  zValue = db_glob
6170: 61 6c 5f 67 65 74 28 7a 4e 61 6d 65 2c 20 30 29  al_get(zName, 0)
6180: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 56 61 6c  ;.      if( zVal
6190: 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  ue ){.        pr
61a0: 69 6e 74 66 28 22 25 73 3d 25 73 5c 6e 22 2c 20  intf("%s=%s\n", 
61b0: 7a 4e 61 6d 65 2c 20 7a 56 61 6c 75 65 29 3b 0a  zName, zValue);.
61c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
61d0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 20       printf("%s 
61e0: 69 73 20 75 6e 64 65 66 69 6e 65 64 5c 6e 22 2c  is undefined\n",
61f0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
6200: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 65 6e  .    }.    db_en
6210: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29  d_transaction(0)
6220: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53  ;.  }else{.    S
6230: 74 6d 74 20 71 3b 0a 20 20 20 20 64 62 5f 70 72  tmt q;.    db_pr
6240: 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43  epare(&q, "SELEC
6250: 54 20 6e 61 6d 65 2c 20 76 61 6c 75 65 20 46 52  T name, value FR
6260: 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67  OM global_config
6270: 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 22 29   ORDER BY name")
6280: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 64 62 5f  ;.    while( db_
6290: 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45  step(&q)==SQLITE
62a0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 72  _ROW ){.      pr
62b0: 69 6e 74 66 28 22 25 73 3d 25 73 5c 6e 22 2c 20  intf("%s=%s\n", 
62c0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
62d0: 71 2c 20 30 29 2c 20 64 62 5f 63 6f 6c 75 6d 6e  q, 0), db_column
62e0: 5f 74 65 78 74 28 26 71 2c 20 31 29 29 3b 0a 20  _text(&q, 1));. 
62f0: 20 20 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61     }.    db_fina
6300: 6c 69 7a 65 28 26 71 29 3b 0a 20 20 7d 0a 7d 0a  lize(&q);.  }.}.