Age Owner Branch data TLA Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * compress_none.c
4 : : * Routines for archivers to read or write an uncompressed stream.
5 : : *
6 : : * Portions Copyright (c) 1996-2024, 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 : : * Private routines
27 : : */
28 : :
29 : : static void
416 tomas.vondra@postgre 30 :UBC 0 : ReadDataFromArchiveNone(ArchiveHandle *AH, CompressorState *cs)
31 : : {
32 : : size_t cnt;
33 : : char *buf;
34 : : size_t buflen;
35 : :
388 36 : 0 : buflen = DEFAULT_IO_BUFFER_SIZE;
37 : 0 : buf = pg_malloc(buflen);
38 : :
416 39 [ # # ]: 0 : while ((cnt = cs->readF(AH, &buf, &buflen)))
40 : : {
41 : 0 : ahwrite(buf, 1, cnt, AH);
42 : : }
43 : :
44 : 0 : free(buf);
45 : 0 : }
46 : :
47 : :
48 : : static void
49 : 0 : WriteDataToArchiveNone(ArchiveHandle *AH, CompressorState *cs,
50 : : const void *data, size_t dLen)
51 : : {
52 : 0 : cs->writeF(AH, data, dLen);
53 : 0 : }
54 : :
55 : : static void
56 : 0 : EndCompressorNone(ArchiveHandle *AH, CompressorState *cs)
57 : : {
58 : : /* no op */
59 : 0 : }
60 : :
61 : : /*
62 : : * Public interface
63 : : */
64 : :
65 : : void
66 : 0 : InitCompressorNone(CompressorState *cs,
67 : : const pg_compress_specification compression_spec)
68 : : {
69 : 0 : cs->readData = ReadDataFromArchiveNone;
70 : 0 : cs->writeData = WriteDataToArchiveNone;
71 : 0 : cs->end = EndCompressorNone;
72 : :
73 : 0 : cs->compression_spec = compression_spec;
74 : 0 : }
75 : :
76 : :
77 : : /*----------------------
78 : : * Compress File API
79 : : *----------------------
80 : : */
81 : :
82 : : /*
83 : : * Private routines
84 : : */
85 : :
86 : : static bool
388 tomas.vondra@postgre 87 :CBC 21269 : read_none(void *ptr, size_t size, size_t *rsize, CompressFileHandle *CFH)
88 : : {
416 89 : 21269 : FILE *fp = (FILE *) CFH->private_data;
90 : : size_t ret;
91 : :
92 [ + + ]: 21269 : if (size == 0)
388 93 : 2126 : return true;
94 : :
416 95 : 19143 : ret = fread(ptr, 1, size, fp);
96 [ - + - - ]: 19143 : if (ret != size && !feof(fp))
33 michael@paquier.xyz 97 :UNC 0 : pg_fatal("could not read from input file: %m");
98 : :
388 tomas.vondra@postgre 99 [ - + ]:CBC 19143 : if (rsize)
388 tomas.vondra@postgre 100 :UBC 0 : *rsize = ret;
101 : :
388 tomas.vondra@postgre 102 :CBC 19143 : return true;
103 : : }
104 : :
105 : : static bool
416 106 : 2018585 : write_none(const void *ptr, size_t size, CompressFileHandle *CFH)
107 : : {
108 : : size_t ret;
109 : :
388 110 : 2018585 : ret = fwrite(ptr, 1, size, (FILE *) CFH->private_data);
111 [ - + ]: 2018585 : if (ret != size)
388 tomas.vondra@postgre 112 :UBC 0 : return false;
113 : :
388 tomas.vondra@postgre 114 :CBC 2018585 : return true;
115 : : }
116 : :
117 : : static const char *
416 tomas.vondra@postgre 118 :UBC 0 : get_error_none(CompressFileHandle *CFH)
119 : : {
120 : 0 : return strerror(errno);
121 : : }
122 : :
123 : : static char *
416 tomas.vondra@postgre 124 :CBC 12 : gets_none(char *ptr, int size, CompressFileHandle *CFH)
125 : : {
126 : 12 : return fgets(ptr, size, (FILE *) CFH->private_data);
127 : : }
128 : :
129 : : static int
130 : 176276 : getc_none(CompressFileHandle *CFH)
131 : : {
132 : 176276 : FILE *fp = (FILE *) CFH->private_data;
133 : : int ret;
134 : :
135 : 176276 : ret = fgetc(fp);
136 [ - + ]: 176276 : if (ret == EOF)
137 : : {
416 tomas.vondra@postgre 138 [ # # ]:UBC 0 : if (!feof(fp))
33 michael@paquier.xyz 139 :UNC 0 : pg_fatal("could not read from input file: %m");
140 : : else
416 tomas.vondra@postgre 141 :UBC 0 : pg_fatal("could not read from input file: end of file");
142 : : }
143 : :
416 tomas.vondra@postgre 144 :CBC 176276 : return ret;
145 : : }
146 : :
147 : : static bool
148 : 367 : close_none(CompressFileHandle *CFH)
149 : : {
150 : 367 : FILE *fp = (FILE *) CFH->private_data;
151 : 367 : int ret = 0;
152 : :
153 : 367 : CFH->private_data = NULL;
154 : :
155 [ + - ]: 367 : if (fp)
156 : 367 : ret = fclose(fp);
157 : :
388 158 : 367 : return ret == 0;
159 : : }
160 : :
161 : : static bool
416 162 : 6 : eof_none(CompressFileHandle *CFH)
163 : : {
388 164 : 6 : return feof((FILE *) CFH->private_data) != 0;
165 : : }
166 : :
167 : : static bool
416 168 : 367 : open_none(const char *path, int fd, const char *mode, CompressFileHandle *CFH)
169 : : {
170 [ - + ]: 367 : Assert(CFH->private_data == NULL);
171 : :
172 [ + + ]: 367 : if (fd >= 0)
173 : 216 : CFH->private_data = fdopen(dup(fd), mode);
174 : : else
175 : 151 : CFH->private_data = fopen(path, mode);
176 : :
177 [ - + ]: 367 : if (CFH->private_data == NULL)
388 tomas.vondra@postgre 178 :UBC 0 : return false;
179 : :
388 tomas.vondra@postgre 180 :CBC 367 : return true;
181 : : }
182 : :
183 : : static bool
416 184 : 21 : open_write_none(const char *path, const char *mode, CompressFileHandle *CFH)
185 : : {
186 [ - + ]: 21 : Assert(CFH->private_data == NULL);
187 : :
188 : 21 : CFH->private_data = fopen(path, mode);
189 [ - + ]: 21 : if (CFH->private_data == NULL)
388 tomas.vondra@postgre 190 :UBC 0 : return false;
191 : :
388 tomas.vondra@postgre 192 :CBC 21 : return true;
193 : : }
194 : :
195 : : /*
196 : : * Public interface
197 : : */
198 : :
199 : : void
416 200 : 388 : InitCompressFileHandleNone(CompressFileHandle *CFH,
201 : : const pg_compress_specification compression_spec)
202 : : {
203 : 388 : CFH->open_func = open_none;
204 : 388 : CFH->open_write_func = open_write_none;
205 : 388 : CFH->read_func = read_none;
206 : 388 : CFH->write_func = write_none;
207 : 388 : CFH->gets_func = gets_none;
208 : 388 : CFH->getc_func = getc_none;
209 : 388 : CFH->close_func = close_none;
210 : 388 : CFH->eof_func = eof_none;
211 : 388 : CFH->get_error_func = get_error_none;
212 : :
213 : 388 : CFH->private_data = NULL;
214 : 388 : }
|