Fossil SCM
Avoid unnecessary database interaction in the search_restrict() function.
Commit
76f9036b7110f9056c03e88a5337cbbbdb42e5cb
Parent
e61dbb17cf36dbf…
1 file changed
+20
-13
+20
-13
| --- src/search.c | ||
| +++ src/search.c | ||
| @@ -567,26 +567,33 @@ | ||
| 567 | 567 | /* |
| 568 | 568 | ** Remove bits from srchFlags which are disallowed by either the |
| 569 | 569 | ** current server configuration or by user permissions. |
| 570 | 570 | */ |
| 571 | 571 | unsigned int search_restrict(unsigned int srchFlags){ |
| 572 | + static unsigned int knownGood = 0; | |
| 573 | + static unsigned int knownBad = 0; | |
| 574 | + static const struct { unsigned m; const char *zKey; } aSetng[] = { | |
| 575 | + { SRCH_CKIN, "search-ci" }, | |
| 576 | + { SRCH_DOC, "search-doc" }, | |
| 577 | + { SRCH_TKT, "search-tkt" }, | |
| 578 | + { SRCH_WIKI, "search-wiki" }, | |
| 579 | + }; | |
| 580 | + int i; | |
| 572 | 581 | if( g.perm.Read==0 ) srchFlags &= ~(SRCH_CKIN|SRCH_DOC); |
| 573 | 582 | if( g.perm.RdTkt==0 ) srchFlags &= ~(SRCH_TKT); |
| 574 | 583 | if( g.perm.RdWiki==0 ) srchFlags &= ~(SRCH_WIKI); |
| 575 | - if( (srchFlags & SRCH_CKIN)!=0 && db_get_boolean("search-ci",0)==0 ){ | |
| 576 | - srchFlags &= ~SRCH_CKIN; | |
| 577 | - } | |
| 578 | - if( (srchFlags & SRCH_DOC)!=0 && db_get_boolean("search-doc",0)==0 ){ | |
| 579 | - srchFlags &= ~SRCH_DOC; | |
| 580 | - } | |
| 581 | - if( (srchFlags & SRCH_TKT)!=0 && db_get_boolean("search-tkt",0)==0 ){ | |
| 582 | - srchFlags &= ~SRCH_TKT; | |
| 583 | - } | |
| 584 | - if( (srchFlags & SRCH_WIKI)!=0 && db_get_boolean("search-wiki",0)==0 ){ | |
| 585 | - srchFlags &= ~SRCH_WIKI; | |
| 586 | - } | |
| 587 | - return srchFlags; | |
| 584 | + for(i=0; i<ArraySize(aSetng); i++){ | |
| 585 | + unsigned int m = aSetng[i].m; | |
| 586 | + if( (srchFlags & m)==0 ) continue; | |
| 587 | + if( ((knownGood|knownBad) & m)!=0 ) continue; | |
| 588 | + if( db_get_boolean(aSetng[i].zKey,0) ){ | |
| 589 | + knownGood |= m; | |
| 590 | + }else{ | |
| 591 | + knownBad |= m; | |
| 592 | + } | |
| 593 | + } | |
| 594 | + return srchFlags & ~knownBad; | |
| 588 | 595 | } |
| 589 | 596 | |
| 590 | 597 | /* |
| 591 | 598 | ** When this routine is called, there already exists a table |
| 592 | 599 | ** |
| 593 | 600 |
| --- src/search.c | |
| +++ src/search.c | |
| @@ -567,26 +567,33 @@ | |
| 567 | /* |
| 568 | ** Remove bits from srchFlags which are disallowed by either the |
| 569 | ** current server configuration or by user permissions. |
| 570 | */ |
| 571 | unsigned int search_restrict(unsigned int srchFlags){ |
| 572 | if( g.perm.Read==0 ) srchFlags &= ~(SRCH_CKIN|SRCH_DOC); |
| 573 | if( g.perm.RdTkt==0 ) srchFlags &= ~(SRCH_TKT); |
| 574 | if( g.perm.RdWiki==0 ) srchFlags &= ~(SRCH_WIKI); |
| 575 | if( (srchFlags & SRCH_CKIN)!=0 && db_get_boolean("search-ci",0)==0 ){ |
| 576 | srchFlags &= ~SRCH_CKIN; |
| 577 | } |
| 578 | if( (srchFlags & SRCH_DOC)!=0 && db_get_boolean("search-doc",0)==0 ){ |
| 579 | srchFlags &= ~SRCH_DOC; |
| 580 | } |
| 581 | if( (srchFlags & SRCH_TKT)!=0 && db_get_boolean("search-tkt",0)==0 ){ |
| 582 | srchFlags &= ~SRCH_TKT; |
| 583 | } |
| 584 | if( (srchFlags & SRCH_WIKI)!=0 && db_get_boolean("search-wiki",0)==0 ){ |
| 585 | srchFlags &= ~SRCH_WIKI; |
| 586 | } |
| 587 | return srchFlags; |
| 588 | } |
| 589 | |
| 590 | /* |
| 591 | ** When this routine is called, there already exists a table |
| 592 | ** |
| 593 |
| --- src/search.c | |
| +++ src/search.c | |
| @@ -567,26 +567,33 @@ | |
| 567 | /* |
| 568 | ** Remove bits from srchFlags which are disallowed by either the |
| 569 | ** current server configuration or by user permissions. |
| 570 | */ |
| 571 | unsigned int search_restrict(unsigned int srchFlags){ |
| 572 | static unsigned int knownGood = 0; |
| 573 | static unsigned int knownBad = 0; |
| 574 | static const struct { unsigned m; const char *zKey; } aSetng[] = { |
| 575 | { SRCH_CKIN, "search-ci" }, |
| 576 | { SRCH_DOC, "search-doc" }, |
| 577 | { SRCH_TKT, "search-tkt" }, |
| 578 | { SRCH_WIKI, "search-wiki" }, |
| 579 | }; |
| 580 | int i; |
| 581 | if( g.perm.Read==0 ) srchFlags &= ~(SRCH_CKIN|SRCH_DOC); |
| 582 | if( g.perm.RdTkt==0 ) srchFlags &= ~(SRCH_TKT); |
| 583 | if( g.perm.RdWiki==0 ) srchFlags &= ~(SRCH_WIKI); |
| 584 | for(i=0; i<ArraySize(aSetng); i++){ |
| 585 | unsigned int m = aSetng[i].m; |
| 586 | if( (srchFlags & m)==0 ) continue; |
| 587 | if( ((knownGood|knownBad) & m)!=0 ) continue; |
| 588 | if( db_get_boolean(aSetng[i].zKey,0) ){ |
| 589 | knownGood |= m; |
| 590 | }else{ |
| 591 | knownBad |= m; |
| 592 | } |
| 593 | } |
| 594 | return srchFlags & ~knownBad; |
| 595 | } |
| 596 | |
| 597 | /* |
| 598 | ** When this routine is called, there already exists a table |
| 599 | ** |
| 600 |