Hex Artifact Content
Not logged in

Artifact dff9f62bfba44534242fe588ffef5229fb1aa1e6:

File src/report.c part of check-in [623a9129c8] - Update to the latest SQLite. On the "Ticket" page, if "nobody" is not allowed to create new tickets but "anonymous" is, then offer a hyperlink to log in as anonymous. Change the default settings to be more secure. by drh on 2009-07-06 23:53:18.

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 40 20 3c  zData;.      @ <
6140: 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e  td valign="top">
6150: 3c 61 20 68 72 65 66 3d 22 74 6b 74 76 69 65 77  <a href="tktview
6160: 3f 6e 61 6d 65 3d 25 68 28 7a 44 61 74 61 29 22  ?name=%h(zData)"
6170: 3e 25 68 28 7a 44 61 74 61 29 3c 2f 61 3e 3c 2f  >%h(zData)</a></
6180: 74 64 3e 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  td>.    }else if
6190: 28 20 7a 44 61 74 61 5b 30 5d 3d 3d 30 20 29 7b  ( zData[0]==0 ){
61a0: 0a 20 20 20 20 20 20 40 20 3c 74 64 20 76 61 6c  .      @ <td val
61b0: 69 67 6e 3d 22 74 6f 70 22 3e 26 6e 62 73 70 3b  ign="top">&nbsp;
61c0: 3c 2f 74 64 3e 0a 20 20 20 20 7d 65 6c 73 65 7b  </td>.    }else{
61d0: 0a 20 20 20 20 20 20 40 20 3c 74 64 20 76 61 6c  .      @ <td val
61e0: 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 20 20 20  ign="top">.     
61f0: 20 40 20 25 68 28 7a 44 61 74 61 29 0a 20 20 20   @ %h(zData).   
6200: 20 20 20 40 20 3c 2f 74 64 3e 0a 20 20 20 20 7d     @ </td>.    }
6210: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 69 64 20  .  }.  if( zTid 
6220: 26 26 20 67 2e 6f 6b 57 72 69 74 65 20 29 7b 0a  && g.okWrite ){.
6230: 20 20 20 20 40 20 3c 74 64 20 76 61 6c 69 67 6e      @ <td valign
6240: 3d 22 74 6f 70 22 3e 3c 61 20 68 72 65 66 3d 22  ="top"><a href="
6250: 74 6b 74 65 64 69 74 2f 25 68 28 7a 54 69 64 29  tktedit/%h(zTid)
6260: 22 3e 65 64 69 74 3c 2f 61 3e 3c 2f 74 64 3e 0a  ">edit</a></td>.
6270: 20 20 7d 0a 20 20 40 20 3c 2f 74 72 3e 0a 20 20    }.  @ </tr>.  
6280: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
6290: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 74 65  ** Output the te
62a0: 78 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  xt given in the 
62b0: 61 72 67 75 6d 65 6e 74 2e 20 20 43 6f 6e 76 65  argument.  Conve
62c0: 72 74 20 74 61 62 73 20 61 6e 64 20 6e 65 77 6c  rt tabs and newl
62d0: 69 6e 65 73 20 69 6e 74 6f 0a 2a 2a 20 73 70 61  ines into.** spa
62e0: 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
62f0: 6f 69 64 20 6f 75 74 70 75 74 5f 6e 6f 5f 74 61  oid output_no_ta
6300: 62 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  bs(const char *z
6310: 29 7b 0a 20 20 77 68 69 6c 65 28 20 7a 20 26 26  ){.  while( z &&
6320: 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74   z[0] ){.    int
6330: 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72 28 69   i, j;.    for(i
6340: 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 28 21 69 73  =0; z[i] && (!is
6350: 73 70 61 63 65 28 7a 5b 69 5d 29 20 7c 7c 20 7a  space(z[i]) || z
6360: 5b 69 5d 3d 3d 27 20 27 29 3b 20 69 2b 2b 29 7b  [i]==' '); i++){
6370: 7d 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b  }.    if( i>0 ){
6380: 0a 20 20 20 20 20 20 63 67 69 5f 70 72 69 6e 74  .      cgi_print
6390: 66 28 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b  f("%.*s", i, z);
63a0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a  .    }.    for(j
63b0: 3d 69 3b 20 69 73 73 70 61 63 65 28 7a 5b 6a 5d  =i; isspace(z[j]
63c0: 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 69 66  ); j++){}.    if
63d0: 28 20 6a 3e 69 20 29 7b 0a 20 20 20 20 20 20 63  ( j>i ){.      c
63e0: 67 69 5f 70 72 69 6e 74 66 28 22 25 2a 73 22 2c  gi_printf("%*s",
63f0: 20 6a 2d 69 2c 20 22 22 29 3b 0a 20 20 20 20 7d   j-i, "");.    }
6400: 0a 20 20 20 20 7a 20 2b 3d 20 6a 3b 0a 20 20 7d  .    z += j;.  }
6410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
6420: 20 61 20 72 6f 77 20 61 73 20 61 20 74 61 62 2d   a row as a tab-
6430: 73 65 70 61 72 61 74 65 64 20 6c 69 6e 65 20 6f  separated line o
6440: 66 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69  f text..*/.stati
6450: 63 20 69 6e 74 20 6f 75 74 70 75 74 5f 74 61 62  c int output_tab
6460: 5f 73 65 70 61 72 61 74 65 64 28 0a 20 20 76 6f  _separated(.  vo
6470: 69 64 20 2a 70 55 73 65 72 2c 20 20 20 20 20 2f  id *pUser,     /
6480: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 6f 77  * Pointer to row
6490: 2d 63 6f 75 6e 74 20 69 6e 74 65 67 65 72 20 2a  -count integer *
64a0: 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
64b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
64c0: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69  f columns in thi
64d0: 73 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  s result row */.
64e0: 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
64f0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 64 61     /* Text of da
6500: 74 61 20 69 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e  ta in all column
6510: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  s */.  char **az
6520: 4e 61 6d 65 20 20 20 20 2f 2a 20 4e 61 6d 65 73  Name    /* Names
6530: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
6540: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 2a 70 43 6f  */.){.  int *pCo
6550: 75 6e 74 20 3d 20 28 69 6e 74 2a 29 70 55 73 65  unt = (int*)pUse
6560: 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  r;.  int i;..  i
6570: 66 28 20 2a 70 43 6f 75 6e 74 3d 3d 30 20 29 7b  f( *pCount==0 ){
6580: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6590: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
65a0: 20 20 6f 75 74 70 75 74 5f 6e 6f 5f 74 61 62 73    output_no_tabs
65b0: 28 61 7a 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20 20  (azName[i]);.   
65c0: 20 20 20 63 67 69 5f 70 72 69 6e 74 66 28 22 25     cgi_printf("%
65d0: 63 22 2c 20 69 3c 6e 41 72 67 2d 31 20 3f 20 27  c", i<nArg-1 ? '
65e0: 5c 74 27 20 3a 20 27 5c 6e 27 29 3b 0a 20 20 20  \t' : '\n');.   
65f0: 20 7d 0a 20 20 7d 0a 20 20 2b 2b 2a 70 43 6f 75   }.  }.  ++*pCou
6600: 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  nt;.  for(i=0; i
6610: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
6620: 20 6f 75 74 70 75 74 5f 6e 6f 5f 74 61 62 73 28   output_no_tabs(
6630: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 63  azArg[i]);.    c
6640: 67 69 5f 70 72 69 6e 74 66 28 22 25 63 22 2c 20  gi_printf("%c", 
6650: 69 3c 6e 41 72 67 2d 31 20 3f 20 27 5c 74 27 20  i<nArg-1 ? '\t' 
6660: 3a 20 27 5c 6e 27 29 3b 0a 20 20 7d 0a 20 20 72  : '\n');.  }.  r
6670: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
6680: 2a 20 47 65 6e 65 72 61 74 65 20 48 54 4d 4c 20  * Generate HTML 
6690: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
66a0: 20 63 6f 6c 6f 72 20 6b 65 79 2e 0a 2a 2f 0a 76   color key..*/.v
66b0: 6f 69 64 20 6f 75 74 70 75 74 5f 63 6f 6c 6f 72  oid output_color
66c0: 5f 6b 65 79 28 63 6f 6e 73 74 20 63 68 61 72 20  _key(const char 
66d0: 2a 7a 43 6c 72 4b 65 79 2c 20 69 6e 74 20 68 6f  *zClrKey, int ho
66e0: 72 69 7a 2c 20 63 68 61 72 20 2a 7a 54 61 62 41  riz, char *zTabA
66f0: 72 67 73 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  rgs){.  int i, j
6700: 2c 20 6b 3b 0a 20 20 63 68 61 72 20 2a 7a 53 61  , k;.  char *zSa
6710: 66 65 4b 65 79 2c 20 2a 7a 54 6f 46 72 65 65 3b  feKey, *zToFree;
6720: 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63  .  while( isspac
6730: 65 28 2a 7a 43 6c 72 4b 65 79 29 20 29 20 7a 43  e(*zClrKey) ) zC
6740: 6c 72 4b 65 79 2b 2b 3b 0a 20 20 69 66 28 20 7a  lrKey++;.  if( z
6750: 43 6c 72 4b 65 79 5b 30 5d 3d 3d 30 20 29 20 72  ClrKey[0]==0 ) r
6760: 65 74 75 72 6e 3b 0a 20 20 40 20 3c 74 61 62 6c  eturn;.  @ <tabl
6770: 65 20 25 73 28 7a 54 61 62 41 72 67 73 29 3e 0a  e %s(zTabArgs)>.
6780: 20 20 69 66 28 20 68 6f 72 69 7a 20 29 7b 0a 20    if( horiz ){. 
6790: 20 20 20 40 20 3c 74 72 3e 0a 20 20 7d 0a 20 20     @ <tr>.  }.  
67a0: 7a 54 6f 46 72 65 65 20 3d 20 7a 53 61 66 65 4b  zToFree = zSafeK
67b0: 65 79 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 68  ey = mprintf("%h
67c0: 22 2c 20 7a 43 6c 72 4b 65 79 29 3b 0a 20 20 77  ", zClrKey);.  w
67d0: 68 69 6c 65 28 20 7a 53 61 66 65 4b 65 79 5b 30  hile( zSafeKey[0
67e0: 5d 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ] ){.    while( 
67f0: 69 73 73 70 61 63 65 28 2a 7a 53 61 66 65 4b 65  isspace(*zSafeKe
6800: 79 29 20 29 20 7a 53 61 66 65 4b 65 79 2b 2b 3b  y) ) zSafeKey++;
6810: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 53  .    for(i=0; zS
6820: 61 66 65 4b 65 79 5b 69 5d 20 26 26 20 21 69 73  afeKey[i] && !is
6830: 73 70 61 63 65 28 7a 53 61 66 65 4b 65 79 5b 69  space(zSafeKey[i
6840: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
6850: 6f 72 28 6a 3d 69 3b 20 69 73 73 70 61 63 65 28  or(j=i; isspace(
6860: 7a 53 61 66 65 4b 65 79 5b 6a 5d 29 3b 20 6a 2b  zSafeKey[j]); j+
6870: 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6b 3d 6a  +){}.    for(k=j
6880: 3b 20 7a 53 61 66 65 4b 65 79 5b 6b 5d 20 26 26  ; zSafeKey[k] &&
6890: 20 7a 53 61 66 65 4b 65 79 5b 6b 5d 21 3d 27 5c   zSafeKey[k]!='\
68a0: 6e 27 20 26 26 20 7a 53 61 66 65 4b 65 79 5b 6b  n' && zSafeKey[k
68b0: 5d 21 3d 27 5c 72 27 3b 20 6b 2b 2b 29 7b 7d 0a  ]!='\r'; k++){}.
68c0: 20 20 20 20 69 66 28 20 21 68 6f 72 69 7a 20 29      if( !horiz )
68d0: 7b 0a 20 20 20 20 20 20 63 67 69 5f 70 72 69 6e  {.      cgi_prin
68e0: 74 66 28 22 3c 74 72 20 62 67 63 6f 6c 6f 72 3d  tf("<tr bgcolor=
68f0: 5c 22 25 2e 2a 73 5c 22 3e 3c 74 64 3e 25 2e 2a  \"%.*s\"><td>%.*
6900: 73 3c 2f 74 64 3e 3c 2f 74 72 3e 5c 6e 22 2c 0a  s</td></tr>\n",.
6910: 20 20 20 20 20 20 20 20 69 2c 20 7a 53 61 66 65          i, zSafe
6920: 4b 65 79 2c 20 6b 2d 6a 2c 20 26 7a 53 61 66 65  Key, k-j, &zSafe
6930: 4b 65 79 5b 6a 5d 29 3b 0a 20 20 20 20 7d 65 6c  Key[j]);.    }el
6940: 73 65 7b 0a 20 20 20 20 20 20 63 67 69 5f 70 72  se{.      cgi_pr
6950: 69 6e 74 66 28 22 3c 74 64 20 62 67 63 6f 6c 6f  intf("<td bgcolo
6960: 72 3d 5c 22 25 2e 2a 73 5c 22 3e 25 2e 2a 73 3c  r=\"%.*s\">%.*s<
6970: 2f 74 64 3e 5c 6e 22 2c 0a 20 20 20 20 20 20 20  /td>\n",.       
6980: 20 69 2c 20 7a 53 61 66 65 4b 65 79 2c 20 6b 2d   i, zSafeKey, k-
6990: 6a 2c 20 26 7a 53 61 66 65 4b 65 79 5b 6a 5d 29  j, &zSafeKey[j])
69a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 61 66  ;.    }.    zSaf
69b0: 65 4b 65 79 20 2b 3d 20 6b 3b 0a 20 20 7d 0a 20  eKey += k;.  }. 
69c0: 20 66 72 65 65 28 7a 54 6f 46 72 65 65 29 3b 0a   free(zToFree);.
69d0: 20 20 69 66 28 20 68 6f 72 69 7a 20 29 7b 0a 20    if( horiz ){. 
69e0: 20 20 20 40 20 3c 2f 74 72 3e 0a 20 20 7d 0a 20     @ </tr>.  }. 
69f0: 20 40 20 3c 2f 74 61 62 6c 65 3e 0a 7d 0a 0a 0a   @ </table>.}...
6a00: 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 2f  /*.** WEBPAGE: /
6a10: 72 70 74 76 69 65 77 0a 2a 2a 0a 2a 2a 20 47 65  rptview.**.** Ge
6a20: 6e 65 72 61 74 65 20 61 20 72 65 70 6f 72 74 2e  nerate a report.
6a30: 20 20 54 68 65 20 72 6e 20 71 75 65 72 79 20 70    The rn query p
6a40: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
6a50: 72 65 70 6f 72 74 20 6e 75 6d 62 65 72 0a 2a 2a  report number.**
6a60: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
6a70: 6f 20 52 45 50 4f 52 54 46 4d 54 2e 52 4e 2e 20  o REPORTFMT.RN. 
6a80: 20 49 66 20 74 68 65 20 74 61 62 6c 69 73 74 20   If the tablist 
6a90: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20  query parameter 
6aa0: 65 78 69 73 74 73 2c 0a 2a 2a 20 74 68 65 6e 20  exists,.** then 
6ab0: 74 68 65 20 6f 75 74 70 75 74 20 63 6f 6e 73 69  the output consi
6ac0: 73 74 73 20 6f 66 20 6c 69 6e 65 73 20 6f 66 20  sts of lines of 
6ad0: 74 61 62 2d 73 65 70 61 72 61 74 65 64 20 66 69  tab-separated fi
6ae0: 65 6c 64 73 20 69 6e 73 74 65 61 64 20 6f 66 0a  elds instead of.
6af0: 2a 2a 20 61 6e 20 48 54 4d 4c 20 74 61 62 6c 65  ** an HTML table
6b00: 2e 0a 2a 2f 0a 76 6f 69 64 20 72 70 74 76 69 65  ..*/.void rptvie
6b10: 77 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20  w_page(void){.  
6b20: 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  int count = 0;. 
6b30: 20 69 6e 74 20 72 6e 3b 0a 20 20 63 68 61 72 20   int rn;.  char 
6b40: 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a  *zSql;.  char *z
6b50: 54 69 74 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Title;.  char *z
6b60: 4f 77 6e 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a  Owner;.  char *z
6b70: 43 6c 72 4b 65 79 3b 0a 20 20 69 6e 74 20 74 61  ClrKey;.  int ta
6b80: 62 73 3b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20  bs;.  Stmt q;.  
6b90: 63 68 61 72 20 2a 7a 45 72 72 31 20 3d 20 30 3b  char *zErr1 = 0;
6ba0: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 32 20 3d  .  char *zErr2 =
6bb0: 20 30 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65   0;..  login_che
6bc0: 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29  ck_credentials()
6bd0: 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52 65 61  ;.  if( !g.okRea
6be0: 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65  d ){ login_neede
6bf0: 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20  d(); return; }. 
6c00: 20 72 6e 20 3d 20 61 74 6f 69 28 50 44 28 22 72   rn = atoi(PD("r
6c10: 6e 22 2c 22 30 22 29 29 3b 0a 20 20 69 66 28 20  n","0"));.  if( 
6c20: 72 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 63 67 69  rn==0 ){.    cgi
6c30: 5f 72 65 64 69 72 65 63 74 28 22 72 65 70 6f 72  _redirect("repor
6c40: 74 6c 69 73 74 22 29 3b 0a 20 20 20 20 72 65 74  tlist");.    ret
6c50: 75 72 6e 3b 0a 20 20 7d 0a 20 20 74 61 62 73 20  urn;.  }.  tabs 
6c60: 3d 20 50 28 22 74 61 62 6c 69 73 74 22 29 21 3d  = P("tablist")!=
6c70: 30 3b 0a 20 20 2f 2a 20 76 69 65 77 5f 61 64 64  0;.  /* view_add
6c80: 5f 66 75 6e 63 74 69 6f 6e 73 28 74 61 62 73 29  _functions(tabs)
6c90: 3b 20 2a 2f 0a 20 20 64 62 5f 70 72 65 70 61 72  ; */.  db_prepar
6ca0: 65 28 26 71 2c 0a 20 20 20 20 22 53 45 4c 45 43  e(&q,.    "SELEC
6cb0: 54 20 74 69 74 6c 65 2c 20 73 71 6c 63 6f 64 65  T title, sqlcode
6cc0: 2c 20 6f 77 6e 65 72 2c 20 63 6f 6c 73 20 46 52  , owner, cols FR
6cd0: 4f 4d 20 72 65 70 6f 72 74 66 6d 74 20 57 48 45  OM reportfmt WHE
6ce0: 52 45 20 72 6e 3d 25 64 22 2c 20 72 6e 29 3b 0a  RE rn=%d", rn);.
6cf0: 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 71    if( db_step(&q
6d00: 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )!=SQLITE_ROW ){
6d10: 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72 65 63  .    cgi_redirec
6d20: 74 28 22 72 65 70 6f 72 74 6c 69 73 74 22 29 3b  t("reportlist");
6d30: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6d40: 0a 20 20 7a 54 69 74 6c 65 20 3d 20 64 62 5f 63  .  zTitle = db_c
6d50: 6f 6c 75 6d 6e 5f 6d 61 6c 6c 6f 63 28 26 71 2c  olumn_malloc(&q,
6d60: 20 30 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 64 62   0);.  zSql = db
6d70: 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c 6c 6f 63 28 26  _column_malloc(&
6d80: 71 2c 20 31 29 3b 0a 20 20 7a 4f 77 6e 65 72 20  q, 1);.  zOwner 
6d90: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c 6c  = db_column_mall
6da0: 6f 63 28 26 71 2c 20 32 29 3b 0a 20 20 7a 43 6c  oc(&q, 2);.  zCl
6db0: 72 4b 65 79 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  rKey = db_column
6dc0: 5f 6d 61 6c 6c 6f 63 28 26 71 2c 20 33 29 3b 0a  _malloc(&q, 3);.
6dd0: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71    db_finalize(&q
6de0: 29 3b 0a 0a 20 20 69 66 28 20 50 28 22 6f 72 64  );..  if( P("ord
6df0: 65 72 5f 62 79 22 29 20 29 7b 0a 20 20 20 20 2f  er_by") ){.    /
6e00: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
6e10: 75 73 65 72 20 77 61 6e 74 73 20 74 6f 20 64 6f  user wants to do
6e20: 20 61 20 63 6f 6c 75 6d 6e 20 73 6f 72 74 2c 20   a column sort, 
6e30: 77 72 61 70 20 74 68 65 20 71 75 65 72 79 20 69  wrap the query i
6e40: 6e 74 6f 20 61 20 73 75 62 0a 20 20 20 20 2a 2a  nto a sub.    **
6e50: 20 71 75 65 72 79 20 61 6e 64 20 74 68 65 6e 20   query and then 
6e60: 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
6e70: 2e 20 54 68 69 73 20 69 73 20 61 20 77 68 6f 6c  . This is a whol
6e80: 65 20 6c 6f 74 20 65 61 73 69 65 72 20 74 68 61  e lot easier tha
6e90: 6e 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20  n.    ** trying 
6ea0: 74 6f 20 69 6e 73 65 72 74 20 61 6e 20 4f 52 44  to insert an ORD
6eb0: 45 52 20 42 59 20 69 6e 74 6f 20 74 68 65 20 71  ER BY into the q
6ec0: 75 65 72 79 20 69 74 73 65 6c 66 2c 20 65 73 70  uery itself, esp
6ed0: 65 63 69 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 69  ecially.    ** i
6ee0: 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
6ef0: 6c 72 65 61 64 79 20 6f 72 64 65 72 65 64 2e 0a  lready ordered..
6f00: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
6f10: 46 69 65 6c 64 20 3d 20 61 74 6f 69 28 50 28 22  Field = atoi(P("
6f20: 6f 72 64 65 72 5f 62 79 22 29 29 3b 0a 20 20 20  order_by"));.   
6f30: 20 69 66 28 20 6e 46 69 65 6c 64 20 3e 20 30 20   if( nField > 0 
6f40: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
6f50: 68 61 72 2a 20 7a 44 69 72 20 3d 20 50 44 28 22  har* zDir = PD("
6f60: 6f 72 64 65 72 5f 64 69 72 22 2c 22 22 29 3b 0a  order_dir","");.
6f70: 20 20 20 20 20 20 7a 44 69 72 20 3d 20 21 73 74        zDir = !st
6f80: 72 63 6d 70 28 22 41 53 43 22 2c 7a 44 69 72 29  rcmp("ASC",zDir)
6f90: 20 3f 20 22 41 53 43 22 20 3a 20 22 44 45 53 43   ? "ASC" : "DESC
6fa0: 22 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  ";.      zSql = 
6fb0: 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
6fc0: 2a 20 46 52 4f 4d 20 28 25 73 29 20 4f 52 44 45  * FROM (%s) ORDE
6fd0: 52 20 42 59 20 25 64 20 25 73 22 2c 20 7a 53 71  R BY %d %s", zSq
6fe0: 6c 2c 20 6e 46 69 65 6c 64 2c 20 7a 44 69 72 29  l, nField, zDir)
6ff0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63  ;.    }.  }..  c
7000: 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  ount = 0;.  if( 
7010: 21 74 61 62 73 20 29 7b 0a 20 20 20 20 73 74 72  !tabs ){.    str
7020: 75 63 74 20 47 65 6e 65 72 61 74 65 48 54 4d 4c  uct GenerateHTML
7030: 20 73 53 74 61 74 65 3b 0a 0a 20 20 20 20 64 62   sState;..    db
7040: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 50 52 41  _multi_exec("PRA
7050: 47 4d 41 20 65 6d 70 74 79 5f 72 65 73 75 6c 74  GMA empty_result
7060: 5f 63 61 6c 6c 62 61 63 6b 73 3d 4f 4e 22 29 3b  _callbacks=ON");
7070: 0a 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65  .    style_subme
7080: 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 52 61 77 22  nu_element("Raw"
7090: 2c 20 22 52 61 77 22 2c 20 0a 20 20 20 20 20 20  , "Raw", .      
70a0: 22 72 70 74 76 69 65 77 3f 74 61 62 6c 69 73 74  "rptview?tablist
70b0: 3d 31 26 25 73 22 2c 20 50 44 28 22 51 55 45 52  =1&%s", PD("QUER
70c0: 59 5f 53 54 52 49 4e 47 22 2c 22 22 29 29 3b 0a  Y_STRING",""));.
70d0: 20 20 20 20 69 66 28 20 67 2e 6f 6b 41 64 6d 69      if( g.okAdmi
70e0: 6e 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 67 2e  n .       || (g.
70f0: 6f 6b 54 6b 74 46 6d 74 20 26 26 20 67 2e 7a 4c  okTktFmt && g.zL
7100: 6f 67 69 6e 20 26 26 20 7a 4f 77 6e 65 72 20 26  ogin && zOwner &
7110: 26 20 73 74 72 63 6d 70 28 67 2e 7a 4c 6f 67 69  & strcmp(g.zLogi
7120: 6e 2c 7a 4f 77 6e 65 72 29 3d 3d 30 29 20 29 7b  n,zOwner)==0) ){
7130: 0a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62  .      style_sub
7140: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 45 64  menu_element("Ed
7150: 69 74 22 2c 20 22 45 64 69 74 22 2c 20 22 72 70  it", "Edit", "rp
7160: 74 65 64 69 74 3f 72 6e 3d 25 64 22 2c 20 72 6e  tedit?rn=%d", rn
7170: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
7180: 20 67 2e 6f 6b 54 6b 74 46 6d 74 20 29 7b 0a 20   g.okTktFmt ){. 
7190: 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65       style_subme
71a0: 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 53 51 4c 22  nu_element("SQL"
71b0: 2c 20 22 53 51 4c 22 2c 20 22 72 70 74 73 71 6c  , "SQL", "rptsql
71c0: 3f 72 6e 3d 25 64 22 2c 72 6e 29 3b 0a 20 20 20  ?rn=%d",rn);.   
71d0: 20 7d 0a 20 20 20 20 73 74 79 6c 65 5f 68 65 61   }.    style_hea
71e0: 64 65 72 28 7a 54 69 74 6c 65 29 3b 0a 20 20 20  der(zTitle);.   
71f0: 20 6f 75 74 70 75 74 5f 63 6f 6c 6f 72 5f 6b 65   output_color_ke
7200: 79 28 7a 43 6c 72 4b 65 79 2c 20 31 2c 20 0a 20  y(zClrKey, 1, . 
7210: 20 20 20 20 20 20 20 22 62 6f 72 64 65 72 3d 30         "border=0
7220: 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d 33 20 63   cellpadding=3 c
7230: 65 6c 6c 73 70 61 63 69 6e 67 3d 30 20 63 6c 61  ellspacing=0 cla
7240: 73 73 3d 5c 22 72 65 70 6f 72 74 5c 22 22 29 3b  ss=\"report\"");
7250: 0a 20 20 20 20 40 20 3c 74 61 62 6c 65 20 62 6f  .    @ <table bo
7260: 72 64 65 72 3d 31 20 63 65 6c 6c 70 61 64 64 69  rder=1 cellpaddi
7270: 6e 67 3d 32 20 63 65 6c 6c 73 70 61 63 69 6e 67  ng=2 cellspacing
7280: 3d 30 20 63 6c 61 73 73 3d 22 72 65 70 6f 72 74  =0 class="report
7290: 22 3e 0a 20 20 20 20 73 53 74 61 74 65 2e 72 6e  ">.    sState.rn
72a0: 20 3d 20 72 6e 3b 0a 20 20 20 20 73 53 74 61 74   = rn;.    sStat
72b0: 65 2e 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  e.nCount = 0;.  
72c0: 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
72d0: 74 68 6f 72 69 7a 65 72 28 67 2e 64 62 2c 20 72  thorizer(g.db, r
72e0: 65 70 6f 72 74 5f 71 75 65 72 79 5f 61 75 74 68  eport_query_auth
72f0: 6f 72 69 7a 65 72 2c 20 28 76 6f 69 64 2a 29 26  orizer, (void*)&
7300: 7a 45 72 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  zErr1);.    sqli
7310: 74 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 7a  te3_exec(g.db, z
7320: 53 71 6c 2c 20 67 65 6e 65 72 61 74 65 5f 68 74  Sql, generate_ht
7330: 6d 6c 2c 20 26 73 53 74 61 74 65 2c 20 26 7a 45  ml, &sState, &zE
7340: 72 72 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rr2);.    sqlite
7350: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
7360: 28 67 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  (g.db, 0, 0);.  
7370: 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a 20 20 20    @ </table>.   
7380: 20 69 66 28 20 7a 45 72 72 31 20 29 7b 0a 20 20   if( zErr1 ){.  
7390: 20 20 20 20 40 20 3c 70 3e 3c 66 6f 6e 74 20 63      @ <p><font c
73a0: 6f 6c 6f 72 3d 22 72 65 64 22 3e 3c 62 3e 45 72  olor="red"><b>Er
73b0: 72 6f 72 3a 20 25 68 28 7a 45 72 72 31 29 3c 2f  ror: %h(zErr1)</
73c0: 62 3e 3c 2f 66 6f 6e 74 3e 3c 2f 70 3e 0a 20 20  b></font></p>.  
73d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 45 72 72    }else if( zErr
73e0: 32 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 70 3e  2 ){.      @ <p>
73f0: 3c 66 6f 6e 74 20 63 6f 6c 6f 72 3d 22 72 65 64  <font color="red
7400: 22 3e 3c 62 3e 45 72 72 6f 72 3a 20 25 68 28 7a  "><b>Error: %h(z
7410: 45 72 72 32 29 3c 2f 62 3e 3c 2f 66 6f 6e 74 3e  Err2)</b></font>
7420: 3c 2f 70 3e 0a 20 20 20 20 7d 0a 20 20 20 20 73  </p>.    }.    s
7430: 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20  tyle_footer();. 
7440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
7450: 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a  te3_set_authoriz
7460: 65 72 28 67 2e 64 62 2c 20 72 65 70 6f 72 74 5f  er(g.db, report_
7470: 71 75 65 72 79 5f 61 75 74 68 6f 72 69 7a 65 72  query_authorizer
7480: 2c 20 28 76 6f 69 64 2a 29 26 7a 45 72 72 31 29  , (void*)&zErr1)
7490: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
74a0: 65 63 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 6f  ec(g.db, zSql, o
74b0: 75 74 70 75 74 5f 74 61 62 5f 73 65 70 61 72 61  utput_tab_separa
74c0: 74 65 64 2c 20 26 63 6f 75 6e 74 2c 20 26 7a 45  ted, &count, &zE
74d0: 72 72 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rr2);.    sqlite
74e0: 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
74f0: 28 67 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  (g.db, 0, 0);.  
7500: 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65 6e    cgi_set_conten
7510: 74 5f 74 79 70 65 28 22 74 65 78 74 2f 70 6c 61  t_type("text/pla
7520: 69 6e 22 29 3b 0a 20 20 7d 0a 7d 0a              in");.  }.}.