-C Fix\strivial\sbuffer\soverreads\sin\sthe\ssessions\smodule\sthat\scould\soccur\swhen\sparsing\schangeset\sblobs.
-D 2026-01-27T14:00:59.953
+C Add\sthe\s--csv\soption\sto\sthe\sshowtmlog\sutility\sprogram.
+D 2026-01-27T14:27:19.439
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F tool/showlocks.c 9cc5e66d4ebbf2d194f39db2527ece92077e86ae627ddd233ee48e16e8142564
F tool/showshm.c a0ab6ec32dd1f11218ca2a4018f8fb875b59414801ab8ceed8b2e69b7b45a809
F tool/showstat4.c b706fcbc4cd1a6e4a73ac32549afc4b460479d650402d64b23e8d813516e8de4
-F tool/showtmlog.c c31b358b802d4522c84c3fb44cf2f5838c7a84a244dd41f1c8d2573b5dc1bb78
+F tool/showtmlog.c cbdc5f1b21cc8b821a39118b85f2d2616fc7bf3377ddaf02bb1cbcbeb4169f92
F tool/showwal.c 11eca547980a066b081f512636151233350ac679f29ecf4ebfce7f4530230b3d
F tool/soak1.tcl a3892082ed1079671565c044e93b55c3c7f38829aedf53cc597c65d23ffdaddf
F tool/spaceanal.tcl 1f83962090a6b60e1d7bf92495d643e622bef9fe82ea3f2d22350dcbce9a12d0
F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P d1b8e7740bee13a8cf199c6477ee20a4f8bcbbd9ec4096bcdc05a996fadf0d56
-R bc760db4f6d40a1b040ea672b3ec64be
-U dan
-Z 5871de5b90660b7eb05ce757898385bf
+P 661878a62870023f7f54e8c591a0823dc457cb89780ab40c1891fb3d5e8f095f
+R f143497d4f1b8f3a0b5fa858e243dd36
+U drh
+Z cab853d8a0c200d46160f103af9c4268
# Remove this line to create a well-formed Fossil manifest.
#include <assert.h>
#include <string.h>
#include <stdint.h>
+#include <stdlib.h>
/*
** The six bytes at a[] are a big-endian unsigned integer which is the
return zOut;
}
+/*
+** Render a single 16-byte tmstmpvfs log record as a line to a CSV file.
+**
+** Columns: tmstmp,fileno,op,pid,pgno,frame,salt,txn
+*/
+static void renderCSV(int iFile, unsigned char *a){
+ unsigned int a2, a3;
+ int j;
+ uint64_t ms;
+
+ for(ms=0, j=2; j<=7; j++) ms = (ms<<8) + a[j];
+ printf("%u.%03u,%d,", (unsigned int)(ms/1000), (unsigned)(ms%1000), iFile);
+ for(a2=0, j=8; j<=11; j++) a2 = (a2<<8)+a[j];
+ for(a3=0, j=12; j<=15; j++) a3 = (a3<<8)+a[j];
+ switch( a[0] ){
+ case 0x01: {
+ printf("\"open-db\",%u,,,,\r\n",a2);
+ break;
+ }
+ case 0x02: {
+ printf("\"open-wal\",%u,,,,\r\n", a2);
+ break;
+ }
+ case 0x03: {
+ printf("\"wal-page\",,%u,%u,,%d\r\n", a2, a3, a[1]);
+ break;
+ }
+ case 0x04: {
+ printf("\"db-page\",,%u,,,\r\n", a2);
+ break;
+ }
+ case 0x05: {
+ printf("\"ckpt-start\",,,,,\r\n");
+ break;
+ }
+ case 0x06: {
+ printf("\"ckpt-page\",,%u,%u,,\r\n", a2, a3);
+ break;
+ }
+ case 0x07: {
+ printf("\"ckpt-end\",,,,,\r\n");
+ break;
+ }
+ case 0x08: {
+ printf("\"wal-reset\",,,,%u,\r\n", a3);
+ break;
+ }
+ case 0x0e: {
+ printf("\"close-wal\",,,,,\r\n");
+ break;
+ }
+ case 0x0f: {
+ printf("\"close-db\",,,,,\r\n");
+ break;
+ }
+ default: {
+ printf("\"invalid-record\",,,,,\r\n");
+ break;
+ }
+ }
+}
+
+/*
+** Render a single 16-byte tmstmpvfs log record as human-readable text
+** on stdout.
+*/
+static void renderText(unsigned char *a){
+ unsigned int a2, a3;
+ int j;
+
+ printf("%s ", decodeTimestamp(a+2));
+ for(a2=0, j=8; j<=11; j++) a2 = (a2<<8)+a[j];
+ for(a3=0, j=12; j<=15; j++) a3 = (a3<<8)+a[j];
+ switch( a[0] ){
+ case 0x01: {
+ printf("open-db pid %u\n", a2);
+ break;
+ }
+ case 0x02: {
+ printf("open-wal pid %u\n", a2);
+ break;
+ }
+ case 0x03: {
+ printf("wal-page pgno %-8u frame %-8u%s\n", a2, a3,
+ a[1]==1 ? " txn" : "");
+ break;
+ }
+ case 0x04: {
+ printf("db-page pgno %-8u\n", a2);
+ break;
+ }
+ case 0x05: {
+ printf("ckpt-start\n");
+ break;
+ }
+ case 0x06: {
+ printf("ckpt-page pgno %-8u frame %-8u\n", a2, a3);
+ break;
+ }
+ case 0x07: {
+ printf("ckpt-end\n");
+ break;
+ }
+ case 0x08: {
+ printf("wal-reset salt1 0x%08x\n", a3);
+ break;
+ }
+ case 0x0e: {
+ printf("close-wal\n");
+ break;
+ }
+ case 0x0f: {
+ printf("close-db\n");
+ break;
+ }
+ default: {
+ printf("invalid-record\n");
+ break;
+ }
+ }
+}
+
+static void usage(const char *argv0){
+ printf("Usage: %s [--csv] LOGFILE ...\n", argv0);
+ printf("Decode one or more tmstmpvfs log files and display the results\n"
+ "on stdout. Render as CSV if the --csv option is used.\n");
+}
+
int main(int argc, char **argv){
- int i,j;
+ int i;
FILE *in;
- unsigned int a2, a3;
unsigned char a[16];
+ int bCSV = 0;
+ const char *z;
+ int nFile = 0;
+ int iFile;
+ for(i=1; i<argc; i++){
+ z = argv[i];
+ if( z[0]=='-' ){
+ if( z[1]=='-' ) z++;
+ if( strcmp(z,"-csv")==0 ){
+ bCSV = 1;
+ }else
+ if( strcmp(z,"-help")==0 || strcmp(z,"-?")==0 ){
+ usage(argv[0]);
+ return 0;
+ }else
+ {
+ printf("unknown command-line option: \"%s\"\n",
+ argv[i]);
+ usage(argv[0]);
+ return 1;
+ }
+ }else{
+ nFile++;
+ }
+ }
+ if( nFile==0 ){
+ usage(argv[0]);
+ return 1;
+ }
+ iFile = 0;
+ if( bCSV ){
+ printf("tmstmp,fileno,op,pid,pgno,frame,salt,txn\r\n");
+ }
for(i=1; i<argc; i++){
- in = fopen(argv[i], "rb");
+ z = argv[i];
+ if( z[0]=='-' ) continue;
+ in = fopen(z, "rb");
if( in==0 ){
- printf("%s: can't open\n", argv[i]);
+ printf("%s: can't open\n", z);
continue;
}
- if( argc>2 ){
- printf("*** %s ***\n", argv[i]);
+ iFile++;
+ if( nFile>1 && !bCSV ){
+ printf("*** %s ***\n", z);
}
while( 16==fread(a, 1, 16, in) ){
- printf("%s ", decodeTimestamp(a+2));
- for(a2=0, j=8; j<=11; j++) a2 = (a2<<8)+a[j];
- for(a3=0, j=12; j<=15; j++) a3 = (a3<<8)+a[j];
- switch( a[0] ){
- case 0x01: {
- printf("open-db pid %u\n", a2);
- break;
- }
- case 0x02: {
- printf("open-wal pid %u\n", a2);
- break;
- }
- case 0x03: {
- printf("wal-page pgno %-8u frame %-8u%s\n", a2, a3,
- a[1]==1 ? " txn" : "");
- break;
- }
- case 0x04: {
- printf("db-page pgno %-8u\n", a2);
- break;
- }
- case 0x05: {
- printf("ckpt-start\n");
- break;
- }
- case 0x06: {
- printf("ckpt-page pgno %-8u frame %-8u\n", a2, a3);
- break;
- }
- case 0x07: {
- printf("ckpt-end\n");
- break;
- }
- case 0x08: {
- printf("wal-reset salt1 0x%08x\n", a3);
- break;
- }
- case 0x0e: {
- printf("close-wal\n");
- break;
- }
- case 0x0f: {
- printf("close-db\n");
- break;
- }
- default: {
- printf("invalid-record\n");
- break;
- }
+ if( bCSV ){
+ renderCSV(iFile, a);
+ }else{
+ renderText(a);
}
}
fclose(in);