forked from haolinw/filedump
-
Notifications
You must be signed in to change notification settings - Fork 2
/
pg_filedump.h
154 lines (133 loc) · 5.53 KB
/
pg_filedump.h
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
/*
* pg_filedump.h - PostgreSQL file dump utility for dumping and
* formatting heap (data), index and control files.
*
* Copyright (c) 2002-2010 Red Hat, Inc.
* Copyright (c) 2011-2019, PostgreSQL Global Development Group
* Copyright (c) 2021 VMware, Inc. or its affiliates
* SPDX-License-Identifier: GPL-2.0-or-later
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Original Author: Patrick Macdonald <[email protected]>
*/
#define FD_VERSION "12.0" /* version ID of pg_filedump */
#define FD_PG_VERSION "PostgreSQL 12.x" /* PG version it works with */
#include "postgres.h"
#include <time.h>
#include <ctype.h>
#include "access/bitmap.h"
#include "access/gin_private.h"
#include "access/gist.h"
#include "access/hash.h"
#include "access/htup.h"
#include "access/htup_details.h"
#include "access/itup.h"
#include "access/nbtree.h"
#include "access/spgist_private.h"
#include "catalog/pg_control.h"
#include "storage/bufpage.h"
/* Options for Block formatting operations */
extern unsigned int blockOptions;
typedef enum blockSwitches
{
BLOCK_ABSOLUTE = 0x00000001, /* -a: Absolute(vs Relative) addressing */
BLOCK_BINARY = 0x00000002, /* -b: Binary dump of block */
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_CHECKSUMS = 0x00000040, /* -k: verify block checksums */
BLOCK_DECODE = 0x00000080, /* -D: Try to decode tuples */
BLOCK_DECODE_TOAST = 0x00000100, /* -t: Try to decode TOAST values */
BLOCK_IGNORE_OLD = 0x00000200, /* -o: Decode old values */
BLOCK_BITMAP = 0x00000400 /* -B: Treat block as a bitmap index page */
} blockSwitches;
/* Segment-related options */
extern unsigned int segmentOptions;
typedef enum segmentSwitches
{
SEGMENT_SIZE_FORCED = 0x00000001, /* -s: Segment size forced */
SEGMENT_NUMBER_FORCED = 0x00000002, /* -n: Segment number forced */
} segmentSwitches;
/* -R[start]:Block range start */
extern int blockStart;
/* -R[end]:Block range end */
extern int blockEnd;
/* Options for Item formatting operations */
extern unsigned int itemOptions;
typedef enum itemSwitches
{
ITEM_DETAIL = 0x00000001, /* -i: Display interpreted items */
ITEM_HEAP = 0x00000002, /* -y: Blocks contain HeapTuple items */
ITEM_INDEX = 0x00000004, /* -x: Blocks contain IndexTuple items */
ITEM_SPG_INNER = 0x00000008, /* Blocks contain SpGistInnerTuple items */
ITEM_SPG_LEAF = 0x00000010 /* Blocks contain SpGistLeafTuple items */
} itemSwitches;
/* Options for Control File formatting operations */
extern unsigned int controlOptions;
typedef enum controlSwitches
{
CONTROL_DUMP = 0x00000001, /* -c: Dump control file */
CONTROL_FORMAT = BLOCK_FORMAT, /* -f: Formatted dump of control file */
CONTROL_FORCED = BLOCK_FORCED /* -S: Block size forced */
} controlSwitches;
/* Possible value types for the Special Section */
typedef enum specialSectionTypes
{
SPEC_SECT_NONE, /* No special section on block */
SPEC_SECT_SEQUENCE, /* Sequence info in special section */
SPEC_SECT_INDEX_BITMAP, /* Bitmap index info in special section */
SPEC_SECT_INDEX_BTREE, /* BTree index info in special section */
SPEC_SECT_INDEX_HASH, /* Hash index info in special section */
SPEC_SECT_INDEX_GIST, /* GIST index info in special section */
SPEC_SECT_INDEX_GIN, /* GIN index info in special section */
SPEC_SECT_INDEX_SPGIST, /* SP - GIST index info in special section */
SPEC_SECT_ERROR_UNKNOWN, /* Unknown error */
SPEC_SECT_ERROR_BOUNDARY /* Boundary error */
} specialSectionTypes;
extern unsigned int specialType;
/* Possible return codes from option validation routine.
* pg_filedump doesn't do much with them now but maybe in
* the future... */
typedef enum optionReturnCodes
{
OPT_RC_VALID, /* All options are valid */
OPT_RC_INVALID, /* Improper option string */
OPT_RC_FILE, /* File problems */
OPT_RC_DUPLICATE, /* Duplicate option encountered */
OPT_RC_COPYRIGHT /* Copyright should be displayed */
} optionReturnCodes;
/* Simple macro to check for duplicate options and then set
* an option flag for later consumption */
#define SET_OPTION(_x,_y,_z) if (_x & _y) \
{ \
rc = OPT_RC_DUPLICATE; \
duplicateSwitch = _z; \
} \
else \
_x |= _y;
#define SEQUENCE_MAGIC 0x1717 /* PostgreSQL defined magic number */
#define EOF_ENCOUNTERED (-1) /* Indicator for partial read */
#define BYTES_PER_LINE 16 /* Format the binary 16 bytes per line */
extern char *fileName;
/*
* Function Prototypes
*/
unsigned int GetBlockSize(FILE *fp);
int DumpFileContents(unsigned int blockOptions, unsigned int controlOptions,
FILE *fp, unsigned int blockSize, int blockStart,
int blockEnd, bool isToast, Oid toastOid,
unsigned int toastExternalSize, char *toastValue);