/ Hex Artifact Content
Login

Artifact d54da0e067306663e2d5d523965ca487698e722c:


0000: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
0050: 50 72 6f 63 65 73 73 20 63 6f 6d 6d 61 6e 64 20  Process command 
0060: 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a  line arguments..
0070: 23 0a 70 72 6f 63 20 75 73 61 67 65 20 7b 7d 20  #.proc usage {} 
0080: 7b 0a 20 20 70 75 74 73 20 73 74 64 65 72 72 20  {.  puts stderr 
0090: 22 75 73 61 67 65 3a 20 24 3a 3a 61 72 67 76 30  "usage: $::argv0
00a0: 20 3f 4f 50 54 49 4f 4e 53 3f 20 64 61 74 61 62   ?OPTIONS? datab
00b0: 61 73 65 20 74 61 62 6c 65 22 0a 20 20 70 75 74  ase table".  put
00c0: 73 20 73 74 64 65 72 72 20 22 22 0a 20 20 70 75  s stderr "".  pu
00d0: 74 73 20 73 74 64 65 72 72 20 22 20 20 2d 6e 74  ts stderr "  -nt
00e0: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
00f0: 20 20 20 28 63 6f 75 6e 74 20 6e 75 6d 62 65 72     (count number
0100: 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 65 61 63   of terms in eac
0110: 68 20 73 65 67 6d 65 6e 74 29 22 0a 20 20 70 75  h segment)".  pu
0120: 74 73 20 73 74 64 65 72 72 20 22 20 20 2d 73 65  ts stderr "  -se
0130: 67 6d 65 6e 74 73 20 20 20 20 20 20 20 20 20 20  gments          
0140: 20 20 20 28 6f 75 74 70 75 74 20 73 65 67 6d 65     (output segme
0150: 6e 74 20 63 6f 6e 74 65 6e 74 73 29 22 0a 20 20  nt contents)".  
0160: 70 75 74 73 20 73 74 64 65 72 72 20 22 22 0a 20  puts stderr "". 
0170: 20 65 78 69 74 20 31 0a 7d 0a 0a 73 65 74 20 4f   exit 1.}..set O
0180: 28 6e 74 65 72 6d 29 20 30 0a 73 65 74 20 4f 28  (nterm) 0.set O(
0190: 73 65 67 6d 65 6e 74 73 29 20 30 0a 0a 69 66 20  segments) 0..if 
01a0: 7b 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 76 5d  {[llength $argv]
01b0: 3c 32 7d 20 75 73 61 67 65 0a 66 6f 72 65 61 63  <2} usage.foreac
01c0: 68 20 61 20 5b 6c 72 61 6e 67 65 20 24 61 72 67  h a [lrange $arg
01d0: 76 20 30 20 65 6e 64 2d 32 5d 20 7b 0a 20 20 73  v 0 end-2] {.  s
01e0: 77 69 74 63 68 20 2d 2d 20 24 61 20 7b 0a 20 20  witch -- $a {.  
01f0: 20 20 2d 6e 74 65 72 6d 20 7b 0a 20 20 20 20 20    -nterm {.     
0200: 20 73 65 74 20 4f 28 6e 74 65 72 6d 29 20 31 0a   set O(nterm) 1.
0210: 20 20 20 20 7d 0a 0a 20 20 20 20 2d 73 65 67 6d      }..    -segm
0220: 65 6e 74 73 20 7b 0a 20 20 20 20 20 20 73 65 74  ents {.      set
0230: 20 4f 28 73 65 67 6d 65 6e 74 73 29 20 31 0a 20   O(segments) 1. 
0240: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
0250: 74 20 7b 0a 20 20 20 20 20 20 75 73 61 67 65 0a  t {.      usage.
0260: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 65 74      }.  }.}..set
0270: 20 64 61 74 61 62 61 73 65 20 5b 6c 69 6e 64 65   database [linde
0280: 78 20 24 61 72 67 76 20 65 6e 64 2d 31 5d 0a 73  x $argv end-1].s
0290: 65 74 20 74 62 6c 20 5b 6c 69 6e 64 65 78 20 24  et tbl [lindex $
02a0: 61 72 67 76 20 65 6e 64 5d 0a 0a 0a 23 2d 2d 2d  argv end]...#---
02b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02f0: 2d 2d 2d 2d 2d 2d 0a 23 20 43 6f 75 6e 74 20 74  ------.# Count t
0300: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72  he number of ter
0310: 6d 73 20 69 6e 20 65 61 63 68 20 73 65 67 6d 65  ms in each segme
0320: 6e 74 20 6f 66 20 66 74 73 35 20 74 61 62 6c 65  nt of fts5 table
0330: 20 24 74 62 6c 2e 20 53 74 6f 72 65 20 74 68 65   $tbl. Store the
0340: 0a 23 20 63 6f 75 6e 74 73 20 69 6e 20 74 68 65  .# counts in the
0350: 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65 20   array variable 
0360: 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f  in the parent co
0370: 6e 74 65 78 74 20 6e 61 6d 65 64 20 62 79 20 70  ntext named by p
0380: 61 72 61 6d 65 74 65 72 0a 23 20 24 61 72 72 61  arameter.# $arra
0390: 79 6e 61 6d 65 2c 20 69 6e 64 65 78 65 64 20 62  yname, indexed b
03a0: 79 20 73 65 67 6d 65 6e 74 2d 69 64 2e 20 45 78  y segment-id. Ex
03b0: 61 6d 70 6c 65 3a 0a 23 0a 23 20 20 20 63 6f 75  ample:.#.#   cou
03c0: 6e 74 5f 74 65 72 6d 73 20 66 74 73 5f 74 62 6c  nt_terms fts_tbl
03d0: 20 41 0a 23 20 20 20 66 6f 72 65 61 63 68 20 7b   A.#   foreach {
03e0: 6b 20 76 7d 20 5b 61 72 72 61 79 20 67 65 74 20  k v} [array get 
03f0: 41 5d 20 7b 20 70 75 74 73 20 22 73 65 67 69 64  A] { puts "segid
0400: 3d 24 6b 20 6e 54 65 72 6d 3d 24 76 22 20 7d 0a  =$k nTerm=$v" }.
0410: 23 0a 70 72 6f 63 20 63 6f 75 6e 74 5f 74 65 72  #.proc count_ter
0420: 6d 73 20 7b 74 62 6c 20 61 72 72 61 79 6e 61 6d  ms {tbl arraynam
0430: 65 7d 20 7b 0a 20 20 75 70 76 61 72 20 41 20 24  e} {.  upvar A $
0440: 61 72 72 61 79 6e 61 6d 65 0a 20 20 61 72 72 61  arrayname.  arra
0450: 79 20 75 6e 73 65 74 20 41 0a 20 20 64 62 20 65  y unset A.  db e
0460: 76 61 6c 20 22 53 45 4c 45 43 54 20 66 74 73 35  val "SELECT fts5
0470: 5f 64 65 63 6f 64 65 28 72 6f 77 69 64 2c 20 62  _decode(rowid, b
0480: 6c 6f 63 6b 29 20 41 53 20 64 20 46 52 4f 4d 20  lock) AS d FROM 
0490: 24 7b 74 62 6c 7d 5f 64 61 74 61 22 20 7b 0a 20  ${tbl}_data" {. 
04a0: 20 20 20 73 65 74 20 64 65 73 63 20 5b 6c 69 6e     set desc [lin
04b0: 64 65 78 20 24 64 20 30 5d 0a 20 20 20 20 69 66  dex $d 0].    if
04c0: 20 7b 5b 72 65 67 65 78 70 20 7b 5e 73 65 67 69   {[regexp {^segi
04d0: 64 3d 28 5b 30 2d 39 5d 2a 29 7d 20 24 64 65 73  d=([0-9]*)} $des
04e0: 63 20 2d 3e 20 69 64 5d 7d 20 7b 0a 20 20 20 20  c -> id]} {.    
04f0: 20 20 66 6f 72 65 61 63 68 20 69 20 5b 6c 72 61    foreach i [lra
0500: 6e 67 65 20 24 64 20 31 20 65 6e 64 5d 20 7b 0a  nge $d 1 end] {.
0510: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
0520: 69 6e 67 20 6d 61 74 63 68 20 7b 74 65 72 6d 3d  ing match {term=
0530: 2a 7d 20 24 69 5d 7d 20 7b 20 69 6e 63 72 20 41  *} $i]} { incr A
0540: 28 24 69 64 29 20 7d 0a 20 20 20 20 20 20 7d 0a  ($id) }.      }.
0550: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 23 2d      }.  }.}...#-
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 74 61 72 74  --------.# Start
05b0: 20 6f 66 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d   of main program
05c0: 2e 0a 23 0a 73 71 6c 69 74 65 33 20 64 62 20 24  ..#.sqlite3 db $
05d0: 64 61 74 61 62 61 73 65 0a 63 61 74 63 68 20 7b  database.catch {
05e0: 20 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65 78 74   load_static_ext
05f0: 65 6e 73 69 6f 6e 20 64 62 20 66 74 73 35 20 7d  ension db fts5 }
0600: 0a 0a 69 66 20 7b 24 4f 28 6e 74 65 72 6d 29 7d  ..if {$O(nterm)}
0610: 20 7b 20 63 6f 75 6e 74 5f 74 65 72 6d 73 20 24   { count_terms $
0620: 74 62 6c 20 41 20 7d 0a 0a 64 62 20 65 76 61 6c  tbl A }..db eval
0630: 20 22 53 45 4c 45 43 54 20 66 74 73 35 5f 64 65   "SELECT fts5_de
0640: 63 6f 64 65 28 72 6f 77 69 64 2c 20 62 6c 6f 63  code(rowid, bloc
0650: 6b 29 20 41 53 20 64 20 46 52 4f 4d 20 24 7b 74  k) AS d FROM ${t
0660: 62 6c 7d 5f 64 61 74 61 20 57 48 45 52 45 20 69  bl}_data WHERE i
0670: 64 3d 31 30 22 20 7b 0a 20 20 66 6f 72 65 61 63  d=10" {.  foreac
0680: 68 20 6c 76 6c 20 5b 6c 72 61 6e 67 65 20 24 64  h lvl [lrange $d
0690: 20 31 20 65 6e 64 5d 20 7b 0a 20 20 20 20 70 75   1 end] {.    pu
06a0: 74 73 20 5b 6c 72 61 6e 67 65 20 24 6c 76 6c 20  ts [lrange $lvl 
06b0: 30 20 32 5d 0a 0a 20 20 20 20 66 6f 72 65 61 63  0 2]..    foreac
06c0: 68 20 73 65 67 20 5b 6c 72 61 6e 67 65 20 24 6c  h seg [lrange $l
06d0: 76 6c 20 33 20 65 6e 64 5d 20 7b 0a 20 20 20 20  vl 3 end] {.    
06e0: 20 20 69 66 20 7b 24 3a 3a 4f 28 6e 74 65 72 6d    if {$::O(nterm
06f0: 29 7d 20 7b 0a 20 20 20 20 20 20 20 20 72 65 67  )} {.        reg
0700: 65 78 70 20 7b 5e 69 64 3d 28 5b 30 2d 39 5d 2a  exp {^id=([0-9]*
0710: 29 7d 20 24 73 65 67 20 2d 3e 20 69 64 0a 20 20  )} $seg -> id.  
0720: 20 20 20 20 20 20 73 65 74 20 6e 54 65 72 6d 20        set nTerm 
0730: 30 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  0.        catch 
0740: 7b 20 73 65 74 20 6e 54 65 72 6d 20 24 41 28 24  { set nTerm $A($
0750: 69 64 29 20 7d 0a 20 20 20 20 20 20 20 20 70 75  id) }.        pu
0760: 74 73 20 5b 66 6f 72 6d 61 74 20 22 20 20 20 20  ts [format "    
0770: 20 20 20 20 25 20 2d 32 38 73 20 20 20 20 6e 54      % -28s    nT
0780: 65 72 6d 3d 25 64 22 20 24 73 65 67 20 24 6e 54  erm=%d" $seg $nT
0790: 65 72 6d 5d 0a 20 20 20 20 20 20 7d 20 65 6c 73  erm].      } els
07a0: 65 20 7b 0a 20 20 20 20 20 20 20 20 70 75 74 73  e {.        puts
07b0: 20 5b 66 6f 72 6d 61 74 20 22 20 20 20 20 20 20   [format "      
07c0: 20 20 25 20 2d 32 38 73 22 20 24 73 65 67 5d 0a    % -28s" $seg].
07d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
07e0: 7d 0a 7d 0a 0a 69 66 20 7b 24 4f 28 73 65 67 6d  }.}..if {$O(segm
07f0: 65 6e 74 73 29 7d 20 7b 0a 20 20 70 75 74 73 20  ents)} {.  puts 
0800: 22 22 0a 20 20 64 62 20 65 76 61 6c 20 22 53 45  "".  db eval "SE
0810: 4c 45 43 54 20 66 74 73 35 5f 64 65 63 6f 64 65  LECT fts5_decode
0820: 28 72 6f 77 69 64 2c 20 62 6c 6f 63 6b 29 20 41  (rowid, block) A
0830: 53 20 64 20 46 52 4f 4d 20 24 7b 74 62 6c 7d 5f  S d FROM ${tbl}_
0840: 64 61 74 61 20 57 48 45 52 45 20 69 64 3e 31 30  data WHERE id>10
0850: 22 20 7b 0a 20 20 20 20 70 75 74 73 20 24 64 0a  " {.    puts $d.
0860: 20 20 7d 0a 7d 0a 0a 0a 0a 0a 0a                   }.}......