簡體   English   中英

使用 pqxx 從 postgres 讀取/寫入大對象

[英]Read/write large object from postgres using pqxx

主要的 pqxx API 以文本形式處理列。 那么如何使用 pqxx 庫從大對象 (LOB) 訪問二進制數據呢?

有幾種方法。 第一種方法是將數據與 bytea 相互轉換,並通過通用的 pqxx api 工作。 如果您知道如何使用 bytea,那么這可能就是您的方式。 以下是如何將字符串插入為 lob、純 sql、無 C++ 代碼的示例:

select lo_from_bytea(0, 'this is a test'::bytea);
...
select encode(lo_get(190850), 'escape'); -- here 190850 is the oid for lob created by the first line.

另一種選擇是使用 pqxx 庫提供的 iostream API。 沒有太多關於如何使用它的例子,所以我們開始:

// write lob
auto conn = std::make_shared<pqxx::connection>(url);
auto tran = std::make_shared<pqxx::work>(*conn);
auto stream = std::make_shared<pqxx::olostream>(*tran, oid);
stream->write(data, size);
stream->flush();
stream.reset();
tran->commit();

// read lob
stream = std::make_shared<pqxx::ilostream>(*tran, oid);
...
sszie_t get_chunk(shard_ptr<> stream, char *buf, size_t max_len)
{
    while (!stream->eof() && len < max_len && stream->get(buf[len])) {
        len++;
    }

    return (len > 0 || !stream->eof()) ? len : -1;
}

注意:pqxx::ilostream 有一個bug,如果數據中的0xff 字節碰到內部緩沖區邊界,你會得到截斷的數據,它會被誤認為是EOF 字符。 該錯誤已於 2020 年 2 月修復,目前此修復並未適用於所有發行版。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM