Fossil SCM

Avoid unnecessary database interaction in the search_restrict() function.

drh 2015-02-05 15:06 UTC form-submenu
Commit 76f9036b7110f9056c03e88a5337cbbbdb42e5cb
1 file changed +20 -13
+20 -13
--- src/search.c
+++ src/search.c
@@ -567,26 +567,33 @@
567567
/*
568568
** Remove bits from srchFlags which are disallowed by either the
569569
** current server configuration or by user permissions.
570570
*/
571571
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;
572581
if( g.perm.Read==0 ) srchFlags &= ~(SRCH_CKIN|SRCH_DOC);
573582
if( g.perm.RdTkt==0 ) srchFlags &= ~(SRCH_TKT);
574583
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;
588595
}
589596
590597
/*
591598
** When this routine is called, there already exists a table
592599
**
593600
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button