亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > PostgreSQL > 正文

PostgreSQL7.0手冊-接口-50. 函數 51. 大對象

2019-09-08 23:34:15
字體:
來源:轉載
供稿:網友
第五十章. 函數
用戶可調用的函數的參考.
注意:本節(jié)需要人來寫.愿當支援者嗎?


第五十一章. 大對象
內容 
歷史信息 
實現(xiàn)的特點 
接口 
內建的已注冊函數 
從 LIBPQ 里訪問大對象 
例子程序 
在 Postgres 里,記錄存儲在數據頁面里并且單個記錄里的數據大小不能超過數據頁面的大?。驗閿祿撁娲笮∈恰?192 字節(jié),所以數據值的大小是相當小的.為了存儲更大的不可分割數值(原子數值),Postgres 提供了大對象接口.這個接口給用戶提供對定義為大對象的用戶數據的面向文件的接口.本節(jié)描述 Postgres 大對象數據的實現(xiàn),編程和查詢語言接口. 
歷史信息
最初,Postgres 4.2 支持三種大對象的標準實現(xiàn):作為 Postgres 的文件擴展,作為由 Postgres 管理的 UNIX 文件,以及作為存儲在 Postgres 數據庫里面的數據.這樣做容易導致用戶的迷惑.結果是,我們只支持把大對象作為數據存儲在Postgres 數據庫里,即使這樣做令數據訪問變得有些慢,但卻保證了更嚴格的數據完整性.由于歷史原因,這種存儲機制被稱為倒轉大對象.(我們將在本章中交互使用倒轉和大對象來表示同一個意思)。
--------------------------------------------------------------------------------

實現(xiàn)的特點
倒轉大對象把大對象分解成"塊" ("chunks"),然后把塊存放在數據庫記錄里面.在隨機讀寫時使用一個B-tree 索引保證對正確的塊(chunk)號的檢索.

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

接口
Postgres 提供的用于訪問大對象的機制,包括作為用戶定義函數的后端的一部分或者作為使用接口的前端應用的一部分,都在下面描述.對于熟悉 Postgres 4.2 的用戶,PostgreSQL 有一套新的函數提供更連貫的接口. 
注意:所有大對象的操作都必須在一個SQL事務里實現(xiàn)。這在 Postgres v6.5 里有嚴格的要求,盡管在以前的版本里就隱含這樣的要求,如果忽略這一點會導致錯誤的表現(xiàn)。
Postgres 大對象接口是對 UNIX 文件系統(tǒng)的模仿,有仿真的 open(2),read(2),write(2),lseek(2),等.用戶函數調用這些路徑從一個大對象中檢索她們感興趣的數據.例如,如果一個名為 mugshot 的大對象類型存在,在其中保存面孔的圖象,那么可以在 mugshot 數據上定義一個叫 beard (胡子)的函數.Beard?。ê雍瘮担z查圖片的下三分之一區(qū)域,并且如果存在胡子的話判斷胡子的顏色.整個大對象的值不需要被 brard 函數緩存起來或者甚至是作些檢查.大對象可以從動態(tài)裝載的 C 函數或者是鏈接該庫的數據庫客戶程序訪問.Postgres 提供一套過程支持對大對象的打開,讀,寫,關閉和搜索?!?
創(chuàng)建大對象
過程 
Oid lo_creat(PGconn *conn, int mode)
創(chuàng)建一個新的大對象.mode 是一個位掩碼,描述新對象的不同屬性.這里列出的符號常量在 $PGROOT/src/backend/libpq/libpq-fs.h.訪問類型(讀,寫或者兩者)是對位 INV_READ 和 INV_WRITE進行 OR (或)操作構成的.如果大對象應被歸檔--也就是說,如果因歷史原因它應該被周期地移到一個特殊的歸檔關系(表)中--那么就要設置 INV_ARCHIVE 位.掩碼的低十六位是大對象要存放于內的存儲管理器號.對于除 Berkeley (伯克利)以外的節(jié)點,這些位都應總是零.下面的命令創(chuàng)建一個(倒轉的)大對象: 
inv_oid = lo_creat(INV_READ|INV_WRITE|INV_ARCHIVE);
輸入大對象
要把一個 UNIX 文件輸入成為大對象,調用 
Oid lo_import(PGconn *conn, const char *filename)
filename 參數指明要被輸入成為大對象的 UNIX 文件路徑名. 
輸出大對象
要把一個大對象輸出為 UNIX 文件,調用 
int lo_export(PGconn *conn, Oid lobjId, const char *filename)
lobjId 參數指明要輸出的大對象 Oid,filename 參數指明 UNIX 文件的路徑名.
打開一個現(xiàn)有的大對象
要打開一個現(xiàn)存的大對象,調用 
int lo_open(PGconn *conn, Oid lobjId, int mode)
參數 lobjId 指明要打開的大對象的 Oid?。▽ο髽俗R).mode 位控制該對象是用于讀(INV_READ),寫還是讀寫.一個大對象在其創(chuàng)建之前不能被打開.lo_open 返回一個大對象標識用于以后的 lo_read,lo_write,lo_lseek,lo_tell,and lo_close。
向大對象中寫數據
過程 
int lo_write(PGconn *conn, int fd, const char *buf, size_t len)
從 buf 中向大對象 fd 中寫 len 字節(jié).參數 fd 必須是前面一個 lo_open 的返回.返回實際寫的字節(jié)數.出錯時返回負數.
從大對象中讀取數據
過程 
int lo_read(PGconn *conn, int fd, char *buf, size_t len)
從大對象中讀取 len 字節(jié)數據到 buf 中。fd 參數必須是前面的一個 lo_open 調用的返回。返回實際讀取的字節(jié)數。出錯時,返回一個負數。
對大對象中數據的查找
要改變當前大對象的讀或寫位置,調用 
int lo_lseek(PGconn *conn, int fd, int offset, int whence)
這個過程把當前 fd 代表的大對象位置指針移動到 offset 指明的新的位置.參數 whence 的合法的取值是 SEEK_SET SEEK_CUR 和 SEEK_END.
關閉一個大對象描述符
可以通過調用 
int lo_close(PGconn *conn, int fd)
關閉一個大對象,這里 fd 是 lo_open 返回的大對象的描述符.成功時,lo_close 返回零.錯誤時,返回值是負數.

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

