Exemple #1
0
IReader* CBDB_BLobFile::CreateReader()
{
    EBDB_ErrCode ret = Fetch();

    DBT* dbt = CloneDBT_Key();
    // lob exists, we can read it now (or write)
    if (ret == eBDB_Ok) {
        return new CBDB_BlobReaderWriter(m_DB, dbt, LobSize(), GetTxn());
    }
    return 0;
}
Exemple #2
0
CBDB_BLobStream* CBDB_BLobFile::CreateStream()
{
    EBDB_ErrCode ret = Fetch();

    DBT* dbt = CloneDBT_Key();
    // lob exists, we can read it now (or write)
    if (ret == eBDB_Ok) {
        return new CBDB_BLobStream(m_DB, dbt, LobSize(), GetTxn());
    }
    // no lob yet (write stream)
    return new CBDB_BLobStream(m_DB, dbt, 0, GetTxn());
}
Exemple #3
0
EBDB_ErrCode
CBDB_BLobFile::ReadRealloc(TBuffer& buffer)
{
    EBDB_ErrCode ret;
    // use the maximum capacity
    size_t capacity = buffer.capacity();
    if (capacity > buffer.size()) {
        buffer.resize_mem(capacity);
    }
    if (buffer.size() == 0) {
        buffer.resize_mem(10);
    }
    while(1) {
        try {
            void* p = &buffer[0];
            ret = Fetch(&p, buffer.size(), eReallocForbidden);
            if (ret != eBDB_Ok) {
                buffer.resize_mem(0);
                return ret;
            }
            buffer.resize(LobSize());
        }
        catch (CBDB_ErrnoException& ex) {
            // check if we have insufficient buffer
            if (ex.IsBufferSmall() || ex.IsNoMem()) {
                // increase the buffer and re-read
                buffer.resize_mem(LobSize());
            } else {
                throw;
            }
            continue;
        }
        break;
    } // while
    return ret;
}
Exemple #4
0
 /// Get LOB size. Becomes available right after successfull Fetch.
 size_t BlobSize() const { return LobSize(); }