Hex Artifact Content
Not logged in

Artifact c07694441f97bfb11a9e294b841248edbd0f8af4:

File src/tkt.c part of check-in [d913179b82] - Progress toward ticket editing. This is an incremental check-in. by drh on 2007-11-24 21:28:03.

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 2e 0a 2a 2f  sorted order..*/
06d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74  .static void get
06e0: 41 6c 6c 54 69 63 6b 65 74 46 69 65 6c 64 73 28  AllTicketFields(
06f0: 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 71 3b  void){.  Stmt q;
0700: 0a 20 20 69 66 28 20 6e 46 69 65 6c 64 3e 30 20  .  if( nField>0 
0710: 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 5f 70  ) return;.  db_p
0720: 72 65 70 61 72 65 28 26 71 2c 20 22 50 52 41 47  repare(&q, "PRAG
0730: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 74 69  MA table_info(ti
0740: 63 6b 65 74 29 22 29 3b 0a 20 20 77 68 69 6c 65  cket)");.  while
0750: 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53  ( db_step(&q)==S
0760: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
0770: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
0780: 65 6c 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  eld = db_column_
0790: 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 20 20  text(&q, 1);.   
07a0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 46 69   if( strncmp(zFi
07b0: 65 6c 64 2c 22 74 6b 74 5f 22 2c 34 29 3d 3d 30  eld,"tkt_",4)==0
07c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
07d0: 20 69 66 28 20 6e 46 69 65 6c 64 25 31 30 3d 3d   if( nField%10==
07e0: 30 20 29 7b 0a 20 20 20 20 20 20 61 7a 46 69 65  0 ){.      azFie
07f0: 6c 64 20 3d 20 72 65 61 6c 6c 6f 63 28 61 7a 46  ld = realloc(azF
0800: 69 65 6c 64 2c 20 73 69 7a 65 6f 66 28 61 7a 46  ield, sizeof(azF
0810: 69 65 6c 64 29 2a 33 2a 28 6e 46 69 65 6c 64 2b  ield)*3*(nField+
0820: 31 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  10) );.      if(
0830: 20 61 7a 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20   azField==0 ){. 
0840: 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61         fossil_fa
0850: 74 61 6c 28 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  tal("out of memo
0860: 72 79 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ry");.      }.  
0870: 20 20 7d 0a 20 20 20 20 61 7a 46 69 65 6c 64 5b    }.    azField[
0880: 6e 46 69 65 6c 64 5d 20 3d 20 6d 70 72 69 6e 74  nField] = mprint
0890: 66 28 22 25 73 22 2c 20 7a 46 69 65 6c 64 29 3b  f("%s", zField);
08a0: 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20  .    nField++;. 
08b0: 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65   }.  db_finalize
08c0: 28 26 71 29 3b 0a 20 20 71 73 6f 72 74 28 61 7a  (&q);.  qsort(az
08d0: 46 69 65 6c 64 2c 20 6e 46 69 65 6c 64 2c 20 73  Field, nField, s
08e0: 69 7a 65 6f 66 28 61 7a 46 69 65 6c 64 5b 30 5d  izeof(azField[0]
08f0: 29 2c 20 6e 61 6d 65 43 6d 70 72 29 3b 0a 20 20  ), nameCmpr);.  
0900: 61 7a 41 70 70 65 6e 64 20 3d 20 26 61 7a 46 69  azAppend = &azFi
0910: 65 6c 64 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 6d  eld[nField];.  m
0920: 65 6d 73 65 74 28 61 7a 41 70 70 65 6e 64 2c 20  emset(azAppend, 
0930: 30 2c 20 73 69 7a 65 6f 66 28 61 7a 41 70 70 65  0, sizeof(azAppe
0940: 6e 64 5b 30 5d 29 2a 6e 46 69 65 6c 64 2a 32 29  nd[0])*nField*2)
0950: 3b 0a 20 20 61 7a 56 61 6c 75 65 20 3d 20 26 61  ;.  azValue = &a
0960: 7a 41 70 70 65 6e 64 5b 6e 46 69 65 6c 64 5d 3b  zAppend[nField];
0970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0980: 20 74 72 75 65 20 69 66 20 7a 46 69 65 6c 64 20   true if zField 
0990: 69 73 20 61 20 66 69 65 6c 64 20 77 69 74 68 69  is a field withi
09a0: 6e 20 74 68 65 20 54 49 43 4b 45 54 20 74 61 62  n the TICKET tab
09b0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
09c0: 74 20 69 73 54 69 63 6b 65 74 46 69 65 6c 64 28  t isTicketField(
09d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 65  const char *zFie
09e0: 6c 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ld){.  int i;.  
09f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c  for(i=0; i<nFiel
0a00: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
0a10: 20 73 74 72 63 6d 70 28 61 7a 46 69 65 6c 64 5b   strcmp(azField[
0a20: 69 5d 2c 20 7a 46 69 65 6c 64 29 3d 3d 30 20 29  i], zField)==0 )
0a30: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
0a40: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
0a50: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 64 61  .** Query the da
0a60: 74 61 62 61 73 65 20 66 6f 72 20 61 6c 6c 20 54  tabase for all T
0a70: 49 43 4b 45 54 20 66 69 65 6c 64 73 20 66 6f 72  ICKET fields for
0a80: 20 74 68 65 20 73 70 65 63 69 66 69 63 0a 2a 2a   the specific.**
0a90: 20 74 69 63 6b 65 74 20 77 68 6f 73 65 20 6e 61   ticket whose na
0aa0: 6d 65 20 69 73 20 67 69 76 65 6e 20 62 79 20 74  me is given by t
0ab0: 68 65 20 22 6e 61 6d 65 22 20 43 47 49 20 70 61  he "name" CGI pa
0ac0: 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 4c 6f 61 64  rameter..** Load
0ad0: 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   the values for 
0ae0: 61 6c 6c 20 66 69 65 6c 64 73 20 69 6e 74 6f 20  all fields into 
0af0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
0b00: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6c 6f 61 64  .**.** Only load
0b10: 20 74 68 6f 73 65 20 66 69 65 6c 64 73 20 77 68   those fields wh
0b20: 69 63 68 20 64 6f 20 6e 6f 74 20 61 6c 72 65 61  ich do not alrea
0b30: 64 79 20 65 78 69 73 74 20 61 73 0a 2a 2a 20 76  dy exist as.** v
0b40: 61 72 69 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  ariables..*/.sta
0b50: 74 69 63 20 76 6f 69 64 20 69 6e 69 74 69 61 6c  tic void initial
0b60: 69 7a 65 56 61 72 69 61 62 6c 65 73 46 72 6f 6d  izeVariablesFrom
0b70: 44 62 28 76 6f 69 64 29 7b 0a 20 20 63 6f 6e 73  Db(void){.  cons
0b80: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
0b90: 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e 74 20 69   Stmt q;.  int i
0ba0: 2c 20 6e 2c 20 73 69 7a 65 2c 20 6a 3b 0a 0a 20  , n, size, j;.. 
0bb0: 20 7a 4e 61 6d 65 20 3d 20 50 44 28 22 6e 61 6d   zName = PD("nam
0bc0: 65 22 2c 22 22 29 3b 0a 20 20 64 62 5f 70 72 65  e","");.  db_pre
0bd0: 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43 54  pare(&q, "SELECT
0be0: 20 2a 20 46 52 4f 4d 20 74 69 63 6b 65 74 20 57   * FROM ticket W
0bf0: 48 45 52 45 20 74 6b 74 5f 75 75 69 64 20 47 4c  HERE tkt_uuid GL
0c00: 4f 42 20 27 25 71 2a 27 22 2c 20 7a 4e 61 6d 65  OB '%q*'", zName
0c10: 29 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70  );.  if( db_step
0c20: 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  (&q)==SQLITE_ROW
0c30: 20 29 7b 0a 20 20 20 20 6e 20 3d 20 64 62 5f 63   ){.    n = db_c
0c40: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 26 71 29 3b  olumn_count(&q);
0c50: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
0c60: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  n; i++){.      c
0c70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 20  onst char *zVal 
0c80: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
0c90: 28 26 71 2c 20 69 29 3b 0a 20 20 20 20 20 20 63  (&q, i);.      c
0ca0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
0cb0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d   = db_column_nam
0cc0: 65 28 26 71 2c 20 69 29 3b 0a 20 20 20 20 20 20  e(&q, i);.      
0cd0: 69 66 28 20 7a 56 61 6c 3d 3d 30 20 29 20 7a 56  if( zVal==0 ) zV
0ce0: 61 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 66  al = "";.      f
0cf0: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 46 69 65 6c 64  or(j=0; j<nField
0d00: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
0d10: 69 66 28 20 73 74 72 63 6d 70 28 61 7a 46 69 65  if( strcmp(azFie
0d20: 6c 64 5b 6a 5d 2c 7a 4e 61 6d 65 29 3d 3d 30 20  ld[j],zName)==0 
0d30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 7a 56  ){.          azV
0d40: 61 6c 75 65 5b 6a 5d 20 3d 20 6d 70 72 69 6e 74  alue[j] = mprint
0d50: 66 28 22 25 73 22 2c 20 7a 56 61 6c 29 3b 0a 20  f("%s", zVal);. 
0d60: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
0d70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0d80: 7d 0a 20 20 20 20 20 20 69 66 28 20 53 62 53 5f  }.      if( SbS_
0d90: 46 65 74 63 68 28 70 49 6e 74 65 72 70 2c 20 7a  Fetch(pInterp, z
0da0: 4e 61 6d 65 2c 20 2d 31 2c 20 26 73 69 7a 65 29  Name, -1, &size)
0db0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53  ==0 ){.        S
0dc0: 62 53 5f 53 74 6f 72 65 28 70 49 6e 74 65 72 70  bS_Store(pInterp
0dd0: 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  , db_column_name
0de0: 28 26 71 2c 69 29 2c 20 7a 56 61 6c 2c 20 31 29  (&q,i), zVal, 1)
0df0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
0e00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 5f    }else{.    db_
0e10: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
0e20: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
0e30: 20 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f 69   "PRAGMA table_i
0e40: 6e 66 6f 28 74 69 63 6b 65 74 29 22 29 3b 0a 20  nfo(ticket)");. 
0e50: 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65     while( db_ste
0e60: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
0e70: 57 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  W ){.      const
0e80: 20 63 68 61 72 20 2a 7a 46 69 65 6c 64 20 3d 20   char *zField = 
0e90: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
0ea0: 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  q, 1);.      if(
0eb0: 20 53 62 53 5f 46 65 74 63 68 28 70 49 6e 74 65   SbS_Fetch(pInte
0ec0: 72 70 2c 20 7a 46 69 65 6c 64 2c 20 2d 31 2c 20  rp, zField, -1, 
0ed0: 26 73 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  &size)==0 ){.   
0ee0: 20 20 20 20 20 53 62 53 5f 53 74 6f 72 65 28 70       SbS_Store(p
0ef0: 49 6e 74 65 72 70 2c 20 7a 46 69 65 6c 64 2c 20  Interp, zField, 
0f00: 22 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  "", 0);.      }.
0f10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 5f 66      }.  }.  db_f
0f20: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 7d 0a 0a  inalize(&q);.}..
0f30: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 61  /*.** Transfer a
0f40: 6c 6c 20 43 47 49 20 70 61 72 61 6d 65 74 65 72  ll CGI parameter
0f50: 73 20 74 6f 20 76 61 72 69 61 62 6c 65 73 20 69  s to variables i
0f60: 6e 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  n the interprete
0f70: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
0f80: 64 20 69 6e 69 74 69 61 6c 69 7a 65 56 61 72 69  d initializeVari
0f90: 61 62 6c 65 73 46 72 6f 6d 43 47 49 28 76 6f 69  ablesFromCGI(voi
0fa0: 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  d){.  int i;.  c
0fb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  onst char *z;.. 
0fc0: 20 66 6f 72 28 69 3d 30 3b 20 28 7a 20 3d 20 63   for(i=0; (z = c
0fd0: 67 69 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  gi_parameter_nam
0fe0: 65 28 69 29 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  e(i))!=0; i++){.
0ff0: 20 20 20 20 53 62 53 5f 53 74 6f 72 65 28 70 49      SbS_Store(pI
1000: 6e 74 65 72 70 2c 20 7a 2c 20 50 28 7a 29 2c 20  nterp, z, P(z), 
1010: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
1020: 20 52 65 62 75 69 6c 64 20 61 6c 6c 20 74 69 63   Rebuild all tic
1030: 6b 65 74 73 20 6e 61 6d 65 64 20 69 6e 20 74 68  kets named in th
1040: 65 20 5f 70 65 6e 64 69 6e 67 5f 74 69 63 6b 65  e _pending_ticke
1050: 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  t table..**.** T
1060: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1070: 61 6c 6c 65 64 20 6a 75 73 74 20 70 72 69 6f 72  alled just prior
1080: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 66 74 65 72   to commit after
1090: 20 6e 65 77 0a 2a 2a 20 6f 75 74 2d 6f 66 2d 73   new.** out-of-s
10a0: 65 71 75 65 6e 63 65 20 74 69 63 6b 65 74 20 63  equence ticket c
10b0: 68 61 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e  hanges have been
10c0: 20 61 64 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   added..*/.stati
10d0: 63 20 69 6e 74 20 74 69 63 6b 65 74 5f 72 65 62  c int ticket_reb
10e0: 75 69 6c 64 5f 61 74 5f 63 6f 6d 6d 69 74 28 76  uild_at_commit(v
10f0: 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a  oid){.  Stmt q;.
1100: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
1110: 0a 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f  .    "DELETE FRO
1120: 4d 20 74 69 63 6b 65 74 20 57 48 45 52 45 20 74  M ticket WHERE t
1130: 6b 74 5f 75 75 69 64 20 49 4e 20 5f 70 65 6e 64  kt_uuid IN _pend
1140: 69 6e 67 5f 74 69 63 6b 65 74 22 0a 20 20 29 3b  ing_ticket".  );
1150: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71  .  db_prepare(&q
1160: 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46  , "SELECT uuid F
1170: 52 4f 4d 20 5f 70 65 6e 64 69 6e 67 5f 74 69 63  ROM _pending_tic
1180: 6b 65 74 22 29 3b 0a 20 20 77 68 69 6c 65 28 20  ket");.  while( 
1190: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c  db_step(&q)==SQL
11a0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
11b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64  onst char *zUuid
11c0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
11d0: 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 74 69  t(&q, 0);.    ti
11e0: 63 6b 65 74 5f 72 65 62 75 69 6c 64 5f 65 6e 74  cket_rebuild_ent
11f0: 72 79 28 7a 55 75 69 64 29 3b 0a 20 20 7d 0a 20  ry(zUuid);.  }. 
1200: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a   db_multi_exec(.
1210: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
1220: 20 5f 70 65 6e 64 69 6e 67 5f 74 69 63 6b 65 74   _pending_ticket
1230: 22 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ".  );.  return 
1240: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61  0;.}../*.** Upda
1250: 74 65 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  te an entry of t
1260: 68 65 20 54 49 43 4b 45 54 20 74 61 62 6c 65 20  he TICKET table 
1270: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
1280: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1290: 69 6e 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 66  in the control f
12a0: 69 6c 65 20 67 69 76 65 6e 20 69 6e 20 70 2e 20  ile given in p. 
12b0: 20 41 74 74 65 6d 70 74 20 74 6f 20 63 72 65 61   Attempt to crea
12c0: 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  te the appropria
12d0: 74 65 0a 2a 2a 20 54 49 43 4b 45 54 20 74 61 62  te.** TICKET tab
12e0: 6c 65 20 65 6e 74 72 79 20 69 66 20 63 72 65 61  le entry if crea
12f0: 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 20  teFlag is true. 
1300: 20 49 66 20 63 72 65 61 74 65 46 6c 61 67 20 69   If createFlag i
1310: 73 20 66 61 6c 73 65 2c 0a 2a 2a 20 74 68 61 74  s false,.** that
1320: 20 6d 65 61 6e 73 20 77 65 20 61 6c 72 65 61 64   means we alread
1330: 79 20 6b 6e 6f 77 20 74 68 65 20 65 6e 74 72 79  y know the entry
1340: 20 65 78 69 73 74 73 20 61 6e 64 20 73 6f 20 77   exists and so w
1350: 65 20 63 61 6e 20 73 61 76 65 20 74 68 65 0a 2a  e can save the.*
1360: 2a 20 77 6f 72 6b 20 6f 66 20 74 72 79 69 6e 67  * work of trying
1370: 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 0a 2a   to create it..*
1380: 2f 0a 76 6f 69 64 20 74 69 63 6b 65 74 5f 69 6e  /.void ticket_in
1390: 73 65 72 74 28 4d 61 6e 69 66 65 73 74 20 2a 70  sert(Manifest *p
13a0: 2c 20 69 6e 74 20 63 72 65 61 74 65 46 6c 61 67  , int createFlag
13b0: 2c 20 69 6e 74 20 63 68 65 63 6b 54 69 6d 65 29  , int checkTime)
13c0: 7b 0a 20 20 42 6c 6f 62 20 73 71 6c 3b 0a 20 20  {.  Blob sql;.  
13d0: 53 74 6d 74 20 71 3b 0a 20 20 69 6e 74 20 69 3b  Stmt q;.  int i;
13e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13f0: 53 65 70 3b 0a 0a 20 20 67 65 74 41 6c 6c 54 69  Sep;..  getAllTi
1400: 63 6b 65 74 46 69 65 6c 64 73 28 29 3b 0a 20 20  cketFields();.  
1410: 69 66 28 20 63 72 65 61 74 65 46 6c 61 67 20 29  if( createFlag )
1420: 7b 20 20 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69  {  .    db_multi
1430: 5f 65 78 65 63 28 22 49 4e 53 45 52 54 20 4f 52  _exec("INSERT OR
1440: 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 69 63   IGNORE INTO tic
1450: 6b 65 74 28 74 6b 74 5f 75 75 69 64 2c 20 74 6b  ket(tkt_uuid, tk
1460: 74 5f 6d 74 69 6d 65 29 20 22 0a 20 20 20 20 20  t_mtime) ".     
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 56 41               "VA
1480: 4c 55 45 53 28 25 51 2c 20 30 29 22 2c 20 70 2d  LUES(%Q, 0)", p-
1490: 3e 7a 54 69 63 6b 65 74 55 75 69 64 29 3b 0a 20  >zTicketUuid);. 
14a0: 20 7d 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26   }.  blob_zero(&
14b0: 73 71 6c 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70  sql);.  blob_app
14c0: 65 6e 64 66 28 26 73 71 6c 2c 20 22 55 50 44 41  endf(&sql, "UPDA
14d0: 54 45 20 74 69 63 6b 65 74 20 53 45 54 20 74 6b  TE ticket SET tk
14e0: 74 5f 6d 74 69 6d 65 3d 3a 6d 74 69 6d 65 22 29  t_mtime=:mtime")
14f0: 3b 0a 20 20 7a 53 65 70 20 3d 20 22 53 45 54 22  ;.  zSep = "SET"
1500: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1510: 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a  ->nField; i++){.
1520: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1530: 7a 4e 61 6d 65 20 3d 20 70 2d 3e 61 46 69 65 6c  zName = p->aFiel
1540: 64 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  d[i].zName;.    
1550: 69 66 28 20 7a 4e 61 6d 65 5b 30 5d 3d 3d 27 2b  if( zName[0]=='+
1560: 27 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65  ' ){.      zName
1570: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69  ++;.      if( !i
1580: 73 54 69 63 6b 65 74 46 69 65 6c 64 28 7a 4e 61  sTicketField(zNa
1590: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
15a0: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
15b0: 64 66 28 26 73 71 6c 2c 22 2c 20 25 73 3d 25 73  df(&sql,", %s=%s
15c0: 20 7c 7c 20 25 51 22 2c 20 7a 4e 61 6d 65 2c 20   || %Q", zName, 
15d0: 7a 4e 61 6d 65 2c 20 70 2d 3e 61 46 69 65 6c 64  zName, p->aField
15e0: 5b 69 5d 2e 7a 56 61 6c 75 65 29 3b 0a 20 20 20  [i].zValue);.   
15f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
1600: 28 20 21 69 73 54 69 63 6b 65 74 46 69 65 6c 64  ( !isTicketField
1610: 28 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e  (zName) ) contin
1620: 75 65 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61  ue;.      blob_a
1630: 70 70 65 6e 64 66 28 26 73 71 6c 2c 22 2c 20 25  ppendf(&sql,", %
1640: 73 3d 25 51 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d  s=%Q", zName, p-
1650: 3e 61 46 69 65 6c 64 5b 69 5d 2e 7a 56 61 6c 75  >aField[i].zValu
1660: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
1670: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 71  blob_appendf(&sq
1680: 6c 2c 20 22 20 57 48 45 52 45 20 74 6b 74 5f 75  l, " WHERE tkt_u
1690: 75 69 64 3d 27 25 73 27 20 41 4e 44 20 74 6b 74  uid='%s' AND tkt
16a0: 5f 6d 74 69 6d 65 3c 3a 6d 74 69 6d 65 22 2c 0a  _mtime<:mtime",.
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 70 2d 3e 7a 54 69 63 6b 65 74 55       p->zTicketU
16d0: 75 69 64 29 3b 0a 20 20 64 62 5f 70 72 65 70 61  uid);.  db_prepa
16e0: 72 65 28 26 71 2c 20 22 25 73 22 2c 20 62 6c 6f  re(&q, "%s", blo
16f0: 62 5f 73 74 72 28 26 73 71 6c 29 29 3b 0a 20 20  b_str(&sql));.  
1700: 64 62 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 26  db_bind_double(&
1710: 71 2c 20 22 3a 6d 74 69 6d 65 22 2c 20 70 2d 3e  q, ":mtime", p->
1720: 72 44 61 74 65 29 3b 0a 20 20 64 62 5f 73 74 65  rDate);.  db_ste
1730: 70 28 26 71 29 3b 0a 20 20 64 62 5f 66 69 6e 61  p(&q);.  db_fina
1740: 6c 69 7a 65 28 26 71 29 3b 0a 20 20 69 66 28 20  lize(&q);.  if( 
1750: 63 68 65 63 6b 54 69 6d 65 20 26 26 20 64 62 5f  checkTime && db_
1760: 63 68 61 6e 67 65 73 28 29 3d 3d 30 20 29 7b 0a  changes()==0 ){.
1770: 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69      static int i
1780: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
1790: 66 28 20 21 69 73 49 6e 69 74 20 29 7b 0a 20 20  f( !isInit ){.  
17a0: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
17b0: 63 28 22 43 52 45 41 54 45 20 54 45 4d 50 20 54  c("CREATE TEMP T
17c0: 41 42 4c 45 20 5f 70 65 6e 64 69 6e 67 5f 74 69  ABLE _pending_ti
17d0: 63 6b 65 74 28 75 75 69 64 20 54 45 58 54 20 55  cket(uuid TEXT U
17e0: 4e 49 51 55 45 29 22 29 3b 0a 20 20 20 20 20 20  NIQUE)");.      
17f0: 64 62 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 74  db_commit_hook(t
1800: 69 63 6b 65 74 5f 72 65 62 75 69 6c 64 5f 61 74  icket_rebuild_at
1810: 5f 63 6f 6d 6d 69 74 2c 20 31 29 3b 0a 20 20 20  _commit, 1);.   
1820: 20 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20     isInit = 1;. 
1830: 20 20 20 7d 0a 20 20 20 20 64 62 5f 6d 75 6c 74     }.    db_mult
1840: 69 5f 65 78 65 63 28 22 49 4e 53 45 52 54 20 4f  i_exec("INSERT O
1850: 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 5f 70  R IGNORE INTO _p
1860: 65 6e 64 69 6e 67 5f 74 69 63 6b 65 74 22 0a 20  ending_ticket". 
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 22 56 41 4c 55 45 53 28 25 51 29 22 2c 20 70   "VALUES(%Q)", p
1890: 2d 3e 7a 54 69 63 6b 65 74 55 75 69 64 29 3b 0a  ->zTicketUuid);.
18a0: 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74    }.  blob_reset
18b0: 28 26 73 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (&sql);.}../*.**
18c0: 20 52 65 62 75 69 6c 64 20 61 6e 20 65 6e 74 69   Rebuild an enti
18d0: 72 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  re entry in the 
18e0: 54 49 43 4b 45 54 20 74 61 62 6c 65 0a 2a 2f 0a  TICKET table.*/.
18f0: 76 6f 69 64 20 74 69 63 6b 65 74 5f 72 65 62 75  void ticket_rebu
1900: 69 6c 64 5f 65 6e 74 72 79 28 63 6f 6e 73 74 20  ild_entry(const 
1910: 63 68 61 72 20 2a 7a 54 6b 74 55 75 69 64 29 7b  char *zTktUuid){
1920: 0a 20 20 63 68 61 72 20 2a 7a 54 61 67 20 3d 20  .  char *zTag = 
1930: 6d 70 72 69 6e 74 66 28 22 74 6b 74 2d 25 73 22  mprintf("tkt-%s"
1940: 2c 20 7a 54 6b 74 55 75 69 64 29 3b 0a 20 20 69  , zTktUuid);.  i
1950: 6e 74 20 74 61 67 69 64 20 3d 20 74 61 67 5f 66  nt tagid = tag_f
1960: 69 6e 64 69 64 28 7a 54 61 67 2c 20 31 29 3b 0a  indid(zTag, 1);.
1970: 20 20 53 74 6d 74 20 71 3b 0a 20 20 4d 61 6e 69    Stmt q;.  Mani
1980: 66 65 73 74 20 6d 61 6e 69 66 65 73 74 3b 0a 20  fest manifest;. 
1990: 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20   Blob content;. 
19a0: 20 69 6e 74 20 63 72 65 61 74 65 46 6c 61 67 20   int createFlag 
19b0: 3d 20 31 3b 0a 20 20 0a 20 20 64 62 5f 6d 75 6c  = 1;.  .  db_mul
19c0: 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 22 44  ti_exec(.     "D
19d0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 69 63 6b 65  ELETE FROM ticke
19e0: 74 20 57 48 45 52 45 20 74 6b 74 5f 75 75 69 64  t WHERE tkt_uuid
19f0: 3d 25 51 22 2c 20 7a 54 6b 74 55 75 69 64 0a 20  =%Q", zTktUuid. 
1a00: 20 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65   );.  db_prepare
1a10: 28 26 71 2c 20 22 53 45 4c 45 43 54 20 72 69 64  (&q, "SELECT rid
1a20: 20 46 52 4f 4d 20 74 61 67 78 72 65 66 20 57 48   FROM tagxref WH
1a30: 45 52 45 20 74 61 67 69 64 3d 25 64 20 4f 52 44  ERE tagid=%d ORD
1a40: 45 52 20 42 59 20 6d 74 69 6d 65 22 2c 74 61 67  ER BY mtime",tag
1a50: 69 64 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62  id);.  while( db
1a60: 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54  _step(&q)==SQLIT
1a70: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74  E_ROW ){.    int
1a80: 20 72 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e   rid = db_column
1a90: 5f 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 20  _int(&q, 0);.   
1aa0: 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69 64   content_get(rid
1ab0: 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  , &content);.   
1ac0: 20 6d 61 6e 69 66 65 73 74 5f 70 61 72 73 65 28   manifest_parse(
1ad0: 26 6d 61 6e 69 66 65 73 74 2c 20 26 63 6f 6e 74  &manifest, &cont
1ae0: 65 6e 74 29 3b 0a 20 20 20 20 74 69 63 6b 65 74  ent);.    ticket
1af0: 5f 69 6e 73 65 72 74 28 26 6d 61 6e 69 66 65 73  _insert(&manifes
1b00: 74 2c 20 63 72 65 61 74 65 46 6c 61 67 2c 20 30  t, createFlag, 0
1b10: 29 3b 0a 20 20 20 20 6d 61 6e 69 66 65 73 74 5f  );.    manifest_
1b20: 63 6c 65 61 72 28 26 6d 61 6e 69 66 65 73 74 29  clear(&manifest)
1b30: 3b 0a 20 20 20 20 63 72 65 61 74 65 46 6c 61 67  ;.    createFlag
1b40: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 64 62 5f 66   = 0;.  }.  db_f
1b50: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 7d 0a 0a  inalize(&q);.}..
1b60: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
1b70: 20 73 75 62 73 63 72 69 70 74 20 69 6e 74 65 72   subscript inter
1b80: 70 72 65 74 65 72 20 61 6e 64 20 6c 6f 61 64 20  preter and load 
1b90: 74 68 65 20 74 69 63 6b 65 74 20 63 6f 6e 66 69  the ticket confi
1ba0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  guration..*/.voi
1bb0: 64 20 74 69 63 6b 65 74 5f 69 6e 69 74 28 76 6f  d ticket_init(vo
1bc0: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  id){.  char *zCo
1bd0: 6e 66 69 67 3b 0a 20 20 69 66 28 20 70 49 6e 74  nfig;.  if( pInt
1be0: 65 72 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  erp ) return;.  
1bf0: 70 49 6e 74 65 72 70 20 3d 20 53 62 53 5f 43 72  pInterp = SbS_Cr
1c00: 65 61 74 65 28 29 3b 0a 20 20 7a 43 6f 6e 66 69  eate();.  zConfi
1c10: 67 20 3d 20 64 62 5f 74 65 78 74 28 28 63 68 61  g = db_text((cha
1c20: 72 2a 29 7a 44 65 66 61 75 6c 74 54 69 63 6b 65  r*)zDefaultTicke
1c30: 74 43 6f 6e 66 69 67 2c 0a 20 20 20 20 20 20 20  tConfig,.       
1c40: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 76 61        "SELECT va
1c50: 6c 75 65 20 46 52 4f 4d 20 63 6f 6e 66 69 67 20  lue FROM config 
1c60: 57 48 45 52 45 20 6e 61 6d 65 3d 27 74 69 63 6b  WHERE name='tick
1c70: 65 74 2d 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  et-configuration
1c80: 27 22 29 3b 0a 20 20 53 62 53 5f 45 76 61 6c 28  '");.  SbS_Eval(
1c90: 70 49 6e 74 65 72 70 2c 20 7a 43 6f 6e 66 69 67  pInterp, zConfig
1ca0: 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , -1);.}../*.** 
1cb0: 52 65 63 72 65 61 74 65 20 74 68 65 20 74 69 63  Recreate the tic
1cc0: 6b 65 74 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  ket table..*/.vo
1cd0: 69 64 20 74 69 63 6b 65 74 5f 63 72 65 61 74 65  id ticket_create
1ce0: 5f 74 61 62 6c 65 28 69 6e 74 20 73 65 70 61 72  _table(int separ
1cf0: 61 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 29 7b 0a  ateConnection){.
1d00: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
1d10: 69 6e 74 20 6e 53 71 6c 3b 0a 0a 20 20 64 62 5f  int nSql;..  db_
1d20: 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 52 4f 50  multi_exec("DROP
1d30: 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
1d40: 20 74 69 63 6b 65 74 3b 22 29 3b 0a 20 20 74 69   ticket;");.  ti
1d50: 63 6b 65 74 5f 69 6e 69 74 28 29 3b 0a 20 20 7a  cket_init();.  z
1d60: 53 71 6c 20 3d 20 28 63 68 61 72 2a 29 53 62 53  Sql = (char*)SbS
1d70: 5f 46 65 74 63 68 28 70 49 6e 74 65 72 70 2c 20  _Fetch(pInterp, 
1d80: 22 74 69 63 6b 65 74 5f 73 71 6c 22 2c 20 2d 31  "ticket_sql", -1
1d90: 2c 20 26 6e 53 71 6c 29 3b 0a 20 20 69 66 28 20  , &nSql);.  if( 
1da0: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 66  zSql==0 ){.    f
1db0: 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 6e 6f 20  ossil_panic("no 
1dc0: 74 69 63 6b 65 74 5f 73 71 6c 20 64 65 66 69 6e  ticket_sql defin
1dd0: 65 64 20 62 79 20 74 69 63 6b 65 74 20 63 6f 6e  ed by ticket con
1de0: 66 69 67 75 72 61 74 69 6f 6e 22 29 3b 0a 20 20  figuration");.  
1df0: 7d 0a 20 20 69 66 28 20 73 65 70 61 72 61 74 65  }.  if( separate
1e00: 43 6f 6e 6e 65 63 74 69 6f 6e 20 29 7b 0a 20 20  Connection ){.  
1e10: 20 20 7a 53 71 6c 20 3d 20 6d 70 72 69 6e 74 66    zSql = mprintf
1e20: 28 22 25 2e 2a 73 22 2c 20 6e 53 71 6c 2c 20 7a  ("%.*s", nSql, z
1e30: 53 71 6c 29 3b 0a 20 20 20 20 64 62 5f 69 6e 69  Sql);.    db_ini
1e40: 74 5f 64 61 74 61 62 61 73 65 28 67 2e 7a 52 65  t_database(g.zRe
1e50: 70 6f 73 69 74 6f 72 79 4e 61 6d 65 2c 20 7a 53  positoryName, zS
1e60: 71 6c 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65  ql, 0);.    free
1e70: 28 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  (zSql);.  }else{
1e80: 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78  .    db_multi_ex
1e90: 65 63 28 22 25 2e 2a 73 22 2c 20 6e 53 71 6c 2c  ec("%.*s", nSql,
1ea0: 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   zSql);.  }.}../
1eb0: 2a 0a 2a 2a 20 52 65 70 6f 70 75 6c 61 74 65 20  *.** Repopulate 
1ec0: 74 68 65 20 74 69 63 6b 65 74 20 74 61 62 6c 65  the ticket table
1ed0: 0a 2a 2f 0a 76 6f 69 64 20 74 69 63 6b 65 74 5f  .*/.void ticket_
1ee0: 72 65 62 75 69 6c 64 28 76 6f 69 64 29 7b 0a 20  rebuild(void){. 
1ef0: 20 53 74 6d 74 20 71 3b 0a 20 20 64 62 5f 62 65   Stmt q;.  db_be
1f00: 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
1f10: 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28  );.  db_prepare(
1f20: 26 71 2c 22 53 45 4c 45 43 54 20 74 61 67 6e 61  &q,"SELECT tagna
1f30: 6d 65 20 46 52 4f 4d 20 74 61 67 20 57 48 45 52  me FROM tag WHER
1f40: 45 20 74 61 67 6e 61 6d 65 20 47 4c 4f 42 20 27  E tagname GLOB '
1f50: 74 6b 74 2d 2a 27 22 29 3b 0a 20 20 77 68 69 6c  tkt-*'");.  whil
1f60: 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
1f70: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1f80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
1f90: 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ame = db_column_
1fa0: 74 65 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20  text(&q, 0);.   
1fb0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 7a 4e   int len;.    zN
1fc0: 61 6d 65 20 2b 3d 20 34 3b 0a 20 20 20 20 6c 65  ame += 4;.    le
1fd0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  n = strlen(zName
1fe0: 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3c 32  );.    if( len<2
1ff0: 30 20 7c 7c 20 21 76 61 6c 69 64 61 74 65 31 36  0 || !validate16
2000: 28 7a 4e 61 6d 65 2c 20 6c 65 6e 29 20 29 20 63  (zName, len) ) c
2010: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 74 69 63  ontinue;.    tic
2020: 6b 65 74 5f 72 65 62 75 69 6c 64 5f 65 6e 74 72  ket_rebuild_entr
2030: 79 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  y(zName);.  }.  
2040: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b  db_finalize(&q);
2050: 0a 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61  .  db_end_transa
2060: 63 74 69 6f 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a  ction(0);.}../*.
2070: 2a 2a 20 57 45 42 50 41 47 45 3a 20 74 6b 74 76  ** WEBPAGE: tktv
2080: 69 65 77 0a 2a 2f 0a 76 6f 69 64 20 74 6b 74 76  iew.*/.void tktv
2090: 69 65 77 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a  iew_page(void){.
20a0: 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b    char *zScript;
20b0: 0a 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a  .  int nScript;.
20c0: 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72    login_check_cr
20d0: 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69  edentials();.  i
20e0: 66 28 20 21 67 2e 6f 6b 52 64 54 6b 74 20 29 7b  f( !g.okRdTkt ){
20f0: 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b   login_needed();
2100: 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 73 74 79   return; }.  sty
2110: 6c 65 5f 68 65 61 64 65 72 28 22 56 69 65 77 20  le_header("View 
2120: 54 69 63 6b 65 74 22 29 3b 0a 20 20 74 69 63 6b  Ticket");.  tick
2130: 65 74 5f 69 6e 69 74 28 29 3b 0a 20 20 69 6e 69  et_init();.  ini
2140: 74 69 61 6c 69 7a 65 56 61 72 69 61 62 6c 65 73  tializeVariables
2150: 46 72 6f 6d 44 62 28 29 3b 0a 20 20 7a 53 63 72  FromDb();.  zScr
2160: 69 70 74 20 3d 20 28 63 68 61 72 2a 29 53 62 53  ipt = (char*)SbS
2170: 5f 46 65 74 63 68 28 70 49 6e 74 65 72 70 2c 20  _Fetch(pInterp, 
2180: 22 74 6b 74 76 69 65 77 5f 74 65 6d 70 6c 61 74  "tktview_templat
2190: 65 22 2c 20 2d 31 2c 20 26 6e 53 63 72 69 70 74  e", -1, &nScript
21a0: 29 3b 0a 20 20 7a 53 63 72 69 70 74 20 3d 20 6d  );.  zScript = m
21b0: 70 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 6e  printf("%.*s", n
21c0: 53 63 72 69 70 74 2c 20 7a 53 63 72 69 70 74 29  Script, zScript)
21d0: 3b 0a 20 20 53 62 53 5f 52 65 6e 64 65 72 28 70  ;.  SbS_Render(p
21e0: 49 6e 74 65 72 70 2c 20 7a 53 63 72 69 70 74 29  Interp, zScript)
21f0: 3b 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72  ;.  style_footer
2200: 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62  ();.}../*.** Sub
2210: 73 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20  script command: 
2220: 20 20 4c 41 42 45 4c 20 73 75 62 6d 69 74 5f 6e    LABEL submit_n
2230: 65 77 5f 74 69 63 6b 65 74 0a 2a 2a 0a 2a 2a 20  ew_ticket.**.** 
2240: 49 66 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  If the variable 
2250: 6e 61 6d 65 64 20 4c 41 42 45 4c 20 65 78 69 73  named LABEL exis
2260: 74 73 2c 20 74 68 65 6e 20 73 75 62 6d 69 74 20  ts, then submit 
2270: 61 20 6e 65 77 20 74 69 63 6b 65 74 0a 2a 2a 20  a new ticket.** 
2280: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c  based on the val
2290: 75 65 73 20 6f 66 20 6f 74 68 65 72 20 64 65 66  ues of other def
22a0: 69 6e 65 64 20 76 61 72 69 61 62 6c 65 73 2e 0a  ined variables..
22b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
22c0: 62 6d 69 74 4e 65 77 43 6d 64 28 73 74 72 75 63  bmitNewCmd(struc
22d0: 74 20 53 75 62 73 63 72 69 70 74 20 2a 70 2c 20  t Subscript *p, 
22e0: 76 6f 69 64 20 2a 70 4e 6f 74 69 66 79 29 7b 0a  void *pNotify){.
22f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
2300: 61 62 65 6c 3b 0a 20 20 69 6e 74 20 6e 4c 61 62  abel;.  int nLab
2310: 65 6c 2c 20 73 69 7a 65 3b 0a 20 20 69 66 28 20  el, size;.  if( 
2320: 53 62 53 5f 52 65 71 75 69 72 65 53 74 61 63 6b  SbS_RequireStack
2330: 28 70 2c 20 31 2c 20 22 73 75 62 6d 69 74 5f 6e  (p, 1, "submit_n
2340: 65 77 5f 74 69 63 6b 65 74 22 29 20 29 20 72 65  ew_ticket") ) re
2350: 74 75 72 6e 20 31 3b 0a 20 20 7a 4c 61 62 65 6c  turn 1;.  zLabel
2360: 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75   = SbS_StackValu
2370: 65 28 70 2c 20 30 2c 20 26 6e 4c 61 62 65 6c 29  e(p, 0, &nLabel)
2380: 3b 0a 20 20 69 66 28 20 53 62 53 5f 46 65 74 63  ;.  if( SbS_Fetc
2390: 68 28 70 2c 20 7a 4c 61 62 65 6c 2c 20 6e 4c 61  h(p, zLabel, nLa
23a0: 62 65 6c 2c 20 26 73 69 7a 65 29 21 3d 30 20 29  bel, &size)!=0 )
23b0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 61 74  {.    char *zDat
23c0: 65 2c 20 2a 7a 55 75 69 64 3b 0a 20 20 20 20 69  e, *zUuid;.    i
23d0: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 72 69  nt i;.    int ri
23e0: 64 3b 0a 20 20 20 20 42 6c 6f 62 20 74 6b 74 63  d;.    Blob tktc
23f0: 68 6e 67 2c 20 63 6b 73 75 6d 3b 0a 0a 20 20 20  hng, cksum;..   
2400: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 74 6b 74 63   blob_zero(&tktc
2410: 68 6e 67 29 3b 0a 20 20 20 20 7a 44 61 74 65 20  hng);.    zDate 
2420: 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45  = db_text(0, "SE
2430: 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28 27 6e  LECT datetime('n
2440: 6f 77 27 29 22 29 3b 0a 20 20 20 20 7a 44 61 74  ow')");.    zDat
2450: 65 5b 31 30 5d 20 3d 20 27 54 27 3b 0a 20 20 20  e[10] = 'T';.   
2460: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 74   blob_appendf(&t
2470: 6b 74 63 68 6e 67 2c 20 22 44 20 25 73 5c 6e 22  ktchng, "D %s\n"
2480: 2c 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 66 72  , zDate);.    fr
2490: 65 65 28 7a 44 61 74 65 29 3b 0a 20 20 20 20 66  ee(zDate);.    f
24a0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64  or(i=0; i<nField
24b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
24c0: 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65  nst char *zValue
24d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c  ;.      int nVal
24e0: 75 65 3b 0a 20 20 20 20 20 20 7a 56 61 6c 75 65  ue;.      zValue
24f0: 20 3d 20 53 62 53 5f 46 65 74 63 68 28 70 2c 20   = SbS_Fetch(p, 
2500: 61 7a 46 69 65 6c 64 5b 69 5d 2c 20 2d 31 2c 20  azField[i], -1, 
2510: 26 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  &nValue);.      
2520: 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20 20  if( zValue ){.  
2530: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 56 61        while( nVa
2540: 6c 75 65 3e 30 20 26 26 20 69 73 73 70 61 63 65  lue>0 && isspace
2550: 28 7a 56 61 6c 75 65 5b 6e 56 61 6c 75 65 2d 31  (zValue[nValue-1
2560: 5d 29 20 29 7b 20 6e 56 61 6c 75 65 2d 2d 3b 20  ]) ){ nValue--; 
2570: 7d 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61  }.        blob_a
2580: 70 70 65 6e 64 66 28 26 74 6b 74 63 68 6e 67 2c  ppendf(&tktchng,
2590: 20 22 4a 20 25 73 20 25 7a 5c 6e 22 2c 0a 20 20   "J %s %z\n",.  
25a0: 20 20 20 20 20 20 20 20 20 61 7a 46 69 65 6c 64           azField
25b0: 5b 69 5d 2c 20 66 6f 73 73 69 6c 69 7a 65 28 7a  [i], fossilize(z
25c0: 56 61 6c 75 65 2c 6e 56 61 6c 75 65 29 29 3b 0a  Value,nValue));.
25d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25e0: 20 20 7a 55 75 69 64 20 3d 20 64 62 5f 74 65 78    zUuid = db_tex
25f0: 74 28 30 2c 20 22 53 45 4c 45 43 54 20 6c 6f 77  t(0, "SELECT low
2600: 65 72 28 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f  er(hex(randomblo
2610: 62 28 32 30 29 29 29 22 29 3b 0a 20 20 20 20 62  b(20)))");.    b
2620: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 74 6b 74  lob_appendf(&tkt
2630: 63 68 6e 67 2c 20 22 4b 20 25 73 5c 6e 22 2c 20  chng, "K %s\n", 
2640: 7a 55 75 69 64 29 3b 0a 20 20 20 20 28 2a 28 63  zUuid);.    (*(c
2650: 68 61 72 2a 2a 29 70 4e 6f 74 69 66 79 29 20 3d  har**)pNotify) =
2660: 20 7a 55 75 69 64 3b 0a 20 20 20 20 62 6c 6f 62   zUuid;.    blob
2670: 5f 61 70 70 65 6e 64 66 28 26 74 6b 74 63 68 6e  _appendf(&tktchn
2680: 67 2c 20 22 55 20 25 46 5c 6e 22 2c 20 67 2e 7a  g, "U %F\n", g.z
2690: 4c 6f 67 69 6e 20 3f 20 67 2e 7a 4c 6f 67 69 6e  Login ? g.zLogin
26a0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 6d 64 35 73   : "");.    md5s
26b0: 75 6d 5f 62 6c 6f 62 28 26 74 6b 74 63 68 6e 67  um_blob(&tktchng
26c0: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 62  , &cksum);.    b
26d0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 74 6b 74  lob_appendf(&tkt
26e0: 63 68 6e 67 2c 20 22 5a 20 25 62 5c 6e 22 2c 20  chng, "Z %b\n", 
26f0: 26 63 6b 73 75 6d 29 3b 0a 0a 23 69 66 20 30 0a  &cksum);..#if 0.
2700: 20 20 20 20 40 20 3c 68 72 3e 3c 70 72 65 3e 0a      @ <hr><pre>.
2710: 20 20 20 20 40 20 25 68 28 62 6c 6f 62 5f 73 74      @ %h(blob_st
2720: 72 28 26 74 6b 74 63 68 6e 67 29 29 0a 20 20 20  r(&tktchng)).   
2730: 20 40 20 3c 2f 70 72 65 3e 3c 68 72 3e 0a 20 20   @ </pre><hr>.  
2740: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 74 6b 74    blob_zero(&tkt
2750: 63 68 6e 67 29 0a 20 20 20 20 53 62 53 5f 50 6f  chng).    SbS_Po
2760: 70 28 70 2c 20 31 29 3b 0a 20 20 20 20 72 65 74  p(p, 1);.    ret
2770: 75 72 6e 20 53 42 53 5f 4f 4b 3b 0a 23 65 6e 64  urn SBS_OK;.#end
2780: 69 66 0a 0a 20 20 20 20 72 69 64 20 3d 20 63 6f  if..    rid = co
2790: 6e 74 65 6e 74 5f 70 75 74 28 26 74 6b 74 63 68  ntent_put(&tktch
27a0: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ng, 0, 0);.    i
27b0: 66 28 20 72 69 64 3d 3d 30 20 29 7b 0a 20 20 20  f( rid==0 ){.   
27c0: 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28     fossil_panic(
27d0: 22 74 72 6f 75 62 6c 65 20 63 6f 6d 6d 69 74 74  "trouble committ
27e0: 69 6e 67 20 74 69 63 6b 65 74 3a 20 25 73 22 2c  ing ticket: %s",
27f0: 20 67 2e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20   g.zErrMsg);.   
2800: 20 7d 0a 20 20 20 20 6d 61 6e 69 66 65 73 74 5f   }.    manifest_
2810: 63 72 6f 73 73 6c 69 6e 6b 28 72 69 64 2c 20 26  crosslink(rid, &
2820: 74 6b 74 63 68 6e 67 29 3b 0a 20 20 20 20 72 65  tktchng);.    re
2830: 74 75 72 6e 20 53 42 53 5f 52 45 54 55 52 4e 3b  turn SBS_RETURN;
2840: 0a 20 20 7d 0a 20 20 53 62 53 5f 50 6f 70 28 70  .  }.  SbS_Pop(p
2850: 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 1);.  return S
2860: 42 53 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  BS_OK;  .}../*.*
2870: 2a 20 57 45 42 50 41 47 45 3a 20 74 6b 74 6e 65  * WEBPAGE: tktne
2880: 77 0a 2a 2f 0a 76 6f 69 64 20 74 6b 74 6e 65 77  w.*/.void tktnew
2890: 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 63  _page(void){.  c
28a0: 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20  har *zScript;.  
28b0: 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 63  int nScript;.  c
28c0: 68 61 72 20 2a 7a 4e 65 77 55 75 69 64 20 3d 20  har *zNewUuid = 
28d0: 30 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63  0;..  login_chec
28e0: 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b  k_credentials();
28f0: 0a 20 20 69 66 28 20 21 67 2e 6f 6b 4e 65 77 54  .  if( !g.okNewT
2900: 6b 74 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64  kt ){ login_need
2910: 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  ed(); return; }.
2920: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22    style_header("
2930: 4e 65 77 20 54 69 63 6b 65 74 22 29 3b 0a 20 20  New Ticket");.  
2940: 74 69 63 6b 65 74 5f 69 6e 69 74 28 29 3b 0a 20  ticket_init();. 
2950: 20 67 65 74 41 6c 6c 54 69 63 6b 65 74 46 69 65   getAllTicketFie
2960: 6c 64 73 28 29 3b 0a 20 20 69 6e 69 74 69 61 6c  lds();.  initial
2970: 69 7a 65 56 61 72 69 61 62 6c 65 73 46 72 6f 6d  izeVariablesFrom
2980: 43 47 49 28 29 3b 0a 20 20 40 20 3c 66 6f 72 6d  CGI();.  @ <form
2990: 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22 20 61   method="POST" a
29a0: 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42 61 73  ction="%s(g.zBas
29b0: 65 55 52 4c 29 2f 74 6b 74 6e 65 77 22 3e 0a 20  eURL)/tktnew">. 
29c0: 20 7a 53 63 72 69 70 74 20 3d 20 28 63 68 61 72   zScript = (char
29d0: 2a 29 53 62 53 5f 46 65 74 63 68 28 70 49 6e 74  *)SbS_Fetch(pInt
29e0: 65 72 70 2c 20 22 74 6b 74 6e 65 77 5f 74 65 6d  erp, "tktnew_tem
29f0: 70 6c 61 74 65 22 2c 20 2d 31 2c 20 26 6e 53 63  plate", -1, &nSc
2a00: 72 69 70 74 29 3b 0a 20 20 7a 53 63 72 69 70 74  ript);.  zScript
2a10: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73   = mprintf("%.*s
2a20: 22 2c 20 6e 53 63 72 69 70 74 2c 20 7a 53 63 72  ", nScript, zScr
2a30: 69 70 74 29 3b 0a 20 20 53 62 53 5f 41 64 64 56  ipt);.  SbS_AddV
2a40: 65 72 62 28 70 49 6e 74 65 72 70 2c 20 22 73 75  erb(pInterp, "su
2a50: 62 6d 69 74 5f 6e 65 77 5f 74 69 63 6b 65 74 22  bmit_new_ticket"
2a60: 2c 20 73 75 62 6d 69 74 4e 65 77 43 6d 64 2c 20  , submitNewCmd, 
2a70: 28 76 6f 69 64 2a 29 26 7a 4e 65 77 55 75 69 64  (void*)&zNewUuid
2a80: 29 3b 0a 20 20 69 66 28 20 53 62 53 5f 52 65 6e  );.  if( SbS_Ren
2a90: 64 65 72 28 70 49 6e 74 65 72 70 2c 20 7a 53 63  der(pInterp, zSc
2aa0: 72 69 70 74 29 3d 3d 53 42 53 5f 52 45 54 55 52  ript)==SBS_RETUR
2ab0: 4e 20 26 26 20 7a 4e 65 77 55 75 69 64 20 29 7b  N && zNewUuid ){
2ac0: 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72 65 63  .    cgi_redirec
2ad0: 74 28 6d 70 72 69 6e 74 66 28 22 25 73 2f 74 6b  t(mprintf("%s/tk
2ae0: 74 76 69 65 77 2f 25 73 22 2c 20 67 2e 7a 42 61  tview/%s", g.zBa
2af0: 73 65 55 52 4c 2c 20 7a 4e 65 77 55 75 69 64 29  seURL, zNewUuid)
2b00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2b10: 20 7d 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20   }.  @ </form>. 
2b20: 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
2b30: 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73  .}..../*.** Subs
2b40: 63 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20  cript command:  
2b50: 20 53 54 52 31 20 53 54 52 32 20 55 53 45 52 56   STR1 STR2 USERV
2b60: 41 52 20 41 50 50 45 4e 44 56 41 52 20 46 49 45  AR APPENDVAR FIE
2b70: 4c 44 20 61 70 70 65 6e 64 5f 72 65 6d 61 72 6b  LD append_remark
2b80: 0a 2a 2a 0a 2a 2a 20 46 49 45 4c 44 20 69 73 20  .**.** FIELD is 
2b90: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
2ba0: 74 61 62 61 73 65 20 63 6f 6c 75 6d 6e 20 74 6f  tabase column to
2bb0: 20 77 68 69 63 68 20 77 65 20 6d 69 67 68 74 20   which we might 
2bc0: 77 61 6e 74 0a 2a 2a 20 74 6f 20 61 70 70 65 6e  want.** to appen
2bd0: 64 20 74 65 78 74 2e 20 20 41 50 50 45 4e 44 56  d text.  APPENDV
2be0: 41 52 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  AR is the name o
2bf0: 66 20 61 20 43 47 49 20 70 61 72 61 6d 65 74 65  f a CGI paramete
2c00: 72 20 77 68 69 63 68 0a 2a 2a 20 28 69 66 20 69  r which.** (if i
2c10: 74 20 65 78 69 73 74 73 29 20 63 6f 6e 74 61 69  t exists) contai
2c20: 6e 73 20 74 68 65 20 74 65 78 74 20 74 6f 20 62  ns the text to b
2c30: 65 20 61 70 70 65 6e 64 65 64 2e 20 20 54 68 65  e appended.  The
2c40: 20 61 70 70 65 6e 64 0a 2a 2a 20 6f 70 65 72 61   append.** opera
2c50: 74 69 6f 6e 20 77 69 6c 6c 20 6f 6e 6c 79 20 68  tion will only h
2c60: 61 70 70 65 6e 20 69 66 20 41 50 50 45 4e 44 56  appen if APPENDV
2c70: 41 52 20 65 78 69 73 74 73 2e 20 20 55 53 45 52  AR exists.  USER
2c80: 56 41 52 20 69 73 0a 2a 2a 20 61 20 43 47 49 20  VAR is.** a CGI 
2c90: 70 61 72 61 6d 65 74 65 72 20 77 68 69 63 68 20  parameter which 
2ca0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
2cb0: 65 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20  e that the user 
2cc0: 77 61 6e 74 73 20 74 6f 0a 2a 2a 20 74 6f 20 62  wants to.** to b
2cd0: 65 20 6b 6e 6f 77 6e 20 62 79 2e 20 20 53 54 52  e known by.  STR
2ce0: 31 20 61 6e 64 20 53 54 52 32 20 61 72 65 20 70  1 and STR2 are p
2cf0: 72 65 66 69 78 65 73 20 74 68 61 74 20 61 72 65  refixes that are
2d00: 20 70 72 65 70 65 6e 64 65 64 0a 2a 2a 20 74 6f   prepended.** to
2d10: 20 74 68 65 20 74 65 78 74 20 69 6e 20 74 68 65   the text in the
2d20: 20 41 50 50 45 4e 44 56 41 52 20 43 47 49 20 70   APPENDVAR CGI p
2d30: 61 72 61 6d 65 74 65 72 2e 20 20 53 54 52 31 20  arameter.  STR1 
2d40: 69 73 20 75 73 65 64 20 69 66 0a 2a 2a 20 55 53  is used if.** US
2d50: 45 52 56 41 52 20 69 73 20 74 68 65 20 73 61 6d  ERVAR is the sam
2d60: 65 20 61 73 20 67 2e 7a 4c 6f 67 69 6e 20 6f 72  e as g.zLogin or
2d70: 20 69 66 20 55 53 45 52 56 41 52 20 64 6f 65 73   if USERVAR does
2d80: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 20 53   not exist..** S
2d90: 54 52 32 20 69 73 20 75 73 65 64 20 69 66 20 55  TR2 is used if U
2da0: 53 45 52 56 41 52 20 65 78 69 73 74 73 20 61 6e  SERVAR exists an
2db0: 64 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 74  d is different t
2dc0: 68 61 6e 20 67 2e 7a 4c 6f 67 69 6e 2e 0a 2a 2a  han g.zLogin..**
2dd0: 20 57 69 74 68 69 6e 20 53 54 52 31 20 61 6e 64   Within STR1 and
2de0: 20 53 54 52 32 2c 20 74 68 65 20 66 6f 6c 6c 6f   STR2, the follo
2df0: 77 69 6e 67 20 73 75 62 73 74 69 74 75 74 69 6f  wing substitutio
2e00: 6e 73 20 6f 63 63 75 72 3a 0a 2a 2a 0a 2a 2a 20  ns occur:.**.** 
2e10: 20 20 20 20 25 4c 4f 47 49 4e 25 20 20 20 20 54      %LOGIN%    T
2e20: 68 65 20 76 61 6c 75 65 20 6f 66 20 67 2e 7a 4c  he value of g.zL
2e30: 6f 67 69 6e 0a 2a 2a 20 20 20 20 20 25 55 53 45  ogin.**     %USE
2e40: 52 25 20 20 20 20 20 54 68 65 20 76 61 6c 75 65  R%     The value
2e50: 20 6f 66 20 74 68 65 20 55 53 45 52 56 41 52 20   of the USERVAR 
2e60: 43 47 49 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  CGI parameter.**
2e70: 20 20 20 20 20 25 44 41 54 45 25 20 20 20 20 20       %DATE%     
2e80: 54 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 65  The current date
2e90: 20 61 6e 64 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20   and time.**.** 
2ea0: 54 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f  The concatenatio
2eb0: 6e 20 53 54 52 31 20 6f 72 20 53 54 52 32 20 77  n STR1 or STR2 w
2ec0: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ith the content 
2ed0: 6f 66 20 41 50 50 45 4e 44 56 41 52 0a 2a 2a 20  of APPENDVAR.** 
2ee0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2ef0: 61 7a 41 70 6e 64 5b 5d 20 69 6e 20 74 68 65 20  azApnd[] in the 
2f00: 46 49 45 4c 44 20 73 6c 6f 74 20 73 6f 20 74 68  FIELD slot so th
2f10: 61 74 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a  at it will be.**
2f20: 20 70 69 63 6b 65 64 20 75 70 20 61 6e 64 20 75   picked up and u
2f30: 73 65 64 20 62 79 20 74 68 65 20 73 75 62 6d 69  sed by the submi
2f40: 74 5f 74 69 63 6b 65 74 5f 63 68 61 6e 67 65 20  t_ticket_change 
2f50: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  command..*/.stat
2f60: 69 63 20 69 6e 74 20 61 70 70 65 6e 64 52 65 6d  ic int appendRem
2f70: 61 72 6b 43 6d 64 28 73 74 72 75 63 74 20 53 75  arkCmd(struct Su
2f80: 62 73 63 72 69 70 74 20 2a 70 2c 20 76 6f 69 64  bscript *p, void
2f90: 20 2a 6e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e   *notUsed){.  in
2fa0: 74 20 69 2c 20 6a 2c 20 69 64 78 3b 0a 20 20 63  t i, j, idx;.  c
2fb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 65 6c  onst char *zFiel
2fc0: 64 2c 20 2a 7a 41 70 70 65 6e 64 56 61 72 2c 20  d, *zAppendVar, 
2fd0: 2a 7a 55 73 65 72 56 61 72 2c 20 2a 7a 53 74 72  *zUserVar, *zStr
2fe0: 2c 20 2a 7a 56 61 6c 75 65 2c 20 2a 7a 55 73 65  , *zValue, *zUse
2ff0: 72 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c  r;.  int nField,
3000: 20 6e 41 70 70 65 6e 64 56 61 72 2c 20 6e 55 73   nAppendVar, nUs
3010: 65 72 56 61 72 2c 20 6e 53 74 72 2c 20 6e 56 61  erVar, nStr, nVa
3020: 6c 75 65 2c 20 6e 55 73 65 72 3b 0a 0a 20 20 69  lue, nUser;..  i
3030: 66 28 20 53 62 53 5f 52 65 71 75 69 72 65 53 74  f( SbS_RequireSt
3040: 61 63 6b 28 70 2c 20 35 2c 20 22 61 70 70 65 6e  ack(p, 5, "appen
3050: 64 5f 72 65 6d 61 72 6b 22 29 20 29 20 72 65 74  d_remark") ) ret
3060: 75 72 6e 20 31 3b 0a 20 20 7a 46 69 65 6c 64 20  urn 1;.  zField 
3070: 3d 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65  = SbS_StackValue
3080: 28 70 2c 20 30 2c 20 26 6e 46 69 65 6c 64 29 3b  (p, 0, &nField);
3090: 0a 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 64  .  for(idx=0; id
30a0: 78 3c 6e 46 69 65 6c 64 3b 20 69 64 78 2b 2b 29  x<nField; idx++)
30b0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  {.    if( strncm
30c0: 70 28 61 7a 46 69 65 6c 64 5b 69 64 78 5d 2c 20  p(azField[idx], 
30d0: 7a 46 69 65 6c 64 2c 20 6e 46 69 65 6c 64 29 3d  zField, nField)=
30e0: 3d 30 20 26 26 20 61 7a 46 69 65 6c 64 5b 69 64  =0 && azField[id
30f0: 78 5d 5b 6e 46 69 65 6c 64 5d 3d 3d 30 20 29 7b  x][nField]==0 ){
3100: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3110: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 64    }.  }.  if( id
3120: 78 3e 3d 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20  x>=nField ){.   
3130: 20 53 62 53 5f 53 65 74 45 72 72 6f 72 4d 65 73   SbS_SetErrorMes
3140: 73 61 67 65 28 70 2c 20 22 6e 6f 20 73 75 63 68  sage(p, "no such
3150: 20 54 49 43 4b 45 54 20 63 6f 6c 75 6d 6e 3a 20   TICKET column: 
3160: 25 2e 2a 73 22 2c 20 6e 46 69 65 6c 64 2c 20 7a  %.*s", nField, z
3170: 46 69 65 6c 64 29 3b 0a 20 20 20 20 72 65 74 75  Field);.    retu
3180: 72 6e 20 53 42 53 5f 45 52 52 4f 52 3b 0a 20 20  rn SBS_ERROR;.  
3190: 7d 0a 20 20 7a 41 70 70 65 6e 64 56 61 72 20 3d  }.  zAppendVar =
31a0: 20 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28   SbS_StackValue(
31b0: 70 2c 20 31 2c 20 26 6e 41 70 70 65 6e 64 56 61  p, 1, &nAppendVa
31c0: 72 29 3b 0a 20 20 7a 56 61 6c 75 65 20 3d 20 53  r);.  zValue = S
31d0: 62 53 5f 46 65 74 63 68 28 70 2c 20 7a 41 70 70  bS_Fetch(p, zApp
31e0: 65 6e 64 56 61 72 2c 20 6e 41 70 70 65 6e 64 56  endVar, nAppendV
31f0: 61 72 2c 20 26 6e 56 61 6c 75 65 29 3b 0a 20 20  ar, &nValue);.  
3200: 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20 20  if( zValue ){.  
3210: 20 20 42 6c 6f 62 20 6f 75 74 3b 0a 20 20 20 20    Blob out;.    
3220: 62 6c 6f 62 5f 7a 65 72 6f 28 26 6f 75 74 29 3b  blob_zero(&out);
3230: 0a 20 20 20 20 7a 55 73 65 72 56 61 72 20 3d 20  .    zUserVar = 
3240: 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 70  SbS_StackValue(p
3250: 2c 20 32 2c 20 26 6e 55 73 65 72 56 61 72 29 3b  , 2, &nUserVar);
3260: 0a 20 20 20 20 7a 55 73 65 72 20 3d 20 53 62 53  .    zUser = SbS
3270: 5f 46 65 74 63 68 28 70 2c 20 7a 55 73 65 72 56  _Fetch(p, zUserV
3280: 61 72 2c 20 6e 55 73 65 72 56 61 72 2c 20 26 6e  ar, nUserVar, &n
3290: 55 73 65 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  User);.    if( z
32a0: 55 73 65 72 20 26 26 20 28 73 74 72 6e 63 6d 70  User && (strncmp
32b0: 28 7a 55 73 65 72 2c 20 67 2e 7a 4c 6f 67 69 6e  (zUser, g.zLogin
32c0: 2c 20 6e 55 73 65 72 29 20 7c 7c 20 67 2e 7a 4c  , nUser) || g.zL
32d0: 6f 67 69 6e 5b 6e 55 73 65 72 5d 21 3d 30 29 20  ogin[nUser]!=0) 
32e0: 29 7b 0a 20 20 20 20 20 20 7a 53 74 72 20 3d 20  ){.      zStr = 
32f0: 53 62 53 5f 53 74 61 63 6b 56 61 6c 75 65 28 70  SbS_StackValue(p
3300: 2c 20 33 2c 20 26 6e 53 74 72 29 3b 0a 20 20 20  , 3, &nStr);.   
3310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53   }else{.      zS
3320: 74 72 20 3d 20 53 62 53 5f 53 74 61 63 6b 56 61  tr = SbS_StackVa
3330: 6c 75 65 28 70 2c 20 34 2c 20 26 6e 53 74 72 29  lue(p, 4, &nStr)
3340: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
3350: 69 3d 6a 3d 30 3b 20 69 3c 6e 53 74 72 3b 20 69  i=j=0; i<nStr; i
3360: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ++){.      if( z
3370: 53 74 72 5b 69 5d 21 3d 27 25 27 20 29 20 63 6f  Str[i]!='%' ) co
3380: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
3390: 28 20 69 3e 6a 20 29 7b 0a 20 20 20 20 20 20 20  ( i>j ){.       
33a0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 6f 75   blob_append(&ou
33b0: 74 2c 20 26 7a 53 74 72 5b 6a 5d 2c 20 69 2d 6a  t, &zStr[j], i-j
33c0: 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 69  );.        j = i
33d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33e0: 69 66 28 20 73 74 72 6e 63 6d 70 28 26 7a 53 74  if( strncmp(&zSt
33f0: 72 5b 6a 5d 2c 20 22 25 55 53 45 52 25 22 2c 20  r[j], "%USER%", 
3400: 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  6)==0 ){.       
3410: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6f   blob_appendf(&o
3420: 75 74 2c 20 22 25 7a 22 2c 20 68 74 6d 6c 69 7a  ut, "%z", htmliz
3430: 65 28 7a 55 73 65 72 2c 20 6e 55 73 65 72 29 29  e(zUser, nUser))
3440: 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 35  ;.        i += 5
3450: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 69 2b  ;.        j = i+
3460: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
3470: 66 28 20 73 74 72 6e 63 6d 70 28 26 7a 53 74 72  f( strncmp(&zStr
3480: 5b 6a 5d 2c 20 22 25 4c 4f 47 49 4e 25 22 2c 20  [j], "%LOGIN%", 
3490: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
34a0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6f   blob_appendf(&o
34b0: 75 74 2c 20 22 25 7a 22 2c 20 68 74 6d 6c 69 7a  ut, "%z", htmliz
34c0: 65 28 67 2e 7a 4c 6f 67 69 6e 2c 20 2d 31 29 29  e(g.zLogin, -1))
34d0: 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 36  ;.        i += 6
34e0: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 69 2b  ;.        j = i+
34f0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
3500: 66 28 20 73 74 72 6e 63 6d 70 28 26 7a 53 74 72  f( strncmp(&zStr
3510: 5b 6a 5d 2c 20 22 25 44 41 54 45 25 22 2c 20 36  [j], "%DATE%", 6
3520: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3530: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6f 75  blob_appendf(&ou
3540: 74 2c 20 22 25 7a 22 2c 20 64 62 5f 74 65 78 74  t, "%z", db_text
3550: 28 30 2c 20 22 53 45 4c 45 43 54 20 64 61 74 65  (0, "SELECT date
3560: 74 69 6d 65 28 27 6e 6f 77 27 29 22 29 29 3b 0a  time('now')"));.
3570: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 35 3b 0a          i += 5;.
3580: 20 20 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b          j = i+1;
3590: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35a0: 20 20 20 69 66 28 20 69 3e 6a 20 29 7b 0a 20 20     if( i>j ){.  
35b0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
35c0: 26 6f 75 74 2c 20 26 7a 53 74 72 5b 6a 5d 2c 20  &out, &zStr[j], 
35d0: 69 2d 6a 29 3b 20 20 20 20 20 0a 20 20 20 20 7d  i-j);     .    }
35e0: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  .    blob_append
35f0: 28 26 6f 75 74 2c 20 7a 56 61 6c 75 65 2c 20 6e  (&out, zValue, n
3600: 56 61 6c 75 65 29 3b 0a 20 20 20 20 61 7a 41 70  Value);.    azAp
3610: 70 65 6e 64 5b 69 64 78 5d 20 3d 20 62 6c 6f 62  pend[idx] = blob
3620: 5f 73 74 72 28 26 6f 75 74 29 3b 0a 20 20 7d 0a  _str(&out);.  }.
3630: 20 20 53 62 53 5f 50 6f 70 28 70 2c 20 35 29 3b    SbS_Pop(p, 5);
3640: 0a 20 20 72 65 74 75 72 6e 20 53 42 53 5f 4f 4b  .  return SBS_OK
3650: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 73 63  ;.}../*.** Subsc
3660: 72 69 70 74 20 63 6f 6d 6d 61 6e 64 3a 20 20 20  ript command:   
3670: 4c 41 42 45 4c 20 73 75 62 6d 69 74 5f 74 69 63  LABEL submit_tic
3680: 6b 65 74 5f 63 68 61 6e 67 65 0a 2a 2a 0a 2a 2a  ket_change.**.**
3690: 20 49 66 20 74 68 65 20 76 61 72 69 61 62 6c 65   If the variable
36a0: 20 6e 61 6d 65 64 20 4c 41 42 45 4c 20 65 78 69   named LABEL exi
36b0: 73 74 73 2c 20 74 68 65 6e 20 73 75 62 6d 69 74  sts, then submit
36c0: 20 61 20 63 68 61 6e 67 65 20 74 6f 0a 2a 2a 20   a change to.** 
36d0: 74 68 65 20 74 69 63 6b 65 74 20 69 64 65 6e 74  the ticket ident
36e0: 69 66 69 65 64 20 62 79 20 74 68 65 20 22 6e 61  ified by the "na
36f0: 6d 65 22 20 43 47 49 20 70 61 72 61 6d 65 74 65  me" CGI paramete
3700: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
3710: 20 73 75 62 6d 69 74 45 64 69 74 43 6d 64 28 73   submitEditCmd(s
3720: 74 72 75 63 74 20 53 75 62 73 63 72 69 70 74 20  truct Subscript 
3730: 2a 70 2c 20 76 6f 69 64 20 2a 70 4e 6f 74 69 66  *p, void *pNotif
3740: 79 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  y){.  const char
3750: 20 2a 7a 4c 61 62 65 6c 3b 0a 20 20 69 6e 74 20   *zLabel;.  int 
3760: 6e 4c 61 62 65 6c 2c 20 73 69 7a 65 3b 0a 0a 20  nLabel, size;.. 
3770: 20 69 66 28 20 53 62 53 5f 52 65 71 75 69 72 65   if( SbS_Require
3780: 53 74 61 63 6b 28 70 2c 20 31 2c 20 22 73 75 62  Stack(p, 1, "sub
3790: 6d 69 74 5f 74 69 63 6b 65 74 5f 63 68 61 6e 67  mit_ticket_chang
37a0: 65 22 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  e") ) return 1;.
37b0: 20 20 7a 4c 61 62 65 6c 20 3d 20 53 62 53 5f 53    zLabel = SbS_S
37c0: 74 61 63 6b 56 61 6c 75 65 28 70 2c 20 30 2c 20  tackValue(p, 0, 
37d0: 26 6e 4c 61 62 65 6c 29 3b 0a 20 20 69 66 28 20  &nLabel);.  if( 
37e0: 53 62 53 5f 46 65 74 63 68 28 70 2c 20 7a 4c 61  SbS_Fetch(p, zLa
37f0: 62 65 6c 2c 20 6e 4c 61 62 65 6c 2c 20 26 73 69  bel, nLabel, &si
3800: 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68  ze)!=0 ){.    ch
3810: 61 72 20 2a 7a 44 61 74 65 2c 20 2a 7a 55 75 69  ar *zDate, *zUui
3820: 64 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  d;.    int i;.  
3830: 20 20 69 6e 74 20 72 69 64 3b 0a 20 20 20 20 42    int rid;.    B
3840: 6c 6f 62 20 74 6b 74 63 68 6e 67 2c 20 63 6b 73  lob tktchng, cks
3850: 75 6d 3b 0a 0a 20 20 20 20 28 2a 28 69 6e 74 2a  um;..    (*(int*
3860: 29 70 4e 6f 74 69 66 79 29 20 3d 20 31 3b 0a 20  )pNotify) = 1;. 
3870: 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 74 6b     blob_zero(&tk
3880: 74 63 68 6e 67 29 3b 0a 20 20 20 20 7a 44 61 74  tchng);.    zDat
3890: 65 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22  e = db_text(0, "
38a0: 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28  SELECT datetime(
38b0: 27 6e 6f 77 27 29 22 29 3b 0a 20 20 20 20 7a 44  'now')");.    zD
38c0: 61 74 65 5b 31 30 5d 20 3d 20 27 54 27 3b 0a 20  ate[10] = 'T';. 
38d0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
38e0: 26 74 6b 74 63 68 6e 67 2c 20 22 44 20 25 73 5c  &tktchng, "D %s\
38f0: 6e 22 2c 20 7a 44 61 74 65 29 3b 0a 20 20 20 20  n", zDate);.    
3900: 66 72 65 65 28 7a 44 61 74 65 29 3b 0a 20 20 20  free(zDate);.   
3910: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65   for(i=0; i<nFie
3920: 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; i++){.      
3930: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
3940: 75 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56  ue;.      int nV
3950: 61 6c 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  alue;.      if( 
3960: 61 7a 41 70 70 65 6e 64 5b 69 5d 20 29 7b 0a 20  azAppend[i] ){. 
3970: 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65         blob_appe
3980: 6e 64 66 28 26 74 6b 74 63 68 6e 67 2c 20 22 4a  ndf(&tktchng, "J
3990: 20 2b 25 73 20 25 7a 5c 6e 22 2c 20 61 7a 46 69   +%s %z\n", azFi
39a0: 65 6c 64 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  eld[i],.        
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 73               fos
39c0: 73 69 6c 69 7a 65 28 61 7a 41 70 70 65 6e 64 5b  silize(azAppend[
39d0: 69 5d 2c 20 2d 31 29 29 3b 0a 20 20 20 20 20 20  i], -1));.      
39e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
39f0: 56 61 6c 75 65 20 3d 20 53 62 53 5f 46 65 74 63  Value = SbS_Fetc
3a00: 68 28 70 2c 20 61 7a 46 69 65 6c 64 5b 69 5d 2c  h(p, azField[i],
3a10: 20 2d 31 2c 20 26 6e 56 61 6c 75 65 29 3b 0a 20   -1, &nValue);. 
3a20: 20 20 20 20 20 20 20 69 66 28 20 7a 56 61 6c 75         if( zValu
3a30: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  e ){.          w
3a40: 68 69 6c 65 28 20 6e 56 61 6c 75 65 3e 30 20 26  hile( nValue>0 &
3a50: 26 20 69 73 73 70 61 63 65 28 7a 56 61 6c 75 65  & isspace(zValue
3a60: 5b 6e 56 61 6c 75 65 2d 31 5d 29 20 29 7b 20 6e  [nValue-1]) ){ n
3a70: 56 61 6c 75 65 2d 2d 3b 20 7d 0a 20 20 20 20 20  Value--; }.     
3a80: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
3a90: 28 7a 56 61 6c 75 65 2c 20 61 7a 56 61 6c 75 65  (zValue, azValue
3aa0: 5b 69 5d 2c 20 6e 56 61 6c 75 65 29 0a 20 20 20  [i], nValue).   
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
3ac0: 7c 20 73 74 72 6c 65 6e 28 61 7a 56 61 6c 75 65  | strlen(azValue
3ad0: 5b 69 5d 29 21 3d 6e 56 61 6c 75 65 20 29 7b 0a  [i])!=nValue ){.
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62              blob
3af0: 5f 61 70 70 65 6e 64 66 28 26 74 6b 74 63 68 6e  _appendf(&tktchn
3b00: 67 2c 20 22 4a 20 25 73 20 25 7a 5c 6e 22 2c 0a  g, "J %s %z\n",.
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
3b20: 7a 46 69 65 6c 64 5b 69 5d 2c 20 66 6f 73 73 69  zField[i], fossi
3b30: 6c 69 7a 65 28 7a 56 61 6c 75 65 2c 6e 56 61 6c  lize(zValue,nVal
3b40: 75 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ue));.          
3b50: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
3b60: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55    }.    }.    zU
3b70: 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28 30 2c  uid = db_text(0,
3b80: 20 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54   .       "SELECT
3b90: 20 74 6b 74 5f 75 75 69 64 20 46 52 4f 4d 20 74   tkt_uuid FROM t
3ba0: 69 63 6b 65 74 20 57 48 45 52 45 20 74 6b 74 5f  icket WHERE tkt_
3bb0: 75 75 69 64 20 47 4c 4f 42 20 27 25 73 2a 27 22  uuid GLOB '%s*'"
3bc0: 2c 0a 20 20 20 20 20 20 20 50 28 22 6e 61 6d 65  ,.       P("name
3bd0: 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 62 6c  ").    );.    bl
3be0: 6f 62 5f 61 70 70 65 6e 64 66 28 26 74 6b 74 63  ob_appendf(&tktc
3bf0: 68 6e 67 2c 20 22 4b 20 25 73 5c 6e 22 2c 20 7a  hng, "K %s\n", z
3c00: 55 75 69 64 29 3b 0a 20 20 20 20 28 2a 28 63 68  Uuid);.    (*(ch
3c10: 61 72 2a 2a 29 70 4e 6f 74 69 66 79 29 20 3d 20  ar**)pNotify) = 
3c20: 7a 55 75 69 64 3b 0a 20 20 20 20 62 6c 6f 62 5f  zUuid;.    blob_
3c30: 61 70 70 65 6e 64 66 28 26 74 6b 74 63 68 6e 67  appendf(&tktchng
3c40: 2c 20 22 55 20 25 46 5c 6e 22 2c 20 67 2e 7a 4c  , "U %F\n", g.zL
3c50: 6f 67 69 6e 20 3f 20 67 2e 7a 4c 6f 67 69 6e 20  ogin ? g.zLogin 
3c60: 3a 20 22 22 29 3b 0a 20 20 20 20 6d 64 35 73 75  : "");.    md5su
3c70: 6d 5f 62 6c 6f 62 28 26 74 6b 74 63 68 6e 67 2c  m_blob(&tktchng,
3c80: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 62 6c   &cksum);.    bl
3c90: 6f 62 5f 61 70 70 65 6e 64 66 28 26 74 6b 74 63  ob_appendf(&tktc
3ca0: 68 6e 67 2c 20 22 5a 20 25 62 5c 6e 22 2c 20 26  hng, "Z %b\n", &
3cb0: 63 6b 73 75 6d 29 3b 0a 0a 23 69 66 20 31 0a 20  cksum);..#if 1. 
3cc0: 20 20 20 40 20 3c 68 72 3e 3c 70 72 65 3e 0a 20     @ <hr><pre>. 
3cd0: 20 20 20 40 20 25 68 28 62 6c 6f 62 5f 73 74 72     @ %h(blob_str
3ce0: 28 26 74 6b 74 63 68 6e 67 29 29 0a 20 20 20 20  (&tktchng)).    
3cf0: 40 20 3c 2f 70 72 65 3e 3c 68 72 3e 0a 20 20 20  @ </pre><hr>.   
3d00: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 74 6b 74 63   blob_zero(&tktc
3d10: 68 6e 67 29 3b 0a 20 20 20 20 53 62 53 5f 50 6f  hng);.    SbS_Po
3d20: 70 28 70 2c 20 31 29 3b 0a 20 20 20 20 72 65 74  p(p, 1);.    ret
3d30: 75 72 6e 20 53 42 53 5f 4f 4b 3b 0a 23 65 6e 64  urn SBS_OK;.#end
3d40: 69 66 0a 0a 20 20 20 20 72 69 64 20 3d 20 63 6f  if..    rid = co
3d50: 6e 74 65 6e 74 5f 70 75 74 28 26 74 6b 74 63 68  ntent_put(&tktch
3d60: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  ng, 0, 0);.    i
3d70: 66 28 20 72 69 64 3d 3d 30 20 29 7b 0a 20 20 20  f( rid==0 ){.   
3d80: 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28     fossil_panic(
3d90: 22 74 72 6f 75 62 6c 65 20 63 6f 6d 6d 69 74 74  "trouble committ
3da0: 69 6e 67 20 74 69 63 6b 65 74 3a 20 25 73 22 2c  ing ticket: %s",
3db0: 20 67 2e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20   g.zErrMsg);.   
3dc0: 20 7d 0a 20 20 20 20 6d 61 6e 69 66 65 73 74 5f   }.    manifest_
3dd0: 63 72 6f 73 73 6c 69 6e 6b 28 72 69 64 2c 20 26  crosslink(rid, &
3de0: 74 6b 74 63 68 6e 67 29 3b 0a 20 20 20 20 72 65  tktchng);.    re
3df0: 74 75 72 6e 20 53 42 53 5f 52 45 54 55 52 4e 3b  turn SBS_RETURN;
3e00: 0a 20 20 7d 0a 20 20 53 62 53 5f 50 6f 70 28 70  .  }.  SbS_Pop(p
3e10: 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 1);.  return S
3e20: 42 53 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  BS_OK;  .}../*.*
3e30: 2a 20 57 45 42 50 41 47 45 3a 20 74 6b 74 65 64  * WEBPAGE: tkted
3e40: 69 74 0a 2a 2f 0a 76 6f 69 64 20 74 6b 74 65 64  it.*/.void tkted
3e50: 69 74 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20  it_page(void){. 
3e60: 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a   char *zScript;.
3e70: 20 20 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20    int nScript;. 
3e80: 20 69 6e 74 20 63 68 6e 67 65 64 20 3d 20 30 3b   int chnged = 0;
3e90: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20  .  int nName;.  
3ea0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3eb0: 65 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 0a 0a  e;.  int nRec;..
3ec0: 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72    login_check_cr
3ed0: 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69  edentials();.  i
3ee0: 66 28 20 21 67 2e 6f 6b 41 70 6e 64 54 6b 74 20  f( !g.okApndTkt 
3ef0: 26 26 20 21 67 2e 6f 6b 57 72 54 6b 74 20 29 7b  && !g.okWrTkt ){
3f00: 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b   login_needed();
3f10: 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 73 74 79   return; }.  sty
3f20: 6c 65 5f 68 65 61 64 65 72 28 22 45 64 69 74 20  le_header("Edit 
3f30: 54 69 63 6b 65 74 22 29 3b 0a 20 20 7a 4e 61 6d  Ticket");.  zNam
3f40: 65 20 3d 20 50 28 22 6e 61 6d 65 22 29 3b 0a 20  e = P("name");. 
3f50: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c   if( zName==0 ||
3f60: 20 28 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e   (nName = strlen
3f70: 28 7a 4e 61 6d 65 29 29 3c 34 20 7c 7c 20 6e 4e  (zName))<4 || nN
3f80: 61 6d 65 3e 55 55 49 44 5f 53 49 5a 45 0a 20 20  ame>UUID_SIZE.  
3f90: 20 20 20 20 20 20 20 20 7c 7c 20 21 76 61 6c 69          || !vali
3fa0: 64 61 74 65 31 36 28 7a 4e 61 6d 65 2c 6e 4e 61  date16(zName,nNa
3fb0: 6d 65 29 20 29 7b 0a 20 20 20 20 40 20 3c 66 6f  me) ){.    @ <fo
3fc0: 6e 74 20 63 6f 6c 6f 72 3d 22 72 65 64 22 3e 3c  nt color="red"><
3fd0: 62 3e 4e 6f 74 20 61 20 76 61 6c 69 64 20 74 69  b>Not a valid ti
3fe0: 63 6b 65 74 20 69 64 3a 20 5c 22 25 68 28 7a 4e  cket id: \"%h(zN
3ff0: 61 6d 65 29 5c 22 3c 2f 62 3e 3c 2f 66 6f 6e 74  ame)\"</b></font
4000: 3e 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74  >.    style_foot
4010: 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  er();.    return
4020: 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20 3d 20 64  ;.  }.  nRec = d
4030: 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45 43 54  b_int(0, "SELECT
4040: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
4050: 69 63 6b 65 74 20 57 48 45 52 45 20 74 6b 74 5f  icket WHERE tkt_
4060: 75 75 69 64 20 47 4c 4f 42 20 27 25 71 2a 27 22  uuid GLOB '%q*'"
4070: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4080: 20 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20    zName);.  if( 
4090: 6e 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 40  nRec==0 ){.    @
40a0: 20 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 22 72 65   <font color="re
40b0: 64 22 3e 3c 62 3e 4e 6f 20 73 75 63 68 20 74 69  d"><b>No such ti
40c0: 63 6b 65 74 3a 20 5c 22 25 68 28 7a 4e 61 6d 65  cket: \"%h(zName
40d0: 29 5c 22 3c 2f 62 3e 3c 2f 66 6f 6e 74 3e 0a 20  )\"</b></font>. 
40e0: 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28     style_footer(
40f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
4100: 20 7d 0a 20 20 69 66 28 20 6e 52 65 63 3e 31 20   }.  if( nRec>1 
4110: 29 7b 0a 20 20 20 20 40 20 3c 66 6f 6e 74 20 63  ){.    @ <font c
4120: 6f 6c 6f 72 3d 22 72 65 64 22 3e 3c 62 3e 25 64  olor="red"><b>%d
4130: 28 6e 52 65 63 29 20 74 69 63 6b 65 74 73 20 62  (nRec) tickets b
4140: 65 67 69 6e 20 77 69 74 68 3a 20 5c 22 25 68 28  egin with: \"%h(
4150: 7a 4e 61 6d 65 29 5c 22 3c 2f 62 3e 3c 2f 66 6f  zName)\"</b></fo
4160: 6e 74 3e 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f  nt>.    style_fo
4170: 6f 74 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75  oter();.    retu
4180: 72 6e 3b 0a 20 20 7d 0a 20 20 74 69 63 6b 65 74  rn;.  }.  ticket
4190: 5f 69 6e 69 74 28 29 3b 0a 20 20 67 65 74 41 6c  _init();.  getAl
41a0: 6c 54 69 63 6b 65 74 46 69 65 6c 64 73 28 29 3b  lTicketFields();
41b0: 0a 20 20 69 6e 69 74 69 61 6c 69 7a 65 56 61 72  .  initializeVar
41c0: 69 61 62 6c 65 73 46 72 6f 6d 43 47 49 28 29 3b  iablesFromCGI();
41d0: 0a 20 20 69 6e 69 74 69 61 6c 69 7a 65 56 61 72  .  initializeVar
41e0: 69 61 62 6c 65 73 46 72 6f 6d 44 62 28 29 3b 0a  iablesFromDb();.
41f0: 20 20 40 20 3c 66 6f 72 6d 20 6d 65 74 68 6f 64    @ <form method
4200: 3d 22 50 4f 53 54 22 20 61 63 74 69 6f 6e 3d 22  ="POST" action="
4210: 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 74  %s(g.zBaseURL)/t
4220: 6b 74 65 64 69 74 22 3e 0a 20 20 40 20 3c 69 6e  ktedit">.  @ <in
4230: 70 75 74 20 74 79 70 65 3d 22 68 69 64 64 65 6e  put type="hidden
4240: 22 20 6e 61 6d 65 3d 22 6e 61 6d 65 22 20 76 61  " name="name" va
4250: 6c 75 65 3d 22 25 73 28 7a 4e 61 6d 65 29 22 3e  lue="%s(zName)">
4260: 0a 20 20 7a 53 63 72 69 70 74 20 3d 20 28 63 68  .  zScript = (ch
4270: 61 72 2a 29 53 62 53 5f 46 65 74 63 68 28 70 49  ar*)SbS_Fetch(pI
4280: 6e 74 65 72 70 2c 20 22 74 6b 74 65 64 69 74 5f  nterp, "tktedit_
4290: 74 65 6d 70 6c 61 74 65 22 2c 20 2d 31 2c 20 26  template", -1, &
42a0: 6e 53 63 72 69 70 74 29 3b 0a 20 20 7a 53 63 72  nScript);.  zScr
42b0: 69 70 74 20 3d 20 6d 70 72 69 6e 74 66 28 22 25  ipt = mprintf("%
42c0: 2e 2a 73 22 2c 20 6e 53 63 72 69 70 74 2c 20 7a  .*s", nScript, z
42d0: 53 63 72 69 70 74 29 3b 0a 20 20 53 62 53 5f 41  Script);.  SbS_A
42e0: 64 64 56 65 72 62 28 70 49 6e 74 65 72 70 2c 20  ddVerb(pInterp, 
42f0: 22 61 70 70 65 6e 64 5f 72 65 6d 61 72 6b 22 2c  "append_remark",
4300: 20 61 70 70 65 6e 64 52 65 6d 61 72 6b 43 6d 64   appendRemarkCmd
4310: 2c 20 30 29 3b 0a 20 20 53 62 53 5f 41 64 64 56  , 0);.  SbS_AddV
4320: 65 72 62 28 70 49 6e 74 65 72 70 2c 20 22 73 75  erb(pInterp, "su
4330: 62 6d 69 74 5f 74 69 63 6b 65 74 5f 63 68 61 6e  bmit_ticket_chan
4340: 67 65 22 2c 20 73 75 62 6d 69 74 45 64 69 74 43  ge", submitEditC
4350: 6d 64 2c 20 28 76 6f 69 64 2a 29 26 63 68 6e 67  md, (void*)&chng
4360: 65 64 29 3b 0a 20 20 69 66 28 20 53 62 53 5f 52  ed);.  if( SbS_R
4370: 65 6e 64 65 72 28 70 49 6e 74 65 72 70 2c 20 7a  ender(pInterp, z
4380: 53 63 72 69 70 74 29 3d 3d 53 42 53 5f 52 45 54  Script)==SBS_RET
4390: 55 52 4e 20 26 26 20 63 68 6e 67 65 64 20 29 7b  URN && chnged ){
43a0: 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72 65 63  .    cgi_redirec
43b0: 74 28 6d 70 72 69 6e 74 66 28 22 25 73 2f 74 6b  t(mprintf("%s/tk
43c0: 74 76 69 65 77 2f 25 73 22 2c 20 67 2e 7a 42 61  tview/%s", g.zBa
43d0: 73 65 55 52 4c 2c 20 7a 4e 61 6d 65 29 29 3b 0a  seURL, zName));.
43e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
43f0: 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20 73 74    @ </form>.  st
4400: 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a  yle_footer();.}.