PostgreSQL Source Code  git master
testlo.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include "libpq-fe.h"
#include "libpq/libpq-fs.h"
Include dependency graph for testlo.c:

Go to the source code of this file.

Macros

#define BUFSIZE   1024
 

Functions

static Oid importFile (PGconn *conn, char *filename)
 
static void pickout (PGconn *conn, Oid lobjId, int start, int len)
 
static void overwrite (PGconn *conn, Oid lobjId, int start, int len)
 
static void exportFile (PGconn *conn, Oid lobjId, char *filename)
 
static void exit_nicely (PGconn *conn)
 
int main (int argc, char **argv)
 

Macro Definition Documentation

◆ BUFSIZE

#define BUFSIZE   1024

Definition at line 26 of file testlo.c.

Referenced by exportFile(), and importFile().

Function Documentation

◆ exit_nicely()

static void exit_nicely ( PGconn conn)
static

Definition at line 193 of file testlo.c.

References PQfinish().

Referenced by main().

194 {
195  PQfinish(conn);
196  exit(1);
197 }
void PQfinish(PGconn *conn)
Definition: fe-connect.c:4125

◆ exportFile()

static void exportFile ( PGconn conn,
Oid  lobjId,
char *  filename 
)
static

Definition at line 150 of file testlo.c.

References buf, BUFSIZE, close, fd(), fprintf, INV_READ, lo_close(), lo_open(), lo_read(), and write.

151 {
152  int lobj_fd;
153  char buf[BUFSIZE];
154  int nbytes,
155  tmp;
156  int fd;
157 
158  /*
159  * open the large object
160  */
161  lobj_fd = lo_open(conn, lobjId, INV_READ);
162  if (lobj_fd < 0)
163  fprintf(stderr, "cannot open large object %u", lobjId);
164 
165  /*
166  * open the file to be written to
167  */
168  fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0666);
169  if (fd < 0)
170  { /* error */
171  fprintf(stderr, "cannot open unix file\"%s\"",
172  filename);
173  }
174 
175  /*
176  * read in from the inversion file and write to the Unix file
177  */
178  while ((nbytes = lo_read(conn, lobj_fd, buf, BUFSIZE)) > 0)
179  {
180  tmp = write(fd, buf, nbytes);
181  if (tmp < nbytes)
182  {
183  fprintf(stderr, "error while writing \"%s\"",
184  filename);
185  }
186  }
187 
188  lo_close(conn, lobj_fd);
189  close(fd);
190 }
#define write(a, b, c)
Definition: win32.h:14
#define fprintf
Definition: port.h:196
static int fd(const char *x, int i)
Definition: preproc-init.c:105
#define INV_READ
Definition: libpq-fs.h:22
int lo_close(PGconn *conn, int fd)
Definition: fe-lobj.c:99
static char * buf
Definition: pg_test_fsync.c:67
int lo_read(int fd, char *buf, int len)
Definition: be-fsstubs.c:142
int lo_open(PGconn *conn, Oid lobjId, int mode)
Definition: fe-lobj.c:57
static char * filename
Definition: pg_dumpall.c:90
#define BUFSIZE
Definition: testlo.c:26
#define close(a)
Definition: win32.h:12

◆ importFile()

static Oid importFile ( PGconn conn,
char *  filename 
)
static

Definition at line 34 of file testlo.c.

References buf, BUFSIZE, close, fd(), fprintf, INV_READ, INV_WRITE, lo_close(), lo_creat(), lo_open(), lo_write(), and read.

