PostgreSQL Source Code git master
compress_none.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * compress_none.c
4 * Routines for archivers to read or write an uncompressed stream.
5 *
6 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 * IDENTIFICATION
10 * src/bin/pg_dump/compress_none.c
11 *
12 *-------------------------------------------------------------------------
13 */
14#include "postgres_fe.h"
15#include <unistd.h>
16
17#include "compress_none.h"
18#include "pg_backup_utils.h"
19
20/*----------------------
21 * Compressor API
22 *----------------------
23 */
24
25/*
26 * We buffer outgoing data, just to ensure that data blocks written to the
27 * archive file are of reasonable size. The read side could use this struct,
28 * but there's no need because it does not retain data across calls.
29 */
30typedef struct NoneCompressorState
31{
32 char *buffer; /* buffer for unwritten data */
33 size_t buflen; /* allocated size of buffer */
34 size_t bufdata; /* amount of valid data currently in buffer */
36
37/*
38 * Private routines
39 */
40
41static void
43{
44 size_t cnt;
45 char *buf;
46 size_t buflen;
47
49 buf = pg_malloc(buflen);
50
51 while ((cnt = cs->readF(AH, &buf, &buflen)))
52 {
53 ahwrite(buf, 1, cnt, AH);
54 }
55
56 free(buf);
57}
58
59
60static void
62 const void *data, size_t dLen)
63{
65 size_t remaining = dLen;
66
67 while (remaining > 0)
68 {
69 size_t chunk;
70
71 /* Dump buffer if full */
72 if (nonecs->bufdata >= nonecs->buflen)
73 {
74 cs->writeF(AH, nonecs->buffer, nonecs->bufdata);
75 nonecs->bufdata = 0;
76 }
77 /* And fill it */
78 chunk = nonecs->buflen - nonecs->bufdata;
79 if (chunk > remaining)
80 chunk = remaining;
81 memcpy(nonecs->buffer + nonecs->bufdata, data, chunk);
82 nonecs->bufdata += chunk;
83 data = ((const char *) data) + chunk;
84 remaining -= chunk;
85 }
86}
87
88static void
90{
92
93 if (nonecs)
94 {
95 /* Dump buffer if nonempty */
96 if (nonecs->bufdata > 0)
97 cs->writeF(AH, nonecs->buffer, nonecs->bufdata);
98 /* Free working state */
99 pg_free(nonecs->buffer);
100 pg_free(nonecs);
101 cs->private_data = NULL;
102 }
103}
104
105/*
106 * Public interface
107 */
108
109void
111 const pg_compress_specification compression_spec)
112{
116
117 cs->compression_spec = compression_spec;
118
119 /*
120 * If the caller has defined a write function, prepare the necessary
121 * buffer.
122 */
123 if (cs->writeF)
124 {
125 NoneCompressorState *nonecs;
126
129 nonecs->buffer = pg_malloc(nonecs->buflen);
130 nonecs->bufdata = 0;
131
132 cs->private_data = nonecs;
133 }
134}
135
136
137/*----------------------
138 * Compress File API
139 *----------------------
140 */
141
142/*
143 * Private routines
144 */
145
146static size_t
147read_none(void *ptr, size_t size, CompressFileHandle *CFH)
148{
149 FILE *fp = (FILE *) CFH->private_data;
150 size_t ret;
151
152 ret = fread(ptr, 1, size, fp);
153 if (ferror(fp))
154 pg_fatal("could not read from input file: %m");
155
156 return ret;
157}
158
159static void
160write_none(const void *ptr, size_t size, CompressFileHandle *CFH)
161{
162 size_t ret;
163
164 errno = 0;
165 ret = fwrite(ptr, 1, size, (FILE *) CFH->private_data);
166 if (ret != size)
167 {
168 errno = (errno) ? errno : ENOSPC;
169 pg_fatal("could not write to file: %m");
170 }
171}
172
173static const char *
175{
176 return strerror(errno);
177}
178
179static char *
180gets_none(char *ptr, int size, CompressFileHandle *CFH)
181{
182 return fgets(ptr, size, (FILE *) CFH->private_data);
183}
184
185static int
187{
188 FILE *fp = (FILE *) CFH->private_data;
189 int ret;
190
191 ret = fgetc(fp);
192 if (ret == EOF)
193 {
194 if (!feof(fp))
195 pg_fatal("could not read from input file: %m");
196 else
197 pg_fatal("could not read from input file: end of file");
198 }
199
200 return ret;
201}
202
203static bool
205{
206 FILE *fp = (FILE *) CFH->private_data;
207 int ret = 0;
208
209 CFH->private_data = NULL;
210
211 if (fp)
212 {
213 errno = 0;
214 ret = fclose(fp);
215 if (ret != 0)
216 pg_log_error("could not close file: %m");
217 }
218
219 return ret == 0;
220}
221
222static bool
224{
225 return feof((FILE *) CFH->private_data) != 0;
226}
227
228static bool
229open_none(const char *path, int fd, const char *mode, CompressFileHandle *CFH)
230{
231 Assert(CFH->private_data == NULL);
232
233 if (fd >= 0)
234 CFH->private_data = fdopen(dup(fd), mode);
235 else
236 CFH->private_data = fopen(path, mode);
237
238 if (CFH->private_data == NULL)
239 return false;
240
241 return true;
242}
243
244static bool
245open_write_none(const char *path, const char *mode, CompressFileHandle *CFH)
246{
247 Assert(CFH->private_data == NULL);
248
249 CFH->private_data = fopen(path, mode);
250 if (CFH->private_data == NULL)
251 return false;
252
253 return true;
254}
255
256/*
257 * Public interface
258 */
259
260void
262 const pg_compress_specification compression_spec)
263{
264 CFH->open_func = open_none;
266 CFH->read_func = read_none;
267 CFH->write_func = write_none;
268 CFH->gets_func = gets_none;
269 CFH->getc_func = getc_none;
270 CFH->close_func = close_none;
271 CFH->eof_func = eof_none;
273
274 CFH->private_data = NULL;
275}
#define DEFAULT_IO_BUFFER_SIZE
Definition: compress_io.h:27
static bool close_none(CompressFileHandle *CFH)
static void write_none(const void *ptr, size_t size, CompressFileHandle *CFH)
static int getc_none(CompressFileHandle *CFH)
static void EndCompressorNone(ArchiveHandle *AH, CompressorState *cs)
Definition: compress_none.c:89
void InitCompressorNone(CompressorState *cs, const pg_compress_specification compression_spec)
static bool eof_none(CompressFileHandle *CFH)
static char * gets_none(char *ptr, int size, CompressFileHandle *CFH)
void InitCompressFileHandleNone(CompressFileHandle *CFH, const pg_compress_specification compression_spec)
static bool open_write_none(const char *path, const char *mode, CompressFileHandle *CFH)
struct NoneCompressorState NoneCompressorState
static void WriteDataToArchiveNone(ArchiveHandle *AH, CompressorState *cs, const void *data, size_t dLen)
Definition: compress_none.c:61
static size_t read_none(void *ptr, size_t size, CompressFileHandle *CFH)
static bool open_none(const char *path, int fd, const char *mode, CompressFileHandle *CFH)
static void ReadDataFromArchiveNone(ArchiveHandle *AH, CompressorState *cs)
Definition: compress_none.c:42
static const char * get_error_none(CompressFileHandle *CFH)
void * pg_malloc(size_t size)
Definition: fe_memutils.c:47
void pg_free(void *ptr)
Definition: fe_memutils.c:105
Assert(PointerIsAligned(start, uint64))
#define free(a)
Definition: header.h:65
int remaining
Definition: informix.c:692
if(TABLE==NULL||TABLE_index==NULL)
Definition: isn.c:81
#define pg_log_error(...)
Definition: logging.h:106
void ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH)
#define pg_fatal(...)
static PgChecksumMode mode
Definition: pg_checksums.c:56
const void * data
while(p+4<=pend)
static char * buf
Definition: pg_test_fsync.c:72
#define strerror
Definition: port.h:273
static int fd(const char *x, int i)
Definition: preproc-init.c:105
char *(* gets_func)(char *s, int size, CompressFileHandle *CFH)
Definition: compress_io.h:153
bool(* open_write_func)(const char *path, const char *mode, CompressFileHandle *CFH)
Definition: compress_io.h:122
int(* getc_func)(CompressFileHandle *CFH)
Definition: compress_io.h:162
const char *(* get_error_func)(CompressFileHandle *CFH)
Definition: compress_io.h:182
bool(* eof_func)(CompressFileHandle *CFH)
Definition: compress_io.h:169
size_t(* read_func)(void *ptr, size_t size, CompressFileHandle *CFH)
Definition: compress_io.h:132
bool(* open_func)(const char *path, int fd, const char *mode, CompressFileHandle *CFH)
Definition: compress_io.h:111
bool(* close_func)(CompressFileHandle *CFH)
Definition: compress_io.h:176
void(* write_func)(const void *ptr, size_t size, CompressFileHandle *CFH)
Definition: compress_io.h:140
void * private_data
Definition: compress_io.h:87
void(* readData)(ArchiveHandle *AH, CompressorState *cs)
Definition: compress_io.h:56
pg_compress_specification compression_spec
Definition: compress_io.h:82
void(* end)(ArchiveHandle *AH, CompressorState *cs)
Definition: compress_io.h:67
ReadFunc readF
Definition: compress_io.h:72
void(* writeData)(ArchiveHandle *AH, CompressorState *cs, const void *data, size_t dLen)
Definition: compress_io.h:61
WriteFunc writeF
Definition: compress_io.h:77