Fossil SCM

Initial infrastructure for indexed full-text search using FTS4.

drh 2015-02-02 14:05 UTC trunk
Commit 64e6a10013aee7de169418c55ed4470d22979f37
+2 -1
--- src/main.mk
+++ src/main.mk
@@ -449,11 +449,12 @@
449449
-DSQLITE_OMIT_LOAD_EXTENSION=1 \
450450
-DSQLITE_ENABLE_LOCKING_STYLE=0 \
451451
-DSQLITE_THREADSAFE=0 \
452452
-DSQLITE_DEFAULT_FILE_FORMAT=4 \
453453
-DSQLITE_OMIT_DEPRECATED \
454
- -DSQLITE_ENABLE_EXPLAIN_COMMENTS
454
+ -DSQLITE_ENABLE_EXPLAIN_COMMENTS \
455
+ -DSQLITE_ENABLE_FTS4
455456
456457
# Setup the options used to compile the included SQLite shell.
457458
SHELL_OPTIONS = -Dmain=sqlite3_shell \
458459
-DSQLITE_OMIT_LOAD_EXTENSION=1 \
459460
-DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) \
460461
--- src/main.mk
+++ src/main.mk
@@ -449,11 +449,12 @@
449 -DSQLITE_OMIT_LOAD_EXTENSION=1 \
450 -DSQLITE_ENABLE_LOCKING_STYLE=0 \
451 -DSQLITE_THREADSAFE=0 \
452 -DSQLITE_DEFAULT_FILE_FORMAT=4 \
453 -DSQLITE_OMIT_DEPRECATED \
454 -DSQLITE_ENABLE_EXPLAIN_COMMENTS
 
455
456 # Setup the options used to compile the included SQLite shell.
457 SHELL_OPTIONS = -Dmain=sqlite3_shell \
458 -DSQLITE_OMIT_LOAD_EXTENSION=1 \
459 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) \
460
--- src/main.mk
+++ src/main.mk
@@ -449,11 +449,12 @@
449 -DSQLITE_OMIT_LOAD_EXTENSION=1 \
450 -DSQLITE_ENABLE_LOCKING_STYLE=0 \
451 -DSQLITE_THREADSAFE=0 \
452 -DSQLITE_DEFAULT_FILE_FORMAT=4 \
453 -DSQLITE_OMIT_DEPRECATED \
454 -DSQLITE_ENABLE_EXPLAIN_COMMENTS \
455 -DSQLITE_ENABLE_FTS4
456
457 # Setup the options used to compile the included SQLite shell.
458 SHELL_OPTIONS = -Dmain=sqlite3_shell \
459 -DSQLITE_OMIT_LOAD_EXTENSION=1 \
460 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) \
461
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -157,10 +157,11 @@
157157
-DSQLITE_ENABLE_LOCKING_STYLE=0
158158
-DSQLITE_THREADSAFE=0
159159
-DSQLITE_DEFAULT_FILE_FORMAT=4
160160
-DSQLITE_OMIT_DEPRECATED
161161
-DSQLITE_ENABLE_EXPLAIN_COMMENTS
162
+ -DSQLITE_ENABLE_FTS4
162163
}
163164
#lappend SQLITE_OPTIONS -DSQLITE_ENABLE_FTS3=1
164165
#lappend SQLITE_OPTIONS -DSQLITE_ENABLE_STAT4
165166
#lappend SQLITE_OPTIONS -DSQLITE_WIN32_NO_ANSI
166167
#lappend SQLITE_OPTIONS -DSQLITE_WINNT_MAX_PATH_CHARS=4096
167168
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -157,10 +157,11 @@
157 -DSQLITE_ENABLE_LOCKING_STYLE=0
158 -DSQLITE_THREADSAFE=0
159 -DSQLITE_DEFAULT_FILE_FORMAT=4
160 -DSQLITE_OMIT_DEPRECATED
161 -DSQLITE_ENABLE_EXPLAIN_COMMENTS
 
