Fossil SCM

Import the latest version of tmstmpvfs.c.

drh 2026-02-17 16:45 timestamp-vfs
Commit 0529ecd95d56347b119ee541626835b9a1aefba3c8249ed736ec0ff32b96a367
1 file changed +10 -6
--- extsrc/tmstmpvfs.c
+++ extsrc/tmstmpvfs.c
@@ -482,10 +482,11 @@
482482
}
483483
484484
/* Free a TmstmpLog object */
485485
static void tmstmpLogFree(TmstmpLog *pLog){
486486
if( pLog==0 ) return;
487
+ if( pLog->log ) fclose(pLog->log);
487488
sqlite3_free(pLog->zLogname);
488489
sqlite3_free(pLog);
489490
}
490491
491492
/* Flush log content. Open the file if necessary. Return the
@@ -500,10 +501,11 @@
500501
p->pLog = 0;
501502
return 1;
502503
}
503504
}
504505
(void)fwrite(pLog->a, pLog->n, 1, pLog->log);
506
+ fflush(pLog->log);
505507
pLog->n = 0;
506508
return 0;
507509
}
508510
509511
/*
@@ -617,11 +619,11 @@
617619
if( iAmt==24 ){
618620
/* A frame header */
619621
u32 x = 0;
620622
p->iFrame = (iOfst - 32)/(p->pgsz+24)+1;
621623
p->pgno = tmstmpGetU32((const u8*)zBuf);
622
- p->salt1 = tmstmpGetU32(((const u8*)zBuf)+16);
624
+ p->salt1 = tmstmpGetU32(((const u8*)zBuf)+8);
623625
memcpy(&x, ((const u8*)zBuf)+4, 4);
624626
p->isCommit = (x!=0);
625627
p->iOfst = iOfst;
626628
}else if( iAmt>=512 && iOfst==p->iOfst+24 ){
627629
unsigned char s[TMSTMP_RESERVE];
@@ -635,21 +637,21 @@
635637
}else if( p->inCkpt ){
636638
unsigned char *s = (unsigned char*)zBuf+iAmt-TMSTMP_RESERVE;
637639
memset(s, 0, TMSTMP_RESERVE);
638640
tmstmpPutTS(p, s+2);
639641
tmstmpPutU32(p->iFrame, s+8);
640
- tmstmpPutU32(p->pPartner->salt1, s+12);
642
+ tmstmpPutU32(p->pPartner->salt1 & 0xffffff, s+12);
641643
assert( p->pgsz>0 );
642644
tmstmpEvent(p, ELOG_CKPT_PAGE, 0, (iOfst/p->pgsz)+1, p->iFrame, 0);
643645
}else if( p->pPartner==0 ){
644646
/* Writing into a database in rollback mode */
645647
unsigned char *s = (unsigned char*)zBuf+iAmt-TMSTMP_RESERVE;
646648
memset(s, 0, TMSTMP_RESERVE);
647649
tmstmpPutTS(p, s+2);
648650
s[12] = 2;
649651
assert( p->pgsz>0 );
650
- tmstmpEvent(p, ELOG_DB_PAGE, 0, (u32)(iOfst/p->pgsz), 0, s+2);
652
+ tmstmpEvent(p, ELOG_DB_PAGE, 0, (u32)(iOfst/p->pgsz)+1, 0, s+2);
651653
}
652654
return pSub->pMethods->xWrite(pSub,zBuf,iAmt,iOfst);
653655
}
654656
655657
/*
@@ -857,11 +859,11 @@
857859
u32 r2;
858860
u32 pid;
859861
TmstmpLog *pLog;
860862
sqlite3_uint64 r1; /* Milliseconds since 1970-01-01 */
861863
sqlite3_uint64 days; /* Days since 1970-01-01 */
862
- sqlite3_uint64 sod; /* Start of date specified by ms */
864
+ sqlite3_uint64 sod; /* Start of date specified by r1 */
863865
sqlite3_uint64 z; /* Days since 0000-03-01 */
864866
sqlite3_uint64 era; /* 400-year era */
865867
int h; /* hour */
866868
int m; /* minute */
867869
int s; /* second */
@@ -877,11 +879,13 @@
877879
878880
p->isDb = 1;
879881
r1 = 0;
880882
pLog = sqlite3_malloc64( sizeof(TmstmpLog) );
881883
if( pLog==0 ){
882
- return SQLITE_NOMEM;
884
+ pSubFile->pMethods->xClose(pSubFile);
885
+ rc = SQLITE_NOMEM;
886
+ goto tmstmp_open_done;
883887
}
884888
memset(pLog, 0, sizeof(pLog[0]));
885889
p->pLog = pLog;
886890
p->pSubVfs->xCurrentTimeInt64(p->pSubVfs, (sqlite3_int64*)&r1);
887891
r1 -= 210866760000000LL;
@@ -891,11 +895,11 @@
891895
892896
h = sod/3600;
893897
m = (sod%3600)/60;
894898
s = sod%60;
895899
z = days + 719468;
896
- era = z/147097;
900
+ era = z/146097;
897901
doe = (unsigned)(z - era*146097);
898902
yoe = (doe - doe/1460 + doe/36524 - doe/146096)/365;
899903
y = (int)yoe + era*400;
900904
doy = doe - (365*yoe + yoe/4 - yoe/100);
901905
mp = (5*doy + 2)/153;
902906
--- extsrc/tmstmpvfs.c
+++ extsrc/tmstmpvfs.c
@@ -482,10 +482,11 @@
482 }
483
484 /* Free a TmstmpLog object */
485 static void tmstmpLogFree(TmstmpLog *pLog){
486 if( pLog==0 ) return;
 
487 sqlite3_free(pLog->zLogname);
488 sqlite3_free(pLog);
489 }
490
491 /* Flush log content. Open the file if necessary. Return the
@@ -500,10 +501,11 @@
500 p->pLog = 0;
501 return 1;
502 }
503 }
504 (void)fwrite(pLog->a, pLog->n, 1, pLog->log);
 
505 pLog->n = 0;
506 return 0;
507 }
508
509 /*
@@ -617,11 +619,11 @@
617 if( iAmt==24 ){
618 /* A frame header */
619 u32 x = 0;
620 p->iFrame = (iOfst - 32)/(p->pgsz+24)+1;
621 p->pgno = tmstmpGetU32((const u8*)zBuf);
622 p->salt1 = tmstmpGetU32(((const u8*)zBuf)+16);
623 memcpy(&x, ((const u8*)zBuf)+4, 4);
624 p->isCommit = (x!=0);
625 p->iOfst = iOfst;
626 }else if( iAmt>=512 && iOfst==p->iOfst+24 ){
627 unsigned char s[TMSTMP_RESERVE];
@@ -635,21 +637,21 @@
635 }else if( p->inCkpt ){
636 unsigned char *s = (unsigned char*)zBuf+iAmt-TMSTMP_RESERVE;
637 memset(s, 0, TMSTMP_RESERVE);
638 tmstmpPutTS(p, s+2);
639 tmstmpPutU32(p->iFrame, s+8);
640 tmstmpPutU32(p->pPartner->salt1, s+12);
641 assert( p->pgsz>0 );
642 tmstmpEvent(p, ELOG_CKPT_PAGE, 0, (iOfst/p->pgsz)+1, p->iFrame, 0);
643 }else if( p->pPartner==0 ){
644 /* Writing into a database in rollback mode */
645 unsigned char *s = (unsigned char*)zBuf+iAmt-TMSTMP_RESERVE;
646 memset(s, 0, TMSTMP_RESERVE);
647 tmstmpPutTS(p, s+2);
648 s[12] = 2;
649 assert( p->pgsz>0 );
650 tmstmpEvent(p, ELOG_DB_PAGE, 0, (u32)(iOfst/p->pgsz), 0, s+2);
651 }
652 return pSub->pMethods->xWrite(pSub,zBuf,iAmt,iOfst);
653 }
654
655 /*
@@ -857,11 +859,11 @@
857 u32 r2;
858 u32 pid;
859 TmstmpLog *pLog;
860 sqlite3_uint64 r1; /* Milliseconds since 1970-01-01 */
861 sqlite3_uint64 days; /* Days since 1970-01-01 */
862 sqlite3_uint64 sod; /* Start of date specified by ms */
863 sqlite3_uint64 z; /* Days since 0000-03-01 */
864 sqlite3_uint64 era; /* 400-year era */
865 int h; /* hour */
866 int m; /* minute */
867 int s; /* second */
@@ -877,11 +879,13 @@
877
878 p->isDb = 1;
879 r1 = 0;
880 pLog = sqlite3_malloc64( sizeof(TmstmpLog) );
881 if( pLog==0 ){
882 return SQLITE_NOMEM;
 
 
883 }
884 memset(pLog, 0, sizeof(pLog[0]));
885 p->pLog = pLog;
886 p->pSubVfs->xCurrentTimeInt64(p->pSubVfs, (sqlite3_int64*)&r1);
887 r1 -= 210866760000000LL;
@@ -891,11 +895,11 @@
891
892 h = sod/3600;
893 m = (sod%3600)/60;
894 s = sod%60;
895 z = days + 719468;
896 era = z/147097;
897 doe = (unsigned)(z - era*146097);
898 yoe = (doe - doe/1460 + doe/36524 - doe/146096)/365;
899 y = (int)yoe + era*400;
900 doy = doe - (365*yoe + yoe/4 - yoe/100);
901 mp = (5*doy + 2)/153;
902
--- extsrc/tmstmpvfs.c
+++ extsrc/tmstmpvfs.c
@@ -482,10 +482,11 @@
482 }
483
484 /* Free a TmstmpLog object */
485 static void tmstmpLogFree(TmstmpLog *pLog){
486 if( pLog==0 ) return;
487 if( pLog->log ) fclose(pLog->log);
488 sqlite3_free(pLog->zLogname);
489 sqlite3_free(pLog);
490 }
491
492 /* Flush log content. Open the file if necessary. Return the
@@ -500,10 +501,11 @@
501 p->pLog = 0;
502 return 1;
503 }
504 }
505 (void)fwrite(pLog->a, pLog->n, 1, pLog->log);
506 fflush(pLog->log);
507 pLog->n = 0;
508 return 0;
509 }
510
511 /*
@@ -617,11 +619,11 @@
619 if( iAmt==24 ){
620 /* A frame header */
621 u32 x = 0;
622 p->iFrame = (iOfst - 32)/(p->pgsz+24)+1;
623 p->pgno = tmstmpGetU32((const u8*)zBuf);
624 p->salt1 = tmstmpGetU32(((const u8*)zBuf)+8);
625 memcpy(&x, ((const u8*)zBuf)+4, 4);
626 p->isCommit = (x!=0);
627 p->iOfst = iOfst;
628 }else if( iAmt>=512 && iOfst==p->iOfst+24 ){
629 unsigned char s[TMSTMP_RESERVE];
@@ -635,21 +637,21 @@
637 }else if( p->inCkpt ){
638 unsigned char *s = (unsigned char*)zBuf+iAmt-TMSTMP_RESERVE;
639 memset(s, 0, TMSTMP_RESERVE);
640 tmstmpPutTS(p, s+2);
641 tmstmpPutU32(p->iFrame, s+8);
642 tmstmpPutU32(p->pPartner->salt1 & 0xffffff, s+12);
643 assert( p->pgsz>0 );
644 tmstmpEvent(p, ELOG_CKPT_PAGE, 0, (iOfst/p->pgsz)+1, p->iFrame, 0);
645 }else if( p->pPartner==0 ){
646 /* Writing into a database in rollback mode */
647 unsigned char *s = (unsigned char*)zBuf+iAmt-TMSTMP_RESERVE;
648 memset(s, 0, TMSTMP_RESERVE);
649 tmstmpPutTS(p, s+2);
650 s[12] = 2;
651 assert( p->pgsz>0 );
652 tmstmpEvent(p, ELOG_DB_PAGE, 0, (u32)(iOfst/p->pgsz)+1, 0, s+2);
653 }
654 return pSub->pMethods->xWrite(pSub,zBuf,iAmt,iOfst);
655 }
656
657 /*
@@ -857,11 +859,11 @@
859 u32 r2;
860 u32 pid;
861 TmstmpLog *pLog;
862 sqlite3_uint64 r1; /* Milliseconds since 1970-01-01 */
863 sqlite3_uint64 days; /* Days since 1970-01-01 */
864 sqlite3_uint64 sod; /* Start of date specified by r1 */
865 sqlite3_uint64 z; /* Days since 0000-03-01 */
866 sqlite3_uint64 era; /* 400-year era */
867 int h; /* hour */
868 int m; /* minute */
869 int s; /* second */
@@ -877,11 +879,13 @@
879
880 p->isDb = 1;
881 r1 = 0;
882 pLog = sqlite3_malloc64( sizeof(TmstmpLog) );
883 if( pLog==0 ){
884 pSubFile->pMethods->xClose(pSubFile);
885 rc = SQLITE_NOMEM;
886 goto tmstmp_open_done;
887 }
888 memset(pLog, 0, sizeof(pLog[0]));
889 p->pLog = pLog;
890 p->pSubVfs->xCurrentTimeInt64(p->pSubVfs, (sqlite3_int64*)&r1);
891 r1 -= 210866760000000LL;
@@ -891,11 +895,11 @@
895
896 h = sod/3600;
897 m = (sod%3600)/60;
898 s = sod%60;
899 z = days + 719468;
900 era = z/146097;
901 doe = (unsigned)(z - era*146097);
902 yoe = (doe - doe/1460 + doe/36524 - doe/146096)/365;
903 y = (int)yoe + era*400;
904 doy = doe - (365*yoe + yoe/4 - yoe/100);
905 mp = (5*doy + 2)/153;
906

Keyboard Shortcuts

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