Hex Artifact Content
Not logged in

Artifact 78ac6cf583705aa935f2e58f6e3b5d4f7b1d68c5:

File src/report.c part of check-in [55342eb9fb] - The bug report generator compiles but still does not work right. by drh on 2008-05-17 14:49:49.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61  lic.** License a
00b0: 73 20 70 75 62 6c 69 73 68 65 64 20 62 79 20 74  s published by t
00c0: 68 65 20 46 72 65 65 20 53 6f 66 74 77 61 72 65  he Free Software
00d0: 20 46 6f 75 6e 64 61 74 69 6f 6e 3b 20 65 69 74   Foundation; eit
00e0: 68 65 72 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 32  her.** version 2
00f0: 20 6f 66 20 74 68 65 20 4c 69 63 65 6e 73 65 2c   of the License,
0100: 20 6f 72 20 28 61 74 20 79 6f 75 72 20 6f 70 74   or (at your opt
0110: 69 6f 6e 29 20 61 6e 79 20 6c 61 74 65 72 20 76  ion) any later v
0120: 65 72 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ersion..**.** Th
0130: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0140: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65  stributed in the
0150: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69   hope that it wi
0160: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a  ll be useful,.**
0170: 20 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59   but WITHOUT ANY
0180: 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f   WARRANTY; witho
0190: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c  ut even the impl
01a0: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a  ied warranty of.
01b0: 2a 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49  ** MERCHANTABILI
01c0: 54 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f  TY or FITNESS FO
01d0: 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50  R A PARTICULAR P
01e0: 55 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65  URPOSE.  See the
01f0: 20 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20   GNU.** General 
0200: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66  Public License f
0210: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e  or more details.
0220: 0a 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75  .** .** You shou
0230: 6c 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64  ld have received
0240: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47   a copy of the G
0250: 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69  NU General Publi
0260: 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f  c.** License alo
0270: 6e 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62  ng with this lib
0280: 72 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72  rary; if not, wr
0290: 69 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72  ite to the.** Fr
02a0: 65 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e  ee Software Foun
02b0: 64 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39  dation, Inc., 59
02c0: 20 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20   Temple Place - 
02d0: 53 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f  Suite 330,.** Bo
02e0: 73 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d  ston, MA  02111-
02f0: 31 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a  1307, USA..**.**
0300: 20 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20   Author contact 
0310: 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20  information:.** 
0320: 20 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a    drh@hwaci.com.
0330: 2a 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e  **   http://www.
0340: 68 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a  hwaci.com/drh/.*
0350: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 0a 2a 2a 20 20 0a 2a 2a 20 43 6f 64 65 20 74  *.**  .** Code t
03b0: 6f 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 62  o generate the b
03c0: 75 67 20 72 65 70 6f 72 74 20 6c 69 73 74 69 6e  ug report listin
03d0: 67 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  gs.*/.#include "
03e0: 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75  config.h".#inclu
03f0: 64 65 20 22 72 65 70 6f 72 74 2e 68 22 0a 23 69  de "report.h".#i
0400: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
0410: 3e 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  >../* Forward re
0420: 66 65 72 65 6e 63 65 73 20 74 6f 20 73 74 61 74  ferences to stat
0430: 69 63 20 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 73  ic routines */.s
0440: 74 61 74 69 63 20 76 6f 69 64 20 72 65 70 6f 72  tatic void repor
0450: 74 5f 66 6f 72 6d 61 74 5f 68 69 6e 74 73 28 76  t_format_hints(v
0460: 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 57 45 42  oid);../*.** WEB
0470: 50 41 47 45 3a 20 2f 72 65 70 6f 72 74 6c 69 73  PAGE: /reportlis
0480: 74 0a 2a 2f 0a 76 6f 69 64 20 76 69 65 77 5f 6c  t.*/.void view_l
0490: 69 73 74 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d  ist(void){.  Stm
04a0: 74 20 71 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68  t q;..  login_ch
04b0: 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28  eck_credentials(
04c0: 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52 64  );.  if( !g.okRd
04d0: 54 6b 74 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65  Tkt ){ login_nee
04e0: 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d  ded(); return; }
04f0: 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28  .  style_header(
0500: 22 41 76 61 69 6c 61 62 6c 65 20 52 65 70 6f 72  "Available Repor
0510: 74 20 46 6f 72 6d 61 74 73 22 29 3b 0a 20 20 64  t Formats");.  d
0520: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22 53  b_prepare(&q, "S
0530: 45 4c 45 43 54 20 72 6e 2c 20 74 69 74 6c 65 2c  ELECT rn, title,
0540: 20 6f 77 6e 65 72 20 46 52 4f 4d 20 72 65 70 6f   owner FROM repo
0550: 72 74 66 6d 74 20 4f 52 44 45 52 20 42 59 20 74  rtfmt ORDER BY t
0560: 69 74 6c 65 22 29 3b 0a 20 20 40 20 3c 70 3e 43  itle");.  @ <p>C
0570: 68 6f 6f 73 65 20 61 20 72 65 70 6f 72 74 20 66  hoose a report f
0580: 6f 72 6d 61 74 20 66 72 6f 6d 20 74 68 65 20 66  ormat from the f
0590: 6f 6c 6c 6f 77 69 6e 67 20 6c 69 73 74 3a 3c 2f  ollowing list:</
05a0: 70 3e 0a 20 20 40 20 3c 6f 6c 3e 0a 20 20 77 68  p>.  @ <ol>.  wh
05b0: 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29  ile( db_step(&q)
05c0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
05d0: 20 20 20 20 69 6e 74 20 72 6e 20 3d 20 64 62 5f      int rn = db_
05e0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 30  column_int(&q, 0
05f0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
0600: 72 20 2a 7a 54 69 74 6c 65 20 3d 20 64 62 5f 63  r *zTitle = db_c
0610: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31  olumn_text(&q, 1
0620: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
0630: 72 20 2a 7a 4f 77 6e 65 72 20 3d 20 64 62 5f 63  r *zOwner = db_c
0640: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32  olumn_text(&q, 2
0650: 29 3b 0a 20 20 20 20 40 20 3c 6c 69 3e 3c 61 20  );.    @ <li><a 
0660: 68 72 65 66 3d 22 72 70 74 76 69 65 77 3f 72 6e  href="rptview?rn
0670: 3d 25 64 28 72 6e 29 22 0a 20 20 20 20 40 20 20  =%d(rn)".    @  
0680: 20 20 20 20 20 20 72 65 6c 3d 22 6e 6f 66 6f 6c        rel="nofol
0690: 6c 6f 77 22 3e 25 68 28 7a 54 69 74 6c 65 29 3c  low">%h(zTitle)<
06a0: 2f 61 3e 26 6e 62 73 70 3b 26 6e 62 73 70 3b 26  /a>&nbsp;&nbsp;&
06b0: 6e 62 73 70 3b 0a 20 20 20 20 69 66 28 20 67 2e  nbsp;.    if( g.
06c0: 6f 6b 57 72 69 74 65 20 26 26 20 7a 4f 77 6e 65  okWrite && zOwne
06d0: 72 20 26 26 20 7a 4f 77 6e 65 72 5b 30 5d 20 29  r && zOwner[0] )
06e0: 7b 0a 20 20 20 20 20 20 40 20 28 62 79 20 3c 69  {.      @ (by <i
06f0: 3e 25 68 28 7a 4f 77 6e 65 72 29 3c 2f 69 3e 29  >%h(zOwner)</i>)
0700: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 67  .    }.    if( g
0710: 2e 6f 6b 57 72 54 6b 74 20 29 7b 0a 20 20 20 20  .okWrTkt ){.    
0720: 20 20 40 20 5b 3c 61 20 68 72 65 66 3d 22 72 70    @ [<a href="rp
0730: 74 65 64 69 74 3f 72 6e 3d 25 64 28 72 6e 29 26  tedit?rn=%d(rn)&
0740: 61 6d 70 3b 63 6f 70 79 3d 31 22 20 72 65 6c 3d  amp;copy=1" rel=
0750: 22 6e 6f 66 6f 6c 6c 6f 77 22 3e 63 6f 70 79 3c  "nofollow">copy<
0760: 2f 61 3e 5d 0a 20 20 20 20 7d 0a 20 20 20 20 69  /a>].    }.    i
0770: 66 28 20 67 2e 6f 6b 41 64 6d 69 6e 20 7c 7c 20  f( g.okAdmin || 
0780: 28 67 2e 6f 6b 57 72 54 6b 74 20 26 26 20 7a 4f  (g.okWrTkt && zO
0790: 77 6e 65 72 20 26 26 20 73 74 72 63 6d 70 28 67  wner && strcmp(g
07a0: 2e 7a 4c 6f 67 69 6e 2c 7a 4f 77 6e 65 72 29 3d  .zLogin,zOwner)=
07b0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 40 20 5b  =0) ){.      @ [
07c0: 3c 61 20 68 72 65 66 3d 22 72 70 74 65 64 69 74  <a href="rptedit
07d0: 3f 72 6e 3d 25 64 28 72 6e 29 22 20 72 65 6c 3d  ?rn=%d(rn)" rel=
07e0: 22 6e 6f 66 6f 6c 6c 6f 77 22 3e 65 64 69 74 3c  "nofollow">edit<
07f0: 2f 61 3e 5d 0a 20 20 20 20 7d 0a 20 20 20 20 40  /a>].    }.    @
0800: 20 5b 3c 61 20 68 72 65 66 3d 22 72 70 74 73 71   [<a href="rptsq
0810: 6c 3f 72 6e 3d 25 64 28 72 6e 29 22 20 72 65 6c  l?rn=%d(rn)" rel
0820: 3d 22 6e 6f 66 6f 6c 6c 6f 77 22 3e 73 71 6c 3c  ="nofollow">sql<
0830: 2f 61 3e 5d 0a 20 20 20 20 40 20 3c 2f 6c 69 3e  /a>].    @ </li>
0840: 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e 6f 6b 57  .  }.  if( g.okW
0850: 72 54 6b 74 20 29 7b 0a 20 20 20 20 40 20 3c 6c  rTkt ){.    @ <l
0860: 69 3e 3c 61 20 68 72 65 66 3d 22 72 70 74 6e 65  i><a href="rptne
0870: 77 22 3e 43 72 65 61 74 65 20 61 20 6e 65 77 20  w">Create a new 
0880: 72 65 70 6f 72 74 20 66 6f 72 6d 61 74 3c 2f 61  report format</a
0890: 3e 3c 2f 6c 69 3e 0a 20 20 7d 0a 20 20 40 20 3c  ></li>.  }.  @ <
08a0: 2f 6f 6c 3e 0a 20 20 73 74 79 6c 65 5f 66 6f 6f  /ol>.  style_foo
08b0: 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ter();.}../*.** 
08c0: 52 65 6d 6f 76 65 20 77 68 69 74 65 73 70 61 63  Remove whitespac
08d0: 65 20 66 72 6f 6d 20 62 6f 74 68 20 65 6e 64 73  e from both ends
08e0: 20 6f 66 20 61 20 73 74 72 69 6e 67 2e 0a 2a 2f   of a string..*/
08f0: 0a 63 68 61 72 20 2a 74 72 69 6d 5f 73 74 72 69  .char *trim_stri
0900: 6e 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ng(const char *z
0910: 4f 72 69 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Orig){.  int i;.
0920: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
0930: 28 2a 7a 4f 72 69 67 29 20 29 7b 20 7a 4f 72 69  (*zOrig) ){ zOri
0940: 67 2b 2b 3b 20 7d 0a 20 20 69 20 3d 20 73 74 72  g++; }.  i = str
0950: 6c 65 6e 28 7a 4f 72 69 67 29 3b 0a 20 20 77 68  len(zOrig);.  wh
0960: 69 6c 65 28 20 69 3e 30 20 26 26 20 69 73 73 70  ile( i>0 && issp
0970: 61 63 65 28 7a 4f 72 69 67 5b 69 2d 31 5d 29 20  ace(zOrig[i-1]) 
0980: 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 72 65 74 75  ){ i--; }.  retu
0990: 72 6e 20 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73  rn mprintf("%.*s
09a0: 22 2c 20 69 2c 20 7a 4f 72 69 67 29 3b 0a 7d 0a  ", i, zOrig);.}.
09b0: 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20 61  ./*.** Extract a
09c0: 20 6e 75 6d 65 72 69 63 20 28 69 6e 74 65 67 65   numeric (intege
09d0: 72 29 20 76 61 6c 75 65 20 66 72 6f 6d 20 61 20  r) value from a 
09e0: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 63 68 61 72 20  string..*/.char 
09f0: 2a 65 78 74 72 61 63 74 5f 69 6e 74 65 67 65 72  *extract_integer
0a00: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72  (const char *zOr
0a10: 69 67 29 7b 0a 20 20 69 66 28 20 7a 4f 72 69 67  ig){.  if( zOrig
0a20: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 7a 4f 72 69   == NULL || zOri
0a30: 67 5b 30 5d 20 3d 3d 20 30 20 29 20 72 65 74 75  g[0] == 0 ) retu
0a40: 72 6e 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20  rn "";.  while( 
0a50: 2a 7a 4f 72 69 67 20 26 26 20 21 69 73 64 69 67  *zOrig && !isdig
0a60: 69 74 28 2a 7a 4f 72 69 67 29 20 29 7b 20 7a 4f  it(*zOrig) ){ zO
0a70: 72 69 67 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 2a  rig++; }.  if( *
0a80: 7a 4f 72 69 67 20 29 7b 0a 20 20 20 20 2f 2a 20  zOrig ){.    /* 
0a90: 77 65 20 68 61 76 65 20 61 20 64 69 67 69 74 2e  we have a digit.
0aa0: 20 61 74 6f 69 28 29 20 77 69 6c 6c 20 67 65 74   atoi() will get
0ab0: 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 65 20   as much of the 
0ac0: 6e 75 6d 62 65 72 20 61 73 20 69 74 0a 20 20 20  number as it.   
0ad0: 20 2a 2a 20 63 61 6e 2e 20 57 65 27 6c 6c 20 72   ** can. We'll r
0ae0: 75 6e 20 69 74 20 74 68 72 6f 75 67 68 20 6d 70  un it through mp
0af0: 72 69 6e 74 66 28 29 20 74 6f 20 67 65 74 20 61  rintf() to get a
0b00: 20 73 74 72 69 6e 67 2e 20 4e 6f 74 0a 20 20 20   string. Not.   
0b10: 20 2a 2a 20 61 6e 20 65 66 66 69 63 69 65 6e 74   ** an efficient
0b20: 20 77 61 79 20 74 6f 20 64 6f 20 69 74 2c 20 62   way to do it, b
0b30: 75 74 20 65 66 66 65 63 74 69 76 65 2e 0a 20 20  ut effective..  
0b40: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
0b50: 6d 70 72 69 6e 74 66 28 22 25 64 22 2c 20 61 74  mprintf("%d", at
0b60: 6f 69 28 7a 4f 72 69 67 29 29 3b 0a 20 20 7d 0a  oi(zOrig));.  }.
0b70: 20 20 72 65 74 75 72 6e 20 22 22 3b 0a 7d 0a 0a    return "";.}..
0b80: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 62 6c 61  /*.** Remove bla
0b90: 6e 6b 20 6c 69 6e 65 73 20 66 72 6f 6d 20 74 68  nk lines from th
0ba0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
0bb0: 20 73 74 72 69 6e 67 20 61 6e 64 0a 2a 2a 20 61   string and.** a
0bc0: 6c 6c 20 77 68 69 74 65 73 70 61 63 65 20 66 72  ll whitespace fr
0bd0: 6f 6d 20 74 68 65 20 65 6e 64 2e 20 52 65 6d 6f  om the end. Remo
0be0: 76 65 73 20 77 68 69 74 65 73 70 61 63 65 20 70  ves whitespace p
0bf0: 72 65 63 65 65 64 69 6e 67 20 61 20 4e 4c 2c 0a  receeding a NL,.
0c00: 2a 2a 20 77 68 69 63 68 20 61 6c 73 6f 20 63 6f  ** which also co
0c10: 6e 76 65 72 74 73 20 61 6e 79 20 43 52 4e 4c 20  nverts any CRNL 
0c20: 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 61 20  sequence into a 
0c30: 73 69 6e 67 6c 65 20 4e 4c 2e 0a 2a 2f 0a 63 68  single NL..*/.ch
0c40: 61 72 20 2a 72 65 6d 6f 76 65 5f 62 6c 61 6e 6b  ar *remove_blank
0c50: 5f 6c 69 6e 65 73 28 63 6f 6e 73 74 20 63 68 61  _lines(const cha
0c60: 72 20 2a 7a 4f 72 69 67 29 7b 0a 20 20 69 6e 74  r *zOrig){.  int
0c70: 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 63 68 61 72   i, j, n;.  char
0c80: 20 2a 7a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30   *z;.  for(i=j=0
0c90: 3b 20 69 73 73 70 61 63 65 28 7a 4f 72 69 67 5b  ; isspace(zOrig[
0ca0: 69 5d 29 3b 20 69 2b 2b 29 7b 20 69 66 28 20 7a  i]); i++){ if( z
0cb0: 4f 72 69 67 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20  Orig[i]=='\n' ) 
0cc0: 6a 20 3d 20 69 2b 31 3b 20 7d 0a 20 20 6e 20 3d  j = i+1; }.  n =
0cd0: 20 73 74 72 6c 65 6e 28 26 7a 4f 72 69 67 5b 6a   strlen(&zOrig[j
0ce0: 5d 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  ]);.  while( n>0
0cf0: 20 26 26 20 69 73 73 70 61 63 65 28 7a 4f 72 69   && isspace(zOri
0d00: 67 5b 6a 2b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d  g[j+n-1]) ){ n--
0d10: 3b 20 7d 0a 20 20 7a 20 3d 20 6d 70 72 69 6e 74  ; }.  z = mprint
0d20: 66 28 22 25 2e 2a 73 22 2c 20 6e 2c 20 26 7a 4f  f("%.*s", n, &zO
0d30: 72 69 67 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69  rig[j]);.  for(i
0d40: 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  =j=0; z[i]; i++)
0d50: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d  {.    if( z[i+1]
0d60: 3d 3d 27 5c 6e 27 20 26 26 20 7a 5b 69 5d 21 3d  =='\n' && z[i]!=
0d70: 27 5c 6e 27 20 26 26 20 69 73 73 70 61 63 65 28  '\n' && isspace(
0d80: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 7a  z[i]) ){.      z
0d90: 5b 6a 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  [j] = z[i];.    
0da0: 20 20 77 68 69 6c 65 28 69 73 73 70 61 63 65 28    while(isspace(
0db0: 7a 5b 6a 5d 29 20 26 26 20 7a 5b 6a 5d 20 21 3d  z[j]) && z[j] !=
0dc0: 20 27 5c 6e 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a   '\n' ){ j--; }.
0dd0: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
0de0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
0df0: 0a 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a  ..    z[j++] = z
0e00: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20  [i];.  }.  z[j] 
0e10: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  = 0;.  return z;
0e20: 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
0e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
0e70: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
0e80: 53 51 4c 69 74 65 20 61 75 74 68 6f 72 69 7a 65  SQLite authorize
0e90: 72 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  r callback used 
0ea0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
0eb0: 74 20 74 68 65 0a 2a 2a 20 53 51 4c 20 73 74 61  t the.** SQL sta
0ec0: 74 65 6d 65 6e 74 73 20 65 6e 74 65 72 65 64 20  tements entered 
0ed0: 62 79 20 75 73 65 72 73 20 64 6f 20 6e 6f 74 20  by users do not 
0ee0: 74 72 79 20 74 6f 20 64 6f 20 61 6e 79 74 68 69  try to do anythi
0ef0: 6e 67 20 75 6e 74 6f 77 61 72 64 2e 0a 2a 2a 20  ng untoward..** 
0f00: 49 66 20 61 6e 79 74 68 69 6e 67 20 73 75 73 70  If anything susp
0f10: 69 63 69 6f 75 73 20 69 73 20 74 72 69 65 64 2c  icious is tried,
0f20: 20 73 65 74 20 2a 28 63 68 61 72 2a 2a 29 70 45   set *(char**)pE
0f30: 72 72 6f 72 20 74 6f 20 61 6e 20 65 72 72 6f 72  rror to an error
0f40: 0a 2a 2a 20 6d 65 73 73 61 67 65 20 6f 62 74 61  .** message obta
0f50: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
0f60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0f70: 72 65 70 6f 72 74 5f 71 75 65 72 79 5f 61 75 74  report_query_aut
0f80: 68 6f 72 69 7a 65 72 28 0a 20 20 76 6f 69 64 20  horizer(.  void 
0f90: 2a 70 45 72 72 6f 72 2c 0a 20 20 69 6e 74 20 63  *pError,.  int c
0fa0: 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ode,.  const cha
0fb0: 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73  r *zArg1,.  cons
0fc0: 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20  t char *zArg2,. 
0fd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
0fe0: 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g3,.  const char
0ff0: 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68 61   *zArg4.){.  cha
1000: 72 20 2a 7a 45 72 72 6f 72 20 3d 20 2a 28 63 68  r *zError = *(ch
1010: 61 72 2a 2a 29 70 45 72 72 6f 72 3b 0a 20 20 69  ar**)pError;.  i
1020: 66 28 20 7a 45 72 72 6f 72 20 29 7b 0a 20 20 20  f( zError ){.   
1030: 20 2f 2a 20 57 65 27 76 65 20 61 6c 72 65 61 64   /* We've alread
1040: 79 20 73 65 65 6e 20 61 6e 20 65 72 72 6f 72 2e  y seen an error.
1050: 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 6f 6e    No need to con
1060: 74 69 6e 75 65 2e 20 2a 2f 0a 20 20 20 20 72 65  tinue. */.    re
1070: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1080: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 63 6f    }.  switch( co
1090: 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  de ){.    case S
10a0: 51 4c 49 54 45 5f 53 45 4c 45 43 54 3a 0a 20 20  QLITE_SELECT:.  
10b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
10c0: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
10d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
10f0: 44 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69  D: {.      stati
1100: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
1110: 41 6c 6c 6f 77 65 64 5b 5d 20 3d 20 7b 0a 20 20  Allowed[] = {.  
1120: 20 20 20 20 20 20 20 22 74 69 63 6b 65 74 22 2c         "ticket",
1130: 0a 20 20 20 20 20 20 20 20 20 22 62 6c 6f 62 22  .         "blob"
1140: 2c 0a 20 20 20 20 20 20 20 20 20 22 66 69 6c 65  ,.         "file
1150: 6e 61 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 20  name",.         
1160: 22 6d 6c 69 6e 6b 22 2c 0a 20 20 20 20 20 20 20  "mlink",.       
1170: 20 20 22 70 6c 69 6e 6b 22 2c 0a 20 20 20 20 20    "plink",.     
1180: 20 20 20 20 22 65 76 65 6e 74 22 2c 0a 20 20 20      "event",.   
1190: 20 20 20 20 20 20 22 74 61 67 22 2c 0a 20 20 20        "tag",.   
11a0: 20 20 20 20 20 20 22 74 61 67 78 72 65 66 22 2c        "tagxref",
11b0: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
11c0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
11d0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
11e0: 7a 41 6c 6c 6f 77 65 64 29 2f 73 69 7a 65 6f 66  zAllowed)/sizeof
11f0: 28 61 7a 41 6c 6c 6f 77 65 64 5b 30 5d 29 3b 20  (azAllowed[0]); 
1200: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
1210: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 41 72  ( strcasecmp(zAr
1220: 67 31 2c 20 61 7a 41 6c 6c 6f 77 65 64 5b 69 5d  g1, azAllowed[i]
1230: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
1240: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1250: 69 3e 3d 73 69 7a 65 6f 66 28 61 7a 41 6c 6c 6f  i>=sizeof(azAllo
1260: 77 65 64 29 2f 73 69 7a 65 6f 66 28 61 7a 41 6c  wed)/sizeof(azAl
1270: 6c 6f 77 65 64 5b 30 5d 29 20 29 7b 0a 20 20 20  lowed[0]) ){.   
1280: 20 20 20 20 20 7a 45 72 72 6f 72 20 3d 20 6d 70       zError = mp
1290: 72 69 6e 74 66 28 22 63 61 6e 6e 6f 74 20 61 63  rintf("cannot ac
12a0: 63 65 73 73 20 74 61 62 6c 65 20 25 73 22 2c 20  cess table %s", 
12b0: 7a 41 72 67 31 29 3b 0a 20 20 20 20 20 20 7d 0a  zArg1);.      }.
12c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12d0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
12e0: 7b 0a 20 20 20 20 20 20 7a 45 72 72 6f 72 20 3d  {.      zError =
12f0: 20 6d 70 72 69 6e 74 66 28 22 6f 6e 6c 79 20 53   mprintf("only S
1300: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
1310: 20 61 72 65 20 61 6c 6c 6f 77 65 64 22 29 3b 0a   are allowed");.
1320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1330: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1340: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
1350: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 67  *.** Check the g
1360: 69 76 65 6e 20 53 51 4c 20 74 6f 20 73 65 65 20  iven SQL to see 
1370: 69 66 20 69 73 20 61 20 76 61 6c 69 64 20 71 75  if is a valid qu
1380: 65 72 79 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ery that does no
1390: 74 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  t.** attempt to 
13a0: 64 6f 20 61 6e 79 74 68 69 6e 67 20 64 61 6e 67  do anything dang
13b0: 65 72 6f 75 73 2e 20 20 52 65 74 75 72 6e 20 30  erous.  Return 0
13c0: 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
13d0: 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
13e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
13f0: 20 73 74 72 69 6e 67 20 28 6f 62 74 61 69 6e 65   string (obtaine
1400: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 29 20 69  d from malloc) i
1410: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  f.** there is a 
1420: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 63 68 61 72  problem..*/.char
1430: 20 2a 76 65 72 69 66 79 5f 73 71 6c 5f 73 74 61   *verify_sql_sta
1440: 74 65 6d 65 6e 74 28 63 68 61 72 20 2a 7a 53 71  tement(char *zSq
1450: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  l){.  int i;.  c
1460: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
1470: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1480: 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  il;.  sqlite3_st
1490: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
14a0: 20 72 63 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74   rc;..  /* First
14b0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 53   make sure the S
14c0: 51 4c 20 69 73 20 61 20 73 69 6e 67 6c 65 20 71  QL is a single q
14d0: 75 65 72 79 20 63 6f 6d 6d 61 6e 64 20 62 79 20  uery command by 
14e0: 76 65 72 69 66 79 69 6e 67 20 74 68 61 74 0a 20  verifying that. 
14f0: 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 6f   ** the first to
1500: 6b 65 6e 20 69 73 20 22 53 45 4c 45 43 54 22 20  ken is "SELECT" 
1510: 61 6e 64 20 74 68 61 74 20 74 68 65 72 65 20 61  and that there a
1520: 72 65 20 6e 6f 20 75 6e 71 75 6f 74 65 64 20 73  re no unquoted s
1530: 65 6d 69 63 6f 6c 6f 6e 73 2e 0a 20 20 2a 2f 0a  emicolons..  */.
1540: 20 20 66 6f 72 28 69 3d 30 3b 20 69 73 73 70 61    for(i=0; isspa
1550: 63 65 28 7a 53 71 6c 5b 69 5d 29 3b 20 69 2b 2b  ce(zSql[i]); i++
1560: 29 7b 7d 0a 20 20 69 66 28 20 73 74 72 6e 63 61  ){}.  if( strnca
1570: 73 65 63 6d 70 28 26 7a 53 71 6c 5b 69 5d 2c 22  secmp(&zSql[i],"
1580: 73 65 6c 65 63 74 22 2c 36 29 21 3d 30 20 29 7b  select",6)!=0 ){
1590: 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 70 72 69  .    return mpri
15a0: 6e 74 66 28 22 54 68 65 20 53 51 4c 20 6d 75 73  ntf("The SQL mus
15b0: 74 20 62 65 20 61 20 53 45 4c 45 43 54 20 73 74  t be a SELECT st
15c0: 61 74 65 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20  atement");.  }. 
15d0: 20 66 6f 72 28 69 3d 30 3b 20 7a 53 71 6c 5b 69   for(i=0; zSql[i
15e0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; i++){.    if(
15f0: 20 7a 53 71 6c 5b 69 5d 3d 3d 27 3b 27 20 29 7b   zSql[i]==';' ){
1600: 0a 20 20 20 20 20 20 69 6e 74 20 62 61 64 3b 0a  .      int bad;.
1610: 20 20 20 20 20 20 69 6e 74 20 63 20 3d 20 7a 53        int c = zS
1620: 71 6c 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 7a  ql[i+1];.      z
1630: 53 71 6c 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20  Sql[i+1] = 0;.  
1640: 20 20 20 20 62 61 64 20 3d 20 73 71 6c 69 74 65      bad = sqlite
1650: 33 5f 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 29  3_complete(zSql)
1660: 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 69 2b 31  ;.      zSql[i+1
1670: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 69 66 28  ] = c;.      if(
1680: 20 62 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20   bad ){.        
1690: 2f 2a 20 41 20 63 6f 6d 70 6c 65 74 65 20 73 74  /* A complete st
16a0: 61 74 65 6d 65 6e 74 20 62 61 73 69 63 61 6c 6c  atement basicall
16b0: 79 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20  y means that an 
16c0: 75 6e 71 75 6f 74 65 64 20 73 65 6d 69 2d 63 6f  unquoted semi-co
16d0: 6c 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  lon.        ** w
16e0: 61 73 20 66 6f 75 6e 64 2e 20 57 65 20 64 6f 6e  as found. We don
16f0: 27 74 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63  't actually chec
1700: 6b 20 77 68 61 74 27 73 20 61 66 74 65 72 20 74  k what's after t
1710: 68 61 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  hat..        */.
1720: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d          return m
1730: 70 72 69 6e 74 66 28 22 53 65 6d 69 2d 63 6f 6c  printf("Semi-col
1740: 6f 6e 20 64 65 74 65 63 74 65 64 21 20 22 0a 20  on detected! ". 
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 20 20 20 20 20 20 22 4f 6e 6c 79 20 61 20 73 69        "Only a si
1770: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
1780: 6e 74 20 69 73 20 61 6c 6c 6f 77 65 64 22 29 3b  nt is allowed");
1790: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17a0: 20 7d 0a 20 20 0a 20 20 2f 2a 20 43 6f 6d 70 69   }.  .  /* Compi
17b0: 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  le the statement
17c0: 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 69   and check for i
17d0: 6c 6c 65 67 61 6c 20 61 63 63 65 73 73 65 73 20  llegal accesses 
17e0: 6f 72 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73  or syntax errors
17f0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  . */.  sqlite3_s
1800: 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 67 2e  et_authorizer(g.
1810: 64 62 2c 20 72 65 70 6f 72 74 5f 71 75 65 72 79  db, report_query
1820: 5f 61 75 74 68 6f 72 69 7a 65 72 2c 20 28 76 6f  _authorizer, (vo
1830: 69 64 2a 29 26 7a 45 72 72 29 3b 0a 20 20 72 63  id*)&zErr);.  rc
1840: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1850: 72 65 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 2d  re(g.db, zSql, -
1860: 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54 61 69  1, &pStmt, &zTai
1870: 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
1880: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
1890: 45 72 72 20 3d 20 6d 70 72 69 6e 74 66 28 22 53  Err = mprintf("S
18a0: 79 6e 74 61 78 20 65 72 72 6f 72 3a 20 25 73 22  yntax error: %s"
18b0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
18c0: 28 67 2e 64 62 29 29 3b 0a 20 20 7d 0a 20 20 69  (g.db));.  }.  i
18d0: 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
18e0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
18f0: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 73  (pStmt);.  }.  s
1900: 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
1910: 72 69 7a 65 72 28 67 2e 64 62 2c 20 30 2c 20 30  rizer(g.db, 0, 0
1920: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72  );.  return zErr
1930: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41  ;.}../*.** WEBPA
1940: 47 45 3a 20 2f 72 70 74 73 71 6c 0a 2a 2f 0a 76  GE: /rptsql.*/.v
1950: 6f 69 64 20 76 69 65 77 5f 73 65 65 5f 73 71 6c  oid view_see_sql
1960: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72 6e  (void){.  int rn
1970: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1980: 7a 54 69 74 6c 65 3b 0a 20 20 63 6f 6e 73 74 20  zTitle;.  const 
1990: 63 68 61 72 20 2a 7a 53 51 4c 3b 0a 20 20 63 6f  char *zSQL;.  co
19a0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 77 6e 65 72  nst char *zOwner
19b0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
19c0: 7a 43 6c 72 4b 65 79 3b 0a 20 20 53 74 6d 74 20  zClrKey;.  Stmt 
19d0: 71 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63  q;..  login_chec
19e0: 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b  k_credentials();
19f0: 0a 20 20 69 66 28 20 21 67 2e 6f 6b 51 75 65 72  .  if( !g.okQuer
1a00: 79 20 29 7b 0a 20 20 20 20 6c 6f 67 69 6e 5f 6e  y ){.    login_n
1a10: 65 65 64 65 64 28 29 3b 0a 20 20 20 20 72 65 74  eeded();.    ret
1a20: 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 6e 20 3d 20  urn;.  }.  rn = 
1a30: 61 74 6f 69 28 50 44 28 22 72 6e 22 2c 22 30 22  atoi(PD("rn","0"
1a40: 29 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65  ));.  db_prepare
1a50: 28 26 71 2c 20 22 53 45 4c 45 43 54 20 74 69 74  (&q, "SELECT tit
1a60: 6c 65 2c 20 73 71 6c 63 6f 64 65 2c 20 6f 77 6e  le, sqlcode, own
1a70: 65 72 2c 20 63 6f 6c 73 20 22 0a 20 20 20 20 20  er, cols ".     
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 46                "F
1a90: 52 4f 4d 20 72 65 70 6f 72 74 66 6d 74 20 57 48  ROM reportfmt WH
1aa0: 45 52 45 20 72 6e 3d 25 64 22 2c 72 6e 29 3b 0a  ERE rn=%d",rn);.
1ab0: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22    style_header("
1ac0: 53 51 4c 20 46 6f 72 20 52 65 70 6f 72 74 20 46  SQL For Report F
1ad0: 6f 72 6d 61 74 20 4e 75 6d 62 65 72 20 25 64 22  ormat Number %d"
1ae0: 2c 20 72 6e 29 3b 0a 20 20 69 66 28 20 64 62 5f  , rn);.  if( db_
1af0: 73 74 65 70 28 26 71 29 21 3d 53 51 4c 49 54 45  step(&q)!=SQLITE
1b00: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 40 20 3c 70  _ROW ){.    @ <p
1b10: 3e 55 6e 6b 6e 6f 77 6e 20 72 65 70 6f 72 74 20  >Unknown report 
1b20: 6e 75 6d 62 65 72 3a 20 25 64 28 72 6e 29 3c 2f  number: %d(rn)</
1b30: 70 3e 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f  p>.    style_foo
1b40: 74 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72  ter();.    retur
1b50: 6e 3b 0a 20 20 7d 0a 20 20 7a 54 69 74 6c 65 20  n;.  }.  zTitle 
1b60: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
1b70: 28 26 71 2c 20 30 29 3b 0a 20 20 7a 53 51 4c 20  (&q, 0);.  zSQL 
1b80: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
1b90: 28 26 71 2c 20 31 29 3b 0a 20 20 7a 4f 77 6e 65  (&q, 1);.  zOwne
1ba0: 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  r = db_column_te
1bb0: 78 74 28 26 71 2c 20 32 29 3b 0a 20 20 7a 43 6c  xt(&q, 2);.  zCl
1bc0: 72 4b 65 79 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  rKey = db_column
1bd0: 5f 74 65 78 74 28 26 71 2c 20 33 29 3b 0a 20 20  _text(&q, 3);.  
1be0: 40 20 3c 74 61 62 6c 65 20 63 65 6c 6c 70 61 64  @ <table cellpad
1bf0: 64 69 6e 67 3d 30 20 63 65 6c 6c 73 70 61 63 69  ding=0 cellspaci
1c00: 6e 67 3d 30 20 62 6f 72 64 65 72 3d 30 3e 0a 20  ng=0 border=0>. 
1c10: 20 40 20 3c 74 72 3e 3c 74 64 20 76 61 6c 69 67   @ <tr><td valig
1c20: 6e 3d 22 74 6f 70 22 20 61 6c 69 67 6e 3d 22 72  n="top" align="r
1c30: 69 67 68 74 22 3e 54 69 74 6c 65 3a 3c 2f 74 64  ight">Title:</td
1c40: 3e 3c 74 64 20 77 69 64 74 68 3d 31 35 3e 3c 2f  ><td width=15></
1c50: 74 64 3e 0a 20 20 40 20 3c 74 64 20 63 6f 6c 73  td>.  @ <td cols
1c60: 70 61 6e 3d 33 3e 25 68 28 7a 54 69 74 6c 65 29  pan=3>%h(zTitle)
1c70: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c  </td></tr>.  @ <
1c80: 74 72 3e 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74  tr><td valign="t
1c90: 6f 70 22 20 61 6c 69 67 6e 3d 22 72 69 67 68 74  op" align="right
1ca0: 22 3e 4f 77 6e 65 72 3a 3c 2f 74 64 3e 3c 74 64  ">Owner:</td><td
1cb0: 3e 3c 2f 74 64 3e 0a 20 20 40 20 3c 74 64 20 63  ></td>.  @ <td c
1cc0: 6f 6c 73 70 61 6e 3d 33 3e 25 68 28 7a 4f 77 6e  olspan=3>%h(zOwn
1cd0: 65 72 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20  er)</td></tr>.  
1ce0: 40 20 3c 74 72 3e 3c 74 64 20 76 61 6c 69 67 6e  @ <tr><td valign
1cf0: 3d 22 74 6f 70 22 20 61 6c 69 67 6e 3d 22 72 69  ="top" align="ri
1d00: 67 68 74 22 3e 53 51 4c 3a 3c 2f 74 64 3e 3c 74  ght">SQL:</td><t
1d10: 64 3e 3c 2f 74 64 3e 0a 20 20 40 20 3c 74 64 20  d></td>.  @ <td 
1d20: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 3c 70 72  valign="top"><pr
1d30: 65 3e 0a 20 20 40 20 25 68 28 7a 53 51 4c 29 0a  e>.  @ %h(zSQL).
1d40: 20 20 40 20 3c 2f 70 72 65 3e 3c 2f 74 64 3e 0a    @ </pre></td>.
1d50: 20 20 40 20 3c 74 64 20 77 69 64 74 68 3d 31 35    @ <td width=15
1d60: 3e 3c 2f 74 64 3e 3c 74 64 20 76 61 6c 69 67 6e  ></td><td valign
1d70: 3d 22 74 6f 70 22 3e 0a 20 20 6f 75 74 70 75 74  ="top">.  output
1d80: 5f 63 6f 6c 6f 72 5f 6b 65 79 28 7a 43 6c 72 4b  _color_key(zClrK
1d90: 65 79 2c 20 30 2c 20 22 62 6f 72 64 65 72 3d 30  ey, 0, "border=0
1da0: 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d 30 20 63   cellspacing=0 c
1db0: 65 6c 6c 70 61 64 64 69 6e 67 3d 33 22 29 3b 0a  ellpadding=3");.
1dc0: 20 20 40 20 3c 2f 74 64 3e 0a 20 20 40 20 3c 2f    @ </td>.  @ </
1dd0: 74 72 3e 3c 2f 74 61 62 6c 65 3e 0a 20 20 72 65  tr></table>.  re
1de0: 70 6f 72 74 5f 66 6f 72 6d 61 74 5f 68 69 6e 74  port_format_hint
1df0: 73 28 29 3b 0a 20 20 73 74 79 6c 65 5f 66 6f 6f  s();.  style_foo
1e00: 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ter();.}../*.** 
1e10: 57 45 42 50 41 47 45 3a 20 2f 72 70 74 6e 65 77  WEBPAGE: /rptnew
1e20: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 2f 72 70  .** WEBPAGE: /rp
1e30: 74 65 64 69 74 0a 2a 2f 0a 76 6f 69 64 20 76 69  tedit.*/.void vi
1e40: 65 77 5f 65 64 69 74 28 76 6f 69 64 29 7b 0a 20  ew_edit(void){. 
1e50: 20 69 6e 74 20 72 6e 3b 0a 20 20 63 6f 6e 73 74   int rn;.  const
1e60: 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 3b 0a 20   char *zTitle;. 
1e70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
1e80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
1e90: 77 6e 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 43  wner;.  char *zC
1ea0: 6c 72 4b 65 79 3b 0a 20 20 63 68 61 72 20 2a 7a  lrKey;.  char *z
1eb0: 53 51 4c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  SQL;.  char *zEr
1ec0: 72 20 3d 20 30 3b 0a 0a 20 20 6c 6f 67 69 6e 5f  r = 0;..  login_
1ed0: 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c  check_credential
1ee0: 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b  s();.  if( !g.ok
1ef0: 51 75 65 72 79 20 29 7b 0a 20 20 20 20 6c 6f 67  Query ){.    log
1f00: 69 6e 5f 6e 65 65 64 65 64 28 29 3b 0a 20 20 20  in_needed();.   
1f10: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 2f   return;.  }.  /
1f20: 2a 76 69 65 77 5f 61 64 64 5f 66 75 6e 63 74 69  *view_add_functi
1f30: 6f 6e 73 28 30 29 3b 2a 2f 0a 20 20 72 6e 20 3d  ons(0);*/.  rn =
1f40: 20 61 74 6f 69 28 50 44 28 22 72 6e 22 2c 22 30   atoi(PD("rn","0
1f50: 22 29 29 3b 0a 20 20 7a 54 69 74 6c 65 20 3d 20  "));.  zTitle = 
1f60: 50 28 22 74 22 29 3b 0a 20 20 7a 4f 77 6e 65 72  P("t");.  zOwner
1f70: 20 3d 20 50 44 28 22 77 22 2c 67 2e 7a 4c 6f 67   = PD("w",g.zLog
1f80: 69 6e 29 3b 0a 20 20 7a 20 3d 20 50 28 22 73 22  in);.  z = P("s"
1f90: 29 3b 0a 20 20 7a 53 51 4c 20 3d 20 7a 20 3f 20  );.  zSQL = z ? 
1fa0: 74 72 69 6d 5f 73 74 72 69 6e 67 28 7a 29 20 3a  trim_string(z) :
1fb0: 20 30 3b 0a 20 20 7a 43 6c 72 4b 65 79 20 3d 20   0;.  zClrKey = 
1fc0: 74 72 69 6d 5f 73 74 72 69 6e 67 28 50 44 28 22  trim_string(PD("
1fd0: 6b 22 2c 22 22 29 29 3b 0a 20 20 69 66 28 20 72  k",""));.  if( r
1fe0: 6e 3e 30 20 26 26 20 50 28 22 64 65 6c 32 22 29  n>0 && P("del2")
1ff0: 20 29 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69   ){.    db_multi
2000: 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20 46 52  _exec("DELETE FR
2010: 4f 4d 20 72 65 70 6f 72 74 66 6d 74 20 57 48 45  OM reportfmt WHE
2020: 52 45 20 72 6e 3d 25 64 22 2c 20 72 6e 29 3b 0a  RE rn=%d", rn);.
2030: 20 20 20 20 63 67 69 5f 72 65 64 69 72 65 63 74      cgi_redirect
2040: 28 22 72 65 70 6f 72 74 6c 69 73 74 22 29 3b 0a  ("reportlist");.
2050: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
2060: 6c 73 65 20 69 66 28 20 72 6e 3e 30 20 26 26 20  lse if( rn>0 && 
2070: 50 28 22 64 65 6c 31 22 29 20 29 7b 0a 20 20 20  P("del1") ){.   
2080: 20 7a 54 69 74 6c 65 20 3d 20 64 62 5f 74 65 78   zTitle = db_tex
2090: 74 28 30 2c 20 22 53 45 4c 45 43 54 20 74 69 74  t(0, "SELECT tit
20a0: 6c 65 20 46 52 4f 4d 20 72 65 70 6f 72 74 66 6d  le FROM reportfm
20b0: 74 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  t ".            
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 57 48               "WH
20d0: 45 52 45 20 72 6e 3d 25 64 22 2c 20 72 6e 29 3b  ERE rn=%d", rn);
20e0: 0a 20 20 20 20 69 66 28 20 7a 54 69 74 6c 65 3d  .    if( zTitle=
20f0: 3d 30 20 29 20 63 67 69 5f 72 65 64 69 72 65 63  =0 ) cgi_redirec
2100: 74 28 22 72 65 70 6f 72 74 6c 69 73 74 22 29 3b  t("reportlist");
2110: 0a 0a 20 20 20 20 73 74 79 6c 65 5f 68 65 61 64  ..    style_head
2120: 65 72 28 22 41 72 65 20 59 6f 75 20 53 75 72 65  er("Are You Sure
2130: 3f 22 29 3b 0a 20 20 20 20 40 20 3c 66 6f 72 6d  ?");.    @ <form
2140: 20 61 63 74 69 6f 6e 3d 22 72 70 74 65 64 69 74   action="rptedit
2150: 22 20 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22 3e  " method="POST">
2160: 0a 20 20 20 20 40 20 3c 70 3e 59 6f 75 20 61 72  .    @ <p>You ar
2170: 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74  e about to delet
2180: 65 20 61 6c 6c 20 74 72 61 63 65 73 20 6f 66 20  e all traces of 
2190: 74 68 65 20 72 65 70 6f 72 74 0a 20 20 20 20 40  the report.    @
21a0: 20 3c 73 74 72 6f 6e 67 3e 25 68 28 7a 54 69 74   <strong>%h(zTit
21b0: 6c 65 29 3c 2f 73 74 72 6f 6e 67 3e 20 66 72 6f  le)</strong> fro
21c0: 6d 0a 20 20 20 20 40 20 74 68 65 20 64 61 74 61  m.    @ the data
21d0: 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 61  base.  This is a
21e0: 6e 20 69 72 72 65 76 65 72 73 69 62 6c 65 20 6f  n irreversible o
21f0: 70 65 72 61 74 69 6f 6e 2e 20 20 41 6c 6c 20 72  peration.  All r
2200: 65 63 6f 72 64 73 0a 20 20 20 20 40 20 72 65 6c  ecords.    @ rel
2210: 61 74 65 64 20 74 6f 20 74 68 69 73 20 72 65 70  ated to this rep
2220: 6f 72 74 20 77 69 6c 6c 20 62 65 20 72 65 6d 6f  ort will be remo
2230: 76 65 64 20 61 6e 64 20 63 61 6e 6e 6f 74 20 62  ved and cannot b
2240: 65 20 72 65 63 6f 76 65 72 65 64 2e 3c 2f 70 3e  e recovered.</p>
2250: 0a 20 20 20 20 40 0a 20 20 20 20 40 20 3c 69 6e  .    @.    @ <in
2260: 70 75 74 20 74 79 70 65 3d 22 68 69 64 64 65 6e  put type="hidden
2270: 22 20 6e 61 6d 65 3d 22 72 6e 22 20 76 61 6c 75  " name="rn" valu
2280: 65 3d 22 25 64 28 72 6e 29 22 3e 0a 20 20 20 20  e="%d(rn)">.    
2290: 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73  @ <input type="s
22a0: 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 64 65 6c  ubmit" name="del
22b0: 32 22 20 76 61 6c 75 65 3d 22 44 65 6c 65 74 65  2" value="Delete
22c0: 20 54 68 65 20 52 65 70 6f 72 74 22 3e 0a 20 20   The Report">.  
22d0: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
22e0: 22 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 63  "submit" name="c
22f0: 61 6e 22 20 76 61 6c 75 65 3d 22 43 61 6e 63 65  an" value="Cance
2300: 6c 22 3e 0a 20 20 20 20 40 20 3c 2f 66 6f 72 6d  l">.    @ </form
2310: 3e 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74  >.    style_foot
2320: 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  er();.    return
2330: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 50 28  ;.  }else if( P(
2340: 22 63 61 6e 22 29 20 29 7b 0a 20 20 20 20 2f 2a  "can") ){.    /*
2350: 20 75 73 65 72 20 63 61 6e 63 65 6c 6c 65 64 20   user cancelled 
2360: 2a 2f 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72  */.    cgi_redir
2370: 65 63 74 28 22 72 65 70 6f 72 74 6c 69 73 74 22  ect("reportlist"
2380: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2390: 20 7d 0a 20 20 69 66 28 20 7a 54 69 74 6c 65 20   }.  if( zTitle 
23a0: 26 26 20 7a 53 51 4c 20 29 7b 0a 20 20 20 20 69  && zSQL ){.    i
23b0: 66 28 20 7a 53 51 4c 5b 30 5d 3d 3d 30 20 29 7b  f( zSQL[0]==0 ){
23c0: 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 50  .      zErr = "P
23d0: 6c 65 61 73 65 20 73 75 70 70 6c 79 20 61 6e 20  lease supply an 
23e0: 53 51 4c 20 71 75 65 72 79 20 73 74 61 74 65 6d  SQL query statem
23f0: 65 6e 74 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ent";.    }else 
2400: 69 66 28 20 28 7a 54 69 74 6c 65 20 3d 20 74 72  if( (zTitle = tr
2410: 69 6d 5f 73 74 72 69 6e 67 28 7a 54 69 74 6c 65  im_string(zTitle
2420: 29 29 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ))[0]==0 ){.    
2430: 20 20 7a 45 72 72 20 3d 20 22 50 6c 65 61 73 65    zErr = "Please
2440: 20 73 75 70 70 6c 79 20 61 20 74 69 74 6c 65 22   supply a title"
2450: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
2460: 20 20 20 20 7a 45 72 72 20 3d 20 76 65 72 69 66      zErr = verif
2470: 79 5f 73 71 6c 5f 73 74 61 74 65 6d 65 6e 74 28  y_sql_statement(
2480: 7a 53 51 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSQL);.    }.   
2490: 20 69 66 28 20 7a 45 72 72 3d 3d 30 20 29 7b 0a   if( zErr==0 ){.
24a0: 20 20 20 20 20 20 69 66 28 20 72 6e 3e 30 20 29        if( rn>0 )
24b0: 7b 0a 20 20 20 20 20 20 20 20 64 62 5f 6d 75 6c  {.        db_mul
24c0: 74 69 5f 65 78 65 63 28 22 55 50 44 41 54 45 20  ti_exec("UPDATE 
24d0: 72 65 70 6f 72 74 66 6d 74 20 53 45 54 20 74 69  reportfmt SET ti
24e0: 74 6c 65 3d 25 51 2c 20 73 71 6c 63 6f 64 65 3d  tle=%Q, sqlcode=
24f0: 25 51 2c 22 0a 20 20 20 20 20 20 20 20 20 20 20  %Q,".           
2500: 20 20 20 20 20 20 20 20 20 20 20 22 20 6f 77 6e             " own
2510: 65 72 3d 25 51 2c 20 63 6f 6c 73 3d 25 51 20 57  er=%Q, cols=%Q W
2520: 48 45 52 45 20 72 6e 3d 25 64 22 2c 0a 20 20 20  HERE rn=%d",.   
2530: 20 20 20 20 20 20 20 20 7a 54 69 74 6c 65 2c 20          zTitle, 
2540: 7a 53 51 4c 2c 20 7a 4f 77 6e 65 72 2c 20 7a 43  zSQL, zOwner, zC
2550: 6c 72 4b 65 79 2c 20 72 6e 29 3b 0a 20 20 20 20  lrKey, rn);.    
2560: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2570: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
2580: 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 65 70 6f  INSERT INTO repo
2590: 72 74 66 6d 74 28 74 69 74 6c 65 2c 73 71 6c 63  rtfmt(title,sqlc
25a0: 6f 64 65 2c 6f 77 6e 65 72 2c 63 6f 6c 73 29 20  ode,owner,cols) 
25b0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 56 41  ".           "VA
25c0: 4c 55 45 53 28 25 51 2c 25 51 2c 25 51 2c 25 51  LUES(%Q,%Q,%Q,%Q
25d0: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a  )",.           z
25e0: 54 69 74 6c 65 2c 20 7a 53 51 4c 2c 20 7a 4f 77  Title, zSQL, zOw
25f0: 6e 65 72 2c 20 7a 43 6c 72 4b 65 79 29 3b 0a 20  ner, zClrKey);. 
2600: 20 20 20 20 20 20 20 72 6e 20 3d 20 64 62 5f 6c         rn = db_l
2610: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
2620: 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
2630: 20 20 63 67 69 5f 72 65 64 69 72 65 63 74 28 6d    cgi_redirect(m
2640: 70 72 69 6e 74 66 28 22 72 70 74 76 69 65 77 3f  printf("rptview?
2650: 72 6e 3d 25 64 22 2c 20 72 6e 29 29 3b 0a 20 20  rn=%d", rn));.  
2660: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2670: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 6e  }.  }else if( rn
2680: 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 54 69 74 6c  ==0 ){.    zTitl
2690: 65 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 51 4c  e = "";.    zSQL
26a0: 20 3d 20 0a 20 20 20 20 20 20 40 20 53 45 4c 45   = .      @ SELE
26b0: 43 54 0a 20 20 20 20 20 20 40 20 20 20 43 41 53  CT.      @   CAS
26c0: 45 20 57 48 45 4e 20 73 74 61 74 75 73 20 49 4e  E WHEN status IN
26d0: 20 28 27 6e 65 77 27 2c 27 61 63 74 69 76 65 27   ('new','active'
26e0: 29 20 54 48 45 4e 20 27 23 66 32 64 63 64 63 27  ) THEN '#f2dcdc'
26f0: 0a 20 20 20 20 20 20 40 20 20 20 20 20 20 20 20  .      @        
2700: 57 48 45 4e 20 73 74 61 74 75 73 3d 27 72 65 76  WHEN status='rev
2710: 69 65 77 27 20 54 48 45 4e 20 27 23 65 38 65 38  iew' THEN '#e8e8
2720: 62 64 27 0a 20 20 20 20 20 20 40 20 20 20 20 20  bd'.      @     
2730: 20 20 20 57 48 45 4e 20 73 74 61 74 75 73 3d 27     WHEN status='
2740: 66 69 78 65 64 27 20 54 48 45 4e 20 27 23 63 66  fixed' THEN '#cf
2750: 65 38 62 64 27 0a 20 20 20 20 20 20 40 20 20 20  e8bd'.      @   
2760: 20 20 20 20 20 57 48 45 4e 20 73 74 61 74 75 73       WHEN status
2770: 3d 27 74 65 73 74 65 64 27 20 54 48 45 4e 20 27  ='tested' THEN '
2780: 23 62 64 65 35 64 36 27 0a 20 20 20 20 20 20 40  #bde5d6'.      @
2790: 20 20 20 20 20 20 20 20 57 48 45 4e 20 73 74 61          WHEN sta
27a0: 74 75 73 3d 27 64 65 66 65 72 27 20 54 48 45 4e  tus='defer' THEN
27b0: 20 27 23 63 61 63 61 65 35 27 0a 20 20 20 20 20   '#cacae5'.     
27c0: 20 40 20 20 20 20 20 20 20 20 45 4c 53 45 20 27   @        ELSE '
27d0: 23 63 38 63 38 63 38 27 20 45 4e 44 20 41 53 20  #c8c8c8' END AS 
27e0: 27 62 67 63 6f 6c 6f 72 27 2c 0a 20 20 20 20 20  'bgcolor',.     
27f0: 20 40 20 20 20 74 6e 20 41 53 20 27 23 27 2c 0a   @   tn AS '#',.
2800: 20 20 20 20 20 20 40 20 20 20 74 79 70 65 20 41        @   type A
2810: 53 20 27 54 79 70 65 27 2c 0a 20 20 20 20 20 20  S 'Type',.      
2820: 40 20 20 20 73 74 61 74 75 73 20 41 53 20 27 53  @   status AS 'S
2830: 74 61 74 75 73 27 2c 0a 20 20 20 20 20 20 40 20  tatus',.      @ 
2840: 20 20 73 64 61 74 65 28 6f 72 69 67 74 69 6d 65    sdate(origtime
2850: 29 20 41 53 20 27 43 72 65 61 74 65 64 27 2c 0a  ) AS 'Created',.
2860: 20 20 20 20 20 20 40 20 20 20 6f 77 6e 65 72 20        @   owner 
2870: 41 53 20 27 42 79 27 2c 0a 20 20 20 20 20 20 40  AS 'By',.      @
2880: 20 20 20 73 75 62 73 79 73 74 65 6d 20 41 53 20     subsystem AS 
2890: 27 53 75 62 73 79 73 27 2c 0a 20 20 20 20 20 20  'Subsys',.      
28a0: 40 20 20 20 73 64 61 74 65 28 63 68 61 6e 67 65  @   sdate(change
28b0: 74 69 6d 65 29 20 41 53 20 27 43 68 61 6e 67 65  time) AS 'Change
28c0: 64 27 2c 0a 20 20 20 20 20 20 40 20 20 20 61 73  d',.      @   as
28d0: 73 69 67 6e 65 64 74 6f 20 41 53 20 27 41 73 73  signedto AS 'Ass
28e0: 69 67 6e 65 64 27 2c 0a 20 20 20 20 20 20 40 20  igned',.      @ 
28f0: 20 20 73 65 76 65 72 69 74 79 20 41 53 20 27 53    severity AS 'S
2900: 76 72 27 2c 0a 20 20 20 20 20 20 40 20 20 20 70  vr',.      @   p
2910: 72 69 6f 72 69 74 79 20 41 53 20 27 50 72 69 27  riority AS 'Pri'
2920: 2c 0a 20 20 20 20 20 20 40 20 20 20 74 69 74 6c  ,.      @   titl
2930: 65 20 41 53 20 27 54 69 74 6c 65 27 0a 20 20 20  e AS 'Title'.   
2940: 20 20 20 40 20 46 52 4f 4d 20 74 69 63 6b 65 74     @ FROM ticket
2950: 0a 20 20 20 20 3b 0a 20 20 20 20 7a 43 6c 72 4b  .    ;.    zClrK
2960: 65 79 20 3d 20 0a 20 20 20 20 20 20 40 20 23 66  ey = .      @ #f
2970: 66 66 66 66 66 20 4b 65 79 3a 0a 20 20 20 20 20  fffff Key:.     
2980: 20 40 20 23 66 32 64 63 64 63 20 41 63 74 69 76   @ #f2dcdc Activ
2990: 65 0a 20 20 20 20 20 20 40 20 23 65 38 65 38 65  e.      @ #e8e8e
29a0: 38 20 52 65 76 69 65 77 0a 20 20 20 20 20 20 40  8 Review.      @
29b0: 20 23 63 66 65 38 62 64 20 46 69 78 65 64 0a 20   #cfe8bd Fixed. 
29c0: 20 20 20 20 20 40 20 23 62 64 65 35 64 36 20 54       @ #bde5d6 T
29d0: 65 73 74 65 64 0a 20 20 20 20 20 20 40 20 23 63  ested.      @ #c
29e0: 61 63 61 65 35 20 44 65 66 65 72 72 65 64 0a 20  acae5 Deferred. 
29f0: 20 20 20 20 20 40 20 23 63 38 63 38 63 38 20 43       @ #c8c8c8 C
2a00: 6c 6f 73 65 64 0a 20 20 20 20 3b 0a 20 20 7d 65  losed.    ;.  }e
2a10: 6c 73 65 7b 0a 20 20 20 20 53 74 6d 74 20 71 3b  lse{.    Stmt q;
2a20: 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 28  .    db_prepare(
2a30: 26 71 2c 20 22 53 45 4c 45 43 54 20 74 69 74 6c  &q, "SELECT titl
2a40: 65 2c 20 73 71 6c 63 6f 64 65 2c 20 6f 77 6e 65  e, sqlcode, owne
2a50: 72 2c 20 63 6f 6c 73 20 22 0a 20 20 20 20 20 20  r, cols ".      
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2a70: 46 52 4f 4d 20 72 65 70 6f 72 74 66 6d 74 20 57  FROM reportfmt W
2a80: 48 45 52 45 20 72 6e 3d 25 64 22 2c 72 6e 29 3b  HERE rn=%d",rn);
2a90: 0a 20 20 20 20 69 66 28 20 64 62 5f 73 74 65 70  .    if( db_step
2aa0: 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  (&q)==SQLITE_ROW
2ab0: 20 29 7b 0a 20 20 20 20 20 20 7a 54 69 74 6c 65   ){.      zTitle
2ac0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c   = db_column_mal
2ad0: 6c 6f 63 28 26 71 2c 20 30 29 3b 0a 20 20 20 20  loc(&q, 0);.    
2ae0: 20 20 7a 53 51 4c 20 3d 20 64 62 5f 63 6f 6c 75    zSQL = db_colu
2af0: 6d 6e 5f 6d 61 6c 6c 6f 63 28 26 71 2c 20 31 29  mn_malloc(&q, 1)
2b00: 3b 0a 20 20 20 20 20 20 7a 4f 77 6e 65 72 20 3d  ;.      zOwner =
2b10: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c 6c 6f   db_column_mallo
2b20: 63 28 26 71 2c 20 32 29 3b 0a 20 20 20 20 20 20  c(&q, 2);.      
2b30: 7a 43 6c 72 4b 65 79 20 3d 20 64 62 5f 63 6f 6c  zClrKey = db_col
2b40: 75 6d 6e 5f 6d 61 6c 6c 6f 63 28 26 71 2c 20 33  umn_malloc(&q, 3
2b50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f  );.    }.    db_
2b60: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
2b70: 20 20 69 66 28 20 50 28 22 63 6f 70 79 22 29 20    if( P("copy") 
2b80: 29 7b 0a 20 20 20 20 20 20 72 6e 20 3d 20 30 3b  ){.      rn = 0;
2b90: 0a 20 20 20 20 20 20 7a 54 69 74 6c 65 20 3d 20  .      zTitle = 
2ba0: 6d 70 72 69 6e 74 66 28 22 43 6f 70 79 20 4f 66  mprintf("Copy Of
2bb0: 20 25 73 22 2c 20 7a 54 69 74 6c 65 29 3b 0a 20   %s", zTitle);. 
2bc0: 20 20 20 20 20 7a 4f 77 6e 65 72 20 3d 20 67 2e       zOwner = g.
2bd0: 7a 4c 6f 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  zLogin;.    }.  
2be0: 7d 0a 20 20 69 66 28 20 7a 4f 77 6e 65 72 3d 3d  }.  if( zOwner==
2bf0: 30 20 29 20 7a 4f 77 6e 65 72 20 3d 20 67 2e 7a  0 ) zOwner = g.z
2c00: 4c 6f 67 69 6e 3b 0a 20 20 73 74 79 6c 65 5f 73  Login;.  style_s
2c10: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
2c20: 43 61 6e 63 65 6c 22 2c 20 22 43 61 6e 63 65 6c  Cancel", "Cancel
2c30: 22 2c 20 22 72 65 70 6f 72 74 6c 69 73 74 22 29  ", "reportlist")
2c40: 3b 0a 20 20 69 66 28 20 72 6e 3e 30 20 29 7b 0a  ;.  if( rn>0 ){.
2c50: 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e      style_submen
2c60: 75 5f 65 6c 65 6d 65 6e 74 28 22 44 65 6c 65 74  u_element("Delet
2c70: 65 22 2c 20 22 44 65 6c 65 74 65 22 2c 20 22 72  e", "Delete", "r
2c80: 70 74 65 64 69 74 3f 72 6e 3d 25 64 26 64 65 6c  ptedit?rn=%d&del
2c90: 31 3d 31 22 2c 20 72 6e 29 3b 0a 20 20 7d 0a 20  1=1", rn);.  }. 
2ca0: 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 72 6e   style_header(rn
2cb0: 3e 30 20 3f 20 22 45 64 69 74 20 52 65 70 6f 72  >0 ? "Edit Repor
2cc0: 74 20 46 6f 72 6d 61 74 22 3a 22 43 72 65 61 74  t Format":"Creat
2cd0: 65 20 4e 65 77 20 52 65 70 6f 72 74 20 46 6f 72  e New Report For
2ce0: 6d 61 74 22 29 3b 0a 20 20 69 66 28 20 7a 45 72  mat");.  if( zEr
2cf0: 72 20 29 7b 0a 20 20 20 20 40 20 3c 62 6c 6f 63  r ){.    @ <bloc
2d00: 6b 71 75 6f 74 65 3e 3c 66 6f 6e 74 20 63 6f 6c  kquote><font col
2d10: 6f 72 3d 22 23 66 66 30 30 30 30 22 3e 3c 62 3e  or="#ff0000"><b>
2d20: 25 68 28 7a 45 72 72 29 3c 2f 62 3e 3c 2f 66 6f  %h(zErr)</b></fo
2d30: 6e 74 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e  nt></blockquote>
2d40: 0a 20 20 7d 0a 20 20 40 20 3c 66 6f 72 6d 20 61  .  }.  @ <form a
2d50: 63 74 69 6f 6e 3d 22 72 70 74 65 64 69 74 22 20  ction="rptedit" 
2d60: 6d 65 74 68 6f 64 3d 22 50 4f 53 54 22 3e 0a 20  method="POST">. 
2d70: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22   @ <input type="
2d80: 68 69 64 64 65 6e 22 20 6e 61 6d 65 3d 22 72 6e  hidden" name="rn
2d90: 22 20 76 61 6c 75 65 3d 22 25 64 28 72 6e 29 22  " value="%d(rn)"
2da0: 3e 0a 20 20 40 20 3c 70 3e 52 65 70 6f 72 74 20  >.  @ <p>Report 
2db0: 54 69 74 6c 65 3a 3c 62 72 3e 0a 20 20 40 20 3c  Title:<br>.  @ <
2dc0: 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65 78 74  input type="text
2dd0: 22 20 6e 61 6d 65 3d 22 74 22 20 76 61 6c 75 65  " name="t" value
2de0: 3d 22 25 68 28 7a 54 69 74 6c 65 29 22 20 73 69  ="%h(zTitle)" si
2df0: 7a 65 3d 22 36 30 22 3e 3c 2f 70 3e 0a 20 20 40  ze="60"></p>.  @
2e00: 20 3c 70 3e 45 6e 74 65 72 20 61 20 63 6f 6d 70   <p>Enter a comp
2e10: 6c 65 74 65 20 53 51 4c 20 71 75 65 72 79 20 73  lete SQL query s
2e20: 74 61 74 65 6d 65 6e 74 20 61 67 61 69 6e 73 74  tatement against
2e30: 20 74 68 65 20 22 54 49 43 4b 45 54 22 20 74 61   the "TICKET" ta
2e40: 62 6c 65 3a 3c 62 72 3e 0a 20 20 40 20 3c 74 65  ble:<br>.  @ <te
2e50: 78 74 61 72 65 61 20 6e 61 6d 65 3d 22 73 22 20  xtarea name="s" 
2e60: 72 6f 77 73 3d 22 32 30 22 20 63 6f 6c 73 3d 22  rows="20" cols="
2e70: 38 30 22 3e 25 68 28 7a 53 51 4c 29 3c 2f 74 65  80">%h(zSQL)</te
2e80: 78 74 61 72 65 61 3e 0a 20 20 40 20 3c 2f 70 3e  xtarea>.  @ </p>
2e90: 0a 20 20 69 66 28 20 67 2e 6f 6b 41 64 6d 69 6e  .  if( g.okAdmin
2ea0: 20 29 7b 0a 20 20 20 20 40 20 3c 70 3e 52 65 70   ){.    @ <p>Rep
2eb0: 6f 72 74 20 6f 77 6e 65 72 3a 0a 20 20 20 20 40  ort owner:.    @
2ec0: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65   <input type="te
2ed0: 78 74 22 20 6e 61 6d 65 3d 22 77 22 20 73 69 7a  xt" name="w" siz
2ee0: 65 3d 22 32 30 22 20 76 61 6c 75 65 3d 22 25 68  e="20" value="%h
2ef0: 28 7a 4f 77 6e 65 72 29 22 3e 0a 20 20 20 20 40  (zOwner)">.    @
2f00: 20 3c 2f 70 3e 0a 20 20 7d 20 65 6c 73 65 20 7b   </p>.  } else {
2f10: 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79  .    @ <input ty
2f20: 70 65 3d 22 68 69 64 64 65 6e 22 20 6e 61 6d 65  pe="hidden" name
2f30: 3d 22 77 22 20 76 61 6c 75 65 3d 22 25 68 28 7a  ="w" value="%h(z
2f40: 4f 77 6e 65 72 29 22 3e 0a 20 20 7d 0a 20 20 40  Owner)">.  }.  @
2f50: 20 3c 70 3e 45 6e 74 65 72 20 61 6e 20 6f 70 74   <p>Enter an opt
2f60: 69 6f 6e 61 6c 20 63 6f 6c 6f 72 20 6b 65 79 20  ional color key 
2f70: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
2f80: 20 62 6f 78 2e 20 20 28 49 66 20 62 6c 61 6e 6b   box.  (If blank
2f90: 2c 20 6e 6f 0a 20 20 40 20 63 6f 6c 6f 72 20 6b  , no.  @ color k
2fa0: 65 79 20 69 73 20 64 69 73 70 6c 61 79 65 64 2e  ey is displayed.
2fb0: 29 20 20 45 61 63 68 20 6c 69 6e 65 20 63 6f 6e  )  Each line con
2fc0: 74 61 69 6e 73 20 74 68 65 20 74 65 78 74 20 66  tains the text f
2fd0: 6f 72 20 61 20 73 69 6e 67 6c 65 0a 20 20 40 20  or a single.  @ 
2fe0: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6b 65 79  entry in the key
2ff0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 6f 6b  .  The first tok
3000: 65 6e 20 6f 66 20 65 61 63 68 20 6c 69 6e 65 20  en of each line 
3010: 69 73 20 74 68 65 20 62 61 63 6b 67 72 6f 75 6e  is the backgroun
3020: 64 0a 20 20 40 20 63 6f 6c 6f 72 20 66 6f 72 20  d.  @ color for 
3030: 74 68 61 74 20 6c 69 6e 65 2e 3c 62 72 3e 0a 20  that line.<br>. 
3040: 20 40 20 3c 74 65 78 74 61 72 65 61 20 6e 61 6d   @ <textarea nam
3050: 65 3d 22 6b 22 20 72 6f 77 73 3d 22 38 22 20 63  e="k" rows="8" c
3060: 6f 6c 73 3d 22 35 30 22 3e 25 68 28 7a 43 6c 72  ols="50">%h(zClr
3070: 4b 65 79 29 3c 2f 74 65 78 74 61 72 65 61 3e 0a  Key)</textarea>.
3080: 20 20 40 20 3c 2f 70 3e 0a 20 20 69 66 28 20 21    @ </p>.  if( !
3090: 67 2e 6f 6b 41 64 6d 69 6e 20 26 26 20 73 74 72  g.okAdmin && str
30a0: 63 6d 70 28 7a 4f 77 6e 65 72 2c 67 2e 7a 4c 6f  cmp(zOwner,g.zLo
30b0: 67 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 40  gin)!=0 ){.    @
30c0: 20 3c 70 3e 54 68 69 73 20 72 65 70 6f 72 74 20   <p>This report 
30d0: 66 6f 72 6d 61 74 20 69 73 20 6f 77 6e 65 64 20  format is owned 
30e0: 62 79 20 25 68 28 7a 4f 77 6e 65 72 29 2e 20 20  by %h(zOwner).  
30f0: 59 6f 75 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  You are not allo
3100: 77 65 64 0a 20 20 20 20 40 20 74 6f 20 63 68 61  wed.    @ to cha
3110: 6e 67 65 20 69 74 2e 3c 2f 70 3e 0a 20 20 20 20  nge it.</p>.    
3120: 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20 20 20 72 65  @ </form>.    re
3130: 70 6f 72 74 5f 66 6f 72 6d 61 74 5f 68 69 6e 74  port_format_hint
3140: 73 28 29 3b 0a 20 20 20 20 73 74 79 6c 65 5f 66  s();.    style_f
3150: 6f 6f 74 65 72 28 29 3b 0a 20 20 20 20 72 65 74  ooter();.    ret
3160: 75 72 6e 3b 0a 20 20 7d 0a 20 20 40 20 3c 69 6e  urn;.  }.  @ <in
3170: 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74  put type="submit
3180: 22 20 76 61 6c 75 65 3d 22 41 70 70 6c 79 20 43  " value="Apply C
3190: 68 61 6e 67 65 73 22 3e 0a 20 20 69 66 28 20 72  hanges">.  if( r
31a0: 6e 3e 30 20 29 7b 0a 20 20 20 20 40 20 3c 69 6e  n>0 ){.    @ <in
31b0: 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74  put type="submit
31c0: 22 20 76 61 6c 75 65 3d 22 44 65 6c 65 74 65 20  " value="Delete 
31d0: 54 68 69 73 20 52 65 70 6f 72 74 22 20 6e 61 6d  This Report" nam
31e0: 65 3d 22 64 65 6c 31 22 3e 0a 20 20 7d 0a 20 20  e="del1">.  }.  
31f0: 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20 72 65 70 6f  @ </form>.  repo
3200: 72 74 5f 66 6f 72 6d 61 74 5f 68 69 6e 74 73 28  rt_format_hints(
3210: 29 3b 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65  );.  style_foote
3220: 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75  r();.}../*.** Ou
3230: 74 70 75 74 20 61 20 62 75 6e 63 68 20 6f 66 20  tput a bunch of 
3240: 74 65 78 74 20 74 68 61 74 20 70 72 6f 76 69 64  text that provid
3250: 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  es information a
3260: 62 6f 75 74 20 72 65 70 6f 72 74 0a 2a 2a 20 66  bout report.** f
3270: 6f 72 6d 61 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ormats.*/.static
3280: 20 76 6f 69 64 20 72 65 70 6f 72 74 5f 66 6f 72   void report_for
3290: 6d 61 74 5f 68 69 6e 74 73 28 76 6f 69 64 29 7b  mat_hints(void){
32a0: 0a 20 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  .  char *zSchema
32b0: 3b 0a 20 20 7a 53 63 68 65 6d 61 20 3d 20 64 62  ;.  zSchema = db
32c0: 5f 74 65 78 74 28 30 2c 22 53 45 4c 45 43 54 20  _text(0,"SELECT 
32d0: 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
32e0: 6d 61 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d  master WHERE nam
32f0: 65 3d 27 74 69 63 6b 65 74 27 22 29 3b 0a 20 20  e='ticket'");.  
3300: 40 20 3c 68 72 3e 3c 68 33 3e 54 49 43 4b 45 54  @ <hr><h3>TICKET
3310: 20 53 63 68 65 6d 61 3c 2f 68 33 3e 0a 20 20 40   Schema</h3>.  @
3320: 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72   <blockquote><pr
3330: 65 3e 0a 20 20 40 20 25 68 28 7a 53 63 68 65 6d  e>.  @ %h(zSchem
3340: 61 29 0a 20 20 40 20 3c 2f 70 72 65 3e 3c 2f 62  a).  @ </pre></b
3350: 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 40 20 3c  lockquote>.  @ <
3360: 68 33 3e 4e 6f 74 65 73 3c 2f 68 33 3e 0a 20 20  h3>Notes</h3>.  
3370: 40 20 3c 75 6c 3e 0a 20 20 40 20 3c 6c 69 3e 3c  @ <ul>.  @ <li><
3380: 70 3e 54 68 65 20 53 51 4c 20 6d 75 73 74 20 63  p>The SQL must c
3390: 6f 6e 73 69 73 74 20 6f 66 20 61 20 73 69 6e 67  onsist of a sing
33a0: 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  le SELECT statem
33b0: 65 6e 74 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40  ent</p></li>.  @
33c0: 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 49 66 20 61  .  @ <li><p>If a
33d0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72   column of the r
33e0: 65 73 75 6c 74 20 73 65 74 20 69 73 20 6e 61 6d  esult set is nam
33f0: 65 64 20 22 23 22 20 74 68 65 6e 20 74 68 61 74  ed "#" then that
3400: 20 63 6f 6c 75 6d 6e 0a 20 20 40 20 69 73 20 61   column.  @ is a
3410: 73 73 75 6d 65 64 20 74 6f 20 68 6f 6c 64 20 61  ssumed to hold a
3420: 20 74 69 63 6b 65 74 20 6e 75 6d 62 65 72 2e 20   ticket number. 
3430: 20 41 20 68 79 70 65 72 6c 69 6e 6b 20 77 69 6c   A hyperlink wil
3440: 6c 20 62 65 20 63 72 65 61 74 65 64 20 66 72 6f  l be created fro
3450: 6d 0a 20 20 40 20 74 68 61 74 20 63 6f 6c 75 6d  m.  @ that colum
3460: 6e 20 74 6f 20 61 20 64 65 74 61 69 6c 65 64 20  n to a detailed 
3470: 76 69 65 77 20 6f 66 20 74 68 65 20 74 69 63 6b  view of the tick
3480: 65 74 2e 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40  et.</p></li>.  @
3490: 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 49 66 20 61  .  @ <li><p>If a
34a0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72   column of the r
34b0: 65 73 75 6c 74 20 73 65 74 20 69 73 20 6e 61 6d  esult set is nam
34c0: 65 64 20 22 62 67 63 6f 6c 6f 72 22 20 74 68 65  ed "bgcolor" the
34d0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 20 20  n the content.  
34e0: 40 20 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e  @ of that column
34f0: 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20   determines the 
3500: 62 61 63 6b 67 72 6f 75 6e 64 20 63 6f 6c 6f 72  background color
3510: 20 6f 66 20 74 68 65 20 72 6f 77 2e 3c 2f 70 3e   of the row.</p>
3520: 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20 3c 6c  </li>.  @.  @ <l
3530: 69 3e 3c 70 3e 54 68 65 20 3c 62 3e 75 73 65 72  i><p>The <b>user
3540: 28 29 3c 2f 62 3e 20 53 51 4c 20 66 75 6e 63 74  ()</b> SQL funct
3550: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 73 74  ion returns a st
3560: 72 69 6e 67 0a 20 20 40 20 77 68 69 63 68 20 69  ring.  @ which i
3570: 73 20 74 68 65 20 6c 6f 67 69 6e 20 6f 66 20 74  s the login of t
3580: 68 65 20 63 75 72 72 65 6e 74 20 75 73 65 72 2e  he current user.
3590: 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20  </p></li>.  @.  
35a0: 40 20 3c 6c 69 3e 3c 70 3e 54 68 65 20 66 69 72  @ <li><p>The fir
35b0: 73 74 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20  st column whose 
35c0: 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68  name begins with
35d0: 20 75 6e 64 65 72 73 63 6f 72 65 20 28 22 5f 22   underscore ("_"
35e0: 29 20 61 6e 64 20 61 6c 6c 0a 20 20 40 20 73 75  ) and all.  @ su
35f0: 62 73 65 71 75 65 6e 74 20 63 6f 6c 75 6d 6e 73  bsequent columns
3600: 20 61 72 65 20 73 68 6f 77 6e 20 6f 6e 20 74 68   are shown on th
3610: 65 69 72 20 6f 77 6e 20 72 6f 77 73 20 69 6e 20  eir own rows in 
3620: 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73  the table.  This
3630: 20 6d 69 67 68 74 0a 20 20 40 20 62 65 20 75 73   might.  @ be us
3640: 65 66 75 6c 20 66 6f 72 20 64 69 73 70 6c 61 79  eful for display
3650: 69 6e 67 20 74 68 65 20 64 65 73 63 72 69 70 74  ing the descript
3660: 69 6f 6e 20 6f 66 20 74 69 63 6b 65 74 73 2e 0a  ion of tickets..
3670: 20 20 40 20 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20    @ </p></li>.  
3680: 40 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 54 68 65  @.  @ <li><p>The
3690: 20 3c 62 3e 61 75 78 28 29 3c 2f 62 3e 20 53 51   <b>aux()</b> SQ
36a0: 4c 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73  L function takes
36b0: 20 61 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d   a parameter nam
36c0: 65 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  e as an argument
36d0: 0a 20 20 40 20 61 6e 64 20 72 65 74 75 72 6e 73  .  @ and returns
36e0: 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20   the value that 
36f0: 74 68 65 20 75 73 65 72 20 65 6e 74 65 72 73 20  the user enters 
3700: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  in the resulting
3710: 20 48 54 4d 4c 20 66 6f 72 6d 2e 20 41 0a 20 20   HTML form. A.  
3720: 40 20 73 65 63 6f 6e 64 20 6f 70 74 69 6f 6e 61  @ second optiona
3730: 6c 20 70 61 72 61 6d 65 74 65 72 20 70 72 6f 76  l parameter prov
3740: 69 64 65 73 20 61 20 64 65 66 61 75 6c 74 20 76  ides a default v
3750: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 66 69 65  alue for the fie
3760: 6c 64 2e 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40  ld.</p></li>.  @
3770: 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 54 68 65 20  .  @ <li><p>The 
3780: 3c 62 3e 6f 70 74 69 6f 6e 28 29 3c 2f 62 3e 20  <b>option()</b> 
3790: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  SQL function tak
37a0: 65 73 20 61 20 70 61 72 61 6d 65 74 65 72 20 6e  es a parameter n
37b0: 61 6d 65 0a 20 20 40 20 61 6e 64 20 61 20 71 75  ame.  @ and a qu
37c0: 6f 74 65 64 20 53 45 4c 45 43 54 20 73 74 61 74  oted SELECT stat
37d0: 65 6d 65 6e 74 20 61 73 20 70 61 72 61 6d 65 74  ement as paramet
37e0: 65 72 73 2e 20 54 68 65 20 71 75 65 72 79 20 72  ers. The query r
37f0: 65 73 75 6c 74 73 20 61 72 65 0a 20 20 40 20 70  esults are.  @ p
3800: 72 65 73 65 6e 74 65 64 20 61 73 20 61 6e 20 48  resented as an H
3810: 54 4d 4c 20 64 72 6f 70 64 6f 77 6e 20 6d 65 6e  TML dropdown men
3820: 75 20 61 6e 64 20 74 68 65 20 66 75 6e 63 74 69  u and the functi
3830: 6f 6e 20 72 65 74 75 72 6e 73 0a 20 20 40 20 74  on returns.  @ t
3840: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c  he currently sel
3850: 65 63 74 65 64 20 76 61 6c 75 65 2e 20 52 65 73  ected value. Res
3860: 75 6c 74 73 20 6d 61 79 20 62 65 20 61 20 73 69  ults may be a si
3870: 6e 67 6c 65 20 76 61 6c 75 65 20 63 6f 6c 75 6d  ngle value colum
3880: 6e 20 6f 72 0a 20 20 40 20 74 77 6f 20 3c 62 3e  n or.  @ two <b>
3890: 76 61 6c 75 65 2c 64 65 73 63 72 69 70 74 69 6f  value,descriptio
38a0: 6e 3c 2f 62 3e 20 63 6f 6c 75 6d 6e 73 2e 20 54  n</b> columns. T
38b0: 68 65 20 66 69 72 73 74 20 72 6f 77 20 69 73 20  he first row is 
38c0: 74 68 65 20 64 65 66 61 75 6c 74 2e 3c 2f 70 3e  the default.</p>
38d0: 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20 3c 6c  </li>.  @.  @ <l
38e0: 69 3e 3c 70 3e 54 68 65 20 3c 62 3e 63 67 69 28  i><p>The <b>cgi(
38f0: 29 3c 2f 62 3e 20 53 51 4c 20 66 75 6e 63 74 69  )</b> SQL functi
3900: 6f 6e 20 74 61 6b 65 73 20 61 20 70 61 72 61 6d  on takes a param
3910: 65 74 65 72 20 6e 61 6d 65 20 61 73 20 61 6e 20  eter name as an 
3920: 61 72 67 75 6d 65 6e 74 0a 20 20 40 20 61 6e 64  argument.  @ and
3930: 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
3940: 75 65 20 6f 66 20 61 20 63 6f 72 72 65 73 70 6f  ue of a correspo
3950: 6e 64 69 6e 67 20 43 47 49 20 71 75 65 72 79 20  nding CGI query 
3960: 76 61 6c 75 65 2e 20 49 66 20 74 68 65 20 43 47  value. If the CG
3970: 49 0a 20 20 40 20 70 61 72 61 6d 65 74 65 72 20  I.  @ parameter 
3980: 64 6f 65 73 6e 27 74 20 65 78 69 73 74 2c 20 61  doesn't exist, a
3990: 6e 20 6f 70 74 69 6f 6e 61 6c 20 73 65 63 6f 6e  n optional secon
39a0: 64 20 61 72 67 75 6d 65 6e 74 20 77 69 6c 6c 20  d argument will 
39b0: 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 40 20  be returned.  @ 
39c0: 69 6e 73 74 65 61 64 2e 3c 2f 70 3e 3c 2f 6c 69  instead.</p></li
39d0: 3e 0a 20 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70  >.  @.  @ <li><p
39e0: 3e 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20  >If a column is 
39f0: 77 72 61 70 70 65 64 20 62 79 20 74 68 65 20 3c  wrapped by the <
3a00: 62 3e 77 69 6b 69 28 29 3c 2f 62 3e 20 53 51 4c  b>wiki()</b> SQL
3a10: 20 66 75 6e 63 74 69 6f 6e 2c 20 69 74 20 77 69   function, it wi
3a20: 6c 6c 0a 20 20 40 20 62 65 20 72 65 6e 64 65 72  ll.  @ be render
3a30: 65 64 20 61 73 20 77 69 6b 69 20 66 6f 72 6d 61  ed as wiki forma
3a40: 74 74 65 64 20 63 6f 6e 74 65 6e 74 2e 3c 2f 70  tted content.</p
3a50: 3e 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20 3c  ></li>.  @.  @ <
3a60: 6c 69 3e 3c 70 3e 49 66 20 61 20 63 6f 6c 75 6d  li><p>If a colum
3a70: 6e 20 69 73 20 77 72 61 70 70 65 64 20 62 79 20  n is wrapped by 
3a80: 74 68 65 20 3c 62 3e 74 6b 74 28 29 3c 2f 62 3e  the <b>tkt()</b>
3a90: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2c 20 69   SQL function, i
3aa0: 74 20 77 69 6c 6c 0a 20 20 40 20 62 65 20 73 68  t will.  @ be sh
3ab0: 6f 77 6e 20 61 73 20 61 20 74 69 63 6b 65 74 20  own as a ticket 
3ac0: 69 64 20 77 69 74 68 20 61 20 6c 69 6e 6b 20 74  id with a link t
3ad0: 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
3ae0: 65 20 70 61 67 65 3c 2f 70 3e 3c 2f 6c 69 3e 0a  e page</p></li>.
3af0: 20 20 40 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 49    @.  @ <li><p>I
3b00: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 77 72  f a column is wr
3b10: 61 70 70 65 64 20 62 79 20 74 68 65 20 3c 62 3e  apped by the <b>
3b20: 63 68 6e 67 28 29 3c 2f 62 3e 20 53 51 4c 20 66  chng()</b> SQL f
3b30: 75 6e 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c  unction, it will
3b40: 0a 20 20 40 20 62 65 20 73 68 6f 77 6e 20 61 73  .  @ be shown as
3b50: 20 61 20 62 61 73 65 6c 69 6e 65 20 69 64 20 77   a baseline id w
3b60: 69 74 68 20 61 20 6c 69 6e 6b 20 74 6f 20 74 68  ith a link to th
3b70: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 70 61  e appropriate pa
3b80: 67 65 2e 3c 2f 70 3e 3c 2f 6c 69 3e 0a 20 20 40  ge.</p></li>.  @
3b90: 0a 20 20 40 20 3c 6c 69 3e 3c 70 3e 54 68 65 20  .  @ <li><p>The 
3ba0: 3c 62 3e 73 65 61 72 63 68 28 29 3c 2f 62 3e 20  <b>search()</b> 
3bb0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b  SQL function tak
3bc0: 65 73 20 61 20 6b 65 79 77 6f 72 64 20 70 61 74  es a keyword pat
3bd0: 74 65 72 6e 20 61 6e 64 0a 20 20 40 20 61 20 73  tern and.  @ a s
3be0: 65 61 72 63 68 20 74 65 78 74 2e 20 54 68 65 20  earch text. The 
3bf0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
3c00: 20 61 6e 20 69 6e 74 65 67 65 72 20 73 63 6f 72   an integer scor
3c10: 65 20 77 68 69 63 68 20 69 73 0a 20 20 40 20 68  e which is.  @ h
3c20: 69 67 68 65 72 20 64 65 70 65 6e 64 69 6e 67 20  igher depending 
3c30: 6f 6e 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  on how well the 
3c40: 73 65 61 72 63 68 20 77 65 6e 74 2e 3c 2f 70 3e  search went.</p>
3c50: 3c 2f 6c 69 3e 0a 20 20 40 0a 20 20 40 20 3c 6c  </li>.  @.  @ <l
3c60: 69 3e 3c 70 3e 54 68 65 20 71 75 65 72 79 20 63  i><p>The query c
3c70: 61 6e 20 6a 6f 69 6e 20 6f 74 68 65 72 20 74 61  an join other ta
3c80: 62 6c 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  bles in the data
3c90: 62 61 73 65 20 62 65 73 69 64 65 73 20 54 49 43  base besides TIC
3ca0: 4b 45 54 2e 0a 20 20 40 20 3c 2f 70 3e 3c 2f 6c  KET..  @ </p></l
3cb0: 69 3e 0a 20 20 40 20 3c 2f 75 6c 3e 0a 20 20 40  i>.  @ </ul>.  @
3cc0: 0a 20 20 40 20 3c 68 33 3e 45 78 61 6d 70 6c 65  .  @ <h3>Example
3cd0: 73 3c 2f 68 33 3e 0a 20 20 40 20 3c 70 3e 49 6e  s</h3>.  @ <p>In
3ce0: 20 74 68 69 73 20 65 78 61 6d 70 6c 65 2c 20 74   this example, t
3cf0: 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  he first column 
3d00: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
3d10: 74 20 69 73 20 6e 61 6d 65 64 0a 20 20 40 20 22  t is named.  @ "
3d20: 62 67 63 6f 6c 6f 72 22 2e 20 20 54 68 65 20 76  bgcolor".  The v
3d30: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 63 6f 6c  alue of this col
3d40: 75 6d 6e 20 69 73 20 6e 6f 74 20 64 69 73 70 6c  umn is not displ
3d50: 61 79 65 64 2e 20 20 49 6e 73 74 65 61 64 2c 20  ayed.  Instead, 
3d60: 69 74 0a 20 20 40 20 73 65 6c 65 63 74 73 20 74  it.  @ selects t
3d70: 68 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 63 6f  he background co
3d80: 6c 6f 72 20 6f 66 20 65 61 63 68 20 72 6f 77 20  lor of each row 
3d90: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 54 49 43  based on the TIC
3da0: 4b 45 54 2e 53 54 41 54 55 53 0a 20 20 40 20 66  KET.STATUS.  @ f
3db0: 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61  ield of the data
3dc0: 62 61 73 65 2e 20 20 54 68 65 20 63 6f 6c 6f 72  base.  The color
3dd0: 20 6b 65 79 20 61 74 20 74 68 65 20 72 69 67 68   key at the righ
3de0: 74 20 73 68 6f 77 73 20 74 68 65 20 76 61 72 69  t shows the vari
3df0: 6f 75 73 0a 20 20 40 20 63 6f 6c 6f 72 20 63 6f  ous.  @ color co
3e00: 64 65 73 2e 3c 2f 70 3e 0a 20 20 40 20 3c 74 61  des.</p>.  @ <ta
3e10: 62 6c 65 20 61 6c 69 67 6e 3d 22 72 69 67 68 74  ble align="right
3e20: 22 20 73 74 79 6c 65 3d 22 6d 61 72 67 69 6e 3a  " style="margin:
3e30: 20 30 20 35 70 78 3b 22 20 62 6f 72 64 65 72 3d   0 5px;" border=
3e40: 31 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d 30 20  1 cellspacing=0 
3e50: 77 69 64 74 68 3d 31 32 35 3e 0a 20 20 40 20 3c  width=125>.  @ <
3e60: 74 72 20 62 67 63 6f 6c 6f 72 3d 22 23 66 32 64  tr bgcolor="#f2d
3e70: 63 64 63 22 3e 3c 74 64 20 61 6c 69 67 6e 3d 22  cdc"><td align="
3e80: 63 65 6e 74 65 72 22 3e 6e 65 77 20 6f 72 20 61  center">new or a
3e90: 63 74 69 76 65 3c 2f 74 64 3e 3c 2f 74 72 3e 0a  ctive</td></tr>.
3ea0: 20 20 40 20 3c 74 72 20 62 67 63 6f 6c 6f 72 3d    @ <tr bgcolor=
3eb0: 22 23 65 38 65 38 62 64 22 3e 3c 74 64 20 61 6c  "#e8e8bd"><td al
3ec0: 69 67 6e 3d 22 63 65 6e 74 65 72 22 3e 72 65 76  ign="center">rev
3ed0: 69 65 77 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20  iew</td></tr>.  
3ee0: 40 20 3c 74 72 20 62 67 63 6f 6c 6f 72 3d 22 23  @ <tr bgcolor="#
3ef0: 63 66 65 38 62 64 22 3e 3c 74 64 20 61 6c 69 67  cfe8bd"><td alig
3f00: 6e 3d 22 63 65 6e 74 65 72 22 3e 66 69 78 65 64  n="center">fixed
3f10: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c  </td></tr>.  @ <
3f20: 74 72 20 62 67 63 6f 6c 6f 72 3d 22 23 62 64 65  tr bgcolor="#bde
3f30: 35 64 36 22 3e 3c 74 64 20 61 6c 69 67 6e 3d 22  5d6"><td align="
3f40: 63 65 6e 74 65 72 22 3e 74 65 73 74 65 64 3c 2f  center">tested</
3f50: 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72  td></tr>.  @ <tr
3f60: 20 62 67 63 6f 6c 6f 72 3d 22 23 63 61 63 61 65   bgcolor="#cacae
3f70: 35 22 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65  5"><td align="ce
3f80: 6e 74 65 72 22 3e 64 65 66 65 72 3c 2f 74 64 3e  nter">defer</td>
3f90: 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72 20 62 67  </tr>.  @ <tr bg
3fa0: 63 6f 6c 6f 72 3d 22 23 63 38 63 38 63 38 22 3e  color="#c8c8c8">
3fb0: 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65  <td align="cente
3fc0: 72 22 3e 63 6c 6f 73 65 64 3c 2f 74 64 3e 3c 2f  r">closed</td></
3fd0: 74 72 3e 0a 20 20 40 20 3c 2f 74 61 62 6c 65 3e  tr>.  @ </table>
3fe0: 0a 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65  .  @ <blockquote
3ff0: 3e 3c 70 72 65 3e 0a 20 20 40 20 53 45 4c 45 43  ><pre>.  @ SELEC
4000: 54 0a 20 20 40 20 20 20 43 41 53 45 20 57 48 45  T.  @   CASE WHE
4010: 4e 20 73 74 61 74 75 73 20 49 4e 20 28 27 6e 65  N status IN ('ne
4020: 77 27 2c 27 61 63 74 69 76 65 27 29 20 54 48 45  w','active') THE
4030: 4e 20 27 23 66 32 64 63 64 63 27 0a 20 20 40 20  N '#f2dcdc'.  @ 
4040: 20 20 20 20 20 20 20 57 48 45 4e 20 73 74 61 74         WHEN stat
4050: 75 73 3d 27 72 65 76 69 65 77 27 20 54 48 45 4e  us='review' THEN
4060: 20 27 23 65 38 65 38 62 64 27 0a 20 20 40 20 20   '#e8e8bd'.  @  
4070: 20 20 20 20 20 20 57 48 45 4e 20 73 74 61 74 75        WHEN statu
4080: 73 3d 27 66 69 78 65 64 27 20 54 48 45 4e 20 27  s='fixed' THEN '
4090: 23 63 66 65 38 62 64 27 0a 20 20 40 20 20 20 20  #cfe8bd'.  @    
40a0: 20 20 20 20 57 48 45 4e 20 73 74 61 74 75 73 3d      WHEN status=
40b0: 27 74 65 73 74 65 64 27 20 54 48 45 4e 20 27 23  'tested' THEN '#
40c0: 62 64 65 35 64 36 27 0a 20 20 40 20 20 20 20 20  bde5d6'.  @     
40d0: 20 20 20 57 48 45 4e 20 73 74 61 74 75 73 3d 27     WHEN status='
40e0: 64 65 66 65 72 27 20 54 48 45 4e 20 27 23 63 61  defer' THEN '#ca
40f0: 63 61 65 35 27 0a 20 20 40 20 20 20 20 20 20 20  cae5'.  @       
4100: 20 45 4c 53 45 20 27 23 63 38 63 38 63 38 27 20   ELSE '#c8c8c8' 
4110: 45 4e 44 20 61 73 20 27 62 67 63 6f 6c 6f 72 27  END as 'bgcolor'
4120: 2c 0a 20 20 40 20 20 20 74 6e 20 41 53 20 27 23  ,.  @   tn AS '#
4130: 27 2c 0a 20 20 40 20 20 20 74 79 70 65 20 41 53  ',.  @   type AS
4140: 20 27 54 79 70 65 27 2c 0a 20 20 40 20 20 20 73   'Type',.  @   s
4150: 74 61 74 75 73 20 41 53 20 27 53 74 61 74 75 73  tatus AS 'Status
4160: 27 2c 0a 20 20 40 20 20 20 73 64 61 74 65 28 6f  ',.  @   sdate(o
4170: 72 69 67 74 69 6d 65 29 20 41 53 20 27 43 72 65  rigtime) AS 'Cre
4180: 61 74 65 64 27 2c 0a 20 20 40 20 20 20 6f 77 6e  ated',.  @   own
4190: 65 72 20 41 53 20 27 42 79 27 2c 0a 20 20 40 20  er AS 'By',.  @ 
41a0: 20 20 73 75 62 73 79 73 74 65 6d 20 41 53 20 27    subsystem AS '
41b0: 53 75 62 73 79 73 27 2c 0a 20 20 40 20 20 20 73  Subsys',.  @   s
41c0: 64 61 74 65 28 63 68 61 6e 67 65 74 69 6d 65 29  date(changetime)
41d0: 20 41 53 20 27 43 68 61 6e 67 65 64 27 2c 0a 20   AS 'Changed',. 
41e0: 20 40 20 20 20 61 73 73 69 67 6e 65 64 74 6f 20   @   assignedto 
41f0: 41 53 20 27 41 73 73 69 67 6e 65 64 27 2c 0a 20  AS 'Assigned',. 
4200: 20 40 20 20 20 73 65 76 65 72 69 74 79 20 41 53   @   severity AS
4210: 20 27 53 76 72 27 2c 0a 20 20 40 20 20 20 70 72   'Svr',.  @   pr
4220: 69 6f 72 69 74 79 20 41 53 20 27 50 72 69 27 2c  iority AS 'Pri',
4230: 0a 20 20 40 20 20 20 74 69 74 6c 65 20 41 53 20  .  @   title AS 
4240: 27 54 69 74 6c 65 27 0a 20 20 40 20 46 52 4f 4d  'Title'.  @ FROM
4250: 20 74 69 63 6b 65 74 0a 20 20 40 20 3c 2f 70 72   ticket.  @ </pr
4260: 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a  e></blockquote>.
4270: 20 20 40 20 3c 70 3e 54 6f 20 62 61 73 65 20 74    @ <p>To base t
4280: 68 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 63 6f  he background co
4290: 6c 6f 72 20 6f 6e 20 74 68 65 20 54 49 43 4b 45  lor on the TICKE
42a0: 54 2e 50 52 49 4f 52 49 54 59 20 6f 72 0a 20 20  T.PRIORITY or.  
42b0: 40 20 54 49 43 4b 45 54 2e 53 45 56 45 52 49 54  @ TICKET.SEVERIT
42c0: 59 20 66 69 65 6c 64 73 2c 20 73 75 62 73 74 69  Y fields, substi
42d0: 74 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  tute the followi
42e0: 6e 67 20 63 6f 64 65 20 66 6f 72 20 74 68 65 0a  ng code for the.
42f0: 20 20 40 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e    @ first column
4300: 20 6f 66 20 74 68 65 20 71 75 65 72 79 3a 3c 2f   of the query:</
4310: 70 3e 0a 20 20 40 20 3c 74 61 62 6c 65 20 61 6c  p>.  @ <table al
4320: 69 67 6e 3d 22 72 69 67 68 74 22 20 73 74 79 6c  ign="right" styl
4330: 65 3d 22 6d 61 72 67 69 6e 3a 20 30 20 35 70 78  e="margin: 0 5px
4340: 3b 22 20 62 6f 72 64 65 72 3d 31 20 63 65 6c 6c  ;" border=1 cell
4350: 73 70 61 63 69 6e 67 3d 30 20 77 69 64 74 68 3d  spacing=0 width=
4360: 31 32 35 3e 0a 20 20 40 20 3c 74 72 20 62 67 63  125>.  @ <tr bgc
4370: 6f 6c 6f 72 3d 22 23 66 32 64 63 64 63 22 3e 3c  olor="#f2dcdc"><
4380: 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72  td align="center
4390: 22 3e 31 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20  ">1</td></tr>.  
43a0: 40 20 3c 74 72 20 62 67 63 6f 6c 6f 72 3d 22 23  @ <tr bgcolor="#
43b0: 65 38 65 38 62 64 22 3e 3c 74 64 20 61 6c 69 67  e8e8bd"><td alig
43c0: 6e 3d 22 63 65 6e 74 65 72 22 3e 32 3c 2f 74 64  n="center">2</td
43d0: 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72 20 62  ></tr>.  @ <tr b
43e0: 67 63 6f 6c 6f 72 3d 22 23 63 66 65 38 62 64 22  gcolor="#cfe8bd"
43f0: 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74  ><td align="cent
4400: 65 72 22 3e 33 3c 2f 74 64 3e 3c 2f 74 72 3e 0a  er">3</td></tr>.
4410: 20 20 40 20 3c 74 72 20 62 67 63 6f 6c 6f 72 3d    @ <tr bgcolor=
4420: 22 23 63 61 63 61 65 35 22 3e 3c 74 64 20 61 6c  "#cacae5"><td al
4430: 69 67 6e 3d 22 63 65 6e 74 65 72 22 3e 34 3c 2f  ign="center">4</
4440: 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72  td></tr>.  @ <tr
4450: 20 62 67 63 6f 6c 6f 72 3d 22 23 63 38 63 38 63   bgcolor="#c8c8c
4460: 38 22 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65  8"><td align="ce
4470: 6e 74 65 72 22 3e 35 3c 2f 74 64 3e 3c 2f 74 72  nter">5</td></tr
4480: 3e 0a 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a 20  >.  @ </table>. 
4490: 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c   @ <blockquote><
44a0: 70 72 65 3e 0a 20 20 40 20 53 45 4c 45 43 54 0a  pre>.  @ SELECT.
44b0: 20 20 40 20 20 20 43 41 53 45 20 70 72 69 6f 72    @   CASE prior
44c0: 69 74 79 20 57 48 45 4e 20 31 20 54 48 45 4e 20  ity WHEN 1 THEN 
44d0: 27 23 66 32 64 63 64 63 27 0a 20 20 40 20 20 20  '#f2dcdc'.  @   
44e0: 20 20 20 20 20 57 48 45 4e 20 32 20 54 48 45 4e       WHEN 2 THEN
44f0: 20 27 23 65 38 65 38 62 64 27 0a 20 20 40 20 20   '#e8e8bd'.  @  
4500: 20 20 20 20 20 20 57 48 45 4e 20 33 20 54 48 45        WHEN 3 THE
4510: 4e 20 27 23 63 66 65 38 62 64 27 0a 20 20 40 20  N '#cfe8bd'.  @ 
4520: 20 20 20 20 20 20 20 57 48 45 4e 20 34 20 54 48         WHEN 4 TH
4530: 45 4e 20 27 23 63 61 63 61 65 35 27 0a 20 20 40  EN '#cacae5'.  @
4540: 20 20 20 20 20 20 20 20 45 4c 53 45 20 27 23 63          ELSE '#c
4550: 38 63 38 63 38 27 20 45 4e 44 20 61 73 20 27 62  8c8c8' END as 'b
4560: 67 63 6f 6c 6f 72 27 2c 0a 20 20 40 20 2e 2e 2e  gcolor',.  @ ...
4570: 0a 20 20 40 20 46 52 4f 4d 20 74 69 63 6b 65 74  .  @ FROM ticket
4580: 0a 20 20 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f  .  @ </pre></blo
4590: 63 6b 71 75 6f 74 65 3e 0a 23 69 66 20 30 0a 20  ckquote>.#if 0. 
45a0: 20 40 20 3c 70 3e 59 6f 75 20 63 61 6e 2c 20 6f   @ <p>You can, o
45b0: 66 20 63 6f 75 72 73 65 2c 20 73 75 62 73 74 69  f course, substi
45c0: 74 75 74 65 20 64 69 66 66 65 72 65 6e 74 20 63  tute different c
45d0: 6f 6c 6f 72 73 20 69 66 20 79 6f 75 20 63 68 6f  olors if you cho
45e0: 6f 73 65 2e 0a 20 20 40 20 48 65 72 65 20 69 73  ose..  @ Here is
45f0: 20 61 20 70 61 6c 65 74 74 65 20 6f 66 20 73 75   a palette of su
4600: 67 67 65 73 74 65 64 20 62 61 63 6b 67 72 6f 75  ggested backgrou
4610: 6e 64 20 63 6f 6c 6f 72 73 3a 3c 2f 70 3e 0a 20  nd colors:</p>. 
4620: 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a   @ <blockquote>.
4630: 20 20 40 20 3c 74 61 62 6c 65 20 62 6f 72 64 65    @ <table borde
4640: 72 3d 31 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d  r=1 cellspacing=
4650: 30 20 77 69 64 74 68 3d 33 30 30 3e 0a 20 20 40  0 width=300>.  @
4660: 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e 3d 22   <tr><td align="
4670: 63 65 6e 74 65 72 22 20 62 67 63 6f 6c 6f 72 3d  center" bgcolor=
4680: 22 23 66 66 62 64 62 64 22 3e 23 66 66 62 64 62  "#ffbdbd">#ffbdb
4690: 64 3c 2f 74 64 3e 0a 20 20 40 20 20 20 20 20 3c  d</td>.  @     <
46a0: 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72  td align="center
46b0: 22 20 62 67 63 6f 6c 6f 72 3d 22 23 66 32 64 63  " bgcolor="#f2dc
46c0: 64 63 22 3e 23 66 32 64 63 64 63 3c 2f 74 64 3e  dc">#f2dcdc</td>
46d0: 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72 3e 3c 74  </tr>.  @ <tr><t
46e0: 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22  d align="center"
46f0: 20 62 67 63 6f 6c 6f 72 3d 22 23 66 66 66 66 62   bgcolor="#ffffb
4700: 64 22 3e 23 66 66 66 66 62 64 3c 2f 74 64 3e 0a  d">#ffffbd</td>.
4710: 20 20 40 20 20 20 20 20 3c 74 64 20 61 6c 69 67    @     <td alig
4720: 6e 3d 22 63 65 6e 74 65 72 22 20 62 67 63 6f 6c  n="center" bgcol
4730: 6f 72 3d 22 23 65 38 65 38 62 64 22 3e 23 65 38  or="#e8e8bd">#e8
4740: 65 38 62 64 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20  e8bd</td></tr>. 
4750: 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e   @ <tr><td align
4760: 3d 22 63 65 6e 74 65 72 22 20 62 67 63 6f 6c 6f  ="center" bgcolo
4770: 72 3d 22 23 63 30 65 62 63 30 22 3e 23 63 30 65  r="#c0ebc0">#c0e
4780: 62 63 30 3c 2f 74 64 3e 0a 20 20 40 20 20 20 20  bc0</td>.  @    
4790: 20 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74   <td align="cent
47a0: 65 72 22 20 62 67 63 6f 6c 6f 72 3d 22 23 63 66  er" bgcolor="#cf
47b0: 65 38 62 64 22 3e 23 63 66 65 38 62 64 3c 2f 74  e8bd">#cfe8bd</t
47c0: 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74 72 3e  d></tr>.  @ <tr>
47d0: 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65  <td align="cente
47e0: 72 22 20 62 67 63 6f 6c 6f 72 3d 22 23 63 30 63  r" bgcolor="#c0c
47f0: 30 66 34 22 3e 23 63 30 63 30 66 34 3c 2f 74 64  0f4">#c0c0f4</td
4800: 3e 0a 20 20 40 20 20 20 20 20 3c 74 64 20 61 6c  >.  @     <td al
4810: 69 67 6e 3d 22 63 65 6e 74 65 72 22 20 62 67 63  ign="center" bgc
4820: 6f 6c 6f 72 3d 22 23 64 36 64 36 65 38 22 3e 23  olor="#d6d6e8">#
4830: 64 36 64 36 65 38 3c 2f 74 64 3e 3c 2f 74 72 3e  d6d6e8</td></tr>
4840: 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69  .  @ <tr><td ali
4850: 67 6e 3d 22 63 65 6e 74 65 72 22 20 62 67 63 6f  gn="center" bgco
4860: 6c 6f 72 3d 22 23 64 30 62 31 66 66 22 3e 23 64  lor="#d0b1ff">#d
4870: 30 62 31 66 66 3c 2f 74 64 3e 0a 20 20 40 20 20  0b1ff</td>.  @  
4880: 20 20 20 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65     <td align="ce
4890: 6e 74 65 72 22 20 62 67 63 6f 6c 6f 72 3d 22 23  nter" bgcolor="#
48a0: 64 32 63 30 64 62 22 3e 23 64 32 63 30 64 62 3c  d2c0db">#d2c0db<
48b0: 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c 74  /td></tr>.  @ <t
48c0: 72 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 63 65 6e  r><td align="cen
48d0: 74 65 72 22 20 62 67 63 6f 6c 6f 72 3d 22 23 62  ter" bgcolor="#b
48e0: 62 62 62 62 62 22 3e 23 62 62 62 62 62 62 3c 2f  bbbbb">#bbbbbb</
48f0: 74 64 3e 0a 20 20 40 20 20 20 20 20 3c 74 64 20  td>.  @     <td 
4900: 61 6c 69 67 6e 3d 22 63 65 6e 74 65 72 22 20 62  align="center" b
4910: 67 63 6f 6c 6f 72 3d 22 23 64 30 64 30 64 30 22  gcolor="#d0d0d0"
4920: 3e 23 64 30 64 30 64 30 3c 2f 74 64 3e 3c 2f 74  >#d0d0d0</td></t
4930: 72 3e 0a 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a  r>.  @ </table>.
4940: 20 20 40 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65    @ </blockquote
4950: 3e 0a 23 65 6e 64 69 66 0a 20 20 40 20 3c 70 3e  >.#endif.  @ <p>
4960: 54 6f 20 73 65 65 20 74 68 65 20 54 49 43 4b 45  To see the TICKE
4970: 54 2e 44 45 53 43 52 49 50 54 49 4f 4e 20 61 6e  T.DESCRIPTION an
4980: 64 20 54 49 43 4b 45 54 2e 52 45 4d 41 52 4b 53  d TICKET.REMARKS
4990: 20 66 69 65 6c 64 73 2c 20 69 6e 63 6c 75 64 65   fields, include
49a0: 0a 20 20 40 20 74 68 65 6d 20 61 73 20 74 68 65  .  @ them as the
49b0: 20 6c 61 73 74 20 74 77 6f 20 63 6f 6c 75 6d 6e   last two column
49c0: 73 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  s of the result 
49d0: 73 65 74 20 61 6e 64 20 67 69 76 65 6e 20 74 68  set and given th
49e0: 65 6d 20 6e 61 6d 65 73 0a 20 20 40 20 74 68 61  em names.  @ tha
49f0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 6e 20  t begin with an 
4a00: 75 6e 64 65 72 73 63 6f 72 65 2e 20 20 4c 69 6b  underscore.  Lik
4a10: 65 20 74 68 69 73 3a 3c 2f 70 3e 0a 20 20 40 20  e this:</p>.  @ 
4a20: 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65  <blockquote><pre
4a30: 3e 0a 20 20 40 20 20 53 45 4c 45 43 54 0a 20 20  >.  @  SELECT.  
4a40: 40 20 20 20 20 74 6e 20 41 53 20 27 23 27 2c 0a  @    tn AS '#',.
4a50: 20 20 40 20 20 20 20 74 79 70 65 20 41 53 20 27    @    type AS '
4a60: 54 79 70 65 27 2c 0a 20 20 40 20 20 20 20 73 74  Type',.  @    st
4a70: 61 74 75 73 20 41 53 20 27 53 74 61 74 75 73 27  atus AS 'Status'
4a80: 2c 0a 20 20 40 20 20 20 20 73 64 61 74 65 28 6f  ,.  @    sdate(o
4a90: 72 69 67 74 69 6d 65 29 20 41 53 20 27 43 72 65  rigtime) AS 'Cre
4aa0: 61 74 65 64 27 2c 0a 20 20 40 20 20 20 20 6f 77  ated',.  @    ow
4ab0: 6e 65 72 20 41 53 20 27 42 79 27 2c 0a 20 20 40  ner AS 'By',.  @
4ac0: 20 20 20 20 73 75 62 73 79 73 74 65 6d 20 41 53      subsystem AS
4ad0: 20 27 53 75 62 73 79 73 27 2c 0a 20 20 40 20 20   'Subsys',.  @  
4ae0: 20 20 73 64 61 74 65 28 63 68 61 6e 67 65 74 69    sdate(changeti
4af0: 6d 65 29 20 41 53 20 27 43 68 61 6e 67 65 64 27  me) AS 'Changed'
4b00: 2c 0a 20 20 40 20 20 20 20 61 73 73 69 67 6e 65  ,.  @    assigne
4b10: 64 74 6f 20 41 53 20 27 41 73 73 69 67 6e 65 64  dto AS 'Assigned
4b20: 27 2c 0a 20 20 40 20 20 20 20 73 65 76 65 72 69  ',.  @    severi
4b30: 74 79 20 41 53 20 27 53 76 72 27 2c 0a 20 20 40  ty AS 'Svr',.  @
4b40: 20 20 20 20 70 72 69 6f 72 69 74 79 20 41 53 20      priority AS 
4b50: 27 50 72 69 27 2c 0a 20 20 40 20 20 20 20 74 69  'Pri',.  @    ti
4b60: 74 6c 65 20 41 53 20 27 54 69 74 6c 65 27 2c 0a  tle AS 'Title',.
4b70: 20 20 40 20 20 20 20 64 65 73 63 72 69 70 74 69    @    descripti
4b80: 6f 6e 20 41 53 20 27 5f 44 65 73 63 72 69 70 74  on AS '_Descript
4b90: 69 6f 6e 27 2c 20 20 20 2d 2d 20 57 68 65 6e 20  ion',   -- When 
4ba0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
4bb0: 62 65 67 69 6e 73 20 77 69 74 68 20 27 5f 27 0a  begins with '_'.
4bc0: 20 20 40 20 20 20 20 72 65 6d 61 72 6b 73 20 41    @    remarks A
4bd0: 53 20 27 5f 52 65 6d 61 72 6b 73 27 20 20 20 20  S '_Remarks'    
4be0: 20 20 20 20 20 20 20 20 2d 2d 20 74 68 65 20 64          -- the d
4bf0: 61 74 61 20 69 73 20 73 68 6f 77 6e 20 6f 6e 20  ata is shown on 
4c00: 61 20 73 65 70 61 72 61 74 65 20 72 6f 77 2e 0a  a separate row..
4c10: 20 20 40 20 20 46 52 4f 4d 20 74 69 63 6b 65 74    @  FROM ticket
4c20: 0a 20 20 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f  .  @ </pre></blo
4c30: 63 6b 71 75 6f 74 65 3e 0a 20 20 40 0a 20 20 40  ckquote>.  @.  @
4c40: 20 3c 70 3e 4f 72 2c 20 74 6f 20 73 65 65 20 70   <p>Or, to see p
4c50: 61 72 74 20 6f 66 20 74 68 65 20 64 65 73 63 72  art of the descr
4c60: 69 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 61  iption on the sa
4c70: 6d 65 20 72 6f 77 2c 20 75 73 65 20 74 68 65 0a  me row, use the.
4c80: 20 20 40 20 3c 62 3e 77 69 6b 69 28 29 3c 2f 62    @ <b>wiki()</b
4c90: 3e 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  > function with 
4ca0: 73 6f 6d 65 20 73 74 72 69 6e 67 20 6d 61 6e 69  some string mani
4cb0: 70 75 6c 61 74 69 6f 6e 2e 20 55 73 69 6e 67 20  pulation. Using 
4cc0: 74 68 65 0a 20 20 40 20 3c 62 3e 74 6b 74 28 29  the.  @ <b>tkt()
4cd0: 3c 2f 62 3e 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  </b> function on
4ce0: 20 74 68 65 20 74 69 63 6b 65 74 20 6e 75 6d 62   the ticket numb
4cf0: 65 72 20 77 69 6c 6c 20 61 6c 73 6f 20 67 65 6e  er will also gen
4d00: 65 72 61 74 65 20 61 20 6c 69 6e 6b 65 64 0a 20  erate a linked. 
4d10: 20 40 20 66 69 65 6c 64 2c 20 62 75 74 20 77 69   @ field, but wi
4d20: 74 68 6f 75 74 20 74 68 65 20 65 78 74 72 61 20  thout the extra 
4d30: 3c 69 3e 65 64 69 74 3c 2f 69 3e 20 63 6f 6c 75  <i>edit</i> colu
4d40: 6d 6e 3a 0a 20 20 40 20 3c 2f 70 3e 0a 20 20 40  mn:.  @ </p>.  @
4d50: 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72   <blockquote><pr
4d60: 65 3e 0a 20 20 40 20 20 53 45 4c 45 43 54 0a 20  e>.  @  SELECT. 
4d70: 20 40 20 20 20 20 74 6b 74 28 74 6e 29 20 41 53   @    tkt(tn) AS
4d80: 20 27 27 2c 0a 20 20 40 20 20 20 20 74 69 74 6c   '',.  @    titl
4d90: 65 20 41 53 20 27 54 69 74 6c 65 27 2c 0a 20 20  e AS 'Title',.  
4da0: 40 20 20 20 20 77 69 6b 69 28 73 75 62 73 74 72  @    wiki(substr
4db0: 28 64 65 73 63 72 69 70 74 69 6f 6e 2c 30 2c 38  (description,0,8
4dc0: 30 29 29 20 41 53 20 27 44 65 73 63 72 69 70 74  0)) AS 'Descript
4dd0: 69 6f 6e 27 0a 20 20 40 20 20 46 52 4f 4d 20 74  ion'.  @  FROM t
4de0: 69 63 6b 65 74 0a 20 20 40 20 3c 2f 70 72 65 3e  icket.  @ </pre>
4df0: 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20  </blockquote>.  
4e00: 40 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  @.}..static void
4e10: 20 63 6f 6c 75 6d 6e 5f 68 65 61 64 65 72 28 69   column_header(i
4e20: 6e 74 20 72 6e 2c 63 6f 6e 73 74 20 63 68 61 72  nt rn,const char
4e30: 20 2a 7a 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c   *zCol, int nCol
4e40: 2c 20 69 6e 74 20 6e 53 6f 72 74 65 64 2c 0a 20  , int nSorted,. 
4e50: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
4e60: 44 69 72 65 63 74 69 6f 6e 2c 20 63 6f 6e 73 74  Direction, const
4e70: 20 63 68 61 72 20 2a 7a 45 78 74 72 61 0a 29 7b   char *zExtra.){
4e80: 0a 20 20 69 6e 74 20 73 65 74 20 3d 20 28 6e 43  .  int set = (nC
4e90: 6f 6c 3d 3d 6e 53 6f 72 74 65 64 29 3b 0a 20 20  ol==nSorted);.  
4ea0: 69 6e 74 20 64 65 73 63 20 3d 20 21 73 74 72 63  int desc = !strc
4eb0: 6d 70 28 7a 44 69 72 65 63 74 69 6f 6e 2c 22 44  mp(zDirection,"D
4ec0: 45 53 43 22 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  ESC");..  /*.  *
4ed0: 2a 20 43 6c 69 63 6b 69 6e 67 20 73 61 6d 65 20  * Clicking same 
4ee0: 63 6f 6c 75 6d 6e 20 68 65 61 64 65 72 20 33 20  column header 3 
4ef0: 74 69 6d 65 73 20 69 6e 20 61 20 72 6f 77 20 72  times in a row r
4f00: 65 73 65 74 73 20 61 6e 79 20 73 6f 72 74 69 6e  esets any sortin
4f10: 67 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  g..  ** Note tha
4f20: 74 20 77 65 20 6c 69 6e 6b 20 74 6f 20 72 70 74  t we link to rpt
4f30: 76 69 65 77 2c 20 77 68 69 63 68 20 6d 65 61 6e  view, which mean
4f40: 73 20 65 6d 62 65 64 64 65 64 20 72 65 70 6f 72  s embedded repor
4f50: 74 73 20 77 69 6c 6c 20 67 65 74 0a 20 20 2a 2a  ts will get.  **
4f60: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 61 63 74   sent to the act
4f70: 75 61 6c 20 72 65 70 6f 72 74 20 76 69 65 77 20  ual report view 
4f80: 70 61 67 65 20 61 73 20 73 6f 6f 6e 20 61 73 20  page as soon as 
4f90: 61 20 75 73 65 72 20 74 72 69 65 73 20 74 6f 20  a user tries to 
4fa0: 64 6f 0a 20 20 2a 2a 20 61 6e 79 20 73 6f 72 74  do.  ** any sort
4fb0: 69 6e 67 2e 20 49 20 64 6f 6e 27 74 20 73 65 65  ing. I don't see
4fc0: 20 74 68 61 74 20 61 73 20 61 20 42 61 64 20 54   that as a Bad T
4fd0: 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  hing..  */.  if(
4fe0: 73 65 74 20 26 26 20 64 65 73 63 29 7b 0a 20 20  set && desc){.  
4ff0: 20 20 40 20 3c 74 68 20 62 67 63 6f 6c 6f 72 3d    @ <th bgcolor=
5000: 22 25 73 28 42 47 31 29 22 20 63 6c 61 73 73 3d  "%s(BG1)" class=
5010: 22 62 6b 67 6e 64 31 22 3e 0a 20 20 20 20 40 20  "bkgnd1">.    @ 
5020: 20 20 3c 61 20 68 72 65 66 3d 22 72 70 74 76 69    <a href="rptvi
5030: 65 77 3f 72 6e 3d 25 64 28 72 6e 29 25 73 28 7a  ew?rn=%d(rn)%s(z
5040: 45 78 74 72 61 29 22 3e 25 68 28 7a 43 6f 6c 29  Extra)">%h(zCol)
5050: 3c 2f 61 3e 3c 2f 74 68 3e 0a 20 20 7d 65 6c 73  </a></th>.  }els
5060: 65 7b 0a 20 20 20 20 69 66 28 73 65 74 29 7b 0a  e{.    if(set){.
5070: 20 20 20 20 20 20 40 20 3c 74 68 20 62 67 63 6f        @ <th bgco
5080: 6c 6f 72 3d 22 25 73 28 42 47 31 29 22 20 63 6c  lor="%s(BG1)" cl
5090: 61 73 73 3d 22 62 6b 67 6e 64 31 22 3e 3c 61 0a  ass="bkgnd1"><a.
50a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
50b0: 20 40 20 3c 74 68 3e 3c 61 0a 20 20 20 20 7d 0a   @ <th><a.    }.
50c0: 20 20 20 20 40 20 68 72 65 66 3d 22 72 70 74 76      @ href="rptv
50d0: 69 65 77 3f 72 6e 3d 25 64 28 72 6e 29 26 61 6d  iew?rn=%d(rn)&am
50e0: 70 3b 6f 72 64 65 72 5f 62 79 3d 25 64 28 6e 43  p;order_by=%d(nC
50f0: 6f 6c 29 26 61 6d 70 3b 5c 0a 20 20 20 20 40 20  ol)&amp;\.    @ 
5100: 6f 72 64 65 72 5f 64 69 72 3d 25 73 28 64 65 73  order_dir=%s(des
5110: 63 3f 22 41 53 43 22 3a 22 44 45 53 43 22 29 5c  c?"ASC":"DESC")\
5120: 0a 20 20 20 20 40 20 25 73 28 7a 45 78 74 72 61  .    @ %s(zExtra
5130: 29 22 3e 25 68 28 7a 43 6f 6c 29 3c 2f 61 3e 3c  )">%h(zCol)</a><
5140: 2f 74 68 3e 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  /th>.  }.}../*.*
5150: 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74  * The state of t
5160: 68 65 20 72 65 70 6f 72 74 20 67 65 6e 65 72 61  he report genera
5170: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tion..*/.struct 
5180: 47 65 6e 65 72 61 74 65 48 54 4d 4c 20 7b 0a 20  GenerateHTML {. 
5190: 20 69 6e 74 20 72 6e 3b 20 20 20 20 20 20 20 20   int rn;        
51a0: 2f 2a 20 52 65 70 6f 72 74 20 6e 75 6d 62 65 72  /* Report number
51b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 75 6e 74   */.  int nCount
51c0: 3b 20 20 20 20 2f 2a 20 52 6f 77 20 6e 75 6d 62  ;    /* Row numb
51d0: 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  er */.};../*.** 
51e0: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  The callback fun
51f0: 63 74 69 6f 6e 20 66 6f 72 20 64 62 5f 71 75 65  ction for db_que
5200: 72 79 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ry.*/.static int
5210: 20 67 65 6e 65 72 61 74 65 5f 68 74 6d 6c 28 0a   generate_html(.
5220: 20 20 76 6f 69 64 20 2a 70 55 73 65 72 2c 20 20    void *pUser,  
5230: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
5240: 20 6f 75 74 70 75 74 20 73 74 61 74 65 20 2a 2f   output state */
5250: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
5260: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5270: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73   columns in this
5280: 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20   result row */. 
5290: 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
52a0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 64 61 74    /* Text of dat
52b0: 61 20 69 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  a in all columns
52c0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 4e   */.  char **azN
52d0: 61 6d 65 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20  ame    /* Names 
52e0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 2a  of the columns *
52f0: 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 47 65  /.){.  struct Ge
5300: 6e 65 72 61 74 65 48 54 4d 4c 20 2a 70 53 74 61  nerateHTML *pSta
5310: 74 65 20 3d 20 28 73 74 72 75 63 74 20 47 65 6e  te = (struct Gen
5320: 65 72 61 74 65 48 54 4d 4c 2a 29 70 55 73 65 72  erateHTML*)pUser
5330: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
5340: 20 74 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20   tn;            
5350: 2f 2a 20 54 69 63 6b 65 74 20 6e 75 6d 62 65 72  /* Ticket number
5360: 2e 20 20 28 76 61 6c 75 65 20 6f 66 20 63 6f 6c  .  (value of col
5370: 75 6d 6e 20 6e 61 6d 65 64 20 27 23 27 29 20 2a  umn named '#') *
5380: 2f 0a 20 20 69 6e 74 20 72 6e 3b 20 20 20 20 20  /.  int rn;     
5390: 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
53a0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
53b0: 20 6e 63 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   ncol;          
53c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
53d0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
53e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 6c 74 69  e */.  int multi
53f0: 72 6f 77 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  row;      /* Tru
5400: 65 20 69 66 20 6d 75 6c 74 69 70 6c 65 20 74 61  e if multiple ta
5410: 62 6c 65 20 72 6f 77 73 20 70 65 72 20 6c 69 6e  ble rows per lin
5420: 65 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 69  e of data */.  i
5430: 6e 74 20 6e 65 77 72 6f 77 69 64 78 3b 20 20 20  nt newrowidx;   
5440: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
5450: 72 73 74 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  rst column that 
5460: 67 6f 65 73 20 6f 6e 20 61 20 73 65 70 61 72 61  goes on a separa
5470: 74 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  te row */.  int 
5480: 69 42 67 20 3d 20 2d 31 3b 20 20 20 20 20 20 2f  iBg = -1;      /
5490: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
54a0: 6e 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  n that determine
54b0: 73 20 62 61 63 6b 67 72 6f 75 6e 64 20 63 6f 6c  s background col
54c0: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42  or */.  char *zB
54d0: 67 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 55 73  g = 0;     /* Us
54e0: 65 20 74 68 69 73 20 62 61 63 6b 67 72 6f 75 6e  e this backgroun
54f0: 64 20 63 6f 6c 6f 72 20 2a 2f 0a 20 20 63 68 61  d color */.  cha
5500: 72 20 7a 50 61 67 65 5b 33 30 5d 3b 20 20 20 20  r zPage[30];    
5510: 2f 2a 20 54 65 78 74 20 76 65 72 73 69 6f 6e 20  /* Text version 
5520: 6f 66 20 74 68 65 20 74 69 63 6b 65 74 20 6e 75  of the ticket nu
5530: 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65  mber */..  /* Ge
5540: 74 20 74 68 65 20 72 65 70 6f 72 74 20 6e 75 6d  t the report num
5550: 62 65 72 0a 20 20 2a 2f 0a 20 20 72 6e 20 3d 20  ber.  */.  rn = 
5560: 70 53 74 61 74 65 2d 3e 72 6e 3b 0a 0a 20 20 2f  pState->rn;..  /
5570: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
5580: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
5590: 6e 73 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  ns, the column t
55a0: 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 62  hat determines b
55b0: 61 63 6b 67 72 6f 75 6e 64 0a 20 20 2a 2a 20 63  ackground.  ** c
55c0: 6f 6c 6f 72 2c 20 61 6e 64 20 77 68 65 74 68 65  olor, and whethe
55d0: 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 20 72 6f  r or not this ro
55e0: 77 20 6f 66 20 64 61 74 61 20 69 73 20 72 65 70  w of data is rep
55f0: 72 65 73 65 6e 74 65 64 20 62 79 20 6d 75 6c 74  resented by mult
5600: 69 70 6c 65 0a 20 20 2a 2a 20 72 6f 77 73 20 69  iple.  ** rows i
5610: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 2a  n the table..  *
5620: 2f 0a 20 20 6e 63 6f 6c 20 3d 20 30 3b 0a 20 20  /.  ncol = 0;.  
5630: 6d 75 6c 74 69 72 6f 77 20 3d 20 30 3b 0a 20 20  multirow = 0;.  
5640: 6e 65 77 72 6f 77 69 64 78 20 3d 20 2d 31 3b 0a  newrowidx = -1;.
5650: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
5660: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  g; i++){.    if(
5670: 20 61 7a 4e 61 6d 65 5b 69 5d 5b 30 5d 3d 3d 27   azName[i][0]=='
5680: 62 27 20 26 26 20 73 74 72 63 6d 70 28 61 7a 4e  b' && strcmp(azN
5690: 61 6d 65 5b 69 5d 2c 22 62 67 63 6f 6c 6f 72 22  ame[i],"bgcolor"
56a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 42  )==0 ){.      zB
56b0: 67 20 3d 20 61 7a 41 72 67 20 3f 20 61 7a 41 72  g = azArg ? azAr
56c0: 67 5b 69 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20  g[i] : 0;.      
56d0: 69 42 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 63  iBg = i;.      c
56e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
56f0: 20 20 20 69 66 28 20 67 2e 6f 6b 57 72 69 74 65     if( g.okWrite
5700: 20 26 26 20 61 7a 4e 61 6d 65 5b 69 5d 5b 30 5d   && azName[i][0]
5710: 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 6e  =='#' ){.      n
5720: 63 6f 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  col++;.    }.   
5730: 20 69 66 28 20 21 6d 75 6c 74 69 72 6f 77 20 29   if( !multirow )
5740: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 4e 61  {.      if( azNa
5750: 6d 65 5b 69 5d 5b 30 5d 3d 3d 27 5f 27 20 29 7b  me[i][0]=='_' ){
5760: 0a 20 20 20 20 20 20 20 20 6d 75 6c 74 69 72 6f  .        multiro
5770: 77 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e  w = 1;.        n
5780: 65 77 72 6f 77 69 64 78 20 3d 20 69 3b 0a 20 20  ewrowidx = i;.  
5790: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
57a0: 20 20 20 6e 63 6f 6c 2b 2b 3b 0a 20 20 20 20 20     ncol++;.     
57b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
57c0: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  /* The first tim
57d0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
57e0: 73 20 63 61 6c 6c 65 64 2c 20 6f 75 74 70 75 74  s called, output
57f0: 20 61 20 74 61 62 6c 65 20 68 65 61 64 65 72 0a   a table header.
5800: 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 61 74    */.  if( pStat
5810: 65 2d 3e 6e 43 6f 75 6e 74 3d 3d 30 20 29 7b 0a  e->nCount==0 ){.
5820: 20 20 20 20 40 20 3c 74 72 3e 0a 20 20 20 20 74      @ <tr>.    t
5830: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28  n = -1;.    for(
5840: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
5850: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
5860: 4e 61 6d 65 20 3d 20 61 7a 4e 61 6d 65 5b 69 5d  Name = azName[i]
5870: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69  ;.      if( i==i
5880: 42 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  Bg ) continue;. 
5890: 20 20 20 20 20 69 66 28 20 6e 65 77 72 6f 77 69       if( newrowi
58a0: 64 78 3e 3d 30 20 26 26 20 69 3e 3d 6e 65 77 72  dx>=0 && i>=newr
58b0: 6f 77 69 64 78 20 29 7b 0a 20 20 20 20 20 20 20  owidx ){.       
58c0: 20 69 66 28 20 67 2e 6f 6b 57 72 69 74 65 20 26   if( g.okWrite &
58d0: 26 20 74 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  & tn>=0 ){.     
58e0: 20 20 20 20 20 40 20 3c 74 68 3e 26 6e 62 73 70       @ <th>&nbsp
58f0: 3b 3c 2f 74 68 3e 0a 20 20 20 20 20 20 20 20 20  ;</th>.         
5900: 20 74 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   tn = -1;.      
5910: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
5920: 7a 4e 61 6d 65 5b 30 5d 3d 3d 27 5f 27 20 29 20  zName[0]=='_' ) 
5930: 7a 4e 61 6d 65 2b 2b 3b 0a 20 20 20 20 20 20 20  zName++;.       
5940: 20 40 20 3c 2f 74 72 3e 3c 74 72 3e 3c 74 68 20   @ </tr><tr><th 
5950: 63 6f 6c 73 70 61 6e 3d 25 64 28 6e 63 6f 6c 29  colspan=%d(ncol)
5960: 3e 25 68 28 7a 4e 61 6d 65 29 3c 2f 74 68 3e 0a  >%h(zName)</th>.
5970: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5980: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 30       if( zName[0
5990: 5d 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20  ]=='#' ){.      
59a0: 20 20 20 20 74 6e 20 3d 20 69 3b 0a 20 20 20 20      tn = i;.    
59b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
59c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b    }.    if( g.ok
59d0: 57 72 69 74 65 20 26 26 20 74 6e 3e 3d 30 20 29  Write && tn>=0 )
59e0: 7b 0a 20 20 20 20 20 20 40 20 3c 74 68 3e 26 6e  {.      @ <th>&n
59f0: 62 73 70 3b 3c 2f 74 68 3e 0a 20 20 20 20 7d 0a  bsp;</th>.    }.
5a00: 20 20 20 20 40 20 3c 2f 74 72 3e 0a 20 20 7d 0a      @ </tr>.  }.
5a10: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
5a20: 7b 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 20  {.    @ <tr><td 
5a30: 63 6f 6c 73 70 61 6e 3d 22 25 64 28 6e 63 6f 6c  colspan="%d(ncol
5a40: 29 22 3e 0a 20 20 20 20 40 20 3c 69 3e 4e 6f 20  )">.    @ <i>No 
5a50: 72 65 63 6f 72 64 73 20 6d 61 74 63 68 20 74 68  records match th
5a60: 65 20 72 65 70 6f 72 74 20 63 72 69 74 65 72 69  e report criteri
5a70: 61 3c 2f 69 3e 0a 20 20 20 20 40 20 3c 2f 74 64  a</i>.    @ </td
5a80: 3e 3c 2f 74 72 3e 0a 20 20 20 20 72 65 74 75 72  ></tr>.    retur
5a90: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2b 2b 70 53 74  n 0;.  }.  ++pSt
5aa0: 61 74 65 2d 3e 6e 43 6f 75 6e 74 3b 0a 0a 20 20  ate->nCount;..  
5ab0: 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73 65  /* Output the se
5ac0: 70 61 72 61 74 6f 72 20 61 62 6f 76 65 20 65 61  parator above ea
5ad0: 63 68 20 65 6e 74 72 79 20 69 6e 20 61 20 74 61  ch entry in a ta
5ae0: 62 6c 65 20 77 68 69 63 68 20 68 61 73 20 6d 75  ble which has mu
5af0: 6c 74 69 70 6c 65 20 6c 69 6e 65 73 0a 20 20 2a  ltiple lines.  *
5b00: 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20 65  * per database e
5b10: 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ntry..  */.  if(
5b20: 20 6e 65 77 72 6f 77 69 64 78 3e 3d 30 20 29 7b   newrowidx>=0 ){
5b30: 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 20 63  .    @ <tr><td c
5b40: 6f 6c 73 70 61 6e 3d 25 64 28 6e 63 6f 6c 29 3e  olspan=%d(ncol)>
5b50: 3c 66 6f 6e 74 20 73 69 7a 65 3d 31 3e 26 6e 62  <font size=1>&nb
5b60: 73 70 3b 3c 2f 66 6f 6e 74 3e 3c 2f 74 64 3e 3c  sp;</font></td><
5b70: 2f 74 72 3e 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  /tr>.  }..  /* O
5b80: 75 74 70 75 74 20 74 68 65 20 64 61 74 61 20 66  utput the data f
5b90: 6f 72 20 74 68 69 73 20 65 6e 74 72 79 20 66 72  or this entry fr
5ba0: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  om the database.
5bb0: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 42 67 3d 3d    */.  if( zBg==
5bc0: 30 20 29 20 7a 42 67 20 3d 20 22 77 68 69 74 65  0 ) zBg = "white
5bd0: 22 3b 0a 20 20 40 20 3c 74 72 20 62 67 63 6f 6c  ";.  @ <tr bgcol
5be0: 6f 72 3d 22 25 68 28 7a 42 67 29 22 3e 0a 20 20  or="%h(zBg)">.  
5bf0: 74 6e 20 3d 20 30 3b 0a 20 20 7a 50 61 67 65 5b  tn = 0;.  zPage[
5c00: 30 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  0] = 0;.  for(i=
5c10: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
5c20: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 61 74 61  .    char *zData
5c30: 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 42 67  ;.    if( i==iBg
5c40: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5c50: 20 7a 44 61 74 61 20 3d 20 61 7a 41 72 67 5b 69   zData = azArg[i
5c60: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61  ];.    if( zData
5c70: 3d 3d 30 20 29 20 7a 44 61 74 61 20 3d 20 22 22  ==0 ) zData = ""
5c80: 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 72 6f 77  ;.    if( newrow
5c90: 69 64 78 3e 3d 30 20 26 26 20 69 3e 3d 6e 65 77  idx>=0 && i>=new
5ca0: 72 6f 77 69 64 78 20 29 7b 0a 20 20 20 20 20 20  rowidx ){.      
5cb0: 69 66 28 20 74 6e 3e 30 20 26 26 20 67 2e 6f 6b  if( tn>0 && g.ok
5cc0: 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20  Write ){.       
5cd0: 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74   @ <td valign="t
5ce0: 6f 70 22 3e 3c 61 20 68 72 65 66 3d 22 74 6b 74  op"><a href="tkt
5cf0: 65 64 69 74 3f 74 6e 3d 25 64 28 74 6e 29 2c 25  edit?tn=%d(tn),%
5d00: 64 28 72 6e 29 22 3e 65 64 69 74 3c 2f 61 3e 3c  d(rn)">edit</a><
5d10: 2f 74 64 3e 0a 20 20 20 20 20 20 20 20 74 6e 20  /td>.        tn 
5d20: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
5d30: 20 20 20 69 66 28 20 7a 44 61 74 61 5b 30 5d 20     if( zData[0] 
5d40: 29 7b 0a 20 20 20 20 20 20 20 20 40 20 3c 2f 74  ){.        @ </t
5d50: 72 3e 3c 74 72 20 62 67 63 6f 6c 6f 72 3d 22 25  r><tr bgcolor="%
5d60: 68 28 7a 42 67 29 22 3e 3c 74 64 20 63 6f 6c 73  h(zBg)"><td cols
5d70: 70 61 6e 3d 25 64 28 6e 63 6f 6c 29 3e 0a 20 20  pan=%d(ncol)>.  
5d80: 20 20 20 20 20 20 40 20 25 68 28 7a 44 61 74 61        @ %h(zData
5d90: 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ).      }.    }e
5da0: 6c 73 65 20 69 66 28 20 61 7a 4e 61 6d 65 5b 69  lse if( azName[i
5db0: 5d 5b 30 5d 3d 3d 27 23 27 20 29 7b 0a 20 20 20  ][0]=='#' ){.   
5dc0: 20 20 20 74 6e 20 3d 20 61 74 6f 69 28 7a 44 61     tn = atoi(zDa
5dd0: 74 61 29 3b 0a 20 20 20 20 20 20 40 20 3c 74 64  ta);.      @ <td
5de0: 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 3c 61   valign="top"><a
5df0: 20 68 72 65 66 3d 22 74 6b 74 76 69 65 77 3f 74   href="tktview?t
5e00: 6e 3d 25 64 28 74 6e 29 2c 25 64 28 72 6e 29 22  n=%d(tn),%d(rn)"
5e10: 3e 25 68 28 7a 44 61 74 61 29 3c 2f 61 3e 3c 2f  >%h(zData)</a></
5e20: 74 64 3e 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  td>.    }else if
5e30: 28 20 7a 44 61 74 61 5b 30 5d 3d 3d 30 20 29 7b  ( zData[0]==0 ){
5e40: 0a 20 20 20 20 20 20 40 20 3c 74 64 20 76 61 6c  .      @ <td val
5e50: 69 67 6e 3d 22 74 6f 70 22 3e 26 6e 62 73 70 3b  ign="top">&nbsp;
5e60: 3c 2f 74 64 3e 0a 20 20 20 20 7d 65 6c 73 65 7b  </td>.    }else{
5e70: 0a 20 20 20 20 20 20 40 20 3c 74 64 20 76 61 6c  .      @ <td val
5e80: 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 20 20 20  ign="top">.     
5e90: 20 40 20 25 68 28 7a 44 61 74 61 29 0a 20 20 20   @ %h(zData).   
5ea0: 20 20 20 40 20 3c 2f 74 64 3e 0a 20 20 20 20 7d     @ </td>.    }
5eb0: 0a 20 20 7d 0a 20 20 69 66 28 20 74 6e 3e 30 20  .  }.  if( tn>0 
5ec0: 26 26 20 67 2e 6f 6b 57 72 69 74 65 20 29 7b 0a  && g.okWrite ){.
5ed0: 20 20 20 20 40 20 3c 74 64 20 76 61 6c 69 67 6e      @ <td valign
5ee0: 3d 22 74 6f 70 22 3e 3c 61 20 68 72 65 66 3d 22  ="top"><a href="
5ef0: 74 6b 74 65 64 69 74 3f 74 6e 3d 25 64 28 74 6e  tktedit?tn=%d(tn
5f00: 29 2c 25 64 28 72 6e 29 22 3e 65 64 69 74 3c 2f  ),%d(rn)">edit</
5f10: 61 3e 3c 2f 74 64 3e 0a 20 20 7d 0a 20 20 40 20  a></td>.  }.  @ 
5f20: 3c 2f 74 72 3e 0a 20 20 72 65 74 75 72 6e 20 30  </tr>.  return 0
5f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
5f40: 74 20 74 68 65 20 74 65 78 74 20 67 69 76 65 6e  t the text given
5f50: 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
5f60: 2e 20 20 43 6f 6e 76 65 72 74 20 74 61 62 73 20  .  Convert tabs 
5f70: 61 6e 64 20 6e 65 77 6c 69 6e 65 73 20 69 6e 74  and newlines int
5f80: 6f 0a 2a 2a 20 73 70 61 63 65 73 2e 0a 2a 2f 0a  o.** spaces..*/.
5f90: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
5fa0: 75 74 5f 6e 6f 5f 74 61 62 73 28 63 6f 6e 73 74  ut_no_tabs(const
5fb0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 77 68 69   char *z){.  whi
5fc0: 6c 65 28 20 7a 20 26 26 20 7a 5b 30 5d 20 29 7b  le( z && z[0] ){
5fd0: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
5fe0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d     for(i=0; z[i]
5ff0: 20 26 26 20 28 21 69 73 73 70 61 63 65 28 7a 5b   && (!isspace(z[
6000: 69 5d 29 20 7c 7c 20 7a 5b 69 5d 3d 3d 27 20 27  i]) || z[i]==' '
6010: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66  ); i++){}.    if
6020: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 63  ( i>0 ){.      c
6030: 67 69 5f 70 72 69 6e 74 66 28 22 25 2e 2a 73 22  gi_printf("%.*s"
6040: 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20  , i, z);.    }. 
6050: 20 20 20 66 6f 72 28 6a 3d 69 3b 20 69 73 73 70     for(j=i; issp
6060: 61 63 65 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b  ace(z[j]); j++){
6070: 7d 0a 20 20 20 20 69 66 28 20 6a 3e 69 20 29 7b  }.    if( j>i ){
6080: 0a 20 20 20 20 20 20 63 67 69 5f 70 72 69 6e 74  .      cgi_print
6090: 66 28 22 25 2a 73 22 2c 20 6a 2d 69 2c 20 22 22  f("%*s", j-i, ""
60a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b  );.    }.    z +
60b0: 3d 20 6a 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = j;.  }.}../*.*
60c0: 2a 20 4f 75 74 70 75 74 20 61 20 72 6f 77 20 61  * Output a row a
60d0: 73 20 61 20 74 61 62 2d 73 65 70 61 72 61 74 65  s a tab-separate
60e0: 64 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 2e 0a  d line of text..
60f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 75  */.static int ou
6100: 74 70 75 74 5f 74 61 62 5f 73 65 70 61 72 61 74  tput_tab_separat
6110: 65 64 28 0a 20 20 76 6f 69 64 20 2a 70 55 73 65  ed(.  void *pUse
6120: 72 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  r,     /* Pointe
6130: 72 20 74 6f 20 72 6f 77 2d 63 6f 75 6e 74 20 69  r to row-count i
6140: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 69 6e 74 20  nteger */.  int 
6150: 6e 41 72 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  nArg,        /* 
6160: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
6170: 73 20 69 6e 20 74 68 69 73 20 72 65 73 75 6c 74  s in this result
6180: 20 72 6f 77 20 2a 2f 0a 20 20 63 68 61 72 20 2a   row */.  char *
6190: 2a 61 7a 41 72 67 2c 20 20 20 20 2f 2a 20 54 65  *azArg,    /* Te
61a0: 78 74 20 6f 66 20 64 61 74 61 20 69 6e 20 61 6c  xt of data in al
61b0: 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63  l columns */.  c
61c0: 68 61 72 20 2a 2a 61 7a 4e 61 6d 65 20 20 20 20  har **azName    
61d0: 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 74 68 65 20  /* Names of the 
61e0: 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 29 7b 0a 20 20  columns */.){.  
61f0: 69 6e 74 20 2a 70 43 6f 75 6e 74 20 3d 20 28 69  int *pCount = (i
6200: 6e 74 2a 29 70 55 73 65 72 3b 0a 20 20 69 6e 74  nt*)pUser;.  int
6210: 20 69 3b 0a 0a 20 20 69 66 28 20 2a 70 43 6f 75   i;..  if( *pCou
6220: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  nt==0 ){.    for
6230: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
6240: 2b 29 7b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  +){.      output
6250: 5f 6e 6f 5f 74 61 62 73 28 61 7a 4e 61 6d 65 5b  _no_tabs(azName[
6260: 69 5d 29 3b 0a 20 20 20 20 20 20 63 67 69 5f 70  i]);.      cgi_p
6270: 72 69 6e 74 66 28 22 25 63 22 2c 20 69 3c 6e 41  rintf("%c", i<nA
6280: 72 67 2d 31 20 3f 20 27 5c 74 27 20 3a 20 27 5c  rg-1 ? '\t' : '\
6290: 6e 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n');.    }.  }. 
62a0: 20 2b 2b 2a 70 43 6f 75 6e 74 3b 0a 20 20 66 6f   ++*pCount;.  fo
62b0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
62c0: 2b 2b 29 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f  ++){.    output_
62d0: 6e 6f 5f 74 61 62 73 28 61 7a 41 72 67 5b 69 5d  no_tabs(azArg[i]
62e0: 29 3b 0a 20 20 20 20 63 67 69 5f 70 72 69 6e 74  );.    cgi_print
62f0: 66 28 22 25 63 22 2c 20 69 3c 6e 41 72 67 2d 31  f("%c", i<nArg-1
6300: 20 3f 20 27 5c 74 27 20 3a 20 27 5c 6e 27 29 3b   ? '\t' : '\n');
6310: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
6320: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
6330: 74 65 20 48 54 4d 4c 20 74 68 61 74 20 64 65 73  te HTML that des
6340: 63 72 69 62 65 73 20 61 20 63 6f 6c 6f 72 20 6b  cribes a color k
6350: 65 79 2e 0a 2a 2f 0a 76 6f 69 64 20 6f 75 74 70  ey..*/.void outp
6360: 75 74 5f 63 6f 6c 6f 72 5f 6b 65 79 28 63 6f 6e  ut_color_key(con
6370: 73 74 20 63 68 61 72 20 2a 7a 43 6c 72 4b 65 79  st char *zClrKey
6380: 2c 20 69 6e 74 20 68 6f 72 69 7a 2c 20 63 68 61  , int horiz, cha
6390: 72 20 2a 7a 54 61 62 41 72 67 73 29 7b 0a 20 20  r *zTabArgs){.  
63a0: 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 63  int i, j, k;.  c
63b0: 68 61 72 20 2a 7a 53 61 66 65 4b 65 79 2c 20 2a  har *zSafeKey, *
63c0: 7a 54 6f 46 72 65 65 3b 0a 20 20 77 68 69 6c 65  zToFree;.  while
63d0: 28 20 69 73 73 70 61 63 65 28 2a 7a 43 6c 72 4b  ( isspace(*zClrK
63e0: 65 79 29 20 29 20 7a 43 6c 72 4b 65 79 2b 2b 3b  ey) ) zClrKey++;
63f0: 0a 20 20 69 66 28 20 7a 43 6c 72 4b 65 79 5b 30  .  if( zClrKey[0
6400: 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  ]==0 ) return;. 
6410: 20 40 20 3c 74 61 62 6c 65 20 25 73 28 7a 54 61   @ <table %s(zTa
6420: 62 41 72 67 73 29 3e 0a 20 20 69 66 28 20 68 6f  bArgs)>.  if( ho
6430: 72 69 7a 20 29 7b 0a 20 20 20 20 40 20 3c 74 72  riz ){.    @ <tr
6440: 3e 0a 20 20 7d 0a 20 20 7a 54 6f 46 72 65 65 20  >.  }.  zToFree 
6450: 3d 20 7a 53 61 66 65 4b 65 79 20 3d 20 6d 70 72  = zSafeKey = mpr
6460: 69 6e 74 66 28 22 25 68 22 2c 20 7a 43 6c 72 4b  intf("%h", zClrK
6470: 65 79 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 53  ey);.  while( zS
6480: 61 66 65 4b 65 79 5b 30 5d 20 29 7b 0a 20 20 20  afeKey[0] ){.   
6490: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
64a0: 2a 7a 53 61 66 65 4b 65 79 29 20 29 20 7a 53 61  *zSafeKey) ) zSa
64b0: 66 65 4b 65 79 2b 2b 3b 0a 20 20 20 20 66 6f 72  feKey++;.    for
64c0: 28 69 3d 30 3b 20 7a 53 61 66 65 4b 65 79 5b 69  (i=0; zSafeKey[i
64d0: 5d 20 26 26 20 21 69 73 73 70 61 63 65 28 7a 53  ] && !isspace(zS
64e0: 61 66 65 4b 65 79 5b 69 5d 29 3b 20 69 2b 2b 29  afeKey[i]); i++)
64f0: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20  {}.    for(j=i; 
6500: 69 73 73 70 61 63 65 28 7a 53 61 66 65 4b 65 79  isspace(zSafeKey
6510: 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  [j]); j++){}.   
6520: 20 66 6f 72 28 6b 3d 6a 3b 20 7a 53 61 66 65 4b   for(k=j; zSafeK
6530: 65 79 5b 6b 5d 20 26 26 20 7a 53 61 66 65 4b 65  ey[k] && zSafeKe
6540: 79 5b 6b 5d 21 3d 27 5c 6e 27 20 26 26 20 7a 53  y[k]!='\n' && zS
6550: 61 66 65 4b 65 79 5b 6b 5d 21 3d 27 5c 72 27 3b  afeKey[k]!='\r';
6560: 20 6b 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20   k++){}.    if( 
6570: 21 68 6f 72 69 7a 20 29 7b 0a 20 20 20 20 20 20  !horiz ){.      
6580: 63 67 69 5f 70 72 69 6e 74 66 28 22 3c 74 72 20  cgi_printf("<tr 
6590: 62 67 63 6f 6c 6f 72 3d 5c 22 25 2e 2a 73 5c 22  bgcolor=\"%.*s\"
65a0: 3e 3c 74 64 3e 25 2e 2a 73 3c 2f 74 64 3e 3c 2f  ><td>%.*s</td></
65b0: 74 72 3e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  tr>\n",.        
65c0: 69 2c 20 7a 53 61 66 65 4b 65 79 2c 20 6b 2d 6a  i, zSafeKey, k-j
65d0: 2c 20 26 7a 53 61 66 65 4b 65 79 5b 6a 5d 29 3b  , &zSafeKey[j]);
65e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
65f0: 20 20 63 67 69 5f 70 72 69 6e 74 66 28 22 3c 74    cgi_printf("<t
6600: 64 20 62 67 63 6f 6c 6f 72 3d 5c 22 25 2e 2a 73  d bgcolor=\"%.*s
6610: 5c 22 3e 25 2e 2a 73 3c 2f 74 64 3e 5c 6e 22 2c  \">%.*s</td>\n",
6620: 0a 20 20 20 20 20 20 20 20 69 2c 20 7a 53 61 66  .        i, zSaf
6630: 65 4b 65 79 2c 20 6b 2d 6a 2c 20 26 7a 53 61 66  eKey, k-j, &zSaf
6640: 65 4b 65 79 5b 6a 5d 29 3b 0a 20 20 20 20 7d 0a  eKey[j]);.    }.
6650: 20 20 20 20 7a 53 61 66 65 4b 65 79 20 2b 3d 20      zSafeKey += 
6660: 6b 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 54  k;.  }.  free(zT
6670: 6f 46 72 65 65 29 3b 0a 20 20 69 66 28 20 68 6f  oFree);.  if( ho
6680: 72 69 7a 20 29 7b 0a 20 20 20 20 40 20 3c 2f 74  riz ){.    @ </t
6690: 72 3e 0a 20 20 7d 0a 20 20 40 20 3c 2f 74 61 62  r>.  }.  @ </tab
66a0: 6c 65 3e 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45  le>.}.../*.** WE
66b0: 42 50 41 47 45 3a 20 2f 72 70 74 76 69 65 77 0a  BPAGE: /rptview.
66c0: 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  **.** Generate a
66d0: 20 72 65 70 6f 72 74 2e 20 20 54 68 65 20 72 6e   report.  The rn
66e0: 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
66f0: 20 69 73 20 74 68 65 20 72 65 70 6f 72 74 20 6e   is the report n
6700: 75 6d 62 65 72 0a 2a 2a 20 63 6f 72 72 65 73 70  umber.** corresp
6710: 6f 6e 64 69 6e 67 20 74 6f 20 52 45 50 4f 52 54  onding to REPORT
6720: 46 4d 54 2e 52 4e 2e 20 20 49 66 20 74 68 65 20  FMT.RN.  If the 
6730: 74 61 62 6c 69 73 74 20 71 75 65 72 79 20 70 61  tablist query pa
6740: 72 61 6d 65 74 65 72 20 65 78 69 73 74 73 2c 0a  rameter exists,.
6750: 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 75 74 70  ** then the outp
6760: 75 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 6c  ut consists of l
6770: 69 6e 65 73 20 6f 66 20 74 61 62 2d 73 65 70 61  ines of tab-sepa
6780: 72 61 74 65 64 20 66 69 65 6c 64 73 20 69 6e 73  rated fields ins
6790: 74 65 61 64 20 6f 66 0a 2a 2a 20 61 6e 20 48 54  tead of.** an HT
67a0: 4d 4c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69  ML table..*/.voi
67b0: 64 20 72 70 74 76 69 65 77 5f 70 61 67 65 28 76  d rptview_page(v
67c0: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 63 6f 75 6e  oid){.  int coun
67d0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 6e 3b  t = 0;.  int rn;
67e0: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
67f0: 20 63 68 61 72 20 2a 7a 54 69 74 6c 65 3b 0a 20   char *zTitle;. 
6800: 20 63 68 61 72 20 2a 7a 4f 77 6e 65 72 3b 0a 20   char *zOwner;. 
6810: 20 63 68 61 72 20 2a 7a 43 6c 72 4b 65 79 3b 0a   char *zClrKey;.
6820: 20 20 69 6e 74 20 74 61 62 73 3b 0a 20 20 53 74    int tabs;.  St
6830: 6d 74 20 71 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63  mt q;..  login_c
6840: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
6850: 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52  ();.  if( !g.okR
6860: 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65  ead ){ login_nee
6870: 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d  ded(); return; }
6880: 0a 20 20 72 6e 20 3d 20 61 74 6f 69 28 50 44 28  .  rn = atoi(PD(
6890: 22 72 6e 22 2c 22 30 22 29 29 3b 0a 20 20 69 66  "rn","0"));.  if
68a0: 28 20 72 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 63  ( rn==0 ){.    c
68b0: 67 69 5f 72 65 64 69 72 65 63 74 28 22 72 65 70  gi_redirect("rep
68c0: 6f 72 74 6c 69 73 74 22 29 3b 0a 20 20 20 20 72  ortlist");.    r
68d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 74 61 62  eturn;.  }.  tab
68e0: 73 20 3d 20 50 28 22 74 61 62 6c 69 73 74 22 29  s = P("tablist")
68f0: 21 3d 30 3b 0a 20 20 2f 2a 20 76 69 65 77 5f 61  !=0;.  /* view_a
6900: 64 64 5f 66 75 6e 63 74 69 6f 6e 73 28 74 61 62  dd_functions(tab
6910: 73 29 3b 20 2a 2f 0a 20 20 64 62 5f 70 72 65 70  s); */.  db_prep
6920: 61 72 65 28 26 71 2c 0a 20 20 20 20 22 53 45 4c  are(&q,.    "SEL
6930: 45 43 54 20 74 69 74 6c 65 2c 20 73 71 6c 63 6f  ECT title, sqlco
6940: 64 65 2c 20 6f 77 6e 65 72 2c 20 63 6f 6c 73 20  de, owner, cols 
6950: 46 52 4f 4d 20 72 65 70 6f 72 74 66 6d 74 20 57  FROM reportfmt W
6960: 48 45 52 45 20 72 6e 3d 25 64 22 2c 20 72 6e 29  HERE rn=%d", rn)
6970: 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70 28  ;.  if( db_step(
6980: 26 71 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &q)!=SQLITE_ROW 
6990: 29 7b 0a 20 20 20 20 63 67 69 5f 72 65 64 69 72  ){.    cgi_redir
69a0: 65 63 74 28 22 72 65 70 6f 72 74 6c 69 73 74 22  ect("reportlist"
69b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
69c0: 20 7d 0a 20 20 7a 54 69 74 6c 65 20 3d 20 64 62   }.  zTitle = db
69d0: 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c 6c 6f 63 28 26  _column_malloc(&
69e0: 71 2c 20 30 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  q, 0);.  zSql = 
69f0: 64 62 5f 63 6f 6c 75 6d 6e 5f 6d 61 6c 6c 6f 63  db_column_malloc
6a00: 28 26 71 2c 20 31 29 3b 0a 20 20 7a 4f 77 6e 65  (&q, 1);.  zOwne
6a10: 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 6d 61  r = db_column_ma
6a20: 6c 6c 6f 63 28 26 71 2c 20 32 29 3b 0a 20 20 7a  lloc(&q, 2);.  z
6a30: 43 6c 72 4b 65 79 20 3d 20 64 62 5f 63 6f 6c 75  ClrKey = db_colu
6a40: 6d 6e 5f 6d 61 6c 6c 6f 63 28 26 71 2c 20 33 29  mn_malloc(&q, 3)
6a50: 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28  ;.  db_finalize(
6a60: 26 71 29 3b 0a 0a 20 20 69 66 28 20 50 28 22 6f  &q);..  if( P("o
6a70: 72 64 65 72 5f 62 79 22 29 20 29 7b 0a 20 20 20  rder_by") ){.   
6a80: 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   /*.    ** If th
6a90: 65 20 75 73 65 72 20 77 61 6e 74 73 20 74 6f 20  e user wants to 
6aa0: 64 6f 20 61 20 63 6f 6c 75 6d 6e 20 73 6f 72 74  do a column sort
6ab0: 2c 20 77 72 61 70 20 74 68 65 20 71 75 65 72 79  , wrap the query
6ac0: 20 69 6e 74 6f 20 61 20 73 75 62 0a 20 20 20 20   into a sub.    
6ad0: 2a 2a 20 71 75 65 72 79 20 61 6e 64 20 74 68 65  ** query and the
6ae0: 6e 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  n sort the resul
6af0: 74 73 2e 20 54 68 69 73 20 69 73 20 61 20 77 68  ts. This is a wh
6b00: 6f 6c 65 20 6c 6f 74 20 65 61 73 69 65 72 20 74  ole lot easier t
6b10: 68 61 6e 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e  han.    ** tryin
6b20: 67 20 74 6f 20 69 6e 73 65 72 74 20 61 6e 20 4f  g to insert an O
6b30: 52 44 45 52 20 42 59 20 69 6e 74 6f 20 74 68 65  RDER BY into the
6b40: 20 71 75 65 72 79 20 69 74 73 65 6c 66 2c 20 65   query itself, e
6b50: 73 70 65 63 69 61 6c 6c 79 0a 20 20 20 20 2a 2a  specially.    **
6b60: 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
6b70: 20 61 6c 72 65 61 64 79 20 6f 72 64 65 72 65 64   already ordered
6b80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
6b90: 20 6e 46 69 65 6c 64 20 3d 20 61 74 6f 69 28 50   nField = atoi(P
6ba0: 28 22 6f 72 64 65 72 5f 62 79 22 29 29 3b 0a 20  ("order_by"));. 
6bb0: 20 20 20 69 66 28 20 6e 46 69 65 6c 64 20 3e 20     if( nField > 
6bc0: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
6bd0: 20 63 68 61 72 2a 20 7a 44 69 72 20 3d 20 50 44   char* zDir = PD
6be0: 28 22 6f 72 64 65 72 5f 64 69 72 22 2c 22 22 29  ("order_dir","")
6bf0: 3b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20 21  ;.      zDir = !
6c00: 73 74 72 63 6d 70 28 22 41 53 43 22 2c 7a 44 69  strcmp("ASC",zDi
6c10: 72 29 20 3f 20 22 41 53 43 22 20 3a 20 22 44 45  r) ? "ASC" : "DE
6c20: 53 43 22 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20  SC";.      zSql 
6c30: 3d 20 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  = mprintf("SELEC
6c40: 54 20 2a 20 46 52 4f 4d 20 28 25 73 29 20 4f 52  T * FROM (%s) OR
6c50: 44 45 52 20 42 59 20 25 64 20 25 73 22 2c 20 7a  DER BY %d %s", z
6c60: 53 71 6c 2c 20 6e 46 69 65 6c 64 2c 20 7a 44 69  Sql, nField, zDi
6c70: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
6c80: 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 69 66   count = 0;.  if
6c90: 28 20 21 74 61 62 73 20 29 7b 0a 20 20 20 20 73  ( !tabs ){.    s
6ca0: 74 72 75 63 74 20 47 65 6e 65 72 61 74 65 48 54  truct GenerateHT
6cb0: 4d 4c 20 73 53 74 61 74 65 3b 0a 0a 20 20 20 20  ML sState;..    
6cc0: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 50  db_multi_exec("P
6cd0: 52 41 47 4d 41 20 65 6d 70 74 79 5f 72 65 73 75  RAGMA empty_resu
6ce0: 6c 74 5f 63 61 6c 6c 62 61 63 6b 73 3d 4f 4e 22  lt_callbacks=ON"
6cf0: 29 3b 0a 20 20 20 20 73 74 79 6c 65 5f 73 75 62  );.    style_sub
6d00: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 52 61  menu_element("Ra
6d10: 77 22 2c 20 22 52 61 77 22 2c 20 0a 20 20 20 20  w", "Raw", .    
6d20: 20 20 22 72 70 74 76 69 65 77 3f 74 61 62 6c 69    "rptview?tabli
6d30: 73 74 3d 31 26 25 73 22 2c 20 50 44 28 22 51 55  st=1&%s", PD("QU
6d40: 45 52 59 5f 53 54 52 49 4e 47 22 2c 22 22 29 29  ERY_STRING",""))
6d50: 3b 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 41 64  ;.    if( g.okAd
6d60: 6d 69 6e 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  min .       || (
6d70: 67 2e 6f 6b 51 75 65 72 79 20 26 26 20 67 2e 7a  g.okQuery && g.z
6d80: 4c 6f 67 69 6e 20 26 26 20 7a 4f 77 6e 65 72 20  Login && zOwner 
6d90: 26 26 20 73 74 72 63 6d 70 28 67 2e 7a 4c 6f 67  && strcmp(g.zLog
6da0: 69 6e 2c 7a 4f 77 6e 65 72 29 3d 3d 30 29 20 29  in,zOwner)==0) )
6db0: 7b 0a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75  {.      style_su
6dc0: 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 45  bmenu_element("E
6dd0: 64 69 74 22 2c 20 22 45 64 69 74 22 2c 20 22 72  dit", "Edit", "r
6de0: 70 74 65 64 69 74 3f 72 6e 3d 25 64 22 2c 20 72  ptedit?rn=%d", r
6df0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  n);.    }.    st
6e00: 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d  yle_submenu_elem
6e10: 65 6e 74 28 22 53 51 4c 22 2c 20 22 53 51 4c 22  ent("SQL", "SQL"
6e20: 2c 20 22 72 70 74 73 71 6c 3f 72 6e 3d 25 64 22  , "rptsql?rn=%d"
6e30: 2c 72 6e 29 3b 0a 20 20 20 20 73 74 79 6c 65 5f  ,rn);.    style_
6e40: 68 65 61 64 65 72 28 7a 54 69 74 6c 65 29 3b 0a  header(zTitle);.
6e50: 20 20 20 20 6f 75 74 70 75 74 5f 63 6f 6c 6f 72      output_color
6e60: 5f 6b 65 79 28 7a 43 6c 72 4b 65 79 2c 20 31 2c  _key(zClrKey, 1,
6e70: 20 0a 20 20 20 20 20 20 20 20 22 62 6f 72 64 65   .        "borde
6e80: 72 3d 30 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d  r=0 cellpadding=
6e90: 33 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d 30 20  3 cellspacing=0 
6ea0: 63 6c 61 73 73 3d 5c 22 72 65 70 6f 72 74 5c 22  class=\"report\"
6eb0: 22 29 3b 0a 20 20 20 20 40 20 3c 74 61 62 6c 65  ");.    @ <table
6ec0: 20 62 6f 72 64 65 72 3d 31 20 63 65 6c 6c 70 61   border=1 cellpa
6ed0: 64 64 69 6e 67 3d 32 20 63 65 6c 6c 73 70 61 63  dding=2 cellspac
6ee0: 69 6e 67 3d 30 20 63 6c 61 73 73 3d 22 72 65 70  ing=0 class="rep
6ef0: 6f 72 74 22 3e 0a 20 20 20 20 73 53 74 61 74 65  ort">.    sState
6f00: 2e 72 6e 20 3d 20 72 6e 3b 0a 20 20 20 20 73 53  .rn = rn;.    sS
6f10: 74 61 74 65 2e 6e 43 6f 75 6e 74 20 3d 20 30 3b  tate.nCount = 0;
6f20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
6f30: 63 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 67 65  c(g.db, zSql, ge
6f40: 6e 65 72 61 74 65 5f 68 74 6d 6c 2c 20 26 73 53  nerate_html, &sS
6f50: 74 61 74 65 2c 20 30 29 3b 0a 20 20 20 20 40 20  tate, 0);.    @ 
6f60: 3c 2f 74 61 62 6c 65 3e 0a 20 20 20 20 73 74 79  </table>.    sty
6f70: 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20 7d  le_footer();.  }
6f80: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
6f90: 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 7a 53 71  3_exec(g.db, zSq
6fa0: 6c 2c 20 6f 75 74 70 75 74 5f 74 61 62 5f 73 65  l, output_tab_se
6fb0: 70 61 72 61 74 65 64 2c 20 26 63 6f 75 6e 74 2c  parated, &count,
6fc0: 20 30 29 3b 0a 20 20 20 20 63 67 69 5f 73 65 74   0);.    cgi_set
6fd0: 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65 28 22 74  _content_type("t
6fe0: 65 78 74 2f 70 6c 61 69 6e 22 29 3b 0a 20 20 7d  ext/plain");.  }
6ff0: 0a 7d 0a                                         .}.