162 }
163 #lappend SQLITE_OPTIONS -DSQLITE_ENABLE_FTS3=1
164 #lappend SQLITE_OPTIONS -DSQLITE_ENABLE_STAT4
165 #lappend SQLITE_OPTIONS -DSQLITE_WIN32_NO_ANSI
166 #lappend SQLITE_OPTIONS -DSQLITE_WINNT_MAX_PATH_CHARS=4096
167
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -157,10 +157,11 @@
157 -DSQLITE_ENABLE_LOCKING_STYLE=0
158 -DSQLITE_THREADSAFE=0
159 -DSQLITE_DEFAULT_FILE_FORMAT=4
160 -DSQLITE_OMIT_DEPRECATED
161 -DSQLITE_ENABLE_EXPLAIN_COMMENTS
162 -DSQLITE_ENABLE_FTS4
163 }
164 #lappend SQLITE_OPTIONS -DSQLITE_ENABLE_FTS3=1
165 #lappend SQLITE_OPTIONS -DSQLITE_ENABLE_STAT4
166 #lappend SQLITE_OPTIONS -DSQLITE_WIN32_NO_ANSI
167 #lappend SQLITE_OPTIONS -DSQLITE_WINNT_MAX_PATH_CHARS=4096
168
--- src/manifest.c
+++ src/manifest.c
@@ -1829,10 +1829,11 @@
18291829
for(i=0; i<p->nFile; i++){
18301830
add_one_mlink(0, 0, rid, p->aFile[i].zUuid, p->aFile[i].zName, 0,
18311831
isPublic, 1, manifest_file_mperm(&p->aFile[i]));
18321832
}
18331833
}
1834
+ search_doc_touch('c', rid, 0);
18341835
db_multi_exec(
18351836
"REPLACE INTO event(type,mtime,objid,user,comment,"
18361837
"bgcolor,euser,ecomment,omtime)"
18371838
"VALUES('ci',"
18381839
" coalesce("
@@ -1934,10 +1935,11 @@
19341935
if( nWiki>0 ){
19351936
zComment = mprintf("Changes to wiki page [%h]", p->zWikiTitle);
19361937
}else{
19371938
zComment = mprintf("Deleted wiki page [%h]", p->zWikiTitle);
19381939
}
1940
+ search_doc_touch('w',rid,p->zWikiTitle);
19391941
db_multi_exec(
19401942
"REPLACE INTO event(type,mtime,objid,user,comment,"
19411943
" bgcolor,euser,ecomment)"
19421944
"VALUES('w',%.17g,%d,%Q,%Q,"
19431945
" (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d AND tagtype>1),"
@@ -1986,10 +1988,11 @@
19861988
}
19871989
}
19881990
if( subsequent ){
19891991
content_deltify(rid, subsequent, 0);
19901992
}else{
1993
+ search_doc_touch('e',rid,0);
19911994
db_multi_exec(
19921995
"REPLACE INTO event(type,mtime,objid,tagid,user,comment,bgcolor)"
19931996
"VALUES('e',%.17g,%d,%d,%Q,%Q,"
19941997
" (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d));",
19951998
p->rEventDate, rid, tagid, p->zUser, p->zComment,
19961999
--- src/manifest.c
+++ src/manifest.c
@@ -1829,10 +1829,11 @@
1829 for(i=0; i<p->nFile; i++){
1830 add_one_mlink(0, 0, rid, p->aFile[i].zUuid, p->aFile[i].zName, 0,
1831 isPublic, 1, manifest_file_mperm(&p->aFile[i]));
1832 }
1833 }
 
1834 db_multi_exec(
1835 "REPLACE INTO event(type,mtime,objid,user,comment,"
1836 "bgcolor,euser,ecomment,omtime)"
1837 "VALUES('ci',"
1838 " coalesce("
@@ -1934,10 +1935,11 @@
1934 if( nWiki>0 ){
1935 zComment = mprintf("Changes to wiki page [%h]", p->zWikiTitle);
1936 }else{
1937 zComment = mprintf("Deleted wiki page [%h]", p->zWikiTitle);
1938 }
 
1939 db_multi_exec(
1940 "REPLACE INTO event(type,mtime,objid,user,comment,"
1941 " bgcolor,euser,ecomment)"
1942 "VALUES('w',%.17g,%d,%Q,%Q,"
1943 " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d AND tagtype>1),"
@@ -1986,10 +1988,11 @@
1986 }
1987 }
1988 if( subsequent ){
1989 content_deltify(rid, subsequent, 0);
1990 }else{
 
1991 db_multi_exec(
1992 "REPLACE INTO event(type,mtime,objid,tagid,user,comment,bgcolor)"
1993 "VALUES('e',%.17g,%d,%d,%Q,%Q,"
1994 " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d));",
1995 p->rEventDate, rid, tagid, p->zUser, p->zComment,
1996
--- src/manifest.c
+++ src/manifest.c
@@ -1829,10 +1829,11 @@
1829 for(i=0; i<p->nFile; i++){
1830 add_one_mlink(0, 0, rid, p->aFile[i].zUuid, p->aFile[i].zName, 0,
1831 isPublic, 1, manifest_file_mperm(&p->aFile[i]));
1832 }
1833 }
1834 search_doc_touch('c', rid, 0);
1835 db_multi_exec(
1836 "REPLACE INTO event(type,mtime,objid,user,comment,"
1837 "bgcolor,euser,ecomment,omtime)"
1838 "VALUES('ci',"
1839 " coalesce("
@@ -1934,10 +1935,11 @@
1935 if( nWiki>0 ){
1936 zComment = mprintf("Changes to wiki page [%h]", p->zWikiTitle);
1937 }else{
1938 zComment = mprintf("Deleted wiki page [%h]", p->zWikiTitle);
1939 }
1940 search_doc_touch('w',rid,p->zWikiTitle);
1941 db_multi_exec(
1942 "REPLACE INTO event(type,mtime,objid,user,comment,"
1943 " bgcolor,euser,ecomment)"
1944 "VALUES('w',%.17g,%d,%Q,%Q,"
1945 " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d AND tagtype>1),"
@@ -1986,10 +1988,11 @@
1988 }
1989 }
1990 if( subsequent ){
1991 content_deltify(rid, subsequent, 0);
1992 }else{
1993 search_doc_touch('e',rid,0);
1994 db_multi_exec(
1995 "REPLACE INTO event(type,mtime,objid,tagid,user,comment,bgcolor)"
1996 "VALUES('e',%.17g,%d,%d,%Q,%Q,"
1997 " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d));",
1998 p->rEventDate, rid, tagid, p->zUser, p->zComment,
1999
+96 -2
--- src/search.c
+++ src/search.c
@@ -449,10 +449,12 @@
449449
** Register the "score()" SQL function to score its input text
450450
** using the given Search object. Once this function is registered,
451451
** do not delete the Search object.
452452
*/
453453
void search_sql_setup(sqlite3 *db){
454
+ static int once = 0;
455
+ if( once++ ) return;
454456
sqlite3_create_function(db, "score", -1, SQLITE_UTF8, 0,
455457
search_score_sqlfunc, 0, 0);
456458
sqlite3_create_function(db, "snippet", -1, SQLITE_UTF8, &gSearch,
457459
search_score_sqlfunc, 0, 0);
458460
sqlite3_create_function(db, "search_init", -1, SQLITE_UTF8, 0,
@@ -789,18 +791,18 @@
789791
** zName Name of the object being searched.
790792
*/
791793
void search_stext(
792794
char cType, /* Type of document */
793795
int rid, /* BLOB.RID or TAG.TAGID value for document */
794
- const char *zName, /* Name of the document */
796
+ const char *zName, /* Auxiliary information */
795797
Blob *pOut /* OUT: Initialize to the search text */
796798
){
797799
blob_init(pOut, 0, 0);
798800
switch( cType ){
799801
case 'd': { /* Documents */
800802
Blob doc;
801
- content_get(rid, &doc);
803
+ content_get(rid, &doc);
802804
blob_to_utf8_no_bom(&doc, 0);
803805
get_stext_by_mimetype(&doc, mimetype_from_name(zName), pOut);
804806
blob_reset(&doc);
805807
break;
806808
}
@@ -918,5 +920,97 @@
918920
search_stext(g.argv[2][0], atoi(g.argv[3]), g.argv[4], &out);
919921
zUrl = search_url(g.argv[2][0], atoi(g.argv[3]), g.argv[4]);
920922
fossil_print("%s\n%z\n",blob_str(&out),zUrl);
921923
blob_reset(&out);
922924
}
925
+
926
+/* The schema for the full-text index
927
+*/
928
+static const char zFtsSchema[] =
929
+@ -- One entry for each possible search result
930
+@ CREATE TABLE IF NOT EXISTS "%w".ftsdocs(
931
+@ id INTEGER PRIMARY KEY, -- Maps to the ftsidx.rowid
932
+@ type CHAR(1), -- Type of document
933
+@ rid INTEGER, -- BLOB.RID or TAG.TAGID for the document
934
+@ name TEXT, -- Additional document description
935
+@ idxed BOOLEAN, -- True if currently in the index
936
+@ UNIQUE(type,rid)
937
+@ );
938
+@ CREATE INDEX "%w".ftsdocIdxed ON ftsdocs(type,rid,name) WHERE idxed==0;
939
+@ CREATE VIEW IF NOT EXISTS "%w".ftscontent AS
940
+@ SELECT id, type, rid, name,
941
+@ stext(type,rid,name) AS stext
942
+@ FROM ftsdocs;
943
+@ CREATE VIRTUAL TABLE IF NOT EXISTS "%w".ftsidx
944
+@ USING fts4(content="ftscontent", stext);
945
+;
946
+static const char zFtsDrop[] =
947
+@ DROP TABLE IF EXISTS "%w".ftsidx;
948
+@ DROP VIEW IF EXISTS "%w".ftscontent;
949
+@ DROP TABLE IF EXISTS "%w".ftsdocs;
950
+;
951
+
952
+/*
953
+** Create or drop the tables associated with a full-text index.
954
+*/
955
+void search_create_index(void){
956
+ const char *zDb = db_name("repository");
957
+ search_sql_setup(g.db);
958
+ db_multi_exec(zFtsSchema/*works-like:"%w%w%w%w"*/, zDb, zDb, zDb, zDb);
959
+}
960
+void search_drop_index(void){
961
+ const char *zDb = db_name("repository");
962
+ db_multi_exec(zFtsDrop/*works-like:"%w%w%w"*/, zDb, zDb, zDb);
963
+}
964
+
965
+/*
966
+** Return true if the full-text search index exists
967
+*/
968
+int search_index_exists(void){
969
+ static int fExists = -1;
970
+ if( fExists<0 ) fExists = db_table_exists("repository","ftsdocs");
971
+ return fExists;
972
+}
973
+
974
+/*
975
+** The document described by cType,rid,zName is about to be added or
976
+** updated. If the document has already been indexed, then unindex it
977
+** now while we still have access to the old content. Add the document
978
+** to the queue of documents that need to be indexed or reindexed.
979
+*/
980
+void search_doc_touch(char cType, int rid, const char *zName){
981
+ if( search_index_exists() ){
982
+ db_multi_exec(
983
+ "DELETE FROM ftsidx WHERE rowid IN"
984
+ " (SELECT id FROM ftsdocs WHERE type=%Q AND rid=%d AND idxed)",
985
+ cType, rid
986
+ );
987
+ db_multi_exec(
988
+ "REPLACE INTO ftsdocs(type,rid,name,idxed)"
989
+ " VALUES(%Q,%d,%Q,0)",
990
+ cType, rid, zName
991
+ );
992
+ }
993
+}
994
+
995
+/*
996
+** COMMAND: test-fts
997
+*/
998
+void test_fts_cmd(void){
999
+ char *zSubCmd;
1000
+ int n;
1001
+ db_find_and_open_repository(0, 0);
1002
+ if( g.argc<3 ) usage("SUBCMD ...");
1003
+ zSubCmd = g.argv[2];
1004
+ n = (int)strlen(zSubCmd);
1005
+ db_begin_transaction();
1006
+ if( fossil_strncmp(zSubCmd, "create", n)==0 ){
1007
+ search_create_index();
1008
+ }else if( fossil_strncmp(zSubCmd, "drop",n)==0 ){
1009
+ search_drop_index();
1010
+ }else if( fossil_strncmp(zSubCmd, "exists",n)==0 ){
1011
+ fossil_print("search_index_exists() = %d\n", search_index_exists());
1012
+ }else{
1013
+ fossil_fatal("unknown subcommand \"%s\"", zSubCmd);
1014
+ }
1015
+ db_end_transaction(0);
1016
+}
9231017
--- src/search.c
+++ src/search.c
@@ -449,10 +449,12 @@
449 ** Register the "score()" SQL function to score its input text
450 ** using the given Search object. Once this function is registered,
451 ** do not delete the Search object.
452 */
453 void search_sql_setup(sqlite3 *db){
 
 
454 sqlite3_create_function(db, "score", -1, SQLITE_UTF8, 0,
455 search_score_sqlfunc, 0, 0);
456 sqlite3_create_function(db, "snippet", -1, SQLITE_UTF8, &gSearch,
457 search_score_sqlfunc, 0, 0);
458 sqlite3_create_function(db, "search_init", -1, SQLITE_UTF8, 0,
@@ -789,18 +791,18 @@
789 ** zName Name of the object being searched.
790 */
791 void search_stext(
792 char cType, /* Type of document */
793 int rid, /* BLOB.RID or TAG.TAGID value for document */
794 const char *zName, /* Name of the document */
795 Blob *pOut /* OUT: Initialize to the search text */
796 ){
797 blob_init(pOut, 0, 0);
798 switch( cType ){
799 case 'd': { /* Documents */
800 Blob doc;
801 content_get(rid, &doc);
802 blob_to_utf8_no_bom(&doc, 0);
803 get_stext_by_mimetype(&doc, mimetype_from_name(zName), pOut);
804 blob_reset(&doc);
805 break;
806 }
@@ -918,5 +920,97 @@
918 search_stext(g.argv[2][0], atoi(g.argv[3]), g.argv[4], &out);
919 zUrl = search_url(g.argv[2][0], atoi(g.argv[3]), g.argv[4]);
920 fossil_print("%s\n%z\n",blob_str(&out),zUrl);
921 blob_reset(&out);
922 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
923
--- src/search.c
+++ src/search.c
@@ -449,10 +449,12 @@
449 ** Register the "score()" SQL function to score its input text
450 ** using the given Search object. Once this function is registered,
451 ** do not delete the Search object.
452 */
453 void search_sql_setup(sqlite3 *db){
454 static int once = 0;
455 if( once++ ) return;
456 sqlite3_create_function(db, "score", -1, SQLITE_UTF8, 0,
457 search_score_sqlfunc, 0, 0);
458 sqlite3_create_function(db, "snippet", -1, SQLITE_UTF8, &gSearch,
459 search_score_sqlfunc, 0, 0);
460 sqlite3_create_function(db, "search_init", -1, SQLITE_UTF8, 0,
@@ -789,18 +791,18 @@
791 ** zName Name of the object being searched.
792 */
793 void search_stext(
794 char cType, /* Type of document */
795 int rid, /* BLOB.RID or TAG.TAGID value for document */
796 const char *zName, /* Auxiliary information */
797 Blob *pOut /* OUT: Initialize to the search text */
798 ){
799 blob_init(pOut, 0, 0);
800 switch( cType ){
801 case 'd': { /* Documents */
802 Blob doc;
803 content_get(rid, &doc);
804 blob_to_utf8_no_bom(&doc, 0);
805 get_stext_by_mimetype(&doc, mimetype_from_name(zName), pOut);
806 blob_reset(&doc);
807 break;
808 }
@@ -918,5 +920,97 @@
920 search_stext(g.argv[2][0], atoi(g.argv[3]), g.argv[4], &out);
921 zUrl = search_url(g.argv[2][0], atoi(g.argv[3]), g.argv[4]);
922 fossil_print("%s\n%z\n",blob_str(&out),zUrl);
923 blob_reset(&out);
924 }
925
926 /* The schema for the full-text index
927 */
928 static const char zFtsSchema[] =
929 @ -- One entry for each possible search result
930 @ CREATE TABLE IF NOT EXISTS "%w".ftsdocs(
931 @ id INTEGER PRIMARY KEY, -- Maps to the ftsidx.rowid
932 @ type CHAR(1), -- Type of document
933 @ rid INTEGER, -- BLOB.RID or TAG.TAGID for the document
934 @ name TEXT, -- Additional document description
935 @ idxed BOOLEAN, -- True if currently in the index
936 @ UNIQUE(type,rid)
937 @ );
938 @ CREATE INDEX "%w".ftsdocIdxed ON ftsdocs(type,rid,name) WHERE idxed==0;
939 @ CREATE VIEW IF NOT EXISTS "%w".ftscontent AS
940 @ SELECT id, type, rid, name,
941 @ stext(type,rid,name) AS stext
942 @ FROM ftsdocs;
943 @ CREATE VIRTUAL TABLE IF NOT EXISTS "%w".ftsidx
944 @ USING fts4(content="ftscontent", stext);
945 ;
946 static const char zFtsDrop[] =
947 @ DROP TABLE IF EXISTS "%w".ftsidx;
948 @ DROP VIEW IF EXISTS "%w".ftscontent;
949 @ DROP TABLE IF EXISTS "%w".ftsdocs;
950 ;
951
952 /*
953 ** Create or drop the tables associated with a full-text index.
954 */
955 void search_create_index(void){
956 const char *zDb = db_name("repository");
957 search_sql_setup(g.db);
958 db_multi_exec(zFtsSchema/*works-like:"%w%w%w%w"*/, zDb, zDb, zDb, zDb);
959 }
960 void search_drop_index(void){
961 const char *zDb = db_name("repository");
962 db_multi_exec(zFtsDrop/*works-like:"%w%w%w"*/, zDb, zDb, zDb);
963 }
964
965 /*
966 ** Return true if the full-text search index exists
967 */
968 int search_index_exists(void){
969 static int fExists = -1;
970 if( fExists<0 ) fExists = db_table_exists("repository","ftsdocs");
971 return fExists;
972 }
973
974 /*
975 ** The document described by cType,rid,zName is about to be added or
976 ** updated. If the document has already been indexed, then unindex it
977 ** now while we still have access to the old content. Add the document
978 ** to the queue of documents that need to be indexed or reindexed.
979 */
980 void search_doc_touch(char cType, int rid, const char *zName){
981 if( search_index_exists() ){
982 db_multi_exec(
983 "DELETE FROM ftsidx WHERE rowid IN"
984 " (SELECT id FROM ftsdocs WHERE type=%Q AND rid=%d AND idxed)",
985 cType, rid
986 );
987 db_multi_exec(
988 "REPLACE INTO ftsdocs(type,rid,name,idxed)"
989 " VALUES(%Q,%d,%Q,0)",
990 cType, rid, zName
991 );
992 }
993 }
994
995 /*
996 ** COMMAND: test-fts
997 */
998 void test_fts_cmd(void){
999 char *zSubCmd;
1000 int n;
1001 db_find_and_open_repository(0, 0);
1002 if( g.argc<3 ) usage("SUBCMD ...");
1003 zSubCmd = g.argv[2];
1004 n = (int)strlen(zSubCmd);
1005 db_begin_transaction();
1006 if( fossil_strncmp(zSubCmd, "create", n)==0 ){
1007 search_create_index();
1008 }else if( fossil_strncmp(zSubCmd, "drop",n)==0 ){
1009 search_drop_index();
1010 }else if( fossil_strncmp(zSubCmd, "exists",n)==0 ){
1011 fossil_print("search_index_exists() = %d\n", search_index_exists());
1012 }else{
1013 fossil_fatal("unknown subcommand \"%s\"", zSubCmd);
1014 }
1015 db_end_transaction(0);
1016 }
1017
+1
--- src/tkt.c
+++ src/tkt.c
@@ -313,10 +313,11 @@
313313
314314
fossil_free(zTag);
315315
getAllTicketFields();
316316
if( haveTicket==0 ) return;
317317
tktid = db_int(0, "SELECT tkt_id FROM ticket WHERE tkt_uuid=%Q", zTktUuid);
318
+ search_doc_touch('t', tktid, 0);
318319
if( haveTicketChng ){
319320
db_multi_exec("DELETE FROM ticketchng WHERE tkt_id=%d;", tktid);
320321
}
321322
db_multi_exec("DELETE FROM ticket WHERE tkt_id=%d", tktid);
322323
tktid = 0;
323324
--- src/tkt.c
+++ src/tkt.c
@@ -313,10 +313,11 @@
313
314 fossil_free(zTag);
315 getAllTicketFields();
316 if( haveTicket==0 ) return;
317 tktid = db_int(0, "SELECT tkt_id FROM ticket WHERE tkt_uuid=%Q", zTktUuid);
 
318 if( haveTicketChng ){
319 db_multi_exec("DELETE FROM ticketchng WHERE tkt_id=%d;", tktid);
320 }
321 db_multi_exec("DELETE FROM ticket WHERE tkt_id=%d", tktid);
322 tktid = 0;
323
--- src/tkt.c
+++ src/tkt.c
@@ -313,10 +313,11 @@
313
314 fossil_free(zTag);
315 getAllTicketFields();
316 if( haveTicket==0 ) return;
317 tktid = db_int(0, "SELECT tkt_id FROM ticket WHERE tkt_uuid=%Q", zTktUuid);
318 search_doc_touch('t', tktid, 0);
319 if( haveTicketChng ){
320 db_multi_exec("DELETE FROM ticketchng WHERE tkt_id=%d;", tktid);
321 }
322 db_multi_exec("DELETE FROM ticket WHERE tkt_id=%d", tktid);
323 tktid = 0;
324
--- win/Makefile.PellesCGMake
+++ win/Makefile.PellesCGMake
@@ -83,11 +83,11 @@
8383
8484
# define the SQLite files, which need special flags on compile
8585
SQLITESRC=sqlite3.c
8686
ORIGSQLITESRC=$(foreach sf,$(SQLITESRC),$(SRCDIR)$(sf))
8787
SQLITEOBJ=$(foreach sf,$(SQLITESRC),$(sf:.c=.obj))
88
-SQLITEDEFINES=-DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_WIN32_NO_ANSI
88
+SQLITEDEFINES=-DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_WIN32_NO_ANSI
8989
9090
# define the SQLite shell files, which need special flags on compile
9191
SQLITESHELLSRC=shell.c
9292
ORIGSQLITESHELLSRC=$(foreach sf,$(SQLITESHELLSRC),$(SRCDIR)$(sf))
9393
SQLITESHELLOBJ=$(foreach sf,$(SQLITESHELLSRC),$(sf:.c=.obj))
9494
--- win/Makefile.PellesCGMake
+++ win/Makefile.PellesCGMake
@@ -83,11 +83,11 @@
83
84 # define the SQLite files, which need special flags on compile
85 SQLITESRC=sqlite3.c
86 ORIGSQLITESRC=$(foreach sf,$(SQLITESRC),$(SRCDIR)$(sf))
87 SQLITEOBJ=$(foreach sf,$(SQLITESRC),$(sf:.c=.obj))
88 SQLITEDEFINES=-DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_WIN32_NO_ANSI
89
90 # define the SQLite shell files, which need special flags on compile
91 SQLITESHELLSRC=shell.c
92 ORIGSQLITESHELLSRC=$(foreach sf,$(SQLITESHELLSRC),$(SRCDIR)$(sf))
93 SQLITESHELLOBJ=$(foreach sf,$(SQLITESHELLSRC),$(sf:.c=.obj))
94
--- win/Makefile.PellesCGMake
+++ win/Makefile.PellesCGMake
@@ -83,11 +83,11 @@
83
84 # define the SQLite files, which need special flags on compile
85 SQLITESRC=sqlite3.c
86 ORIGSQLITESRC=$(foreach sf,$(SQLITESRC),$(SRCDIR)$(sf))
87 SQLITEOBJ=$(foreach sf,$(SQLITESRC),$(sf:.c=.obj))
88 SQLITEDEFINES=-DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4 -DSQLITE_WIN32_NO_ANSI
89
90 # define the SQLite shell files, which need special flags on compile
91 SQLITESHELLSRC=shell.c
92 ORIGSQLITESHELLSRC=$(foreach sf,$(SQLITESHELLSRC),$(SRCDIR)$(sf))
93 SQLITESHELLOBJ=$(foreach sf,$(SQLITESHELLSRC),$(sf:.c=.obj))
94
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -24,11 +24,11 @@
2424
CFLAGS = -o
2525
BCC = $(DMDIR)\bin\dmc $(CFLAGS)
2626
TCC = $(DMDIR)\bin\dmc $(CFLAGS) $(DMCDEF) $(SSL) $(INCL)
2727
LIBS = $(DMDIR)\extra\lib\ zlib wsock32 advapi32
2828
29
-SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS
29
+SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4
3030
3131
SHELL_OPTIONS = -Dmain=sqlite3_shell -DSQLITE_OMIT_LOAD_EXTENSION=1 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) -DSQLITE_SHELL_DBNAME_PROC=fossil_open -Daccess=file_access -Dsystem=fossil_system -Dgetenv=fossil_getenv -Dfopen=fossil_fopen
3232
3333
SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c bundle_.c cache_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c doc_.c encode_.c event_.c export_.c file_.c finfo_.c foci_.c fusefs_.c glob_.c graph_.c gzip_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_status_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c loadctrl_.c login_.c lookslike_.c main_.c manifest_.c markdown_.c markdown_html_.c md5_.c merge_.c merge3_.c moderate_.c name_.c path_.c pivot_.c popen_.c pqueue_.c printf_.c publish_.c purge_.c rebuild_.c regexp_.c report_.c rss_.c schema_.c search_.c setup_.c sha1_.c shun_.c sitemap_.c skins_.c sqlcmd_.c stash_.c stat_.c statrep_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
3434
3535
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -24,11 +24,11 @@
24 CFLAGS = -o
25 BCC = $(DMDIR)\bin\dmc $(CFLAGS)
26 TCC = $(DMDIR)\bin\dmc $(CFLAGS) $(DMCDEF) $(SSL) $(INCL)
27 LIBS = $(DMDIR)\extra\lib\ zlib wsock32 advapi32
28
29 SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS
30
31 SHELL_OPTIONS = -Dmain=sqlite3_shell -DSQLITE_OMIT_LOAD_EXTENSION=1 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) -DSQLITE_SHELL_DBNAME_PROC=fossil_open -Daccess=file_access -Dsystem=fossil_system -Dgetenv=fossil_getenv -Dfopen=fossil_fopen
32
33 SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c bundle_.c cache_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c doc_.c encode_.c event_.c export_.c file_.c finfo_.c foci_.c fusefs_.c glob_.c graph_.c gzip_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_status_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c loadctrl_.c login_.c lookslike_.c main_.c manifest_.c markdown_.c markdown_html_.c md5_.c merge_.c merge3_.c moderate_.c name_.c path_.c pivot_.c popen_.c pqueue_.c printf_.c publish_.c purge_.c rebuild_.c regexp_.c report_.c rss_.c schema_.c search_.c setup_.c sha1_.c shun_.c sitemap_.c skins_.c sqlcmd_.c stash_.c stat_.c statrep_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
34
35
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -24,11 +24,11 @@
24 CFLAGS = -o
25 BCC = $(DMDIR)\bin\dmc $(CFLAGS)
26 TCC = $(DMDIR)\bin\dmc $(CFLAGS) $(DMCDEF) $(SSL) $(INCL)
27 LIBS = $(DMDIR)\extra\lib\ zlib wsock32 advapi32
28
29 SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_ENABLE_FTS4
30
31 SHELL_OPTIONS = -Dmain=sqlite3_shell -DSQLITE_OMIT_LOAD_EXTENSION=1 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) -DSQLITE_SHELL_DBNAME_PROC=fossil_open -Daccess=file_access -Dsystem=fossil_system -Dgetenv=fossil_getenv -Dfopen=fossil_fopen
32
33 SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c bundle_.c cache_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c doc_.c encode_.c event_.c export_.c file_.c finfo_.c foci_.c fusefs_.c glob_.c graph_.c gzip_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_status_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c loadctrl_.c login_.c lookslike_.c main_.c manifest_.c markdown_.c markdown_html_.c md5_.c merge_.c merge3_.c moderate_.c name_.c path_.c pivot_.c popen_.c pqueue_.c printf_.c publish_.c purge_.c rebuild_.c regexp_.c report_.c rss_.c schema_.c search_.c setup_.c sha1_.c shun_.c sitemap_.c skins_.c sqlcmd_.c stash_.c stat_.c statrep_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
34
35
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -2024,10 +2024,11 @@
20242024
-DSQLITE_ENABLE_LOCKING_STYLE=0 \
20252025
-DSQLITE_THREADSAFE=0 \
20262026
-DSQLITE_DEFAULT_FILE_FORMAT=4 \
20272027
-DSQLITE_OMIT_DEPRECATED \
20282028
-DSQLITE_ENABLE_EXPLAIN_COMMENTS \
2029
+ -DSQLITE_ENABLE_FTS4 \
20292030
-DSQLITE_WIN32_NO_ANSI \
20302031
-D_HAVE__MINGW_H \
20312032
-DSQLITE_USE_MALLOC_H \
20322033
-DSQLITE_USE_MSIZE
20332034
20342035
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -2024,10 +2024,11 @@
2024 -DSQLITE_ENABLE_LOCKING_STYLE=0 \
2025 -DSQLITE_THREADSAFE=0 \
2026 -DSQLITE_DEFAULT_FILE_FORMAT=4 \
2027 -DSQLITE_OMIT_DEPRECATED \
2028 -DSQLITE_ENABLE_EXPLAIN_COMMENTS \
 
2029 -DSQLITE_WIN32_NO_ANSI \
2030 -D_HAVE__MINGW_H \
2031 -DSQLITE_USE_MALLOC_H \
2032 -DSQLITE_USE_MSIZE
2033
2034
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -2024,10 +2024,11 @@
2024 -DSQLITE_ENABLE_LOCKING_STYLE=0 \
2025 -DSQLITE_THREADSAFE=0 \
2026 -DSQLITE_DEFAULT_FILE_FORMAT=4 \
2027 -DSQLITE_OMIT_DEPRECATED \
2028 -DSQLITE_ENABLE_EXPLAIN_COMMENTS \
2029 -DSQLITE_ENABLE_FTS4 \
2030 -DSQLITE_WIN32_NO_ANSI \
2031 -D_HAVE__MINGW_H \
2032 -DSQLITE_USE_MALLOC_H \
2033 -DSQLITE_USE_MSIZE
2034
2035
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -189,10 +189,11 @@
189189
/DSQLITE_ENABLE_LOCKING_STYLE=0 \
190190
/DSQLITE_THREADSAFE=0 \
191191
/DSQLITE_DEFAULT_FILE_FORMAT=4 \
192192
/DSQLITE_OMIT_DEPRECATED \
193193
/DSQLITE_ENABLE_EXPLAIN_COMMENTS \
194
+ /DSQLITE_ENABLE_FTS4 \
194195
/DSQLITE_WIN32_NO_ANSI
195196
196197
SHELL_OPTIONS = /Dmain=sqlite3_shell \
197198
/DSQLITE_OMIT_LOAD_EXTENSION=1 \
198199
/DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) \
199200
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -189,10 +189,11 @@
189 /DSQLITE_ENABLE_LOCKING_STYLE=0 \
190 /DSQLITE_THREADSAFE=0 \
191 /DSQLITE_DEFAULT_FILE_FORMAT=4 \
192 /DSQLITE_OMIT_DEPRECATED \
193 /DSQLITE_ENABLE_EXPLAIN_COMMENTS \
 
194 /DSQLITE_WIN32_NO_ANSI
195
196 SHELL_OPTIONS = /Dmain=sqlite3_shell \
197 /DSQLITE_OMIT_LOAD_EXTENSION=1 \
198 /DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) \
199
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -189,10 +189,11 @@
189 /DSQLITE_ENABLE_LOCKING_STYLE=0 \
190 /DSQLITE_THREADSAFE=0 \
191 /DSQLITE_DEFAULT_FILE_FORMAT=4 \
192 /DSQLITE_OMIT_DEPRECATED \
193 /DSQLITE_ENABLE_EXPLAIN_COMMENTS \
194 /DSQLITE_ENABLE_FTS4 \
195 /DSQLITE_WIN32_NO_ANSI
196
197 SHELL_OPTIONS = /Dmain=sqlite3_shell \
198 /DSQLITE_OMIT_LOAD_EXTENSION=1 \
199 /DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) \
200

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button