35 {
36  Oid lobjId;
37  int lobj_fd;
38  char buf[BUFSIZE];
39  int nbytes,
40  tmp;
41  int fd;
42 
43  /*
44  * open the file to be read in
45  */
46  fd = open(filename, O_RDONLY, 0666);
47  if (fd < 0)
48  { /* error */
49  fprintf(stderr, "cannot open unix file\"%s\"\n", filename);
50  }
51 
52  /*
53  * create the large object
54  */
55  lobjId = lo_creat(conn, INV_READ | INV_WRITE);
56  if (lobjId == 0)
57  fprintf(stderr, "cannot create large object");
58 
59  lobj_fd = lo_open(conn, lobjId, INV_WRITE);
60 
61  /*
62  * read in from the Unix file and write to the inversion file
63  */
64  while ((nbytes = read(fd, buf, BUFSIZE)) > 0)
65  {
66  tmp = lo_write(conn, lobj_fd, buf, nbytes);
67  if (tmp < nbytes)
68  fprintf(stderr, "error while reading \"%s\"", filename);
69  }
70 
71  close(fd);
72  lo_close(conn, lobj_fd);
73 
74  return lobjId;
75 }
unsigned int Oid
Definition: postgres_ext.h:31
#define fprintf
Definition: port.h:196
static int fd(const char *x, int i)
Definition: preproc-init.c:105
#define INV_READ
Definition: libpq-fs.h:22
int lo_close(PGconn *conn, int fd)
Definition: fe-lobj.c:99
static char * buf
Definition: pg_test_fsync.c:67
int lo_open(PGconn *conn, Oid lobjId, int mode)
Definition: fe-lobj.c:57
int lo_write(int fd, const char *buf, int len)
Definition: be-fsstubs.c:170
#define INV_WRITE
Definition: libpq-fs.h:21
Oid lo_creat(PGconn *conn, int mode)
Definition: fe-lobj.c:465
static char * filename
Definition: pg_dumpall.c:90
#define BUFSIZE
Definition: testlo.c:26
#define close(a)
Definition: win32.h:12
#define read(a, b, c)
Definition: win32.h:13

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 200 of file testlo.c.

References conn, CONNECTION_OK, exit_nicely(), fprintf, lo_export(), lo_import(), overwrite(), PGRES_TUPLES_OK, pickout(), PQclear(), PQerrorMessage(), PQexec(), PQfinish(), PQresultStatus(), PQsetdb, PQstatus(), and printf.

201 {
202  char *in_filename,
203  *out_filename;
204  char *database;
205  Oid lobjOid;
206  PGconn *conn;
207  PGresult *res;
208 
209  if (argc != 4)
210  {
211  fprintf(stderr, "Usage: %s database_name in_filename out_filename\n",
212  argv[0]);
213  exit(1);
214  }
215 
216  database = argv[1];
217  in_filename = argv[2];
218  out_filename = argv[3];
219 
220  /*
221  * set up the connection
222  */
223  conn = PQsetdb(NULL, NULL, NULL, NULL, database);
224 
225  /* check to see that the backend connection was successfully made */
226  if (PQstatus(conn) != CONNECTION_OK)
227  {
228  fprintf(stderr, "Connection to database failed: %s",
229  PQerrorMessage(conn));
230  exit_nicely(conn);
231  }
232 
233  /* Set always-secure search path, so malicious users can't take control. */
234  res = PQexec(conn,
235  "SELECT pg_catalog.set_config('search_path', '', false)");
236  if (PQresultStatus(res) != PGRES_TUPLES_OK)
237  {
238  fprintf(stderr, "SET failed: %s", PQerrorMessage(conn));
239  PQclear(res);
240  exit_nicely(conn);
241  }
242  PQclear(res);
243 
244  res = PQexec(conn, "begin");
245  PQclear(res);
246  printf("importing file \"%s\" ...\n", in_filename);
247 /* lobjOid = importFile(conn, in_filename); */
248  lobjOid = lo_import(conn, in_filename);
249  if (lobjOid == 0)
250  fprintf(stderr, "%s\n", PQerrorMessage(conn));
251  else
252  {
253  printf("\tas large object %u.\n", lobjOid);
254 
255  printf("picking out bytes 1000-2000 of the large object\n");
256  pickout(conn, lobjOid, 1000, 1000);
257 
258  printf("overwriting bytes 1000-2000 of the large object with X's\n");
259  overwrite(conn, lobjOid, 1000, 1000);
260 
261  printf("exporting large object to file \"%s\" ...\n", out_filename);
262 /* exportFile(conn, lobjOid, out_filename); */
263  if (lo_export(conn, lobjOid, out_filename) < 0)
264  fprintf(stderr, "%s\n", PQerrorMessage(conn));
265  }
266 
267  res = PQexec(conn, "end");
268  PQclear(res);
269  PQfinish(conn);
270  return 0;
271 }
char * PQerrorMessage(const PGconn *conn)
Definition: fe-connect.c:6631
void PQfinish(PGconn *conn)
Definition: fe-connect.c:4125
#define printf(...)
Definition: port.h:198
static void exit_nicely(PGconn *conn)
Definition: testlo.c:193
unsigned int Oid
Definition: postgres_ext.h:31
#define fprintf
Definition: port.h:196
ExecStatusType PQresultStatus(const PGresult *res)
Definition: fe-exec.c:2692
PGconn * conn
Definition: streamutil.c:54
int lo_export(PGconn *conn, Oid lobjId, const char *filename)
Definition: fe-lobj.c:784
#define PQsetdb(M_PGHOST, M_PGPORT, M_PGOPT, M_PGTTY, M_DBNAME)
Definition: libpq-fe.h:272
static void overwrite(PGconn *conn, Oid lobjId, int start, int len)
Definition: testlo.c:108
void PQclear(PGresult *res)
Definition: fe-exec.c:694
PGresult * PQexec(PGconn *conn, const char *query)
Definition: fe-exec.c:1939
static void pickout(PGconn *conn, Oid lobjId, int start, int len)
Definition: testlo.c:78
ConnStatusType PQstatus(const PGconn *conn)
Definition: fe-connect.c:6578
Oid lo_import(PGconn *conn, const char *filename)
Definition: fe-lobj.c:668

