On Wed, Jun 25, 2014 at 1:28 PM, Tom Lane <t...@sss.pgh.pa.us> wrote:
>
> =?UTF-8?Q?Fabr=C3=ADzio_de_Royes_Mello?= <fabriziome...@gmail.com> writes:
> > On Wed, Jun 25, 2014 at 12:31 PM, Tom Lane <t...@sss.pgh.pa.us> wrote:
> >> Devrim =?ISO-8859-1?Q?G=FCnd=FCz?= <dev...@gunduz.org> writes:
> >>> Will there be a pg_filedump for 9.4? I'd like to finish package tests
> >>> before we release 9.4.0.
>
> >> Probably, but I have no time for it right now.
> >> FWIW, I believe the current "9.3" sources still work with HEAD/9.4.
>
> > I'll check it and post the results.
>
> I forgot to mention that thanks to Christoph Berg, the pg_filedump sources
> have gotten off pgfoundry and onto git.postgresql.org.  If anyone's got
> bandwidth for working on it (in particular, merging the checksum-testing
> code that was posted awhile back), I'd be happy to grant commit access.
>

Merged...

I'm thinking in run "pgindent" to better organize the source code... What
do you think?

Regards,

--
Fabrízio de Royes Mello
Consultoria/Coaching PostgreSQL
>> Timbira: http://www.timbira.com.br
>> Blog sobre TI: http://fabriziomello.blogspot.com
>> Perfil Linkedin: http://br.linkedin.com/in/fabriziomello
>> Twitter: http://twitter.com/fabriziomello
diff --git a/README.pg_filedump b/README.pg_filedump
index c9104e4..3a04d59 100644
--- a/README.pg_filedump
+++ b/README.pg_filedump
@@ -59,7 +59,7 @@ not require any manual adjustments of the Makefile.
 ------------------------------------------------------------------------
 Invocation:
 
-pg_filedump [-abcdfhixy] [-R startblock [endblock]] [-S blocksize] file
+pg_filedump [-abcdfhikxy] [-R startblock [endblock]] [-S blocksize] file
 
 Defaults are: relative addressing, range of the entire file, block size
               as listed on block 0 in the file
@@ -74,6 +74,7 @@ The following options are valid for heap and index files:
   -f  Display formatted block content dump along with interpretation
   -h  Display this information
   -i  Display interpreted item details
+  -k  Verify block checksums
   -R  Display specific block ranges within the file (Blocks are
       indexed from 0)
         [startblock]: block to start at
diff --git a/pg_filedump.c b/pg_filedump.c
index abcdb1e..34ce9d6 100644
--- a/pg_filedump.c
+++ b/pg_filedump.c
@@ -26,6 +26,13 @@
 
 #include "utils/pg_crc_tables.h"
 
+// checksum_impl.h uses Assert, which doesn't work outside the server
+#undef Assert
+#define Assert(X)
+
+#include "storage/checksum.h"
+#include "storage/checksum_impl.h"
+
 // Global variables for ease of use mostly
 static FILE *fp = NULL;		// File to dump or format
 static char *fileName = NULL;	// File name for display
@@ -40,12 +47,12 @@ static unsigned int blockVersion = 0;	// Block version number
 static void DisplayOptions (unsigned int validOptions);
 static unsigned int ConsumeOptions (int numOptions, char **options);
 static int GetOptionValue (char *optionString);
-static void FormatBlock ();
+static void FormatBlock (BlockNumber blkno);
 static unsigned int GetBlockSize ();
 static unsigned int GetSpecialSectionType (Page page);
 static bool IsBtreeMetaPage(Page page);
 static void CreateDumpFileHeader (int numOptions, char **options);
-static int FormatHeader (Page page);
+static int FormatHeader (Page page, BlockNumber blkno);
 static void FormatItemBlock (Page page);
 static void FormatItem (unsigned int numBytes, unsigned int startIndex,
 			unsigned int formatAs);
@@ -68,7 +75,7 @@ DisplayOptions (unsigned int validOptions)
        FD_VERSION, FD_PG_VERSION);
 
   printf
