| | @@ -634,15 +634,16 @@ |
| 634 | 634 | srchFlags = SRCH_ALL; |
| 635 | 635 | }else{ |
| 636 | 636 | srchFlags = 0; |
| 637 | 637 | for(i=0; zScope[i]; i++){ |
| 638 | 638 | switch( zScope[i] ){ |
| 639 | | - case 'a': srchFlags = SRCH_ALL; break; |
| 639 | + case 'a': srchFlags = SRCH_ALL; break; |
| 640 | 640 | case 'c': srchFlags |= SRCH_CKIN; break; |
| 641 | 641 | case 'd': srchFlags |= SRCH_DOC; break; |
| 642 | 642 | case 'e': srchFlags |= SRCH_TECHNOTE; break; |
| 643 | 643 | case 'f': srchFlags |= SRCH_FORUM; break; |
| 644 | + case 'h': srchFlags |= SRCH_HELP; break; |
| 644 | 645 | case 't': srchFlags |= SRCH_TKT; break; |
| 645 | 646 | case 'w': srchFlags |= SRCH_WIKI; break; |
| 646 | 647 | } |
| 647 | 648 | } |
| 648 | 649 | } |
| | @@ -654,10 +655,13 @@ |
| 654 | 655 | if( !search_index_exists() ){ |
| 655 | 656 | search_fullscan(zPattern, srchFlags); /* Full-scan search */ |
| 656 | 657 | }else{ |
| 657 | 658 | search_update_index(srchFlags); /* Update the index */ |
| 658 | 659 | search_indexed(zPattern, srchFlags); /* Indexed search */ |
| 660 | + if( srchFlags & SRCH_HELP ){ |
| 661 | + search_fullscan(zPattern, SRCH_HELP); |
| 662 | + } |
| 659 | 663 | } |
| 660 | 664 | db_prepare(&q, "SELECT snip, label, score, id, date" |
| 661 | 665 | " FROM x" |
| 662 | 666 | " ORDER BY score DESC, date DESC;"); |
| 663 | 667 | blob_init(&com, 0, 0); |
| | @@ -731,11 +735,12 @@ |
| 731 | 735 | #define SRCH_DOC 0x0002 /* Search over embedded documents */ |
| 732 | 736 | #define SRCH_TKT 0x0004 /* Search over tickets */ |
| 733 | 737 | #define SRCH_WIKI 0x0008 /* Search over wiki */ |
| 734 | 738 | #define SRCH_TECHNOTE 0x0010 /* Search over tech notes */ |
| 735 | 739 | #define SRCH_FORUM 0x0020 /* Search over forum messages */ |
| 736 | | -#define SRCH_ALL 0x003f /* Search over everything */ |
| 740 | +#define SRCH_HELP 0x0040 /* Search built-in help (full-scan only) */ |
| 741 | +#define SRCH_ALL 0x007f /* Search over everything */ |
| 737 | 742 | #endif |
| 738 | 743 | |
| 739 | 744 | /* |
| 740 | 745 | ** Remove bits from srchFlags which are disallowed by either the |
| 741 | 746 | ** current server configuration or by user permissions. Return |
| | @@ -743,16 +748,17 @@ |
| 743 | 748 | */ |
| 744 | 749 | unsigned int search_restrict(unsigned int srchFlags){ |
| 745 | 750 | static unsigned int knownGood = 0; |
| 746 | 751 | static unsigned int knownBad = 0; |
| 747 | 752 | static const struct { unsigned m; const char *zKey; } aSetng[] = { |
| 748 | | - { SRCH_CKIN, "search-ci" }, |
| 749 | | - { SRCH_DOC, "search-doc" }, |
| 750 | | - { SRCH_TKT, "search-tkt" }, |
| 751 | | - { SRCH_WIKI, "search-wiki" }, |
| 753 | + { SRCH_CKIN, "search-ci" }, |
| 754 | + { SRCH_DOC, "search-doc" }, |
| 755 | + { SRCH_TKT, "search-tkt" }, |
| 756 | + { SRCH_WIKI, "search-wiki" }, |
| 752 | 757 | { SRCH_TECHNOTE, "search-technote" }, |
| 753 | | - { SRCH_FORUM, "search-forum" }, |
| 758 | + { SRCH_FORUM, "search-forum" }, |
| 759 | + { SRCH_HELP, "search-help" }, |
| 754 | 760 | }; |
| 755 | 761 | int i; |
| 756 | 762 | if( g.perm.Read==0 ) srchFlags &= ~(SRCH_CKIN|SRCH_DOC|SRCH_TECHNOTE); |
| 757 | 763 | if( g.perm.RdTkt==0 ) srchFlags &= ~(SRCH_TKT); |
| 758 | 764 | if( g.perm.RdWiki==0 ) srchFlags &= ~(SRCH_WIKI); |
| | @@ -912,10 +918,23 @@ |
| 912 | 918 | " search_snippet()" |
| 913 | 919 | " FROM event JOIN blob on event.objid=blob.rid" |
| 914 | 920 | " WHERE search_match('',body('f',rid,NULL));" |
| 915 | 921 | ); |
| 916 | 922 | } |
| 923 | + if( (srchFlags & SRCH_HELP)!=0 ){ |
| 924 | + helptext_vtab_register(g.db); |
| 925 | + db_multi_exec( |
| 926 | + "INSERT INTO x(label,url,score,id,snip)" |
| 927 | + " SELECT format('Built-in help for the \"%%s\" %%s',name,type)," |
| 928 | + " '/help?cmd='||name," |
| 929 | + " search_score()," |
| 930 | + " 'h'||rowid," |
| 931 | + " search_snippet()" |
| 932 | + " FROM helptext" |
| 933 | + " WHERE search_match('',helptext.helptext);" |
| 934 | + ); |
| 935 | + } |
| 917 | 936 | } |
| 918 | 937 | |
| 919 | 938 | /* |
| 920 | 939 | ** Number of significant bits in a u32 |
| 921 | 940 | */ |
| | @@ -1068,10 +1087,11 @@ |
| 1068 | 1087 | { SRCH_DOC, 'd' }, |
| 1069 | 1088 | { SRCH_TKT, 't' }, |
| 1070 | 1089 | { SRCH_WIKI, 'w' }, |
| 1071 | 1090 | { SRCH_TECHNOTE, 'e' }, |
| 1072 | 1091 | { SRCH_FORUM, 'f' }, |
| 1092 | + { SRCH_HELP, 'h' }, |
| 1073 | 1093 | }; |
| 1074 | 1094 | int i; |
| 1075 | 1095 | for(i=0; i<count(aMask); i++){ |
| 1076 | 1096 | if( srchFlags & aMask[i].m ){ |
| 1077 | 1097 | blob_appendf(&sql, "%sftsdocs.type='%c'", zSep, aMask[i].c); |
| | @@ -1169,10 +1189,13 @@ |
| 1169 | 1189 | if( !search_index_exists() ){ |
| 1170 | 1190 | search_fullscan(zPattern, srchFlags); /* Full-scan search */ |
| 1171 | 1191 | }else{ |
| 1172 | 1192 | search_update_index(srchFlags); /* Update the index, if necessary */ |
| 1173 | 1193 | search_indexed(zPattern, srchFlags); /* Indexed search */ |
| 1194 | + if( srchFlags & SRCH_HELP ){ |
| 1195 | + search_fullscan(zPattern, SRCH_HELP); |
| 1196 | + } |
| 1174 | 1197 | } |
| 1175 | 1198 | db_prepare(&q, "SELECT url, snip, label, score, id, substr(date,1,10)" |
| 1176 | 1199 | " FROM x" |
| 1177 | 1200 | " ORDER BY score DESC, date DESC;"); |
| 1178 | 1201 | while( db_step(&q)==SQLITE_ROW ){ |
| | @@ -1239,10 +1262,11 @@ |
| 1239 | 1262 | case SRCH_DOC: zType = " Docs"; zClass = "Doc"; break; |
| 1240 | 1263 | case SRCH_TKT: zType = " Tickets"; zClass = "Tkt"; break; |
| 1241 | 1264 | case SRCH_WIKI: zType = " Wiki"; zClass = "Wiki"; break; |
| 1242 | 1265 | case SRCH_TECHNOTE: zType = " Tech Notes"; zClass = "Note"; break; |
| 1243 | 1266 | case SRCH_FORUM: zType = " Forum"; zClass = "Frm"; break; |
| 1267 | + case SRCH_HELP: zType = " Help"; zClass = "Hlp"; break; |
| 1244 | 1268 | } |
| 1245 | 1269 | if( srchFlags==0 ){ |
| 1246 | 1270 | if( mFlags & 0x02 ) return 0; |
| 1247 | 1271 | zDisable1 = " disabled"; |
| 1248 | 1272 | zDisable2 = " disabled"; |
| | @@ -1266,10 +1290,11 @@ |
| 1266 | 1290 | { "d", "Docs", SRCH_DOC }, |
| 1267 | 1291 | { "t", "Tickets", SRCH_TKT }, |
| 1268 | 1292 | { "w", "Wiki", SRCH_WIKI }, |
| 1269 | 1293 | { "e", "Tech Notes", SRCH_TECHNOTE }, |
| 1270 | 1294 | { "f", "Forum", SRCH_FORUM }, |
| 1295 | + { "h", "Help", SRCH_HELP }, |
| 1271 | 1296 | }; |
| 1272 | 1297 | const char *zY = PD("y","all"); |
| 1273 | 1298 | unsigned newFlags = srchFlags; |
| 1274 | 1299 | int i; |
| 1275 | 1300 | @ <select size='1' name='y'> |
| | @@ -1321,10 +1346,11 @@ |
| 1321 | 1346 | ** d -> documentation |
| 1322 | 1347 | ** t -> tickets |
| 1323 | 1348 | ** w -> wiki |
| 1324 | 1349 | ** e -> tech notes |
| 1325 | 1350 | ** f -> forum |
| 1351 | +** h -> built-in help |
| 1326 | 1352 | ** all -> everything |
| 1327 | 1353 | */ |
| 1328 | 1354 | void search_page(void){ |
| 1329 | 1355 | const int isSearch = P("s")!=0; |
| 1330 | 1356 | login_check_credentials(); |
| 1331 | 1357 | |