內建的已注冊函數
有兩個內建的已注冊函數,lo_import 和 lo_export 可以很方便的在 SQL 查詢里面使用.下面是一些例子 
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';

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

通過 LIBPQ 訪問大對象
下面是一個例子程序,顯示如何使用 LIBPQ 里大對象接口的.程序的一部分是注釋掉的,但仍然保留在源碼里面供讀者參考.這個程序可以在 ../src/test/examples 里找到.使用 LIBPQ 里大對象接口的前端應用應該包括頭文件libpq/libpq-fs.h 并且聯(lián)接 libpq 庫.

--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

例子程序
/*--------------------------------------------------------------
 *
 * testlo.c--
 *    test using large objects with libpq
 *
 * Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
 *    /usr/local/devel/pglite/cvs/src/doc/manual.me,v 1.16 1995/09/01 23:55:00 jolly Exp
 *
 *--------------------------------------------------------------
 */
#include 
#include "libpq-fe.h"
#include "libpq/libpq-fs.h"

#define BUFSIZE          1024

/*
 * importFile *    import file "in_filename" into database as large object "lobjOid"
 *
 */
Oid importFile(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 < 0)  {   /* error */
     fprintf(stderr, "can't open unix file %s/n", filename);
    }

    /*
     * create the large object
     */
    lobjId = lo_creat(conn, INV_READ|INV_WRITE);
    if (lobjId == 0) {
     fprintf(stderr, "can't create large object/n");
    }

    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 large object/n");
     }
    }

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

    return lobjId;
}

void pickout(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 < 0) {
     fprintf(stderr,"can't open large object %d/n",
          lobjId);
    }

    lo_lseek(conn, lobj_fd, start, SEEK_SET);
    buf = malloc(len+1);

    nread = 0;
    while (len - nread > 0) {
     nbytes = lo_read(conn, lobj_fd, buf, len - nread);
     buf[nbytes] = ' ';
     fprintf(stderr,">>> %s", buf);
     nread += nbytes;
    }
    fprintf(stderr,"/n");
    lo_close(conn, lobj_fd);
}

