Documentation Source Text

Hex Artifact Content
Login

Artifact debaa674122ebd8dc312d78a144ae8669e971175:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 74 63 6c 73 71  #!/usr/bin/tclsq
0010: 6c 69 74 65 33 2e 66 74 73 33 0a 0a 23 20 44 65  lite3.fts3..# De
0020: 63 6f 64 65 20 61 6e 20 48 54 54 50 20 25 2d 65  code an HTTP %-e
0030: 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 0a 23 0a  ncoded string.#.
0040: 70 72 6f 63 20 70 65 72 63 65 6e 74 5f 64 65 63  proc percent_dec
0050: 6f 64 65 20 7b 73 74 72 7d 20 7b 0a 20 20 20 20  ode {str} {.    
0060: 23 20 72 65 77 72 69 74 65 20 22 2b 22 20 62 61  # rewrite "+" ba
0070: 63 6b 20 74 6f 20 73 70 61 63 65 0a 20 20 20 20  ck to space.    
0080: 23 20 70 72 6f 74 65 63 74 20 5c 20 61 6e 64 20  # protect \ and 
0090: 5b 20 61 6e 64 20 5d 20 62 79 20 71 75 6f 74 69  [ and ] by quoti
00a0: 6e 67 20 77 69 74 68 20 27 5c 27 0a 20 20 20 20  ng with '\'.    
00b0: 73 65 74 20 73 74 72 20 5b 73 74 72 69 6e 67 20  set str [string 
00c0: 6d 61 70 20 5b 6c 69 73 74 20 2b 20 7b 20 7d 20  map [list + { } 
00d0: 22 5c 5c 22 20 22 5c 5c 5c 5c 22 20 5c 5b 20 5c  "\\" "\\\\" \[ \
00e0: 5c 5c 5b 20 5c 5d 20 5c 5c 5c 5d 5d 20 24 73 74  \\[ \] \\\]] $st
00f0: 72 5d 0a 0a 20 20 20 20 23 20 70 72 65 70 61 72  r]..    # prepar
0100: 65 20 74 6f 20 70 72 6f 63 65 73 73 20 61 6c 6c  e to process all
0110: 20 25 2d 65 73 63 61 70 65 73 0a 20 20 20 20 72   %-escapes.    r
0120: 65 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 25  egsub -all -- {%
0130: 28 5b 41 2d 46 61 2d 66 5d 5b 41 2d 46 61 2d 66  ([A-Fa-f][A-Fa-f
0140: 30 2d 39 5d 29 25 28 5b 41 2d 46 61 2d 66 38 39  0-9])%([A-Fa-f89
0150: 5d 5b 41 2d 46 61 2d 66 30 2d 39 5d 29 7d 20 5c  ][A-Fa-f0-9])} \
0160: 0a 20 20 20 20 20 20 20 20 24 73 74 72 20 7b 5b  .        $str {[
0170: 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72 74  encoding convert
0180: 66 72 6f 6d 20 75 74 66 2d 38 20 5b 62 69 6e 61  from utf-8 [bina
0190: 72 79 20 64 65 63 6f 64 65 20 68 65 78 20 5c 31  ry decode hex \1
01a0: 5c 32 5d 5d 7d 20 73 74 72 0a 20 20 20 20 72 65  \2]]} str.    re
01b0: 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 25 28  gsub -all -- {%(
01c0: 5b 30 2d 37 5d 5b 41 2d 46 61 2d 66 30 2d 39 5d  [0-7][A-Fa-f0-9]
01d0: 29 7d 20 24 73 74 72 20 7b 5c 5c 75 30 30 5c 31  )} $str {\\u00\1
01e0: 7d 20 73 74 72 0a 0a 20 20 20 20 23 20 70 72 6f  } str..    # pro
01f0: 63 65 73 73 20 25 2d 65 73 63 61 70 65 73 0a 20  cess %-escapes. 
0200: 20 20 20 72 65 74 75 72 6e 20 5b 73 75 62 73 74     return [subst
0210: 20 2d 6e 6f 76 61 72 20 24 73 74 72 5d 0a 7d 0a   -novar $str].}.
0220: 0a 23 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .#==============
0230: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 23 20 54 68  ===========.# Th
0270: 69 73 20 70 72 6f 63 20 69 73 20 63 61 6c 6c 65  is proc is calle
0280: 64 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 61  d to parse the a
0290: 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
02a0: 74 6f 20 74 68 69 73 20 69 6e 76 6f 63 61 74 69  to this invocati
02b0: 6f 6e 20 6f 66 0a 23 20 74 68 65 20 43 47 49 20  on of.# the CGI 
02c0: 70 72 6f 67 72 61 6d 20 28 76 69 61 20 65 69 74  program (via eit
02d0: 68 65 72 20 74 68 65 20 47 45 54 20 6f 72 20 50  her the GET or P
02e0: 4f 53 54 20 6d 65 74 68 6f 64 29 2e 20 49 74 20  OST method). It 
02f0: 72 65 74 75 72 6e 73 20 61 0a 23 20 6b 65 79 2f  returns a.# key/
0300: 76 61 6c 75 65 20 6c 69 73 74 20 63 6f 6e 74 61  value list conta
0310: 69 6e 69 6e 67 20 74 68 65 20 61 72 67 75 6d 65  ining the argume
0320: 6e 74 73 20 73 75 69 74 61 62 6c 65 20 66 6f 72  nts suitable for
0330: 20 70 61 73 73 69 6e 67 20 74 6f 20 5b 61 72 72   passing to [arr
0340: 61 79 0a 23 20 73 65 74 5d 2e 20 46 6f 72 20 65  ay.# set]. For e
0350: 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 43  xample, if the C
0360: 47 49 20 69 73 20 69 6e 76 6f 6b 65 64 20 76 69  GI is invoked vi
0370: 61 20 61 20 47 45 54 20 72 65 71 75 65 73 74 20  a a GET request 
0380: 6f 6e 20 74 68 65 20 55 52 49 3a 0a 23 0a 23 20  on the URI:.#.# 
0390: 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c    http://www.sql
03a0: 69 74 65 2e 6f 72 67 2f 73 65 61 72 63 68 3f 71  ite.org/search?q
03b0: 75 65 72 79 3d 66 74 73 33 2b 74 61 62 6c 65 26  uery=fts3+table&
03c0: 72 65 73 75 6c 74 73 3d 31 30 0a 23 0a 23 20 74  results=10.#.# t
03d0: 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64  hen the returned
03e0: 20 6c 69 73 74 20 76 61 6c 75 65 20 69 73 3a 20   list value is: 
03f0: 0a 23 0a 23 20 20 20 7b 71 75 65 72 79 20 7b 66  .#.#   {query {f
0400: 74 73 33 20 74 61 62 6c 65 7d 20 72 65 73 75 6c  ts3 table} resul
0410: 74 73 20 31 30 7d 0a 23 0a 70 72 6f 63 20 63 67  ts 10}.#.proc cg
0420: 69 5f 70 61 72 73 65 5f 61 72 67 73 20 7b 7d 20  i_parse_args {} 
0430: 7b 0a 20 20 67 6c 6f 62 61 6c 20 65 6e 76 20 41  {.  global env A
0440: 0a 0a 20 20 69 66 20 7b 24 65 6e 76 28 52 45 51  ..  if {$env(REQ
0450: 55 45 53 54 5f 4d 45 54 48 4f 44 29 20 3d 3d 20  UEST_METHOD) == 
0460: 22 47 45 54 22 7d 20 7b 0a 20 20 20 20 66 6f 72  "GET"} {.    for
0470: 65 61 63 68 20 71 20 5b 73 70 6c 69 74 20 24 65  each q [split $e
0480: 6e 76 28 51 55 45 52 59 5f 53 54 52 49 4e 47 29  nv(QUERY_STRING)
0490: 20 26 5d 20 7b 0a 20 20 20 20 20 20 69 66 20 7b   &] {.      if {
04a0: 5b 72 65 67 65 78 70 20 7b 28 5b 61 2d 7a 30 2d  [regexp {([a-z0-
04b0: 39 5d 2a 29 3d 28 2e 2a 29 7d 20 24 71 20 61 6c  9]*)=(.*)} $q al
04c0: 6c 20 76 61 72 20 76 61 6c 75 65 5d 7d 20 7b 0a  l var value]} {.
04d0: 20 20 20 20 20 20 20 20 73 65 74 20 41 28 24 76          set A($v
04e0: 61 72 29 20 5b 70 65 72 63 65 6e 74 5f 64 65 63  ar) [percent_dec
04f0: 6f 64 65 20 24 76 61 6c 75 65 5d 0a 20 20 20 20  ode $value].    
0500: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c    }.    }.  } el
0510: 73 65 69 66 20 7b 24 65 6e 76 28 52 45 51 55 45  seif {$env(REQUE
0520: 53 54 5f 4d 45 54 48 4f 44 29 20 3d 3d 20 22 50  ST_METHOD) == "P
0530: 4f 53 54 22 7d 20 7b 0a 20 20 20 20 73 65 74 20  OST"} {.    set 
0540: 71 73 74 72 69 6e 67 20 5b 72 65 61 64 20 73 74  qstring [read st
0550: 64 69 6e 20 24 65 6e 76 28 43 4f 4e 54 45 4e 54  din $env(CONTENT
0560: 5f 4c 45 4e 47 54 48 29 5d 0a 20 20 20 20 66 6f  _LENGTH)].    fo
0570: 72 65 61 63 68 20 71 20 5b 73 70 6c 69 74 20 24  reach q [split $
0580: 71 73 74 72 69 6e 67 20 26 5d 20 7b 0a 20 20 20  qstring &] {.   
0590: 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b     if {[regexp {
05a0: 28 5b 61 2d 7a 30 2d 39 5d 2a 29 3d 28 2e 2a 29  ([a-z0-9]*)=(.*)
05b0: 7d 20 24 71 20 61 6c 6c 20 76 61 72 20 76 61 6c  } $q all var val
05c0: 75 65 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 73  ue]} {.        s
05d0: 65 74 20 41 28 24 76 61 72 29 20 5b 70 65 72 63  et A($var) [perc
05e0: 65 6e 74 5f 64 65 63 6f 64 65 20 24 76 61 6c 75  ent_decode $valu
05f0: 65 5d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e].      }.    }
0600: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
0610: 65 72 72 6f 72 20 22 55 6e 72 65 63 6f 67 6e 69  error "Unrecogni
0620: 7a 65 64 20 6d 65 74 68 6f 64 3a 20 24 65 6e 76  zed method: $env
0630: 28 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 29  (REQUEST_METHOD)
0640: 22 0a 20 20 7d 0a 7d 0a 0a 0a 23 3d 3d 3d 3d 3d  ".  }.}...#=====
0650: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0660: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0670: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0680: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0690: 3d 3d 3d 3d 0a 23 20 52 65 64 69 72 65 63 74 20  ====.# Redirect 
06a0: 74 68 65 20 77 65 62 2d 62 72 6f 77 73 65 72 20  the web-browser 
06b0: 74 6f 20 55 52 4c 20 24 75 72 6c 2e 20 54 68 69  to URL $url. Thi
06c0: 73 20 63 6f 6d 6d 61 6e 64 20 64 6f 65 73 20 6e  s command does n
06d0: 6f 74 20 72 65 74 75 72 6e 2e 0a 23 0a 70 72 6f  ot return..#.pro
06e0: 63 20 63 67 69 5f 72 65 64 69 72 65 63 74 20 7b  c cgi_redirect {
06f0: 75 72 6c 7d 20 7b 0a 20 20 73 65 74 20 73 65 72  url} {.  set ser
0700: 76 65 72 20 24 3a 3a 65 6e 76 28 53 45 52 56 45  ver $::env(SERVE
0710: 52 5f 4e 41 4d 45 29 0a 20 20 73 65 74 20 70 61  R_NAME).  set pa
0720: 74 68 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  th [file dirname
0730: 20 24 3a 3a 65 6e 76 28 52 45 51 55 45 53 54 5f   $::env(REQUEST_
0740: 55 52 49 29 5d 0a 20 20 69 66 20 7b 5b 73 74 72  URI)].  if {[str
0750: 69 6e 67 20 72 61 6e 67 65 20 24 70 61 74 68 20  ing range $path 
0760: 65 6e 64 20 65 6e 64 5d 21 3d 22 2f 22 7d 20 7b  end end]!="/"} {
0770: 0a 20 20 20 20 61 70 70 65 6e 64 20 70 61 74 68  .    append path
0780: 20 2f 0a 20 20 7d 0a 0a 20 20 70 75 74 73 20 22   /.  }..  puts "
0790: 53 74 61 74 75 73 3a 20 33 30 32 20 52 65 64 69  Status: 302 Redi
07a0: 72 65 63 74 22 0a 20 20 70 75 74 73 20 22 4c 6f  rect".  puts "Lo
07b0: 63 61 74 69 6f 6e 3a 20 68 74 74 70 3a 2f 2f 24  cation: http://$
07c0: 7b 73 65 72 76 65 72 7d 24 7b 70 61 74 68 7d 24  {server}${path}$
07d0: 7b 75 72 6c 7d 22 0a 20 20 70 75 74 73 20 22 43  {url}".  puts "C
07e0: 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 30  ontent-Length: 0
07f0: 22 0a 20 20 70 75 74 73 20 22 22 0a 20 20 65 78  ".  puts "".  ex
0800: 69 74 0a 7d 0a 0a 23 3d 3d 3d 3d 3d 3d 3d 3d 3d  it.}..#=========
0810: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0820: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0830: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0840: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0850: 0a 23 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  .# The argument 
0860: 63 6f 6e 74 61 69 6e 73 20 61 20 6b 65 79 20 76  contains a key v
0870: 61 6c 75 65 20 6c 69 73 74 2e 20 54 68 65 20 76  alue list. The v
0880: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 6c 69 73  alues in the lis
0890: 74 20 61 72 65 0a 23 20 74 72 61 6e 73 66 6f 72  t are.# transfor
08a0: 6d 65 64 20 74 6f 20 61 6e 20 48 54 54 50 20 71  med to an HTTP q
08b0: 75 65 72 79 20 6b 65 79 20 76 61 6c 75 65 20 6c  uery key value l
08c0: 69 73 74 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ist. For example
08d0: 3a 0a 23 0a 23 20 20 20 25 20 63 67 69 5f 65 6e  :.#.#   % cgi_en
08e0: 63 6f 64 65 5f 61 72 67 73 20 7b 73 20 22 73 65  code_args {s "se
08f0: 61 72 63 68 20 73 74 72 69 6e 67 22 20 74 20 22  arch string" t "
0900: 73 65 61 72 63 68 20 5c 22 74 79 70 65 5c 22 22  search \"type\""
0910: 7d 0a 23 20 20 20 73 3d 73 65 61 72 63 68 2b 73  }.#   s=search+s
0920: 74 72 69 6e 67 26 74 3d 73 65 61 72 63 68 2b 25  tring&t=search+%
0930: 32 32 74 79 70 65 25 32 32 0a 23 0a 70 72 6f 63  22type%22.#.proc
0940: 20 63 67 69 5f 65 6e 63 6f 64 65 5f 61 72 67 73   cgi_encode_args
0950: 20 7b 6c 69 73 74 7d 20 7b 0a 20 20 73 65 74 20   {list} {.  set 
0960: 72 65 73 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 20  reslist [list]. 
0970: 20 66 6f 72 65 61 63 68 20 7b 6b 65 79 20 76 61   foreach {key va
0980: 6c 75 65 7d 20 24 6c 69 73 74 20 7b 0a 20 20 20  lue} $list {.   
0990: 20 73 65 74 20 76 61 6c 75 65 20 5b 73 74 72 69   set value [stri
09a0: 6e 67 20 6d 61 70 20 7b 0a 20 20 20 20 20 20 5c  ng map {.      \
09b0: 78 32 30 20 2b 20 20 20 5c 78 32 31 20 25 32 31  x20 +   \x21 %21
09c0: 20 5c 78 32 41 20 25 32 41 20 5c 78 32 32 20 25   \x2A %2A \x22 %
09d0: 32 32 20 5c 78 32 37 20 25 32 37 20 5c 78 32 38  22 \x27 %27 \x28
09e0: 20 25 32 38 20 5c 78 32 39 20 25 32 39 20 5c 78   %28 \x29 %29 \x
09f0: 33 42 20 25 33 42 20 0a 20 20 20 20 20 20 5c 78  3B %3B .      \x
0a00: 33 41 20 25 33 41 20 5c 78 34 30 20 25 34 30 20  3A %3A \x40 %40 
0a10: 5c 78 32 36 20 25 32 36 20 5c 78 33 44 20 25 33  \x26 %26 \x3D %3
0a20: 44 20 5c 78 32 42 20 25 32 42 20 5c 78 32 34 20  D \x2B %2B \x24 
0a30: 25 32 34 20 5c 78 32 43 20 25 32 43 20 5c 78 32  %24 \x2C %2C \x2
0a40: 46 20 25 32 46 20 0a 20 20 20 20 20 20 5c 78 33  F %2F .      \x3
0a50: 46 20 25 33 46 20 5c 78 32 35 20 25 32 35 20 5c  F %3F \x25 %25 \
0a60: 78 32 33 20 25 32 33 20 5c 78 35 42 20 25 35 42  x23 %23 \x5B %5B
0a70: 20 5c 78 35 44 20 25 35 44 0a 20 20 20 20 7d 20   \x5D %5D.    } 
0a80: 24 76 61 6c 75 65 5d 0a 0a 20 20 20 20 6c 61 70  $value]..    lap
0a90: 70 65 6e 64 20 72 65 73 6c 69 73 74 20 22 24 6b  pend reslist "$k
0aa0: 65 79 3d 24 76 61 6c 75 65 22 0a 20 20 7d 0a 20  ey=$value".  }. 
0ab0: 20 6a 6f 69 6e 20 24 72 65 73 6c 69 73 74 20 26   join $reslist &
0ac0: 0a 7d 0a 0a 70 72 6f 63 20 68 74 6d 6c 69 7a 65  .}..proc htmlize
0ad0: 20 7b 73 74 72 7d 20 7b 20 73 74 72 69 6e 67 20   {str} { string 
0ae0: 6d 61 70 20 7b 3c 20 26 6c 74 3b 20 3e 20 26 67  map {< &lt; > &g
0af0: 74 3b 7d 20 24 73 74 72 20 7d 0a 70 72 6f 63 20  t;} $str }.proc 
0b00: 61 74 74 72 69 7a 65 20 7b 73 74 72 7d 20 7b 20  attrize {str} { 
0b10: 73 74 72 69 6e 67 20 6d 61 70 20 7b 3c 20 26 6c  string map {< &l
0b20: 74 3b 20 3e 20 26 67 74 3b 20 5c 78 32 32 20 5c  t; > &gt; \x22 \
0b30: 78 35 63 5c 78 32 32 7d 20 24 73 74 72 20 7d 0a  x5c\x22} $str }.
0b40: 0a 23 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .#==============
0b50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0b60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0b70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0b80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 70 72 6f  ===========..pro
0b90: 63 20 63 67 69 5f 65 6e 76 5f 64 75 6d 70 20 7b  c cgi_env_dump {
0ba0: 7d 20 7b 0a 0a 20 20 73 65 74 20 72 65 74 20 22  } {..  set ret "
0bb0: 3c 68 31 3e 41 72 67 75 6d 65 6e 74 73 3c 2f 68  <h1>Arguments</h
0bc0: 31 3e 3c 74 61 62 6c 65 3e 22 0a 20 20 66 6f 72  1><table>".  for
0bd0: 65 61 63 68 20 7b 6b 65 79 20 76 61 6c 75 65 7d  each {key value}
0be0: 20 5b 61 72 72 61 79 20 67 65 74 20 3a 3a 41 5d   [array get ::A]
0bf0: 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20 72 65   {.    append re
0c00: 74 20 22 3c 74 72 3e 3c 74 64 3e 5b 68 74 6d 6c  t "<tr><td>[html
0c10: 69 7a 65 20 24 6b 65 79 5d 3c 74 64 3e 5b 68 74  ize $key]<td>[ht
0c20: 6d 6c 69 7a 65 20 24 76 61 6c 75 65 5d 22 0a 20  mlize $value]". 
0c30: 20 7d 0a 20 20 61 70 70 65 6e 64 20 72 65 74 20   }.  append ret 
0c40: 22 3c 2f 74 61 62 6c 65 3e 22 0a 0a 20 20 61 70  "</table>"..  ap
0c50: 70 65 6e 64 20 72 65 74 20 22 3c 68 31 3e 45 6e  pend ret "<h1>En
0c60: 76 69 72 6f 6e 6d 65 6e 74 3c 2f 68 31 3e 3c 74  vironment</h1><t
0c70: 61 62 6c 65 3e 22 0a 20 20 66 6f 72 65 61 63 68  able>".  foreach
0c80: 20 7b 6b 65 79 20 76 61 6c 75 65 7d 20 5b 61 72   {key value} [ar
0c90: 72 61 79 20 67 65 74 20 3a 3a 65 6e 76 5d 20 7b  ray get ::env] {
0ca0: 0a 20 20 20 20 61 70 70 65 6e 64 20 72 65 74 20  .    append ret 
0cb0: 22 3c 74 72 3e 3c 74 64 3e 5b 68 74 6d 6c 69 7a  "<tr><td>[htmliz
0cc0: 65 20 24 6b 65 79 5d 3c 74 64 3e 5b 68 74 6d 6c  e $key]<td>[html
0cd0: 69 7a 65 20 24 76 61 6c 75 65 5d 22 0a 20 20 7d  ize $value]".  }
0ce0: 0a 20 20 61 70 70 65 6e 64 20 72 65 74 20 22 3c  .  append ret "<
0cf0: 2f 74 61 62 6c 65 3e 22 0a 20 20 72 65 74 75 72  /table>".  retur
0d00: 6e 20 24 72 65 74 0a 7d 0a 0a 70 72 6f 63 20 73  n $ret.}..proc s
0d10: 65 61 72 63 68 66 6f 72 6d 20 7b 7d 20 7b 0a 20  earchform {} {. 
0d20: 20 72 65 74 75 72 6e 20 7b 7d 0a 20 20 73 65 74   return {}.  set
0d30: 20 69 6e 69 74 69 61 6c 20 22 45 6e 74 65 72 20   initial "Enter 
0d40: 73 65 61 72 63 68 20 74 65 72 6d 3a 22 0a 20 20  search term:".  
0d50: 63 61 74 63 68 20 7b 20 73 65 74 20 69 6e 69 74  catch { set init
0d60: 69 61 6c 20 24 3a 3a 41 28 71 29 20 7d 0a 20 20  ial $::A(q) }.  
0d70: 72 65 74 75 72 6e 20 5b 73 75 62 73 74 20 7b 0a  return [subst {.
0d80: 20 20 20 20 3c 74 61 62 6c 65 20 73 74 79 6c 65      <table style
0d90: 3d 22 6d 61 72 67 69 6e 3a 20 31 65 6d 20 61 75  ="margin: 1em au
0da0: 74 6f 22 3e 20 3c 74 72 3e 3c 74 64 3e 53 65 61  to"> <tr><td>Sea
0db0: 72 63 68 20 53 51 4c 69 74 65 20 64 6f 63 73 20  rch SQLite docs 
0dc0: 66 6f 72 3a 3c 74 64 3e 0a 20 20 20 20 20 20 3c  for:<td>.      <
0dd0: 66 6f 72 6d 20 6e 61 6d 65 3d 66 20 6d 65 74 68  form name=f meth
0de0: 6f 64 3d 47 45 54 20 61 63 74 69 6f 6e 3d 73 65  od=GET action=se
0df0: 61 72 63 68 3e 0a 20 20 20 20 20 20 20 20 3c 69  arch>.        <i
0e00: 6e 70 75 74 20 6e 61 6d 65 3d 71 20 74 79 70 65  nput name=q type
0e10: 3d 74 65 78 74 20 77 69 64 74 68 3d 33 35 20 76  =text width=35 v
0e20: 61 6c 75 65 3d 22 5b 61 74 74 72 69 7a 65 20 24  alue="[attrize $
0e30: 69 6e 69 74 69 61 6c 5d 22 3e 3c 2f 69 6e 70 75  initial]"></inpu
0e40: 74 3e 0a 20 20 20 20 20 20 20 20 3c 69 6e 70 75  t>.        <inpu
0e50: 74 20 6e 61 6d 65 3d 73 20 74 79 70 65 3d 73 75  t name=s type=su
0e60: 62 6d 69 74 20 76 61 6c 75 65 3d 22 53 65 61 72  bmit value="Sear
0e70: 63 68 22 3e 3c 2f 69 6e 70 75 74 3e 0a 20 20 20  ch"></input>.   
0e80: 20 20 20 20 20 3c 69 6e 70 75 74 20 6e 61 6d 65       <input name
0e90: 3d 73 20 74 79 70 65 3d 73 75 62 6d 69 74 20 76  =s type=submit v
0ea0: 61 6c 75 65 3d 22 4c 75 63 6b 79 22 3e 3c 2f 69  alue="Lucky"></i
0eb0: 6e 70 75 74 3e 0a 20 20 20 20 20 20 3c 2f 66 6f  nput>.      </fo
0ec0: 72 6d 3e 0a 20 20 20 20 3c 2f 74 61 62 6c 65 3e  rm>.    </table>
0ed0: 0a 20 20 20 20 3c 73 63 72 69 70 74 3e 20 0a 20  .    <script> . 
0ee0: 20 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 66 6f       document.fo
0ef0: 72 6d 73 2e 66 2e 71 2e 66 6f 63 75 73 28 29 0a  rms.f.q.focus().
0f00: 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 66        document.f
0f10: 6f 72 6d 73 2e 66 2e 71 2e 73 65 6c 65 63 74 28  orms.f.q.select(
0f20: 29 0a 20 20 20 20 3c 2f 73 63 72 69 70 74 3e 0a  ).    </script>.
0f30: 20 20 7d 5d 0a 7d 0a 0a 70 72 6f 63 20 66 6f 6f    }].}..proc foo
0f40: 74 65 72 20 7b 7d 20 7b 0a 20 20 72 65 74 75 72  ter {} {.  retur
0f50: 6e 20 7b 0a 20 20 20 20 3c 68 72 3e 0a 20 20 20  n {.    <hr>.   
0f60: 20 3c 74 61 62 6c 65 20 61 6c 69 67 6e 3d 72 69   <table align=ri
0f70: 67 68 74 3e 0a 20 20 20 20 3c 74 64 3e 0a 20 20  ght>.    <td>.  
0f80: 20 20 20 20 3c 69 3e 50 6f 77 65 72 65 64 20 62      <i>Powered b
0f90: 79 20 3c 61 20 68 72 65 66 3d 22 68 74 74 70 3a  y <a href="http:
0fa0: 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
0fb0: 2f 66 74 73 33 2e 68 74 6d 6c 22 3e 46 54 53 33  /fts3.html">FTS3
0fc0: 3c 2f 61 3e 2e 3c 2f 69 3e 0a 20 20 20 20 3c 2f  </a>.</i>.    </
0fd0: 74 61 62 6c 65 3e 0a 20 20 7d 0a 7d 0a 0a 0a 23  table>.  }.}...#
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73  ---------.# This
1030: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 73 69 6d 69   command is simi
1040: 6c 61 72 20 74 6f 20 74 68 65 20 62 75 69 6c 74  lar to the built
1050: 69 6e 20 54 63 6c 20 5b 74 69 6d 65 5d 20 63 6f  in Tcl [time] co
1060: 6d 6d 61 6e 64 2c 20 65 78 63 65 70 74 20 74 68  mmand, except th
1070: 61 74 0a 23 20 69 74 20 6f 6e 6c 79 20 65 76 65  at.# it only eve
1080: 72 20 72 75 6e 73 20 74 68 65 20 73 75 70 70 6c  r runs the suppl
1090: 69 65 64 20 73 63 72 69 70 74 20 6f 6e 63 65 2e  ied script once.
10a0: 20 41 6c 73 6f 2c 20 69 6e 73 74 65 61 64 20 6f   Also, instead o
10b0: 66 20 72 65 74 75 72 6e 69 6e 67 0a 23 20 61 20  f returning.# a 
10c0: 73 74 72 69 6e 67 20 6c 69 6b 65 20 22 78 78 78  string like "xxx
10d0: 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 70 65   microseconds pe
10e0: 72 20 69 74 65 72 61 74 69 6f 6e 22 2c 20 69 74  r iteration", it
10f0: 20 72 65 74 75 72 6e 73 20 22 78 2e 79 79 20 6d   returns "x.yy m
1100: 73 22 20 6f 72 0a 23 20 22 78 2e 79 79 20 73 22  s" or.# "x.yy s"
1110: 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
1120: 68 65 20 6d 61 67 6e 69 74 75 64 65 20 6f 66 20  he magnitude of 
1130: 74 68 65 20 74 69 6d 65 20 73 70 65 6e 74 20 72  the time spent r
1140: 75 6e 6e 69 6e 67 20 74 68 65 20 0a 23 20 63 6f  unning the .# co
1150: 6d 6d 61 6e 64 2e 20 46 6f 72 20 65 78 61 6d 70  mmand. For examp
1160: 6c 65 3a 0a 23 0a 23 20 20 20 25 20 74 74 69 6d  le:.#.#   % ttim
1170: 65 20 7b 61 66 74 65 72 20 31 35 30 30 7d 0a 23  e {after 1500}.#
1180: 20 20 20 31 2e 35 30 20 73 0a 23 20 20 20 25 20     1.50 s.#   % 
1190: 74 74 69 6d 65 20 7b 61 66 74 65 72 20 34 35 7d  ttime {after 45}
11a0: 0a 23 20 20 20 34 35 2e 30 32 20 6d 73 0a 23 0a  .#   45.02 ms.#.
11b0: 70 72 6f 63 20 74 74 69 6d 65 20 7b 73 63 72 69  proc ttime {scri
11c0: 70 74 7d 20 7b 0a 20 20 73 65 74 20 74 20 5b 6c  pt} {.  set t [l
11d0: 69 6e 64 65 78 20 5b 74 69 6d 65 20 5b 6c 69 73  index [time [lis
11e0: 74 20 75 70 6c 65 76 65 6c 20 24 73 63 72 69 70  t uplevel $scrip
11f0: 74 5d 5d 20 30 5d 0a 20 20 69 66 20 7b 24 74 3e  t]] 0].  if {$t>
1200: 31 30 30 30 30 30 30 7d 20 7b 20 72 65 74 75 72  1000000} { retur
1210: 6e 20 5b 66 6f 72 6d 61 74 20 22 25 2e 32 66 20  n [format "%.2f 
1220: 73 22 20 5b 65 78 70 72 20 7b 24 74 2f 31 30 30  s" [expr {$t/100
1230: 30 30 30 30 2e 30 7d 5d 5d 20 7d 0a 20 20 72 65  0000.0}]] }.  re
1240: 74 75 72 6e 20 5b 66 6f 72 6d 61 74 20 22 25 2e  turn [format "%.
1250: 32 66 20 6d 73 22 20 5b 65 78 70 72 20 7b 24 74  2f ms" [expr {$t
1260: 2f 31 30 30 30 2e 30 7d 5d 5d 0a 7d 0a 0a 70 72  /1000.0}]].}..pr
1270: 6f 63 20 72 61 6e 6b 20 7b 6d 61 74 63 68 69 6e  oc rank {matchin
1280: 66 6f 20 61 72 67 73 7d 20 7b 0a 20 20 62 69 6e  fo args} {.  bin
1290: 61 72 79 20 73 63 61 6e 20 24 6d 61 74 63 68 69  ary scan $matchi
12a0: 6e 66 6f 20 69 2a 20 49 0a 0a 20 20 73 65 74 20  nfo i* I..  set 
12b0: 6e 50 68 72 61 73 65 20 5b 6c 69 6e 64 65 78 20  nPhrase [lindex 
12c0: 24 49 20 30 5d 0a 20 20 73 65 74 20 6e 43 6f 6c  $I 0].  set nCol
12d0: 20 5b 6c 69 6e 64 65 78 20 24 49 20 31 5d 0a 0a   [lindex $I 1]..
12e0: 20 20 73 65 74 20 47 20 5b 6c 72 61 6e 67 65 20    set G [lrange 
12f0: 24 49 20 32 20 5b 65 78 70 72 20 7b 31 2b 24 6e  $I 2 [expr {1+$n
1300: 43 6f 6c 2a 24 6e 50 68 72 61 73 65 7d 5d 5d 0a  Col*$nPhrase}]].
1310: 20 20 73 65 74 20 4c 20 5b 6c 72 61 6e 67 65 20    set L [lrange 
1320: 24 49 20 5b 65 78 70 72 20 7b 32 2b 24 6e 43 6f  $I [expr {2+$nCo
1330: 6c 2a 24 6e 50 68 72 61 73 65 7d 5d 20 65 6e 64  l*$nPhrase}] end
1340: 5d 0a 0a 20 20 66 6f 72 65 61 63 68 20 61 20 24  ]..  foreach a $
1350: 61 72 67 73 20 7b 20 6c 61 70 70 65 6e 64 20 6c  args { lappend l
1360: 6f 67 20 5b 65 78 70 72 20 7b 6c 6f 67 31 30 28  og [expr {log10(
1370: 31 30 30 2b 24 61 29 7d 5d 20 7d 0a 0a 20 20 73  100+$a)}] }..  s
1380: 65 74 20 73 63 6f 72 65 20 30 2e 30 0a 20 20 73  et score 0.0.  s
1390: 65 74 20 69 20 30 0a 20 20 66 6f 72 65 61 63 68  et i 0.  foreach
13a0: 20 6c 20 24 4c 20 67 20 24 47 20 7b 0a 20 20 20   l $L g $G {.   
13b0: 20 69 66 20 7b 24 6c 20 3e 20 30 7d 20 7b 0a 20   if {$l > 0} {. 
13c0: 20 20 20 20 20 73 65 74 20 64 69 76 20 5b 6c 69       set div [li
13d0: 6e 64 65 78 20 24 6c 6f 67 20 5b 65 78 70 72 20  ndex $log [expr 
13e0: 24 69 25 33 5d 5d 0a 20 20 20 20 20 20 73 65 74  $i%3]].      set
13f0: 20 73 63 6f 72 65 20 5b 65 78 70 72 20 7b 24 73   score [expr {$s
1400: 63 6f 72 65 20 2b 20 28 64 6f 75 62 6c 65 28 24  core + (double($
1410: 6c 29 20 2f 20 64 6f 75 62 6c 65 28 24 67 29 29  l) / double($g))
1420: 20 2f 20 24 64 69 76 7d 5d 0a 20 20 20 20 7d 0a   / $div}].    }.
1430: 20 20 20 20 69 6e 63 72 20 69 0a 20 20 7d 0a 0a      incr i.  }..
1440: 20 20 72 65 74 75 72 6e 20 24 73 63 6f 72 65 0a    return $score.
1450: 7d 0a 70 72 6f 63 20 65 72 61 6e 6b 20 7b 6d 61  }.proc erank {ma
1460: 74 63 68 69 6e 66 6f 20 61 72 67 73 7d 20 7b 0a  tchinfo args} {.
1470: 20 20 65 76 61 6c 20 72 61 6e 6b 20 5b 6c 69 73    eval rank [lis
1480: 74 20 24 6d 61 74 63 68 69 6e 66 6f 5d 20 24 61  t $matchinfo] $a
1490: 72 67 73 0a 7d 0a 0a 0a 70 72 6f 63 20 73 65 61  rgs.}...proc sea
14a0: 72 63 68 72 65 73 75 6c 74 73 20 7b 7d 20 7b 0a  rchresults {} {.
14b0: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
14c0: 73 74 73 20 3a 3a 41 28 71 29 5d 7d 20 72 65 74  sts ::A(q)]} ret
14d0: 75 72 6e 20 22 22 0a 20 20 23 73 65 74 20 3a 3a  urn "".  #set ::
14e0: 41 28 71 29 20 5b 73 74 72 69 6e 67 20 6d 61 70  A(q) [string map
14f0: 20 7b 27 20 27 27 7d 20 24 41 28 71 29 5d 0a 20   {' ''} $A(q)]. 
1500: 20 23 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 5b   #regsub -all {[
1510: 5e 2d 2f 22 41 2d 5a 61 2d 7a 30 2d 39 5d 7d 20  ^-/"A-Za-z0-9]} 
1520: 24 3a 3a 41 28 71 29 20 7b 20 7d 20 3a 3a 41 28  $::A(q) { } ::A(
1530: 71 29 0a 0a 20 20 23 20 43 6f 75 6e 74 20 74 68  q)..  # Count th
1540: 65 20 27 22 27 20 63 68 61 72 61 63 74 65 72 73  e '"' characters
1550: 20 69 6e 20 24 3a 3a 41 28 71 29 2e 20 49 66 20   in $::A(q). If 
1560: 74 68 65 72 65 20 69 73 20 61 6e 20 6f 64 64 20  there is an odd 
1570: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 23 20 6f 63  number of.  # oc
1580: 63 75 72 65 6e 63 65 73 2c 20 61 64 64 20 61 20  curences, add a 
1590: 22 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  " to the end of 
15a0: 74 68 65 20 71 75 65 72 79 20 73 6f 20 74 68 61  the query so tha
15b0: 74 20 66 74 73 33 20 63 61 6e 20 70 61 72 73 65  t fts3 can parse
15c0: 0a 20 20 23 20 69 74 20 77 69 74 68 6f 75 74 20  .  # it without 
15d0: 65 72 72 6f 72 2e 0a 20 20 69 66 20 7b 5b 72 65  error..  if {[re
15e0: 67 65 78 70 20 2d 61 6c 6c 20 5c 78 32 32 20 24  gexp -all \x22 $
15f0: 3a 3a 41 28 71 29 5d 20 25 20 32 7d 20 7b 20 61  ::A(q)] % 2} { a
1600: 70 70 65 6e 64 20 3a 3a 41 28 71 29 20 5c 78 32  ppend ::A(q) \x2
1610: 32 20 7d 0a 0a 20 20 73 65 74 20 3a 3a 54 49 54  2 }..  set ::TIT
1620: 4c 45 20 22 52 65 73 75 6c 74 73 20 66 6f 72 3a  LE "Results for:
1630: 20 5c 22 5b 68 74 6d 6c 69 7a 65 20 24 3a 3a 41   \"[htmlize $::A
1640: 28 71 29 5d 5c 22 22 0a 0a 20 20 23 20 53 65 74  (q)]\""..  # Set
1650: 20 6e 52 65 73 20 74 6f 20 74 68 65 20 74 6f 74   nRes to the tot
1660: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63  al number of doc
1670: 75 6d 65 6e 74 73 20 74 68 61 74 20 74 68 65 20  uments that the 
1680: 75 73 65 72 27 73 20 71 75 65 72 79 20 6d 61 74  user's query mat
1690: 63 68 65 73 2e 0a 20 20 23 0a 20 20 73 65 74 20  ches..  #.  set 
16a0: 72 63 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20  rc [catch {.    
16b0: 73 65 74 20 6e 52 65 73 20 5b 64 62 20 6f 6e 65  set nRes [db one
16c0: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
16d0: 2a 29 20 46 52 4f 4d 20 70 61 67 65 20 57 48 45  *) FROM page WHE
16e0: 52 45 20 70 61 67 65 20 4d 41 54 43 48 20 24 3a  RE page MATCH $:
16f0: 3a 41 28 71 29 20 7d 5d 0a 20 20 7d 5d 0a 20 20  :A(q) }].  }].  
1700: 69 66 20 7b 24 72 63 7d 20 7b 0a 20 20 20 20 73  if {$rc} {.    s
1710: 65 74 20 3a 3a 41 28 71 29 20 22 5c 22 24 3a 3a  et ::A(q) "\"$::
1720: 41 28 71 29 5c 22 22 0a 20 20 20 20 73 65 74 20  A(q)\"".    set 
1730: 6e 52 65 73 20 5b 64 62 20 6f 6e 65 20 7b 20 53  nRes [db one { S
1740: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1750: 52 4f 4d 20 70 61 67 65 20 57 48 45 52 45 20 70  ROM page WHERE p
1760: 61 67 65 20 4d 41 54 43 48 20 24 3a 3a 41 28 71  age MATCH $::A(q
1770: 29 20 7d 5d 0a 20 20 7d 0a 0a 20 20 23 64 62 20  ) }].  }..  #db 
1780: 66 75 6e 63 20 72 61 6e 6b 20 72 61 6e 6b 0a 20  func rank rank. 
1790: 20 23 64 62 20 66 75 6e 63 20 65 72 61 6e 6b 20   #db func erank 
17a0: 65 72 61 6e 6b 0a 0a 20 20 23 20 49 66 20 74 68  erank..  # If th
17b0: 65 20 75 73 65 72 20 68 61 73 20 63 6c 69 63 6b  e user has click
17c0: 65 64 20 74 68 65 20 22 4c 75 63 6b 79 22 20 62  ed the "Lucky" b
17d0: 75 74 74 6f 6e 20 61 6e 64 20 74 68 65 20 71 75  utton and the qu
17e0: 65 72 79 20 72 65 74 75 72 6e 73 20 6f 6e 65 20  ery returns one 
17f0: 6f 72 0a 20 20 23 20 6d 6f 72 65 20 72 65 73 75  or.  # more resu
1800: 6c 74 73 2c 20 72 65 64 69 72 65 63 74 20 74 68  lts, redirect th
1810: 65 20 62 72 6f 77 73 65 72 20 74 6f 20 74 68 65  e browser to the
1820: 20 68 69 67 68 65 73 74 20 72 61 6e 6b 65 64 20   highest ranked 
1830: 72 65 73 75 6c 74 2e 20 49 66 20 74 68 65 0a 20  result. If the. 
1840: 20 23 20 71 75 65 72 79 20 72 65 74 75 72 6e 73   # query returns
1850: 20 7a 65 72 6f 20 72 65 73 75 6c 74 73 2c 20 66   zero results, f
1860: 61 6c 6c 20 74 68 72 6f 75 67 68 20 61 6e 64 20  all through and 
1870: 64 69 73 70 6c 61 79 20 74 68 65 20 22 4e 6f 20  display the "No 
1880: 72 65 73 75 6c 74 73 22 0a 20 20 23 20 70 61 67  results".  # pag
1890: 65 20 61 73 20 69 66 20 74 68 65 20 75 73 65 72  e as if the user
18a0: 20 68 61 64 20 63 6c 69 63 6b 65 64 20 22 53 65   had clicked "Se
18b0: 61 72 63 68 22 2e 0a 20 20 23 0a 20 20 69 66 20  arch"..  #.  if 
18c0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
18d0: 41 28 73 29 5d 20 26 26 20 24 3a 3a 41 28 73 29  A(s)] && $::A(s)
18e0: 20 3d 3d 20 22 4c 75 63 6b 79 22 7d 20 7b 0a 20   == "Lucky"} {. 
18f0: 20 20 20 73 65 74 20 75 72 6c 20 5b 64 62 20 6f     set url [db o
1900: 6e 65 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ne {.      SELEC
1910: 54 20 75 72 6c 20 46 52 4f 4d 20 70 61 67 65 2c  T url FROM page,
1920: 20 70 61 67 65 64 61 74 61 20 0a 20 20 20 20 20   pagedata .     
1930: 20 57 48 45 52 45 20 70 61 67 65 20 4d 41 54 43   WHERE page MATC
1940: 48 20 24 3a 3a 41 28 71 29 20 41 4e 44 20 70 61  H $::A(q) AND pa
1950: 67 65 2e 64 6f 63 69 64 20 3d 20 70 61 67 65 64  ge.docid = paged
1960: 61 74 61 2e 64 6f 63 69 64 0a 20 20 20 20 20 20  ata.docid.      
1970: 4f 52 44 45 52 20 42 59 20 72 61 6e 6b 28 6d 61  ORDER BY rank(ma
1980: 74 63 68 69 6e 66 6f 28 70 61 67 65 29 2c 20 6e  tchinfo(page), n
1990: 6b 2c 20 6e 74 2c 20 6e 63 29 20 44 45 53 43 0a  k, nt, nc) DESC.
19a0: 20 20 20 20 7d 5d 0a 20 20 20 20 69 66 20 7b 24      }].    if {$
19b0: 75 72 6c 20 21 3d 20 22 22 7d 20 7b 20 63 67 69  url != ""} { cgi
19c0: 5f 72 65 64 69 72 65 63 74 20 24 75 72 6c 20 7d  _redirect $url }
19d0: 0a 20 20 7d 0a 0a 20 20 23 20 49 66 20 6e 52 65  .  }..  # If nRe
19e0: 73 20 69 73 20 30 2c 20 74 68 65 6e 20 74 68 65  s is 0, then the
19f0: 20 75 73 65 72 27 73 20 71 75 65 72 79 20 72 65   user's query re
1a00: 74 75 72 6e 65 64 20 7a 65 72 6f 20 72 65 73 75  turned zero resu
1a10: 6c 74 73 2e 20 52 65 74 75 72 6e 20 61 20 73 68  lts. Return a sh
1a20: 6f 72 74 20 0a 20 20 23 20 6d 65 73 73 61 67 65  ort .  # message
1a30: 20 74 6f 20 74 68 61 74 20 65 66 66 65 63 74 2e   to that effect.
1a40: 0a 20 20 23 0a 20 20 69 66 20 7b 24 6e 52 65 73  .  #.  if {$nRes
1a50: 20 3d 3d 20 30 7d 20 7b 0a 20 20 20 20 72 65 74   == 0} {.    ret
1a60: 75 72 6e 20 5b 73 75 62 73 74 20 7b 20 4e 6f 20  urn [subst { No 
1a70: 72 65 73 75 6c 74 73 20 66 6f 72 3a 20 3c 62 3e  results for: <b>
1a80: 5b 68 74 6d 6c 69 7a 65 20 24 3a 3a 41 28 71 29  [htmlize $::A(q)
1a90: 5d 3c 2f 62 3e 20 7d 5d 0a 20 20 7d 0a 20 20 73  ]</b> }].  }.  s
1aa0: 65 74 20 73 63 6f 72 65 20 30 0a 20 20 63 61 74  et score 0.  cat
1ab0: 63 68 20 7b 73 65 74 20 73 63 6f 72 65 20 24 3a  ch {set score $:
1ac0: 3a 41 28 73 63 6f 72 65 29 7d 0a 0a 20 20 23 20  :A(score)}..  # 
1ad0: 53 65 74 20 69 53 74 61 72 74 20 74 6f 20 74 68  Set iStart to th
1ae0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66  e index of the f
1af0: 69 72 73 74 20 72 65 73 75 6c 74 20 74 6f 20 64  irst result to d
1b00: 69 73 70 6c 61 79 2e 20 52 65 73 75 6c 74 73 20  isplay. Results 
1b10: 61 72 65 0a 20 20 23 20 69 6e 64 65 78 65 64 20  are.  # indexed 
1b20: 73 74 61 72 74 69 6e 67 20 61 74 20 7a 65 72 6f  starting at zero
1b30: 20 66 72 6f 6d 20 6d 6f 73 74 20 74 6f 20 6c 65   from most to le
1b40: 61 73 74 20 72 65 6c 65 76 61 6e 74 2e 0a 20 20  ast relevant..  
1b50: 23 0a 20 20 73 65 74 20 69 53 74 61 72 74 20 5b  #.  set iStart [
1b60: 65 78 70 72 20 7b 28 5b 69 6e 66 6f 20 65 78 69  expr {([info exi
1b70: 73 74 73 20 3a 3a 41 28 69 29 5d 20 3f 20 24 3a  sts ::A(i)] ? $:
1b80: 3a 41 28 69 29 20 3a 20 30 29 2a 31 30 7d 5d 0a  :A(i) : 0)*10}].
1b90: 0a 20 20 23 20 48 54 4d 4c 20 6d 61 72 6b 75 70  .  # HTML markup
1ba0: 20 75 73 65 64 20 74 6f 20 68 69 67 68 6c 69 67   used to highlig
1bb0: 68 74 20 6b 65 79 77 6f 72 64 73 20 77 69 74 68  ht keywords with
1bc0: 69 6e 20 46 54 53 33 20 67 65 6e 65 72 61 74 65  in FTS3 generate
1bd0: 64 20 73 6e 69 70 70 65 74 73 2e 0a 20 20 23 0a  d snippets..  #.
1be0: 20 20 73 65 74 20 6f 70 65 6e 20 7b 3c 73 70 61    set open {<spa
1bf0: 6e 20 73 74 79 6c 65 3d 22 66 6f 6e 74 2d 77 65  n style="font-we
1c00: 69 67 68 74 3a 62 6f 6c 64 3b 20 63 6f 6c 6f 72  ight:bold; color
1c10: 3a 6e 61 76 79 22 3e 7d 0a 20 20 73 65 74 20 63  :navy">}.  set c
1c20: 6c 6f 73 65 20 7b 3c 2f 73 70 61 6e 3e 7d 0a 20  lose {</span>}. 
1c30: 20 73 65 74 20 65 6c 6c 69 70 73 69 73 20 7b 3c   set ellipsis {<
1c40: 62 3e 26 6e 62 73 70 3b 2e 2e 2e 26 6e 62 73 70  b>&nbsp;...&nbsp
1c50: 3b 3c 2f 62 3e 7d 0a 0a 20 20 73 65 74 20 72 65  ;</b>}..  set re
1c60: 74 20 5b 73 75 62 73 74 20 7b 0a 20 20 20 20 3c  t [subst {.    <
1c70: 74 61 62 6c 65 20 62 6f 72 64 65 72 3d 30 3e 0a  table border=0>.
1c80: 20 20 20 20 3c 70 3e 53 65 61 72 63 68 20 72 65      <p>Search re
1c90: 73 75 6c 74 73 20 0a 20 20 20 20 20 20 20 5b 65  sults .       [e
1ca0: 78 70 72 20 24 69 53 74 61 72 74 2b 31 5d 2e 2e  xpr $iStart+1]..
1cb0: 5b 65 78 70 72 20 7b 28 24 6e 52 65 73 20 3c 20  [expr {($nRes < 
1cc0: 24 69 53 74 61 72 74 2b 31 30 29 20 3f 20 24 6e  $iStart+10) ? $n
1cd0: 52 65 73 20 3a 20 24 69 53 74 61 72 74 2b 31 30  Res : $iStart+10
1ce0: 7d 5d 20 0a 20 20 20 20 20 20 20 6f 66 20 24 6e  }] .       of $n
1cf0: 52 65 73 20 66 6f 72 3a 20 3c 62 3e 5b 68 74 6d  Res for: <b>[htm
1d00: 6c 69 7a 65 20 24 3a 3a 41 28 71 29 5d 3c 2f 62  lize $::A(q)]</b
1d10: 3e 0a 20 20 7d 5d 0a 20 20 64 62 20 65 76 61 6c  >.  }].  db eval
1d20: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 0a 20   {.    SELECT . 
1d30: 20 20 20 20 20 72 65 73 75 6c 74 2e 72 6f 77 69       result.rowi
1d40: 64 2b 24 69 53 74 61 72 74 20 41 53 20 72 65 73  d+$iStart AS res
1d50: 6e 75 6d 2c 0a 20 20 20 20 20 20 43 4f 41 4c 45  num,.      COALE
1d60: 53 43 45 28 4e 55 4c 4c 49 46 28 74 69 74 6c 65  SCE(NULLIF(title
1d70: 2c 27 27 29 2c 20 27 4e 6f 20 54 69 74 6c 65 2e  ,''), 'No Title.
1d80: 27 29 20 41 53 20 74 69 74 6c 65 2c 0a 20 20 20  ') AS title,.   
1d90: 20 20 20 73 6e 69 70 70 65 74 28 70 61 67 65 2c     snippet(page,
1da0: 20 24 6f 70 65 6e 2c 20 24 63 6c 6f 73 65 2c 20   $open, $close, 
1db0: 24 65 6c 6c 69 70 73 69 73 2c 20 32 2c 20 34 30  $ellipsis, 2, 40
1dc0: 29 20 41 53 20 73 6e 69 70 70 65 74 2c 0a 20 20  ) AS snippet,.  
1dd0: 20 20 20 20 75 72 6c 2c 0a 20 20 20 20 20 20 43      url,.      C
1de0: 41 53 45 20 57 48 45 4e 20 24 73 63 6f 72 65 20  ASE WHEN $score 
1df0: 54 48 45 4e 20 65 72 61 6e 6b 28 6d 61 74 63 68  THEN erank(match
1e00: 69 6e 66 6f 28 70 61 67 65 29 2c 20 6e 6b 2c 20  info(page), nk, 
1e10: 6e 74 2c 20 6e 63 29 0a 20 20 20 20 20 20 20 20  nt, nc).        
1e20: 20 20 20 45 4c 53 45 20 27 27 20 45 4e 44 20 41     ELSE '' END A
1e30: 53 20 72 65 70 6f 72 74 0a 20 20 20 20 46 52 4f  S report.    FRO
1e40: 4d 20 70 61 67 65 2c 20 28 0a 20 20 20 20 20 20  M page, (.      
1e50: 20 20 53 45 4c 45 43 54 20 0a 20 20 20 20 20 20    SELECT .      
1e60: 20 20 20 20 70 61 67 65 2e 64 6f 63 69 64 20 41      page.docid A
1e70: 53 20 64 6f 63 69 64 2c 20 75 72 6c 2c 20 6e 6b  S docid, url, nk
1e80: 2c 20 6e 74 2c 20 6e 63 0a 20 20 20 20 20 20 20  , nt, nc.       
1e90: 20 46 52 4f 4d 20 70 61 67 65 2c 20 70 61 67 65   FROM page, page
1ea0: 64 61 74 61 20 0a 20 20 20 20 20 20 20 20 20 20  data .          
1eb0: 57 48 45 52 45 20 70 61 67 65 20 4d 41 54 43 48  WHERE page MATCH
1ec0: 20 24 3a 3a 41 28 71 29 20 41 4e 44 20 70 61 67   $::A(q) AND pag
1ed0: 65 2e 64 6f 63 69 64 20 3d 20 70 61 67 65 64 61  e.docid = pageda
1ee0: 74 61 2e 64 6f 63 69 64 0a 20 20 20 20 20 20 20  ta.docid.       
1ef0: 20 20 20 4f 52 44 45 52 20 42 59 20 72 61 6e 6b     ORDER BY rank
1f00: 28 6d 61 74 63 68 69 6e 66 6f 28 70 61 67 65 29  (matchinfo(page)
1f10: 2c 20 6e 6b 2c 20 6e 74 2c 20 6e 63 29 0a 20 20  , nk, nt, nc).  
1f20: 20 20 20 20 20 20 20 20 44 45 53 43 20 4c 49 4d          DESC LIM
1f30: 49 54 20 31 30 20 4f 46 46 53 45 54 20 24 69 53  IT 10 OFFSET $iS
1f40: 74 61 72 74 0a 20 20 20 20 20 20 29 20 41 53 20  tart.      ) AS 
1f50: 72 65 73 75 6c 74 0a 20 20 20 20 57 48 45 52 45  result.    WHERE
1f60: 20 70 61 67 65 20 4d 41 54 43 48 20 24 3a 3a 41   page MATCH $::A
1f70: 28 71 29 20 41 4e 44 20 70 61 67 65 2e 64 6f 63  (q) AND page.doc
1f80: 69 64 20 3d 20 72 65 73 75 6c 74 2e 64 6f 63 69  id = result.doci
1f90: 64 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 72  d.    ORDER BY r
1fa0: 65 73 6e 75 6d 3b 0a 20 20 7d 20 7b 0a 20 20 20  esnum;.  } {.   
1fb0: 20 61 70 70 65 6e 64 20 72 65 74 20 5b 73 75 62   append ret [sub
1fc0: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 7b  st -nocommands {
1fd0: 3c 74 72 3e 0a 20 20 20 20 20 20 3c 74 64 20 76  <tr>.      <td v
1fe0: 61 6c 69 67 6e 3d 74 6f 70 3e 24 7b 72 65 73 6e  align=top>${resn
1ff0: 75 6d 7d 2e 3c 2f 74 64 3e 0a 20 20 20 20 20 20  um}.</td>.      
2000: 3c 74 64 20 76 61 6c 69 67 6e 3d 74 6f 70 3e 0a  <td valign=top>.
2010: 20 20 20 20 20 20 20 20 3c 64 69 76 20 73 74 79          <div sty
2020: 6c 65 3d 22 77 68 69 74 65 2d 73 70 61 63 65 3a  le="white-space:
2030: 77 72 61 70 22 3e 0a 20 20 20 20 20 20 20 20 20  wrap">.         
2040: 20 3c 61 20 68 72 65 66 3d 22 24 75 72 6c 22 3e   <a href="$url">
2050: 24 74 69 74 6c 65 3c 2f 61 3e 0a 20 20 20 20 20  $title</a>.     
2060: 20 20 20 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20     </div>.      
2070: 20 20 3c 64 69 76 20 73 74 79 6c 65 3d 22 66 6f    <div style="fo
2080: 6e 74 2d 73 69 7a 65 3a 73 6d 61 6c 6c 3b 6d 61  nt-size:small;ma
2090: 72 67 69 6e 2d 6c 65 66 74 3a 20 32 65 78 22 3e  rgin-left: 2ex">
20a0: 0a 20 20 20 20 20 20 20 20 20 20 3c 64 69 76 20  .          <div 
20b0: 73 74 79 6c 65 3d 22 77 69 64 74 68 3a 38 30 65  style="width:80e
20c0: 78 22 3e 20 24 73 6e 69 70 70 65 74 20 3c 2f 64  x"> $snippet </d
20d0: 69 76 3e 0a 20 20 20 20 20 20 20 20 20 20 3c 64  iv>.          <d
20e0: 69 76 20 73 74 79 6c 65 3d 22 6d 61 72 67 69 6e  iv style="margin
20f0: 2d 62 6f 74 74 6f 6d 3a 31 65 6d 22 3e 3c 61 20  -bottom:1em"><a 
2100: 68 72 65 66 3d 22 24 75 72 6c 22 3e 24 75 72 6c  href="$url">$url
2110: 3c 2f 61 3e 3c 2f 64 69 76 3e 0a 20 20 20 20 20  </a></div>.     
2120: 20 20 20 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20     </div>.      
2130: 3c 2f 74 64 3e 0a 0a 20 20 20 20 20 20 3c 74 64  </td>..      <td
2140: 20 77 69 64 74 68 3d 31 30 30 25 3e 0a 20 20 20   width=100%>.   
2150: 20 20 20 3c 74 64 20 76 61 6c 69 67 6e 3d 74 6f     <td valign=to
2160: 70 20 73 74 79 6c 65 3d 22 66 6f 6e 74 2d 73 69  p style="font-si
2170: 7a 65 3a 36 35 25 3b 77 68 69 74 65 2d 73 70 61  ze:65%;white-spa
2180: 63 65 3a 6e 6f 77 72 61 70 22 3e 20 24 72 65 70  ce:nowrap"> $rep
2190: 6f 72 74 20 3c 2f 74 64 3e 0a 20 20 20 20 7d 5d  ort </td>.    }]
21a0: 0a 20 20 7d 0a 20 20 61 70 70 65 6e 64 20 72 65  .  }.  append re
21b0: 74 20 7b 20 3c 2f 74 61 62 6c 65 3e 20 7d 0a 0a  t { </table> }..
21c0: 0a 20 20 23 20 49 66 20 74 68 65 20 71 75 65 72  .  # If the quer
21d0: 79 20 72 65 74 75 72 6e 65 64 20 6d 6f 72 65 20  y returned more 
21e0: 74 68 61 6e 20 31 30 20 72 65 73 75 6c 74 73 2c  than 10 results,
21f0: 20 61 64 64 20 75 70 20 74 6f 20 31 30 20 6c 69   add up to 10 li
2200: 6e 6b 73 20 74 6f 20 0a 20 20 23 20 65 61 63 68  nks to .  # each
2210: 20 73 65 74 20 6f 66 20 31 30 20 72 65 73 75 6c   set of 10 resul
2220: 74 73 20 28 66 69 72 73 74 20 6c 69 6e 6b 20 74  ts (first link t
2230: 6f 20 72 65 73 75 6c 74 73 20 31 2d 31 30 2c 20  o results 1-10, 
2240: 73 65 63 6f 6e 64 20 74 6f 20 31 31 2d 32 30 2c  second to 11-20,
2250: 20 0a 20 20 23 20 74 68 69 72 64 20 74 6f 20 32   .  # third to 2
2260: 31 2d 33 30 2c 20 61 73 20 72 65 71 75 69 72 65  1-30, as require
2270: 64 29 2e 0a 20 20 23 0a 20 20 69 66 20 7b 24 6e  d)..  #.  if {$n
2280: 52 65 73 3e 31 30 7d 20 7b 0a 20 20 20 20 73 65  Res>10} {.    se
2290: 74 20 73 28 30 29 20 7b 62 6f 72 64 65 72 3a 20  t s(0) {border: 
22a0: 73 6f 6c 69 64 20 23 30 34 34 61 36 34 20 31 70  solid #044a64 1p
22b0: 78 20 3b 20 70 61 64 64 69 6e 67 3a 20 31 65 78  x ; padding: 1ex
22c0: 20 3b 20 6d 61 72 67 69 6e 3a 20 31 65 78 7d 0a   ; margin: 1ex}.
22d0: 20 20 20 20 73 65 74 20 73 28 31 29 20 22 24 73      set s(1) "$s
22e0: 28 30 29 3b 62 61 63 6b 67 72 6f 75 6e 64 3a 23  (0);background:#
22f0: 30 34 34 61 36 34 3b 63 6f 6c 6f 72 3a 77 68 69  044a64;color:whi
2300: 74 65 22 0a 20 20 20 20 61 70 70 65 6e 64 20 72  te".    append r
2310: 65 74 20 3c 63 65 6e 74 65 72 3e 3c 70 3e 0a 20  et <center><p>. 
2320: 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d     for {set i 0}
2330: 20 7b 24 69 20 3c 20 31 30 20 26 26 20 28 24 69   {$i < 10 && ($i
2340: 2a 31 30 29 3c 24 6e 52 65 73 7d 20 7b 69 6e 63  *10)<$nRes} {inc
2350: 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 61 70 70  r i} {.      app
2360: 65 6e 64 20 72 65 74 20 5b 73 75 62 73 74 20 7b  end ret [subst {
2370: 0a 20 20 20 20 20 20 20 20 3c 61 20 73 74 79 6c  .        <a styl
2380: 65 3d 22 24 73 28 5b 65 78 70 72 20 7b 28 24 69  e="$s([expr {($i
2390: 53 74 61 72 74 2f 31 30 29 3d 3d 24 69 7d 5d 29  Start/10)==$i}])
23a0: 22 20 0a 20 20 20 20 20 20 20 20 20 20 20 68 72  " .           hr
23b0: 65 66 3d 22 73 65 61 72 63 68 3f 5b 63 67 69 5f  ef="search?[cgi_
23c0: 65 6e 63 6f 64 65 5f 61 72 67 73 20 5b 6c 69 73  encode_args [lis
23d0: 74 20 71 20 24 3a 3a 41 28 71 29 20 69 20 24 69  t q $::A(q) i $i
23e0: 5d 5d 22 3e 5b 65 78 70 72 20 24 69 2b 31 5d 3c  ]]">[expr $i+1]<
23f0: 2f 61 3e 0a 20 20 20 20 20 20 7d 5d 0a 20 20 20  /a>.      }].   
2400: 20 7d 0a 20 20 20 20 61 70 70 65 6e 64 20 72 65   }.    append re
2410: 74 20 3c 2f 63 65 6e 74 65 72 3e 0a 20 20 7d 0a  t </center>.  }.
2420: 0a 20 20 72 65 74 75 72 6e 20 24 72 65 74 0a 7d  .  return $ret.}
2430: 0a 0a 70 72 6f 63 20 6d 61 69 6e 20 7b 7d 20 7b  ..proc main {} {
2440: 0a 20 20 67 6c 6f 62 61 6c 20 41 0a 20 20 73 71  .  global A.  sq
2450: 6c 69 74 65 33 20 64 62 20 73 65 61 72 63 68 2e  lite3 db search.
2460: 64 62 0a 20 20 63 67 69 5f 70 61 72 73 65 5f 61  db.  cgi_parse_a
2470: 72 67 73 0a 0a 20 20 64 62 20 74 72 61 6e 73 61  rgs..  db transa
2480: 63 74 69 6f 6e 20 7b 0a 20 20 20 20 69 66 20 7b  ction {.    if {
2490: 5b 63 61 74 63 68 20 73 65 61 72 63 68 72 65 73  [catch searchres
24a0: 75 6c 74 73 20 73 72 63 68 6f 75 74 5d 7d 20 7b  ults srchout]} {
24b0: 0a 20 20 20 20 20 20 73 65 74 20 41 28 71 29 20  .      set A(q) 
24c0: 5b 73 74 72 69 6e 67 20 74 6f 6c 6f 77 65 72 20  [string tolower 
24d0: 24 41 28 71 29 5d 0a 20 20 20 20 20 20 73 65 74  $A(q)].      set
24e0: 20 73 72 63 68 6f 75 74 20 5b 73 65 61 72 63 68   srchout [search
24f0: 72 65 73 75 6c 74 73 5d 0a 20 20 20 20 7d 0a 20  results].    }. 
2500: 20 20 20 73 65 74 20 74 20 5b 74 74 69 6d 65 20     set t [ttime 
2510: 7b 20 73 65 74 20 64 6f 63 20 22 5b 73 65 61 72  { set doc "[sear
2520: 63 68 66 6f 72 6d 5d 20 24 73 72 63 68 6f 75 74  chform] $srchout
2530: 20 5b 66 6f 6f 74 65 72 5d 22 20 7d 5d 0a 20 20   [footer]" }].  
2540: 7d 0a 20 20 61 70 70 65 6e 64 20 64 6f 63 20 22  }.  append doc "
2550: 3c 70 3e 50 61 67 65 20 67 65 6e 65 72 61 74 65  <p>Page generate
2560: 64 20 69 6e 20 24 74 2e 22 0a 20 20 72 65 74 75  d in $t.".  retu
2570: 72 6e 20 24 64 6f 63 0a 0a 20 20 23 20 72 65 74  rn $doc..  # ret
2580: 75 72 6e 20 5b 63 67 69 5f 65 6e 76 5f 64 75 6d  urn [cgi_env_dum
2590: 70 5d 0a 7d 0a 0a 23 3d 3d 3d 3d 3d 3d 3d 3d 3d  p].}..#=========
25a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
25b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
25c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
25d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
25e0: 0a 0a 73 65 74 20 3a 3a 48 45 41 44 45 52 20 7b  ..set ::HEADER {
25f0: 0a 20 20 3c 21 44 4f 43 54 59 50 45 20 48 54 4d  .  <!DOCTYPE HTM
2600: 4c 20 50 55 42 4c 49 43 20 22 2d 2f 2f 57 33 43  L PUBLIC "-//W3C
2610: 2f 2f 44 54 44 20 48 54 4d 4c 20 34 2e 30 31 2f  //DTD HTML 4.01/
2620: 2f 45 4e 22 0a 20 20 22 68 74 74 70 3a 2f 2f 77  /EN".  "http://w
2630: 77 77 2e 77 33 2e 6f 72 67 2f 54 52 2f 68 74 6d  ww.w3.org/TR/htm
2640: 6c 34 2f 73 74 72 69 63 74 2e 64 74 64 22 3e 0a  l4/strict.dtd">.
2650: 20 20 3c 68 74 6d 6c 3e 3c 68 65 61 64 3e 0a 20    <html><head>. 
2660: 20 3c 74 69 74 6c 65 3e 24 54 49 54 4c 45 3c 2f   <title>$TITLE</
2670: 74 69 74 6c 65 3e 0a 20 20 3c 73 74 79 6c 65 20  title>.  <style 
2680: 74 79 70 65 3d 22 74 65 78 74 2f 63 73 73 22 3e  type="text/css">
2690: 0a 20 20 62 6f 64 79 20 7b 0a 20 20 20 20 6d 61  .  body {.    ma
26a0: 72 67 69 6e 3a 20 61 75 74 6f 3b 0a 20 20 20 20  rgin: auto;.    
26b0: 66 6f 6e 74 2d 66 61 6d 69 6c 79 3a 20 56 65 72  font-family: Ver
26c0: 64 61 6e 61 2c 20 73 61 6e 73 2d 73 65 72 69 66  dana, sans-serif
26d0: 3b 0a 20 20 20 20 70 61 64 64 69 6e 67 3a 20 38  ;.    padding: 8
26e0: 70 78 20 31 25 3b 0a 20 20 7d 0a 0a 20 20 61 20  px 1%;.  }..  a 
26f0: 7b 20 63 6f 6c 6f 72 3a 20 23 30 34 34 61 36 34  { color: #044a64
2700: 20 7d 0a 20 20 61 3a 76 69 73 69 74 65 64 20 7b   }.  a:visited {
2710: 20 63 6f 6c 6f 72 3a 20 23 37 33 34 35 35 39 20   color: #734559 
2720: 7d 0a 0a 20 20 2e 6c 6f 67 6f 20 7b 20 70 6f 73  }..  .logo { pos
2730: 69 74 69 6f 6e 3a 61 62 73 6f 6c 75 74 65 3b 20  ition:absolute; 
2740: 6d 61 72 67 69 6e 3a 33 70 78 3b 20 7d 0a 20 20  margin:3px; }.  
2750: 2e 74 61 67 6c 69 6e 65 20 7b 0a 20 20 20 20 66  .tagline {.    f
2760: 6c 6f 61 74 3a 72 69 67 68 74 3b 0a 20 20 20 20  loat:right;.    
2770: 74 65 78 74 2d 61 6c 69 67 6e 3a 72 69 67 68 74  text-align:right
2780: 3b 0a 20 20 20 20 66 6f 6e 74 2d 73 74 79 6c 65  ;.    font-style
2790: 3a 69 74 61 6c 69 63 3b 0a 20 20 20 20 77 69 64  :italic;.    wid
27a0: 74 68 3a 33 30 30 70 78 3b 0a 20 20 20 20 6d 61  th:300px;.    ma
27b0: 72 67 69 6e 3a 31 32 70 78 3b 0a 20 20 20 20 6d  rgin:12px;.    m
27c0: 61 72 67 69 6e 2d 74 6f 70 3a 35 38 70 78 3b 0a  argin-top:58px;.
27d0: 20 20 7d 0a 20 20 2e 6d 65 6e 75 62 61 72 20 7b    }.  .menubar {
27e0: 0a 20 20 20 20 63 6c 65 61 72 3a 20 62 6f 74 68  .    clear: both
27f0: 3b 0a 20 20 20 20 62 6f 72 64 65 72 2d 72 61 64  ;.    border-rad
2800: 69 75 73 3a 20 38 70 78 3b 0a 20 20 20 20 62 61  ius: 8px;.    ba
2810: 63 6b 67 72 6f 75 6e 64 3a 20 23 30 34 34 61 36  ckground: #044a6
2820: 34 3b 0a 20 20 20 20 70 61 64 64 69 6e 67 3a 20  4;.    padding: 
2830: 30 70 78 3b 0a 20 20 20 20 6d 61 72 67 69 6e 3a  0px;.    margin:
2840: 20 30 70 78 3b 0a 20 20 20 20 63 65 6c 6c 2d 73   0px;.    cell-s
2850: 70 61 63 69 6e 67 3a 20 30 70 78 3b 0a 20 20 7d  pacing: 0px;.  }
2860: 0a 20 20 2e 74 6f 6f 6c 62 61 72 20 7b 0a 20 20  .  .toolbar {.  
2870: 20 20 74 65 78 74 2d 61 6c 69 67 6e 3a 20 63 65    text-align: ce
2880: 6e 74 65 72 3b 0a 20 20 20 20 6c 69 6e 65 2d 68  nter;.    line-h
2890: 65 69 67 68 74 3a 20 31 2e 36 65 6d 3b 0a 20 20  eight: 1.6em;.  
28a0: 20 20 6d 61 72 67 69 6e 3a 20 30 3b 0a 20 20 20    margin: 0;.   
28b0: 20 70 61 64 64 69 6e 67 3a 20 30 70 78 20 38 70   padding: 0px 8p
28c0: 78 3b 0a 20 20 7d 0a 20 20 2e 74 6f 6f 6c 62 61  x;.  }.  .toolba
28d0: 72 20 61 20 7b 20 63 6f 6c 6f 72 3a 20 77 68 69  r a { color: whi
28e0: 74 65 3b 0a 20 20 74 65 78 74 2d 64 65 63 6f 72  te;.  text-decor
28f0: 61 74 69 6f 6e 3a 20 6e 6f 6e 65 3b 20 70 61 64  ation: none; pad
2900: 64 69 6e 67 3a 20 36 70 78 0a 20 20 31 32 70 78  ding: 6px.  12px
2910: 3b 20 7d 0a 20 20 2e 74 6f 6f 6c 62 61 72 20 61  ; }.  .toolbar a
2920: 3a 76 69 73 69 74 65 64 20 7b 20 63 6f 6c 6f 72  :visited { color
2930: 3a 20 77 68 69 74 65 3b 20 7d 0a 20 20 2e 74 6f  : white; }.  .to
2940: 6f 6c 62 61 72 20 61 3a 68 6f 76 65 72 20 7b 20  olbar a:hover { 
2950: 63 6f 6c 6f 72 3a 20 23 30 34 34 61 36 34 3b 0a  color: #044a64;.
2960: 20 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20 77 68    background: wh
2970: 69 74 65 3b 20 7d 0a 0a 20 20 2e 63 6f 6e 74 65  ite; }..  .conte
2980: 6e 74 20 20 20 20 7b 20 6d 61 72 67 69 6e 3a 20  nt    { margin: 
2990: 35 25 3b 20 7d 0a 20 20 2e 63 6f 6e 74 65 6e 74  5%; }.  .content
29a0: 20 64 74 20 7b 20 66 6f 6e 74 2d 77 65 69 67 68   dt { font-weigh
29b0: 74 3a 62 6f 6c 64 3b 20 7d 0a 20 20 2e 63 6f 6e  t:bold; }.  .con
29c0: 74 65 6e 74 20 64 64 20 7b 20 6d 61 72 67 69 6e  tent dd { margin
29d0: 2d 62 6f 74 74 6f 6d 3a 20 32 35 70 78 3b 20 6d  -bottom: 25px; m
29e0: 61 72 67 69 6e 2d 6c 65 66 74 3a 32 30 25 3b 20  argin-left:20%; 
29f0: 7d 0a 20 20 2e 63 6f 6e 74 65 6e 74 20 75 6c 20  }.  .content ul 
2a00: 7b 20 70 61 64 64 69 6e 67 3a 30 70 78 3b 20 70  { padding:0px; p
2a10: 61 64 64 69 6e 67 2d 6c 65 66 74 3a 20 31 35 70  adding-left: 15p
2a20: 78 3b 20 6d 61 72 67 69 6e 3a 30 70 78 3b 20 7d  x; margin:0px; }
2a30: 0a 20 20 3c 2f 73 74 79 6c 65 3e 0a 20 20 3c 6d  .  </style>.  <m
2a40: 65 74 61 20 68 74 74 70 2d 65 71 75 69 76 3d 22  eta http-equiv="
2a50: 63 6f 6e 74 65 6e 74 2d 74 79 70 65 22 20 63 6f  content-type" co
2a60: 6e 74 65 6e 74 3d 22 74 65 78 74 2f 68 74 6d 6c  ntent="text/html
2a70: 3b 20 63 68 61 72 73 65 74 3d 55 54 46 2d 38 22  ; charset=UTF-8"
2a80: 3e 0a 20 20 20 20 0a 20 20 3c 2f 68 65 61 64 3e  >.    .  </head>
2a90: 0a 20 20 3c 62 6f 64 79 3e 0a 20 20 3c 64 69 76  .  <body>.  <div
2aa0: 3e 3c 21 2d 2d 20 63 6f 6e 74 61 69 6e 65 72 20  ><!-- container 
2ab0: 64 69 76 20 74 6f 20 73 61 74 69 73 66 79 20 76  div to satisfy v
2ac0: 61 6c 69 64 61 74 6f 72 20 2d 2d 3e 0a 0a 20 20  alidator -->..  
2ad0: 3c 61 20 68 72 65 66 3d 22 69 6e 64 65 78 2e 68  <a href="index.h
2ae0: 74 6d 6c 22 3e 0a 20 20 3c 69 6d 67 20 63 6c 61  tml">.  <img cla
2af0: 73 73 3d 22 6c 6f 67 6f 22 20 73 72 63 3d 22 69  ss="logo" src="i
2b00: 6d 61 67 65 73 2f 73 71 6c 69 74 65 33 37 30 5f  mages/sqlite370_
2b10: 62 61 6e 6e 65 72 2e 67 69 66 22 20 61 6c 74 3d  banner.gif" alt=
2b20: 22 53 51 4c 69 74 65 20 4c 6f 67 6f 22 20 62 6f  "SQLite Logo" bo
2b30: 72 64 65 72 3d 22 30 22 3e 3c 2f 61 3e 0a 20 20  rder="0"></a>.  
2b40: 20 20 3c 64 69 76 3e 3c 21 2d 2d 20 49 45 20 68    <div><!-- IE h
2b50: 61 63 6b 20 74 6f 20 70 72 65 76 65 6e 74 20 64  ack to prevent d
2b60: 69 73 61 70 70 65 61 72 69 6e 67 20 6c 6f 67 6f  isappearing logo
2b70: 2d 2d 3e 3c 2f 64 69 76 3e 0a 20 20 20 20 3c 64  --></div>.    <d
2b80: 69 76 20 63 6c 61 73 73 3d 22 74 61 67 6c 69 6e  iv class="taglin
2b90: 65 22 3e 53 6d 61 6c 6c 2e 20 46 61 73 74 2e 20  e">Small. Fast. 
2ba0: 52 65 6c 69 61 62 6c 65 2e 3c 62 72 3e 43 68 6f  Reliable.<br>Cho
2bb0: 6f 73 65 20 61 6e 79 20 74 68 72 65 65 2e 3c 2f  ose any three.</
2bc0: 64 69 76 3e 0a 0a 20 20 20 20 3c 74 61 62 6c 65  div>..    <table
2bd0: 20 77 69 64 74 68 3d 31 30 30 25 20 63 6c 61 73   width=100% clas
2be0: 73 3d 22 6d 65 6e 75 62 61 72 22 3e 3c 74 72 3e  s="menubar"><tr>
2bf0: 3c 74 64 3e 0a 20 20 3c 74 61 62 6c 65 20 77 69  <td>.  <table wi
2c00: 64 74 68 3d 31 30 30 25 20 73 74 79 6c 65 3d 22  dth=100% style="
2c10: 70 61 64 64 69 6e 67 3a 30 3b 6d 61 72 67 69 6e  padding:0;margin
2c20: 3a 30 3b 63 65 6c 6c 2d 73 70 61 63 69 6e 67 3a  :0;cell-spacing:
2c30: 30 22 3e 3c 74 72 3e 0a 20 20 3c 74 64 20 77 69  0"><tr>.  <td wi
2c40: 64 74 68 3d 31 30 30 25 3e 0a 20 20 3c 64 69 76  dth=100%>.  <div
2c50: 20 63 6c 61 73 73 3d 22 74 6f 6f 6c 62 61 72 22   class="toolbar"
2c60: 3e 0a 20 20 20 20 3c 61 20 68 72 65 66 3d 22 61  >.    <a href="a
2c70: 62 6f 75 74 2e 68 74 6d 6c 22 3e 41 62 6f 75 74  bout.html">About
2c80: 3c 2f 61 3e 0a 20 20 20 20 3c 61 20 68 72 65 66  </a>.    <a href
2c90: 3d 22 73 69 74 65 6d 61 70 2e 68 74 6d 6c 22 3e  ="sitemap.html">
2ca0: 53 69 74 65 6d 61 70 3c 2f 61 3e 0a 20 20 20 20  Sitemap</a>.    
2cb0: 3c 61 20 68 72 65 66 3d 22 64 6f 63 73 2e 68 74  <a href="docs.ht
2cc0: 6d 6c 22 3e 44 6f 63 75 6d 65 6e 74 61 74 69 6f  ml">Documentatio
2cd0: 6e 3c 2f 61 3e 0a 20 20 20 20 3c 61 20 68 72 65  n</a>.    <a hre
2ce0: 66 3d 22 64 6f 77 6e 6c 6f 61 64 2e 68 74 6d 6c  f="download.html
2cf0: 22 3e 44 6f 77 6e 6c 6f 61 64 3c 2f 61 3e 0a 20  ">Download</a>. 
2d00: 20 20 20 3c 61 20 68 72 65 66 3d 22 63 6f 70 79     <a href="copy
2d10: 72 69 67 68 74 2e 68 74 6d 6c 22 3e 4c 69 63 65  right.html">Lice
2d20: 6e 73 65 3c 2f 61 3e 0a 20 20 20 20 3c 61 20 68  nse</a>.    <a h
2d30: 72 65 66 3d 22 6e 65 77 73 2e 68 74 6d 6c 22 3e  ref="news.html">
2d40: 4e 65 77 73 3c 2f 61 3e 0a 20 20 20 20 3c 61 20  News</a>.    <a 
2d50: 68 72 65 66 3d 22 73 75 70 70 6f 72 74 2e 68 74  href="support.ht
2d60: 6d 6c 22 3e 53 75 70 70 6f 72 74 3c 2f 61 3e 0a  ml">Support</a>.
2d70: 20 20 3c 2f 64 69 76 3e 0a 3c 74 64 3e 0a 20 20    </div>.<td>.  
2d80: 20 20 3c 64 69 76 20 73 74 79 6c 65 3d 22 70 61    <div style="pa
2d90: 64 64 69 6e 67 3a 30 20 31 65 6d 20 30 70 78 20  dding:0 1em 0px 
2da0: 30 3b 77 68 69 74 65 2d 73 70 61 63 65 3a 6e 6f  0;white-space:no
2db0: 77 72 61 70 22 3e 0a 20 20 20 20 3c 66 6f 72 6d  wrap">.    <form
2dc0: 20 6e 61 6d 65 3d 66 20 6d 65 74 68 6f 64 3d 22   name=f method="
2dd0: 47 45 54 22 20 61 63 74 69 6f 6e 3d 22 68 74 74  GET" action="htt
2de0: 70 73 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e  ps://www.sqlite.
2df0: 6f 72 67 2f 73 65 61 72 63 68 22 3e 0a 20 20 20  org/search">.   
2e00: 20 20 20 3c 69 6e 70 75 74 20 69 64 3d 71 20 6e     <input id=q n
2e10: 61 6d 65 3d 71 20 74 79 70 65 3d 74 65 78 74 20  ame=q type=text 
2e20: 76 61 6c 75 65 3d 22 22 0a 20 20 20 20 20 20 20  value="".       
2e30: 6f 6e 66 6f 63 75 73 3d 22 65 6e 74 65 72 73 65  onfocus="enterse
2e40: 61 72 63 68 28 29 22 20 6f 6e 62 6c 75 72 3d 22  arch()" onblur="
2e50: 6c 65 61 76 65 73 65 61 72 63 68 28 29 22 20 73  leavesearch()" s
2e60: 74 79 6c 65 3d 22 77 69 64 74 68 3a 32 34 65 78  tyle="width:24ex
2e70: 3b 70 61 64 64 69 6e 67 3a 31 70 78 20 31 65 78  ;padding:1px 1ex
2e80: 3b 20 62 6f 72 64 65 72 3a 73 6f 6c 69 64 20 77  ; border:solid w
2e90: 68 69 74 65 20 31 70 78 3b 20 66 6f 6e 74 2d 73  hite 1px; font-s
2ea0: 69 7a 65 3a 30 2e 39 65 6d 22 3e 0a 20 20 20 20  ize:0.9em">.    
2eb0: 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 73 75    <input type=su
2ec0: 62 6d 69 74 20 76 61 6c 75 65 3d 22 47 6f 22 20  bmit value="Go" 
2ed0: 73 74 79 6c 65 3d 22 62 6f 72 64 65 72 3a 73 6f  style="border:so
2ee0: 6c 69 64 20 77 68 69 74 65 20 31 70 78 3b 62 61  lid white 1px;ba
2ef0: 63 6b 67 72 6f 75 6e 64 2d 63 6f 6c 6f 72 3a 23  ckground-color:#
2f00: 30 34 34 61 36 34 3b 63 6f 6c 6f 72 3a 77 68 69  044a64;color:whi
2f10: 74 65 3b 66 6f 6e 74 2d 73 69 7a 65 3a 30 2e 39  te;font-size:0.9
2f20: 65 6d 3b 70 61 64 64 69 6e 67 3a 30 20 31 65 78  em;padding:0 1ex
2f30: 22 3e 0a 20 20 20 20 3c 2f 66 6f 72 6d 3e 0a 20  ">.    </form>. 
2f40: 20 20 20 3c 2f 64 69 76 3e 0a 20 20 3c 2f 74 61     </div>.  </ta
2f50: 62 6c 65 3e 0a 3c 2f 64 69 76 3e 3c 2f 64 69 76  ble>.</div></div
2f60: 3e 3c 2f 64 69 76 3e 3c 2f 64 69 76 3e 0a 3c 2f  ></div></div>.</
2f70: 74 64 3e 3c 2f 74 72 3e 3c 2f 74 61 62 6c 65 3e  td></tr></table>
2f80: 0a 20 20 0a 3c 73 63 72 69 70 74 3e 0a 20 20 67  .  .<script>.  g
2f90: 4d 73 67 20 3d 20 22 53 65 61 72 63 68 20 53 51  Msg = "Search SQ
2fa0: 4c 69 74 65 20 44 6f 63 73 2e 2e 2e 22 0a 20 20  Lite Docs...".  
2fb0: 66 75 6e 63 74 69 6f 6e 20 65 6e 74 65 72 73 65  function enterse
2fc0: 61 72 63 68 28 29 20 7b 0a 20 20 20 20 76 61 72  arch() {.    var
2fd0: 20 71 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65   q = document.ge
2fe0: 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 22 71 22  tElementById("q"
2ff0: 29 3b 0a 20 20 20 20 69 66 28 20 71 2e 76 61 6c  );.    if( q.val
3000: 75 65 20 3d 3d 20 67 4d 73 67 20 29 20 7b 20 71  ue == gMsg ) { q
3010: 2e 76 61 6c 75 65 20 3d 20 22 22 20 7d 0a 20 20  .value = "" }.  
3020: 20 20 71 2e 73 74 79 6c 65 2e 63 6f 6c 6f 72 20    q.style.color 
3030: 3d 20 22 62 6c 61 63 6b 22 0a 20 20 20 20 71 2e  = "black".    q.
3040: 73 74 79 6c 65 2e 66 6f 6e 74 53 74 79 6c 65 20  style.fontStyle 
3050: 3d 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 7d 0a 20  = "normal".  }. 
3060: 20 66 75 6e 63 74 69 6f 6e 20 6c 65 61 76 65 73   function leaves
3070: 65 61 72 63 68 28 29 20 7b 0a 20 20 20 20 76 61  earch() {.    va
3080: 72 20 71 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67  r q = document.g
3090: 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 22 71  etElementById("q
30a0: 22 29 3b 0a 20 20 20 20 69 66 28 20 71 2e 76 61  ");.    if( q.va
30b0: 6c 75 65 20 3d 3d 20 22 22 20 29 20 7b 20 0a 20  lue == "" ) { . 
30c0: 20 20 20 20 20 71 2e 76 61 6c 75 65 20 3d 20 67       q.value = g
30d0: 4d 73 67 0a 20 20 20 20 20 20 71 2e 73 74 79 6c  Msg.      q.styl
30e0: 65 2e 63 6f 6c 6f 72 20 3d 20 22 23 30 34 34 61  e.color = "#044a
30f0: 36 34 22 0a 20 20 20 20 20 20 71 2e 73 74 79 6c  64".      q.styl
3100: 65 2e 66 6f 6e 74 53 74 79 6c 65 20 3d 20 22 69  e.fontStyle = "i
3110: 74 61 6c 69 63 22 0a 20 20 20 20 7d 0a 20 20 7d  talic".    }.  }
3120: 0a 20 20 66 75 6e 63 74 69 6f 6e 20 69 6e 69 74  .  function init
3130: 73 65 61 72 63 68 28 29 20 7b 0a 20 20 20 20 76  search() {.    v
3140: 61 72 20 71 20 3d 20 64 6f 63 75 6d 65 6e 74 2e  ar q = document.
3150: 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 22  getElementById("
3160: 71 22 29 3b 0a 20 20 20 20 71 2e 76 61 6c 75 65  q");.    q.value
3170: 20 3d 20 22 22 0a 20 20 20 20 20 20 71 2e 76 61   = "".      q.va
3180: 6c 75 65 20 3d 20 24 3a 3a 49 4e 49 54 53 45 41  lue = $::INITSEA
3190: 52 43 48 0a 20 20 20 20 20 20 71 2e 73 74 79 6c  RCH.      q.styl
31a0: 65 2e 63 6f 6c 6f 72 20 3d 20 22 62 6c 61 63 6b  e.color = "black
31b0: 22 0a 20 20 20 20 20 20 71 2e 73 74 79 6c 65 2e  ".      q.style.
31c0: 66 6f 6e 74 53 74 79 6c 65 20 3d 20 22 6e 6f 72  fontStyle = "nor
31d0: 6d 61 6c 22 0a 20 20 7d 0a 20 20 77 69 6e 64 6f  mal".  }.  windo
31e0: 77 2e 6f 6e 6c 6f 61 64 20 3d 20 69 6e 69 74 73  w.onload = inits
31f0: 65 61 72 63 68 0a 3c 2f 73 63 72 69 70 74 3e 0a  earch.</script>.
3200: 7d 0a 0a 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  }..if {![info ex
3210: 69 73 74 73 20 65 6e 76 28 52 45 51 55 45 53 54  ists env(REQUEST
3220: 5f 4d 45 54 48 4f 44 29 5d 7d 20 7b 0a 20 20 73  _METHOD)]} {.  s
3230: 65 74 20 65 6e 76 28 52 45 51 55 45 53 54 5f 4d  et env(REQUEST_M
3240: 45 54 48 4f 44 29 20 47 45 54 0a 20 20 73 65 74  ETHOD) GET.  set
3250: 20 65 6e 76 28 51 55 45 52 59 5f 53 54 52 49 4e   env(QUERY_STRIN
3260: 47 29 20 72 65 62 75 69 6c 64 3d 31 0a 20 20 73  G) rebuild=1.  s
3270: 65 74 20 3a 3a 48 45 41 44 45 52 20 22 22 0a 0a  et ::HEADER ""..
3280: 20 20 23 73 65 74 20 65 6e 76 28 51 55 45 52 59    #set env(QUERY
3290: 5f 53 54 52 49 4e 47 29 20 7b 71 3d 22 6f 6e 65  _STRING) {q="one
32a0: 2b 74 77 6f 2b 74 68 72 65 65 2b 66 6f 75 72 22  +two+three+four"
32b0: 2b 65 6c 65 76 65 6e 7d 0a 20 20 73 65 74 20 65  +eleven}.  set e
32c0: 6e 76 28 51 55 45 52 59 5f 53 54 52 49 4e 47 29  nv(QUERY_STRING)
32d0: 20 7b 71 3d 77 69 6e 64 6f 77 73 7d 0a 20 20 73   {q=windows}.  s
32e0: 65 74 20 3a 3a 48 45 41 44 45 52 20 22 22 0a 7d  et ::HEADER "".}
32f0: 0a 0a 0a 73 65 74 20 54 49 54 4c 45 20 22 53 65  ...set TITLE "Se
3300: 61 72 63 68 20 53 51 4c 69 74 65 20 44 6f 63 75  arch SQLite Docu
3310: 6d 65 6e 74 61 74 69 6f 6e 22 0a 0a 69 66 20 7b  mentation"..if {
3320: 30 3d 3d 5b 63 61 74 63 68 20 6d 61 69 6e 20 72  0==[catch main r
3330: 65 73 5d 7d 20 7b 0a 20 20 69 66 20 7b 5b 69 6e  es]} {.  if {[in
3340: 66 6f 20 65 78 69 73 74 73 20 3a 3a 41 28 71 29  fo exists ::A(q)
3350: 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 49  ]} {.    set ::I
3360: 4e 49 54 53 45 41 52 43 48 20 5c 22 5b 61 74 74  NITSEARCH \"[att
3370: 72 69 7a 65 20 24 3a 3a 41 28 71 29 5d 5c 22 0a  rize $::A(q)]\".
3380: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73    } else {.    s
3390: 65 74 20 3a 3a 49 4e 49 54 53 45 41 52 43 48 20  et ::INITSEARCH 
33a0: 5c 22 5c 22 0a 20 20 7d 0a 20 20 73 65 74 20 64  \"\".  }.  set d
33b0: 6f 63 75 6d 65 6e 74 20 5b 73 75 62 73 74 20 2d  ocument [subst -
33c0: 6e 6f 63 6f 6d 6d 61 6e 64 73 20 24 3a 3a 48 45  nocommands $::HE
33d0: 41 44 45 52 5d 0a 20 20 61 70 70 65 6e 64 20 64  ADER].  append d
33e0: 6f 63 75 6d 65 6e 74 20 24 72 65 73 0a 7d 20 65  ocument $res.} e
33f0: 6c 73 65 20 7b 0a 20 20 73 65 74 20 64 6f 63 75  lse {.  set docu
3400: 6d 65 6e 74 20 22 3c 70 72 65 3e 22 0a 20 20 61  ment "<pre>".  a
3410: 70 70 65 6e 64 20 64 6f 63 75 6d 65 6e 74 20 22  ppend document "
3420: 45 72 72 6f 72 3a 20 24 72 65 73 5c 6e 5c 6e 22  Error: $res\n\n"
3430: 0a 20 20 61 70 70 65 6e 64 20 64 6f 63 75 6d 65  .  append docume
3440: 6e 74 20 24 3a 3a 65 72 72 6f 72 49 6e 66 6f 0a  nt $::errorInfo.
3450: 20 20 61 70 70 65 6e 64 20 64 6f 63 75 6d 65 6e    append documen
3460: 74 20 22 3c 2f 70 72 65 3e 22 0a 7d 0a 0a 70 75  t "</pre>".}..pu
3470: 74 73 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65  ts "Content-type
3480: 3a 20 74 65 78 74 2f 68 74 6d 6c 22 20 0a 70 75  : text/html" .pu
3490: 74 73 20 22 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67  ts "Content-Leng
34a0: 74 68 3a 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  th: [string leng
34b0: 74 68 20 24 64 6f 63 75 6d 65 6e 74 5d 22 0a 70  th $document]".p
34c0: 75 74 73 20 22 22 0a 70 75 74 73 20 24 64 6f 63  uts "".puts $doc
34d0: 75 6d 65 6e 74 0a 70 75 74 73 20 22 22 0a 66 6c  ument.puts "".fl
34e0: 75 73 68 20 73 74 64 6f 75 74 0a 63 6c 6f 73 65  ush stdout.close
34f0: 20 73 74 64 6f 75 74 0a 0a 65 78 69 74 0a         stdout..exit.