Hex Artifact Content
Not logged in

Artifact 54647a292b3188c4340932c082b35c0b7f7707fb:

File src/report.c part of check-in [c0211010a1] - Added doc for _wiki_ and removed doc for wiki(), tkt(), and chng() by btheado on 2009-12-13 01:31:36.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 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 74  o generate the t
03c0: 69 63 6b 65 74 20 6c 69 73 74 69 6e 67 73 0a 2a  icket listings.*
03d0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66  /.#include "conf
03e0: 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  ig.h".#include "
03f0: 72 65 70 6f 72 74 2e 68 22 0a 23 69 6e 63 6c 75  report.h".#inclu
0400: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f  de <assert.h>../
0410: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
0420: 6e 63 65 73 20 74 6f 20 73 74 61 74 69 63 20 72  nces to static r
0430: 6f 75 74 69 6e 65 73 20 2a 2f 0a 73 74 61 74 69  outines */.stati
0440: 63 20 76 6f 69 64 20 72 65 70 6f 72 74 5f 66 6f  c void report_fo
0450: 72 6d 61 74 5f 68 69 6e 74 73 28 76 6f 69 64 29  rmat_hints(void)
0460: 3b 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45  ;../*.** WEBPAGE
0470: 3a 20 2f 72 65 70 6f 72 74 6c 69 73 74 0a 2a 2f  : /reportlist.*/
0480: 0a 76 6f 69 64 20 76 69 65 77 5f 6c 69 73 74 28  .void view_list(
0490: 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 71 3b  void){.  Stmt q;
04a0: 0a 20 20 69 6e 74 20 72 6e 20 3d 20 30 3b 0a 20  .  int rn = 0;. 
04b0: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20   int cnt = 0;.. 
04c0: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65   login_check_cre
04d0: 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66  dentials();.  if
04e0: 28 20 21 67 2e 6f 6b 52 64 54 6b 74 20 26 26 20  ( !g.okRdTkt && 
04f0: 21 67 2e 6f 6b 4e 65 77 54 6b 74 20 29 7b 20 6c  !g.okNewTkt ){ l
0500: 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72  ogin_needed(); r
0510: 65 74 75 72 6e 3b 20 7d 0a 20 20 73 74 79 6c 65  eturn; }.  style
0520: 5f 68 65 61 64 65 72 28 22 54 69 63 6b 65 74 20  _header("Ticket 
0530: 4d 61 69 6e 20 4d 65 6e 75 22 29 3b 0a 20 20 69  Main Menu");.  i
0540: 66 28 20 67 2e 6f 6b 4e 65 77 54 6b 74 20 29 7b  f( g.okNewTkt ){
0550: 0a 20 20 20 20 40 20 3c 70 3e 45 6e 74 65 72 20  .    @ <p>Enter 
0560: 61 20 6e 65 77 20 74 69 63 6b 65 74 3a 3c 2f 70  a new ticket:</p
0570: 3e 0a 20 20 20 20 40 20 3c 6f 6c 3e 3c 6c 69 20  >.    @ <ol><li 
0580: 76 61 6c 75 65 3d 22 31 22 3e 3c 61 20 68 72 65  value="1"><a hre
0590: 66 3d 22 74 6b 74 6e 65 77 22 3e 4e 65 77 20 74  f="tktnew">New t
05a0: 69 63 6b 65 74 3c 2f 61 3e 3c 2f 6c 69 3e 3c 2f  icket</a></li></
05b0: 6f 6c 3e 0a 20 20 20 20 40 0a 20 20 20 20 63 6e  ol>.    @.    cn
05c0: 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  t++;.  }else if(
05d0: 20 64 62 5f 65 78 69 73 74 73 28 0a 20 20 20 20   db_exists(.    
05e0: 20 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d    "SELECT 1 FROM
05f0: 20 75 73 65 72 22 0a 20 20 20 20 20 20 22 20 57   user".      " W
0600: 48 45 52 45 20 6c 6f 67 69 6e 3d 27 61 6e 6f 6e  HERE login='anon
0610: 79 6d 6f 75 73 27 20 41 4e 44 20 63 61 70 20 47  ymous' AND cap G
0620: 4c 4f 42 20 27 2a 6e 2a 27 22 29 0a 20 20 29 7b  LOB '*n*'").  ){
0630: 0a 20 20 20 20 40 20 3c 70 3e 3c 61 20 68 72 65  .    @ <p><a hre
0640: 66 3d 22 6c 6f 67 69 6e 3f 61 6e 6f 6e 3d 31 26  f="login?anon=1&
0650: 67 3d 74 6b 74 6e 65 77 22 3e 4c 6f 67 69 6e 20  g=tktnew">Login 
0660: 61 73 20 22 61 6e 6f 6e 79 6d 6f 75 73 22 3c 2f  as "anonymous"</
0670: 61 3e 0a 20 20 20 20 40 20 74 6f 20 65 6e 74 65  a>.    @ to ente
0680: 72 20 61 20 6e 65 77 20 74 69 63 6b 65 74 2e 3c  r a new ticket.<
0690: 2f 70 3e 0a 20 20 7d 0a 20 20 69 66 28 20 21 67  /p>.  }.  if( !g
06a0: 2e 6f 6b 52 64 54 6b 74 20 29 7b 0a 20 20 20 20  .okRdTkt ){.    
06b0: 40 20 3c 70 3e 59 6f 75 20 61 72 65 20 6e 6f 74  @ <p>You are not
06c0: 20 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 76   authorized to v
06d0: 69 65 77 20 65 78 69 73 74 69 6e 67 20 74 69 63  iew existing tic
06e0: 6b 65 74 73 2e 3c 2f 70 3e 0a 20 20 7d 65 6c 73  kets.</p>.  }els
06f0: 65 7b 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72  e{.    db_prepar
0700: 65 28 26 71 2c 20 22 53 45 4c 45 43 54 20 72 6e  e(&q, "SELECT rn
0710: 2c 20 74 69 74 6c 65 2c 20 6f 77 6e 65 72 20 46  , title, owner F
0720: 52 4f 4d 20 72 65 70 6f 72 74 66 6d 74 20 4f 52  ROM reportfmt OR
0730: 44 45 52 20 42 59 20 74 69 74 6c 65 22 29 3b 0a  DER BY title");.
0740: 20 20 20 20 40 20 3c 70 3e 43 68 6f 6f 73 65 20      @ <p>Choose 
0750: 61 20 72 65 70 6f 72 74 20 66 6f 72 6d 61 74 20  a report format 
0760: 66 72 6f 6d 20 74 68 65 20 66 6f 6c 6c 6f 77 69  from the followi
0770: 6e 67 20 6c 69 73 74 3a 3c 2f 70 3e 0a 20 20 20  ng list:</p>.   
0780: 20 40 20 3c 6f 6c 3e 0a 20 20 20 20 77 68 69 6c   @ <ol>.    whil
0790: 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
07a0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
07b0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
07c0: 7a 54 69 74 6c 65 20 3d 20 64 62 5f 63 6f 6c 75  zTitle = db_colu
07d0: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a  mn_text(&q, 1);.
07e0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
07f0: 20 2a 7a 4f 77 6e 65 72 20 3d 20 64 62 5f 63 6f   *zOwner = db_co
0800: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32 29  lumn_text(&q, 2)
0810: 3b 0a 20 20 20 20 20 20 72 6e 20 3d 20 64 62 5f  ;.      rn = db_
0820: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 30  column_int(&q, 0
0830: 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  );.      cnt++;.
0840: 20 20 20 20 20 20 40 20 3c 6c 69 20 76 61 6c 75        @ <li valu
0850: 65 3d 22 25 64 28 63 6e 74 29 22 3e 3c 61 20 68  e="%d(cnt)"><a h
0860: 72 65 66 3d 22 72 70 74 76 69 65 77 3f 72 6e 3d  ref="rptview?rn=
0870: 25 64 28 72 6e 29 22 0a 20 20 20 20 20 20 40 20  %d(rn)".      @ 
0880: 20 20 20 20 20 20 20 72 65 6c 3d 22 6e 6f 66 6f         rel="nofo
0890: 6c 6c 6f 77 22 3e 25 68 28 7a 54 69 74 6c 65 29  llow">%h(zTitle)
08a0: 3c 2f 61 3e 26 6e 62 73 70 3b 26 6e 62 73 70 3b  </a>&nbsp;&nbsp;
08b0: 26 6e 62 73 70 3b 0a 20 20 20 20 20 20 69 66 28  &nbsp;.      if(
08c0: 20 67 2e 6f 6b 57 72 69 74 65 20 26 26 20 7a 4f   g.okWrite && zO
08d0: 77 6e 65 72 20 26 26 20 7a 4f 77 6e 65 72 5b 30  wner && zOwner[0
08e0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20 28  ] ){.        @ (
08f0: 62 79 20 3c 69 3e 25 68 28 7a 4f 77 6e 65 72 29  by <i>%h(zOwner)
0900: 3c 2f 69 3e 29 0a 20 20 20 20 20 20 7d 0a 20 20  </i>).      }.  
0910: 20 20 20 20 69 66 28 20 67 2e 6f 6b 54 6b 74 46      if( g.okTktF
0920: 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20  mt ){.        @ 
0930: 5b 3c 61 20 68 72 65 66 3d 22 72 70 74 65 64 69  [<a href="rptedi
0940: 74 3f 72 6e 3d 25 64 28 72 6e 29 26 61 6d 70 3b  t?rn=%d(rn)&amp;
0950: 63 6f 70 79 3d 31 22 20 72 65 6c 3d 22 6e 6f 66  copy=1" rel="nof
0960: 6f 6c 6c 6f 77 22 3e 63 6f 70 79 3c 2f 61 3e 5d  ollow">copy</a>]
0970: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
0980: 66 28 20 67 2e 6f 6b 41 64 6d 69 6e 20 7c 7c 20  f( g.okAdmin || 
0990: 28 67 2e 6f 6b 57 72 54 6b 74 20 26 26 20 7a 4f  (g.okWrTkt && zO
09a0: 77 6e 65 72 20 26 26 20 73 74 72 63 6d 70 28 67  wner && strcmp(g
09b0: 2e 7a 4c 6f 67 69 6e 2c 7a 4f 77 6e 65 72 29 3d  .zLogin,zOwner)=
09c0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 40  =0) ){.        @
09d0: 20 5b 3c 61 20 68 72 65 66 3d 22 72 70 74 65 64   [<a href="rpted
09e0: 69 74 3f 72 6e 3d 25 64 28 72 6e 29 22 20 72 65  it?rn=%d(rn)" re
09f0: 6c 3d 22 6e 6f 66 6f 6c 6c 6f 77 22 3e 65 64 69  l="nofollow">edi
0a00: 74 3c 2f 61 3e 5d 0a 20 20 20 20 20 20 7d 0a 20  t</a>].      }. 
0a10: 20 20 20 20 20 69 66 28 20 67 2e 6f 6b 54 6b 74       if( g.okTkt
0a20: 46 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 40  Fmt ){.        @
0a30: 20 5b 3c 61 20 68 72 65 66 3d 22 72 70 74 73 71   [<a href="rptsq
0a40: 6c 3f 72 6e 3d 25 64 28 72 6e 29 22 20 72 65 6c  l?rn=%d(rn)" rel
0a50: 3d 22 6e 6f 66 6f 6c 6c 6f 77 22 3e 73 71 6c 3c  ="nofollow">sql<
0a60: 2f 61 3e 5d 0a 20 20 20 20 20 20 7d 0a 20 20 20  /a>].      }.   
0a70: 20 20 20 40 20 3c 2f 6c 69 3e 0a 20 20 20 20 7d     @ </li>.    }
0a80: 0a 20 20 7d 0a 20 20 40 20 3c 2f 6f 6c 3e 0a 20  .  }.  @ </ol>. 
0a90: 20 69 66 28 20 67 2e 6f 6b 54 6b 74 46 6d 74 20   if( g.okTktFmt 
0aa0: 29 7b 0a 20 20 20 20 40 20 3c 70 3e 43 72 65 61  ){.    @ <p>Crea
0ab0: 74 65 20 61 20 6e 65 77 20 74 69 63 6b 65 74 20  te a new ticket 
0ac0: 64 69 73 70 6c 61 79 20 66 6f 72 6d 61 74 3a 3c  display format:<
0ad0: 2f 70 3e 0a 20 20 20 20 40 20 3c 6f 6c 3e 0a 20  /p>.    @ <ol>. 
0ae0: 20 20 20 40 20 3c 6c 69 20 76 61 6c 75 65 3d 22     @ <li value="
0af0: 25 64 28 63 6e 74 2b 31 29 22 3e 3c 61 20 68 72  %d(cnt+1)"><a hr
0b00: 65 66 3d 22 72 70 74 6e 65 77 22 3e 4e 65 77 20  ef="rptnew">New 
0b10: 72 65 70 6f 72 74 20 66 6f 72 6d 61 74 3c 2f 61  report format</a
0b20: 3e 3c 2f 6c 69 3e 0a 20 20 20 20 40 20 3c 2f 6f  ></li>.    @ </o
0b30: 6c 3e 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f 66  l>.  }.  style_f
0b40: 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ooter();.}../*.*
0b50: 2a 20 52 65 6d 6f 76 65 20 77 68 69 74 65 73 70  * Remove whitesp
0b60: 61 63 65 20 66 72 6f 6d 20 62 6f 74 68 20 65 6e  ace from both en
0b70: 64 73 20 6f 66 20 61 20 73 74 72 69 6e 67 2e 0a  ds of a string..
0b80: 2a 2f 0a 63 68 61 72 20 2a 74 72 69 6d 5f 73 74  */.char *trim_st
0b90: 72 69 6e 67 28 63 6f 6e 73 74 20 63 68 61 72 20  ring(const char 
0ba0: 2a 7a 4f 72 69 67 29 7b 0a 20 20 69 6e 74 20 69  *zOrig){.  int i
0bb0: 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 61  ;.  while( isspa
0bc0: 63 65 28 2a 7a 4f 72 69 67 29 20 29 7b 20 7a 4f  ce(*zOrig) ){ zO
0bd0: 72 69 67 2b 2b 3b 20 7d 0a 20 20 69 20 3d 20 73  rig++; }.  i = s
0be0: 74 72 6c 65 6e 28 7a 4f 72 69 67 29 3b 0a 20 20  trlen(zOrig);.  
0bf0: 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 69 73  while( i>0 && is
0c00: 73 70 61 63 65 28 7a 4f 72 69 67 5b 69 2d 31 5d  space(zOrig[i-1]
0c10: 29 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 72 65  ) ){ i--; }.  re
0c20: 74 75 72 6e 20 6d 70 72 69 6e 74 66 28 22 25 2e  turn mprintf("%.
0c30: 2a 73 22 2c 20 69 2c 20 7a 4f 72 69 67 29 3b 0a  *s", i, zOrig);.
0c40: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  }../*.** Extract
0c50: 20 61 20 6e 75 6d 65 72 69 63 20 28 69 6e 74 65   a numeric (inte
0c60: 67 65 72 29 20 76 61 6c 75 65 20 66 72 6f 6d 20  ger) value from 
0c70: 61 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 63 68 61  a string..*/.cha
0c80: 72 20 2a 65 78 74 72 61 63 74 5f 69 6e 74 65 67  r *extract_integ
0c90: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
0ca0: 4f 72 69 67 29 7b 0a 20 20 69 66 28 20 7a 4f 72  Orig){.  if( zOr
0cb0: 69 67 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 7a 4f  ig == NULL || zO
0cc0: 72 69 67 5b 30 5d 20 3d 3d 20 30 20 29 20 72 65  rig[0] == 0 ) re
0cd0: 74 75 72 6e 20 22 22 3b 0a 20 20 77 68 69 6c 65  turn "";.  while
0ce0: 28 20 2a 7a 4f 72 69 67 20 26 26 20 21 69 73 64  ( *zOrig && !isd
0cf0: 69 67 69 74 28 2a 7a 4f 72 69 67 29 20 29 7b 20  igit(*zOrig) ){ 
0d00: 7a 4f 72 69 67 2b 2b 3b 20 7d 0a 20 20 69 66 28  zOrig++; }.  if(
0d10: 20 2a 7a 4f 72 69 67 20 29 7b 0a 20 20 20 20 2f   *zOrig ){.    /
0d20: 2a 20 77 65 20 68 61 76 65 20 61 20 64 69 67 69  * we have a digi
0d30: 74 2e 20 61 74 6f 69 28 29 20 77 69 6c 6c 20 67  t. atoi() will g
0d40: 65 74 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  et as much of th
0d50: 65 20 6e 75 6d 62 65 72 20 61 73 20 69 74 0a 20  e number as it. 
0d60: 20 20 20 2a 2a 20 63 61 6e 2e 20 57 65 27 6c 6c     ** can. We'll
0d70: 20 72 75 6e 20 69 74 20 74 68 72 6f 75 67 68 20   run it through 
0d80: 6d 70 72 69 6e 74 66 28 29 20 74 6f 20 67 65 74  mprintf() to get
0d90: 20 61 20 73 74 72 69 6e 67 2e 20 4e 6f 74 0a 20   a string. Not. 
0da0: 20 20 20 2a 2a 20 61 6e 20 65 66 66 69 63 69 65     ** an efficie
0db0: 6e 74 20 77 61 79 20 74 6f 20 64 6f 20 69 74 2c  nt way to do it,
0dc0: 20 62 75 74 20 65 66 66 65 63 74 69 76 65 2e 0a   but effective..
0dd0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
0de0: 6e 20 6d 70 72 69 6e 74 66 28 22 25 64 22 2c 20  n mprintf("%d", 
0df0: 61 74 6f 69 28 7a 4f 72 69 67 29 29 3b 0a 20 20  atoi(zOrig));.  
0e00: 7d 0a 20 20 72 65 74 75 72 6e 20 22 22 3b 0a 7d  }.  return "";.}
0e10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 62  ../*.** Remove b
0e20: 6c 61 6e 6b 20 6c 69 6e 65 73 20 66 72 6f 6d 20  lank lines from 
0e30: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
0e40: 20 61 20 73 74 72 69 6e 67 20 61 6e 64 0a 2a 2a   a string and.**
0e50: 20 61 6c 6c 20 77 68 69 74 65 73 70 61 63 65 20   all whitespace 
0e60: 66 72 6f 6d 20 74 68 65 20 65 6e 64 2e 20 52 65  from the end. Re
0e70: 6d 6f 76 65 73 20 77 68 69 74 65 73 70 61 63 65  moves whitespace
0e80: 20 70 72 65 63 65 65 64 69 6e 67 20 61 20 4e 4c   preceeding a NL
0e90: 2c 0a 2a 2a 20 77 68 69 63 68 20 61 6c 73 6f 20  ,.** which also 
0ea0: 63 6f 6e 76 65 72 74 73 20 61 6e 79 20 43 52 4e  converts any CRN
0eb0: 4c 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20  L sequence into 
0ec0: 61 20 73 69 6e 67 6c 65 20 4e 4c 2e 0a 2a 2f 0a  a single NL..*/.
0ed0: 63 68 61 72 20 2a 72 65 6d 6f 76 65 5f 62 6c 61  char *remove_bla
0ee0: 6e 6b 5f 6c 69 6e 65 73 28 63 6f 6e 73 74 20 63  nk_lines(const c
0ef0: 68 61 72 20 2a 7a 4f 72 69 67 29 7b 0a 20 20 69  har *zOrig){.  i
0f00: 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 63 68  nt i, j, n;.  ch
0f10: 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 69 3d 6a  ar *z;.  for(i=j
0f20: 3d 30 3b 20 69 73 73 70 61 63 65 28 7a 4f 72 69  =0; isspace(zOri
0f30: 67 5b 69 5d 29 3b 20 69 2b 2b 29 7b 20 69 66 28  g[i]); i++){ if(
0f40: 20 7a 4f 72 69 67 5b 69 5d 3d 3d 27 5c 6e 27 20   zOrig[i]=='\n' 
0f50: 29 20 6a 20 3d 20 69 2b 31 3b 20 7d 0a 20 20 6e  ) j = i+1; }.  n
0f60: 20 3d 20 73 74 72 6c 65 6e 28 26 7a 4f 72 69 67   = strlen(&zOrig
0f70: 5b 6a 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  [j]);.  while( n
0f80: 3e 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 4f  >0 && isspace(zO
0f90: 72 69 67 5b 6a 2b 6e 2d 31 5d 29 20 29 7b 20 6e  rig[j+n-1]) ){ n
0fa0: 2d 2d 3b 20 7d 0a 20 20 7a 20 3d 20 6d 70 72 69  --; }.  z = mpri
0fb0: 6e 74 66 28 22 25 2e 2a 73 22 2c 20 6e 2c 20 26  ntf("%.*s", n, &
0fc0: 7a 4f 72 69 67 5b 6a 5d 29 3b 0a 20 20 66 6f 72  zOrig[j]);.  for
0fd0: 28 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  (i=j=0; z[i]; i+
0fe0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 2b  +){.    if( z[i+
0ff0: 31 5d 3d 3d 27 5c 6e 27 20 26 26 20 7a 5b 69 5d  1]=='\n' && z[i]
1000: 21 3d 27 5c 6e 27 20 26 26 20 69 73 73 70 61 63  !='\n' && isspac
1010: 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  e(z[i]) ){.     
1020: 20 7a 5b 6a 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20   z[j] = z[i];.  
1030: 20 20 20 20 77 68 69 6c 65 28 69 73 73 70 61 63      while(isspac
1040: 65 28 7a 5b 6a 5d 29 20 26 26 20 7a 5b 6a 5d 20  e(z[j]) && z[j] 
1050: 21 3d 20 27 5c 6e 27 20 29 7b 20 6a 2d 2d 3b 20  != '\n' ){ j--; 
1060: 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  }.      j++;.   
1070: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1080: 20 7d 0a 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d   }..    z[j++] =
1090: 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a   z[i];.  }.  z[j
10a0: 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
10b0: 7a 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  z;.}.../********
10c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
1100: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
1110: 65 20 53 51 4c 69 74 65 20 61 75 74 68 6f 72 69  e SQLite authori
1120: 7a 65 72 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  zer callback use
1130: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
1140: 68 61 74 20 74 68 65 0a 2a 2a 20 53 51 4c 20 73  hat the.** SQL s
1150: 74 61 74 65 6d 65 6e 74 73 20 65 6e 74 65 72 65  tatements entere
1160: 64 20 62 79 20 75 73 65 72 73 20 64 6f 20 6e 6f  d by users do no
1170: 74 20 74 72 79 20 74 6f 20 64 6f 20 61 6e 79 74  t try to do anyt
1180: 68 69 6e 67 20 75 6e 74 6f 77 61 72 64 2e 0a 2a  hing untoward..*
1190: 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 73 75  * If anything su
11a0: 73 70 69 63 69 6f 75 73 20 69 73 20 74 72 69 65  spicious is trie
11b0: 64 2c 20 73 65 74 20 2a 28 63 68 61 72 2a 2a 29  d, set *(char**)
11c0: 70 45 72 72 6f 72 20 74 6f 20 61 6e 20 65 72 72  pError to an err
11d0: 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 62  or.** message ob
11e0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
11f0: 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  oc..*/.static in
1200: 74 20 72 65 70 6f 72 74 5f 71 75 65 72 79 5f 61  t report_query_a
1210: 75 74 68 6f 72 69 7a 65 72 28 0a 20 20 76 6f 69  uthorizer(.  voi
1220: 64 20 2a 70 45 72 72 6f 72 2c 0a 20 20 69 6e 74  d *pError,.  int
1230: 20 63 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63   code,.  const c
1240: 68 61 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f  har *zArg1,.  co
1250: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c  nst char *zArg2,
1260: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1270: 41 72 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Arg3,.  const ch
1280: 61 72 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 69  ar *zArg4.){.  i
1290: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12a0: 4b 3b 0a 20 20 69 66 28 20 2a 28 63 68 61 72 2a  K;.  if( *(char*
12b0: 2a 29 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  *)pError ){.    
12c0: 2f 2a 20 57 65 27 76 65 20 61 6c 72 65 61 64 79  /* We've already
12d0: 20 73 65 65 6e 20 61 6e 20 65 72 72 6f 72 2e 20   seen an error. 
12e0: 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 6f 6e 74   No need to cont
12f0: 69 6e 75 65 2e 20 2a 2f 0a 20 20 20 20 72 65 74  inue. */.    ret
1300: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1310: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 63 6f 64   }.  switch( cod
1320: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  e ){.    case SQ
1330: 4c 49 54 45 5f 53 45 4c 45 43 54 3a 0a 20 20 20  LITE_SELECT:.   
1340: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4e   case SQLITE_FUN
1350: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 62  CTION: {.      b
1360: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1370: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
1380: 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  : {.      static
1390: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41   const char *azA
13a0: 6c 6c 6f 77 65 64 5b 5d 20 3d 20 7b 0a 20 20 20  llowed[] = {.   
13b0: 20 20 20 20 20 20 22 74 69 63 6b 65 74 22 2c 0a        "ticket",.
13c0: 20 20 20 20 20 20 20 20 20 22 62 6c 6f 62 22 2c           "blob",
13d0: 0a 20 20 20 20 20 20 20 20 20 22 66 69 6c 65 6e  .         "filen
13e0: 61 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 20 22  ame",.         "
13f0: 6d 6c 69 6e 6b 22 2c 0a 20 20 20 20 20 20 20 20  mlink",.        
1400: 20 22 70 6c 69 6e 6b 22 2c 0a 20 20 20 20 20 20   "plink",.      
1410: 20 20 20 22 65 76 65 6e 74 22 2c 0a 20 20 20 20     "event",.    
1420: 20 20 20 20 20 22 74 61 67 22 2c 0a 20 20 20 20       "tag",.    
1430: 20 20 20 20 20 22 74 61 67 78 72 65 66 22 2c 0a       "tagxref",.
1440: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
1450: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
1460: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
1470: 41 6c 6c 6f 77 65 64 29 2f 73 69 7a 65 6f 66 28  Allowed)/sizeof(
1480: 61 7a 41 6c 6c 6f 77 65 64 5b 30 5d 29 3b 20 69  azAllowed[0]); i
1490: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
14a0: 20 73 74 72 63 61 73 65 63 6d 70 28 7a 41 72 67   strcasecmp(zArg
14b0: 31 2c 20 61 7a 41 6c 6c 6f 77 65 64 5b 69 5d 29  1, azAllowed[i])
14c0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
14d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
14e0: 3e 3d 73 69 7a 65 6f 66 28 61 7a 41 6c 6c 6f 77  >=sizeof(azAllow
14f0: 65 64 29 2f 73 69 7a 65 6f 66 28 61 7a 41 6c 6c  ed)/sizeof(azAll
1500: 6f 77 65 64 5b 30 5d 29 20 29 7b 0a 20 20 20 20  owed[0]) ){.    
1510: 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 45 72      *(char**)pEr
1520: 72 6f 72 20 3d 20 6d 70 72 69 6e 74 66 28 22 61  ror = mprintf("a
1530: 63 63 65 73 73 20 74 6f 20 74 61 62 6c 65 20 5c  ccess to table \
1540: 22 25 73 5c 22 20 69 73 20 72 65 73 74 72 69 63  "%s\" is restric
1550: 74 65 64 22 2c 7a 41 72 67 31 29 3b 0a 20 20 20  ted",zArg1);.   
1560: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1570: 5f 44 45 4e 59 3b 0a 20 20 20 20 20 20 7d 65 6c  _DENY;.      }el
1580: 73 65 20 69 66 28 20 21 67 2e 6f 6b 52 64 41 64  se if( !g.okRdAd
1590: 64 72 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 41  dr && strncmp(zA
15a0: 72 67 32 2c 20 22 70 72 69 76 61 74 65 5f 22 2c  rg2, "private_",
15b0: 20 38 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   8)==0 ){.      
15c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 47    rc = SQLITE_IG
15d0: 4e 4f 52 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NORE;.      }.  
15e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15f0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
1600: 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
1610: 45 72 72 6f 72 20 3d 20 6d 70 72 69 6e 74 66 28  Error = mprintf(
1620: 22 6f 6e 6c 79 20 53 45 4c 45 43 54 20 73 74 61  "only SELECT sta
1630: 74 65 6d 65 6e 74 73 20 61 72 65 20 61 6c 6c 6f  tements are allo
1640: 77 65 64 22 29 3b 0a 20 20 20 20 20 20 72 63 20  wed");.      rc 
1650: 3d 20 53 51 4c 49 54 45 5f 44 45 4e 59 3b 0a 20  = SQLITE_DENY;. 
1660: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1670: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1680: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  c;.}.../*.** Che
1690: 63 6b 20 74 68 65 20 67 69 76 65 6e 20 53 51 4c  ck the given SQL
16a0: 20 74 6f 20 73 65 65 20 69 66 20 69 73 20 61 20   to see if is a 
16b0: 76 61 6c 69 64 20 71 75 65 72 79 20 74 68 61 74  valid query that
16c0: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 74 74   does not.** att
16d0: 65 6d 70 74 20 74 6f 20 64 6f 20 61 6e 79 74 68  empt to do anyth
16e0: 69 6e 67 20 64 61 6e 67 65 72 6f 75 73 2e 20 20  ing dangerous.  
16f0: 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63  Return 0 on succ
1700: 65 73 73 20 61 6e 64 20 61 0a 2a 2a 20 70 6f 69  ess and a.** poi
1710: 6e 74 65 72 20 74 6f 20 61 6e 20 65 72 72 6f 72  nter to an error
1720: 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20   message string 
1730: 28 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d  (obtained from m
1740: 61 6c 6c 6f 63 29 20 69 66 0a 2a 2a 20 74 68 65  alloc) if.** the
1750: 72 65 20 69 73 20 61 20 70 72 6f 62 6c 65 6d 2e  re is a problem.
1760: 0a 2a 2f 0a 63 68 61 72 20 2a 76 65 72 69 66 79  .*/.char *verify
1770: 5f 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 28 63  _sql_statement(c
1780: 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e  har *zSql){.  in
1790: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  t i;.  char *zEr
17a0: 72 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  r = 0;.  const c
17b0: 68 61 72 20 2a 7a 54 61 69 6c 3b 0a 20 20 73 71  har *zTail;.  sq
17c0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
17d0: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
17e0: 2f 2a 20 46 69 72 73 74 20 6d 61 6b 65 20 73 75  /* First make su
17f0: 72 65 20 74 68 65 20 53 51 4c 20 69 73 20 61 20  re the SQL is a 
1800: 73 69 6e 67 6c 65 20 71 75 65 72 79 20 63 6f 6d  single query com
1810: 6d 61 6e 64 20 62 79 20 76 65 72 69 66 79 69 6e  mand by verifyin
1820: 67 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  g that.  ** the 
1830: 66 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 22  first token is "
1840: 53 45 4c 45 43 54 22 20 61 6e 64 20 74 68 61 74  SELECT" and that
1850: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 75 6e   there are no un
1860: 71 75 6f 74 65 64 20 73 65 6d 69 63 6f 6c 6f 6e  quoted semicolon
1870: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
1880: 30 3b 20 69 73 73 70 61 63 65 28 7a 53 71 6c 5b  0; isspace(zSql[
1890: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66  i]); i++){}.  if
18a0: 28 20 73 74 72 6e 63 61 73 65 63 6d 70 28 26 7a  ( strncasecmp(&z
18b0: 53 71 6c 5b 69 5d 2c 22 73 65 6c 65 63 74 22 2c  Sql[i],"select",
18c0: 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  6)!=0 ){.    ret
18d0: 75 72 6e 20 6d 70 72 69 6e 74 66 28 22 54 68 65  urn mprintf("The
18e0: 20 53 51 4c 20 6d 75 73 74 20 62 65 20 61 20 53   SQL must be a S
18f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 22  ELECT statement"
1900: 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1910: 3b 20 7a 53 71 6c 5b 69 5d 3b 20 69 2b 2b 29 7b  ; zSql[i]; i++){
1920: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 5b 69 5d  .    if( zSql[i]
1930: 3d 3d 27 3b 27 20 29 7b 0a 20 20 20 20 20 20 69  ==';' ){.      i
1940: 6e 74 20 62 61 64 3b 0a 20 20 20 20 20 20 69 6e  nt bad;.      in
1950: 74 20 63 20 3d 20 7a 53 71 6c 5b 69 2b 31 5d 3b  t c = zSql[i+1];
1960: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 69 2b 31 5d  .      zSql[i+1]
1970: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 61 64 20   = 0;.      bad 
1980: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  = sqlite3_comple
1990: 74 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  te(zSql);.      
19a0: 7a 53 71 6c 5b 69 2b 31 5d 20 3d 20 63 3b 0a 20  zSql[i+1] = c;. 
19b0: 20 20 20 20 20 69 66 28 20 62 61 64 20 29 7b 0a       if( bad ){.
19c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6d          /* A com
19d0: 70 6c 65 74 65 20 73 74 61 74 65 6d 65 6e 74 20  plete statement 
19e0: 62 61 73 69 63 61 6c 6c 79 20 6d 65 61 6e 73 20  basically means 
19f0: 74 68 61 74 20 61 6e 20 75 6e 71 75 6f 74 65 64  that an unquoted
1a00: 20 73 65 6d 69 2d 63 6f 6c 6f 6e 0a 20 20 20 20   semi-colon.    
1a10: 20 20 20 20 2a 2a 20 77 61 73 20 66 6f 75 6e 64      ** was found
1a20: 2e 20 57 65 20 64 6f 6e 27 74 20 61 63 74 75 61  . We don't actua
1a30: 6c 6c 79 20 63 68 65 63 6b 20 77 68 61 74 27 73  lly check what's
1a40: 20 61 66 74 65 72 20 74 68 61 74 2e 0a 20 20 20   after that..   
1a50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1a60: 72 65 74 75 72 6e 20 6d 70 72 69 6e 74 66 28 22  return mprintf("
1a70: 53 65 6d 69 2d 63 6f 6c 6f 6e 20 64 65 74 65 63  Semi-colon detec
1a80: 74 65 64 21 20 22 0a 20 20 20 20 20 20 20 20 20  ted! ".         
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f                "O
1aa0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  nly a single SQL
1ab0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 6c   statement is al
1ac0: 6c 6f 77 65 64 22 29 3b 0a 20 20 20 20 20 20 7d  lowed");.      }
1ad0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
1ae0: 2f 2a 20 43 6f 6d 70 69 6c 65 20 74 68 65 20 73  /* Compile the s
1af0: 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 63 68 65  tatement and che
1b00: 63 6b 20 66 6f 72 20 69 6c 6c 65 67 61 6c 20 61  ck for illegal a
1b10: 63 63 65 73 73 65 73 20 6f 72 20 73 79 6e 74 61  ccesses or synta
1b20: 78 20 65 72 72 6f 72 73 2e 20 2a 2f 0a 20 20 73  x errors. */.  s
1b30: 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
1b40: 72 69 7a 65 72 28 67 2e 64 62 2c 20 72 65 70 6f  rizer(g.db, repo
1b50: 72 74 5f 71 75 65 72 79 5f 61 75 74 68 6f 72 69  rt_query_authori
1b60: 7a 65 72 2c 20 28 76 6f 69 64 2a 29 26 7a 45 72  zer, (void*)&zEr
1b70: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
1b80: 65 33 5f 70 72 65 70 61 72 65 28 67 2e 64 62 2c  e3_prepare(g.db,
1b90: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
1ba0: 74 2c 20 26 7a 54 61 69 6c 29 3b 0a 20 20 69 66  t, &zTail);.  if
1bb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bc0: 29 7b 0a 20 20 20 20 7a 45 72 72 20 3d 20 6d 70  ){.    zErr = mp
1bd0: 72 69 6e 74 66 28 22 53 79 6e 74 61 78 20 65 72  rintf("Syntax er
1be0: 72 6f 72 3a 20 25 73 22 2c 20 73 71 6c 69 74 65  ror: %s", sqlite
1bf0: 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 29 3b  3_errmsg(g.db));
1c00: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 74 6d 74  .  }.  if( pStmt
1c10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1c20: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
1c30: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
1c40: 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 67 2e  et_authorizer(g.
1c50: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74  db, 0, 0);.  ret
1c60: 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zErr;.}../*.
1c70: 2a 2a 20 57 45 42 50 41 47 45 3a 20 2f 72 70 74  ** WEBPAGE: /rpt
1c80: 73 71 6c 0a 2a 2f 0a 76 6f 69 64 20 76 69 65 77  sql.*/.void view
1c90: 5f 73 65 65 5f 73 71 6c 28 76 6f 69 64 29 7b 0a  _see_sql(void){.
1ca0: 20 20 69 6e 74 20 72 6e 3b 0a 20 20 63 6f 6e 73    int rn;.  cons
1cb0: 74 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 3b 0a  t char *zTitle;.
1cc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1cd0: 51 4c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  QL;.  const char
1ce0: 20 2a 7a 4f 77 6e 65 72 3b 0a 20 20 63 6f 6e 73   *zOwner;.  cons
1cf0: 74 20 63 68 61 72 20 2a 7a 43 6c 72 4b 65 79 3b  t char *zClrKey;
1d00: 0a 20 20 53 74 6d 74 20 71 3b 0a 0a 20 20 6c 6f  .  Stmt q;..  lo
1d10: 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e  gin_check_creden
1d20: 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21  tials();.  if( !
1d30: 67 2e 6f 6b 54 6b 74 46 6d 74 20 29 7b 0a 20 20  g.okTktFmt ){.  
1d40: 20 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29    login_needed()
1d50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1d60: 7d 0a 20 20 72 6e 20 3d 20 61 74 6f 69 28 50 44  }.  rn = atoi(PD
1d70: 28 22 72 6e 22 2c 22 30 22 29 29 3b 0a 20 20 64  ("rn","0"));.  d
1d80: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22 53  b_prepare(&q, "S
1d90: 45 4c 45 43 54 20 74 69 74 6c 65 2c 20 73 71 6c  ELECT title, sql
1da0: 63 6f 64 65 2c 20 6f 77 6e 65 72 2c 20 63 6f 6c  code, owner, col
1db0: 73 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  s ".            
1dc0: 20 20 20 20 20 20 20 22 46 52 4f 4d 20 72 65 70         "FROM rep
1dd0: 6f 72 74 66 6d 74 20 57 48 45 52 45 20 72 6e 3d  ortfmt WHERE rn=
1de0: 25 64 22 2c 72 6e 29 3b 0a 20 20 73 74 79 6c 65  %d",rn);.  style
1df0: 5f 68 65 61 64 65 72 28 22 53 51 4c 20 46 6f 72  _header("SQL For
1e00: 20 52 65 70 6f 72 74 20 46 6f 72 6d 61 74 20 4e   Report Format N
1e10: 75 6d 62 65 72 20 25 64 22 2c 20 72 6e 29 3b 0a  umber %d", rn);.
1e20: 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 71    if( db_step(&q
1e30: 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )!=SQLITE_ROW ){
1e40: 0a 20 20 20 20 40 20 3c 70 3e 55 6e 6b 6e 6f 77  .    @ <p>Unknow
1e50: 6e 20 72 65 70 6f 72 74 20 6e 75 6d 62 65 72 3a  n report number:
1e60: 20 25 64 28 72 6e 29 3c 2f 70 3e 0a 20 20 20 20   %d(rn)</p>.    
1e70: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
1e80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1e90: 20 20 7a 54 69 74 6c 65 20 3d 20 64 62 5f 63 6f    zTitle = db_co
1ea0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29  lumn_text(&q, 0)
1eb0: 3b 0a 20 20 7a 53 51 4c 20 3d 20 64 62 5f 63 6f  ;.  zSQL = db_co
1ec0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29  lumn_text(&q, 1)
1ed0: 3b 0a 20 20 7a 4f 77 6e 65 72 20 3d 20 64 62 5f  ;.  zOwner = db_
1ee0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
1ef0: 32 29 3b 0a 20 20 7a 43 6c 72 4b 65 79 20 3d 20  2);.  zClrKey = 
1f00: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
1f10: 71 2c 20 33 29 3b 0a 20 20 40 20 3c 74 61 62 6c  q, 3);.  @ <tabl
1f20: 65 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d 30 20  e cellpadding=0 
1f30: 63 65 6c 6c 73 70 61 63 69 6e 67 3d 30 20 62 6f  cellspacing=0 bo
1f40: 72 64 65 72 3d 30 3e 0a 20 20 40 20 3c 74 72 3e  rder=0>.  @ <tr>
1f50: 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22  <td valign="top"
1f60: 20 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 3e 54   align="right">T
1f70: 69 74 6c 65 3a 3c 2f 74 64 3e 3c 74 64 20 77 69  itle:</td><td wi
1f80: 64 74 68 3d 31 35 3e 3c 2f 74 64 3e 0a 20 20 40  dth=15></td>.  @
1f90: 20 3c 74 64 20 63 6f 6c 73 70 61 6e 3d 33 3e 25   <td colspan=3>%
1fa0: 68 28 7a 54 69 74 6c 65 29 3c 2f 74 64 3e 3c 2f  h(zTitle)</td></
1fb0: 74 72 3e 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20  tr>.  @ <tr><td 
1fc0: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 20 61 6c 69  valign="top" ali
1fd0: 67 6e 3d 22 72 69 67 68 74 22 3e 4f 77 6e 65 72  gn="right">Owner
1fe0: 3a 3c 2f 74 64 3e 3c 74 64 3e 3c 2f 74 64 3e 0a  :</td><td></td>.
1ff0: 20 20 40 20 3c 74 64 20 63 6f 6c 73 70 61 6e 3d    @ <td colspan=
2000: 33 3e 25 68 28 7a 4f 77 6e 65 72 29 3c 2f 74 64  3>%h(zOwner)</td
2010: 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72 3e 3c  ></tr>.  @ <tr><
2020: 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 20  td valign="top" 
2030: 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 3e 53 51  align="right">SQ
2040: 4c 3a 3c 2f 74 64 3e 3c 74 64 3e 3c 2f 74 64 3e  L:</td><td></td>
2050: 0a 20 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d  .  @ <td valign=
2060: 22 74 6f 70 22 3e 3c 70 72 65 3e 0a 20 20 40 20  "top"><pre>.  @ 
2070: 25 68 28 7a 53 51 4c 29 0a 20 20 40 20 3c 2f 70  %h(zSQL).  @ </p
2080: 72 65 3e 3c 2f 74 64 3e 0a 20 20 40 20 3c 74 64  re></td>.  @ <td
2090: 20 77 69 64 74 68 3d 31 35 3e 3c 2f 74 64 3e 3c   width=15></td><
20a0: 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e  td valign="top">
20b0: 0a 20 20 6f 75 74 70 75 74 5f 63 6f 6c 6f 72 5f  .  output_color_
20c0: 6b 65 79 28 7a 43 6c 72 4b 65 79 2c 20 30 2c 20  key(zClrKey, 0, 
20d0: 22 62 6f 72 64 65 72 3d 30 20 63 65 6c 6c 73 70  "border=0 cellsp
20e0: 61 63 69 6e 67 3d 30 20 63 65 6c 6c 70 61 64 64  acing=0 cellpadd
20f0: 69 6e 67 3d 33 22 29 3b 0a 20 20 40 20 3c 2f 74  ing=3");.  @ </t
2100: 64 3e 0a 20 20 40 20 3c 2f 74 72 3e 3c 2f 74 61  d>.  @ </tr></ta
2110: 62 6c 65 3e 0a 20 20 72 65 70 6f 72 74 5f 66 6f  ble>.  report_fo
2120: 72 6d 61 74 5f 68 69 6e 74 73 28 29 3b 0a 20 20  rmat_hints();.  
2130: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
2140: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45  }../*.** WEBPAGE
2150: 3a 20 2f 72 70 74 6e 65 77 0a 2a 2a 20 57 45 42  : /rptnew.** WEB
2160: 50 41 47 45 3a 20 2f 72 70 74 65 64 69 74 0a 2a  PAGE: /rptedit.*
2170: 2f 0a 76 6f 69 64 20 76 69 65 77 5f 65 64 69 74  /.void view_edit
2180: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72 6e  (void){.  int rn
2190: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
21a0: 7a 54 69 74 6c 65 3b 0a 20 20 63 6f 6e 73 74 20  zTitle;.  const 
21b0: 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74  char *z;.  const
21c0: 20 63 68 61 72 20 2a 7a 4f 77 6e 65 72 3b 0a 20   char *zOwner;. 
21d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6c   const char *zCl
21e0: 72 4b 65 79 3b 0a 20 20 63 68 61 72 20 2a 7a 53  rKey;.  char *zS
21f0: 51 4c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  QL;.  char *zErr
2200: 20 3d 20 30 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63   = 0;..  login_c
2210: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
2220: 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 54  ();.  if( !g.okT
2230: 6b 74 46 6d 74 20 29 7b 0a 20 20 20 20 6c 6f 67  ktFmt ){.    log
2240: 69 6e 5f 6e 65 65 64 65 64 28 29 3b 0a 20 20 20  in_needed();.   
2250: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2f   return;.  }.  /
2260: 2a 76 69 65 77 5f 61 64 64 5f 66 75 6e 63 74 69  *view_add_functi
2270: 6f 6e 73 28 30 29 3b 2a 2f 0a 20 20 72 6e 20 3d  ons(0);*/.  rn =
2280: 20 61 74 6f 69 28 50 44 28 22 72 6e 22 2c 22 30   atoi(PD("rn","0
2290: 22 29 29 3b 0a 20 20 7a 54 69 74 6c 65 20 3d 20  "));.  zTitle = 
22a0: 50 28 22 74 22 29 3b 0a 20 20 7a 4f 77 6e 65 72  P("t");.  zOwner
22b0: 20 3d 20 50 44 28 22 77 22 2c 67 2e 7a 4c 6f 67   = PD("w",g.zLog
22c0: 69 6e 29 3b 0a 20 20 7a 20 3d 20 50 28 22 73 22  in);.  z = P("s"
22d0: 29 3b 0a 20 20 7a 53 51 4c 20 3d 20 7a 20 3f 20  );.  zSQL = z ? 
22e0: 74 72 69 6d 5f 73 74 72 69 6e 67 28 7a 29 20 3a  trim_string(z) :
22f0: 20 30 3b 0a 20 20 7a 43 6c 72 4b 65 79 20 3d 20   0;.  zClrKey = 
2300: 74 72 69 6d 5f 73 74 72 69 6e 67 28 50 44 28 22  trim_string(PD("
2310: 6b 22 2c 22 22 29 29 3b 0a 20 20 69 66 28 20 72  k",""));.  if( r
2320: 6e 3e 30 20 26 26 20 50 28 22 64 65 6c 32 22 29  n>0 && P("del2")
2330: 20 29 7b 0a 20 20 20 20 6c 6f 67 69 6e 5f 76 65   ){.    login_ve
2340: 72 69 66 79 5f 63 73 72 66 5f 73 65 63 72 65 74  rify_csrf_secret
2350: 28 29 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69  ();.    db_multi
2360: 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20 46 52  _exec("DELETE FR
2370: 4f 4d 20 72 65 70 6f 72 74 66 6d 74 20 57 48 45  OM reportfmt WHE
2380: 52 45 20 72 6e 3d 25 64 22 2c 20 72 6e 29 3b 0a  RE rn=%d", rn);.
2390: 20 20 20 20 63 67 69 5f 72 65 64 69 72 65 63 74      cgi_redirect
23a0: 28 22 72 65 70 6f 72 74 6c 69 73 74 22 29 3b 0a  ("reportlist");.
23b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
23c0: 6c 73 65 20 69 66 28 20 72 6e 3e 30 20 26 26 20  lse if( rn>0 && 
23d0: 50 28 22 64 65 6c 31 22 29 20 29 7b 0a 20 20 20  P("del1") ){.   
23e0: 20 7a 54 69 74 6c 65 20 3d 20 64 62 5f 74 65 78   zTitle = db_tex
23f0: 74 28 30 2c 20 22 53 45 4c 45 43 54 20 74 69 74  t(0, "SELECT tit
2400: 6c 65 20 46 52 4f 4d 20 72 65 70 6f 72 74 66 6d  le FROM reportfm
2410: 74 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  t ".            
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 57 48               "WH
2430: 45 52 45 20 72 6e 3d 25 64 22 2c 20 72 6e 29 3b  ERE rn=%d", rn);
2440: 0a 20 20 20 20 69 66 28 20 7a 54 69 74 6c 65 3d  .    if( zTitle=
2450: 3d 30 20 29 20 63 67 69 5f 72 65 64 69 72 65 63  =0 ) cgi_redirec
2460: 74 28 22 72 65 70 6f 72 74 6c 69 73 74 22 29 3b  t("reportlist");
2470: 0a 0a 20 20 20 20 73 74 79 6c 65 5f 68 65 61 64  ..    style_head
2480: 65 72 28 22 41 72 65 20 59 6f 75 20 53 75 72 65  er("Are You Sure
2490: 3f 22 29 3b 0a 20 20 20 20 40 20 3c 66 6f 72 6d  ?");.    @ <form
24a0: 20 61 63 74 69 6f 6e 3d 22 72 70 74 65 64 69 74   action="rptedit
24b0: 22 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22 3e  " method="POST">
24c0: 0a 20 20 20 20 40 20 3c 70 3e 59 6f 75 20 61 72  .    @ <p>You ar
24d0: 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74  e about to delet
24e0: 65 20 61 6c 6c 20 74 72 61 63 65 73 20 6f 66 20  e all traces of 
24f0: 74 68 65 20 72 65 70 6f 72 74 0a 20 20 20 20 40  the report.    @
2500: 20 3c 73 74 72 6f 6e 67 3e 25 68 28 7a 54 69 74   <strong>%h(zTit
2510: 6c 65 29 3c 2f 73 74 72 6f 6e 67 3e 20 66 72 6f  le)</strong> fro
2520: 6d 0a 20 20 20 20 40 20 74 68 65 20 64 61 74 61  m.    @ the data
2530: 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 61  base.  This is a
2540: 6e 20 69 72 72 65 76 65 72 73 69 62 6c 65 20 6f  n irreversible o
2550: 70 65 72 61 74 69 6f 6e 2e 20 20 41 6c 6c 20 72  peration.  All r
2560: 65 63 6f 72 64 73 0a 20 20 20 20 40 20 72 65 6c  ecords.    @ rel
2570: 61 74 65 64 20 74 6f 20 74 68 69 73 20 72 65 70  ated to this rep
2580: 6f 72 74 20 77 69 6c 6c 20 62 65 20 72 65 6d 6f  ort will be remo
2590: 76 65 64 20 61 6e 64 20 63 61 6e 6e 6f 74 20 62  ved and cannot b
25a0: 65 20 72 65 63 6f 76 65 72 65 64 2e 3c 2f 70 3e  e recovered.</p>
25b0: 0a 20 20 20 20 40 0a 20 20 20 20 40 20 3c 69 6e  .    @.    @ <in
25c0: 70 75 74 20 74 79 70 65 3d 22 68 69 64 64 65 6e  put type="hidden
25d0: 22 20 6e 61 6d 65 3d 22 72 6e 22 20 76 61 6c 75  " name="rn" valu
25e0: 65 3d 22 25 64 28 72 6e 29 22 3e 0a 20 20 20 20  e="%d(rn)">.    
25f0: 6c 6f 67 69 6e 5f 69 6e 73 65 72 74 5f 63 73 72  login_insert_csr
2600: 66 5f 73 65 63 72 65 74 28 29 3b 0a 20 20 20 20  f_secret();.    
2610: 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73  @ <input type="s
2620: 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 64 65 6c  ubmit" name="del
2630: 32 22 20 76 61 6c 75 65 3d 22 44 65 6c 65 74 65  2" value="Delete
2640: 20 54 68 65 20 52 65 70 6f 72 74 22 3e 0a 20 20   The Report">.  
2650: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
2660: 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 63  "submit" name="c
2670: 61 6e 22 20 76 61 6c 75 65 3d 22 43 61 6e 63 65  an" value="Cance
2680: 6c 22 3e 0a 20 20 20 20 40 20 3c 2f 66 6f 72 6d  l">.    @ </form
2690: 3e 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74  >.    style_foot
26a0: 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  er();.    return
26b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 50 28  ;.  }else if( P(
26c0: 22 63 61 6e 22 29 20 29 7b 0a 20 20 20 20 2f 2a  "can") ){.    /*
26d0: 20 75 73 65 72 20 63 61 6e 63 65 6c 6c 65 64 20   user cancelled 
26e0: 2a 2f 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72  */.    cgi_redir
26f0: 65 63 74 28 22 72 65 70 6f 72 74 6c 69 73 74 22  ect("reportlist"
2700: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2710: 20 7d 0a 20 20 69 66 28 20 7a 54 69 74 6c 65 20   }.  if( zTitle 
2720: 26 26 20 7a 53 51 4c 20 29 7b 0a 20 20 20 20 69  && zSQL ){.    i
2730: 66 28 20 7a 53 51 4c 5b 30 5d 3d 3d 30 20 29 7b  f( zSQL[0]==0 ){
2740: 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 50  .      zErr = "P
2750: 6c 65 61 73 65 20 73 75 70 70 6c 79 20 61 6e 20  lease supply an 
2760: 53 51 4c 20 71 75 65 72 79 20 73 74 61 74 65 6d  SQL query statem
2770: 65 6e 74 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ent";.    }else 
2780: 69 66 28 20 28 7a 54 69 74 6c 65 20 3d 20 74 72  if( (zTitle = tr
2790: 69 6d 5f 73 74 72 69 6e 67 28 7a 54 69 74 6c 65  im_string(zTitle
27a0: 29 29 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ))[0]==0 ){.    
27b0: 20 20 7a 45 72 72 20 3d 20 22 50 6c 65 61 73 65    zErr = "Please
27c0: 20 73 75 70 70 6c 79 20 61 20 74 69 74 6c 65 22   supply a title"
27d0: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
27e0: 20 20 20 20 7a 45 72 72 20 3d 20 76 65 72 69 66      zErr = verif
27f0: 79 5f 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 28  y_sql_statement(
2800: 7a 53 51 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSQL);.    }.   
2810: 20 69 66 28 20 7a 45 72 72 3d 3d 30 20 29 7b 0a   if( zErr==0 ){.
2820: 20 20 20 20 20 20 6c 6f 67 69 6e 5f 76 65 72 69        login_veri
2830: 66 79 5f 63 73 72 66 5f 73 65 63 72 65 74 28 29  fy_csrf_secret()
2840: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 6e 3e 30  ;.      if( rn>0
2850: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 5f 6d   ){.        db_m
2860: 75 6c 74 69 5f 65 78 65 63 28 22 55 50 44 41 54  ulti_exec("UPDAT
2870: 45 20 72 65 70 6f 72 74 66 6d 74 20 53 45 54 20  E reportfmt SET 
2880: 74 69 74 6c 65 3d 25 51 2c 20 73 71 6c 63 6f 64  title=%Q, sqlcod
2890: 65 3d 25 51 2c 22 0a 20 20 20 20 20 20 20 20 20  e=%Q,".         
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 6f               " o
28b0: 77 6e 65 72 3d 25 51 2c 20 63 6f 6c 73 3d 25 51  wner=%Q, cols=%Q
28c0: 20 57 48 45 52 45 20 72 6e 3d 25 64 22 2c 0a 20   WHERE rn=%d",. 
28d0: 20 20 20 20 20 20 20 20 20 20 7a 54 69 74 6c 65            zTitle
28e0: 2c 20 7a 53 51 4c 2c 20 7a 4f 77 6e 65 72 2c 20  , zSQL, zOwner, 
28f0: 7a 43 6c 72 4b 65 79 2c 20 72 6e 29 3b 0a 20 20  zClrKey, rn);.  
2900: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2910: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
2920: 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 65  ("INSERT INTO re
2930: 70 6f 72 74 66 6d 74 28 74 69 74 6c 65 2c 73 71  portfmt(title,sq
2940: 6c 63 6f 64 65 2c 6f 77 6e 65 72 2c 63 6f 6c 73  lcode,owner,cols
2950: 29 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  ) ".           "
2960: 56 41 4c 55 45 53 28 25 51 2c 25 51 2c 25 51 2c  VALUES(%Q,%Q,%Q,
2970: 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %Q)",.          
2980: 20 7a 54 69 74 6c 65 2c 20 7a 53 51 4c 2c 20 7a   zTitle, zSQL, z
2990: 4f 77 6e 65 72 2c 20 7a 43 6c 72 4b 65 79 29 3b  Owner, zClrKey);
29a0: 0a 20 20 20 20 20 20 20 20 72 6e 20 3d 20 64 62  .        rn = db
29b0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
29c0: 69 64 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  id();.      }.  
29d0: 20 20 20 20 63 67 69 5f 72 65 64 69 72 65 63 74      cgi_redirect
29e0: 28 6d 70 72 69 6e 74 66 28 22 72 70 74 76 69 65  (mprintf("rptvie
29f0: 77 3f 72 6e 3d 25 64 22 2c 20 72 6e 29 29 3b 0a  w?rn=%d", rn));.
2a00: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2a10: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
2a20: 72 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 54 69  rn==0 ){.    zTi
2a30: 74 6c 65 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53  tle = "";.    zS
2a40: 51 4c 20 3d 20 74 69 63 6b 65 74 5f 72 65 70 6f  QL = ticket_repo
2a50: 72 74 5f 74 65 6d 70 6c 61 74 65 28 29 3b 0a 20  rt_template();. 
2a60: 20 20 20 7a 43 6c 72 4b 65 79 20 3d 20 74 69 63     zClrKey = tic
2a70: 6b 65 74 5f 6b 65 79 5f 74 65 6d 70 6c 61 74 65  ket_key_template
2a80: 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ();.  }else{.   
2a90: 20 53 74 6d 74 20 71 3b 0a 20 20 20 20 64 62 5f   Stmt q;.    db_
2aa0: 70 72 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c  prepare(&q, "SEL
2ab0: 45 43 54 20 74 69 74 6c 65 2c 20 73 71 6c 63 6f  ECT title, sqlco
2ac0: 64 65 2c 20 6f 77 6e 65 72 2c 20 63 6f 6c 73 20  de, owner, cols 
2ad0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2ae0: 20 20 20 20 20 20 20 22 46 52 4f 4d 20 72 65 70         "FROM rep
2af0: 6f 72 74 66 6d 74 20 57 48 45 52 45 20 72 6e 3d  ortfmt WHERE rn=
2b00: 25 64 22 2c 72 6e 29 3b 0a 20 20 20 20 69 66 28  %d",rn);.    if(
2b10: 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51   db_step(&q)==SQ
2b20: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
2b30: 20 20 7a 54 69 74 6c 65 20 3d 20 64 62 5f 63 6f    zTitle = db_co
2b40: 6c 75 6d 6e 5f 6d 61 6c 6c 6f 63 28 26 71 2c 20  lumn_malloc(&q, 
2b50: 30 29 3b 0a 20 20 20 20 20 20 7a 53 51 4c 20 3d  0);.      zSQL =
2b60: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c 6c 6f   db_column_mallo
2b70: 63 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 20 20  c(&q, 1);.      
2b80: 7a 4f 77 6e 65 72 20 3d 20 64 62 5f 63 6f 6c 75  zOwner = db_colu
2b90: 6d 6e 5f 6d 61 6c 6c 6f 63 28 26 71 2c 20 32 29  mn_malloc(&q, 2)
2ba0: 3b 0a 20 20 20 20 20 20 7a 43 6c 72 4b 65 79 20  ;.      zClrKey 
2bb0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c 6c  = db_column_mall
2bc0: 6f 63 28 26 71 2c 20 33 29 3b 0a 20 20 20 20 7d  oc(&q, 3);.    }
2bd0: 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65  .    db_finalize
2be0: 28 26 71 29 3b 0a 20 20 20 20 69 66 28 20 50 28  (&q);.    if( P(
2bf0: 22 63 6f 70 79 22 29 20 29 7b 0a 20 20 20 20 20  "copy") ){.     
2c00: 20 72 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a   rn = 0;.      z
2c10: 54 69 74 6c 65 20 3d 20 6d 70 72 69 6e 74 66 28  Title = mprintf(
2c20: 22 43 6f 70 79 20 4f 66 20 25 73 22 2c 20 7a 54  "Copy Of %s", zT
2c30: 69 74 6c 65 29 3b 0a 20 20 20 20 20 20 7a 4f 77  itle);.      zOw
2c40: 6e 65 72 20 3d 20 67 2e 7a 4c 6f 67 69 6e 3b 0a  ner = g.zLogin;.
2c50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2c60: 7a 4f 77 6e 65 72 3d 3d 30 20 29 20 7a 4f 77 6e  zOwner==0 ) zOwn
2c70: 65 72 20 3d 20 67 2e 7a 4c 6f 67 69 6e 3b 0a 20  er = g.zLogin;. 
2c80: 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65   style_submenu_e
2c90: 6c 65 6d 65 6e 74 28 22 43 61 6e 63 65 6c 22 2c  lement("Cancel",
2ca0: 20 22 43 61 6e 63 65 6c 22 2c 20 22 72 65 70 6f   "Cancel", "repo
2cb0: 72 74 6c 69 73 74 22 29 3b 0a 20 20 69 66 28 20  rtlist");.  if( 
2cc0: 72 6e 3e 30 20 29 7b 0a 20 20 20 20 73 74 79 6c  rn>0 ){.    styl
2cd0: 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e  e_submenu_elemen
2ce0: 74 28 22 44 65 6c 65 74 65 22 2c 20 22 44 65 6c  t("Delete", "Del
2cf0: 65 74 65 22 2c 20 22 72 70 74 65 64 69 74 3f 72  ete", "rptedit?r
2d00: 6e 3d 25 64 26 64 65 6c 31 3d 31 22 2c 20 72 6e  n=%d&del1=1", rn
2d10: 29 3b 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f 68  );.  }.  style_h
2d20: 65 61 64 65 72 28 72 6e 3e 30 20 3f 20 22 45 64  eader(rn>0 ? "Ed
2d30: 69 74 20 52 65 70 6f 72 74 20 46 6f 72 6d 61 74  it Report Format
2d40: 22 3a 22 43 72 65 61 74 65 20 4e 65 77 20 52 65  ":"Create New Re
2d50: 70 6f 72 74 20 46 6f 72 6d 61 74 22 29 3b 0a 20  port Format");. 
2d60: 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
2d70: 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c   @ <blockquote><
2d80: 66 6f 6e 74 20 63 6f 6c 6f 72 3d 22 23 66 66 30  font color="#ff0
2d90: 30 30 30 22 3e 3c 62 3e 25 68 28 7a 45 72 72 29  000"><b>%h(zErr)
2da0: 3c 2f 62 3e 3c 2f 66 6f 6e 74 3e 3c 2f 62 6c 6f  </b></font></blo
2db0: 63 6b 71 75 6f 74 65 3e 0a 20 20 7d 0a 20 20 40  ckquote>.  }.  @
2dc0: 20 3c 66 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 72   <form action="r
2dd0: 70 74 65 64 69 74 22 20 6d 65 74 68 6f 64 3d 22  ptedit" method="
2de0: 50 4f 53 54 22 3e 0a 20 20 40 20 3c 69 6e 70 75  POST">.  @ <inpu
2df0: 74 20 74 79 70 65 3d 22 68 69 64 64 65 6e 22 20  t type="hidden" 
2e00: 6e 61 6d 65 3d 22 72 6e 22 20 76 61 6c 75 65 3d  name="rn" value=
2e10: 22 25 64 28 72 6e 29 22 3e 0a 20 20 40 20 3c 70  "%d(rn)">.  @ <p
2e20: 3e 52 65 70 6f 72 74 20 54 69 74 6c 65 3a 3c 62  >Report Title:<b
2e30: 72 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79  r>.  @ <input ty
2e40: 70 65 3d 22 74 65 78 74 22 20 6e 61 6d 65 3d 22  pe="text" name="
2e50: 74 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 54 69  t" value="%h(zTi
2e60: 74 6c 65 29 22 20 73 69 7a 65 3d 22 36 30 22 3e  tle)" size="60">
2e70: 3c 2f 70 3e 0a 20 20 40 20 3c 70 3e 45 6e 74 65  </p>.  @ <p>Ente
2e80: 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c  r a complete SQL
2e90: 20 71 75 65 72 79 20 73 74 61 74 65 6d 65 6e 74   query statement
2ea0: 20 61 67 61 69 6e 73 74 20 74 68 65 20 22 54 49   against the "TI
2eb0: 43 4b 45 54 22 20 74 61 62 6c 65 3a 3c 62 72 3e  CKET" table:<br>
2ec0: 0a 20 20 40 20 3c 74 65 78 74 61 72 65 61 20 6e  .  @ <textarea n
2ed0: 61 6d 65 3d 22 73 22 20 72 6f 77 73 3d 22 32 30  ame="s" rows="20
2ee0: 22 20 63 6f 6c 73 3d 22 38 30 22 3e 25 68 28 7a  " cols="80">%h(z
2ef0: 53 51 4c 29 3c 2f 74 65 78 74 61 72 65 61 3e 0a  SQL)</textarea>.
2f00: 20 20 40 20 3c 2f 70 3e 0a 20 20 6c 6f 67 69 6e    @ </p>.  login
2f10: 5f 69 6e 73 65 72 74 5f 63 73 72 66 5f 73 65 63  _insert_csrf_sec
2f20: 72 65 74 28 29 3b 0a 20 20 69 66 28 20 67 2e 6f  ret();.  if( g.o
2f30: 6b 41 64 6d 69 6e 20 29 7b 0a 20 20 20 20 40 20  kAdmin ){.    @ 
2f40: 3c 70 3e 52 65 70 6f 72 74 20 6f 77 6e 65 72 3a  <p>Report owner:
2f50: 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79  .    @ <input ty
2f60: 70 65 3d 22 74 65 78 74 22 20 6e 61 6d 65 3d 22  pe="text" name="
2f70: 77 22 20 73 69 7a 65 3d 22 32 30 22 20 76 61 6c  w" size="20" val
2f80: 75 65 3d 22 25 68 28 7a 4f 77 6e 65 72 29 22 3e  ue="%h(zOwner)">
2f90: 0a 20 20 20 20 40 20 3c 2f 70 3e 0a 20 20 7d 20  .    @ </p>.  } 
2fa0: 65 6c 73 65 20 7b 0a 20 20 20 20 40 20 3c 69 6e  else {.    @ <in
2fb0: 70 75 74 20 74 79 70 65 3d 22 68 69 64 64 65 6e  put type="hidden
2fc0: 22 20 6e 61 6d 65 3d 22 77 22 20 76 61 6c 75 65  " name="w" value
2fd0: 3d 22 25 68 28 7a 4f 77 6e 65 72 29 22 3e 0a 20  ="%h(zOwner)">. 
2fe0: 20 7d 0a 20 20 40 20 3c 70 3e 45 6e 74 65 72 20   }.  @ <p>Enter 
2ff0: 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 63 6f 6c 6f  an optional colo
3000: 72 20 6b 65 79 20 69 6e 20 74 68 65 20 66 6f 6c  r key in the fol
3010: 6c 6f 77 69 6e 67 20 62 6f 78 2e 20 20 28 49 66  lowing box.  (If
3020: 20 62 6c 61 6e 6b 2c 20 6e 6f 0a 20 20 40 20 63   blank, no.  @ c
3030: 6f 6c 6f 72 20 6b 65 79 20 69 73 20 64 69 73 70  olor key is disp
3040: 6c 61 79 65 64 2e 29 20 20 45 61 63 68 20 6c 69  layed.)  Each li
3050: 6e 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ne contains the 
3060: 74 65 78 74 20 66 6f 72 20 61 20 73 69 6e 67 6c  text for a singl
3070: 65 0a 20 20 40 20 65 6e 74 72 79 20 69 6e 20 74  e.  @ entry in t
3080: 68 65 20 6b 65 79 2e 20 20 54 68 65 20 66 69 72  he key.  The fir
3090: 73 74 20 74 6f 6b 65 6e 20 6f 66 20 65 61 63 68  st token of each
30a0: 20 6c 69 6e 65 20 69 73 20 74 68 65 20 62 61 63   line is the bac
30b0: 6b 67 72 6f 75 6e 64 0a 20 20 40 20 63 6f 6c 6f  kground.  @ colo
30c0: 72 20 66 6f 72 20 74 68 61 74 20 6c 69 6e 65 2e  r for that line.
30d0: 3c 62 72 3e 0a 20 20 40 20 3c 74 65 78 74 61 72  <br>.  @ <textar
30e0: 65 61 20 6e 61 6d 65 3d 22 6b 22 20 72 6f 77 73  ea name="k" rows
30f0: 3d 22 38 22 20 63 6f 6c 73 3d 22 35 30 22 3e 25  ="8" cols="50">%
3100: 68 28 7a 43 6c 72 4b 65 79 29 3c 2f 74 65 78 74  h(zClrKey)</text
3110: 61 72 65 61 3e 0a 20 20 40 20 3c 2f 70 3e 0a 20  area>.  @ </p>. 
3120: 20 69 66 28 20 21 67 2e 6f 6b 41 64 6d 69 6e 20   if( !g.okAdmin 
3130: 26 26 20 73 74 72 63 6d 70 28 7a 4f 77 6e 65 72  && strcmp(zOwner
3140: 2c 67 2e 7a 4c 6f 67 69 6e 29 21 3d 30 20 29 7b  ,g.zLogin)!=0 ){
3150: 0a 20 20 20 20 40 20 3c 70 3e 54 68 69 73 20 72  .    @ <p>This r
3160: 65 70 6f 72 74 20 66 6f 72 6d 61 74 20 69 73 20  eport format is 
3170: 6f 77 6e 65 64 20 62 79 20 25 68 28 7a 4f 77 6e  owned by %h(zOwn
3180: 65 72 29 2e 20 20 59 6f 75 20 61 72 65 20 6e 6f  er).  You are no
3190: 74 20 61 6c 6c 6f 77 65 64 0a 20 20 20 20 40 20  t allowed.    @ 
31a0: 74 6f 20 63 68 61 6e 67 65 20 69 74 2e 3c 2f 70  to change it.</p
31b0: 3e 0a 20 20 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a  >.    @ </form>.
31c0: 20 20 20 20 72 65 70 6f 72 74 5f 66 6f 72 6d 61      report_forma
31d0: 74 5f 68 69 6e 74 73 28 29 3b 0a 20 20 20 20 73  t_hints();.    s
31e0: 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20  tyle_footer();. 
31f0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3200: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22   @ <input type="
3210: 73 75 62 6d 69 74 22 20 76 61 6c 75 65 3d 22 41  submit" value="A
3220: 70 70 6c 79 20 43 68 61 6e 67 65 73 22 3e 0a 20  pply Changes">. 
3230: 20 69 66 28 20 72 6e 3e 30 20 29 7b 0a 20 20 20   if( rn>0 ){.   
3240: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22   @ <input type="
3250: 73 75 62 6d 69 74 22 20 76 61 6c 75 65 3d 22 44  submit" value="D
3260: 65 6c 65 74 65 20 54 68 69 73 20 52 65 70 6f 72  elete This Repor
3270: 74 22 20 6e 61 6d 65 3d 22 64 65 6c 31 22 3e 0a  t" name="del1">.
3280: 20 20 7d 0a 20 20 40 20 3c 2f 66 6f 72 6d 3e 0a    }.  @ </form>.
3290: 20 20 72 65 70 6f 72 74 5f 66 6f 72 6d 61 74 5f    report_format_
32a0: 68 69 6e 74 73 28 29 3b 0a 20 20 73 74 79 6c 65  hints();.  style
32b0: 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a  _footer();.}../*
32c0: 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 62 75 6e  .** Output a bun
32d0: 63 68 20 6f 66 20 74 65 78 74 20 74 68 61 74 20  ch of text that 
32e0: 70 72 6f 76 69 64 65 73 20 69 6e 66 6f 72 6d 61  provides informa
32f0: 74 69 6f 6e 20 61 62 6f 75 74 20 72 65 70 6f 72  tion about repor
3300: 74 0a 2a 2a 20 66 6f 72 6d 61 74 73 0a 2a 2f 0a  t.** formats.*/.
3310: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 70 6f  static void repo
3320: 72 74 5f 66 6f 72 6d 61 74 5f 68 69 6e 74 73 28  rt_format_hints(
3330: 76 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a  void){.  char *z
3340: 53 63 68 65 6d 61 3b 0a 20 20 7a 53 63 68 65 6d  Schema;.  zSchem
3350: 61 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 22 53  a = db_text(0,"S
3360: 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73  ELECT sql FROM s
3370: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
3380: 52 45 20 6e 61 6d 65 3d 27 74 69 63 6b 65 74 27  RE name='ticket'
3390: 22 29 3b 0a 20 20 69 66 28 20 7a 53 63 68 65 6d  ");.  if( zSchem
33a0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68  a==0 ){.    zSch
33b0: 65 6d 61 20 3d 20 64 62 5f 74 65 78 74 28 30 2c  ema = db_text(0,
33c0: 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
33d0: 20 72 65 70 6f 73 69 74 6f 72 79 2e 73 71 6c 69   repository.sqli
33e0: 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3400: 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 3d     " WHERE name=
3410: 27 74 69 63 6b 65 74 27 22 29 3b 0a 20 20 7d 0a  'ticket'");.  }.
3420: 20 20 40 20 3c 68 72 3e 3c 68 33 3e 54 49 43 4b    @ <hr><h3>TICK
3430: 45 54 20 53 63 68 65 6d 61 3c 2f 68 33 3e 0a 20  ET Schema</h3>. 
3440: 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c   @ <blockquote><
3450: 70 72 65 3e 0a 20 20 40 20 25 68 28 7a 53 63 68  pre>.  @ %h(zSch
3460: 65 6d 61 29 0a 20 20 40 20 3c 2f 70 72 65 3e 3c  ema).  @ </pre><
3470: 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 40  /blockquote>.  @
3480: 20 3c 68 33 3e 4e 6f 74 65 73 3c 2f 68 33 3e 0a   <h3>Notes</h3>.
3490: 20 20 40 20 3c 75 6c 3e 0a 20 20 40 20 3c 6c 69    @ <ul>.  @ <li
34a0: 3e 3c 70 3e 54 68 65 20 53 51 4c 20 6d 75 73 74  ><p>The SQL must
34b0: 20 63 6f 6e 73 69 73 74 20 6f 66 20 61 20 73 69   consist of a si
34c0: 6e 67 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74  ngle SELECT stat
34d0: 65 6d 65 6e 74 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20  ement</p></li>. 
34e0: 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 49 66   @.  @ <li><p>If
34f0: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65   a column of the
3500: 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 6e   result set is n
3510: 61 6d 65 64 20 22 23 22 20 74 68 65 6e 20 74 68  amed "#" then th
3520: 61 74 20 63 6f 6c 75 6d 6e 0a 20 20 40 20 69 73  at column.  @ is
3530: 20 61 73 73 75 6d 65 64 20 74 6f 20 68 6f 6c 64   assumed to hold
3540: 20 61 20 74 69 63 6b 65 74 20 6e 75 6d 62 65 72   a ticket number
3550: 2e 20 20 41 20 68 79 70 65 72 6c 69 6e 6b 20 77  .  A hyperlink w
3560: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 66  ill be created f
3570: 72 6f 6d 0a 20 20 40 20 74 68 61 74 20 63 6f 6c  rom.  @ that col
3580: 75 6d 6e 20 74 6f 20 61 20 64 65 74 61 69 6c 65  umn to a detaile
3590: 64 20 76 69 65 77 20 6f 66 20 74 68 65 20 74 69  d view of the ti
35a0: 63 6b 65 74 2e 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20  cket.</p></li>. 
35b0: 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 49 66   @.  @ <li><p>If
35c0: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65   a column of the
35d0: 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 6e   result set is n
35e0: 61 6d 65 64 20 22 62 67 63 6f 6c 6f 72 22 20 74  amed "bgcolor" t
35f0: 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  hen the content.
3600: 20 20 40 20 6f 66 20 74 68 61 74 20 63 6f 6c 75    @ of that colu
3610: 6d 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  mn determines th
3620: 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 63 6f 6c  e background col
3630: 6f 72 20 6f 66 20 74 68 65 20 72 6f 77 2e 3c 2f  or of the row.</
3640: 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20  p></li>.  @.  @ 
3650: 3c 6c 69 3e 3c 70 3e 54 68 65 20 3c 62 3e 75 73  <li><p>The <b>us
3660: 65 72 28 29 3c 2f 62 3e 20 53 51 4c 20 66 75 6e  er()</b> SQL fun
3670: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
3680: 73 74 72 69 6e 67 0a 20 20 40 20 77 68 69 63 68  string.  @ which
3690: 20 69 73 20 74 68 65 20 6c 6f 67 69 6e 20 6f 66   is the login of
36a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 75 73 65   the current use
36b0: 72 2e 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a  r.</p></li>.  @.
36c0: 20 20 40 20 3c 6c 69 3e 3c 70 3e 49 66 20 61 20    @ <li><p>If a 
36d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 70  column name is p
36e0: 72 65 66 69 78 65 64 20 77 69 74 68 20 74 68 65  refixed with the
36f0: 20 73 74 72 69 6e 67 20 22 5f 77 69 6b 69 5f 22   string "_wiki_"
3700: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 0a  , the contents .
3710: 20 20 40 20 6f 66 20 74 68 61 74 20 63 6f 6c 75    @ of that colu
3720: 6d 6e 20 77 69 6c 6c 20 62 65 20 72 65 6e 64 65  mn will be rende
3730: 72 65 64 20 61 73 20 77 69 6b 69 20 66 6f 72 6d  red as wiki form
3740: 61 74 74 65 64 20 63 6f 6e 74 65 6e 74 2e 20 20  atted content.  
3750: 54 68 65 20 22 5f 77 69 6b 69 5f 22 0a 20 20 40  The "_wiki_".  @
3760: 20 70 72 65 66 69 78 20 77 69 6c 6c 20 62 65 20   prefix will be 
3770: 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68  stripped from th
3780: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 3c 2f  e column name.</
3790: 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20  p></li>.  @.  @ 
37a0: 3c 6c 69 3e 3c 70 3e 54 68 65 20 66 69 72 73 74  <li><p>The first
37b0: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 6e 61   column whose na
37c0: 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 75  me begins with u
37d0: 6e 64 65 72 73 63 6f 72 65 20 28 22 5f 22 29 20  nderscore ("_") 
37e0: 61 6e 64 20 61 6c 6c 0a 20 20 40 20 73 75 62 73  and all.  @ subs
37f0: 65 71 75 65 6e 74 20 63 6f 6c 75 6d 6e 73 20 61  equent columns a
3800: 72 65 20 73 68 6f 77 6e 20 6f 6e 20 74 68 65 69  re shown on thei
3810: 72 20 6f 77 6e 20 72 6f 77 73 20 69 6e 20 74 68  r own rows in th
3820: 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 6d  e table.  This m
3830: 69 67 68 74 0a 20 20 40 20 62 65 20 75 73 65 66  ight.  @ be usef
3840: 75 6c 20 66 6f 72 20 64 69 73 70 6c 61 79 69 6e  ul for displayin
3850: 67 20 74 68 65 20 64 65 73 63 72 69 70 74 69 6f  g the descriptio
3860: 6e 20 6f 66 20 74 69 63 6b 65 74 73 2e 20 20 54  n of tickets.  T
3870: 68 69 73 20 72 75 6c 65 20 64 6f 65 73 20 6e 6f  his rule does no
3880: 74 0a 20 20 40 20 68 6f 6c 64 20 69 66 20 74 68  t.  @ hold if th
3890: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 70 72 65 66  e column is pref
38a0: 69 78 65 64 20 77 69 74 68 20 22 5f 77 69 6b 69  ixed with "_wiki
38b0: 5f 22 2e 0a 20 20 40 20 3c 2f 70 3e 3c 2f 6c 69  _"..  @ </p></li
38c0: 3e 0a 20 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70  >.  @.  @ <li><p
38d0: 3e 54 68 65 20 3c 62 3e 61 75 78 28 29 3c 2f 62  >The <b>aux()</b
38e0: 3e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74  > SQL function t
38f0: 61 6b 65 73 20 61 20 70 61 72 61 6d 65 74 65 72  akes a parameter
3900: 20 6e 61 6d 65 20 61 73 20 61 6e 20 61 72 67 75   name as an argu
3910: 6d 65 6e 74 0a 20 20 40 20 61 6e 64 20 72 65 74  ment.  @ and ret
3920: 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 74  urns the value t
3930: 68 61 74 20 74 68 65 20 75 73 65 72 20 65 6e 74  hat the user ent
3940: 65 72 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ers in the resul
3950: 74 69 6e 67 20 48 54 4d 4c 20 66 6f 72 6d 2e 20  ting HTML form. 
3960: 41 0a 20 20 40 20 73 65 63 6f 6e 64 20 6f 70 74  A.  @ second opt
3970: 69 6f 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  ional parameter 
3980: 70 72 6f 76 69 64 65 73 20 61 20 64 65 66 61 75  provides a defau
3990: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
39a0: 20 66 69 65 6c 64 2e 3c 2f 70 3e 3c 2f 6c 69 3e   field.</p></li>
39b0: 0a 20 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e  .  @.  @ <li><p>
39c0: 54 68 65 20 3c 62 3e 6f 70 74 69 6f 6e 28 29 3c  The <b>option()<
39d0: 2f 62 3e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  /b> SQL function
39e0: 20 74 61 6b 65 73 20 61 20 70 61 72 61 6d 65 74   takes a paramet
39f0: 65 72 20 6e 61 6d 65 0a 20 20 40 20 61 6e 64 20  er name.  @ and 
3a00: 61 20 71 75 6f 74 65 64 20 53 45 4c 45 43 54 20  a quoted SELECT 
3a10: 73 74 61 74 65 6d 65 6e 74 20 61 73 20 70 61 72  statement as par
3a20: 61 6d 65 74 65 72 73 2e 20 54 68 65 20 71 75 65  ameters. The que
3a30: 72 79 20 72 65 73 75 6c 74 73 20 61 72 65 0a 20  ry results are. 
3a40: 20 40 20 70 72 65 73 65 6e 74 65 64 20 61 73 20   @ presented as 
3a50: 61 6e 20 48 54 4d 4c 20 64 72 6f 70 64 6f 77 6e  an HTML dropdown
3a60: 20 6d 65 6e 75 20 61 6e 64 20 74 68 65 20 66 75   menu and the fu
3a70: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 20  nction returns. 
3a80: 20 40 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79   @ the currently
3a90: 20 73 65 6c 65 63 74 65 64 20 76 61 6c 75 65 2e   selected value.
3aa0: 20 52 65 73 75 6c 74 73 20 6d 61 79 20 62 65 20   Results may be 
3ab0: 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 20 63  a single value c
3ac0: 6f 6c 75 6d 6e 20 6f 72 0a 20 20 40 20 74 77 6f  olumn or.  @ two
3ad0: 20 3c 62 3e 76 61 6c 75 65 2c 64 65 73 63 72 69   <b>value,descri
3ae0: 70 74 69 6f 6e 3c 2f 62 3e 20 63 6f 6c 75 6d 6e  ption</b> column
3af0: 73 2e 20 54 68 65 20 66 69 72 73 74 20 72 6f 77  s. The first row
3b00: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
3b10: 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20  </p></li>.  @.  
3b20: 40 20 3c 6c 69 3e 3c 70 3e 54 68 65 20 3c 62 3e  @ <li><p>The <b>
3b30: 63 67 69 28 29 3c 2f 62 3e 20 53 51 4c 20 66 75  cgi()</b> SQL fu
3b40: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 70  nction takes a p
3b50: 61 72 61 6d 65 74 65 72 20 6e 61 6d 65 20 61 73  arameter name as
3b60: 20 61 6e 20 61 72 67 75 6d 65 6e 74 0a 20 20 40   an argument.  @
3b70: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
3b80: 20 76 61 6c 75 65 20 6f 66 20 61 20 63 6f 72 72   value of a corr
3b90: 65 73 70 6f 6e 64 69 6e 67 20 43 47 49 20 71 75  esponding CGI qu
3ba0: 65 72 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68  ery value. If th
3bb0: 65 20 43 47 49 0a 20 20 40 20 70 61 72 61 6d 65  e CGI.  @ parame
3bc0: 74 65 72 20 64 6f 65 73 6e 27 74 20 65 78 69 73  ter doesn't exis
3bd0: 74 2c 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 73  t, an optional s
3be0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 77  econd argument w
3bf0: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a  ill be returned.
3c00: 20 20 40 20 69 6e 73 74 65 61 64 2e 3c 2f 70 3e    @ instead.</p>
3c10: 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20 3c 6c  </li>.  @.  @ <l
3c20: 69 3e 3c 70 3e 54 68 65 20 3c 62 3e 73 65 61 72  i><p>The <b>sear
3c30: 63 68 28 29 3c 2f 62 3e 20 53 51 4c 20 66 75 6e  ch()</b> SQL fun
3c40: 63 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 6b 65  ction takes a ke
3c50: 79 77 6f 72 64 20 70 61 74 74 65 72 6e 20 61 6e  yword pattern an
3c60: 64 0a 20 20 40 20 61 20 73 65 61 72 63 68 20 74  d.  @ a search t
3c70: 65 78 74 2e 20 54 68 65 20 66 75 6e 63 74 69 6f  ext. The functio
3c80: 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74  n returns an int
3c90: 65 67 65 72 20 73 63 6f 72 65 20 77 68 69 63 68  eger score which
3ca0: 20 69 73 0a 20 20 40 20 68 69 67 68 65 72 20 64   is.  @ higher d
3cb0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 68 6f 77 20  epending on how 
3cc0: 77 65 6c 6c 20 74 68 65 20 73 65 61 72 63 68 20  well the search 
3cd0: 77 65 6e 74 2e 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20  went.</p></li>. 
3ce0: 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 54 68   @.  @ <li><p>Th
3cf0: 65 20 71 75 65 72 79 20 63 61 6e 20 6a 6f 69 6e  e query can join
3d00: 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e   other tables in
3d10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
3d20: 73 69 64 65 73 20 54 49 43 4b 45 54 2e 0a 20 20  sides TICKET..  
3d30: 40 20 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40 20  @ </p></li>.  @ 
3d40: 3c 2f 75 6c 3e 0a 20 20 40 0a 20 20 40 20 3c 68  </ul>.  @.  @ <h
3d50: 33 3e 45 78 61 6d 70 6c 65 73 3c 2f 68 33 3e 0a  3>Examples</h3>.
3d60: 20 20 40 20 3c 70 3e 49 6e 20 74 68 69 73 20 65    @ <p>In this e
3d70: 78 61 6d 70 6c 65 2c 20 74 68 65 20 66 69 72 73  xample, the firs
3d80: 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  t column in the 
3d90: 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 6e 61  result set is na
3da0: 6d 65 64 0a 20 20 40 20 22 62 67 63 6f 6c 6f 72  med.  @ "bgcolor
3db0: 22 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66  ".  The value of
3dc0: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 69 73 20   this column is 
3dd0: 6e 6f 74 20 64 69 73 70 6c 61 79 65 64 2e 20 20  not displayed.  
3de0: 49 6e 73 74 65 61 64 2c 20 69 74 0a 20 20 40 20  Instead, it.  @ 
3df0: 73 65 6c 65 63 74 73 20 74 68 65 20 62 61 63 6b  selects the back
3e00: 67 72 6f 75 6e 64 20 63 6f 6c 6f 72 20 6f 66 20  ground color of 
3e10: 65 61 63 68 20 72 6f 77 20 62 61 73 65 64 20 6f  each row based o
3e20: 6e 20 74 68 65 20 54 49 43 4b 45 54 2e 53 54 41  n the TICKET.STA
3e30: 54 55 53 0a 20 20 40 20 66 69 65 6c 64 20 6f 66  TUS.  @ field of
3e40: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
3e50: 54 68 65 20 63 6f 6c 6f 72 20 6b 65 79 20 61 74  The color key at
3e60: 20 74 68 65 20 72 69 67 68 74 20 73 68 6f 77 73   the right shows
3e70: 20 74 68 65 20 76 61 72 69 6f 75 73 0a 20 20 40   the various.  @
3e80: 20 63 6f 6c 6f 72 20 63 6f 64 65 73 2e 3c 2f 70   color codes.</p
3e90: 3e 0a 20 20 40 20 3c 74 61 62 6c 65 20 61 6c 69  >.  @ <table ali
3ea0: 67 6e 3d 22 72 69 67 68 74 22 20 73 74 79 6c 65  gn="right" style
3eb0: 3d 22 6d 61 72 67 69 6e 3a 20 30 20 35 70 78 3b  ="margin: 0 5px;
3ec0: 22 20 62 6f 72 64 65 72 3d 31 20 63 65 6c 6c 73  " border=1 cells
3ed0: 70 61 63 69 6e 67 3d 30 20 77 69 64 74 68 3d 31  pacing=0 width=1
3ee0: 32 35 3e 0a 20 20 40 20 3c 74 72 20 62 67 63 6f  25>.  @ <tr bgco
3ef0: 6c 6f 72 3d 22 23 66 32 64 63 64 63 22 3e 3c 74  lor="#f2dcdc"><t
3f00: 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22  d align="center"
3f10: 3e 6e 65 77 20 6f 72 20 61 63 74 69 76 65 3c 2f  >new or active</
3f20: 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72  td></tr>.  @ <tr
3f30: 20 62 67 63 6f 6c 6f 72 3d 22 23 65 38 65 38 62   bgcolor="#e8e8b
3f40: 64 22 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65  d"><td align="ce
3f50: 6e 74 65 72 22 3e 72 65 76 69 65 77 3c 2f 74 64  nter">review</td
3f60: 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72 20 62  ></tr>.  @ <tr b
3f70: 67 63 6f 6c 6f 72 3d 22 23 63 66 65 38 62 64 22  gcolor="#cfe8bd"
3f80: 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74  ><td align="cent
3f90: 65 72 22 3e 66 69 78 65 64 3c 2f 74 64 3e 3c 2f  er">fixed</td></
3fa0: 74 72 3e 0a 20 20 40 20 3c 74 72 20 62 67 63 6f  tr>.  @ <tr bgco
3fb0: 6c 6f 72 3d 22 23 62 64 65 35 64 36 22 3e 3c 74  lor="#bde5d6"><t
3fc0: 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22  d align="center"
3fd0: 3e 74 65 73 74 65 64 3c 2f 74 64 3e 3c 2f 74 72  >tested</td></tr
3fe0: 3e 0a 20 20 40 20 3c 74 72 20 62 67 63 6f 6c 6f  >.  @ <tr bgcolo
3ff0: 72 3d 22 23 63 61 63 61 65 35 22 3e 3c 74 64 20  r="#cacae5"><td 
4000: 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 3e 64  align="center">d
4010: 65 66 65 72 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20  efer</td></tr>. 
4020: 20 40 20 3c 74 72 20 62 67 63 6f 6c 6f 72 3d 22   @ <tr bgcolor="
4030: 23 63 38 63 38 63 38 22 3e 3c 74 64 20 61 6c 69  #c8c8c8"><td ali
4040: 67 6e 3d 22 63 65 6e 74 65 72 22 3e 63 6c 6f 73  gn="center">clos
4050: 65 64 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40  ed</td></tr>.  @
4060: 20 3c 2f 74 61 62 6c 65 3e 0a 20 20 40 20 3c 62   </table>.  @ <b
4070: 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a  lockquote><pre>.
4080: 20 20 40 20 53 45 4c 45 43 54 0a 20 20 40 20 20    @ SELECT.  @  
4090: 20 43 41 53 45 20 57 48 45 4e 20 73 74 61 74 75   CASE WHEN statu
40a0: 73 20 49 4e 20 28 27 6e 65 77 27 2c 27 61 63 74  s IN ('new','act
40b0: 69 76 65 27 29 20 54 48 45 4e 20 27 23 66 32 64  ive') THEN '#f2d
40c0: 63 64 63 27 0a 20 20 40 20 20 20 20 20 20 20 20  cdc'.  @        
40d0: 57 48 45 4e 20 73 74 61 74 75 73 3d 27 72 65 76  WHEN status='rev
40e0: 69 65 77 27 20 54 48 45 4e 20 27 23 65 38 65 38  iew' THEN '#e8e8
40f0: 62 64 27 0a 20 20 40 20 20 20 20 20 20 20 20 57  bd'.  @        W
4100: 48 45 4e 20 73 74 61 74 75 73 3d 27 66 69 78 65  HEN status='fixe
4110: 64 27 20 54 48 45 4e 20 27 23 63 66 65 38 62 64  d' THEN '#cfe8bd
4120: 27 0a 20 20 40 20 20 20 20 20 20 20 20 57 48 45  '.  @        WHE
4130: 4e 20 73 74 61 74 75 73 3d 27 74 65 73 74 65 64  N status='tested
4140: 27 20 54 48 45 4e 20 27 23 62 64 65 35 64 36 27  ' THEN '#bde5d6'
4150: 0a 20 20 40 20 20 20 20 20 20 20 20 57 48 45 4e  .  @        WHEN
4160: 20 73 74 61 74 75 73 3d 27 64 65 66 65 72 27 20   status='defer' 
4170: 54 48 45 4e 20 27 23 63 61 63 61 65 35 27 0a 20  THEN '#cacae5'. 
4180: 20 40 20 20 20 20 20 20 20 20 45 4c 53 45 20 27   @        ELSE '
4190: 23 63 38 63 38 63 38 27 20 45 4e 44 20 61 73 20  #c8c8c8' END as 
41a0: 27 62 67 63 6f 6c 6f 72 27 2c 0a 20 20 40 20 20  'bgcolor',.  @  
41b0: 20 74 6e 20 41 53 20 27 23 27 2c 0a 20 20 40 20   tn AS '#',.  @ 
41c0: 20 20 74 79 70 65 20 41 53 20 27 54 79 70 65 27    type AS 'Type'
41d0: 2c 0a 20 20 40 20 20 20 73 74 61 74 75 73 20 41  ,.  @   status A
41e0: 53 20 27 53 74 61 74 75 73 27 2c 0a 20 20 40 20  S 'Status',.  @ 
41f0: 20 20 73 64 61 74 65 28 6f 72 69 67 74 69 6d 65    sdate(origtime
4200: 29 20 41 53 20 27 43 72 65 61 74 65 64 27 2c 0a  ) AS 'Created',.
4210: 20 20 40 20 20 20 6f 77 6e 65 72 20 41 53 20 27    @   owner AS '
4220: 42 79 27 2c 0a 20 20 40 20 20 20 73 75 62 73 79  By',.  @   subsy
4230: 73 74 65 6d 20 41 53 20 27 53 75 62 73 79 73 27  stem AS 'Subsys'
4240: 2c 0a 20 20 40 20 20 20 73 64 61 74 65 28 63 68  ,.  @   sdate(ch
4250: 61 6e 67 65 74 69 6d 65 29 20 41 53 20 27 43 68  angetime) AS 'Ch
4260: 61 6e 67 65 64 27 2c 0a 20 20 40 20 20 20 61 73  anged',.  @   as
4270: 73 69 67 6e 65 64 74 6f 20 41 53 20 27 41 73 73  signedto AS 'Ass
4280: 69 67 6e 65 64 27 2c 0a 20 20 40 20 20 20 73 65  igned',.  @   se
4290: 76 65 72 69 74 79 20 41 53 20 27 53 76 72 27 2c  verity AS 'Svr',
42a0: 0a 20 20 40 20 20 20 70 72 69 6f 72 69 74 79 20  .  @   priority 
42b0: 41 53 20 27 50 72 69 27 2c 0a 20 20 40 20 20 20  AS 'Pri',.  @   
42c0: 74 69 74 6c 65 20 41 53 20 27 54 69 74 6c 65 27  title AS 'Title'
42d0: 0a 20 20 40 20 46 52 4f 4d 20 74 69 63 6b 65 74  .  @ FROM ticket
42e0: 0a 20 20 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f  .  @ </pre></blo
42f0: 63 6b 71 75 6f 74 65 3e 0a 20 20 40 20 3c 70 3e  ckquote>.  @ <p>
4300: 54 6f 20 62 61 73 65 20 74 68 65 20 62 61 63 6b  To base the back
4310: 67 72 6f 75 6e 64 20 63 6f 6c 6f 72 20 6f 6e 20  ground color on 
4320: 74 68 65 20 54 49 43 4b 45 54 2e 50 52 49 4f 52  the TICKET.PRIOR
4330: 49 54 59 20 6f 72 0a 20 20 40 20 54 49 43 4b 45  ITY or.  @ TICKE
4340: 54 2e 53 45 56 45 52 49 54 59 20 66 69 65 6c 64  T.SEVERITY field
4350: 73 2c 20 73 75 62 73 74 69 74 75 74 65 20 74 68  s, substitute th
4360: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
4370: 20 66 6f 72 20 74 68 65 0a 20 20 40 20 66 69 72   for the.  @ fir
4380: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
4390: 20 71 75 65 72 79 3a 3c 2f 70 3e 0a 20 20 40 20   query:</p>.  @ 
43a0: 3c 74 61 62 6c 65 20 61 6c 69 67 6e 3d 22 72 69  <table align="ri
43b0: 67 68 74 22 20 73 74 79 6c 65 3d 22 6d 61 72 67  ght" style="marg
43c0: 69 6e 3a 20 30 20 35 70 78 3b 22 20 62 6f 72 64  in: 0 5px;" bord
43d0: 65 72 3d 31 20 63 65 6c 6c 73 70 61 63 69 6e 67  er=1 cellspacing
43e0: 3d 30 20 77 69 64 74 68 3d 31 32 35 3e 0a 20 20  =0 width=125>.  
43f0: 40 20 3c 74 72 20 62 67 63 6f 6c 6f 72 3d 22 23  @ <tr bgcolor="#
4400: 66 32 64 63 64 63 22 3e 3c 74 64 20 61 6c 69 67  f2dcdc"><td alig
4410: 6e 3d 22 63 65 6e 74 65 72 22 3e 31 3c 2f 74 64  n="center">1</td
4420: 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72 20 62  ></tr>.  @ <tr b
4430: 67 63 6f 6c 6f 72 3d 22 23 65 38 65 38 62 64 22  gcolor="#e8e8bd"
4440: 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74  ><td align="cent
4450: 65 72 22 3e 32 3c 2f 74 64 3e 3c 2f 74 72 3e 0a  er">2</td></tr>.
4460: 20 20 40 20 3c 74 72 20 62 67 63 6f 6c 6f 72 3d    @ <tr bgcolor=
4470: 22 23 63 66 65 38 62 64 22 3e 3c 74 64 20 61 6c  "#cfe8bd"><td al
4480: 69 67 6e 3d 22 63 65 6e 74 65 72 22 3e 33 3c 2f  ign="center">3</
4490: 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72  td></tr>.  @ <tr
44a0: 20 62 67 63 6f 6c 6f 72 3d 22 23 63 61 63 61 65   bgcolor="#cacae
44b0: 35 22 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65  5"><td align="ce
44c0: 6e 74 65 72 22 3e 34 3c 2f 74 64 3e 3c 2f 74 72  nter">4</td></tr
44d0: 3e 0a 20 20 40 20 3c 74 72 20 62 67 63 6f 6c 6f  >.  @ <tr bgcolo
44e0: 72 3d 22 23 63 38 63 38 63 38 22 3e 3c 74 64 20  r="#c8c8c8"><td 
44f0: 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 3e 35  align="center">5
4500: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c  </td></tr>.  @ <
4510: 2f 74 61 62 6c 65 3e 0a 20 20 40 20 3c 62 6c 6f  /table>.  @ <blo
4520: 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 20 20  ckquote><pre>.  
4530: 40 20 53 45 4c 45 43 54 0a 20 20 40 20 20 20 43  @ SELECT.  @   C
4540: 41 53 45 20 70 72 69 6f 72 69 74 79 20 57 48 45  ASE priority WHE
4550: 4e 20 31 20 54 48 45 4e 20 27 23 66 32 64 63 64  N 1 THEN '#f2dcd
4560: 63 27 0a 20 20 40 20 20 20 20 20 20 20 20 57 48  c'.  @        WH
4570: 45 4e 20 32 20 54 48 45 4e 20 27 23 65 38 65 38  EN 2 THEN '#e8e8
4580: 62 64 27 0a 20 20 40 20 20 20 20 20 20 20 20 57  bd'.  @        W
4590: 48 45 4e 20 33 20 54 48 45 4e 20 27 23 63 66 65  HEN 3 THEN '#cfe
45a0: 38 62 64 27 0a 20 20 40 20 20 20 20 20 20 20 20  8bd'.  @        
45b0: 57 48 45 4e 20 34 20 54 48 45 4e 20 27 23 63 61  WHEN 4 THEN '#ca
45c0: 63 61 65 35 27 0a 20 20 40 20 20 20 20 20 20 20  cae5'.  @       
45d0: 20 45 4c 53 45 20 27 23 63 38 63 38 63 38 27 20   ELSE '#c8c8c8' 
45e0: 45 4e 44 20 61 73 20 27 62 67 63 6f 6c 6f 72 27  END as 'bgcolor'
45f0: 2c 0a 20 20 40 20 2e 2e 2e 0a 20 20 40 20 46 52  ,.  @ ....  @ FR
4600: 4f 4d 20 74 69 63 6b 65 74 0a 20 20 40 20 3c 2f  OM ticket.  @ </
4610: 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65  pre></blockquote
4620: 3e 0a 23 69 66 20 30 0a 20 20 40 20 3c 70 3e 59  >.#if 0.  @ <p>Y
4630: 6f 75 20 63 61 6e 2c 20 6f 66 20 63 6f 75 72 73  ou can, of cours
4640: 65 2c 20 73 75 62 73 74 69 74 75 74 65 20 64 69  e, substitute di
4650: 66 66 65 72 65 6e 74 20 63 6f 6c 6f 72 73 20 69  fferent colors i
4660: 66 20 79 6f 75 20 63 68 6f 6f 73 65 2e 0a 20 20  f you choose..  
4670: 40 20 48 65 72 65 20 69 73 20 61 20 70 61 6c 65  @ Here is a pale
4680: 74 74 65 20 6f 66 20 73 75 67 67 65 73 74 65 64  tte of suggested
4690: 20 62 61 63 6b 67 72 6f 75 6e 64 20 63 6f 6c 6f   background colo
46a0: 72 73 3a 3c 2f 70 3e 0a 20 20 40 20 3c 62 6c 6f  rs:</p>.  @ <blo
46b0: 63 6b 71 75 6f 74 65 3e 0a 20 20 40 20 3c 74 61  ckquote>.  @ <ta
46c0: 62 6c 65 20 62 6f 72 64 65 72 3d 31 20 63 65 6c  ble border=1 cel
46d0: 6c 73 70 61 63 69 6e 67 3d 30 20 77 69 64 74 68  lspacing=0 width
46e0: 3d 33 30 30 3e 0a 20 20 40 20 3c 74 72 3e 3c 74  =300>.  @ <tr><t
46f0: 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22  d align="center"
4700: 20 62 67 63 6f 6c 6f 72 3d 22 23 66 66 62 64 62   bgcolor="#ffbdb
4710: 64 22 3e 23 66 66 62 64 62 64 3c 2f 74 64 3e 0a  d">#ffbdbd</td>.
4720: 20 20 40 20 20 20 20 20 3c 74 64 20 61 6c 69 67    @     <td alig
4730: 6e 3d 22 63 65 6e 74 65 72 22 20 62 67 63 6f 6c  n="center" bgcol
4740: 6f 72 3d 22 23 66 32 64 63 64 63 22 3e 23 66 32  or="#f2dcdc">#f2
4750: 64 63 64 63 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20  dcdc</td></tr>. 
4760: 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e   @ <tr><td align
4770: 3d 22 63 65 6e 74 65 72 22 20 62 67 63 6f 6c 6f  ="center" bgcolo
4780: 72 3d 22 23 66 66 66 66 62 64 22 3e 23 66 66 66  r="#ffffbd">#fff
4790: 66 62 64 3c 2f 74 64 3e 0a 20 20 40 20 20 20 20  fbd</td>.  @    
47a0: 20 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74   <td align="cent
47b0: 65 72 22 20 62 67 63 6f 6c 6f 72 3d 22 23 65 38  er" bgcolor="#e8
47c0: 65 38 62 64 22 3e 23 65 38 65 38 62 64 3c 2f 74  e8bd">#e8e8bd</t
47d0: 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72 3e  d></tr>.  @ <tr>
47e0: 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65  <td align="cente
47f0: 72 22 20 62 67 63 6f 6c 6f 72 3d 22 23 63 30 65  r" bgcolor="#c0e
4800: 62 63 30 22 3e 23 63 30 65 62 63 30 3c 2f 74 64  bc0">#c0ebc0</td
4810: 3e 0a 20 20 40 20 20 20 20 20 3c 74 64 20 61 6c  >.  @     <td al
4820: 69 67 6e 3d 22 63 65 6e 74 65 72 22 20 62 67 63  ign="center" bgc
4830: 6f 6c 6f 72 3d 22 23 63 66 65 38 62 64 22 3e 23  olor="#cfe8bd">#
4840: 63 66 65 38 62 64 3c 2f 74 64 3e 3c 2f 74 72 3e  cfe8bd</td></tr>
4850: 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69  .  @ <tr><td ali
4860: 67 6e 3d 22 63 65 6e 74 65 72 22 20 62 67 63 6f  gn="center" bgco
4870: 6c 6f 72 3d 22 23 63 30 63 30 66 34 22 3e 23 63  lor="#c0c0f4">#c
4880: 30 63 30 66 34 3c 2f 74 64 3e 0a 20 20 40 20 20  0c0f4</td>.  @  
4890: 20 20 20 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65     <td align="ce
48a0: 6e 74 65 72 22 20 62 67 63 6f 6c 6f 72 3d 22 23  nter" bgcolor="#
48b0: 64 36 64 36 65 38 22 3e 23 64 36 64 36 65 38 3c  d6d6e8">#d6d6e8<
48c0: 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74  /td></tr>.  @ <t
48d0: 72 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e  r><td align="cen
48e0: 74 65 72 22 20 62 67 63 6f 6c 6f 72 3d 22 23 64  ter" bgcolor="#d
48f0: 30 62 31 66 66 22 3e 23 64 30 62 31 66 66 3c 2f  0b1ff">#d0b1ff</
4900: 74 64 3e 0a 20 20 40 20 20 20 20 20 3c 74 64 20  td>.  @     <td 
4910: 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 20 62  align="center" b
4920: 67 63 6f 6c 6f 72 3d 22 23 64 32 63 30 64 62 22  gcolor="#d2c0db"
4930: 3e 23 64 32 63 30 64 62 3c 2f 74 64 3e 3c 2f 74  >#d2c0db</td></t
4940: 72 3e 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20 61  r>.  @ <tr><td a
4950: 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 20 62 67  lign="center" bg
4960: 63 6f 6c 6f 72 3d 22 23 62 62 62 62 62 62 22 3e  color="#bbbbbb">
4970: 23 62 62 62 62 62 62 3c 2f 74 64 3e 0a 20 20 40  #bbbbbb</td>.  @
4980: 20 20 20 20 20 3c 74 64 20 61 6c 69 67 6e 3d 22       <td align="
4990: 63 65 6e 74 65 72 22 20 62 67 63 6f 6c 6f 72 3d  center" bgcolor=
49a0: 22 23 64 30 64 30 64 30 22 3e 23 64 30 64 30 64  "#d0d0d0">#d0d0d
49b0: 30 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20  0</td></tr>.  @ 
49c0: 3c 2f 74 61 62 6c 65 3e 0a 20 20 40 20 3c 2f 62  </table>.  @ </b
49d0: 6c 6f 63 6b 71 75 6f 74 65 3e 0a 23 65 6e 64 69  lockquote>.#endi
49e0: 66 0a 20 20 40 20 3c 70 3e 54 6f 20 73 65 65 20  f.  @ <p>To see 
49f0: 74 68 65 20 54 49 43 4b 45 54 2e 44 45 53 43 52  the TICKET.DESCR
4a00: 49 50 54 49 4f 4e 20 61 6e 64 20 54 49 43 4b 45  IPTION and TICKE
4a10: 54 2e 52 45 4d 41 52 4b 53 20 66 69 65 6c 64 73  T.REMARKS fields
4a20: 2c 20 69 6e 63 6c 75 64 65 0a 20 20 40 20 74 68  , include.  @ th
4a30: 65 6d 20 61 73 20 74 68 65 20 6c 61 73 74 20 74  em as the last t
4a40: 77 6f 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  wo columns of th
4a50: 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
4a60: 20 67 69 76 65 6e 20 74 68 65 6d 20 6e 61 6d 65   given them name
4a70: 73 0a 20 20 40 20 74 68 61 74 20 62 65 67 69 6e  s.  @ that begin
4a80: 20 77 69 74 68 20 61 6e 20 75 6e 64 65 72 73 63   with an undersc
4a90: 6f 72 65 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  ore.  Like this:
4aa0: 3c 2f 70 3e 0a 20 20 40 20 3c 62 6c 6f 63 6b 71  </p>.  @ <blockq
4ab0: 75 6f 74 65 3e 3c 70 72 65 3e 0a 20 20 40 20 20  uote><pre>.  @  
4ac0: 53 45 4c 45 43 54 0a 20 20 40 20 20 20 20 74 6e  SELECT.  @    tn
4ad0: 20 41 53 20 27 23 27 2c 0a 20 20 40 20 20 20 20   AS '#',.  @    
4ae0: 74 79 70 65 20 41 53 20 27 54 79 70 65 27 2c 0a  type AS 'Type',.
4af0: 20 20 40 20 20 20 20 73 74 61 74 75 73 20 41 53    @    status AS
4b00: 20 27 53 74 61 74 75 73 27 2c 0a 20 20 40 20 20   'Status',.  @  
4b10: 20 20 73 64 61 74 65 28 6f 72 69 67 74 69 6d 65    sdate(origtime
4b20: 29 20 41 53 20 27 43 72 65 61 74 65 64 27 2c 0a  ) AS 'Created',.
4b30: 20 20 40 20 20 20 20 6f 77 6e 65 72 20 41 53 20    @    owner AS 
4b40: 27 42 79 27 2c 0a 20 20 40 20 20 20 20 73 75 62  'By',.  @    sub
4b50: 73 79 73 74 65 6d 20 41 53 20 27 53 75 62 73 79  system AS 'Subsy
4b60: 73 27 2c 0a 20 20 40 20 20 20 20 73 64 61 74 65  s',.  @    sdate
4b70: 28 63 68 61 6e 67 65 74 69 6d 65 29 20 41 53 20  (changetime) AS 
4b80: 27 43 68 61 6e 67 65 64 27 2c 0a 20 20 40 20 20  'Changed',.  @  
4b90: 20 20 61 73 73 69 67 6e 65 64 74 6f 20 41 53 20    assignedto AS 
4ba0: 27 41 73 73 69 67 6e 65 64 27 2c 0a 20 20 40 20  'Assigned',.  @ 
4bb0: 20 20 20 73 65 76 65 72 69 74 79 20 41 53 20 27     severity AS '
4bc0: 53 76 72 27 2c 0a 20 20 40 20 20 20 20 70 72 69  Svr',.  @    pri
4bd0: 6f 72 69 74 79 20 41 53 20 27 50 72 69 27 2c 0a  ority AS 'Pri',.
4be0: 20 20 40 20 20 20 20 74 69 74 6c 65 20 41 53 20    @    title AS 
4bf0: 27 54 69 74 6c 65 27 2c 0a 20 20 40 20 20 20 20  'Title',.  @    
4c00: 64 65 73 63 72 69 70 74 69 6f 6e 20 41 53 20 27  description AS '
4c10: 5f 44 65 73 63 72 69 70 74 69 6f 6e 27 2c 20 20  _Description',  
4c20: 20 2d 2d 20 57 68 65 6e 20 74 68 65 20 63 6f 6c   -- When the col
4c30: 75 6d 6e 20 6e 61 6d 65 20 62 65 67 69 6e 73 20  umn name begins 
4c40: 77 69 74 68 20 27 5f 27 0a 20 20 40 20 20 20 20  with '_'.  @    
4c50: 72 65 6d 61 72 6b 73 20 41 53 20 27 5f 52 65 6d  remarks AS '_Rem
4c60: 61 72 6b 73 27 20 20 20 20 20 20 20 20 20 20 20  arks'           
4c70: 20 2d 2d 20 74 68 65 20 64 61 74 61 20 69 73 20   -- the data is 
4c80: 73 68 6f 77 6e 20 6f 6e 20 61 20 73 65 70 61 72  shown on a separ
4c90: 61 74 65 20 72 6f 77 2e 0a 20 20 40 20 20 46 52  ate row..  @  FR
4ca0: 4f 4d 20 74 69 63 6b 65 74 0a 20 20 40 20 3c 2f  OM ticket.  @ </
4cb0: 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65  pre></blockquote
4cc0: 3e 0a 20 20 40 0a 20 20 40 20 3c 70 3e 4f 72 2c  >.  @.  @ <p>Or,
4cd0: 20 74 6f 20 73 65 65 20 70 61 72 74 20 6f 66 20   to see part of 
4ce0: 74 68 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20  the description 
4cf0: 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2c  on the same row,
4d00: 20 75 73 65 20 74 68 65 0a 20 20 40 20 3c 62 3e   use the.  @ <b>
4d10: 77 69 6b 69 28 29 3c 2f 62 3e 20 66 75 6e 63 74  wiki()</b> funct
4d20: 69 6f 6e 20 77 69 74 68 20 73 6f 6d 65 20 73 74  ion with some st
4d30: 72 69 6e 67 20 6d 61 6e 69 70 75 6c 61 74 69 6f  ring manipulatio
4d40: 6e 2e 20 55 73 69 6e 67 20 74 68 65 0a 20 20 40  n. Using the.  @
4d50: 20 3c 62 3e 74 6b 74 28 29 3c 2f 62 3e 20 66 75   <b>tkt()</b> fu
4d60: 6e 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 74 69  nction on the ti
4d70: 63 6b 65 74 20 6e 75 6d 62 65 72 20 77 69 6c 6c  cket number will
4d80: 20 61 6c 73 6f 20 67 65 6e 65 72 61 74 65 20 61   also generate a
4d90: 20 6c 69 6e 6b 65 64 0a 20 20 40 20 66 69 65 6c   linked.  @ fiel
4da0: 64 2c 20 62 75 74 20 77 69 74 68 6f 75 74 20 74  d, but without t
4db0: 68 65 20 65 78 74 72 61 20 3c 69 3e 65 64 69 74  he extra <i>edit
4dc0: 3c 2f 69 3e 20 63 6f 6c 75 6d 6e 3a 0a 20 20 40  </i> column:.  @
4dd0: 20 3c 2f 70 3e 0a 20 20 40 20 3c 62 6c 6f 63 6b   </p>.  @ <block
4de0: 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 20 20 40 20  quote><pre>.  @ 
4df0: 20 53 45 4c 45 43 54 0a 20 20 40 20 20 20 20 74   SELECT.  @    t
4e00: 6b 74 28 74 6e 29 20 41 53 20 27 27 2c 0a 20 20  kt(tn) AS '',.  
4e10: 40 20 20 20 20 74 69 74 6c 65 20 41 53 20 27 54  @    title AS 'T
4e20: 69 74 6c 65 27 2c 0a 20 20 40 20 20 20 20 77 69  itle',.  @    wi
4e30: 6b 69 28 73 75 62 73 74 72 28 64 65 73 63 72 69  ki(substr(descri
4e40: 70 74 69 6f 6e 2c 30 2c 38 30 29 29 20 41 53 20  ption,0,80)) AS 
4e50: 27 44 65 73 63 72 69 70 74 69 6f 6e 27 0a 20 20  'Description'.  
4e60: 40 20 20 46 52 4f 4d 20 74 69 63 6b 65 74 0a 20  @  FROM ticket. 
4e70: 20 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b   @ </pre></block
4e80: 71 75 6f 74 65 3e 0a 20 20 40 0a 7d 0a 0a 23 69  quote>.  @.}..#i
4e90: 66 20 30 20 2f 2a 20 4e 4f 54 20 55 53 45 44 20  f 0 /* NOT USED 
4ea0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
4eb0: 6f 6c 75 6d 6e 5f 68 65 61 64 65 72 28 69 6e 74  olumn_header(int
4ec0: 20 72 6e 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a   rn,const char *
4ed0: 7a 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20  zCol, int nCol, 
4ee0: 69 6e 74 20 6e 53 6f 72 74 65 64 2c 0a 20 20 20  int nSorted,.   
4ef0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
4f00: 72 65 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 20 63  rection, const c
4f10: 68 61 72 20 2a 7a 45 78 74 72 61 0a 29 7b 0a 20  har *zExtra.){. 
4f20: 20 69 6e 74 20 73 65 74 20 3d 20 28 6e 43 6f 6c   int set = (nCol
4f30: 3d 3d 6e 53 6f 72 74 65 64 29 3b 0a 20 20 69 6e  ==nSorted);.  in
4f40: 74 20 64 65 73 63 20 3d 20 21 73 74 72 63 6d 70  t desc = !strcmp
4f50: 28 7a 44 69 72 65 63 74 69 6f 6e 2c 22 44 45 53  (zDirection,"DES
4f60: 43 22 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  C");..  /*.  ** 
4f70: 43 6c 69 63 6b 69 6e 67 20 73 61 6d 65 20 63 6f  Clicking same co
4f80: 6c 75 6d 6e 20 68 65 61 64 65 72 20 33 20 74 69  lumn header 3 ti
4f90: 6d 65 73 20 69 6e 20 61 20 72 6f 77 20 72 65 73  mes in a row res
4fa0: 65 74 73 20 61 6e 79 20 73 6f 72 74 69 6e 67 2e  ets any sorting.
4fb0: 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
4fc0: 77 65 20 6c 69 6e 6b 20 74 6f 20 72 70 74 76 69  we link to rptvi
4fd0: 65 77 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  ew, which means 
4fe0: 65 6d 62 65 64 64 65 64 20 72 65 70 6f 72 74 73  embedded reports
4ff0: 20 77 69 6c 6c 20 67 65 74 0a 20 20 2a 2a 20 73   will get.  ** s
5000: 65 6e 74 20 74 6f 20 74 68 65 20 61 63 74 75 61  ent to the actua
5010: 6c 20 72 65 70 6f 72 74 20 76 69 65 77 20 70 61  l report view pa
5020: 67 65 20 61 73 20 73 6f 6f 6e 20 61 73 20 61 20  ge as soon as a 
5030: 75 73 65 72 20 74 72 69 65 73 20 74 6f 20 64 6f  user tries to do
5040: 0a 20 20 2a 2a 20 61 6e 79 20 73 6f 72 74 69 6e  .  ** any sortin
5050: 67 2e 20 49 20 64 6f 6e 27 74 20 73 65 65 20 74  g. I don't see t
5060: 68 61 74 20 61 73 20 61 20 42 61 64 20 54 68 69  hat as a Bad Thi
5070: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 73 65  ng..  */.  if(se
5080: 74 20 26 26 20 64 65 73 63 29 7b 0a 20 20 20 20  t && desc){.    
5090: 40 20 3c 74 68 20 62 67 63 6f 6c 6f 72 3d 22 25  @ <th bgcolor="%
50a0: 73 28 42 47 31 29 22 20 63 6c 61 73 73 3d 22 62  s(BG1)" class="b
50b0: 6b 67 6e 64 31 22 3e 0a 20 20 20 20 40 20 20 20  kgnd1">.    @   
50c0: 3c 61 20 68 72 65 66 3d 22 72 70 74 76 69 65 77  <a href="rptview
50d0: 3f 72 6e 3d 25 64 28 72 6e 29 25 73 28 7a 45 78  ?rn=%d(rn)%s(zEx
50e0: 74 72 61 29 22 3e 25 68 28 7a 43 6f 6c 29 3c 2f  tra)">%h(zCol)</
50f0: 61 3e 3c 2f 74 68 3e 0a 20 20 7d 65 6c 73 65 7b  a></th>.  }else{
5100: 0a 20 20 20 20 69 66 28 73 65 74 29 7b 0a 20 20  .    if(set){.  
5110: 20 20 20 20 40 20 3c 74 68 20 62 67 63 6f 6c 6f      @ <th bgcolo
5120: 72 3d 22 25 73 28 42 47 31 29 22 20 63 6c 61 73  r="%s(BG1)" clas
5130: 73 3d 22 62 6b 67 6e 64 31 22 3e 3c 61 0a 20 20  s="bkgnd1"><a.  
5140: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40    }else{.      @
5150: 20 3c 74 68 3e 3c 61 0a 20 20 20 20 7d 0a 20 20   <th><a.    }.  
5160: 20 20 40 20 68 72 65 66 3d 22 72 70 74 76 69 65    @ href="rptvie
5170: 77 3f 72 6e 3d 25 64 28 72 6e 29 26 61 6d 70 3b  w?rn=%d(rn)&amp;
5180: 6f 72 64 65 72 5f 62 79 3d 25 64 28 6e 43 6f 6c  order_by=%d(nCol
5190: 29 26 61 6d 70 3b 5c 0a 20 20 20 20 40 20 6f 72  )&amp;\.    @ or
51a0: 64 65 72 5f 64 69 72 3d 25 73 28 64 65 73 63 3f  der_dir=%s(desc?
51b0: 22 41 53 43 22 3a 22 44 45 53 43 22 29 5c 0a 20  "ASC":"DESC")\. 
51c0: 20 20 20 40 20 25 73 28 7a 45 78 74 72 61 29 22     @ %s(zExtra)"
51d0: 3e 25 68 28 7a 43 6f 6c 29 3c 2f 61 3e 3c 2f 74  >%h(zCol)</a></t
51e0: 68 3e 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  h>.  }.}.#endif.
51f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65  ./*.** The state
5200: 20 6f 66 20 74 68 65 20 72 65 70 6f 72 74 20 67   of the report g
5210: 65 6e 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  eneration..*/.st
5220: 72 75 63 74 20 47 65 6e 65 72 61 74 65 48 54 4d  ruct GenerateHTM
5230: 4c 20 7b 0a 20 20 69 6e 74 20 72 6e 3b 20 20 20  L {.  int rn;   
5240: 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
5250: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
5260: 20 6e 43 6f 75 6e 74 3b 20 20 20 20 20 20 2f 2a   nCount;      /*
5270: 20 52 6f 77 20 6e 75 6d 62 65 72 20 2a 2f 0a 20   Row number */. 
5280: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
5290: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
52a0: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
52b0: 69 73 4d 75 6c 74 69 72 6f 77 3b 20 20 2f 2a 20  isMultirow;  /* 
52c0: 54 72 75 65 20 69 66 20 6d 75 6c 74 69 70 6c 65  True if multiple
52d0: 20 74 61 62 6c 65 20 72 6f 77 73 20 70 65 72 20   table rows per 
52e0: 71 75 65 72 79 20 72 65 73 75 6c 74 20 72 6f 77  query result row
52f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 52 6f   */.  int iNewRo
5300: 77 3b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  w;     /* Index 
5310: 6f 66 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  of first column 
5320: 74 68 61 74 20 67 6f 65 73 20 6f 6e 20 73 65 70  that goes on sep
5330: 61 72 61 74 65 20 72 6f 77 20 2a 2f 0a 20 20 69  arate row */.  i
5340: 6e 74 20 69 42 67 3b 20 20 20 20 20 20 20 20 20  nt iBg;         
5350: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
5360: 6d 6e 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  mn that defines 
5370: 62 61 63 6b 67 72 6f 75 6e 64 20 63 6f 6c 6f 72  background color
5380: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
5390: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
53a0: 69 6f 6e 20 66 6f 72 20 64 62 5f 71 75 65 72 79  ion for db_query
53b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
53c0: 65 6e 65 72 61 74 65 5f 68 74 6d 6c 28 0a 20 20  enerate_html(.  
53d0: 76 6f 69 64 20 2a 70 55 73 65 72 2c 20 20 20 20  void *pUser,    
53e0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
53f0: 75 74 70 75 74 20 73 74 61 74 65 20 2a 2f 0a 20  utput state */. 
5400: 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
5410: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
5420: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 72  olumns in this r
5430: 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 63  esult row */.  c
5440: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
5450: 2f 2a 20 54 65 78 74 20 6f 66 20 64 61 74 61 20  /* Text of data 
5460: 69 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 2a  in all columns *
5470: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 4e 61 6d  /.  char **azNam
5480: 65 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20 6f 66  e    /* Names of
5490: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a   the columns */.
54a0: 29 7b 0a 20 20 73 74 72 75 63 74 20 47 65 6e 65  ){.  struct Gene
54b0: 72 61 74 65 48 54 4d 4c 20 2a 70 53 74 61 74 65  rateHTML *pState
54c0: 20 3d 20 28 73 74 72 75 63 74 20 47 65 6e 65 72   = (struct Gener
54d0: 61 74 65 48 54 4d 4c 2a 29 70 55 73 65 72 3b 0a  ateHTML*)pUser;.
54e0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
54f0: 20 63 68 61 72 20 2a 7a 54 69 64 3b 20 20 2f 2a   char *zTid;  /*
5500: 20 54 69 63 6b 65 74 20 55 55 49 44 2e 20 20 28   Ticket UUID.  (
5510: 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20  value of column 
5520: 6e 61 6d 65 64 20 27 23 27 29 20 2a 2f 0a 20 20  named '#') */.  
5530: 69 6e 74 20 72 6e 3b 20 20 20 20 20 20 20 20 20  int rn;         
5540: 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6e 75 6d     /* Report num
5550: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
5560: 42 67 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 55  Bg = 0;     /* U
5570: 73 65 20 74 68 69 73 20 62 61 63 6b 67 72 6f 75  se this backgrou
5580: 6e 64 20 63 6f 6c 6f 72 20 2a 2f 0a 20 20 63 68  nd color */.  ch
5590: 61 72 20 7a 50 61 67 65 5b 33 30 5d 3b 20 20 20  ar zPage[30];   
55a0: 20 2f 2a 20 54 65 78 74 20 76 65 72 73 69 6f 6e   /* Text version
55b0: 20 6f 66 20 74 68 65 20 74 69 63 6b 65 74 20 6e   of the ticket n
55c0: 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  umber */.  char 
55d0: 2a 77 69 6b 69 5f 70 72 65 66 69 78 20 3d 20 22  *wiki_prefix = "
55e0: 5f 77 69 6b 69 5f 22 3b 0a 20 20 69 6e 74 20 77  _wiki_";.  int w
55f0: 69 6b 69 5f 70 72 65 66 69 78 5f 6c 65 6e 20 3d  iki_prefix_len =
5600: 20 73 74 72 6c 65 6e 28 77 69 6b 69 5f 70 72 65   strlen(wiki_pre
5610: 66 69 78 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  fix);..  /* Get 
5620: 74 68 65 20 72 65 70 6f 72 74 20 6e 75 6d 62 65  the report numbe
5630: 72 0a 20 20 2a 2f 0a 20 20 72 6e 20 3d 20 70 53  r.  */.  rn = pS
5640: 74 61 74 65 2d 3e 72 6e 3b 0a 0a 20 20 2f 2a 20  tate->rn;..  /* 
5650: 44 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  Do initializatio
5660: 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 74  n.  */.  if( pSt
5670: 61 74 65 2d 3e 6e 43 6f 75 6e 74 3d 3d 30 20 29  ate->nCount==0 )
5680: 7b 0a 20 20 20 20 2f 2a 20 54 75 72 6e 20 6f 66  {.    /* Turn of
5690: 66 20 74 68 65 20 61 75 74 68 6f 72 69 7a 65 72  f the authorizer
56a0: 2e 20 20 49 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  .  It is no long
56b0: 65 72 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  er doing anythin
56c0: 67 20 73 69 6e 63 65 20 74 68 65 0a 20 20 20 20  g since the.    
56d0: 2a 2a 20 71 75 65 72 79 20 68 61 73 20 61 6c 72  ** query has alr
56e0: 65 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72  eady been prepar
56f0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
5700: 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
5710: 72 69 7a 65 72 28 67 2e 64 62 2c 20 30 2c 20 30  rizer(g.db, 0, 0
5720: 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72  );..    /* Figur
5730: 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72  e out the number
5740: 20 6f 66 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65   of columns, the
5750: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 64 65 74   column that det
5760: 65 72 6d 69 6e 65 73 20 62 61 63 6b 67 72 6f 75  ermines backgrou
5770: 6e 64 0a 20 20 20 20 2a 2a 20 63 6f 6c 6f 72 2c  nd.    ** color,
5780: 20 61 6e 64 20 77 68 65 74 68 65 72 20 6f 72 20   and whether or 
5790: 6e 6f 74 20 74 68 69 73 20 72 6f 77 20 6f 66 20  not this row of 
57a0: 64 61 74 61 20 69 73 20 72 65 70 72 65 73 65 6e  data is represen
57b0: 74 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a  ted by multiple.
57c0: 20 20 20 20 2a 2a 20 72 6f 77 73 20 69 6e 20 74      ** rows in t
57d0: 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
57e0: 0a 20 20 20 20 70 53 74 61 74 65 2d 3e 6e 43 6f  .    pState->nCo
57f0: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 74  l = 0;.    pStat
5800: 65 2d 3e 69 73 4d 75 6c 74 69 72 6f 77 20 3d 20  e->isMultirow = 
5810: 30 3b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e 69  0;.    pState->i
5820: 4e 65 77 52 6f 77 20 3d 20 2d 31 3b 0a 20 20 20  NewRow = -1;.   
5830: 20 70 53 74 61 74 65 2d 3e 69 42 67 20 3d 20 2d   pState->iBg = -
5840: 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  1;.    for(i=0; 
5850: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
5860: 20 20 20 20 69 66 28 20 61 7a 4e 61 6d 65 5b 69      if( azName[i
5870: 5d 5b 30 5d 3d 3d 27 62 27 20 26 26 20 73 74 72  ][0]=='b' && str
5880: 63 6d 70 28 61 7a 4e 61 6d 65 5b 69 5d 2c 22 62  cmp(azName[i],"b
5890: 67 63 6f 6c 6f 72 22 29 3d 3d 30 20 29 7b 0a 20  gcolor")==0 ){. 
58a0: 20 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 69         pState->i
58b0: 42 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  Bg = i;.        
58c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
58d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 67 2e 6f 6b  }.      if( g.ok
58e0: 57 72 69 74 65 20 26 26 20 61 7a 4e 61 6d 65 5b  Write && azName[
58f0: 69 5d 5b 30 5d 3d 3d 27 23 27 20 29 7b 0a 20 20  i][0]=='#' ){.  
5900: 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 6e 43        pState->nC
5910: 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ol++;.      }.  
5920: 20 20 20 20 69 66 28 20 21 70 53 74 61 74 65 2d      if( !pState-
5930: 3e 69 73 4d 75 6c 74 69 72 6f 77 20 29 7b 0a 20  >isMultirow ){. 
5940: 20 20 20 20 20 20 20 69 66 28 20 61 7a 4e 61 6d         if( azNam
5950: 65 5b 69 5d 5b 30 5d 3d 3d 27 5f 27 20 26 26 20  e[i][0]=='_' && 
5960: 73 74 72 6e 63 6d 70 28 61 7a 4e 61 6d 65 5b 69  strncmp(azName[i
5970: 5d 2c 77 69 6b 69 5f 70 72 65 66 69 78 2c 77 69  ],wiki_prefix,wi
5980: 6b 69 5f 70 72 65 66 69 78 5f 6c 65 6e 29 21 3d  ki_prefix_len)!=
5990: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
59a0: 53 74 61 74 65 2d 3e 69 73 4d 75 6c 74 69 72 6f  State->isMultiro
59b0: 77 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  w = 1;.         
59c0: 20 70 53 74 61 74 65 2d 3e 69 4e 65 77 52 6f 77   pState->iNewRow
59d0: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 7d 65   = i;.        }e
59e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
59f0: 53 74 61 74 65 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20  State->nCol++;. 
5a00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5a10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
5a20: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
5a30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
5a40: 6c 6c 65 64 2c 20 6f 75 74 70 75 74 20 61 20 74  lled, output a t
5a50: 61 62 6c 65 20 68 65 61 64 65 72 0a 20 20 20 20  able header.    
5a60: 2a 2f 0a 20 20 20 20 40 20 3c 74 72 3e 0a 20 20  */.    @ <tr>.  
5a70: 20 20 7a 54 69 64 20 3d 20 30 3b 0a 20 20 20 20    zTid = 0;.    
5a80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
5a90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   i++){.      cha
5aa0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 61 7a 4e 61 6d  r *zName = azNam
5ab0: 65 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  e[i];.      if( 
5ac0: 69 3d 3d 70 53 74 61 74 65 2d 3e 69 42 67 20 29  i==pState->iBg )
5ad0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
5ae0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 4e   if( strncmp(azN
5af0: 61 6d 65 5b 69 5d 2c 77 69 6b 69 5f 70 72 65 66  ame[i],wiki_pref
5b00: 69 78 2c 77 69 6b 69 5f 70 72 65 66 69 78 5f 6c  ix,wiki_prefix_l
5b10: 65 6e 29 3d 3d 30 20 29 20 7a 4e 61 6d 65 2b 3d  en)==0 ) zName+=
5b20: 77 69 6b 69 5f 70 72 65 66 69 78 5f 6c 65 6e 3b  wiki_prefix_len;
5b30: 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 61 74  .      if( pStat
5b40: 65 2d 3e 69 4e 65 77 52 6f 77 3e 3d 30 20 26 26  e->iNewRow>=0 &&
5b50: 20 69 3e 3d 70 53 74 61 74 65 2d 3e 69 4e 65 77   i>=pState->iNew
5b60: 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Row ){.        i
5b70: 66 28 20 67 2e 6f 6b 57 72 69 74 65 20 26 26 20  f( g.okWrite && 
5b80: 7a 54 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  zTid ){.        
5b90: 20 20 40 20 3c 74 68 3e 26 6e 62 73 70 3b 3c 2f    @ <th>&nbsp;</
5ba0: 74 68 3e 0a 20 20 20 20 20 20 20 20 20 20 7a 54  th>.          zT
5bb0: 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  id = 0;.        
5bc0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  }.        if( zN
5bd0: 61 6d 65 5b 30 5d 3d 3d 27 5f 27 20 29 20 7a 4e  ame[0]=='_' ) zN
5be0: 61 6d 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 40  ame++;.        @
5bf0: 20 3c 2f 74 72 3e 3c 74 72 3e 3c 74 68 20 63 6f   </tr><tr><th co
5c00: 6c 73 70 61 6e 3d 25 64 28 70 53 74 61 74 65 2d  lspan=%d(pState-
5c10: 3e 6e 43 6f 6c 29 3e 25 68 28 7a 4e 61 6d 65 29  >nCol)>%h(zName)
5c20: 3c 2f 74 68 3e 0a 20 20 20 20 20 20 7d 65 6c 73  </th>.      }els
5c30: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  e{.        if( z
5c40: 4e 61 6d 65 5b 30 5d 3d 3d 27 23 27 20 29 7b 0a  Name[0]=='#' ){.
5c50: 20 20 20 20 20 20 20 20 20 20 7a 54 69 64 20 3d            zTid =
5c60: 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20   zName;.        
5c70: 7d 0a 20 20 20 20 20 20 20 20 40 20 3c 74 68 3e  }.        @ <th>
5c80: 25 68 28 7a 4e 61 6d 65 29 3c 2f 74 68 3e 0a 20  %h(zName)</th>. 
5c90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5ca0: 20 69 66 28 20 67 2e 6f 6b 57 72 69 74 65 20 26   if( g.okWrite &
5cb0: 26 20 7a 54 69 64 20 29 7b 0a 20 20 20 20 20 20  & zTid ){.      
5cc0: 40 20 3c 74 68 3e 26 6e 62 73 70 3b 3c 2f 74 68  @ <th>&nbsp;</th
5cd0: 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 3c 2f  >.    }.    @ </
5ce0: 74 72 3e 0a 20 20 7d 0a 20 20 69 66 28 20 61 7a  tr>.  }.  if( az
5cf0: 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 40 20  Arg==0 ){.    @ 
5d00: 3c 74 72 3e 3c 74 64 20 63 6f 6c 73 70 61 6e 3d  <tr><td colspan=
5d10: 22 25 64 28 70 53 74 61 74 65 2d 3e 6e 43 6f 6c  "%d(pState->nCol
5d20: 29 22 3e 0a 20 20 20 20 40 20 3c 69 3e 4e 6f 20  )">.    @ <i>No 
5d30: 72 65 63 6f 72 64 73 20 6d 61 74 63 68 20 74 68  records match th
5d40: 65 20 72 65 70 6f 72 74 20 63 72 69 74 65 72 69  e report criteri
5d50: 61 3c 2f 69 3e 0a 20 20 20 20 40 20 3c 2f 74 64  a</i>.    @ </td
5d60: 3e 3c 2f 74 72 3e 0a 20 20 20 20 72 65 74 75 72  ></tr>.    retur
5d70: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2b 2b 70 53 74  n 0;.  }.  ++pSt
5d80: 61 74 65 2d 3e 6e 43 6f 75 6e 74 3b 0a 0a 20 20  ate->nCount;..  
5d90: 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73 65  /* Output the se
5da0: 70 61 72 61 74 6f 72 20 61 62 6f 76 65 20 65 61  parator above ea
5db0: 63 68 20 65 6e 74 72 79 20 69 6e 20 61 20 74 61  ch entry in a ta
5dc0: 62 6c 65 20 77 68 69 63 68 20 68 61 73 20 6d 75  ble which has mu
5dd0: 6c 74 69 70 6c 65 20 6c 69 6e 65 73 0a 20 20 2a  ltiple lines.  *
5de0: 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20 65  * per database e
5df0: 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ntry..  */.  if(
5e00: 20 70 53 74 61 74 65 2d 3e 69 4e 65 77 52 6f 77   pState->iNewRow
5e10: 3e 3d 30 20 29 7b 0a 20 20 20 20 40 20 3c 74 72  >=0 ){.    @ <tr
5e20: 3e 3c 74 64 20 63 6f 6c 73 70 61 6e 3d 25 64 28  ><td colspan=%d(
5e30: 70 53 74 61 74 65 2d 3e 6e 43 6f 6c 29 3e 3c 66  pState->nCol)><f
5e40: 6f 6e 74 20 73 69 7a 65 3d 31 3e 26 6e 62 73 70  ont size=1>&nbsp
5e50: 3b 3c 2f 66 6f 6e 74 3e 3c 2f 74 64 3e 3c 2f 74  ;</font></td></t
5e60: 72 3e 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74  r>.  }..  /* Out
5e70: 70 75 74 20 74 68 65 20 64 61 74 61 20 66 6f 72  put the data for
5e80: 20 74 68 69 73 20 65 6e 74 72 79 20 66 72 6f 6d   this entry from
5e90: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
5ea0: 2a 2f 0a 20 20 7a 42 67 20 3d 20 70 53 74 61 74  */.  zBg = pStat
5eb0: 65 2d 3e 69 42 67 3e 3d 30 20 3f 20 61 7a 41 72  e->iBg>=0 ? azAr
5ec0: 67 5b 70 53 74 61 74 65 2d 3e 69 42 67 5d 20 3a  g[pState->iBg] :
5ed0: 20 30 3b 0a 20 20 69 66 28 20 7a 42 67 3d 3d 30   0;.  if( zBg==0
5ee0: 20 29 20 7a 42 67 20 3d 20 22 77 68 69 74 65 22   ) zBg = "white"
5ef0: 3b 0a 20 20 40 20 3c 74 72 20 62 67 63 6f 6c 6f  ;.  @ <tr bgcolo
5f00: 72 3d 22 25 68 28 7a 42 67 29 22 3e 0a 20 20 7a  r="%h(zBg)">.  z
5f10: 54 69 64 20 3d 20 30 3b 0a 20 20 7a 50 61 67 65  Tid = 0;.  zPage
5f20: 5b 30 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  [0] = 0;.  for(i
5f30: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
5f40: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 61 74  {.    char *zDat
5f50: 61 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 53  a;.    if( i==pS
5f60: 74 61 74 65 2d 3e 69 42 67 20 29 20 63 6f 6e 74  tate->iBg ) cont
5f70: 69 6e 75 65 3b 0a 20 20 20 20 7a 44 61 74 61 20  inue;.    zData 
5f80: 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
5f90: 69 66 28 20 7a 44 61 74 61 3d 3d 30 20 29 20 7a  if( zData==0 ) z
5fa0: 44 61 74 61 20 3d 20 22 22 3b 0a 20 20 20 20 69  Data = "";.    i
5fb0: 66 28 20 70 53 74 61 74 65 2d 3e 69 4e 65 77 52  f( pState->iNewR
5fc0: 6f 77 3e 3d 30 20 26 26 20 69 3e 3d 70 53 74 61  ow>=0 && i>=pSta
5fd0: 74 65 2d 3e 69 4e 65 77 52 6f 77 20 29 7b 0a 20  te->iNewRow ){. 
5fe0: 20 20 20 20 20 69 66 28 20 7a 54 69 64 20 26 26       if( zTid &&
5ff0: 20 67 2e 6f 6b 57 72 69 74 65 20 29 7b 0a 20 20   g.okWrite ){.  
6000: 20 20 20 20 20 20 40 20 3c 74 64 20 76 61 6c 69        @ <td vali
6010: 67 6e 3d 22 74 6f 70 22 3e 3c 61 20 68 72 65 66  gn="top"><a href
6020: 3d 22 74 6b 74 65 64 69 74 2f 25 68 28 7a 54 69  ="tktedit/%h(zTi
6030: 64 29 22 3e 65 64 69 74 3c 2f 61 3e 3c 2f 74 64  d)">edit</a></td
6040: 3e 0a 20 20 20 20 20 20 20 20 7a 54 69 64 20 3d  >.        zTid =
6050: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
6060: 20 20 69 66 28 20 7a 44 61 74 61 5b 30 5d 20 29    if( zData[0] )
6070: 7b 0a 20 20 20 20 20 20 20 20 42 6c 6f 62 20 63  {.        Blob c
6080: 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  ontent;.        
6090: 40 20 3c 2f 74 72 3e 3c 74 72 20 62 67 63 6f 6c  @ </tr><tr bgcol
60a0: 6f 72 3d 22 25 68 28 7a 42 67 29 22 3e 3c 74 64  or="%h(zBg)"><td
60b0: 20 63 6f 6c 73 70 61 6e 3d 25 64 28 70 53 74 61   colspan=%d(pSta
60c0: 74 65 2d 3e 6e 43 6f 6c 29 3e 0a 20 20 20 20 20  te->nCol)>.     
60d0: 20 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 63 6f     blob_init(&co
60e0: 6e 74 65 6e 74 2c 20 7a 44 61 74 61 2c 20 2d 31  ntent, zData, -1
60f0: 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6b 69 5f  );.        wiki_
6100: 63 6f 6e 76 65 72 74 28 26 63 6f 6e 74 65 6e 74  convert(&content
6110: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
6120: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 6f 6e   blob_reset(&con
6130: 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tent);.      }. 
6140: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 7a 4e     }else if( azN
6150: 61 6d 65 5b 69 5d 5b 30 5d 3d 3d 27 23 27 20 29  ame[i][0]=='#' )
6160: 7b 0a 20 20 20 20 20 20 7a 54 69 64 20 3d 20 7a  {.      zTid = z
6170: 44 61 74 61 3b 0a 20 20 20 20 20 20 69 66 28 20  Data;.      if( 
6180: 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20  g.okHistory ){. 
6190: 20 20 20 20 20 20 20 40 20 3c 74 64 20 76 61 6c         @ <td val
61a0: 69 67 6e 3d 22 74 6f 70 22 3e 3c 61 20 68 72 65  ign="top"><a hre
61b0: 66 3d 22 74 6b 74 76 69 65 77 3f 6e 61 6d 65 3d  f="tktview?name=
61c0: 25 68 28 7a 44 61 74 61 29 22 3e 25 68 28 7a 44  %h(zData)">%h(zD
61d0: 61 74 61 29 3c 2f 61 3e 3c 2f 74 64 3e 0a 20 20  ata)</a></td>.  
61e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
61f0: 20 20 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d     @ <td valign=
6200: 22 74 6f 70 22 3e 25 68 28 7a 44 61 74 61 29 3c  "top">%h(zData)<
6210: 2f 74 64 3e 0a 20 20 20 20 20 20 7d 0a 20 20 20  /td>.      }.   
6220: 20 7d 65 6c 73 65 20 69 66 28 20 61 7a 4e 61 6d   }else if( azNam
6230: 65 5b 69 5d 5b 30 5d 3d 3d 27 5f 27 20 26 26 20  e[i][0]=='_' && 
6240: 73 74 72 6e 63 6d 70 28 61 7a 4e 61 6d 65 5b 69  strncmp(azName[i
6250: 5d 2c 77 69 6b 69 5f 70 72 65 66 69 78 2c 77 69  ],wiki_prefix,wi
6260: 6b 69 5f 70 72 65 66 69 78 5f 6c 65 6e 29 3d 3d  ki_prefix_len)==
6270: 30 20 29 20 7b 0a 20 20 20 20 20 20 20 20 42 6c  0 ) {.        Bl
6280: 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 20 20  ob content;.    
6290: 20 20 20 20 40 20 3c 74 64 3e 0a 20 20 20 20 20      @ <td>.     
62a0: 20 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 63 6f     blob_init(&co
62b0: 6e 74 65 6e 74 2c 20 7a 44 61 74 61 2c 20 2d 31  ntent, zData, -1
62c0: 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6b 69 5f  );.        wiki_
62d0: 63 6f 6e 76 65 72 74 28 26 63 6f 6e 74 65 6e 74  convert(&content
62e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
62f0: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 6f 6e   blob_reset(&con
6300: 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 40  tent);.        @
6310: 20 3c 2f 74 64 3e 0a 20 20 20 20 7d 65 6c 73 65   </td>.    }else
6320: 20 69 66 28 20 7a 44 61 74 61 5b 30 5d 3d 3d 30   if( zData[0]==0
6330: 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 74 64 20   ){.      @ <td 
6340: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 26 6e 62  valign="top">&nb
6350: 73 70 3b 3c 2f 74 64 3e 0a 20 20 20 20 7d 65 6c  sp;</td>.    }el
6360: 73 65 7b 0a 20 20 20 20 20 20 40 20 3c 74 64 20  se{.      @ <td 
6370: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20  valign="top">.  
6380: 20 20 20 20 40 20 25 68 28 7a 44 61 74 61 29 0a      @ %h(zData).
6390: 20 20 20 20 20 20 40 20 3c 2f 74 64 3e 0a 20 20        @ </td>.  
63a0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54    }.  }.  if( zT
63b0: 69 64 20 26 26 20 67 2e 6f 6b 57 72 69 74 65 20  id && g.okWrite 
63c0: 29 7b 0a 20 20 20 20 40 20 3c 74 64 20 76 61 6c  ){.    @ <td val
63d0: 69 67 6e 3d 22 74 6f 70 22 3e 3c 61 20 68 72 65  ign="top"><a hre
63e0: 66 3d 22 74 6b 74 65 64 69 74 2f 25 68 28 7a 54  f="tktedit/%h(zT
63f0: 69 64 29 22 3e 65 64 69 74 3c 2f 61 3e 3c 2f 74  id)">edit</a></t
6400: 64 3e 0a 20 20 7d 0a 20 20 40 20 3c 2f 74 72 3e  d>.  }.  @ </tr>
6410: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
6420: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65  /*.** Output the
6430: 20 74 65 78 74 20 67 69 76 65 6e 20 69 6e 20 74   text given in t
6440: 68 65 20 61 72 67 75 6d 65 6e 74 2e 20 20 43 6f  he argument.  Co
6450: 6e 76 65 72 74 20 74 61 62 73 20 61 6e 64 20 6e  nvert tabs and n
6460: 65 77 6c 69 6e 65 73 20 69 6e 74 6f 0a 2a 2a 20  ewlines into.** 
6470: 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  spaces..*/.stati
6480: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 6e 6f  c void output_no
6490: 5f 74 61 62 73 28 63 6f 6e 73 74 20 63 68 61 72  _tabs(const char
64a0: 20 2a 7a 29 7b 0a 20 20 77 68 69 6c 65 28 20 7a   *z){.  while( z
64b0: 20 26 26 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20   && z[0] ){.    
64c0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f  int i, j;.    fo
64d0: 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 28  r(i=0; z[i] && (
64e0: 21 69 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 7c  !isspace(z[i]) |
64f0: 7c 20 7a 5b 69 5d 3d 3d 27 20 27 29 3b 20 69 2b  | z[i]==' '); i+
6500: 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69 3e 30  +){}.    if( i>0
6510: 20 29 7b 0a 20 20 20 20 20 20 63 67 69 5f 70 72   ){.      cgi_pr
6520: 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 69 2c 20  intf("%.*s", i, 
6530: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  z);.    }.    fo
6540: 72 28 6a 3d 69 3b 20 69 73 73 70 61 63 65 28 7a  r(j=i; isspace(z
6550: 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  [j]); j++){}.   
6560: 20 69 66 28 20 6a 3e 69 20 29 7b 0a 20 20 20 20   if( j>i ){.    
6570: 20 20 63 67 69 5f 70 72 69 6e 74 66 28 22 25 2a    cgi_printf("%*
6580: 73 22 2c 20 6a 2d 69 2c 20 22 22 29 3b 0a 20 20  s", j-i, "");.  
6590: 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 6a 3b 0a    }.    z += j;.
65a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74    }.}../*.** Out
65b0: 70 75 74 20 61 20 72 6f 77 20 61 73 20 61 20 74  put a row as a t
65c0: 61 62 2d 73 65 70 61 72 61 74 65 64 20 6c 69 6e  ab-separated lin
65d0: 65 20 6f 66 20 74 65 78 74 2e 0a 2a 2f 0a 73 74  e of text..*/.st
65e0: 61 74 69 63 20 69 6e 74 20 6f 75 74 70 75 74 5f  atic int output_
65f0: 74 61 62 5f 73 65 70 61 72 61 74 65 64 28 0a 20  tab_separated(. 
6600: 20 76 6f 69 64 20 2a 70 55 73 65 72 2c 20 20 20   void *pUser,   
6610: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
6620: 72 6f 77 2d 63 6f 75 6e 74 20 69 6e 74 65 67 65  row-count intege
6630: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  r */.  int nArg,
6640: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6650: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
6660: 74 68 69 73 20 72 65 73 75 6c 74 20 72 6f 77 20  this result row 
6670: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
6680: 67 2c 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  g,    /* Text of
6690: 20 64 61 74 61 20 69 6e 20 61 6c 6c 20 63 6f 6c   data in all col
66a0: 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  umns */.  char *
66b0: 2a 61 7a 4e 61 6d 65 20 20 20 20 2f 2a 20 4e 61  *azName    /* Na
66c0: 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
66d0: 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 2a  ns */.){.  int *
66e0: 70 43 6f 75 6e 74 20 3d 20 28 69 6e 74 2a 29 70  pCount = (int*)p
66f0: 55 73 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  User;.  int i;..
6700: 20 20 69 66 28 20 2a 70 43 6f 75 6e 74 3d 3d 30    if( *pCount==0
6710: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
6720: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
6730: 20 20 20 20 20 6f 75 74 70 75 74 5f 6e 6f 5f 74       output_no_t
6740: 61 62 73 28 61 7a 4e 61 6d 65 5b 69 5d 29 3b 0a  abs(azName[i]);.
6750: 20 20 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66        cgi_printf
6760: 28 22 25 63 22 2c 20 69 3c 6e 41 72 67 2d 31 20  ("%c", i<nArg-1 
6770: 3f 20 27 5c 74 27 20 3a 20 27 5c 6e 27 29 3b 0a  ? '\t' : '\n');.
6780: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2b 2b 2a 70      }.  }.  ++*p
6790: 43 6f 75 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30  Count;.  for(i=0
67a0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
67b0: 20 20 20 20 6f 75 74 70 75 74 5f 6e 6f 5f 74 61      output_no_ta
67c0: 62 73 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  bs(azArg[i]);.  
67d0: 20 20 63 67 69 5f 70 72 69 6e 74 66 28 22 25 63    cgi_printf("%c
67e0: 22 2c 20 69 3c 6e 41 72 67 2d 31 20 3f 20 27 5c  ", i<nArg-1 ? '\
67f0: 74 27 20 3a 20 27 5c 6e 27 29 3b 0a 20 20 7d 0a  t' : '\n');.  }.
6800: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
6810: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 48 54  *.** Generate HT
6820: 4d 4c 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ML that describe
6830: 73 20 61 20 63 6f 6c 6f 72 20 6b 65 79 2e 0a 2a  s a color key..*
6840: 2f 0a 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 6f  /.void output_co
6850: 6c 6f 72 5f 6b 65 79 28 63 6f 6e 73 74 20 63 68  lor_key(const ch
6860: 61 72 20 2a 7a 43 6c 72 4b 65 79 2c 20 69 6e 74  ar *zClrKey, int
6870: 20 68 6f 72 69 7a 2c 20 63 68 61 72 20 2a 7a 54   horiz, char *zT
6880: 61 62 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 69  abArgs){.  int i
6890: 2c 20 6a 2c 20 6b 3b 0a 20 20 63 68 61 72 20 2a  , j, k;.  char *
68a0: 7a 53 61 66 65 4b 65 79 2c 20 2a 7a 54 6f 46 72  zSafeKey, *zToFr
68b0: 65 65 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73  ee;.  while( iss
68c0: 70 61 63 65 28 2a 7a 43 6c 72 4b 65 79 29 20 29  pace(*zClrKey) )
68d0: 20 7a 43 6c 72 4b 65 79 2b 2b 3b 0a 20 20 69 66   zClrKey++;.  if
68e0: 28 20 7a 43 6c 72 4b 65 79 5b 30 5d 3d 3d 30 20  ( zClrKey[0]==0 
68f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 40 20 3c 74  ) return;.  @ <t
6900: 61 62 6c 65 20 25 73 28 7a 54 61 62 41 72 67 73  able %s(zTabArgs
6910: 29 3e 0a 20 20 69 66 28 20 68 6f 72 69 7a 20 29  )>.  if( horiz )
6920: 7b 0a 20 20 20 20 40 20 3c 74 72 3e 0a 20 20 7d  {.    @ <tr>.  }
6930: 0a 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 53 61  .  zToFree = zSa
6940: 66 65 4b 65 79 20 3d 20 6d 70 72 69 6e 74 66 28  feKey = mprintf(
6950: 22 25 68 22 2c 20 7a 43 6c 72 4b 65 79 29 3b 0a  "%h", zClrKey);.
6960: 20 20 77 68 69 6c 65 28 20 7a 53 61 66 65 4b 65    while( zSafeKe
6970: 79 5b 30 5d 20 29 7b 0a 20 20 20 20 77 68 69 6c  y[0] ){.    whil
6980: 65 28 20 69 73 73 70 61 63 65 28 2a 7a 53 61 66  e( isspace(*zSaf
6990: 65 4b 65 79 29 20 29 20 7a 53 61 66 65 4b 65 79  eKey) ) zSafeKey
69a0: 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ++;.    for(i=0;
69b0: 20 7a 53 61 66 65 4b 65 79 5b 69 5d 20 26 26 20   zSafeKey[i] && 
69c0: 21 69 73 73 70 61 63 65 28 7a 53 61 66 65 4b 65  !isspace(zSafeKe
69d0: 79 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  y[i]); i++){}.  
69e0: 20 20 66 6f 72 28 6a 3d 69 3b 20 69 73 73 70 61    for(j=i; isspa
69f0: 63 65 28 7a 53 61 66 65 4b 65 79 5b 6a 5d 29 3b  ce(zSafeKey[j]);
6a00: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28   j++){}.    for(
6a10: 6b 3d 6a 3b 20 7a 53 61 66 65 4b 65 79 5b 6b 5d  k=j; zSafeKey[k]
6a20: 20 26 26 20 7a 53 61 66 65 4b 65 79 5b 6b 5d 21   && zSafeKey[k]!
6a30: 3d 27 5c 6e 27 20 26 26 20 7a 53 61 66 65 4b 65  ='\n' && zSafeKe
6a40: 79 5b 6b 5d 21 3d 27 5c 72 27 3b 20 6b 2b 2b 29  y[k]!='\r'; k++)
6a50: 7b 7d 0a 20 20 20 20 69 66 28 20 21 68 6f 72 69  {}.    if( !hori
6a60: 7a 20 29 7b 0a 20 20 20 20 20 20 63 67 69 5f 70  z ){.      cgi_p
6a70: 72 69 6e 74 66 28 22 3c 74 72 20 62 67 63 6f 6c  rintf("<tr bgcol
6a80: 6f 72 3d 5c 22 25 2e 2a 73 5c 22 3e 3c 74 64 3e  or=\"%.*s\"><td>
6a90: 25 2e 2a 73 3c 2f 74 64 3e 3c 2f 74 72 3e 5c 6e  %.*s</td></tr>\n
6aa0: 22 2c 0a 20 20 20 20 20 20 20 20 69 2c 20 7a 53  ",.        i, zS
6ab0: 61 66 65 4b 65 79 2c 20 6b 2d 6a 2c 20 26 7a 53  afeKey, k-j, &zS
6ac0: 61 66 65 4b 65 79 5b 6a 5d 29 3b 0a 20 20 20 20  afeKey[j]);.    
6ad0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 67 69  }else{.      cgi
6ae0: 5f 70 72 69 6e 74 66 28 22 3c 74 64 20 62 67 63  _printf("<td bgc
6af0: 6f 6c 6f 72 3d 5c 22 25 2e 2a 73 5c 22 3e 25 2e  olor=\"%.*s\">%.
6b00: 2a 73 3c 2f 74 64 3e 5c 6e 22 2c 0a 20 20 20 20  *s</td>\n",.    
6b10: 20 20 20 20 69 2c 20 7a 53 61 66 65 4b 65 79 2c      i, zSafeKey,
6b20: 20 6b 2d 6a 2c 20 26 7a 53 61 66 65 4b 65 79 5b   k-j, &zSafeKey[
6b30: 6a 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  j]);.    }.    z
6b40: 53 61 66 65 4b 65 79 20 2b 3d 20 6b 3b 0a 20 20  SafeKey += k;.  
6b50: 7d 0a 20 20 66 72 65 65 28 7a 54 6f 46 72 65 65  }.  free(zToFree
6b60: 29 3b 0a 20 20 69 66 28 20 68 6f 72 69 7a 20 29  );.  if( horiz )
6b70: 7b 0a 20 20 20 20 40 20 3c 2f 74 72 3e 0a 20 20  {.    @ </tr>.  
6b80: 7d 0a 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a 7d  }.  @ </table>.}
6b90: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45  .../*.** WEBPAGE
6ba0: 3a 20 2f 72 70 74 76 69 65 77 0a 2a 2a 0a 2a 2a  : /rptview.**.**
6bb0: 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70 6f   Generate a repo
6bc0: 72 74 2e 20 20 54 68 65 20 72 6e 20 71 75 65 72  rt.  The rn quer
6bd0: 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  y parameter is t
6be0: 68 65 20 72 65 70 6f 72 74 20 6e 75 6d 62 65 72  he report number
6bf0: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
6c00: 67 20 74 6f 20 52 45 50 4f 52 54 46 4d 54 2e 52  g to REPORTFMT.R
6c10: 4e 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c 69  N.  If the tabli
6c20: 73 74 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  st query paramet
6c30: 65 72 20 65 78 69 73 74 73 2c 0a 2a 2a 20 74 68  er exists,.** th
6c40: 65 6e 20 74 68 65 20 6f 75 74 70 75 74 20 63 6f  en the output co
6c50: 6e 73 69 73 74 73 20 6f 66 20 6c 69 6e 65 73 20  nsists of lines 
6c60: 6f 66 20 74 61 62 2d 73 65 70 61 72 61 74 65 64  of tab-separated
6c70: 20 66 69 65 6c 64 73 20 69 6e 73 74 65 61 64 20   fields instead 
6c80: 6f 66 0a 2a 2a 20 61 6e 20 48 54 4d 4c 20 74 61  of.** an HTML ta
6c90: 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 72 70 74  ble..*/.void rpt
6ca0: 76 69 65 77 5f 70 61 67 65 28 76 6f 69 64 29 7b  view_page(void){
6cb0: 0a 20 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30  .  int count = 0
6cc0: 3b 0a 20 20 69 6e 74 20 72 6e 3b 0a 20 20 63 68  ;.  int rn;.  ch
6cd0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
6ce0: 20 2a 7a 54 69 74 6c 65 3b 0a 20 20 63 68 61 72   *zTitle;.  char
6cf0: 20 2a 7a 4f 77 6e 65 72 3b 0a 20 20 63 68 61 72   *zOwner;.  char
6d00: 20 2a 7a 43 6c 72 4b 65 79 3b 0a 20 20 69 6e 74   *zClrKey;.  int
6d10: 20 74 61 62 73 3b 0a 20 20 53 74 6d 74 20 71 3b   tabs;.  Stmt q;
6d20: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 31 20 3d  .  char *zErr1 =
6d30: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72   0;.  char *zErr
6d40: 32 20 3d 20 30 3b 0a 0a 20 20 6c 6f 67 69 6e 5f  2 = 0;..  login_
6d50: 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c  check_credential
6d60: 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b  s();.  if( !g.ok
6d70: 52 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65  Read ){ login_ne
6d80: 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20  eded(); return; 
6d90: 7d 0a 20 20 72 6e 20 3d 20 61 74 6f 69 28 50 44  }.  rn = atoi(PD
6da0: 28 22 72 6e 22 2c 22 30 22 29 29 3b 0a 20 20 69  ("rn","0"));.  i
6db0: 66 28 20 72 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rn==0 ){.    
6dc0: 63 67 69 5f 72 65 64 69 72 65 63 74 28 22 72 65  cgi_redirect("re
6dd0: 70 6f 72 74 6c 69 73 74 22 29 3b 0a 20 20 20 20  portlist");.    
6de0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 74 61  return;.  }.  ta
6df0: 62 73 20 3d 20 50 28 22 74 61 62 6c 69 73 74 22  bs = P("tablist"
6e00: 29 21 3d 30 3b 0a 20 20 2f 2a 20 76 69 65 77 5f  )!=0;.  /* view_
6e10: 61 64 64 5f 66 75 6e 63 74 69 6f 6e 73 28 74 61  add_functions(ta
6e20: 62 73 29 3b 20 2a 2f 0a 20 20 64 62 5f 70 72 65  bs); */.  db_pre
6e30: 70 61 72 65 28 26 71 2c 0a 20 20 20 20 22 53 45  pare(&q,.    "SE
6e40: 4c 45 43 54 20 74 69 74 6c 65 2c 20 73 71 6c 63  LECT title, sqlc
6e50: 6f 64 65 2c 20 6f 77 6e 65 72 2c 20 63 6f 6c 73  ode, owner, cols
6e60: 20 46 52 4f 4d 20 72 65 70 6f 72 74 66 6d 74 20   FROM reportfmt 
6e70: 57 48 45 52 45 20 72 6e 3d 25 64 22 2c 20 72 6e  WHERE rn=%d", rn
6e80: 29 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70  );.  if( db_step
6e90: 28 26 71 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57  (&q)!=SQLITE_ROW
6ea0: 20 29 7b 0a 20 20 20 20 63 67 69 5f 72 65 64 69   ){.    cgi_redi
6eb0: 72 65 63 74 28 22 72 65 70 6f 72 74 6c 69 73 74  rect("reportlist
6ec0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
6ed0: 20 20 7d 0a 20 20 7a 54 69 74 6c 65 20 3d 20 64    }.  zTitle = d
6ee0: 62 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c 6c 6f 63 28  b_column_malloc(
6ef0: 26 71 2c 20 30 29 3b 0a 20 20 7a 53 71 6c 20 3d  &q, 0);.  zSql =
6f00: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c 6c 6f   db_column_mallo
6f10: 63 28 26 71 2c 20 31 29 3b 0a 20 20 7a 4f 77 6e  c(&q, 1);.  zOwn
6f20: 65 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 6d  er = db_column_m
6f30: 61 6c 6c 6f 63 28 26 71 2c 20 32 29 3b 0a 20 20  alloc(&q, 2);.  
6f40: 7a 43 6c 72 4b 65 79 20 3d 20 64 62 5f 63 6f 6c  zClrKey = db_col
6f50: 75 6d 6e 5f 6d 61 6c 6c 6f 63 28 26 71 2c 20 33  umn_malloc(&q, 3
6f60: 29 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65  );.  db_finalize
6f70: 28 26 71 29 3b 0a 0a 20 20 69 66 28 20 50 28 22  (&q);..  if( P("
6f80: 6f 72 64 65 72 5f 62 79 22 29 20 29 7b 0a 20 20  order_by") ){.  
6f90: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    /*.    ** If t
6fa0: 68 65 20 75 73 65 72 20 77 61 6e 74 73 20 74 6f  he user wants to
6fb0: 20 64 6f 20 61 20 63 6f 6c 75 6d 6e 20 73 6f 72   do a column sor
6fc0: 74 2c 20 77 72 61 70 20 74 68 65 20 71 75 65 72  t, wrap the quer
6fd0: 79 20 69 6e 74 6f 20 61 20 73 75 62 0a 20 20 20  y into a sub.   
6fe0: 20 2a 2a 20 71 75 65 72 79 20 61 6e 64 20 74 68   ** query and th
6ff0: 65 6e 20 73 6f 72 74 20 74 68 65 20 72 65 73 75  en sort the resu
7000: 6c 74 73 2e 20 54 68 69 73 20 69 73 20 61 20 77  lts. This is a w
7010: 68 6f 6c 65 20 6c 6f 74 20 65 61 73 69 65 72 20  hole lot easier 
7020: 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 72 79 69  than.    ** tryi
7030: 6e 67 20 74 6f 20 69 6e 73 65 72 74 20 61 6e 20  ng to insert an 
7040: 4f 52 44 45 52 20 42 59 20 69 6e 74 6f 20 74 68  ORDER BY into th
7050: 65 20 71 75 65 72 79 20 69 74 73 65 6c 66 2c 20  e query itself, 
7060: 65 73 70 65 63 69 61 6c 6c 79 0a 20 20 20 20 2a  especially.    *
7070: 2a 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  * if the query i
7080: 73 20 61 6c 72 65 61 64 79 20 6f 72 64 65 72 65  s already ordere
7090: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
70a0: 74 20 6e 46 69 65 6c 64 20 3d 20 61 74 6f 69 28  t nField = atoi(
70b0: 50 28 22 6f 72 64 65 72 5f 62 79 22 29 29 3b 0a  P("order_by"));.
70c0: 20 20 20 20 69 66 28 20 6e 46 69 65 6c 64 20 3e      if( nField >
70d0: 20 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73   0 ){.      cons
70e0: 74 20 63 68 61 72 2a 20 7a 44 69 72 20 3d 20 50  t char* zDir = P
70f0: 44 28 22 6f 72 64 65 72 5f 64 69 72 22 2c 22 22  D("order_dir",""
7100: 29 3b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20  );.      zDir = 
7110: 21 73 74 72 63 6d 70 28 22 41 53 43 22 2c 7a 44  !strcmp("ASC",zD
7120: 69 72 29 20 3f 20 22 41 53 43 22 20 3a 20 22 44  ir) ? "ASC" : "D
7130: 45 53 43 22 3b 0a 20 20 20 20 20 20 7a 53 71 6c  ESC";.      zSql
7140: 20 3d 20 6d 70 72 69 6e 74 66 28 22 53 45 4c 45   = mprintf("SELE
7150: 43 54 20 2a 20 46 52 4f 4d 20 28 25 73 29 20 4f  CT * FROM (%s) O
7160: 52 44 45 52 20 42 59 20 25 64 20 25 73 22 2c 20  RDER BY %d %s", 
7170: 7a 53 71 6c 2c 20 6e 46 69 65 6c 64 2c 20 7a 44  zSql, nField, zD
7180: 69 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ir);.    }.  }..
7190: 20 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 69    count = 0;.  i
71a0: 66 28 20 21 74 61 62 73 20 29 7b 0a 20 20 20 20  f( !tabs ){.    
71b0: 73 74 72 75 63 74 20 47 65 6e 65 72 61 74 65 48  struct GenerateH
71c0: 54 4d 4c 20 73 53 74 61 74 65 3b 0a 0a 20 20 20  TML sState;..   
71d0: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
71e0: 50 52 41 47 4d 41 20 65 6d 70 74 79 5f 72 65 73  PRAGMA empty_res
71f0: 75 6c 74 5f 63 61 6c 6c 62 61 63 6b 73 3d 4f 4e  ult_callbacks=ON
7200: 22 29 3b 0a 20 20 20 20 73 74 79 6c 65 5f 73 75  ");.    style_su
7210: 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 52  bmenu_element("R
7220: 61 77 22 2c 20 22 52 61 77 22 2c 20 0a 20 20 20  aw", "Raw", .   
7230: 20 20 20 22 72 70 74 76 69 65 77 3f 74 61 62 6c     "rptview?tabl
7240: 69 73 74 3d 31 26 25 73 22 2c 20 50 44 28 22 51  ist=1&%s", PD("Q
7250: 55 45 52 59 5f 53 54 52 49 4e 47 22 2c 22 22 29  UERY_STRING","")
7260: 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 41  );.    if( g.okA
7270: 64 6d 69 6e 20 0a 20 20 20 20 20 20 20 7c 7c 20  dmin .       || 
7280: 28 67 2e 6f 6b 54 6b 74 46 6d 74 20 26 26 20 67  (g.okTktFmt && g
7290: 2e 7a 4c 6f 67 69 6e 20 26 26 20 7a 4f 77 6e 65  .zLogin && zOwne
72a0: 72 20 26 26 20 73 74 72 63 6d 70 28 67 2e 7a 4c  r && strcmp(g.zL
72b0: 6f 67 69 6e 2c 7a 4f 77 6e 65 72 29 3d 3d 30 29  ogin,zOwner)==0)
72c0: 20 29 7b 0a 20 20 20 20 20 20 73 74 79 6c 65 5f   ){.      style_
72d0: 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28  submenu_element(
72e0: 22 45 64 69 74 22 2c 20 22 45 64 69 74 22 2c 20  "Edit", "Edit", 
72f0: 22 72 70 74 65 64 69 74 3f 72 6e 3d 25 64 22 2c  "rptedit?rn=%d",
7300: 20 72 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   rn);.    }.    
7310: 69 66 28 20 67 2e 6f 6b 54 6b 74 46 6d 74 20 29  if( g.okTktFmt )
7320: 7b 0a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75  {.      style_su
7330: 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 53  bmenu_element("S
7340: 51 4c 22 2c 20 22 53 51 4c 22 2c 20 22 72 70 74  QL", "SQL", "rpt
7350: 73 71 6c 3f 72 6e 3d 25 64 22 2c 72 6e 29 3b 0a  sql?rn=%d",rn);.
7360: 20 20 20 20 7d 0a 20 20 20 20 73 74 79 6c 65 5f      }.    style_
7370: 68 65 61 64 65 72 28 7a 54 69 74 6c 65 29 3b 0a  header(zTitle);.
7380: 20 20 20 20 6f 75 74 70 75 74 5f 63 6f 6c 6f 72      output_color
7390: 5f 6b 65 79 28 7a 43 6c 72 4b 65 79 2c 20 31 2c  _key(zClrKey, 1,
73a0: 20 0a 20 20 20 20 20 20 20 20 22 62 6f 72 64 65   .        "borde
73b0: 72 3d 30 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d  r=0 cellpadding=
73c0: 33 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d 30 20  3 cellspacing=0 
73d0: 63 6c 61 73 73 3d 5c 22 72 65 70 6f 72 74 5c 22  class=\"report\"
73e0: 22 29 3b 0a 20 20 20 20 40 20 3c 74 61 62 6c 65  ");.    @ <table
73f0: 20 62 6f 72 64 65 72 3d 31 20 63 65 6c 6c 70 61   border=1 cellpa
7400: 64 64 69 6e 67 3d 32 20 63 65 6c 6c 73 70 61 63  dding=2 cellspac
7410: 69 6e 67 3d 30 20 63 6c 61 73 73 3d 22 72 65 70  ing=0 class="rep
7420: 6f 72 74 22 3e 0a 20 20 20 20 73 53 74 61 74 65  ort">.    sState
7430: 2e 72 6e 20 3d 20 72 6e 3b 0a 20 20 20 20 73 53  .rn = rn;.    sS
7440: 74 61 74 65 2e 6e 43 6f 75 6e 74 20 3d 20 30 3b  tate.nCount = 0;
7450: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74  .    sqlite3_set
7460: 5f 61 75 74 68 6f 72 69 7a 65 72 28 67 2e 64 62  _authorizer(g.db
7470: 2c 20 72 65 70 6f 72 74 5f 71 75 65 72 79 5f 61  , report_query_a
7480: 75 74 68 6f 72 69 7a 65 72 2c 20 28 76 6f 69 64  uthorizer, (void
7490: 2a 29 26 7a 45 72 72 31 29 3b 0a 20 20 20 20 73  *)&zErr1);.    s
74a0: 71 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64 62  qlite3_exec(g.db
74b0: 2c 20 7a 53 71 6c 2c 20 67 65 6e 65 72 61 74 65  , zSql, generate
74c0: 5f 68 74 6d 6c 2c 20 26 73 53 74 61 74 65 2c 20  _html, &sState, 
74d0: 26 7a 45 72 72 32 29 3b 0a 20 20 20 20 73 71 6c  &zErr2);.    sql
74e0: 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69  ite3_set_authori
74f0: 7a 65 72 28 67 2e 64 62 2c 20 30 2c 20 30 29 3b  zer(g.db, 0, 0);
7500: 0a 20 20 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a  .    @ </table>.
7510: 20 20 20 20 69 66 28 20 7a 45 72 72 31 20 29 7b      if( zErr1 ){
7520: 0a 20 20 20 20 20 20 40 20 3c 70 3e 3c 66 6f 6e  .      @ <p><fon
7530: 74 20 63 6f 6c 6f 72 3d 22 72 65 64 22 3e 3c 62  t color="red"><b
7540: 3e 45 72 72 6f 72 3a 20 25 68 28 7a 45 72 72 31  >Error: %h(zErr1
7550: 29 3c 2f 62 3e 3c 2f 66 6f 6e 74 3e 3c 2f 70 3e  )</b></font></p>
7560: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
7570: 45 72 72 32 20 29 7b 0a 20 20 20 20 20 20 40 20  Err2 ){.      @ 
7580: 3c 70 3e 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 22  <p><font color="
7590: 72 65 64 22 3e 3c 62 3e 45 72 72 6f 72 3a 20 25  red"><b>Error: %
75a0: 68 28 7a 45 72 72 32 29 3c 2f 62 3e 3c 2f 66 6f  h(zErr2)</b></fo
75b0: 6e 74 3e 3c 2f 70 3e 0a 20 20 20 20 7d 0a 20 20  nt></p>.    }.  
75c0: 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29    style_footer()
75d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
75e0: 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
75f0: 72 69 7a 65 72 28 67 2e 64 62 2c 20 72 65 70 6f  rizer(g.db, repo
7600: 72 74 5f 71 75 65 72 79 5f 61 75 74 68 6f 72 69  rt_query_authori
7610: 7a 65 72 2c 20 28 76 6f 69 64 2a 29 26 7a 45 72  zer, (void*)&zEr
7620: 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
7630: 5f 65 78 65 63 28 67 2e 64 62 2c 20 7a 53 71 6c  _exec(g.db, zSql
7640: 2c 20 6f 75 74 70 75 74 5f 74 61 62 5f 73 65 70  , output_tab_sep
7650: 61 72 61 74 65 64 2c 20 26 63 6f 75 6e 74 2c 20  arated, &count, 
7660: 26 7a 45 72 72 32 29 3b 0a 20 20 20 20 73 71 6c  &zErr2);.    sql
7670: 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69  ite3_set_authori
7680: 7a 65 72 28 67 2e 64 62 2c 20 30 2c 20 30 29 3b  zer(g.db, 0, 0);
7690: 0a 20 20 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e  .    cgi_set_con
76a0: 74 65 6e 74 5f 74 79 70 65 28 22 74 65 78 74 2f  tent_type("text/
76b0: 70 6c 61 69 6e 22 29 3b 0a 20 20 7d 0a 7d 0a     plain");.  }.}.