#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;
}

