d.c
application/octet-stream
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libpq-fe.h>
#include <libpq/libpq-fs.h>
static void
exit_nicely(PGconn *conn)
{
PQfinish(conn);
exit(1);
}
int main(int argc, char* argv[])
{
PGconn* conn = PQconnectdb("");
PGresult* res;
/* Check to see that the backend connection was successfully made */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
PQerrorMessage(conn));
exit_nicely(conn);
}
/* Start a transaction. */
res = PQexec(conn, "BEGIN");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
PQclear(res);
const unsigned int id = lo_create(conn, 0);
int fd1 = lo_open(conn, id, INV_READ | INV_WRITE);
int nBytes = lo_write(conn, fd1, "D", 1);
int fd1Pos = lo_lseek(conn, fd1, 2147483647, SEEK_SET);
fd1Pos = lo_lseek(conn, fd1, 1, SEEK_CUR);
nBytes = lo_write(conn, fd1, "Dima", 4); // nBytes == 4 ! Should be 0, IMO.
printf("nBytes (lo_write) = %d\n", nBytes);
/* Commit transaction. */
res = PQexec(conn, "COMMIT");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "COMMIT command failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
PQclear(res);
/* Start a second transaction. */
res = PQexec(conn, "BEGIN");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
PQclear(res);
fd1 = lo_open(conn, id, INV_READ | INV_WRITE);
fd1Pos = lo_lseek(conn, fd1, 0, SEEK_END); // fd1Pos == -2147483647 !
printf("lo_seek returned %d\n", fd1Pos);
char buf[16];
memset(buf, 0, 16);
nBytes = lo_read(conn, fd1, buf, 4); // nBytes == 0 ! Correct, IMO.
printf("nBytes (lo_read) = %d; buffer contains [%s]\n", nBytes, buf);
/* Commit transaction. */
res = PQexec(conn, "COMMIT");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "COMMIT command failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
PQclear(res);
return 0;
}