Datum loread(PG_FUNCTION_ARGS) { int32 fd = PG_GETARG_INT32(0); int32 len = PG_GETARG_INT32(1); bytea *retval; int totalread; #ifdef PGXC #ifdef XCP ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("Postgres-XL does not yet support large objects"), errdetail("The feature is not currently supported"))); #else ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("Postgres-XC does not support large object yet"), errdetail("The feature is not currently supported"))); #endif #endif if (len < 0) len = 0; retval = (bytea *) palloc(VARHDRSZ + len); totalread = lo_read(fd, VARDATA(retval), len); SET_VARSIZE(retval, totalread + VARHDRSZ); PG_RETURN_BYTEA_P(retval); }
static void pickout(PGconn *conn, Oid lobjId, pg_int64 start, int len) { int lobj_fd; char *buf; int nbytes; int nread; lobj_fd = lo_open(conn, lobjId, INV_READ); if (lobj_fd < 0) fprintf(stderr, "cannot open large object %u", lobjId); if (lo_lseek64(conn, lobj_fd, start, SEEK_SET) < 0) fprintf(stderr, "error in lo_lseek64: %s", PQerrorMessage(conn)); if (lo_tell64(conn, lobj_fd) != start) fprintf(stderr, "error in lo_tell64: %s", PQerrorMessage(conn)); buf = malloc(len + 1); nread = 0; while (len - nread > 0) { nbytes = lo_read(conn, lobj_fd, buf, len - nread); buf[nbytes] = '\0'; fprintf(stderr, ">>> %s", buf); nread += nbytes; if (nbytes <= 0) break; /* no more data? */ } free(buf); fprintf(stderr, "\n"); lo_close(conn, lobj_fd); }
CAMLprim value lo_read_ba_stub(value v_conn, value v_fd, value v_buf, value v_pos, value v_len) { CAMLparam2(v_conn, v_buf); PGconn *conn = get_conn(v_conn); value v_res; size_t len = Long_val(v_len); char *buf = ((char *) Caml_ba_data_val(v_buf)) + Long_val(v_pos); caml_enter_blocking_section(); v_res = Val_long(lo_read(conn, Int_val(v_fd), buf, len)); caml_leave_blocking_section(); CAMLreturn(v_res); }
CAMLprim value lo_read_stub(value v_conn, value v_fd, value v_buf, value v_pos, value v_len) { CAMLparam2(v_conn, v_buf); PGconn *conn = get_conn(v_conn); value v_res; size_t len = Long_val(v_len); char *buf = caml_stat_alloc(len); caml_enter_blocking_section(); v_res = Val_long(lo_read(conn, Int_val(v_fd), buf, len)); caml_leave_blocking_section(); memcpy(String_val(v_buf) + Long_val(v_pos), buf, len); free(buf); CAMLreturn(v_res); }
/* ************************************************************************* */ int pg_lo_read(ClipMachine* mp, SQLCONN* c, int oid_fd, char *buffer, int length){ PG_CONN *conn = (PG_CONN*)c; int rt; if(!conn->at){ _clip_trap_err(mp,0,0,0,subsys,ER_START,er_start); return 1; } rt = lo_read(conn->conn, oid_fd, buffer, (size_t) length); if (rt < 0){ _clip_trap_err(mp,0,0,0,subsys,ER_START,er_blob_read); return 1; } _clip_retni(mp,(unsigned int) rt); return 0; }
Datum loread(PG_FUNCTION_ARGS) { int32 fd = PG_GETARG_INT32(0); int32 len = PG_GETARG_INT32(1); bytea *retval; int totalread; if (len < 0) len = 0; retval = (bytea *) palloc(VARHDRSZ + len); totalread = lo_read(fd, VARDATA(retval), len); SET_VARSIZE(retval, totalread + VARHDRSZ); PG_RETURN_BYTEA_P(retval); }
/* * exportFile - * export large object "lobjOid" to file "out_filename" * */ static void exportFile(PGconn *conn, Oid lobjId, char *filename) { int lobj_fd; char buf[BUFSIZE]; int nbytes, tmp; int fd; /* * open the large object */ lobj_fd = lo_open(conn, lobjId, INV_READ); if (lobj_fd < 0) fprintf(stderr, "cannot open large object %u", lobjId); /* * open the file to be written to */ fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0666); if (fd < 0) { /* error */ fprintf(stderr, "cannot open unix file\"%s\"", filename); } /* * read in from the inversion file and write to the Unix file */ while ((nbytes = lo_read(conn, lobj_fd, buf, BUFSIZE)) > 0) { tmp = write(fd, buf, nbytes); if (tmp < nbytes) { fprintf(stderr, "error while writing \"%s\"", filename); } } lo_close(conn, lobj_fd); close(fd); return; }
Py_ssize_t lobject_read(lobjectObject *self, char *buf, size_t len) { Py_ssize_t n_read; PGresult *pgres = NULL; char *error = NULL; Py_BEGIN_ALLOW_THREADS; pthread_mutex_lock(&(self->conn->lock)); n_read = lo_read(self->conn->pgconn, self->fd, buf, len); if (n_read < 0) collect_error(self->conn, &error); pthread_mutex_unlock(&(self->conn->lock)); Py_END_ALLOW_THREADS; if (n_read < 0) pq_complete_error(self->conn, &pgres, &error); return n_read; }
Datum loread(PG_FUNCTION_ARGS) { int32 fd = PG_GETARG_INT32(0); int32 len = PG_GETARG_INT32(1); bytea *retval; int totalread; ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("large objects are not supported"))); if (len < 0) len = 0; retval = (bytea *) palloc(VARHDRSZ + len); totalread = lo_read(fd, VARDATA(retval), len); SET_VARSIZE(retval, totalread + VARHDRSZ); PG_RETURN_BYTEA_P(retval); }
static size_t pgsql_lob_read(php_stream *stream, char *buf, size_t count) { struct pdo_pgsql_lob_self *self = (struct pdo_pgsql_lob_self*)stream->abstract; return lo_read(self->conn, self->lfd, buf, count); }
/* * lo_export - * exports an (inversion) large object. * returns -1 upon failure, 1 if OK */ int lo_export(PGconn *conn, Oid lobjId, const char *filename) { int result = 1; int fd; int nbytes, tmp; char buf[LO_BUFSIZE]; int lobj; char sebuf[256]; /* * open the large object. */ lobj = lo_open(conn, lobjId, INV_READ); if (lobj == -1) { /* we assume lo_open() already set a suitable error message */ return -1; } /* * create the file to be written to */ fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC | PG_BINARY, 0666); if (fd < 0) { /* error */ printfPQExpBuffer(&conn->errorMessage, libpq_gettext("could not open file \"%s\": %s\n"), filename, pqStrerror(errno, sebuf, sizeof(sebuf))); (void) lo_close(conn, lobj); return -1; } /* * read in from the large object and write to the file */ while ((nbytes = lo_read(conn, lobj, buf, LO_BUFSIZE)) > 0) { tmp = write(fd, buf, nbytes); if (tmp != nbytes) { printfPQExpBuffer(&conn->errorMessage, libpq_gettext("could not write to file \"%s\": %s\n"), filename, pqStrerror(errno, sebuf, sizeof(sebuf))); (void) lo_close(conn, lobj); (void) close(fd); return -1; } } /* * If lo_read() failed, we are now in an aborted transaction so there's no * need for lo_close(); furthermore, if we tried it we'd overwrite the * useful error result with a useless one. So skip lo_close() if we got a * failure result. */ if (nbytes < 0 || lo_close(conn, lobj) != 0) { /* assume lo_read() or lo_close() left a suitable error message */ result = -1; } if (close(fd)) { printfPQExpBuffer(&conn->errorMessage, libpq_gettext("could not write to file \"%s\": %s\n"), filename, pqStrerror(errno, sebuf, sizeof(sebuf))); result = -1; } return result; }