mirror of https://github.com/sqlite/sqlite
121 lines
2.7 KiB
Tcl
121 lines
2.7 KiB
Tcl
|
|
|
|
proc usage {} {
|
|
puts stderr "$::argv0 ?OPTIONS? DATABASE FILE1..."
|
|
puts stderr ""
|
|
puts stderr "Options are"
|
|
puts stderr " -fts5"
|
|
puts stderr " -fts4"
|
|
puts stderr " -colsize <list of column sizes>"
|
|
puts stderr {
|
|
This script is designed to create fts4/5 tables with more than one column.
|
|
The -colsize option should be set to a Tcl list of integer values, one for
|
|
each column in the table. Each value is the number of tokens that will be
|
|
inserted into the column value for each row. For example, setting the -colsize
|
|
option to "5 10" creates an FTS table with 2 columns, with roughly 5 and 10
|
|
tokens per row in each, respectively.
|
|
|
|
Each "FILE" argument should be a text file. The contents of these text files is
|
|
split on whitespace characters to form a list of tokens. The first N1 tokens
|
|
are used for the first column of the first row, where N1 is the first element
|
|
of the -colsize list. The next N2 are used for the second column of the first
|
|
row, and so on. Rows are added to the table until the entire list of tokens
|
|
is exhausted.
|
|
}
|
|
exit -1
|
|
}
|
|
|
|
set O(aColSize) [list 10 10 10]
|
|
set O(tblname) t1
|
|
set O(fts) fts5
|
|
|
|
|
|
set options_with_values {-colsize}
|
|
|
|
for {set i 0} {$i < [llength $argv]} {incr i} {
|
|
set opt [lindex $argv $i]
|
|
if {[string range $opt 0 0]!="-"} break
|
|
|
|
if {[lsearch $options_with_values $opt]>=0} {
|
|
incr i
|
|
if {$i==[llength $argv]} usage
|
|
set val [lindex $argv $i]
|
|
}
|
|
|
|
switch -- $opt {
|
|
-colsize {
|
|
set O(aColSize) $val
|
|
}
|
|
|
|
-fts4 {
|
|
set O(fts) fts4
|
|
}
|
|
|
|
-fts5 {
|
|
set O(fts) fts5
|
|
}
|
|
}
|
|
}
|
|
|
|
if {$i > [llength $argv]-2} usage
|
|
set O(db) [lindex $argv $i]
|
|
set O(files) [lrange $argv [expr $i+1] end]
|
|
|
|
sqlite3 db $O(db)
|
|
|
|
# Create the FTS table in the db. Return a list of the table columns.
|
|
#
|
|
proc create_table {} {
|
|
global O
|
|
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]
|
|
|
|
set nCol [llength $O(aColSize)]
|
|
set cols [lrange $cols 0 [expr $nCol-1]]
|
|
|
|
set sql "CREATE VIRTUAL TABLE IF NOT EXISTS $O(tblname) USING $O(fts) ("
|
|
append sql [join $cols ,]
|
|
append sql ");"
|
|
|
|
db eval $sql
|
|
return $cols
|
|
}
|
|
|
|
# Return a list of tokens from the named file.
|
|
#
|
|
proc readfile {file} {
|
|
set fd [open $file]
|
|
set data [read $fd]
|
|
close $fd
|
|
split $data
|
|
}
|
|
|
|
|
|
# Load all the data into a big list of tokens.
|
|
#
|
|
set tokens [list]
|
|
foreach f $O(files) {
|
|
set tokens [concat $tokens [readfile $f]]
|
|
}
|
|
|
|
set N [llength $tokens]
|
|
set i 0
|
|
set cols [create_table]
|
|
set sql "INSERT INTO $O(tblname) VALUES(\$[lindex $cols 0]"
|
|
foreach c [lrange $cols 1 end] {
|
|
append sql ", \$A($c)"
|
|
}
|
|
append sql ")"
|
|
|
|
db eval BEGIN
|
|
while {$i < $N} {
|
|
foreach c $cols s $O(aColSize) {
|
|
set A($c) [lrange $tokens $i [expr $i+$s-1]]
|
|
incr i $s
|
|
}
|
|
db eval $sql
|
|
}
|
|
db eval COMMIT
|
|
|
|
|
|
|