Hex Artifact Content
Not logged in

Artifact a48490bf20e0a314b29d509409ea120161e26a55:

File src/tkt.c part of check-in [f46fe42d6d] - Store private ticket fields (ex: the originators email address) as their SHA1 hash so that malefactors cannot read them. Add the new "concealed" table to the repository database and store mappings from SHA1 hashes back to email addresses in that table. Ticket a24ec6005f. Note: run "rebuild" on repositories after updating to this version of fossil in order to create the "concealed" table. Need to add the ability to manage the concealed table from the web interface and the ability to sync concealed content between trusted repositories. by drh on 2008-07-24 02:04:36.

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 43 6f 6d  ed */../*.** Com
0580: 70 61 72 65 20 74 77 6f 20 65 6e 74 72 69 65 73  pare two entries
0590: 20 69 6e 20 61 7a 46 69 65 6c 64 20 66 6f 72 20   in azField for 
05a0: 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
05b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
05c0: 61 6d 65 43 6d 70 72 28 63 6f 6e 73 74 20 76 6f  ameCmpr(const vo
05d0: 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69  id *a, const voi
05e0: 64 20 2a 62 29 7b 0a 20 20 72 65 74 75 72 6e 20  d *b){.  return 
05f0: 73 74 72 63 6d 70 28 2a 28 63 68 61 72 2a 2a 29  strcmp(*(char**)
0600: 61 2c 20 2a 28 63 68 61 72 2a 2a 29 62 29 3b 0a  a, *(char**)b);.
0610: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
0620: 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 66 69  a list of all fi
0630: 65 6c 64 73 20 6f 66 20 74 68 65 20 54 49 43 4b  elds of the TICK
0640: 45 54 20 74 61 62 6c 65 2e 20 20 50 75 74 20 74  ET table.  Put t
0650: 68 65 6d 20 0a 2a 2a 20 69 6e 20 73 6f 72 74 65  hem .** in sorte
0660: 64 20 6f 72 64 65 72 20 69 6e 20 61 7a 46 69 65  d order in azFie
0670: 6c 64 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  ld[]..**.** Also
0680: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
0690: 66 6f 72 20 61 7a 56 61 6c 75 65 5b 5d 20 61 6e  for azValue[] an
06a0: 64 20 61 7a 41 70 70 65 6e 64 5b 5d 20 61 6e 64  d azAppend[] and
06b0: 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20 61   initialize.** a
06c0: 6c 6c 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ll the values th
06d0: 65 72 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  ere to zero..*/.
06e0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 41  static void getA
06f0: 6c 6c 54 69 63 6b 65 74 46 69 65 6c 64 73 28 76  llTicketFields(v
0700: 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a  oid){.  Stmt q;.
0710: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 6e    int i;.  if( n
0720: 46 69 65 6c 64 3e 30 20 29 20 72 65 74 75 72 6e  Field>0 ) return
0730: 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26  ;.  db_prepare(&
0740: 71 2c 20 22 50 52 41 47 4d 41 20 74 61 62 6c 65  q, "PRAGMA table
0750: 5f 69 6e 66 6f 28 74 69 63 6b 65 74 29 22 29 3b  _info(ticket)");
0760: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
0770: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
0780: 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  W ){.    const c
0790: 68 61 72 20 2a 7a 46 69 65 6c 64 20 3d 20 64 62  har *zField = db
07a0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
07b0: 20 31 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72   1);.    if( str
07c0: 6e 63 6d 70 28 7a 46 69 65 6c 64 2c 22 74 6b 74  ncmp(zField,"tkt
07d0: 5f 22 2c 34 29 3d 3d 30 20 29 20 63 6f 6e 74 69  _",4)==0 ) conti
07e0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  nue;.    if( nFi
07f0: 65 6c 64 25 31 30 3d 3d 30 20 29 7b 0a 20 20 20  eld%10==0 ){.   
0800: 20 20 20 61 7a 46 69 65 6c 64 20 3d 20 72 65 61     azField = rea
0810: 6c 6c 6f 63 28 61 7a 46 69 65 6c 64 2c 20 73 69  lloc(azField, si
0820: 7a 65 6f 66 28 61 7a 46 69 65 6c 64 29 2a 33 2a  zeof(azField)*3*
0830: 28 6e 46 69 65 6c 64 2b 31 30 29 20 29 3b 0a 20  (nField+10) );. 
0840: 20 20 20 20 20 69 66 28 20 61 7a 46 69 65 6c 64       if( azField
0850: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
0860: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6f 75 74  ossil_fatal("out
0870: 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
0880: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
0890: 61 7a 46 69 65 6c 64 5b 6e 46 69 65 6c 64 5d 20  azField[nField] 
08a0: 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  = mprintf("%s", 
08b0: 7a 46 69 65 6c 64 29 3b 0a 20 20 20 20 6e 46 69  zField);.    nFi
08c0: 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 5f  eld++;.  }.  db_
08d0: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
08e0: 71 73 6f 72 74 28 61 7a 46 69 65 6c 64 2c 20 6e  qsort(azField, n
08f0: 46 69 65 6c 64 2c 20 73 69 7a 65 6f 66 28 61 7a  Field, sizeof(az
0900: 46 69 65 6c 64 5b 30 5d 29 2c 20 6e 61 6d 65 43  Field[0]), nameC
0910: 6d 70 72 29 3b 0a 20 20 61 7a 41 70 70 65 6e 64  mpr);.  azAppend
0920: 20 3d 20 26 61 7a 46 69 65 6c 64 5b 6e 46 69 65   = &azField[nFie
0930: 6c 64 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 7a  ld];.  memset(az
0940: 41 70 70 65 6e 64 2c 20 30 2c 20 73 69 7a 65 6f  Append, 0, sizeo
0950: 66 28 61 7a 41 70 70 65 6e 64 5b 30 5d 29 2a 6e  f(azAppend[0])*n
0960: 46 69 65 6c 64 29 3b 0a 20 20 61 7a 56 61 6c 75  Field);.  azValu
0970: 65 20 3d 20 26 61 7a 41 70 70 65 6e 64 5b 6e 46  e = &azAppend[nF
0980: 69 65 6c 64 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ield];.  for(i=0
0990: 3b 20 69 3c 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  ; i<nField; i++)
09a0: 7b 0a 20 20 20 20 61 7a 56 61 6c 75 65 5b 69 5d  {.    azValue[i]
09b0: 20 3d 20 22 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = "";.  }.}../*
09c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
09d0: 6e 64 65 78 20 69 6e 74 6f 20 61 7a 46 69 65 6c  ndex into azFiel
09e0: 64 5b 5d 20 6f 66 20 74 68 65 20 67 69 76 65 6e  d[] of the given
09f0: 20 66 69 65 6c 64 20 6e 61 6d 65 2e 0a 2a 2a 20   field name..** 
0a00: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 7a 46 69  Return -1 if zFi
0a10: 65 6c 64 20 69 73 20 6e 6f 74 20 69 6e 20 61 7a  eld is not in az
0a20: 46 69 65 6c 64 5b 5d 2e 0a 2a 2f 0a 73 74 61 74  Field[]..*/.stat
0a30: 69 63 20 69 6e 74 20 66 69 65 6c 64 49 64 28 63  ic int fieldId(c
0a40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 65 6c  onst char *zFiel
0a50: 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  d){.  int i;.  f
0a60: 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64  or(i=0; i<nField
0a70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
0a80: 73 74 72 63 6d 70 28 61 7a 46 69 65 6c 64 5b 69  strcmp(azField[i
0a90: 5d 2c 20 7a 46 69 65 6c 64 29 3d 3d 30 20 29 20  ], zField)==0 ) 
0aa0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
0ab0: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
0ac0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 64 61  .** Query the da
0ad0: 74 61 62 61 73 65 20 66 6f 72 20 61 6c 6c 20 54  tabase for all T
0ae0: 49 43 4b 45 54 20 66 69 65 6c 64 73 20 66 6f 72  ICKET fields for
0af0: 20 74 68 65 20 73 70 65 63 69 66 69 63 0a 2a 2a   the specific.**
0b00: 20 74 69 63 6b 65 74 20 77 68 6f 73 65 20 6e 61   ticket whose na
0b10: 6d 65 20 69 73 20 67 69 76 65 6e 20 62 79 20 74  me is given by t
0b20: 68 65 20 22 6e 61 6d 65 22 20 43 47 49 20 70 61  he "name" CGI pa
0b30: 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 4c 6f 61 64  rameter..** Load
0b40: 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   the values for 
0b50: 61 6c 6c 20 66 69 65 6c 64 73 20 69 6e 74 6f 20  all fields into 
0b60: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
0b70: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6c 6f 61 64  .**.** Only load
0b80: 20 74 68 6f 73 65 20 66 69 65 6c 64 73 20 77 68   those fields wh
0b90: 69 63 68 20 64 6f 20 6e 6f 74 20 61 6c 72 65 61  ich do not alrea
0ba0: 64 79 20 65 78 69 73 74 20 61 73 0a 2a 2a 20 76  dy exist as.** v
0bb0: 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
0bc0: 46 69 65 6c 64 73 20 6f 66 20 74 68 65 20 54 49  Fields of the TI
0bd0: 43 4b 45 54 20 74 61 62 6c 65 20 74 68 61 74 20  CKET table that 
0be0: 62 65 67 69 6e 20 77 69 74 68 20 22 70 72 69 76  begin with "priv
0bf0: 61 74 65 5f 22 20 61 72 65 0a 2a 2a 20 65 78 70  ate_" are.** exp
0c00: 61 6e 64 65 64 20 75 73 69 6e 67 20 74 68 65 20  anded using the 
0c10: 64 62 5f 72 65 76 65 61 6c 28 29 20 66 75 6e 63  db_reveal() func
0c20: 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63  tion.  This func
0c30: 74 69 6f 6e 20 77 69 6c 6c 0a 2a 2a 20 64 65 63  tion will.** dec
0c40: 6f 64 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ode the content 
0c50: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6c 65  so that it is le
0c60: 67 61 62 6c 65 20 69 66 20 67 2e 6f 6b 52 64 41  gable if g.okRdA
0c70: 64 64 72 20 69 73 20 74 72 75 65 2e 0a 2a 2a 20  ddr is true..** 
0c80: 4f 74 68 65 72 77 69 73 65 2c 20 64 62 5f 72 65  Otherwise, db_re
0c90: 76 65 61 6c 28 29 20 69 73 20 61 20 6e 6f 2d 6f  veal() is a no-o
0ca0: 70 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  p and the conten
0cb0: 74 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 6f 62 73  t remains.** obs
0cc0: 63 75 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  cured..*/.static
0cd0: 20 76 6f 69 64 20 69 6e 69 74 69 61 6c 69 7a 65   void initialize
0ce0: 56 61 72 69 61 62 6c 65 73 46 72 6f 6d 44 62 28  VariablesFromDb(
0cf0: 76 6f 69 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63  void){.  const c
0d00: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 53 74  har *zName;.  St
0d10: 6d 74 20 71 3b 0a 20 20 69 6e 74 20 69 2c 20 6e  mt q;.  int i, n
0d20: 2c 20 73 69 7a 65 2c 20 6a 3b 0a 0a 20 20 7a 4e  , size, j;..  zN
0d30: 61 6d 65 20 3d 20 50 44 28 22 6e 61 6d 65 22 2c  ame = PD("name",
0d40: 22 2d 6e 6f 6e 65 2d 22 29 3b 0a 20 20 64 62 5f  "-none-");.  db_
0d50: 70 72 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c  prepare(&q, "SEL
0d60: 45 43 54 20 64 61 74 65 74 69 6d 65 28 74 6b 74  ECT datetime(tkt
0d70: 5f 6d 74 69 6d 65 29 20 41 53 20 74 6b 74 5f 64  _mtime) AS tkt_d
0d80: 61 74 65 74 69 6d 65 2c 20 2a 22 0a 20 20 20 20  atetime, *".    
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
0da0: 46 52 4f 4d 20 74 69 63 6b 65 74 20 57 48 45 52  FROM ticket WHER
0db0: 45 20 74 6b 74 5f 75 75 69 64 20 47 4c 4f 42 20  E tkt_uuid GLOB 
0dc0: 27 25 71 2a 27 22 2c 20 7a 4e 61 6d 65 29 3b 0a  '%q*'", zName);.
0dd0: 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 71    if( db_step(&q
0de0: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
0df0: 0a 20 20 20 20 6e 20 3d 20 64 62 5f 63 6f 6c 75  .    n = db_colu
0e00: 6d 6e 5f 63 6f 75 6e 74 28 26 71 29 3b 0a 20 20  mn_count(&q);.  
0e10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
0e20: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  i++){.      cons
0e30: 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 64  t char *zVal = d
0e40: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
0e50: 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , i);.      cons
0e60: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
0e70: 64 62 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 26  db_column_name(&
0e80: 71 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61  q, i);.      cha
0e90: 72 20 2a 7a 52 65 76 65 61 6c 65 64 20 3d 20 30  r *zRevealed = 0
0ea0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 56 61 6c  ;.      if( zVal
0eb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
0ec0: 56 61 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  Val = "";.      
0ed0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
0ee0: 70 28 7a 4e 61 6d 65 2c 20 22 70 72 69 76 61 74  p(zName, "privat
0ef0: 65 5f 22 2c 20 38 29 3d 3d 30 20 29 7b 0a 20 20  e_", 8)==0 ){.  
0f00: 20 20 20 20 20 20 7a 56 61 6c 20 3d 20 7a 52 65        zVal = zRe
0f10: 76 65 61 6c 65 64 20 3d 20 64 62 5f 72 65 76 65  vealed = db_reve
0f20: 61 6c 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  al(zVal);.      
0f30: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
0f40: 20 6a 3c 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b   j<nField; j++){
0f50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
0f60: 63 6d 70 28 61 7a 46 69 65 6c 64 5b 6a 5d 2c 7a  cmp(azField[j],z
0f70: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
0f80: 20 20 20 20 20 20 61 7a 56 61 6c 75 65 5b 6a 5d        azValue[j]
0f90: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c   = mprintf("%s",
0fa0: 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   zVal);.        
0fb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
0fc0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
0fd0: 20 69 66 28 20 54 68 5f 46 65 74 63 68 28 7a 4e   if( Th_Fetch(zN
0fe0: 61 6d 65 2c 20 26 73 69 7a 65 29 3d 3d 30 20 29  ame, &size)==0 )
0ff0: 7b 0a 20 20 20 20 20 20 20 20 54 68 5f 53 74 6f  {.        Th_Sto
1000: 72 65 28 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3b  re(zName, zVal);
1010: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1020: 72 65 65 28 7a 52 65 76 65 61 6c 65 64 29 3b 0a  ree(zRevealed);.
1030: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1040: 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26     db_finalize(&
1050: 71 29 3b 0a 20 20 20 20 64 62 5f 70 72 65 70 61  q);.    db_prepa
1060: 72 65 28 26 71 2c 20 22 50 52 41 47 4d 41 20 74  re(&q, "PRAGMA t
1070: 61 62 6c 65 5f 69 6e 66 6f 28 74 69 63 6b 65 74  able_info(ticket
1080: 29 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  )");.    while( 
1090: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c  db_step(&q)==SQL
10a0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
10b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
10c0: 65 6c 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  eld = db_column_
10d0: 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 20 20  text(&q, 1);.   
10e0: 20 20 20 69 66 28 20 54 68 5f 46 65 74 63 68 28     if( Th_Fetch(
10f0: 7a 46 69 65 6c 64 2c 20 26 73 69 7a 65 29 3d 3d  zField, &size)==
1100: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 54 68 5f  0 ){.        Th_
1110: 53 74 6f 72 65 28 7a 46 69 65 6c 64 2c 20 22 22  Store(zField, ""
1120: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1130: 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69  .  }.  db_finali
1140: 7a 65 28 26 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ze(&q);.}../*.**
1150: 20 54 72 61 6e 73 66 65 72 20 61 6c 6c 20 43 47   Transfer all CG
1160: 49 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20  I parameters to 
1170: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65  variables in the
1180: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f   interpreter..*/
1190: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69  .static void ini
11a0: 74 69 61 6c 69 7a 65 56 61 72 69 61 62 6c 65 73  tializeVariables
11b0: 46 72 6f 6d 43 47 49 28 76 6f 69 64 29 7b 0a 20  FromCGI(void){. 
11c0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
11d0: 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 66 6f 72 28  char *z;..  for(
11e0: 69 3d 30 3b 20 28 7a 20 3d 20 63 67 69 5f 70 61  i=0; (z = cgi_pa
11f0: 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 69 29 29  rameter_name(i))
1200: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  !=0; i++){.    T
1210: 68 5f 53 74 6f 72 65 28 7a 2c 20 50 28 7a 29 29  h_Store(z, P(z))
1220: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1230: 65 62 75 69 6c 64 20 61 6c 6c 20 74 69 63 6b 65  ebuild all ticke
1240: 74 73 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20  ts named in the 
1250: 5f 70 65 6e 64 69 6e 67 5f 74 69 63 6b 65 74 20  _pending_ticket 
1260: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  table..**.** Thi
1270: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1280: 6c 65 64 20 6a 75 73 74 20 70 72 69 6f 72 20 74  led just prior t
1290: 6f 20 63 6f 6d 6d 69 74 20 61 66 74 65 72 20 6e  o commit after n
12a0: 65 77 0a 2a 2a 20 6f 75 74 2d 6f 66 2d 73 65 71  ew.** out-of-seq
12b0: 75 65 6e 63 65 20 74 69 63 6b 65 74 20 63 68 61  uence ticket cha
12c0: 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 61  nges have been a
12d0: 64 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dded..*/.static 
12e0: 69 6e 74 20 74 69 63 6b 65 74 5f 72 65 62 75 69  int ticket_rebui
12f0: 6c 64 5f 61 74 5f 63 6f 6d 6d 69 74 28 76 6f 69  ld_at_commit(voi
1300: 64 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20  d){.  Stmt q;.  
1310: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20  db_multi_exec(. 
1320: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
1330: 74 69 63 6b 65 74 20 57 48 45 52 45 20 74 6b 74  ticket WHERE tkt
1340: 5f 75 75 69 64 20 49 4e 20 5f 70 65 6e 64 69 6e  _uuid IN _pendin
1350: 67 5f 74 69 63 6b 65 74 22 0a 20 20 29 3b 0a 20  g_ticket".  );. 
1360: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20   db_prepare(&q, 
1370: 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f  "SELECT uuid FRO
1380: 4d 20 5f 70 65 6e 64 69 6e 67 5f 74 69 63 6b 65  M _pending_ticke
1390: 74 22 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62  t");.  while( db
13a0: 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54  _step(&q)==SQLIT
13b0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e  E_ROW ){.    con
13c0: 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d  st char *zUuid =
13d0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
13e0: 26 71 2c 20 30 29 3b 0a 20 20 20 20 74 69 63 6b  &q, 0);.    tick
13f0: 65 74 5f 72 65 62 75 69 6c 64 5f 65 6e 74 72 79  et_rebuild_entry
1400: 28 7a 55 75 69 64 29 3b 0a 20 20 7d 0a 20 20 64  (zUuid);.  }.  d
1410: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20  b_multi_exec(.  
1420: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 5f    "DELETE FROM _
1430: 70 65 6e 64 69 6e 67 5f 74 69 63 6b 65 74 22 0a  pending_ticket".
1440: 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b    );.  return 0;
1450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
1460: 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
1470: 20 54 49 43 4b 45 54 20 74 61 62 6c 65 20 61 63   TICKET table ac
1480: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 69  cording to the i
1490: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e  nformation.** in
14a0: 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 66 69 6c   the control fil
14b0: 65 20 67 69 76 65 6e 20 69 6e 20 70 2e 20 20 41  e given in p.  A
14c0: 74 74 65 6d 70 74 20 74 6f 20 63 72 65 61 74 65  ttempt to create
14d0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
14e0: 0a 2a 2a 20 54 49 43 4b 45 54 20 74 61 62 6c 65  .** TICKET table
14f0: 20 65 6e 74 72 79 20 69 66 20 63 72 65 61 74 65   entry if create
1500: 46 6c 61 67 20 69 73 20 74 72 75 65 2e 20 20 49  Flag is true.  I
1510: 66 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20  f createFlag is 
1520: 66 61 6c 73 65 2c 0a 2a 2a 20 74 68 61 74 20 6d  false,.** that m
1530: 65 61 6e 73 20 77 65 20 61 6c 72 65 61 64 79 20  eans we already 
1540: 6b 6e 6f 77 20 74 68 65 20 65 6e 74 72 79 20 65  know the entry e
1550: 78 69 73 74 73 20 61 6e 64 20 73 6f 20 77 65 20  xists and so we 
1560: 63 61 6e 20 73 61 76 65 20 74 68 65 0a 2a 2a 20  can save the.** 
1570: 77 6f 72 6b 20 6f 66 20 74 72 79 69 6e 67 20 74  work of trying t
1580: 6f 20 63 72 65 61 74 65 20 69 74 2e 0a 2a 2f 0a  o create it..*/.
1590: 76 6f 69 64 20 74 69 63 6b 65 74 5f 69 6e 73 65  void ticket_inse
15a0: 72 74 28 4d 61 6e 69 66 65 73 74 20 2a 70 2c 20  rt(Manifest *p, 
15b0: 69 6e 74 20 63 72 65 61 74 65 46 6c 61 67 2c 20  int createFlag, 
15c0: 69 6e 74 20 63 68 65 63 6b 54 69 6d 65 29 7b 0a  int checkTime){.
15d0: 20 20 42 6c 6f 62 20 73 71 6c 3b 0a 20 20 53 74    Blob sql;.  St
15e0: 6d 74 20 71 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  mt q;.  int i;. 
15f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
1600: 70 3b 0a 0a 20 20 67 65 74 41 6c 6c 54 69 63 6b  p;..  getAllTick
1610: 65 74 46 69 65 6c 64 73 28 29 3b 0a 20 20 69 66  etFields();.  if
1620: 28 20 63 72 65 61 74 65 46 6c 61 67 20 29 7b 20  ( createFlag ){ 
1630: 20 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65   .    db_multi_e
1640: 78 65 63 28 22 49 4e 53 45 52 54 20 4f 52 20 49  xec("INSERT OR I
1650: 47 4e 4f 52 45 20 49 4e 54 4f 20 74 69 63 6b 65  GNORE INTO ticke
1660: 74 28 74 6b 74 5f 75 75 69 64 2c 20 74 6b 74 5f  t(tkt_uuid, tkt_
1670: 6d 74 69 6d 65 29 20 22 0a 20 20 20 20 20 20 20  mtime) ".       
1680: 20 20 20 20 20 20 20 20 20 20 20 22 56 41 4c 55             "VALU
1690: 45 53 28 25 51 2c 20 30 29 22 2c 20 70 2d 3e 7a  ES(%Q, 0)", p->z
16a0: 54 69 63 6b 65 74 55 75 69 64 29 3b 0a 20 20 7d  TicketUuid);.  }
16b0: 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 71  .  blob_zero(&sq
16c0: 6c 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e  l);.  blob_appen
16d0: 64 66 28 26 73 71 6c 2c 20 22 55 50 44 41 54 45  df(&sql, "UPDATE
16e0: 20 4f 52 20 52 45 50 4c 41 43 45 20 74 69 63 6b   OR REPLACE tick
16f0: 65 74 20 53 45 54 20 74 6b 74 5f 6d 74 69 6d 65  et SET tkt_mtime
1700: 3d 3a 6d 74 69 6d 65 22 29 3b 0a 20 20 7a 53 65  =:mtime");.  zSe
1710: 70 20 3d 20 22 53 45 54 22 3b 0a 20 20 66 6f 72  p = "SET";.  for
1720: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c  (i=0; i<p->nFiel
1730: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  d; i++){.    con
1740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
1750: 20 70 2d 3e 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e   p->aField[i].zN
1760: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  ame;.    if( zNa
1770: 6d 65 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20  me[0]=='+' ){.  
1780: 20 20 20 20 7a 4e 61 6d 65 2b 2b 3b 0a 20 20 20      zName++;.   
1790: 20 20 20 69 66 28 20 66 69 65 6c 64 49 64 28 7a     if( fieldId(z
17a0: 4e 61 6d 65 29 3c 30 20 29 20 63 6f 6e 74 69 6e  Name)<0 ) contin
17b0: 75 65 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61  ue;.      blob_a
17c0: 70 70 65 6e 64 66 28 26 73 71 6c 2c 22 2c 20 25  ppendf(&sql,", %
17d0: 73 3d 25 73 20 7c 7c 20 25 51 22 2c 20 7a 4e 61  s=%s || %Q", zNa
17e0: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 61 46  me, zName, p->aF
17f0: 69 65 6c 64 5b 69 5d 2e 7a 56 61 6c 75 65 29 3b  ield[i].zValue);
1800: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1810: 20 20 69 66 28 20 66 69 65 6c 64 49 64 28 7a 4e    if( fieldId(zN
1820: 61 6d 65 29 3c 30 20 29 20 63 6f 6e 74 69 6e 75  ame)<0 ) continu
1830: 65 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  e;.      blob_ap
1840: 70 65 6e 64 66 28 26 73 71 6c 2c 22 2c 20 25 73  pendf(&sql,", %s
1850: 3d 25 51 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e  =%Q", zName, p->
1860: 61 46 69 65 6c 64 5b 69 5d 2e 7a 56 61 6c 75 65  aField[i].zValue
1870: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62  );.    }.  }.  b
1880: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 71 6c  lob_appendf(&sql
1890: 2c 20 22 20 57 48 45 52 45 20 74 6b 74 5f 75 75  , " WHERE tkt_uu
18a0: 69 64 3d 27 25 73 27 20 41 4e 44 20 74 6b 74 5f  id='%s' AND tkt_
18b0: 6d 74 69 6d 65 3c 3a 6d 74 69 6d 65 22 2c 0a 20  mtime<:mtime",. 
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 70 2d 3e 7a 54 69 63 6b 65 74 55 75      p->zTicketUu
18e0: 69 64 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72  id);.  db_prepar
18f0: 65 28 26 71 2c 20 22 25 73 22 2c 20 62 6c 6f 62  e(&q, "%s", blob
1900: 5f 73 74 72 28 26 73 71 6c 29 29 3b 0a 20 20 64  _str(&sql));.  d
1910: 62 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 26 71  b_bind_double(&q
1920: 2c 20 22 3a 6d 74 69 6d 65 22 2c 20 70 2d 3e 72  , ":mtime", p->r
1930: 44 61 74 65 29 3b 0a 20 20 64 62 5f 73 74 65 70  Date);.  db_step
1940: 28 26 71 29 3b 0a 20 20 64 62 5f 66 69 6e 61 6c  (&q);.  db_final
1950: 69 7a 65 28 26 71 29 3b 0a 20 20 69 66 28 20 63  ize(&q);.  if( c
1960: 68 65 63 6b 54 69 6d 65 20 26 26 20 64 62 5f 63  heckTime && db_c
1970: 68 61 6e 67 65 73 28 29 3d 3d 30 20 29 7b 0a 20  hanges()==0 ){. 
1980: 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73     static int is
1990: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Init = 0;.    if
19a0: 28 20 21 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  ( !isInit ){.   
19b0: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
19c0: 28 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41  ("CREATE TEMP TA
19d0: 42 4c 45 20 5f 70 65 6e 64 69 6e 67 5f 74 69 63  BLE _pending_tic
19e0: 6b 65 74 28 75 75 69 64 20 54 45 58 54 20 55 4e  ket(uuid TEXT UN
19f0: 49 51 55 45 29 22 29 3b 0a 20 20 20 20 20 20 64  IQUE)");.      d
1a00: 62 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 74 69  b_commit_hook(ti
1a10: 63 6b 65 74 5f 72 65 62 75 69 6c 64 5f 61 74 5f  cket_rebuild_at_
1a20: 63 6f 6d 6d 69 74 2c 20 31 29 3b 0a 20 20 20 20  commit, 1);.    
1a30: 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20    isInit = 1;.  
1a40: 20 20 7d 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69    }.    db_multi
1a50: 5f 65 78 65 63 28 22 49 4e 53 45 52 54 20 4f 52  _exec("INSERT OR
1a60: 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 5f 70 65   IGNORE INTO _pe
1a70: 6e 64 69 6e 67 5f 74 69 63 6b 65 74 20 22 0a 20  nding_ticket ". 
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 22 56 41 4c 55 45 53 28 25 51 29 22 2c 20 70   "VALUES(%Q)", p
1aa0: 2d 3e 7a 54 69 63 6b 65 74 55 75 69 64 29 3b 0a  ->zTicketUuid);.
1ab0: 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74    }.  blob_reset
1ac0: 28 26 73 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (&sql);.}../*.**
1ad0: 20 52 65 62 75 69 6c 64 20 61 6e 20 65 6e 74 69   Rebuild an enti
1ae0: 72 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  re entry in the 
1af0: 54 49 43 4b 45 54 20 74 61 62 6c 65 0a 2a 2f 0a  TICKET table.*/.
1b00: 76 6f 69 64 20 74 69 63 6b 65 74 5f 72 65 62 75  void ticket_rebu
1b10: 69 6c 64 5f 65 6e 74 72 79 28 63 6f 6e 73 74 20  ild_entry(const 
1b20: 63 68 61 72 20 2a 7a 54 6b 74 55 75 69 64 29 7b  char *zTktUuid){
1b30: 0a 20 20 63 68 61 72 20 2a 7a 54 61 67 20 3d 20  .  char *zTag = 
1b40: 6d 70 72 69 6e 74 66 28 22 74 6b 74 2d 25 73 22  mprintf("tkt-%s"
1b50: 2c 20 7a 54 6b 74 55 75 69 64 29 3b 0a 20 20 69  , zTktUuid);.  i
1b60: 6e 74 20 74 61 67 69 64 20 3d 20 74 61 67 5f 66  nt tagid = tag_f
1b70: 69 6e 64 69 64 28 7a 54 61 67 2c 20 31 29 3b 0a  indid(zTag, 1);.
1b80: 20 20 53 74 6d 74 20 71 3b 0a 20 20 4d 61 6e 69    Stmt q;.  Mani
1b90: 66 65 73 74 20 6d 61 6e 69 66 65 73 74 3b 0a 20  fest manifest;. 
1ba0: 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20   Blob content;. 
1bb0: 20 69 6e 74 20 63 72 65 61 74 65 46 6c 61 67 20   int createFlag 
1bc0: 3d 20 31 3b 0a 20 20 0a 20 20 64 62 5f 6d 75 6c  = 1;.  .  db_mul
1bd0: 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 22 44  ti_exec(.     "D
1be0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 69 63 6b 65  ELETE FROM ticke
1bf0: 74 20 57 48 45 52 45 20 74 6b 74 5f 75 75 69 64  t WHERE tkt_uuid
1c00: 3d 25 51 22 2c 20 7a 54 6b 74 55 75 69 64 0a 20  =%Q", zTktUuid. 
1c10: 20 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65   );.  db_prepare
1c20: 28 26 71 2c 20 22 53 45 4c 45 43 54 20 72 69 64  (&q, "SELECT rid
1c30: 20 46 52 4f 4d 20 74 61 67 78 72 65 66 20 57 48   FROM tagxref WH
1c40: 45 52 45 20 74 61 67 69 64 3d 25 64 20 4f 52 44  ERE tagid=%d ORD
1c50: 45 52 20 42 59 20 6d 74 69 6d 65 22 2c 74 61 67  ER BY mtime",tag
1c60: 69 64 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62  id);.  while( db
1c70: 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54  _step(&q)==SQLIT
1c80: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74  E_ROW ){.    int
1c90: 20 72 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e   rid = db_column
1ca0: 5f 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 20  _int(&q, 0);.   
1cb0: 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69 64   content_get(rid
1cc0: 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  , &content);.   
1cd0: 20 6d 61 6e 69 66 65 73 74 5f 70 61 72 73 65 28   manifest_parse(
1ce0: 26 6d 61 6e 69 66 65 73 74 2c 20 26 63 6f 6e 74  &manifest, &cont
1cf0: 65 6e 74 29 3b 0a 20 20 20 20 74 69 63 6b 65 74  ent);.    ticket
1d00: 5f 69 6e 73 65 72 74 28 26 6d 61 6e 69 66 65 73  _insert(&manifes
1d10: 74 2c 20 63 72 65 61 74 65 46 6c 61 67 2c 20 30  t, createFlag, 0
1d20: 29 3b 0a 20 20 20 20 6d 61 6e 69 66 65 73 74 5f  );.    manifest_
1d30: 63 6c 65 61 72 28 26 6d 61 6e 69 66 65 73 74 29  clear(&manifest)
1d40: 3b 0a 20 20 20 20 63 72 65 61 74 65 46 6c 61 67  ;.    createFlag
1d50: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 64 62 5f 66   = 0;.  }.  db_f
1d60: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 7d 0a 0a  inalize(&q);.}..
1d70: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
1d80: 20 73 75 62 73 63 72 69 70 74 20 69 6e 74 65 72   subscript inter
1d90: 70 72 65 74 65 72 20 61 6e 64 20 6c 6f 61 64 20  preter and load 
1da0: 74 68 65 20 22 63 6f 6d 6d 6f 6e 22 20 63 6f 64  the "common" cod
1db0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 74 69 63 6b 65  e..*/.void ticke
1dc0: 74 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  t_init(void){.  
1dd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e  const char *zCon
1de0: 66 69 67 3b 0a 20 20 54 68 5f 46 6f 73 73 69 6c  fig;.  Th_Fossil
1df0: 49 6e 69 74 28 29 3b 0a 20 20 7a 43 6f 6e 66 69  Init();.  zConfi
1e00: 67 20 3d 20 74 69 63 6b 65 74 5f 63 6f 6d 6d 6f  g = ticket_commo
1e10: 6e 5f 63 6f 64 65 28 29 3b 0a 20 20 54 68 5f 45  n_code();.  Th_E
1e20: 76 61 6c 28 67 2e 69 6e 74 65 72 70 2c 20 30 2c  val(g.interp, 0,
1e30: 20 28 63 6f 6e 73 74 20 75 63 68 61 72 2a 29 7a   (const uchar*)z
1e40: 43 6f 6e 66 69 67 2c 20 2d 31 29 3b 0a 7d 0a 0a  Config, -1);.}..
1e50: 2f 2a 0a 2a 2a 20 52 65 63 72 65 61 74 65 20 74  /*.** Recreate t
1e60: 68 65 20 74 69 63 6b 65 74 20 74 61 62 6c 65 2e  he ticket table.
1e70: 0a 2a 2f 0a 76 6f 69 64 20 74 69 63 6b 65 74 5f  .*/.void ticket_
1e80: 63 72 65 61 74 65 5f 74 61 62 6c 65 28 69 6e 74  create_table(int
1e90: 20 73 65 70 61 72 61 74 65 43 6f 6e 6e 65 63 74   separateConnect
1ea0: 69 6f 6e 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  ion){.  const ch
1eb0: 61 72 20 2a 7a 53 71 6c 3b 0a 0a 20 20 64 62 5f  ar *zSql;..  db_
1ec0: 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 52 4f 50  multi_exec("DROP
1ed0: 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
1ee0: 20 74 69 63 6b 65 74 3b 22 29 3b 0a 20 20 7a 53   ticket;");.  zS
1ef0: 71 6c 20 3d 20 74 69 63 6b 65 74 5f 74 61 62 6c  ql = ticket_tabl
1f00: 65 5f 73 63 68 65 6d 61 28 29 3b 0a 20 20 69 66  e_schema();.  if
1f10: 28 20 73 65 70 61 72 61 74 65 43 6f 6e 6e 65 63  ( separateConnec
1f20: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 64 62 5f 69  tion ){.    db_i
1f30: 6e 69 74 5f 64 61 74 61 62 61 73 65 28 67 2e 7a  nit_database(g.z
1f40: 52 65 70 6f 73 69 74 6f 72 79 4e 61 6d 65 2c 20  RepositoryName, 
1f50: 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  zSql, 0);.  }els
1f60: 65 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  e{.    db_multi_
1f70: 65 78 65 63 28 22 25 73 22 2c 20 7a 53 71 6c 29  exec("%s", zSql)
1f80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1f90: 65 70 6f 70 75 6c 61 74 65 20 74 68 65 20 74 69  epopulate the ti
1fa0: 63 6b 65 74 20 74 61 62 6c 65 0a 2a 2f 0a 76 6f  cket table.*/.vo
1fb0: 69 64 20 74 69 63 6b 65 74 5f 72 65 62 75 69 6c  id ticket_rebuil
1fc0: 64 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20  d(void){.  Stmt 
1fd0: 71 3b 0a 20 20 74 69 63 6b 65 74 5f 63 72 65 61  q;.  ticket_crea
1fe0: 74 65 5f 74 61 62 6c 65 28 31 29 3b 0a 20 20 64  te_table(1);.  d
1ff0: 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  b_begin_transact
2000: 69 6f 6e 28 29 3b 0a 20 20 64 62 5f 70 72 65 70  ion();.  db_prep
2010: 61 72 65 28 26 71 2c 22 53 45 4c 45 43 54 20 74  are(&q,"SELECT t
2020: 61 67 6e 61 6d 65 20 46 52 4f 4d 20 74 61 67 20  agname FROM tag 
2030: 57 48 45 52 45 20 74 61 67 6e 61 6d 65 20 47 4c  WHERE tagname GL
2040: 4f 42 20 27 74 6b 74 2d 2a 27 22 29 3b 0a 20 20  OB 'tkt-*'");.  
2050: 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26  while( db_step(&
2060: 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  q)==SQLITE_ROW )
2070: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2080: 20 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c   *zName = db_col
2090: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b  umn_text(&q, 0);
20a0: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
20b0: 20 20 7a 4e 61 6d 65 20 2b 3d 20 34 3b 0a 20 20    zName += 4;.  
20c0: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
20d0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6c  Name);.    if( l
20e0: 65 6e 3c 32 30 20 7c 7c 20 21 76 61 6c 69 64 61  en<20 || !valida
20f0: 74 65 31 36 28 7a 4e 61 6d 65 2c 20 6c 65 6e 29  te16(zName, len)
2100: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2110: 20 74 69 63 6b 65 74 5f 72 65 62 75 69 6c 64 5f   ticket_rebuild_
2120: 65 6e 74 72 79 28 7a 4e 61 6d 65 29 3b 0a 20 20  entry(zName);.  
2130: 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28  }.  db_finalize(
2140: 26 71 29 3b 0a 20 20 64 62 5f 65 6e 64 5f 74 72  &q);.  db_end_tr
2150: 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 7d 0a  ansaction(0);.}.
2160: 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20  ./*.** WEBPAGE: 
2170: 74 6b 74 76 69 65 77 0a 2a 2a 20 55 52 4c 3a 20  tktview.** URL: 
2180: 20 74 6b 74 76 69 65 77 3f 6e 61 6d 65 3d 55 55   tktview?name=UU
2190: 49 44 0a 2a 2a 0a 2a 2a 20 56 69 65 77 20 61 20  ID.**.** View a 
21a0: 74 69 63 6b 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ticket..*/.void 
21b0: 74 6b 74 76 69 65 77 5f 70 61 67 65 28 76 6f 69  tktview_page(voi
21c0: 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  d){.  const char
21d0: 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 6c 6f 67   *zScript;.  log
21e0: 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74  in_check_credent
21f0: 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67  ials();.  if( !g
2200: 2e 6f 6b 52 64 54 6b 74 20 29 7b 20 6c 6f 67 69  .okRdTkt ){ logi
2210: 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74 75  n_needed(); retu
2220: 72 6e 3b 20 7d 0a 20 20 69 66 28 20 67 2e 6f 6b  rn; }.  if( g.ok
2230: 57 72 54 6b 74 20 29 7b 0a 20 20 20 20 73 74 79  WrTkt ){.    sty
2240: 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65  le_submenu_eleme
2250: 6e 74 28 22 45 64 69 74 22 2c 20 22 45 64 69 74  nt("Edit", "Edit
2260: 20 54 68 65 20 54 69 63 6b 65 74 22 2c 20 22 25   The Ticket", "%
2270: 73 2f 74 6b 74 65 64 69 74 3f 6e 61 6d 65 3d 25  s/tktedit?name=%
2280: 54 22 2c 0a 20 20 20 20 20 20 20 20 67 2e 7a 54  T",.        g.zT
2290: 6f 70 2c 20 50 44 28 22 6e 61 6d 65 22 2c 22 22  op, PD("name",""
22a0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e  ));.  }.  if( g.
22b0: 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20 20 20  okHistory ){.   
22c0: 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65   style_submenu_e
22d0: 6c 65 6d 65 6e 74 28 22 48 69 73 74 6f 72 79 22  lement("History"
22e0: 2c 20 22 48 69 73 74 6f 72 79 20 4f 66 20 54 68  , "History Of Th
22f0: 69 73 20 54 69 63 6b 65 74 22 2c 20 0a 20 20 20  is Ticket", .   
2300: 20 20 20 20 20 22 25 73 2f 74 6b 74 68 69 73 74       "%s/tkthist
2310: 6f 72 79 2f 25 54 22 2c 20 67 2e 7a 54 6f 70 2c  ory/%T", g.zTop,
2320: 20 50 44 28 22 6e 61 6d 65 22 2c 22 22 29 29 3b   PD("name",""));
2330: 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61  .  }.  style_hea
2340: 64 65 72 28 22 56 69 65 77 20 54 69 63 6b 65 74  der("View Ticket
2350: 22 29 3b 0a 20 20 74 69 63 6b 65 74 5f 69 6e 69  ");.  ticket_ini
2360: 74 28 29 3b 0a 20 20 69 6e 69 74 69 61 6c 69 7a  t();.  initializ
2370: 65 56 61 72 69 61 62 6c 65 73 46 72 6f 6d 44 62  eVariablesFromDb
2380: 28 29 3b 0a 20 20 7a 53 63 72 69 70 74 20 3d 20  ();.  zScript = 
2390: 74 69 63 6b 65 74 5f 76 69 65 77 70 61 67 65 5f  ticket_viewpage_
23a0: 63 6f 64 65 28 29 3b 0a 20 20 54 68 5f 52 65 6e  code();.  Th_Ren
23b0: 64 65 72 28 7a 53 63 72 69 70 74 29 3b 0a 20 20  der(zScript);.  
23c0: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
23d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 48 20 63 6f 6d 6d  }../*.** TH comm
23e0: 61 6e 64 3a 20 20 20 61 70 70 65 6e 64 5f 66 69  and:   append_fi
23f0: 65 6c 64 20 46 49 45 4c 44 20 53 54 52 49 4e 47  eld FIELD STRING
2400: 0a 2a 2a 0a 2a 2a 20 46 49 45 4c 44 20 69 73 20  .**.** FIELD is 
2410: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61  the name of a da
2420: 74 61 62 61 73 65 20 63 6f 6c 75 6d 6e 20 74 6f  tabase column to
2430: 20 77 68 69 63 68 20 77 65 20 6d 69 67 68 74 20   which we might 
2440: 77 61 6e 74 0a 2a 2a 20 74 6f 20 61 70 70 65 6e  want.** to appen
2450: 64 20 74 65 78 74 2e 20 20 53 54 52 49 4e 47 20  d text.  STRING 
2460: 69 73 20 74 68 65 20 74 65 78 74 20 74 6f 20 62  is the text to b
2470: 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
2480: 61 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 54  at.** column.  T
2490: 68 65 20 61 70 70 65 6e 64 20 64 6f 65 73 20 6e  he append does n
24a0: 6f 74 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75  ot actually occu
24b0: 72 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 73  r until the.** s
24c0: 75 62 6d 69 74 5f 74 69 63 6b 65 74 20 63 6f 6d  ubmit_ticket com
24d0: 6d 61 6e 64 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a  mand is run..*/.
24e0: 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 65 6e  static int appen
24f0: 64 52 65 6d 61 72 6b 43 6d 64 28 0a 20 20 54 68  dRemarkCmd(.  Th
2500: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2510: 20 0a 20 20 76 6f 69 64 20 2a 70 2c 20 0a 20 20   .  void *p, .  
2520: 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 63 6f 6e  int argc, .  con
2530: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
2540: 20 2a 2a 61 72 67 76 2c 20 0a 20 20 69 6e 74 20   **argv, .  int 
2550: 2a 61 72 67 6c 0a 29 7b 0a 20 20 69 6e 74 20 69  *argl.){.  int i
2560: 64 78 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  dx;..  if( argc!
2570: 3d 33 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =3 ){.    return
2580: 20 54 68 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73   Th_WrongNumArgs
2590: 28 69 6e 74 65 72 70 2c 20 22 61 70 70 65 6e 64  (interp, "append
25a0: 5f 66 69 65 6c 64 20 46 49 45 4c 44 20 53 54 52  _field FIELD STR
25b0: 49 4e 47 22 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  ING");.  }.  for
25c0: 28 69 64 78 3d 30 3b 20 69 64 78 3c 6e 46 69 65  (idx=0; idx<nFie
25d0: 6c 64 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20  ld; idx++){.    
25e0: 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 46 69  if( strncmp(azFi
25f0: 65 6c 64 5b 69 64 78 5d 2c 20 28 63 6f 6e 73 74  eld[idx], (const
2600: 20 63 68 61 72 2a 29 61 72 67 76 5b 31 5d 2c 20   char*)argv[1], 
2610: 61 72 67 6c 5b 31 5d 29 3d 3d 30 0a 20 20 20 20  argl[1])==0.    
2620: 20 20 20 20 26 26 20 61 7a 46 69 65 6c 64 5b 69      && azField[i
2630: 64 78 5d 5b 61 72 67 6c 5b 31 5d 5d 3d 3d 30 20  dx][argl[1]]==0 
2640: 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
2650: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2660: 69 64 78 3e 3d 6e 46 69 65 6c 64 20 29 7b 0a 20  idx>=nField ){. 
2670: 20 20 20 54 68 5f 45 72 72 6f 72 4d 65 73 73 61     Th_ErrorMessa
2680: 67 65 28 67 2e 69 6e 74 65 72 70 2c 20 22 6e 6f  ge(g.interp, "no
2690: 20 73 75 63 68 20 54 49 43 4b 45 54 20 63 6f 6c   such TICKET col
26a0: 75 6d 6e 3a 20 22 2c 20 61 72 67 76 5b 31 5d 2c  umn: ", argv[1],
26b0: 20 61 72 67 6c 5b 31 5d 29 3b 0a 20 20 20 20 72   argl[1]);.    r
26c0: 65 74 75 72 6e 20 54 48 5f 45 52 52 4f 52 3b 0a  eturn TH_ERROR;.
26d0: 20 20 7d 0a 20 20 61 7a 41 70 70 65 6e 64 5b 69    }.  azAppend[i
26e0: 64 78 5d 20 3d 20 6d 70 72 69 6e 74 66 28 22 25  dx] = mprintf("%
26f0: 2e 2a 73 22 2c 20 61 72 67 6c 5b 32 5d 2c 20 61  .*s", argl[2], a
2700: 72 67 76 5b 32 5d 29 3b 0a 20 20 72 65 74 75 72  rgv[2]);.  retur
2710: 6e 20 54 48 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  n TH_OK;.}../*.*
2720: 2a 20 53 75 62 73 63 72 69 70 74 20 63 6f 6d 6d  * Subscript comm
2730: 61 6e 64 3a 20 20 20 73 75 62 6d 69 74 5f 74 69  and:   submit_ti
2740: 63 6b 65 74 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74  cket.**.** Const
2750: 72 75 63 74 20 61 6e 64 20 73 75 62 6d 69 74 20  ruct and submit 
2760: 61 20 6e 65 77 20 74 69 63 6b 65 74 20 61 72 74  a new ticket art
2770: 69 66 61 63 74 2e 20 20 54 68 65 20 66 69 65 6c  ifact.  The fiel
2780: 64 73 20 6f 66 20 74 68 65 20 61 72 74 69 66 61  ds of the artifa
2790: 63 74 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61  ct.** are the na
27a0: 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
27b0: 6e 73 20 69 6e 20 74 68 65 20 54 49 43 4b 45 54  ns in the TICKET
27c0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 63 6f 6e   table.  The con
27d0: 74 65 6e 74 20 69 73 0a 2a 2a 20 74 61 6b 65 6e  tent is.** taken
27e0: 20 66 72 6f 6d 20 54 48 20 76 61 72 69 61 62 6c   from TH variabl
27f0: 65 73 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 74  es.  If the cont
2800: 65 6e 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ent is unchanged
2810: 2c 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a  , the field is.*
2820: 2a 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  * omitted from t
2830: 68 65 20 61 72 74 69 66 61 63 74 2e 20 20 46 69  he artifact.  Fi
2840: 65 6c 64 73 20 77 68 6f 73 65 20 6e 61 6d 65 73  elds whose names
2850: 20 62 65 67 69 6e 20 77 69 74 68 20 22 70 72 69   begin with "pri
2860: 76 61 74 65 5f 22 0a 2a 2a 20 61 72 65 20 63 6f  vate_".** are co
2870: 6e 63 65 61 6c 65 64 20 75 73 69 6e 67 20 74 68  ncealed using th
2880: 65 20 64 62 5f 63 6f 6e 63 65 61 6c 28 29 20 66  e db_conceal() f
2890: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
28a0: 69 63 20 69 6e 74 20 73 75 62 6d 69 74 54 69 63  ic int submitTic
28b0: 6b 65 74 43 6d 64 28 0a 20 20 54 68 5f 49 6e 74  ketCmd(.  Th_Int
28c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20  erp *interp, .  
28d0: 76 6f 69 64 20 2a 70 55 75 69 64 2c 20 0a 20 20  void *pUuid, .  
28e0: 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 63 6f 6e  int argc, .  con
28f0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
2900: 20 2a 2a 61 72 67 76 2c 20 0a 20 20 69 6e 74 20   **argv, .  int 
2910: 2a 61 72 67 6c 0a 29 7b 0a 20 20 63 68 61 72 20  *argl.){.  char 
2920: 2a 7a 44 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20  *zDate;.  const 
2930: 63 68 61 72 20 2a 7a 55 75 69 64 3b 0a 20 20 69  char *zUuid;.  i
2940: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 69 64 3b  nt i;.  int rid;
2950: 0a 20 20 42 6c 6f 62 20 74 6b 74 63 68 6e 67 2c  .  Blob tktchng,
2960: 20 63 6b 73 75 6d 3b 0a 0a 20 20 7a 55 75 69 64   cksum;..  zUuid
2970: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
2980: 29 70 55 75 69 64 3b 0a 20 20 62 6c 6f 62 5f 7a  )pUuid;.  blob_z
2990: 65 72 6f 28 26 74 6b 74 63 68 6e 67 29 3b 0a 20  ero(&tktchng);. 
29a0: 20 7a 44 61 74 65 20 3d 20 64 62 5f 74 65 78 74   zDate = db_text
29b0: 28 30 2c 20 22 53 45 4c 45 43 54 20 64 61 74 65  (0, "SELECT date
29c0: 74 69 6d 65 28 27 6e 6f 77 27 29 22 29 3b 0a 20  time('now')");. 
29d0: 20 7a 44 61 74 65 5b 31 30 5d 20 3d 20 27 54 27   zDate[10] = 'T'
29e0: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66  ;.  blob_appendf
29f0: 28 26 74 6b 74 63 68 6e 67 2c 20 22 44 20 25 73  (&tktchng, "D %s
2a00: 5c 6e 22 2c 20 7a 44 61 74 65 29 3b 0a 20 20 66  \n", zDate);.  f
2a10: 72 65 65 28 7a 44 61 74 65 29 3b 0a 20 20 66 6f  ree(zDate);.  fo
2a20: 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 3b  r(i=0; i<nField;
2a30: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
2a40: 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 3b 0a 20   char *zValue;. 
2a50: 20 20 20 69 6e 74 20 6e 56 61 6c 75 65 3b 0a 20     int nValue;. 
2a60: 20 20 20 69 66 28 20 61 7a 41 70 70 65 6e 64 5b     if( azAppend[
2a70: 69 5d 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62  i] ){.      blob
2a80: 5f 61 70 70 65 6e 64 66 28 26 74 6b 74 63 68 6e  _appendf(&tktchn
2a90: 67 2c 20 22 4a 20 2b 25 73 20 25 7a 5c 6e 22 2c  g, "J +%s %z\n",
2aa0: 20 61 7a 46 69 65 6c 64 5b 69 5d 2c 0a 20 20 20   azField[i],.   
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 66 6f 73 73 69 6c 69 7a 65 28 61 7a 41 70 70 65  fossilize(azAppe
2ad0: 6e 64 5b 69 5d 2c 20 2d 31 29 29 3b 0a 20 20 20  nd[i], -1));.   
2ae0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 56   }else{.      zV
2af0: 61 6c 75 65 20 3d 20 54 68 5f 46 65 74 63 68 28  alue = Th_Fetch(
2b00: 61 7a 46 69 65 6c 64 5b 69 5d 2c 20 26 6e 56 61  azField[i], &nVa
2b10: 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lue);.      if( 
2b20: 7a 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20  zValue ){.      
2b30: 20 20 77 68 69 6c 65 28 20 6e 56 61 6c 75 65 3e    while( nValue>
2b40: 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 56 61  0 && isspace(zVa
2b50: 6c 75 65 5b 6e 56 61 6c 75 65 2d 31 5d 29 20 29  lue[nValue-1]) )
2b60: 7b 20 6e 56 61 6c 75 65 2d 2d 3b 20 7d 0a 20 20  { nValue--; }.  
2b70: 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
2b80: 70 28 61 7a 46 69 65 6c 64 5b 69 5d 2c 20 22 70  p(azField[i], "p
2b90: 72 69 76 61 74 65 5f 22 2c 20 38 29 3d 3d 30 20  rivate_", 8)==0 
2ba0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 56 61  ){.          zVa
2bb0: 6c 75 65 20 3d 20 64 62 5f 63 6f 6e 63 65 61 6c  lue = db_conceal
2bc0: 28 7a 56 61 6c 75 65 2c 20 6e 56 61 6c 75 65 29  (zValue, nValue)
2bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 56 61 6c  ;.          nVal
2be0: 75 65 20 3d 20 73 74 72 6c 65 6e 28 7a 56 61 6c  ue = strlen(zVal
2bf0: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ue);.        }. 
2c00: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
2c10: 6d 70 28 7a 56 61 6c 75 65 2c 20 61 7a 56 61 6c  mp(zValue, azVal
2c20: 75 65 5b 69 5d 2c 20 6e 56 61 6c 75 65 29 0a 20  ue[i], nValue). 
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2c40: 7c 20 73 74 72 6c 65 6e 28 61 7a 56 61 6c 75 65  | strlen(azValue
2c50: 5b 69 5d 29 21 3d 6e 56 61 6c 75 65 20 29 7b 0a  [i])!=nValue ){.
2c60: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61            blob_a
2c70: 70 70 65 6e 64 66 28 26 74 6b 74 63 68 6e 67 2c  ppendf(&tktchng,
2c80: 20 22 4a 20 25 73 20 25 7a 5c 6e 22 2c 0a 20 20   "J %s %z\n",.  
2c90: 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 65             azFie
2ca0: 6c 64 5b 69 5d 2c 20 66 6f 73 73 69 6c 69 7a 65  ld[i], fossilize
2cb0: 28 7a 56 61 6c 75 65 2c 6e 56 61 6c 75 65 29 29  (zValue,nValue))
2cc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2cd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2ce0: 69 66 28 20 2a 28 63 68 61 72 2a 2a 29 70 55 75  if( *(char**)pUu
2cf0: 69 64 20 29 7b 0a 20 20 20 20 7a 55 75 69 64 20  id ){.    zUuid 
2d00: 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 0a 20 20  = db_text(0, .  
2d10: 20 20 20 20 20 22 53 45 4c 45 43 54 20 74 6b 74       "SELECT tkt
2d20: 5f 75 75 69 64 20 46 52 4f 4d 20 74 69 63 6b 65  _uuid FROM ticke
2d30: 74 20 57 48 45 52 45 20 74 6b 74 5f 75 75 69 64  t WHERE tkt_uuid
2d40: 20 47 4c 4f 42 20 27 25 73 2a 27 22 2c 20 50 28   GLOB '%s*'", P(
2d50: 22 6e 61 6d 65 22 29 0a 20 20 20 20 29 3b 0a 20  "name").    );. 
2d60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 55 75 69   }else{.    zUui
2d70: 64 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22  d = db_text(0, "
2d80: 53 45 4c 45 43 54 20 6c 6f 77 65 72 28 68 65 78  SELECT lower(hex
2d90: 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 29 29  (randomblob(20))
2da0: 29 22 29 3b 0a 20 20 7d 0a 20 20 2a 28 63 6f 6e  )");.  }.  *(con
2db0: 73 74 20 63 68 61 72 2a 2a 29 70 55 75 69 64 20  st char**)pUuid 
2dc0: 3d 20 7a 55 75 69 64 3b 0a 20 20 62 6c 6f 62 5f  = zUuid;.  blob_
2dd0: 61 70 70 65 6e 64 66 28 26 74 6b 74 63 68 6e 67  appendf(&tktchng
2de0: 2c 20 22 4b 20 25 73 5c 6e 22 2c 20 7a 55 75 69  , "K %s\n", zUui
2df0: 64 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e  d);.  blob_appen
2e00: 64 66 28 26 74 6b 74 63 68 6e 67 2c 20 22 55 20  df(&tktchng, "U 
2e10: 25 46 5c 6e 22 2c 20 67 2e 7a 4c 6f 67 69 6e 20  %F\n", g.zLogin 
2e20: 3f 20 67 2e 7a 4c 6f 67 69 6e 20 3a 20 22 22 29  ? g.zLogin : "")
2e30: 3b 0a 20 20 6d 64 35 73 75 6d 5f 62 6c 6f 62 28  ;.  md5sum_blob(
2e40: 26 74 6b 74 63 68 6e 67 2c 20 26 63 6b 73 75 6d  &tktchng, &cksum
2e50: 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  );.  blob_append
2e60: 66 28 26 74 6b 74 63 68 6e 67 2c 20 22 5a 20 25  f(&tktchng, "Z %
2e70: 62 5c 6e 22 2c 20 26 63 6b 73 75 6d 29 3b 0a 0a  b\n", &cksum);..
2e80: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 67 2e    if( strncmp(g.
2e90: 7a 50 61 74 68 2c 22 64 65 62 75 67 5f 22 2c 36  zPath,"debug_",6
2ea0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 40 20 3c 68  )==0 ){.    @ <h
2eb0: 72 3e 3c 70 72 65 3e 0a 20 20 20 20 40 20 25 68  r><pre>.    @ %h
2ec0: 28 62 6c 6f 62 5f 73 74 72 28 26 74 6b 74 63 68  (blob_str(&tktch
2ed0: 6e 67 29 29 0a 20 20 20 20 40 20 3c 2f 70 72 65  ng)).    @ </pre
2ee0: 3e 3c 68 72 3e 0a 20 20 20 20 62 6c 6f 62 5f 7a  ><hr>.    blob_z
2ef0: 65 72 6f 28 26 74 6b 74 63 68 6e 67 29 3b 0a 20  ero(&tktchng);. 
2f00: 20 20 20 72 65 74 75 72 6e 20 54 48 5f 4f 4b 3b     return TH_OK;
2f10: 0a 20 20 7d 0a 0a 20 20 72 69 64 20 3d 20 63 6f  .  }..  rid = co
2f20: 6e 74 65 6e 74 5f 70 75 74 28 26 74 6b 74 63 68  ntent_put(&tktch
2f30: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  ng, 0, 0);.  if(
2f40: 20 72 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 66   rid==0 ){.    f
2f50: 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 74 72 6f  ossil_panic("tro
2f60: 75 62 6c 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  uble committing 
2f70: 74 69 63 6b 65 74 3a 20 25 73 22 2c 20 67 2e 7a  ticket: %s", g.z
2f80: 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 6d  ErrMsg);.  }.  m
2f90: 61 6e 69 66 65 73 74 5f 63 72 6f 73 73 6c 69 6e  anifest_crosslin
2fa0: 6b 28 72 69 64 2c 20 26 74 6b 74 63 68 6e 67 29  k(rid, &tktchng)
2fb0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 48 5f 52 45  ;.  return TH_RE
2fc0: 54 55 52 4e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  TURN;.}.../*.** 
2fd0: 57 45 42 50 41 47 45 3a 20 74 6b 74 6e 65 77 0a  WEBPAGE: tktnew.
2fe0: 2a 2a 20 57 45 42 50 41 47 45 3a 20 64 65 62 75  ** WEBPAGE: debu
2ff0: 67 5f 74 6b 74 6e 65 77 0a 2a 2a 0a 2a 2a 20 45  g_tktnew.**.** E
3000: 6e 74 65 72 20 61 20 6e 65 77 20 74 69 63 6b 65  nter a new ticke
3010: 74 2e 20 20 74 68 65 20 74 6b 74 6e 65 77 5f 74  t.  the tktnew_t
3020: 65 6d 70 6c 61 74 65 20 73 63 72 69 70 74 20 69  emplate script i
3030: 6e 20 74 68 65 20 74 69 63 6b 65 74 0a 2a 2a 20  n the ticket.** 
3040: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73  configuration is
3050: 20 75 73 65 64 2e 20 20 54 68 65 20 2f 74 6b 74   used.  The /tkt
3060: 6e 65 77 20 70 61 67 65 20 69 73 20 74 68 65 20  new page is the 
3070: 6f 66 66 69 63 69 61 6c 20 74 69 63 6b 65 74 0a  official ticket.
3080: 2a 2a 20 65 6e 74 72 79 20 70 61 67 65 2e 20 20  ** entry page.  
3090: 54 68 65 20 2f 64 65 62 75 67 5f 74 6b 74 6e 65  The /debug_tktne
30a0: 77 20 70 61 67 65 20 69 73 20 75 73 65 64 20 66  w page is used f
30b0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 74 68 65  or debugging the
30c0: 0a 2a 2a 20 74 6b 74 6e 65 77 5f 74 65 6d 70 6c  .** tktnew_templ
30d0: 61 74 65 20 69 6e 20 74 68 65 20 74 69 63 6b 65  ate in the ticke
30e0: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  t configuration.
30f0: 20 20 2f 64 65 62 75 67 5f 74 6b 74 6e 65 77 20    /debug_tktnew 
3100: 77 6f 72 6b 73 0a 2a 2a 20 6a 75 73 74 20 6c 69  works.** just li
3110: 6b 65 20 2f 74 6b 74 6e 65 77 20 65 78 63 65 70  ke /tktnew excep
3120: 74 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  t that it does n
3130: 6f 74 20 72 65 61 6c 6c 79 20 73 61 76 65 20 74  ot really save t
3140: 68 65 20 6e 65 77 20 74 69 63 6b 65 74 0a 2a 2a  he new ticket.**
3150: 20 77 68 65 6e 20 79 6f 75 20 70 72 65 73 73 20   when you press 
3160: 73 75 62 6d 69 74 20 2d 20 69 74 20 6a 75 73 74  submit - it just
3170: 20 70 72 69 6e 74 73 20 74 68 65 20 74 69 63 6b   prints the tick
3180: 65 74 20 61 72 74 69 66 61 63 74 20 61 74 20 74  et artifact at t
3190: 68 65 0a 2a 2a 20 74 6f 70 20 6f 66 20 74 68 65  he.** top of the
31a0: 20 73 63 72 65 65 6e 2e 0a 2a 2f 0a 76 6f 69 64   screen..*/.void
31b0: 20 74 6b 74 6e 65 77 5f 70 61 67 65 28 76 6f 69   tktnew_page(voi
31c0: 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  d){.  const char
31d0: 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 63 68 61   *zScript;.  cha
31e0: 72 20 2a 7a 4e 65 77 55 75 69 64 20 3d 20 30 3b  r *zNewUuid = 0;
31f0: 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f  ..  login_check_
3200: 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20  credentials();. 
3210: 20 69 66 28 20 21 67 2e 6f 6b 4e 65 77 54 6b 74   if( !g.okNewTkt
3220: 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64   ){ login_needed
3230: 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20  (); return; }.  
3240: 69 66 28 20 50 28 22 63 61 6e 63 65 6c 22 29 20  if( P("cancel") 
3250: 29 7b 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72  ){.    cgi_redir
3260: 65 63 74 28 22 68 6f 6d 65 22 29 3b 0a 20 20 7d  ect("home");.  }
3270: 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28  .  style_header(
3280: 22 4e 65 77 20 54 69 63 6b 65 74 22 29 3b 0a 20  "New Ticket");. 
3290: 20 74 69 63 6b 65 74 5f 69 6e 69 74 28 29 3b 0a   ticket_init();.
32a0: 20 20 67 65 74 41 6c 6c 54 69 63 6b 65 74 46 69    getAllTicketFi
32b0: 65 6c 64 73 28 29 3b 0a 20 20 69 6e 69 74 69 61  elds();.  initia
32c0: 6c 69 7a 65 56 61 72 69 61 62 6c 65 73 46 72 6f  lizeVariablesFro
32d0: 6d 44 62 28 29 3b 0a 20 20 69 6e 69 74 69 61 6c  mDb();.  initial
32e0: 69 7a 65 56 61 72 69 61 62 6c 65 73 46 72 6f 6d  izeVariablesFrom
32f0: 43 47 49 28 29 3b 0a 20 20 40 20 3c 66 6f 72 6d  CGI();.  @ <form
3300: 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22 20 61   method="POST" a
3310: 63 74 69 6f 6e 3d 22 25 73 28 67 2e 7a 42 61 73  ction="%s(g.zBas
3320: 65 55 52 4c 29 2f 25 73 28 67 2e 7a 50 61 74 68  eURL)/%s(g.zPath
3330: 29 22 3e 0a 20 20 7a 53 63 72 69 70 74 20 3d 20  )">.  zScript = 
3340: 74 69 63 6b 65 74 5f 6e 65 77 70 61 67 65 5f 63  ticket_newpage_c
3350: 6f 64 65 28 29 3b 0a 20 20 54 68 5f 53 74 6f 72  ode();.  Th_Stor
3360: 65 28 22 6c 6f 67 69 6e 22 2c 20 67 2e 7a 4c 6f  e("login", g.zLo
3370: 67 69 6e 29 3b 0a 20 20 54 68 5f 53 74 6f 72 65  gin);.  Th_Store
3380: 28 22 64 61 74 65 22 2c 20 64 62 5f 74 65 78 74  ("date", db_text
3390: 28 30 2c 20 22 53 45 4c 45 43 54 20 64 61 74 65  (0, "SELECT date
33a0: 74 69 6d 65 28 27 6e 6f 77 27 29 22 29 29 3b 0a  time('now')"));.
33b0: 20 20 54 68 5f 43 72 65 61 74 65 43 6f 6d 6d 61    Th_CreateComma
33c0: 6e 64 28 67 2e 69 6e 74 65 72 70 2c 20 22 73 75  nd(g.interp, "su
33d0: 62 6d 69 74 5f 74 69 63 6b 65 74 22 2c 20 73 75  bmit_ticket", su
33e0: 62 6d 69 74 54 69 63 6b 65 74 43 6d 64 2c 0a 20  bmitTicketCmd,. 
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3400: 20 20 28 76 6f 69 64 2a 29 26 7a 4e 65 77 55 75    (void*)&zNewUu
3410: 69 64 2c 20 30 29 3b 0a 20 20 69 66 28 20 54 68  id, 0);.  if( Th
3420: 5f 52 65 6e 64 65 72 28 7a 53 63 72 69 70 74 29  _Render(zScript)
3430: 3d 3d 54 48 5f 52 45 54 55 52 4e 20 26 26 20 7a  ==TH_RETURN && z
3440: 4e 65 77 55 75 69 64 20 29 7b 0a 20 20 20 20 63  NewUuid ){.    c
3450: 67 69 5f 72 65 64 69 72 65 63 74 28 6d 70 72 69  gi_redirect(mpri
3460: 6e 74 66 28 22 25 73 2f 74 6b 74 76 69 65 77 2f  ntf("%s/tktview/
3470: 25 73 22 2c 20 67 2e 7a 42 61 73 65 55 52 4c 2c  %s", g.zBaseURL,
3480: 20 7a 4e 65 77 55 75 69 64 29 29 3b 0a 20 20 20   zNewUuid));.   
3490: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 40   return;.  }.  @
34a0: 20 3c 2f 66 6f 72 6d 3e 0a 20 20 73 74 79 6c 65   </form>.  style
34b0: 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a  _footer();.}../*
34c0: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 74 6b 74  .** WEBPAGE: tkt
34d0: 65 64 69 74 0a 2a 2a 20 57 45 42 50 41 47 45 3a  edit.** WEBPAGE:
34e0: 20 64 65 62 75 67 5f 74 6b 74 65 64 69 74 0a 2a   debug_tktedit.*
34f0: 2a 0a 2a 2a 20 45 64 69 74 20 61 20 74 69 63 6b  *.** Edit a tick
3500: 65 74 2e 20 20 54 68 65 20 74 69 63 6b 65 74 20  et.  The ticket 
3510: 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
3520: 20 74 68 65 20 6e 61 6d 65 20 43 47 49 20 70 61   the name CGI pa
3530: 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 2f 74 6b 74  rameter..** /tkt
3540: 65 64 69 74 20 69 73 20 74 68 65 20 6f 66 66 69  edit is the offi
3550: 63 69 61 6c 20 70 61 67 65 2e 20 20 54 68 65 20  cial page.  The 
3560: 2f 64 65 62 75 67 5f 74 6b 74 65 64 69 74 20 70  /debug_tktedit p
3570: 61 67 65 20 64 6f 65 73 20 74 68 65 20 73 61 6d  age does the sam
3580: 65 0a 2a 2a 20 74 68 69 6e 67 20 65 78 63 65 70  e.** thing excep
3590: 74 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  t that it does n
35a0: 6f 74 20 73 61 76 65 20 74 68 65 20 74 69 63 6b  ot save the tick
35b0: 65 74 20 63 68 61 6e 67 65 20 72 65 63 6f 72 64  et change record
35c0: 20 77 68 65 6e 20 79 6f 75 0a 2a 2a 20 70 72 65   when you.** pre
35d0: 73 73 20 73 75 62 6d 69 74 20 2d 20 69 74 20 69  ss submit - it i
35e0: 6e 73 74 65 61 64 20 70 72 69 6e 74 73 20 74 68  nstead prints th
35f0: 65 20 74 69 63 6b 65 74 20 63 68 61 6e 67 65 20  e ticket change 
3600: 72 65 63 6f 72 64 20 61 74 20 74 68 65 20 74 6f  record at the to
3610: 70 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  p.** of the page
3620: 2e 20 20 54 68 65 20 2f 64 65 62 75 67 5f 74 6b  .  The /debug_tk
3630: 74 65 64 69 74 20 70 61 67 65 20 69 73 20 69 6e  tedit page is in
3640: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
3650: 64 20 77 68 65 6e 0a 2a 2a 20 64 65 62 75 67 67  d when.** debugg
3660: 69 6e 67 20 74 69 63 6b 65 74 20 63 6f 6e 66 69  ing ticket confi
3670: 67 75 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f  gurations..*/.vo
3680: 69 64 20 74 6b 74 65 64 69 74 5f 70 61 67 65 28  id tktedit_page(
3690: 76 6f 69 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63  void){.  const c
36a0: 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20  har *zScript;.  
36b0: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 63 6f 6e  int nName;.  con
36c0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
36d0: 20 20 69 6e 74 20 6e 52 65 63 3b 0a 0a 20 20 6c    int nRec;..  l
36e0: 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65  ogin_check_crede
36f0: 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20  ntials();.  if( 
3700: 21 67 2e 6f 6b 41 70 6e 64 54 6b 74 20 26 26 20  !g.okApndTkt && 
3710: 21 67 2e 6f 6b 57 72 54 6b 74 20 29 7b 20 6c 6f  !g.okWrTkt ){ lo
3720: 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65  gin_needed(); re
3730: 74 75 72 6e 3b 20 7d 0a 20 20 7a 4e 61 6d 65 20  turn; }.  zName 
3740: 3d 20 50 28 22 6e 61 6d 65 22 29 3b 0a 20 20 69  = P("name");.  i
3750: 66 28 20 50 28 22 63 61 6e 63 65 6c 22 29 20 29  f( P("cancel") )
3760: 7b 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72 65  {.    cgi_redire
3770: 63 74 66 28 22 74 6b 74 76 69 65 77 3f 6e 61 6d  ctf("tktview?nam
3780: 65 3d 25 54 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  e=%T", zName);. 
3790: 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65   }.  style_heade
37a0: 72 28 22 45 64 69 74 20 54 69 63 6b 65 74 22 29  r("Edit Ticket")
37b0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
37c0: 20 7c 7c 20 28 6e 4e 61 6d 65 20 3d 20 73 74 72   || (nName = str
37d0: 6c 65 6e 28 7a 4e 61 6d 65 29 29 3c 34 20 7c 7c  len(zName))<4 ||
37e0: 20 6e 4e 61 6d 65 3e 55 55 49 44 5f 53 49 5a 45   nName>UUID_SIZE
37f0: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 21 76  .          || !v
3800: 61 6c 69 64 61 74 65 31 36 28 7a 4e 61 6d 65 2c  alidate16(zName,
3810: 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 40 20  nName) ){.    @ 
3820: 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 22 72 65 64  <font color="red
3830: 22 3e 3c 62 3e 4e 6f 74 20 61 20 76 61 6c 69 64  "><b>Not a valid
3840: 20 74 69 63 6b 65 74 20 69 64 3a 20 5c 22 25 68   ticket id: \"%h
3850: 28 7a 4e 61 6d 65 29 5c 22 3c 2f 62 3e 3c 2f 66  (zName)\"</b></f
3860: 6f 6e 74 3e 0a 20 20 20 20 73 74 79 6c 65 5f 66  ont>.    style_f
3870: 6f 6f 74 65 72 28 29 3b 0a 20 20 20 20 72 65 74  ooter();.    ret
3880: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6e 52 65 63 20  urn;.  }.  nRec 
3890: 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c  = db_int(0, "SEL
38a0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
38b0: 4d 20 74 69 63 6b 65 74 20 57 48 45 52 45 20 74  M ticket WHERE t
38c0: 6b 74 5f 75 75 69 64 20 47 4c 4f 42 20 27 25 71  kt_uuid GLOB '%q
38d0: 2a 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  *'",.           
38e0: 20 20 20 20 20 7a 4e 61 6d 65 29 3b 0a 20 20 69       zName);.  i
38f0: 66 28 20 6e 52 65 63 3d 3d 30 20 29 7b 0a 20 20  f( nRec==0 ){.  
3900: 20 20 40 20 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d    @ <font color=
3910: 22 72 65 64 22 3e 3c 62 3e 4e 6f 20 73 75 63 68  "red"><b>No such
3920: 20 74 69 63 6b 65 74 3a 20 5c 22 25 68 28 7a 4e   ticket: \"%h(zN
3930: 61 6d 65 29 5c 22 3c 2f 62 3e 3c 2f 66 6f 6e 74  ame)\"</b></font
3940: 3e 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74  >.    style_foot
3950: 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  er();.    return
3960: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 63  ;.  }.  if( nRec
3970: 3e 31 20 29 7b 0a 20 20 20 20 40 20 3c 66 6f 6e  >1 ){.    @ <fon
3980: 74 20 63 6f 6c 6f 72 3d 22 72 65 64 22 3e 3c 62  t color="red"><b
3990: 3e 25 64 28 6e 52 65 63 29 20 74 69 63 6b 65 74  >%d(nRec) ticket
39a0: 73 20 62 65 67 69 6e 20 77 69 74 68 3a 20 5c 22  s begin with: \"
39b0: 25 68 28 7a 4e 61 6d 65 29 5c 22 3c 2f 62 3e 3c  %h(zName)\"</b><
39c0: 2f 66 6f 6e 74 3e 0a 20 20 20 20 73 74 79 6c 65  /font>.    style
39d0: 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20 20 20 72  _footer();.    r
39e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 74 69 63  eturn;.  }.  tic
39f0: 6b 65 74 5f 69 6e 69 74 28 29 3b 0a 20 20 67 65  ket_init();.  ge
3a00: 74 41 6c 6c 54 69 63 6b 65 74 46 69 65 6c 64 73  tAllTicketFields
3a10: 28 29 3b 0a 20 20 69 6e 69 74 69 61 6c 69 7a 65  ();.  initialize
3a20: 56 61 72 69 61 62 6c 65 73 46 72 6f 6d 43 47 49  VariablesFromCGI
3a30: 28 29 3b 0a 20 20 69 6e 69 74 69 61 6c 69 7a 65  ();.  initialize
3a40: 56 61 72 69 61 62 6c 65 73 46 72 6f 6d 44 62 28  VariablesFromDb(
3a50: 29 3b 0a 20 20 40 20 3c 66 6f 72 6d 20 6d 65 74  );.  @ <form met
3a60: 68 6f 64 3d 22 50 4f 53 54 22 20 61 63 74 69 6f  hod="POST" actio
3a70: 6e 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c  n="%s(g.zBaseURL
3a80: 29 2f 25 73 28 67 2e 7a 50 61 74 68 29 22 3e 0a  )/%s(g.zPath)">.
3a90: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
3aa0: 22 68 69 64 64 65 6e 22 20 6e 61 6d 65 3d 22 6e  "hidden" name="n
3ab0: 61 6d 65 22 20 76 61 6c 75 65 3d 22 25 73 28 7a  ame" value="%s(z
3ac0: 4e 61 6d 65 29 22 3e 0a 20 20 7a 53 63 72 69 70  Name)">.  zScrip
3ad0: 74 20 3d 20 74 69 63 6b 65 74 5f 65 64 69 74 70  t = ticket_editp
3ae0: 61 67 65 5f 63 6f 64 65 28 29 3b 0a 20 20 54 68  age_code();.  Th
3af0: 5f 53 74 6f 72 65 28 22 6c 6f 67 69 6e 22 2c 20  _Store("login", 
3b00: 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 54 68 5f  g.zLogin);.  Th_
3b10: 53 74 6f 72 65 28 22 64 61 74 65 22 2c 20 64 62  Store("date", db
3b20: 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54  _text(0, "SELECT
3b30: 20 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 27 29   datetime('now')
3b40: 22 29 29 3b 0a 20 20 54 68 5f 43 72 65 61 74 65  "));.  Th_Create
3b50: 43 6f 6d 6d 61 6e 64 28 67 2e 69 6e 74 65 72 70  Command(g.interp
3b60: 2c 20 22 61 70 70 65 6e 64 5f 66 69 65 6c 64 22  , "append_field"
3b70: 2c 20 61 70 70 65 6e 64 52 65 6d 61 72 6b 43 6d  , appendRemarkCm
3b80: 64 2c 20 30 2c 20 30 29 3b 0a 20 20 54 68 5f 43  d, 0, 0);.  Th_C
3b90: 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 67 2e 69  reateCommand(g.i
3ba0: 6e 74 65 72 70 2c 20 22 73 75 62 6d 69 74 5f 74  nterp, "submit_t
3bb0: 69 63 6b 65 74 22 2c 20 73 75 62 6d 69 74 54 69  icket", submitTi
3bc0: 63 6b 65 74 43 6d 64 2c 20 28 76 6f 69 64 2a 29  cketCmd, (void*)
3bd0: 26 7a 4e 61 6d 65 2c 30 29 3b 0a 20 20 69 66 28  &zName,0);.  if(
3be0: 20 54 68 5f 52 65 6e 64 65 72 28 7a 53 63 72 69   Th_Render(zScri
3bf0: 70 74 29 3d 3d 54 48 5f 52 45 54 55 52 4e 20 26  pt)==TH_RETURN &
3c00: 26 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 63  & zName ){.    c
3c10: 67 69 5f 72 65 64 69 72 65 63 74 28 6d 70 72 69  gi_redirect(mpri
3c20: 6e 74 66 28 22 25 73 2f 74 6b 74 76 69 65 77 2f  ntf("%s/tktview/
3c30: 25 73 22 2c 20 67 2e 7a 42 61 73 65 55 52 4c 2c  %s", g.zBaseURL,
3c40: 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65   zName));.    re
3c50: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 40 20 3c 2f  turn;.  }.  @ </
3c60: 66 6f 72 6d 3e 0a 20 20 73 74 79 6c 65 5f 66 6f  form>.  style_fo
3c70: 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  oter();.}../*.**
3c80: 20 43 68 65 63 6b 20 74 68 65 20 74 69 63 6b 65   Check the ticke
3c90: 74 20 74 61 62 6c 65 20 73 63 68 65 6d 61 20 69  t table schema i
3ca0: 6e 20 7a 53 63 68 65 6d 61 20 74 6f 20 73 65 65  n zSchema to see
3cb0: 20 69 66 20 69 74 20 61 70 70 65 61 72 73 20 74   if it appears t
3cc0: 6f 0a 2a 2a 20 62 65 20 77 65 6c 6c 2d 66 6f 72  o.** be well-for
3cd0: 6d 65 64 2e 20 20 49 66 20 65 76 65 72 79 74 68  med.  If everyth
3ce0: 69 6e 67 20 69 73 20 4f 4b 2c 20 72 65 74 75 72  ing is OK, retur
3cf0: 6e 20 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65  n NULL.  If some
3d00: 74 68 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73  thing is.** amis
3d10: 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  s, then return a
3d20: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
3d30: 72 69 6e 67 20 28 6f 62 74 61 69 6e 65 64 20 66  ring (obtained f
3d40: 72 6f 6d 20 6d 61 6c 6c 6f 63 29 20 74 68 61 74  rom malloc) that
3d50: 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68  .** describes th
3d60: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 63 68  e problem..*/.ch
3d70: 61 72 20 2a 74 69 63 6b 65 74 5f 73 63 68 65 6d  ar *ticket_schem
3d80: 61 5f 63 68 65 63 6b 28 63 6f 6e 73 74 20 63 68  a_check(const ch
3d90: 61 72 20 2a 7a 53 63 68 65 6d 61 29 7b 0a 20 20  ar *zSchema){.  
3da0: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
3db0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
3dc0: 74 65 33 20 2a 64 62 3b 0a 20 20 72 63 20 3d 20  te3 *db;.  rc = 
3dd0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d  sqlite3_open(":m
3de0: 65 6d 6f 72 79 3a 22 2c 20 26 64 62 29 3b 0a 20  emory:", &db);. 
3df0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3e00: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
3e10: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
3e20: 7a 53 63 68 65 6d 61 2c 20 30 2c 20 30 2c 20 26  zSchema, 0, 0, &
3e30: 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72  zErr);.    if( r
3e40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
3e50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
3e60: 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 20 20 72  ose(db);.      r
3e70: 65 74 75 72 6e 20 7a 45 72 72 3b 0a 20 20 20 20  eturn zErr;.    
3e80: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
3e90: 65 33 5f 65 78 65 63 28 64 62 2c 20 22 53 45 4c  e3_exec(db, "SEL
3ea0: 45 43 54 20 74 6b 74 5f 69 64 2c 20 74 6b 74 5f  ECT tkt_id, tkt_
3eb0: 75 75 69 64 2c 20 74 6b 74 5f 6d 74 69 6d 65 20  uuid, tkt_mtime 
3ec0: 46 52 4f 4d 20 74 69 63 6b 65 74 22 2c 0a 20 20  FROM ticket",.  
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ee0: 20 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20      0, 0, 0);.  
3ef0: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
3f00: 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  db);.    if( rc!
3f10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3f20: 20 20 20 20 7a 45 72 72 20 3d 20 6d 70 72 69 6e      zErr = mprin
3f30: 74 66 28 22 73 63 68 65 6d 61 20 66 61 69 6c 73  tf("schema fails
3f40: 20 74 6f 20 64 65 66 69 6e 65 20 61 20 76 61 6c   to define a val
3f50: 69 64 20 74 69 63 6b 65 74 20 74 61 62 6c 65 20  id ticket table 
3f60: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
3f70: 20 20 20 20 20 20 20 22 63 6f 6e 74 61 69 6e 69         "containi
3f80: 6e 67 20 61 6c 6c 20 72 65 71 75 69 72 65 64 20  ng all required 
3f90: 66 69 65 6c 64 73 22 29 3b 0a 20 20 20 20 20 20  fields");.      
3fa0: 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 20 20 20  return zErr;.   
3fb0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3fc0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  0;.}../*.** WEBP
3fd0: 41 47 45 3a 20 74 6b 74 68 69 73 74 6f 72 79 0a  AGE: tkthistory.
3fe0: 2a 2a 20 55 52 4c 3a 20 2f 74 6b 74 68 69 73 74  ** URL: /tkthist
3ff0: 6f 72 79 3f 6e 61 6d 65 3d 54 49 43 4b 45 54 55  ory?name=TICKETU
4000: 55 49 44 0a 2a 2a 0a 2a 2a 20 53 68 6f 77 20 74  UID.**.** Show t
4010: 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 68 61 6e  he complete chan
4020: 67 65 20 68 69 73 74 6f 72 79 20 66 6f 72 20 61  ge history for a
4030: 20 73 69 6e 67 6c 65 20 74 69 63 6b 65 74 0a 2a   single ticket.*
4040: 2f 0a 76 6f 69 64 20 74 6b 74 68 69 73 74 6f 72  /.void tkthistor
4050: 79 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20  y_page(void){.  
4060: 53 74 6d 74 20 71 3b 0a 20 20 63 68 61 72 20 2a  Stmt q;.  char *
4070: 7a 54 69 74 6c 65 3b 0a 20 20 63 68 61 72 20 2a  zTitle;.  char *
4080: 7a 53 51 4c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  zSQL;.  const ch
4090: 61 72 20 2a 7a 55 75 69 64 3b 0a 20 20 69 6e 74  ar *zUuid;.  int
40a0: 20 74 61 67 69 64 3b 0a 0a 20 20 6c 6f 67 69 6e   tagid;..  login
40b0: 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61  _check_credentia
40c0: 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f  ls();.  if( !g.o
40d0: 6b 48 69 73 74 6f 72 79 20 7c 7c 20 21 67 2e 6f  kHistory || !g.o
40e0: 6b 52 64 54 6b 74 20 29 7b 20 6c 6f 67 69 6e 5f  kRdTkt ){ login_
40f0: 6e 65 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e  needed(); return
4100: 3b 20 7d 0a 20 20 7a 55 75 69 64 20 3d 20 50 44  ; }.  zUuid = PD
4110: 28 22 6e 61 6d 65 22 2c 22 22 29 3b 0a 20 20 7a  ("name","");.  z
4120: 54 69 74 6c 65 20 3d 20 6d 70 72 69 6e 74 66 28  Title = mprintf(
4130: 22 48 69 73 74 6f 72 79 20 4f 66 20 54 69 63 6b  "History Of Tick
4140: 65 74 20 25 68 22 2c 20 7a 55 75 69 64 29 3b 0a  et %h", zUuid);.
4150: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 7a    style_header(z
4160: 54 69 74 6c 65 29 3b 0a 20 20 66 72 65 65 28 7a  Title);.  free(z
4170: 54 69 74 6c 65 29 3b 0a 0a 20 20 74 61 67 69 64  Title);..  tagid
4180: 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45   = db_int(0, "SE
4190: 4c 45 43 54 20 74 61 67 69 64 20 46 52 4f 4d 20  LECT tagid FROM 
41a0: 74 61 67 20 57 48 45 52 45 20 74 61 67 6e 61 6d  tag WHERE tagnam
41b0: 65 20 47 4c 4f 42 20 27 74 6b 74 2d 25 71 2a 27  e GLOB 'tkt-%q*'
41c0: 22 2c 7a 55 75 69 64 29 3b 0a 20 20 69 66 28 20  ",zUuid);.  if( 
41d0: 74 61 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  tagid==0 ){.    
41e0: 40 20 4e 6f 20 73 75 63 68 20 74 69 63 6b 65 74  @ No such ticket
41f0: 3a 20 25 68 28 7a 55 75 69 64 29 0a 20 20 20 20  : %h(zUuid).    
4200: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
4210: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
4220: 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66    zSQL = mprintf
4230: 28 22 25 73 20 41 4e 44 20 65 76 65 6e 74 2e 6f  ("%s AND event.o
4240: 62 6a 69 64 20 49 4e 20 22 0a 20 20 20 20 20 20  bjid IN ".      
4250: 20 20 20 20 20 20 20 20 20 20 20 22 20 20 28 53             "  (S
4260: 45 4c 45 43 54 20 72 69 64 20 46 52 4f 4d 20 74  ELECT rid FROM t
4270: 61 67 78 72 65 66 20 57 48 45 52 45 20 74 61 67  agxref WHERE tag
4280: 69 64 3d 25 64 29 20 22 0a 20 20 20 20 20 20 20  id=%d) ".       
4290: 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 52            "ORDER
42a0: 20 42 59 20 6d 74 69 6d 65 20 44 45 53 43 22 2c   BY mtime DESC",
42b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
42c0: 20 20 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72 79    timeline_query
42d0: 5f 66 6f 72 5f 77 77 77 28 29 2c 20 74 61 67 69  _for_www(), tagi
42e0: 64 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65  d);.  db_prepare
42f0: 28 26 71 2c 20 7a 53 51 4c 29 3b 0a 20 20 66 72  (&q, zSQL);.  fr
4300: 65 65 28 7a 53 51 4c 29 3b 0a 20 20 77 77 77 5f  ee(zSQL);.  www_
4310: 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 28 26  print_timeline(&
4320: 71 29 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a  q);.  db_finaliz
4330: 65 28 26 71 29 3b 0a 20 20 73 74 79 6c 65 5f 66  e(&q);.  style_f
4340: 6f 6f 74 65 72 28 29 3b 0a 7d 0a                 ooter();.}.