Index: src/dispatch.c ================================================================== --- src/dispatch.c +++ src/dispatch.c @@ -48,10 +48,11 @@ #define CMDFLAG_SETTING 0x0020 /* A setting */ #define CMDFLAG_VERSIONABLE 0x0040 /* A versionable setting */ #define CMDFLAG_BLOCKTEXT 0x0080 /* Multi-line text setting */ #define CMDFLAG_BOOLEAN 0x0100 /* A boolean setting */ #define CMDFLAG_RAWCONTENT 0x0200 /* Do not interpret POST content */ +#define CMDFLAG_RDTRANS 0x0400 /* Run inside a read transaction */ /**************************************************************************/ /* Values for the 2nd parameter to dispatch_name_search() */ #define CMDFLAG_ANY 0x0038 /* Match anything */ #define CMDFLAG_PREFIX 0x0200 /* Prefix match is ok */ Index: src/main.c ================================================================== --- src/main.c +++ src/main.c @@ -1920,11 +1920,13 @@ rc = TH_OK; } if( rc==TH_OK || rc==TH_RETURN || rc==TH_CONTINUE ){ if( rc==TH_OK || rc==TH_RETURN ){ #endif + if( pCmd->eCmdFlags & CMDFLAG_RDTRANS ) db_begin_transaction(); pCmd->xFunc(); + if( pCmd->eCmdFlags & CMDFLAG_RDTRANS ) db_commit_transaction(); #ifdef FOSSIL_ENABLE_TH1_HOOKS } if( !g.fNoThHook && (rc==TH_OK || rc==TH_CONTINUE) ){ Th_WebpageNotify(pCmd->zName+1, pCmd->eCmdFlags); } Index: src/mkindex.c ================================================================== --- src/mkindex.c +++ src/mkindex.c @@ -90,10 +90,11 @@ #define CMDFLAG_SETTING 0x0020 /* A setting */ #define CMDFLAG_VERSIONABLE 0x0040 /* A versionable setting */ #define CMDFLAG_BLOCKTEXT 0x0080 /* Multi-line text setting */ #define CMDFLAG_BOOLEAN 0x0100 /* A boolean setting */ #define CMDFLAG_RAWCONTENT 0x0200 /* Do not interpret webpage content */ +#define CMDFLAG_RDTRANS 0x0400 /* Run inside a read transaction */ /**************************************************************************/ /* ** Each entry looks like this: */ @@ -239,10 +240,12 @@ }else if( j==4 && strncmp(&zLine[i], "test", j)==0 ){ aEntry[nUsed].eType &= ~(CMDFLAG_1ST_TIER|CMDFLAG_2ND_TIER); aEntry[nUsed].eType |= CMDFLAG_TEST; }else if( j==11 && strncmp(&zLine[i], "raw-content", j)==0 ){ aEntry[nUsed].eType |= CMDFLAG_RAWCONTENT; + }else if( j==16 && strncmp(&zLine[i], "read-transaction", j)==0 ){ + aEntry[nUsed].eType |= CMDFLAG_RDTRANS; }else if( j==7 && strncmp(&zLine[i], "boolean", j)==0 ){ aEntry[nUsed].eType &= ~(CMDFLAG_BLOCKTEXT); aEntry[nUsed].iWidth = 0; aEntry[nUsed].eType |= CMDFLAG_BOOLEAN; }else if( j==10 && strncmp(&zLine[i], "block-text", j)==0 ){ Index: src/timeline.c ================================================================== --- src/timeline.c +++ src/timeline.c @@ -1579,11 +1579,11 @@ return zEDate; } /* -** WEBPAGE: timeline +** WEBPAGE: timeline read-transaction ** ** Query parameters: ** ** a=TIMEORTAG After this event ** b=TIMEORTAG Before this event