Fossil SCM
Extend [b82749b94bd1db3f] to include the fts reindexing step.
Commit
3d76303a4f911db532fadef94f99b7840fd884834f7cc661471898192e1488dd
Parent
a344402e9fb36a0…
1 file changed
+55
-46
+55
-46
| --- src/search.c | ||
| +++ src/search.c | ||
| @@ -1888,59 +1888,68 @@ | ||
| 1888 | 1888 | ** and if the latest check-in on doc-br is in the unindexed set of |
| 1889 | 1889 | ** check-ins, then update all 'd' entries in FTSDOCS that have |
| 1890 | 1890 | ** changed. |
| 1891 | 1891 | */ |
| 1892 | 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); | |
| 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; | |
| 1903 | 1899 | db_multi_exec( |
| 1904 | 1900 | "CREATE TEMP TABLE current_docs(rid INTEGER PRIMARY KEY, name);" |
| 1905 | 1901 | "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); | |
| 1942 | 1951 | } |
| 1943 | 1952 | |
| 1944 | 1953 | /* |
| 1945 | 1954 | ** Deal with all of the unindexed 'c' terms in FTSDOCS |
| 1946 | 1955 | */ |
| 1947 | 1956 |
| --- 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 |