void overwrite(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 < 0) {
     fprintf(stderr,"can't open large object %d/n",
          lobjId);
    }

    lo_lseek(conn, lobj_fd, start, SEEK_SET);
    buf = malloc(len+1);

    for (i=0;i     buf = 'X';
    buf = ' ';

    nwritten = 0;
    while (len - nwritten > 0) {
     nbytes = lo_write(conn, lobj_fd, buf + nwritten, len - nwritten);
     nwritten += nbytes;
    }
    fprintf(stderr,"/n");
    lo_close(conn, lobj_fd);
}

/*
 * exportFile *    export large object "lobjOid" to file "out_filename"
 *
 */
void exportFile(PGconn *conn, Oid lobjId, char *filename)
{
    int lobj_fd;
    char buf[BUFSIZE];
    int nbytes, tmp;
    int fd;

    /*
     * create an inversion "object"
     */
    lobj_fd = lo_open(conn, lobjId, INV_READ);
    if (lobj_fd < 0) {
     fprintf(stderr,"can't open large object %d/n",
          lobjId);
    }

    /*
     * open the file to be written to
     */
    fd = open(filename, O_CREAT|O_WRONLY, 0666);
    if (fd < 0)  {   /* error */
     fprintf(stderr, "can't open unix file %s/n",
          filename);
    }

    /*
     * read in from the Unix file and write to the inversion 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/n",
              filename);
     }
    }

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

    return;
}

void
exit_nicely(PGconn* conn)
{
  PQfinish(conn);
  exit(1);
}

int
main(int argc, char **argv)
{
    char *in_filename, *out_filename;
    char *database;
    Oid lobjOid;
    PGconn *conn;
    PGresult *res;

    if (argc != 4) {
     fprintf(stderr, "Usage: %s database_name in_filename out_filename/n",
          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,"Connection to database '%s' failed./n", database);
     fprintf(stderr,"%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);
/*
    printf("as large object %d./n", lobjOid);

    printf("picking out bytes 1000-2000 of the large object/n");
    pickout(conn, lobjOid, 1000, 1000);

    printf("overwriting bytes 1000-2000 of the large object with X's/n");
    overwrite(conn, lobjOid, 1000, 1000);
*/

    printf("exporting large object to file %s/n", out_filename);
/*    exportFile(conn, lobjOid, out_filename); */
    lo_export(conn, lobjOid,out_filename);

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

------------------------------------------------------------------------------
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
波多野结衣亚洲一二三| 亚洲男同性恋视频| 日本不卡在线播放| 自由色视频.| 国产精品久久久久久av下载红粉| yw.尤物在线精品视频| 欧美午夜电影在线| 黄色毛片视频| 男女视频一区二区| 欧美视频福利| 一级片手机在线观看| 免费观看a视频| 精品无人乱码一区二区三区的优势| 国产成人精品午夜| 欧美猛男做受videos| 二人午夜免费观看在线视频| 91美女主播在线视频| 久久99视频| 国产精品二区在线观看| 公交车强行挺进岳身体| 四虎影视国产在线视频| 日本激情视频在线播放| 亚欧洲精品视频在线观看| 久久九九99视频| www.av在线视频| 色琪琪免费视频网站| 国产美女自拍视频| 麻豆一区一区三区四区| 国产在成人精品线拍偷自揄拍| 成人性生交大片免费看视频在线| 成人片在线看| 欧洲美女亚洲激情| 美女黄色免费看| 国产精品自产拍| 国产精品亲子乱子伦xxxx裸| 一级视频在线免费观看| 蜜桃视频久久一区免费观看入口| bt天堂新版中文在线地址| 欧美猛男性生活免费| 全色精品综合影院| 国产高清视频免费在线观看| 欧美日韩福利在线观看| 伊人再见免费在线观看高清版| 国产一二区在线观看| 欧美一站二站| 99精品视频在线| 日韩毛片在线播放| 中文字幕天堂av| 欧美日韩aaa| 亚洲欧美久久婷婷爱综合一区天堂| 伊人中文字幕在线| 亚洲第一福利在线观看| 久久发布国产伦子伦精品| 亚洲成人免费电影| 国产欧美精品一区二区三区| 91精品国产一区二区三区动漫| 日韩电影中文字幕在线观看| 最新97超碰在线| 999精品视频| 人妻少妇精品久久| 日韩免费久久| 国产成人精品影院| 欧美xxxx18国产| 91在线精品播放| 91av精品| 一个人在线视频免费观看www| 免费在线毛片网站| 亚洲女人av| 国语精品免费视频| 国产免费永久在线观看| 一区二区三区不卡在线| www.xxxx国产| 免费在线稳定资源站| 国产xxx精品视频大全| 日韩高清一级| 欧美一区二区三区免费观看| 久久久久久久久久久久久久久久久久久久| 天堂成人娱乐在线视频免费播放网站| 国产中文字幕在线免费观看| 亚洲风情亚aⅴ在线发布| av日韩电影| 国产精品免费看片| 午夜久久久久久久久久| 视频一区二区在线播放| 亚洲成人综合在线| 男女午夜网站| 亚洲美女色视频| 日韩av一二三区| 国产v亚洲v天堂无码久久久| aaa在线免费观看| 亚洲成av人片www| 在线观看免费播放网址成人| 大地资源第二页在线观看高清版| 欧美专区中文字幕| 肉色超薄丝袜脚交| 欧美性猛交xxxx黑人交| 蜜桃视频在线观看播放| 中文字幕中文字幕精品| 欧美日韩在线视频一区二区三区| 影音先锋国产资源| 亚洲精品视频区| 欧美精品一区二区三区三州| 中文字幕免费在线播放| 伊人激情综合网| 国产丰满美女做爰| 久久久久久亚洲精品| 91视频精品| 91精品国产高清久久久久久| 在线免费观看a级片| 在线免费观看的av| 国产日产高清欧美一区二区三区| 亚洲香蕉伊在人在线观| 最新免费av网址| 亚洲精品毛片| 无码国产伦一区二区三区视频| 在线成人黄色| 国产一区二区三区美女秒播| 欧美在线视频观看| 少妇喷水在线观看| 九九九久久久| 都市激情久久| 国产69久久精品成人| 欧美另类极品videosbest视| 美女免费视频网站| 深夜福利av你懂的| 日本欧美视频在线观看| 精品久久久无码中文字幕| 欧美jizzhd精品欧美另类| 亚洲成人久久影院| 亚洲精品国产精品国自| 日韩在线免费播放| 欧美三级电影网站| 成人a在线视频免费观看| 欧美熟妇另类久久久久久多毛| 四虎永久成年免费影院| 亚洲www.| 91免费观看视频在线| 操bbb操bbb| 亚洲精品视频大全| 全黄一级裸体片| 久久久久久久激情| 91精品国产黑色紧身裤美女| 久本草在线中文字幕亚洲| 久久不射热爱视频精品| 中国精品18videos性欧美| 91豆花视频在线播放| 日韩精品免费播放| 玖草视频在线| 欧美成人首页| 天堂在线免费观看视频| 国产欧美精品xxxx另类| 日本少妇吞精囗交| 日韩高清欧美激情| 日韩一区二区三区国产| 少妇精品在线| 国产成人免费在线观看视频| 亚洲欧美综合久久久久久v动漫| 大地资源网在线观看免费官网| 欧美日本高清视频| 韩国av一区二区三区在线观看| 在线免费观看黄色网址| 天天操 夜夜操| 野花视频免费在线观看| 精品久久久久久久久久久| 777视频在线| 国产精品久久久久久亚洲av| 国产精品 欧美 日韩| 久久av红桃一区二区禁漫| 天天摸在线视频| 亚洲女人天堂成人av在线| 正在播放亚洲一区| 神马影院一区二区| 天天色天天操天天| 久久亚洲风情| 麻豆一区二区三区| 国产中文伊人| 高清日韩中文字幕| 欧美特黄一级视频| 亚洲影视在线播放| 成人久久久精品国产乱码一区二区| 五月亚洲婷婷| 日韩在线国产| 国产成人精品18| 成人精品视频一区二区| 亚洲а∨天堂久久精品喷水| 黄色片视频在线免费观看| 97视频免费在线观看| 亚洲天堂资源在线| 牛人国产偷窥女洗浴在线观看| 亚洲va欧美va人人爽成人影院| 亚洲天堂视频网| 国产精品蜜臀av| 国产日本亚洲| aaa毛片在线观看| 97精品超碰一区二区三区| 国内精品视频在线观看| 精品国产免费一区二区三区香蕉| 丝袜美腿亚洲一区| 丝袜国产日韩另类美女| 国产ts人妖一区二区三区| 亚洲色图清纯唯美| 69成人在线| 欧美激情亚洲国产| 国产精品扒开腿做爽爽爽男男| 亚洲综合影视| 日韩欧美有码在线| 男人的天堂av网站| 麻豆mv在线看| 成人片在线免费看| 免费在线观看黄| www亚洲视频| 手机在线不卡av| 成人精品中文字幕| 免费成人看片| 久久99精品国产| 天天色综合社区| 91精品啪在线观看国产爱臀| 免费人成自慰网站| 欧美日本不卡| 91成人天堂久久成人| h片视频在线观看| 亚洲自拍三区| 日韩视频在线免费| 精品成人一区二区三区免费视频| 久久亚洲电影天堂| 91视频一区二区| 国产一级黄色大片| 国产第一页视频| 三级毛片在线免费看| 天天影视涩香欲综合网| 欧美专区亚洲专区| 97碰碰碰免费公开在线视频| 999精品视频在线观看播放| 在线综合亚洲| 中文字幕乱码在线观看| 97香蕉久久超级碰碰高清版| 国产精品乱码人人做人人爱| 视频一区国产视频| 成年网址网站在线观看| 青青视频在线免费观看| 精品免费日产一区一区三区免费| 欧美一区亚洲二区| 欧美色图五月天| 久久久久久久欧美精品| 女人黄色一级片| 99精品久久久久久中文字幕| 神马久久久久久久久| 中文字幕精品www乱入免费视频| 国产91热爆ts人妖在线| 日韩电影大片中文字幕| 色综合天天天天做夜夜夜夜做| 亚洲丶国产丶欧美一区二区三区| 日本www在线| 午夜在线成人av| 蜜桃久久一区二区三区| 91国产视频在线播放| 九九热hot精品视频在线播放| 无码播放一区二区三区| 中文字幕乱码亚洲无线精品一区| 亚洲国产精品精华液ab| 蜜桃成人av| 欧美福利视频| 国产aⅴ精品一区二区三区色成熟| 欧美一区二区在线观看视频| 情趣视频网站在线免费观看| 日韩一区二区在线视频| av久久网站| 国产成人精品久久亚洲高清不卡| 超碰超碰人人人人精品| 天天做天天摸天天爽国产一区| 91精品国产色综合久久不卡粉嫩| 97国产在线播放| 欧美成人精品h版在线观看| 欧美夫妻性生活| 亚洲黄色性网站| 久久久久亚洲av无码专区喷水| 911精品国产| 最近中文字幕mv免费高清视频8| 91麻豆产精品久久久久久夏晴子| 国产一区高清在线| 亚洲日本中文字幕| 久久亚洲免费| 日本不卡一区二区在线观看| 久久婷婷麻豆| 亚洲欧美国产不卡| 欧美日韩国产丝袜美女| a天堂中文在线| 四虎影院成人| 喷水视频在线观看| 欧美在线不卡区| 成人a免费在线看| 91精品视频国产| 国产精品欧美亚洲| 日韩精品一区二区三区四区视频| 国产精品乱码一区二区三区软件| 国产一二三四在线视频| 国产精品久久三区| 日韩在线综合| 99精品99久久久久久宅男| 一区二区三区四区视频在线| 日韩久久精品视频| 女人18毛片九区毛片在线| 亚洲一区二区三区中文字幕| eeuss第一页| 免费看一级大黄情大片| 26uuu亚洲综合色欧美| 久久高清一区| 国产精品国产三级国产aⅴ无密码| 伊人国产精品视频| 中文字幕一区二区日韩精品绯色| 毛片在线播放网址| 久久精品免费观看| 欧美日韩在线国产| 一区二区三区无码高清视频| 天天摸天天舔天天操| 成全电影大全在线观看| 久久精品三级视频| www.热久久| 无码久久精品国产亚洲av影片| 高清色视频在线观看| 免费观看羞羞视频网站| 美女av免费观看| 久久众筹精品私拍模特| 在线观看午夜看亚太视频| 久久精品国产99久久99久久久| 国产福利在线导航| xxx免费视频| 97免费视频在线播放|