Package: postgresql-filedump / 9.3.0-2

81982fa168744a92a435ecbb2d0a360cb650af7a Patch series | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
commit 81982fa168744a92a435ecbb2d0a360cb650af7a
Author: Christoph Berg <myon@debian.org>
Date:   Sat Aug 30 22:15:22 2014 +0200

    Add support for verifying block checksums
    
    Patch by Jeff Davis, rebased by Fabrízio de Royes Mello.

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 <patrickm@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;