◆ overwrite()

static void overwrite ( PGconn conn,
Oid  lobjId,
int  start,
int  len 
)
static

Definition at line 108 of file testlo.c.

References buf, fprintf, free, i, INV_WRITE, lo_close(), lo_lseek(), lo_open(), lo_write(), and malloc.

Referenced by main().

109 {
110  int lobj_fd;
111  char *buf;
112  int nbytes;
113  int nwritten;
114  int i;
115 
116  lobj_fd = lo_open(conn, lobjId, INV_WRITE);
117  if (lobj_fd < 0)
118  fprintf(stderr, "cannot open large object %u", lobjId);
119 
120  lo_lseek(conn, lobj_fd, start, SEEK_SET);
121  buf = malloc(len + 1);
122 
123  for (i = 0; i < len; i++)
124  buf[i] = 'X';
125  buf[i] = '\0';
126 
127  nwritten = 0;
128  while (len - nwritten > 0)
129  {
130  nbytes = lo_write(conn, lobj_fd, buf + nwritten, len - nwritten);
131  nwritten += nbytes;
132  if (nbytes <= 0)
133  {
134  fprintf(stderr, "\nWRITE FAILED!\n");
135  break;
136  }
137  }
138  free(buf);
139  fprintf(stderr, "\n");
140  lo_close(conn, lobj_fd);
141 }
int lo_lseek(PGconn *conn, int fd, int offset, int whence)
Definition: fe-lobj.c:365
#define fprintf
Definition: port.h:196
#define malloc(a)
Definition: header.h:50
int lo_close(PGconn *conn, int fd)
Definition: fe-lobj.c:99
static char * buf
Definition: pg_test_fsync.c:67
int lo_open(PGconn *conn, Oid lobjId, int mode)
Definition: fe-lobj.c:57
int lo_write(int fd, const char *buf, int len)
Definition: be-fsstubs.c:170
#define free(a)
Definition: header.h:65
#define INV_WRITE
Definition: libpq-fs.h:21
int i

◆ pickout()

static void pickout ( PGconn conn,
Oid  lobjId,
int  start,
int  len 
)
static

Definition at line 78 of file testlo.c.

References buf, fprintf, free, INV_READ, lo_close(), lo_lseek(), lo_open(), lo_read(), and malloc.

Referenced by main().

79 {
80  int lobj_fd;
81  char *buf;
82  int nbytes;
83  int nread;
84 
85  lobj_fd = lo_open(conn, lobjId, INV_READ);
86  if (lobj_fd < 0)
87  fprintf(stderr, "cannot open large object %u", lobjId);
88 
89  lo_lseek(conn, lobj_fd, start, SEEK_SET);
90  buf = malloc(len + 1);
91 
92  nread = 0;
93  while (len - nread > 0)
94  {
95  nbytes = lo_read(conn, lobj_fd, buf, len - nread);
96  buf[nbytes] = '\0';
97  fprintf(stderr, ">>> %s", buf);
98  nread += nbytes;
99  if (nbytes <= 0)
100  break; /* no more data? */
101  }
102  free(buf);
103  fprintf(stderr, "\n");
104  lo_close(conn, lobj_fd);
105 }
int lo_lseek(PGconn *conn, int fd, int offset, int whence)
Definition: fe-lobj.c:365
#define fprintf
Definition: port.h:196
#define malloc(a)
Definition: header.h:50
#define INV_READ
Definition: libpq-fs.h:22
int lo_close(PGconn *conn, int fd)
Definition: fe-lobj.c:99
static char * buf
Definition: pg_test_fsync.c:67
int lo_read(int fd, char *buf, int len)
Definition: be-fsstubs.c:142
int lo_open(PGconn *conn, Oid lobjId, int mode)
Definition: fe-lobj.c:57
#define free(a)
Definition: header.h:65