/ Hex Artifact Content
Login

Artifact 526a9979c963f1c54fd50976a05a502e533a4c59:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 0a 23 20 32 30 31  ##########.# 201
0050: 36 20 4a 61 6e 20 32 37 0a 23 0a 23 20 54 68 65  6 Jan 27.#.# The
0060: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0070: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0080: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0090: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 23 20    In place of.# 
00a0: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
00b0: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
00c0: 6e 67 3a 0a 23 0a 23 20 20 20 20 4d 61 79 20 79  ng:.#.#    May y
00d0: 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e  ou do good and n
00e0: 6f 74 20 65 76 69 6c 2e 0a 23 20 20 20 20 4d 61  ot evil..#    Ma
00f0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
0100: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
0110: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
0120: 6f 74 68 65 72 73 2e 0a 23 20 20 20 20 4d 61 79  others..#    May
0130: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0140: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0150: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0160: 76 65 2e 0a 23 0a 70 72 6f 63 20 70 72 6f 63 65  ve..#.proc proce
0170: 73 73 5f 63 6d 64 6c 69 6e 65 20 7b 7d 20 7b 20  ss_cmdline {} { 
0180: 0a 20 20 63 6d 64 6c 69 6e 65 3a 3a 70 72 6f 63  .  cmdline::proc
0190: 65 73 73 20 3a 3a 41 20 24 3a 3a 61 72 67 76 20  ess ::A $::argv 
01a0: 7b 0a 20 20 20 20 7b 66 74 73 35 20 20 20 20 20  {.    {fts5     
01b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 75 73 65              "use
01c0: 20 66 74 73 35 20 28 74 68 69 73 20 69 73 20 74   fts5 (this is t
01d0: 68 65 20 64 65 66 61 75 6c 74 29 22 7d 0a 20 20  he default)"}.  
01e0: 20 20 7b 66 74 73 34 20 20 20 20 20 20 20 20 20    {fts4         
01f0: 20 20 20 20 20 20 20 20 22 75 73 65 20 66 74 73          "use fts
0200: 34 22 7d 0a 20 20 20 20 7b 63 6f 6c 73 69 7a 65  4"}.    {colsize
0210: 20 20 20 22 31 30 20 31 30 20 31 30 22 20 22 6c     "10 10 10" "l
0220: 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 73 69  ist of column si
0230: 7a 65 73 22 7d 0a 20 20 20 20 7b 74 62 6c 6e 61  zes"}.    {tblna
0240: 6d 65 20 20 20 22 74 31 22 20 20 20 20 20 20 20  me   "t1"       
0250: 22 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 63  "table name to c
0260: 72 65 61 74 65 22 7d 0a 20 20 20 20 7b 64 65 74  reate"}.    {det
0270: 61 69 6c 20 20 20 20 22 66 75 6c 6c 22 20 20 20  ail    "full"   
0280: 20 20 22 46 74 73 35 20 64 65 74 61 69 6c 20 6d    "Fts5 detail m
0290: 6f 64 65 20 74 6f 20 75 73 65 22 7d 0a 20 20 20  ode to use"}.   
02a0: 20 7b 72 65 70 65 61 74 20 20 20 20 31 20 20 20   {repeat    1   
02b0: 20 20 20 20 20 20 20 22 4c 6f 61 64 20 65 61 63         "Load eac
02c0: 68 20 66 69 6c 65 20 74 68 69 73 20 6d 61 6e 79  h file this many
02d0: 20 74 69 6d 65 73 22 7d 0a 20 20 20 20 7b 70 72   times"}.    {pr
02e0: 65 66 69 78 20 20 20 20 22 22 20 20 20 20 20 20  efix    ""      
02f0: 20 20 20 22 46 74 73 20 70 72 65 66 69 78 3d 20     "Fts prefix= 
0300: 6f 70 74 69 6f 6e 22 7d 0a 20 20 20 20 7b 74 72  option"}.    {tr
0310: 61 6e 73 20 20 20 20 20 31 20 20 20 20 20 20 20  ans     1       
0320: 20 20 20 22 54 72 75 65 20 74 6f 20 75 73 65 20     "True to use 
0330: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 7d 0a  a transaction"}.
0340: 20 20 20 20 64 61 74 61 62 61 73 65 0a 20 20 20      database.   
0350: 20 66 69 6c 65 2e 2e 2e 0a 20 20 7d 20 7b 0a 20   file....  } {. 
0360: 20 54 68 69 73 20 73 63 72 69 70 74 20 69 73 20   This script is 
0370: 64 65 73 69 67 6e 65 64 20 74 6f 20 63 72 65 61  designed to crea
0380: 74 65 20 66 74 73 34 2f 35 20 74 61 62 6c 65 73  te fts4/5 tables
0390: 20 77 69 74 68 20 6d 6f 72 65 20 74 68 61 6e 20   with more than 
03a0: 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 54 68  one column..  Th
03b0: 65 20 2d 63 6f 6c 73 69 7a 65 20 6f 70 74 69 6f  e -colsize optio
03c0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20  n should be set 
03d0: 74 6f 20 61 20 54 63 6c 20 6c 69 73 74 20 6f 66  to a Tcl list of
03e0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 2c   integer values,
03f0: 20 6f 6e 65 20 66 6f 72 0a 20 20 65 61 63 68 20   one for.  each 
0400: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
0410: 62 6c 65 2e 20 45 61 63 68 20 76 61 6c 75 65 20  ble. Each value 
0420: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
0430: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 77 69 6c   tokens that wil
0440: 6c 20 62 65 0a 20 20 69 6e 73 65 72 74 65 64 20  l be.  inserted 
0450: 69 6e 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  into the column 
0460: 76 61 6c 75 65 20 66 6f 72 20 65 61 63 68 20 72  value for each r
0470: 6f 77 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ow. For example,
0480: 20 73 65 74 74 69 6e 67 20 74 68 65 20 2d 63 6f   setting the -co
0490: 6c 73 69 7a 65 0a 20 20 6f 70 74 69 6f 6e 20 74  lsize.  option t
04a0: 6f 20 22 35 20 31 30 22 20 63 72 65 61 74 65 73  o "5 10" creates
04b0: 20 61 6e 20 46 54 53 20 74 61 62 6c 65 20 77 69   an FTS table wi
04c0: 74 68 20 32 20 63 6f 6c 75 6d 6e 73 2c 20 77 69  th 2 columns, wi
04d0: 74 68 20 72 6f 75 67 68 6c 79 20 35 20 61 6e 64  th roughly 5 and
04e0: 20 31 30 0a 20 20 74 6f 6b 65 6e 73 20 70 65 72   10.  tokens per
04f0: 20 72 6f 77 20 69 6e 20 65 61 63 68 2c 20 72 65   row in each, re
0500: 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 0a 20  spectively..  . 
0510: 20 45 61 63 68 20 22 46 49 4c 45 22 20 61 72 67   Each "FILE" arg
0520: 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20  ument should be 
0530: 61 20 74 65 78 74 20 66 69 6c 65 2e 20 54 68 65  a text file. The
0540: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
0550: 73 65 20 74 65 78 74 20 66 69 6c 65 73 0a 20 20  se text files.  
0560: 69 73 20 73 70 6c 69 74 20 6f 6e 20 77 68 69 74  is split on whit
0570: 65 73 70 61 63 65 20 63 68 61 72 61 63 74 65 72  espace character
0580: 73 20 74 6f 20 66 6f 72 6d 20 61 20 6c 69 73 74  s to form a list
0590: 20 6f 66 20 74 6f 6b 65 6e 73 2e 20 54 68 65 20   of tokens. The 
05a0: 66 69 72 73 74 20 4e 31 0a 20 20 74 6f 6b 65 6e  first N1.  token
05b0: 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  s are used for t
05c0: 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  he first column 
05d0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
05e0: 2c 20 77 68 65 72 65 20 4e 31 20 69 73 20 74 68  , where N1 is th
05f0: 65 20 66 69 72 73 74 0a 20 20 65 6c 65 6d 65 6e  e first.  elemen
0600: 74 20 6f 66 20 74 68 65 20 2d 63 6f 6c 73 69 7a  t of the -colsiz
0610: 65 20 6c 69 73 74 2e 20 54 68 65 20 6e 65 78 74  e list. The next
0620: 20 4e 32 20 61 72 65 20 75 73 65 64 20 66 6f 72   N2 are used for
0630: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 6f 6c 75   the second colu
0640: 6d 6e 20 6f 66 0a 20 20 74 68 65 20 66 69 72 73  mn of.  the firs
0650: 74 20 72 6f 77 2c 20 61 6e 64 20 73 6f 20 6f 6e  t row, and so on
0660: 2e 20 52 6f 77 73 20 61 72 65 20 61 64 64 65 64  . Rows are added
0670: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
0680: 74 69 6c 20 74 68 65 20 65 6e 74 69 72 65 20 6c  til the entire l
0690: 69 73 74 0a 20 20 6f 66 20 74 6f 6b 65 6e 73 20  ist.  of tokens 
06a0: 69 73 20 65 78 68 61 75 73 74 65 64 2e 0a 20 20  is exhausted..  
06b0: 7d 0a 7d 0a 0a 23 23 23 23 23 23 23 23 23 23 23  }.}..###########
06c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
06d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
06e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
06f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0700: 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  .###############
0710: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0720: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0730: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0740: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 43  ############.# C
0750: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69  ommand line opti
0760: 6f 6e 73 20 70 72 6f 63 65 73 73 6f 72 2e 20 54  ons processor. T
0770: 68 69 73 20 69 73 20 67 65 6e 65 72 69 63 20 63  his is generic c
0780: 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ode that can be 
0790: 63 6f 70 69 65 64 0a 23 20 62 65 74 77 65 65 6e  copied.# between
07a0: 20 73 63 72 69 70 74 73 2e 0a 23 0a 6e 61 6d 65   scripts..#.name
07b0: 73 70 61 63 65 20 65 76 61 6c 20 63 6d 64 6c 69  space eval cmdli
07c0: 6e 65 20 7b 0a 20 20 70 72 6f 63 20 63 6d 64 6c  ne {.  proc cmdl
07d0: 69 6e 65 5f 65 72 72 6f 72 20 7b 4f 20 45 20 7b  ine_error {O E {
07e0: 6d 73 67 20 22 22 7d 7d 20 7b 0a 20 20 20 20 69  msg ""}} {.    i
07f0: 66 20 7b 24 6d 73 67 20 21 3d 20 22 22 7d 20 7b  f {$msg != ""} {
0800: 0a 20 20 20 20 20 20 70 75 74 73 20 73 74 64 65  .      puts stde
0810: 72 72 20 22 45 72 72 6f 72 3a 20 24 6d 73 67 22  rr "Error: $msg"
0820: 0a 20 20 20 20 20 20 70 75 74 73 20 73 74 64 65  .      puts stde
0830: 72 72 20 22 22 0a 20 20 20 20 7d 0a 20 20 0a 20  rr "".    }.  . 
0840: 20 20 20 73 65 74 20 4c 20 5b 6c 69 73 74 5d 0a     set L [list].
0850: 20 20 20 20 66 6f 72 65 61 63 68 20 6f 20 24 4f      foreach o $O
0860: 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c   {.      if {[ll
0870: 65 6e 67 74 68 20 24 6f 5d 3d 3d 31 7d 20 7b 0a  ength $o]==1} {.
0880: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
0890: 4c 20 5b 73 74 72 69 6e 67 20 74 6f 75 70 70 65  L [string touppe
08a0: 72 20 24 6f 5d 0a 20 20 20 20 20 20 7d 0a 20 20  r $o].      }.  
08b0: 20 20 7d 0a 20 20 0a 20 20 20 20 70 75 74 73 20    }.  .    puts 
08c0: 73 74 64 65 72 72 20 22 55 73 61 67 65 3a 20 24  stderr "Usage: $
08d0: 3a 3a 61 72 67 76 30 20 3f 53 57 49 54 43 48 45  ::argv0 ?SWITCHE
08e0: 53 3f 20 24 4c 22 0a 20 20 20 20 70 75 74 73 20  S? $L".    puts 
08f0: 73 74 64 65 72 72 20 22 22 0a 20 20 20 20 70 75  stderr "".    pu
0900: 74 73 20 73 74 64 65 72 72 20 22 53 77 69 74 63  ts stderr "Switc
0910: 68 65 73 20 61 72 65 3a 22 0a 20 20 20 20 66 6f  hes are:".    fo
0920: 72 65 61 63 68 20 6f 20 24 4f 20 7b 0a 20 20 20  reach o $O {.   
0930: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
0940: 24 6f 5d 3d 3d 33 7d 20 7b 0a 20 20 20 20 20 20  $o]==3} {.      
0950: 20 20 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63    foreach {a b c
0960: 7d 20 24 6f 20 7b 7d 0a 20 20 20 20 20 20 20 20  } $o {}.        
0970: 70 75 74 73 20 73 74 64 65 72 72 20 5b 66 6f 72  puts stderr [for
0980: 6d 61 74 20 22 20 20 20 20 2d 25 2d 31 35 73 20  mat "    -%-15s 
0990: 25 73 20 28 64 65 66 61 75 6c 74 20 5c 22 25 73  %s (default \"%s
09a0: 5c 22 29 22 20 22 24 61 20 56 41 4c 22 20 24 63  \")" "$a VAL" $c
09b0: 20 24 62 5d 0a 20 20 20 20 20 20 7d 20 65 6c 73   $b].      } els
09c0: 65 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6f  eif {[llength $o
09d0: 5d 3d 3d 32 7d 20 7b 0a 20 20 20 20 20 20 20 20  ]==2} {.        
09e0: 66 6f 72 65 61 63 68 20 7b 61 20 62 7d 20 24 6f  foreach {a b} $o
09f0: 20 7b 7d 0a 20 20 20 20 20 20 20 20 70 75 74 73   {}.        puts
0a00: 20 73 74 64 65 72 72 20 5b 66 6f 72 6d 61 74 20   stderr [format 
0a10: 22 20 20 20 20 2d 25 2d 31 35 73 20 25 73 22 20  "    -%-15s %s" 
0a20: 24 61 20 24 62 5d 0a 20 20 20 20 20 20 7d 0a 20  $a $b].      }. 
0a30: 20 20 20 7d 0a 20 20 20 20 70 75 74 73 20 73 74     }.    puts st
0a40: 64 65 72 72 20 22 22 0a 20 20 20 20 70 75 74 73  derr "".    puts
0a50: 20 73 74 64 65 72 72 20 24 45 0a 20 20 20 20 65   stderr $E.    e
0a60: 78 69 74 20 2d 31 0a 20 20 7d 0a 20 20 0a 20 20  xit -1.  }.  .  
0a70: 70 72 6f 63 20 70 72 6f 63 65 73 73 20 7b 61 76  proc process {av
0a80: 61 72 20 6c 41 72 67 73 20 4f 20 45 7d 20 7b 0a  ar lArgs O E} {.
0a90: 20 20 20 20 75 70 76 61 72 20 24 61 76 61 72 20      upvar $avar 
0aa0: 41 0a 20 20 20 20 73 65 74 20 7a 54 72 61 69 6c  A.    set zTrail
0ab0: 69 6e 67 20 22 22 20 20 20 20 20 20 20 3b 23 20  ing ""       ;# 
0ac0: 54 72 75 65 20 69 66 20 2e 2e 2e 20 69 73 20 70  True if ... is p
0ad0: 72 65 73 65 6e 74 20 69 6e 20 24 4f 0a 20 20 20  resent in $O.   
0ae0: 20 73 65 74 20 6c 50 6f 73 61 72 67 73 20 5b 6c   set lPosargs [l
0af0: 69 73 74 5d 0a 20 20 0a 20 20 20 20 23 20 50 6f  ist].  .    # Po
0b00: 70 75 6c 61 74 65 20 41 28 29 20 77 69 74 68 20  pulate A() with 
0b10: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2e 20  default values. 
0b20: 41 6c 73 6f 2c 20 66 6f 72 20 65 61 63 68 20 73  Also, for each s
0b30: 77 69 74 63 68 20 69 6e 20 74 68 65 20 63 6f 6d  witch in the com
0b40: 6d 61 6e 64 0a 20 20 20 20 23 20 6c 69 6e 65 20  mand.    # line 
0b50: 73 70 65 63 2c 20 73 65 74 20 61 6e 20 65 6e 74  spec, set an ent
0b60: 72 79 20 69 6e 20 74 68 65 20 69 64 78 28 29 20  ry in the idx() 
0b70: 61 72 72 61 79 20 61 73 20 66 6f 6c 6c 6f 77 73  array as follows
0b80: 3a 0a 20 20 20 20 23 0a 20 20 20 20 23 20 20 7b  :.    #.    #  {
0b90: 74 62 6c 6e 61 6d 65 20 74 31 20 22 74 61 62 6c  tblname t1 "tabl
0ba0: 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 22 7d 20  e name to use"} 
0bb0: 20 0a 20 20 20 20 23 20 20 20 20 20 20 2d 3e 20   .    #      -> 
0bc0: 5b 73 65 74 20 69 64 78 28 2d 74 62 6c 6e 61 6d  [set idx(-tblnam
0bd0: 65 29 20 7b 74 62 6c 6e 61 6d 65 20 74 31 20 22  e) {tblname t1 "
0be0: 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73  table name to us
0bf0: 65 22 7d 20 20 0a 20 20 20 20 23 0a 20 20 20 20  e"}  .    #.    
0c00: 23 20 46 6f 72 20 65 61 63 68 20 70 6f 73 69 74  # For each posit
0c10: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 2c 20 61  ion parameter, a
0c20: 70 70 65 6e 64 20 69 74 73 20 6e 61 6d 65 20 74  ppend its name t
0c30: 6f 20 24 6c 50 6f 73 61 72 67 73 2e 20 49 66 20  o $lPosargs. If 
0c40: 74 68 65 20 2e 2e 2e 0a 20 20 20 20 23 20 73 70  the ....    # sp
0c50: 65 63 69 66 69 65 72 20 69 73 20 70 72 65 73 65  ecifier is prese
0c60: 6e 74 2c 20 73 65 74 20 24 7a 54 72 61 69 6c 69  nt, set $zTraili
0c70: 6e 67 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f  ng to the name o
0c80: 66 20 74 68 65 20 70 72 65 66 69 78 2e 0a 20 20  f the prefix..  
0c90: 20 20 23 0a 20 20 20 20 66 6f 72 65 61 63 68 20    #.    foreach 
0ca0: 6f 20 24 4f 20 7b 0a 20 20 20 20 20 20 73 65 74  o $O {.      set
0cb0: 20 6e 6d 20 5b 6c 69 6e 64 65 78 20 24 6f 20 30   nm [lindex $o 0
0cc0: 5d 0a 20 20 20 20 20 20 73 65 74 20 6e 41 72 67  ].      set nArg
0cd0: 20 5b 6c 6c 65 6e 67 74 68 20 24 6f 5d 0a 20 20   [llength $o].  
0ce0: 20 20 20 20 73 77 69 74 63 68 20 2d 2d 20 24 6e      switch -- $n
0cf0: 41 72 67 20 7b 0a 20 20 20 20 20 20 20 20 31 20  Arg {.        1 
0d00: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  {.          if {
0d10: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 6e  [string range $n
0d20: 6d 20 65 6e 64 2d 32 20 65 6e 64 5d 3d 3d 22 2e  m end-2 end]==".
0d30: 2e 2e 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  .."} {.         
0d40: 20 20 20 73 65 74 20 7a 54 72 61 69 6c 69 6e 67     set zTrailing
0d50: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
0d60: 6e 6d 20 30 20 65 6e 64 2d 33 5d 0a 20 20 20 20  nm 0 end-3].    
0d70: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
0d80: 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
0d90: 6e 64 20 6c 50 6f 73 61 72 67 73 20 24 6e 6d 0a  nd lPosargs $nm.
0da0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
0db0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 32 20      }.        2 
0dc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  {.          set 
0dd0: 41 28 24 6e 6d 29 20 30 0a 20 20 20 20 20 20 20  A($nm) 0.       
0de0: 20 20 20 73 65 74 20 69 64 78 28 2d 24 6e 6d 29     set idx(-$nm)
0df0: 20 24 6f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   $o.        }.  
0e00: 20 20 20 20 20 20 33 20 7b 0a 20 20 20 20 20 20        3 {.      
0e10: 20 20 20 20 73 65 74 20 41 28 24 6e 6d 29 20 5b      set A($nm) [
0e20: 6c 69 6e 64 65 78 20 24 6f 20 31 5d 0a 20 20 20  lindex $o 1].   
0e30: 20 20 20 20 20 20 20 73 65 74 20 69 64 78 28 2d         set idx(-
0e40: 24 6e 6d 29 20 24 6f 0a 20 20 20 20 20 20 20 20  $nm) $o.        
0e50: 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  }.        defaul
0e60: 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20 65 72  t {.          er
0e70: 72 6f 72 20 22 45 72 72 6f 72 20 69 6e 20 63 6f  ror "Error in co
0e80: 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 70 65 63 69  mmand line speci
0e90: 66 69 63 61 74 69 6f 6e 22 0a 20 20 20 20 20 20  fication".      
0ea0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
0eb0: 7d 0a 20 20 0a 20 20 20 20 23 20 53 65 74 20 65  }.  .    # Set e
0ec0: 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
0ed0: 69 65 64 20 6f 70 74 69 6f 6e 20 76 61 6c 75 65  ied option value
0ee0: 73 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74 20  s.    #.    set 
0ef0: 6e 41 72 67 20 5b 6c 6c 65 6e 67 74 68 20 24 6c  nArg [llength $l
0f00: 41 72 67 73 5d 0a 20 20 20 20 66 6f 72 20 7b 73  Args].    for {s
0f10: 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 24 6e  et i 0} {$i < $n
0f20: 41 72 67 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  Arg} {incr i} {.
0f30: 20 20 20 20 20 20 73 65 74 20 6f 70 74 20 5b 6c        set opt [l
0f40: 69 6e 64 65 78 20 24 6c 41 72 67 73 20 24 69 5d  index $lArgs $i]
0f50: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
0f60: 6e 67 20 72 61 6e 67 65 20 24 6f 70 74 20 30 20  ng range $opt 0 
0f70: 30 5d 21 3d 22 2d 22 20 7c 7c 20 24 6f 70 74 3d  0]!="-" || $opt=
0f80: 3d 22 2d 2d 22 7d 20 62 72 65 61 6b 0a 20 20 20  ="--"} break.   
0f90: 20 20 20 73 65 74 20 63 20 5b 61 72 72 61 79 20     set c [array 
0fa0: 6e 61 6d 65 73 20 69 64 78 20 22 24 7b 6f 70 74  names idx "${opt
0fb0: 7d 2a 22 5d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }*"].      if {[
0fc0: 6c 6c 65 6e 67 74 68 20 24 63 5d 3d 3d 30 7d 20  llength $c]==0} 
0fd0: 7b 20 63 6d 64 6c 69 6e 65 5f 65 72 72 6f 72 20  { cmdline_error 
0fe0: 24 4f 20 24 45 20 22 55 6e 72 65 63 6f 67 6e 69  $O $E "Unrecogni
0ff0: 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 24 6f 70 74  zed option: $opt
1000: 22 7d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c  "}.      if {[ll
1010: 65 6e 67 74 68 20 24 63 5d 3e 31 7d 20 20 7b 20  ength $c]>1}  { 
1020: 63 6d 64 6c 69 6e 65 5f 65 72 72 6f 72 20 24 4f  cmdline_error $O
1030: 20 24 45 20 22 41 6d 62 69 67 75 6f 75 73 20 6f   $E "Ambiguous o
1040: 70 74 69 6f 6e 3a 20 24 6f 70 74 22 7d 0a 20 20  ption: $opt"}.  
1050: 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e  .      if {[llen
1060: 67 74 68 20 24 69 64 78 28 24 63 29 5d 3d 3d 33  gth $idx($c)]==3
1070: 7d 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b  } {.        if {
1080: 24 69 3d 3d 5b 6c 6c 65 6e 67 74 68 20 24 6c 41  $i==[llength $lA
1090: 72 67 73 5d 2d 31 7d 20 7b 0a 20 20 20 20 20 20  rgs]-1} {.      
10a0: 20 20 20 20 63 6d 64 6c 69 6e 65 5f 65 72 72 6f      cmdline_erro
10b0: 72 20 24 4f 20 24 45 20 22 4f 70 74 69 6f 6e 20  r $O $E "Option 
10c0: 72 65 71 75 69 72 65 73 20 61 72 67 75 6d 65 6e  requires argumen
10d0: 74 3a 20 24 63 22 20 0a 20 20 20 20 20 20 20 20  t: $c" .        
10e0: 7d 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 69  }.        incr i
10f0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 41 28 5b  .        set A([
1100: 6c 69 6e 64 65 78 20 24 69 64 78 28 24 63 29 20  lindex $idx($c) 
1110: 30 5d 29 20 5b 6c 69 6e 64 65 78 20 24 6c 41 72  0]) [lindex $lAr
1120: 67 73 20 24 69 5d 0a 20 20 20 20 20 20 7d 20 65  gs $i].      } e
1130: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 65  lse {.        se
1140: 74 20 41 28 5b 6c 69 6e 64 65 78 20 24 69 64 78  t A([lindex $idx
1150: 28 24 63 29 20 30 5d 29 20 31 0a 20 20 20 20 20  ($c) 0]) 1.     
1160: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1170: 23 20 44 65 61 6c 20 77 69 74 68 20 70 6f 73 69  # Deal with posi
1180: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 2e 0a  tion arguments..
1190: 20 20 20 20 23 0a 20 20 20 20 73 65 74 20 6e 50      #.    set nP
11a0: 6f 73 61 72 67 20 5b 6c 6c 65 6e 67 74 68 20 24  osarg [llength $
11b0: 6c 50 6f 73 61 72 67 73 5d 0a 20 20 20 20 73 65  lPosargs].    se
11c0: 74 20 6e 52 65 6d 20 5b 65 78 70 72 20 24 6e 41  t nRem [expr $nA
11d0: 72 67 20 2d 20 24 69 5d 0a 20 20 20 20 69 66 20  rg - $i].    if 
11e0: 7b 24 6e 52 65 6d 20 3c 20 24 6e 50 6f 73 61 72  {$nRem < $nPosar
11f0: 67 20 7c 7c 20 28 24 7a 54 72 61 69 6c 69 6e 67  g || ($zTrailing
1200: 3d 3d 22 22 20 26 26 20 24 6e 52 65 6d 20 3e 20  =="" && $nRem > 
1210: 24 6e 50 6f 73 61 72 67 29 7d 20 7b 0a 20 20 20  $nPosarg)} {.   
1220: 20 20 20 63 6d 64 6c 69 6e 65 5f 65 72 72 6f 72     cmdline_error
1230: 20 24 4f 20 24 45 0a 20 20 20 20 7d 0a 20 20 20   $O $E.    }.   
1240: 20 66 6f 72 20 7b 73 65 74 20 6a 20 30 7d 20 7b   for {set j 0} {
1250: 24 6a 20 3c 20 24 6e 50 6f 73 61 72 67 7d 20 7b  $j < $nPosarg} {
1260: 69 6e 63 72 20 6a 7d 20 7b 0a 20 20 20 20 20 20  incr j} {.      
1270: 73 65 74 20 41 28 5b 6c 69 6e 64 65 78 20 24 6c  set A([lindex $l
1280: 50 6f 73 61 72 67 73 20 24 6a 5d 29 20 5b 6c 69  Posargs $j]) [li
1290: 6e 64 65 78 20 24 6c 41 72 67 73 20 5b 65 78 70  ndex $lArgs [exp
12a0: 72 20 24 6a 2b 24 69 5d 5d 0a 20 20 20 20 7d 0a  r $j+$i]].    }.
12b0: 20 20 20 20 69 66 20 7b 24 7a 54 72 61 69 6c 69      if {$zTraili
12c0: 6e 67 21 3d 22 22 7d 20 7b 0a 20 20 20 20 20 20  ng!=""} {.      
12d0: 73 65 74 20 41 28 24 7a 54 72 61 69 6c 69 6e 67  set A($zTrailing
12e0: 29 20 5b 6c 72 61 6e 67 65 20 24 6c 41 72 67 73  ) [lrange $lArgs
12f0: 20 5b 65 78 70 72 20 24 6a 2b 24 69 5d 20 65 6e   [expr $j+$i] en
1300: 64 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 3b  d].    }.  }.} ;
1310: 23 20 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c  # namespace eval
1320: 20 63 6d 64 6c 69 6e 65 0a 23 20 45 6e 64 20 6f   cmdline.# End o
1330: 66 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f  f command line o
1340: 70 74 69 6f 6e 73 20 70 72 6f 63 65 73 73 6f 72  ptions processor
1350: 2e 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ..##############
1360: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1370: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1380: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1390: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23  #############.##
13a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13e0: 23 23 23 23 23 23 23 23 23 0a 0a 70 72 6f 63 65  #########..proce
13f0: 73 73 5f 63 6d 64 6c 69 6e 65 0a 0a 23 20 49 66  ss_cmdline..# If
1400: 20 2d 66 74 73 34 20 77 61 73 20 73 70 65 63 69   -fts4 was speci
1410: 66 69 65 64 2c 20 75 73 65 20 66 74 73 34 2e 20  fied, use fts4. 
1420: 4f 74 68 65 72 77 69 73 65 2c 20 66 74 73 35 2e  Otherwise, fts5.
1430: 0a 69 66 20 7b 24 41 28 66 74 73 34 29 7d 20 7b  .if {$A(fts4)} {
1440: 0a 20 20 73 65 74 20 41 28 66 74 73 29 20 66 74  .  set A(fts) ft
1450: 73 34 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 73 65  s4.} else {.  se
1460: 74 20 41 28 66 74 73 29 20 66 74 73 35 0a 7d 0a  t A(fts) fts5.}.
1470: 0a 73 71 6c 69 74 65 33 20 64 62 20 24 41 28 64  .sqlite3 db $A(d
1480: 61 74 61 62 61 73 65 29 0a 0a 23 20 43 72 65 61  atabase)..# Crea
1490: 74 65 20 74 68 65 20 46 54 53 20 74 61 62 6c 65  te the FTS table
14a0: 20 69 6e 20 74 68 65 20 64 62 2e 20 52 65 74 75   in the db. Retu
14b0: 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65  rn a list of the
14c0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 0a   table columns..
14d0: 23 0a 70 72 6f 63 20 63 72 65 61 74 65 5f 74 61  #.proc create_ta
14e0: 62 6c 65 20 7b 7d 20 7b 0a 20 20 67 6c 6f 62 61  ble {} {.  globa
14f0: 6c 20 41 0a 20 20 73 65 74 20 63 6f 6c 73 20 5b  l A.  set cols [
1500: 6c 69 73 74 20 61 20 62 20 63 20 64 20 65 20 66  list a b c d e f
1510: 20 67 20 68 20 69 20 6a 20 6b 20 6c 20 6d 20 6e   g h i j k l m n
1520: 20 6f 20 70 20 71 20 72 20 73 20 74 20 75 20 76   o p q r s t u v
1530: 20 77 20 78 20 79 20 7a 5d 0a 0a 20 20 73 65 74   w x y z]..  set
1540: 20 6e 43 6f 6c 20 5b 6c 6c 65 6e 67 74 68 20 24   nCol [llength $
1550: 41 28 63 6f 6c 73 69 7a 65 29 5d 0a 20 20 73 65  A(colsize)].  se
1560: 74 20 63 6f 6c 73 20 5b 6c 72 61 6e 67 65 20 24  t cols [lrange $
1570: 63 6f 6c 73 20 30 20 5b 65 78 70 72 20 24 6e 43  cols 0 [expr $nC
1580: 6f 6c 2d 31 5d 5d 0a 0a 20 20 73 65 74 20 73 71  ol-1]]..  set sq
1590: 6c 20 20 20 20 22 43 52 45 41 54 45 20 56 49 52  l    "CREATE VIR
15a0: 54 55 41 4c 20 54 41 42 4c 45 20 49 46 20 4e 4f  TUAL TABLE IF NO
15b0: 54 20 45 58 49 53 54 53 20 24 41 28 74 62 6c 6e  T EXISTS $A(tbln
15c0: 61 6d 65 29 20 55 53 49 4e 47 20 24 41 28 66 74  ame) USING $A(ft
15d0: 73 29 20 28 22 0a 20 20 61 70 70 65 6e 64 20 73  s) (".  append s
15e0: 71 6c 20 5b 6a 6f 69 6e 20 24 63 6f 6c 73 20 2c  ql [join $cols ,
15f0: 5d 0a 20 20 69 66 20 7b 24 41 28 66 74 73 29 3d  ].  if {$A(fts)=
1600: 3d 22 66 74 73 35 22 7d 20 7b 20 61 70 70 65 6e  ="fts5"} { appen
1610: 64 20 73 71 6c 20 22 2c 64 65 74 61 69 6c 3d 24  d sql ",detail=$
1620: 41 28 64 65 74 61 69 6c 29 22 20 7d 0a 20 20 61  A(detail)" }.  a
1630: 70 70 65 6e 64 20 73 71 6c 20 22 2c 20 70 72 65  ppend sql ", pre
1640: 66 69 78 3d 27 24 41 28 70 72 65 66 69 78 29 27  fix='$A(prefix)'
1650: 29 3b 22 0a 0a 20 20 64 62 20 65 76 61 6c 20 24  );"..  db eval $
1660: 73 71 6c 0a 20 20 72 65 74 75 72 6e 20 24 63 6f  sql.  return $co
1670: 6c 73 0a 7d 0a 0a 23 20 52 65 74 75 72 6e 20 61  ls.}..# Return a
1680: 20 6c 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73 20   list of tokens 
1690: 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 64 20 66  from the named f
16a0: 69 6c 65 2e 0a 23 0a 70 72 6f 63 20 72 65 61 64  ile..#.proc read
16b0: 66 69 6c 65 20 7b 66 69 6c 65 7d 20 7b 0a 20 20  file {file} {.  
16c0: 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 24 66 69  set fd [open $fi
16d0: 6c 65 5d 0a 20 20 73 65 74 20 64 61 74 61 20 5b  le].  set data [
16e0: 72 65 61 64 20 24 66 64 5d 0a 20 20 63 6c 6f 73  read $fd].  clos
16f0: 65 20 24 66 64 0a 20 20 73 70 6c 69 74 20 24 64  e $fd.  split $d
1700: 61 74 61 0a 7d 0a 0a 70 72 6f 63 20 72 65 70 65  ata.}..proc repe
1710: 61 74 20 7b 4c 20 6e 7d 20 7b 0a 20 20 73 65 74  at {L n} {.  set
1720: 20 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20 66 6f   res [list].  fo
1730: 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20  r {set i 0} {$i 
1740: 3c 20 24 6e 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  < $n} {incr i} {
1750: 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b 63 6f  .    set res [co
1760: 6e 63 61 74 20 24 72 65 73 20 24 4c 5d 0a 20 20  ncat $res $L].  
1770: 7d 0a 20 20 73 65 74 20 72 65 73 0a 7d 0a 0a 0a  }.  set res.}...
1780: 23 20 4c 6f 61 64 20 61 6c 6c 20 74 68 65 20 64  # Load all the d
1790: 61 74 61 20 69 6e 74 6f 20 61 20 62 69 67 20 6c  ata into a big l
17a0: 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73 2e 0a 23  ist of tokens..#
17b0: 0a 73 65 74 20 74 6f 6b 65 6e 73 20 5b 6c 69 73  .set tokens [lis
17c0: 74 5d 0a 66 6f 72 65 61 63 68 20 66 20 24 41 28  t].foreach f $A(
17d0: 66 69 6c 65 29 20 7b 0a 20 20 73 65 74 20 74 6f  file) {.  set to
17e0: 6b 65 6e 73 20 5b 63 6f 6e 63 61 74 20 24 74 6f  kens [concat $to
17f0: 6b 65 6e 73 20 5b 72 65 70 65 61 74 20 5b 72 65  kens [repeat [re
1800: 61 64 66 69 6c 65 20 24 66 5d 20 24 41 28 72 65  adfile $f] $A(re
1810: 70 65 61 74 29 5d 5d 0a 7d 0a 0a 73 65 74 20 4e  peat)]].}..set N
1820: 20 5b 6c 6c 65 6e 67 74 68 20 24 74 6f 6b 65 6e   [llength $token
1830: 73 5d 0a 73 65 74 20 69 20 30 0a 73 65 74 20 63  s].set i 0.set c
1840: 6f 6c 73 20 5b 63 72 65 61 74 65 5f 74 61 62 6c  ols [create_tabl
1850: 65 5d 0a 73 65 74 20 73 71 6c 20 22 49 4e 53 45  e].set sql "INSE
1860: 52 54 20 49 4e 54 4f 20 24 41 28 74 62 6c 6e 61  RT INTO $A(tblna
1870: 6d 65 29 20 56 41 4c 55 45 53 28 5c 24 52 28 5b  me) VALUES(\$R([
1880: 6c 69 6e 64 65 78 20 24 63 6f 6c 73 20 30 5d 29  lindex $cols 0])
1890: 22 0a 66 6f 72 65 61 63 68 20 63 20 5b 6c 72 61  ".foreach c [lra
18a0: 6e 67 65 20 24 63 6f 6c 73 20 31 20 65 6e 64 5d  nge $cols 1 end]
18b0: 20 7b 0a 20 20 61 70 70 65 6e 64 20 73 71 6c 20   {.  append sql 
18c0: 22 2c 20 5c 24 52 28 24 63 29 22 0a 7d 0a 61 70  ", \$R($c)".}.ap
18d0: 70 65 6e 64 20 73 71 6c 20 22 29 22 0a 0a 69 66  pend sql ")"..if
18e0: 20 7b 24 41 28 74 72 61 6e 73 29 7d 20 7b 20 64   {$A(trans)} { d
18f0: 62 20 65 76 61 6c 20 42 45 47 49 4e 20 7d 0a 20  b eval BEGIN }. 
1900: 20 77 68 69 6c 65 20 7b 24 69 20 3c 20 24 4e 7d   while {$i < $N}
1910: 20 7b 0a 20 20 20 20 66 6f 72 65 61 63 68 20 63   {.    foreach c
1920: 20 24 63 6f 6c 73 20 73 20 24 41 28 63 6f 6c 73   $cols s $A(cols
1930: 69 7a 65 29 20 7b 0a 20 20 20 20 20 20 73 65 74  ize) {.      set
1940: 20 52 28 24 63 29 20 5b 6c 72 61 6e 67 65 20 24   R($c) [lrange $
1950: 74 6f 6b 65 6e 73 20 24 69 20 5b 65 78 70 72 20  tokens $i [expr 
1960: 24 69 2b 24 73 2d 31 5d 5d 0a 20 20 20 20 20 20  $i+$s-1]].      
1970: 69 6e 63 72 20 69 20 24 73 0a 20 20 20 20 7d 0a  incr i $s.    }.
1980: 20 20 20 20 64 62 20 65 76 61 6c 20 24 73 71 6c      db eval $sql
1990: 0a 20 20 7d 0a 69 66 20 7b 24 41 28 74 72 61 6e  .  }.if {$A(tran
19a0: 73 29 7d 20 7b 20 64 62 20 65 76 61 6c 20 43 4f  s)} { db eval CO
19b0: 4d 4d 49 54 20 7d 0a 0a 0a 0a                    MMIT }....