⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lobj.sgml

📁 PostgreSQL7.4.6 for Linux
💻 SGML
📖 第 1 页 / 共 2 页
字号:
     use:<programlisting>CREATE TABLE image (    name            text,    raster          oid);INSERT INTO image (name, raster)    VALUES ('beautiful image', lo_import('/etc/motd'));SELECT lo_export(image.raster, '/tmp/motd') FROM image    WHERE name = 'beautiful image';</programlisting></para><para>These functions read and write files in the server's file system, using thepermissions of the database's owning user.  Therefore, their use is restrictedto superusers.  (In contrast, the client-side import and export functionsread and write files in the client's file system, using the permissions ofthe client program.  Their use is not restricted.)</para></sect1><sect1 id="lo-examplesect"><title>Example Program</title><para>     <xref linkend="lo-example"> is a sample program which shows how the large object       interface     in  <application>libpq</>  can  be used.  Parts of the program are      commented out but are left in the source for  the  reader's     benefit.  This program can also be found in     <filename>src/test/examples/testlo.c</filename> in the source distribution.</para>  <example id="lo-example">   <title>Large Objects with <application>libpq</application> Example Program</title><programlisting>/*-------------------------------------------------------------- * * testlo.c-- *    test using large objects with libpq * * Copyright (c) 1994, Regents of the University of California * *-------------------------------------------------------------- */#include &lt;stdio.h&gt;#include &quot;libpq-fe.h&quot;#include &quot;libpq/libpq-fs.h&quot;#define BUFSIZE          1024/* * importFile *    import file &quot;in_filename&quot; into database as large object &quot;lobjOid&quot; * */OidimportFile(PGconn *conn, char *filename){    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 &lt; 0)    {                           /* error */        fprintf(stderr, &quot;can't open unix file %s\n&quot;, filename);    }    /*     * create the large object     */    lobjId = lo_creat(conn, INV_READ | INV_WRITE);    if (lobjId == 0)        fprintf(stderr, &quot;can't create large object\n&quot;);    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)) &gt; 0)    {        tmp = lo_write(conn, lobj_fd, buf, nbytes);        if (tmp &lt; nbytes)            fprintf(stderr, &quot;error while reading large object\n&quot;);    }    (void) close(fd);    (void) lo_close(conn, lobj_fd);    return lobjId;}voidpickout(PGconn *conn, Oid lobjId, int start, int len){    int         lobj_fd;    char       *buf;    int         nbytes;    int         nread;    lobj_fd = lo_open(conn, lobjId, INV_READ);    if (lobj_fd &lt; 0)    {        fprintf(stderr, &quot;can't open large object %d\n&quot;,                lobjId);    }    lo_lseek(conn, lobj_fd, start, SEEK_SET);    buf = malloc(len + 1);    nread = 0;    while (len - nread &gt; 0)    {        nbytes = lo_read(conn, lobj_fd, buf, len - nread);        buf[nbytes] = ' ';        fprintf(stderr, &quot;&gt;&gt;&gt; %s&quot;, buf);        nread += nbytes;    }    free(buf);    fprintf(stderr, &quot;\n&quot;);    lo_close(conn, lobj_fd);}voidoverwrite(PGconn *conn, Oid lobjId, int start, int len){    int         lobj_fd;    char       *buf;    int         nbytes;    int         nwritten;    int         i;    lobj_fd = lo_open(conn, lobjId, INV_READ);    if (lobj_fd &lt; 0)    {        fprintf(stderr, &quot;can't open large object %d\n&quot;,                lobjId);    }    lo_lseek(conn, lobj_fd, start, SEEK_SET);    buf = malloc(len + 1);    for (i = 0; i &lt; len; i++)        buf[i] = 'X';    buf[i] = ' ';    nwritten = 0;    while (len - nwritten &gt; 0)    {        nbytes = lo_write(conn, lobj_fd, buf + nwritten, len - nwritten);        nwritten += nbytes;    }    free(buf);    fprintf(stderr, &quot;\n&quot;);    lo_close(conn, lobj_fd);}/* * exportFile *    export large object &quot;lobjOid&quot; to file &quot;out_filename&quot; * */voidexportFile(PGconn *conn, Oid lobjId, char *filename){    int         lobj_fd;    char        buf[BUFSIZE];    int         nbytes,                tmp;    int         fd;    /*     * create an inversion &quot;object&quot;     */    lobj_fd = lo_open(conn, lobjId, INV_READ);    if (lobj_fd &lt; 0)    {        fprintf(stderr, &quot;can't open large object %d\n&quot;,                lobjId);    }    /*     * open the file to be written to     */    fd = open(filename, O_CREAT | O_WRONLY, 0666);    if (fd &lt; 0)    {                           /* error */        fprintf(stderr, &quot;can't open unix file %s\n&quot;,                filename);    }    /*     * read in from the Unix file and write to the inversion file     */    while ((nbytes = lo_read(conn, lobj_fd, buf, BUFSIZE)) &gt; 0)    {        tmp = write(fd, buf, nbytes);        if (tmp &lt; nbytes)        {            fprintf(stderr, &quot;error while writing %s\n&quot;,                    filename);        }    }    (void) lo_close(conn, lobj_fd);    (void) close(fd);    return;}voidexit_nicely(PGconn *conn){    PQfinish(conn);    exit(1);}intmain(int argc, char **argv){    char       *in_filename,               *out_filename;    char       *database;    Oid         lobjOid;    PGconn     *conn;    PGresult   *res;    if (argc != 4)    {        fprintf(stderr, &quot;Usage: %s database_name in_filename out_filename\n&quot;,                argv[0]);        exit(1);    }    database = argv[1];    in_filename = argv[2];    out_filename = argv[3];    /*     * 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_BAD)    {        fprintf(stderr, &quot;Connection to database '%s' failed.\n&quot;, database);        fprintf(stderr, &quot;%s&quot;, PQerrorMessage(conn));        exit_nicely(conn);    }    res = PQexec(conn, &quot;begin&quot;);    PQclear(res);    printf(&quot;importing file %s\n&quot;, in_filename);/*  lobjOid = importFile(conn, in_filename); */    lobjOid = lo_import(conn, in_filename);/*    printf(&quot;as large object %d.\n&quot;, lobjOid);    printf(&quot;picking out bytes 1000-2000 of the large object\n&quot;);    pickout(conn, lobjOid, 1000, 1000);    printf(&quot;overwriting bytes 1000-2000 of the large object with X's\n&quot;);    overwrite(conn, lobjOid, 1000, 1000);*/    printf(&quot;exporting large object to file %s\n&quot;, out_filename);/*    exportFile(conn, lobjOid, out_filename); */    lo_export(conn, lobjOid, out_filename);    res = PQexec(conn, &quot;end&quot;);    PQclear(res);    PQfinish(conn);    exit(0);}</programlisting></example></sect1></chapter><!-- Keep this comment at the end of the fileLocal variables:mode:sgmlsgml-omittag:nilsgml-shorttag:tsgml-minimize-attributes:nilsgml-always-quote-attributes:tsgml-indent-step:1sgml-indent-data:tsgml-parent-document:nilsgml-default-dtd-file:"./reference.ced"sgml-exposed-tags:nilsgml-local-catalogs:("/usr/lib/sgml/catalog")sgml-local-ecat-files:nilEnd:-->

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -