PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
large_obj.c File Reference
#include "postgres_fe.h"
#include "common.h"
#include "common/logging.h"
#include "fe_utils/cancel.h"
#include "large_obj.h"
#include "settings.h"
Include dependency graph for large_obj.c:

Go to the source code of this file.

Functions

static void print_lo_result (const char *fmt,...) pg_attribute_printf(1
 
static bool start_lo_xact (const char *operation, bool *own_transaction)
 
static bool finish_lo_xact (const char *operation, bool own_transaction)
 
static bool fail_lo_xact (const char *operation, bool own_transaction)
 
bool do_lo_export (const char *loid_arg, const char *filename_arg)
 
bool do_lo_import (const char *filename_arg, const char *comment_arg)
 
bool do_lo_unlink (const char *loid_arg)
 

Function Documentation

◆ do_lo_export()

bool do_lo_export ( const char *  loid_arg,
const char *  filename_arg 
)

Definition at line 142 of file large_obj.c.

143{
144 int status;
145 bool own_transaction;
146
147 if (!start_lo_xact("\\lo_export", &own_transaction))
148 return false;
149
150 SetCancelConn(NULL);
151 status = lo_export(pset.db, atooid(loid_arg), filename_arg);
153
154 /* of course this status is documented nowhere :( */
155 if (status != 1)
156 {
158 return fail_lo_xact("\\lo_export", own_transaction);
159 }
160
161 if (!finish_lo_xact("\\lo_export", own_transaction))
162 return false;
163
164 print_lo_result("lo_export");
165
166 return true;
167}
void ResetCancelConn(void)
Definition: cancel.c:107
void SetCancelConn(PGconn *conn)
Definition: cancel.c:77
char * PQerrorMessage(const PGconn *conn)
Definition: fe-connect.c:7619
int lo_export(PGconn *conn, Oid lobjId, const char *filename)
Definition: fe-lobj.c:748
static bool start_lo_xact(const char *operation, bool *own_transaction)
Definition: large_obj.c:56
static bool fail_lo_xact(const char *operation, bool own_transaction)
Definition: large_obj.c:121
static void print_lo_result(const char *fmt,...) pg_attribute_printf(1
Definition: large_obj.c:19
static bool finish_lo_xact(const char *operation, bool own_transaction)
Definition: large_obj.c:98
#define pg_log_info(...)
Definition: logging.h:124
#define atooid(x)
Definition: postgres_ext.h:41
PsqlSettings pset
Definition: startup.c:32
PGconn * db
Definition: settings.h:103

References atooid, _psqlSettings::db, fail_lo_xact(), finish_lo_xact(), lo_export(), pg_log_info, PQerrorMessage(), print_lo_result(), pset, ResetCancelConn(), SetCancelConn(), and start_lo_xact().

Referenced by exec_command_lo().

◆ do_lo_import()

bool do_lo_import ( const char *  filename_arg,
const char *  comment_arg 
)

Definition at line 176 of file large_obj.c.

177{
178 PGresult *res;
179 Oid loid;
180 char oidbuf[32];
181 bool own_transaction;
182
183 if (!start_lo_xact("\\lo_import", &own_transaction))
184 return false;
185
186 SetCancelConn(NULL);
187 loid = lo_import(pset.db, filename_arg);
189
190 if (loid == InvalidOid)
191 {
193 return fail_lo_xact("\\lo_import", own_transaction);
194 }
195
196 /* insert description if given */
197 if (comment_arg)
198 {
199 char *cmdbuf;
200 char *bufptr;
201 size_t slen = strlen(comment_arg);
202
203 cmdbuf = pg_malloc_extended(slen * 2 + 256, MCXT_ALLOC_NO_OOM);
204 if (!cmdbuf)
205 return fail_lo_xact("\\lo_import", own_transaction);
206 sprintf(cmdbuf, "COMMENT ON LARGE OBJECT %u IS '", loid);
207 bufptr = cmdbuf + strlen(cmdbuf);
208 bufptr += PQescapeStringConn(pset.db, bufptr, comment_arg, slen, NULL);
209 strcpy(bufptr, "'");
210
211 if (!(res = PSQLexec(cmdbuf)))
212 {
213 free(cmdbuf);
214 return fail_lo_xact("\\lo_import", own_transaction);
215 }
216
217 PQclear(res);
218 free(cmdbuf);
219 }
220
221 if (!finish_lo_xact("\\lo_import", own_transaction))
222 return false;
223
224 print_lo_result("lo_import %u", loid);
225
226 sprintf(oidbuf, "%u", loid);
227 SetVariable(pset.vars, "LASTOID", oidbuf);
228
229 return true;
230}
PGresult * PSQLexec(const char *query)
Definition: common.c:655
size_t PQescapeStringConn(PGconn *conn, char *to, const char *from, size_t length, int *error)
Definition: fe-exec.c:4176
void PQclear(PGresult *res)
Definition: fe-exec.c:721
Oid lo_import(PGconn *conn, const char *filename)
Definition: fe-lobj.c:626
void * pg_malloc_extended(size_t size, int flags)
Definition: fe_memutils.c:59
#define MCXT_ALLOC_NO_OOM
Definition: fe_memutils.h:29
#define free(a)
Definition: header.h:65
#define sprintf
Definition: port.h:241
#define InvalidOid
Definition: postgres_ext.h:35
unsigned int Oid
Definition: postgres_ext.h:30
VariableSpace vars
Definition: settings.h:151
bool SetVariable(VariableSpace space, const char *name, const char *value)
Definition: variables.c:281

References _psqlSettings::db, fail_lo_xact(), finish_lo_xact(), free, InvalidOid, lo_import(), MCXT_ALLOC_NO_OOM, pg_log_info, pg_malloc_extended(), PQclear(), PQerrorMessage(), PQescapeStringConn(), print_lo_result(), pset, PSQLexec(), ResetCancelConn(), SetCancelConn(), SetVariable(), sprintf, start_lo_xact(), and _psqlSettings::vars.

Referenced by exec_command_lo().

◆ do_lo_unlink()

bool do_lo_unlink ( const char *  loid_arg)

Definition at line 239 of file large_obj.c.

240{
241 int status;
242 Oid loid = atooid(loid_arg);
243 bool own_transaction;
244
245 if (!start_lo_xact("\\lo_unlink", &own_transaction))
246 return false;
247
248 SetCancelConn(NULL);
249 status = lo_unlink(pset.db, loid);
251
252 if (status == -1)
253 {
255 return fail_lo_xact("\\lo_unlink", own_transaction);
256 }
257
258 if (!finish_lo_xact("\\lo_unlink", own_transaction))
259 return false;
260
261 print_lo_result("lo_unlink %u", loid);
262
263 return true;
264}
int lo_unlink(PGconn *conn, Oid lobjId)
Definition: fe-lobj.c:589

References atooid, _psqlSettings::db, fail_lo_xact(), finish_lo_xact(), lo_unlink(), pg_log_info, PQerrorMessage(), print_lo_result(), pset, ResetCancelConn(), SetCancelConn(), and start_lo_xact().

Referenced by exec_command_lo().

◆ fail_lo_xact()

static bool fail_lo_xact ( const char *  operation,
bool  own_transaction 
)
static

Definition at line 121 of file large_obj.c.

122{
123 PGresult *res;
124
125 if (own_transaction && pset.autocommit)
126 {
127 /* close out our own xact */
128 res = PSQLexec("ROLLBACK");
129 PQclear(res);
130 }
131
132 return false; /* always */
133}
bool autocommit
Definition: settings.h:165

References _psqlSettings::autocommit, PQclear(), pset, and PSQLexec().

Referenced by do_lo_export(), do_lo_import(), and do_lo_unlink().

◆ finish_lo_xact()

static bool finish_lo_xact ( const char *  operation,
bool  own_transaction 
)
static

Definition at line 98 of file large_obj.c.

99{
100 PGresult *res;
101
102 if (own_transaction && pset.autocommit)
103 {
104 /* close out our own xact */
105 if (!(res = PSQLexec("COMMIT")))
106 {
107 res = PSQLexec("ROLLBACK");
108 PQclear(res);
109 return false;
110 }
111 PQclear(res);
112 }
113
114 return true;
115}

References _psqlSettings::autocommit, PQclear(), pset, and PSQLexec().

Referenced by do_lo_export(), do_lo_import(), and do_lo_unlink().

◆ print_lo_result()

static void static void print_lo_result ( const char *  fmt,
  ... 
)
static

Definition at line 19 of file large_obj.c.

20{
21 va_list ap;
22
23 if (!pset.quiet)
24 {
26 fputs("<p>", pset.queryFout);
27
28 va_start(ap, fmt);
29 vfprintf(pset.queryFout, fmt, ap);
30 va_end(ap);
31
33 fputs("</p>\n", pset.queryFout);
34 else
35 fputs("\n", pset.queryFout);
36 }
37
38 if (pset.logfile)
39 {
40 va_start(ap, fmt);
41 vfprintf(pset.logfile, fmt, ap);
42 va_end(ap);
43 fputs("\n", pset.logfile);
44 }
45}
@ PRINT_HTML
Definition: print.h:34
#define vfprintf
Definition: port.h:242
printQueryOpt popt
Definition: settings.h:112
FILE * logfile
Definition: settings.h:149
FILE * queryFout
Definition: settings.h:105
printTableOpt topt
Definition: print.h:185
enum printFormat format
Definition: print.h:113

References printTableOpt::format, _psqlSettings::logfile, _psqlSettings::popt, PRINT_HTML, pset, _psqlSettings::queryFout, _psqlSettings::quiet, printQueryOpt::topt, and vfprintf.

Referenced by do_lo_export(), do_lo_import(), and do_lo_unlink().

◆ start_lo_xact()

static bool start_lo_xact ( const char *  operation,
bool *  own_transaction 
)
static

Definition at line 56 of file large_obj.c.

57{
59 PGresult *res;
60
61 *own_transaction = false;
62
63 if (!pset.db)
64 {
65 pg_log_error("%s: not connected to a database", operation);
66 return false;
67 }
68
69 tstatus = PQtransactionStatus(pset.db);
70
71 switch (tstatus)
72 {
73 case PQTRANS_IDLE:
74 /* need to start our own xact */
75 if (!(res = PSQLexec("BEGIN")))
76 return false;
77 PQclear(res);
78 *own_transaction = true;
79 break;
80 case PQTRANS_INTRANS:
81 /* use the existing xact */
82 break;
83 case PQTRANS_INERROR:
84 pg_log_error("%s: current transaction is aborted", operation);
85 return false;
86 default:
87 pg_log_error("%s: unknown transaction status", operation);
88 return false;
89 }
90
91 return true;
92}
PGTransactionStatusType PQtransactionStatus(const PGconn *conn)
Definition: fe-connect.c:7564
PGTransactionStatusType
Definition: libpq-fe.h:146
@ PQTRANS_INTRANS
Definition: libpq-fe.h:149
@ PQTRANS_IDLE
Definition: libpq-fe.h:147
@ PQTRANS_INERROR
Definition: libpq-fe.h:150
#define pg_log_error(...)
Definition: logging.h:106

References _psqlSettings::db, pg_log_error, PQclear(), PQTRANS_IDLE, PQTRANS_INERROR, PQTRANS_INTRANS, PQtransactionStatus(), pset, and PSQLexec().

Referenced by do_lo_export(), do_lo_import(), and do_lo_unlink().