-    ("\nUsage: pg_filedump [-abcdfhixy] [-R startblock [endblock]] [-S blocksize] file\n\n"
+    ("\nUsage: pg_filedump [-abcdfhikxy] [-R startblock [endblock]] [-S blocksize] file\n\n"
      "Display formatted contents of a PostgreSQL heap/index/control file\n"
      "Defaults are: relative addressing, range of the entire file, block\n"
      "               size as listed on block 0 in the file\n\n"
@@ -82,6 +89,7 @@ DisplayOptions (unsigned int validOptions)
      "  -f  Display formatted block content dump along with interpretation\n"
      "  -h  Display this information\n"
      "  -i  Display interpreted item details\n"
+     "  -k  Verify block checksums\n"
      "  -R  Display specific block ranges within the file (Blocks are\n"
      "      indexed from 0)\n" "        [startblock]: block to start at\n"
      "        [endblock]: block to end at\n"
@@ -288,6 +296,11 @@ ConsumeOptions (int numOptions, char **options)
 		  SET_OPTION (itemOptions, ITEM_DETAIL, 'i');
 		  break;
 
+		  // Verify block checksums
+		case 'k':
+		  SET_OPTION (blockOptions, BLOCK_CHECKSUMS, 'k');
+		  break;
+
 		  // Interpret items as standard index values
 		case 'x':
 		  SET_OPTION (itemOptions, ITEM_INDEX, 'x');
@@ -555,7 +568,7 @@ CreateDumpFileHeader (int numOptions, char **options)
 
 // Dump out a formatted block header for the requested block
 static int
-FormatHeader (Page page)
+FormatHeader (Page page, BlockNumber blkno)
 {
   int rc = 0;
   unsigned int headerBytes;
@@ -647,6 +660,14 @@ FormatHeader (Page page)
 	  || (pageHeader->pd_upper < pageHeader->pd_lower)
 	  || (pageHeader->pd_special > blockSize))
 	printf (" Error: Invalid header information.\n\n");
+
+      if (blockOptions & BLOCK_CHECKSUMS)
+   {
+     uint16 calc_checksum = pg_checksum_page(page, blkno);
+     if (calc_checksum != pageHeader->pd_checksum)
+       printf(" Error: checksum failure: calculated 0x%04x.\n\n",
+          calc_checksum);
+   }
     }
 
   // If we have reached the end of file while interpreting the header, let
@@ -1208,7 +1229,7 @@ FormatSpecial ()
 
 // For each block, dump out formatted header and content information
 static void
-FormatBlock ()
+FormatBlock (BlockNumber blkno)
 {
   Page page = (Page) buffer;
   pageOffset = blockSize * currentBlock;
@@ -1228,7 +1249,7 @@ FormatBlock ()
       int rc;
       // Every block contains a header, items and possibly a special
       // section.  Beware of partial block reads though
-      rc = FormatHeader (page);
+      rc = FormatHeader (page, blkno);
 
       // If we didn't encounter a partial read in the header, carry on...
       if (rc != EOF_ENCOUNTERED)
@@ -1498,7 +1519,7 @@ DumpFileContents ()
 		  contentsToDump = false;
 		}
 	      else
-		FormatBlock ();
+		FormatBlock (currentBlock);
 	    }
 	}
 
diff --git a/pg_filedump.h b/pg_filedump.h
index 9769c03..1a6284c 100644
--- a/pg_filedump.h
+++ b/pg_filedump.h
@@ -22,8 +22,8 @@
  * Original Author: Patrick Macdonald <patri...@redhat.com>
  */
 
-#define FD_VERSION	"9.3.0"			/* version ID of pg_filedump */
-#define FD_PG_VERSION	"PostgreSQL 9.3.x"	/* PG version it works with */
+#define FD_VERSION	"9.4.0"			/* version ID of pg_filedump */
+#define FD_PG_VERSION	"PostgreSQL 9.4.x"	/* PG version it works with */
 
 #include "postgres.h"
 
@@ -50,7 +50,8 @@ typedef enum
   BLOCK_FORMAT = 0x00000004,	// -f: Formatted dump of blocks / control file
   BLOCK_FORCED = 0x00000008,	// -S: Block size forced
   BLOCK_NO_INTR = 0x00000010,	// -d: Dump straight blocks
-  BLOCK_RANGE = 0x00000020	// -R: Specific block range to dump
+  BLOCK_RANGE = 0x00000020,	// -R: Specific block range to dump
+  BLOCK_CHECKSUMS = 0x00000040 // -k: verify block checksums
 }
 blockSwitches;
 
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to