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