Index: document_header.tcl ================================================================== --- document_header.tcl +++ document_header.tcl @@ -36,11 +36,11 @@
  • Download
  • License
  • Support
  • Purchase
  • nodes in the document. + foreach li [[$dom root] search li] { + if {0==[releaselog_filterscript $li]} continue + + set i 1 + set ol [$li parent] + if {$ol=="" || [$ol tag]!="ol"} {error UNTHINKABLE!} + foreach c [$ol children] { + if {$c==$li} break + if {[$c tag]=="li"} {incr i} + } + + set t [$li text] + db eval { INSERT INTO change VALUES($doc, $version, $i, $t) } + } +} proc rebuild_database {} { db transaction { # Create the database schema. If the schema already exists, then those @@ -360,10 +416,23 @@ DROP TABLE IF EXISTS weight; CREATE TABLE weight(id INTEGER PRIMARY KEY, percent FLOAT); INSERT INTO page(page, rank) VALUES('rank', 'bm25(10.0,10.0,20.0,20.0)'); + + DROP TABLE IF EXISTS change; + CREATE VIRTUAL TABLE change USING fts5( + url UNINDEXED, -- Path to document + version UNINDEXED, -- SQLite version number + idx UNINDEXED, -- Bullet point number + text -- Text of change log entry + ); + } + + foreach doc [document_list changelog] { + puts "Indexing $doc..." + changelog_document_import $doc } foreach doc [document_list lang] { puts "Indexing $doc..." lang_document_import $doc @@ -376,12 +445,14 @@ foreach doc [document_list generic] { puts "Indexing $doc..." generic_document_import $doc } + db eval { INSERT INTO page(page) VALUES('optimize') } + db eval { INSERT INTO change(change) VALUES('optimize') } foreach f [array names ::weight] { set w $::weight($f) db eval {SELECT rowid FROM page WHERE url=$f} { db eval { INSERT INTO weight VALUES($rowid, $w); } Index: search/search.tcl ================================================================== --- search/search.tcl +++ search/search.tcl @@ -115,11 +115,10 @@ ip, -- IP query was made from query, -- Fts5 query string nres, -- Number of results timestamp DEFAULT CURRENT_TIMESTAMP ); - INSERT INTO log(ip, query, nres) VALUES($ip, $query, $nRes); COMMIT; } db2 close @@ -221,10 +220,46 @@ proc ttime {script} { set t [lindex [time [list uplevel $script]] 0] if {$t>1000000} { return [format "%.2f s" [expr {$t/1000000.0}]] } return [format "%.2f ms" [expr {$t/1000.0}]] } + +proc searchchanges {} { + global A + if {![info exists A(q)]} return "" + + set open {} + set close {} + set query { + SELECT url, version, idx, highlight(change, 3, $open, $close) AS text + FROM change($A(q)) ORDER BY rowid ASC + } + + set ret [subst { +

    Change log entries mentioning: [htmlize $::A(q)] + + }] + + set s2 "style=\"margin-top:0\"" + set s1 "style=\"font-size:larger; text-align:left\" class=nounderline" + set prev "" + db eval $query { + if {$prev!=$version} { + append ret [subst { +
    $version
      + }] + set prev $version + } + append ret [subst {
    • ($idx) $text }] + } + + append ret "
    " + append ret "

    You can also see the entire" + append ret " changelog as a single page if you wish.

    " + + return $ret +} proc searchresults {} { if {![info exists ::A(q)]} return "" #set ::A(q) [string map {' ''} $A(q)] #regsub -all {[^-/"A-Za-z0-9]} $::A(q) { } ::A(q) @@ -380,21 +415,28 @@ set ::PATH ../ return [admin_list] } sqlite3 db search.d/search.db + + set cmd searchresults + if {[info exists A(s)] && $A(s)=="c"} { + set cmd searchchanges + } db transaction { set t [ttime { - if {[catch searchresults srchout]} { + if {[catch $cmd srchout]} { set A(q) [string tolower $A(q)] - set srchout [searchresults] + set srchout [$cmd] } set doc $srchout }] } + append doc "
    " append doc "

    Page generated by FTS5 in about $t." + append doc "

    " return $doc # return [cgi_env_dump] } @@ -420,10 +462,26 @@ append title " - [htmlize $::A(q)]" } else { set initsearch {} } set document [document_header $title $::PATH $initsearch] + append document [subst { + + }] append document $res } else { set document "
    "
       append document "Error: $res\n\n"
       append document $::errorInfo