Fossil SCM

Extend [b82749b94bd1db3f] to include the fts reindexing step.

stephan 2024-10-22 23:42 doc-branch-multi
Commit 3d76303a4f911db532fadef94f99b7840fd884834f7cc661471898192e1488dd
1 file changed +55 -46
+55 -46
--- src/search.c
+++ src/search.c
@@ -1888,59 +1888,68 @@
18881888
** and if the latest check-in on doc-br is in the unindexed set of
18891889
** check-ins, then update all 'd' entries in FTSDOCS that have
18901890
** changed.
18911891
*/
18921892
static void search_update_doc_index(void){
1893
- const char *zDocBr = db_get("doc-branch","trunk");
1894
- int ckid = zDocBr ? symbolic_name_to_rid(zDocBr,"ci") : 0;
1895
- double rTime;
1896
- if( ckid==0 ) return;
1897
- if( !db_exists("SELECT 1 FROM ftsdocs WHERE type='c' AND rid=%d"
1898
- " AND NOT idxed", ckid) ) return;
1899
-
1900
- /* If we get this far, it means that changes to 'd' entries are
1901
- ** required. */
1902
- rTime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", ckid);
1893
+ const char *zDocBranches = db_get("doc-branch","trunk");
1894
+ int i;
1895
+ Glob * pGlob = glob_create(zDocBranches)
1896
+ /* We're misusing a Glob as a list of comma-/space-delimited
1897
+ ** tokens. We're not actually doing glob matches here. */;
1898
+ if( !pGlob ) return;
19031899
db_multi_exec(
19041900
"CREATE TEMP TABLE current_docs(rid INTEGER PRIMARY KEY, name);"
19051901
"CREATE VIRTUAL TABLE IF NOT EXISTS temp.foci USING files_of_checkin;"
1906
- "INSERT OR IGNORE INTO current_docs(rid, name)"
1907
- " SELECT blob.rid, foci.filename FROM foci, blob"
1908
- " WHERE foci.checkinID=%d AND blob.uuid=foci.uuid"
1909
- " AND %z",
1910
- ckid, glob_expr("foci.filename", db_get("doc-glob",""))
1911
- );
1912
- db_multi_exec(
1913
- "DELETE FROM ftsidx WHERE rowid IN"
1914
- " (SELECT rowid FROM ftsdocs WHERE type='d'"
1915
- " AND rid NOT IN (SELECT rid FROM current_docs))"
1916
- );
1917
- db_multi_exec(
1918
- "DELETE FROM ftsdocs WHERE type='d'"
1919
- " AND rid NOT IN (SELECT rid FROM current_docs)"
1920
- );
1921
- db_multi_exec(
1922
- "INSERT OR IGNORE INTO ftsdocs(type,rid,name,idxed,label,bx,url,mtime)"
1923
- " SELECT 'd', rid, name, 0,"
1924
- " title('d',rid,name),"
1925
- " body('d',rid,name),"
1926
- " printf('/doc/%T/%%s',urlencode(name)),"
1927
- " %.17g"
1928
- " FROM current_docs",
1929
- zDocBr, rTime
1930
- );
1931
- db_multi_exec(
1932
- "INSERT INTO ftsidx(rowid,title,body)"
1933
- " SELECT rowid, label, bx FROM ftsdocs WHERE type='d' AND NOT idxed"
1934
- );
1935
- db_multi_exec(
1936
- "UPDATE ftsdocs SET"
1937
- " idxed=1,"
1938
- " bx=NULL,"
1939
- " label='Document: '||label"
1940
- " WHERE type='d' AND NOT idxed"
1941
- );
1902
+ );
1903
+ for( i = 0; i < pGlob->nPattern; ++i ){
1904
+ const char *zDocBr = pGlob->azPattern[i];
1905
+ int ckid = symbolic_name_to_rid(zDocBr,"ci");
1906
+ double rTime;
1907
+ if( !db_exists("SELECT 1 FROM ftsdocs WHERE type='c' AND rid=%d"
1908
+ " AND NOT idxed", ckid) ) continue;
1909
+ /* If we get this far, it means that changes to 'd' entries are
1910
+ ** required. */
1911
+ rTime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", ckid);
1912
+ db_multi_exec(
1913
+ "INSERT OR IGNORE INTO current_docs(rid, name)"
1914
+ " SELECT blob.rid, foci.filename FROM foci, blob"
1915
+ " WHERE foci.checkinID=%d AND blob.uuid=foci.uuid"
1916
+ " AND %z",
1917
+ ckid, glob_expr("foci.filename", db_get("doc-glob",""))
1918
+ );
1919
+ db_multi_exec(
1920
+ "DELETE FROM ftsidx WHERE rowid IN"
1921
+ " (SELECT rowid FROM ftsdocs WHERE type='d'"
1922
+ " AND rid NOT IN (SELECT rid FROM current_docs))"
1923
+ );
1924
+ db_multi_exec(
1925
+ "DELETE FROM ftsdocs WHERE type='d'"
1926
+ " AND rid NOT IN (SELECT rid FROM current_docs)"
1927
+ );
1928
+ db_multi_exec(
1929
+ "INSERT OR IGNORE INTO ftsdocs(type,rid,name,idxed,label,bx,url,mtime)"
1930
+ " SELECT 'd', rid, name, 0,"
1931
+ " title('d',rid,name),"
1932
+ " body('d',rid,name),"
1933
+ " printf('/doc/%T/%%s',urlencode(name)),"
1934
+ " %.17g"
1935
+ " FROM current_docs",
1936
+ zDocBr, rTime
1937
+ );
1938
+ db_multi_exec(
1939
+ "INSERT INTO ftsidx(rowid,title,body)"
1940
+ " SELECT rowid, label, bx FROM ftsdocs WHERE type='d' AND NOT idxed"
1941
+ );
1942
+ db_multi_exec(
1943
+ "UPDATE ftsdocs SET"
1944
+ " idxed=1,"
1945
+ " bx=NULL,"
1946
+ " label='Document: '||label"
1947
+ " WHERE type='d' AND NOT idxed"
1948
+ );
1949
+ }
1950
+ glob_free(pGlob);
19421951
}
19431952
19441953
/*
19451954
** Deal with all of the unindexed 'c' terms in FTSDOCS
19461955
*/
19471956
--- src/search.c
+++ src/search.c
@@ -1888,59 +1888,68 @@
1888 ** and if the latest check-in on doc-br is in the unindexed set of
1889 ** check-ins, then update all 'd' entries in FTSDOCS that have
1890 ** changed.
1891 */
1892 static void search_update_doc_index(void){
1893 const char *zDocBr = db_get("doc-branch","trunk");
1894 int ckid = zDocBr ? symbolic_name_to_rid(zDocBr,"ci") : 0;
1895 double rTime;
1896 if( ckid==0 ) return;
1897 if( !db_exists("SELECT 1 FROM ftsdocs WHERE type='c' AND rid=%d"
1898 " AND NOT idxed", ckid) ) return;
1899
1900 /* If we get this far, it means that changes to 'd' entries are
1901 ** required. */
1902 rTime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", ckid);
1903 db_multi_exec(
1904 "CREATE TEMP TABLE current_docs(rid INTEGER PRIMARY KEY, name);"
1905 "CREATE VIRTUAL TABLE IF NOT EXISTS temp.foci USING files_of_checkin;"
1906 "INSERT OR IGNORE INTO current_docs(rid, name)"
1907 " SELECT blob.rid, foci.filename FROM foci, blob"
1908 " WHERE foci.checkinID=%d AND blob.uuid=foci.uuid"
1909 " AND %z",
1910 ckid, glob_expr("foci.filename", db_get("doc-glob",""))
1911 );
1912 db_multi_exec(
1913 "DELETE FROM ftsidx WHERE rowid IN"
1914 " (SELECT rowid FROM ftsdocs WHERE type='d'"
1915 " AND rid NOT IN (SELECT rid FROM current_docs))"
1916 );
1917 db_multi_exec(
1918 "DELETE FROM ftsdocs WHERE type='d'"
1919 " AND rid NOT IN (SELECT rid FROM current_docs)"
1920 );
1921 db_multi_exec(
1922 "INSERT OR IGNORE INTO ftsdocs(type,rid,name,idxed,label,bx,url,mtime)"
1923 " SELECT 'd', rid, name, 0,"
1924 " title('d',rid,name),"
1925 " body('d',rid,name),"
1926 " printf('/doc/%T/%%s',urlencode(name)),"
1927 " %.17g"
1928 " FROM current_docs",
1929 zDocBr, rTime
1930 );
1931 db_multi_exec(
1932 "INSERT INTO ftsidx(rowid,title,body)"
1933 " SELECT rowid, label, bx FROM ftsdocs WHERE type='d' AND NOT idxed"
1934 );
1935 db_multi_exec(
1936 "UPDATE ftsdocs SET"
1937 " idxed=1,"
1938 " bx=NULL,"
1939 " label='Document: '||label"
1940 " WHERE type='d' AND NOT idxed"
1941 );
 
 
 
 
 
 
 
 
 
 
 
 
 
1942 }
1943
1944 /*
1945 ** Deal with all of the unindexed 'c' terms in FTSDOCS
1946 */
1947
--- src/search.c
+++ src/search.c
@@ -1888,59 +1888,68 @@
1888 ** and if the latest check-in on doc-br is in the unindexed set of
1889 ** check-ins, then update all 'd' entries in FTSDOCS that have
1890 ** changed.
1891 */
1892 static void search_update_doc_index(void){
1893 const char *zDocBranches = db_get("doc-branch","trunk");
1894 int i;
1895 Glob * pGlob = glob_create(zDocBranches)
1896 /* We're misusing a Glob as a list of comma-/space-delimited
1897 ** tokens. We're not actually doing glob matches here. */;
1898 if( !pGlob ) return;
 
 
 
 
1899 db_multi_exec(
1900 "CREATE TEMP TABLE current_docs(rid INTEGER PRIMARY KEY, name);"
1901 "CREATE VIRTUAL TABLE IF NOT EXISTS temp.foci USING files_of_checkin;"
1902 );
1903 for( i = 0; i < pGlob->nPattern; ++i ){
1904 const char *zDocBr = pGlob->azPattern[i];
1905 int ckid = symbolic_name_to_rid(zDocBr,"ci");
1906 double rTime;
1907 if( !db_exists("SELECT 1 FROM ftsdocs WHERE type='c' AND rid=%d"
1908 " AND NOT idxed", ckid) ) continue;
1909 /* If we get this far, it means that changes to 'd' entries are
1910 ** required. */
1911 rTime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", ckid);
1912 db_multi_exec(
1913 "INSERT OR IGNORE INTO current_docs(rid, name)"
1914 " SELECT blob.rid, foci.filename FROM foci, blob"
1915 " WHERE foci.checkinID=%d AND blob.uuid=foci.uuid"
1916 " AND %z",
1917 ckid, glob_expr("foci.filename", db_get("doc-glob",""))
1918 );
1919 db_multi_exec(
1920 "DELETE FROM ftsidx WHERE rowid IN"
1921 " (SELECT rowid FROM ftsdocs WHERE type='d'"
1922 " AND rid NOT IN (SELECT rid FROM current_docs))"
1923 );
1924 db_multi_exec(
1925 "DELETE FROM ftsdocs WHERE type='d'"
1926 " AND rid NOT IN (SELECT rid FROM current_docs)"
1927 );
1928 db_multi_exec(
1929 "INSERT OR IGNORE INTO ftsdocs(type,rid,name,idxed,label,bx,url,mtime)"
1930 " SELECT 'd', rid, name, 0,"
1931 " title('d',rid,name),"
1932 " body('d',rid,name),"
1933 " printf('/doc/%T/%%s',urlencode(name)),"
1934 " %.17g"
1935 " FROM current_docs",
1936 zDocBr, rTime
1937 );
1938 db_multi_exec(
1939 "INSERT INTO ftsidx(rowid,title,body)"
1940 " SELECT rowid, label, bx FROM ftsdocs WHERE type='d' AND NOT idxed"
1941 );
1942 db_multi_exec(
1943 "UPDATE ftsdocs SET"
1944 " idxed=1,"
1945 " bx=NULL,"
1946 " label='Document: '||label"
1947 " WHERE type='d' AND NOT idxed"
1948 );
1949 }
1950 glob_free(pGlob);
1951 }
1952
1953 /*
1954 ** Deal with all of the unindexed 'c' terms in FTSDOCS
1955 */
1956

Keyboard Shortcuts

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