Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Unfinished comment in search.c, and some more end-of-line spacing removals. No change in functionality. |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
5260fbf632874b61c491e5cf95a13434 |
| User & Date: | jan.nijtmans 2015-02-05 09:01:31 |
Context
|
2015-02-05
| ||
| 14:42 | Fix a broken hyperlink on the permutedindex.html page. check-in: 0d1d7f6481 user: drh tags: trunk | |
| 11:58 | Merge trunk fixes into the form-submenu branch. check-in: d539f65cc2 user: drh tags: form-submenu | |
| 09:10 | merge trunk check-in: 9e7ea6a20f user: jan.nijtmans tags: svn-import | |
| 09:01 | Unfinished comment in search.c, and some more end-of-line spacing removals. No change in functionality. check-in: 5260fbf632 user: jan.nijtmans tags: trunk | |
| 02:51 | Fix the "Tickets" menu option on "San Francisco Modern" so that it points to /ticket instead of /reportlist. check-in: b2f2f0ce2f user: drh tags: trunk | |
Changes
Changes to src/doc.c.
| ︙ | ︙ | |||
401 402 403 404 405 406 407 |
int doc_is_embedded_html(Blob *pContent, Blob *pTitle){
const char *zIn = blob_str(pContent);
const char *zAttr;
const char *zValue;
int nAttr, nValue;
int seenClass = 0;
int seenTitle = 0;
| | | 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 |
int doc_is_embedded_html(Blob *pContent, Blob *pTitle){
const char *zIn = blob_str(pContent);
const char *zAttr;
const char *zValue;
int nAttr, nValue;
int seenClass = 0;
int seenTitle = 0;
while( fossil_isspace(zIn[0]) ) zIn++;
if( fossil_strnicmp(zIn,"<div",4)!=0 ) return 0;
zIn += 4;
while( zIn[0] ){
if( fossil_isspace(zIn[0]) ) zIn++;
if( zIn[0]=='>' ) return 0;
zAttr = zIn;
|
| ︙ | ︙ | |||
442 443 444 445 446 447 448 |
if( nAttr==10 && fossil_strnicmp(zAttr,"data-title",10)==0 ){
blob_append(pTitle, zValue, nValue);
seenTitle = 1;
if( seenClass ) return 1;
}
}
return seenClass;
| | | 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 |
if( nAttr==10 && fossil_strnicmp(zAttr,"data-title",10)==0 ){
blob_append(pTitle, zValue, nValue);
seenTitle = 1;
if( seenClass ) return 1;
}
}
return seenClass;
}
/*
** Look for a file named zName in the checkin with RID=vid. Load the content
** of that file into pContent and return the RID for the file. Or return 0
** if the file is not found or could not be loaded.
*/
int doc_load_content(int vid, const char *zName, Blob *pContent){
|
| ︙ | ︙ |
Changes to src/rebuild.c.
| ︙ | ︙ | |||
584 585 586 587 588 589 590 |
}
db_close(1);
db_open_repository(g.zRepositoryName);
}
runReindex = search_index_exists();
if( find_option("index",0,0)!=0 ) runReindex = 1;
if( find_option("no-index",0,0)!=0 ) runReindex = 0;
| | | 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 |
}
db_close(1);
db_open_repository(g.zRepositoryName);
}
runReindex = search_index_exists();
if( find_option("index",0,0)!=0 ) runReindex = 1;
if( find_option("no-index",0,0)!=0 ) runReindex = 0;
/* We should be done with options.. */
verify_all_options();
db_begin_transaction();
search_drop_index();
ttyOutput = 1;
errCnt = rebuild_db(randomizeFlag, 1, doClustering);
|
| ︙ | ︙ | |||
805 806 807 808 809 810 811 |
int bVerily = find_option("verily",0,0)!=0;
int bForce = find_option("force", "f", 0)!=0;
int privateOnly = find_option("private",0,0)!=0;
int bNeedRebuild = 0;
db_find_and_open_repository(OPEN_ANY_SCHEMA, 2);
db_close(1);
db_open_repository(g.zRepositoryName);
| | | 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 |
int bVerily = find_option("verily",0,0)!=0;
int bForce = find_option("force", "f", 0)!=0;
int privateOnly = find_option("private",0,0)!=0;
int bNeedRebuild = 0;
db_find_and_open_repository(OPEN_ANY_SCHEMA, 2);
db_close(1);
db_open_repository(g.zRepositoryName);
/* We should be done with options.. */
verify_all_options();
if( !bForce ){
Blob ans;
char cReply;
prompt_user(
|
| ︙ | ︙ | |||
935 936 937 938 939 940 941 |
}
if( file_isdir(g.argv[3])!=1 ){
fossil_print("\"%s\" is not a directory\n\n", g.argv[3]);
usage("FILENAME DIRECTORY");
}
db_create_repository(g.argv[2]);
db_open_repository(g.argv[2]);
| | | 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 |
}
if( file_isdir(g.argv[3])!=1 ){
fossil_print("\"%s\" is not a directory\n\n", g.argv[3]);
usage("FILENAME DIRECTORY");
}
db_create_repository(g.argv[2]);
db_open_repository(g.argv[2]);
/* We should be done with options.. */
verify_all_options();
db_open_config(0);
db_begin_transaction();
db_initial_setup(0, 0, 0, 1);
|
| ︙ | ︙ |
Changes to src/rss.c.
| ︙ | ︙ | |||
63 64 65 66 67 68 69 |
@ (SELECT count(*) FROM plink WHERE pid=blob.rid AND isprim),
@ (SELECT count(*) FROM plink WHERE cid=blob.rid)
@ FROM event, blob
@ WHERE blob.rid=event.objid
;
login_check_credentials();
| | | | 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
@ (SELECT count(*) FROM plink WHERE pid=blob.rid AND isprim),
@ (SELECT count(*) FROM plink WHERE cid=blob.rid)
@ FROM event, blob
@ WHERE blob.rid=event.objid
;
login_check_credentials();
if( !g.perm.Read && !g.perm.RdTkt && !g.perm.RdWiki ){
return;
}
blob_zero(&bSQL);
blob_append( &bSQL, zSQL1, -1 );
if( zType[0]!='a' ){
if( zType[0]=='c' && !g.perm.Read ) zType = "x";
if( zType[0]=='w' && !g.perm.RdWiki ) zType = "x";
if( zType[0]=='t' && !g.perm.RdTkt ) zType = "x";
blob_append_sql(&bSQL, " AND event.type=%Q", zType);
}else{
if( !g.perm.Read ){
if( g.perm.RdTkt && g.perm.RdWiki ){
blob_append(&bSQL, " AND event.type!='ci'", -1);
}else if( g.perm.RdTkt ){
blob_append(&bSQL, " AND event.type=='t'", -1);
}else{
blob_append(&bSQL, " AND event.type=='w'", -1);
}
}else if( !g.perm.RdWiki ){
if( g.perm.RdTkt ){
blob_append(&bSQL, " AND event.type!='w'", -1);
}else{
|
| ︙ | ︙ |
Changes to src/schema.c.
| ︙ | ︙ | |||
228 229 230 231 232 233 234 | @ CREATE TABLE filename( @ fnid INTEGER PRIMARY KEY, -- Filename ID @ name TEXT UNIQUE -- Name of file page @ ); @ @ -- Linkages between checkins, files created by each checkin, and @ -- the names of those files. | | | 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 | @ CREATE TABLE filename( @ fnid INTEGER PRIMARY KEY, -- Filename ID @ name TEXT UNIQUE -- Name of file page @ ); @ @ -- Linkages between checkins, files created by each checkin, and @ -- the names of those files. @ -- @ -- Each entry represents a file that changed content from pid to fid @ -- due to the check-in that goes from pmid to mid. fnid is the name @ -- of the file in the mid check-in. If the file was renamed as part @ -- of the mid check-in, then pfnid is the previous filename. @ @ -- There can be multiple entries for (mid,fid) if the mid checkin was @ -- a merge. Entries with isaux==0 are from the primary parent. Merge |
| ︙ | ︙ |
Changes to src/search.c.
| ︙ | ︙ | |||
39 40 41 42 43 44 45 |
int nTerm; /* Number of search terms */
struct srchTerm { /* For each search term */
char *z; /* Text */
int n; /* length */
} a[SEARCH_MAX_TERM];
/* Snippet controls */
char *zPattern; /* The search pattern */
| | | 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
int nTerm; /* Number of search terms */
struct srchTerm { /* For each search term */
char *z; /* Text */
int n; /* length */
} a[SEARCH_MAX_TERM];
/* Snippet controls */
char *zPattern; /* The search pattern */
char *zMarkBegin; /* Start of a match */
char *zMarkEnd; /* End of a match */
char *zMarkGap; /* A gap between two matches */
unsigned fSrchFlg; /* Flags */
int iScore; /* Score of the last match attempt */
Blob snip; /* Snippet for the most recent match */
};
|
| ︙ | ︙ | |||
102 103 104 105 106 107 108 | } /* ** Compile a search pattern */ Search *search_init( const char *zPattern, /* The search pattern */ | | | 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
}
/*
** Compile a search pattern
*/
Search *search_init(
const char *zPattern, /* The search pattern */
const char *zMarkBegin, /* Start of a match */
const char *zMarkEnd, /* End of a match */
const char *zMarkGap, /* A gap between two matches */
unsigned fSrchFlg /* Flags */
){
Search *p;
char *z;
int i;
|
| ︙ | ︙ | |||
225 226 227 228 229 230 231 |
}
while( ISALNUM(zDoc[i]) ){ i++; }
if( zDoc[i]==0 ) break;
}
}
/* Finished search all documents.
| | | 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 |
}
while( ISALNUM(zDoc[i]) ){ i++; }
if( zDoc[i]==0 ) break;
}
}
/* Finished search all documents.
** Every term must be seen or else the score is zero
*/
score = 1;
for(j=0; j<p->nTerm; j++) score *= anMatch[j];
blob_reset(&p->snip);
p->iScore = score;
if( score==0 ) return score;
|
| ︙ | ︙ | |||
315 316 317 318 319 320 321 | if( wantGap ) blob_append(&p->snip, p->zMarkGap, -1); return score; } /* ** COMMAND: test-match ** | | | 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 |
if( wantGap ) blob_append(&p->snip, p->zMarkGap, -1);
return score;
}
/*
** COMMAND: test-match
**
** Usage: fossil test-match SEARCHSTRING FILE1 FILE2 ...
*/
void test_match_cmd(void){
Search *p;
int i;
Blob x;
int score;
char *zDoc;
|
| ︙ | ︙ | |||
425 426 427 428 429 430 431 |
sqlite3_result_text(context, blob_str(&gSearch.snip), -1, fossil_free);
blob_init(&gSearch.snip, 0, 0);
}
}
/*
** This is an SQLite function that computes the searchable text.
| | | 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 |
sqlite3_result_text(context, blob_str(&gSearch.snip), -1, fossil_free);
blob_init(&gSearch.snip, 0, 0);
}
}
/*
** This is an SQLite function that computes the searchable text.
** It is a wrapper around the search_stext() routine. See the
** search_stext() routine for further detail.
*/
static void search_stext_sqlfunc(
sqlite3_context *context,
int argc,
sqlite3_value **argv
){
|
| ︙ | ︙ | |||
774 775 776 777 778 779 780 |
db_multi_exec("UPDATE x SET label=printf('%%s (score=%%s)',label,score)");
#endif
}
/*
** If z[] is of the form "<mark>TEXT</mark>" where TEXT contains
** no white-space or punctuation, then return the length of the mark.
| < | | 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 |
db_multi_exec("UPDATE x SET label=printf('%%s (score=%%s)',label,score)");
#endif
}
/*
** If z[] is of the form "<mark>TEXT</mark>" where TEXT contains
** no white-space or punctuation, then return the length of the mark.
*/
static int isSnippetMark(const char *z){
int n;
if( strncmp(z,"<mark>",6)!=0 ) return 0;
n = 6;
while( fossil_isalnum(z[n]) ) n++;
if( strncmp(&z[n],"</mark>",7)!=0 ) return 0;
return n+7;
}
/*
** Return a copy of zSnip (in memory obtained from fossil_malloc()) that
** has all "<" characters, other than those on <mark> and </mark>,
** converted into "<". This is similar to htmlize() except that
** <mark> and </mark> are preserved.
*/
static char *cleanSnippet(const char *zSnip){
int i;
int n = 0;
char *z;
|
| ︙ | ︙ | |||
1106 1107 1108 1109 1110 1111 1112 |
search_stext(g.argv[2][0], atoi(g.argv[3]), g.argv[4], &out);
fossil_print("%s\n",blob_str(&out));
blob_reset(&out);
}
/* The schema for the full-text index
*/
| | | 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 |
search_stext(g.argv[2][0], atoi(g.argv[3]), g.argv[4], &out);
fossil_print("%s\n",blob_str(&out));
blob_reset(&out);
}
/* The schema for the full-text index
*/
static const char zFtsSchema[] =
@ -- One entry for each possible search result
@ CREATE TABLE IF NOT EXISTS "%w".ftsdocs(
@ rowid INTEGER PRIMARY KEY, -- Maps to the ftsidx.docid
@ type CHAR(1), -- Type of document
@ rid INTEGER, -- BLOB.RID or TAG.TAGID for the document
@ name TEXT, -- Additional document description
@ idxed BOOLEAN, -- True if currently in the index
|
| ︙ | ︙ | |||
1228 1229 1230 1231 1232 1233 1234 |
);
}
}
}
/*
** If the doc-glob and doc-br settings are valid for document search
| | | 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 |
);
}
}
}
/*
** If the doc-glob and doc-br settings are valid for document search
** and if the latest check-in on doc-br is in the unindexed set of
** check-ins, then update all 'd' entries in FTSDOCS that have
** changed.
*/
static void search_update_doc_index(void){
const char *zDocBr = db_get("doc-branch","trunk");
int ckid = zDocBr ? symbolic_name_to_rid(zDocBr,"ci") : 0;
double rTime;
|
| ︙ | ︙ | |||
1282 1283 1284 1285 1286 1287 1288 |
);
db_multi_exec(
"UPDATE ftsdocs SET idxed=1 WHERE type='d' AND NOT idxed"
);
}
/*
| | | 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 |
);
db_multi_exec(
"UPDATE ftsdocs SET idxed=1 WHERE type='d' AND NOT idxed"
);
}
/*
** Deal with all of the unindexed 'c' terms in FTSDOCS
*/
static void search_update_checkin_index(void){
db_multi_exec(
"INSERT INTO ftsidx(docid,stext)"
" SELECT rowid, stext('c',rid,NULL) FROM ftsdocs"
" WHERE type='c' AND NOT idxed;"
);
|
| ︙ | ︙ | |||
1304 1305 1306 1307 1308 1309 1310 |
" WHERE ftsdocs.type='c' AND NOT ftsdocs.idxed"
" AND event.objid=ftsdocs.rid"
" AND blob.rid=ftsdocs.rid"
);
}
/*
| | | 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 |
" WHERE ftsdocs.type='c' AND NOT ftsdocs.idxed"
" AND event.objid=ftsdocs.rid"
" AND blob.rid=ftsdocs.rid"
);
}
/*
** Deal with all of the unindexed 't' terms in FTSDOCS
*/
static void search_update_ticket_index(void){
db_multi_exec(
"INSERT INTO ftsidx(docid,stext)"
" SELECT rowid, stext('t',rid,NULL) FROM ftsdocs"
" WHERE type='t' AND NOT idxed;"
);
|
| ︙ | ︙ | |||
1326 1327 1328 1329 1330 1331 1332 |
" FROM ftsdocs, ticket"
" WHERE ftsdocs.type='t' AND NOT ftsdocs.idxed"
" AND ticket.tkt_id=ftsdocs.rid"
);
}
/*
| | | 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 |
" FROM ftsdocs, ticket"
" WHERE ftsdocs.type='t' AND NOT ftsdocs.idxed"
" AND ticket.tkt_id=ftsdocs.rid"
);
}
/*
** Deal with all of the unindexed 'w' terms in FTSDOCS
*/
static void search_update_wiki_index(void){
db_multi_exec(
"INSERT INTO ftsidx(docid,stext)"
" SELECT rowid, stext('w',rid,NULL) FROM ftsdocs"
" WHERE type='w' AND NOT idxed;"
);
|
| ︙ | ︙ | |||
1466 1467 1468 1469 1470 1471 1472 |
}
if( iAction>=2 ){
search_rebuild_index();
}
/* Always show the status before ending */
for(i=0; i<ArraySize(aSetng); i++){
| | | 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 |
}
if( iAction>=2 ){
search_rebuild_index();
}
/* Always show the status before ending */
for(i=0; i<ArraySize(aSetng); i++){
fossil_print("%-16s %s\n", aSetng[i].zName,
db_get_boolean(aSetng[i].zSetting,0) ? "on" : "off");
}
if( search_index_exists() ){
fossil_print("%-16s enabled\n", "full-text index:");
fossil_print("%-16s %d\n", "documents:",
db_int(0, "SELECT count(*) FROM ftsdocs"));
}else{
fossil_print("%-16s disabled\n", "full-text index:");
}
db_end_transaction(0);
}
|
Changes to src/setup.c.
| ︙ | ︙ | |||
2170 2171 2172 2173 2174 2175 2176 |
if( !g.perm.Setup && !g.perm.Admin ){
login_needed();
}
style_header("Search Configuration");
@ <form action="%s(g.zTop)/srchsetup" method="post"><div>
login_insert_csrf_secret();
@ <div style="text-align:center;font-weight:bold;">
| | | | 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 |
if( !g.perm.Setup && !g.perm.Admin ){
login_needed();
}
style_header("Search Configuration");
@ <form action="%s(g.zTop)/srchsetup" method="post"><div>
login_insert_csrf_secret();
@ <div style="text-align:center;font-weight:bold;">
@ Server-specific settings that affect the
@ <a href="%R/search">/search</a> webpage.
@ </div>
@ <hr />
textarea_attribute("Document Glob List", 3, 35, "doc-glob", "dg", "", 0);
@ <p>The "Document Glob List" is a comma- or newline-separated list
@ of GLOB expressions that identify all documents within the source
@ tree that are to be searched when "Document Search" is enabled.
@ Some examples:
@ <table border=0 cellpadding=2 align=center>
@ <tr><td>*.wiki,*.html,*.md,*.txt<td style="width: 4x;">
@ <td>Search all wiki, HTML, Markdown, and Text files</tr>
@ <tr><td>doc/*.md,*/README.txt,README.txt<td>
|
| ︙ | ︙ |
Changes to src/skins.c.
| ︙ | ︙ | |||
24 25 26 27 28 29 30 | /* ** An array of available built-in skins. ** ** To add new built-in skins: ** ** 1. Pick a name for the new skin. (Here we use "xyzzy"). ** | | | | 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
/*
** An array of available built-in skins.
**
** To add new built-in skins:
**
** 1. Pick a name for the new skin. (Here we use "xyzzy").
**
** 2. Install files skins/xyzzy/css.txt, skins/xyzzy/header.txt,
** and skins/xyzzy/footer.txt into the source tree.
**
** 3. Rerun "tclsh makemake.tcl" in the src/ folder in order to
** rebuild the makefiles to reference the new CSS, headers, and footers.
**
** 4. Make an entry in the following array for the new skin.
*/
static struct BuiltinSkin {
const char *zDesc; /* Description of this skin */
const char *zLabel; /* The directory under skins/ holding this skin */
char *zSQL; /* Filled in at run-time with SQL to insert this skin */
} aBuiltinSkin[] = {
{ "Default", "default", 0 },
{ "Plain Gray, No Logo", "plain_gray", 0 },
{ "Khaki, No Logo", "khaki", 0 },
{ "Black & White, Menu on Left", "black_and_white", 0 },
{ "Shadow boxes & Rounded Corners", "rounded1", 0 },
{ "Enhanced Default", "enhanced1", 0 },
{ "San Francisco Modern", "etienne1", 0 },
{ "Eagle", "eagle", 0 },
};
/*
|
| ︙ | ︙ |
Changes to src/tkt.c.
| ︙ | ︙ | |||
1410 1411 1412 1413 1414 1415 1416 | } } /* ** WEBPAGE: ticket ** ** This is intended to be the primary "Ticket" page. Render as | | | 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 |
}
}
/*
** WEBPAGE: ticket
**
** This is intended to be the primary "Ticket" page. Render as
** either ticket-search (if search is enabled) or as the
** /reportlist page (if ticket search is disabled).
*/
void tkt_home_page(void){
login_check_credentials();
if( search_restrict(SRCH_TKT)!=0 ){
tkt_srchpage();
}else{
|
| ︙ | ︙ |