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; }
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()); }
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; }
/// Get LOB size. Becomes available right after successfull Fetch. size_t BlobSize() const { return LobSize(); }