0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20 /*.** Copyright
0010: 28 63 29 20 32 30 30 36 20 44 2e 20 52 69 63 68 (c) 2006 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54 ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20 te it and/or.**
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20 modify it under
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76 lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65 ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 tributed in the
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 l be useful,.**
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20 but WITHOUT ANY
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54 * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52 Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55 A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20 RPOSE. See the
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50 GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a r more details..
01e0: 2a 2a 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c 64 **.** You should
01f0: 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 61 have received a
0200: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e 55 copy of the GNU
0210: 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 0a General Public.
0220: 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e 67 ** License along
0230: 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72 61 with this libra
0240: 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69 74 ry; if not, writ
0250: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65 65 e to the.** Free
0260: 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 61 Software Founda
0270: 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20 54 tion, Inc., 59 T
0280: 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53 75 emple Place - Su
0290: 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73 74 ite 330,.** Bost
02a0: 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31 33 on, MA 02111-13
02b0: 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20 41 07, USA..**.** A
02c0: 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e uthor contact in
02d0: 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 formation:.**
02e0: 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a drh@hwaci.com.**
02f0: 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 http://www.hw
0300: 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a aci.com/drh/.**.
0310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a ***************.
0360: 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 69 **.** Code for i
0370: 6e 74 65 72 66 61 63 69 6e 67 20 74 6f 20 74 68 nterfacing to th
0380: 65 20 76 61 72 69 6f 75 73 20 64 61 74 61 62 61 e various databa
0390: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 ses..**.** There
03a0: 20 61 72 65 20 74 68 72 65 65 20 73 65 70 61 72 are three separ
03b0: 61 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c ate database fil
03c0: 65 73 20 74 68 61 74 20 66 6f 73 73 69 6c 20 69 es that fossil i
03d0: 6e 74 65 72 61 63 74 73 0a 2a 2a 20 77 69 74 68 nteracts.** with
03e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 :.**.** (1)
03f0: 54 68 65 20 22 75 73 65 72 22 20 64 61 74 61 62 The "user" datab
0400: 61 73 65 20 69 6e 20 7e 2f 2e 66 6f 73 73 69 6c ase in ~/.fossil
0410: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 .**.** (2) T
0420: 68 65 20 22 72 65 70 6f 73 69 74 6f 72 79 22 20 he "repository"
0430: 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 database.**.**
0440: 20 20 28 33 29 20 20 41 20 6c 6f 63 61 6c 20 63 (3) A local c
0450: 68 65 63 6b 6f 75 74 20 64 61 74 61 62 61 73 65 heckout database
0460: 20 6e 61 6d 65 64 20 22 5f 4d 59 43 46 47 5f 22 named "_MYCFG_"
0470: 20 6f 72 20 22 2e 66 6f 73 22 0a 2a 2a 20 20 20 or ".fos".**
0480: 20 20 20 20 20 20 61 6e 64 20 6c 6f 63 61 74 65 and locate
0490: 64 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 d at the root of
04a0: 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 70 79 20 the local copy
04b0: 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20 74 72 of the source tr
04c0: 65 65 2e 0a 2a 2a 0a 2a 2f 0a 23 69 6e 63 6c 75 ee..**.*/.#inclu
04d0: 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 de "config.h".#i
04e0: 66 6e 64 65 66 20 5f 5f 4d 49 4e 47 57 33 32 5f fndef __MINGW32_
04f0: 5f 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 _.# include <pw
0500: 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 6e 63 d.h>.#endif.#inc
0510: 6c 75 64 65 20 3c 73 71 6c 69 74 65 33 2e 68 3e lude <sqlite3.h>
0520: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 .#include <sys/t
0530: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 ypes.h>.#include
0540: 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 <sys/stat.h>.#i
0550: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 nclude <unistd.h
0560: 3e 0a 23 69 6e 63 6c 75 64 65 20 22 64 62 2e 68 >.#include "db.h
0570: 22 0a 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 "..#if INTERFACE
0580: 0a 2f 2a 0a 2a 2a 20 41 6e 20 73 69 6e 67 6c 65 ./*.** An single
0590: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 SQL statement i
05a0: 73 20 72 65 70 72 65 73 65 6e 74 65 64 20 61 73 s represented as
05b0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 an instance of
05c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a the following.**
05d0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 structure..*/.s
05e0: 74 72 75 63 74 20 53 74 6d 74 20 7b 0a 20 20 42 truct Stmt {. B
05f0: 6c 6f 62 20 73 71 6c 3b 20 20 20 20 20 20 20 20 lob sql;
0600: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 51 /* The SQ
0610: 4c 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 L for this state
0620: 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 ment */. sqlite
0630: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 3_stmt *pStmt;
0640: 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 /* The results
0650: 20 6f 66 20 73 71 6c 69 74 65 33 5f 70 72 65 70 of sqlite3_prep
0660: 61 72 65 28 29 20 2a 2f 0a 20 20 53 74 6d 74 20 are() */. Stmt
0670: 2a 70 4e 65 78 74 2c 20 2a 70 50 72 65 76 3b 20 *pNext, *pPrev;
0680: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c /* List of al
0690: 6c 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 73 74 l unfinalized st
06a0: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 7d 3b 0a 23 atements */.};.#
06b0: 65 6e 64 69 66 20 2f 2a 20 49 4e 54 45 52 46 41 endif /* INTERFA
06c0: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c CE */../*.** Cal
06d0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 l this routine w
06e0: 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 65 hen a database e
06f0: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a rror occurs..*/.
0700: 73 74 61 74 69 63 20 76 6f 69 64 20 64 62 5f 65 static void db_e
0710: 72 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a rr(const char *z
0720: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 Format, ...){.
0730: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 va_list ap;. ch
0740: 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73 74 61 72 ar *z;. va_star
0750: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a t(ap, zFormat);.
0760: 20 20 7a 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a z = vmprintf(z
0770: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 Format, ap);. v
0780: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 a_end(ap);. if(
0790: 20 67 2e 63 67 69 50 61 6e 69 63 20 29 7b 0a 20 g.cgiPanic ){.
07a0: 20 20 20 67 2e 63 67 69 50 61 6e 69 63 20 3d 20 g.cgiPanic =
07b0: 30 3b 0a 20 20 20 20 63 67 69 5f 70 72 69 6e 74 0;. cgi_print
07c0: 66 28 22 3c 68 31 3e 44 61 74 61 62 61 73 65 20 f("<h1>Database
07d0: 45 72 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20 Error</h1>\n".
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3c 70 "<p
07f0: 72 65 3e 25 68 3c 2f 70 72 65 3e 22 2c 20 7a 29 re>%h</pre>", z)
0800: 3b 0a 20 20 20 20 63 67 69 5f 72 65 70 6c 79 28 ;. cgi_reply(
0810: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
0820: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 fprintf(stderr,
0830: 22 25 73 3a 20 25 73 5c 6e 22 2c 20 67 2e 61 72 "%s: %s\n", g.ar
0840: 67 76 5b 30 5d 2c 20 7a 29 3b 0a 20 20 7d 0a 20 gv[0], z);. }.
0850: 20 64 62 5f 66 6f 72 63 65 5f 72 6f 6c 6c 62 61 db_force_rollba
0860: 63 6b 28 29 3b 0a 20 20 65 78 69 74 28 31 29 3b ck();. exit(1);
0870: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e .}..static int n
0880: 42 65 67 69 6e 20 3d 20 30 3b 20 20 20 20 20 20 Begin = 0;
0890: 2f 2a 20 4e 65 73 74 69 6e 67 20 64 65 70 74 68 /* Nesting depth
08a0: 20 6f 66 20 42 45 47 49 4e 20 2a 2f 0a 73 74 61 of BEGIN */.sta
08b0: 74 69 63 20 69 6e 74 20 69 73 4e 65 77 52 65 70 tic int isNewRep
08c0: 6f 20 3d 20 30 3b 20 20 20 2f 2a 20 54 72 75 65 o = 0; /* True
08d0: 20 69 66 20 74 68 65 20 72 65 70 6f 73 69 74 6f if the reposito
08e0: 72 79 20 69 73 20 6e 65 77 6c 79 20 63 72 65 61 ry is newly crea
08f0: 74 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e ted */.static in
0900: 74 20 64 6f 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 t doRollback = 0
0910: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 66 6f ; /* True to fo
0920: 72 63 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 2a rce a rollback *
0930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 43 6f /.static int nCo
0940: 6d 6d 69 74 48 6f 6f 6b 20 3d 20 30 3b 20 2f 2a mmitHook = 0; /*
0950: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 6d 69 Number of commi
0960: 74 20 68 6f 6f 6b 73 20 2a 2f 0a 73 74 61 74 69 t hooks */.stati
0970: 63 20 73 74 72 75 63 74 20 73 43 6f 6d 6d 69 74 c struct sCommit
0980: 48 6f 6f 6b 20 7b 0a 20 20 69 6e 74 20 28 2a 78 Hook {. int (*x
0990: 48 6f 6f 6b 29 28 76 6f 69 64 29 3b 20 20 2f 2a Hook)(void); /*
09a0: 20 46 75 6e 63 74 69 6f 6e 73 20 74 6f 20 63 61 Functions to ca
09b0: 6c 6c 20 61 74 20 64 62 5f 65 6e 64 5f 74 72 61 ll at db_end_tra
09c0: 6e 73 61 63 74 69 6f 6e 28 29 20 2a 2f 0a 20 20 nsaction() */.
09d0: 69 6e 74 20 73 65 71 75 65 6e 63 65 3b 20 20 20 int sequence;
09e0: 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 75 6e /* Call fun
09f0: 63 74 69 6f 6e 73 20 69 6e 20 73 65 71 75 65 6e ctions in sequen
0a00: 63 65 20 6f 72 64 65 72 20 2a 2f 0a 7d 20 61 48 ce order */.} aH
0a10: 6f 6f 6b 5b 35 5d 3b 0a 73 74 61 74 69 63 20 53 ook[5];.static S
0a20: 74 6d 74 20 2a 70 41 6c 6c 53 74 6d 74 20 3d 20 tmt *pAllStmt =
0a30: 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 0; /* List of a
0a40: 6c 6c 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 73 ll unfinalized s
0a50: 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 2f 2a tatements */../*
0a60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
0a70: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 is called by th
0a80: 65 20 53 51 4c 69 74 65 20 63 6f 6d 6d 69 74 2d e SQLite commit-
0a90: 68 6f 6f 6b 20 6d 65 63 68 61 6e 69 73 6d 0a 2a hook mechanism.*
0aa0: 2a 20 6a 75 73 74 20 70 72 69 6f 72 20 74 6f 20 * just prior to
0ab0: 65 61 63 68 20 6f 6d 69 74 2e 20 20 41 6c 6c 20 each omit. All
0ac0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 this routine doe
0ad0: 73 20 69 73 20 76 65 72 69 66 79 0a 2a 2a 20 74 s is verify.** t
0ae0: 68 61 74 20 6e 42 65 67 69 6e 20 72 65 61 6c 6c hat nBegin reall
0af0: 79 20 69 73 20 7a 65 72 6f 2e 20 20 54 68 61 74 y is zero. That
0b00: 20 69 6e 73 75 72 65 73 20 74 68 61 74 20 74 72 insures that tr
0b10: 61 6e 73 61 63 74 69 6f 6e 73 0a 2a 2a 20 63 61 ansactions.** ca
0b20: 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 62 79 20 61 nnot commit by a
0b30: 6e 79 20 6d 65 61 6e 73 20 6f 74 68 65 72 20 74 ny means other t
0b40: 68 61 6e 20 62 79 20 63 61 6c 6c 69 6e 67 20 64 han by calling d
0b50: 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f b_end_transactio
0b60: 6e 28 29 0a 2a 2a 20 62 65 6c 6f 77 2e 0a 2a 2a n().** below..**
0b70: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6a 75 73 74 .** This is just
0b80: 20 61 20 73 61 66 65 74 79 20 61 6e 64 20 73 61 a safety and sa
0b90: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2f 0a 73 nity check..*/.s
0ba0: 74 61 74 69 63 20 69 6e 74 20 64 62 5f 76 65 72 tatic int db_ver
0bb0: 69 66 79 5f 61 74 5f 63 6f 6d 6d 69 74 28 76 6f ify_at_commit(vo
0bc0: 69 64 20 2a 6e 6f 74 55 73 65 64 29 7b 0a 20 20 id *notUsed){.
0bd0: 69 66 28 20 6e 42 65 67 69 6e 20 29 7b 0a 20 20 if( nBegin ){.
0be0: 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 fossil_panic("
0bf0: 69 6c 6c 65 67 61 6c 20 63 6f 6d 6d 69 74 20 61 illegal commit a
0c00: 74 74 65 6d 70 74 22 29 3b 0a 20 20 20 20 72 65 ttempt");. re
0c10: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 turn 1;. }. re
0c20: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a turn 0;.}../*.**
0c30: 20 42 65 67 69 6e 20 61 6e 64 20 65 6e 64 20 61 Begin and end a
0c40: 20 6e 65 73 74 65 64 20 74 72 61 6e 73 61 63 74 nested transact
0c50: 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 62 ion.*/.void db_b
0c60: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e egin_transaction
0c70: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 6e 42 (void){. if( nB
0c80: 65 67 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 64 egin==0 ){. d
0c90: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 42 45 b_multi_exec("BE
0ca0: 47 49 4e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 GIN");. sqlit
0cb0: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 67 e3_commit_hook(g
0cc0: 2e 64 62 2c 20 64 62 5f 76 65 72 69 66 79 5f 61 .db, db_verify_a
0cd0: 74 5f 63 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 t_commit, 0);.
0ce0: 7d 0a 20 20 6e 42 65 67 69 6e 2b 2b 3b 0a 7d 0a }. nBegin++;.}.
0cf0: 76 6f 69 64 20 64 62 5f 65 6e 64 5f 74 72 61 6e void db_end_tran
0d00: 73 61 63 74 69 6f 6e 28 69 6e 74 20 72 6f 6c 6c saction(int roll
0d10: 62 61 63 6b 46 6c 61 67 29 7b 0a 20 20 69 66 28 backFlag){. if(
0d20: 20 6e 42 65 67 69 6e 3c 3d 30 20 29 20 72 65 74 nBegin<=0 ) ret
0d30: 75 72 6e 3b 0a 20 20 69 66 28 20 72 6f 6c 6c 62 urn;. if( rollb
0d40: 61 63 6b 46 6c 61 67 20 29 20 64 6f 52 6f 6c 6c ackFlag ) doRoll
0d50: 62 61 63 6b 20 3d 20 31 3b 0a 20 20 6e 42 65 67 back = 1;. nBeg
0d60: 69 6e 2d 2d 3b 0a 20 20 69 66 28 20 6e 42 65 67 in--;. if( nBeg
0d70: 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 in==0 ){. int
0d80: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b i;. for(i=0;
0d90: 20 64 6f 52 6f 6c 6c 62 61 63 6b 3d 3d 30 20 26 doRollback==0 &
0da0: 26 20 69 3c 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 3b & i<nCommitHook;
0db0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 64 6f 52 i++){. doR
0dc0: 6f 6c 6c 62 61 63 6b 20 7c 3d 20 61 48 6f 6f 6b ollback |= aHook
0dd0: 5b 69 5d 2e 78 48 6f 6f 6b 28 29 3b 0a 20 20 20 [i].xHook();.
0de0: 20 7d 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f }. db_multi_
0df0: 65 78 65 63 28 64 6f 52 6f 6c 6c 62 61 63 6b 20 exec(doRollback
0e00: 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 20 3a 20 22 ? "ROLLBACK" : "
0e10: 43 4f 4d 4d 49 54 22 29 3b 0a 20 20 20 20 64 6f COMMIT");. do
0e20: 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 Rollback = 0;.
0e30: 7d 0a 7d 0a 76 6f 69 64 20 64 62 5f 66 6f 72 63 }.}.void db_forc
0e40: 65 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 29 e_rollback(void)
0e50: 7b 0a 20 20 69 66 28 20 6e 42 65 67 69 6e 20 29 {. if( nBegin )
0e60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 {. sqlite3_ex
0e70: 65 63 28 67 2e 64 62 2c 20 22 52 4f 4c 4c 42 41 ec(g.db, "ROLLBA
0e80: 43 4b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 CK", 0, 0, 0);.
0e90: 20 20 20 69 66 28 20 69 73 4e 65 77 52 65 70 6f if( isNewRepo
0ea0: 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 63 6c 6f ){. db_clo
0eb0: 73 65 28 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 se();. unli
0ec0: 6e 6b 28 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79 nk(g.zRepository
0ed0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d Name);. }. }
0ee0: 0a 20 20 6e 42 65 67 69 6e 20 3d 20 30 3b 0a 7d . nBegin = 0;.}
0ef0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 74 61 6c 6c 20 ../*.** Install
0f00: 61 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 2e 20 20 a commit hook.
0f10: 48 6f 6f 6b 73 20 61 72 65 20 69 6e 73 74 61 6c Hooks are instal
0f20: 6c 65 64 20 69 6e 20 73 65 71 75 65 6e 63 65 20 led in sequence
0f30: 6f 72 64 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 order..** It is
0f40: 61 6e 20 65 72 72 6f 72 20 74 6f 20 69 6e 73 74 an error to inst
0f50: 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 63 6f 6d all the same com
0f60: 6d 69 74 20 68 6f 6f 6b 20 6d 6f 72 65 20 74 68 mit hook more th
0f70: 61 6e 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 45 an once..**.** E
0f80: 61 63 68 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 ach commit hook
0f90: 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 20 6f 72 is called (in or
0fa0: 64 65 72 20 6f 66 20 61 63 63 65 6e 64 69 6e 67 der of accending
0fb0: 20 73 65 71 75 65 6e 63 65 29 20 61 74 0a 2a 2a sequence) at.**
0fc0: 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 each commit ope
0fd0: 72 61 74 69 6f 6e 2e 20 20 49 66 20 61 6e 79 20 ration. If any
0fe0: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 72 65 74 75 commit hook retu
0ff0: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a rns non-zero,.**
1000: 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 63 65 the subsequence
1010: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 73 20 61 72 commit hooks ar
1020: 65 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68 e omitted and th
1030: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a e transaction.**
1040: 20 72 6f 6c 6c 73 20 62 61 63 6b 20 72 61 74 68 rolls back rath
1050: 65 72 20 74 68 61 6e 20 63 6f 6d 6d 69 74 2e 20 er than commit.
1060: 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f It is the respo
1070: 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 nsibility of the
1080: 0a 2a 2a 20 68 6f 6f 6b 73 20 74 68 65 6d 73 65 .** hooks themse
1090: 6c 76 65 73 20 74 6f 20 69 73 73 75 65 20 61 6e lves to issue an
10a0: 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 y error messages
10b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 63 6f 6d ..*/.void db_com
10c0: 6d 69 74 5f 68 6f 6f 6b 28 69 6e 74 20 28 2a 78 mit_hook(int (*x
10d0: 29 28 76 6f 69 64 29 2c 20 69 6e 74 20 73 65 71 )(void), int seq
10e0: 75 65 6e 63 65 29 7b 0a 20 20 69 6e 74 20 69 3b uence){. int i;
10f0: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6d 6d . assert( nComm
1100: 69 74 48 6f 6f 6b 20 3c 20 73 69 7a 65 6f 66 28 itHook < sizeof(
1110: 61 48 6f 6f 6b 29 2f 73 69 7a 65 6f 66 28 61 48 aHook)/sizeof(aH
1120: 6f 6f 6b 5b 31 5d 29 20 29 3b 0a 20 20 66 6f 72 ook[1]) );. for
1130: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6d 6d 69 74 48 (i=0; i<nCommitH
1140: 6f 6f 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 ook; i++){. a
1150: 73 73 65 72 74 28 20 78 21 3d 61 48 6f 6f 6b 5b ssert( x!=aHook[
1160: 69 5d 2e 78 48 6f 6f 6b 20 29 3b 0a 20 20 20 20 i].xHook );.
1170: 69 66 28 20 61 48 6f 6f 6b 5b 69 5d 2e 73 65 71 if( aHook[i].seq
1180: 75 65 6e 63 65 3e 73 65 71 75 65 6e 63 65 20 29 uence>sequence )
1190: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 20 3d 20 {. int s =
11a0: 73 65 71 75 65 6e 63 65 3b 0a 20 20 20 20 20 20 sequence;.
11b0: 69 6e 74 20 28 2a 78 53 29 28 76 6f 69 64 29 20 int (*xS)(void)
11c0: 3d 20 78 3b 0a 20 20 20 20 20 20 73 65 71 75 65 = x;. seque
11d0: 6e 63 65 20 3d 20 61 48 6f 6f 6b 5b 69 5d 2e 73 nce = aHook[i].s
11e0: 65 71 75 65 6e 63 65 3b 0a 20 20 20 20 20 20 78 equence;. x
11f0: 20 3d 20 61 48 6f 6f 6b 5b 69 5d 2e 78 48 6f 6f = aHook[i].xHoo
1200: 6b 3b 0a 20 20 20 20 20 20 61 48 6f 6f 6b 5b 69 k;. aHook[i
1210: 5d 2e 73 65 71 75 65 6e 63 65 20 3d 20 73 3b 0a ].sequence = s;.
1220: 20 20 20 20 20 20 61 48 6f 6f 6b 5b 69 5d 2e 78 aHook[i].x
1230: 48 6f 6f 6b 20 3d 20 78 53 3b 0a 20 20 20 20 7d Hook = xS;. }
1240: 0a 20 20 7d 0a 20 20 61 48 6f 6f 6b 5b 6e 43 6f . }. aHook[nCo
1250: 6d 6d 69 74 48 6f 6f 6b 5d 2e 73 65 71 75 65 6e mmitHook].sequen
1260: 63 65 20 3d 20 73 65 71 75 65 6e 63 65 3b 0a 20 ce = sequence;.
1270: 20 61 48 6f 6f 6b 5b 6e 43 6f 6d 6d 69 74 48 6f aHook[nCommitHo
1280: 6f 6b 5d 2e 78 48 6f 6f 6b 20 3d 20 78 3b 0a 20 ok].xHook = x;.
1290: 20 6e 43 6f 6d 6d 69 74 48 6f 6f 6b 2b 2b 3b 0a nCommitHook++;.
12a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 }../*.** Prepare
12b0: 20 61 20 53 74 6d 74 2e 20 20 41 73 73 75 6d 65 a Stmt. Assume
12c0: 20 74 68 61 74 20 74 68 65 20 53 74 6d 74 20 69 that the Stmt i
12d0: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 69 s previously uni
12e0: 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 20 49 nitialized..** I
12f0: 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 f the input stri
1300: 6e 67 20 63 6f 6e 74 61 69 6e 73 20 6d 75 6c 74 ng contains mult
1310: 69 70 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 iple SQL stateme
1320: 6e 74 73 2c 20 6f 6e 6c 79 20 74 68 65 20 66 69 nts, only the fi
1330: 72 73 74 0a 2a 2a 20 6f 6e 65 20 69 73 20 70 72 rst.** one is pr
1340: 6f 63 65 73 73 65 64 2e 20 20 41 6c 6c 20 73 74 ocessed. All st
1350: 61 74 65 6d 65 6e 74 73 20 62 65 79 6f 6e 64 20 atements beyond
1360: 74 68 65 20 66 69 72 73 74 20 61 72 65 20 73 69 the first are si
1370: 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 64 2e 0a lently ignored..
1380: 2a 2f 0a 69 6e 74 20 64 62 5f 76 70 72 65 70 61 */.int db_vprepa
1390: 72 65 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 re(Stmt *pStmt,
13a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 const char *zFor
13b0: 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 mat, va_list ap)
13c0: 7b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a {. char *zSql;.
13d0: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 70 53 74 blob_zero(&pSt
13e0: 6d 74 2d 3e 73 71 6c 29 3b 0a 20 20 62 6c 6f 62 mt->sql);. blob
13f0: 5f 76 61 70 70 65 6e 64 66 28 26 70 53 74 6d 74 _vappendf(&pStmt
1400: 2d 3e 73 71 6c 2c 20 7a 46 6f 72 6d 61 74 2c 20 ->sql, zFormat,
1410: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 ap);. va_end(ap
1420: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 62 6c 6f 62 );. zSql = blob
1430: 5f 73 74 72 28 26 70 53 74 6d 74 2d 3e 73 71 6c _str(&pStmt->sql
1440: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 );. if( sqlite3
1450: 5f 70 72 65 70 61 72 65 5f 76 32 28 67 2e 64 62 _prepare_v2(g.db
1460: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 , zSql, -1, &pSt
1470: 6d 74 2d 3e 70 53 74 6d 74 2c 20 30 29 21 3d 30 mt->pStmt, 0)!=0
1480: 20 29 7b 0a 20 20 20 20 64 62 5f 65 72 72 28 22 ){. db_err("
1490: 25 73 5c 6e 25 73 22 2c 20 73 71 6c 69 74 65 33 %s\n%s", sqlite3
14a0: 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 2c 20 7a _errmsg(g.db), z
14b0: 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 70 53 74 6d Sql);. }. pStm
14c0: 74 2d 3e 70 4e 65 78 74 20 3d 20 70 53 74 6d 74 t->pNext = pStmt
14d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 72 ->pPrev = 0;. r
14e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 69 6e 74 20 64 eturn 0;.}.int d
14f0: 62 5f 70 72 65 70 61 72 65 28 53 74 6d 74 20 2a b_prepare(Stmt *
1500: 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 pStmt, const cha
1510: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 r *zFormat, ...)
1520: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 {. int rc;. va
1530: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 _list ap;. va_s
1540: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 tart(ap, zFormat
1550: 29 3b 0a 20 20 72 63 20 3d 20 64 62 5f 76 70 72 );. rc = db_vpr
1560: 65 70 61 72 65 28 70 53 74 6d 74 2c 20 7a 46 6f epare(pStmt, zFo
1570: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f rmat, ap);. va_
1580: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 end(ap);. retur
1590: 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 64 62 5f 73 n rc;.}.int db_s
15a0: 74 61 74 69 63 5f 70 72 65 70 61 72 65 28 53 74 tatic_prepare(St
15b0: 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74 mt *pStmt, const
15c0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 char *zFormat,
15d0: 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d ...){. int rc =
15e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 SQLITE_OK;. if
15f0: 28 20 62 6c 6f 62 5f 73 69 7a 65 28 26 70 53 74 ( blob_size(&pSt
1600: 6d 74 2d 3e 73 71 6c 29 3d 3d 30 20 29 7b 0a 20 mt->sql)==0 ){.
1610: 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 va_list ap;.
1620: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 va_start(ap,
1630: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 72 63 zFormat);. rc
1640: 20 3d 20 64 62 5f 76 70 72 65 70 61 72 65 28 70 = db_vprepare(p
1650: 53 74 6d 74 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 Stmt, zFormat, a
1660: 70 29 3b 0a 20 20 20 20 70 53 74 6d 74 2d 3e 70 p);. pStmt->p
1670: 4e 65 78 74 20 3d 20 70 41 6c 6c 53 74 6d 74 3b Next = pAllStmt;
1680: 0a 20 20 20 20 70 53 74 6d 74 2d 3e 70 50 72 65 . pStmt->pPre
1690: 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 v = 0;. if( p
16a0: 41 6c 6c 53 74 6d 74 20 29 20 70 41 6c 6c 53 74 AllStmt ) pAllSt
16b0: 6d 74 2d 3e 70 50 72 65 76 20 3d 20 70 53 74 6d mt->pPrev = pStm
16c0: 74 3b 0a 20 20 20 20 70 41 6c 6c 53 74 6d 74 20 t;. pAllStmt
16d0: 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 76 61 5f = pStmt;. va_
16e0: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 20 20 72 end(ap);. }. r
16f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a eturn rc;.}../*.
1700: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e ** Return the in
1710: 64 65 78 20 6f 66 20 61 20 62 69 6e 64 20 70 61 dex of a bind pa
1720: 72 61 6d 65 74 65 72 0a 2a 2f 0a 73 74 61 74 69 rameter.*/.stati
1730: 63 20 69 6e 74 20 70 61 72 61 6d 49 64 78 28 53 c int paramIdx(S
1740: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 tmt *pStmt, cons
1750: 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61 t char *zParamNa
1760: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 73 me){. int i = s
1770: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 qlite3_bind_para
1780: 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 53 74 6d meter_index(pStm
1790: 74 2d 3e 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d t->pStmt, zParam
17a0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 3d 3d Name);. if( i==
17b0: 30 20 29 7b 0a 20 20 20 20 64 62 5f 65 72 72 28 0 ){. db_err(
17c0: 22 6e 6f 20 73 75 63 68 20 62 69 6e 64 20 70 61 "no such bind pa
17d0: 72 61 6d 65 74 65 72 3a 20 25 73 5c 6e 53 51 4c rameter: %s\nSQL
17e0: 3a 20 25 62 22 2c 20 7a 50 61 72 61 6d 4e 61 6d : %b", zParamNam
17f0: 65 2c 20 26 70 53 74 6d 74 2d 3e 73 71 6c 29 3b e, &pStmt->sql);
1800: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b . }. return i;
1810: 0a 7d 0a 2f 2a 0a 2a 2a 20 42 69 6e 64 20 61 6e .}./*.** Bind an
1820: 20 69 6e 74 65 67 65 72 2c 20 73 74 72 69 6e 67 integer, string
1830: 2c 20 6f 72 20 42 6c 6f 62 20 76 61 6c 75 65 20 , or Blob value
1840: 74 6f 20 61 20 6e 61 6d 65 64 20 70 61 72 61 6d to a named param
1850: 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f eter..*/.int db_
1860: 62 69 6e 64 5f 69 6e 74 28 53 74 6d 74 20 2a 70 bind_int(Stmt *p
1870: 53 74 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 Stmt, const char
1880: 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 2c 20 69 6e *zParamName, in
1890: 74 20 69 56 61 6c 75 65 29 7b 0a 20 20 72 65 74 t iValue){. ret
18a0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 urn sqlite3_bind
18b0: 5f 69 6e 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d _int(pStmt->pStm
18c0: 74 2c 20 70 61 72 61 6d 49 64 78 28 70 53 74 6d t, paramIdx(pStm
18d0: 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29 2c 20 t, zParamName),
18e0: 69 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e 74 20 64 iValue);.}.int d
18f0: 62 5f 62 69 6e 64 5f 69 6e 74 36 34 28 53 74 6d b_bind_int64(Stm
1900: 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 t *pStmt, const
1910: 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 char *zParamName
1920: 2c 20 69 36 34 20 69 56 61 6c 75 65 29 7b 0a 20 , i64 iValue){.
1930: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f return sqlite3_
1940: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 bind_int64(pStmt
1950: 2d 3e 70 53 74 6d 74 2c 20 70 61 72 61 6d 49 64 ->pStmt, paramId
1960: 78 28 70 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e x(pStmt, zParamN
1970: 61 6d 65 29 2c 20 69 56 61 6c 75 65 29 3b 0a 7d ame), iValue);.}
1980: 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 64 6f 75 .int db_bind_dou
1990: 62 6c 65 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c ble(Stmt *pStmt,
19a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 const char *zPa
19b0: 72 61 6d 4e 61 6d 65 2c 20 64 6f 75 62 6c 65 20 ramName, double
19c0: 72 56 61 6c 75 65 29 7b 0a 20 20 72 65 74 75 72 rValue){. retur
19d0: 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 n sqlite3_bind_d
19e0: 6f 75 62 6c 65 28 70 53 74 6d 74 2d 3e 70 53 74 ouble(pStmt->pSt
19f0: 6d 74 2c 20 70 61 72 61 6d 49 64 78 28 70 53 74 mt, paramIdx(pSt
1a00: 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29 2c mt, zParamName),
1a10: 20 72 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e 74 20 rValue);.}.int
1a20: 64 62 5f 62 69 6e 64 5f 74 65 78 74 28 53 74 6d db_bind_text(Stm
1a30: 74 20 2a 70 53 74 6d 74 2c 20 63 6f 6e 73 74 20 t *pStmt, const
1a40: 63 68 61 72 20 2a 7a 50 61 72 61 6d 4e 61 6d 65 char *zParamName
1a50: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 , const char *zV
1a60: 61 6c 75 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 alue){. return
1a70: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 sqlite3_bind_tex
1a80: 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 t(pStmt->pStmt,
1a90: 70 61 72 61 6d 49 64 78 28 70 53 74 6d 74 2c 20 paramIdx(pStmt,
1aa0: 7a 50 61 72 61 6d 4e 61 6d 65 29 2c 20 7a 56 61 zParamName), zVa
1ab0: 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 lue,.
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ad0: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 -1, SQLITE_STATI
1ae0: 43 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 62 69 6e C);.}.int db_bin
1af0: 64 5f 6e 75 6c 6c 28 53 74 6d 74 20 2a 70 53 74 d_null(Stmt *pSt
1b00: 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a mt, const char *
1b10: 7a 50 61 72 61 6d 4e 61 6d 65 29 7b 0a 20 20 72 zParamName){. r
1b20: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 eturn sqlite3_bi
1b30: 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2d 3e 70 nd_null(pStmt->p
1b40: 53 74 6d 74 2c 20 70 61 72 61 6d 49 64 78 28 70 Stmt, paramIdx(p
1b50: 53 74 6d 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 Stmt, zParamName
1b60: 29 29 3b 0a 7d 0a 69 6e 74 20 64 62 5f 62 69 6e ));.}.int db_bin
1b70: 64 5f 62 6c 6f 62 28 53 74 6d 74 20 2a 70 53 74 d_blob(Stmt *pSt
1b80: 6d 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a mt, const char *
1b90: 7a 50 61 72 61 6d 4e 61 6d 65 2c 20 42 6c 6f 62 zParamName, Blob
1ba0: 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 72 65 74 75 *pBlob){. retu
1bb0: 72 6e 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f rn sqlite3_bind_
1bc0: 62 6c 6f 62 28 70 53 74 6d 74 2d 3e 70 53 74 6d blob(pStmt->pStm
1bd0: 74 2c 20 70 61 72 61 6d 49 64 78 28 70 53 74 6d t, paramIdx(pStm
1be0: 74 2c 20 7a 50 61 72 61 6d 4e 61 6d 65 29 2c 0a t, zParamName),.
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c00: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 62 blob_b
1c10: 75 66 66 65 72 28 70 42 6c 6f 62 29 2c 20 62 6c uffer(pBlob), bl
1c20: 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62 29 2c 20 ob_size(pBlob),
1c30: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a SQLITE_STATIC);.
1c40: 7d 0a 0a 2f 2a 20 62 69 6e 64 5f 73 74 72 28 29 }../* bind_str()
1c50: 20 74 72 65 61 74 73 20 61 20 42 6c 6f 62 20 6f treats a Blob o
1c60: 62 6a 65 63 74 20 6c 69 6b 65 20 61 20 54 45 58 bject like a TEX
1c70: 54 20 73 74 72 69 6e 67 20 61 6e 64 20 62 69 6e T string and bin
1c80: 64 73 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20 ds it.** to the
1c90: 53 51 4c 20 76 61 72 69 61 62 6c 65 2e 20 20 43 SQL variable. C
1ca0: 6f 6e 73 74 72 61 73 74 20 74 68 69 73 20 74 6f onstrast this to
1cb0: 20 62 69 6e 64 5f 62 6c 6f 62 28 29 20 77 68 69 bind_blob() whi
1cc0: 63 68 20 74 72 65 61 74 73 0a 2a 2a 20 74 68 65 ch treats.** the
1cd0: 20 42 6c 6f 62 20 6f 62 6a 65 63 74 20 6c 69 6b Blob object lik
1ce0: 65 20 61 6e 20 53 51 4c 20 42 4c 4f 42 2e 0a 2a e an SQL BLOB..*
1cf0: 2f 0a 69 6e 74 20 64 62 5f 62 69 6e 64 5f 73 74 /.int db_bind_st
1d00: 72 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 63 r(Stmt *pStmt, c
1d10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 onst char *zPara
1d20: 6d 4e 61 6d 65 2c 20 42 6c 6f 62 20 2a 70 42 6c mName, Blob *pBl
1d30: 6f 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 ob){. return sq
1d40: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 lite3_bind_text(
1d50: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 70 61 pStmt->pStmt, pa
1d60: 72 61 6d 49 64 78 28 70 53 74 6d 74 2c 20 7a 50 ramIdx(pStmt, zP
1d70: 61 72 61 6d 4e 61 6d 65 29 2c 0a 20 20 20 20 20 aramName),.
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d90: 20 20 20 20 20 62 6c 6f 62 5f 62 75 66 66 65 72 blob_buffer
1da0: 28 70 42 6c 6f 62 29 2c 20 62 6c 6f 62 5f 73 69 (pBlob), blob_si
1db0: 7a 65 28 70 42 6c 6f 62 29 2c 20 53 51 4c 49 54 ze(pBlob), SQLIT
1dc0: 45 5f 53 54 41 54 49 43 29 3b 0a 7d 0a 0a 2f 2a E_STATIC);.}../*
1dd0: 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 53 51 4c .** Step the SQL
1de0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 statement. Ret
1df0: 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54 urn either SQLIT
1e00: 45 5f 52 4f 57 20 6f 72 20 61 6e 20 65 72 72 6f E_ROW or an erro
1e10: 72 20 63 6f 64 65 0a 2a 2a 20 6f 72 20 53 51 4c r code.** or SQL
1e20: 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 73 74 ITE_OK if the st
1e30: 61 74 65 6d 65 6e 74 20 66 69 6e 69 73 68 65 73 atement finishes
1e40: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a successfully..*
1e50: 2f 0a 69 6e 74 20 64 62 5f 73 74 65 70 28 53 74 /.int db_step(St
1e60: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69 6e mt *pStmt){. in
1e70: 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c t rc;. rc = sql
1e80: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 2d ite3_step(pStmt-
1e90: 3e 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 >pStmt);. retur
1ea0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 n rc;.}../*.** R
1eb0: 65 73 65 74 20 6f 72 20 66 69 6e 61 6c 69 7a 65 eset or finalize
1ec0: 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f a statement..*/
1ed0: 0a 69 6e 74 20 64 62 5f 72 65 73 65 74 28 53 74 .int db_reset(St
1ee0: 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69 6e mt *pStmt){. in
1ef0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 t rc = sqlite3_r
1f00: 65 73 65 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d eset(pStmt->pStm
1f10: 74 29 3b 0a 20 20 64 62 5f 63 68 65 63 6b 5f 72 t);. db_check_r
1f20: 65 73 75 6c 74 28 72 63 29 3b 0a 20 20 72 65 74 esult(rc);. ret
1f30: 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 64 62 urn rc;.}.int db
1f40: 5f 66 69 6e 61 6c 69 7a 65 28 53 74 6d 74 20 2a _finalize(Stmt *
1f50: 70 53 74 6d 74 29 7b 0a 20 20 69 6e 74 20 72 63 pStmt){. int rc
1f60: 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 ;. blob_reset(&
1f70: 70 53 74 6d 74 2d 3e 73 71 6c 29 3b 0a 20 20 72 pStmt->sql);. r
1f80: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 c = sqlite3_fina
1f90: 6c 69 7a 65 28 70 53 74 6d 74 2d 3e 70 53 74 6d lize(pStmt->pStm
1fa0: 74 29 3b 0a 20 20 64 62 5f 63 68 65 63 6b 5f 72 t);. db_check_r
1fb0: 65 73 75 6c 74 28 72 63 29 3b 0a 20 20 70 53 74 esult(rc);. pSt
1fc0: 6d 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 mt->pStmt = 0;.
1fd0: 20 69 66 28 20 70 53 74 6d 74 2d 3e 70 4e 65 78 if( pStmt->pNex
1fe0: 74 20 29 7b 0a 20 20 20 20 70 53 74 6d 74 2d 3e t ){. pStmt->
1ff0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 pNext->pPrev = p
2000: 53 74 6d 74 2d 3e 70 50 72 65 76 3b 0a 20 20 7d Stmt->pPrev;. }
2010: 0a 20 20 69 66 28 20 70 53 74 6d 74 2d 3e 70 50 . if( pStmt->pP
2020: 72 65 76 20 29 7b 0a 20 20 20 20 70 53 74 6d 74 rev ){. pStmt
2030: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d ->pPrev->pNext =
2040: 20 70 53 74 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 pStmt->pNext;.
2050: 20 7d 65 6c 73 65 20 69 66 28 20 70 41 6c 6c 53 }else if( pAllS
2060: 74 6d 74 3d 3d 70 53 74 6d 74 20 29 7b 0a 20 20 tmt==pStmt ){.
2070: 20 20 70 41 6c 6c 53 74 6d 74 20 3d 20 70 53 74 pAllStmt = pSt
2080: 6d 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 mt->pNext;. }.
2090: 20 70 53 74 6d 74 2d 3e 70 4e 65 78 74 20 3d 20 pStmt->pNext =
20a0: 30 3b 0a 20 20 70 53 74 6d 74 2d 3e 70 50 72 65 0;. pStmt->pPre
20b0: 76 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 v = 0;. return
20c0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 rc;.}../*.** Ret
20d0: 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66 urn the rowid of
20e0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 the most recent
20f0: 20 69 6e 73 65 72 74 0a 2a 2f 0a 69 36 34 20 64 insert.*/.i64 d
2100: 62 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f b_last_insert_ro
2110: 77 69 64 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 wid(void){. ret
2120: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 urn sqlite3_last
2130: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 67 2e _insert_rowid(g.
2140: 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 db);.}../*.** Re
2150: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 turn the number
2160: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65 72 of rows that wer
2170: 65 20 63 68 61 6e 67 65 64 20 62 79 20 74 68 65 e changed by the
2180: 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 most recent.**
2190: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 INSERT, UPDATE,
21a0: 6f 72 20 44 45 4c 45 54 45 2e 20 20 41 75 78 69 or DELETE. Auxi
21b0: 6c 69 61 72 79 20 63 68 61 6e 67 65 73 20 63 61 liary changes ca
21c0: 75 73 65 64 20 62 79 20 74 72 69 67 67 65 72 73 used by triggers
21d0: 0a 2a 2a 20 6f 72 20 6f 74 68 65 72 20 73 69 64 .** or other sid
21e0: 65 20 65 66 66 65 63 74 73 20 61 72 65 20 6e 6f e effects are no
21f0: 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 69 6e t counted..*/.in
2200: 74 20 64 62 5f 63 68 61 6e 67 65 73 28 76 6f 69 t db_changes(voi
2210: 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c d){. return sql
2220: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 67 2e 64 ite3_changes(g.d
2230: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 b);.}../*.** Ext
2240: 72 61 63 74 20 74 65 78 74 2c 20 69 6e 74 65 67 ract text, integ
2250: 65 72 2c 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 er, or blob valu
2260: 65 73 20 66 72 6f 6d 20 74 68 65 20 4e 2d 74 68 es from the N-th
2270: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 0a 2a column of the.*
2280: 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a * current row..*
2290: 2f 0a 69 6e 74 20 64 62 5f 63 6f 6c 75 6d 6e 5f /.int db_column_
22a0: 62 79 74 65 73 28 53 74 6d 74 20 2a 70 53 74 6d bytes(Stmt *pStm
22b0: 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 74 t, int N){. ret
22c0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 urn sqlite3_colu
22d0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2d 3e mn_bytes(pStmt->
22e0: 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 69 6e 74 pStmt, N);.}.int
22f0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 53 db_column_int(S
2300: 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 6e 74 20 tmt *pStmt, int
2310: 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c N){. return sql
2320: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 ite3_column_int(
2330: 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 pStmt->pStmt, N)
2340: 3b 0a 7d 0a 69 36 34 20 64 62 5f 63 6f 6c 75 6d ;.}.i64 db_colum
2350: 6e 5f 69 6e 74 36 34 28 53 74 6d 74 20 2a 70 53 n_int64(Stmt *pS
2360: 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 tmt, int N){. r
2370: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 6f eturn sqlite3_co
2380: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 lumn_int64(pStmt
2390: 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 64 ->pStmt, N);.}.d
23a0: 6f 75 62 6c 65 20 64 62 5f 63 6f 6c 75 6d 6e 5f ouble db_column_
23b0: 64 6f 75 62 6c 65 28 53 74 6d 74 20 2a 70 53 74 double(Stmt *pSt
23c0: 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 mt, int N){. re
23d0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 6f 6c turn sqlite3_col
23e0: 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 umn_double(pStmt
23f0: 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 63 ->pStmt, N);.}.c
2400: 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 5f 63 6f onst char *db_co
2410: 6c 75 6d 6e 5f 74 65 78 74 28 53 74 6d 74 20 2a lumn_text(Stmt *
2420: 70 53 74 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 pStmt, int N){.
2430: 20 72 65 74 75 72 6e 20 28 63 68 61 72 2a 29 73 return (char*)s
2440: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 qlite3_column_te
2450: 78 74 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c xt(pStmt->pStmt,
2460: 20 4e 29 3b 0a 7d 0a 63 6f 6e 73 74 20 63 68 61 N);.}.const cha
2470: 72 20 2a 64 62 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d r *db_column_nam
2480: 65 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c 20 69 e(Stmt *pStmt, i
2490: 6e 74 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e 20 nt N){. return
24a0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 (char*)sqlite3_c
24b0: 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 olumn_name(pStmt
24c0: 2d 3e 70 53 74 6d 74 2c 20 4e 29 3b 0a 7d 0a 69 ->pStmt, N);.}.i
24d0: 6e 74 20 64 62 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 nt db_column_cou
24e0: 6e 74 28 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b nt(Stmt *pStmt){
24f0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 . return sqlite
2500: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 3_column_count(p
2510: 53 74 6d 74 2d 3e 70 53 74 6d 74 29 3b 0a 7d 0a Stmt->pStmt);.}.
2520: 63 68 61 72 20 2a 64 62 5f 63 6f 6c 75 6d 6e 5f char *db_column_
2530: 6d 61 6c 6c 6f 63 28 53 74 6d 74 20 2a 70 53 74 malloc(Stmt *pSt
2540: 6d 74 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 72 65 mt, int N){. re
2550: 74 75 72 6e 20 6d 70 72 69 6e 74 66 28 22 25 73 turn mprintf("%s
2560: 22 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 ", db_column_tex
2570: 74 28 70 53 74 6d 74 2c 20 4e 29 29 3b 0a 7d 0a t(pStmt, N));.}.
2580: 76 6f 69 64 20 64 62 5f 63 6f 6c 75 6d 6e 5f 62 void db_column_b
2590: 6c 6f 62 28 53 74 6d 74 20 2a 70 53 74 6d 74 2c lob(Stmt *pStmt,
25a0: 20 69 6e 74 20 4e 2c 20 42 6c 6f 62 20 2a 70 42 int N, Blob *pB
25b0: 6c 6f 62 29 7b 0a 20 20 62 6c 6f 62 5f 61 70 70 lob){. blob_app
25c0: 65 6e 64 28 70 42 6c 6f 62 2c 20 73 71 6c 69 74 end(pBlob, sqlit
25d0: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 e3_column_blob(p
25e0: 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 4e 29 2c Stmt->pStmt, N),
25f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 . s
2600: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 qlite3_column_by
2610: 74 65 73 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 tes(pStmt->pStmt
2620: 2c 20 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 , N));.}../*.**
2630: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 62 6c 6f Initialize a blo
2640: 62 20 74 6f 20 61 6e 20 65 70 68 65 72 6d 65 72 b to an ephermer
2650: 61 6c 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 al copy of the c
2660: 6f 6e 74 65 6e 74 20 6f 66 20 61 0a 2a 2a 20 63 ontent of a.** c
2670: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 63 75 72 olumn in the cur
2680: 72 65 6e 74 20 72 6f 77 2e 20 20 54 68 65 20 64 rent row. The d
2690: 61 74 61 20 69 6e 20 74 68 65 20 62 6c 6f 62 20 ata in the blob
26a0: 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 69 will become.** i
26b0: 6e 76 61 6c 69 64 20 77 68 65 6e 20 74 68 65 20 nvalid when the
26c0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 65 statement is ste
26d0: 70 70 65 64 20 6f 72 20 72 65 73 65 74 2e 0a 2a pped or reset..*
26e0: 2f 0a 76 6f 69 64 20 64 62 5f 65 70 68 65 6d 65 /.void db_epheme
26f0: 72 61 6c 5f 62 6c 6f 62 28 53 74 6d 74 20 2a 70 ral_blob(Stmt *p
2700: 53 74 6d 74 2c 20 69 6e 74 20 4e 2c 20 42 6c 6f Stmt, int N, Blo
2710: 62 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 62 6c 6f b *pBlob){. blo
2720: 62 5f 69 6e 69 74 28 70 42 6c 6f 62 2c 20 73 71 b_init(pBlob, sq
2730: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f lite3_column_blo
2740: 62 28 70 53 74 6d 74 2d 3e 70 53 74 6d 74 2c 20 b(pStmt->pStmt,
2750: 4e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 N),.
2760: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e sqlite3_column
2770: 5f 62 79 74 65 73 28 70 53 74 6d 74 2d 3e 70 53 _bytes(pStmt->pS
2780: 74 6d 74 2c 20 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a tmt, N));.}../*.
2790: 2a 2a 20 43 68 65 63 6b 20 61 20 72 65 73 75 6c ** Check a resul
27a0: 74 20 63 6f 64 65 2e 20 20 49 66 20 69 74 20 69 t code. If it i
27b0: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c s not SQLITE_OK,
27c0: 20 70 72 69 6e 74 20 74 68 65 0a 2a 2a 20 63 6f print the.** co
27d0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 65 72 72 6f rresponding erro
27e0: 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 65 78 r message and ex
27f0: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 63 it..*/.void db_c
2800: 68 65 63 6b 5f 72 65 73 75 6c 74 28 69 6e 74 20 heck_result(int
2810: 72 63 29 7b 0a 20 20 69 66 28 20 72 63 21 3d 53 rc){. if( rc!=S
2820: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
2830: 64 62 5f 65 72 72 28 22 53 51 4c 20 65 72 72 6f db_err("SQL erro
2840: 72 3a 20 25 73 22 2c 20 73 71 6c 69 74 65 33 5f r: %s", sqlite3_
2850: 65 72 72 6d 73 67 28 67 2e 64 62 29 29 3b 0a 20 errmsg(g.db));.
2860: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 }.}../*.** Exec
2870: 75 74 65 20 61 20 73 69 6e 67 6c 65 20 70 72 65 ute a single pre
2880: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 pared statement
2890: 75 6e 74 69 6c 20 69 74 20 66 69 6e 69 73 68 65 until it finishe
28a0: 73 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 65 78 65 s..*/.int db_exe
28b0: 63 28 53 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a c(Stmt *pStmt){.
28c0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 68 69 6c int rc;. whil
28d0: 65 28 20 28 72 63 20 3d 20 64 62 5f 73 74 65 70 e( (rc = db_step
28e0: 28 70 53 74 6d 74 29 29 3d 3d 53 51 4c 49 54 45 (pStmt))==SQLITE
28f0: 5f 52 4f 57 20 29 7b 7d 0a 20 20 72 63 20 3d 20 _ROW ){}. rc =
2900: 64 62 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b db_reset(pStmt);
2910: 0a 20 20 64 62 5f 63 68 65 63 6b 5f 72 65 73 75 . db_check_resu
2920: 6c 74 28 72 63 29 3b 0a 20 20 72 65 74 75 72 6e lt(rc);. return
2930: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 rc;.}../*.** Ex
2940: 65 63 75 74 65 20 6d 75 6c 74 69 70 6c 65 20 53 ecute multiple S
2950: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a QL statements..*
2960: 2f 0a 69 6e 74 20 64 62 5f 6d 75 6c 74 69 5f 65 /.int db_multi_e
2970: 78 65 63 28 63 6f 6e 73 74 20 63 68 61 72 20 2a xec(const char *
2980: 7a 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 42 6c zSql, ...){. Bl
2990: 6f 62 20 73 71 6c 3b 0a 20 20 69 6e 74 20 72 63 ob sql;. int rc
29a0: 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a ;. va_list ap;.
29b0: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 char *zErr = 0
29c0: 3b 0a 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 73 ;. blob_init(&s
29d0: 71 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 76 61 5f ql, 0, 0);. va_
29e0: 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b start(ap, zSql);
29f0: 0a 20 20 62 6c 6f 62 5f 76 61 70 70 65 6e 64 66 . blob_vappendf
2a00: 28 26 73 71 6c 2c 20 7a 53 71 6c 2c 20 61 70 29 (&sql, zSql, ap)
2a10: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a ;. va_end(ap);.
2a20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 rc = sqlite3_e
2a30: 78 65 63 28 67 2e 64 62 2c 20 62 6c 6f 62 5f 62 xec(g.db, blob_b
2a40: 75 66 66 65 72 28 26 73 71 6c 29 2c 20 30 2c 20 uffer(&sql), 0,
2a50: 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 0, &zErr);. if(
2a60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc!=SQLITE_OK )
2a70: 7b 0a 20 20 20 20 64 62 5f 65 72 72 28 22 25 73 {. db_err("%s
2a80: 5c 6e 25 73 22 2c 20 7a 45 72 72 2c 20 62 6c 6f \n%s", zErr, blo
2a90: 62 5f 62 75 66 66 65 72 28 26 73 71 6c 29 29 3b b_buffer(&sql));
2aa0: 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73 65 . }. blob_rese
2ab0: 74 28 26 73 71 6c 29 3b 0a 20 20 72 65 74 75 72 t(&sql);. retur
2ac0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 n rc;.}../*.** E
2ad0: 78 65 63 75 74 65 20 61 20 71 75 65 72 79 20 61 xecute a query a
2ae0: 6e 64 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 nd return a sing
2af0: 6c 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 le integer value
2b00: 2e 0a 2a 2f 0a 69 36 34 20 64 62 5f 69 6e 74 36 ..*/.i64 db_int6
2b10: 34 28 69 36 34 20 69 44 66 6c 74 2c 20 63 6f 6e 4(i64 iDflt, con
2b20: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2e st char *zSql, .
2b30: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 ..){. va_list a
2b40: 70 3b 0a 20 20 53 74 6d 74 20 73 3b 0a 20 20 69 p;. Stmt s;. i
2b50: 36 34 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 64 rc;. va_star
2b60: 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 64 t(ap, zSql);. d
2b70: 62 5f 76 70 72 65 70 61 72 65 28 26 73 2c 20 7a b_vprepare(&s, z
2b80: 53 71 6c 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 Sql, ap);. va_e
2b90: 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 64 62 nd(ap);. if( db
2ba0: 5f 73 74 65 70 28 26 73 29 21 3d 53 51 4c 49 54 _step(&s)!=SQLIT
2bb0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 63 20 E_ROW ){. rc
2bc0: 3d 20 69 44 66 6c 74 3b 0a 20 20 7d 65 6c 73 65 = iDflt;. }else
2bd0: 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 5f 63 6f {. rc = db_co
2be0: 6c 75 6d 6e 5f 69 6e 74 36 34 28 26 73 2c 20 30 lumn_int64(&s, 0
2bf0: 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 );. }. db_fina
2c00: 6c 69 7a 65 28 26 73 29 3b 0a 20 20 72 65 74 75 lize(&s);. retu
2c10: 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 64 62 5f rn rc;.}.int db_
2c20: 69 6e 74 28 69 6e 74 20 69 44 66 6c 74 2c 20 63 int(int iDflt, c
2c30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c onst char *zSql,
2c40: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 ...){. va_list
2c50: 20 61 70 3b 0a 20 20 53 74 6d 74 20 73 3b 0a 20 ap;. Stmt s;.
2c60: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 int rc;. va_st
2c70: 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a 20 art(ap, zSql);.
2c80: 20 64 62 5f 76 70 72 65 70 61 72 65 28 26 73 2c db_vprepare(&s,
2c90: 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20 76 61 zSql, ap);. va
2ca0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 _end(ap);. if(
2cb0: 64 62 5f 73 74 65 70 28 26 73 29 21 3d 53 51 4c db_step(&s)!=SQL
2cc0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 ITE_ROW ){. r
2cd0: 63 20 3d 20 69 44 66 6c 74 3b 0a 20 20 7d 65 6c c = iDflt;. }el
2ce0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 5f se{. rc = db_
2cf0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 73 2c 20 30 column_int(&s, 0
2d00: 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 );. }. db_fina
2d10: 6c 69 7a 65 28 26 73 29 3b 0a 20 20 72 65 74 75 lize(&s);. retu
2d20: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 rn rc;.}../*.**
2d30: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 Return TRUE if t
2d40: 68 65 20 71 75 65 72 79 20 77 6f 75 6c 64 20 72 he query would r
2d50: 65 74 75 72 6e 20 31 20 6f 72 20 6d 6f 72 65 20 eturn 1 or more
2d60: 72 6f 77 73 2e 20 20 52 65 74 75 72 6e 0a 2a 2a rows. Return.**
2d70: 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 71 75 FALSE if the qu
2d80: 65 72 79 20 72 65 73 75 6c 74 20 77 6f 75 6c 64 ery result would
2d90: 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 65 74 be an empty set
2da0: 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 65 78 69 73 ..*/.int db_exis
2db0: 74 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a ts(const char *z
2dc0: 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f Sql, ...){. va_
2dd0: 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d 74 20 list ap;. Stmt
2de0: 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 s;. int rc;. v
2df0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c a_start(ap, zSql
2e00: 29 3b 0a 20 20 64 62 5f 76 70 72 65 70 61 72 65 );. db_vprepare
2e10: 28 26 73 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a (&s, zSql, ap);.
2e20: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 va_end(ap);.
2e30: 69 66 28 20 64 62 5f 73 74 65 70 28 26 73 29 21 if( db_step(&s)!
2e40: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 =SQLITE_ROW ){.
2e50: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 65 6c rc = 0;. }el
2e60: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a se{. rc = 1;.
2e70: 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a }. db_finaliz
2e80: 65 28 26 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 e(&s);. return
2e90: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 rc;.}.../*.** Ex
2ea0: 65 63 75 74 65 20 61 20 71 75 65 72 79 20 61 6e ecute a query an
2eb0: 64 20 72 65 74 75 72 6e 20 61 20 66 6c 6f 61 74 d return a float
2ec0: 69 6e 67 2d 70 6f 69 6e 74 20 76 61 6c 75 65 2e ing-point value.
2ed0: 0a 2a 2f 0a 64 6f 75 62 6c 65 20 64 62 5f 64 6f .*/.double db_do
2ee0: 75 62 6c 65 28 64 6f 75 62 6c 65 20 72 44 66 6c uble(double rDfl
2ef0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a t, const char *z
2f00: 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f Sql, ...){. va_
2f10: 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d 74 20 list ap;. Stmt
2f20: 73 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 s;. double r;.
2f30: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 va_start(ap, zS
2f40: 71 6c 29 3b 0a 20 20 64 62 5f 76 70 72 65 70 61 ql);. db_vprepa
2f50: 72 65 28 26 73 2c 20 7a 53 71 6c 2c 20 61 70 29 re(&s, zSql, ap)
2f60: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a ;. va_end(ap);.
2f70: 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 73 if( db_step(&s
2f80: 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b )!=SQLITE_ROW ){
2f90: 0a 20 20 20 20 72 20 3d 20 72 44 66 6c 74 3b 0a . r = rDflt;.
2fa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 20 3d }else{. r =
2fb0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c db_column_doubl
2fc0: 65 28 26 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 e(&s, 0);. }.
2fd0: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 73 29 3b db_finalize(&s);
2fe0: 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a . return r;.}..
2ff0: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 /*.** Execute a
3000: 71 75 65 72 79 20 61 6e 64 20 61 70 70 65 6e 64 query and append
3010: 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d the first colum
3020: 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 n of the first r
3030: 6f 77 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 73 ow.** of the res
3040: 75 6c 74 20 73 65 74 20 74 6f 20 62 6c 6f 62 20 ult set to blob
3050: 67 69 76 65 6e 20 69 6e 20 74 68 65 20 66 69 72 given in the fir
3060: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a st argument..*/.
3070: 76 6f 69 64 20 64 62 5f 62 6c 6f 62 28 42 6c 6f void db_blob(Blo
3080: 62 20 2a 70 52 65 73 75 6c 74 2c 20 63 6f 6e 73 b *pResult, cons
3090: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2e 2e t char *zSql, ..
30a0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 .){. va_list ap
30b0: 3b 0a 20 20 53 74 6d 74 20 73 3b 0a 20 20 76 61 ;. Stmt s;. va
30c0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 _start(ap, zSql)
30d0: 3b 0a 20 20 64 62 5f 76 70 72 65 70 61 72 65 28 ;. db_vprepare(
30e0: 26 73 2c 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 &s, zSql, ap);.
30f0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 va_end(ap);. i
3100: 66 28 20 64 62 5f 73 74 65 70 28 26 73 29 3d 3d f( db_step(&s)==
3110: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 SQLITE_ROW ){.
3120: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 52 blob_append(pR
3130: 65 73 75 6c 74 2c 20 73 71 6c 69 74 65 33 5f 63 esult, sqlite3_c
3140: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 73 2e 70 53 74 olumn_blob(s.pSt
3150: 6d 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 mt, 0),.
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3170: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
3180: 62 79 74 65 73 28 73 2e 70 53 74 6d 74 2c 20 30 bytes(s.pStmt, 0
3190: 29 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e ));. }. db_fin
31a0: 61 6c 69 7a 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a alize(&s);.}../*
31b0: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 .** Execute a qu
31c0: 65 72 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 ery. Return the
31d0: 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 first column of
31e0: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 0a 2a the first row.*
31f0: 2a 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 * of the result
3200: 73 65 74 20 61 73 20 61 20 73 74 72 69 6e 67 2e set as a string.
3210: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 Space to hold
3220: 74 68 65 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a the string is.**
3230: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d obtained from m
3240: 61 6c 6c 6f 63 28 29 2e 20 20 49 66 20 74 68 65 alloc(). If the
3250: 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 65 result set is e
3260: 6d 70 74 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 mpty, return.**
3270: 7a 44 65 66 61 75 6c 74 20 69 6e 73 74 65 61 64 zDefault instead
3280: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 64 62 5f 74 65 ..*/.char *db_te
3290: 78 74 28 63 68 61 72 20 2a 7a 44 65 66 61 75 6c xt(char *zDefaul
32a0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a t, const char *z
32b0: 53 71 6c 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f Sql, ...){. va_
32c0: 6c 69 73 74 20 61 70 3b 0a 20 20 53 74 6d 74 20 list ap;. Stmt
32d0: 73 3b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 7a s;. char *z = z
32e0: 44 65 66 61 75 6c 74 3b 0a 20 20 76 61 5f 73 74 Default;. va_st
32f0: 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a 20 art(ap, zSql);.
3300: 20 64 62 5f 76 70 72 65 70 61 72 65 28 26 73 2c db_vprepare(&s,
3310: 20 7a 53 71 6c 2c 20 61 70 29 3b 0a 20 20 76 61 zSql, ap);. va
3320: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 _end(ap);. if(
3330: 64 62 5f 73 74 65 70 28 26 73 29 3d 3d 53 51 4c db_step(&s)==SQL
3340: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a ITE_ROW ){. z
3350: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c = mprintf("%s",
3360: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
3370: 74 65 78 74 28 73 2e 70 53 74 6d 74 2c 20 30 29 text(s.pStmt, 0)
3380: 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 );. }. db_fina
3390: 6c 69 7a 65 28 26 73 29 3b 0a 20 20 72 65 74 75 lize(&s);. retu
33a0: 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 rn z;.}../*.** I
33b0: 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 nitialize a new
33c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 database file wi
33d0: 74 68 20 74 68 65 20 67 69 76 65 6e 20 73 63 68 th the given sch
33e0: 65 6d 61 2e 20 20 49 66 20 61 6e 79 74 68 69 6e ema. If anythin
33f0: 67 0a 2a 2a 20 67 6f 65 73 20 77 72 6f 6e 67 2c g.** goes wrong,
3400: 20 63 61 6c 6c 20 64 62 5f 65 72 72 28 29 20 74 call db_err() t
3410: 6f 20 65 78 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 o exit..*/.void
3420: 64 62 5f 69 6e 69 74 5f 64 61 74 61 62 61 73 65 db_init_database
3430: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a (. const char *
3440: 7a 46 69 6c 65 4e 61 6d 65 2c 20 20 20 2f 2a 20 zFileName, /*
3450: 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73 65 Name of database
3460: 20 66 69 6c 65 20 74 6f 20 63 72 65 61 74 65 20 file to create
3470: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 */. const char
3480: 2a 7a 53 63 68 65 6d 61 2c 20 20 20 20 20 2f 2a *zSchema, /*
3490: 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 73 First part of s
34a0: 63 68 65 6d 61 20 2a 2f 0a 20 20 2e 2e 2e 20 20 chema */. ...
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
34c0: 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 /* Additiona
34d0: 6c 20 53 51 4c 20 74 6f 20 72 75 6e 2e 20 20 54 l SQL to run. T
34e0: 65 72 6d 69 6e 61 74 65 20 77 69 74 68 20 4e 55 erminate with NU
34f0: 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 LL. */.){. sqli
3500: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 te3 *db;. int r
3510: 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 c;. const char
3520: 2a 7a 53 71 6c 3b 0a 20 20 76 61 5f 6c 69 73 74 *zSql;. va_list
3530: 20 61 70 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c ap;.. rc = sql
3540: 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 4e ite3_open(zFileN
3550: 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 69 66 28 ame, &db);. if(
3560: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc!=SQLITE_OK )
3570: 7b 0a 20 20 20 20 64 62 5f 65 72 72 28 73 71 6c {. db_err(sql
3580: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 ite3_errmsg(db))
3590: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f ;. }. sqlite3_
35a0: 65 78 65 63 28 64 62 2c 20 22 42 45 47 49 4e 20 exec(db, "BEGIN
35b0: 45 58 43 4c 55 53 49 56 45 22 2c 20 30 2c 20 30 EXCLUSIVE", 0, 0
35c0: 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c , 0);. rc = sql
35d0: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 ite3_exec(db, zS
35e0: 63 68 65 6d 61 2c 20 30 2c 20 30 2c 20 30 29 3b chema, 0, 0, 0);
35f0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 . if( rc!=SQLIT
3600: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 5f 65 E_OK ){. db_e
3610: 72 72 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 rr(sqlite3_errms
3620: 67 28 64 62 29 29 3b 0a 20 20 7d 0a 20 20 76 61 g(db));. }. va
3630: 5f 73 74 61 72 74 28 61 70 2c 20 7a 53 63 68 65 _start(ap, zSche
3640: 6d 61 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a ma);. while( (z
3650: 53 71 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c Sql = va_arg(ap,
3660: 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 21 3d const char*))!=
3670: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 0 ){. rc = sq
3680: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a lite3_exec(db, z
3690: 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 Sql, 0, 0, 0);.
36a0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
36b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 E_OK ){. db
36c0: 5f 65 72 72 28 73 71 6c 69 74 65 33 5f 65 72 72 _err(sqlite3_err
36d0: 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a msg(db));. }.
36e0: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 }. va_end(ap)
36f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 ;. sqlite3_exec
3700: 28 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 (db, "COMMIT", 0
3710: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 , 0, 0);. sqlit
3720: 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 7d 0a e3_close(db);.}.
3730: 0a 2f 2a 0a 2a 2a 20 7a 44 62 4e 61 6d 65 20 69 ./*.** zDbName i
3740: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 s the name of a
3750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 database file.
3760: 49 66 20 6e 6f 20 6f 74 68 65 72 20 64 61 74 61 If no other data
3770: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 base.** file is
3780: 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 open, then open
3790: 74 68 69 73 20 6f 6e 65 2e 20 20 49 66 20 61 6e this one. If an
37a0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 66 other database f
37b0: 69 6c 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 ile is.** alread
37c0: 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 61 74 74 y open, then att
37d0: 61 63 68 20 7a 44 62 4e 61 6d 65 20 75 73 69 6e ach zDbName usin
37e0: 67 20 74 68 65 20 6e 61 6d 65 20 7a 4c 61 62 65 g the name zLabe
37f0: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 6f 70 l..*/.void db_op
3800: 65 6e 5f 6f 72 5f 61 74 74 61 63 68 28 63 6f 6e en_or_attach(con
3810: 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 st char *zDbName
3820: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c , const char *zL
3830: 61 62 65 6c 29 7b 0a 20 20 69 66 28 20 21 67 2e abel){. if( !g.
3840: 64 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 db ){. int rc
3850: 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 = sqlite3_open(
3860: 7a 44 62 4e 61 6d 65 2c 20 26 67 2e 64 62 29 3b zDbName, &g.db);
3870: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c . if( rc!=SQL
3880: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
3890: 64 62 5f 65 72 72 28 73 71 6c 69 74 65 33 5f 65 db_err(sqlite3_e
38a0: 72 72 6d 73 67 28 67 2e 64 62 29 29 3b 0a 20 20 rrmsg(g.db));.
38b0: 20 20 7d 0a 20 20 20 20 64 62 5f 63 6f 6e 6e 65 }. db_conne
38c0: 63 74 69 6f 6e 5f 69 6e 69 74 28 29 3b 0a 20 20 ction_init();.
38d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 5f 6d 75 }else{. db_mu
38e0: 6c 74 69 5f 65 78 65 63 28 22 41 54 54 41 43 48 lti_exec("ATTACH
38f0: 20 44 41 54 41 42 41 53 45 20 25 51 20 41 53 20 DATABASE %Q AS
3900: 25 73 22 2c 20 7a 44 62 4e 61 6d 65 2c 20 7a 4c %s", zDbName, zL
3910: 61 62 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a abel);. }.}../*
3920: 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 75 73 65 .** Open the use
3930: 72 20 64 61 74 61 62 61 73 65 20 69 6e 20 22 7e r database in "~
3940: 2f 2e 66 6f 73 73 69 6c 22 2e 20 20 43 72 65 61 /.fossil". Crea
3950: 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 te the database
3960: 61 6e 65 77 20 69 66 0a 2a 2a 20 69 74 20 64 6f anew if.** it do
3970: 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 es not already e
3980: 78 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 xist..*/.void db
3990: 5f 6f 70 65 6e 5f 63 6f 6e 66 69 67 28 76 6f 69 _open_config(voi
39a0: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 4e d){. char *zDbN
39b0: 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 ame;. const cha
39c0: 72 20 2a 7a 48 6f 6d 65 3b 0a 20 20 69 66 28 20 r *zHome;. if(
39d0: 67 2e 63 6f 6e 66 69 67 4f 70 65 6e 20 29 20 72 g.configOpen ) r
39e0: 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 5f 5f eturn;.#ifdef __
39f0: 4d 49 4e 47 57 33 32 5f 5f 0a 20 20 7a 48 6f 6d MINGW32__. zHom
3a00: 65 20 3d 20 67 65 74 65 6e 76 28 22 4c 4f 43 41 e = getenv("LOCA
3a10: 4c 41 50 50 44 41 54 41 22 29 3b 0a 20 20 69 66 LAPPDATA");. if
3a20: 28 20 7a 48 6f 6d 65 3d 3d 30 20 29 7b 0a 20 20 ( zHome==0 ){.
3a30: 20 20 7a 48 6f 6d 65 20 3d 20 67 65 74 65 6e 76 zHome = getenv
3a40: 28 22 41 50 50 44 41 54 41 22 29 3b 0a 20 20 20 ("APPDATA");.
3a50: 20 69 66 28 20 7a 48 6f 6d 65 3d 3d 30 20 29 7b if( zHome==0 ){
3a60: 0a 20 20 20 20 20 20 7a 48 6f 6d 65 20 3d 20 67 . zHome = g
3a70: 65 74 65 6e 76 28 22 48 4f 4d 45 50 41 54 48 22 etenv("HOMEPATH"
3a80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c );. }. }.#el
3a90: 73 65 0a 20 20 7a 48 6f 6d 65 20 3d 20 67 65 74 se. zHome = get
3aa0: 65 6e 76 28 22 48 4f 4d 45 22 29 3b 0a 23 65 6e env("HOME");.#en
3ab0: 64 69 66 0a 20 20 69 66 28 20 7a 48 6f 6d 65 3d dif. if( zHome=
3ac0: 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f 65 72 72 =0 ){. db_err
3ad0: 28 22 63 61 6e 6e 6f 74 20 6c 6f 63 61 6c 20 68 ("cannot local h
3ae0: 6f 6d 65 20 64 69 72 65 63 74 6f 72 79 22 29 3b ome directory");
3af0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 5f 5f 4d 49 . }.#ifdef __MI
3b00: 4e 47 57 33 32 5f 5f 0a 20 20 2f 2a 20 2e 20 66 NGW32__. /* . f
3b10: 69 6c 65 6e 61 6d 65 73 20 67 69 76 65 20 73 6f ilenames give so
3b20: 6d 65 20 77 69 6e 64 6f 77 20 73 79 73 74 65 6d me window system
3b30: 73 20 70 72 6f 62 6c 65 6d 73 20 61 6e 64 20 6d s problems and m
3b40: 61 6e 79 20 61 70 70 73 20 70 72 6f 62 6c 65 6d any apps problem
3b50: 73 20 2a 2f 0a 20 20 7a 44 62 4e 61 6d 65 20 3d s */. zDbName =
3b60: 20 6d 70 72 69 6e 74 66 28 22 25 2f 2f 5f 66 6f mprintf("%//_fo
3b70: 73 73 69 6c 22 2c 20 7a 48 6f 6d 65 29 3b 0a 23 ssil", zHome);.#
3b80: 65 6c 73 65 0a 20 20 7a 44 62 4e 61 6d 65 20 3d else. zDbName =
3b90: 20 6d 70 72 69 6e 74 66 28 22 25 73 2f 2e 66 6f mprintf("%s/.fo
3ba0: 73 73 69 6c 22 2c 20 7a 48 6f 6d 65 29 3b 0a 23 ssil", zHome);.#
3bb0: 65 6e 64 69 66 0a 20 20 69 66 28 20 66 69 6c 65 endif. if( file
3bc0: 5f 73 69 7a 65 28 7a 44 62 4e 61 6d 65 29 3c 31 _size(zDbName)<1
3bd0: 30 32 34 2a 33 20 29 7b 0a 20 20 20 20 64 62 5f 024*3 ){. db_
3be0: 69 6e 69 74 5f 64 61 74 61 62 61 73 65 28 7a 44 init_database(zD
3bf0: 62 4e 61 6d 65 2c 20 7a 43 6f 6e 66 69 67 53 63 bName, zConfigSc
3c00: 68 65 6d 61 2c 20 28 63 68 61 72 2a 29 30 29 3b hema, (char*)0);
3c10: 0a 20 20 7d 0a 20 20 64 62 5f 6f 70 65 6e 5f 6f . }. db_open_o
3c20: 72 5f 61 74 74 61 63 68 28 7a 44 62 4e 61 6d 65 r_attach(zDbName
3c30: 2c 20 22 63 6f 6e 66 69 67 64 62 22 29 3b 0a 20 , "configdb");.
3c40: 20 67 2e 63 6f 6e 66 69 67 4f 70 65 6e 20 3d 20 g.configOpen =
3c50: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 7a 1;.}../*.** If z
3c60: 44 62 4e 61 6d 65 20 69 73 20 61 20 76 61 6c 69 DbName is a vali
3c70: 64 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 d local database
3c80: 20 66 69 6c 65 2c 20 6f 70 65 6e 20 69 74 20 61 file, open it a
3c90: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 72 75 nd return.** tru
3ca0: 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 e. If it is not
3cb0: 20 61 20 76 61 6c 69 64 20 6c 6f 63 61 6c 20 64 a valid local d
3cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 atabase file, re
3cd0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 turn 0..*/.stati
3ce0: 63 20 69 6e 74 20 69 73 56 61 6c 69 64 4c 6f 63 c int isValidLoc
3cf0: 61 6c 44 62 28 63 6f 6e 73 74 20 63 68 61 72 20 alDb(const char
3d00: 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 36 34 *zDbName){. i64
3d10: 20 6c 73 69 7a 65 3b 0a 20 20 69 66 28 20 61 63 lsize;. if( ac
3d20: 63 65 73 73 28 7a 44 62 4e 61 6d 65 2c 20 46 5f cess(zDbName, F_
3d30: 4f 4b 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a OK) ) return 0;.
3d40: 20 20 6c 73 69 7a 65 20 3d 20 66 69 6c 65 5f 73 lsize = file_s
3d50: 69 7a 65 28 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 ize(zDbName);.
3d60: 69 66 28 20 6c 73 69 7a 65 25 31 30 32 34 21 3d if( lsize%1024!=
3d70: 30 20 7c 7c 20 6c 73 69 7a 65 3c 34 30 39 36 20 0 || lsize<4096
3d80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 64 62 ) return 0;. db
3d90: 5f 6f 70 65 6e 5f 6f 72 5f 61 74 74 61 63 68 28 _open_or_attach(
3da0: 7a 44 62 4e 61 6d 65 2c 20 22 6c 6f 63 61 6c 64 zDbName, "locald
3db0: 62 22 29 3b 0a 20 20 67 2e 6c 6f 63 61 6c 4f 70 b");. g.localOp
3dc0: 65 6e 20 3d 20 31 3b 0a 20 20 64 62 5f 6f 70 65 en = 1;. db_ope
3dd0: 6e 5f 63 6f 6e 66 69 67 28 29 3b 0a 20 20 64 62 n_config();. db
3de0: 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 _open_repository
3df0: 28 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b (0);. return 1;
3e00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 .}../*.** Locate
3e10: 20 74 68 65 20 72 6f 6f 74 20 64 69 72 65 63 74 the root direct
3e20: 6f 72 79 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c ory of the local
3e30: 20 72 65 70 6f 73 69 74 6f 72 79 20 74 72 65 65 repository tree
3e40: 2e 20 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20 64 . The root.** d
3e50: 69 72 65 63 74 6f 72 79 20 69 73 20 66 6f 75 6e irectory is foun
3e60: 64 20 62 79 20 73 65 61 72 63 68 69 6e 67 20 66 d by searching f
3e70: 6f 72 20 61 20 66 69 6c 65 20 6e 61 6d 65 64 20 or a file named
3e80: 22 5f 4d 59 43 46 47 5f 22 20 6f 72 20 22 2e 66 "_MYCFG_" or ".f
3e90: 6f 73 22 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 os".** that cont
3ea0: 61 69 6e 73 20 61 20 76 61 6c 69 64 20 72 65 70 ains a valid rep
3eb0: 6f 73 69 74 6f 72 79 20 64 61 74 61 62 61 73 65 ository database
3ec0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 61 ..**.** If no va
3ed0: 6c 69 64 20 5f 4d 59 43 46 47 5f 20 6f 72 20 2e lid _MYCFG_ or .
3ee0: 66 6f 73 20 66 69 6c 65 20 69 73 20 66 6f 75 6e fos file is foun
3ef0: 64 2c 20 77 65 20 6d 6f 76 65 20 75 70 20 6f 6e d, we move up on
3f00: 65 20 6c 65 76 65 6c 20 61 6e 64 20 0a 2a 2a 20 e level and .**
3f10: 74 72 79 20 61 67 61 69 6e 2e 20 4f 6e 63 65 20 try again. Once
3f20: 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e the file is foun
3f30: 64 2c 20 74 68 65 20 67 2e 7a 4c 6f 63 61 6c 52 d, the g.zLocalR
3f40: 6f 6f 74 20 76 61 72 69 61 62 6c 65 20 69 73 20 oot variable is
3f50: 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f set.** to the ro
3f60: 6f 74 20 6f 66 20 74 68 65 20 72 65 70 6f 73 69 ot of the reposi
3f70: 74 6f 72 79 20 74 72 65 65 20 61 6e 64 20 74 68 tory tree and th
3f80: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 is routine retur
3f90: 6e 73 20 31 2e 20 20 49 66 0a 2a 2a 20 6e 6f 20 ns 1. If.** no
3fa0: 64 61 74 61 62 61 73 65 20 69 73 20 66 6f 75 6e database is foun
3fb0: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 d, then this rou
3fc0: 74 69 6e 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a tine return 0..*
3fd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e *.** This routin
3fe0: 65 20 61 6c 77 61 79 73 20 6f 70 65 6e 73 20 74 e always opens t
3ff0: 68 65 20 75 73 65 72 20 64 61 74 61 62 61 73 65 he user database
4000: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 regardless of w
4010: 68 65 74 68 65 72 20 6f 72 0a 2a 2a 20 6e 6f 74 hether or.** not
4020: 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20 the repository
4030: 64 61 74 61 62 61 73 65 20 69 73 20 66 6f 75 6e database is foun
4040: 64 2e 20 20 49 66 20 74 68 65 20 5f 4d 59 43 46 d. If the _MYCF
4050: 47 5f 20 6f 72 20 2e 66 6f 73 20 66 69 6c 65 0a G_ or .fos file.
4060: 2a 2a 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 20 ** is found, it
4070: 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 is attached to t
4080: 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 he open database
4090: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 6f 2e connection too.
40a0: 0a 2a 2f 0a 69 6e 74 20 64 62 5f 6f 70 65 6e 5f .*/.int db_open_
40b0: 6c 6f 63 61 6c 28 76 6f 69 64 29 7b 0a 20 20 69 local(void){. i
40c0: 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68 61 72 20 nt i, n;. char
40d0: 7a 50 77 64 5b 32 30 30 30 5d 3b 0a 20 20 63 68 zPwd[2000];. ch
40e0: 61 72 20 2a 7a 50 77 64 43 6f 6e 76 3b 0a 20 20 ar *zPwdConv;.
40f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
4100: 72 20 2a 61 44 62 4e 61 6d 65 5b 5d 20 3d 20 7b r *aDbName[] = {
4110: 20 22 2f 5f 4d 59 43 46 47 5f 22 2c 20 22 2f 2e "/_MYCFG_", "/.
4120: 66 6f 73 22 20 7d 3b 0a 20 20 0a 20 20 69 66 28 fos" };. . if(
4130: 20 67 2e 6c 6f 63 61 6c 4f 70 65 6e 29 20 72 65 g.localOpen) re
4140: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 67 65 turn 1;. if( ge
4150: 74 63 77 64 28 7a 50 77 64 2c 20 73 69 7a 65 6f tcwd(zPwd, sizeo
4160: 66 28 7a 50 77 64 29 2d 32 30 29 3d 3d 30 20 29 f(zPwd)-20)==0 )
4170: 7b 0a 20 20 20 20 64 62 5f 65 72 72 28 22 70 77 {. db_err("pw
4180: 64 20 74 6f 6f 20 62 69 67 3a 20 6d 61 78 20 25 d too big: max %
4190: 64 22 2c 20 73 69 7a 65 6f 66 28 7a 50 77 64 29 d", sizeof(zPwd)
41a0: 2d 32 30 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 -20);. }. n =
41b0: 73 74 72 6c 65 6e 28 7a 50 77 64 29 3b 0a 20 20 strlen(zPwd);.
41c0: 7a 50 77 64 43 6f 6e 76 20 3d 20 6d 70 72 69 6e zPwdConv = mprin
41d0: 74 66 28 22 25 2f 22 2c 20 7a 50 77 64 29 3b 0a tf("%/", zPwd);.
41e0: 20 20 73 74 72 6e 63 70 79 28 7a 50 77 64 2c 20 strncpy(zPwd,
41f0: 7a 50 77 64 43 6f 6e 76 2c 20 32 30 30 30 2d 32 zPwdConv, 2000-2
4200: 30 29 3b 0a 20 20 66 72 65 65 28 7a 50 77 64 43 0);. free(zPwdC
4210: 6f 6e 76 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e onv);. while( n
4220: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 61 63 >0 ){. if( ac
4230: 63 65 73 73 28 7a 50 77 64 2c 20 57 5f 4f 4b 29 cess(zPwd, W_OK)
4240: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 66 6f ) break;. fo
4250: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 r(i=0; i<sizeof(
4260: 61 44 62 4e 61 6d 65 29 2f 73 69 7a 65 6f 66 28 aDbName)/sizeof(
4270: 61 44 62 4e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b aDbName[0]); i++
4280: 29 7b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 ){. strcpy(
4290: 26 7a 50 77 64 5b 6e 5d 2c 20 61 44 62 4e 61 6d &zPwd[n], aDbNam
42a0: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 e[i]);. if(
42b0: 20 69 73 56 61 6c 69 64 4c 6f 63 61 6c 44 62 28 isValidLocalDb(
42c0: 7a 50 77 64 29 20 29 7b 0a 20 20 20 20 20 20 20 zPwd) ){.
42d0: 20 2f 2a 20 46 6f 75 6e 64 20 61 20 76 61 6c 69 /* Found a vali
42e0: 64 20 63 68 65 63 6b 6f 75 74 20 64 61 74 61 62 d checkout datab
42f0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 ase file */.
4300: 20 20 20 20 7a 50 77 64 5b 6e 5d 20 3d 20 30 3b zPwd[n] = 0;
4310: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 . while(
4320: 6e 3e 31 20 26 26 20 7a 50 77 64 5b 6e 2d 31 5d n>1 && zPwd[n-1]
4330: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 =='/' ){.
4340: 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 n--;.
4350: 20 20 7a 50 77 64 5b 6e 5d 20 3d 20 30 3b 0a 20 zPwd[n] = 0;.
4360: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
4370: 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 20 3d 20 g.zLocalRoot =
4380: 6d 70 72 69 6e 74 66 28 22 25 73 2f 22 2c 20 7a mprintf("%s/", z
4390: 50 77 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 Pwd);. re
43a0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a turn 1;. }.
43b0: 20 20 20 20 7d 0a 20 20 20 20 6e 2d 2d 3b 0a 20 }. n--;.
43c0: 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 while( n>0 &&
43d0: 20 7a 50 77 64 5b 6e 5d 21 3d 27 2f 27 20 29 7b zPwd[n]!='/' ){
43e0: 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20 77 68 69 6c n--; }. whil
43f0: 65 28 20 6e 3e 30 20 26 26 20 7a 50 77 64 5b 6e e( n>0 && zPwd[n
4400: 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b -1]=='/' ){ n--;
4410: 20 7d 0a 20 20 20 20 7a 50 77 64 5b 6e 5d 20 3d }. zPwd[n] =
4420: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 20 0;. }.. /* A
4430: 63 68 65 63 6b 6f 75 74 20 64 61 74 61 62 61 73 checkout databas
4440: 65 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 e file could not
4450: 20 62 65 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 72 be found */. r
4460: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a eturn 0;.}../*.*
4470: 2a 20 4f 70 65 6e 20 74 68 65 20 72 65 70 6f 73 * Open the repos
4480: 69 74 6f 72 79 20 64 61 74 61 62 61 73 65 20 67 itory database g
4490: 69 76 65 6e 20 62 79 20 7a 44 62 4e 61 6d 65 2e iven by zDbName.
44a0: 20 20 49 66 20 7a 44 62 4e 61 6d 65 3d 3d 4e 55 If zDbName==NU
44b0: 4c 4c 20 74 68 65 6e 0a 2a 2a 20 67 65 74 20 74 LL then.** get t
44c0: 68 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 he name from the
44d0: 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 6c 6f already open lo
44e0: 63 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f cal database..*/
44f0: 0a 76 6f 69 64 20 64 62 5f 6f 70 65 6e 5f 72 65 .void db_open_re
4500: 70 6f 73 69 74 6f 72 79 28 63 6f 6e 73 74 20 63 pository(const c
4510: 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 har *zDbName){.
4520: 20 69 66 28 20 67 2e 72 65 70 6f 73 69 74 6f 72 if( g.repositor
4530: 79 4f 70 65 6e 20 29 20 72 65 74 75 72 6e 3b 0a yOpen ) return;.
4540: 20 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 if( zDbName==0
4550: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 2e 6c 6f ){. if( g.lo
4560: 63 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 calOpen ){.
4570: 20 7a 44 62 4e 61 6d 65 20 3d 20 64 62 5f 6c 67 zDbName = db_lg
4580: 65 74 28 22 72 65 70 6f 73 69 74 6f 72 79 22 2c et("repository",
4590: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 0);. }. i
45a0: 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 7b f( zDbName==0 ){
45b0: 0a 20 20 20 20 20 20 64 62 5f 65 72 72 28 22 75 . db_err("u
45c0: 6e 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 nable to find th
45d0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 72 65 70 6f e name of a repo
45e0: 73 69 74 6f 72 79 20 64 61 74 61 62 61 73 65 22 sitory database"
45f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 );. }. }. i
4600: 66 28 20 61 63 63 65 73 73 28 7a 44 62 4e 61 6d f( access(zDbNam
4610: 65 2c 20 52 5f 4f 4b 29 20 7c 7c 20 66 69 6c 65 e, R_OK) || file
4620: 5f 73 69 7a 65 28 7a 44 62 4e 61 6d 65 29 3c 31 _size(zDbName)<1
4630: 30 32 34 20 29 7b 0a 20 20 20 20 69 66 28 20 61 024 ){. if( a
4640: 63 63 65 73 73 28 7a 44 62 4e 61 6d 65 2c 20 30 ccess(zDbName, 0
4650: 29 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 ) ){. fossi
4660: 6c 5f 70 61 6e 69 63 28 22 72 65 70 6f 73 69 74 l_panic("reposit
4670: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 ory does not exi
4680: 73 74 73 20 6f 72 22 0a 20 20 20 20 20 20 20 20 sts or".
4690: 20 20 20 20 20 20 20 20 20 20 20 22 20 69 73 20 " is
46a0: 69 6e 20 61 6e 20 75 6e 72 65 61 64 61 62 6c 65 in an unreadable
46b0: 20 64 69 72 65 63 74 6f 72 79 3a 20 25 73 22 2c directory: %s",
46c0: 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 20 20 7d zDbName);. }
46d0: 65 6c 73 65 20 69 66 28 20 61 63 63 65 73 73 28 else if( access(
46e0: 7a 44 62 4e 61 6d 65 2c 20 52 5f 4f 4b 29 20 29 zDbName, R_OK) )
46f0: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 {. fossil_p
4700: 61 6e 69 63 28 22 72 65 61 64 20 70 65 72 6d 69 anic("read permi
4710: 73 73 69 6f 6e 20 64 65 6e 69 65 64 20 66 6f 72 ssion denied for
4720: 20 72 65 70 6f 73 69 74 6f 72 79 20 25 73 22 2c repository %s",
4730: 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 20 20 7d zDbName);. }
4740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 73 73 else{. foss
4750: 69 6c 5f 70 61 6e 69 63 28 22 6e 6f 74 20 61 20 il_panic("not a
4760: 76 61 6c 69 64 20 72 65 70 6f 73 69 74 6f 72 79 valid repository
4770: 3a 20 25 73 22 2c 20 7a 44 62 4e 61 6d 65 29 3b : %s", zDbName);
4780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 5f . }. }. db_
4790: 6f 70 65 6e 5f 6f 72 5f 61 74 74 61 63 68 28 7a open_or_attach(z
47a0: 44 62 4e 61 6d 65 2c 20 22 72 65 70 6f 73 69 74 DbName, "reposit
47b0: 6f 72 79 22 29 3b 0a 20 20 67 2e 72 65 70 6f 73 ory");. g.repos
47c0: 69 74 6f 72 79 4f 70 65 6e 20 3d 20 31 3b 0a 20 itoryOpen = 1;.
47d0: 20 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79 4e 61 g.zRepositoryNa
47e0: 6d 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 me = mprintf("%s
47f0: 22 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 7d 0a 0a ", zDbName);.}..
4800: 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e /*.** Try to fin
4810: 64 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 d the repository
4820: 20 61 6e 64 20 6f 70 65 6e 20 69 74 2e 20 20 55 and open it. U
4830: 73 65 20 74 68 65 20 2d 52 20 6f 72 20 2d 2d 72 se the -R or --r
4840: 65 70 6f 73 69 74 6f 72 79 0a 2a 2a 20 6f 70 74 epository.** opt
4850: 69 6f 6e 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 ion to locate th
4860: 65 20 72 65 70 6f 73 69 74 6f 72 79 2e 20 20 49 e repository. I
4870: 66 20 6e 6f 20 73 75 63 68 20 6f 70 74 69 6f 6e f no such option
4880: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 is available, t
4890: 68 65 6e 0a 2a 2a 20 75 73 65 20 74 68 65 20 72 hen.** use the r
48a0: 65 70 6f 73 69 74 6f 72 79 20 6f 66 20 74 68 65 epository of the
48b0: 20 6f 70 65 6e 20 63 68 65 63 6b 6f 75 74 20 69 open checkout i
48c0: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a f there is one..
48d0: 2a 2a 0a 2a 2a 20 45 72 72 6f 72 20 6f 75 74 20 **.** Error out
48e0: 69 66 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 if the repositor
48f0: 79 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e y cannot be open
4900: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 66 ed..*/.void db_f
4910: 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f 72 65 70 ind_and_open_rep
4920: 6f 73 69 74 6f 72 79 28 69 6e 74 20 65 72 72 49 ository(int errI
4930: 66 4e 6f 74 46 6f 75 6e 64 29 7b 0a 20 20 63 6f fNotFound){. co
4940: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 70 20 3d nst char *zRep =
4950: 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 72 65 find_option("re
4960: 70 6f 73 69 74 6f 72 79 22 2c 20 22 52 22 2c 20 pository", "R",
4970: 31 29 3b 0a 20 20 69 66 28 20 7a 52 65 70 3d 3d 1);. if( zRep==
4980: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 5f 0 ){. if( db_
4990: 6f 70 65 6e 5f 6c 6f 63 61 6c 28 29 3d 3d 30 20 open_local()==0
49a0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 72 65 ){. goto re
49b0: 70 5f 6e 6f 74 5f 66 6f 75 6e 64 3b 0a 20 20 20 p_not_found;.
49c0: 20 7d 0a 20 20 20 20 7a 52 65 70 20 3d 20 64 62 }. zRep = db
49d0: 5f 6c 67 65 74 28 22 72 65 70 6f 73 69 74 6f 72 _lget("repositor
49e0: 79 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 y", 0);. if(
49f0: 7a 52 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 zRep==0 ){.
4a00: 20 67 6f 74 6f 20 72 65 70 5f 6e 6f 74 5f 66 6f goto rep_not_fo
4a10: 75 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 und;. }. }.
4a20: 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 db_open_reposit
4a30: 6f 72 79 28 7a 52 65 70 29 3b 0a 20 20 69 66 28 ory(zRep);. if(
4a40: 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 g.repositoryOpe
4a50: 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b n ){. return;
4a60: 0a 20 20 7d 0a 72 65 70 5f 6e 6f 74 5f 66 6f 75 . }.rep_not_fou
4a70: 6e 64 3a 0a 20 20 69 66 28 20 65 72 72 49 66 4e nd:. if( errIfN
4a80: 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 66 otFound ){. f
4a90: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 75 73 65 ossil_fatal("use
4aa0: 20 2d 2d 72 65 70 6f 73 69 74 6f 72 79 20 6f 72 --repository or
4ab0: 20 2d 52 20 74 6f 20 73 70 65 63 69 66 69 63 20 -R to specific
4ac0: 74 68 65 20 72 65 70 6f 73 69 74 6f 72 79 20 64 the repository d
4ad0: 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 7d atabase");. }.}
4ae0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 ../*.** Open the
4af0: 20 6c 6f 63 61 6c 20 64 61 74 61 62 61 73 65 2e local database.
4b00: 20 20 49 66 20 75 6e 61 62 6c 65 2c 20 65 78 69 If unable, exi
4b10: 74 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e t with an error.
4b20: 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f 6d 75 73 74 .*/.void db_must
4b30: 5f 62 65 5f 77 69 74 68 69 6e 5f 74 72 65 65 28 _be_within_tree(
4b40: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 64 62 5f void){. if( db_
4b50: 6f 70 65 6e 5f 6c 6f 63 61 6c 28 29 3d 3d 30 20 open_local()==0
4b60: 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 ){. fossil_fa
4b70: 74 61 6c 28 22 6e 6f 74 20 77 69 74 68 69 6e 20 tal("not within
4b80: 61 6e 20 6f 70 65 6e 20 63 68 65 63 6b 6f 75 74 an open checkout
4b90: 22 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 6f 70 65 ");. }. db_ope
4ba0: 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 30 29 3b n_repository(0);
4bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 .}../*.** Close
4bc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e the database con
4bd0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 nection..*/.void
4be0: 20 64 62 5f 63 6c 6f 73 65 28 76 6f 69 64 29 7b db_close(void){
4bf0: 0a 20 20 69 66 28 20 67 2e 64 62 3d 3d 30 20 29 . if( g.db==0 )
4c00: 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 return;. while
4c10: 28 20 70 41 6c 6c 53 74 6d 74 20 29 7b 0a 20 20 ( pAllStmt ){.
4c20: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 70 41 db_finalize(pA
4c30: 6c 6c 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 67 llStmt);. }. g
4c40: 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 6e 20 .repositoryOpen
4c50: 3d 20 30 3b 0a 20 20 67 2e 6c 6f 63 61 6c 4f 70 = 0;. g.localOp
4c60: 65 6e 20 3d 20 30 3b 0a 20 20 67 2e 63 6f 6e 66 en = 0;. g.conf
4c70: 69 67 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 igOpen = 0;. sq
4c80: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 67 2e 64 62 lite3_close(g.db
4c90: 29 3b 0a 20 20 67 2e 64 62 20 3d 20 30 3b 0a 7d );. g.db = 0;.}
4ca0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 .../*.** Create
4cb0: 61 20 6e 65 77 20 65 6d 70 74 79 20 72 65 70 6f a new empty repo
4cc0: 73 69 74 6f 72 79 20 64 61 74 61 62 61 73 65 20 sitory database
4cd0: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 6e with the given n
4ce0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 ame..**.** Only
4cf0: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 69 6e the schema is in
4d00: 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 itialized. The
4d10: 72 65 71 75 69 72 65 64 20 56 41 52 20 74 61 62 required VAR tab
4d20: 6c 65 73 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 les entries.** a
4d30: 72 65 20 6e 6f 74 20 73 65 74 20 62 79 20 74 68 re not set by th
4d40: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 6d is routine and m
4d50: 75 73 74 20 62 65 20 73 65 74 20 73 65 70 61 72 ust be set separ
4d60: 61 74 65 6c 79 20 69 6e 20 6f 72 64 65 72 0a 2a ately in order.*
4d70: 2a 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 65 * to make the ne
4d80: 77 20 66 69 6c 65 20 61 20 76 61 6c 69 64 20 64 w file a valid d
4d90: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 atabase..*/.void
4da0: 20 64 62 5f 63 72 65 61 74 65 5f 72 65 70 6f 73 db_create_repos
4db0: 69 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 itory(const char
4dc0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 *zFilename){.
4dd0: 64 62 5f 69 6e 69 74 5f 64 61 74 61 62 61 73 65 db_init_database
4de0: 28 0a 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 (. zFilename
4df0: 2c 0a 20 20 20 20 20 7a 52 65 70 6f 73 69 74 6f ,. zReposito
4e00: 72 79 53 63 68 65 6d 61 31 2c 0a 20 20 20 20 20 rySchema1,.
4e10: 7a 52 65 70 6f 73 69 74 6f 72 79 53 63 68 65 6d zRepositorySchem
4e20: 61 32 2c 0a 20 20 20 20 20 28 63 68 61 72 2a 29 a2,. (char*)
4e30: 30 0a 20 20 29 3b 0a 20 20 69 73 4e 65 77 52 65 0. );. isNewRe
4e40: 70 6f 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a po = 1;.}../*.**
4e50: 20 43 72 65 61 74 65 20 74 68 65 20 64 65 66 61 Create the defa
4e60: 75 6c 74 20 75 73 65 72 20 61 63 63 6f 75 6e 74 ult user account
4e70: 73 20 69 6e 20 74 68 65 20 55 53 45 52 20 74 61 s in the USER ta
4e80: 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 64 62 5f ble..*/.void db_
4e90: 63 72 65 61 74 65 5f 64 65 66 61 75 6c 74 5f 75 create_default_u
4ea0: 73 65 72 73 28 76 6f 69 64 29 7b 0a 20 20 63 6f sers(void){. co
4eb0: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 3b nst char *zUser;
4ec0: 0a 20 20 7a 55 73 65 72 20 3d 20 64 62 5f 67 65 . zUser = db_ge
4ed0: 74 28 22 64 65 66 61 75 6c 74 2d 75 73 65 72 22 t("default-user"
4ee0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a 55 73 65 , 0);. if( zUse
4ef0: 72 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 5f r==0 ){.#ifdef _
4f00: 5f 4d 49 4e 47 57 33 32 5f 5f 0a 20 20 20 20 7a _MINGW32__. z
4f10: 55 73 65 72 20 3d 20 67 65 74 65 6e 76 28 22 55 User = getenv("U
4f20: 53 45 52 4e 41 4d 45 22 29 3b 0a 23 65 6c 73 65 SERNAME");.#else
4f30: 0a 20 20 20 20 7a 55 73 65 72 20 3d 20 67 65 74 . zUser = get
4f40: 65 6e 76 28 22 55 53 45 52 22 29 3b 0a 23 65 6e env("USER");.#en
4f50: 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a 55 dif. }. if( zU
4f60: 73 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 55 ser==0 ){. zU
4f70: 73 65 72 20 3d 20 22 72 6f 6f 74 22 3b 0a 20 20 ser = "root";.
4f80: 7d 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 }. db_multi_exe
4f90: 63 28 0a 20 20 20 20 20 22 49 4e 53 45 52 54 20 c(. "INSERT
4fa0: 49 4e 54 4f 20 75 73 65 72 28 6c 6f 67 69 6e 2c INTO user(login,
4fb0: 20 70 77 2c 20 63 61 70 2c 20 69 6e 66 6f 29 22 pw, cap, info)"
4fc0: 0a 20 20 20 20 20 22 56 41 4c 55 45 53 28 25 51 . "VALUES(%Q
4fd0: 2c 27 27 2c 27 73 27 2c 27 27 29 22 2c 20 7a 55 ,'','s','')", zU
4fe0: 73 65 72 0a 20 20 29 3b 0a 20 20 64 62 5f 6d 75 ser. );. db_mu
4ff0: 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 22 lti_exec(. "
5000: 49 4e 53 45 52 54 20 49 4e 54 4f 20 75 73 65 72 INSERT INTO user
5010: 28 6c 6f 67 69 6e 2c 70 77 2c 63 61 70 2c 69 6e (login,pw,cap,in
5020: 66 6f 29 22 0a 20 20 20 20 20 22 20 20 20 56 41 fo)". " VA
5030: 4c 55 45 53 28 27 61 6e 6f 6e 79 6d 6f 75 73 27 LUES('anonymous'
5040: 2c 27 61 6e 6f 6e 79 6d 6f 75 73 27 2c 27 67 68 ,'anonymous','gh
5050: 6b 6e 77 27 2c 27 41 6e 6f 6e 27 29 3b 22 0a 20 knw','Anon');".
5060: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f "INSERT INTO
5070: 20 75 73 65 72 28 6c 6f 67 69 6e 2c 70 77 2c 63 user(login,pw,c
5080: 61 70 2c 69 6e 66 6f 29 22 0a 20 20 20 20 20 22 ap,info)". "
5090: 20 20 20 56 41 4c 55 45 53 28 27 6e 6f 62 6f 64 VALUES('nobod
50a0: 79 27 2c 27 27 2c 27 6a 6f 72 27 2c 27 4e 6f 62 y','','jor','Nob
50b0: 6f 64 79 27 29 3b 22 0a 20 20 20 20 20 22 49 4e ody');". "IN
50c0: 53 45 52 54 20 49 4e 54 4f 20 75 73 65 72 28 6c SERT INTO user(l
50d0: 6f 67 69 6e 2c 70 77 2c 63 61 70 2c 69 6e 66 6f ogin,pw,cap,info
50e0: 29 22 0a 20 20 20 20 20 22 20 20 20 56 41 4c 55 )". " VALU
50f0: 45 53 28 27 64 65 76 65 6c 6f 70 65 72 27 2c 27 ES('developer','
5100: 27 2c 27 64 65 69 70 74 27 2c 27 44 65 76 27 29 ','deipt','Dev')
5110: 3b 22 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a ;". );.}../*.**
5120: 20 46 69 6c 6c 20 61 6e 20 65 6d 70 74 79 20 72 Fill an empty r
5130: 65 70 6f 73 69 74 6f 72 79 20 64 61 74 61 62 61 epository databa
5140: 73 65 20 77 69 74 68 20 74 68 65 20 62 61 73 69 se with the basi
5150: 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f c information fo
5160: 72 20 61 0a 2a 2a 20 72 65 70 6f 73 69 74 6f 72 r a.** repositor
5170: 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e y. This function
5180: 20 69 73 20 73 68 61 72 65 64 20 62 65 74 77 65 is shared betwe
5190: 65 6e 20 27 63 72 65 61 74 65 5f 72 65 70 6f 73 en 'create_repos
51a0: 69 74 6f 72 79 5f 63 6d 64 27 0a 2a 2a 20 28 27 itory_cmd'.** ('
51b0: 6e 65 77 27 29 20 61 6e 64 20 27 72 65 63 6f 6e new') and 'recon
51c0: 73 74 72 75 63 74 5f 63 6d 64 27 20 28 27 72 65 struct_cmd' ('re
51d0: 63 6f 6e 73 74 72 75 63 74 27 29 2c 20 62 6f 74 construct'), bot
51e0: 68 20 6f 66 20 77 68 69 63 68 20 63 72 65 61 74 h of which creat
51f0: 65 0a 2a 2a 20 6e 65 77 20 72 65 70 6f 73 69 74 e.** new reposit
5200: 6f 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 ories..**.** The
5210: 20 6d 61 6b 65 49 6e 69 74 69 61 6c 56 65 72 73 makeInitialVers
5220: 69 6f 6e 20 66 6c 61 67 20 64 65 74 65 72 6d 69 ion flag determi
5230: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e nes whether or n
5240: 6f 74 20 61 6e 20 69 6e 69 74 69 61 6c 0a 2a 2a ot an initial.**
5250: 20 6d 61 6e 69 66 65 73 74 20 69 73 20 63 72 65 manifest is cre
5260: 61 74 65 64 2e 20 20 54 68 65 20 6d 61 6b 65 53 ated. The makeS
5270: 65 72 76 65 72 43 6f 64 65 73 20 66 6c 61 67 20 erverCodes flag
5280: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 determines wheth
5290: 65 72 20 6f 72 0a 2a 2a 20 6e 6f 74 20 73 65 72 er or.** not ser
52a0: 76 65 72 20 61 6e 64 20 70 72 6f 6a 65 63 74 20 ver and project
52b0: 63 6f 64 65 73 20 61 72 65 20 69 6e 76 65 6e 74 codes are invent
52c0: 65 64 20 66 6f 72 20 74 68 69 73 20 72 65 70 6f ed for this repo
52d0: 73 69 74 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 sitory..*/.void
52e0: 64 62 5f 69 6e 69 74 69 61 6c 5f 73 65 74 75 70 db_initial_setup
52f0: 20 28 69 6e 74 20 6d 61 6b 65 49 6e 69 74 69 61 (int makeInitia
5300: 6c 56 65 72 73 69 6f 6e 2c 20 69 6e 74 20 6d 61 lVersion, int ma
5310: 6b 65 53 65 72 76 65 72 43 6f 64 65 73 29 7b 0a keServerCodes){.
5320: 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 char *zDate;.
5330: 20 42 6c 6f 62 20 68 61 73 68 3b 0a 20 20 42 6c Blob hash;. Bl
5340: 6f 62 20 6d 61 6e 69 66 65 73 74 3b 0a 0a 20 20 ob manifest;..
5350: 64 62 5f 73 65 74 28 22 63 6f 6e 74 65 6e 74 2d db_set("content-
5360: 73 63 68 65 6d 61 22 2c 20 43 4f 4e 54 45 4e 54 schema", CONTENT
5370: 5f 53 43 48 45 4d 41 2c 20 30 29 3b 0a 20 20 64 _SCHEMA, 0);. d
5380: 62 5f 73 65 74 28 22 61 75 78 2d 73 63 68 65 6d b_set("aux-schem
5390: 61 22 2c 20 41 55 58 5f 53 43 48 45 4d 41 2c 20 a", AUX_SCHEMA,
53a0: 30 29 3b 0a 20 20 69 66 28 20 6d 61 6b 65 53 65 0);. if( makeSe
53b0: 72 76 65 72 43 6f 64 65 73 20 29 7b 0a 20 20 20 rverCodes ){.
53c0: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a db_multi_exec(.
53d0: 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e "INSERT IN
53e0: 54 4f 20 63 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 TO config(name,v
53f0: 61 6c 75 65 29 22 0a 20 20 20 20 20 20 22 20 56 alue)". " V
5400: 41 4c 55 45 53 28 27 73 65 72 76 65 72 2d 63 6f ALUES('server-co
5410: 64 65 27 2c 20 6c 6f 77 65 72 28 68 65 78 28 72 de', lower(hex(r
5420: 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 29 29 29 29 andomblob(20))))
5430: 3b 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52 54 ;". "INSERT
5440: 20 49 4e 54 4f 20 63 6f 6e 66 69 67 28 6e 61 6d INTO config(nam
5450: 65 2c 76 61 6c 75 65 29 22 0a 20 20 20 20 20 20 e,value)".
5460: 22 20 56 41 4c 55 45 53 28 27 70 72 6f 6a 65 63 " VALUES('projec
5470: 74 2d 63 6f 64 65 27 2c 20 6c 6f 77 65 72 28 68 t-code', lower(h
5480: 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 ex(randomblob(20
5490: 29 29 29 29 3b 22 0a 20 20 20 20 29 3b 0a 20 20 ))));". );.
54a0: 7d 0a 20 20 69 66 28 20 21 64 62 5f 69 73 5f 67 }. if( !db_is_g
54b0: 6c 6f 62 61 6c 28 22 61 75 74 6f 73 79 6e 63 22 lobal("autosync"
54c0: 29 20 29 20 64 62 5f 73 65 74 5f 69 6e 74 28 22 ) ) db_set_int("
54d0: 61 75 74 6f 73 79 6e 63 22 2c 20 31 2c 20 30 29 autosync", 1, 0)
54e0: 3b 0a 20 20 69 66 28 20 21 64 62 5f 69 73 5f 67 ;. if( !db_is_g
54f0: 6c 6f 62 61 6c 28 22 6c 6f 63 61 6c 61 75 74 68 lobal("localauth
5500: 22 29 20 29 20 64 62 5f 73 65 74 5f 69 6e 74 28 ") ) db_set_int(
5510: 22 6c 6f 63 61 6c 61 75 74 68 22 2c 20 30 2c 20 "localauth", 0,
5520: 30 29 3b 0a 20 20 64 62 5f 63 72 65 61 74 65 5f 0);. db_create_
5530: 64 65 66 61 75 6c 74 5f 75 73 65 72 73 28 29 3b default_users();
5540: 0a 20 20 75 73 65 72 5f 73 65 6c 65 63 74 28 29 . user_select()
5550: 3b 0a 0a 20 20 69 66 20 28 6d 61 6b 65 49 6e 69 ;.. if (makeIni
5560: 74 69 61 6c 56 65 72 73 69 6f 6e 29 7b 0a 20 20 tialVersion){.
5570: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6d 61 6e blob_zero(&man
5580: 69 66 65 73 74 29 3b 0a 20 20 20 20 62 6c 6f 62 ifest);. blob
5590: 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69 66 65 _appendf(&manife
55a0: 73 74 2c 20 22 43 20 69 6e 69 74 69 61 6c 5c 5c st, "C initial\\
55b0: 73 65 6d 70 74 79 5c 5c 73 62 61 73 65 6c 69 6e sempty\\sbaselin
55c0: 65 5c 6e 22 29 3b 0a 20 20 20 20 7a 44 61 74 65 e\n");. zDate
55d0: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 = db_text(0, "S
55e0: 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28 27 ELECT datetime('
55f0: 6e 6f 77 27 29 22 29 3b 0a 20 20 20 20 7a 44 61 now')");. zDa
5600: 74 65 5b 31 30 5d 3d 27 54 27 3b 0a 20 20 20 20 te[10]='T';.
5610: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 blob_appendf(&ma
5620: 6e 69 66 65 73 74 2c 20 22 44 20 25 73 5c 6e 22 nifest, "D %s\n"
5630: 2c 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 62 6c , zDate);. bl
5640: 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69 ob_appendf(&mani
5650: 66 65 73 74 2c 20 22 50 5c 6e 22 29 3b 0a 20 20 fest, "P\n");.
5660: 20 20 6d 64 35 73 75 6d 5f 69 6e 69 74 28 29 3b md5sum_init();
5670: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 . blob_append
5680: 66 28 26 6d 61 6e 69 66 65 73 74 2c 20 22 52 20 f(&manifest, "R
5690: 25 73 5c 6e 22 2c 20 6d 64 35 73 75 6d 5f 66 69 %s\n", md5sum_fi
56a0: 6e 69 73 68 28 30 29 29 3b 0a 20 20 20 20 62 6c nish(0));. bl
56b0: 6f 62 5f 61 70 70 65 6e 64 66 28 26 6d 61 6e 69 ob_appendf(&mani
56c0: 66 65 73 74 2c 20 22 55 20 25 46 5c 6e 22 2c 20 fest, "U %F\n",
56d0: 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 20 20 6d g.zLogin);. m
56e0: 64 35 73 75 6d 5f 62 6c 6f 62 28 26 6d 61 6e 69 d5sum_blob(&mani
56f0: 66 65 73 74 2c 20 26 68 61 73 68 29 3b 0a 20 20 fest, &hash);.
5700: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 blob_appendf(&
5710: 6d 61 6e 69 66 65 73 74 2c 20 22 5a 20 25 62 5c manifest, "Z %b\
5720: 6e 22 2c 20 26 68 61 73 68 29 3b 0a 20 20 20 20 n", &hash);.
5730: 62 6c 6f 62 5f 72 65 73 65 74 28 26 68 61 73 68 blob_reset(&hash
5740: 29 3b 0a 20 20 20 20 63 6f 6e 74 65 6e 74 5f 70 );. content_p
5750: 75 74 28 26 6d 61 6e 69 66 65 73 74 2c 20 30 2c ut(&manifest, 0,
5760: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 0);. }.}../*.*
5770: 2a 20 43 4f 4d 4d 41 4e 44 3a 20 6e 65 77 0a 2a * COMMAND: new.*
5780: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 *.** Usage: %fos
5790: 73 69 6c 20 6e 65 77 20 46 49 4c 45 4e 41 4d 45 sil new FILENAME
57a0: 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 .**.** Create a
57b0: 72 65 70 6f 73 69 74 6f 72 79 20 66 6f 72 20 61 repository for a
57c0: 20 6e 65 77 20 70 72 6f 6a 65 63 74 20 69 6e 20 new project in
57d0: 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 46 the file named F
57e0: 49 4c 45 4e 41 4d 45 2e 0a 2a 2a 20 54 68 69 73 ILENAME..** This
57f0: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 69 73 74 command is dist
5800: 69 6e 63 74 20 66 72 6f 6d 20 22 63 6c 6f 6e 65 inct from "clone
5810: 22 2e 20 20 54 68 65 20 22 63 6c 6f 6e 65 22 20 ". The "clone"
5820: 63 6f 6d 6d 61 6e 64 20 6d 61 6b 65 73 0a 2a 2a command makes.**
5830: 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 a copy of an ex
5840: 69 73 74 69 6e 67 20 70 72 6f 6a 65 63 74 2e 20 isting project.
5850: 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 73 74 This command st
5860: 61 72 74 73 20 61 20 6e 65 77 20 70 72 6f 6a 65 arts a new proje
5870: 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 63 72 65 61 ct..*/.void crea
5880: 74 65 5f 72 65 70 6f 73 69 74 6f 72 79 5f 63 6d te_repository_cm
5890: 64 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 67 d(void){. if( g
58a0: 2e 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 .argc!=3 ){.
58b0: 75 73 61 67 65 28 22 52 45 50 4f 53 49 54 4f 52 usage("REPOSITOR
58c0: 59 2d 4e 41 4d 45 22 29 3b 0a 20 20 7d 0a 20 20 Y-NAME");. }.
58d0: 64 62 5f 63 72 65 61 74 65 5f 72 65 70 6f 73 69 db_create_reposi
58e0: 74 6f 72 79 28 67 2e 61 72 67 76 5b 32 5d 29 3b tory(g.argv[2]);
58f0: 0a 20 20 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 . db_open_repos
5900: 69 74 6f 72 79 28 67 2e 61 72 67 76 5b 32 5d 29 itory(g.argv[2])
5910: 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e 66 ;. db_open_conf
5920: 69 67 28 29 3b 0a 20 20 64 62 5f 62 65 67 69 6e ig();. db_begin
5930: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a _transaction();.
5940: 20 20 64 62 5f 69 6e 69 74 69 61 6c 5f 73 65 74 db_initial_set
5950: 75 70 28 31 2c 20 31 29 3b 0a 20 20 64 62 5f 65 up(1, 1);. db_e
5960: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 nd_transaction(0
5970: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 70 72 6f );. printf("pro
5980: 6a 65 63 74 2d 69 64 3a 20 25 73 5c 6e 22 2c 20 ject-id: %s\n",
5990: 64 62 5f 67 65 74 28 22 70 72 6f 6a 65 63 74 2d db_get("project-
59a0: 63 6f 64 65 22 2c 20 30 29 29 3b 0a 20 20 70 72 code", 0));. pr
59b0: 69 6e 74 66 28 22 73 65 72 76 65 72 2d 69 64 3a intf("server-id:
59c0: 20 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28 %s\n", db_get(
59d0: 22 73 65 72 76 65 72 2d 63 6f 64 65 22 2c 20 30 "server-code", 0
59e0: 29 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 61 64 ));. printf("ad
59f0: 6d 69 6e 2d 75 73 65 72 3a 20 25 73 20 28 6e 6f min-user: %s (no
5a00: 20 70 61 73 73 77 6f 72 64 20 73 65 74 20 79 65 password set ye
5a10: 74 21 29 5c 6e 22 2c 20 67 2e 7a 4c 6f 67 69 6e t!)\n", g.zLogin
5a20: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 62 61 73 );. printf("bas
5a30: 65 6c 69 6e 65 3a 20 20 20 25 73 5c 6e 22 2c 20 eline: %s\n",
5a40: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 db_text(0, "SELE
5a50: 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f CT uuid FROM blo
5a60: 62 22 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 b"));.}../*.** S
5a70: 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 QL functions for
5a80: 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2a 0a 2a debugging..**.*
5a90: 2a 20 54 68 65 20 70 72 69 6e 74 28 29 20 66 75 * The print() fu
5aa0: 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 69 74 nction writes it
5ab0: 73 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 73 s arguments on s
5ac0: 74 64 6f 75 74 2c 20 62 75 74 20 6f 6e 6c 79 0a tdout, but only.
5ad0: 2a 2a 20 69 66 20 74 68 65 20 2d 73 71 6c 70 72 ** if the -sqlpr
5ae0: 69 6e 74 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 int command-line
5af0: 20 6f 70 74 69 6f 6e 20 69 73 20 74 75 72 6e 65 option is turne
5b00: 64 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 d on..*/.static
5b10: 76 6f 69 64 20 64 62 5f 73 71 6c 5f 70 72 69 6e void db_sql_prin
5b20: 74 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e t(. sqlite3_con
5b30: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 text *context,.
5b40: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c int argc,. sql
5b50: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 ite3_value **arg
5b60: 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 v.){. int i;.
5b70: 69 66 28 20 67 2e 66 53 71 6c 50 72 69 6e 74 20 if( g.fSqlPrint
5b80: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 ){. for(i=0;
5b90: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 i<argc; i++){.
5ba0: 20 20 20 20 63 68 61 72 20 63 20 3d 20 69 3d 3d char c = i==
5bb0: 61 72 67 63 2d 31 20 3f 20 27 5c 6e 27 20 3a 20 argc-1 ? '\n' :
5bc0: 27 20 27 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 ' ';. print
5bd0: 66 28 22 25 73 25 63 22 2c 20 73 71 6c 69 74 65 f("%s%c", sqlite
5be0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 3_value_text(arg
5bf0: 76 5b 69 5d 29 2c 20 63 29 3b 0a 20 20 20 20 7d v[i]), c);. }
5c00: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f . }.}.static vo
5c10: 69 64 20 64 62 5f 73 71 6c 5f 74 72 61 63 65 28 id db_sql_trace(
5c20: 76 6f 69 64 20 2a 6e 6f 74 55 73 65 64 2c 20 63 void *notUsed, c
5c30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 onst char *zSql)
5c40: 7b 0a 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e {. printf("%s\n
5c50: 22 2c 20 7a 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a ", zSql);.}../*.
5c60: 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 ** This is used
5c70: 62 79 20 74 68 65 20 5b 63 6f 6d 6d 69 74 5d 20 by the [commit]
5c80: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 command..**.** R
5c90: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 65 69 eturn true if ei
5ca0: 74 68 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 ther:.**.**
5cb0: 61 29 20 47 6c 6f 62 61 6c 2e 61 43 6f 6d 6d 69 a) Global.aCommi
5cc0: 74 46 69 6c 65 20 69 73 20 4e 55 4c 4c 2c 20 6f tFile is NULL, o
5cd0: 72 0a 2a 2a 20 20 20 20 20 62 29 20 47 6c 6f 62 r.** b) Glob
5ce0: 61 6c 2e 61 43 6f 6d 6d 69 74 46 69 6c 65 20 63 al.aCommitFile c
5cf0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 74 65 ontains the inte
5d00: 67 65 72 20 70 61 73 73 65 64 20 61 73 20 61 6e ger passed as an
5d10: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a argument..**.**
5d20: 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 Otherwise retur
5d30: 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 n false..*/.stat
5d40: 69 63 20 76 6f 69 64 20 66 69 6c 65 5f 69 73 5f ic void file_is_
5d50: 73 65 6c 65 63 74 65 64 28 0a 20 20 73 71 6c 69 selected(. sqli
5d60: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e te3_context *con
5d70: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 text,. int argc
5d80: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 ,. sqlite3_valu
5d90: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 61 73 e **argv.){. as
5da0: 73 65 72 74 28 61 72 67 63 3d 3d 31 29 3b 0a 20 sert(argc==1);.
5db0: 20 69 66 28 20 67 2e 61 43 6f 6d 6d 69 74 46 69 if( g.aCommitFi
5dc0: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 le ){. int iI
5dd0: 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 d = sqlite3_valu
5de0: 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a e_int(argv[0]);.
5df0: 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 int ii;.
5e00: 66 6f 72 28 69 69 3d 30 3b 20 67 2e 61 43 6f 6d for(ii=0; g.aCom
5e10: 6d 69 74 46 69 6c 65 5b 69 69 5d 3b 20 69 69 2b mitFile[ii]; ii+
5e20: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 49 +){. if( iI
5e30: 64 3d 3d 67 2e 61 43 6f 6d 6d 69 74 46 69 6c 65 d==g.aCommitFile
5e40: 5b 69 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 [ii] ){.
5e50: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 sqlite3_result_i
5e60: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a nt(context, 1);.
5e70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a return;.
5e80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
5e90: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 sqlite3_result
5ea0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 30 29 _int(context, 0)
5eb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 ;. }else{. s
5ec0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e qlite3_result_in
5ed0: 74 28 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20 t(context, 1);.
5ee0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 }.}../*.** Conv
5ef0: 65 72 74 20 74 68 65 20 69 6e 70 75 74 20 73 74 ert the input st
5f00: 72 69 6e 67 20 69 6e 74 6f 20 61 6e 20 53 48 41 ring into an SHA
5f10: 31 2e 20 20 4d 61 6b 65 20 61 20 6e 6f 74 61 74 1. Make a notat
5f20: 69 6f 6e 20 69 6e 20 74 68 65 0a 2a 2a 20 43 4f ion in the.** CO
5f30: 4e 43 45 41 4c 45 44 20 74 61 62 6c 65 20 73 6f NCEALED table so
5f40: 20 74 68 61 74 20 74 68 65 20 68 61 73 68 20 63 that the hash c
5f50: 61 6e 20 62 65 20 75 6e 64 6f 20 75 73 69 6e 67 an be undo using
5f60: 20 74 68 65 20 64 62 5f 72 65 76 65 61 6c 28 29 the db_reveal()
5f70: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 20 .** function at
5f80: 73 6f 6d 65 20 6c 61 74 65 72 20 74 69 6d 65 2e some later time.
5f90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 .**.** The value
5fa0: 20 72 65 74 75 72 6e 65 64 20 69 73 20 73 74 6f returned is sto
5fb0: 72 65 64 20 69 6e 20 73 74 61 74 69 63 20 73 70 red in static sp
5fc0: 61 63 65 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 ace and will be
5fd0: 6f 76 65 72 77 72 69 74 74 65 6e 0a 2a 2a 20 6f overwritten.** o
5fe0: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c n subsequent cal
5ff0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 43 6f ls..**.** If zCo
6000: 6e 74 65 6e 74 20 69 73 20 61 6c 72 65 61 64 79 ntent is already
6010: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 53 a well-formed S
6020: 48 41 31 20 68 61 73 68 2c 20 74 68 65 6e 20 72 HA1 hash, then r
6030: 65 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 eturn a copy.**
6040: 6f 66 20 74 68 61 74 20 68 61 73 68 2c 20 6e 6f of that hash, no
6050: 74 20 61 20 68 61 73 68 20 6f 66 20 74 68 65 20 t a hash of the
6060: 68 61 73 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 hash..**.** The
6070: 43 4f 4e 43 45 41 4c 45 44 20 74 61 62 6c 65 20 CONCEALED table
6080: 69 73 20 6d 65 61 6e 74 20 74 6f 20 6f 62 73 63 is meant to obsc
6090: 75 72 65 20 65 6d 61 69 6c 20 61 64 64 72 65 73 ure email addres
60a0: 73 65 73 2e 20 20 45 76 65 72 79 20 76 61 6c 69 ses. Every vali
60b0: 64 0a 2a 2a 20 65 6d 61 69 6c 20 61 64 64 72 65 d.** email addre
60c0: 73 73 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 ss will contain
60d0: 61 20 22 40 22 20 63 68 61 72 61 63 74 65 72 20 a "@" character
60e0: 61 6e 64 20 22 40 22 20 69 73 20 6e 6f 74 20 76 and "@" is not v
60f0: 61 6c 69 64 20 77 69 74 68 69 6e 0a 2a 2a 20 61 alid within.** a
6100: 6e 20 53 48 41 31 20 68 61 73 68 20 73 6f 20 74 n SHA1 hash so t
6110: 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 here is no chanc
6120: 65 20 74 68 61 74 20 61 20 76 61 6c 69 64 20 65 e that a valid e
6130: 6d 61 69 6c 20 61 64 64 72 65 73 73 20 77 69 6c mail address wil
6140: 6c 20 67 6f 0a 2a 2a 20 75 6e 63 6f 6e 63 65 61 l go.** unconcea
6150: 6c 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 64 62 led..*/.char *db
6160: 5f 63 6f 6e 63 65 61 6c 28 63 6f 6e 73 74 20 63 _conceal(const c
6170: 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 2c 20 69 har *zContent, i
6180: 6e 74 20 6e 29 7b 0a 20 20 73 74 61 74 69 63 20 nt n){. static
6190: 63 68 61 72 20 7a 48 61 73 68 5b 34 32 5d 3b 0a char zHash[42];.
61a0: 20 20 42 6c 6f 62 20 6f 75 74 3b 0a 20 20 69 66 Blob out;. if
61b0: 28 20 6e 3d 3d 34 30 20 26 26 20 76 61 6c 69 64 ( n==40 && valid
61c0: 61 74 65 31 36 28 7a 43 6f 6e 74 65 6e 74 2c 20 ate16(zContent,
61d0: 6e 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 n) ){. memcpy
61e0: 28 7a 48 61 73 68 2c 20 7a 43 6f 6e 74 65 6e 74 (zHash, zContent
61f0: 2c 20 6e 29 3b 0a 20 20 20 20 7a 48 61 73 68 5b , n);. zHash[
6200: 6e 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b n] = 0;. }else{
6210: 0a 20 20 20 20 73 68 61 31 73 75 6d 5f 73 74 65 . sha1sum_ste
6220: 70 5f 74 65 78 74 28 7a 43 6f 6e 74 65 6e 74 2c p_text(zContent,
6230: 20 6e 29 3b 0a 20 20 20 20 73 68 61 31 73 75 6d n);. sha1sum
6240: 5f 66 69 6e 69 73 68 28 26 6f 75 74 29 3b 0a 20 _finish(&out);.
6250: 20 20 20 73 74 72 63 70 79 28 7a 48 61 73 68 2c strcpy(zHash,
6260: 20 62 6c 6f 62 5f 73 74 72 28 26 6f 75 74 29 29 blob_str(&out))
6270: 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 ;. blob_reset
6280: 28 26 6f 75 74 29 3b 0a 20 20 20 20 64 62 5f 6d (&out);. db_m
6290: 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 ulti_exec(.
62a0: 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e "INSERT OR IGN
62b0: 4f 52 45 20 49 4e 54 4f 20 63 6f 6e 63 65 61 6c ORE INTO conceal
62c0: 65 64 20 56 41 4c 55 45 53 28 25 51 2c 25 23 51 ed VALUES(%Q,%#Q
62d0: 29 22 2c 0a 20 20 20 20 20 20 20 7a 48 61 73 68 )",. zHash
62e0: 2c 20 6e 2c 20 7a 43 6f 6e 74 65 6e 74 0a 20 20 , n, zContent.
62f0: 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 );. }. retur
6300: 6e 20 7a 48 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a n zHash;.}../*.*
6310: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c 6f 6f * Attempt to loo
6320: 6b 20 75 70 20 74 68 65 20 69 6e 70 75 74 20 69 k up the input i
6330: 6e 20 74 68 65 20 43 4f 4e 43 45 41 4c 45 44 20 n the CONCEALED
6340: 74 61 62 6c 65 2e 20 20 49 66 20 66 6f 75 6e 64 table. If found
6350: 2c 0a 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 ,.** and if the
6360: 6f 6b 52 64 41 64 64 72 20 70 65 72 6d 69 73 73 okRdAddr permiss
6370: 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 74 ion is enabled t
6380: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 2a hen return the.*
6390: 2a 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 * original value
63a0: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 69 for which the i
63b0: 6e 70 75 74 20 69 73 20 61 20 68 61 73 68 2e 20 nput is a hash.
63c0: 20 49 66 20 6f 6b 52 64 41 64 64 72 20 69 73 0a If okRdAddr is.
63d0: 2a 2a 20 66 61 6c 73 65 20 6f 72 20 69 66 20 74 ** false or if t
63e0: 68 65 20 6c 6f 6f 6b 75 70 20 66 61 69 6c 73 2c he lookup fails,
63f0: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 72 69 67 return the orig
6400: 69 6e 61 6c 20 73 74 72 69 6e 67 20 63 6f 6e 74 inal string cont
6410: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 ent..**.** In ei
6420: 74 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 73 ther case, the s
6430: 74 72 69 6e 67 20 72 65 74 75 72 6e 65 64 20 69 tring returned i
6440: 73 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63 s stored in spac
6450: 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 e obtained.** fr
6460: 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 73 68 om malloc and sh
6470: 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 62 79 ould be freed by
6480: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e the calling fun
6490: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a ction..*/.char *
64a0: 64 62 5f 72 65 76 65 61 6c 28 63 6f 6e 73 74 20 db_reveal(const
64b0: 63 68 61 72 20 2a 7a 4b 65 79 29 7b 0a 20 20 63 char *zKey){. c
64c0: 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 69 66 28 har *zOut;. if(
64d0: 20 67 2e 6f 6b 52 64 41 64 64 72 20 29 7b 0a 20 g.okRdAddr ){.
64e0: 20 20 20 7a 4f 75 74 20 3d 20 64 62 5f 74 65 78 zOut = db_tex
64f0: 74 28 30 2c 20 22 53 45 4c 45 43 54 20 63 6f 6e t(0, "SELECT con
6500: 74 65 6e 74 20 46 52 4f 4d 20 63 6f 6e 63 65 61 tent FROM concea
6510: 6c 65 64 20 57 48 45 52 45 20 68 61 73 68 3d 25 led WHERE hash=%
6520: 51 22 2c 20 7a 4b 65 79 29 3b 0a 20 20 7d 65 6c Q", zKey);. }el
6530: 73 65 7b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 30 se{. zOut = 0
6540: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4f 75 74 ;. }. if( zOut
6550: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 4f 75 74 20 ==0 ){. zOut
6560: 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 = mprintf("%s",
6570: 7a 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 zKey);. }. ret
6580: 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a urn zOut;.}../*.
6590: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e ** This function
65a0: 20 72 65 67 69 73 74 65 72 73 20 61 75 78 69 6c registers auxil
65b0: 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 77 iary functions w
65c0: 68 65 6e 20 74 68 65 20 53 51 4c 69 74 65 0a 2a hen the SQLite.*
65d0: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 * database conne
65e0: 63 74 69 6f 6e 20 69 73 20 66 69 72 73 74 20 65 ction is first e
65f0: 73 74 61 62 6c 69 73 68 65 64 2e 0a 2a 2f 0a 4c stablished..*/.L
6600: 4f 43 41 4c 20 76 6f 69 64 20 64 62 5f 63 6f 6e OCAL void db_con
6610: 6e 65 63 74 69 6f 6e 5f 69 6e 69 74 28 76 6f 69 nection_init(voi
6620: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 d){. static int
6630: 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 69 66 28 once = 1;. if(
6640: 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 73 71 6c once ){. sql
6650: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 ite3_create_func
6660: 74 69 6f 6e 28 67 2e 64 62 2c 20 22 70 72 69 6e tion(g.db, "prin
6670: 74 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 t", -1, SQLITE_U
6680: 54 46 38 2c 20 30 2c 64 62 5f 73 71 6c 5f 70 72 TF8, 0,db_sql_pr
6690: 69 6e 74 2c 30 2c 30 29 3b 0a 20 20 20 20 73 71 int,0,0);. sq
66a0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e lite3_create_fun
66b0: 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 67 2e 64 ction(. g.d
66c0: 62 2c 20 22 66 69 6c 65 5f 69 73 5f 73 65 6c 65 b, "file_is_sele
66d0: 63 74 65 64 22 2c 20 31 2c 20 53 51 4c 49 54 45 cted", 1, SQLITE
66e0: 5f 55 54 46 38 2c 20 30 2c 20 66 69 6c 65 5f 69 _UTF8, 0, file_i
66f0: 73 5f 73 65 6c 65 63 74 65 64 2c 30 2c 30 0a 20 s_selected,0,0.
6700: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 67 2e );. if( g.
6710: 66 53 71 6c 54 72 61 63 65 20 29 7b 0a 20 20 20 fSqlTrace ){.
6720: 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 sqlite3_trace
6730: 28 67 2e 64 62 2c 20 64 62 5f 73 71 6c 5f 74 72 (g.db, db_sql_tr
6740: 61 63 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 ace, 0);. }.
6750: 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 7d once = 0;. }
6760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e .}../*.** Return
6770: 20 74 72 75 65 20 69 66 20 74 68 65 20 73 74 72 true if the str
6780: 69 6e 67 20 7a 56 61 6c 20 72 65 70 72 65 73 65 ing zVal represe
6790: 6e 74 73 20 22 74 72 75 65 22 20 28 6f 72 20 22 nts "true" (or "
67a0: 66 61 6c 73 65 22 29 2e 0a 2a 2f 0a 69 6e 74 20 false")..*/.int
67b0: 69 73 5f 74 72 75 74 68 28 63 6f 6e 73 74 20 63 is_truth(const c
67c0: 68 61 72 20 2a 7a 56 61 6c 29 7b 0a 20 20 73 74 har *zVal){. st
67d0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
67e0: 2a 61 7a 4f 6e 5b 5d 20 3d 20 7b 20 22 6f 6e 22 *azOn[] = { "on"
67f0: 2c 20 22 79 65 73 22 2c 20 22 74 72 75 65 22 2c , "yes", "true",
6800: 20 22 31 22 20 7d 3b 0a 20 20 69 6e 74 20 69 3b "1" };. int i;
6810: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 . for(i=0; i<si
6820: 7a 65 6f 66 28 61 7a 4f 6e 29 2f 73 69 7a 65 6f zeof(azOn)/sizeo
6830: 66 28 61 7a 4f 6e 5b 30 5d 29 3b 20 69 2b 2b 29 f(azOn[0]); i++)
6840: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 {. if( strcmp
6850: 28 7a 56 61 6c 2c 61 7a 4f 6e 5b 69 5d 29 3d 3d (zVal,azOn[i])==
6860: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 0 ) return 1;.
6870: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a }. return 0;.}.
6880: 69 6e 74 20 69 73 5f 66 61 6c 73 65 28 63 6f 6e int is_false(con
6890: 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 29 7b 0a st char *zVal){.
68a0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 static const c
68b0: 68 61 72 20 2a 61 7a 4f 66 66 5b 5d 20 3d 20 7b har *azOff[] = {
68c0: 20 22 6f 66 66 22 2c 20 22 6e 6f 22 2c 20 22 66 "off", "no", "f
68d0: 61 6c 73 65 22 2c 20 22 30 22 20 7d 3b 0a 20 20 alse", "0" };.
68e0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 int i;. for(i=0
68f0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 4f 66 66 ; i<sizeof(azOff
6900: 29 2f 73 69 7a 65 6f 66 28 61 7a 4f 66 66 5b 30 )/sizeof(azOff[0
6910: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 ]); i++){. if
6920: 28 20 73 74 72 63 6d 70 28 7a 56 61 6c 2c 61 7a ( strcmp(zVal,az
6930: 4f 66 66 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74 Off[i])==0 ) ret
6940: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 urn 1;. }. ret
6950: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 urn 0;.}../*.**
6960: 47 65 74 20 61 6e 64 20 73 65 74 20 76 61 6c 75 Get and set valu
6970: 65 73 20 66 72 6f 6d 20 74 68 65 20 43 4f 4e 46 es from the CONF
6980: 49 47 2c 20 47 4c 4f 42 41 4c 5f 43 4f 4e 46 49 IG, GLOBAL_CONFI
6990: 47 20 61 6e 64 20 56 56 41 52 20 74 61 62 6c 65 G and VVAR table
69a0: 20 69 6e 20 74 68 65 0a 2a 2a 20 72 65 70 6f 73 in the.** repos
69b0: 69 74 6f 72 79 20 61 6e 64 20 6c 6f 63 61 6c 20 itory and local
69c0: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2f 0a 63 68 databases..*/.ch
69d0: 61 72 20 2a 64 62 5f 67 65 74 28 63 6f 6e 73 74 ar *db_get(const
69e0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 68 char *zName, ch
69f0: 61 72 20 2a 7a 44 65 66 61 75 6c 74 29 7b 0a 20 ar *zDefault){.
6a00: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 char *z = 0;.
6a10: 69 66 28 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 if( g.repository
6a20: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 7a 20 3d 20 Open ){. z =
6a30: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 db_text(0, "SELE
6a40: 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 63 6f CT value FROM co
6a50: 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d nfig WHERE name=
6a60: 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d %Q", zName);. }
6a70: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 67 . if( z==0 && g
6a80: 2e 63 6f 6e 66 69 67 4f 70 65 6e 20 29 7b 0a 20 .configOpen ){.
6a90: 20 20 20 7a 20 3d 20 64 62 5f 74 65 78 74 28 30 z = db_text(0
6aa0: 2c 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20 , "SELECT value
6ab0: 46 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 FROM global_conf
6ac0: 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 ig WHERE name=%Q
6ad0: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 ", zName);. }.
6ae0: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 if( z==0 ){.
6af0: 20 7a 20 3d 20 7a 44 65 66 61 75 6c 74 3b 0a 20 z = zDefault;.
6b00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d }. return z;.}
6b10: 0a 76 6f 69 64 20 64 62 5f 73 65 74 28 63 6f 6e .void db_set(con
6b20: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 st char *zName,
6b30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c const char *zVal
6b40: 75 65 2c 20 69 6e 74 20 67 6c 6f 62 61 6c 46 6c ue, int globalFl
6b50: 61 67 29 7b 0a 20 20 64 62 5f 62 65 67 69 6e 5f ag){. db_begin_
6b60: 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 transaction();.
6b70: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 db_multi_exec("
6b80: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73 63 REPLACE INTO %sc
6b90: 6f 6e 66 69 67 28 6e 61 6d 65 2c 76 61 6c 75 65 onfig(name,value
6ba0: 29 20 56 41 4c 55 45 53 28 25 51 2c 25 51 29 22 ) VALUES(%Q,%Q)"
6bb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
6bc0: 20 20 20 67 6c 6f 62 61 6c 46 6c 61 67 20 3f 20 globalFlag ?
6bd0: 22 67 6c 6f 62 61 6c 5f 22 20 3a 20 22 22 2c 20 "global_" : "",
6be0: 7a 4e 61 6d 65 2c 20 7a 56 61 6c 75 65 29 3b 0a zName, zValue);.
6bf0: 20 20 69 66 28 20 67 6c 6f 62 61 6c 46 6c 61 67 if( globalFlag
6c00: 20 26 26 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 && g.repository
6c10: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 64 62 5f 6d Open ){. db_m
6c20: 75 6c 74 69 5f 65 78 65 63 28 22 44 45 4c 45 54 ulti_exec("DELET
6c30: 45 20 46 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48 E FROM config WH
6c40: 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e ERE name=%Q", zN
6c50: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 65 ame);. }. db_e
6c60: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 nd_transaction(0
6c70: 29 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 75 6e 73 );.}.void db_uns
6c80: 65 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a et(const char *z
6c90: 4e 61 6d 65 2c 20 69 6e 74 20 67 6c 6f 62 61 6c Name, int global
6ca0: 46 6c 61 67 29 7b 0a 20 20 64 62 5f 62 65 67 69 Flag){. db_begi
6cb0: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b n_transaction();
6cc0: 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 . db_multi_exec
6cd0: 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73 ("DELETE FROM %s
6ce0: 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d config WHERE nam
6cf0: 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 20 e=%Q",.
6d00: 20 20 20 20 20 20 20 20 67 6c 6f 62 61 6c 46 6c globalFl
6d10: 61 67 20 3f 20 22 67 6c 6f 62 61 6c 5f 22 20 3a ag ? "global_" :
6d20: 20 22 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 "", zName);. i
6d30: 66 28 20 67 6c 6f 62 61 6c 46 6c 61 67 20 26 26 f( globalFlag &&
6d40: 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 g.repositoryOpe
6d50: 6e 20 29 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 n ){. db_mult
6d60: 69 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20 46 i_exec("DELETE F
6d70: 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45 ROM config WHERE
6d80: 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 name=%Q", zName
6d90: 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 65 6e 64 5f );. }. db_end_
6da0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a transaction(0);.
6db0: 7d 0a 69 6e 74 20 64 62 5f 69 73 5f 67 6c 6f 62 }.int db_is_glob
6dc0: 61 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a al(const char *z
6dd0: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 67 2e 63 Name){. if( g.c
6de0: 6f 6e 66 69 67 4f 70 65 6e 20 29 7b 0a 20 20 20 onfigOpen ){.
6df0: 20 72 65 74 75 72 6e 20 64 62 5f 65 78 69 73 74 return db_exist
6e00: 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d s("SELECT 1 FROM
6e10: 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 57 global_config W
6e20: 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a HERE name=%Q", z
6e30: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a Name);. }else{.
6e40: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
6e50: 7d 0a 7d 0a 69 6e 74 20 64 62 5f 67 65 74 5f 69 }.}.int db_get_i
6e60: 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a nt(const char *z
6e70: 4e 61 6d 65 2c 20 69 6e 74 20 64 66 6c 74 29 7b Name, int dflt){
6e80: 0a 20 20 69 6e 74 20 76 20 3d 20 64 66 6c 74 3b . int v = dflt;
6e90: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 . int rc;. if(
6ea0: 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65 g.repositoryOpe
6eb0: 6e 20 29 7b 0a 20 20 20 20 53 74 6d 74 20 71 3b n ){. Stmt q;
6ec0: 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 28 . db_prepare(
6ed0: 26 71 2c 20 22 53 45 4c 45 43 54 20 76 61 6c 75 &q, "SELECT valu
6ee0: 65 20 46 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48 e FROM config WH
6ef0: 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e ERE name=%Q", zN
6f00: 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 ame);. rc = d
6f10: 62 5f 73 74 65 70 28 26 71 29 3b 0a 20 20 20 20 b_step(&q);.
6f20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 if( rc==SQLITE_R
6f30: 4f 57 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 OW ){. v =
6f40: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 db_column_int(&q
6f50: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 , 0);. }.
6f60: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b db_finalize(&q);
6f70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 . }else{. rc
6f80: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a = SQLITE_DONE;.
6f90: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 }. if( rc==SQ
6fa0: 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 67 2e 63 LITE_DONE && g.c
6fb0: 6f 6e 66 69 67 4f 70 65 6e 20 29 7b 0a 20 20 20 onfigOpen ){.
6fc0: 20 76 20 3d 20 64 62 5f 69 6e 74 28 64 66 6c 74 v = db_int(dflt
6fd0: 2c 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20 , "SELECT value
6fe0: 46 52 4f 4d 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 FROM global_conf
6ff0: 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 ig WHERE name=%Q
7000: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 ", zName);. }.
7010: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 76 6f 69 return v;.}.voi
7020: 64 20 64 62 5f 73 65 74 5f 69 6e 74 28 63 6f 6e d db_set_int(con
7030: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 st char *zName,
7040: 69 6e 74 20 76 61 6c 75 65 2c 20 69 6e 74 20 67 int value, int g
7050: 6c 6f 62 61 6c 46 6c 61 67 29 7b 0a 20 20 64 62 lobalFlag){. db
7060: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 _begin_transacti
7070: 6f 6e 28 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 on();. db_multi
7080: 5f 65 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 _exec("REPLACE I
7090: 4e 54 4f 20 25 73 63 6f 6e 66 69 67 28 6e 61 6d NTO %sconfig(nam
70a0: 65 2c 76 61 6c 75 65 29 20 56 41 4c 55 45 53 28 e,value) VALUES(
70b0: 25 51 2c 25 64 29 22 2c 0a 20 20 20 20 20 20 20 %Q,%d)",.
70c0: 20 20 20 20 20 20 20 20 20 67 6c 6f 62 61 6c 46 globalF
70d0: 6c 61 67 20 3f 20 22 67 6c 6f 62 61 6c 5f 22 20 lag ? "global_"
70e0: 3a 20 22 22 2c 20 7a 4e 61 6d 65 2c 20 76 61 6c : "", zName, val
70f0: 75 65 29 3b 0a 20 20 69 66 28 20 67 6c 6f 62 61 ue);. if( globa
7100: 6c 46 6c 61 67 20 26 26 20 67 2e 72 65 70 6f 73 lFlag && g.repos
7110: 69 74 6f 72 79 4f 70 65 6e 20 29 7b 0a 20 20 20 itoryOpen ){.
7120: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 db_multi_exec("
7130: 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 6f 6e 66 DELETE FROM conf
7140: 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 ig WHERE name=%Q
7150: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 ", zName);. }.
7160: 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 db_end_transact
7170: 69 6f 6e 28 30 29 3b 0a 7d 0a 69 6e 74 20 64 62 ion(0);.}.int db
7180: 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e _get_boolean(con
7190: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 st char *zName,
71a0: 69 6e 74 20 64 66 6c 74 29 7b 0a 20 20 63 68 61 int dflt){. cha
71b0: 72 20 2a 7a 56 61 6c 20 3d 20 64 62 5f 67 65 74 r *zVal = db_get
71c0: 28 7a 4e 61 6d 65 2c 20 64 66 6c 74 20 3f 20 22 (zName, dflt ? "
71d0: 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 on" : "off");.
71e0: 69 66 28 20 69 73 5f 74 72 75 74 68 28 7a 56 61 if( is_truth(zVa
71f0: 6c 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 l) ) return 1;.
7200: 20 69 66 28 20 69 73 5f 66 61 6c 73 65 28 7a 56 if( is_false(zV
7210: 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a al) ) return 0;.
7220: 20 20 72 65 74 75 72 6e 20 64 66 6c 74 3b 0a 7d return dflt;.}
7230: 0a 63 68 61 72 20 2a 64 62 5f 6c 67 65 74 28 63 .char *db_lget(c
7240: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 onst char *zName
7250: 2c 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 , char *zDefault
7260: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 5f 74 ){. return db_t
7270: 65 78 74 28 28 63 68 61 72 2a 29 7a 44 65 66 61 ext((char*)zDefa
7280: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ult,.
7290: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 76 61 "SELECT va
72a0: 6c 75 65 20 46 52 4f 4d 20 76 76 61 72 20 57 48 lue FROM vvar WH
72b0: 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e ERE name=%Q", zN
72c0: 61 6d 65 29 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f ame);.}.void db_
72d0: 6c 73 65 74 28 63 6f 6e 73 74 20 63 68 61 72 20 lset(const char
72e0: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 *zName, const ch
72f0: 61 72 20 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 64 ar *zValue){. d
7300: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 52 45 b_multi_exec("RE
7310: 50 4c 41 43 45 20 49 4e 54 4f 20 76 76 61 72 28 PLACE INTO vvar(
7320: 6e 61 6d 65 2c 76 61 6c 75 65 29 20 56 41 4c 55 name,value) VALU
7330: 45 53 28 25 51 2c 25 51 29 22 2c 20 7a 4e 61 6d ES(%Q,%Q)", zNam
7340: 65 2c 20 7a 56 61 6c 75 65 29 3b 0a 7d 0a 69 6e e, zValue);.}.in
7350: 74 20 64 62 5f 6c 67 65 74 5f 69 6e 74 28 63 6f t db_lget_int(co
7360: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c nst char *zName,
7370: 20 69 6e 74 20 64 66 6c 74 29 7b 0a 20 20 72 65 int dflt){. re
7380: 74 75 72 6e 20 64 62 5f 69 6e 74 28 64 66 6c 74 turn db_int(dflt
7390: 2c 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20 , "SELECT value
73a0: 46 52 4f 4d 20 76 76 61 72 20 57 48 45 52 45 20 FROM vvar WHERE
73b0: 6e 61 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 name=%Q", zName)
73c0: 3b 0a 7d 0a 76 6f 69 64 20 64 62 5f 6c 73 65 74 ;.}.void db_lset
73d0: 5f 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 _int(const char
73e0: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 76 61 6c 75 *zName, int valu
73f0: 65 29 7b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 e){. db_multi_e
7400: 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54 xec("REPLACE INT
7410: 4f 20 76 76 61 72 28 6e 61 6d 65 2c 76 61 6c 75 O vvar(name,valu
7420: 65 29 20 56 41 4c 55 45 53 28 25 51 2c 25 64 29 e) VALUES(%Q,%d)
7430: 22 2c 20 7a 4e 61 6d 65 2c 20 76 61 6c 75 65 29 ", zName, value)
7440: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 ;.}../*.** Recor
7450: 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 d the name of a
7460: 6c 6f 63 61 6c 20 72 65 70 6f 73 69 74 6f 72 79 local repository
7470: 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c 5f 63 in the global_c
7480: 6f 6e 66 69 67 28 29 20 64 61 74 61 62 61 73 65 onfig() database
7490: 2e 0a 2a 2a 20 54 68 65 20 72 65 70 6f 73 74 69 ..** The reposti
74a0: 72 6f 79 20 66 69 6c 65 6e 61 6d 65 20 25 73 20 roy filename %s
74b0: 69 73 20 72 65 63 6f 72 64 65 64 20 61 73 20 61 is recorded as a
74c0: 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20 22 n entry with a "
74d0: 6e 61 6d 65 22 20 66 69 65 6c 64 0a 2a 2a 20 6f name" field.** o
74e0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 f the following
74f0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 form:.**.**
7500: 20 20 72 65 70 6f 3a 25 73 0a 2a 2a 0a 2a 2a 20 repo:%s.**.**
7510: 54 68 65 20 76 61 6c 75 65 20 66 69 65 6c 64 20 The value field
7520: 69 73 20 73 65 74 20 74 6f 20 31 2e 0a 2a 2f 0a is set to 1..*/.
7530: 76 6f 69 64 20 64 62 5f 72 65 63 6f 72 64 5f 72 void db_record_r
7540: 65 70 6f 73 69 74 6f 72 79 5f 66 69 6c 65 6e 61 epository_filena
7550: 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a me(const char *z
7560: 4e 61 6d 65 29 7b 0a 20 20 42 6c 6f 62 20 66 75 Name){. Blob fu
7570: 6c 6c 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d ll;. if( zName=
7580: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 67 =0 ){. if( !g
7590: 2e 6c 6f 63 61 6c 4f 70 65 6e 20 29 20 72 65 74 .localOpen ) ret
75a0: 75 72 6e 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d urn;. zName =
75b0: 20 64 62 5f 6c 67 65 74 28 22 72 65 70 6f 73 69 db_lget("reposi
75c0: 74 6f 72 79 22 2c 20 30 29 3b 0a 20 20 7d 0a 20 tory", 0);. }.
75d0: 20 66 69 6c 65 5f 63 61 6e 6f 6e 69 63 61 6c 5f file_canonical_
75e0: 6e 61 6d 65 28 7a 4e 61 6d 65 2c 20 26 66 75 6c name(zName, &ful
75f0: 6c 29 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 l);. db_multi_e
7600: 78 65 63 28 0a 20 20 20 20 20 22 49 4e 53 45 52 xec(. "INSER
7610: 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f T OR IGNORE INTO
7620: 20 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 28 6e global_config(n
7630: 61 6d 65 2c 76 61 6c 75 65 29 22 0a 20 20 20 20 ame,value)".
7640: 20 22 56 41 4c 55 45 53 28 27 72 65 70 6f 3a 25 "VALUES('repo:%
7650: 71 27 2c 31 29 22 2c 0a 20 20 20 20 20 62 6c 6f q',1)",. blo
7660: 62 5f 73 74 72 28 26 66 75 6c 6c 29 0a 20 20 29 b_str(&full). )
7670: 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 ;. blob_reset(&
7680: 66 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 full);.}../*.**
7690: 43 4f 4d 4d 41 4e 44 3a 20 6f 70 65 6e 0a 2a 2a COMMAND: open.**
76a0: 0a 2a 2a 20 55 73 61 67 65 3a 20 6f 70 65 6e 20 .** Usage: open
76b0: 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 4f FILENAME.**.** O
76c0: 70 65 6e 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e pen a connection
76d0: 20 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 72 65 to the local re
76e0: 70 6f 73 69 74 6f 72 79 20 69 6e 20 46 49 4c 45 pository in FILE
76f0: 4e 41 4d 45 2e 20 20 41 20 63 68 65 63 6b 6f 75 NAME. A checkou
7700: 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 72 65 70 t.** for the rep
7710: 6f 73 69 74 6f 72 79 20 69 73 20 63 72 65 61 74 ository is creat
7720: 65 64 20 77 69 74 68 20 69 74 73 20 72 6f 6f 74 ed with its root
7730: 20 61 74 20 74 68 65 20 77 6f 72 6b 69 6e 67 20 at the working
7740: 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2a 20 53 65 directory..** Se
7750: 65 20 61 6c 73 6f 20 74 68 65 20 22 63 6c 6f 73 e also the "clos
7760: 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 76 e" command..*/.v
7770: 6f 69 64 20 63 6d 64 5f 6f 70 65 6e 28 76 6f 69 oid cmd_open(voi
7780: 64 29 7b 0a 20 20 42 6c 6f 62 20 70 61 74 68 3b d){. Blob path;
7790: 0a 20 20 69 6e 74 20 76 69 64 3b 0a 20 20 73 74 . int vid;. st
77a0: 61 74 69 63 20 63 68 61 72 20 2a 61 7a 4e 65 77 atic char *azNew
77b0: 41 72 67 76 5b 5d 20 3d 20 7b 20 30 2c 20 22 75 Argv[] = { 0, "u
77c0: 70 64 61 74 65 22 2c 20 22 2d 2d 6c 61 74 65 73 pdate", "--lates
77d0: 74 22 2c 20 30 20 7d 3b 0a 20 20 75 72 6c 5f 70 t", 0 };. url_p
77e0: 72 6f 78 79 5f 6f 70 74 69 6f 6e 73 28 29 3b 0a roxy_options();.
77f0: 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d 33 20 if( g.argc!=3
7800: 29 7b 0a 20 20 20 20 75 73 61 67 65 28 22 52 45 ){. usage("RE
7810: 50 4f 53 49 54 4f 52 59 2d 46 49 4c 45 4e 41 4d POSITORY-FILENAM
7820: 45 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 E");. }. if( d
7830: 62 5f 6f 70 65 6e 5f 6c 6f 63 61 6c 28 29 20 29 b_open_local() )
7840: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e {. fossil_pan
7850: 69 63 28 22 61 6c 72 65 61 64 79 20 77 69 74 68 ic("already with
7860: 69 6e 20 61 6e 20 6f 70 65 6e 20 74 72 65 65 20 in an open tree
7870: 72 6f 6f 74 65 64 20 61 74 20 25 73 22 2c 20 67 rooted at %s", g
7880: 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 29 3b 0a 20 20 .zLocalRoot);.
7890: 7d 0a 20 20 66 69 6c 65 5f 63 61 6e 6f 6e 69 63 }. file_canonic
78a0: 61 6c 5f 6e 61 6d 65 28 67 2e 61 72 67 76 5b 32 al_name(g.argv[2
78b0: 5d 2c 20 26 70 61 74 68 29 3b 0a 20 20 64 62 5f ], &path);. db_
78c0: 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 open_repository(
78d0: 62 6c 6f 62 5f 73 74 72 28 26 70 61 74 68 29 29 blob_str(&path))
78e0: 3b 0a 20 20 64 62 5f 69 6e 69 74 5f 64 61 74 61 ;. db_init_data
78f0: 62 61 73 65 28 22 2e 2f 5f 4d 59 43 46 47 5f 22 base("./_MYCFG_"
7900: 2c 20 7a 4c 6f 63 61 6c 53 63 68 65 6d 61 2c 20 , zLocalSchema,
7910: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 64 62 5f (char*)0);. db_
7920: 6f 70 65 6e 5f 6c 6f 63 61 6c 28 29 3b 0a 20 20 open_local();.
7930: 64 62 5f 6c 73 65 74 28 22 72 65 70 6f 73 69 74 db_lset("reposit
7940: 6f 72 79 22 2c 20 62 6c 6f 62 5f 73 74 72 28 26 ory", blob_str(&
7950: 70 61 74 68 29 29 3b 0a 20 20 64 62 5f 72 65 63 path));. db_rec
7960: 6f 72 64 5f 72 65 70 6f 73 69 74 6f 72 79 5f 66 ord_repository_f
7970: 69 6c 65 6e 61 6d 65 28 62 6c 6f 62 5f 73 74 72 ilename(blob_str
7980: 28 26 70 61 74 68 29 29 3b 0a 20 20 76 69 64 20 (&path));. vid
7990: 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c = db_int(0, "SEL
79a0: 45 43 54 20 70 69 64 20 46 52 4f 4d 20 70 6c 69 ECT pid FROM pli
79b0: 6e 6b 20 79 22 0a 20 20 20 20 20 20 20 20 20 20 nk y".
79c0: 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 " WHERE
79d0: 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45 43 NOT EXISTS(SELEC
79e0: 54 20 31 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 78 T 1 FROM plink x
79f0: 20 57 48 45 52 45 20 78 2e 63 69 64 3d 79 2e 70 WHERE x.cid=y.p
7a00: 69 64 29 22 29 3b 0a 20 20 69 66 28 20 76 69 64 id)");. if( vid
7a10: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f 6c 73 ==0 ){. db_ls
7a20: 65 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75 74 et_int("checkout
7a30: 22 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a ", 1);. }else{.
7a40: 20 20 20 20 64 62 5f 6c 73 65 74 5f 69 6e 74 28 db_lset_int(
7a50: 22 63 68 65 63 6b 6f 75 74 22 2c 20 76 69 64 29 "checkout", vid)
7a60: 3b 0a 20 20 20 20 67 2e 61 72 67 76 20 3d 20 61 ;. g.argv = a
7a70: 7a 4e 65 77 41 72 67 76 3b 0a 20 20 20 20 67 2e zNewArgv;. g.
7a80: 61 72 67 63 20 3d 20 33 3b 0a 20 20 20 20 75 70 argc = 3;. up
7a90: 64 61 74 65 5f 63 6d 64 28 29 3b 0a 20 20 7d 0a date_cmd();. }.
7aa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 }../*.** Print t
7ab0: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 65 he value of a se
7ac0: 74 74 69 6e 67 20 6e 61 6d 65 64 20 7a 4e 61 6d tting named zNam
7ad0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 e.*/.static void
7ae0: 20 70 72 69 6e 74 5f 73 65 74 74 69 6e 67 28 63 print_setting(c
7af0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 onst char *zName
7b00: 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 ){. Stmt q;. i
7b10: 66 28 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f f( g.repositoryO
7b20: 70 65 6e 20 29 7b 0a 20 20 20 20 64 62 5f 70 72 pen ){. db_pr
7b30: 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20 20 20 epare(&q,.
7b40: 20 22 53 45 4c 45 43 54 20 27 28 6c 6f 63 61 6c "SELECT '(local
7b50: 29 27 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20 63 )', value FROM c
7b60: 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65 onfig WHERE name
7b70: 3d 25 51 22 0a 20 20 20 20 20 20 20 22 20 55 4e =%Q". " UN
7b80: 49 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 ION ALL ".
7b90: 20 22 53 45 4c 45 43 54 20 27 28 67 6c 6f 62 61 "SELECT '(globa
7ba0: 6c 29 27 2c 20 76 61 6c 75 65 20 46 52 4f 4d 20 l)', value FROM
7bb0: 67 6c 6f 62 61 6c 5f 63 6f 6e 66 69 67 20 57 48 global_config WH
7bc0: 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 ERE name=%Q",.
7bd0: 20 20 20 20 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d zName, zNam
7be0: 65 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 e. );. }else
7bf0: 7b 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 {. db_prepare
7c00: 28 26 71 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 (&q,. "SELE
7c10: 43 54 20 27 28 67 6c 6f 62 61 6c 29 27 2c 20 76 CT '(global)', v
7c20: 61 6c 75 65 20 46 52 4f 4d 20 67 6c 6f 62 61 6c alue FROM global
7c30: 5f 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 _config WHERE na
7c40: 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 7a 4e me=%Q",. zN
7c50: 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 ame. );. }.
7c60: 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 71 29 if( db_step(&q)
7c70: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a ==SQLITE_ROW ){.
7c80: 20 20 20 20 70 72 69 6e 74 66 28 22 25 2d 32 30 printf("%-20
7c90: 73 20 25 2d 38 73 20 25 73 5c 6e 22 2c 20 7a 4e s %-8s %s\n", zN
7ca0: 61 6d 65 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 ame, db_column_t
7cb0: 65 78 74 28 26 71 2c 20 30 29 2c 0a 20 20 20 20 ext(&q, 0),.
7cc0: 20 20 20 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 db_column_te
7cd0: 78 74 28 26 71 2c 20 31 29 29 3b 0a 20 20 7d 65 xt(&q, 1));. }e
7ce0: 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 lse{. printf(
7cf0: 22 25 2d 32 30 73 5c 6e 22 2c 20 7a 4e 61 6d 65 "%-20s\n", zName
7d00: 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 );. }. db_fina
7d10: 6c 69 7a 65 28 26 71 29 3b 0a 7d 0a 0a 0a 2f 2a lize(&q);.}.../*
7d20: 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 73 65 74 .** COMMAND: set
7d30: 74 69 6e 67 73 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 tings.** COMMAND
7d40: 3a 20 75 6e 73 65 74 0a 2a 2a 20 25 66 6f 73 73 : unset.** %foss
7d50: 69 6c 20 73 65 74 74 69 6e 67 20 3f 50 52 4f 50 il setting ?PROP
7d60: 45 52 54 59 3f 20 3f 56 41 4c 55 45 3f 20 3f 2d ERTY? ?VALUE? ?-
7d70: 67 6c 6f 62 61 6c 3f 0a 2a 2a 20 25 66 6f 73 73 global?.** %foss
7d80: 69 6c 20 75 6e 73 65 74 20 50 52 4f 50 45 52 54 il unset PROPERT
7d90: 59 20 3f 2d 67 6c 6f 62 61 6c 3f 0a 2a 2a 0a 2a Y ?-global?.**.*
7da0: 2a 20 54 68 65 20 22 73 65 74 74 69 6e 67 22 20 * The "setting"
7db0: 63 6f 6d 6d 61 6e 64 20 77 69 74 68 20 6e 6f 20 command with no
7dc0: 61 72 67 75 6d 65 6e 74 73 20 6c 69 73 74 73 20 arguments lists
7dd0: 61 6c 6c 20 70 72 6f 70 65 72 74 69 65 73 20 61 all properties a
7de0: 6e 64 20 74 68 65 69 72 0a 2a 2a 20 76 61 6c 75 nd their.** valu
7df0: 65 73 2e 20 20 57 69 74 68 20 6a 75 73 74 20 61 es. With just a
7e00: 20 70 72 6f 70 65 72 74 79 20 6e 61 6d 65 20 69 property name i
7e10: 74 20 73 68 6f 77 73 20 74 68 65 20 76 61 6c 75 t shows the valu
7e20: 65 20 6f 66 20 74 68 61 74 20 70 72 6f 70 65 72 e of that proper
7e30: 74 79 2e 0a 2a 2a 20 57 69 74 68 20 61 20 76 61 ty..** With a va
7e40: 6c 75 65 20 61 72 67 75 6d 65 6e 74 20 69 74 20 lue argument it
7e50: 63 68 61 6e 67 65 73 20 74 68 65 20 70 72 6f 70 changes the prop
7e60: 65 72 74 79 20 66 6f 72 20 74 68 65 20 63 75 72 erty for the cur
7e70: 72 65 6e 74 20 72 65 70 6f 73 69 74 6f 72 79 2e rent repository.
7e80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 75 6e 73 65 .**.** The "unse
7e90: 74 22 20 63 6f 6d 6d 61 6e 64 20 63 6c 65 61 72 t" command clear
7ea0: 73 20 61 20 70 72 6f 70 65 72 74 79 20 73 65 74 s a property set
7eb0: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 61 ting..**.** a
7ec0: 75 74 6f 73 79 6e 63 20 20 20 20 20 20 20 20 20 utosync
7ed0: 49 66 20 65 6e 61 62 6c 65 64 2c 20 61 75 74 6f If enabled, auto
7ee0: 6d 61 74 69 63 61 6c 6c 79 20 70 75 6c 6c 20 70 matically pull p
7ef0: 72 69 6f 72 20 74 6f 0a 2a 2a 20 20 20 20 20 20 rior to.**
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 c
7f10: 6f 6d 6d 69 74 20 6f 72 20 75 70 64 61 74 65 20 ommit or update
7f20: 61 6e 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c and automaticall
7f30: 79 20 70 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 y push.**
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 af
7f50: 74 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 74 61 ter commit or ta
7f60: 67 20 6f 72 20 62 72 61 6e 63 68 20 63 72 65 61 g or branch crea
7f70: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 64 tion..**.** d
7f80: 69 66 66 2d 63 6f 6d 6d 61 6e 64 20 20 20 20 20 iff-command
7f90: 45 78 74 65 72 6e 61 6c 20 63 6f 6d 6d 61 6e 64 External command
7fa0: 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 70 65 72 to run when per
7fb0: 66 6f 72 6d 69 6e 67 20 61 20 64 69 66 66 2e 0a forming a diff..
7fc0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 **
7fd0: 20 20 20 20 20 20 20 49 66 20 75 6e 64 65 66 69 If undefi
7fe0: 6e 65 64 2c 20 74 68 65 20 69 6e 74 65 72 6e 61 ned, the interna
7ff0: 6c 20 74 65 78 74 20 64 69 66 66 20 77 69 6c 6c l text diff will
8000: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 be used..**.**
8010: 20 20 20 65 64 69 74 6f 72 20 20 20 20 20 20 20 editor
8020: 20 20 20 20 54 65 78 74 20 65 64 69 74 6f 72 20 Text editor
8030: 63 6f 6d 6d 61 6e 64 20 75 73 65 64 20 66 6f 72 command used for
8040: 20 63 68 65 63 6b 2d 69 6e 20 63 6f 6d 6d 65 6e check-in commen
8050: 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 67 64 69 ts..**.** gdi
8060: 66 66 2d 63 6f 6d 6d 61 6e 64 20 20 20 20 45 78 ff-command Ex
8070: 74 65 72 6e 61 6c 20 63 6f 6d 6d 61 6e 64 20 74 ternal command t
8080: 6f 20 72 75 6e 20 77 68 65 6e 20 70 65 72 66 6f o run when perfo
8090: 72 6d 69 6e 67 20 61 20 67 72 61 70 68 69 63 61 rming a graphica
80a0: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 l.**
80b0: 20 20 20 20 20 20 20 20 20 64 69 66 66 2e 20 49 diff. I
80c0: 66 20 75 6e 64 65 66 69 6e 65 64 2c 20 74 65 78 f undefined, tex
80d0: 74 20 64 69 66 66 20 77 69 6c 6c 20 62 65 20 75 t diff will be u
80e0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6c 6f sed..**.** lo
80f0: 63 61 6c 61 75 74 68 20 20 20 20 20 20 20 20 49 calauth I
8100: 66 20 65 6e 61 62 6c 65 64 2c 20 72 65 71 75 69 f enabled, requi
8110: 72 65 20 74 68 61 74 20 48 54 54 50 20 63 6f 6e re that HTTP con
8120: 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 0a 2a 2a nections from.**
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8140: 20 20 20 20 20 31 32 37 2e 30 2e 30 2e 31 20 62 127.0.0.1 b
8150: 65 20 61 75 74 68 65 6e 74 69 63 61 74 65 64 20 e authenticated
8160: 62 79 20 70 61 73 73 77 6f 72 64 2e 20 20 49 66 by password. If
8170: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 .**
8180: 20 20 20 20 20 20 20 20 66 61 6c 73 65 2c 20 61 false, a
8190: 6c 6c 20 48 54 54 50 20 72 65 71 75 65 73 74 73 ll HTTP requests
81a0: 20 66 72 6f 6d 20 6c 6f 63 61 6c 68 6f 73 74 20 from localhost
81b0: 68 61 76 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 have.**
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 72 65 unre
81d0: 73 74 72 69 63 74 65 64 20 61 63 63 65 73 73 20 stricted access
81e0: 74 6f 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72 to the repositor
81f0: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 63 6c 65 61 y..**.** clea
8200: 72 73 69 67 6e 20 20 20 20 20 20 20 20 57 68 65 rsign Whe
8210: 6e 20 65 6e 61 62 6c 65 64 20 28 74 68 65 20 64 n enabled (the d
8220: 65 66 61 75 6c 74 29 2c 20 66 6f 73 73 69 6c 20 efault), fossil
8230: 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a will attempt to.
8240: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 **
8250: 20 20 20 20 20 20 20 73 69 67 6e 20 61 6c 6c 20 sign all
8260: 63 6f 6d 6d 69 74 73 20 77 69 74 68 20 67 70 67 commits with gpg
8270: 2e 20 20 57 68 65 6e 20 64 69 73 61 62 6c 65 64 . When disabled
8280: 2c 20 63 6f 6d 6d 69 74 73 20 77 69 6c 6c 0a 2a , commits will.*
8290: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
82a0: 20 20 20 20 20 20 62 65 20 75 6e 73 69 67 6e 65 be unsigne
82b0: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 67 70 2d d..**.** pgp-
82c0: 63 6f 6d 6d 61 6e 64 20 20 20 20 20 20 43 6f 6d command Com
82d0: 6d 61 6e 64 20 75 73 65 64 20 74 6f 20 63 6c 65 mand used to cle
82e0: 61 72 2d 73 69 67 6e 20 6d 61 6e 69 66 65 73 74 ar-sign manifest
82f0: 73 20 61 74 20 63 68 65 63 6b 2d 69 6e 2e 0a 2a s at check-in..*
8300: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
8310: 20 20 20 20 20 20 54 68 65 20 64 65 66 61 75 6c The defaul
8320: 74 20 69 73 20 22 67 70 67 20 2d 2d 63 6c 65 61 t is "gpg --clea
8330: 72 73 69 67 6e 20 2d 6f 20 22 2e 0a 2a 2a 0a 2a rsign -o "..**.*
8340: 2a 20 20 20 20 70 72 6f 78 79 20 20 20 20 20 20 * proxy
8350: 20 20 20 20 20 20 55 52 4c 20 6f 66 20 74 68 65 URL of the
8360: 20 48 54 54 50 20 70 72 6f 78 79 2e 20 20 49 66 HTTP proxy. If
8370: 20 75 6e 64 65 66 69 6e 65 64 20 6f 72 20 22 6f undefined or "o
8380: 66 66 22 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 ff" then.**
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
83a0: 74 68 65 20 22 68 74 74 70 5f 70 72 6f 78 79 22 the "http_proxy"
83b0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 environment var
83c0: 69 61 62 6c 65 20 69 73 20 63 6f 6e 73 75 6c 74 iable is consult
83d0: 65 64 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 ed..**
83e0: 20 20 20 20 20 20 20 20 20 20 20 49 66 20 74 68 If th
83f0: 65 20 68 74 74 70 5f 70 72 6f 78 79 20 65 6e 76 e http_proxy env
8400: 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c ironment variabl
8410: 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 0a 2a e is undefined.*
8420: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
8430: 20 20 20 20 20 20 74 68 65 6e 20 61 20 64 69 72 then a dir
8440: 65 63 74 20 48 54 54 50 20 63 6f 6e 6e 65 63 74 ect HTTP connect
8450: 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a ion is used..**.
8460: 2a 2a 20 20 20 20 77 65 62 2d 62 72 6f 77 73 65 ** web-browse
8470: 72 20 20 20 20 20 20 41 20 73 68 65 6c 6c 20 63 r A shell c
8480: 6f 6d 6d 61 6e 64 20 75 73 65 64 20 74 6f 20 6c ommand used to l
8490: 61 75 6e 63 68 20 79 6f 75 72 20 70 72 65 66 65 aunch your prefe
84a0: 72 72 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 rred.**
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 77 65 62 20 web
84c0: 62 72 6f 77 73 65 72 20 77 68 65 6e 20 67 69 76 browser when giv
84d0: 65 6e 20 61 20 55 52 4c 20 61 73 20 61 6e 20 61 en a URL as an a
84e0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 20 20 20 20 rgument..**
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8500: 44 65 66 61 75 6c 74 73 20 74 6f 20 22 73 74 61 Defaults to "sta
8510: 72 74 22 20 6f 6e 20 77 69 6e 64 6f 77 73 2c 20 rt" on windows,
8520: 22 6f 70 65 6e 22 20 6f 6e 20 4d 61 63 2c 0a 2a "open" on Mac,.*
8530: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
8540: 20 20 20 20 20 20 61 6e 64 20 22 66 69 72 65 66 and "firef
8550: 6f 78 22 20 6f 6e 20 55 6e 69 78 2e 0a 2a 2f 0a ox" on Unix..*/.
8560: 76 6f 69 64 20 73 65 74 74 69 6e 67 5f 63 6d 64 void setting_cmd
8570: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 (void){. static
8580: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4e const char *azN
8590: 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 ame[] = {. "a
85a0: 75 74 6f 73 79 6e 63 22 2c 0a 20 20 20 20 22 64 utosync",. "d
85b0: 69 66 66 2d 63 6f 6d 6d 61 6e 64 22 2c 0a 20 20 iff-command",.
85c0: 20 20 22 65 64 69 74 6f 72 22 2c 0a 20 20 20 20 "editor",.
85d0: 22 67 64 69 66 66 2d 63 6f 6d 6d 61 6e 64 22 2c "gdiff-command",
85e0: 0a 20 20 20 20 22 6c 6f 63 61 6c 61 75 74 68 22 . "localauth"
85f0: 2c 0a 20 20 20 20 22 63 6c 65 61 72 73 69 67 6e ,. "clearsign
8600: 22 2c 0a 20 20 20 20 22 70 67 70 2d 63 6f 6d 6d ",. "pgp-comm
8610: 61 6e 64 22 2c 0a 20 20 20 20 22 70 72 6f 78 79 and",. "proxy
8620: 22 2c 0a 20 20 20 20 22 77 65 62 2d 62 72 6f 77 ",. "web-brow
8630: 73 65 72 22 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 ser",. };. int
8640: 20 69 3b 0a 20 20 69 6e 74 20 67 6c 6f 62 61 6c i;. int global
8650: 46 6c 61 67 20 3d 20 66 69 6e 64 5f 6f 70 74 69 Flag = find_opti
8660: 6f 6e 28 22 67 6c 6f 62 61 6c 22 2c 22 67 22 2c on("global","g",
8670: 30 29 21 3d 30 3b 0a 20 20 69 6e 74 20 75 6e 73 0)!=0;. int uns
8680: 65 74 46 6c 61 67 20 3d 20 67 2e 61 72 67 76 5b etFlag = g.argv[
8690: 31 5d 5b 30 5d 3d 3d 27 75 27 3b 0a 20 20 64 62 1][0]=='u';. db
86a0: 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f 72 _find_and_open_r
86b0: 65 70 6f 73 69 74 6f 72 79 28 30 29 3b 0a 20 20 epository(0);.
86c0: 69 66 28 20 21 67 2e 72 65 70 6f 73 69 74 6f 72 if( !g.repositor
86d0: 79 4f 70 65 6e 20 29 7b 0a 20 20 20 20 67 6c 6f yOpen ){. glo
86e0: 62 61 6c 46 6c 61 67 20 3d 20 31 3b 0a 20 20 7d balFlag = 1;. }
86f0: 0a 20 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e 66 69 . db_open_confi
8700: 67 28 29 3b 0a 20 20 69 66 28 20 75 6e 73 65 74 g();. if( unset
8710: 46 6c 61 67 20 26 26 20 67 2e 61 72 67 63 21 3d Flag && g.argc!=
8720: 33 20 29 7b 0a 20 20 20 20 75 73 61 67 65 28 22 3 ){. usage("
8730: 50 52 4f 50 45 52 54 59 20 3f 2d 67 6c 6f 62 61 PROPERTY ?-globa
8740: 6c 3f 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 l?");. }. if(
8750: 67 2e 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 g.argc==2 ){.
8760: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 for(i=0; i<size
8770: 6f 66 28 61 7a 4e 61 6d 65 29 2f 73 69 7a 65 6f of(azName)/sizeo
8780: 66 28 61 7a 4e 61 6d 65 5b 30 5d 29 3b 20 69 2b f(azName[0]); i+
8790: 2b 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 5f +){. print_
87a0: 73 65 74 74 69 6e 67 28 61 7a 4e 61 6d 65 5b 69 setting(azName[i
87b0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 ]);. }. }els
87c0: 65 20 69 66 28 20 67 2e 61 72 67 63 3d 3d 33 20 e if( g.argc==3
87d0: 7c 7c 20 67 2e 61 72 67 63 3d 3d 34 20 29 7b 0a || g.argc==4 ){.
87e0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
87f0: 7a 4e 61 6d 65 20 3d 20 67 2e 61 72 67 76 5b 32 zName = g.argv[2
8800: 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 ];. int n = s
8810: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 trlen(zName);.
8820: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a for(i=0; i<siz
8830: 65 6f 66 28 61 7a 4e 61 6d 65 29 2f 73 69 7a 65 eof(azName)/size
8840: 6f 66 28 61 7a 4e 61 6d 65 5b 30 5d 29 3b 20 69 of(azName[0]); i
8850: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 ++){. if( s
8860: 74 72 6e 63 6d 70 28 61 7a 4e 61 6d 65 5b 69 5d trncmp(azName[i]
8870: 2c 20 7a 4e 61 6d 65 2c 20 6e 29 3d 3d 30 20 29 , zName, n)==0 )
8880: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
8890: 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 if( i>=sizeof(
88a0: 61 7a 4e 61 6d 65 29 2f 73 69 7a 65 6f 66 28 61 azName)/sizeof(a
88b0: 7a 4e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 zName[0]) ){.
88c0: 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 fossil_fatal(
88d0: 22 6e 6f 20 73 75 63 68 20 73 65 74 74 69 6e 67 "no such setting
88e0: 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 : %s", zName);.
88f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 6e 73 }. if( uns
8900: 65 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 etFlag ){.
8910: 64 62 5f 75 6e 73 65 74 28 61 7a 4e 61 6d 65 5b db_unset(azName[
8920: 69 5d 2c 20 67 6c 6f 62 61 6c 46 6c 61 67 29 3b i], globalFlag);
8930: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 67 . }else if( g
8940: 2e 61 72 67 63 3d 3d 34 20 29 7b 0a 20 20 20 20 .argc==4 ){.
8950: 20 20 64 62 5f 73 65 74 28 61 7a 4e 61 6d 65 5b db_set(azName[
8960: 69 5d 2c 20 67 2e 61 72 67 76 5b 33 5d 2c 20 67 i], g.argv[3], g
8970: 6c 6f 62 61 6c 46 6c 61 67 29 3b 0a 20 20 20 20 lobalFlag);.
8980: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 72 69 }else{. pri
8990: 6e 74 5f 73 65 74 74 69 6e 67 28 61 7a 4e 61 6d nt_setting(azNam
89a0: 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d e[i]);. }. }
89b0: 65 6c 73 65 7b 0a 20 20 20 20 75 73 61 67 65 28 else{. usage(
89c0: 22 3f 50 52 4f 50 45 52 54 59 3f 20 3f 56 41 4c "?PROPERTY? ?VAL
89d0: 55 45 3f 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a UE?");. }.}../*
89e0: 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e .** SQL function
89f0: 20 74 6f 20 72 65 6e 64 65 72 20 61 20 55 55 49 to render a UUI
8a00: 44 20 61 73 20 61 20 68 79 70 65 72 6c 69 6e 6b D as a hyperlink
8a10: 20 74 6f 20 61 20 70 61 67 65 20 64 65 73 63 72 to a page descr
8a20: 69 62 69 6e 67 0a 2a 2a 20 74 68 61 74 20 55 55 ibing.** that UU
8a30: 49 44 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f ID..*/.static vo
8a40: 69 64 20 68 79 70 65 72 6c 69 6e 6b 55 75 69 64 id hyperlinkUuid
8a50: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f Func(. sqlite3_
8a60: 63 6f 6e 74 65 78 74 20 2a 70 43 78 74 2c 20 20 context *pCxt,
8a70: 20 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 20 63 /* function c
8a80: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 ontext */. int
8a90: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 argc,
8aa0: 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 /* number
8ab0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f of arguments to
8ac0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f the function */
8ad0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 . sqlite3_value
8ae0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 2f 2a **argv /*
8af0: 20 76 61 6c 75 65 73 20 6f 66 20 61 6c 6c 20 66 values of all f
8b00: 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 unction argument
8b10: 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 s */.){. const
8b20: 63 68 61 72 20 2a 7a 55 75 69 64 3b 20 20 20 20 char *zUuid;
8b30: 20 20 20 20 20 2f 2a 20 54 68 65 20 55 55 49 44 /* The UUID
8b40: 20 74 6f 20 72 65 6e 64 65 72 20 2a 2f 0a 20 20 to render */.
8b50: 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 char *z;
8b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 /* Re
8b70: 6e 64 65 72 65 64 20 48 54 4d 4c 20 74 65 78 74 ndered HTML text
8b80: 20 2a 2f 0a 0a 20 20 7a 55 75 69 64 20 3d 20 28 */.. zUuid = (
8b90: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 const char*)sqli
8ba0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 te3_value_text(a
8bb0: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 67 rgv[0]);. if( g
8bc0: 2e 6f 6b 48 69 73 74 6f 72 79 20 26 26 20 7a 55 .okHistory && zU
8bd0: 75 69 64 20 26 26 20 73 74 72 6c 65 6e 28 7a 55 uid && strlen(zU
8be0: 75 69 64 29 3e 3d 31 30 20 29 7b 0a 20 20 20 20 uid)>=10 ){.
8bf0: 7a 20 3d 20 6d 70 72 69 6e 74 66 28 22 3c 74 74 z = mprintf("<tt
8c00: 3e 3c 61 20 68 72 65 66 3d 27 25 73 2f 76 69 6e ><a href='%s/vin
8c10: 66 6f 2f 25 74 27 3e 3c 73 70 61 6e 20 73 74 79 fo/%t'><span sty
8c20: 6c 65 3d 27 66 6f 6e 74 2d 73 69 7a 65 3a 31 2e le='font-size:1.
8c30: 35 65 6d 27 3e 22 0a 20 20 20 20 20 20 20 20 20 5em'>".
8c40: 20 20 20 20 20 20 20 22 25 23 68 3c 2f 73 70 61 "%#h</spa
8c50: 6e 3e 25 68 3c 2f 61 3e 3c 2f 74 74 3e 22 2c 0a n>%h</a></tt>",.
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8c70: 67 2e 7a 42 61 73 65 55 52 4c 2c 20 7a 55 75 69 g.zBaseURL, zUui
8c80: 64 2c 20 31 30 2c 20 7a 55 75 69 64 2c 20 26 7a d, 10, zUuid, &z
8c90: 55 75 69 64 5b 31 30 5d 29 3b 0a 20 20 20 20 73 Uuid[10]);. s
8ca0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 qlite3_result_te
8cb0: 78 74 28 70 43 78 74 2c 20 7a 2c 20 2d 31 2c 20 xt(pCxt, z, -1,
8cc0: 66 72 65 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a free);. }else{.
8cd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 sqlite3_resu
8ce0: 6c 74 5f 74 65 78 74 28 70 43 78 74 2c 20 7a 55 lt_text(pCxt, zU
8cf0: 75 69 64 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f uid, -1, SQLITE_
8d00: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a TRANSIENT);. }.
8d10: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e }../*.** SQL fun
8d20: 63 74 69 6f 6e 20 74 6f 20 72 65 6e 64 65 72 20 ction to render
8d30: 61 20 54 41 47 49 44 20 61 73 20 61 20 68 79 70 a TAGID as a hyp
8d40: 65 72 6c 69 6e 6b 20 74 6f 20 61 20 70 61 67 65 erlink to a page
8d50: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 74 describing.** t
8d60: 68 61 74 20 74 61 67 2e 0a 2a 2f 0a 73 74 61 74 hat tag..*/.stat
8d70: 69 63 20 76 6f 69 64 20 68 79 70 65 72 6c 69 6e ic void hyperlin
8d80: 6b 54 61 67 69 64 46 75 6e 63 28 0a 20 20 73 71 kTagidFunc(. sq
8d90: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 lite3_context *p
8da0: 43 78 74 2c 20 20 20 20 20 2f 2a 20 66 75 6e 63 Cxt, /* func
8db0: 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a tion context */.
8dc0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 int argc,
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
8de0: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 number of argume
8df0: 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 nts to the funct
8e00: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 ion */. sqlite3
8e10: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 20 20 20 _value **argv
8e20: 20 20 20 20 2f 2a 20 76 61 6c 75 65 73 20 6f 66 /* values of
8e30: 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 61 72 all function ar
8e40: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 guments */.){.
8e50: 69 6e 74 20 74 61 67 69 64 3b 20 20 20 20 20 20 int tagid;
8e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
8e70: 65 20 74 61 67 69 64 20 74 6f 20 72 65 6e 64 65 e tagid to rende
8e80: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 r */. char *z;
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8ea0: 20 20 2f 2a 20 72 65 6e 64 65 72 65 64 20 68 74 /* rendered ht
8eb0: 6d 6c 20 74 65 78 74 20 2a 2f 0a 0a 20 20 74 61 ml text */.. ta
8ec0: 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 gid = sqlite3_va
8ed0: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 lue_int(argv[0])
8ee0: 3b 0a 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 ;. if( g.okHist
8ef0: 6f 72 79 20 29 7b 0a 20 20 20 20 7a 20 3d 20 6d ory ){. z = m
8f00: 70 72 69 6e 74 66 28 22 3c 61 20 68 72 65 66 3d printf("<a href=
8f10: 27 25 73 2f 74 61 67 76 69 65 77 3f 74 61 67 69 '%s/tagview?tagi
8f20: 64 3d 25 64 27 3e 25 64 3c 2f 61 3e 22 2c 20 0a d=%d'>%d</a>", .
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8f40: 20 20 67 2e 7a 42 61 73 65 55 52 4c 2c 20 74 61 g.zBaseURL, ta
8f50: 67 69 64 2c 20 74 61 67 69 64 29 3b 0a 20 20 7d gid, tagid);. }
8f60: 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 6d 70 else{. z = mp
8f70: 72 69 6e 74 66 28 22 25 64 22 2c 20 74 61 67 69 rintf("%d", tagi
8f80: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 d);. }. sqlite
8f90: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 3_result_text(pC
8fa0: 78 74 2c 20 7a 2c 20 2d 31 2c 20 66 72 65 65 29 xt, z, -1, free)
8fb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 ;.}../*.** SQL f
8fc0: 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 6e 64 65 unction to rende
8fd0: 72 20 61 20 54 41 47 4e 41 4d 45 20 61 73 20 61 r a TAGNAME as a
8fe0: 20 68 79 70 65 72 6c 69 6e 6b 20 74 6f 20 61 20 hyperlink to a
8ff0: 70 61 67 65 20 64 65 73 63 72 69 62 69 6e 67 0a page describing.
9000: 2a 2a 20 74 68 61 74 20 74 61 67 2e 0a 2a 2f 0a ** that tag..*/.
9010: 73 74 61 74 69 63 20 76 6f 69 64 20 68 79 70 65 static void hype
9020: 72 6c 69 6e 6b 54 61 67 6e 61 6d 65 46 75 6e 63 rlinkTagnameFunc
9030: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 (. sqlite3_cont
9040: 65 78 74 20 2a 70 43 78 74 2c 20 20 20 20 20 2f ext *pCxt, /
9050: 2a 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 65 * function conte
9060: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 xt */. int argc
9070: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
9080: 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 /* number of
9090: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 arguments to the
90a0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 function */. s
90b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 qlite3_value **a
90c0: 72 67 76 20 20 20 20 20 20 20 2f 2a 20 76 61 6c rgv /* val
90d0: 75 65 73 20 6f 66 20 61 6c 6c 20 66 75 6e 63 74 ues of all funct
90e0: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f ion arguments */
90f0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 .){. const char
9100: 20 2a 7a 54 61 67 3b 20 20 20 20 20 20 20 20 20 *zTag;
9110: 20 2f 2a 20 54 68 65 20 74 61 67 20 74 6f 20 72 /* The tag to r
9120: 65 6e 64 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 ender */. char
9130: 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 *z;
9140: 20 20 20 20 20 20 2f 2a 20 72 65 6e 64 65 72 65 /* rendere
9150: 64 20 68 74 6d 6c 20 74 65 78 74 20 2a 2f 0a 0a d html text */..
9160: 20 20 7a 54 61 67 20 3d 20 28 63 6f 6e 73 74 20 zTag = (const
9170: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 char*)sqlite3_va
9180: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d lue_text(argv[0]
9190: 29 3b 0a 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 );. if( g.okHis
91a0: 74 6f 72 79 20 29 7b 0a 20 20 20 20 7a 20 3d 20 tory ){. z =
91b0: 6d 70 72 69 6e 74 66 28 22 3c 61 20 68 72 65 66 mprintf("<a href
91c0: 3d 27 25 73 2f 74 61 67 76 69 65 77 3f 6e 61 6d ='%s/tagview?nam
91d0: 65 3d 25 54 27 3e 25 68 3c 2f 61 3e 22 2c 20 0a e=%T'>%h</a>", .
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
91f0: 20 20 67 2e 7a 42 61 73 65 55 52 4c 2c 20 7a 54 g.zBaseURL, zT
9200: 61 67 2c 20 7a 54 61 67 29 3b 0a 20 20 7d 65 6c ag, zTag);. }el
9210: 73 65 7b 0a 20 20 20 20 7a 20 3d 20 6d 70 72 69 se{. z = mpri
9220: 6e 74 66 28 22 25 68 22 2c 20 7a 54 61 67 29 3b ntf("%h", zTag);
9230: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 . }. sqlite3_r
9240: 65 73 75 6c 74 5f 74 65 78 74 28 70 43 78 74 2c esult_text(pCxt,
9250: 20 7a 2c 20 2d 31 2c 20 66 72 65 65 29 3b 0a 7d z, -1, free);.}
9260: 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 ../*.** SQL func
9270: 74 69 6f 6e 20 74 6f 20 65 73 63 61 70 65 20 61 tion to escape a
9280: 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20 69 6e ll characters in
9290: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 68 a string that h
92a0: 61 76 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 6d ave special.** m
92b0: 65 61 6e 69 6e 67 20 74 6f 20 48 54 4d 4c 2e 0a eaning to HTML..
92c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 */.static void h
92d0: 74 6d 6c 69 7a 65 46 75 6e 63 28 0a 20 20 73 71 tmlizeFunc(. sq
92e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 lite3_context *p
92f0: 43 78 74 2c 20 20 20 20 20 2f 2a 20 66 75 6e 63 Cxt, /* func
9300: 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a tion context */.
9310: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 int argc,
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
9330: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 number of argume
9340: 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 nts to the funct
9350: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 ion */. sqlite3
9360: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 20 20 20 _value **argv
9370: 20 20 20 20 2f 2a 20 76 61 6c 75 65 73 20 6f 66 /* values of
9380: 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 61 72 all function ar
9390: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 guments */.){.
93a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 const char *zTex
93b0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 t; /* Te
93c0: 78 74 20 74 6f 20 62 65 20 68 74 6d 6c 69 7a 65 xt to be htmlize
93d0: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 d */. char *z;
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
93f0: 20 20 2f 2a 20 72 65 6e 64 65 72 65 64 20 68 74 /* rendered ht
9400: 6d 6c 20 74 65 78 74 20 2a 2f 0a 0a 20 20 7a 54 ml text */.. zT
9410: 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 ext = (const cha
9420: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 r*)sqlite3_value
9430: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a _text(argv[0]);.
9440: 20 20 7a 20 3d 20 68 74 6d 6c 69 7a 65 28 7a 54 z = htmlize(zT
9450: 65 78 74 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 ext, -1);. sqli
9460: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 te3_result_text(
9470: 70 43 78 74 2c 20 7a 2c 20 2d 31 2c 20 66 72 65 pCxt, z, -1, fre
9480: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 e);.}../*.** Thi
9490: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 s routine is a h
94a0: 65 6c 70 65 72 20 74 6f 20 72 75 6e 20 61 6e 20 elper to run an
94b0: 53 51 4c 20 71 75 65 72 79 20 61 6e 64 20 74 61 SQL query and ta
94c0: 62 6c 65 2d 69 7a 65 20 74 68 65 0a 2a 2a 20 72 ble-ize the.** r
94d0: 65 73 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 esults..**.** Th
94e0: 65 20 7a 53 71 6c 20 70 61 72 61 6d 65 74 65 72 e zSql parameter
94f0: 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e should be a sin
9500: 67 6c 65 2c 20 63 6f 6d 70 6c 65 74 65 20 53 51 gle, complete SQ
9510: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 L statement..**
9520: 54 61 62 6c 65 69 7a 65 64 20 6f 75 74 70 75 74 Tableized output
9530: 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 of the SQL stat
9540: 65 6d 65 6e 74 20 69 73 20 72 65 6e 64 65 72 65 ement is rendere
9550: 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 6c d back to the cl
9560: 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 ient..**.** The
9570: 69 73 53 61 66 65 20 66 6c 61 67 20 69 73 20 74 isSafe flag is t
9580: 72 75 65 20 69 66 20 61 6c 6c 20 71 75 65 72 79 rue if all query
9590: 20 72 65 73 75 6c 74 73 20 68 61 76 65 20 62 65 results have be
95a0: 65 6e 20 70 72 6f 63 65 73 73 65 64 20 0a 2a 2a en processed .**
95b0: 20 62 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63 by routines suc
95c0: 68 20 61 73 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 h as.**.**
95d0: 20 20 6c 69 6e 6b 75 75 69 64 28 29 0a 2a 2a 20 linkuuid().**
95e0: 20 20 20 20 20 20 20 6c 69 6e 6b 74 61 67 69 64 linktagid
95f0: 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 6c 69 6e ().** lin
9600: 6b 74 61 67 6e 61 6d 65 28 29 0a 2a 2a 20 20 20 ktagname().**
9610: 20 20 20 20 20 68 74 6d 6c 69 7a 65 28 29 0a 2a htmlize().*
9620: 2a 0a 2a 2a 20 61 6e 64 20 61 72 65 20 74 68 65 *.** and are the
9630: 72 65 66 6f 72 65 20 73 61 66 65 20 66 6f 72 20 refore safe for
9640: 64 69 72 65 63 74 20 72 65 6e 64 65 72 69 6e 67 direct rendering
9650: 2e 20 20 49 66 20 69 73 53 61 66 65 20 69 73 20 . If isSafe is
9660: 66 61 6c 73 65 2c 0a 2a 2a 20 74 68 65 6e 20 61 false,.** then a
9670: 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20 69 6e ll characters in
9680: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c the query resul
9690: 74 20 74 68 61 74 20 68 61 76 65 20 73 70 65 63 t that have spec
96a0: 69 61 6c 20 6d 65 61 6e 69 6e 67 0a 2a 2a 20 74 ial meaning.** t
96b0: 6f 20 48 54 4d 4c 20 61 72 65 20 65 73 63 61 70 o HTML are escap
96c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e ed..**.** Return
96d0: 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 s SQLITE_OK on s
96e0: 75 63 63 65 73 73 20 61 6e 64 20 61 6e 79 20 6f uccess and any o
96f0: 74 68 65 72 20 76 61 6c 75 65 20 6f 6e 20 65 72 ther value on er
9700: 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 64 62 5f 67 ror..*/.int db_g
9710: 65 6e 65 72 69 63 5f 71 75 65 72 79 5f 76 69 65 eneric_query_vie
9720: 77 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 w(const char *zS
9730: 71 6c 2c 20 69 6e 74 20 69 73 53 61 66 65 29 7b ql, int isSafe){
9740: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 . sqlite3_stmt
9750: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 *pStmt;. int rc
9760: 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 3b ;. int nCol, i;
9770: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 0a 20 20 63 . int nRow;. c
9780: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 6f 77 3b onst char *zRow;
9790: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6f 6e . static int on
97a0: 63 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 6e ce = 1;.. /* In
97b0: 73 74 61 6c 6c 20 74 68 65 20 73 70 65 63 69 61 stall the specia
97c0: 6c 20 66 75 6e 63 74 69 6f 6e 73 20 6f 6e 20 74 l functions on t
97d0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f he first call to
97e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f this routine */
97f0: 0a 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 . if( once ){.
9800: 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 once = 0;.
9810: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f sqlite3_create_
9820: 66 75 6e 63 74 69 6f 6e 28 67 2e 64 62 2c 20 22 function(g.db, "
9830: 6c 69 6e 6b 75 75 69 64 22 2c 20 31 2c 20 53 51 linkuuid", 1, SQ
9840: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20 LITE_UTF8, 0, .
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9860: 20 20 20 20 20 20 20 20 20 20 20 68 79 70 65 72 hyper
9870: 6c 69 6e 6b 55 75 69 64 46 75 6e 63 2c 20 30 2c linkUuidFunc, 0,
9880: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 0);. sqlite3
9890: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e _create_function
98a0: 28 67 2e 64 62 2c 20 22 6c 69 6e 6b 74 61 67 69 (g.db, "linktagi
98b0: 64 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 d", 1, SQLITE_UT
98c0: 46 38 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 F8, 0, .
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
98e0: 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 54 61 67 hyperlinkTag
98f0: 69 64 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 idFunc, 0, 0);.
9900: 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 sqlite3_creat
9910: 65 5f 66 75 6e 63 74 69 6f 6e 28 67 2e 64 62 2c e_function(g.db,
9920: 20 22 6c 69 6e 6b 74 61 67 6e 61 6d 65 22 2c 20 "linktagname",
9930: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 1, SQLITE_UTF8,
9940: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 0, .
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9960: 68 79 70 65 72 6c 69 6e 6b 54 61 67 6e 61 6d 65 hyperlinkTagname
9970: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 Func, 0, 0);.
9980: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f sqlite3_create_
9990: 66 75 6e 63 74 69 6f 6e 28 67 2e 64 62 2c 20 22 function(g.db, "
99a0: 68 74 6d 6c 69 7a 65 22 2c 20 31 2c 20 53 51 4c htmlize", 1, SQL
99b0: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 ITE_UTF8, 0, .
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
99d0: 20 20 20 20 20 20 20 20 20 20 68 74 6d 6c 69 7a htmliz
99e0: 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 eFunc, 0, 0);.
99f0: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 }.. /*. ** Use
9a00: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 64 69 sqlite3_stmt di
9a10: 72 65 63 74 6c 79 20 72 61 74 68 65 72 20 74 68 rectly rather th
9a20: 61 6e 20 67 6f 69 6e 67 20 74 68 72 6f 75 67 68 an going through
9a30: 20 64 62 5f 70 72 65 70 61 72 65 28 29 2c 0a 20 db_prepare(),.
9a40: 20 2a 2a 20 73 6f 20 74 68 61 74 20 77 65 20 63 ** so that we c
9a50: 61 6e 20 74 72 65 61 74 20 65 72 72 6f 72 73 20 an treat errors
9a60: 61 20 6e 6f 6e 2d 66 61 74 61 6c 2e 0a 20 20 2a a non-fatal.. *
9a70: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 /. rc = sqlite3
9a80: 5f 70 72 65 70 61 72 65 28 67 2e 64 62 2c 20 7a _prepare(g.db, z
9a90: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c Sql, -1, &pStmt,
9aa0: 20 30 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 0);. if( SQLIT
9ab0: 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20 20 E_OK != rc ){.
9ac0: 20 20 40 20 3c 73 70 61 6e 20 73 74 79 6c 65 3d @ <span style=
9ad0: 27 63 6f 6c 6f 72 3a 72 65 64 27 3e 64 62 5f 67 'color:red'>db_g
9ae0: 65 6e 65 72 69 63 5f 71 75 65 72 79 5f 76 69 65 eneric_query_vie
9af0: 77 28 29 20 53 51 4c 20 65 72 72 6f 72 3a 0a 20 w() SQL error:.
9b00: 20 20 20 40 20 25 68 28 73 71 6c 69 74 65 33 5f @ %h(sqlite3_
9b10: 65 72 72 6d 73 67 28 67 2e 64 62 29 29 3c 2f 73 errmsg(g.db))</s
9b20: 70 61 6e 3e 0a 20 20 20 20 72 65 74 75 72 6e 20 pan>. return
9b30: 72 63 3b 0a 20 20 7d 0a 20 20 6e 43 6f 6c 20 3d rc;. }. nCol =
9b40: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
9b50: 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 count(pStmt);.
9b60: 40 20 3c 74 61 62 6c 65 20 63 6c 61 73 73 3d 27 @ <table class='
9b70: 66 6f 73 73 69 6c 5f 64 62 5f 67 65 6e 65 72 69 fossil_db_generi
9b80: 63 5f 71 75 65 72 79 5f 76 69 65 77 27 3e 3c 74 c_query_view'><t
9b90: 62 6f 64 79 3e 0a 20 20 40 20 3c 74 72 20 63 6c body>. @ <tr cl
9ba0: 61 73 73 3d 27 68 65 61 64 65 72 27 3e 0a 20 20 ass='header'>.
9bb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b for(i=0; i<nCol;
9bc0: 20 2b 2b 69 29 7b 0a 20 20 20 20 40 20 3c 74 64 ++i){. @ <td
9bd0: 3e 25 68 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 >%h(sqlite3_colu
9be0: 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 mn_name(pStmt,i)
9bf0: 29 3c 2f 74 64 3e 0a 20 20 7d 0a 20 20 40 20 3c )</td>. }. @ <
9c00: 2f 74 72 3e 0a 0a 20 20 6e 52 6f 77 20 3d 20 30 /tr>.. nRow = 0
9c10: 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 ;. while( SQLIT
9c20: 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 E_ROW==sqlite3_s
9c30: 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 tep(pStmt) ){.
9c40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a const char *az
9c50: 43 6c 61 73 73 5b 5d 20 3d 20 7b 20 22 65 76 65 Class[] = { "eve
9c60: 6e 22 2c 20 22 6f 64 64 22 20 7d 3b 0a 20 20 20 n", "odd" };.
9c70: 20 40 20 3c 74 72 20 63 6c 61 73 73 3d 27 25 73 @ <tr class='%s
9c80: 28 61 7a 43 6c 61 73 73 5b 28 6e 52 6f 77 2b 2b (azClass[(nRow++
9c90: 29 26 31 5d 29 27 3e 0a 20 20 20 20 20 20 66 6f )&1])'>. fo
9ca0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 r(i=0; i<nCol; i
9cb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 6f ++){. zRo
9cc0: 77 20 3d 20 28 63 68 61 72 20 63 6f 6e 73 74 2a w = (char const*
9cd0: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f )sqlite3_column_
9ce0: 74 65 78 74 28 70 53 74 6d 74 2c 69 29 3b 0a 20 text(pStmt,i);.
9cf0: 20 20 20 20 20 20 20 69 66 28 20 69 73 53 61 66 if( isSaf
9d00: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 40 e ){. @
9d10: 20 3c 74 64 3e 25 73 28 7a 52 6f 77 29 3c 2f 74 <td>%s(zRow)</t
9d20: 64 3e 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 d>. }else
9d30: 7b 0a 20 20 20 20 20 20 20 20 20 20 40 20 3c 74 {. @ <t
9d40: 64 3e 25 68 28 7a 52 6f 77 29 3c 2f 74 64 3e 0a d>%h(zRow)</td>.
9d50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
9d60: 7d 0a 20 20 20 20 40 20 3c 2f 74 72 3e 0a 20 20 }. @ </tr>.
9d70: 7d 0a 20 20 40 20 3c 2f 74 62 6f 64 79 3e 3c 2f }. @ </tbody></
9d80: 74 61 62 6c 65 3e 0a 20 20 73 71 6c 69 74 65 33 table>. sqlite3
9d90: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 _finalize(pStmt)
9da0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 ;. return SQLIT
9db0: 45 5f 4f 4b 3b 0a 7d 0a E_OK;.}.