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 37 20 44 2e 20 52 69 63 68 (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54 ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20 te it and/or.**
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20 modify it under
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76 lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65 ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 tributed in the
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 l be useful,.**
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20 but WITHOUT ANY
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54 * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52 Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55 A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20 RPOSE. See the
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50 GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 d have received
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72 g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69 ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65 te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20 ation, Inc., 59
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53 Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73 uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31 ton, MA 02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20 307, USA..**.**
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 nformation:.**
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 * http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 contains code u
0380: 73 65 64 20 72 65 6e 64 65 72 20 61 6e 64 20 63 sed render and c
0390: 6f 6e 74 72 6f 6c 20 74 69 63 6b 65 74 20 65 6e ontrol ticket en
03a0: 74 72 79 0a 2a 2a 20 61 6e 64 20 64 69 73 70 6c try.** and displ
03b0: 61 79 20 70 61 67 65 73 2e 0a 2a 2f 0a 23 69 6e ay pages..*/.#in
03c0: 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 clude "config.h"
03d0: 0a 23 69 6e 63 6c 75 64 65 20 22 74 6b 74 2e 68 .#include "tkt.h
03e0: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 ".#include <asse
03f0: 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 rt.h>../*.** The
0400: 20 6c 69 73 74 20 6f 66 20 64 61 74 61 62 61 73 list of databas
0410: 65 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 e user-defined f
0420: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 54 49 43 ields in the TIC
0430: 4b 45 54 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 KET table..** Th
0440: 65 20 72 65 61 6c 20 74 61 62 6c 65 20 61 6c 73 e real table als
0450: 6f 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 o contains some
0460: 61 64 64 69 74 69 6f 6e 20 66 69 65 6c 64 73 20 addition fields
0470: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 for internal.**
0480: 75 73 65 64 2e 20 20 54 68 65 20 69 6e 74 65 72 used. The inter
0490: 6e 61 6c 2d 75 73 65 20 66 69 65 6c 64 73 20 62 nal-use fields b
04a0: 65 67 69 6e 20 77 69 74 68 20 22 74 6b 74 5f 22 egin with "tkt_"
04b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
04c0: 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 73 74 61 74 nField = 0;.stat
04d0: 69 63 20 63 68 61 72 20 2a 2a 61 7a 46 69 65 6c ic char **azFiel
04e0: 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 61 6d d = 0; /* Nam
04f0: 65 73 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 es of database f
0500: 69 65 6c 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 ields */.static
0510: 63 68 61 72 20 2a 2a 61 7a 56 61 6c 75 65 20 3d char **azValue =
0520: 20 30 3b 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 0; /* Origin
0530: 61 6c 20 76 61 6c 75 65 73 20 2a 2f 0a 73 74 61 al values */.sta
0540: 74 69 63 20 63 68 61 72 20 2a 2a 61 7a 41 70 70 tic char **azApp
0550: 65 6e 64 20 3d 20 30 3b 20 20 20 2f 2a 20 56 61 end = 0; /* Va
0560: 6c 75 65 20 74 6f 20 62 65 20 61 70 70 65 6e 64 lue to be append
0570: 65 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 ed */../*.** A s
0580: 75 62 73 63 72 69 70 74 20 69 6e 74 65 72 70 72 ubscript interpr
0590: 65 74 65 72 20 75 73 65 64 20 66 6f 72 20 70 72 eter used for pr
05a0: 6f 63 65 73 73 69 6e 67 20 54 69 63 6b 65 74 73 ocessing Tickets
05b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 ..*/.static stru
05c0: 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 49 ct Subscript *pI
05d0: 6e 74 65 72 70 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a nterp = 0;../*.*
05e0: 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 65 6e * Compare two en
05f0: 74 72 69 65 73 20 69 6e 20 61 7a 46 69 65 6c 64 tries in azField
0600: 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 for sorting pur
0610: 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 poses.*/.static
0620: 69 6e 74 20 6e 61 6d 65 43 6d 70 72 28 63 6f 6e int nameCmpr(con
0630: 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 st void *a, cons
0640: 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 72 65 t void *b){. re
0650: 74 75 72 6e 20 73 74 72 63 6d 70 28 2a 28 63 68 turn strcmp(*(ch
0660: 61 72 2a 2a 29 61 2c 20 2a 28 63 68 61 72 2a 2a ar**)a, *(char**
0670: 29 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 )b);.}../*.** Ob
0680: 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 61 tain a list of a
0690: 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 ll fields of the
06a0: 20 54 49 43 4b 45 54 20 74 61 62 6c 65 2e 20 20 TICKET table.
06b0: 50 75 74 20 74 68 65 6d 20 0a 2a 2a 20 69 6e 20 Put them .** in
06c0: 73 6f 72 74 65 64 20 6f 72 64 65 72 20 69 6e 20 sorted order in
06d0: 61 7a 46 69 65 6c 64 5b 5d 2e 0a 2a 2a 0a 2a 2a azField[]..**.**
06e0: 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 73 Also allocate s
06f0: 70 61 63 65 20 66 6f 72 20 61 7a 56 61 6c 75 65 pace for azValue
0700: 5b 5d 20 61 6e 64 20 61 7a 41 70 70 65 6e 64 5b [] and azAppend[
0710: 5d 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 ] and initialize
0720: 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 76 61 6c 75 .** all the valu
0730: 65 73 20 74 68 65 72 65 20 74 6f 20 7a 65 72 6f es there to zero
0740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 ..*/.static void
0750: 20 67 65 74 41 6c 6c 54 69 63 6b 65 74 46 69 65 getAllTicketFie
0760: 6c 64 73 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d lds(void){. Stm
0770: 74 20 71 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 t q;. int i;.
0780: 69 66 28 20 6e 46 69 65 6c 64 3e 30 20 29 20 72 if( nField>0 ) r
0790: 65 74 75 72 6e 3b 0a 20 20 64 62 5f 70 72 65 70 eturn;. db_prep
07a0: 61 72 65 28 26 71 2c 20 22 50 52 41 47 4d 41 20 are(&q, "PRAGMA
07b0: 74 61 62 6c 65 5f 69 6e 66 6f 28 74 69 63 6b 65 table_info(ticke
07c0: 74 29 22 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 t)");. while( d
07d0: 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 b_step(&q)==SQLI
07e0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f TE_ROW ){. co
07f0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 65 6c 64 nst char *zField
0800: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 = db_column_tex
0810: 74 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 69 66 t(&q, 1);. if
0820: 28 20 73 74 72 6e 63 6d 70 28 7a 46 69 65 6c 64 ( strncmp(zField
0830: 2c 22 74 6b 74 5f 22 2c 34 29 3d 3d 30 20 29 20 ,"tkt_",4)==0 )
0840: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 continue;. if
0850: 28 20 6e 46 69 65 6c 64 25 31 30 3d 3d 30 20 29 ( nField%10==0 )
0860: 7b 0a 20 20 20 20 20 20 61 7a 46 69 65 6c 64 20 {. azField
0870: 3d 20 72 65 61 6c 6c 6f 63 28 61 7a 46 69 65 6c = realloc(azFiel
0880: 64 2c 20 73 69 7a 65 6f 66 28 61 7a 46 69 65 6c d, sizeof(azFiel
0890: 64 29 2a 33 2a 28 6e 46 69 65 6c 64 2b 31 30 29 d)*3*(nField+10)
08a0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a );. if( az
08b0: 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 Field==0 ){.
08c0: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c fossil_fatal
08d0: 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 ("out of memory"
08e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d );. }. }
08f0: 0a 20 20 20 20 61 7a 46 69 65 6c 64 5b 6e 46 69 . azField[nFi
0900: 65 6c 64 5d 20 3d 20 6d 70 72 69 6e 74 66 28 22 eld] = mprintf("
0910: 25 73 22 2c 20 7a 46 69 65 6c 64 29 3b 0a 20 20 %s", zField);.
0920: 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a nField++;. }.
0930: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 db_finalize(&q
0940: 29 3b 0a 20 20 71 73 6f 72 74 28 61 7a 46 69 65 );. qsort(azFie
0950: 6c 64 2c 20 6e 46 69 65 6c 64 2c 20 73 69 7a 65 ld, nField, size
0960: 6f 66 28 61 7a 46 69 65 6c 64 5b 30 5d 29 2c 20 of(azField[0]),
0970: 6e 61 6d 65 43 6d 70 72 29 3b 0a 20 20 61 7a 41 nameCmpr);. azA
0980: 70 70 65 6e 64 20 3d 20 26 61 7a 46 69 65 6c 64 ppend = &azField
0990: 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 6d 65 6d 73 [nField];. mems
09a0: 65 74 28 61 7a 41 70 70 65 6e 64 2c 20 30 2c 20 et(azAppend, 0,
09b0: 73 69 7a 65 6f 66 28 61 7a 41 70 70 65 6e 64 5b sizeof(azAppend[
09c0: 30 5d 29 2a 6e 46 69 65 6c 64 29 3b 0a 20 20 61 0])*nField);. a
09d0: 7a 56 61 6c 75 65 20 3d 20 26 61 7a 41 70 70 65 zValue = &azAppe
09e0: 6e 64 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 66 6f nd[nField];. fo
09f0: 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b r(i=0; i<nField;
0a00: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 7a 56 61 6c i++){. azVal
0a10: 75 65 5b 69 5d 20 3d 20 22 22 3b 0a 20 20 7d 0a ue[i] = "";. }.
0a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 }../*.** Return
0a30: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 the index into a
0a40: 7a 46 69 65 6c 64 5b 5d 20 6f 66 20 74 68 65 20 zField[] of the
0a50: 67 69 76 65 6e 20 66 69 65 6c 64 20 6e 61 6d 65 given field name
0a60: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 31 20 69 ..** Return -1 i
0a70: 66 20 7a 46 69 65 6c 64 20 69 73 20 6e 6f 74 20 f zField is not
0a80: 69 6e 20 61 7a 46 69 65 6c 64 5b 5d 2e 0a 2a 2f in azField[]..*/
0a90: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 65 6c .static int fiel
0aa0: 64 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a dId(const char *
0ab0: 7a 46 69 65 6c 64 29 7b 0a 20 20 69 6e 74 20 69 zField){. int i
0ac0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e ;. for(i=0; i<n
0ad0: 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 Field; i++){.
0ae0: 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 46 69 if( strcmp(azFi
0af0: 65 6c 64 5b 69 5d 2c 20 7a 46 69 65 6c 64 29 3d eld[i], zField)=
0b00: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 =0 ) return i;.
0b10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a }. return -1;.
0b20: 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 }../*.** Query t
0b30: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 he database for
0b40: 61 6c 6c 20 54 49 43 4b 45 54 20 66 69 65 6c 64 all TICKET field
0b50: 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 s for the specif
0b60: 69 63 0a 2a 2a 20 74 69 63 6b 65 74 20 77 68 6f ic.** ticket who
0b70: 73 65 20 6e 61 6d 65 20 69 73 20 67 69 76 65 6e se name is given
0b80: 20 62 79 20 74 68 65 20 22 6e 61 6d 65 22 20 43 by the "name" C
0b90: 47 49 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a GI parameter..**
0ba0: 20 4c 6f 61 64 20 74 68 65 20 76 61 6c 75 65 73 Load the values
0bb0: 20 66 6f 72 20 61 6c 6c 20 66 69 65 6c 64 73 20 for all fields
0bc0: 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 into the interpr
0bd0: 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 eter..**.** Only
0be0: 20 6c 6f 61 64 20 74 68 6f 73 65 20 66 69 65 6c load those fiel
0bf0: 64 73 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 ds which do not
0c00: 61 6c 72 65 61 64 79 20 65 78 69 73 74 20 61 73 already exist as
0c10: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a .** variables..*
0c20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e /.static void in
0c30: 69 74 69 61 6c 69 7a 65 56 61 72 69 61 62 6c 65 itializeVariable
0c40: 73 46 72 6f 6d 44 62 28 76 6f 69 64 29 7b 0a 20 sFromDb(void){.
0c50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 const char *zNa
0c60: 6d 65 3b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 me;. Stmt q;.
0c70: 69 6e 74 20 69 2c 20 6e 2c 20 73 69 7a 65 2c 20 int i, n, size,
0c80: 6a 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 50 44 j;.. zName = PD
0c90: 28 22 6e 61 6d 65 22 2c 22 22 29 3b 0a 20 20 64 ("name","");. d
0ca0: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22 53 b_prepare(&q, "S
0cb0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 69 63 ELECT * FROM tic
0cc0: 6b 65 74 20 57 48 45 52 45 20 74 6b 74 5f 75 75 ket WHERE tkt_uu
0cd0: 69 64 20 47 4c 4f 42 20 27 25 71 2a 27 22 2c 20 id GLOB '%q*'",
0ce0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 64 62 zName);. if( db
0cf0: 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 _step(&q)==SQLIT
0d00: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 6e 20 3d E_ROW ){. n =
0d10: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 db_column_count
0d20: 28 26 71 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d (&q);. for(i=
0d30: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 0; i<n; i++){.
0d40: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
0d50: 7a 56 61 6c 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e zVal = db_column
0d60: 5f 74 65 78 74 28 26 71 2c 20 69 29 3b 0a 20 20 _text(&q, i);.
0d70: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
0d80: 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d zName = db_colum
0d90: 6e 5f 6e 61 6d 65 28 26 71 2c 20 69 29 3b 0a 20 n_name(&q, i);.
0da0: 20 20 20 20 20 69 66 28 20 7a 56 61 6c 3d 3d 30 if( zVal==0
0db0: 20 29 20 7a 56 61 6c 20 3d 20 22 22 3b 0a 20 20 ) zVal = "";.
0dc0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e for(j=0; j<n
0dd0: 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 Field; j++){.
0de0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 if( strcmp(
0df0: 61 7a 46 69 65 6c 64 5b 6a 5d 2c 7a 4e 61 6d 65 azField[j],zName
0e00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 )==0 ){.
0e10: 20 20 61 7a 56 61 6c 75 65 5b 6a 5d 20 3d 20 6d azValue[j] = m
0e20: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 56 61 printf("%s", zVa
0e30: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 l);. br
0e40: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 eak;. }.
0e50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 }. if(
0e60: 20 53 62 53 5f 46 65 74 63 68 28 70 49 6e 74 65 SbS_Fetch(pInte
0e70: 72 70 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 26 rp, zName, -1, &
0e80: 73 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 size)==0 ){.
0e90: 20 20 20 20 53 62 53 5f 53 74 6f 72 65 28 70 49 SbS_Store(pI
0ea0: 6e 74 65 72 70 2c 20 64 62 5f 63 6f 6c 75 6d 6e nterp, db_column
0eb0: 5f 6e 61 6d 65 28 26 71 2c 69 29 2c 20 7a 56 61 _name(&q,i), zVa
0ec0: 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 l, 1);. }.
0ed0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 }. }else{.
0ee0: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 db_finalize(&q
0ef0: 29 3b 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 );. db_prepar
0f00: 65 28 26 71 2c 20 22 50 52 41 47 4d 41 20 74 61 e(&q, "PRAGMA ta
0f10: 62 6c 65 5f 69 6e 66 6f 28 74 69 63 6b 65 74 29 ble_info(ticket)
0f20: 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 64 ");. while( d
0f30: 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 b_step(&q)==SQLI
0f40: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 TE_ROW ){.
0f50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 65 const char *zFie
0f60: 6c 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 ld = db_column_t
0f70: 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 ext(&q, 1);.
0f80: 20 20 69 66 28 20 53 62 53 5f 46 65 74 63 68 28 if( SbS_Fetch(
0f90: 70 49 6e 74 65 72 70 2c 20 7a 46 69 65 6c 64 2c pInterp, zField,
0fa0: 20 2d 31 2c 20 26 73 69 7a 65 29 3d 3d 30 20 29 -1, &size)==0 )
0fb0: 7b 0a 20 20 20 20 20 20 20 20 53 62 53 5f 53 74 {. SbS_St
0fc0: 6f 72 65 28 70 49 6e 74 65 72 70 2c 20 7a 46 69 ore(pInterp, zFi
0fd0: 65 6c 64 2c 20 22 22 2c 20 30 29 3b 0a 20 20 20 eld, "", 0);.
0fe0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 }. }. }.
0ff0: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 db_finalize(&q)
1000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 ;.}../*.** Trans
1010: 66 65 72 20 61 6c 6c 20 43 47 49 20 70 61 72 61 fer all CGI para
1020: 6d 65 74 65 72 73 20 74 6f 20 76 61 72 69 61 62 meters to variab
1030: 6c 65 73 20 69 6e 20 74 68 65 20 69 6e 74 65 72 les in the inter
1040: 70 72 65 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 preter..*/.stati
1050: 63 20 76 6f 69 64 20 69 6e 69 74 69 61 6c 69 7a c void initializ
1060: 65 56 61 72 69 61 62 6c 65 73 46 72 6f 6d 43 47 eVariablesFromCG
1070: 49 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 I(void){. int i
1080: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ;. const char *
1090: 7a 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 z;.. for(i=0; (
10a0: 7a 20 3d 20 63 67 69 5f 70 61 72 61 6d 65 74 65 z = cgi_paramete
10b0: 72 5f 6e 61 6d 65 28 69 29 29 21 3d 30 3b 20 69 r_name(i))!=0; i
10c0: 2b 2b 29 7b 0a 20 20 20 20 53 62 53 5f 53 74 6f ++){. SbS_Sto
10d0: 72 65 28 70 49 6e 74 65 72 70 2c 20 7a 2c 20 50 re(pInterp, z, P
10e0: 28 7a 29 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a (z), 0);. }.}..
10f0: 2f 2a 0a 2a 2a 20 52 65 62 75 69 6c 64 20 61 6c /*.** Rebuild al
1100: 6c 20 74 69 63 6b 65 74 73 20 6e 61 6d 65 64 20 l tickets named
1110: 69 6e 20 74 68 65 20 5f 70 65 6e 64 69 6e 67 5f in the _pending_
1120: 74 69 63 6b 65 74 20 74 61 62 6c 65 2e 0a 2a 2a ticket table..**
1130: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
1140: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 is called just
1150: 70 72 69 6f 72 20 74 6f 20 63 6f 6d 6d 69 74 20 prior to commit
1160: 61 66 74 65 72 20 6e 65 77 0a 2a 2a 20 6f 75 74 after new.** out
1170: 2d 6f 66 2d 73 65 71 75 65 6e 63 65 20 74 69 63 -of-sequence tic
1180: 6b 65 74 20 63 68 61 6e 67 65 73 20 68 61 76 65 ket changes have
1190: 20 62 65 65 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a been added..*/.
11a0: 73 74 61 74 69 63 20 69 6e 74 20 74 69 63 6b 65 static int ticke
11b0: 74 5f 72 65 62 75 69 6c 64 5f 61 74 5f 63 6f 6d t_rebuild_at_com
11c0: 6d 69 74 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d mit(void){. Stm
11d0: 74 20 71 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f t q;. db_multi_
11e0: 65 78 65 63 28 0a 20 20 20 20 22 44 45 4c 45 54 exec(. "DELET
11f0: 45 20 46 52 4f 4d 20 74 69 63 6b 65 74 20 57 48 E FROM ticket WH
1200: 45 52 45 20 74 6b 74 5f 75 75 69 64 20 49 4e 20 ERE tkt_uuid IN
1210: 5f 70 65 6e 64 69 6e 67 5f 74 69 63 6b 65 74 22 _pending_ticket"
1220: 0a 20 20 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 . );. db_prepa
1230: 72 65 28 26 71 2c 20 22 53 45 4c 45 43 54 20 75 re(&q, "SELECT u
1240: 75 69 64 20 46 52 4f 4d 20 5f 70 65 6e 64 69 6e uid FROM _pendin
1250: 67 5f 74 69 63 6b 65 74 22 29 3b 0a 20 20 77 68 g_ticket");. wh
1260: 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 ile( db_step(&q)
1270: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a ==SQLITE_ROW ){.
1280: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
1290: 7a 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d zUuid = db_colum
12a0: 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b 0a 20 n_text(&q, 0);.
12b0: 20 20 20 74 69 63 6b 65 74 5f 72 65 62 75 69 6c ticket_rebuil
12c0: 64 5f 65 6e 74 72 79 28 7a 55 75 69 64 29 3b 0a d_entry(zUuid);.
12d0: 20 20 7d 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 }. db_multi_e
12e0: 78 65 63 28 0a 20 20 20 20 22 44 45 4c 45 54 45 xec(. "DELETE
12f0: 20 46 52 4f 4d 20 5f 70 65 6e 64 69 6e 67 5f 74 FROM _pending_t
1300: 69 63 6b 65 74 22 0a 20 20 29 3b 0a 20 20 72 65 icket". );. re
1310: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a turn 0;.}../*.**
1320: 20 55 70 64 61 74 65 20 61 6e 20 65 6e 74 72 79 Update an entry
1330: 20 6f 66 20 74 68 65 20 54 49 43 4b 45 54 20 74 of the TICKET t
1340: 61 62 6c 65 20 61 63 63 6f 72 64 69 6e 67 20 74 able according t
1350: 6f 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f o the informatio
1360: 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6e 74 n.** in the cont
1370: 72 6f 6c 20 66 69 6c 65 20 67 69 76 65 6e 20 69 rol file given i
1380: 6e 20 70 2e 20 20 41 74 74 65 6d 70 74 20 74 6f n p. Attempt to
1390: 20 63 72 65 61 74 65 20 74 68 65 20 61 70 70 72 create the appr
13a0: 6f 70 72 69 61 74 65 0a 2a 2a 20 54 49 43 4b 45 opriate.** TICKE
13b0: 54 20 74 61 62 6c 65 20 65 6e 74 72 79 20 69 66 T table entry if
13c0: 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20 74 createFlag is t
13d0: 72 75 65 2e 20 20 49 66 20 63 72 65 61 74 65 46 rue. If createF
13e0: 6c 61 67 20 69 73 20 66 61 6c 73 65 2c 0a 2a 2a lag is false,.**
13f0: 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 that means we a
1400: 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74 68 65 20 lready know the
1410: 65 6e 74 72 79 20 65 78 69 73 74 73 20 61 6e 64 entry exists and
1420: 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 so we can save
1430: 74 68 65 0a 2a 2a 20 77 6f 72 6b 20 6f 66 20 74 the.** work of t
1440: 72 79 69 6e 67 20 74 6f 20 63 72 65 61 74 65 20 rying to create
1450: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 74 69 63 6b it..*/.void tick
1460: 65 74 5f 69 6e 73 65 72 74 28 4d 61 6e 69 66 65 et_insert(Manife
1470: 73 74 20 2a 70 2c 20 69 6e 74 20 63 72 65 61 74 st *p, int creat
1480: 65 46 6c 61 67 2c 20 69 6e 74 20 63 68 65 63 6b eFlag, int check
1490: 54 69 6d 65 29 7b 0a 20 20 42 6c 6f 62 20 73 71 Time){. Blob sq
14a0: 6c 3b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 l;. Stmt q;. i
14b0: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 nt i;. const ch
14c0: 61 72 20 2a 7a 53 65 70 3b 0a 0a 20 20 67 65 74 ar *zSep;.. get
14d0: 41 6c 6c 54 69 63 6b 65 74 46 69 65 6c 64 73 28 AllTicketFields(
14e0: 29 3b 0a 20 20 69 66 28 20 63 72 65 61 74 65 46 );. if( createF
14f0: 6c 61 67 20 29 7b 20 20 0a 20 20 20 20 64 62 5f lag ){ . db_
1500: 6d 75 6c 74 69 5f 65 78 65 63 28 22 49 4e 53 45 multi_exec("INSE
1510: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 RT OR IGNORE INT
1520: 4f 20 74 69 63 6b 65 74 28 74 6b 74 5f 75 75 69 O ticket(tkt_uui
1530: 64 2c 20 74 6b 74 5f 6d 74 69 6d 65 29 20 22 0a d, tkt_mtime) ".
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1550: 20 20 22 56 41 4c 55 45 53 28 25 51 2c 20 30 29 "VALUES(%Q, 0)
1560: 22 2c 20 70 2d 3e 7a 54 69 63 6b 65 74 55 75 69 ", p->zTicketUui
1570: 64 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 7a d);. }. blob_z
1580: 65 72 6f 28 26 73 71 6c 29 3b 0a 20 20 62 6c 6f ero(&sql);. blo
1590: 62 5f 61 70 70 65 6e 64 66 28 26 73 71 6c 2c 20 b_appendf(&sql,
15a0: 22 55 50 44 41 54 45 20 74 69 63 6b 65 74 20 53 "UPDATE ticket S
15b0: 45 54 20 74 6b 74 5f 6d 74 69 6d 65 3d 3a 6d 74 ET tkt_mtime=:mt
15c0: 69 6d 65 22 29 3b 0a 20 20 7a 53 65 70 20 3d 20 ime");. zSep =
15d0: 22 53 45 54 22 3b 0a 20 20 66 6f 72 28 69 3d 30 "SET";. for(i=0
15e0: 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 ; i<p->nField; i
15f0: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 ++){. const c
1600: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e har *zName = p->
1610: 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 3b aField[i].zName;
1620: 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 30 . if( zName[0
1630: 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 20 20 ]=='+' ){.
1640: 7a 4e 61 6d 65 2b 2b 3b 0a 20 20 20 20 20 20 69 zName++;. i
1650: 66 28 20 66 69 65 6c 64 49 64 28 7a 4e 61 6d 65 f( fieldId(zName
1660: 29 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a )<0 ) continue;.
1670: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e blob_appen
1680: 64 66 28 26 73 71 6c 2c 22 2c 20 25 73 3d 25 73 df(&sql,", %s=%s
1690: 20 7c 7c 20 25 51 22 2c 20 7a 4e 61 6d 65 2c 20 || %Q", zName,
16a0: 7a 4e 61 6d 65 2c 20 70 2d 3e 61 46 69 65 6c 64 zName, p->aField
16b0: 5b 69 5d 2e 7a 56 61 6c 75 65 29 3b 0a 20 20 20 [i].zValue);.
16c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 }else{. if
16d0: 28 20 66 69 65 6c 64 49 64 28 7a 4e 61 6d 65 29 ( fieldId(zName)
16e0: 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 <0 ) continue;.
16f0: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 blob_append
1700: 66 28 26 73 71 6c 2c 22 2c 20 25 73 3d 25 51 22 f(&sql,", %s=%Q"
1710: 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 61 46 69 65 , zName, p->aFie
1720: 6c 64 5b 69 5d 2e 7a 56 61 6c 75 65 29 3b 0a 20 ld[i].zValue);.
1730: 20 20 20 7d 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f }. }. blob_
1740: 61 70 70 65 6e 64 66 28 26 73 71 6c 2c 20 22 20 appendf(&sql, "
1750: 57 48 45 52 45 20 74 6b 74 5f 75 75 69 64 3d 27 WHERE tkt_uuid='
1760: 25 73 27 20 41 4e 44 20 74 6b 74 5f 6d 74 69 6d %s' AND tkt_mtim
1770: 65 3c 3a 6d 74 69 6d 65 22 2c 0a 20 20 20 20 20 e<:mtime",.
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1790: 70 2d 3e 7a 54 69 63 6b 65 74 55 75 69 64 29 3b p->zTicketUuid);
17a0: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 . db_prepare(&q
17b0: 2c 20 22 25 73 22 2c 20 62 6c 6f 62 5f 73 74 72 , "%s", blob_str
17c0: 28 26 73 71 6c 29 29 3b 0a 20 20 64 62 5f 62 69 (&sql));. db_bi
17d0: 6e 64 5f 64 6f 75 62 6c 65 28 26 71 2c 20 22 3a nd_double(&q, ":
17e0: 6d 74 69 6d 65 22 2c 20 70 2d 3e 72 44 61 74 65 mtime", p->rDate
17f0: 29 3b 0a 20 20 64 62 5f 73 74 65 70 28 26 71 29 );. db_step(&q)
1800: 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 ;. db_finalize(
1810: 26 71 29 3b 0a 20 20 69 66 28 20 63 68 65 63 6b &q);. if( check
1820: 54 69 6d 65 20 26 26 20 64 62 5f 63 68 61 6e 67 Time && db_chang
1830: 65 73 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 es()==0 ){. s
1840: 74 61 74 69 63 20 69 6e 74 20 69 73 49 6e 69 74 tatic int isInit
1850: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 69 = 0;. if( !i
1860: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 64 sInit ){. d
1870: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 43 52 b_multi_exec("CR
1880: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 EATE TEMP TABLE
1890: 5f 70 65 6e 64 69 6e 67 5f 74 69 63 6b 65 74 28 _pending_ticket(
18a0: 75 75 69 64 20 54 45 58 54 20 55 4e 49 51 55 45 uuid TEXT UNIQUE
18b0: 29 22 29 3b 0a 20 20 20 20 20 20 64 62 5f 63 6f )");. db_co
18c0: 6d 6d 69 74 5f 68 6f 6f 6b 28 74 69 63 6b 65 74 mmit_hook(ticket
18d0: 5f 72 65 62 75 69 6c 64 5f 61 74 5f 63 6f 6d 6d _rebuild_at_comm
18e0: 69 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 73 it, 1);. is
18f0: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a Init = 1;. }.
1900: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 db_multi_exe
1910: 63 28 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e c("INSERT OR IGN
1920: 4f 52 45 20 49 4e 54 4f 20 5f 70 65 6e 64 69 6e ORE INTO _pendin
1930: 67 5f 74 69 63 6b 65 74 20 22 0a 20 20 20 20 20 g_ticket ".
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 56 41 "VA
1950: 4c 55 45 53 28 25 51 29 22 2c 20 70 2d 3e 7a 54 LUES(%Q)", p->zT
1960: 69 63 6b 65 74 55 75 69 64 29 3b 0a 20 20 7d 0a icketUuid);. }.
1970: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 73 71 blob_reset(&sq
1980: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 62 l);.}../*.** Reb
1990: 75 69 6c 64 20 61 6e 20 65 6e 74 69 72 65 20 65 uild an entire e
19a0: 6e 74 72 79 20 69 6e 20 74 68 65 20 54 49 43 4b ntry in the TICK
19b0: 45 54 20 74 61 62 6c 65 0a 2a 2f 0a 76 6f 69 64 ET table.*/.void
19c0: 20 74 69 63 6b 65 74 5f 72 65 62 75 69 6c 64 5f ticket_rebuild_
19d0: 65 6e 74 72 79 28 63 6f 6e 73 74 20 63 68 61 72 entry(const char
19e0: 20 2a 7a 54 6b 74 55 75 69 64 29 7b 0a 20 20 63 *zTktUuid){. c
19f0: 68 61 72 20 2a 7a 54 61 67 20 3d 20 6d 70 72 69 har *zTag = mpri
1a00: 6e 74 66 28 22 74 6b 74 2d 25 73 22 2c 20 7a 54 ntf("tkt-%s", zT
1a10: 6b 74 55 75 69 64 29 3b 0a 20 20 69 6e 74 20 74 ktUuid);. int t
1a20: 61 67 69 64 20 3d 20 74 61 67 5f 66 69 6e 64 69 agid = tag_findi
1a30: 64 28 7a 54 61 67 2c 20 31 29 3b 0a 20 20 53 74 d(zTag, 1);. St
1a40: 6d 74 20 71 3b 0a 20 20 4d 61 6e 69 66 65 73 74 mt q;. Manifest
1a50: 20 6d 61 6e 69 66 65 73 74 3b 0a 20 20 42 6c 6f manifest;. Blo
1a60: 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 69 6e 74 b content;. int
1a70: 20 63 72 65 61 74 65 46 6c 61 67 20 3d 20 31 3b createFlag = 1;
1a80: 0a 20 20 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 . . db_multi_e
1a90: 78 65 63 28 0a 20 20 20 20 20 22 44 45 4c 45 54 xec(. "DELET
1aa0: 45 20 46 52 4f 4d 20 74 69 63 6b 65 74 20 57 48 E FROM ticket WH
1ab0: 45 52 45 20 74 6b 74 5f 75 75 69 64 3d 25 51 22 ERE tkt_uuid=%Q"
1ac0: 2c 20 7a 54 6b 74 55 75 69 64 0a 20 20 29 3b 0a , zTktUuid. );.
1ad0: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c db_prepare(&q,
1ae0: 20 22 53 45 4c 45 43 54 20 72 69 64 20 46 52 4f "SELECT rid FRO
1af0: 4d 20 74 61 67 78 72 65 66 20 57 48 45 52 45 20 M tagxref WHERE
1b00: 74 61 67 69 64 3d 25 64 20 4f 52 44 45 52 20 42 tagid=%d ORDER B
1b10: 59 20 6d 74 69 6d 65 22 2c 74 61 67 69 64 29 3b Y mtime",tagid);
1b20: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 . while( db_ste
1b30: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f p(&q)==SQLITE_RO
1b40: 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 69 64 W ){. int rid
1b50: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 = db_column_int
1b60: 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e (&q, 0);. con
1b70: 74 65 6e 74 5f 67 65 74 28 72 69 64 2c 20 26 63 tent_get(rid, &c
1b80: 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 6d 61 6e ontent);. man
1b90: 69 66 65 73 74 5f 70 61 72 73 65 28 26 6d 61 6e ifest_parse(&man
1ba0: 69 66 65 73 74 2c 20 26 63 6f 6e 74 65 6e 74 29 ifest, &content)
1bb0: 3b 0a 20 20 20 20 74 69 63 6b 65 74 5f 69 6e 73 ;. ticket_ins
1bc0: 65 72 74 28 26 6d 61 6e 69 66 65 73 74 2c 20 63 ert(&manifest, c
1bd0: 72 65 61 74 65 46 6c 61 67 2c 20 30 29 3b 0a 20 reateFlag, 0);.
1be0: 20 20 20 6d 61 6e 69 66 65 73 74 5f 63 6c 65 61 manifest_clea
1bf0: 72 28 26 6d 61 6e 69 66 65 73 74 29 3b 0a 20 20 r(&manifest);.
1c00: 20 20 63 72 65 61 74 65 46 6c 61 67 20 3d 20 30 createFlag = 0
1c10: 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c ;. }. db_final
1c20: 69 7a 65 28 26 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a ize(&q);.}../*.*
1c30: 2a 20 43 72 65 61 74 65 20 74 68 65 20 73 75 62 * Create the sub
1c40: 73 63 72 69 70 74 20 69 6e 74 65 72 70 72 65 74 script interpret
1c50: 65 72 20 61 6e 64 20 6c 6f 61 64 20 74 68 65 20 er and load the
1c60: 74 69 63 6b 65 74 20 63 6f 6e 66 69 67 75 72 61 ticket configura
1c70: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 74 69 tion..*/.void ti
1c80: 63 6b 65 74 5f 69 6e 69 74 28 76 6f 69 64 29 7b cket_init(void){
1c90: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 66 69 67 . char *zConfig
1ca0: 3b 0a 20 20 69 66 28 20 70 49 6e 74 65 72 70 20 ;. if( pInterp
1cb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 49 6e 74 ) return;. pInt
1cc0: 65 72 70 20 3d 20 53 62 53 5f 43 72 65 61 74 65 erp = SbS_Create
1cd0: 28 29 3b 0a 20 20 7a 43 6f 6e 66 69 67 20 3d 20 ();. zConfig =
1ce0: 64 62 5f 74 65 78 74 28 28 63 68 61 72 2a 29 7a db_text((char*)z
1cf0: 44 65 66 61 75 6c 74 54 69 63 6b 65 74 43 6f 6e DefaultTicketCon
1d00: 66 69 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 fig,.
1d10: 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20 "SELECT value
1d20: 46 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 FROM config WHER
1d30: 45 20 6e 61 6d 65 3d 27 74 69 63 6b 65 74 2d 63 E name='ticket-c
1d40: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 27 22 29 3b onfiguration'");
1d50: 0a 20 20 53 62 53 5f 45 76 61 6c 28 70 49 6e 74 . SbS_Eval(pInt
1d60: 65 72 70 2c 20 7a 43 6f 6e 66 69 67 2c 20 2d 31 erp, zConfig, -1
1d70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 72 );.}../*.** Recr
1d80: 65 61 74 65 20 74 68 65 20 74 69 63 6b 65 74 20 eate the ticket
1d90: 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 74 table..*/.void t
1da0: 69 63 6b 65 74 5f 63 72 65 61 74 65 5f 74 61 62 icket_create_tab
1db0: 6c 65 28 69 6e 74 20 73 65 70 61 72 61 74 65 43 le(int separateC
1dc0: 6f 6e 6e 65 63 74 69 6f 6e 29 7b 0a 20 20 63 68 onnection){. ch
1dd0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 ar *zSql;. int
1de0: 6e 53 71 6c 3b 0a 0a 20 20 64 62 5f 6d 75 6c 74 nSql;.. db_mult
1df0: 69 5f 65 78 65 63 28 22 44 52 4f 50 20 54 41 42 i_exec("DROP TAB
1e00: 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 69 63 LE IF EXISTS tic
1e10: 6b 65 74 3b 22 29 3b 0a 20 20 74 69 63 6b 65 74 ket;");. ticket
1e20: 5f 69 6e 69 74 28 29 3b 0a 20 20 7a 53 71 6c 20 _init();. zSql
1e30: 3d 20 28 63 68 61 72 2a 29 53 62 53 5f 46 65 74 = (char*)SbS_Fet
1e40: 63 68 28 70 49 6e 74 65 72 70 2c 20 22 74 69 63 ch(pInterp, "tic
1e50: 6b 65 74 5f 73 71 6c 22 2c 20 2d 31 2c 20 26 6e ket_sql", -1, &n
1e60: 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c Sql);. if( zSql
1e70: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 ==0 ){. fossi
1e80: 6c 5f 70 61 6e 69 63 28 22 6e 6f 20 74 69 63 6b l_panic("no tick
1e90: 65 74 5f 73 71 6c 20 64 65 66 69 6e 65 64 20 62 et_sql defined b
1ea0: 79 20 74 69 63 6b 65 74 20 63 6f 6e 66 69 67 75 y ticket configu
1eb0: 72 61 74 69 6f 6e 22 29 3b 0a 20 20 7d 0a 20 20 ration");. }.
1ec0: 69 66 28 20 73 65 70 61 72 61 74 65 43 6f 6e 6e if( separateConn
1ed0: 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 7a 53 ection ){. zS
1ee0: 71 6c 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 2e ql = mprintf("%.
1ef0: 2a 73 22 2c 20 6e 53 71 6c 2c 20 7a 53 71 6c 29 *s", nSql, zSql)
1f00: 3b 0a 20 20 20 20 64 62 5f 69 6e 69 74 5f 64 61 ;. db_init_da
1f10: 74 61 62 61 73 65 28 67 2e 7a 52 65 70 6f 73 69 tabase(g.zReposi
1f20: 74 6f 72 79 4e 61 6d 65 2c 20 7a 53 71 6c 2c 20 toryName, zSql,
1f30: 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 53 71 0);. free(zSq
1f40: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 l);. }else{.
1f50: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 db_multi_exec("
1f60: 25 2e 2a 73 22 2c 20 6e 53 71 6c 2c 20 7a 53 71 %.*s", nSql, zSq
1f70: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a l);. }.}../*.**
1f80: 20 52 65 70 6f 70 75 6c 61 74 65 20 74 68 65 20 Repopulate the
1f90: 74 69 63 6b 65 74 20 74 61 62 6c 65 0a 2a 2f 0a ticket table.*/.
1fa0: 76 6f 69 64 20 74 69 63 6b 65 74 5f 72 65 62 75 void ticket_rebu
1fb0: 69 6c 64 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d ild(void){. Stm
1fc0: 74 20 71 3b 0a 20 20 64 62 5f 62 65 67 69 6e 5f t q;. db_begin_
1fd0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 transaction();.
1fe0: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 22 db_prepare(&q,"
1ff0: 53 45 4c 45 43 54 20 74 61 67 6e 61 6d 65 20 46 SELECT tagname F
2000: 52 4f 4d 20 74 61 67 20 57 48 45 52 45 20 74 61 ROM tag WHERE ta
2010: 67 6e 61 6d 65 20 47 4c 4f 42 20 27 74 6b 74 2d gname GLOB 'tkt-
2020: 2a 27 22 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 *'");. while( d
2030: 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 b_step(&q)==SQLI
2040: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f TE_ROW ){. co
2050: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 nst char *zName
2060: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 = db_column_text
2070: 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74 (&q, 0);. int
2080: 20 6c 65 6e 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 len;. zName
2090: 2b 3d 20 34 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 += 4;. len =
20a0: 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 strlen(zName);.
20b0: 20 20 20 69 66 28 20 6c 65 6e 3c 32 30 20 7c 7c if( len<20 ||
20c0: 20 21 76 61 6c 69 64 61 74 65 31 36 28 7a 4e 61 !validate16(zNa
20d0: 6d 65 2c 20 6c 65 6e 29 20 29 20 63 6f 6e 74 69 me, len) ) conti
20e0: 6e 75 65 3b 0a 20 20 20 20 74 69 63 6b 65 74 5f nue;. ticket_
20f0: 72 65 62 75 69 6c 64 5f 65 6e 74 72 79 28 7a 4e rebuild_entry(zN
2100: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 ame);. }. db_f
2110: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 64 inalize(&q);. d
2120: 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f b_end_transactio
2130: 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 n(0);.}../*.** W
2140: 45 42 50 41 47 45 3a 20 74 6b 74 76 69 65 77 0a EBPAGE: tktview.
2150: 2a 2f 0a 76 6f 69 64 20 74 6b 74 76 69 65 77 5f */.void tktview_
2160: 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 63 68 page(void){. ch
2170: 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 69 ar *zScript;. i
2180: 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 6c 6f nt nScript;. lo
2190: 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e gin_check_creden
21a0: 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 tials();. if( !
21b0: 67 2e 6f 6b 52 64 54 6b 74 20 29 7b 20 6c 6f 67 g.okRdTkt ){ log
21c0: 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74 in_needed(); ret
21d0: 75 72 6e 3b 20 7d 0a 20 20 73 74 79 6c 65 5f 68 urn; }. style_h
21e0: 65 61 64 65 72 28 22 56 69 65 77 20 54 69 63 6b eader("View Tick
21f0: 65 74 22 29 3b 0a 20 20 74 69 63 6b 65 74 5f 69 et");. ticket_i
2200: 6e 69 74 28 29 3b 0a 20 20 69 6e 69 74 69 61 6c nit();. initial
2210: 69 7a 65 56 61 72 69 61 62 6c 65 73 46 72 6f 6d izeVariablesFrom
2220: 44 62 28 29 3b 0a 20 20 7a 53 63 72 69 70 74 20 Db();. zScript
2230: 3d 20 28 63 68 61 72 2a 29 53 62 53 5f 46 65 74 = (char*)SbS_Fet
2240: 63 68 28 70 49 6e 74 65 72 70 2c 20 22 74 6b 74 ch(pInterp, "tkt
2250: 76 69 65 77 5f 74 65 6d 70 6c 61 74 65 22 2c 20 view_template",
2260: 2d 31 2c 20 26 6e 53 63 72 69 70 74 29 3b 0a 20 -1, &nScript);.
2270: 20 7a 53 63 72 69 70 74 20 3d 20 6d 70 72 69 6e zScript = mprin
2280: 74 66 28 22 25 2e 2a 73 22 2c 20 6e 53 63 72 69 tf("%.*s", nScri
2290: 70 74 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 pt, zScript);.
22a0: 53 62 53 5f 52 65 6e 64 65 72 28 70 49 6e 74 65 SbS_Render(pInte
22b0: 72 70 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 rp, zScript);.
22c0: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a style_footer();.
22d0: 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 }..../*.** Subsc
22e0: 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 ript command:
22f0: 53 54 52 49 4e 47 20 46 49 45 4c 44 20 61 70 70 STRING FIELD app
2300: 65 6e 64 5f 66 69 65 6c 64 0a 2a 2a 0a 2a 2a 20 end_field.**.**
2310: 46 49 45 4c 44 20 69 73 20 74 68 65 20 6e 61 6d FIELD is the nam
2320: 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 e of a database
2330: 63 6f 6c 75 6d 6e 20 74 6f 20 77 68 69 63 68 20 column to which
2340: 77 65 20 6d 69 67 68 74 20 77 61 6e 74 0a 2a 2a we might want.**
2350: 20 74 6f 20 61 70 70 65 6e 64 20 74 65 78 74 2e to append text.
2360: 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65 20 STRING is the
2370: 74 65 78 74 20 74 6f 20 62 65 20 61 70 70 65 6e text to be appen
2380: 64 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 63 ded to that.** c
2390: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 61 70 70 65 olumn. The appe
23a0: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 nd does not actu
23b0: 61 6c 6c 79 20 6f 63 63 75 72 20 75 6e 74 69 6c ally occur until
23c0: 20 74 68 65 0a 2a 2a 20 73 75 62 6d 69 74 5f 74 the.** submit_t
23d0: 69 63 6b 65 74 5f 63 68 61 6e 67 65 20 76 65 72 icket_change ver
23e0: 62 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 b is run..*/.sta
23f0: 74 69 63 20 69 6e 74 20 61 70 70 65 6e 64 52 65 tic int appendRe
2400: 6d 61 72 6b 43 6d 64 28 73 74 72 75 63 74 20 53 markCmd(struct S
2410: 75 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f 69 ubscript *p, voi
2420: 64 20 2a 6e 6f 74 55 73 65 64 29 7b 0a 20 20 69 d *notUsed){. i
2430: 6e 74 20 69 64 78 3b 0a 20 20 63 6f 6e 73 74 20 nt idx;. const
2440: 63 68 61 72 20 2a 7a 46 69 65 6c 64 2c 20 2a 7a char *zField, *z
2450: 56 61 6c 75 65 3b 0a 20 20 69 6e 74 20 6e 46 69 Value;. int nFi
2460: 65 6c 64 2c 20 6e 56 61 6c 75 65 3b 0a 0a 20 20 eld, nValue;..
2470: 69 66 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 if( SbS_RequireS
2480: 74 61 63 6b 28 70 2c 20 32 2c 20 22 61 70 70 65 tack(p, 2, "appe
2490: 6e 64 5f 66 69 65 6c 64 22 29 20 29 20 72 65 74 nd_field") ) ret
24a0: 75 72 6e 20 31 3b 0a 20 20 7a 46 69 65 6c 64 20 urn 1;. zField
24b0: 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 = SbS_StackValue
24c0: 28 70 2c 20 30 2c 20 26 6e 46 69 65 6c 64 29 3b (p, 0, &nField);
24d0: 0a 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64 . for(idx=0; id
24e0: 78 3c 6e 46 69 65 6c 64 3b 20 69 64 78 2b 2b 29 x<nField; idx++)
24f0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d {. if( strncm
2500: 70 28 61 7a 46 69 65 6c 64 5b 69 64 78 5d 2c 20 p(azField[idx],
2510: 7a 46 69 65 6c 64 2c 20 6e 46 69 65 6c 64 29 3d zField, nField)=
2520: 3d 30 20 26 26 20 61 7a 46 69 65 6c 64 5b 69 64 =0 && azField[id
2530: 78 5d 5b 6e 46 69 65 6c 64 5d 3d 3d 30 20 29 7b x][nField]==0 ){
2540: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 . break;.
2550: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 64 }. }. if( id
2560: 78 3e 3d 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 x>=nField ){.
2570: 20 53 62 53 5f 53 65 74 45 72 72 6f 72 4d 65 73 SbS_SetErrorMes
2580: 73 61 67 65 28 70 2c 20 22 6e 6f 20 73 75 63 68 sage(p, "no such
2590: 20 54 49 43 4b 45 54 20 63 6f 6c 75 6d 6e 3a 20 TICKET column:
25a0: 25 2e 2a 73 22 2c 20 6e 46 69 65 6c 64 2c 20 7a %.*s", nField, z
25b0: 46 69 65 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 Field);. retu
25c0: 72 6e 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20 rn SBS_ERROR;.
25d0: 7d 0a 20 20 7a 56 61 6c 75 65 20 3d 20 53 62 53 }. zValue = SbS
25e0: 5f 53 74 61 63 6b 56 61 6c 75 65 28 70 2c 20 31 _StackValue(p, 1
25f0: 2c 20 26 6e 56 61 6c 75 65 29 3b 0a 20 20 61 7a , &nValue);. az
2600: 41 70 70 65 6e 64 5b 69 64 78 5d 20 3d 20 6d 70 Append[idx] = mp
2610: 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 6e 56 rintf("%.*s", nV
2620: 61 6c 75 65 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 alue, zValue);.
2630: 20 53 62 53 5f 50 6f 70 28 70 2c 20 32 29 3b 0a SbS_Pop(p, 2);.
2640: 20 20 72 65 74 75 72 6e 20 53 42 53 5f 4f 4b 3b return SBS_OK;
2650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63 72 .}../*.** Subscr
2660: 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20 73 ipt command: s
2670: 75 62 6d 69 74 5f 74 69 63 6b 65 74 0a 2a 2a 0a ubmit_ticket.**.
2680: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 6e 64 ** Construct and
2690: 20 73 75 62 6d 69 74 20 61 20 6e 65 77 20 74 69 submit a new ti
26a0: 63 6b 65 74 20 61 72 74 69 66 61 63 74 2e 0a 2a cket artifact..*
26b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 /.static int sub
26c0: 6d 69 74 54 69 63 6b 65 74 43 6d 64 28 73 74 72 mitTicketCmd(str
26d0: 75 63 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 uct Subscript *p
26e0: 2c 20 76 6f 69 64 20 2a 70 55 75 69 64 29 7b 0a , void *pUuid){.
26f0: 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 char *zDate;.
2700: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 const char *zUu
2710: 69 64 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 id;. int i;. i
2720: 6e 74 20 72 69 64 3b 0a 20 20 42 6c 6f 62 20 74 nt rid;. Blob t
2730: 6b 74 63 68 6e 67 2c 20 63 6b 73 75 6d 3b 0a 0a ktchng, cksum;..
2740: 20 20 7a 55 75 69 64 20 3d 20 28 63 6f 6e 73 74 zUuid = (const
2750: 20 63 68 61 72 20 2a 29 70 55 75 69 64 3b 0a 20 char *)pUuid;.
2760: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 74 6b 74 63 blob_zero(&tktc
2770: 68 6e 67 29 3b 0a 20 20 7a 44 61 74 65 20 3d 20 hng);. zDate =
2780: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 db_text(0, "SELE
2790: 43 54 20 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 CT datetime('now
27a0: 27 29 22 29 3b 0a 20 20 7a 44 61 74 65 5b 31 30 ')");. zDate[10
27b0: 5d 20 3d 20 27 54 27 3b 0a 20 20 62 6c 6f 62 5f ] = 'T';. blob_
27c0: 61 70 70 65 6e 64 66 28 26 74 6b 74 63 68 6e 67 appendf(&tktchng
27d0: 2c 20 22 44 20 25 73 5c 6e 22 2c 20 7a 44 61 74 , "D %s\n", zDat
27e0: 65 29 3b 0a 20 20 66 72 65 65 28 7a 44 61 74 65 e);. free(zDate
27f0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c );. for(i=0; i<
2800: 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 nField; i++){.
2810: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 const char *zV
2820: 61 6c 75 65 3b 0a 20 20 20 20 69 6e 74 20 6e 56 alue;. int nV
2830: 61 6c 75 65 3b 0a 20 20 20 20 69 66 28 20 61 7a alue;. if( az
2840: 41 70 70 65 6e 64 5b 69 5d 20 29 7b 0a 20 20 20 Append[i] ){.
2850: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 blob_appendf(
2860: 26 74 6b 74 63 68 6e 67 2c 20 22 4a 20 2b 25 73 &tktchng, "J +%s
2870: 20 25 7a 5c 6e 22 2c 20 61 7a 46 69 65 6c 64 5b %z\n", azField[
2880: 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 i],.
2890: 20 20 20 20 20 20 20 66 6f 73 73 69 6c 69 7a 65 fossilize
28a0: 28 61 7a 41 70 70 65 6e 64 5b 69 5d 2c 20 2d 31 (azAppend[i], -1
28b0: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ));. }else{.
28c0: 20 20 20 20 20 7a 56 61 6c 75 65 20 3d 20 53 62 zValue = Sb
28d0: 53 5f 46 65 74 63 68 28 70 2c 20 61 7a 46 69 65 S_Fetch(p, azFie
28e0: 6c 64 5b 69 5d 2c 20 2d 31 2c 20 26 6e 56 61 6c ld[i], -1, &nVal
28f0: 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a ue);. if( z
2900: 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 Value ){.
2910: 20 77 68 69 6c 65 28 20 6e 56 61 6c 75 65 3e 30 while( nValue>0
2920: 20 26 26 20 69 73 73 70 61 63 65 28 7a 56 61 6c && isspace(zVal
2930: 75 65 5b 6e 56 61 6c 75 65 2d 31 5d 29 20 29 7b ue[nValue-1]) ){
2940: 20 6e 56 61 6c 75 65 2d 2d 3b 20 7d 0a 20 20 20 nValue--; }.
2950: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 if( strncmp
2960: 28 7a 56 61 6c 75 65 2c 20 61 7a 56 61 6c 75 65 (zValue, azValue
2970: 5b 69 5d 2c 20 6e 56 61 6c 75 65 29 0a 20 20 20 [i], nValue).
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 ||
2990: 73 74 72 6c 65 6e 28 61 7a 56 61 6c 75 65 5b 69 strlen(azValue[i
29a0: 5d 29 21 3d 6e 56 61 6c 75 65 20 29 7b 0a 20 20 ])!=nValue ){.
29b0: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 blob_app
29c0: 65 6e 64 66 28 26 74 6b 74 63 68 6e 67 2c 20 22 endf(&tktchng, "
29d0: 4a 20 25 73 20 25 7a 5c 6e 22 2c 0a 20 20 20 20 J %s %z\n",.
29e0: 20 20 20 20 20 20 20 20 20 61 7a 46 69 65 6c 64 azField
29f0: 5b 69 5d 2c 20 66 6f 73 73 69 6c 69 7a 65 28 7a [i], fossilize(z
2a00: 56 61 6c 75 65 2c 6e 56 61 6c 75 65 29 29 3b 0a Value,nValue));.
2a10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
2a20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 }. }. }. if
2a30: 28 20 2a 28 63 68 61 72 2a 2a 29 70 55 75 69 64 ( *(char**)pUuid
2a40: 20 29 7b 0a 20 20 20 20 7a 55 75 69 64 20 3d 20 ){. zUuid =
2a50: 64 62 5f 74 65 78 74 28 30 2c 20 0a 20 20 20 20 db_text(0, .
2a60: 20 20 20 22 53 45 4c 45 43 54 20 74 6b 74 5f 75 "SELECT tkt_u
2a70: 75 69 64 20 46 52 4f 4d 20 74 69 63 6b 65 74 20 uid FROM ticket
2a80: 57 48 45 52 45 20 74 6b 74 5f 75 75 69 64 20 47 WHERE tkt_uuid G
2a90: 4c 4f 42 20 27 25 73 2a 27 22 2c 20 50 28 22 6e LOB '%s*'", P("n
2aa0: 61 6d 65 22 29 0a 20 20 20 20 29 3b 0a 20 20 7d ame"). );. }
2ab0: 65 6c 73 65 7b 0a 20 20 20 20 7a 55 75 69 64 20 else{. zUuid
2ac0: 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 = db_text(0, "SE
2ad0: 4c 45 43 54 20 6c 6f 77 65 72 28 68 65 78 28 72 LECT lower(hex(r
2ae0: 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 29 29 29 22 andomblob(20)))"
2af0: 29 3b 0a 20 20 7d 0a 20 20 2a 28 63 6f 6e 73 74 );. }. *(const
2b00: 20 63 68 61 72 2a 2a 29 70 55 75 69 64 20 3d 20 char**)pUuid =
2b10: 7a 55 75 69 64 3b 0a 20 20 62 6c 6f 62 5f 61 70 zUuid;. blob_ap
2b20: 70 65 6e 64 66 28 26 74 6b 74 63 68 6e 67 2c 20 pendf(&tktchng,
2b30: 22 4b 20 25 73 5c 6e 22 2c 20 7a 55 75 69 64 29 "K %s\n", zUuid)
2b40: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 ;. blob_appendf
2b50: 28 26 74 6b 74 63 68 6e 67 2c 20 22 55 20 25 46 (&tktchng, "U %F
2b60: 5c 6e 22 2c 20 67 2e 7a 4c 6f 67 69 6e 20 3f 20 \n", g.zLogin ?
2b70: 67 2e 7a 4c 6f 67 69 6e 20 3a 20 22 22 29 3b 0a g.zLogin : "");.
2b80: 20 20 6d 64 35 73 75 6d 5f 62 6c 6f 62 28 26 74 md5sum_blob(&t
2b90: 6b 74 63 68 6e 67 2c 20 26 63 6b 73 75 6d 29 3b ktchng, &cksum);
2ba0: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 . blob_appendf(
2bb0: 26 74 6b 74 63 68 6e 67 2c 20 22 5a 20 25 62 5c &tktchng, "Z %b\
2bc0: 6e 22 2c 20 26 63 6b 73 75 6d 29 3b 0a 0a 20 20 n", &cksum);..
2bd0: 69 66 28 20 73 74 72 6e 63 6d 70 28 67 2e 7a 50 if( strncmp(g.zP
2be0: 61 74 68 2c 22 64 65 62 75 67 5f 22 2c 36 29 3d ath,"debug_",6)=
2bf0: 3d 30 20 29 7b 0a 20 20 20 20 40 20 3c 68 72 3e =0 ){. @ <hr>
2c00: 3c 70 72 65 3e 0a 20 20 20 20 40 20 25 68 28 62 <pre>. @ %h(b
2c10: 6c 6f 62 5f 73 74 72 28 26 74 6b 74 63 68 6e 67 lob_str(&tktchng
2c20: 29 29 0a 20 20 20 20 40 20 3c 2f 70 72 65 3e 3c )). @ </pre><
2c30: 68 72 3e 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 hr>. blob_zer
2c40: 6f 28 26 74 6b 74 63 68 6e 67 29 3b 0a 20 20 20 o(&tktchng);.
2c50: 20 53 62 53 5f 50 6f 70 28 70 2c 20 31 29 3b 0a SbS_Pop(p, 1);.
2c60: 20 20 20 20 72 65 74 75 72 6e 20 53 42 53 5f 4f return SBS_O
2c70: 4b 3b 0a 20 20 7d 0a 0a 20 20 72 69 64 20 3d 20 K;. }.. rid =
2c80: 63 6f 6e 74 65 6e 74 5f 70 75 74 28 26 74 6b 74 content_put(&tkt
2c90: 63 68 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 69 chng, 0, 0);. i
2ca0: 66 28 20 72 69 64 3d 3d 30 20 29 7b 0a 20 20 20 f( rid==0 ){.
2cb0: 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 74 fossil_panic("t
2cc0: 72 6f 75 62 6c 65 20 63 6f 6d 6d 69 74 74 69 6e rouble committin
2cd0: 67 20 74 69 63 6b 65 74 3a 20 25 73 22 2c 20 67 g ticket: %s", g
2ce0: 2e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 .zErrMsg);. }.
2cf0: 20 6d 61 6e 69 66 65 73 74 5f 63 72 6f 73 73 6c manifest_crossl
2d00: 69 6e 6b 28 72 69 64 2c 20 26 74 6b 74 63 68 6e ink(rid, &tktchn
2d10: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 42 53 g);. return SBS
2d20: 5f 52 45 54 55 52 4e 3b 0a 7d 0a 0a 0a 2f 2a 0a _RETURN;.}.../*.
2d30: 2a 2a 20 57 45 42 50 41 47 45 3a 20 74 6b 74 6e ** WEBPAGE: tktn
2d40: 65 77 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 64 ew.** WEBPAGE: d
2d50: 65 62 75 67 5f 74 6b 74 6e 65 77 0a 2a 2f 0a 76 ebug_tktnew.*/.v
2d60: 6f 69 64 20 74 6b 74 6e 65 77 5f 70 61 67 65 28 oid tktnew_page(
2d70: 76 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a void){. char *z
2d80: 53 63 72 69 70 74 3b 0a 20 20 69 6e 74 20 6e 53 Script;. int nS
2d90: 63 72 69 70 74 3b 0a 20 20 63 68 61 72 20 2a 7a cript;. char *z
2da0: 4e 65 77 55 75 69 64 20 3d 20 30 3b 0a 0a 20 20 NewUuid = 0;..
2db0: 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 login_check_cred
2dc0: 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 entials();. if(
2dd0: 20 21 67 2e 6f 6b 4e 65 77 54 6b 74 20 29 7b 20 !g.okNewTkt ){
2de0: 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 login_needed();
2df0: 72 65 74 75 72 6e 3b 20 7d 0a 20 20 73 74 79 6c return; }. styl
2e00: 65 5f 68 65 61 64 65 72 28 22 4e 65 77 20 54 69 e_header("New Ti
2e10: 63 6b 65 74 22 29 3b 0a 20 20 74 69 63 6b 65 74 cket");. ticket
2e20: 5f 69 6e 69 74 28 29 3b 0a 20 20 67 65 74 41 6c _init();. getAl
2e30: 6c 54 69 63 6b 65 74 46 69 65 6c 64 73 28 29 3b lTicketFields();
2e40: 0a 20 20 69 6e 69 74 69 61 6c 69 7a 65 56 61 72 . initializeVar
2e50: 69 61 62 6c 65 73 46 72 6f 6d 43 47 49 28 29 3b iablesFromCGI();
2e60: 0a 20 20 40 20 3c 66 6f 72 6d 20 6d 65 74 68 6f . @ <form metho
2e70: 64 3d 22 50 4f 53 54 22 20 61 63 74 69 6f 6e 3d d="POST" action=
2e80: 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f "%s(g.zBaseURL)/
2e90: 25 73 28 67 2e 7a 50 61 74 68 29 22 3e 0a 20 20 %s(g.zPath)">.
2ea0: 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72 2a zScript = (char*
2eb0: 29 53 62 53 5f 46 65 74 63 68 28 70 49 6e 74 65 )SbS_Fetch(pInte
2ec0: 72 70 2c 20 22 74 6b 74 6e 65 77 5f 74 65 6d 70 rp, "tktnew_temp
2ed0: 6c 61 74 65 22 2c 20 2d 31 2c 20 26 6e 53 63 72 late", -1, &nScr
2ee0: 69 70 74 29 3b 0a 20 20 7a 53 63 72 69 70 74 20 ipt);. zScript
2ef0: 3d 20 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 22 = mprintf("%.*s"
2f00: 2c 20 6e 53 63 72 69 70 74 2c 20 7a 53 63 72 69 , nScript, zScri
2f10: 70 74 29 3b 0a 20 20 53 62 53 5f 53 74 6f 72 65 pt);. SbS_Store
2f20: 28 70 49 6e 74 65 72 70 2c 20 22 6c 6f 67 69 6e (pInterp, "login
2f30: 22 2c 20 67 2e 7a 4c 6f 67 69 6e 2c 20 30 29 3b ", g.zLogin, 0);
2f40: 0a 20 20 53 62 53 5f 53 74 6f 72 65 28 70 49 6e . SbS_Store(pIn
2f50: 74 65 72 70 2c 20 22 64 61 74 65 22 2c 20 64 62 terp, "date", db
2f60: 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 _text(0, "SELECT
2f70: 20 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 27 29 datetime('now')
2f80: 22 29 2c 20 32 29 3b 0a 20 20 53 62 53 5f 41 64 "), 2);. SbS_Ad
2f90: 64 56 65 72 62 28 70 49 6e 74 65 72 70 2c 20 22 dVerb(pInterp, "
2fa0: 73 75 62 6d 69 74 5f 74 69 63 6b 65 74 22 2c 20 submit_ticket",
2fb0: 73 75 62 6d 69 74 54 69 63 6b 65 74 43 6d 64 2c submitTicketCmd,
2fc0: 20 28 76 6f 69 64 2a 29 26 7a 4e 65 77 55 75 69 (void*)&zNewUui
2fd0: 64 29 3b 0a 20 20 69 66 28 20 53 62 53 5f 52 65 d);. if( SbS_Re
2fe0: 6e 64 65 72 28 70 49 6e 74 65 72 70 2c 20 7a 53 nder(pInterp, zS
2ff0: 63 72 69 70 74 29 3d 3d 53 42 53 5f 52 45 54 55 cript)==SBS_RETU
3000: 52 4e 20 26 26 20 7a 4e 65 77 55 75 69 64 20 29 RN && zNewUuid )
3010: 7b 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72 65 {. cgi_redire
3020: 63 74 28 6d 70 72 69 6e 74 66 28 22 25 73 2f 74 ct(mprintf("%s/t
3030: 6b 74 76 69 65 77 2f 25 73 22 2c 20 67 2e 7a 42 ktview/%s", g.zB
3040: 61 73 65 55 52 4c 2c 20 7a 4e 65 77 55 75 69 64 aseURL, zNewUuid
3050: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a ));. return;.
3060: 20 20 7d 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a }. @ </form>.
3070: 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 style_footer()
3080: 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 ;.}..../*.** WEB
3090: 50 41 47 45 3a 20 74 6b 74 65 64 69 74 0a 2a 2a PAGE: tktedit.**
30a0: 20 57 45 42 50 41 47 45 3a 20 64 65 62 75 67 5f WEBPAGE: debug_
30b0: 74 6b 74 65 64 69 74 0a 2a 2f 0a 76 6f 69 64 20 tktedit.*/.void
30c0: 74 6b 74 65 64 69 74 5f 70 61 67 65 28 76 6f 69 tktedit_page(voi
30d0: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 63 72 d){. char *zScr
30e0: 69 70 74 3b 0a 20 20 69 6e 74 20 6e 53 63 72 69 ipt;. int nScri
30f0: 70 74 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b pt;. int nName;
3100: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
3110: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 52 65 63 Name;. int nRec
3120: 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b ;.. login_check
3130: 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a _credentials();.
3140: 20 20 69 66 28 20 21 67 2e 6f 6b 41 70 6e 64 54 if( !g.okApndT
3150: 6b 74 20 26 26 20 21 67 2e 6f 6b 57 72 54 6b 74 kt && !g.okWrTkt
3160: 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 ){ login_needed
3170: 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 (); return; }.
3180: 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 45 64 style_header("Ed
3190: 69 74 20 54 69 63 6b 65 74 22 29 3b 0a 20 20 7a it Ticket");. z
31a0: 4e 61 6d 65 20 3d 20 50 28 22 6e 61 6d 65 22 29 Name = P("name")
31b0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 ;. if( zName==0
31c0: 20 7c 7c 20 28 6e 4e 61 6d 65 20 3d 20 73 74 72 || (nName = str
31d0: 6c 65 6e 28 7a 4e 61 6d 65 29 29 3c 34 20 7c 7c len(zName))<4 ||
31e0: 20 6e 4e 61 6d 65 3e 55 55 49 44 5f 53 49 5a 45 nName>UUID_SIZE
31f0: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 21 76 . || !v
3200: 61 6c 69 64 61 74 65 31 36 28 7a 4e 61 6d 65 2c alidate16(zName,
3210: 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 40 20 nName) ){. @
3220: 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 22 72 65 64 <font color="red
3230: 22 3e 3c 62 3e 4e 6f 74 20 61 20 76 61 6c 69 64 "><b>Not a valid
3240: 20 74 69 63 6b 65 74 20 69 64 3a 20 5c 22 25 68 ticket id: \"%h
3250: 28 7a 4e 61 6d 65 29 5c 22 3c 2f 62 3e 3c 2f 66 (zName)\"</b></f
3260: 6f 6e 74 3e 0a 20 20 20 20 73 74 79 6c 65 5f 66 ont>. style_f
3270: 6f 6f 74 65 72 28 29 3b 0a 20 20 20 20 72 65 74 ooter();. ret
3280: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 urn;. }. nRec
3290: 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c = db_int(0, "SEL
32a0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f ECT count(*) FRO
32b0: 4d 20 74 69 63 6b 65 74 20 57 48 45 52 45 20 74 M ticket WHERE t
32c0: 6b 74 5f 75 75 69 64 20 47 4c 4f 42 20 27 25 71 kt_uuid GLOB '%q
32d0: 2a 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 *'",.
32e0: 20 20 20 20 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 zName);. i
32f0: 66 28 20 6e 52 65 63 3d 3d 30 20 29 7b 0a 20 20 f( nRec==0 ){.
3300: 20 20 40 20 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d @ <font color=
3310: 22 72 65 64 22 3e 3c 62 3e 4e 6f 20 73 75 63 68 "red"><b>No such
3320: 20 74 69 63 6b 65 74 3a 20 5c 22 25 68 28 7a 4e ticket: \"%h(zN
3330: 61 6d 65 29 5c 22 3c 2f 62 3e 3c 2f 66 6f 6e 74 ame)\"</b></font
3340: 3e 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74 >. style_foot
3350: 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e er();. return
3360: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 63 ;. }. if( nRec
3370: 3e 31 20 29 7b 0a 20 20 20 20 40 20 3c 66 6f 6e >1 ){. @ <fon
3380: 74 20 63 6f 6c 6f 72 3d 22 72 65 64 22 3e 3c 62 t color="red"><b
3390: 3e 25 64 28 6e 52 65 63 29 20 74 69 63 6b 65 74 >%d(nRec) ticket
33a0: 73 20 62 65 67 69 6e 20 77 69 74 68 3a 20 5c 22 s begin with: \"
33b0: 25 68 28 7a 4e 61 6d 65 29 5c 22 3c 2f 62 3e 3c %h(zName)\"</b><
33c0: 2f 66 6f 6e 74 3e 0a 20 20 20 20 73 74 79 6c 65 /font>. style
33d0: 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20 20 20 72 _footer();. r
33e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 74 69 63 eturn;. }. tic
33f0: 6b 65 74 5f 69 6e 69 74 28 29 3b 0a 20 20 67 65 ket_init();. ge
3400: 74 41 6c 6c 54 69 63 6b 65 74 46 69 65 6c 64 73 tAllTicketFields
3410: 28 29 3b 0a 20 20 69 6e 69 74 69 61 6c 69 7a 65 ();. initialize
3420: 56 61 72 69 61 62 6c 65 73 46 72 6f 6d 43 47 49 VariablesFromCGI
3430: 28 29 3b 0a 20 20 69 6e 69 74 69 61 6c 69 7a 65 ();. initialize
3440: 56 61 72 69 61 62 6c 65 73 46 72 6f 6d 44 62 28 VariablesFromDb(
3450: 29 3b 0a 20 20 40 20 3c 66 6f 72 6d 20 6d 65 74 );. @ <form met
3460: 68 6f 64 3d 22 50 4f 53 54 22 20 61 63 74 69 6f hod="POST" actio
3470: 6e 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c n="%s(g.zBaseURL
3480: 29 2f 25 73 28 67 2e 7a 50 61 74 68 29 22 3e 0a )/%s(g.zPath)">.
3490: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d @ <input type=
34a0: 22 68 69 64 64 65 6e 22 20 6e 61 6d 65 3d 22 6e "hidden" name="n
34b0: 61 6d 65 22 20 76 61 6c 75 65 3d 22 25 73 28 7a ame" value="%s(z
34c0: 4e 61 6d 65 29 22 3e 0a 20 20 7a 53 63 72 69 70 Name)">. zScrip
34d0: 74 20 3d 20 28 63 68 61 72 2a 29 53 62 53 5f 46 t = (char*)SbS_F
34e0: 65 74 63 68 28 70 49 6e 74 65 72 70 2c 20 22 74 etch(pInterp, "t
34f0: 6b 74 65 64 69 74 5f 74 65 6d 70 6c 61 74 65 22 ktedit_template"
3500: 2c 20 2d 31 2c 20 26 6e 53 63 72 69 70 74 29 3b , -1, &nScript);
3510: 0a 20 20 7a 53 63 72 69 70 74 20 3d 20 6d 70 72 . zScript = mpr
3520: 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 6e 53 63 intf("%.*s", nSc
3530: 72 69 70 74 2c 20 7a 53 63 72 69 70 74 29 3b 0a ript, zScript);.
3540: 20 20 53 62 53 5f 53 74 6f 72 65 28 70 49 6e 74 SbS_Store(pInt
3550: 65 72 70 2c 20 22 6c 6f 67 69 6e 22 2c 20 67 2e erp, "login", g.
3560: 7a 4c 6f 67 69 6e 2c 20 30 29 3b 0a 20 20 53 62 zLogin, 0);. Sb
3570: 53 5f 53 74 6f 72 65 28 70 49 6e 74 65 72 70 2c S_Store(pInterp,
3580: 20 22 64 61 74 65 22 2c 20 64 62 5f 74 65 78 74 "date", db_text
3590: 28 30 2c 20 22 53 45 4c 45 43 54 20 64 61 74 65 (0, "SELECT date
35a0: 74 69 6d 65 28 27 6e 6f 77 27 29 22 29 2c 20 32 time('now')"), 2
35b0: 29 3b 0a 20 20 53 62 53 5f 41 64 64 56 65 72 62 );. SbS_AddVerb
35c0: 28 70 49 6e 74 65 72 70 2c 20 22 61 70 70 65 6e (pInterp, "appen
35d0: 64 5f 66 69 65 6c 64 22 2c 20 61 70 70 65 6e 64 d_field", append
35e0: 52 65 6d 61 72 6b 43 6d 64 2c 20 30 29 3b 0a 20 RemarkCmd, 0);.
35f0: 20 53 62 53 5f 41 64 64 56 65 72 62 28 70 49 6e SbS_AddVerb(pIn
3600: 74 65 72 70 2c 20 22 73 75 62 6d 69 74 5f 74 69 terp, "submit_ti
3610: 63 6b 65 74 22 2c 20 73 75 62 6d 69 74 54 69 63 cket", submitTic
3620: 6b 65 74 43 6d 64 2c 20 28 76 6f 69 64 2a 29 26 ketCmd, (void*)&
3630: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 53 62 zName);. if( Sb
3640: 53 5f 52 65 6e 64 65 72 28 70 49 6e 74 65 72 70 S_Render(pInterp
3650: 2c 20 7a 53 63 72 69 70 74 29 3d 3d 53 42 53 5f , zScript)==SBS_
3660: 52 45 54 55 52 4e 20 26 26 20 7a 4e 61 6d 65 20 RETURN && zName
3670: 29 7b 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72 ){. cgi_redir
3680: 65 63 74 28 6d 70 72 69 6e 74 66 28 22 25 73 2f ect(mprintf("%s/
3690: 74 6b 74 76 69 65 77 2f 25 73 22 2c 20 67 2e 7a tktview/%s", g.z
36a0: 42 61 73 65 55 52 4c 2c 20 7a 4e 61 6d 65 29 29 BaseURL, zName))
36b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 ;. return;.
36c0: 7d 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20 }. @ </form>.
36d0: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a style_footer();.
36e0: 7d 0a }.