Hex Artifact Content
Not logged in

Artifact 911a1c587a23d93838fb5f36001561a4834a535e:

File src/report.c part of check-in [7a2c37063a] - merge trunk into creole branch by bob on 2009-09-22 07:49:39. Also file src/report.c part of check-in [5fe3aee839] - Disable additional hyperlinks when "history" privilege is disabled (by default when the user has not signed in as "anonymous" or other known user.) Help prevent spiders for soaking up bandwidth. by drh on 2009-08-30 01:22:15.

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 54 68 65 20 66    @ <li><p>The f
36d0: 69 72 73 74 20 63 6f 6c 75 6d 6e 20 77 68 6f 73  irst column whos
36e0: 65 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69  e name begins wi
36f0: 74 68 20 75 6e 64 65 72 73 63 6f 72 65 20 28 22  th underscore ("
3700: 5f 22 29 20 61 6e 64 20 61 6c 6c 0a 20 20 40 20  _") and all.  @ 
3710: 73 75 62 73 65 71 75 65 6e 74 20 63 6f 6c 75 6d  subsequent colum
3720: 6e 73 20 61 72 65 20 73 68 6f 77 6e 20 6f 6e 20  ns are shown on 
3730: 74 68 65 69 72 20 6f 77 6e 20 72 6f 77 73 20 69  their own rows i
3740: 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  n the table.  Th
3750: 69 73 20 6d 69 67 68 74 0a 20 20 40 20 62 65 20  is might.  @ be 
3760: 75 73 65 66 75 6c 20 66 6f 72 20 64 69 73 70 6c  useful for displ
3770: 61 79 69 6e 67 20 74 68 65 20 64 65 73 63 72 69  aying the descri
3780: 70 74 69 6f 6e 20 6f 66 20 74 69 63 6b 65 74 73  ption of tickets
3790: 2e 0a 20 20 40 20 3c 2f 70 3e 3c 2f 6c 69 3e 0a  ..  @ </p></li>.
37a0: 20 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 54    @.  @ <li><p>T
37b0: 68 65 20 3c 62 3e 61 75 78 28 29 3c 2f 62 3e 20  he <b>aux()</b> 
37c0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  SQL function tak
37d0: 65 73 20 61 20 70 61 72 61 6d 65 74 65 72 20 6e  es a parameter n
37e0: 61 6d 65 20 61 73 20 61 6e 20 61 72 67 75 6d 65  ame as an argume
37f0: 6e 74 0a 20 20 40 20 61 6e 64 20 72 65 74 75 72  nt.  @ and retur
3800: 6e 73 20 74 68 65 20 76 61 6c 75 65 20 74 68 61  ns the value tha
3810: 74 20 74 68 65 20 75 73 65 72 20 65 6e 74 65 72  t the user enter
3820: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 69  s in the resulti
3830: 6e 67 20 48 54 4d 4c 20 66 6f 72 6d 2e 20 41 0a  ng HTML form. A.
3840: 20 20 40 20 73 65 63 6f 6e 64 20 6f 70 74 69 6f    @ second optio
3850: 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 70 72  nal parameter pr
3860: 6f 76 69 64 65 73 20 61 20 64 65 66 61 75 6c 74  ovides a default
3870: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 66   value for the f
3880: 69 65 6c 64 2e 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20  ield.</p></li>. 
3890: 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 54 68   @.  @ <li><p>Th
38a0: 65 20 3c 62 3e 6f 70 74 69 6f 6e 28 29 3c 2f 62  e <b>option()</b
38b0: 3e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74  > SQL function t
38c0: 61 6b 65 73 20 61 20 70 61 72 61 6d 65 74 65 72  akes a parameter
38d0: 20 6e 61 6d 65 0a 20 20 40 20 61 6e 64 20 61 20   name.  @ and a 
38e0: 71 75 6f 74 65 64 20 53 45 4c 45 43 54 20 73 74  quoted SELECT st
38f0: 61 74 65 6d 65 6e 74 20 61 73 20 70 61 72 61 6d  atement as param
3900: 65 74 65 72 73 2e 20 54 68 65 20 71 75 65 72 79  eters. The query
3910: 20 72 65 73 75 6c 74 73 20 61 72 65 0a 20 20 40   results are.  @
3920: 20 70 72 65 73 65 6e 74 65 64 20 61 73 20 61 6e   presented as an
3930: 20 48 54 4d 4c 20 64 72 6f 70 64 6f 77 6e 20 6d   HTML dropdown m
3940: 65 6e 75 20 61 6e 64 20 74 68 65 20 66 75 6e 63  enu and the func
3950: 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 20 20 40  tion returns.  @
3960: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 73   the currently s
3970: 65 6c 65 63 74 65 64 20 76 61 6c 75 65 2e 20 52  elected value. R
3980: 65 73 75 6c 74 73 20 6d 61 79 20 62 65 20 61 20  esults may be a 
3990: 73 69 6e 67 6c 65 20 76 61 6c 75 65 20 63 6f 6c  single value col
39a0: 75 6d 6e 20 6f 72 0a 20 20 40 20 74 77 6f 20 3c  umn or.  @ two <
39b0: 62 3e 76 61 6c 75 65 2c 64 65 73 63 72 69 70 74  b>value,descript
39c0: 69 6f 6e 3c 2f 62 3e 20 63 6f 6c 75 6d 6e 73 2e  ion</b> columns.
39d0: 20 54 68 65 20 66 69 72 73 74 20 72 6f 77 20 69   The first row i
39e0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 3c 2f  s the default.</
39f0: 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20  p></li>.  @.  @ 
3a00: 3c 6c 69 3e 3c 70 3e 54 68 65 20 3c 62 3e 63 67  <li><p>The <b>cg
3a10: 69 28 29 3c 2f 62 3e 20 53 51 4c 20 66 75 6e 63  i()</b> SQL func
3a20: 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 70 61 72  tion takes a par
3a30: 61 6d 65 74 65 72 20 6e 61 6d 65 20 61 73 20 61  ameter name as a
3a40: 6e 20 61 72 67 75 6d 65 6e 74 0a 20 20 40 20 61  n argument.  @ a
3a50: 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  nd returns the v
3a60: 61 6c 75 65 20 6f 66 20 61 20 63 6f 72 72 65 73  alue of a corres
3a70: 70 6f 6e 64 69 6e 67 20 43 47 49 20 71 75 65 72  ponding CGI quer
3a80: 79 20 76 61 6c 75 65 2e 20 49 66 20 74 68 65 20  y value. If the 
3a90: 43 47 49 0a 20 20 40 20 70 61 72 61 6d 65 74 65  CGI.  @ paramete
3aa0: 72 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 2c  r doesn't exist,
3ab0: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 73 65 63   an optional sec
3ac0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 77 69 6c  ond argument wil
3ad0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20  l be returned.  
3ae0: 40 20 69 6e 73 74 65 61 64 2e 3c 2f 70 3e 3c 2f  @ instead.</p></
3af0: 6c 69 3e 0a 20 20 40 0a 20 20 40 20 3c 6c 69 3e  li>.  @.  @ <li>
3b00: 3c 70 3e 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69  <p>If a column i
3b10: 73 20 77 72 61 70 70 65 64 20 62 79 20 74 68 65  s wrapped by the
3b20: 20 3c 62 3e 77 69 6b 69 28 29 3c 2f 62 3e 20 53   <b>wiki()</b> S
3b30: 51 4c 20 66 75 6e 63 74 69 6f 6e 2c 20 69 74 20  QL function, it 
3b40: 77 69 6c 6c 0a 20 20 40 20 62 65 20 72 65 6e 64  will.  @ be rend
3b50: 65 72 65 64 20 61 73 20 77 69 6b 69 20 66 6f 72  ered as wiki for
3b60: 6d 61 74 74 65 64 20 63 6f 6e 74 65 6e 74 2e 3c  matted content.<
3b70: 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40  /p></li>.  @.  @
3b80: 20 3c 6c 69 3e 3c 70 3e 49 66 20 61 20 63 6f 6c   <li><p>If a col
3b90: 75 6d 6e 20 69 73 20 77 72 61 70 70 65 64 20 62  umn is wrapped b
3ba0: 79 20 74 68 65 20 3c 62 3e 74 6b 74 28 29 3c 2f  y the <b>tkt()</
3bb0: 62 3e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2c  b> SQL function,
3bc0: 20 69 74 20 77 69 6c 6c 0a 20 20 40 20 62 65 20   it will.  @ be 
3bd0: 73 68 6f 77 6e 20 61 73 20 61 20 74 69 63 6b 65  shown as a ticke
3be0: 74 20 69 64 20 77 69 74 68 20 61 20 6c 69 6e 6b  t id with a link
3bf0: 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
3c00: 61 74 65 20 70 61 67 65 3c 2f 70 3e 3c 2f 6c 69  ate page</p></li
3c10: 3e 0a 20 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70  >.  @.  @ <li><p
3c20: 3e 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20  >If a column is 
3c30: 77 72 61 70 70 65 64 20 62 79 20 74 68 65 20 3c  wrapped by the <
3c40: 62 3e 63 68 6e 67 28 29 3c 2f 62 3e 20 53 51 4c  b>chng()</b> SQL
3c50: 20 66 75 6e 63 74 69 6f 6e 2c 20 69 74 20 77 69   function, it wi
3c60: 6c 6c 0a 20 20 40 20 62 65 20 73 68 6f 77 6e 20  ll.  @ be shown 
3c70: 61 73 20 61 20 62 61 73 65 6c 69 6e 65 20 69 64  as a baseline id
3c80: 20 77 69 74 68 20 61 20 6c 69 6e 6b 20 74 6f 20   with a link to 
3c90: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
3ca0: 70 61 67 65 2e 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20  page.</p></li>. 
3cb0: 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 54 68   @.  @ <li><p>Th
3cc0: 65 20 3c 62 3e 73 65 61 72 63 68 28 29 3c 2f 62  e <b>search()</b
3cd0: 3e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74  > SQL function t
3ce0: 61 6b 65 73 20 61 20 6b 65 79 77 6f 72 64 20 70  akes a keyword p
3cf0: 61 74 74 65 72 6e 20 61 6e 64 0a 20 20 40 20 61  attern and.  @ a
3d00: 20 73 65 61 72 63 68 20 74 65 78 74 2e 20 54 68   search text. Th
3d10: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
3d20: 6e 73 20 61 6e 20 69 6e 74 65 67 65 72 20 73 63  ns an integer sc
3d30: 6f 72 65 20 77 68 69 63 68 20 69 73 0a 20 20 40  ore which is.  @
3d40: 20 68 69 67 68 65 72 20 64 65 70 65 6e 64 69 6e   higher dependin
3d50: 67 20 6f 6e 20 68 6f 77 20 77 65 6c 6c 20 74 68  g on how well th
3d60: 65 20 73 65 61 72 63 68 20 77 65 6e 74 2e 3c 2f  e search went.</
3d70: 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20  p></li>.  @.  @ 
3d80: 3c 6c 69 3e 3c 70 3e 54 68 65 20 71 75 65 72 79  <li><p>The query
3d90: 20 63 61 6e 20 6a 6f 69 6e 20 6f 74 68 65 72 20   can join other 
3da0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 61  tables in the da
3db0: 74 61 62 61 73 65 20 62 65 73 69 64 65 73 20 54  tabase besides T
3dc0: 49 43 4b 45 54 2e 0a 20 20 40 20 3c 2f 70 3e 3c  ICKET..  @ </p><
3dd0: 2f 6c 69 3e 0a 20 20 40 20 3c 2f 75 6c 3e 0a 20  /li>.  @ </ul>. 
3de0: 20 40 0a 20 20 40 20 3c 68 33 3e 45 78 61 6d 70   @.  @ <h3>Examp
3df0: 6c 65 73 3c 2f 68 33 3e 0a 20 20 40 20 3c 70 3e  les</h3>.  @ <p>
3e00: 49 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 2c  In this example,
3e10: 20 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d   the first colum
3e20: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
3e30: 73 65 74 20 69 73 20 6e 61 6d 65 64 0a 20 20 40  set is named.  @
3e40: 20 22 62 67 63 6f 6c 6f 72 22 2e 20 20 54 68 65   "bgcolor".  The
3e50: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 63   value of this c
3e60: 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 64 69 73  olumn is not dis
3e70: 70 6c 61 79 65 64 2e 20 20 49 6e 73 74 65 61 64  played.  Instead
3e80: 2c 20 69 74 0a 20 20 40 20 73 65 6c 65 63 74 73  , it.  @ selects
3e90: 20 74 68 65 20 62 61 63 6b 67 72 6f 75 6e 64 20   the background 
3ea0: 63 6f 6c 6f 72 20 6f 66 20 65 61 63 68 20 72 6f  color of each ro
3eb0: 77 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 54  w based on the T
3ec0: 49 43 4b 45 54 2e 53 54 41 54 55 53 0a 20 20 40  ICKET.STATUS.  @
3ed0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61   field of the da
3ee0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 63 6f 6c  tabase.  The col
3ef0: 6f 72 20 6b 65 79 20 61 74 20 74 68 65 20 72 69  or key at the ri
3f00: 67 68 74 20 73 68 6f 77 73 20 74 68 65 20 76 61  ght shows the va
3f10: 72 69 6f 75 73 0a 20 20 40 20 63 6f 6c 6f 72 20  rious.  @ color 
3f20: 63 6f 64 65 73 2e 3c 2f 70 3e 0a 20 20 40 20 3c  codes.</p>.  @ <
3f30: 74 61 62 6c 65 20 61 6c 69 67 6e 3d 22 72 69 67  table align="rig
3f40: 68 74 22 20 73 74 79 6c 65 3d 22 6d 61 72 67 69  ht" style="margi
3f50: 6e 3a 20 30 20 35 70 78 3b 22 20 62 6f 72 64 65  n: 0 5px;" borde
3f60: 72 3d 31 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d  r=1 cellspacing=
3f70: 30 20 77 69 64 74 68 3d 31 32 35 3e 0a 20 20 40  0 width=125>.  @
3f80: 20 3c 74 72 20 62 67 63 6f 6c 6f 72 3d 22 23 66   <tr bgcolor="#f
3f90: 32 64 63 64 63 22 3e 3c 74 64 20 61 6c 69 67 6e  2dcdc"><td align
3fa0: 3d 22 63 65 6e 74 65 72 22 3e 6e 65 77 20 6f 72  ="center">new or
3fb0: 20 61 63 74 69 76 65 3c 2f 74 64 3e 3c 2f 74 72   active</td></tr
3fc0: 3e 0a 20 20 40 20 3c 74 72 20 62 67 63 6f 6c 6f  >.  @ <tr bgcolo
3fd0: 72 3d 22 23 65 38 65 38 62 64 22 3e 3c 74 64 20  r="#e8e8bd"><td 
3fe0: 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 3e 72  align="center">r
3ff0: 65 76 69 65 77 3c 2f 74 64 3e 3c 2f 74 72 3e 0a  eview</td></tr>.
4000: 20 20 40 20 3c 74 72 20 62 67 63 6f 6c 6f 72 3d    @ <tr bgcolor=
4010: 22 23 63 66 65 38 62 64 22 3e 3c 74 64 20 61 6c  "#cfe8bd"><td al
4020: 69 67 6e 3d 22 63 65 6e 74 65 72 22 3e 66 69 78  ign="center">fix
4030: 65 64 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40  ed</td></tr>.  @
4040: 20 3c 74 72 20 62 67 63 6f 6c 6f 72 3d 22 23 62   <tr bgcolor="#b
4050: 64 65 35 64 36 22 3e 3c 74 64 20 61 6c 69 67 6e  de5d6"><td align
4060: 3d 22 63 65 6e 74 65 72 22 3e 74 65 73 74 65 64  ="center">tested
4070: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c  </td></tr>.  @ <
4080: 74 72 20 62 67 63 6f 6c 6f 72 3d 22 23 63 61 63  tr bgcolor="#cac
4090: 61 65 35 22 3e 3c 74 64 20 61 6c 69 67 6e 3d 22  ae5"><td align="
40a0: 63 65 6e 74 65 72 22 3e 64 65 66 65 72 3c 2f 74  center">defer</t
40b0: 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72 20  d></tr>.  @ <tr 
40c0: 62 67 63 6f 6c 6f 72 3d 22 23 63 38 63 38 63 38  bgcolor="#c8c8c8
40d0: 22 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e  "><td align="cen
40e0: 74 65 72 22 3e 63 6c 6f 73 65 64 3c 2f 74 64 3e  ter">closed</td>
40f0: 3c 2f 74 72 3e 0a 20 20 40 20 3c 2f 74 61 62 6c  </tr>.  @ </tabl
4100: 65 3e 0a 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f  e>.  @ <blockquo
4110: 74 65 3e 3c 70 72 65 3e 0a 20 20 40 20 53 45 4c  te><pre>.  @ SEL
4120: 45 43 54 0a 20 20 40 20 20 20 43 41 53 45 20 57  ECT.  @   CASE W
4130: 48 45 4e 20 73 74 61 74 75 73 20 49 4e 20 28 27  HEN status IN ('
4140: 6e 65 77 27 2c 27 61 63 74 69 76 65 27 29 20 54  new','active') T
4150: 48 45 4e 20 27 23 66 32 64 63 64 63 27 0a 20 20  HEN '#f2dcdc'.  
4160: 40 20 20 20 20 20 20 20 20 57 48 45 4e 20 73 74  @        WHEN st
4170: 61 74 75 73 3d 27 72 65 76 69 65 77 27 20 54 48  atus='review' TH
4180: 45 4e 20 27 23 65 38 65 38 62 64 27 0a 20 20 40  EN '#e8e8bd'.  @
4190: 20 20 20 20 20 20 20 20 57 48 45 4e 20 73 74 61          WHEN sta
41a0: 74 75 73 3d 27 66 69 78 65 64 27 20 54 48 45 4e  tus='fixed' THEN
41b0: 20 27 23 63 66 65 38 62 64 27 0a 20 20 40 20 20   '#cfe8bd'.  @  
41c0: 20 20 20 20 20 20 57 48 45 4e 20 73 74 61 74 75        WHEN statu
41d0: 73 3d 27 74 65 73 74 65 64 27 20 54 48 45 4e 20  s='tested' THEN 
41e0: 27 23 62 64 65 35 64 36 27 0a 20 20 40 20 20 20  '#bde5d6'.  @   
41f0: 20 20 20 20 20 57 48 45 4e 20 73 74 61 74 75 73       WHEN status
4200: 3d 27 64 65 66 65 72 27 20 54 48 45 4e 20 27 23  ='defer' THEN '#
4210: 63 61 63 61 65 35 27 0a 20 20 40 20 20 20 20 20  cacae5'.  @     
4220: 20 20 20 45 4c 53 45 20 27 23 63 38 63 38 63 38     ELSE '#c8c8c8
4230: 27 20 45 4e 44 20 61 73 20 27 62 67 63 6f 6c 6f  ' END as 'bgcolo
4240: 72 27 2c 0a 20 20 40 20 20 20 74 6e 20 41 53 20  r',.  @   tn AS 
4250: 27 23 27 2c 0a 20 20 40 20 20 20 74 79 70 65 20  '#',.  @   type 
4260: 41 53 20 27 54 79 70 65 27 2c 0a 20 20 40 20 20  AS 'Type',.  @  
4270: 20 73 74 61 74 75 73 20 41 53 20 27 53 74 61 74   status AS 'Stat
4280: 75 73 27 2c 0a 20 20 40 20 20 20 73 64 61 74 65  us',.  @   sdate
4290: 28 6f 72 69 67 74 69 6d 65 29 20 41 53 20 27 43  (origtime) AS 'C
42a0: 72 65 61 74 65 64 27 2c 0a 20 20 40 20 20 20 6f  reated',.  @   o
42b0: 77 6e 65 72 20 41 53 20 27 42 79 27 2c 0a 20 20  wner AS 'By',.  
42c0: 40 20 20 20 73 75 62 73 79 73 74 65 6d 20 41 53  @   subsystem AS
42d0: 20 27 53 75 62 73 79 73 27 2c 0a 20 20 40 20 20   'Subsys',.  @  
42e0: 20 73 64 61 74 65 28 63 68 61 6e 67 65 74 69 6d   sdate(changetim
42f0: 65 29 20 41 53 20 27 43 68 61 6e 67 65 64 27 2c  e) AS 'Changed',
4300: 0a 20 20 40 20 20 20 61 73 73 69 67 6e 65 64 74  .  @   assignedt
4310: 6f 20 41 53 20 27 41 73 73 69 67 6e 65 64 27 2c  o AS 'Assigned',
4320: 0a 20 20 40 20 20 20 73 65 76 65 72 69 74 79 20  .  @   severity 
4330: 41 53 20 27 53 76 72 27 2c 0a 20 20 40 20 20 20  AS 'Svr',.  @   
4340: 70 72 69 6f 72 69 74 79 20 41 53 20 27 50 72 69  priority AS 'Pri
4350: 27 2c 0a 20 20 40 20 20 20 74 69 74 6c 65 20 41  ',.  @   title A
4360: 53 20 27 54 69 74 6c 65 27 0a 20 20 40 20 46 52  S 'Title'.  @ FR
4370: 4f 4d 20 74 69 63 6b 65 74 0a 20 20 40 20 3c 2f  OM ticket.  @ </
4380: 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65  pre></blockquote
4390: 3e 0a 20 20 40 20 3c 70 3e 54 6f 20 62 61 73 65  >.  @ <p>To base
43a0: 20 74 68 65 20 62 61 63 6b 67 72 6f 75 6e 64 20   the background 
43b0: 63 6f 6c 6f 72 20 6f 6e 20 74 68 65 20 54 49 43  color on the TIC
43c0: 4b 45 54 2e 50 52 49 4f 52 49 54 59 20 6f 72 0a  KET.PRIORITY or.
43d0: 20 20 40 20 54 49 43 4b 45 54 2e 53 45 56 45 52    @ TICKET.SEVER
43e0: 49 54 59 20 66 69 65 6c 64 73 2c 20 73 75 62 73  ITY fields, subs
43f0: 74 69 74 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f  titute the follo
4400: 77 69 6e 67 20 63 6f 64 65 20 66 6f 72 20 74 68  wing code for th
4410: 65 0a 20 20 40 20 66 69 72 73 74 20 63 6f 6c 75  e.  @ first colu
4420: 6d 6e 20 6f 66 20 74 68 65 20 71 75 65 72 79 3a  mn of the query:
4430: 3c 2f 70 3e 0a 20 20 40 20 3c 74 61 62 6c 65 20  </p>.  @ <table 
4440: 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 20 73 74  align="right" st
4450: 79 6c 65 3d 22 6d 61 72 67 69 6e 3a 20 30 20 35  yle="margin: 0 5
4460: 70 78 3b 22 20 62 6f 72 64 65 72 3d 31 20 63 65  px;" border=1 ce
4470: 6c 6c 73 70 61 63 69 6e 67 3d 30 20 77 69 64 74  llspacing=0 widt
4480: 68 3d 31 32 35 3e 0a 20 20 40 20 3c 74 72 20 62  h=125>.  @ <tr b
4490: 67 63 6f 6c 6f 72 3d 22 23 66 32 64 63 64 63 22  gcolor="#f2dcdc"
44a0: 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74  ><td align="cent
44b0: 65 72 22 3e 31 3c 2f 74 64 3e 3c 2f 74 72 3e 0a  er">1</td></tr>.
44c0: 20 20 40 20 3c 74 72 20 62 67 63 6f 6c 6f 72 3d    @ <tr bgcolor=
44d0: 22 23 65 38 65 38 62 64 22 3e 3c 74 64 20 61 6c  "#e8e8bd"><td al
44e0: 69 67 6e 3d 22 63 65 6e 74 65 72 22 3e 32 3c 2f  ign="center">2</
44f0: 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72  td></tr>.  @ <tr
4500: 20 62 67 63 6f 6c 6f 72 3d 22 23 63 66 65 38 62   bgcolor="#cfe8b
4510: 64 22 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65  d"><td align="ce
4520: 6e 74 65 72 22 3e 33 3c 2f 74 64 3e 3c 2f 74 72  nter">3</td></tr
4530: 3e 0a 20 20 40 20 3c 74 72 20 62 67 63 6f 6c 6f  >.  @ <tr bgcolo
4540: 72 3d 22 23 63 61 63 61 65 35 22 3e 3c 74 64 20  r="#cacae5"><td 
4550: 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 3e 34  align="center">4
4560: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c  </td></tr>.  @ <
4570: 74 72 20 62 67 63 6f 6c 6f 72 3d 22 23 63 38 63  tr bgcolor="#c8c
4580: 38 63 38 22 3e 3c 74 64 20 61 6c 69 67 6e 3d 22  8c8"><td align="
4590: 63 65 6e 74 65 72 22 3e 35 3c 2f 74 64 3e 3c 2f  center">5</td></
45a0: 74 72 3e 0a 20 20 40 20 3c 2f 74 61 62 6c 65 3e  tr>.  @ </table>
45b0: 0a 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65  .  @ <blockquote
45c0: 3e 3c 70 72 65 3e 0a 20 20 40 20 53 45 4c 45 43  ><pre>.  @ SELEC
45d0: 54 0a 20 20 40 20 20 20 43 41 53 45 20 70 72 69  T.  @   CASE pri
45e0: 6f 72 69 74 79 20 57 48 45 4e 20 31 20 54 48 45  ority WHEN 1 THE
45f0: 4e 20 27 23 66 32 64 63 64 63 27 0a 20 20 40 20  N '#f2dcdc'.  @ 
4600: 20 20 20 20 20 20 20 57 48 45 4e 20 32 20 54 48         WHEN 2 TH
4610: 45 4e 20 27 23 65 38 65 38 62 64 27 0a 20 20 40  EN '#e8e8bd'.  @
4620: 20 20 20 20 20 20 20 20 57 48 45 4e 20 33 20 54          WHEN 3 T
4630: 48 45 4e 20 27 23 63 66 65 38 62 64 27 0a 20 20  HEN '#cfe8bd'.  
4640: 40 20 20 20 20 20 20 20 20 57 48 45 4e 20 34 20  @        WHEN 4 
4650: 54 48 45 4e 20 27 23 63 61 63 61 65 35 27 0a 20  THEN '#cacae5'. 
4660: 20 40 20 20 20 20 20 20 20 20 45 4c 53 45 20 27   @        ELSE '
4670: 23 63 38 63 38 63 38 27 20 45 4e 44 20 61 73 20  #c8c8c8' END as 
4680: 27 62 67 63 6f 6c 6f 72 27 2c 0a 20 20 40 20 2e  'bgcolor',.  @ .
4690: 2e 2e 0a 20 20 40 20 46 52 4f 4d 20 74 69 63 6b  ...  @ FROM tick
46a0: 65 74 0a 20 20 40 20 3c 2f 70 72 65 3e 3c 2f 62  et.  @ </pre></b
46b0: 6c 6f 63 6b 71 75 6f 74 65 3e 0a 23 69 66 20 30  lockquote>.#if 0
46c0: 0a 20 20 40 20 3c 70 3e 59 6f 75 20 63 61 6e 2c  .  @ <p>You can,
46d0: 20 6f 66 20 63 6f 75 72 73 65 2c 20 73 75 62 73   of course, subs
46e0: 74 69 74 75 74 65 20 64 69 66 66 65 72 65 6e 74  titute different
46f0: 20 63 6f 6c 6f 72 73 20 69 66 20 79 6f 75 20 63   colors if you c
4700: 68 6f 6f 73 65 2e 0a 20 20 40 20 48 65 72 65 20  hoose..  @ Here 
4710: 69 73 20 61 20 70 61 6c 65 74 74 65 20 6f 66 20  is a palette of 
4720: 73 75 67 67 65 73 74 65 64 20 62 61 63 6b 67 72  suggested backgr
4730: 6f 75 6e 64 20 63 6f 6c 6f 72 73 3a 3c 2f 70 3e  ound colors:</p>
4740: 0a 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65  .  @ <blockquote
4750: 3e 0a 20 20 40 20 3c 74 61 62 6c 65 20 62 6f 72  >.  @ <table bor
4760: 64 65 72 3d 31 20 63 65 6c 6c 73 70 61 63 69 6e  der=1 cellspacin
4770: 67 3d 30 20 77 69 64 74 68 3d 33 30 30 3e 0a 20  g=0 width=300>. 
4780: 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e   @ <tr><td align
4790: 3d 22 63 65 6e 74 65 72 22 20 62 67 63 6f 6c 6f  ="center" bgcolo
47a0: 72 3d 22 23 66 66 62 64 62 64 22 3e 23 66 66 62  r="#ffbdbd">#ffb
47b0: 64 62 64 3c 2f 74 64 3e 0a 20 20 40 20 20 20 20  dbd</td>.  @    
47c0: 20 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74   <td align="cent
47d0: 65 72 22 20 62 67 63 6f 6c 6f 72 3d 22 23 66 32  er" bgcolor="#f2
47e0: 64 63 64 63 22 3e 23 66 32 64 63 64 63 3c 2f 74  dcdc">#f2dcdc</t
47f0: 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72 3e  d></tr>.  @ <tr>
4800: 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65  <td align="cente
4810: 72 22 20 62 67 63 6f 6c 6f 72 3d 22 23 66 66 66  r" bgcolor="#fff
4820: 66 62 64 22 3e 23 66 66 66 66 62 64 3c 2f 74 64  fbd">#ffffbd</td
4830: 3e 0a 20 20 40 20 20 20 20 20 3c 74 64 20 61 6c  >.  @     <td al
4840: 69 67 6e 3d 22 63 65 6e 74 65 72 22 20 62 67 63  ign="center" bgc
4850: 6f 6c 6f 72 3d 22 23 65 38 65 38 62 64 22 3e 23  olor="#e8e8bd">#
4860: 65 38 65 38 62 64 3c 2f 74 64 3e 3c 2f 74 72 3e  e8e8bd</td></tr>
4870: 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69  .  @ <tr><td ali
4880: 67 6e 3d 22 63 65 6e 74 65 72 22 20 62 67 63 6f  gn="center" bgco
4890: 6c 6f 72 3d 22 23 63 30 65 62 63 30 22 3e 23 63  lor="#c0ebc0">#c
48a0: 30 65 62 63 30 3c 2f 74 64 3e 0a 20 20 40 20 20  0ebc0</td>.  @  
48b0: 20 20 20 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65     <td align="ce
48c0: 6e 74 65 72 22 20 62 67 63 6f 6c 6f 72 3d 22 23  nter" bgcolor="#
48d0: 63 66 65 38 62 64 22 3e 23 63 66 65 38 62 64 3c  cfe8bd">#cfe8bd<
48e0: 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74  /td></tr>.  @ <t
48f0: 72 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e  r><td align="cen
4900: 74 65 72 22 20 62 67 63 6f 6c 6f 72 3d 22 23 63  ter" bgcolor="#c
4910: 30 63 30 66 34 22 3e 23 63 30 63 30 66 34 3c 2f  0c0f4">#c0c0f4</
4920: 74 64 3e 0a 20 20 40 20 20 20 20 20 3c 74 64 20  td>.  @     <td 
4930: 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 20 62  align="center" b
4940: 67 63 6f 6c 6f 72 3d 22 23 64 36 64 36 65 38 22  gcolor="#d6d6e8"
4950: 3e 23 64 36 64 36 65 38 3c 2f 74 64 3e 3c 2f 74  >#d6d6e8</td></t
4960: 72 3e 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20 61  r>.  @ <tr><td a
4970: 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 20 62 67  lign="center" bg
4980: 63 6f 6c 6f 72 3d 22 23 64 30 62 31 66 66 22 3e  color="#d0b1ff">
4990: 23 64 30 62 31 66 66 3c 2f 74 64 3e 0a 20 20 40  #d0b1ff</td>.  @
49a0: 20 20 20 20 20 3c 74 64 20 61 6c 69 67 6e 3d 22       <td align="
49b0: 63 65 6e 74 65 72 22 20 62 67 63 6f 6c 6f 72 3d  center" bgcolor=
49c0: 22 23 64 32 63 30 64 62 22 3e 23 64 32 63 30 64  "#d2c0db">#d2c0d
49d0: 62 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20  b</td></tr>.  @ 
49e0: 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63  <tr><td align="c
49f0: 65 6e 74 65 72 22 20 62 67 63 6f 6c 6f 72 3d 22  enter" bgcolor="
4a00: 23 62 62 62 62 62 62 22 3e 23 62 62 62 62 62 62  #bbbbbb">#bbbbbb
4a10: 3c 2f 74 64 3e 0a 20 20 40 20 20 20 20 20 3c 74  </td>.  @     <t
4a20: 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22  d align="center"
4a30: 20 62 67 63 6f 6c 6f 72 3d 22 23 64 30 64 30 64   bgcolor="#d0d0d
4a40: 30 22 3e 23 64 30 64 30 64 30 3c 2f 74 64 3e 3c  0">#d0d0d0</td><
4a50: 2f 74 72 3e 0a 20 20 40 20 3c 2f 74 61 62 6c 65  /tr>.  @ </table
4a60: 3e 0a 20 20 40 20 3c 2f 62 6c 6f 63 6b 71 75 6f  >.  @ </blockquo
4a70: 74 65 3e 0a 23 65 6e 64 69 66 0a 20 20 40 20 3c  te>.#endif.  @ <
4a80: 70 3e 54 6f 20 73 65 65 20 74 68 65 20 54 49 43  p>To see the TIC
4a90: 4b 45 54 2e 44 45 53 43 52 49 50 54 49 4f 4e 20  KET.DESCRIPTION 
4aa0: 61 6e 64 20 54 49 43 4b 45 54 2e 52 45 4d 41 52  and TICKET.REMAR
4ab0: 4b 53 20 66 69 65 6c 64 73 2c 20 69 6e 63 6c 75  KS fields, inclu
4ac0: 64 65 0a 20 20 40 20 74 68 65 6d 20 61 73 20 74  de.  @ them as t
4ad0: 68 65 20 6c 61 73 74 20 74 77 6f 20 63 6f 6c 75  he last two colu
4ae0: 6d 6e 73 20 6f 66 20 74 68 65 20 72 65 73 75 6c  mns of the resul
4af0: 74 20 73 65 74 20 61 6e 64 20 67 69 76 65 6e 20  t set and given 
4b00: 74 68 65 6d 20 6e 61 6d 65 73 0a 20 20 40 20 74  them names.  @ t
4b10: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  hat begin with a
4b20: 6e 20 75 6e 64 65 72 73 63 6f 72 65 2e 20 20 4c  n underscore.  L
4b30: 69 6b 65 20 74 68 69 73 3a 3c 2f 70 3e 0a 20 20  ike this:</p>.  
4b40: 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70  @ <blockquote><p
4b50: 72 65 3e 0a 20 20 40 20 20 53 45 4c 45 43 54 0a  re>.  @  SELECT.
4b60: 20 20 40 20 20 20 20 74 6e 20 41 53 20 27 23 27    @    tn AS '#'
4b70: 2c 0a 20 20 40 20 20 20 20 74 79 70 65 20 41 53  ,.  @    type AS
4b80: 20 27 54 79 70 65 27 2c 0a 20 20 40 20 20 20 20   'Type',.  @    
4b90: 73 74 61 74 75 73 20 41 53 20 27 53 74 61 74 75  status AS 'Statu
4ba0: 73 27 2c 0a 20 20 40 20 20 20 20 73 64 61 74 65  s',.  @    sdate
4bb0: 28 6f 72 69 67 74 69 6d 65 29 20 41 53 20 27 43  (origtime) AS 'C
4bc0: 72 65 61 74 65 64 27 2c 0a 20 20 40 20 20 20 20  reated',.  @    
4bd0: 6f 77 6e 65 72 20 41 53 20 27 42 79 27 2c 0a 20  owner AS 'By',. 
4be0: 20 40 20 20 20 20 73 75 62 73 79 73 74 65 6d 20   @    subsystem 
4bf0: 41 53 20 27 53 75 62 73 79 73 27 2c 0a 20 20 40  AS 'Subsys',.  @
4c00: 20 20 20 20 73 64 61 74 65 28 63 68 61 6e 67 65      sdate(change
4c10: 74 69 6d 65 29 20 41 53 20 27 43 68 61 6e 67 65  time) AS 'Change
4c20: 64 27 2c 0a 20 20 40 20 20 20 20 61 73 73 69 67  d',.  @    assig
4c30: 6e 65 64 74 6f 20 41 53 20 27 41 73 73 69 67 6e  nedto AS 'Assign
4c40: 65 64 27 2c 0a 20 20 40 20 20 20 20 73 65 76 65  ed',.  @    seve
4c50: 72 69 74 79 20 41 53 20 27 53 76 72 27 2c 0a 20  rity AS 'Svr',. 
4c60: 20 40 20 20 20 20 70 72 69 6f 72 69 74 79 20 41   @    priority A
4c70: 53 20 27 50 72 69 27 2c 0a 20 20 40 20 20 20 20  S 'Pri',.  @    
4c80: 74 69 74 6c 65 20 41 53 20 27 54 69 74 6c 65 27  title AS 'Title'
4c90: 2c 0a 20 20 40 20 20 20 20 64 65 73 63 72 69 70  ,.  @    descrip
4ca0: 74 69 6f 6e 20 41 53 20 27 5f 44 65 73 63 72 69  tion AS '_Descri
4cb0: 70 74 69 6f 6e 27 2c 20 20 20 2d 2d 20 57 68 65  ption',   -- Whe
4cc0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  n the column nam
4cd0: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 27 5f  e begins with '_
4ce0: 27 0a 20 20 40 20 20 20 20 72 65 6d 61 72 6b 73  '.  @    remarks
4cf0: 20 41 53 20 27 5f 52 65 6d 61 72 6b 73 27 20 20   AS '_Remarks'  
4d00: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 74 68 65            -- the
4d10: 20 64 61 74 61 20 69 73 20 73 68 6f 77 6e 20 6f   data is shown o
4d20: 6e 20 61 20 73 65 70 61 72 61 74 65 20 72 6f 77  n a separate row
4d30: 2e 0a 20 20 40 20 20 46 52 4f 4d 20 74 69 63 6b  ..  @  FROM tick
4d40: 65 74 0a 20 20 40 20 3c 2f 70 72 65 3e 3c 2f 62  et.  @ </pre></b
4d50: 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 40 0a 20  lockquote>.  @. 
4d60: 20 40 20 3c 70 3e 4f 72 2c 20 74 6f 20 73 65 65   @ <p>Or, to see
4d70: 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 65 73   part of the des
4d80: 63 72 69 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20  cription on the 
4d90: 73 61 6d 65 20 72 6f 77 2c 20 75 73 65 20 74 68  same row, use th
4da0: 65 0a 20 20 40 20 3c 62 3e 77 69 6b 69 28 29 3c  e.  @ <b>wiki()<
4db0: 2f 62 3e 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  /b> function wit
4dc0: 68 20 73 6f 6d 65 20 73 74 72 69 6e 67 20 6d 61  h some string ma
4dd0: 6e 69 70 75 6c 61 74 69 6f 6e 2e 20 55 73 69 6e  nipulation. Usin
4de0: 67 20 74 68 65 0a 20 20 40 20 3c 62 3e 74 6b 74  g the.  @ <b>tkt
4df0: 28 29 3c 2f 62 3e 20 66 75 6e 63 74 69 6f 6e 20  ()</b> function 
4e00: 6f 6e 20 74 68 65 20 74 69 63 6b 65 74 20 6e 75  on the ticket nu
4e10: 6d 62 65 72 20 77 69 6c 6c 20 61 6c 73 6f 20 67  mber will also g
4e20: 65 6e 65 72 61 74 65 20 61 20 6c 69 6e 6b 65 64  enerate a linked
4e30: 0a 20 20 40 20 66 69 65 6c 64 2c 20 62 75 74 20  .  @ field, but 
4e40: 77 69 74 68 6f 75 74 20 74 68 65 20 65 78 74 72  without the extr
4e50: 61 20 3c 69 3e 65 64 69 74 3c 2f 69 3e 20 63 6f  a <i>edit</i> co
4e60: 6c 75 6d 6e 3a 0a 20 20 40 20 3c 2f 70 3e 0a 20  lumn:.  @ </p>. 
4e70: 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c   @ <blockquote><
4e80: 70 72 65 3e 0a 20 20 40 20 20 53 45 4c 45 43 54  pre>.  @  SELECT
4e90: 0a 20 20 40 20 20 20 20 74 6b 74 28 74 6e 29 20  .  @    tkt(tn) 
4ea0: 41 53 20 27 27 2c 0a 20 20 40 20 20 20 20 74 69  AS '',.  @    ti
4eb0: 74 6c 65 20 41 53 20 27 54 69 74 6c 65 27 2c 0a  tle AS 'Title',.
4ec0: 20 20 40 20 20 20 20 77 69 6b 69 28 73 75 62 73    @    wiki(subs
4ed0: 74 72 28 64 65 73 63 72 69 70 74 69 6f 6e 2c 30  tr(description,0
4ee0: 2c 38 30 29 29 20 41 53 20 27 44 65 73 63 72 69  ,80)) AS 'Descri
4ef0: 70 74 69 6f 6e 27 0a 20 20 40 20 20 46 52 4f 4d  ption'.  @  FROM
4f00: 20 74 69 63 6b 65 74 0a 20 20 40 20 3c 2f 70 72   ticket.  @ </pr
4f10: 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a  e></blockquote>.
4f20: 20 20 40 0a 7d 0a 0a 23 69 66 20 30 20 2f 2a 20    @.}..#if 0 /* 
4f30: 4e 4f 54 20 55 53 45 44 20 2a 2f 0a 73 74 61 74  NOT USED */.stat
4f40: 69 63 20 76 6f 69 64 20 63 6f 6c 75 6d 6e 5f 68  ic void column_h
4f50: 65 61 64 65 72 28 69 6e 74 20 72 6e 2c 63 6f 6e  eader(int rn,con
4f60: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 69  st char *zCol, i
4f70: 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 6e 53 6f  nt nCol, int nSo
4f80: 72 74 65 64 2c 0a 20 20 20 20 63 6f 6e 73 74 20  rted,.    const 
4f90: 63 68 61 72 20 2a 7a 44 69 72 65 63 74 69 6f 6e  char *zDirection
4fa0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45  , const char *zE
4fb0: 78 74 72 61 0a 29 7b 0a 20 20 69 6e 74 20 73 65  xtra.){.  int se
4fc0: 74 20 3d 20 28 6e 43 6f 6c 3d 3d 6e 53 6f 72 74  t = (nCol==nSort
4fd0: 65 64 29 3b 0a 20 20 69 6e 74 20 64 65 73 63 20  ed);.  int desc 
4fe0: 3d 20 21 73 74 72 63 6d 70 28 7a 44 69 72 65 63  = !strcmp(zDirec
4ff0: 74 69 6f 6e 2c 22 44 45 53 43 22 29 3b 0a 0a 20  tion,"DESC");.. 
5000: 20 2f 2a 0a 20 20 2a 2a 20 43 6c 69 63 6b 69 6e   /*.  ** Clickin
5010: 67 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 68 65  g same column he
5020: 61 64 65 72 20 33 20 74 69 6d 65 73 20 69 6e 20  ader 3 times in 
5030: 61 20 72 6f 77 20 72 65 73 65 74 73 20 61 6e 79  a row resets any
5040: 20 73 6f 72 74 69 6e 67 2e 0a 20 20 2a 2a 20 4e   sorting..  ** N
5050: 6f 74 65 20 74 68 61 74 20 77 65 20 6c 69 6e 6b  ote that we link
5060: 20 74 6f 20 72 70 74 76 69 65 77 2c 20 77 68 69   to rptview, whi
5070: 63 68 20 6d 65 61 6e 73 20 65 6d 62 65 64 64 65  ch means embedde
5080: 64 20 72 65 70 6f 72 74 73 20 77 69 6c 6c 20 67  d reports will g
5090: 65 74 0a 20 20 2a 2a 20 73 65 6e 74 20 74 6f 20  et.  ** sent to 
50a0: 74 68 65 20 61 63 74 75 61 6c 20 72 65 70 6f 72  the actual repor
50b0: 74 20 76 69 65 77 20 70 61 67 65 20 61 73 20 73  t view page as s
50c0: 6f 6f 6e 20 61 73 20 61 20 75 73 65 72 20 74 72  oon as a user tr
50d0: 69 65 73 20 74 6f 20 64 6f 0a 20 20 2a 2a 20 61  ies to do.  ** a
50e0: 6e 79 20 73 6f 72 74 69 6e 67 2e 20 49 20 64 6f  ny sorting. I do
50f0: 6e 27 74 20 73 65 65 20 74 68 61 74 20 61 73 20  n't see that as 
5100: 61 20 42 61 64 20 54 68 69 6e 67 2e 0a 20 20 2a  a Bad Thing..  *
5110: 2f 0a 20 20 69 66 28 73 65 74 20 26 26 20 64 65  /.  if(set && de
5120: 73 63 29 7b 0a 20 20 20 20 40 20 3c 74 68 20 62  sc){.    @ <th b
5130: 67 63 6f 6c 6f 72 3d 22 25 73 28 42 47 31 29 22  gcolor="%s(BG1)"
5140: 20 63 6c 61 73 73 3d 22 62 6b 67 6e 64 31 22 3e   class="bkgnd1">
5150: 0a 20 20 20 20 40 20 20 20 3c 61 20 68 72 65 66  .    @   <a href
5160: 3d 22 72 70 74 76 69 65 77 3f 72 6e 3d 25 64 28  ="rptview?rn=%d(
5170: 72 6e 29 25 73 28 7a 45 78 74 72 61 29 22 3e 25  rn)%s(zExtra)">%
5180: 68 28 7a 43 6f 6c 29 3c 2f 61 3e 3c 2f 74 68 3e  h(zCol)</a></th>
5190: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
51a0: 28 73 65 74 29 7b 0a 20 20 20 20 20 20 40 20 3c  (set){.      @ <
51b0: 74 68 20 62 67 63 6f 6c 6f 72 3d 22 25 73 28 42  th bgcolor="%s(B
51c0: 47 31 29 22 20 63 6c 61 73 73 3d 22 62 6b 67 6e  G1)" class="bkgn
51d0: 64 31 22 3e 3c 61 0a 20 20 20 20 7d 65 6c 73 65  d1"><a.    }else
51e0: 7b 0a 20 20 20 20 20 20 40 20 3c 74 68 3e 3c 61  {.      @ <th><a
51f0: 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 68 72 65  .    }.    @ hre
5200: 66 3d 22 72 70 74 76 69 65 77 3f 72 6e 3d 25 64  f="rptview?rn=%d
5210: 28 72 6e 29 26 61 6d 70 3b 6f 72 64 65 72 5f 62  (rn)&amp;order_b
5220: 79 3d 25 64 28 6e 43 6f 6c 29 26 61 6d 70 3b 5c  y=%d(nCol)&amp;\
5230: 0a 20 20 20 20 40 20 6f 72 64 65 72 5f 64 69 72  .    @ order_dir
5240: 3d 25 73 28 64 65 73 63 3f 22 41 53 43 22 3a 22  =%s(desc?"ASC":"
5250: 44 45 53 43 22 29 5c 0a 20 20 20 20 40 20 25 73  DESC")\.    @ %s
5260: 28 7a 45 78 74 72 61 29 22 3e 25 68 28 7a 43 6f  (zExtra)">%h(zCo
5270: 6c 29 3c 2f 61 3e 3c 2f 74 68 3e 0a 20 20 7d 0a  l)</a></th>.  }.
5280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5290: 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  The state of the
52a0: 20 72 65 70 6f 72 74 20 67 65 6e 65 72 61 74 69   report generati
52b0: 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 47 65  on..*/.struct Ge
52c0: 6e 65 72 61 74 65 48 54 4d 4c 20 7b 0a 20 20 69  nerateHTML {.  i
52d0: 6e 74 20 72 6e 3b 20 20 20 20 20 20 20 20 20 20  nt rn;          
52e0: 2f 2a 20 52 65 70 6f 72 74 20 6e 75 6d 62 65 72  /* Report number
52f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 75 6e 74   */.  int nCount
5300: 3b 20 20 20 20 20 20 2f 2a 20 52 6f 77 20 6e 75  ;      /* Row nu
5310: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  mber */.  int nC
5320: 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ol;        /* Nu
5330: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
5340: 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 75 6c 74 69  */.  int isMulti
5350: 72 6f 77 3b 20 20 2f 2a 20 54 72 75 65 20 69 66  row;  /* True if
5360: 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 20   multiple table 
5370: 72 6f 77 73 20 70 65 72 20 71 75 65 72 79 20 72  rows per query r
5380: 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 69  esult row */.  i
5390: 6e 74 20 69 4e 65 77 52 6f 77 3b 20 20 20 20 20  nt iNewRow;     
53a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
53b0: 74 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 67 6f  t column that go
53c0: 65 73 20 6f 6e 20 73 65 70 61 72 61 74 65 20 72  es on separate r
53d0: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 67 3b  ow */.  int iBg;
53e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
53f0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 74 68 61 74  x of column that
5400: 20 64 65 66 69 6e 65 73 20 62 61 63 6b 67 72 6f   defines backgro
5410: 75 6e 64 20 63 6f 6c 6f 72 20 2a 2f 0a 7d 3b 0a  und color */.};.
5420: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62  ./*.** The callb
5430: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ack function for
5440: 20 64 62 5f 71 75 65 72 79 0a 2a 2f 0a 73 74 61   db_query.*/.sta
5450: 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65  tic int generate
5460: 5f 68 74 6d 6c 28 0a 20 20 76 6f 69 64 20 2a 70  _html(.  void *p
5470: 55 73 65 72 2c 20 20 20 20 20 2f 2a 20 50 6f 69  User,     /* Poi
5480: 6e 74 65 72 20 74 6f 20 6f 75 74 70 75 74 20 73  nter to output s
5490: 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  tate */.  int nA
54a0: 72 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  rg,        /* Nu
54b0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
54c0: 69 6e 20 74 68 69 73 20 72 65 73 75 6c 74 20 72  in this result r
54d0: 6f 77 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ow */.  char **a
54e0: 7a 41 72 67 2c 20 20 20 20 2f 2a 20 54 65 78 74  zArg,    /* Text
54f0: 20 6f 66 20 64 61 74 61 20 69 6e 20 61 6c 6c 20   of data in all 
5500: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61  columns */.  cha
5510: 72 20 2a 2a 61 7a 4e 61 6d 65 20 20 20 20 2f 2a  r **azName    /*
5520: 20 4e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f   Names of the co
5530: 6c 75 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 74  lumns */.){.  st
5540: 72 75 63 74 20 47 65 6e 65 72 61 74 65 48 54 4d  ruct GenerateHTM
5550: 4c 20 2a 70 53 74 61 74 65 20 3d 20 28 73 74 72  L *pState = (str
5560: 75 63 74 20 47 65 6e 65 72 61 74 65 48 54 4d 4c  uct GenerateHTML
5570: 2a 29 70 55 73 65 72 3b 0a 20 20 69 6e 74 20 69  *)pUser;.  int i
5580: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
5590: 7a 54 69 64 3b 20 20 2f 2a 20 54 69 63 6b 65 74  zTid;  /* Ticket
55a0: 20 55 55 49 44 2e 20 20 28 76 61 6c 75 65 20 6f   UUID.  (value o
55b0: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 27  f column named '
55c0: 23 27 29 20 2a 2f 0a 20 20 69 6e 74 20 72 6e 3b  #') */.  int rn;
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
55e0: 65 70 6f 72 74 20 6e 75 6d 62 65 72 20 2a 2f 0a  eport number */.
55f0: 20 20 63 68 61 72 20 2a 7a 42 67 20 3d 20 30 3b    char *zBg = 0;
5600: 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73       /* Use this
5610: 20 62 61 63 6b 67 72 6f 75 6e 64 20 63 6f 6c 6f   background colo
5620: 72 20 2a 2f 0a 20 20 63 68 61 72 20 7a 50 61 67  r */.  char zPag
5630: 65 5b 33 30 5d 3b 20 20 20 20 2f 2a 20 54 65 78  e[30];    /* Tex
5640: 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  t version of the
5650: 20 74 69 63 6b 65 74 20 6e 75 6d 62 65 72 20 2a   ticket number *
5660: 2f 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  /..  /* Get the 
5670: 72 65 70 6f 72 74 20 6e 75 6d 62 65 72 0a 20 20  report number.  
5680: 2a 2f 0a 20 20 72 6e 20 3d 20 70 53 74 61 74 65  */.  rn = pState
5690: 2d 3e 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f 20 69  ->rn;..  /* Do i
56a0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
56b0: 2a 2f 0a 20 20 69 66 28 20 70 53 74 61 74 65 2d  */.  if( pState-
56c0: 3e 6e 43 6f 75 6e 74 3d 3d 30 20 29 7b 0a 20 20  >nCount==0 ){.  
56d0: 20 20 2f 2a 20 54 75 72 6e 20 6f 66 66 20 74 68    /* Turn off th
56e0: 65 20 61 75 74 68 6f 72 69 7a 65 72 2e 20 20 49  e authorizer.  I
56f0: 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 64  t is no longer d
5700: 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 73 69  oing anything si
5710: 6e 63 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 71  nce the.    ** q
5720: 75 65 72 79 20 68 61 73 20 61 6c 72 65 61 64 79  uery has already
5730: 20 62 65 65 6e 20 70 72 65 70 61 72 65 64 2e 0a   been prepared..
5740: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
5750: 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65  e3_set_authorize
5760: 72 28 67 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 0a  r(g.db, 0, 0);..
5770: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
5780: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
5790: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 20 63 6f 6c  columns, the col
57a0: 75 6d 6e 20 74 68 61 74 20 64 65 74 65 72 6d 69  umn that determi
57b0: 6e 65 73 20 62 61 63 6b 67 72 6f 75 6e 64 0a 20  nes background. 
57c0: 20 20 20 2a 2a 20 63 6f 6c 6f 72 2c 20 61 6e 64     ** color, and
57d0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
57e0: 74 68 69 73 20 72 6f 77 20 6f 66 20 64 61 74 61  this row of data
57f0: 20 69 73 20 72 65 70 72 65 73 65 6e 74 65 64 20   is represented 
5800: 62 79 20 6d 75 6c 74 69 70 6c 65 0a 20 20 20 20  by multiple.    
5810: 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  ** rows in the t
5820: 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
5830: 20 70 53 74 61 74 65 2d 3e 6e 43 6f 6c 20 3d 20   pState->nCol = 
5840: 30 3b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e 69  0;.    pState->i
5850: 73 4d 75 6c 74 69 72 6f 77 20 3d 20 30 3b 0a 20  sMultirow = 0;. 
5860: 20 20 20 70 53 74 61 74 65 2d 3e 69 4e 65 77 52     pState->iNewR
5870: 6f 77 20 3d 20 2d 31 3b 0a 20 20 20 20 70 53 74  ow = -1;.    pSt
5880: 61 74 65 2d 3e 69 42 67 20 3d 20 2d 31 3b 0a 20  ate->iBg = -1;. 
5890: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
58a0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
58b0: 69 66 28 20 61 7a 4e 61 6d 65 5b 69 5d 5b 30 5d  if( azName[i][0]
58c0: 3d 3d 27 62 27 20 26 26 20 73 74 72 63 6d 70 28  =='b' && strcmp(
58d0: 61 7a 4e 61 6d 65 5b 69 5d 2c 22 62 67 63 6f 6c  azName[i],"bgcol
58e0: 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
58f0: 20 20 20 70 53 74 61 74 65 2d 3e 69 42 67 20 3d     pState->iBg =
5900: 20 69 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   i;.        cont
5910: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
5920: 20 20 20 20 69 66 28 20 67 2e 6f 6b 57 72 69 74      if( g.okWrit
5930: 65 20 26 26 20 61 7a 4e 61 6d 65 5b 69 5d 5b 30  e && azName[i][0
5940: 5d 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20  ]=='#' ){.      
5950: 20 20 70 53 74 61 74 65 2d 3e 6e 43 6f 6c 2b 2b    pState->nCol++
5960: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5970: 69 66 28 20 21 70 53 74 61 74 65 2d 3e 69 73 4d  if( !pState->isM
5980: 75 6c 74 69 72 6f 77 20 29 7b 0a 20 20 20 20 20  ultirow ){.     
5990: 20 20 20 69 66 28 20 61 7a 4e 61 6d 65 5b 69 5d     if( azName[i]
59a0: 5b 30 5d 3d 3d 27 5f 27 20 29 7b 0a 20 20 20 20  [0]=='_' ){.    
59b0: 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 69 73        pState->is
59c0: 4d 75 6c 74 69 72 6f 77 20 3d 20 31 3b 0a 20 20  Multirow = 1;.  
59d0: 20 20 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e          pState->
59e0: 69 4e 65 77 52 6f 77 20 3d 20 69 3b 0a 20 20 20  iNewRow = i;.   
59f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5a00: 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 6e 43        pState->nC
5a10: 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ol++;.        }.
5a20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
5a30: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
5a40: 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
5a50: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 6f 75 74  e is called, out
5a60: 70 75 74 20 61 20 74 61 62 6c 65 20 68 65 61 64  put a table head
5a70: 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20 40 20  er.    */.    @ 
5a80: 3c 74 72 3e 0a 20 20 20 20 7a 54 69 64 20 3d 20  <tr>.    zTid = 
5a90: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
5aa0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
5ab0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
5ac0: 3d 20 61 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20  = azName[i];.   
5ad0: 20 20 20 69 66 28 20 69 3d 3d 70 53 74 61 74 65     if( i==pState
5ae0: 2d 3e 69 42 67 20 29 20 63 6f 6e 74 69 6e 75 65  ->iBg ) continue
5af0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 61  ;.      if( pSta
5b00: 74 65 2d 3e 69 4e 65 77 52 6f 77 3e 3d 30 20 26  te->iNewRow>=0 &
5b10: 26 20 69 3e 3d 70 53 74 61 74 65 2d 3e 69 4e 65  & i>=pState->iNe
5b20: 77 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  wRow ){.        
5b30: 69 66 28 20 67 2e 6f 6b 57 72 69 74 65 20 26 26  if( g.okWrite &&
5b40: 20 7a 54 69 64 20 29 7b 0a 20 20 20 20 20 20 20   zTid ){.       
5b50: 20 20 20 40 20 3c 74 68 3e 26 6e 62 73 70 3b 3c     @ <th>&nbsp;<
5b60: 2f 74 68 3e 0a 20 20 20 20 20 20 20 20 20 20 7a  /th>.          z
5b70: 54 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tid = 0;.       
5b80: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
5b90: 4e 61 6d 65 5b 30 5d 3d 3d 27 5f 27 20 29 20 7a  Name[0]=='_' ) z
5ba0: 4e 61 6d 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Name++;.        
5bb0: 40 20 3c 2f 74 72 3e 3c 74 72 3e 3c 74 68 20 63  @ </tr><tr><th c
5bc0: 6f 6c 73 70 61 6e 3d 25 64 28 70 53 74 61 74 65  olspan=%d(pState
5bd0: 2d 3e 6e 43 6f 6c 29 3e 25 68 28 7a 4e 61 6d 65  ->nCol)>%h(zName
5be0: 29 3c 2f 74 68 3e 0a 20 20 20 20 20 20 7d 65 6c  )</th>.      }el
5bf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
5c00: 7a 4e 61 6d 65 5b 30 5d 3d 3d 27 23 27 20 29 7b  zName[0]=='#' ){
5c10: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 69 64 20  .          zTid 
5c20: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
5c30: 20 7d 0a 20 20 20 20 20 20 20 20 40 20 3c 74 68   }.        @ <th
5c40: 3e 25 68 28 7a 4e 61 6d 65 29 3c 2f 74 68 3e 0a  >%h(zName)</th>.
5c50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5c60: 20 20 69 66 28 20 67 2e 6f 6b 57 72 69 74 65 20    if( g.okWrite 
5c70: 26 26 20 7a 54 69 64 20 29 7b 0a 20 20 20 20 20  && zTid ){.     
5c80: 20 40 20 3c 74 68 3e 26 6e 62 73 70 3b 3c 2f 74   @ <th>&nbsp;</t
5c90: 68 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 3c  h>.    }.    @ <
5ca0: 2f 74 72 3e 0a 20 20 7d 0a 20 20 69 66 28 20 61  /tr>.  }.  if( a
5cb0: 7a 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 40  zArg==0 ){.    @
5cc0: 20 3c 74 72 3e 3c 74 64 20 63 6f 6c 73 70 61 6e   <tr><td colspan
5cd0: 3d 22 25 64 28 70 53 74 61 74 65 2d 3e 6e 43 6f  ="%d(pState->nCo
5ce0: 6c 29 22 3e 0a 20 20 20 20 40 20 3c 69 3e 4e 6f  l)">.    @ <i>No
5cf0: 20 72 65 63 6f 72 64 73 20 6d 61 74 63 68 20 74   records match t
5d00: 68 65 20 72 65 70 6f 72 74 20 63 72 69 74 65 72  he report criter
5d10: 69 61 3c 2f 69 3e 0a 20 20 20 20 40 20 3c 2f 74  ia</i>.    @ </t
5d20: 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 72 65 74 75  d></tr>.    retu
5d30: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2b 2b 70 53  rn 0;.  }.  ++pS
5d40: 74 61 74 65 2d 3e 6e 43 6f 75 6e 74 3b 0a 0a 20  tate->nCount;.. 
5d50: 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73   /* Output the s
5d60: 65 70 61 72 61 74 6f 72 20 61 62 6f 76 65 20 65  eparator above e
5d70: 61 63 68 20 65 6e 74 72 79 20 69 6e 20 61 20 74  ach entry in a t
5d80: 61 62 6c 65 20 77 68 69 63 68 20 68 61 73 20 6d  able which has m
5d90: 75 6c 74 69 70 6c 65 20 6c 69 6e 65 73 0a 20 20  ultiple lines.  
5da0: 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20  ** per database 
5db0: 65 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  entry..  */.  if
5dc0: 28 20 70 53 74 61 74 65 2d 3e 69 4e 65 77 52 6f  ( pState->iNewRo
5dd0: 77 3e 3d 30 20 29 7b 0a 20 20 20 20 40 20 3c 74  w>=0 ){.    @ <t
5de0: 72 3e 3c 74 64 20 63 6f 6c 73 70 61 6e 3d 25 64  r><td colspan=%d
5df0: 28 70 53 74 61 74 65 2d 3e 6e 43 6f 6c 29 3e 3c  (pState->nCol)><
5e00: 66 6f 6e 74 20 73 69 7a 65 3d 31 3e 26 6e 62 73  font size=1>&nbs
5e10: 70 3b 3c 2f 66 6f 6e 74 3e 3c 2f 74 64 3e 3c 2f  p;</font></td></
5e20: 74 72 3e 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75  tr>.  }..  /* Ou
5e30: 74 70 75 74 20 74 68 65 20 64 61 74 61 20 66 6f  tput the data fo
5e40: 72 20 74 68 69 73 20 65 6e 74 72 79 20 66 72 6f  r this entry fro
5e50: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  m the database. 
5e60: 20 2a 2f 0a 20 20 7a 42 67 20 3d 20 70 53 74 61   */.  zBg = pSta
5e70: 74 65 2d 3e 69 42 67 3e 3d 30 20 3f 20 61 7a 41  te->iBg>=0 ? azA
5e80: 72 67 5b 70 53 74 61 74 65 2d 3e 69 42 67 5d 20  rg[pState->iBg] 
5e90: 3a 20 30 3b 0a 20 20 69 66 28 20 7a 42 67 3d 3d  : 0;.  if( zBg==
5ea0: 30 20 29 20 7a 42 67 20 3d 20 22 77 68 69 74 65  0 ) zBg = "white
5eb0: 22 3b 0a 20 20 40 20 3c 74 72 20 62 67 63 6f 6c  ";.  @ <tr bgcol
5ec0: 6f 72 3d 22 25 68 28 7a 42 67 29 22 3e 0a 20 20  or="%h(zBg)">.  
5ed0: 7a 54 69 64 20 3d 20 30 3b 0a 20 20 7a 50 61 67  zTid = 0;.  zPag
5ee0: 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28  e[0] = 0;.  for(
5ef0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
5f00: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 61  ){.    char *zDa
5f10: 74 61 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 70  ta;.    if( i==p
5f20: 53 74 61 74 65 2d 3e 69 42 67 20 29 20 63 6f 6e  State->iBg ) con
5f30: 74 69 6e 75 65 3b 0a 20 20 20 20 7a 44 61 74 61  tinue;.    zData
5f40: 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
5f50: 20 69 66 28 20 7a 44 61 74 61 3d 3d 30 20 29 20   if( zData==0 ) 
5f60: 7a 44 61 74 61 20 3d 20 22 22 3b 0a 20 20 20 20  zData = "";.    
5f70: 69 66 28 20 70 53 74 61 74 65 2d 3e 69 4e 65 77  if( pState->iNew
5f80: 52 6f 77 3e 3d 30 20 26 26 20 69 3e 3d 70 53 74  Row>=0 && i>=pSt
5f90: 61 74 65 2d 3e 69 4e 65 77 52 6f 77 20 29 7b 0a  ate->iNewRow ){.
5fa0: 20 20 20 20 20 20 69 66 28 20 7a 54 69 64 20 26        if( zTid &
5fb0: 26 20 67 2e 6f 6b 57 72 69 74 65 20 29 7b 0a 20  & g.okWrite ){. 
5fc0: 20 20 20 20 20 20 20 40 20 3c 74 64 20 76 61 6c         @ <td val
5fd0: 69 67 6e 3d 22 74 6f 70 22 3e 3c 61 20 68 72 65  ign="top"><a hre
5fe0: 66 3d 22 74 6b 74 65 64 69 74 2f 25 68 28 7a 54  f="tktedit/%h(zT
5ff0: 69 64 29 22 3e 65 64 69 74 3c 2f 61 3e 3c 2f 74  id)">edit</a></t
6000: 64 3e 0a 20 20 20 20 20 20 20 20 7a 54 69 64 20  d>.        zTid 
6010: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
6020: 20 20 20 69 66 28 20 7a 44 61 74 61 5b 30 5d 20     if( zData[0] 
6030: 29 7b 0a 20 20 20 20 20 20 20 20 42 6c 6f 62 20  ){.        Blob 
6040: 63 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  content;.       
6050: 20 40 20 3c 2f 74 72 3e 3c 74 72 20 62 67 63 6f   @ </tr><tr bgco
6060: 6c 6f 72 3d 22 25 68 28 7a 42 67 29 22 3e 3c 74  lor="%h(zBg)"><t
6070: 64 20 63 6f 6c 73 70 61 6e 3d 25 64 28 70 53 74  d colspan=%d(pSt
6080: 61 74 65 2d 3e 6e 43 6f 6c 29 3e 0a 20 20 20 20  ate->nCol)>.    
6090: 20 20 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 63      blob_init(&c
60a0: 6f 6e 74 65 6e 74 2c 20 7a 44 61 74 61 2c 20 2d  ontent, zData, -
60b0: 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6b 69  1);.        wiki
60c0: 5f 63 6f 6e 76 65 72 74 28 26 63 6f 6e 74 65 6e  _convert(&conten
60d0: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
60e0: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 6f    blob_reset(&co
60f0: 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntent);.      }.
6100: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 7a      }else if( az
6110: 4e 61 6d 65 5b 69 5d 5b 30 5d 3d 3d 27 23 27 20  Name[i][0]=='#' 
6120: 29 7b 0a 20 20 20 20 20 20 7a 54 69 64 20 3d 20  ){.      zTid = 
6130: 7a 44 61 74 61 3b 0a 20 20 20 20 20 20 69 66 28  zData;.      if(
6140: 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a   g.okHistory ){.
6150: 20 20 20 20 20 20 20 20 40 20 3c 74 64 20 76 61          @ <td va
6160: 6c 69 67 6e 3d 22 74 6f 70 22 3e 3c 61 20 68 72  lign="top"><a hr
6170: 65 66 3d 22 74 6b 74 76 69 65 77 3f 6e 61 6d 65  ef="tktview?name
6180: 3d 25 68 28 7a 44 61 74 61 29 22 3e 25 68 28 7a  =%h(zData)">%h(z
6190: 44 61 74 61 29 3c 2f 61 3e 3c 2f 74 64 3e 0a 20  Data)</a></td>. 
61a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
61b0: 20 20 20 20 40 20 3c 74 64 20 76 61 6c 69 67 6e      @ <td valign
61c0: 3d 22 74 6f 70 22 3e 25 68 28 7a 44 61 74 61 29  ="top">%h(zData)
61d0: 3c 2f 74 64 3e 0a 20 20 20 20 20 20 7d 0a 20 20  </td>.      }.  
61e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 61 74    }else if( zDat
61f0: 61 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  a[0]==0 ){.     
6200: 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74   @ <td valign="t
6210: 6f 70 22 3e 26 6e 62 73 70 3b 3c 2f 74 64 3e 0a  op">&nbsp;</td>.
6220: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6230: 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74   @ <td valign="t
6240: 6f 70 22 3e 0a 20 20 20 20 20 20 40 20 25 68 28  op">.      @ %h(
6250: 7a 44 61 74 61 29 0a 20 20 20 20 20 20 40 20 3c  zData).      @ <
6260: 2f 74 64 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  /td>.    }.  }. 
6270: 20 69 66 28 20 7a 54 69 64 20 26 26 20 67 2e 6f   if( zTid && g.o
6280: 6b 57 72 69 74 65 20 29 7b 0a 20 20 20 20 40 20  kWrite ){.    @ 
6290: 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22  <td valign="top"
62a0: 3e 3c 61 20 68 72 65 66 3d 22 74 6b 74 65 64 69  ><a href="tktedi
62b0: 74 2f 25 68 28 7a 54 69 64 29 22 3e 65 64 69 74  t/%h(zTid)">edit
62c0: 3c 2f 61 3e 3c 2f 74 64 3e 0a 20 20 7d 0a 20 20  </a></td>.  }.  
62d0: 40 20 3c 2f 74 72 3e 0a 20 20 72 65 74 75 72 6e  @ </tr>.  return
62e0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74   0;.}../*.** Out
62f0: 70 75 74 20 74 68 65 20 74 65 78 74 20 67 69 76  put the text giv
6300: 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
6310: 6e 74 2e 20 20 43 6f 6e 76 65 72 74 20 74 61 62  nt.  Convert tab
6320: 73 20 61 6e 64 20 6e 65 77 6c 69 6e 65 73 20 69  s and newlines i
6330: 6e 74 6f 0a 2a 2a 20 73 70 61 63 65 73 2e 0a 2a  nto.** spaces..*
6340: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
6350: 74 70 75 74 5f 6e 6f 5f 74 61 62 73 28 63 6f 6e  tput_no_tabs(con
6360: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 77  st char *z){.  w
6370: 68 69 6c 65 28 20 7a 20 26 26 20 7a 5b 30 5d 20  hile( z && z[0] 
6380: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
6390: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  .    for(i=0; z[
63a0: 69 5d 20 26 26 20 28 21 69 73 73 70 61 63 65 28  i] && (!isspace(
63b0: 7a 5b 69 5d 29 20 7c 7c 20 7a 5b 69 5d 3d 3d 27  z[i]) || z[i]=='
63c0: 20 27 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20   '); i++){}.    
63d0: 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
63e0: 20 63 67 69 5f 70 72 69 6e 74 66 28 22 25 2e 2a   cgi_printf("%.*
63f0: 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 7d  s", i, z);.    }
6400: 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 69 73  .    for(j=i; is
6410: 73 70 61 63 65 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b  space(z[j]); j++
6420: 29 7b 7d 0a 20 20 20 20 69 66 28 20 6a 3e 69 20  ){}.    if( j>i 
6430: 29 7b 0a 20 20 20 20 20 20 63 67 69 5f 70 72 69  ){.      cgi_pri
6440: 6e 74 66 28 22 25 2a 73 22 2c 20 6a 2d 69 2c 20  ntf("%*s", j-i, 
6450: 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  "");.    }.    z
6460: 20 2b 3d 20 6a 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   += j;.  }.}../*
6470: 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 72 6f 77  .** Output a row
6480: 20 61 73 20 61 20 74 61 62 2d 73 65 70 61 72 61   as a tab-separa
6490: 74 65 64 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  ted line of text
64a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
64b0: 6f 75 74 70 75 74 5f 74 61 62 5f 73 65 70 61 72  output_tab_separ
64c0: 61 74 65 64 28 0a 20 20 76 6f 69 64 20 2a 70 55  ated(.  void *pU
64d0: 73 65 72 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ser,     /* Poin
64e0: 74 65 72 20 74 6f 20 72 6f 77 2d 63 6f 75 6e 74  ter to row-count
64f0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 69 6e   integer */.  in
6500: 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 2f  t nArg,        /
6510: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
6520: 6d 6e 73 20 69 6e 20 74 68 69 73 20 72 65 73 75  mns in this resu
6530: 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 63 68 61 72  lt row */.  char
6540: 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 2f 2a 20   **azArg,    /* 
6550: 54 65 78 74 20 6f 66 20 64 61 74 61 20 69 6e 20  Text of data in 
6560: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  all columns */. 
6570: 20 63 68 61 72 20 2a 2a 61 7a 4e 61 6d 65 20 20   char **azName  
6580: 20 20 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 74 68    /* Names of th
6590: 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 29 7b 0a  e columns */.){.
65a0: 20 20 69 6e 74 20 2a 70 43 6f 75 6e 74 20 3d 20    int *pCount = 
65b0: 28 69 6e 74 2a 29 70 55 73 65 72 3b 0a 20 20 69  (int*)pUser;.  i
65c0: 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 2a 70 43  nt i;..  if( *pC
65d0: 6f 75 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ount==0 ){.    f
65e0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
65f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6f 75 74 70  i++){.      outp
6600: 75 74 5f 6e 6f 5f 74 61 62 73 28 61 7a 4e 61 6d  ut_no_tabs(azNam
6610: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 67 69  e[i]);.      cgi
6620: 5f 70 72 69 6e 74 66 28 22 25 63 22 2c 20 69 3c  _printf("%c", i<
6630: 6e 41 72 67 2d 31 20 3f 20 27 5c 74 27 20 3a 20  nArg-1 ? '\t' : 
6640: 27 5c 6e 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  '\n');.    }.  }
6650: 0a 20 20 2b 2b 2a 70 43 6f 75 6e 74 3b 0a 20 20  .  ++*pCount;.  
6660: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
6670: 20 69 2b 2b 29 7b 0a 20 20 20 20 6f 75 74 70 75   i++){.    outpu
6680: 74 5f 6e 6f 5f 74 61 62 73 28 61 7a 41 72 67 5b  t_no_tabs(azArg[
6690: 69 5d 29 3b 0a 20 20 20 20 63 67 69 5f 70 72 69  i]);.    cgi_pri
66a0: 6e 74 66 28 22 25 63 22 2c 20 69 3c 6e 41 72 67  ntf("%c", i<nArg
66b0: 2d 31 20 3f 20 27 5c 74 27 20 3a 20 27 5c 6e 27  -1 ? '\t' : '\n'
66c0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
66d0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
66e0: 72 61 74 65 20 48 54 4d 4c 20 74 68 61 74 20 64  rate HTML that d
66f0: 65 73 63 72 69 62 65 73 20 61 20 63 6f 6c 6f 72  escribes a color
6700: 20 6b 65 79 2e 0a 2a 2f 0a 76 6f 69 64 20 6f 75   key..*/.void ou
6710: 74 70 75 74 5f 63 6f 6c 6f 72 5f 6b 65 79 28 63  tput_color_key(c
6720: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6c 72 4b  onst char *zClrK
6730: 65 79 2c 20 69 6e 74 20 68 6f 72 69 7a 2c 20 63  ey, int horiz, c
6740: 68 61 72 20 2a 7a 54 61 62 41 72 67 73 29 7b 0a  har *zTabArgs){.
6750: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20    int i, j, k;. 
6760: 20 63 68 61 72 20 2a 7a 53 61 66 65 4b 65 79 2c   char *zSafeKey,
6770: 20 2a 7a 54 6f 46 72 65 65 3b 0a 20 20 77 68 69   *zToFree;.  whi
6780: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a 43 6c  le( isspace(*zCl
6790: 72 4b 65 79 29 20 29 20 7a 43 6c 72 4b 65 79 2b  rKey) ) zClrKey+
67a0: 2b 3b 0a 20 20 69 66 28 20 7a 43 6c 72 4b 65 79  +;.  if( zClrKey
67b0: 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  [0]==0 ) return;
67c0: 0a 20 20 40 20 3c 74 61 62 6c 65 20 25 73 28 7a  .  @ <table %s(z
67d0: 54 61 62 41 72 67 73 29 3e 0a 20 20 69 66 28 20  TabArgs)>.  if( 
67e0: 68 6f 72 69 7a 20 29 7b 0a 20 20 20 20 40 20 3c  horiz ){.    @ <
67f0: 74 72 3e 0a 20 20 7d 0a 20 20 7a 54 6f 46 72 65  tr>.  }.  zToFre
6800: 65 20 3d 20 7a 53 61 66 65 4b 65 79 20 3d 20 6d  e = zSafeKey = m
6810: 70 72 69 6e 74 66 28 22 25 68 22 2c 20 7a 43 6c  printf("%h", zCl
6820: 72 4b 65 79 29 3b 0a 20 20 77 68 69 6c 65 28 20  rKey);.  while( 
6830: 7a 53 61 66 65 4b 65 79 5b 30 5d 20 29 7b 0a 20  zSafeKey[0] ){. 
6840: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
6850: 65 28 2a 7a 53 61 66 65 4b 65 79 29 20 29 20 7a  e(*zSafeKey) ) z
6860: 53 61 66 65 4b 65 79 2b 2b 3b 0a 20 20 20 20 66  SafeKey++;.    f
6870: 6f 72 28 69 3d 30 3b 20 7a 53 61 66 65 4b 65 79  or(i=0; zSafeKey
6880: 5b 69 5d 20 26 26 20 21 69 73 73 70 61 63 65 28  [i] && !isspace(
6890: 7a 53 61 66 65 4b 65 79 5b 69 5d 29 3b 20 69 2b  zSafeKey[i]); i+
68a0: 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 69  +){}.    for(j=i
68b0: 3b 20 69 73 73 70 61 63 65 28 7a 53 61 66 65 4b  ; isspace(zSafeK
68c0: 65 79 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20  ey[j]); j++){}. 
68d0: 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 7a 53 61 66     for(k=j; zSaf
68e0: 65 4b 65 79 5b 6b 5d 20 26 26 20 7a 53 61 66 65  eKey[k] && zSafe
68f0: 4b 65 79 5b 6b 5d 21 3d 27 5c 6e 27 20 26 26 20  Key[k]!='\n' && 
6900: 7a 53 61 66 65 4b 65 79 5b 6b 5d 21 3d 27 5c 72  zSafeKey[k]!='\r
6910: 27 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 69 66  '; k++){}.    if
6920: 28 20 21 68 6f 72 69 7a 20 29 7b 0a 20 20 20 20  ( !horiz ){.    
6930: 20 20 63 67 69 5f 70 72 69 6e 74 66 28 22 3c 74    cgi_printf("<t
6940: 72 20 62 67 63 6f 6c 6f 72 3d 5c 22 25 2e 2a 73  r bgcolor=\"%.*s
6950: 5c 22 3e 3c 74 64 3e 25 2e 2a 73 3c 2f 74 64 3e  \"><td>%.*s</td>
6960: 3c 2f 74 72 3e 5c 6e 22 2c 0a 20 20 20 20 20 20  </tr>\n",.      
6970: 20 20 69 2c 20 7a 53 61 66 65 4b 65 79 2c 20 6b    i, zSafeKey, k
6980: 2d 6a 2c 20 26 7a 53 61 66 65 4b 65 79 5b 6a 5d  -j, &zSafeKey[j]
6990: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
69a0: 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66 28 22      cgi_printf("
69b0: 3c 74 64 20 62 67 63 6f 6c 6f 72 3d 5c 22 25 2e  <td bgcolor=\"%.
69c0: 2a 73 5c 22 3e 25 2e 2a 73 3c 2f 74 64 3e 5c 6e  *s\">%.*s</td>\n
69d0: 22 2c 0a 20 20 20 20 20 20 20 20 69 2c 20 7a 53  ",.        i, zS
69e0: 61 66 65 4b 65 79 2c 20 6b 2d 6a 2c 20 26 7a 53  afeKey, k-j, &zS
69f0: 61 66 65 4b 65 79 5b 6a 5d 29 3b 0a 20 20 20 20  afeKey[j]);.    
6a00: 7d 0a 20 20 20 20 7a 53 61 66 65 4b 65 79 20 2b  }.    zSafeKey +
6a10: 3d 20 6b 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28  = k;.  }.  free(
6a20: 7a 54 6f 46 72 65 65 29 3b 0a 20 20 69 66 28 20  zToFree);.  if( 
6a30: 68 6f 72 69 7a 20 29 7b 0a 20 20 20 20 40 20 3c  horiz ){.    @ <
6a40: 2f 74 72 3e 0a 20 20 7d 0a 20 20 40 20 3c 2f 74  /tr>.  }.  @ </t
6a50: 61 62 6c 65 3e 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  able>.}.../*.** 
6a60: 57 45 42 50 41 47 45 3a 20 2f 72 70 74 76 69 65  WEBPAGE: /rptvie
6a70: 77 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  w.**.** Generate
6a80: 20 61 20 72 65 70 6f 72 74 2e 20 20 54 68 65 20   a report.  The 
6a90: 72 6e 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  rn query paramet
6aa0: 65 72 20 69 73 20 74 68 65 20 72 65 70 6f 72 74  er is the report
6ab0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 63 6f 72 72 65   number.** corre
6ac0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 52 45 50 4f  sponding to REPO
6ad0: 52 54 46 4d 54 2e 52 4e 2e 20 20 49 66 20 74 68  RTFMT.RN.  If th
6ae0: 65 20 74 61 62 6c 69 73 74 20 71 75 65 72 79 20  e tablist query 
6af0: 70 61 72 61 6d 65 74 65 72 20 65 78 69 73 74 73  parameter exists
6b00: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 75  ,.** then the ou
6b10: 74 70 75 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  tput consists of
6b20: 20 6c 69 6e 65 73 20 6f 66 20 74 61 62 2d 73 65   lines of tab-se
6b30: 70 61 72 61 74 65 64 20 66 69 65 6c 64 73 20 69  parated fields i
6b40: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 6e 20  nstead of.** an 
6b50: 48 54 4d 4c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  HTML table..*/.v
6b60: 6f 69 64 20 72 70 74 76 69 65 77 5f 70 61 67 65  oid rptview_page
6b70: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 63 6f  (void){.  int co
6b80: 75 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  unt = 0;.  int r
6b90: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  n;.  char *zSql;
6ba0: 0a 20 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 3b  .  char *zTitle;
6bb0: 0a 20 20 63 68 61 72 20 2a 7a 4f 77 6e 65 72 3b  .  char *zOwner;
6bc0: 0a 20 20 63 68 61 72 20 2a 7a 43 6c 72 4b 65 79  .  char *zClrKey
6bd0: 3b 0a 20 20 69 6e 74 20 74 61 62 73 3b 0a 20 20  ;.  int tabs;.  
6be0: 53 74 6d 74 20 71 3b 0a 20 20 63 68 61 72 20 2a  Stmt q;.  char *
6bf0: 7a 45 72 72 31 20 3d 20 30 3b 0a 20 20 63 68 61  zErr1 = 0;.  cha
6c00: 72 20 2a 7a 45 72 72 32 20 3d 20 30 3b 0a 0a 20  r *zErr2 = 0;.. 
6c10: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65   login_check_cre
6c20: 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66  dentials();.  if
6c30: 28 20 21 67 2e 6f 6b 52 65 61 64 20 29 7b 20 6c  ( !g.okRead ){ l
6c40: 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72  ogin_needed(); r
6c50: 65 74 75 72 6e 3b 20 7d 0a 20 20 72 6e 20 3d 20  eturn; }.  rn = 
6c60: 61 74 6f 69 28 50 44 28 22 72 6e 22 2c 22 30 22  atoi(PD("rn","0"
6c70: 29 29 3b 0a 20 20 69 66 28 20 72 6e 3d 3d 30 20  ));.  if( rn==0 
6c80: 29 7b 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72  ){.    cgi_redir
6c90: 65 63 74 28 22 72 65 70 6f 72 74 6c 69 73 74 22  ect("reportlist"
6ca0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
6cb0: 20 7d 0a 20 20 74 61 62 73 20 3d 20 50 28 22 74   }.  tabs = P("t
6cc0: 61 62 6c 69 73 74 22 29 21 3d 30 3b 0a 20 20 2f  ablist")!=0;.  /
6cd0: 2a 20 76 69 65 77 5f 61 64 64 5f 66 75 6e 63 74  * view_add_funct
6ce0: 69 6f 6e 73 28 74 61 62 73 29 3b 20 2a 2f 0a 20  ions(tabs); */. 
6cf0: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a   db_prepare(&q,.
6d00: 20 20 20 20 22 53 45 4c 45 43 54 20 74 69 74 6c      "SELECT titl
6d10: 65 2c 20 73 71 6c 63 6f 64 65 2c 20 6f 77 6e 65  e, sqlcode, owne
6d20: 72 2c 20 63 6f 6c 73 20 46 52 4f 4d 20 72 65 70  r, cols FROM rep
6d30: 6f 72 74 66 6d 74 20 57 48 45 52 45 20 72 6e 3d  ortfmt WHERE rn=
6d40: 25 64 22 2c 20 72 6e 29 3b 0a 20 20 69 66 28 20  %d", rn);.  if( 
6d50: 64 62 5f 73 74 65 70 28 26 71 29 21 3d 53 51 4c  db_step(&q)!=SQL
6d60: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
6d70: 67 69 5f 72 65 64 69 72 65 63 74 28 22 72 65 70  gi_redirect("rep
6d80: 6f 72 74 6c 69 73 74 22 29 3b 0a 20 20 20 20 72  ortlist");.    r
6d90: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 54 69  eturn;.  }.  zTi
6da0: 74 6c 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  tle = db_column_
6db0: 6d 61 6c 6c 6f 63 28 26 71 2c 20 30 29 3b 0a 20  malloc(&q, 0);. 
6dc0: 20 7a 53 71 6c 20 3d 20 64 62 5f 63 6f 6c 75 6d   zSql = db_colum
6dd0: 6e 5f 6d 61 6c 6c 6f 63 28 26 71 2c 20 31 29 3b  n_malloc(&q, 1);
6de0: 0a 20 20 7a 4f 77 6e 65 72 20 3d 20 64 62 5f 63  .  zOwner = db_c
6df0: 6f 6c 75 6d 6e 5f 6d 61 6c 6c 6f 63 28 26 71 2c  olumn_malloc(&q,
6e00: 20 32 29 3b 0a 20 20 7a 43 6c 72 4b 65 79 20 3d   2);.  zClrKey =
6e10: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c 6c 6f   db_column_mallo
6e20: 63 28 26 71 2c 20 33 29 3b 0a 20 20 64 62 5f 66  c(&q, 3);.  db_f
6e30: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 0a 20 20  inalize(&q);..  
6e40: 69 66 28 20 50 28 22 6f 72 64 65 72 5f 62 79 22  if( P("order_by"
6e50: 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
6e60: 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 77  ** If the user w
6e70: 61 6e 74 73 20 74 6f 20 64 6f 20 61 20 63 6f 6c  ants to do a col
6e80: 75 6d 6e 20 73 6f 72 74 2c 20 77 72 61 70 20 74  umn sort, wrap t
6e90: 68 65 20 71 75 65 72 79 20 69 6e 74 6f 20 61 20  he query into a 
6ea0: 73 75 62 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  sub.    ** query
6eb0: 20 61 6e 64 20 74 68 65 6e 20 73 6f 72 74 20 74   and then sort t
6ec0: 68 65 20 72 65 73 75 6c 74 73 2e 20 54 68 69 73  he results. This
6ed0: 20 69 73 20 61 20 77 68 6f 6c 65 20 6c 6f 74 20   is a whole lot 
6ee0: 65 61 73 69 65 72 20 74 68 61 6e 0a 20 20 20 20  easier than.    
6ef0: 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 69 6e 73  ** trying to ins
6f00: 65 72 74 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ert an ORDER BY 
6f10: 69 6e 74 6f 20 74 68 65 20 71 75 65 72 79 20 69  into the query i
6f20: 74 73 65 6c 66 2c 20 65 73 70 65 63 69 61 6c 6c  tself, especiall
6f30: 79 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20  y.    ** if the 
6f40: 71 75 65 72 79 20 69 73 20 61 6c 72 65 61 64 79  query is already
6f50: 20 6f 72 64 65 72 65 64 2e 0a 20 20 20 20 2a 2f   ordered..    */
6f60: 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 20  .    int nField 
6f70: 3d 20 61 74 6f 69 28 50 28 22 6f 72 64 65 72 5f  = atoi(P("order_
6f80: 62 79 22 29 29 3b 0a 20 20 20 20 69 66 28 20 6e  by"));.    if( n
6f90: 46 69 65 6c 64 20 3e 20 30 20 29 7b 0a 20 20 20  Field > 0 ){.   
6fa0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 7a     const char* z
6fb0: 44 69 72 20 3d 20 50 44 28 22 6f 72 64 65 72 5f  Dir = PD("order_
6fc0: 64 69 72 22 2c 22 22 29 3b 0a 20 20 20 20 20 20  dir","");.      
6fd0: 7a 44 69 72 20 3d 20 21 73 74 72 63 6d 70 28 22  zDir = !strcmp("
6fe0: 41 53 43 22 2c 7a 44 69 72 29 20 3f 20 22 41 53  ASC",zDir) ? "AS
6ff0: 43 22 20 3a 20 22 44 45 53 43 22 3b 0a 20 20 20  C" : "DESC";.   
7000: 20 20 20 7a 53 71 6c 20 3d 20 6d 70 72 69 6e 74     zSql = mprint
7010: 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
7020: 20 28 25 73 29 20 4f 52 44 45 52 20 42 59 20 25   (%s) ORDER BY %
7030: 64 20 25 73 22 2c 20 7a 53 71 6c 2c 20 6e 46 69  d %s", zSql, nFi
7040: 65 6c 64 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  eld, zDir);.    
7050: 7d 0a 20 20 7d 0a 0a 20 20 63 6f 75 6e 74 20 3d  }.  }..  count =
7060: 20 30 3b 0a 20 20 69 66 28 20 21 74 61 62 73 20   0;.  if( !tabs 
7070: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 47 65  ){.    struct Ge
7080: 6e 65 72 61 74 65 48 54 4d 4c 20 73 53 74 61 74  nerateHTML sStat
7090: 65 3b 0a 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69  e;..    db_multi
70a0: 5f 65 78 65 63 28 22 50 52 41 47 4d 41 20 65 6d  _exec("PRAGMA em
70b0: 70 74 79 5f 72 65 73 75 6c 74 5f 63 61 6c 6c 62  pty_result_callb
70c0: 61 63 6b 73 3d 4f 4e 22 29 3b 0a 20 20 20 20 73  acks=ON");.    s
70d0: 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65  tyle_submenu_ele
70e0: 6d 65 6e 74 28 22 52 61 77 22 2c 20 22 52 61 77  ment("Raw", "Raw
70f0: 22 2c 20 0a 20 20 20 20 20 20 22 72 70 74 76 69  ", .      "rptvi
7100: 65 77 3f 74 61 62 6c 69 73 74 3d 31 26 25 73 22  ew?tablist=1&%s"
7110: 2c 20 50 44 28 22 51 55 45 52 59 5f 53 54 52 49  , PD("QUERY_STRI
7120: 4e 47 22 2c 22 22 29 29 3b 0a 20 20 20 20 69 66  NG",""));.    if
7130: 28 20 67 2e 6f 6b 41 64 6d 69 6e 20 0a 20 20 20  ( g.okAdmin .   
7140: 20 20 20 20 7c 7c 20 28 67 2e 6f 6b 54 6b 74 46      || (g.okTktF
7150: 6d 74 20 26 26 20 67 2e 7a 4c 6f 67 69 6e 20 26  mt && g.zLogin &
7160: 26 20 7a 4f 77 6e 65 72 20 26 26 20 73 74 72 63  & zOwner && strc
7170: 6d 70 28 67 2e 7a 4c 6f 67 69 6e 2c 7a 4f 77 6e  mp(g.zLogin,zOwn
7180: 65 72 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  er)==0) ){.     
7190: 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65   style_submenu_e
71a0: 6c 65 6d 65 6e 74 28 22 45 64 69 74 22 2c 20 22  lement("Edit", "
71b0: 45 64 69 74 22 2c 20 22 72 70 74 65 64 69 74 3f  Edit", "rptedit?
71c0: 72 6e 3d 25 64 22 2c 20 72 6e 29 3b 0a 20 20 20  rn=%d", rn);.   
71d0: 20 7d 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 54   }.    if( g.okT
71e0: 6b 74 46 6d 74 20 29 7b 0a 20 20 20 20 20 20 73  ktFmt ){.      s
71f0: 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65  tyle_submenu_ele
7200: 6d 65 6e 74 28 22 53 51 4c 22 2c 20 22 53 51 4c  ment("SQL", "SQL
7210: 22 2c 20 22 72 70 74 73 71 6c 3f 72 6e 3d 25 64  ", "rptsql?rn=%d
7220: 22 2c 72 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ",rn);.    }.   
7230: 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 7a 54   style_header(zT
7240: 69 74 6c 65 29 3b 0a 20 20 20 20 6f 75 74 70 75  itle);.    outpu
7250: 74 5f 63 6f 6c 6f 72 5f 6b 65 79 28 7a 43 6c 72  t_color_key(zClr
7260: 4b 65 79 2c 20 31 2c 20 0a 20 20 20 20 20 20 20  Key, 1, .       
7270: 20 22 62 6f 72 64 65 72 3d 30 20 63 65 6c 6c 70   "border=0 cellp
7280: 61 64 64 69 6e 67 3d 33 20 63 65 6c 6c 73 70 61  adding=3 cellspa
7290: 63 69 6e 67 3d 30 20 63 6c 61 73 73 3d 5c 22 72  cing=0 class=\"r
72a0: 65 70 6f 72 74 5c 22 22 29 3b 0a 20 20 20 20 40  eport\"");.    @
72b0: 20 3c 74 61 62 6c 65 20 62 6f 72 64 65 72 3d 31   <table border=1
72c0: 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d 32 20 63   cellpadding=2 c
72d0: 65 6c 6c 73 70 61 63 69 6e 67 3d 30 20 63 6c 61  ellspacing=0 cla
72e0: 73 73 3d 22 72 65 70 6f 72 74 22 3e 0a 20 20 20  ss="report">.   
72f0: 20 73 53 74 61 74 65 2e 72 6e 20 3d 20 72 6e 3b   sState.rn = rn;
7300: 0a 20 20 20 20 73 53 74 61 74 65 2e 6e 43 6f 75  .    sState.nCou
7310: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  nt = 0;.    sqli
7320: 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
7330: 65 72 28 67 2e 64 62 2c 20 72 65 70 6f 72 74 5f  er(g.db, report_
7340: 71 75 65 72 79 5f 61 75 74 68 6f 72 69 7a 65 72  query_authorizer
7350: 2c 20 28 76 6f 69 64 2a 29 26 7a 45 72 72 31 29  , (void*)&zErr1)
7360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
7370: 65 63 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 67  ec(g.db, zSql, g
7380: 65 6e 65 72 61 74 65 5f 68 74 6d 6c 2c 20 26 73  enerate_html, &s
7390: 53 74 61 74 65 2c 20 26 7a 45 72 72 32 29 3b 0a  State, &zErr2);.
73a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
73b0: 61 75 74 68 6f 72 69 7a 65 72 28 67 2e 64 62 2c  authorizer(g.db,
73c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 40 20 3c 2f   0, 0);.    @ </
73d0: 74 61 62 6c 65 3e 0a 20 20 20 20 69 66 28 20 7a  table>.    if( z
73e0: 45 72 72 31 20 29 7b 0a 20 20 20 20 20 20 40 20  Err1 ){.      @ 
73f0: 3c 70 3e 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 22  <p><font color="
7400: 72 65 64 22 3e 3c 62 3e 45 72 72 6f 72 3a 20 25  red"><b>Error: %
7410: 68 28 7a 45 72 72 31 29 3c 2f 62 3e 3c 2f 66 6f  h(zErr1)</b></fo
7420: 6e 74 3e 3c 2f 70 3e 0a 20 20 20 20 7d 65 6c 73  nt></p>.    }els
7430: 65 20 69 66 28 20 7a 45 72 72 32 20 29 7b 0a 20  e if( zErr2 ){. 
7440: 20 20 20 20 20 40 20 3c 70 3e 3c 66 6f 6e 74 20       @ <p><font 
7450: 63 6f 6c 6f 72 3d 22 72 65 64 22 3e 3c 62 3e 45  color="red"><b>E
7460: 72 72 6f 72 3a 20 25 68 28 7a 45 72 72 32 29 3c  rror: %h(zErr2)<
7470: 2f 62 3e 3c 2f 66 6f 6e 74 3e 3c 2f 70 3e 0a 20  /b></font></p>. 
7480: 20 20 20 7d 0a 20 20 20 20 73 74 79 6c 65 5f 66     }.    style_f
7490: 6f 6f 74 65 72 28 29 3b 0a 20 20 7d 65 6c 73 65  ooter();.  }else
74a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65  {.    sqlite3_se
74b0: 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 67 2e 64  t_authorizer(g.d
74c0: 62 2c 20 72 65 70 6f 72 74 5f 71 75 65 72 79 5f  b, report_query_
74d0: 61 75 74 68 6f 72 69 7a 65 72 2c 20 28 76 6f 69  authorizer, (voi
74e0: 64 2a 29 26 7a 45 72 72 31 29 3b 0a 20 20 20 20  d*)&zErr1);.    
74f0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64  sqlite3_exec(g.d
7500: 62 2c 20 7a 53 71 6c 2c 20 6f 75 74 70 75 74 5f  b, zSql, output_
7510: 74 61 62 5f 73 65 70 61 72 61 74 65 64 2c 20 26  tab_separated, &
7520: 63 6f 75 6e 74 2c 20 26 7a 45 72 72 32 29 3b 0a  count, &zErr2);.
7530: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
7540: 61 75 74 68 6f 72 69 7a 65 72 28 67 2e 64 62 2c  authorizer(g.db,
7550: 20 30 2c 20 30 29 3b 0a 20 20 20 20 63 67 69 5f   0, 0);.    cgi_
7560: 73 65 74 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65  set_content_type
7570: 28 22 74 65 78 74 2f 70 6c 61 69 6e 22 29 3b 0a  ("text/plain");.
7580: 20 20 7d 0a 7d 0a                                  }.}.