Hex Artifact Content
Not logged in

Artifact 6a7885da5389e52c42cab312a40c46ca8af7d1a6:

File src/report.c part of check-in [9e2d2676a4] - Fix a C++-ism in report.c. by drh on 2008-06-08 15:10:20.

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 61  lic.** License a
00b0: 73 20 70 75 62 6c 69 73 68 65 64 20 62 79 20 74  s published by t
00c0: 68 65 20 46 72 65 65 20 53 6f 66 74 77 61 72 65  he Free Software
00d0: 20 46 6f 75 6e 64 61 74 69 6f 6e 3b 20 65 69 74   Foundation; eit
00e0: 68 65 72 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 32  her.** version 2
00f0: 20 6f 66 20 74 68 65 20 4c 69 63 65 6e 73 65 2c   of the License,
0100: 20 6f 72 20 28 61 74 20 79 6f 75 72 20 6f 70 74   or (at your opt
0110: 69 6f 6e 29 20 61 6e 79 20 6c 61 74 65 72 20 76  ion) any later v
0120: 65 72 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ersion..**.** Th
0130: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0140: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65  stributed in the
0150: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69   hope that it wi
0160: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a  ll be useful,.**
0170: 20 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59   but WITHOUT ANY
0180: 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f   WARRANTY; witho
0190: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c  ut even the impl
01a0: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a  ied warranty of.
01b0: 2a 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49  ** MERCHANTABILI
01c0: 54 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f  TY or FITNESS FO
01d0: 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50  R A PARTICULAR P
01e0: 55 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65  URPOSE.  See the
01f0: 20 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20   GNU.** General 
0200: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66  Public License f
0210: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e  or more details.
0220: 0a 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75  .** .** You shou
0230: 6c 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64  ld have received
0240: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47   a copy of the G
0250: 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69  NU General Publi
0260: 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f  c.** License alo
0270: 6e 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62  ng with this lib
0280: 72 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72  rary; if not, wr
0290: 69 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72  ite to the.** Fr
02a0: 65 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e  ee Software Foun
02b0: 64 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39  dation, Inc., 59
02c0: 20 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20   Temple Place - 
02d0: 53 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f  Suite 330,.** Bo
02e0: 73 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d  ston, MA  02111-
02f0: 31 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a  1307, USA..**.**
0300: 20 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20   Author contact 
0310: 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20  information:.** 
0320: 20 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a    drh@hwaci.com.
0330: 2a 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e  **   http://www.
0340: 68 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a  hwaci.com/drh/.*
0350: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 0a 2a 2a 20 20 0a 2a 2a 20 43 6f 64 65 20 74  *.**  .** Code t
03b0: 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 62  o generate the b
03c0: 75 67 20 72 65 70 6f 72 74 20 6c 69 73 74 69 6e  ug report listin
03d0: 67 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  gs.*/.#include "
03e0: 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75  config.h".#inclu
03f0: 64 65 20 22 72 65 70 6f 72 74 2e 68 22 0a 23 69  de "report.h".#i
0400: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0410: 3e 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  >../* Forward re
0420: 66 65 72 65 6e 63 65 73 20 74 6f 20 73 74 61 74  ferences to stat
0430: 69 63 20 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 73  ic routines */.s
0440: 74 61 74 69 63 20 76 6f 69 64 20 72 65 70 6f 72  tatic void repor
0450: 74 5f 66 6f 72 6d 61 74 5f 68 69 6e 74 73 28 76  t_format_hints(v
0460: 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 57 45 42  oid);../*.** WEB
0470: 50 41 47 45 3a 20 2f 72 65 70 6f 72 74 6c 69 73  PAGE: /reportlis
0480: 74 0a 2a 2f 0a 76 6f 69 64 20 76 69 65 77 5f 6c  t.*/.void view_l
0490: 69 73 74 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d  ist(void){.  Stm
04a0: 74 20 71 3b 0a 20 20 69 6e 74 20 72 6e 20 3d 20  t q;.  int rn = 
04b0: 30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 31  0;.  int cnt = 1
04c0: 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b  ;..  login_check
04d0: 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a  _credentials();.
04e0: 20 20 69 66 28 20 21 67 2e 6f 6b 52 64 54 6b 74    if( !g.okRdTkt
04f0: 20 26 26 20 21 67 2e 6f 6b 4e 65 77 54 6b 74 20   && !g.okNewTkt 
0500: 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28  ){ login_needed(
0510: 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 73  ); return; }.  s
0520: 74 79 6c 65 5f 68 65 61 64 65 72 28 22 42 75 67  tyle_header("Bug
0530: 20 52 65 70 6f 72 74 20 4d 61 69 6e 20 4d 65 6e   Report Main Men
0540: 75 22 29 3b 0a 20 20 69 66 28 20 67 2e 6f 6b 4e  u");.  if( g.okN
0550: 65 77 54 6b 74 20 29 7b 0a 20 20 20 20 40 20 3c  ewTkt ){.    @ <
0560: 70 3e 45 6e 74 65 72 20 61 20 6e 65 77 20 62 75  p>Enter a new bu
0570: 67 20 72 65 70 6f 72 74 3a 3c 2f 70 3e 0a 20 20  g report:</p>.  
0580: 20 20 40 20 3c 6f 6c 3e 3c 6c 69 20 76 61 6c 75    @ <ol><li valu
0590: 65 3d 22 31 22 3e 3c 61 20 68 72 65 66 3d 22 74  e="1"><a href="t
05a0: 6b 74 6e 65 77 22 3e 4e 65 77 20 62 75 67 20 72  ktnew">New bug r
05b0: 65 70 6f 72 74 3c 2f 61 3e 3c 2f 6c 69 3e 3c 2f  eport</a></li></
05c0: 6f 6c 3e 0a 20 20 20 20 40 0a 20 20 7d 0a 20 20  ol>.    @.  }.  
05d0: 69 66 28 20 21 67 2e 6f 6b 52 64 54 6b 74 20 29  if( !g.okRdTkt )
05e0: 7b 0a 20 20 20 20 40 20 3c 70 3e 59 6f 75 20 61  {.    @ <p>You a
05f0: 72 65 20 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65  re not authorize
0600: 64 20 74 6f 20 76 69 65 77 20 65 78 69 73 74 69  d to view existi
0610: 6e 67 20 62 75 67 20 72 65 70 6f 72 74 73 2e 3c  ng bug reports.<
0620: 2f 70 3e 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /p>.  }else{.   
0630: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20   db_prepare(&q, 
0640: 22 53 45 4c 45 43 54 20 72 6e 2c 20 74 69 74 6c  "SELECT rn, titl
0650: 65 2c 20 6f 77 6e 65 72 20 46 52 4f 4d 20 72 65  e, owner FROM re
0660: 70 6f 72 74 66 6d 74 20 4f 52 44 45 52 20 42 59  portfmt ORDER BY
0670: 20 74 69 74 6c 65 22 29 3b 0a 20 20 20 20 40 20   title");.    @ 
0680: 3c 70 3e 43 68 6f 6f 73 65 20 61 20 72 65 70 6f  <p>Choose a repo
0690: 72 74 20 66 6f 72 6d 61 74 20 66 72 6f 6d 20 74  rt format from t
06a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 73  he following lis
06b0: 74 3a 3c 2f 70 3e 0a 20 20 20 20 40 20 3c 6f 6c  t:</p>.    @ <ol
06c0: 3e 0a 20 20 20 20 77 68 69 6c 65 28 20 64 62 5f  >.    while( db_
06d0: 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45  step(&q)==SQLITE
06e0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 6f  _ROW ){.      co
06f0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 69 74 6c 65  nst char *zTitle
0700: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
0710: 74 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 20 20  t(&q, 1);.      
0720: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 77 6e  const char *zOwn
0730: 65 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  er = db_column_t
0740: 65 78 74 28 26 71 2c 20 32 29 3b 0a 20 20 20 20  ext(&q, 2);.    
0750: 20 20 72 6e 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e    rn = db_column
0760: 5f 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 20  _int(&q, 0);.   
0770: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
0780: 40 20 3c 6c 69 20 76 61 6c 75 65 3d 22 25 64 28  @ <li value="%d(
0790: 63 6e 74 29 22 3e 3c 61 20 68 72 65 66 3d 22 72  cnt)"><a href="r
07a0: 70 74 76 69 65 77 3f 72 6e 3d 25 64 28 72 6e 29  ptview?rn=%d(rn)
07b0: 22 0a 20 20 20 20 20 20 40 20 20 20 20 20 20 20  ".      @       
07c0: 20 72 65 6c 3d 22 6e 6f 66 6f 6c 6c 6f 77 22 3e   rel="nofollow">
07d0: 25 68 28 7a 54 69 74 6c 65 29 3c 2f 61 3e 26 6e  %h(zTitle)</a>&n
07e0: 62 73 70 3b 26 6e 62 73 70 3b 26 6e 62 73 70 3b  bsp;&nbsp;&nbsp;
07f0: 0a 20 20 20 20 20 20 69 66 28 20 67 2e 6f 6b 57  .      if( g.okW
0800: 72 69 74 65 20 26 26 20 7a 4f 77 6e 65 72 20 26  rite && zOwner &
0810: 26 20 7a 4f 77 6e 65 72 5b 30 5d 20 29 7b 0a 20  & zOwner[0] ){. 
0820: 20 20 20 20 20 20 20 40 20 28 62 79 20 3c 69 3e         @ (by <i>
0830: 25 68 28 7a 4f 77 6e 65 72 29 3c 2f 69 3e 29 0a  %h(zOwner)</i>).
0840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
0850: 28 20 67 2e 6f 6b 54 6b 74 46 6d 74 20 29 7b 0a  ( g.okTktFmt ){.
0860: 20 20 20 20 20 20 20 20 40 20 5b 3c 61 20 68 72          @ [<a hr
0870: 65 66 3d 22 72 70 74 65 64 69 74 3f 72 6e 3d 25  ef="rptedit?rn=%
0880: 64 28 72 6e 29 26 61 6d 70 3b 63 6f 70 79 3d 31  d(rn)&amp;copy=1
0890: 22 20 72 65 6c 3d 22 6e 6f 66 6f 6c 6c 6f 77 22  " rel="nofollow"
08a0: 3e 63 6f 70 79 3c 2f 61 3e 5d 0a 20 20 20 20 20  >copy</a>].     
08b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 2e 6f   }.      if( g.o
08c0: 6b 41 64 6d 69 6e 20 7c 7c 20 28 67 2e 6f 6b 57  kAdmin || (g.okW
08d0: 72 54 6b 74 20 26 26 20 7a 4f 77 6e 65 72 20 26  rTkt && zOwner &
08e0: 26 20 73 74 72 63 6d 70 28 67 2e 7a 4c 6f 67 69  & strcmp(g.zLogi
08f0: 6e 2c 7a 4f 77 6e 65 72 29 3d 3d 30 29 20 29 7b  n,zOwner)==0) ){
0900: 0a 20 20 20 20 20 20 20 20 40 20 5b 3c 61 20 68  .        @ [<a h
0910: 72 65 66 3d 22 72 70 74 65 64 69 74 3f 72 6e 3d  ref="rptedit?rn=
0920: 25 64 28 72 6e 29 22 20 72 65 6c 3d 22 6e 6f 66  %d(rn)" rel="nof
0930: 6f 6c 6c 6f 77 22 3e 65 64 69 74 3c 2f 61 3e 5d  ollow">edit</a>]
0940: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 40  .      }.      @
0950: 20 5b 3c 61 20 68 72 65 66 3d 22 72 70 74 73 71   [<a href="rptsq
0960: 6c 3f 72 6e 3d 25 64 28 72 6e 29 22 20 72 65 6c  l?rn=%d(rn)" rel
0970: 3d 22 6e 6f 66 6f 6c 6c 6f 77 22 3e 73 71 6c 3c  ="nofollow">sql<
0980: 2f 61 3e 5d 0a 20 20 20 20 20 20 40 20 3c 2f 6c  /a>].      @ </l
0990: 69 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 40  i>.    }.  }.  @
09a0: 20 3c 2f 6f 6c 3e 0a 20 20 69 66 28 20 67 2e 6f   </ol>.  if( g.o
09b0: 6b 54 6b 74 46 6d 74 20 29 7b 0a 20 20 20 20 40  kTktFmt ){.    @
09c0: 20 3c 70 3e 43 72 65 61 74 65 20 61 20 6e 65 77   <p>Create a new
09d0: 20 62 75 67 20 72 65 70 6f 72 74 20 64 69 73 70   bug report disp
09e0: 6c 61 79 20 66 6f 72 6d 61 74 3a 3c 2f 70 3e 0a  lay format:</p>.
09f0: 20 20 20 20 40 20 3c 6f 6c 3e 0a 20 20 20 20 40      @ <ol>.    @
0a00: 20 3c 6c 69 20 76 61 6c 75 65 3d 22 25 64 28 63   <li value="%d(c
0a10: 6e 74 2b 31 29 22 3e 3c 61 20 68 72 65 66 3d 22  nt+1)"><a href="
0a20: 72 70 74 6e 65 77 22 3e 4e 65 77 20 72 65 70 6f  rptnew">New repo
0a30: 72 74 20 66 6f 72 6d 61 74 3c 2f 61 3e 3c 2f 6c  rt format</a></l
0a40: 69 3e 0a 20 20 20 20 40 20 3c 2f 6f 6c 3e 0a 20  i>.    @ </ol>. 
0a50: 20 7d 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65   }.  style_foote
0a60: 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  r();.}../*.** Re
0a70: 6d 6f 76 65 20 77 68 69 74 65 73 70 61 63 65 20  move whitespace 
0a80: 66 72 6f 6d 20 62 6f 74 68 20 65 6e 64 73 20 6f  from both ends o
0a90: 66 20 61 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 63  f a string..*/.c
0aa0: 68 61 72 20 2a 74 72 69 6d 5f 73 74 72 69 6e 67  har *trim_string
0ab0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72  (const char *zOr
0ac0: 69 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ig){.  int i;.  
0ad0: 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a  while( isspace(*
0ae0: 7a 4f 72 69 67 29 20 29 7b 20 7a 4f 72 69 67 2b  zOrig) ){ zOrig+
0af0: 2b 3b 20 7d 0a 20 20 69 20 3d 20 73 74 72 6c 65  +; }.  i = strle
0b00: 6e 28 7a 4f 72 69 67 29 3b 0a 20 20 77 68 69 6c  n(zOrig);.  whil
0b10: 65 28 20 69 3e 30 20 26 26 20 69 73 73 70 61 63  e( i>0 && isspac
0b20: 65 28 7a 4f 72 69 67 5b 69 2d 31 5d 29 20 29 7b  e(zOrig[i-1]) ){
0b30: 20 69 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e   i--; }.  return
0b40: 20 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c   mprintf("%.*s",
0b50: 20 69 2c 20 7a 4f 72 69 67 29 3b 0a 7d 0a 0a 2f   i, zOrig);.}../
0b60: 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20 61 20 6e  *.** Extract a n
0b70: 75 6d 65 72 69 63 20 28 69 6e 74 65 67 65 72 29  umeric (integer)
0b80: 20 76 61 6c 75 65 20 66 72 6f 6d 20 61 20 73 74   value from a st
0b90: 72 69 6e 67 2e 0a 2a 2f 0a 63 68 61 72 20 2a 65  ring..*/.char *e
0ba0: 78 74 72 61 63 74 5f 69 6e 74 65 67 65 72 28 63  xtract_integer(c
0bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
0bc0: 29 7b 0a 20 20 69 66 28 20 7a 4f 72 69 67 20 3d  ){.  if( zOrig =
0bd0: 3d 20 4e 55 4c 4c 20 7c 7c 20 7a 4f 72 69 67 5b  = NULL || zOrig[
0be0: 30 5d 20 3d 3d 20 30 20 29 20 72 65 74 75 72 6e  0] == 0 ) return
0bf0: 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a   "";.  while( *z
0c00: 4f 72 69 67 20 26 26 20 21 69 73 64 69 67 69 74  Orig && !isdigit
0c10: 28 2a 7a 4f 72 69 67 29 20 29 7b 20 7a 4f 72 69  (*zOrig) ){ zOri
0c20: 67 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 4f  g++; }.  if( *zO
0c30: 72 69 67 20 29 7b 0a 20 20 20 20 2f 2a 20 77 65  rig ){.    /* we
0c40: 20 68 61 76 65 20 61 20 64 69 67 69 74 2e 20 61   have a digit. a
0c50: 74 6f 69 28 29 20 77 69 6c 6c 20 67 65 74 20 61  toi() will get a
0c60: 73 20 6d 75 63 68 20 6f 66 20 74 68 65 20 6e 75  s much of the nu
0c70: 6d 62 65 72 20 61 73 20 69 74 0a 20 20 20 20 2a  mber as it.    *
0c80: 2a 20 63 61 6e 2e 20 57 65 27 6c 6c 20 72 75 6e  * can. We'll run
0c90: 20 69 74 20 74 68 72 6f 75 67 68 20 6d 70 72 69   it through mpri
0ca0: 6e 74 66 28 29 20 74 6f 20 67 65 74 20 61 20 73  ntf() to get a s
0cb0: 74 72 69 6e 67 2e 20 4e 6f 74 0a 20 20 20 20 2a  tring. Not.    *
0cc0: 2a 20 61 6e 20 65 66 66 69 63 69 65 6e 74 20 77  * an efficient w
0cd0: 61 79 20 74 6f 20 64 6f 20 69 74 2c 20 62 75 74  ay to do it, but
0ce0: 20 65 66 66 65 63 74 69 76 65 2e 0a 20 20 20 20   effective..    
0cf0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 70  */.    return mp
0d00: 72 69 6e 74 66 28 22 25 64 22 2c 20 61 74 6f 69  rintf("%d", atoi
0d10: 28 7a 4f 72 69 67 29 29 3b 0a 20 20 7d 0a 20 20  (zOrig));.  }.  
0d20: 72 65 74 75 72 6e 20 22 22 3b 0a 7d 0a 0a 2f 2a  return "";.}../*
0d30: 0a 2a 2a 20 52 65 6d 6f 76 65 20 62 6c 61 6e 6b  .** Remove blank
0d40: 20 6c 69 6e 65 73 20 66 72 6f 6d 20 74 68 65 20   lines from the 
0d50: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 73  beginning of a s
0d60: 74 72 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6c 6c  tring and.** all
0d70: 20 77 68 69 74 65 73 70 61 63 65 20 66 72 6f 6d   whitespace from
0d80: 20 74 68 65 20 65 6e 64 2e 20 52 65 6d 6f 76 65   the end. Remove
0d90: 73 20 77 68 69 74 65 73 70 61 63 65 20 70 72 65  s whitespace pre
0da0: 63 65 65 64 69 6e 67 20 61 20 4e 4c 2c 0a 2a 2a  ceeding a NL,.**
0db0: 20 77 68 69 63 68 20 61 6c 73 6f 20 63 6f 6e 76   which also conv
0dc0: 65 72 74 73 20 61 6e 79 20 43 52 4e 4c 20 73 65  erts any CRNL se
0dd0: 71 75 65 6e 63 65 20 69 6e 74 6f 20 61 20 73 69  quence into a si
0de0: 6e 67 6c 65 20 4e 4c 2e 0a 2a 2f 0a 63 68 61 72  ngle NL..*/.char
0df0: 20 2a 72 65 6d 6f 76 65 5f 62 6c 61 6e 6b 5f 6c   *remove_blank_l
0e00: 69 6e 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  ines(const char 
0e10: 2a 7a 4f 72 69 67 29 7b 0a 20 20 69 6e 74 20 69  *zOrig){.  int i
0e20: 2c 20 6a 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , j, n;.  char *
0e30: 7a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  z;.  for(i=j=0; 
0e40: 69 73 73 70 61 63 65 28 7a 4f 72 69 67 5b 69 5d  isspace(zOrig[i]
0e50: 29 3b 20 69 2b 2b 29 7b 20 69 66 28 20 7a 4f 72  ); i++){ if( zOr
0e60: 69 67 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6a 20  ig[i]=='\n' ) j 
0e70: 3d 20 69 2b 31 3b 20 7d 0a 20 20 6e 20 3d 20 73  = i+1; }.  n = s
0e80: 74 72 6c 65 6e 28 26 7a 4f 72 69 67 5b 6a 5d 29  trlen(&zOrig[j])
0e90: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  ;.  while( n>0 &
0ea0: 26 20 69 73 73 70 61 63 65 28 7a 4f 72 69 67 5b  & isspace(zOrig[
0eb0: 6a 2b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20  j+n-1]) ){ n--; 
0ec0: 7d 0a 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66 28  }.  z = mprintf(
0ed0: 22 25 2e 2a 73 22 2c 20 6e 2c 20 26 7a 4f 72 69  "%.*s", n, &zOri
0ee0: 67 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 6a  g[j]);.  for(i=j
0ef0: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
0f00: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
0f10: 27 5c 6e 27 20 26 26 20 7a 5b 69 5d 21 3d 27 5c  '\n' && z[i]!='\
0f20: 6e 27 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b  n' && isspace(z[
0f30: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 7a 5b 6a  i]) ){.      z[j
0f40: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
0f50: 77 68 69 6c 65 28 69 73 73 70 61 63 65 28 7a 5b  while(isspace(z[
0f60: 6a 5d 29 20 26 26 20 7a 5b 6a 5d 20 21 3d 20 27  j]) && z[j] != '
0f70: 5c 6e 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  \n' ){ j--; }.  
0f80: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 63      j++;.      c
0f90: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
0fa0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
0fb0: 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20  ];.  }.  z[j] = 
0fc0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  0;.  return z;.}
0fd0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
0fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1020: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 53 51  * This is the SQ
1030: 4c 69 74 65 20 61 75 74 68 6f 72 69 7a 65 72 20  Lite authorizer 
1040: 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 74 6f  callback used to
1050: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1060: 74 68 65 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65  the.** SQL state
1070: 6d 65 6e 74 73 20 65 6e 74 65 72 65 64 20 62 79  ments entered by
1080: 20 75 73 65 72 73 20 64 6f 20 6e 6f 74 20 74 72   users do not tr
1090: 79 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67  y to do anything
10a0: 20 75 6e 74 6f 77 61 72 64 2e 0a 2a 2a 20 49 66   untoward..** If
10b0: 20 61 6e 79 74 68 69 6e 67 20 73 75 73 70 69 63   anything suspic
10c0: 69 6f 75 73 20 69 73 20 74 72 69 65 64 2c 20 73  ious is tried, s
10d0: 65 74 20 2a 28 63 68 61 72 2a 2a 29 70 45 72 72  et *(char**)pErr
10e0: 6f 72 20 74 6f 20 61 6e 20 65 72 72 6f 72 0a 2a  or to an error.*
10f0: 2a 20 6d 65 73 73 61 67 65 20 6f 62 74 61 69 6e  * message obtain
1100: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ed from malloc..
1110: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1120: 70 6f 72 74 5f 71 75 65 72 79 5f 61 75 74 68 6f  port_query_autho
1130: 72 69 7a 65 72 28 0a 20 20 76 6f 69 64 20 2a 70  rizer(.  void *p
1140: 45 72 72 6f 72 2c 0a 20 20 69 6e 74 20 63 6f 64  Error,.  int cod
1150: 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e,.  const char 
1160: 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73 74 20  *zArg1,.  const 
1170: 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20 20 63  char *zArg2,.  c
1180: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 33  onst char *zArg3
1190: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
11a0: 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68 61 72 20  zArg4.){.  char 
11b0: 2a 7a 45 72 72 6f 72 20 3d 20 2a 28 63 68 61 72  *zError = *(char
11c0: 2a 2a 29 70 45 72 72 6f 72 3b 0a 20 20 69 66 28  **)pError;.  if(
11d0: 20 7a 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 2f   zError ){.    /
11e0: 2a 20 57 65 27 76 65 20 61 6c 72 65 61 64 79 20  * We've already 
11f0: 73 65 65 6e 20 61 6e 20 65 72 72 6f 72 2e 20 20  seen an error.  
1200: 4e 6f 20 6e 65 65 64 20 74 6f 20 63 6f 6e 74 69  No need to conti
1210: 6e 75 65 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  nue. */.    retu
1220: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1230: 7d 0a 20 20 73 77 69 74 63 68 28 20 63 6f 64 65  }.  switch( code
1240: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
1250: 49 54 45 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20  ITE_SELECT:.    
1260: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4e 43  case SQLITE_FUNC
1270: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 62 72  TION: {.      br
1280: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1290: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 3a  ase SQLITE_READ:
12a0: 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20   {.      static 
12b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 6c  const char *azAl
12c0: 6c 6f 77 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  lowed[] = {.    
12d0: 20 20 20 20 20 22 74 69 63 6b 65 74 22 2c 0a 20       "ticket",. 
12e0: 20 20 20 20 20 20 20 20 22 62 6c 6f 62 22 2c 0a          "blob",.
12f0: 20 20 20 20 20 20 20 20 20 22 66 69 6c 65 6e 61           "filena
1300: 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 20 22 6d  me",.         "m
1310: 6c 69 6e 6b 22 2c 0a 20 20 20 20 20 20 20 20 20  link",.         
1320: 22 70 6c 69 6e 6b 22 2c 0a 20 20 20 20 20 20 20  "plink",.       
1330: 20 20 22 65 76 65 6e 74 22 2c 0a 20 20 20 20 20    "event",.     
1340: 20 20 20 20 22 74 61 67 22 2c 0a 20 20 20 20 20      "tag",.     
1350: 20 20 20 20 22 74 61 67 78 72 65 66 22 2c 0a 20      "tagxref",. 
1360: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69 6e       };.      in
1370: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
1380: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 41  =0; i<sizeof(azA
1390: 6c 6c 6f 77 65 64 29 2f 73 69 7a 65 6f 66 28 61  llowed)/sizeof(a
13a0: 7a 41 6c 6c 6f 77 65 64 5b 30 5d 29 3b 20 69 2b  zAllowed[0]); i+
13b0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
13c0: 73 74 72 63 61 73 65 63 6d 70 28 7a 41 72 67 31  strcasecmp(zArg1
13d0: 2c 20 61 7a 41 6c 6c 6f 77 65 64 5b 69 5d 29 3d  , azAllowed[i])=
13e0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
13f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
1400: 3d 73 69 7a 65 6f 66 28 61 7a 41 6c 6c 6f 77 65  =sizeof(azAllowe
1410: 64 29 2f 73 69 7a 65 6f 66 28 61 7a 41 6c 6c 6f  d)/sizeof(azAllo
1420: 77 65 64 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  wed[0]) ){.     
1430: 20 20 20 7a 45 72 72 6f 72 20 3d 20 6d 70 72 69     zError = mpri
1440: 6e 74 66 28 22 63 61 6e 6e 6f 74 20 61 63 63 65  ntf("cannot acce
1450: 73 73 20 74 61 62 6c 65 20 25 73 22 2c 20 7a 41  ss table %s", zA
1460: 72 67 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rg1);.      }.  
1470: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1480: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
1490: 20 20 20 20 20 20 7a 45 72 72 6f 72 20 3d 20 6d        zError = m
14a0: 70 72 69 6e 74 66 28 22 6f 6e 6c 79 20 53 45 4c  printf("only SEL
14b0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ECT statements a
14c0: 72 65 20 61 6c 6c 6f 77 65 64 22 29 3b 0a 20 20  re allowed");.  
14d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
14f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
1500: 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 67 69 76  ** Check the giv
1510: 65 6e 20 53 51 4c 20 74 6f 20 73 65 65 20 69 66  en SQL to see if
1520: 20 69 73 20 61 20 76 61 6c 69 64 20 71 75 65 72   is a valid quer
1530: 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a  y that does not.
1540: 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 64 6f  ** attempt to do
1550: 20 61 6e 79 74 68 69 6e 67 20 64 61 6e 67 65 72   anything danger
1560: 6f 75 73 2e 20 20 52 65 74 75 72 6e 20 30 20 6f  ous.  Return 0 o
1570: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 0a  n success and a.
1580: 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e  ** pointer to an
1590: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
15a0: 74 72 69 6e 67 20 28 6f 62 74 61 69 6e 65 64 20  tring (obtained 
15b0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 29 20 69 66 0a  from malloc) if.
15c0: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 70 72  ** there is a pr
15d0: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 63 68 61 72 20 2a  oblem..*/.char *
15e0: 76 65 72 69 66 79 5f 73 71 6c 5f 73 74 61 74 65  verify_sql_state
15f0: 6d 65 6e 74 28 63 68 61 72 20 2a 7a 53 71 6c 29  ment(char *zSql)
1600: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
1610: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63  r *zErr = 0;.  c
1620: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c  onst char *zTail
1630: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1640: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
1650: 63 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 6d  c;..  /* First m
1660: 61 6b 65 20 73 75 72 65 20 74 68 65 20 53 51 4c  ake sure the SQL
1670: 20 69 73 20 61 20 73 69 6e 67 6c 65 20 71 75 65   is a single que
1680: 72 79 20 63 6f 6d 6d 61 6e 64 20 62 79 20 76 65  ry command by ve
1690: 72 69 66 79 69 6e 67 20 74 68 61 74 0a 20 20 2a  rifying that.  *
16a0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 6f 6b 65  * the first toke
16b0: 6e 20 69 73 20 22 53 45 4c 45 43 54 22 20 61 6e  n is "SELECT" an
16c0: 64 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  d that there are
16d0: 20 6e 6f 20 75 6e 71 75 6f 74 65 64 20 73 65 6d   no unquoted sem
16e0: 69 63 6f 6c 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  icolons..  */.  
16f0: 66 6f 72 28 69 3d 30 3b 20 69 73 73 70 61 63 65  for(i=0; isspace
1700: 28 7a 53 71 6c 5b 69 5d 29 3b 20 69 2b 2b 29 7b  (zSql[i]); i++){
1710: 7d 0a 20 20 69 66 28 20 73 74 72 6e 63 61 73 65  }.  if( strncase
1720: 63 6d 70 28 26 7a 53 71 6c 5b 69 5d 2c 22 73 65  cmp(&zSql[i],"se
1730: 6c 65 63 74 22 2c 36 29 21 3d 30 20 29 7b 0a 20  lect",6)!=0 ){. 
1740: 20 20 20 72 65 74 75 72 6e 20 6d 70 72 69 6e 74     return mprint
1750: 66 28 22 54 68 65 20 53 51 4c 20 6d 75 73 74 20  f("The SQL must 
1760: 62 65 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  be a SELECT stat
1770: 65 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 66  ement");.  }.  f
1780: 6f 72 28 69 3d 30 3b 20 7a 53 71 6c 5b 69 5d 3b  or(i=0; zSql[i];
1790: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
17a0: 53 71 6c 5b 69 5d 3d 3d 27 3b 27 20 29 7b 0a 20  Sql[i]==';' ){. 
17b0: 20 20 20 20 20 69 6e 74 20 62 61 64 3b 0a 20 20       int bad;.  
17c0: 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 53 71 6c      int c = zSql
17d0: 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 7a 53 71  [i+1];.      zSq
17e0: 6c 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  l[i+1] = 0;.    
17f0: 20 20 62 61 64 20 3d 20 73 71 6c 69 74 65 33 5f    bad = sqlite3_
1800: 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 29 3b 0a  complete(zSql);.
1810: 20 20 20 20 20 20 7a 53 71 6c 5b 69 2b 31 5d 20        zSql[i+1] 
1820: 3d 20 63 3b 0a 20 20 20 20 20 20 69 66 28 20 62  = c;.      if( b
1830: 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ad ){.        /*
1840: 20 41 20 63 6f 6d 70 6c 65 74 65 20 73 74 61 74   A complete stat
1850: 65 6d 65 6e 74 20 62 61 73 69 63 61 6c 6c 79 20  ement basically 
1860: 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20 75 6e  means that an un
1870: 71 75 6f 74 65 64 20 73 65 6d 69 2d 63 6f 6c 6f  quoted semi-colo
1880: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 61 73  n.        ** was
1890: 20 66 6f 75 6e 64 2e 20 57 65 20 64 6f 6e 27 74   found. We don't
18a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
18b0: 77 68 61 74 27 73 20 61 66 74 65 72 20 74 68 61  what's after tha
18c0: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
18d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 70 72        return mpr
18e0: 69 6e 74 66 28 22 53 65 6d 69 2d 63 6f 6c 6f 6e  intf("Semi-colon
18f0: 20 64 65 74 65 63 74 65 64 21 20 22 0a 20 20 20   detected! ".   
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1910: 20 20 20 20 22 4f 6e 6c 79 20 61 20 73 69 6e 67      "Only a sing
1920: 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  le SQL statement
1930: 20 69 73 20 61 6c 6c 6f 77 65 64 22 29 3b 0a 20   is allowed");. 
1940: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1950: 0a 20 20 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  .  .  /* Compile
1960: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 61   the statement a
1970: 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 69 6c 6c  nd check for ill
1980: 65 67 61 6c 20 61 63 63 65 73 73 65 73 20 6f 72  egal accesses or
1990: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73 2e 20   syntax errors. 
19a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 74  */.  sqlite3_set
19b0: 5f 61 75 74 68 6f 72 69 7a 65 72 28 67 2e 64 62  _authorizer(g.db
19c0: 2c 20 72 65 70 6f 72 74 5f 71 75 65 72 79 5f 61  , report_query_a
19d0: 75 74 68 6f 72 69 7a 65 72 2c 20 28 76 6f 69 64  uthorizer, (void
19e0: 2a 29 26 7a 45 72 72 29 3b 0a 20 20 72 63 20 3d  *)&zErr);.  rc =
19f0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1a00: 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  (g.db, zSql, -1,
1a10: 20 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29   &pStmt, &zTail)
1a20: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 45 72  TE_OK ){.    zEr
1a40: 72 20 3d 20 6d 70 72 69 6e 74 66 28 22 53 79 6e  r = mprintf("Syn
1a50: 74 61 78 20 65 72 72 6f 72 3a 20 25 73 22 2c 20  tax error: %s", 
1a60: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 67  sqlite3_errmsg(g
1a70: 2e 64 62 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  .db));.  }.  if(
1a80: 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71   pStmt ){.    sq
1a90: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1aa0: 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Stmt);.  }.  sql
1ab0: 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69  ite3_set_authori
1ac0: 7a 65 72 28 67 2e 64 62 2c 20 30 2c 20 30 29 3b  zer(g.db, 0, 0);
1ad0: 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a  .  return zErr;.
1ae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45  }../*.** WEBPAGE
1af0: 3a 20 2f 72 70 74 73 71 6c 0a 2a 2f 0a 76 6f 69  : /rptsql.*/.voi
1b00: 64 20 76 69 65 77 5f 73 65 65 5f 73 71 6c 28 76  d view_see_sql(v
1b10: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72 6e 3b 0a  oid){.  int rn;.
1b20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1b30: 69 74 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  itle;.  const ch
1b40: 61 72 20 2a 7a 53 51 4c 3b 0a 20 20 63 6f 6e 73  ar *zSQL;.  cons
1b50: 74 20 63 68 61 72 20 2a 7a 4f 77 6e 65 72 3b 0a  t char *zOwner;.
1b60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1b70: 6c 72 4b 65 79 3b 0a 20 20 53 74 6d 74 20 71 3b  lrKey;.  Stmt q;
1b80: 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f  ..  login_check_
1b90: 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20  credentials();. 
1ba0: 20 69 66 28 20 21 67 2e 6f 6b 51 75 65 72 79 20   if( !g.okQuery 
1bb0: 29 7b 0a 20 20 20 20 6c 6f 67 69 6e 5f 6e 65 65  ){.    login_nee
1bc0: 64 65 64 28 29 3b 0a 20 20 20 20 72 65 74 75 72  ded();.    retur
1bd0: 6e 3b 0a 20 20 7d 0a 20 20 72 6e 20 3d 20 61 74  n;.  }.  rn = at
1be0: 6f 69 28 50 44 28 22 72 6e 22 2c 22 30 22 29 29  oi(PD("rn","0"))
1bf0: 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26  ;.  db_prepare(&
1c00: 71 2c 20 22 53 45 4c 45 43 54 20 74 69 74 6c 65  q, "SELECT title
1c10: 2c 20 73 71 6c 63 6f 64 65 2c 20 6f 77 6e 65 72  , sqlcode, owner
1c20: 2c 20 63 6f 6c 73 20 22 0a 20 20 20 20 20 20 20  , cols ".       
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52 4f              "FRO
1c40: 4d 20 72 65 70 6f 72 74 66 6d 74 20 57 48 45 52  M reportfmt WHER
1c50: 45 20 72 6e 3d 25 64 22 2c 72 6e 29 3b 0a 20 20  E rn=%d",rn);.  
1c60: 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 53 51  style_header("SQ
1c70: 4c 20 46 6f 72 20 52 65 70 6f 72 74 20 46 6f 72  L For Report For
1c80: 6d 61 74 20 4e 75 6d 62 65 72 20 25 64 22 2c 20  mat Number %d", 
1c90: 72 6e 29 3b 0a 20 20 69 66 28 20 64 62 5f 73 74  rn);.  if( db_st
1ca0: 65 70 28 26 71 29 21 3d 53 51 4c 49 54 45 5f 52  ep(&q)!=SQLITE_R
1cb0: 4f 57 20 29 7b 0a 20 20 20 20 40 20 3c 70 3e 55  OW ){.    @ <p>U
1cc0: 6e 6b 6e 6f 77 6e 20 72 65 70 6f 72 74 20 6e 75  nknown report nu
1cd0: 6d 62 65 72 3a 20 25 64 28 72 6e 29 3c 2f 70 3e  mber: %d(rn)</p>
1ce0: 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65  .    style_foote
1cf0: 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  r();.    return;
1d00: 0a 20 20 7d 0a 20 20 7a 54 69 74 6c 65 20 3d 20  .  }.  zTitle = 
1d10: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
1d20: 71 2c 20 30 29 3b 0a 20 20 7a 53 51 4c 20 3d 20  q, 0);.  zSQL = 
1d30: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
1d40: 71 2c 20 31 29 3b 0a 20 20 7a 4f 77 6e 65 72 20  q, 1);.  zOwner 
1d50: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
1d60: 28 26 71 2c 20 32 29 3b 0a 20 20 7a 43 6c 72 4b  (&q, 2);.  zClrK
1d70: 65 79 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  ey = db_column_t
1d80: 65 78 74 28 26 71 2c 20 33 29 3b 0a 20 20 40 20  ext(&q, 3);.  @ 
1d90: 3c 74 61 62 6c 65 20 63 65 6c 6c 70 61 64 64 69  <table cellpaddi
1da0: 6e 67 3d 30 20 63 65 6c 6c 73 70 61 63 69 6e 67  ng=0 cellspacing
1db0: 3d 30 20 62 6f 72 64 65 72 3d 30 3e 0a 20 20 40  =0 border=0>.  @
1dc0: 20 3c 74 72 3e 3c 74 64 20 76 61 6c 69 67 6e 3d   <tr><td valign=
1dd0: 22 74 6f 70 22 20 61 6c 69 67 6e 3d 22 72 69 67  "top" align="rig
1de0: 68 74 22 3e 54 69 74 6c 65 3a 3c 2f 74 64 3e 3c  ht">Title:</td><
1df0: 74 64 20 77 69 64 74 68 3d 31 35 3e 3c 2f 74 64  td width=15></td
1e00: 3e 0a 20 20 40 20 3c 74 64 20 63 6f 6c 73 70 61  >.  @ <td colspa
1e10: 6e 3d 33 3e 25 68 28 7a 54 69 74 6c 65 29 3c 2f  n=3>%h(zTitle)</
1e20: 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72  td></tr>.  @ <tr
1e30: 3e 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70  ><td valign="top
1e40: 22 20 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 3e  " align="right">
1e50: 4f 77 6e 65 72 3a 3c 2f 74 64 3e 3c 74 64 3e 3c  Owner:</td><td><
1e60: 2f 74 64 3e 0a 20 20 40 20 3c 74 64 20 63 6f 6c  /td>.  @ <td col
1e70: 73 70 61 6e 3d 33 3e 25 68 28 7a 4f 77 6e 65 72  span=3>%h(zOwner
1e80: 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20  )</td></tr>.  @ 
1e90: 3c 74 72 3e 3c 74 64 20 76 61 6c 69 67 6e 3d 22  <tr><td valign="
1ea0: 74 6f 70 22 20 61 6c 69 67 6e 3d 22 72 69 67 68  top" align="righ
1eb0: 74 22 3e 53 51 4c 3a 3c 2f 74 64 3e 3c 74 64 3e  t">SQL:</td><td>
1ec0: 3c 2f 74 64 3e 0a 20 20 40 20 3c 74 64 20 76 61  </td>.  @ <td va
1ed0: 6c 69 67 6e 3d 22 74 6f 70 22 3e 3c 70 72 65 3e  lign="top"><pre>
1ee0: 0a 20 20 40 20 25 68 28 7a 53 51 4c 29 0a 20 20  .  @ %h(zSQL).  
1ef0: 40 20 3c 2f 70 72 65 3e 3c 2f 74 64 3e 0a 20 20  @ </pre></td>.  
1f00: 40 20 3c 74 64 20 77 69 64 74 68 3d 31 35 3e 3c  @ <td width=15><
1f10: 2f 74 64 3e 3c 74 64 20 76 61 6c 69 67 6e 3d 22  /td><td valign="
1f20: 74 6f 70 22 3e 0a 20 20 6f 75 74 70 75 74 5f 63  top">.  output_c
1f30: 6f 6c 6f 72 5f 6b 65 79 28 7a 43 6c 72 4b 65 79  olor_key(zClrKey
1f40: 2c 20 30 2c 20 22 62 6f 72 64 65 72 3d 30 20 63  , 0, "border=0 c
1f50: 65 6c 6c 73 70 61 63 69 6e 67 3d 30 20 63 65 6c  ellspacing=0 cel
1f60: 6c 70 61 64 64 69 6e 67 3d 33 22 29 3b 0a 20 20  lpadding=3");.  
1f70: 40 20 3c 2f 74 64 3e 0a 20 20 40 20 3c 2f 74 72  @ </td>.  @ </tr
1f80: 3e 3c 2f 74 61 62 6c 65 3e 0a 20 20 72 65 70 6f  ></table>.  repo
1f90: 72 74 5f 66 6f 72 6d 61 74 5f 68 69 6e 74 73 28  rt_format_hints(
1fa0: 29 3b 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65  );.  style_foote
1fb0: 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45  r();.}../*.** WE
1fc0: 42 50 41 47 45 3a 20 2f 72 70 74 6e 65 77 0a 2a  BPAGE: /rptnew.*
1fd0: 2a 20 57 45 42 50 41 47 45 3a 20 2f 72 70 74 65  * WEBPAGE: /rpte
1fe0: 64 69 74 0a 2a 2f 0a 76 6f 69 64 20 76 69 65 77  dit.*/.void view
1ff0: 5f 65 64 69 74 28 76 6f 69 64 29 7b 0a 20 20 69  _edit(void){.  i
2000: 6e 74 20 72 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  nt rn;.  const c
2010: 68 61 72 20 2a 7a 54 69 74 6c 65 3b 0a 20 20 63  har *zTitle;.  c
2020: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
2030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 77 6e  const char *zOwn
2040: 65 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  er;.  const char
2050: 20 2a 7a 43 6c 72 4b 65 79 3b 0a 20 20 63 68 61   *zClrKey;.  cha
2060: 72 20 2a 7a 53 51 4c 3b 0a 20 20 63 68 61 72 20  r *zSQL;.  char 
2070: 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a 20 20 6c 6f  *zErr = 0;..  lo
2080: 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e  gin_check_creden
2090: 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21  tials();.  if( !
20a0: 67 2e 6f 6b 51 75 65 72 79 20 29 7b 0a 20 20 20  g.okQuery ){.   
20b0: 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b   login_needed();
20c0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
20d0: 0a 20 20 2f 2a 76 69 65 77 5f 61 64 64 5f 66 75  .  /*view_add_fu
20e0: 6e 63 74 69 6f 6e 73 28 30 29 3b 2a 2f 0a 20 20  nctions(0);*/.  
20f0: 72 6e 20 3d 20 61 74 6f 69 28 50 44 28 22 72 6e  rn = atoi(PD("rn
2100: 22 2c 22 30 22 29 29 3b 0a 20 20 7a 54 69 74 6c  ","0"));.  zTitl
2110: 65 20 3d 20 50 28 22 74 22 29 3b 0a 20 20 7a 4f  e = P("t");.  zO
2120: 77 6e 65 72 20 3d 20 50 44 28 22 77 22 2c 67 2e  wner = PD("w",g.
2130: 7a 4c 6f 67 69 6e 29 3b 0a 20 20 7a 20 3d 20 50  zLogin);.  z = P
2140: 28 22 73 22 29 3b 0a 20 20 7a 53 51 4c 20 3d 20  ("s");.  zSQL = 
2150: 7a 20 3f 20 74 72 69 6d 5f 73 74 72 69 6e 67 28  z ? trim_string(
2160: 7a 29 20 3a 20 30 3b 0a 20 20 7a 43 6c 72 4b 65  z) : 0;.  zClrKe
2170: 79 20 3d 20 74 72 69 6d 5f 73 74 72 69 6e 67 28  y = trim_string(
2180: 50 44 28 22 6b 22 2c 22 22 29 29 3b 0a 20 20 69  PD("k",""));.  i
2190: 66 28 20 72 6e 3e 30 20 26 26 20 50 28 22 64 65  f( rn>0 && P("de
21a0: 6c 32 22 29 20 29 7b 0a 20 20 20 20 64 62 5f 6d  l2") ){.    db_m
21b0: 75 6c 74 69 5f 65 78 65 63 28 22 44 45 4c 45 54  ulti_exec("DELET
21c0: 45 20 46 52 4f 4d 20 72 65 70 6f 72 74 66 6d 74  E FROM reportfmt
21d0: 20 57 48 45 52 45 20 72 6e 3d 25 64 22 2c 20 72   WHERE rn=%d", r
21e0: 6e 29 3b 0a 20 20 20 20 63 67 69 5f 72 65 64 69  n);.    cgi_redi
21f0: 72 65 63 74 28 22 72 65 70 6f 72 74 6c 69 73 74  rect("reportlist
2200: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
2210: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 6e 3e 30    }else if( rn>0
2220: 20 26 26 20 50 28 22 64 65 6c 31 22 29 20 29 7b   && P("del1") ){
2230: 0a 20 20 20 20 7a 54 69 74 6c 65 20 3d 20 64 62  .    zTitle = db
2240: 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54  _text(0, "SELECT
2250: 20 74 69 74 6c 65 20 46 52 4f 4d 20 72 65 70 6f   title FROM repo
2260: 72 74 66 6d 74 20 22 0a 20 20 20 20 20 20 20 20  rtfmt ".        
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 22 57 48 45 52 45 20 72 6e 3d 25 64 22 2c 20   "WHERE rn=%d", 
2290: 72 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 69  rn);.    if( zTi
22a0: 74 6c 65 3d 3d 30 20 29 20 63 67 69 5f 72 65 64  tle==0 ) cgi_red
22b0: 69 72 65 63 74 28 22 72 65 70 6f 72 74 6c 69 73  irect("reportlis
22c0: 74 22 29 3b 0a 0a 20 20 20 20 73 74 79 6c 65 5f  t");..    style_
22d0: 68 65 61 64 65 72 28 22 41 72 65 20 59 6f 75 20  header("Are You 
22e0: 53 75 72 65 3f 22 29 3b 0a 20 20 20 20 40 20 3c  Sure?");.    @ <
22f0: 66 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 72 70 74  form action="rpt
2300: 65 64 69 74 22 20 6d 65 74 68 6f 64 3d 22 50 4f  edit" method="PO
2310: 53 54 22 3e 0a 20 20 20 20 40 20 3c 70 3e 59 6f  ST">.    @ <p>Yo
2320: 75 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64  u are about to d
2330: 65 6c 65 74 65 20 61 6c 6c 20 74 72 61 63 65 73  elete all traces
2340: 20 6f 66 20 74 68 65 20 72 65 70 6f 72 74 0a 20   of the report. 
2350: 20 20 20 40 20 3c 73 74 72 6f 6e 67 3e 25 68 28     @ <strong>%h(
2360: 7a 54 69 74 6c 65 29 3c 2f 73 74 72 6f 6e 67 3e  zTitle)</strong>
2370: 20 66 72 6f 6d 0a 20 20 20 20 40 20 74 68 65 20   from.    @ the 
2380: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
2390: 69 73 20 61 6e 20 69 72 72 65 76 65 72 73 69 62  is an irreversib
23a0: 6c 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  le operation.  A
23b0: 6c 6c 20 72 65 63 6f 72 64 73 0a 20 20 20 20 40  ll records.    @
23c0: 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 69 73   related to this
23d0: 20 72 65 70 6f 72 74 20 77 69 6c 6c 20 62 65 20   report will be 
23e0: 72 65 6d 6f 76 65 64 20 61 6e 64 20 63 61 6e 6e  removed and cann
23f0: 6f 74 20 62 65 20 72 65 63 6f 76 65 72 65 64 2e  ot be recovered.
2400: 3c 2f 70 3e 0a 20 20 20 20 40 0a 20 20 20 20 40  </p>.    @.    @
2410: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 68 69   <input type="hi
2420: 64 64 65 6e 22 20 6e 61 6d 65 3d 22 72 6e 22 20  dden" name="rn" 
2430: 76 61 6c 75 65 3d 22 25 64 28 72 6e 29 22 3e 0a  value="%d(rn)">.
2440: 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70      @ <input typ
2450: 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d  e="submit" name=
2460: 22 64 65 6c 32 22 20 76 61 6c 75 65 3d 22 44 65  "del2" value="De
2470: 6c 65 74 65 20 54 68 65 20 52 65 70 6f 72 74 22  lete The Report"
2480: 3e 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74  >.    @ <input t
2490: 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d  ype="submit" nam
24a0: 65 3d 22 63 61 6e 22 20 76 61 6c 75 65 3d 22 43  e="can" value="C
24b0: 61 6e 63 65 6c 22 3e 0a 20 20 20 20 40 20 3c 2f  ancel">.    @ </
24c0: 66 6f 72 6d 3e 0a 20 20 20 20 73 74 79 6c 65 5f  form>.    style_
24d0: 66 6f 6f 74 65 72 28 29 3b 0a 20 20 20 20 72 65  footer();.    re
24e0: 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  turn;.  }else if
24f0: 28 20 50 28 22 63 61 6e 22 29 20 29 7b 0a 20 20  ( P("can") ){.  
2500: 20 20 2f 2a 20 75 73 65 72 20 63 61 6e 63 65 6c    /* user cancel
2510: 6c 65 64 20 2a 2f 0a 20 20 20 20 63 67 69 5f 72  led */.    cgi_r
2520: 65 64 69 72 65 63 74 28 22 72 65 70 6f 72 74 6c  edirect("reportl
2530: 69 73 74 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ist");.    retur
2540: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 69  n;.  }.  if( zTi
2550: 74 6c 65 20 26 26 20 7a 53 51 4c 20 29 7b 0a 20  tle && zSQL ){. 
2560: 20 20 20 69 66 28 20 7a 53 51 4c 5b 30 5d 3d 3d     if( zSQL[0]==
2570: 30 20 29 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  0 ){.      zErr 
2580: 3d 20 22 50 6c 65 61 73 65 20 73 75 70 70 6c 79  = "Please supply
2590: 20 61 6e 20 53 51 4c 20 71 75 65 72 79 20 73 74   an SQL query st
25a0: 61 74 65 6d 65 6e 74 22 3b 0a 20 20 20 20 7d 65  atement";.    }e
25b0: 6c 73 65 20 69 66 28 20 28 7a 54 69 74 6c 65 20  lse if( (zTitle 
25c0: 3d 20 74 72 69 6d 5f 73 74 72 69 6e 67 28 7a 54  = trim_string(zT
25d0: 69 74 6c 65 29 29 5b 30 5d 3d 3d 30 20 29 7b 0a  itle))[0]==0 ){.
25e0: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 50 6c        zErr = "Pl
25f0: 65 61 73 65 20 73 75 70 70 6c 79 20 61 20 74 69  ease supply a ti
2600: 74 6c 65 22 3b 20 0a 20 20 20 20 7d 65 6c 73 65  tle"; .    }else
2610: 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 76  {.      zErr = v
2620: 65 72 69 66 79 5f 73 71 6c 5f 73 74 61 74 65 6d  erify_sql_statem
2630: 65 6e 74 28 7a 53 51 4c 29 3b 0a 20 20 20 20 7d  ent(zSQL);.    }
2640: 0a 20 20 20 20 69 66 28 20 7a 45 72 72 3d 3d 30  .    if( zErr==0
2650: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6e   ){.      if( rn
2660: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62  >0 ){.        db
2670: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 55 50 44  _multi_exec("UPD
2680: 41 54 45 20 72 65 70 6f 72 74 66 6d 74 20 53 45  ATE reportfmt SE
2690: 54 20 74 69 74 6c 65 3d 25 51 2c 20 73 71 6c 63  T title=%Q, sqlc
26a0: 6f 64 65 3d 25 51 2c 22 0a 20 20 20 20 20 20 20  ode=%Q,".       
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
26c0: 20 6f 77 6e 65 72 3d 25 51 2c 20 63 6f 6c 73 3d   owner=%Q, cols=
26d0: 25 51 20 57 48 45 52 45 20 72 6e 3d 25 64 22 2c  %Q WHERE rn=%d",
26e0: 0a 20 20 20 20 20 20 20 20 20 20 20 7a 54 69 74  .           zTit
26f0: 6c 65 2c 20 7a 53 51 4c 2c 20 7a 4f 77 6e 65 72  le, zSQL, zOwner
2700: 2c 20 7a 43 6c 72 4b 65 79 2c 20 72 6e 29 3b 0a  , zClrKey, rn);.
2710: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2720: 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78       db_multi_ex
2730: 65 63 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  ec("INSERT INTO 
2740: 72 65 70 6f 72 74 66 6d 74 28 74 69 74 6c 65 2c  reportfmt(title,
2750: 73 71 6c 63 6f 64 65 2c 6f 77 6e 65 72 2c 63 6f  sqlcode,owner,co
2760: 6c 73 29 20 22 0a 20 20 20 20 20 20 20 20 20 20  ls) ".          
2770: 20 22 56 41 4c 55 45 53 28 25 51 2c 25 51 2c 25   "VALUES(%Q,%Q,%
2780: 51 2c 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20  Q,%Q)",.        
2790: 20 20 20 7a 54 69 74 6c 65 2c 20 7a 53 51 4c 2c     zTitle, zSQL,
27a0: 20 7a 4f 77 6e 65 72 2c 20 7a 43 6c 72 4b 65 79   zOwner, zClrKey
27b0: 29 3b 0a 20 20 20 20 20 20 20 20 72 6e 20 3d 20  );.        rn = 
27c0: 64 62 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  db_last_insert_r
27d0: 6f 77 69 64 28 29 3b 0a 20 20 20 20 20 20 7d 0a  owid();.      }.
27e0: 20 20 20 20 20 20 63 67 69 5f 72 65 64 69 72 65        cgi_redire
27f0: 63 74 28 6d 70 72 69 6e 74 66 28 22 72 70 74 76  ct(mprintf("rptv
2800: 69 65 77 3f 72 6e 3d 25 64 22 2c 20 72 6e 29 29  iew?rn=%d", rn))
2810: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
2820: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2830: 28 20 72 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  ( rn==0 ){.    z
2840: 54 69 74 6c 65 20 3d 20 22 22 3b 0a 20 20 20 20  Title = "";.    
2850: 7a 53 51 4c 20 3d 20 74 69 63 6b 65 74 5f 72 65  zSQL = ticket_re
2860: 70 6f 72 74 5f 74 65 6d 70 6c 61 74 65 28 29 3b  port_template();
2870: 0a 20 20 20 20 7a 43 6c 72 4b 65 79 20 3d 20 74  .    zClrKey = t
2880: 69 63 6b 65 74 5f 6b 65 79 5f 74 65 6d 70 6c 61  icket_key_templa
2890: 74 65 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  te();.  }else{. 
28a0: 20 20 20 53 74 6d 74 20 71 3b 0a 20 20 20 20 64     Stmt q;.    d
28b0: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22 53  b_prepare(&q, "S
28c0: 45 4c 45 43 54 20 74 69 74 6c 65 2c 20 73 71 6c  ELECT title, sql
28d0: 63 6f 64 65 2c 20 6f 77 6e 65 72 2c 20 63 6f 6c  code, owner, col
28e0: 73 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  s ".            
28f0: 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 72           "FROM r
2900: 65 70 6f 72 74 66 6d 74 20 57 48 45 52 45 20 72  eportfmt WHERE r
2910: 6e 3d 25 64 22 2c 72 6e 29 3b 0a 20 20 20 20 69  n=%d",rn);.    i
2920: 66 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  f( db_step(&q)==
2930: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
2940: 20 20 20 20 7a 54 69 74 6c 65 20 3d 20 64 62 5f      zTitle = db_
2950: 63 6f 6c 75 6d 6e 5f 6d 61 6c 6c 6f 63 28 26 71  column_malloc(&q
2960: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a 53 51 4c  , 0);.      zSQL
2970: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c   = db_column_mal
2980: 6c 6f 63 28 26 71 2c 20 31 29 3b 0a 20 20 20 20  loc(&q, 1);.    
2990: 20 20 7a 4f 77 6e 65 72 20 3d 20 64 62 5f 63 6f    zOwner = db_co
29a0: 6c 75 6d 6e 5f 6d 61 6c 6c 6f 63 28 26 71 2c 20  lumn_malloc(&q, 
29b0: 32 29 3b 0a 20 20 20 20 20 20 7a 43 6c 72 4b 65  2);.      zClrKe
29c0: 79 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 6d 61  y = db_column_ma
29d0: 6c 6c 6f 63 28 26 71 2c 20 33 29 3b 0a 20 20 20  lloc(&q, 3);.   
29e0: 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69   }.    db_finali
29f0: 7a 65 28 26 71 29 3b 0a 20 20 20 20 69 66 28 20  ze(&q);.    if( 
2a00: 50 28 22 63 6f 70 79 22 29 20 29 7b 0a 20 20 20  P("copy") ){.   
2a10: 20 20 20 72 6e 20 3d 20 30 3b 0a 20 20 20 20 20     rn = 0;.     
2a20: 20 7a 54 69 74 6c 65 20 3d 20 6d 70 72 69 6e 74   zTitle = mprint
2a30: 66 28 22 43 6f 70 79 20 4f 66 20 25 73 22 2c 20  f("Copy Of %s", 
2a40: 7a 54 69 74 6c 65 29 3b 0a 20 20 20 20 20 20 7a  zTitle);.      z
2a50: 4f 77 6e 65 72 20 3d 20 67 2e 7a 4c 6f 67 69 6e  Owner = g.zLogin
2a60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2a70: 28 20 7a 4f 77 6e 65 72 3d 3d 30 20 29 20 7a 4f  ( zOwner==0 ) zO
2a80: 77 6e 65 72 20 3d 20 67 2e 7a 4c 6f 67 69 6e 3b  wner = g.zLogin;
2a90: 0a 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75  .  style_submenu
2aa0: 5f 65 6c 65 6d 65 6e 74 28 22 43 61 6e 63 65 6c  _element("Cancel
2ab0: 22 2c 20 22 43 61 6e 63 65 6c 22 2c 20 22 72 65  ", "Cancel", "re
2ac0: 70 6f 72 74 6c 69 73 74 22 29 3b 0a 20 20 69 66  portlist");.  if
2ad0: 28 20 72 6e 3e 30 20 29 7b 0a 20 20 20 20 73 74  ( rn>0 ){.    st
2ae0: 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d  yle_submenu_elem
2af0: 65 6e 74 28 22 44 65 6c 65 74 65 22 2c 20 22 44  ent("Delete", "D
2b00: 65 6c 65 74 65 22 2c 20 22 72 70 74 65 64 69 74  elete", "rptedit
2b10: 3f 72 6e 3d 25 64 26 64 65 6c 31 3d 31 22 2c 20  ?rn=%d&del1=1", 
2b20: 72 6e 29 3b 0a 20 20 7d 0a 20 20 73 74 79 6c 65  rn);.  }.  style
2b30: 5f 68 65 61 64 65 72 28 72 6e 3e 30 20 3f 20 22  _header(rn>0 ? "
2b40: 45 64 69 74 20 52 65 70 6f 72 74 20 46 6f 72 6d  Edit Report Form
2b50: 61 74 22 3a 22 43 72 65 61 74 65 20 4e 65 77 20  at":"Create New 
2b60: 52 65 70 6f 72 74 20 46 6f 72 6d 61 74 22 29 3b  Report Format");
2b70: 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20  .  if( zErr ){. 
2b80: 20 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65     @ <blockquote
2b90: 3e 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 22 23 66  ><font color="#f
2ba0: 66 30 30 30 30 22 3e 3c 62 3e 25 68 28 7a 45 72  f0000"><b>%h(zEr
2bb0: 72 29 3c 2f 62 3e 3c 2f 66 6f 6e 74 3e 3c 2f 62  r)</b></font></b
2bc0: 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 7d 0a 20  lockquote>.  }. 
2bd0: 20 40 20 3c 66 6f 72 6d 20 61 63 74 69 6f 6e 3d   @ <form action=
2be0: 22 72 70 74 65 64 69 74 22 20 6d 65 74 68 6f 64  "rptedit" method
2bf0: 3d 22 50 4f 53 54 22 3e 0a 20 20 40 20 3c 69 6e  ="POST">.  @ <in
2c00: 70 75 74 20 74 79 70 65 3d 22 68 69 64 64 65 6e  put type="hidden
2c10: 22 20 6e 61 6d 65 3d 22 72 6e 22 20 76 61 6c 75  " name="rn" valu
2c20: 65 3d 22 25 64 28 72 6e 29 22 3e 0a 20 20 40 20  e="%d(rn)">.  @ 
2c30: 3c 70 3e 52 65 70 6f 72 74 20 54 69 74 6c 65 3a  <p>Report Title:
2c40: 3c 62 72 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20  <br>.  @ <input 
2c50: 74 79 70 65 3d 22 74 65 78 74 22 20 6e 61 6d 65  type="text" name
2c60: 3d 22 74 22 20 76 61 6c 75 65 3d 22 25 68 28 7a  ="t" value="%h(z
2c70: 54 69 74 6c 65 29 22 20 73 69 7a 65 3d 22 36 30  Title)" size="60
2c80: 22 3e 3c 2f 70 3e 0a 20 20 40 20 3c 70 3e 45 6e  "></p>.  @ <p>En
2c90: 74 65 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 53  ter a complete S
2ca0: 51 4c 20 71 75 65 72 79 20 73 74 61 74 65 6d 65  QL query stateme
2cb0: 6e 74 20 61 67 61 69 6e 73 74 20 74 68 65 20 22  nt against the "
2cc0: 54 49 43 4b 45 54 22 20 74 61 62 6c 65 3a 3c 62  TICKET" table:<b
2cd0: 72 3e 0a 20 20 40 20 3c 74 65 78 74 61 72 65 61  r>.  @ <textarea
2ce0: 20 6e 61 6d 65 3d 22 73 22 20 72 6f 77 73 3d 22   name="s" rows="
2cf0: 32 30 22 20 63 6f 6c 73 3d 22 38 30 22 3e 25 68  20" cols="80">%h
2d00: 28 7a 53 51 4c 29 3c 2f 74 65 78 74 61 72 65 61  (zSQL)</textarea
2d10: 3e 0a 20 20 40 20 3c 2f 70 3e 0a 20 20 69 66 28  >.  @ </p>.  if(
2d20: 20 67 2e 6f 6b 41 64 6d 69 6e 20 29 7b 0a 20 20   g.okAdmin ){.  
2d30: 20 20 40 20 3c 70 3e 52 65 70 6f 72 74 20 6f 77    @ <p>Report ow
2d40: 6e 65 72 3a 0a 20 20 20 20 40 20 3c 69 6e 70 75  ner:.    @ <inpu
2d50: 74 20 74 79 70 65 3d 22 74 65 78 74 22 20 6e 61  t type="text" na
2d60: 6d 65 3d 22 77 22 20 73 69 7a 65 3d 22 32 30 22  me="w" size="20"
2d70: 20 76 61 6c 75 65 3d 22 25 68 28 7a 4f 77 6e 65   value="%h(zOwne
2d80: 72 29 22 3e 0a 20 20 20 20 40 20 3c 2f 70 3e 0a  r)">.    @ </p>.
2d90: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 40    } else {.    @
2da0: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 68 69   <input type="hi
2db0: 64 64 65 6e 22 20 6e 61 6d 65 3d 22 77 22 20 76  dden" name="w" v
2dc0: 61 6c 75 65 3d 22 25 68 28 7a 4f 77 6e 65 72 29  alue="%h(zOwner)
2dd0: 22 3e 0a 20 20 7d 0a 20 20 40 20 3c 70 3e 45 6e  ">.  }.  @ <p>En
2de0: 74 65 72 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  ter an optional 
2df0: 63 6f 6c 6f 72 20 6b 65 79 20 69 6e 20 74 68 65  color key in the
2e00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6f 78 2e 20   following box. 
2e10: 20 28 49 66 20 62 6c 61 6e 6b 2c 20 6e 6f 0a 20   (If blank, no. 
2e20: 20 40 20 63 6f 6c 6f 72 20 6b 65 79 20 69 73 20   @ color key is 
2e30: 64 69 73 70 6c 61 79 65 64 2e 29 20 20 45 61 63  displayed.)  Eac
2e40: 68 20 6c 69 6e 65 20 63 6f 6e 74 61 69 6e 73 20  h line contains 
2e50: 74 68 65 20 74 65 78 74 20 66 6f 72 20 61 20 73  the text for a s
2e60: 69 6e 67 6c 65 0a 20 20 40 20 65 6e 74 72 79 20  ingle.  @ entry 
2e70: 69 6e 20 74 68 65 20 6b 65 79 2e 20 20 54 68 65  in the key.  The
2e80: 20 66 69 72 73 74 20 74 6f 6b 65 6e 20 6f 66 20   first token of 
2e90: 65 61 63 68 20 6c 69 6e 65 20 69 73 20 74 68 65  each line is the
2ea0: 20 62 61 63 6b 67 72 6f 75 6e 64 0a 20 20 40 20   background.  @ 
2eb0: 63 6f 6c 6f 72 20 66 6f 72 20 74 68 61 74 20 6c  color for that l
2ec0: 69 6e 65 2e 3c 62 72 3e 0a 20 20 40 20 3c 74 65  ine.<br>.  @ <te
2ed0: 78 74 61 72 65 61 20 6e 61 6d 65 3d 22 6b 22 20  xtarea name="k" 
2ee0: 72 6f 77 73 3d 22 38 22 20 63 6f 6c 73 3d 22 35  rows="8" cols="5
2ef0: 30 22 3e 25 68 28 7a 43 6c 72 4b 65 79 29 3c 2f  0">%h(zClrKey)</
2f00: 74 65 78 74 61 72 65 61 3e 0a 20 20 40 20 3c 2f  textarea>.  @ </
2f10: 70 3e 0a 20 20 69 66 28 20 21 67 2e 6f 6b 41 64  p>.  if( !g.okAd
2f20: 6d 69 6e 20 26 26 20 73 74 72 63 6d 70 28 7a 4f  min && strcmp(zO
2f30: 77 6e 65 72 2c 67 2e 7a 4c 6f 67 69 6e 29 21 3d  wner,g.zLogin)!=
2f40: 30 20 29 7b 0a 20 20 20 20 40 20 3c 70 3e 54 68  0 ){.    @ <p>Th
2f50: 69 73 20 72 65 70 6f 72 74 20 66 6f 72 6d 61 74  is report format
2f60: 20 69 73 20 6f 77 6e 65 64 20 62 79 20 25 68 28   is owned by %h(
2f70: 7a 4f 77 6e 65 72 29 2e 20 20 59 6f 75 20 61 72  zOwner).  You ar
2f80: 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 0a 20 20  e not allowed.  
2f90: 20 20 40 20 74 6f 20 63 68 61 6e 67 65 20 69 74    @ to change it
2fa0: 2e 3c 2f 70 3e 0a 20 20 20 20 40 20 3c 2f 66 6f  .</p>.    @ </fo
2fb0: 72 6d 3e 0a 20 20 20 20 72 65 70 6f 72 74 5f 66  rm>.    report_f
2fc0: 6f 72 6d 61 74 5f 68 69 6e 74 73 28 29 3b 0a 20  ormat_hints();. 
2fd0: 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28     style_footer(
2fe0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2ff0: 20 7d 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79   }.  @ <input ty
3000: 70 65 3d 22 73 75 62 6d 69 74 22 20 76 61 6c 75  pe="submit" valu
3010: 65 3d 22 41 70 70 6c 79 20 43 68 61 6e 67 65 73  e="Apply Changes
3020: 22 3e 0a 20 20 69 66 28 20 72 6e 3e 30 20 29 7b  ">.  if( rn>0 ){
3030: 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79  .    @ <input ty
3040: 70 65 3d 22 73 75 62 6d 69 74 22 20 76 61 6c 75  pe="submit" valu
3050: 65 3d 22 44 65 6c 65 74 65 20 54 68 69 73 20 52  e="Delete This R
3060: 65 70 6f 72 74 22 20 6e 61 6d 65 3d 22 64 65 6c  eport" name="del
3070: 31 22 3e 0a 20 20 7d 0a 20 20 40 20 3c 2f 66 6f  1">.  }.  @ </fo
3080: 72 6d 3e 0a 20 20 72 65 70 6f 72 74 5f 66 6f 72  rm>.  report_for
3090: 6d 61 74 5f 68 69 6e 74 73 28 29 3b 0a 20 20 73  mat_hints();.  s
30a0: 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d  tyle_footer();.}
30b0: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61  ../*.** Output a
30c0: 20 62 75 6e 63 68 20 6f 66 20 74 65 78 74 20 74   bunch of text t
30d0: 68 61 74 20 70 72 6f 76 69 64 65 73 20 69 6e 66  hat provides inf
30e0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 72  ormation about r
30f0: 65 70 6f 72 74 0a 2a 2a 20 66 6f 72 6d 61 74 73  eport.** formats
3100: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3110: 72 65 70 6f 72 74 5f 66 6f 72 6d 61 74 5f 68 69  report_format_hi
3120: 6e 74 73 28 76 6f 69 64 29 7b 0a 20 20 63 68 61  nts(void){.  cha
3130: 72 20 2a 7a 53 63 68 65 6d 61 3b 0a 20 20 7a 53  r *zSchema;.  zS
3140: 63 68 65 6d 61 20 3d 20 64 62 5f 74 65 78 74 28  chema = db_text(
3150: 30 2c 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52  0,"SELECT sql FR
3160: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
3170: 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 74 69 63   WHERE name='tic
3180: 6b 65 74 27 22 29 3b 0a 20 20 40 20 3c 68 72 3e  ket'");.  @ <hr>
3190: 3c 68 33 3e 54 49 43 4b 45 54 20 53 63 68 65 6d  <h3>TICKET Schem
31a0: 61 3c 2f 68 33 3e 0a 20 20 40 20 3c 62 6c 6f 63  a</h3>.  @ <bloc
31b0: 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 20 20 40  kquote><pre>.  @
31c0: 20 25 68 28 7a 53 63 68 65 6d 61 29 0a 20 20 40   %h(zSchema).  @
31d0: 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75   </pre></blockqu
31e0: 6f 74 65 3e 0a 20 20 40 20 3c 68 33 3e 4e 6f 74  ote>.  @ <h3>Not
31f0: 65 73 3c 2f 68 33 3e 0a 20 20 40 20 3c 75 6c 3e  es</h3>.  @ <ul>
3200: 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 54 68 65 20  .  @ <li><p>The 
3210: 53 51 4c 20 6d 75 73 74 20 63 6f 6e 73 69 73 74  SQL must consist
3220: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 45 4c   of a single SEL
3230: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 3c 2f 70  ECT statement</p
3240: 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20 3c  ></li>.  @.  @ <
3250: 6c 69 3e 3c 70 3e 49 66 20 61 20 63 6f 6c 75 6d  li><p>If a colum
3260: 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  n of the result 
3270: 73 65 74 20 69 73 20 6e 61 6d 65 64 20 22 23 22  set is named "#"
3280: 20 74 68 65 6e 20 74 68 61 74 20 63 6f 6c 75 6d   then that colum
3290: 6e 0a 20 20 40 20 69 73 20 61 73 73 75 6d 65 64  n.  @ is assumed
32a0: 20 74 6f 20 68 6f 6c 64 20 61 20 74 69 63 6b 65   to hold a ticke
32b0: 74 20 6e 75 6d 62 65 72 2e 20 20 41 20 68 79 70  t number.  A hyp
32c0: 65 72 6c 69 6e 6b 20 77 69 6c 6c 20 62 65 20 63  erlink will be c
32d0: 72 65 61 74 65 64 20 66 72 6f 6d 0a 20 20 40 20  reated from.  @ 
32e0: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 74 6f 20 61  that column to a
32f0: 20 64 65 74 61 69 6c 65 64 20 76 69 65 77 20 6f   detailed view o
3300: 66 20 74 68 65 20 74 69 63 6b 65 74 2e 3c 2f 70  f the ticket.</p
3310: 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20 3c  ></li>.  @.  @ <
3320: 6c 69 3e 3c 70 3e 49 66 20 61 20 63 6f 6c 75 6d  li><p>If a colum
3330: 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  n of the result 
3340: 73 65 74 20 69 73 20 6e 61 6d 65 64 20 22 62 67  set is named "bg
3350: 63 6f 6c 6f 72 22 20 74 68 65 6e 20 74 68 65 20  color" then the 
3360: 63 6f 6e 74 65 6e 74 0a 20 20 40 20 6f 66 20 74  content.  @ of t
3370: 68 61 74 20 63 6f 6c 75 6d 6e 20 64 65 74 65 72  hat column deter
3380: 6d 69 6e 65 73 20 74 68 65 20 62 61 63 6b 67 72  mines the backgr
3390: 6f 75 6e 64 20 63 6f 6c 6f 72 20 6f 66 20 74 68  ound color of th
33a0: 65 20 72 6f 77 2e 3c 2f 70 3e 3c 2f 6c 69 3e 0a  e row.</p></li>.
33b0: 20 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 54    @.  @ <li><p>T
33c0: 68 65 20 3c 62 3e 75 73 65 72 28 29 3c 2f 62 3e  he <b>user()</b>
33d0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72 65   SQL function re
33e0: 74 75 72 6e 73 20 61 20 73 74 72 69 6e 67 0a 20  turns a string. 
33f0: 20 40 20 77 68 69 63 68 20 69 73 20 74 68 65 20   @ which is the 
3400: 6c 6f 67 69 6e 20 6f 66 20 74 68 65 20 63 75 72  login of the cur
3410: 72 65 6e 74 20 75 73 65 72 2e 3c 2f 70 3e 3c 2f  rent user.</p></
3420: 6c 69 3e 0a 20 20 40 0a 20 20 40 20 3c 6c 69 3e  li>.  @.  @ <li>
3430: 3c 70 3e 54 68 65 20 66 69 72 73 74 20 63 6f 6c  <p>The first col
3440: 75 6d 6e 20 77 68 6f 73 65 20 6e 61 6d 65 20 62  umn whose name b
3450: 65 67 69 6e 73 20 77 69 74 68 20 75 6e 64 65 72  egins with under
3460: 73 63 6f 72 65 20 28 22 5f 22 29 20 61 6e 64 20  score ("_") and 
3470: 61 6c 6c 0a 20 20 40 20 73 75 62 73 65 71 75 65  all.  @ subseque
3480: 6e 74 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 73  nt columns are s
3490: 68 6f 77 6e 20 6f 6e 20 74 68 65 69 72 20 6f 77  hown on their ow
34a0: 6e 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  n rows in the ta
34b0: 62 6c 65 2e 20 20 54 68 69 73 20 6d 69 67 68 74  ble.  This might
34c0: 0a 20 20 40 20 62 65 20 75 73 65 66 75 6c 20 66  .  @ be useful f
34d0: 6f 72 20 64 69 73 70 6c 61 79 69 6e 67 20 74 68  or displaying th
34e0: 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  e description of
34f0: 20 74 69 63 6b 65 74 73 2e 0a 20 20 40 20 3c 2f   tickets..  @ </
3500: 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20  p></li>.  @.  @ 
3510: 3c 6c 69 3e 3c 70 3e 54 68 65 20 3c 62 3e 61 75  <li><p>The <b>au
3520: 78 28 29 3c 2f 62 3e 20 53 51 4c 20 66 75 6e 63  x()</b> SQL func
3530: 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 70 61 72  tion takes a par
3540: 61 6d 65 74 65 72 20 6e 61 6d 65 20 61 73 20 61  ameter name as a
3550: 6e 20 61 72 67 75 6d 65 6e 74 0a 20 20 40 20 61  n argument.  @ a
3560: 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  nd returns the v
3570: 61 6c 75 65 20 74 68 61 74 20 74 68 65 20 75 73  alue that the us
3580: 65 72 20 65 6e 74 65 72 73 20 69 6e 20 74 68 65  er enters in the
3590: 20 72 65 73 75 6c 74 69 6e 67 20 48 54 4d 4c 20   resulting HTML 
35a0: 66 6f 72 6d 2e 20 41 0a 20 20 40 20 73 65 63 6f  form. A.  @ seco
35b0: 6e 64 20 6f 70 74 69 6f 6e 61 6c 20 70 61 72 61  nd optional para
35c0: 6d 65 74 65 72 20 70 72 6f 76 69 64 65 73 20 61  meter provides a
35d0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
35e0: 6f 72 20 74 68 65 20 66 69 65 6c 64 2e 3c 2f 70  or the field.</p
35f0: 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20 3c  ></li>.  @.  @ <
3600: 6c 69 3e 3c 70 3e 54 68 65 20 3c 62 3e 6f 70 74  li><p>The <b>opt
3610: 69 6f 6e 28 29 3c 2f 62 3e 20 53 51 4c 20 66 75  ion()</b> SQL fu
3620: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 70  nction takes a p
3630: 61 72 61 6d 65 74 65 72 20 6e 61 6d 65 0a 20 20  arameter name.  
3640: 40 20 61 6e 64 20 61 20 71 75 6f 74 65 64 20 53  @ and a quoted S
3650: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
3660: 61 73 20 70 61 72 61 6d 65 74 65 72 73 2e 20 54  as parameters. T
3670: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  he query results
3680: 20 61 72 65 0a 20 20 40 20 70 72 65 73 65 6e 74   are.  @ present
3690: 65 64 20 61 73 20 61 6e 20 48 54 4d 4c 20 64 72  ed as an HTML dr
36a0: 6f 70 64 6f 77 6e 20 6d 65 6e 75 20 61 6e 64 20  opdown menu and 
36b0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
36c0: 75 72 6e 73 0a 20 20 40 20 74 68 65 20 63 75 72  urns.  @ the cur
36d0: 72 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 20  rently selected 
36e0: 76 61 6c 75 65 2e 20 52 65 73 75 6c 74 73 20 6d  value. Results m
36f0: 61 79 20 62 65 20 61 20 73 69 6e 67 6c 65 20 76  ay be a single v
3700: 61 6c 75 65 20 63 6f 6c 75 6d 6e 20 6f 72 0a 20  alue column or. 
3710: 20 40 20 74 77 6f 20 3c 62 3e 76 61 6c 75 65 2c   @ two <b>value,
3720: 64 65 73 63 72 69 70 74 69 6f 6e 3c 2f 62 3e 20  description</b> 
3730: 63 6f 6c 75 6d 6e 73 2e 20 54 68 65 20 66 69 72  columns. The fir
3740: 73 74 20 72 6f 77 20 69 73 20 74 68 65 20 64 65  st row is the de
3750: 66 61 75 6c 74 2e 3c 2f 70 3e 3c 2f 6c 69 3e 0a  fault.</p></li>.
3760: 20 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 54    @.  @ <li><p>T
3770: 68 65 20 3c 62 3e 63 67 69 28 29 3c 2f 62 3e 20  he <b>cgi()</b> 
3780: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  SQL function tak
3790: 65 73 20 61 20 70 61 72 61 6d 65 74 65 72 20 6e  es a parameter n
37a0: 61 6d 65 20 61 73 20 61 6e 20 61 72 67 75 6d 65  ame as an argume
37b0: 6e 74 0a 20 20 40 20 61 6e 64 20 72 65 74 75 72  nt.  @ and retur
37c0: 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
37d0: 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
37e0: 43 47 49 20 71 75 65 72 79 20 76 61 6c 75 65 2e  CGI query value.
37f0: 20 49 66 20 74 68 65 20 43 47 49 0a 20 20 40 20   If the CGI.  @ 
3800: 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 6e 27  parameter doesn'
3810: 74 20 65 78 69 73 74 2c 20 61 6e 20 6f 70 74 69  t exist, an opti
3820: 6f 6e 61 6c 20 73 65 63 6f 6e 64 20 61 72 67 75  onal second argu
3830: 6d 65 6e 74 20 77 69 6c 6c 20 62 65 20 72 65 74  ment will be ret
3840: 75 72 6e 65 64 0a 20 20 40 20 69 6e 73 74 65 61  urned.  @ instea
3850: 64 2e 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a  d.</p></li>.  @.
3860: 20 20 40 20 3c 6c 69 3e 3c 70 3e 49 66 20 61 20    @ <li><p>If a 
3870: 63 6f 6c 75 6d 6e 20 69 73 20 77 72 61 70 70 65  column is wrappe
3880: 64 20 62 79 20 74 68 65 20 3c 62 3e 77 69 6b 69  d by the <b>wiki
3890: 28 29 3c 2f 62 3e 20 53 51 4c 20 66 75 6e 63 74  ()</b> SQL funct
38a0: 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 0a 20 20 40  ion, it will.  @
38b0: 20 62 65 20 72 65 6e 64 65 72 65 64 20 61 73 20   be rendered as 
38c0: 77 69 6b 69 20 66 6f 72 6d 61 74 74 65 64 20 63  wiki formatted c
38d0: 6f 6e 74 65 6e 74 2e 3c 2f 70 3e 3c 2f 6c 69 3e  ontent.</p></li>
38e0: 0a 20 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e  .  @.  @ <li><p>
38f0: 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 77  If a column is w
3900: 72 61 70 70 65 64 20 62 79 20 74 68 65 20 3c 62  rapped by the <b
3910: 3e 74 6b 74 28 29 3c 2f 62 3e 20 53 51 4c 20 66  >tkt()</b> SQL f
3920: 75 6e 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c  unction, it will
3930: 0a 20 20 40 20 62 65 20 73 68 6f 77 6e 20 61 73  .  @ be shown as
3940: 20 61 20 74 69 63 6b 65 74 20 69 64 20 77 69 74   a ticket id wit
3950: 68 20 61 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20  h a link to the 
3960: 61 70 70 72 6f 70 72 69 61 74 65 20 70 61 67 65  appropriate page
3970: 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20  </p></li>.  @.  
3980: 40 20 3c 6c 69 3e 3c 70 3e 49 66 20 61 20 63 6f  @ <li><p>If a co
3990: 6c 75 6d 6e 20 69 73 20 77 72 61 70 70 65 64 20  lumn is wrapped 
39a0: 62 79 20 74 68 65 20 3c 62 3e 63 68 6e 67 28 29  by the <b>chng()
39b0: 3c 2f 62 3e 20 53 51 4c 20 66 75 6e 63 74 69 6f  </b> SQL functio
39c0: 6e 2c 20 69 74 20 77 69 6c 6c 0a 20 20 40 20 62  n, it will.  @ b
39d0: 65 20 73 68 6f 77 6e 20 61 73 20 61 20 62 61 73  e shown as a bas
39e0: 65 6c 69 6e 65 20 69 64 20 77 69 74 68 20 61 20  eline id with a 
39f0: 6c 69 6e 6b 20 74 6f 20 74 68 65 20 61 70 70 72  link to the appr
3a00: 6f 70 72 69 61 74 65 20 70 61 67 65 2e 3c 2f 70  opriate page.</p
3a10: 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20 3c  ></li>.  @.  @ <
3a20: 6c 69 3e 3c 70 3e 54 68 65 20 3c 62 3e 73 65 61  li><p>The <b>sea
3a30: 72 63 68 28 29 3c 2f 62 3e 20 53 51 4c 20 66 75  rch()</b> SQL fu
3a40: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 6b  nction takes a k
3a50: 65 79 77 6f 72 64 20 70 61 74 74 65 72 6e 20 61  eyword pattern a
3a60: 6e 64 0a 20 20 40 20 61 20 73 65 61 72 63 68 20  nd.  @ a search 
3a70: 74 65 78 74 2e 20 54 68 65 20 66 75 6e 63 74 69  text. The functi
3a80: 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e  on returns an in
3a90: 74 65 67 65 72 20 73 63 6f 72 65 20 77 68 69 63  teger score whic
3aa0: 68 20 69 73 0a 20 20 40 20 68 69 67 68 65 72 20  h is.  @ higher 
3ab0: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 68 6f 77  depending on how
3ac0: 20 77 65 6c 6c 20 74 68 65 20 73 65 61 72 63 68   well the search
3ad0: 20 77 65 6e 74 2e 3c 2f 70 3e 3c 2f 6c 69 3e 0a   went.</p></li>.
3ae0: 20 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 54    @.  @ <li><p>T
3af0: 68 65 20 71 75 65 72 79 20 63 61 6e 20 6a 6f 69  he query can joi
3b00: 6e 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69  n other tables i
3b10: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
3b20: 65 73 69 64 65 73 20 54 49 43 4b 45 54 2e 0a 20  esides TICKET.. 
3b30: 20 40 20 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40   @ </p></li>.  @
3b40: 20 3c 2f 75 6c 3e 0a 20 20 40 0a 20 20 40 20 3c   </ul>.  @.  @ <
3b50: 68 33 3e 45 78 61 6d 70 6c 65 73 3c 2f 68 33 3e  h3>Examples</h3>
3b60: 0a 20 20 40 20 3c 70 3e 49 6e 20 74 68 69 73 20  .  @ <p>In this 
3b70: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 66 69 72  example, the fir
3b80: 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  st column in the
3b90: 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 6e   result set is n
3ba0: 61 6d 65 64 0a 20 20 40 20 22 62 67 63 6f 6c 6f  amed.  @ "bgcolo
3bb0: 72 22 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f  r".  The value o
3bc0: 66 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 69 73  f this column is
3bd0: 20 6e 6f 74 20 64 69 73 70 6c 61 79 65 64 2e 20   not displayed. 
3be0: 20 49 6e 73 74 65 61 64 2c 20 69 74 0a 20 20 40   Instead, it.  @
3bf0: 20 73 65 6c 65 63 74 73 20 74 68 65 20 62 61 63   selects the bac
3c00: 6b 67 72 6f 75 6e 64 20 63 6f 6c 6f 72 20 6f 66  kground color of
3c10: 20 65 61 63 68 20 72 6f 77 20 62 61 73 65 64 20   each row based 
3c20: 6f 6e 20 74 68 65 20 54 49 43 4b 45 54 2e 53 54  on the TICKET.ST
3c30: 41 54 55 53 0a 20 20 40 20 66 69 65 6c 64 20 6f  ATUS.  @ field o
3c40: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
3c50: 20 54 68 65 20 63 6f 6c 6f 72 20 6b 65 79 20 61   The color key a
3c60: 74 20 74 68 65 20 72 69 67 68 74 20 73 68 6f 77  t the right show
3c70: 73 20 74 68 65 20 76 61 72 69 6f 75 73 0a 20 20  s the various.  
3c80: 40 20 63 6f 6c 6f 72 20 63 6f 64 65 73 2e 3c 2f  @ color codes.</
3c90: 70 3e 0a 20 20 40 20 3c 74 61 62 6c 65 20 61 6c  p>.  @ <table al
3ca0: 69 67 6e 3d 22 72 69 67 68 74 22 20 73 74 79 6c  ign="right" styl
3cb0: 65 3d 22 6d 61 72 67 69 6e 3a 20 30 20 35 70 78  e="margin: 0 5px
3cc0: 3b 22 20 62 6f 72 64 65 72 3d 31 20 63 65 6c 6c  ;" border=1 cell
3cd0: 73 70 61 63 69 6e 67 3d 30 20 77 69 64 74 68 3d  spacing=0 width=
3ce0: 31 32 35 3e 0a 20 20 40 20 3c 74 72 20 62 67 63  125>.  @ <tr bgc
3cf0: 6f 6c 6f 72 3d 22 23 66 32 64 63 64 63 22 3e 3c  olor="#f2dcdc"><
3d00: 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72  td align="center
3d10: 22 3e 6e 65 77 20 6f 72 20 61 63 74 69 76 65 3c  ">new or active<
3d20: 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74  /td></tr>.  @ <t
3d30: 72 20 62 67 63 6f 6c 6f 72 3d 22 23 65 38 65 38  r bgcolor="#e8e8
3d40: 62 64 22 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63  bd"><td align="c
3d50: 65 6e 74 65 72 22 3e 72 65 76 69 65 77 3c 2f 74  enter">review</t
3d60: 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72 20  d></tr>.  @ <tr 
3d70: 62 67 63 6f 6c 6f 72 3d 22 23 63 66 65 38 62 64  bgcolor="#cfe8bd
3d80: 22 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e  "><td align="cen
3d90: 74 65 72 22 3e 66 69 78 65 64 3c 2f 74 64 3e 3c  ter">fixed</td><
3da0: 2f 74 72 3e 0a 20 20 40 20 3c 74 72 20 62 67 63  /tr>.  @ <tr bgc
3db0: 6f 6c 6f 72 3d 22 23 62 64 65 35 64 36 22 3e 3c  olor="#bde5d6"><
3dc0: 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72  td align="center
3dd0: 22 3e 74 65 73 74 65 64 3c 2f 74 64 3e 3c 2f 74  ">tested</td></t
3de0: 72 3e 0a 20 20 40 20 3c 74 72 20 62 67 63 6f 6c  r>.  @ <tr bgcol
3df0: 6f 72 3d 22 23 63 61 63 61 65 35 22 3e 3c 74 64  or="#cacae5"><td
3e00: 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 3e   align="center">
3e10: 64 65 66 65 72 3c 2f 74 64 3e 3c 2f 74 72 3e 0a  defer</td></tr>.
3e20: 20 20 40 20 3c 74 72 20 62 67 63 6f 6c 6f 72 3d    @ <tr bgcolor=
3e30: 22 23 63 38 63 38 63 38 22 3e 3c 74 64 20 61 6c  "#c8c8c8"><td al
3e40: 69 67 6e 3d 22 63 65 6e 74 65 72 22 3e 63 6c 6f  ign="center">clo
3e50: 73 65 64 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20  sed</td></tr>.  
3e60: 40 20 3c 2f 74 61 62 6c 65 3e 0a 20 20 40 20 3c  @ </table>.  @ <
3e70: 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e  blockquote><pre>
3e80: 0a 20 20 40 20 53 45 4c 45 43 54 0a 20 20 40 20  .  @ SELECT.  @ 
3e90: 20 20 43 41 53 45 20 57 48 45 4e 20 73 74 61 74    CASE WHEN stat
3ea0: 75 73 20 49 4e 20 28 27 6e 65 77 27 2c 27 61 63  us IN ('new','ac
3eb0: 74 69 76 65 27 29 20 54 48 45 4e 20 27 23 66 32  tive') THEN '#f2
3ec0: 64 63 64 63 27 0a 20 20 40 20 20 20 20 20 20 20  dcdc'.  @       
3ed0: 20 57 48 45 4e 20 73 74 61 74 75 73 3d 27 72 65   WHEN status='re
3ee0: 76 69 65 77 27 20 54 48 45 4e 20 27 23 65 38 65  view' THEN '#e8e
3ef0: 38 62 64 27 0a 20 20 40 20 20 20 20 20 20 20 20  8bd'.  @        
3f00: 57 48 45 4e 20 73 74 61 74 75 73 3d 27 66 69 78  WHEN status='fix
3f10: 65 64 27 20 54 48 45 4e 20 27 23 63 66 65 38 62  ed' THEN '#cfe8b
3f20: 64 27 0a 20 20 40 20 20 20 20 20 20 20 20 57 48  d'.  @        WH
3f30: 45 4e 20 73 74 61 74 75 73 3d 27 74 65 73 74 65  EN status='teste
3f40: 64 27 20 54 48 45 4e 20 27 23 62 64 65 35 64 36  d' THEN '#bde5d6
3f50: 27 0a 20 20 40 20 20 20 20 20 20 20 20 57 48 45  '.  @        WHE
3f60: 4e 20 73 74 61 74 75 73 3d 27 64 65 66 65 72 27  N status='defer'
3f70: 20 54 48 45 4e 20 27 23 63 61 63 61 65 35 27 0a   THEN '#cacae5'.
3f80: 20 20 40 20 20 20 20 20 20 20 20 45 4c 53 45 20    @        ELSE 
3f90: 27 23 63 38 63 38 63 38 27 20 45 4e 44 20 61 73  '#c8c8c8' END as
3fa0: 20 27 62 67 63 6f 6c 6f 72 27 2c 0a 20 20 40 20   'bgcolor',.  @ 
3fb0: 20 20 74 6e 20 41 53 20 27 23 27 2c 0a 20 20 40    tn AS '#',.  @
3fc0: 20 20 20 74 79 70 65 20 41 53 20 27 54 79 70 65     type AS 'Type
3fd0: 27 2c 0a 20 20 40 20 20 20 73 74 61 74 75 73 20  ',.  @   status 
3fe0: 41 53 20 27 53 74 61 74 75 73 27 2c 0a 20 20 40  AS 'Status',.  @
3ff0: 20 20 20 73 64 61 74 65 28 6f 72 69 67 74 69 6d     sdate(origtim
4000: 65 29 20 41 53 20 27 43 72 65 61 74 65 64 27 2c  e) AS 'Created',
4010: 0a 20 20 40 20 20 20 6f 77 6e 65 72 20 41 53 20  .  @   owner AS 
4020: 27 42 79 27 2c 0a 20 20 40 20 20 20 73 75 62 73  'By',.  @   subs
4030: 79 73 74 65 6d 20 41 53 20 27 53 75 62 73 79 73  ystem AS 'Subsys
4040: 27 2c 0a 20 20 40 20 20 20 73 64 61 74 65 28 63  ',.  @   sdate(c
4050: 68 61 6e 67 65 74 69 6d 65 29 20 41 53 20 27 43  hangetime) AS 'C
4060: 68 61 6e 67 65 64 27 2c 0a 20 20 40 20 20 20 61  hanged',.  @   a
4070: 73 73 69 67 6e 65 64 74 6f 20 41 53 20 27 41 73  ssignedto AS 'As
4080: 73 69 67 6e 65 64 27 2c 0a 20 20 40 20 20 20 73  signed',.  @   s
4090: 65 76 65 72 69 74 79 20 41 53 20 27 53 76 72 27  everity AS 'Svr'
40a0: 2c 0a 20 20 40 20 20 20 70 72 69 6f 72 69 74 79  ,.  @   priority
40b0: 20 41 53 20 27 50 72 69 27 2c 0a 20 20 40 20 20   AS 'Pri',.  @  
40c0: 20 74 69 74 6c 65 20 41 53 20 27 54 69 74 6c 65   title AS 'Title
40d0: 27 0a 20 20 40 20 46 52 4f 4d 20 74 69 63 6b 65  '.  @ FROM ticke
40e0: 74 0a 20 20 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c  t.  @ </pre></bl
40f0: 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 40 20 3c 70  ockquote>.  @ <p
4100: 3e 54 6f 20 62 61 73 65 20 74 68 65 20 62 61 63  >To base the bac
4110: 6b 67 72 6f 75 6e 64 20 63 6f 6c 6f 72 20 6f 6e  kground color on
4120: 20 74 68 65 20 54 49 43 4b 45 54 2e 50 52 49 4f   the TICKET.PRIO
4130: 52 49 54 59 20 6f 72 0a 20 20 40 20 54 49 43 4b  RITY or.  @ TICK
4140: 45 54 2e 53 45 56 45 52 49 54 59 20 66 69 65 6c  ET.SEVERITY fiel
4150: 64 73 2c 20 73 75 62 73 74 69 74 75 74 65 20 74  ds, substitute t
4160: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
4170: 65 20 66 6f 72 20 74 68 65 0a 20 20 40 20 66 69  e for the.  @ fi
4180: 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  rst column of th
4190: 65 20 71 75 65 72 79 3a 3c 2f 70 3e 0a 20 20 40  e query:</p>.  @
41a0: 20 3c 74 61 62 6c 65 20 61 6c 69 67 6e 3d 22 72   <table align="r
41b0: 69 67 68 74 22 20 73 74 79 6c 65 3d 22 6d 61 72  ight" style="mar
41c0: 67 69 6e 3a 20 30 20 35 70 78 3b 22 20 62 6f 72  gin: 0 5px;" bor
41d0: 64 65 72 3d 31 20 63 65 6c 6c 73 70 61 63 69 6e  der=1 cellspacin
41e0: 67 3d 30 20 77 69 64 74 68 3d 31 32 35 3e 0a 20  g=0 width=125>. 
41f0: 20 40 20 3c 74 72 20 62 67 63 6f 6c 6f 72 3d 22   @ <tr bgcolor="
4200: 23 66 32 64 63 64 63 22 3e 3c 74 64 20 61 6c 69  #f2dcdc"><td ali
4210: 67 6e 3d 22 63 65 6e 74 65 72 22 3e 31 3c 2f 74  gn="center">1</t
4220: 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72 20  d></tr>.  @ <tr 
4230: 62 67 63 6f 6c 6f 72 3d 22 23 65 38 65 38 62 64  bgcolor="#e8e8bd
4240: 22 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e  "><td align="cen
4250: 74 65 72 22 3e 32 3c 2f 74 64 3e 3c 2f 74 72 3e  ter">2</td></tr>
4260: 0a 20 20 40 20 3c 74 72 20 62 67 63 6f 6c 6f 72  .  @ <tr bgcolor
4270: 3d 22 23 63 66 65 38 62 64 22 3e 3c 74 64 20 61  ="#cfe8bd"><td a
4280: 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 3e 33 3c  lign="center">3<
4290: 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74  /td></tr>.  @ <t
42a0: 72 20 62 67 63 6f 6c 6f 72 3d 22 23 63 61 63 61  r bgcolor="#caca
42b0: 65 35 22 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63  e5"><td align="c
42c0: 65 6e 74 65 72 22 3e 34 3c 2f 74 64 3e 3c 2f 74  enter">4</td></t
42d0: 72 3e 0a 20 20 40 20 3c 74 72 20 62 67 63 6f 6c  r>.  @ <tr bgcol
42e0: 6f 72 3d 22 23 63 38 63 38 63 38 22 3e 3c 74 64  or="#c8c8c8"><td
42f0: 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 3e   align="center">
4300: 35 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20  5</td></tr>.  @ 
4310: 3c 2f 74 61 62 6c 65 3e 0a 20 20 40 20 3c 62 6c  </table>.  @ <bl
4320: 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 20  ockquote><pre>. 
4330: 20 40 20 53 45 4c 45 43 54 0a 20 20 40 20 20 20   @ SELECT.  @   
4340: 43 41 53 45 20 70 72 69 6f 72 69 74 79 20 57 48  CASE priority WH
4350: 45 4e 20 31 20 54 48 45 4e 20 27 23 66 32 64 63  EN 1 THEN '#f2dc
4360: 64 63 27 0a 20 20 40 20 20 20 20 20 20 20 20 57  dc'.  @        W
4370: 48 45 4e 20 32 20 54 48 45 4e 20 27 23 65 38 65  HEN 2 THEN '#e8e
4380: 38 62 64 27 0a 20 20 40 20 20 20 20 20 20 20 20  8bd'.  @        
4390: 57 48 45 4e 20 33 20 54 48 45 4e 20 27 23 63 66  WHEN 3 THEN '#cf
43a0: 65 38 62 64 27 0a 20 20 40 20 20 20 20 20 20 20  e8bd'.  @       
43b0: 20 57 48 45 4e 20 34 20 54 48 45 4e 20 27 23 63   WHEN 4 THEN '#c
43c0: 61 63 61 65 35 27 0a 20 20 40 20 20 20 20 20 20  acae5'.  @      
43d0: 20 20 45 4c 53 45 20 27 23 63 38 63 38 63 38 27    ELSE '#c8c8c8'
43e0: 20 45 4e 44 20 61 73 20 27 62 67 63 6f 6c 6f 72   END as 'bgcolor
43f0: 27 2c 0a 20 20 40 20 2e 2e 2e 0a 20 20 40 20 46  ',.  @ ....  @ F
4400: 52 4f 4d 20 74 69 63 6b 65 74 0a 20 20 40 20 3c  ROM ticket.  @ <
4410: 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74  /pre></blockquot
4420: 65 3e 0a 23 69 66 20 30 0a 20 20 40 20 3c 70 3e  e>.#if 0.  @ <p>
4430: 59 6f 75 20 63 61 6e 2c 20 6f 66 20 63 6f 75 72  You can, of cour
4440: 73 65 2c 20 73 75 62 73 74 69 74 75 74 65 20 64  se, substitute d
4450: 69 66 66 65 72 65 6e 74 20 63 6f 6c 6f 72 73 20  ifferent colors 
4460: 69 66 20 79 6f 75 20 63 68 6f 6f 73 65 2e 0a 20  if you choose.. 
4470: 20 40 20 48 65 72 65 20 69 73 20 61 20 70 61 6c   @ Here is a pal
4480: 65 74 74 65 20 6f 66 20 73 75 67 67 65 73 74 65  ette of suggeste
4490: 64 20 62 61 63 6b 67 72 6f 75 6e 64 20 63 6f 6c  d background col
44a0: 6f 72 73 3a 3c 2f 70 3e 0a 20 20 40 20 3c 62 6c  ors:</p>.  @ <bl
44b0: 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 40 20 3c 74  ockquote>.  @ <t
44c0: 61 62 6c 65 20 62 6f 72 64 65 72 3d 31 20 63 65  able border=1 ce
44d0: 6c 6c 73 70 61 63 69 6e 67 3d 30 20 77 69 64 74  llspacing=0 widt
44e0: 68 3d 33 30 30 3e 0a 20 20 40 20 3c 74 72 3e 3c  h=300>.  @ <tr><
44f0: 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72  td align="center
4500: 22 20 62 67 63 6f 6c 6f 72 3d 22 23 66 66 62 64  " bgcolor="#ffbd
4510: 62 64 22 3e 23 66 66 62 64 62 64 3c 2f 74 64 3e  bd">#ffbdbd</td>
4520: 0a 20 20 40 20 20 20 20 20 3c 74 64 20 61 6c 69  .  @     <td ali
4530: 67 6e 3d 22 63 65 6e 74 65 72 22 20 62 67 63 6f  gn="center" bgco
4540: 6c 6f 72 3d 22 23 66 32 64 63 64 63 22 3e 23 66  lor="#f2dcdc">#f
4550: 32 64 63 64 63 3c 2f 74 64 3e 3c 2f 74 72 3e 0a  2dcdc</td></tr>.
4560: 20 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67    @ <tr><td alig
4570: 6e 3d 22 63 65 6e 74 65 72 22 20 62 67 63 6f 6c  n="center" bgcol
4580: 6f 72 3d 22 23 66 66 66 66 62 64 22 3e 23 66 66  or="#ffffbd">#ff
4590: 66 66 62 64 3c 2f 74 64 3e 0a 20 20 40 20 20 20  ffbd</td>.  @   
45a0: 20 20 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e    <td align="cen
45b0: 74 65 72 22 20 62 67 63 6f 6c 6f 72 3d 22 23 65  ter" bgcolor="#e
45c0: 38 65 38 62 64 22 3e 23 65 38 65 38 62 64 3c 2f  8e8bd">#e8e8bd</
45d0: 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72  td></tr>.  @ <tr
45e0: 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74  ><td align="cent
45f0: 65 72 22 20 62 67 63 6f 6c 6f 72 3d 22 23 63 30  er" bgcolor="#c0
4600: 65 62 63 30 22 3e 23 63 30 65 62 63 30 3c 2f 74  ebc0">#c0ebc0</t
4610: 64 3e 0a 20 20 40 20 20 20 20 20 3c 74 64 20 61  d>.  @     <td a
4620: 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 20 62 67  lign="center" bg
4630: 63 6f 6c 6f 72 3d 22 23 63 66 65 38 62 64 22 3e  color="#cfe8bd">
4640: 23 63 66 65 38 62 64 3c 2f 74 64 3e 3c 2f 74 72  #cfe8bd</td></tr
4650: 3e 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c  >.  @ <tr><td al
4660: 69 67 6e 3d 22 63 65 6e 74 65 72 22 20 62 67 63  ign="center" bgc
4670: 6f 6c 6f 72 3d 22 23 63 30 63 30 66 34 22 3e 23  olor="#c0c0f4">#
4680: 63 30 63 30 66 34 3c 2f 74 64 3e 0a 20 20 40 20  c0c0f4</td>.  @ 
4690: 20 20 20 20 3c 74 64 20 61 6c 69 67 6e 3d 22 63      <td align="c
46a0: 65 6e 74 65 72 22 20 62 67 63 6f 6c 6f 72 3d 22  enter" bgcolor="
46b0: 23 64 36 64 36 65 38 22 3e 23 64 36 64 36 65 38  #d6d6e8">#d6d6e8
46c0: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c  </td></tr>.  @ <
46d0: 74 72 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65  tr><td align="ce
46e0: 6e 74 65 72 22 20 62 67 63 6f 6c 6f 72 3d 22 23  nter" bgcolor="#
46f0: 64 30 62 31 66 66 22 3e 23 64 30 62 31 66 66 3c  d0b1ff">#d0b1ff<
4700: 2f 74 64 3e 0a 20 20 40 20 20 20 20 20 3c 74 64  /td>.  @     <td
4710: 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 20   align="center" 
4720: 62 67 63 6f 6c 6f 72 3d 22 23 64 32 63 30 64 62  bgcolor="#d2c0db
4730: 22 3e 23 64 32 63 30 64 62 3c 2f 74 64 3e 3c 2f  ">#d2c0db</td></
4740: 74 72 3e 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20  tr>.  @ <tr><td 
4750: 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 20 62  align="center" b
4760: 67 63 6f 6c 6f 72 3d 22 23 62 62 62 62 62 62 22  gcolor="#bbbbbb"
4770: 3e 23 62 62 62 62 62 62 3c 2f 74 64 3e 0a 20 20  >#bbbbbb</td>.  
4780: 40 20 20 20 20 20 3c 74 64 20 61 6c 69 67 6e 3d  @     <td align=
4790: 22 63 65 6e 74 65 72 22 20 62 67 63 6f 6c 6f 72  "center" bgcolor
47a0: 3d 22 23 64 30 64 30 64 30 22 3e 23 64 30 64 30  ="#d0d0d0">#d0d0
47b0: 64 30 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40  d0</td></tr>.  @
47c0: 20 3c 2f 74 61 62 6c 65 3e 0a 20 20 40 20 3c 2f   </table>.  @ </
47d0: 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 23 65 6e 64  blockquote>.#end
47e0: 69 66 0a 20 20 40 20 3c 70 3e 54 6f 20 73 65 65  if.  @ <p>To see
47f0: 20 74 68 65 20 54 49 43 4b 45 54 2e 44 45 53 43   the TICKET.DESC
4800: 52 49 50 54 49 4f 4e 20 61 6e 64 20 54 49 43 4b  RIPTION and TICK
4810: 45 54 2e 52 45 4d 41 52 4b 53 20 66 69 65 6c 64  ET.REMARKS field
4820: 73 2c 20 69 6e 63 6c 75 64 65 0a 20 20 40 20 74  s, include.  @ t
4830: 68 65 6d 20 61 73 20 74 68 65 20 6c 61 73 74 20  hem as the last 
4840: 74 77 6f 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  two columns of t
4850: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
4860: 64 20 67 69 76 65 6e 20 74 68 65 6d 20 6e 61 6d  d given them nam
4870: 65 73 0a 20 20 40 20 74 68 61 74 20 62 65 67 69  es.  @ that begi
4880: 6e 20 77 69 74 68 20 61 6e 20 75 6e 64 65 72 73  n with an unders
4890: 63 6f 72 65 2e 20 20 4c 69 6b 65 20 74 68 69 73  core.  Like this
48a0: 3a 3c 2f 70 3e 0a 20 20 40 20 3c 62 6c 6f 63 6b  :</p>.  @ <block
48b0: 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 20 20 40 20  quote><pre>.  @ 
48c0: 20 53 45 4c 45 43 54 0a 20 20 40 20 20 20 20 74   SELECT.  @    t
48d0: 6e 20 41 53 20 27 23 27 2c 0a 20 20 40 20 20 20  n AS '#',.  @   
48e0: 20 74 79 70 65 20 41 53 20 27 54 79 70 65 27 2c   type AS 'Type',
48f0: 0a 20 20 40 20 20 20 20 73 74 61 74 75 73 20 41  .  @    status A
4900: 53 20 27 53 74 61 74 75 73 27 2c 0a 20 20 40 20  S 'Status',.  @ 
4910: 20 20 20 73 64 61 74 65 28 6f 72 69 67 74 69 6d     sdate(origtim
4920: 65 29 20 41 53 20 27 43 72 65 61 74 65 64 27 2c  e) AS 'Created',
4930: 0a 20 20 40 20 20 20 20 6f 77 6e 65 72 20 41 53  .  @    owner AS
4940: 20 27 42 79 27 2c 0a 20 20 40 20 20 20 20 73 75   'By',.  @    su
4950: 62 73 79 73 74 65 6d 20 41 53 20 27 53 75 62 73  bsystem AS 'Subs
4960: 79 73 27 2c 0a 20 20 40 20 20 20 20 73 64 61 74  ys',.  @    sdat
4970: 65 28 63 68 61 6e 67 65 74 69 6d 65 29 20 41 53  e(changetime) AS
4980: 20 27 43 68 61 6e 67 65 64 27 2c 0a 20 20 40 20   'Changed',.  @ 
4990: 20 20 20 61 73 73 69 67 6e 65 64 74 6f 20 41 53     assignedto AS
49a0: 20 27 41 73 73 69 67 6e 65 64 27 2c 0a 20 20 40   'Assigned',.  @
49b0: 20 20 20 20 73 65 76 65 72 69 74 79 20 41 53 20      severity AS 
49c0: 27 53 76 72 27 2c 0a 20 20 40 20 20 20 20 70 72  'Svr',.  @    pr
49d0: 69 6f 72 69 74 79 20 41 53 20 27 50 72 69 27 2c  iority AS 'Pri',
49e0: 0a 20 20 40 20 20 20 20 74 69 74 6c 65 20 41 53  .  @    title AS
49f0: 20 27 54 69 74 6c 65 27 2c 0a 20 20 40 20 20 20   'Title',.  @   
4a00: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 41 53 20   description AS 
4a10: 27 5f 44 65 73 63 72 69 70 74 69 6f 6e 27 2c 20  '_Description', 
4a20: 20 20 2d 2d 20 57 68 65 6e 20 74 68 65 20 63 6f    -- When the co
4a30: 6c 75 6d 6e 20 6e 61 6d 65 20 62 65 67 69 6e 73  lumn name begins
4a40: 20 77 69 74 68 20 27 5f 27 0a 20 20 40 20 20 20   with '_'.  @   
4a50: 20 72 65 6d 61 72 6b 73 20 41 53 20 27 5f 52 65   remarks AS '_Re
4a60: 6d 61 72 6b 73 27 20 20 20 20 20 20 20 20 20 20  marks'          
4a70: 20 20 2d 2d 20 74 68 65 20 64 61 74 61 20 69 73    -- the data is
4a80: 20 73 68 6f 77 6e 20 6f 6e 20 61 20 73 65 70 61   shown on a sepa
4a90: 72 61 74 65 20 72 6f 77 2e 0a 20 20 40 20 20 46  rate row..  @  F
4aa0: 52 4f 4d 20 74 69 63 6b 65 74 0a 20 20 40 20 3c  ROM ticket.  @ <
4ab0: 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74  /pre></blockquot
4ac0: 65 3e 0a 20 20 40 0a 20 20 40 20 3c 70 3e 4f 72  e>.  @.  @ <p>Or
4ad0: 2c 20 74 6f 20 73 65 65 20 70 61 72 74 20 6f 66  , to see part of
4ae0: 20 74 68 65 20 64 65 73 63 72 69 70 74 69 6f 6e   the description
4af0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 77   on the same row
4b00: 2c 20 75 73 65 20 74 68 65 0a 20 20 40 20 3c 62  , use the.  @ <b
4b10: 3e 77 69 6b 69 28 29 3c 2f 62 3e 20 66 75 6e 63  >wiki()</b> func
4b20: 74 69 6f 6e 20 77 69 74 68 20 73 6f 6d 65 20 73  tion with some s
4b30: 74 72 69 6e 67 20 6d 61 6e 69 70 75 6c 61 74 69  tring manipulati
4b40: 6f 6e 2e 20 55 73 69 6e 67 20 74 68 65 0a 20 20  on. Using the.  
4b50: 40 20 3c 62 3e 74 6b 74 28 29 3c 2f 62 3e 20 66  @ <b>tkt()</b> f
4b60: 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 74  unction on the t
4b70: 69 63 6b 65 74 20 6e 75 6d 62 65 72 20 77 69 6c  icket number wil
4b80: 6c 20 61 6c 73 6f 20 67 65 6e 65 72 61 74 65 20  l also generate 
4b90: 61 20 6c 69 6e 6b 65 64 0a 20 20 40 20 66 69 65  a linked.  @ fie
4ba0: 6c 64 2c 20 62 75 74 20 77 69 74 68 6f 75 74 20  ld, but without 
4bb0: 74 68 65 20 65 78 74 72 61 20 3c 69 3e 65 64 69  the extra <i>edi
4bc0: 74 3c 2f 69 3e 20 63 6f 6c 75 6d 6e 3a 0a 20 20  t</i> column:.  
4bd0: 40 20 3c 2f 70 3e 0a 20 20 40 20 3c 62 6c 6f 63  @ </p>.  @ <bloc
4be0: 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 20 20 40  kquote><pre>.  @
4bf0: 20 20 53 45 4c 45 43 54 0a 20 20 40 20 20 20 20    SELECT.  @    
4c00: 74 6b 74 28 74 6e 29 20 41 53 20 27 27 2c 0a 20  tkt(tn) AS '',. 
4c10: 20 40 20 20 20 20 74 69 74 6c 65 20 41 53 20 27   @    title AS '
4c20: 54 69 74 6c 65 27 2c 0a 20 20 40 20 20 20 20 77  Title',.  @    w
4c30: 69 6b 69 28 73 75 62 73 74 72 28 64 65 73 63 72  iki(substr(descr
4c40: 69 70 74 69 6f 6e 2c 30 2c 38 30 29 29 20 41 53  iption,0,80)) AS
4c50: 20 27 44 65 73 63 72 69 70 74 69 6f 6e 27 0a 20   'Description'. 
4c60: 20 40 20 20 46 52 4f 4d 20 74 69 63 6b 65 74 0a   @  FROM ticket.
4c70: 20 20 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63    @ </pre></bloc
4c80: 6b 71 75 6f 74 65 3e 0a 20 20 40 0a 7d 0a 0a 73  kquote>.  @.}..s
4c90: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6c 75 6d  tatic void colum
4ca0: 6e 5f 68 65 61 64 65 72 28 69 6e 74 20 72 6e 2c  n_header(int rn,
4cb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
4cc0: 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20  , int nCol, int 
4cd0: 6e 53 6f 72 74 65 64 2c 0a 20 20 20 20 63 6f 6e  nSorted,.    con
4ce0: 73 74 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74  st char *zDirect
4cf0: 69 6f 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ion, const char 
4d00: 2a 7a 45 78 74 72 61 0a 29 7b 0a 20 20 69 6e 74  *zExtra.){.  int
4d10: 20 73 65 74 20 3d 20 28 6e 43 6f 6c 3d 3d 6e 53   set = (nCol==nS
4d20: 6f 72 74 65 64 29 3b 0a 20 20 69 6e 74 20 64 65  orted);.  int de
4d30: 73 63 20 3d 20 21 73 74 72 63 6d 70 28 7a 44 69  sc = !strcmp(zDi
4d40: 72 65 63 74 69 6f 6e 2c 22 44 45 53 43 22 29 3b  rection,"DESC");
4d50: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 69 63  ..  /*.  ** Clic
4d60: 6b 69 6e 67 20 73 61 6d 65 20 63 6f 6c 75 6d 6e  king same column
4d70: 20 68 65 61 64 65 72 20 33 20 74 69 6d 65 73 20   header 3 times 
4d80: 69 6e 20 61 20 72 6f 77 20 72 65 73 65 74 73 20  in a row resets 
4d90: 61 6e 79 20 73 6f 72 74 69 6e 67 2e 0a 20 20 2a  any sorting..  *
4da0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 6c  * Note that we l
4db0: 69 6e 6b 20 74 6f 20 72 70 74 76 69 65 77 2c 20  ink to rptview, 
4dc0: 77 68 69 63 68 20 6d 65 61 6e 73 20 65 6d 62 65  which means embe
4dd0: 64 64 65 64 20 72 65 70 6f 72 74 73 20 77 69 6c  dded reports wil
4de0: 6c 20 67 65 74 0a 20 20 2a 2a 20 73 65 6e 74 20  l get.  ** sent 
4df0: 74 6f 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  to the actual re
4e00: 70 6f 72 74 20 76 69 65 77 20 70 61 67 65 20 61  port view page a
4e10: 73 20 73 6f 6f 6e 20 61 73 20 61 20 75 73 65 72  s soon as a user
4e20: 20 74 72 69 65 73 20 74 6f 20 64 6f 0a 20 20 2a   tries to do.  *
4e30: 2a 20 61 6e 79 20 73 6f 72 74 69 6e 67 2e 20 49  * any sorting. I
4e40: 20 64 6f 6e 27 74 20 73 65 65 20 74 68 61 74 20   don't see that 
4e50: 61 73 20 61 20 42 61 64 20 54 68 69 6e 67 2e 0a  as a Bad Thing..
4e60: 20 20 2a 2f 0a 20 20 69 66 28 73 65 74 20 26 26    */.  if(set &&
4e70: 20 64 65 73 63 29 7b 0a 20 20 20 20 40 20 3c 74   desc){.    @ <t
4e80: 68 20 62 67 63 6f 6c 6f 72 3d 22 25 73 28 42 47  h bgcolor="%s(BG
4e90: 31 29 22 20 63 6c 61 73 73 3d 22 62 6b 67 6e 64  1)" class="bkgnd
4ea0: 31 22 3e 0a 20 20 20 20 40 20 20 20 3c 61 20 68  1">.    @   <a h
4eb0: 72 65 66 3d 22 72 70 74 76 69 65 77 3f 72 6e 3d  ref="rptview?rn=
4ec0: 25 64 28 72 6e 29 25 73 28 7a 45 78 74 72 61 29  %d(rn)%s(zExtra)
4ed0: 22 3e 25 68 28 7a 43 6f 6c 29 3c 2f 61 3e 3c 2f  ">%h(zCol)</a></
4ee0: 74 68 3e 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  th>.  }else{.   
4ef0: 20 69 66 28 73 65 74 29 7b 0a 20 20 20 20 20 20   if(set){.      
4f00: 40 20 3c 74 68 20 62 67 63 6f 6c 6f 72 3d 22 25  @ <th bgcolor="%
4f10: 73 28 42 47 31 29 22 20 63 6c 61 73 73 3d 22 62  s(BG1)" class="b
4f20: 6b 67 6e 64 31 22 3e 3c 61 0a 20 20 20 20 7d 65  kgnd1"><a.    }e
4f30: 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 3c 74 68  lse{.      @ <th
4f40: 3e 3c 61 0a 20 20 20 20 7d 0a 20 20 20 20 40 20  ><a.    }.    @ 
4f50: 68 72 65 66 3d 22 72 70 74 76 69 65 77 3f 72 6e  href="rptview?rn
4f60: 3d 25 64 28 72 6e 29 26 61 6d 70 3b 6f 72 64 65  =%d(rn)&amp;orde
4f70: 72 5f 62 79 3d 25 64 28 6e 43 6f 6c 29 26 61 6d  r_by=%d(nCol)&am
4f80: 70 3b 5c 0a 20 20 20 20 40 20 6f 72 64 65 72 5f  p;\.    @ order_
4f90: 64 69 72 3d 25 73 28 64 65 73 63 3f 22 41 53 43  dir=%s(desc?"ASC
4fa0: 22 3a 22 44 45 53 43 22 29 5c 0a 20 20 20 20 40  ":"DESC")\.    @
4fb0: 20 25 73 28 7a 45 78 74 72 61 29 22 3e 25 68 28   %s(zExtra)">%h(
4fc0: 7a 43 6f 6c 29 3c 2f 61 3e 3c 2f 74 68 3e 0a 20  zCol)</a></th>. 
4fd0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
4fe0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 72 65 70  state of the rep
4ff0: 6f 72 74 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a  ort generation..
5000: 2a 2f 0a 73 74 72 75 63 74 20 47 65 6e 65 72 61  */.struct Genera
5010: 74 65 48 54 4d 4c 20 7b 0a 20 20 69 6e 74 20 72  teHTML {.  int r
5020: 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  n;          /* R
5030: 65 70 6f 72 74 20 6e 75 6d 62 65 72 20 2a 2f 0a  eport number */.
5040: 20 20 69 6e 74 20 6e 43 6f 75 6e 74 3b 20 20 20    int nCount;   
5050: 20 20 20 2f 2a 20 52 6f 77 20 6e 75 6d 62 65 72     /* Row number
5060: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
5070: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5080: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20   of columns */. 
5090: 20 69 6e 74 20 69 73 4d 75 6c 74 69 72 6f 77 3b   int isMultirow;
50a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6d 75 6c    /* True if mul
50b0: 74 69 70 6c 65 20 74 61 62 6c 65 20 72 6f 77 73  tiple table rows
50c0: 20 70 65 72 20 71 75 65 72 79 20 72 65 73 75 6c   per query resul
50d0: 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69  t row */.  int i
50e0: 4e 65 77 52 6f 77 3b 20 20 20 20 20 2f 2a 20 49  NewRow;     /* I
50f0: 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 6f  ndex of first co
5100: 6c 75 6d 6e 20 74 68 61 74 20 67 6f 65 73 20 6f  lumn that goes o
5110: 6e 20 73 65 70 61 72 61 74 65 20 72 6f 77 20 2a  n separate row *
5120: 2f 0a 20 20 69 6e 74 20 69 42 67 3b 20 20 20 20  /.  int iBg;    
5130: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
5140: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 64 65 66   column that def
5150: 69 6e 65 73 20 62 61 63 6b 67 72 6f 75 6e 64 20  ines background 
5160: 63 6f 6c 6f 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  color */.};../*.
5170: 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  ** The callback 
5180: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 62 5f  function for db_
5190: 71 75 65 72 79 0a 2a 2f 0a 73 74 61 74 69 63 20  query.*/.static 
51a0: 69 6e 74 20 67 65 6e 65 72 61 74 65 5f 68 74 6d  int generate_htm
51b0: 6c 28 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72  l(.  void *pUser
51c0: 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ,     /* Pointer
51d0: 20 74 6f 20 6f 75 74 70 75 74 20 73 74 61 74 65   to output state
51e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
51f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5200: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
5210: 68 69 73 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  his result row *
5220: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  /.  char **azArg
5230: 2c 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  ,    /* Text of 
5240: 64 61 74 61 20 69 6e 20 61 6c 6c 20 63 6f 6c 75  data in all colu
5250: 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  mns */.  char **
5260: 61 7a 4e 61 6d 65 20 20 20 20 2f 2a 20 4e 61 6d  azName    /* Nam
5270: 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
5280: 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  s */.){.  struct
5290: 20 47 65 6e 65 72 61 74 65 48 54 4d 4c 20 2a 70   GenerateHTML *p
52a0: 53 74 61 74 65 20 3d 20 28 73 74 72 75 63 74 20  State = (struct 
52b0: 47 65 6e 65 72 61 74 65 48 54 4d 4c 2a 29 70 55  GenerateHTML*)pU
52c0: 73 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ser;.  int i;.  
52d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 69 64  const char *zTid
52e0: 3b 20 20 2f 2a 20 54 69 63 6b 65 74 20 55 55 49  ;  /* Ticket UUI
52f0: 44 2e 20 20 28 76 61 6c 75 65 20 6f 66 20 63 6f  D.  (value of co
5300: 6c 75 6d 6e 20 6e 61 6d 65 64 20 27 23 27 29 20  lumn named '#') 
5310: 2a 2f 0a 20 20 69 6e 74 20 72 6e 3b 20 20 20 20  */.  int rn;    
5320: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
5330: 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68  t number */.  ch
5340: 61 72 20 2a 7a 42 67 20 3d 20 30 3b 20 20 20 20  ar *zBg = 0;    
5350: 20 2f 2a 20 55 73 65 20 74 68 69 73 20 62 61 63   /* Use this bac
5360: 6b 67 72 6f 75 6e 64 20 63 6f 6c 6f 72 20 2a 2f  kground color */
5370: 0a 20 20 63 68 61 72 20 7a 50 61 67 65 5b 33 30  .  char zPage[30
5380: 5d 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 76 65  ];    /* Text ve
5390: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 69 63  rsion of the tic
53a0: 6b 65 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  ket number */.. 
53b0: 20 2f 2a 20 47 65 74 20 74 68 65 20 72 65 70 6f   /* Get the repo
53c0: 72 74 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20  rt number.  */. 
53d0: 20 72 6e 20 3d 20 70 53 74 61 74 65 2d 3e 72 6e   rn = pState->rn
53e0: 3b 0a 0a 20 20 2f 2a 20 44 6f 20 69 6e 69 74 69  ;..  /* Do initi
53f0: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2f 0a 20  alization.  */. 
5400: 20 69 66 28 20 70 53 74 61 74 65 2d 3e 6e 43 6f   if( pState->nCo
5410: 75 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  unt==0 ){.    /*
5420: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
5430: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
5440: 73 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 68  s, the column th
5450: 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 62 61  at determines ba
5460: 63 6b 67 72 6f 75 6e 64 0a 20 20 20 20 2a 2a 20  ckground.    ** 
5470: 63 6f 6c 6f 72 2c 20 61 6e 64 20 77 68 65 74 68  color, and wheth
5480: 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 20 72  er or not this r
5490: 6f 77 20 6f 66 20 64 61 74 61 20 69 73 20 72 65  ow of data is re
54a0: 70 72 65 73 65 6e 74 65 64 20 62 79 20 6d 75 6c  presented by mul
54b0: 74 69 70 6c 65 0a 20 20 20 20 2a 2a 20 72 6f 77  tiple.    ** row
54c0: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s in the table..
54d0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 53 74 61 74      */.    pStat
54e0: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
54f0: 20 70 53 74 61 74 65 2d 3e 69 73 4d 75 6c 74 69   pState->isMulti
5500: 72 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70 53 74  row = 0;.    pSt
5510: 61 74 65 2d 3e 69 4e 65 77 52 6f 77 20 3d 20 2d  ate->iNewRow = -
5520: 31 3b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e 69  1;.    pState->i
5530: 42 67 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72  Bg = -1;.    for
5540: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
5550: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  +){.      if( az
5560: 4e 61 6d 65 5b 69 5d 5b 30 5d 3d 3d 27 62 27 20  Name[i][0]=='b' 
5570: 26 26 20 73 74 72 63 6d 70 28 61 7a 4e 61 6d 65  && strcmp(azName
5580: 5b 69 5d 2c 22 62 67 63 6f 6c 6f 72 22 29 3d 3d  [i],"bgcolor")==
5590: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 74  0 ){.        pSt
55a0: 61 74 65 2d 3e 69 42 67 20 3d 20 69 3b 0a 20 20  ate->iBg = i;.  
55b0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
55c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
55d0: 28 20 67 2e 6f 6b 57 72 69 74 65 20 26 26 20 61  ( g.okWrite && a
55e0: 7a 4e 61 6d 65 5b 69 5d 5b 30 5d 3d 3d 27 23 27  zName[i][0]=='#'
55f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 74 61   ){.        pSta
5600: 74 65 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20  te->nCol++;.    
5610: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
5620: 53 74 61 74 65 2d 3e 69 73 4d 75 6c 74 69 72 6f  State->isMultiro
5630: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  w ){.        if(
5640: 20 61 7a 4e 61 6d 65 5b 69 5d 5b 30 5d 3d 3d 27   azName[i][0]=='
5650: 5f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  _' ){.          
5660: 70 53 74 61 74 65 2d 3e 69 73 4d 75 6c 74 69 72  pState->isMultir
5670: 6f 77 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ow = 1;.        
5680: 20 20 70 53 74 61 74 65 2d 3e 69 4e 65 77 52 6f    pState->iNewRo
5690: 77 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 7d  w = i;.        }
56a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
56b0: 70 53 74 61 74 65 2d 3e 6e 43 6f 6c 2b 2b 3b 0a  pState->nCol++;.
56c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
56d0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
56e0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
56f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5700: 61 6c 6c 65 64 2c 20 6f 75 74 70 75 74 20 61 20  alled, output a 
5710: 74 61 62 6c 65 20 68 65 61 64 65 72 0a 20 20 20  table header.   
5720: 20 2a 2f 0a 20 20 20 20 40 20 3c 74 72 3e 0a 20   */.    @ <tr>. 
5730: 20 20 20 7a 54 69 64 20 3d 20 30 3b 0a 20 20 20     zTid = 0;.   
5740: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
5750: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; i++){.      ch
5760: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 61 7a 4e 61  ar *zName = azNa
5770: 6d 65 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  me[i];.      if(
5780: 20 69 3d 3d 70 53 74 61 74 65 2d 3e 69 42 67 20   i==pState->iBg 
5790: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
57a0: 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 69 4e    if( pState->iN
57b0: 65 77 52 6f 77 3e 3d 30 20 26 26 20 69 3e 3d 70  ewRow>=0 && i>=p
57c0: 53 74 61 74 65 2d 3e 69 4e 65 77 52 6f 77 20 29  State->iNewRow )
57d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 2e  {.        if( g.
57e0: 6f 6b 57 72 69 74 65 20 26 26 20 7a 54 69 64 20  okWrite && zTid 
57f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 40 20 3c  ){.          @ <
5800: 74 68 3e 26 6e 62 73 70 3b 3c 2f 74 68 3e 0a 20  th>&nbsp;</th>. 
5810: 20 20 20 20 20 20 20 20 20 7a 54 69 64 20 3d 20           zTid = 
5820: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
5830: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 30       if( zName[0
5840: 5d 3d 3d 27 5f 27 20 29 20 7a 4e 61 6d 65 2b 2b  ]=='_' ) zName++
5850: 3b 0a 20 20 20 20 20 20 20 20 40 20 3c 2f 74 72  ;.        @ </tr
5860: 3e 3c 74 72 3e 3c 74 68 20 63 6f 6c 73 70 61 6e  ><tr><th colspan
5870: 3d 25 64 28 70 53 74 61 74 65 2d 3e 6e 43 6f 6c  =%d(pState->nCol
5880: 29 3e 25 68 28 7a 4e 61 6d 65 29 3c 2f 74 68 3e  )>%h(zName)</th>
5890: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
58a0: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b        if( zName[
58b0: 30 5d 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20  0]=='#' ){.     
58c0: 20 20 20 20 20 7a 54 69 64 20 3d 20 7a 4e 61 6d       zTid = zNam
58d0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
58e0: 20 20 20 20 20 40 20 3c 74 68 3e 25 68 28 7a 4e       @ <th>%h(zN
58f0: 61 6d 65 29 3c 2f 74 68 3e 0a 20 20 20 20 20 20  ame)</th>.      
5900: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
5910: 67 2e 6f 6b 57 72 69 74 65 20 26 26 20 7a 54 69  g.okWrite && zTi
5920: 64 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 74 68  d ){.      @ <th
5930: 3e 26 6e 62 73 70 3b 3c 2f 74 68 3e 0a 20 20 20  >&nbsp;</th>.   
5940: 20 7d 0a 20 20 20 20 40 20 3c 2f 74 72 3e 0a 20   }.    @ </tr>. 
5950: 20 7d 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d   }.  if( azArg==
5960: 30 20 29 7b 0a 20 20 20 20 40 20 3c 74 72 3e 3c  0 ){.    @ <tr><
5970: 74 64 20 63 6f 6c 73 70 61 6e 3d 22 25 64 28 70  td colspan="%d(p
5980: 53 74 61 74 65 2d 3e 6e 43 6f 6c 29 22 3e 0a 20  State->nCol)">. 
5990: 20 20 20 40 20 3c 69 3e 4e 6f 20 72 65 63 6f 72     @ <i>No recor
59a0: 64 73 20 6d 61 74 63 68 20 74 68 65 20 72 65 70  ds match the rep
59b0: 6f 72 74 20 63 72 69 74 65 72 69 61 3c 2f 69 3e  ort criteria</i>
59c0: 0a 20 20 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72  .    @ </td></tr
59d0: 3e 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  >.    return 0;.
59e0: 20 20 7d 0a 20 20 2b 2b 70 53 74 61 74 65 2d 3e    }.  ++pState->
59f0: 6e 43 6f 75 6e 74 3b 0a 0a 20 20 2f 2a 20 4f 75  nCount;..  /* Ou
5a00: 74 70 75 74 20 74 68 65 20 73 65 70 61 72 61 74  tput the separat
5a10: 6f 72 20 61 62 6f 76 65 20 65 61 63 68 20 65 6e  or above each en
5a20: 74 72 79 20 69 6e 20 61 20 74 61 62 6c 65 20 77  try in a table w
5a30: 68 69 63 68 20 68 61 73 20 6d 75 6c 74 69 70 6c  hich has multipl
5a40: 65 20 6c 69 6e 65 73 0a 20 20 2a 2a 20 70 65 72  e lines.  ** per
5a50: 20 64 61 74 61 62 61 73 65 20 65 6e 74 72 79 2e   database entry.
5a60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 61  .  */.  if( pSta
5a70: 74 65 2d 3e 69 4e 65 77 52 6f 77 3e 3d 30 20 29  te->iNewRow>=0 )
5a80: 7b 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 20  {.    @ <tr><td 
5a90: 63 6f 6c 73 70 61 6e 3d 25 64 28 70 53 74 61 74  colspan=%d(pStat
5aa0: 65 2d 3e 6e 43 6f 6c 29 3e 3c 66 6f 6e 74 20 73  e->nCol)><font s
5ab0: 69 7a 65 3d 31 3e 26 6e 62 73 70 3b 3c 2f 66 6f  ize=1>&nbsp;</fo
5ac0: 6e 74 3e 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20  nt></td></tr>.  
5ad0: 7d 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  }..  /* Output t
5ae0: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
5af0: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
5b00: 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20  database.  */.  
5b10: 7a 42 67 20 3d 20 70 53 74 61 74 65 2d 3e 69 42  zBg = pState->iB
5b20: 67 3e 3d 30 20 3f 20 61 7a 41 72 67 5b 70 53 74  g>=0 ? azArg[pSt
5b30: 61 74 65 2d 3e 69 42 67 5d 20 3a 20 30 3b 0a 20  ate->iBg] : 0;. 
5b40: 20 69 66 28 20 7a 42 67 3d 3d 30 20 29 20 7a 42   if( zBg==0 ) zB
5b50: 67 20 3d 20 22 77 68 69 74 65 22 3b 0a 20 20 40  g = "white";.  @
5b60: 20 3c 74 72 20 62 67 63 6f 6c 6f 72 3d 22 25 68   <tr bgcolor="%h
5b70: 28 7a 42 67 29 22 3e 0a 20 20 7a 54 69 64 20 3d  (zBg)">.  zTid =
5b80: 20 30 3b 0a 20 20 7a 50 61 67 65 5b 30 5d 20 3d   0;.  zPage[0] =
5b90: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
5ba0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
5bb0: 20 63 68 61 72 20 2a 7a 44 61 74 61 3b 0a 20 20   char *zData;.  
5bc0: 20 20 69 66 28 20 69 3d 3d 70 53 74 61 74 65 2d    if( i==pState-
5bd0: 3e 69 42 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  >iBg ) continue;
5be0: 0a 20 20 20 20 7a 44 61 74 61 20 3d 20 61 7a 41  .    zData = azA
5bf0: 72 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a  rg[i];.    if( z
5c00: 44 61 74 61 3d 3d 30 20 29 20 7a 44 61 74 61 20  Data==0 ) zData 
5c10: 3d 20 22 22 3b 0a 20 20 20 20 69 66 28 20 70 53  = "";.    if( pS
5c20: 74 61 74 65 2d 3e 69 4e 65 77 52 6f 77 3e 3d 30  tate->iNewRow>=0
5c30: 20 26 26 20 69 3e 3d 70 53 74 61 74 65 2d 3e 69   && i>=pState->i
5c40: 4e 65 77 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  NewRow ){.      
5c50: 69 66 28 20 7a 54 69 64 20 26 26 20 67 2e 6f 6b  if( zTid && g.ok
5c60: 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Write ){.       
5c70: 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74   @ <td valign="t
5c80: 6f 70 22 3e 3c 61 20 68 72 65 66 3d 22 74 6b 74  op"><a href="tkt
5c90: 65 64 69 74 2f 25 68 28 7a 54 69 64 29 22 3e 65  edit/%h(zTid)">e
5ca0: 64 69 74 3c 2f 61 3e 3c 2f 74 64 3e 0a 20 20 20  dit</a></td>.   
5cb0: 20 20 20 20 20 7a 54 69 64 20 3d 20 30 3b 0a 20       zTid = 0;. 
5cc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5cd0: 20 7a 44 61 74 61 5b 30 5d 20 29 7b 0a 20 20 20   zData[0] ){.   
5ce0: 20 20 20 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e       Blob conten
5cf0: 74 3b 0a 20 20 20 20 20 20 20 20 40 20 3c 2f 74  t;.        @ </t
5d00: 72 3e 3c 74 72 20 62 67 63 6f 6c 6f 72 3d 22 25  r><tr bgcolor="%
5d10: 68 28 7a 42 67 29 22 3e 3c 74 64 20 63 6f 6c 73  h(zBg)"><td cols
5d20: 70 61 6e 3d 25 64 28 70 53 74 61 74 65 2d 3e 6e  pan=%d(pState->n
5d30: 43 6f 6c 29 3e 0a 20 20 20 20 20 20 20 20 62 6c  Col)>.        bl
5d40: 6f 62 5f 69 6e 69 74 28 26 63 6f 6e 74 65 6e 74  ob_init(&content
5d50: 2c 20 7a 44 61 74 61 2c 20 2d 31 29 3b 0a 20 20  , zData, -1);.  
5d60: 20 20 20 20 20 20 77 69 6b 69 5f 63 6f 6e 76 65        wiki_conve
5d70: 72 74 28 26 63 6f 6e 74 65 6e 74 2c 20 30 2c 20  rt(&content, 0, 
5d80: 30 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62  0);.        blob
5d90: 5f 72 65 73 65 74 28 26 63 6f 6e 74 65 6e 74 29  _reset(&content)
5da0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5db0: 6c 73 65 20 69 66 28 20 61 7a 4e 61 6d 65 5b 69  lse if( azName[i
5dc0: 5d 5b 30 5d 3d 3d 27 23 27 20 29 7b 0a 20 20 20  ][0]=='#' ){.   
5dd0: 20 20 20 7a 54 69 64 20 3d 20 7a 44 61 74 61 3b     zTid = zData;
5de0: 0a 20 20 20 20 20 20 40 20 3c 74 64 20 76 61 6c  .      @ <td val
5df0: 69 67 6e 3d 22 74 6f 70 22 3e 3c 61 20 68 72 65  ign="top"><a hre
5e00: 66 3d 22 74 6b 74 76 69 65 77 3f 6e 61 6d 65 3d  f="tktview?name=
5e10: 25 68 28 7a 44 61 74 61 29 22 3e 25 68 28 7a 44  %h(zData)">%h(zD
5e20: 61 74 61 29 3c 2f 61 3e 3c 2f 74 64 3e 0a 20 20  ata)</a></td>.  
5e30: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 61 74    }else if( zDat
5e40: 61 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  a[0]==0 ){.     
5e50: 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74   @ <td valign="t
5e60: 6f 70 22 3e 26 6e 62 73 70 3b 3c 2f 74 64 3e 0a  op">&nbsp;</td>.
5e70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5e80: 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74   @ <td valign="t
5e90: 6f 70 22 3e 0a 20 20 20 20 20 20 40 20 25 68 28  op">.      @ %h(
5ea0: 7a 44 61 74 61 29 0a 20 20 20 20 20 20 40 20 3c  zData).      @ <
5eb0: 2f 74 64 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  /td>.    }.  }. 
5ec0: 20 69 66 28 20 7a 54 69 64 20 26 26 20 67 2e 6f   if( zTid && g.o
5ed0: 6b 57 72 69 74 65 20 29 7b 0a 20 20 20 20 40 20  kWrite ){.    @ 
5ee0: 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22  <td valign="top"
5ef0: 3e 3c 61 20 68 72 65 66 3d 22 74 6b 74 65 64 69  ><a href="tktedi
5f00: 74 2f 25 68 28 7a 54 69 64 29 22 3e 65 64 69 74  t/%h(zTid)">edit
5f10: 3c 2f 61 3e 3c 2f 74 64 3e 0a 20 20 7d 0a 20 20  </a></td>.  }.  
5f20: 40 20 3c 2f 74 72 3e 0a 20 20 72 65 74 75 72 6e  @ </tr>.  return
5f30: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74   0;.}../*.** Out
5f40: 70 75 74 20 74 68 65 20 74 65 78 74 20 67 69 76  put the text giv
5f50: 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
5f60: 6e 74 2e 20 20 43 6f 6e 76 65 72 74 20 74 61 62  nt.  Convert tab
5f70: 73 20 61 6e 64 20 6e 65 77 6c 69 6e 65 73 20 69  s and newlines i
5f80: 6e 74 6f 0a 2a 2a 20 73 70 61 63 65 73 2e 0a 2a  nto.** spaces..*
5f90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
5fa0: 74 70 75 74 5f 6e 6f 5f 74 61 62 73 28 63 6f 6e  tput_no_tabs(con
5fb0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 77  st char *z){.  w
5fc0: 68 69 6c 65 28 20 7a 20 26 26 20 7a 5b 30 5d 20  hile( z && z[0] 
5fd0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
5fe0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  .    for(i=0; z[
5ff0: 69 5d 20 26 26 20 28 21 69 73 73 70 61 63 65 28  i] && (!isspace(
6000: 7a 5b 69 5d 29 20 7c 7c 20 7a 5b 69 5d 3d 3d 27  z[i]) || z[i]=='
6010: 20 27 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20   '); i++){}.    
6020: 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
6030: 20 63 67 69 5f 70 72 69 6e 74 66 28 22 25 2e 2a   cgi_printf("%.*
6040: 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 7d  s", i, z);.    }
6050: 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 69 73  .    for(j=i; is
6060: 73 70 61 63 65 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b  space(z[j]); j++
6070: 29 7b 7d 0a 20 20 20 20 69 66 28 20 6a 3e 69 20  ){}.    if( j>i 
6080: 29 7b 0a 20 20 20 20 20 20 63 67 69 5f 70 72 69  ){.      cgi_pri
6090: 6e 74 66 28 22 25 2a 73 22 2c 20 6a 2d 69 2c 20  ntf("%*s", j-i, 
60a0: 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  "");.    }.    z
60b0: 20 2b 3d 20 6a 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   += j;.  }.}../*
60c0: 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 72 6f 77  .** Output a row
60d0: 20 61 73 20 61 20 74 61 62 2d 73 65 70 61 72 61   as a tab-separa
60e0: 74 65 64 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  ted line of text
60f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6100: 6f 75 74 70 75 74 5f 74 61 62 5f 73 65 70 61 72  output_tab_separ
6110: 61 74 65 64 28 0a 20 20 76 6f 69 64 20 2a 70 55  ated(.  void *pU
6120: 73 65 72 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ser,     /* Poin
6130: 74 65 72 20 74 6f 20 72 6f 77 2d 63 6f 75 6e 74  ter to row-count
6140: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 69 6e   integer */.  in
6150: 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 2f  t nArg,        /
6160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
6170: 6d 6e 73 20 69 6e 20 74 68 69 73 20 72 65 73 75  mns in this resu
6180: 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 63 68 61 72  lt row */.  char
6190: 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 2f 2a 20   **azArg,    /* 
61a0: 54 65 78 74 20 6f 66 20 64 61 74 61 20 69 6e 20  Text of data in 
61b0: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  all columns */. 
61c0: 20 63 68 61 72 20 2a 2a 61 7a 4e 61 6d 65 20 20   char **azName  
61d0: 20 20 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 74 68    /* Names of th
61e0: 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 29 7b 0a  e columns */.){.
61f0: 20 20 69 6e 74 20 2a 70 43 6f 75 6e 74 20 3d 20    int *pCount = 
6200: 28 69 6e 74 2a 29 70 55 73 65 72 3b 0a 20 20 69  (int*)pUser;.  i
6210: 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 2a 70 43  nt i;..  if( *pC
6220: 6f 75 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ount==0 ){.    f
6230: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
6240: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6f 75 74 70  i++){.      outp
6250: 75 74 5f 6e 6f 5f 74 61 62 73 28 61 7a 4e 61 6d  ut_no_tabs(azNam
6260: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 67 69  e[i]);.      cgi
6270: 5f 70 72 69 6e 74 66 28 22 25 63 22 2c 20 69 3c  _printf("%c", i<
6280: 6e 41 72 67 2d 31 20 3f 20 27 5c 74 27 20 3a 20  nArg-1 ? '\t' : 
6290: 27 5c 6e 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  '\n');.    }.  }
62a0: 0a 20 20 2b 2b 2a 70 43 6f 75 6e 74 3b 0a 20 20  .  ++*pCount;.  
62b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
62c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 6f 75 74 70 75   i++){.    outpu
62d0: 74 5f 6e 6f 5f 74 61 62 73 28 61 7a 41 72 67 5b  t_no_tabs(azArg[
62e0: 69 5d 29 3b 0a 20 20 20 20 63 67 69 5f 70 72 69  i]);.    cgi_pri
62f0: 6e 74 66 28 22 25 63 22 2c 20 69 3c 6e 41 72 67  ntf("%c", i<nArg
6300: 2d 31 20 3f 20 27 5c 74 27 20 3a 20 27 5c 6e 27  -1 ? '\t' : '\n'
6310: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6320: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
6330: 72 61 74 65 20 48 54 4d 4c 20 74 68 61 74 20 64  rate HTML that d
6340: 65 73 63 72 69 62 65 73 20 61 20 63 6f 6c 6f 72  escribes a color
6350: 20 6b 65 79 2e 0a 2a 2f 0a 76 6f 69 64 20 6f 75   key..*/.void ou
6360: 74 70 75 74 5f 63 6f 6c 6f 72 5f 6b 65 79 28 63  tput_color_key(c
6370: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6c 72 4b  onst char *zClrK
6380: 65 79 2c 20 69 6e 74 20 68 6f 72 69 7a 2c 20 63  ey, int horiz, c
6390: 68 61 72 20 2a 7a 54 61 62 41 72 67 73 29 7b 0a  har *zTabArgs){.
63a0: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20    int i, j, k;. 
63b0: 20 63 68 61 72 20 2a 7a 53 61 66 65 4b 65 79 2c   char *zSafeKey,
63c0: 20 2a 7a 54 6f 46 72 65 65 3b 0a 20 20 77 68 69   *zToFree;.  whi
63d0: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a 43 6c  le( isspace(*zCl
63e0: 72 4b 65 79 29 20 29 20 7a 43 6c 72 4b 65 79 2b  rKey) ) zClrKey+
63f0: 2b 3b 0a 20 20 69 66 28 20 7a 43 6c 72 4b 65 79  +;.  if( zClrKey
6400: 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  [0]==0 ) return;
6410: 0a 20 20 40 20 3c 74 61 62 6c 65 20 25 73 28 7a  .  @ <table %s(z
6420: 54 61 62 41 72 67 73 29 3e 0a 20 20 69 66 28 20  TabArgs)>.  if( 
6430: 68 6f 72 69 7a 20 29 7b 0a 20 20 20 20 40 20 3c  horiz ){.    @ <
6440: 74 72 3e 0a 20 20 7d 0a 20 20 7a 54 6f 46 72 65  tr>.  }.  zToFre
6450: 65 20 3d 20 7a 53 61 66 65 4b 65 79 20 3d 20 6d  e = zSafeKey = m
6460: 70 72 69 6e 74 66 28 22 25 68 22 2c 20 7a 43 6c  printf("%h", zCl
6470: 72 4b 65 79 29 3b 0a 20 20 77 68 69 6c 65 28 20  rKey);.  while( 
6480: 7a 53 61 66 65 4b 65 79 5b 30 5d 20 29 7b 0a 20  zSafeKey[0] ){. 
6490: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
64a0: 65 28 2a 7a 53 61 66 65 4b 65 79 29 20 29 20 7a  e(*zSafeKey) ) z
64b0: 53 61 66 65 4b 65 79 2b 2b 3b 0a 20 20 20 20 66  SafeKey++;.    f
64c0: 6f 72 28 69 3d 30 3b 20 7a 53 61 66 65 4b 65 79  or(i=0; zSafeKey
64d0: 5b 69 5d 20 26 26 20 21 69 73 73 70 61 63 65 28  [i] && !isspace(
64e0: 7a 53 61 66 65 4b 65 79 5b 69 5d 29 3b 20 69 2b  zSafeKey[i]); i+
64f0: 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 69  +){}.    for(j=i
6500: 3b 20 69 73 73 70 61 63 65 28 7a 53 61 66 65 4b  ; isspace(zSafeK
6510: 65 79 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20  ey[j]); j++){}. 
6520: 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 7a 53 61 66     for(k=j; zSaf
6530: 65 4b 65 79 5b 6b 5d 20 26 26 20 7a 53 61 66 65  eKey[k] && zSafe
6540: 4b 65 79 5b 6b 5d 21 3d 27 5c 6e 27 20 26 26 20  Key[k]!='\n' && 
6550: 7a 53 61 66 65 4b 65 79 5b 6b 5d 21 3d 27 5c 72  zSafeKey[k]!='\r
6560: 27 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 69 66  '; k++){}.    if
6570: 28 20 21 68 6f 72 69 7a 20 29 7b 0a 20 20 20 20  ( !horiz ){.    
6580: 20 20 63 67 69 5f 70 72 69 6e 74 66 28 22 3c 74    cgi_printf("<t
6590: 72 20 62 67 63 6f 6c 6f 72 3d 5c 22 25 2e 2a 73  r bgcolor=\"%.*s
65a0: 5c 22 3e 3c 74 64 3e 25 2e 2a 73 3c 2f 74 64 3e  \"><td>%.*s</td>
65b0: 3c 2f 74 72 3e 5c 6e 22 2c 0a 20 20 20 20 20 20  </tr>\n",.      
65c0: 20 20 69 2c 20 7a 53 61 66 65 4b 65 79 2c 20 6b    i, zSafeKey, k
65d0: 2d 6a 2c 20 26 7a 53 61 66 65 4b 65 79 5b 6a 5d  -j, &zSafeKey[j]
65e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
65f0: 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66 28 22      cgi_printf("
6600: 3c 74 64 20 62 67 63 6f 6c 6f 72 3d 5c 22 25 2e  <td bgcolor=\"%.
6610: 2a 73 5c 22 3e 25 2e 2a 73 3c 2f 74 64 3e 5c 6e  *s\">%.*s</td>\n
6620: 22 2c 0a 20 20 20 20 20 20 20 20 69 2c 20 7a 53  ",.        i, zS
6630: 61 66 65 4b 65 79 2c 20 6b 2d 6a 2c 20 26 7a 53  afeKey, k-j, &zS
6640: 61 66 65 4b 65 79 5b 6a 5d 29 3b 0a 20 20 20 20  afeKey[j]);.    
6650: 7d 0a 20 20 20 20 7a 53 61 66 65 4b 65 79 20 2b  }.    zSafeKey +
6660: 3d 20 6b 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28  = k;.  }.  free(
6670: 7a 54 6f 46 72 65 65 29 3b 0a 20 20 69 66 28 20  zToFree);.  if( 
6680: 68 6f 72 69 7a 20 29 7b 0a 20 20 20 20 40 20 3c  horiz ){.    @ <
6690: 2f 74 72 3e 0a 20 20 7d 0a 20 20 40 20 3c 2f 74  /tr>.  }.  @ </t
66a0: 61 62 6c 65 3e 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  able>.}.../*.** 
66b0: 57 45 42 50 41 47 45 3a 20 2f 72 70 74 76 69 65  WEBPAGE: /rptvie
66c0: 77 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  w.**.** Generate
66d0: 20 61 20 72 65 70 6f 72 74 2e 20 20 54 68 65 20   a report.  The 
66e0: 72 6e 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  rn query paramet
66f0: 65 72 20 69 73 20 74 68 65 20 72 65 70 6f 72 74  er is the report
6700: 20 6e 75 6d 62 65 72 0a 2a 2a 20 63 6f 72 72 65   number.** corre
6710: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 52 45 50 4f  sponding to REPO
6720: 52 54 46 4d 54 2e 52 4e 2e 20 20 49 66 20 74 68  RTFMT.RN.  If th
6730: 65 20 74 61 62 6c 69 73 74 20 71 75 65 72 79 20  e tablist query 
6740: 70 61 72 61 6d 65 74 65 72 20 65 78 69 73 74 73  parameter exists
6750: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 75  ,.** then the ou
6760: 74 70 75 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  tput consists of
6770: 20 6c 69 6e 65 73 20 6f 66 20 74 61 62 2d 73 65   lines of tab-se
6780: 70 61 72 61 74 65 64 20 66 69 65 6c 64 73 20 69  parated fields i
6790: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 6e 20  nstead of.** an 
67a0: 48 54 4d 4c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  HTML table..*/.v
67b0: 6f 69 64 20 72 70 74 76 69 65 77 5f 70 61 67 65  oid rptview_page
67c0: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 63 6f  (void){.  int co
67d0: 75 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  unt = 0;.  int r
67e0: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  n;.  char *zSql;
67f0: 0a 20 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 3b  .  char *zTitle;
6800: 0a 20 20 63 68 61 72 20 2a 7a 4f 77 6e 65 72 3b  .  char *zOwner;
6810: 0a 20 20 63 68 61 72 20 2a 7a 43 6c 72 4b 65 79  .  char *zClrKey
6820: 3b 0a 20 20 69 6e 74 20 74 61 62 73 3b 0a 20 20  ;.  int tabs;.  
6830: 53 74 6d 74 20 71 3b 0a 0a 20 20 6c 6f 67 69 6e  Stmt q;..  login
6840: 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61  _check_credentia
6850: 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f  ls();.  if( !g.o
6860: 6b 52 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e  kRead ){ login_n
6870: 65 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b  eeded(); return;
6880: 20 7d 0a 20 20 72 6e 20 3d 20 61 74 6f 69 28 50   }.  rn = atoi(P
6890: 44 28 22 72 6e 22 2c 22 30 22 29 29 3b 0a 20 20  D("rn","0"));.  
68a0: 69 66 28 20 72 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( rn==0 ){.   
68b0: 20 63 67 69 5f 72 65 64 69 72 65 63 74 28 22 72   cgi_redirect("r
68c0: 65 70 6f 72 74 6c 69 73 74 22 29 3b 0a 20 20 20  eportlist");.   
68d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 74   return;.  }.  t
68e0: 61 62 73 20 3d 20 50 28 22 74 61 62 6c 69 73 74  abs = P("tablist
68f0: 22 29 21 3d 30 3b 0a 20 20 2f 2a 20 76 69 65 77  ")!=0;.  /* view
6900: 5f 61 64 64 5f 66 75 6e 63 74 69 6f 6e 73 28 74  _add_functions(t
6910: 61 62 73 29 3b 20 2a 2f 0a 20 20 64 62 5f 70 72  abs); */.  db_pr
6920: 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20 22 53  epare(&q,.    "S
6930: 45 4c 45 43 54 20 74 69 74 6c 65 2c 20 73 71 6c  ELECT title, sql
6940: 63 6f 64 65 2c 20 6f 77 6e 65 72 2c 20 63 6f 6c  code, owner, col
6950: 73 20 46 52 4f 4d 20 72 65 70 6f 72 74 66 6d 74  s FROM reportfmt
6960: 20 57 48 45 52 45 20 72 6e 3d 25 64 22 2c 20 72   WHERE rn=%d", r
6970: 6e 29 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65  n);.  if( db_ste
6980: 70 28 26 71 29 21 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)!=SQLITE_RO
6990: 57 20 29 7b 0a 20 20 20 20 63 67 69 5f 72 65 64  W ){.    cgi_red
69a0: 69 72 65 63 74 28 22 72 65 70 6f 72 74 6c 69 73  irect("reportlis
69b0: 74 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  t");.    return;
69c0: 0a 20 20 7d 0a 20 20 7a 54 69 74 6c 65 20 3d 20  .  }.  zTitle = 
69d0: 64 62 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c 6c 6f 63  db_column_malloc
69e0: 28 26 71 2c 20 30 29 3b 0a 20 20 7a 53 71 6c 20  (&q, 0);.  zSql 
69f0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c 6c  = db_column_mall
6a00: 6f 63 28 26 71 2c 20 31 29 3b 0a 20 20 7a 4f 77  oc(&q, 1);.  zOw
6a10: 6e 65 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ner = db_column_
6a20: 6d 61 6c 6c 6f 63 28 26 71 2c 20 32 29 3b 0a 20  malloc(&q, 2);. 
6a30: 20 7a 43 6c 72 4b 65 79 20 3d 20 64 62 5f 63 6f   zClrKey = db_co
6a40: 6c 75 6d 6e 5f 6d 61 6c 6c 6f 63 28 26 71 2c 20  lumn_malloc(&q, 
6a50: 33 29 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a  3);.  db_finaliz
6a60: 65 28 26 71 29 3b 0a 0a 20 20 69 66 28 20 50 28  e(&q);..  if( P(
6a70: 22 6f 72 64 65 72 5f 62 79 22 29 20 29 7b 0a 20  "order_by") ){. 
6a80: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
6a90: 74 68 65 20 75 73 65 72 20 77 61 6e 74 73 20 74  the user wants t
6aa0: 6f 20 64 6f 20 61 20 63 6f 6c 75 6d 6e 20 73 6f  o do a column so
6ab0: 72 74 2c 20 77 72 61 70 20 74 68 65 20 71 75 65  rt, wrap the que
6ac0: 72 79 20 69 6e 74 6f 20 61 20 73 75 62 0a 20 20  ry into a sub.  
6ad0: 20 20 2a 2a 20 71 75 65 72 79 20 61 6e 64 20 74    ** query and t
6ae0: 68 65 6e 20 73 6f 72 74 20 74 68 65 20 72 65 73  hen sort the res
6af0: 75 6c 74 73 2e 20 54 68 69 73 20 69 73 20 61 20  ults. This is a 
6b00: 77 68 6f 6c 65 20 6c 6f 74 20 65 61 73 69 65 72  whole lot easier
6b10: 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 72 79   than.    ** try
6b20: 69 6e 67 20 74 6f 20 69 6e 73 65 72 74 20 61 6e  ing to insert an
6b30: 20 4f 52 44 45 52 20 42 59 20 69 6e 74 6f 20 74   ORDER BY into t
6b40: 68 65 20 71 75 65 72 79 20 69 74 73 65 6c 66 2c  he query itself,
6b50: 20 65 73 70 65 63 69 61 6c 6c 79 0a 20 20 20 20   especially.    
6b60: 2a 2a 20 69 66 20 74 68 65 20 71 75 65 72 79 20  ** if the query 
6b70: 69 73 20 61 6c 72 65 61 64 79 20 6f 72 64 65 72  is already order
6b80: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
6b90: 6e 74 20 6e 46 69 65 6c 64 20 3d 20 61 74 6f 69  nt nField = atoi
6ba0: 28 50 28 22 6f 72 64 65 72 5f 62 79 22 29 29 3b  (P("order_by"));
6bb0: 0a 20 20 20 20 69 66 28 20 6e 46 69 65 6c 64 20  .    if( nField 
6bc0: 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  > 0 ){.      con
6bd0: 73 74 20 63 68 61 72 2a 20 7a 44 69 72 20 3d 20  st char* zDir = 
6be0: 50 44 28 22 6f 72 64 65 72 5f 64 69 72 22 2c 22  PD("order_dir","
6bf0: 22 29 3b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d  ");.      zDir =
6c00: 20 21 73 74 72 63 6d 70 28 22 41 53 43 22 2c 7a   !strcmp("ASC",z
6c10: 44 69 72 29 20 3f 20 22 41 53 43 22 20 3a 20 22  Dir) ? "ASC" : "
6c20: 44 45 53 43 22 3b 0a 20 20 20 20 20 20 7a 53 71  DESC";.      zSq
6c30: 6c 20 3d 20 6d 70 72 69 6e 74 66 28 22 53 45 4c  l = mprintf("SEL
6c40: 45 43 54 20 2a 20 46 52 4f 4d 20 28 25 73 29 20  ECT * FROM (%s) 
6c50: 4f 52 44 45 52 20 42 59 20 25 64 20 25 73 22 2c  ORDER BY %d %s",
6c60: 20 7a 53 71 6c 2c 20 6e 46 69 65 6c 64 2c 20 7a   zSql, nField, z
6c70: 44 69 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Dir);.    }.  }.
6c80: 0a 20 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  .  count = 0;.  
6c90: 69 66 28 20 21 74 61 62 73 20 29 7b 0a 20 20 20  if( !tabs ){.   
6ca0: 20 73 74 72 75 63 74 20 47 65 6e 65 72 61 74 65   struct Generate
6cb0: 48 54 4d 4c 20 73 53 74 61 74 65 3b 0a 0a 20 20  HTML sState;..  
6cc0: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
6cd0: 22 50 52 41 47 4d 41 20 65 6d 70 74 79 5f 72 65  "PRAGMA empty_re
6ce0: 73 75 6c 74 5f 63 61 6c 6c 62 61 63 6b 73 3d 4f  sult_callbacks=O
6cf0: 4e 22 29 3b 0a 20 20 20 20 73 74 79 6c 65 5f 73  N");.    style_s
6d00: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
6d10: 52 61 77 22 2c 20 22 52 61 77 22 2c 20 0a 20 20  Raw", "Raw", .  
6d20: 20 20 20 20 22 72 70 74 76 69 65 77 3f 74 61 62      "rptview?tab
6d30: 6c 69 73 74 3d 31 26 25 73 22 2c 20 50 44 28 22  list=1&%s", PD("
6d40: 51 55 45 52 59 5f 53 54 52 49 4e 47 22 2c 22 22  QUERY_STRING",""
6d50: 29 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b  ));.    if( g.ok
6d60: 41 64 6d 69 6e 20 0a 20 20 20 20 20 20 20 7c 7c  Admin .       ||
6d70: 20 28 67 2e 6f 6b 51 75 65 72 79 20 26 26 20 67   (g.okQuery && g
6d80: 2e 7a 4c 6f 67 69 6e 20 26 26 20 7a 4f 77 6e 65  .zLogin && zOwne
6d90: 72 20 26 26 20 73 74 72 63 6d 70 28 67 2e 7a 4c  r && strcmp(g.zL
6da0: 6f 67 69 6e 2c 7a 4f 77 6e 65 72 29 3d 3d 30 29  ogin,zOwner)==0)
6db0: 20 29 7b 0a 20 20 20 20 20 20 73 74 79 6c 65 5f   ){.      style_
6dc0: 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28  submenu_element(
6dd0: 22 45 64 69 74 22 2c 20 22 45 64 69 74 22 2c 20  "Edit", "Edit", 
6de0: 22 72 70 74 65 64 69 74 3f 72 6e 3d 25 64 22 2c  "rptedit?rn=%d",
6df0: 20 72 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   rn);.    }.    
6e00: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c  style_submenu_el
6e10: 65 6d 65 6e 74 28 22 53 51 4c 22 2c 20 22 53 51  ement("SQL", "SQ
6e20: 4c 22 2c 20 22 72 70 74 73 71 6c 3f 72 6e 3d 25  L", "rptsql?rn=%
6e30: 64 22 2c 72 6e 29 3b 0a 20 20 20 20 73 74 79 6c  d",rn);.    styl
6e40: 65 5f 68 65 61 64 65 72 28 7a 54 69 74 6c 65 29  e_header(zTitle)
6e50: 3b 0a 20 20 20 20 6f 75 74 70 75 74 5f 63 6f 6c  ;.    output_col
6e60: 6f 72 5f 6b 65 79 28 7a 43 6c 72 4b 65 79 2c 20  or_key(zClrKey, 
6e70: 31 2c 20 0a 20 20 20 20 20 20 20 20 22 62 6f 72  1, .        "bor
6e80: 64 65 72 3d 30 20 63 65 6c 6c 70 61 64 64 69 6e  der=0 cellpaddin
6e90: 67 3d 33 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d  g=3 cellspacing=
6ea0: 30 20 63 6c 61 73 73 3d 5c 22 72 65 70 6f 72 74  0 class=\"report
6eb0: 5c 22 22 29 3b 0a 20 20 20 20 40 20 3c 74 61 62  \"");.    @ <tab
6ec0: 6c 65 20 62 6f 72 64 65 72 3d 31 20 63 65 6c 6c  le border=1 cell
6ed0: 70 61 64 64 69 6e 67 3d 32 20 63 65 6c 6c 73 70  padding=2 cellsp
6ee0: 61 63 69 6e 67 3d 30 20 63 6c 61 73 73 3d 22 72  acing=0 class="r
6ef0: 65 70 6f 72 74 22 3e 0a 20 20 20 20 73 53 74 61  eport">.    sSta
6f00: 74 65 2e 72 6e 20 3d 20 72 6e 3b 0a 20 20 20 20  te.rn = rn;.    
6f10: 73 53 74 61 74 65 2e 6e 43 6f 75 6e 74 20 3d 20  sState.nCount = 
6f20: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  0;.    sqlite3_e
6f30: 78 65 63 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20  xec(g.db, zSql, 
6f40: 67 65 6e 65 72 61 74 65 5f 68 74 6d 6c 2c 20 26  generate_html, &
6f50: 73 53 74 61 74 65 2c 20 30 29 3b 0a 20 20 20 20  sState, 0);.    
6f60: 40 20 3c 2f 74 61 62 6c 65 3e 0a 20 20 20 20 73  @ </table>.    s
6f70: 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20  tyle_footer();. 
6f80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
6f90: 74 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 7a  te3_exec(g.db, z
6fa0: 53 71 6c 2c 20 6f 75 74 70 75 74 5f 74 61 62 5f  Sql, output_tab_
6fb0: 73 65 70 61 72 61 74 65 64 2c 20 26 63 6f 75 6e  separated, &coun
6fc0: 74 2c 20 30 29 3b 0a 20 20 20 20 63 67 69 5f 73  t, 0);.    cgi_s
6fd0: 65 74 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65 28  et_content_type(
6fe0: 22 74 65 78 74 2f 70 6c 61 69 6e 22 29 3b 0a 20  "text/plain");. 
6ff0: 20 7d 0a 7d 0a                                    }.}.