1 #ifndef BDB___SPLIT_BLOB_HPP__
2 #define BDB___SPLIT_BLOB_HPP__
79 this->
BindKey(
"dim_idx", &dim_idx);
95 static const unsigned size_split[] = {
96 256, 512, 2048, 4096, 8192, 16384, 32768
98 const unsigned kMaxSize = (unsigned)(
sizeof(size_split) /
sizeof(*size_split));
100 for (
unsigned i = 0;
i < kMaxSize; ++
i) {
101 if (blob_size < size_split[
i]) {
130 unsigned rec_max = 3 * 1000000)
148 (
size_t)coord[1] + 1);
157 m_VolS (
i, coord[1]) += blob_size;
191 double vol_max = 1.5 * (1024.00*1024.00*1024.00),
192 unsigned rec_max = 3 * 1000000)
211 "error saving demultiplex data: " << e.
what());
355 template<
class TBV,
class TObjDeMux=CBDB_BlobDeMux,
class TL=CFastMutex>
397 void Open(
const string& storage_name,
479 const unsigned* old_coord,
489 const unsigned* coords,
503 const unsigned* coords2);
515 const unsigned* coords,
530 const unsigned* coords,
564 const unsigned* coords,
606 SLockedDb&
GetDb(
unsigned vol,
unsigned slice,
658 template<
class TBV,
class TObjDeMux,
class TL>
663 m_VolumeCacheSize(0),
670 m_AllProjAvail(
false),
682 template<
class TBV,
class TObjDeMux,
class TL>
689 catch (std::exception& e) {
691 <<
"CBDB_BlobSplitStore<>::~CBDB_BlobSplitStore(): "
692 "error in CloseVolumes(): " << e.what());
700 catch (std::exception& e) {
702 <<
"CBDB_BlobSplitStore<>::~CBDB_BlobSplitStore(): "
703 "error in Save(): " << e.what());
707 template<
class TBV,
class TObjDeMux,
class TL>
711 m_RevSplitOff =
true;
715 template<
class TBV,
class TObjDeMux,
class TL>
723 template<
class TBV,
class TObjDeMux,
class TL>
727 for (
size_t i = 0;
i < m_Volumes.size(); ++
i) {
733 template<
class TBV,
class TObjDeMux,
class TL>
736 const unsigned* coords1,
737 const unsigned* coords2)
739 return coords1[0] == coords2[0] &&
740 coords1[1] == coords2[1];
743 template<
class TBV,
class TObjDeMux,
class TL>
748 m_IdDeMux->GetIdVector(bv);
752 template<
class TBV,
class TObjDeMux,
class TL>
756 const unsigned* coords)
758 unsigned old_coord[2];
762 found = m_IdDeMux->GetCoordinatesFast(
id, old_coord);
764 if (found && IsSameCoordinates(old_coord, coords)) {
770 m_IdDeMux->SetCoordinatesFast(
id, coords);
775 template<
class TBV,
class TObjDeMux,
class TL>
782 return this->Insert(
id,
data,
size, coord);
787 template<
class TBV,
class TObjDeMux,
class TL>
800 found = m_IdDeMux->GetCoordinatesFast(
id, coord);
808 TLockGuard
lg(m_ObjDeMuxLock);
809 m_ObjDeMux->GetCoordinates((
unsigned)
size, coord);
814 m_IdDeMux->SetCoordinatesFast(
id, coord);
817 SLockedDb& dbp = this->GetDb(coord[0], coord[1], eGetWrite);
819 TLockGuard
lg(*dbp.lock);
820 dbp.db->SetTransaction(GetTransaction());
826 template<
class TBV,
class TObjDeMux,
class TL>
833 return this->UpdateInsert(
id,
data,
size, coord);
837 template<
class TBV,
class TObjDeMux,
class TL>
847 found = m_IdDeMux->GetCoordinatesFast(
id, coord);
850 return this->Insert(
id,
data,
size, coord);
853 unsigned slice = m_ObjDeMux->SelectSplit(
size);
854 if (slice != coord[1]) {
856 TLockGuard
lg(m_CrossDBLock);
859 return this->Insert(
id,
data,
size, coord);
861 SLockedDb& dbp = this->GetDb(coord[0], coord[1], eGetWrite);
862 TLockGuard
lg(*(dbp.lock));
863 dbp.db->SetTransaction(GetTransaction());
865 return dbp.db->UpdateInsert(
data,
size);
869 template<
class TBV,
class TObjDeMux,
class TL>
872 const unsigned* old_coord,
883 found = m_IdDeMux->GetCoordinatesFast(
id, coord);
887 if (old_coord[0] != coord[0] || old_coord[1] != coord[1]) {
896 return this->Insert(
id,
data,
size, coord);
900 coord[0] = old_coord[0];
901 coord[1] = old_coord[1];
904 return this->Insert(
id,
data,
size, coord);
907 unsigned slice = m_ObjDeMux->SelectSplit(
size);
908 if (slice != coord[1]) {
913 return this->Insert(
id,
data,
size, coord);
915 SLockedDb& dbp = this->GetDb(coord[0], coord[1], eGetWrite);
917 dbp.
db->SetTransaction(GetTransaction());
925 template<
class TBV,
class TObjDeMux,
class TL>
934 found = m_IdDeMux->GetCoordinatesFast(
id, coord);
939 return this->Delete(
id, coord, on_error);
942 template<
class TBV,
class TObjDeMux,
class TL>
945 const unsigned* coords,
951 m_IdDeMux->SetCoordinatesFast(
id, coords,
false);
954 SLockedDb& dbp = this->GetDb(coords[0], coords[1], eGetWrite);
957 dbp.
db->SetTransaction(GetTransaction());
959 return dbp.
db->Delete(on_error);
965 template<
class TBV,
class TObjDeMux,
class TL>
973 found = m_IdDeMux->GetCoordinatesFast(
id, coord);
978 return this->CreateReader(
id, coord);
981 template<
class TBV,
class TObjDeMux,
class TL>
985 const unsigned* coords)
990 SLockedDb& dbp = this->GetDb(coords[0], coords[1], eGetRead);
1012 template<
class TBV,
class TObjDeMux,
class TL>
1016 m_IdDeMux->FreeUnusedMem();
1018 template<
class TBV,
class TObjDeMux,
class TL>
1026 template<
class TBV,
class TObjDeMux,
class TL>
1034 curr_trans = this->GetBDBTransaction();
1036 curr_trans->
Remove(
this);
1040 curr_trans = db_trans;
1044 curr_trans->
Add(
this);
1051 template<
class TBV,
class TObjDeMux,
class TL>
1055 for (
size_t i = 0;
i < m_Volumes.size(); ++
i) {
1060 for (
size_t j = 0; j < v->
db_vect.size(); ++j) {
1070 template<
class TBV,
class TObjDeMux,
class TL>
1073 const unsigned* coords,
1083 SLockedDb& dbp = this->GetDb(coords[0], coords[1], eGetRead);
1098 ret = db->
Fetch(
buf, buf_size, allow_realloc);
1110 template<
class TBV,
class TObjDeMux,
class TL>
1122 found = m_IdDeMux->GetCoordinatesFast(
id, coord);
1127 return this->Fetch(
id, coord,
buf, buf_size, allow_realloc, blob_size);
1130 template<
class TBV,
class TObjDeMux,
class TL>
1139 found = m_IdDeMux->GetCoordinatesFast(
id, coord);
1147 template<
class TBV,
class TObjDeMux,
class TL>
1151 const unsigned* coords,
1159 SLockedDb& dbp = this->GetDb(coords[0], coords[1], eGetRead);
1181 template<
class TBV,
class TObjDeMux,
class TL>
1191 found = m_IdDeMux->GetCoordinatesFast(
id, coord);
1196 return this->ReadRealloc(
id, coord,
buffer);
1199 template<
class TBV,
class TObjDeMux,
class TL>
1208 found = m_IdDeMux->GetCoordinatesFast(
id, coord);
1213 return this->BlobSize(
id, coord, blob_size);
1216 template<
class TBV,
class TObjDeMux,
class TL>
1219 const unsigned* coords,
1225 SLockedDb& dbp = this->GetDb(coords[0], coords[1], eGetRead);
1251 template<
class TBV,
class TObjDeMux,
class TL>
1258 m_StorageName = storage_name;
1259 m_OpenMode = open_mode;
1260 m_DB_Type = db_type;
1267 LoadIdDeMux(*m_IdDeMux, *m_DictFile);
1271 template<
class TBV,
class TObjDeMux,
class TL>
1275 return m_DictFile.get() ?
true :
false;
1278 template<
class TBV,
class TObjDeMux,
class TL>
1282 unsigned max_split = m_ObjDeMux->GetSplitSize();
1283 unsigned max_vol = m_ObjDeMux->GetVolumeSize();
1284 if (!max_split || !max_vol) {
1288 for (
unsigned i = 0;
i < max_vol; ++
i) {
1289 for (
unsigned j = 0; j < max_split; ++j) {
1290 this->GetDb(
i, j, eGetRead);
1293 m_AllProjAvail =
true;
1294 this->Save(TDeMuxStore::eNoCompact);
1297 template<
class TBV,
class TObjDeMux,
class TL>
1303 m_DictFile->SetEnv(*m_Env);
1305 string dict_fname(m_StorageName);
1306 dict_fname.append(
".splitd");
1308 m_DictFile->Open(dict_fname.c_str(), m_OpenMode);
1313 template<
class TBV,
class TObjDeMux,
class TL>
1329 unsigned dim = dict_file.
dim;
1330 unsigned dim_idx = dict_file.
dim_idx;
1340 template<
class TBV,
class TObjDeMux,
class TL>
1345 if ( m_IdDeMux.get() && m_DictFile.get() ) {
1350 this->SaveIdDeMux(*m_IdDeMux, *m_DictFile, 0, compact_vectors);
1355 template<
class TBV,
class TObjDeMux,
class TL>
1365 size_t N = de_mux.
GetN();
1366 for (
size_t i = 0;
i <
N; ++
i) {
1369 for (
size_t j = 0; j < dv.size(); ++j) {
1384 template<
class TBV,
class TObjDeMux,
class TL>
1388 if (splice < m_PageSizes.size())
1389 return m_PageSizes[splice];
1393 template<
class TBV,
class TObjDeMux,
class TL>
1410 return m_StorageName +
"_" +
1414 template<
class TBV,
class TObjDeMux,
class TL>
1429 template<
class TBV,
class TObjDeMux,
class TL>
1442 if (m_AllProjAvail) {
1444 _ASSERT(m_Volumes.size() > vol);
1445 _ASSERT((m_Volumes[vol])->db_vect.size() > slice);
1447 SVolume& volume = *(m_Volumes[vol]);
1458 if ((m_Volumes.size() > vol) &&
1459 ((m_Volumes[vol])->db_vect.size() > slice)) {
1460 SVolume& volume = *(m_Volumes[vol]);
1470 while (m_Volumes.size() < (vol+1)) {
1471 unique_ptr<SVolume> v(
new SVolume);
1472 v->db_vect.resize(slice+1);
1473 for (
size_t i = 0;
i < v->db_vect.size(); ++
i) {
1474 if ( !v->db_vect[
i] ) {
1478 m_Volumes.push_back(v.release());
1481 SVolume& volume = *(m_Volumes[vol]);
1482 if (volume.
db_vect.size() <= slice) {
1483 volume.
db_vect.resize(slice+1);
1484 for (
size_t i = 0;
i < volume.
db_vect.size(); ++
i) {
1494 bool needs_save =
false;
1501 if (lp->
db.
get() == 0) {
1502 string fname = this->MakeDbFileName(vol, slice);
1506 lp->
db->SetEnv(*m_Env);
1509 lp->
db_ro->SetEnv(*m_Env);
1511 if (m_VolumeCacheSize) {
1512 lp->
db->SetCacheSize(m_VolumeCacheSize);
1515 unsigned page_size = GetPageSize(slice);
1517 lp->
db->SetPageSize(page_size);
1525 lp->
db->SetBtreeMinKeysPerPage(6);
1531 lp->
db->SetBtreeMinKeysPerPage(3);
1540 if (m_RevSplitOff) {
1541 lp->
db->RevSplitOff();
1544 lp->
db->Open(fname.c_str(), m_OpenMode);
1545 lp->
db->SetCachePriority(m_CachePriority);
1548 lp->
db_ro->SetCachePriority(m_CachePriority);
1557 get_mode == eGetWrite) {
1559 this->Save(TDeMuxStore::eNoCompact);
BDB library BLOB support.
Berkeley BDB file cursor.
Wrapper around Berkeley DB transaction structure.
Split demux which can save and load state into a file Stateful (persistent) class.
Base class for page-split demultiplexers.
BLOB demultiplexer implements round-robin volume rotation.
Volume split BLOB demultiplexer.
BLOB storage based on single unsigned integer key Supports BLOB volumes and different base page size ...
Persistent storage for demux information.
Basic template class for bitvector storage.
BDB environment object a collection including support for some or all of caching, locking,...
Berkeley DB file cursor class.
Variant of BLOB storage for integer key database.
Raw file class wraps up basic Berkeley DB operations.
Id to coordinates demultiplexer.
size_t GetN() const
Get order of Multiplexer.
const TDimVector & GetDimVector(size_t i) const
Get dimension vector.
void SetProjection(size_t i, size_t idx, TBitVector *bv)
Assign projection idx for dimension i.
vector< TBitVectorPtr > TDimVector
Dimension vector.
void Resize(size_t i, size_t j, T val=T())
resize this matrix, filling the empty cells with a known value
size_t GetRows() const
get the number of rows in this matrix
size_t GetCols() const
get the number of columns in this matrix
Reallocable memory buffer (no memory copy overhead) Mimics vector<>, without the overhead of explicit...
Thread local transactional object.
A very basic data-read interface.
Include a standard set of the NCBI C++ Toolkit most basic headers.
The NCBI C++ standard methods for dealing with std::string.
void reset(element_type *p=0, EOwnership ownership=eTakeOwnership)
Reset will delete the old pointer (if owned), set content to the new value, and assume the ownership ...
element_type * get(void) const
Get pointer.
CBDB_Env * GetEnv(void) const
Get pointer on file environment Return NULL if no environment has been set.
void Save(CNcbiOstream &ostr)
TL::TWriteLockGuard TLockGuard
unique_ptr< TDeMuxStore > m_DictFile
Split dictionary(id demux file)
SLockedDb & GetDb(unsigned vol, unsigned slice, EGetDB_Mode get_mode)
Get database pair (method opens and mounts database if necessary)
void InitDbMutex(SLockedDb *ldb)
Init database mutex lock (mathod is protected against double init)
IReader * CreateReader(unsigned id)
Create stream oriented reader.
CBDB_RawFile::EOpenMode m_OpenMode
CBDB_BlobStoreDict< TBV > TDeMuxStore
void OpenProjections()
Try to open all storage files in all projections This is only possible when object de-mux has fixed n...
size_t LobSize() const
Get LOB size. Becomes available right after successfull Fetch.
const string & GetFileName() const
Return the base filename of the underlying split store.
void SaveIdDeMux(const TIdDeMux &de_mux, TDeMuxStore &dict_file, CBDB_Transaction *trans, typename TDeMuxStore::ECompact compact_vectors)
Store id demux (projection vectors) into the database file.
void Load(CNcbiIstream &istr)
TLock m_CrossDBLock
Lock used to sync. muli-db transactions to avoid deadlocks.
bool IsSameCoordinates(const unsigned *coords1, const unsigned *coords2)
Returns true if two sets of coordinates are the same.
EBDB_ErrCode Delete(unsigned id, CBDB_RawFile::EIgnoreError on_error=CBDB_RawFile::eThrowOnError)
Delete BLOB.
EBDB_ErrCode ReadRealloc(TBuffer &buffer)
Read BLOB into vector.
CBDB_BlobDeMux(double vol_max=1.5 *(1024.00 *1024.00 *1024.00), unsigned rec_max=3 *1000000)
EBDB_ErrCode WriteVector(const TBitVector &bv, ECompact compact)
Save a bitvector to the store.
CNcbiMatrix< unsigned > TVolumeRecs
EBDB_ErrCode Insert(unsigned id, const void *data, size_t size, unsigned *coord)
Insert BLOB into the storage.
EBDB_ErrCode BlobSize(unsigned id, const unsigned *coords, size_t *blob_size)
unique_ptr< TObjDeMux > m_ObjDeMux
Obj to coordinates mapper.
CBDB_IdBlobFile TBlobFile
CBDB_RawFile::EDBType m_DB_Type
bool m_RevSplitOff
Flag carrying reverse split status.
void Sync()
Sync the underlying stores.
CBDB_FieldUint4 dim
dimention
CBDB_RawFile::ECachePriority m_CachePriority
static unsigned SelectSplit(size_t blob_size)
LOBs are getting split into slices based on LOB size, similar BLOBs go to the compartment with more o...
virtual void SetTransaction(ITransaction *trans)
Establish transaction association.
void FreeUnusedMem()
Reclaim unused memory.
EBDB_ErrCode Insert(unsigned id, const void *data, size_t size)
vector< CRef< SLockedDb > > db_vect
void RevSplitOff()
Turn off reverse splitting on the underlying stores.
EBDB_ErrCode UpdateInsert(unsigned id, const void *data, size_t size)
CBDB_Transaction * GetBDBTransaction()
void OpenDict()
Open split storage dictionary.
CBDB_BvStore< TBV > TParent
EBDB_ErrCode ReadRealloc(unsigned id, CBDB_RawFile::TBuffer &buffer)
Read BLOB into vector.
AutoPtr< TLock > lock_ro
db lock for reads
CBDB_BlobSplitStore(TObjDeMux *de_mux)
Construction The main parameter here is object demultiplexer for splitting incoming LOBs into volumes...
EBDB_ErrCode ReadRealloc(unsigned id, const unsigned *coords, CBDB_RawFile::TBuffer &buffer)
Read BLOB into vector using provided coordinates If BLOB does not fit, method resizes the vector to a...
bool IsOpen() const
Return true if the split store has been opened.
AutoPtr< TBlobFile > db
database file
void GetCoordinates(unsigned blob_size, unsigned *coord)
coordinates:
TVolumeRecs m_RecS
Volumes record counts.
string MakeDbFileName(unsigned vol, unsigned slice)
Make BDB file name based on volume and page size split.
EBDB_ErrCode UpdateInsert(unsigned id, const unsigned *old_coord, const void *data, size_t size, unsigned *coord)
Update or insert BLOB using old coordinates.
EBDB_ErrCode Fetch()
Fetch the record corresponding to the current key value.
TBuffer & GetBuffer()
Get access to the internal buffer.
CBDB_BlobDeMuxPersistent(const string &path, double vol_max=1.5 *(1024.00 *1024.00 *1024.00), unsigned rec_max=3 *1000000)
void SetVolumeCacheSize(unsigned int cache_size)
TVolumeVect m_Volumes
Volumes.
unsigned GetVolumeSize() const
Returns total number of volumes (vertical projection) If method returns 0 - means there is no hard nu...
AutoPtr< TLock > lock
db lock
CBDB_BlobSplitStore(const CBDB_BlobSplitStore< TBV, TObjDeMux, TL > &)
forbidden
void Deserialize(TBitVector *bv, const TBufferValue *buf)
EBDB_ErrCode Delete(unsigned id, const unsigned *coords, CBDB_RawFile::EIgnoreError on_error=CBDB_RawFile::eThrowOnError)
EBDB_ErrCode UpdateInsert(unsigned id, const void *data, size_t size, unsigned *coord)
Update or insert BLOB.
void GetCoordinates(unsigned blob_size, unsigned *coord)
coordinates:
void LoadIdDeMux(TIdDeMux &de_mux, TDeMuxStore &dict_file)
void Save(typename TDeMuxStore::ECompact compact_vectors=TDeMuxStore::eCompact)
Save storage dictionary (demux disposition).
IReader * CreateReader(unsigned id, const unsigned *coords)
void SetCachePriority(CBDB_RawFile::ECachePriority)
Set the priority for this database's pages in the buffer cache This is generally a temporary adviseme...
unsigned m_RecMax
Maximum number of records.
IReader * CreateReader()
Creates stream like object to read BLOB by chunks.
void CloseVolumes()
Close volumes without saving or doing anything with id demux.
double m_VolMax
Volume max size.
TVolumeSize m_VolS
Volumes BLOB sizes.
EBDB_ErrCode Fetch(unsigned id, void **buf, size_t buf_size, CBDB_RawFile::EReallocMode allow_realloc, size_t *blob_size)
Fetch LOB record directly into the provided '*buf'.
EGetDB_Mode
Read or write operation.
vector< SVolume * > TVolumeVect
CBDB_FieldUint4 dim_idx
projection index
void SetEnv(CBDB_Env &env)
Associate with the environment. Should be called before opening.
unsigned GetVolumeSize() const
Returns total number of volumes (vertical projection) If method returns 0 - means there is no hard nu...
unsigned GetPageSize(unsigned splice) const
Select preferred page size for the specified slice.
EBDB_ErrCode BlobSize(unsigned id, size_t *blob_size)
Get size of the BLOB.
vector< unsigned > m_PageSizes
TLock m_VolumesLock
Volumes locker.
CBDB_FieldUint4 id
ID key.
EBDB_ErrCode Fetch(unsigned id, const unsigned *coords, void **buf, size_t buf_size, CBDB_RawFile::EReallocMode allow_realloc, size_t *blob_size)
unsigned m_VolumeCacheSize
CBDB_BlobDeMux_RoundRobin(unsigned volumes=0)
TLock m_DictFileLock
id demux file locker
void GetIdVector(TBitVector *bv) const
Get all id of all BLOBs stored.
CBDB_BlobSplitStore< TBV, TObjDeMux, TL > & operator=(const CBDB_BlobSplitStore< TBV, TObjDeMux, TL > &)
EBDB_ErrCode GetCoordinates(unsigned id, unsigned *coords)
Find (demux) coordinates by BLOB id.
CNcbiMatrix< double > TVolumeSize
ECompact
Compression options for vector storage.
unique_ptr< TIdDeMux > m_IdDeMux
Id to coordinates mapper.
EBDB_ErrCode FetchToBuffer(CBDB_FileCursor &cur)
Fetch the next BLOB record to the resiable buffer.
~CBDB_BlobDeMuxPersistent()
void Open(const string &storage_name, CBDB_RawFile::EOpenMode open_mode, CBDB_RawFile::EDBType db_type=CBDB_RawFile::eBtree)
Open storage (reads storage dictionary into memory)
AutoPtr< TBlobFile > db_ro
database file for reads
unsigned GetSplitSize() const
Returns total number of splits (horizontal projection) If method returns 0 - means there is no hard n...
void AssignCoordinates(unsigned id, const unsigned *coords)
Assing de-mux coordinates.
bool m_AllProjAvail
True when all proj.dbs are pre-open.
EBDB_ErrCode Delete(EIgnoreError on_error=eThrowOnError)
Delete record corresponding to the current key value.
void SetCondition(ECondition cond_from, ECondition cond_to=eNotSet)
Set search condition(type of interval)
EOpenMode
BDB file open mode.
EDBType
Berkeley DB database type.
virtual void SetTransaction(ITransaction *trans)
Establish transaction association.
void BindKey(const char *field_name, CBDB_Field *key_field, size_t buf_size=0)
EReallocMode
BLOB read mode, controld data buffer reallocation when there is not enough space in buffer.
ECachePriority
Set the priority for this database's pages in the buffer cache This is generally a temporary adviseme...
EBDB_ErrCode
BDB Return codes.
CBDB_ConditionHandle From
@ eReadWriteCreate
read-write, create if it doesn't exist
EKeepFileAssociation GetAssociationMode() const
Transaction file association mode.
virtual void Add(ITransactional *dbfile)
Add file to the list of connected files.
static CBDB_Transaction * CastTransaction(ITransaction *trans)
Downcast ITransaction.
virtual void Remove(ITransactional *dbfile)
Remove file from the list of connected files.
@ eFullAssociation
Transaction associated with files.
#define ERR_POST_XX(error_name, err_subcode, message)
Error posting with error code having given name and with given error subcode.
void Error(CExceptionArgs_Base &args)
virtual const char * what(void) const noexcept
Standard report (includes full backlog).
uint32_t Uint4
4-byte (32-bit) unsigned integer
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
IO_PREFIX::ofstream CNcbiOfstream
Portable alias for ofstream.
IO_PREFIX::ostream CNcbiOstream
Portable alias for ostream.
IO_PREFIX::istream CNcbiIstream
Portable alias for istream.
IO_PREFIX::ifstream CNcbiIfstream
Portable alias for ifstream.
static string UIntToString(unsigned int value, TNumToStringFlags flags=0, int base=10)
Convert UInt to string.
CGuard< CRWLock, SSimpleWriteLock< CRWLock > > TWriteLockGuard
virtual void SetTransaction(ITransaction *trans)
Establish transaction association.
@ BM_GAP
GAP compression is ON.
Classes and interfaces to map integer ids into multi-dimension coordinates.
Definition of all error codes used in bdb library (bdb.lib and ncbi_xcache_bdb.lib).
const struct ncbi::grid::netcache::search::fields::SIZE size
Defines classes: CDirEntry, CFile, CDir, CSymLink, CMemoryFile, CFileUtil, CFileLock,...
Multi-threading – mutexes; rw-locks; semaphore.
NCBI C++ stream class wrappers for triggering between "new" and "old" C++ stream libraries.
static SLJIT_INLINE sljit_ins lg(sljit_gpr r, sljit_s32 d, sljit_gpr x, sljit_gpr b)
BDB Database together with the locker One database is opened twice, one regular mode,...
Volume split on optimal page size.
Abstract object demultiplexer.