]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the --csv option to the showtmlog utility program.
authordrh <>
Tue, 27 Jan 2026 14:27:19 +0000 (14:27 +0000)
committerdrh <>
Tue, 27 Jan 2026 14:27:19 +0000 (14:27 +0000)
FossilOrigin-Name: 2e96e8efa9a331b0f7d928c55e7d85be64e7c60c85032c1e972f77fe790bdec4

manifest
manifest.uuid
tool/showtmlog.c

index 267be5e5eaf3849aa842bbf54f61b79b0a849673..141bb846a9a1055037d0d8c66cc734d380f79b58 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-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
@@ -2166,7 +2166,7 @@ F tool/showjournal.c 5bad7ae8784a43d2b270d953060423b8bd480818
 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
@@ -2193,8 +2193,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 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.
index 3911f1e1d8ac44bdc3439704b167ab9147a7f50d..ce73b87d776fea6dd18d6aec4c7b5a3d6dff6738 100644 (file)
@@ -1 +1 @@
-661878a62870023f7f54e8c591a0823dc457cb89780ab40c1891fb3d5e8f095f
+2e96e8efa9a331b0f7d928c55e7d85be64e7c60c85032c1e972f77fe790bdec4
index 18925327910297e4991fdf7f8195760642f0c366..83ef9a8d4524787f9775186206b7ed31cd994bc2 100644 (file)
@@ -5,6 +5,7 @@
 #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
@@ -63,70 +64,188 @@ static const char *decodeTimestamp(const unsigned char *a){
   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);