Header And Logo

PostgreSQL
| The world's most advanced open source database.

Defines | Functions

testlo64.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 testlo64.c:

Go to the source code of this file.

Defines

#define BUFSIZE   1024

Functions

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

Define Documentation

#define BUFSIZE   1024

Definition at line 26 of file testlo64.c.

Referenced by exportFile(), and importFile().


Function Documentation

static void exit_nicely ( PGconn conn  )  [static]

Definition at line 217 of file testlo64.c.

References PQfinish().

{
    PQfinish(conn);
    exit(1);
}

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

Definition at line 172 of file testlo64.c.

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

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

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

Definition at line 34 of file testlo64.c.

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

{
    Oid         lobjId;
    int         lobj_fd;
    char        buf[BUFSIZE];
    int         nbytes,
                tmp;
    int         fd;

    /*
     * open the file to be read in
     */
    fd = open(filename, O_RDONLY, 0666);
    if (fd < 0)
    {                           /* error */
        fprintf(stderr, "cannot open unix file\"%s\"\n", filename);
    }

    /*
     * create the large object
     */
    lobjId = lo_creat(conn, INV_READ | INV_WRITE);
    if (lobjId == 0)
        fprintf(stderr, "cannot create large object");

    lobj_fd = lo_open(conn, lobjId, INV_WRITE);

    /*
     * read in from the Unix file and write to the inversion file
     */
    while ((nbytes = read(fd, buf, BUFSIZE)) > 0)
    {
        tmp = lo_write(conn, lobj_fd, buf, nbytes);
        if (tmp < nbytes)
            fprintf(stderr, "error while reading \"%s\"", filename);
    }

    close(fd);
    lo_close(conn, lobj_fd);

    return lobjId;
}

int main ( int  argc,
char **  argv 
)

Definition at line 224 of file testlo64.c.

References conn, CONNECTION_OK, exit_nicely, lo_export(), lo_import(), my_truncate(), NULL, overwrite(), pickout(), PQclear(), PQerrorMessage(), PQexec(), PQfinish(), PQsetdb, and PQstatus().

{
    char       *in_filename,
               *out_filename,
               *out_filename2;
    char       *database;
    Oid         lobjOid;
    PGconn     *conn;
    PGresult   *res;

    if (argc != 5)
    {
        fprintf(stderr, "Usage: %s database_name in_filename out_filename out_filename2\n",
                argv[0]);
        exit(1);
    }

    database = argv[1];
    in_filename = argv[2];
    out_filename = argv[3];
    out_filename2 = argv[4];

    /*
     * set up the connection
     */
    conn = PQsetdb(NULL, NULL, NULL, NULL, database);

    /* 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);
    }

    res = PQexec(conn, "begin");
    PQclear(res);
    printf("importing file \"%s\" ...\n", in_filename);
/*  lobjOid = importFile(conn, in_filename); */
    lobjOid = lo_import(conn, in_filename);
    if (lobjOid == 0)
        fprintf(stderr, "%s\n", PQerrorMessage(conn));
    else
    {
        printf("\tas large object %u.\n", lobjOid);

        printf("picking out bytes 4294967000-4294968000 of the large object\n");
        pickout(conn, lobjOid, 4294967000U, 1000);

        printf("overwriting bytes 4294967000-4294968000 of the large object with X's\n");
        overwrite(conn, lobjOid, 4294967000U, 1000);

        printf("exporting large object to file \"%s\" ...\n", out_filename);
/*      exportFile(conn, lobjOid, out_filename); */
        if (lo_export(conn, lobjOid, out_filename) < 0)
            fprintf(stderr, "%s\n", PQerrorMessage(conn));

        printf("truncating to 3294968000 bytes\n");
        my_truncate(conn, lobjOid, 3294968000U);

        printf("exporting truncated large object to file \"%s\" ...\n", out_filename2);
        if (lo_export(conn, lobjOid, out_filename2) < 0)
            fprintf(stderr, "%s\n", PQerrorMessage(conn));
    }

    res = PQexec(conn, "end");
    PQclear(res);
    PQfinish(conn);
    return 0;
}

static void my_truncate ( PGconn conn,
Oid  lobjId,
pg_int64  len 
) [static]

Definition at line 151 of file testlo64.c.

References INV_READ, INV_WRITE, lo_close(), lo_open(), lo_truncate64(), and PQerrorMessage().

Referenced by main().

{
    int         lobj_fd;

    lobj_fd = lo_open(conn, lobjId, INV_READ | INV_WRITE);
    if (lobj_fd < 0)
        fprintf(stderr, "cannot open large object %u", lobjId);

    if (lo_truncate64(conn, lobj_fd, len) < 0)
        fprintf(stderr, "error in lo_truncate64: %s", PQerrorMessage(conn));

    lo_close(conn, lobj_fd);
}

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

Definition at line 113 of file testlo64.c.

References buf, free, i, INV_WRITE, lo_close(), lo_lseek64(), lo_open(), lo_write(), malloc, and PQerrorMessage().

Referenced by main().

{
    int         lobj_fd;
    char       *buf;
    int         nbytes;
    int         nwritten;
    int         i;

    lobj_fd = lo_open(conn, lobjId, INV_WRITE);
    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));

    buf = malloc(len + 1);

    for (i = 0; i < len; i++)
        buf[i] = 'X';
    buf[i] = '\0';

    nwritten = 0;
    while (len - nwritten > 0)
    {
        nbytes = lo_write(conn, lobj_fd, buf + nwritten, len - nwritten);
        nwritten += nbytes;
        if (nbytes <= 0)
        {
            fprintf(stderr, "\nWRITE FAILED!\n");
            break;
        }
    }
    free(buf);
    fprintf(stderr, "\n");
    lo_close(conn, lobj_fd);
}

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

Definition at line 78 of file testlo64.c.

References buf, free, INV_READ, lo_close(), lo_lseek64(), lo_open(), lo_read(), lo_tell64(), malloc, and PQerrorMessage().

Referenced by main().

{
    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);
}