OLD | NEW |
| (Empty) |
1 | |
2 | |
3 proc usage {} { | |
4 puts stderr "$::argv0 ?OPTIONS? DATABASE FILE1..." | |
5 puts stderr "" | |
6 puts stderr "Options are" | |
7 puts stderr " -fts5" | |
8 puts stderr " -fts4" | |
9 puts stderr " -colsize <list of column sizes>" | |
10 puts stderr { | |
11 This script is designed to create fts4/5 tables with more than one column. | |
12 The -colsize option should be set to a Tcl list of integer values, one for | |
13 each column in the table. Each value is the number of tokens that will be | |
14 inserted into the column value for each row. For example, setting the -colsize | |
15 option to "5 10" creates an FTS table with 2 columns, with roughly 5 and 10 | |
16 tokens per row in each, respectively. | |
17 | |
18 Each "FILE" argument should be a text file. The contents of these text files is | |
19 split on whitespace characters to form a list of tokens. The first N1 tokens | |
20 are used for the first column of the first row, where N1 is the first element | |
21 of the -colsize list. The next N2 are used for the second column of the first | |
22 row, and so on. Rows are added to the table until the entire list of tokens | |
23 is exhausted. | |
24 } | |
25 exit -1 | |
26 } | |
27 | |
28 set O(aColSize) [list 10 10 10] | |
29 set O(tblname) t1 | |
30 set O(fts) fts5 | |
31 | |
32 | |
33 set options_with_values {-colsize} | |
34 | |
35 for {set i 0} {$i < [llength $argv]} {incr i} { | |
36 set opt [lindex $argv $i] | |
37 if {[string range $opt 0 0]!="-"} break | |
38 | |
39 if {[lsearch $options_with_values $opt]>=0} { | |
40 incr i | |
41 if {$i==[llength $argv]} usage | |
42 set val [lindex $argv $i] | |
43 } | |
44 | |
45 switch -- $opt { | |
46 -colsize { | |
47 set O(aColSize) $val | |
48 } | |
49 | |
50 -fts4 { | |
51 set O(fts) fts4 | |
52 } | |
53 | |
54 -fts5 { | |
55 set O(fts) fts5 | |
56 } | |
57 } | |
58 } | |
59 | |
60 if {$i > [llength $argv]-2} usage | |
61 set O(db) [lindex $argv $i] | |
62 set O(files) [lrange $argv [expr $i+1] end] | |
63 | |
64 sqlite3 db $O(db) | |
65 | |
66 # Create the FTS table in the db. Return a list of the table columns. | |
67 # | |
68 proc create_table {} { | |
69 global O | |
70 set cols [list a b c d e f g h i j k l m n o p q r s t u v w x y z] | |
71 | |
72 set nCol [llength $O(aColSize)] | |
73 set cols [lrange $cols 0 [expr $nCol-1]] | |
74 | |
75 set sql "CREATE VIRTUAL TABLE IF NOT EXISTS $O(tblname) USING $O(fts) (" | |
76 append sql [join $cols ,] | |
77 append sql ");" | |
78 | |
79 db eval $sql | |
80 return $cols | |
81 } | |
82 | |
83 # Return a list of tokens from the named file. | |
84 # | |
85 proc readfile {file} { | |
86 set fd [open $file] | |
87 set data [read $fd] | |
88 close $fd | |
89 split $data | |
90 } | |
91 | |
92 | |
93 # Load all the data into a big list of tokens. | |
94 # | |
95 set tokens [list] | |
96 foreach f $O(files) { | |
97 set tokens [concat $tokens [readfile $f]] | |
98 } | |
99 | |
100 set N [llength $tokens] | |
101 set i 0 | |
102 set cols [create_table] | |
103 set sql "INSERT INTO $O(tblname) VALUES(\$[lindex $cols 0]" | |
104 foreach c [lrange $cols 1 end] { | |
105 append sql ", \$A($c)" | |
106 } | |
107 append sql ")" | |
108 | |
109 db eval BEGIN | |
110 while {$i < $N} { | |
111 foreach c $cols s $O(aColSize) { | |
112 set A($c) [lrange $tokens $i [expr $i+$s-1]] | |
113 incr i $s | |
114 } | |
115 db eval $sql | |
116 } | |
117 db eval COMMIT | |
118 | |
119 | |
120 | |
OLD | NEW |