| | @@ -794,30 +794,38 @@ |
| 794 | 794 | SRCHFLG_STATIC|SRCHFLG_HTML); |
| 795 | 795 | if( (srchFlags & SRCH_DOC)!=0 ){ |
| 796 | 796 | char *zDocGlob = db_get("doc-glob",""); |
| 797 | 797 | char *zDocBr = db_get("doc-branch","trunk"); |
| 798 | 798 | if( zDocGlob && zDocGlob[0] && zDocBr && zDocBr[0] ){ |
| 799 | + Glob * pGlob = glob_create(zDocBr) |
| 800 | + /* We're misusing a Glob as a list of comma-/space-delimited |
| 801 | + ** tokens. We're not actually doing glob matches here. */; |
| 802 | + int i; |
| 799 | 803 | db_multi_exec( |
| 800 | 804 | "CREATE VIRTUAL TABLE IF NOT EXISTS temp.foci USING files_of_checkin;" |
| 801 | 805 | ); |
| 802 | | - db_multi_exec( |
| 803 | | - "INSERT INTO x(label,url,score,id,date,snip)" |
| 804 | | - " SELECT printf('Document: %%s',title('d',blob.rid,foci.filename))," |
| 805 | | - " printf('/doc/%T/%%s',foci.filename)," |
| 806 | | - " search_score()," |
| 807 | | - " 'd'||blob.rid," |
| 808 | | - " (SELECT datetime(event.mtime) FROM event" |
| 809 | | - " WHERE objid=symbolic_name_to_rid(%Q))," |
| 810 | | - " search_snippet()" |
| 811 | | - " FROM foci CROSS JOIN blob" |
| 812 | | - " WHERE checkinID=symbolic_name_to_rid(%Q)" |
| 813 | | - " AND blob.uuid=foci.uuid" |
| 814 | | - " AND search_match(title('d',blob.rid,foci.filename)," |
| 815 | | - " body('d',blob.rid,foci.filename))" |
| 816 | | - " AND %z", |
| 817 | | - zDocBr, zDocBr, zDocBr, glob_expr("foci.filename", zDocGlob) |
| 818 | | - ); |
| 806 | + for( i = 0; i < pGlob->nPattern; ++i ){ |
| 807 | + const char * zBranch = pGlob->azPattern[i]; |
| 808 | + db_multi_exec( |
| 809 | + "INSERT INTO x(label,url,score,id,date,snip)" |
| 810 | + " SELECT printf('Document: %%s',title('d',blob.rid,foci.filename))," |
| 811 | + " printf('/doc/%T/%%s',foci.filename)," |
| 812 | + " search_score()," |
| 813 | + " 'd'||blob.rid," |
| 814 | + " (SELECT datetime(event.mtime) FROM event" |
| 815 | + " WHERE objid=symbolic_name_to_rid(%Q))," |
| 816 | + " search_snippet()" |
| 817 | + " FROM foci CROSS JOIN blob" |
| 818 | + " WHERE checkinID=symbolic_name_to_rid(%Q)" |
| 819 | + " AND blob.uuid=foci.uuid" |
| 820 | + " AND search_match(title('d',blob.rid,foci.filename)," |
| 821 | + " body('d',blob.rid,foci.filename))" |
| 822 | + " AND %z", |
| 823 | + zBranch, zBranch, zBranch, glob_expr("foci.filename", zDocGlob) |
| 824 | + ); |
| 825 | + } |
| 826 | + glob_free(pGlob); |
| 819 | 827 | } |
| 820 | 828 | fossil_free(zDocGlob); |
| 821 | 829 | fossil_free(zDocBr); |
| 822 | 830 | } |
| 823 | 831 | if( (srchFlags & SRCH_WIKI)!=0 ){ |
| | @@ -1880,59 +1888,68 @@ |
| 1880 | 1888 | ** and if the latest check-in on doc-br is in the unindexed set of |
| 1881 | 1889 | ** check-ins, then update all 'd' entries in FTSDOCS that have |
| 1882 | 1890 | ** changed. |
| 1883 | 1891 | */ |
| 1884 | 1892 | static void search_update_doc_index(void){ |
| 1885 | | - const char *zDocBr = db_get("doc-branch","trunk"); |
| 1886 | | - int ckid = zDocBr ? symbolic_name_to_rid(zDocBr,"ci") : 0; |
| 1887 | | - double rTime; |
| 1888 | | - if( ckid==0 ) return; |
| 1889 | | - if( !db_exists("SELECT 1 FROM ftsdocs WHERE type='c' AND rid=%d" |
| 1890 | | - " AND NOT idxed", ckid) ) return; |
| 1891 | | - |
| 1892 | | - /* If we get this far, it means that changes to 'd' entries are |
| 1893 | | - ** required. */ |
| 1894 | | - 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; |
| 1895 | 1899 | db_multi_exec( |
| 1896 | 1900 | "CREATE TEMP TABLE current_docs(rid INTEGER PRIMARY KEY, name);" |
| 1897 | 1901 | "CREATE VIRTUAL TABLE IF NOT EXISTS temp.foci USING files_of_checkin;" |
| 1898 | | - "INSERT OR IGNORE INTO current_docs(rid, name)" |
| 1899 | | - " SELECT blob.rid, foci.filename FROM foci, blob" |
| 1900 | | - " WHERE foci.checkinID=%d AND blob.uuid=foci.uuid" |
| 1901 | | - " AND %z", |
| 1902 | | - ckid, glob_expr("foci.filename", db_get("doc-glob","")) |
| 1903 | | - ); |
| 1904 | | - db_multi_exec( |
| 1905 | | - "DELETE FROM ftsidx WHERE rowid IN" |
| 1906 | | - " (SELECT rowid FROM ftsdocs WHERE type='d'" |
| 1907 | | - " AND rid NOT IN (SELECT rid FROM current_docs))" |
| 1908 | | - ); |
| 1909 | | - db_multi_exec( |
| 1910 | | - "DELETE FROM ftsdocs WHERE type='d'" |
| 1911 | | - " AND rid NOT IN (SELECT rid FROM current_docs)" |
| 1912 | | - ); |
| 1913 | | - db_multi_exec( |
| 1914 | | - "INSERT OR IGNORE INTO ftsdocs(type,rid,name,idxed,label,bx,url,mtime)" |
| 1915 | | - " SELECT 'd', rid, name, 0," |
| 1916 | | - " title('d',rid,name)," |
| 1917 | | - " body('d',rid,name)," |
| 1918 | | - " printf('/doc/%T/%%s',urlencode(name))," |
| 1919 | | - " %.17g" |
| 1920 | | - " FROM current_docs", |
| 1921 | | - zDocBr, rTime |
| 1922 | | - ); |
| 1923 | | - db_multi_exec( |
| 1924 | | - "INSERT INTO ftsidx(rowid,title,body)" |
| 1925 | | - " SELECT rowid, label, bx FROM ftsdocs WHERE type='d' AND NOT idxed" |
| 1926 | | - ); |
| 1927 | | - db_multi_exec( |
| 1928 | | - "UPDATE ftsdocs SET" |
| 1929 | | - " idxed=1," |
| 1930 | | - " bx=NULL," |
| 1931 | | - " label='Document: '||label" |
| 1932 | | - " WHERE type='d' AND NOT idxed" |
| 1933 | | - ); |
| 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); |
| 1934 | 1951 | } |
| 1935 | 1952 | |
| 1936 | 1953 | /* |
| 1937 | 1954 | ** Deal with all of the unindexed 'c' terms in FTSDOCS |
| 1938 | 1955 | */ |
| 1939 | 1956 | |