.IsGi()?
GetIdKey(
id.GetGi()):
id.AsFastaString();
101 return id.IsGi()?
GetIdKey(
id.GetGi()):
id.AsString();
110 string& true_subkey)
118 if( accs.
empty() ) {
134 ITERATE(
string,
i, it->first ) {
237oss << chunk_id <<
'-'<< split_version;
248: m_BlobCache(0), m_IdCache(0)
283 const string& driver_name)
287 booljoined_blob_version = conf.
GetBool(
341 classCParseBuffer :
public IReader{
346 const string&
key,
const string&
subkey);
348 const string&
key,
const string&
subkey,
351 const string&
key,
const string&
subkey,
352 int* get_current_version);
354 boolFound(
void)
const 356 returnm_Descr.blob_found;
358 boolFoundSome(
void)
const 360 returnm_Descr.actual_age != unsigned(-1);
362TExpirationTime GetExpirationTime(
void)
const 364 returnm_ExpirationTime;
366 boolGotCurrentVersion(
void)
const 368 returnm_Descr.return_current_version_supported;
370 boolCurrentVersionExpired(
void)
const 372 returnGetExpirationTime() == TExpirationTime(-1);
374 bool Done(
void)
const 384 Uint1ParseUint1(
void)
386 return*x_NextBytes(1);
388 boolParseBool(
void)
392 Uint4ParseUint4(
void)
394 const char* ptr = x_NextBytes(4);
395 return((ptr[0]&0xff)<<24)|((ptr[1]&0xff)<<16)|
396((ptr[2]&0xff)<<8)|(ptr[3]&0xff);
398 Int4ParseInt4(
void)
402 Int8ParseInt8(
void)
408 stringParseString(
void);
409 stringFullString(
void);
415 size_t* bytes_read = 0)
426*bytes_read =
count;
444 int* get_current_version,
445 boolset_expiration_time);
446 boolx_Eof(
void)
const;
447 const char* x_NextBytes(
size_t size);
450CParseBuffer(
constCParseBuffer&);
451 voidoperator=(
constCParseBuffer&);
455TExpirationTime m_ExpirationTime;
465 int* get_current_version,
466 boolset_expiration_time)
468 if( set_expiration_time ) {
471 if( get_current_version ) {
474m_Descr.return_current_version =
true;
481 if( get_current_version ) {
485 if( !get_current_version ) {
490 if( get_current_version && GotCurrentVersion() ) {
491s <<
", ver="<<m_Descr.current_version;
496 if( get_current_version && GotCurrentVersion() ) {
497s <<
", ver="<<m_Descr.current_version;
500s <<
", age="<<
int(m_Descr.actual_age);
504 if( m_Descr.actual_age > m_ExpirationTime ) {
505m_ExpirationTime = TExpirationTime(-1);
508m_ExpirationTime -= m_Descr.actual_age;
511 if( get_current_version ) {
512 if( GotCurrentVersion() ) {
513*get_current_version = m_Descr.current_version;
516m_ExpirationTime = TExpirationTime(-1);
517*get_current_version = 0;
520 if( Found() && !m_Descr.reader.get() ) {
522m_Size = m_Descr.blob_size;
530: m_Descr(m_Buffer, sizeof(m_Buffer)), m_Ptr(0), m_Size(0)
540: m_Descr(m_Buffer, sizeof(m_Buffer)), m_Ptr(0), m_Size(0)
549 int* get_current_version)
550: m_Descr(m_Buffer, sizeof(m_Buffer)), m_Ptr(0), m_Size(0)
552x_Init(
result, cache,
key,
subkey, -1, get_current_version,
true);
555 stringCParseBuffer::ParseString(
void)
559 size_t size= ParseUint4();
561ret.assign(x_NextBytes(
size),
size);
574 stringCParseBuffer::FullString(
void)
579ret.assign(m_Ptr, m_Size);
585 while( m_Descr.reader->Read(m_Buffer,
sizeof(m_Buffer), &
count) ==
eRW_Success) {
586ret.append(m_Buffer,
count);
592 const char* CParseBuffer::x_NextBytes(
size_t size)
595 const char* ret = m_Ptr;
597 if( m_Size >=
size) {
603 else if(
size<=
sizeof(m_Buffer) ) {
604 char*
buf= m_Buffer;
618 "parse buffer overflow");
621 boolCParseBuffer::x_Eof(
void)
const 629 IReader* CParseBuffer::GetReader(
void)
632 if( !m_Descr.reader.get() ) {
635 returnm_Descr.reader.get();
649 if( lock.IsLoaded() ) {
655 if( !
str.Found() ) {
663 for(
size_t i= 0;
i<
count; ++
i) {
670 str.GetExpirationTime());
703 if(
str.Found() ) {
704 Int8gi_num =
str.ParseInt8();
708 if( gi_num !=
Int4(gi_num) ) {
710 "64-bit gi overflow");
718 data.sequence_found =
true;
727 if( ids_lock.IsLoaded() ) {
728 result.SetLoadedGiFromSeqIds(seq_id, ids_lock);
752 if(
str.Found() ) {
753 string data=
str.FullString();
756 if( !
data.empty() ) {
767 if( ids_lock.IsLoaded() ) {
768 result.SetLoadedAccFromSeqIds(seq_id, ids_lock);
809 if(
str.Found() ) {
810 string data=
str.FullString();
819 if( ids_lock.IsLoaded() ) {
821ids_lock.GetExpirationTime());
842 if( !
str.Found() ) {
847 if( !
str.Done() ) {
871 if( !
str.Found() ) {
872 if( !seq_id.
IsGi() ) {
884gi_hash.GetExpirationTime());
895 hash.sequence_found =
str.ParseBool();
896 hash.hash_known =
str.ParseBool();
897 if( !
str.Done() ) {
921 if( !
str.Found() ) {
926 if( !
str.Done() ) {
950 if( !
str.Found() ) {
955 if( !
str.Done() ) {
962 data.sequence_found =
true;
974 size_t count= ids.size();
975 for(
size_t i= 0;
i<
count; ++
i) {
1001 size_t count= ids.size();
1002 for(
size_t i= 0;
i<
count; ++
i) {
1014loaded[
i] =
true;
1028 size_t count= ids.size();
1029 for(
size_t i= 0;
i<
count; ++
i) {
1039loaded[
i] =
true;
1053 size_t count= ids.size();
1054 for(
size_t i= 0;
i<
count; ++
i) {
1064loaded[
i] =
true;
1081 if( ids.IsLoaded() ) {
1086 string subkey, true_subkey;
1089 if( !
str.Found() ) {
1100 size_tblob_count =
str.ParseUint4();
1101blob_ids.reserve(blob_count);
1103 for(
size_t i= 0;
i< blob_count; ++
i) {
1105 id->SetSat(
str.ParseInt4());
1106 id->SetSubSat(
str.ParseInt4());
1107 id->SetSatKey(
str.ParseInt4());
1110 size_tname_count =
str.ParseUint4();
1113 for(
size_tj = 0; j < name_count; ++j ) {
1114annots_info->AddNamedAnnotName(
str.ParseString());
1117 strings =
str.ParseString();
1119 if( !annots_info ) {
1126stream >> *annot_info;
1127annots_info->AddAnnotInfo(*annot_info);
1130 if( annots_info ) {
1131 info.SetAnnotInfo(annots_info);
1133blob_ids.push_back(
info);
1135 if( !true_subkey.empty() &&
str.ParseString() != true_subkey ) {
1139 if( !
str.Done() ) {
1145 str.GetExpirationTime());
1202 if( !
str.Found() ) {
1207 if( !
str.Done() ) {
1234 if( !
str.Found() ) {
1239 if( !
str.Done() ) {
1257 const string&
key,
1264s <<
"SetBlobVersionAsCurrent("<<
key<<
", "<<
subkey<<
", "<<
version<<
")";
1301 boolknow_has_blobs =
false;
1305 if( !
str.GotCurrentVersion() ) {
1310 "stopped to get current blob version");
1323 if( !
str.Found() ) {
1324know_has_blobs =
str.FoundSome();
1327 else if(
str.CurrentVersionExpired() ) {
1334 data<< stream.rdbuf();
1371 if( !know_has_blobs ) {
1404 if( cache_version != -1 &&
version!= cache_version ) {
1411 if( !
buffer.Found() ) {
1428 intprocessor_type =
ReadInt(stream);
1431 if( processor_type != processor.
GetType() ) {
1433 "CCacheReader::LoadChunk: " 1434 "invalid processor type: "<<processor_type);
1436 intprocessor_magic =
ReadInt(stream);
1437 if( processor_magic !=
int(processor.
GetMagic()) ) {
1439 "CCacheReader::LoadChunk: " 1440 "invalid processor magic number: "<<processor_magic);
1465 const string& name)
1473 const string& name,
1474 const char* default_value =
"")
1494 const string& name,
1495 const char*
value)
1511 for( ; values->
name; ++values ) {
1526 if( driver->
GetValue().value.empty() ) {
1538 const string& driver_name =
1549 const char* section_name)
1557 if( src_section ) {
1569{
"keep_versions",
"all"},
1570{
"write_sync",
"no"},
1572{
"path",
".genbank_cache"},
1573{
"mem_size",
"20M"},
1574{
"log_file_max",
"20M"},
1575{
"purge_batch_sleep",
"500"},
1576{
"purge_thread_delay",
"3600"},
1577{
"purge_clean_log",
"16"},
1579{
"connection_max_retries",
"0"},
1580{
"connection_timeout",
"0.3"},
1581{
"communication_timeout",
"0.1"},
1582{
"max_connection_pool_size",
"30"},
1583{
"max_find_lbname_retries",
"2"},
1584{
"retry_delay",
"0.001"},
1591{
"timeout",
"172800"},
1592{
"timestamp",
"subkey check_expiration"},
1594{
"page_size",
"small"},
1600{
"name",
"blobs"},
1601{
"timeout",
"432000"},
1602{
"timestamp",
"onread expire_not_used"},
1608{
"purge_thread",
"yes"},
1614{
"purge_thread",
"no"},
1624 const char* section_name;
1631unique_ptr<SCacheInfo::TParams> section
1633 if( !section.get() ) {
1652 returnsection.release();
1660unique_ptr<TParams> cache_params
1662 if( !cache_params.get() ) {
1668 returnmanager->CreateInstanceFromKey
1680unique_ptr<TParams> id_params
1682unique_ptr<TParams> blob_params
1686 const TParams* share_id_param =
1688 boolshare_id = !share_id_param ||
1690 const TParams* share_blob_param =
1692 boolshare_blob = !share_blob_param ||
1694 if(share_id || share_blob) {
1696 ICache* cache = cache_manager.
1705 ICache* cache = cache_manager.
1721 if( !blob_cache ) {
1768 if( !driver.empty() && driver != m_DriverName ) {
TSatKey GetSatKey() const
TSubSat GetSubSat() const
void SetIdCache(ICache *id_cache)
void SetBlobCache(ICache *blob_cache)
CSimpleClassFactoryImpl< CReader, CCacheReader > TParent
CReader * CreateInstance(const string &driver=kEmptyStr, CVersionInfo version=NCBI_INTERFACE_VERSION(CReader), const TPluginManagerParamTree *params=0) const
Create instance of TDriver.
void x_ProcessBlob(CReaderRequestResult &result, const TBlobId &blob_id, TChunkId chunk_id, CNcbiIstream &stream)
ESwitch m_JoinedBlobVersion
bool LoadSeq_idSeq_ids(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
bool LoadBlob(CReaderRequestResult &result, const TBlobId &blob_id)
bool LoadGis(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TGis &ret)
bool LoadBlobState(CReaderRequestResult &result, const TBlobId &blob_id)
bool LoadSeq_idGi(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
bool LoadBlobVersion(CReaderRequestResult &result, const TBlobId &blob_id)
bool LoadSeq_idTaxId(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
int GetRetryCount(void) const
bool LoadTaxIds(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TTaxIds &ret)
bool LoadSequenceLength(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
void x_SetBlobVersionAsCurrent(CReaderRequestResult &result, const string &key, const string &subkey, TBlobVersion version)
virtual void ResetCache(void)
int GetMaximumConnectionsLimit(void) const
bool MayBeSkippedOnErrors(void) const
bool LoadAccVers(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TIds &ret)
bool LoadSeq_idLabel(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
bool LoadLabels(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TLabels &ret)
bool LoadSeq_idAccVer(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
static bool NoNeedToSave(ECacheEntryType type)
void x_AddConnectionSlot(TConn conn)
static void GoingToLoad(ECacheEntryType type)
@ eCacheEntry_BlobVersion
bool LoadSequenceType(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
bool LoadSeq_idBlob_ids(CReaderRequestResult &result, const CSeq_id_Handle &seq_id, const SAnnotSelector *sel)
All LoadXxx() methods should return false if there is no requested data in the reader.
bool LoadChunk(CReaderRequestResult &result, const TBlobId &blob_id, TChunkId chunk_id)
bool ReadSeq_ids(CReaderRequestResult &result, const string &key, CLoadLockSeqIds &ids)
void x_ConnectAtSlot(TConn conn)
virtual void InitializeCache(CReaderCacheManager &cache_manager, const TPluginManagerParamTree *params)
void x_DisconnectAtSlot(TConn conn, bool failed)
bool LoadSequenceHash(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
void x_RemoveConnectionSlot(TConn conn)
In-memory stream (a la strstream or stringstream)
CID2S_Seq_annot_Info â.
static bool IsFound(const TData &data)
TData GetAccVer(void) const
static const CSeq_id_Handle & GetAcc(const TData &data)
bool IsLoadedAccVer(void) const
bool SetLoadedAccVer(const TData &data)
bool SetLoadedBlob_ids(const TData &data, TExpirationTime expiration_time)
bool IsLoadedBlobState(void) const
bool IsLoadedBlobVersion(void) const
TData GetBlobVersion(void) const
bool IsLoadedChunk(void) const
const CTSE_Split_Info & GetSplitInfo(void) const
TBlobVersion GetKnownBlobVersion(void) const
bool SetLoadedGi(const TData &data)
bool IsLoadedGi(void) const
static bool IsFound(const TData &data)
static TGi GetGi(const TData &data)
bool SetLoadedHash(const TData &data)
bool IsLoadedHash(void) const
static int GetHash(const TData &data)
bool IsLoadedLabel(void) const
bool SetLoadedLabel(const TData &data)
TData GetLabel(void) const
bool IsLoadedLength(void) const
bool SetLoadedLength(const TData &data)
TData GetSeq_ids(void) const
bool SetLoadedSeq_ids(const TData &data)
bool IsLoadedTaxId(void) const
bool SetLoadedTaxId(const TData &data)
TData GetTaxId(void) const
bool SetLoadedType(const TData &data)
bool IsLoadedType(void) const
Data loader exceptions, used by GenBank loader.
CNcbiOstrstreamToString class helps convert CNcbiOstrstream to a string Sample usage:
CObjectIStreamAsnBinary â.
static bool IsExtAnnot(const TBlobId &blob_id)
virtual void ProcessStream(CReaderRequestResult &result, const TBlobId &blob_id, TChunkId chunk_id, CNcbiIstream &stream) const
virtual EType GetType(void) const =0
virtual TMagic GetMagic(void) const =0
Note about the "buf_size" parameter for streams in this API.
void LoadBlobVersion(CReaderRequestResult &result, const TBlobId &blob_id, const CReader *asking_reader=0)
const CProcessor & GetProcessor(CProcessor::EType type) const
static bool CannotProcess(const CSeq_id_Handle &sih)
virtual void RegisterCache(ICache &cache, ECacheType cache_type)=0
GBL::CInfo_Base::TExpirationTime TExpirationTime
vector< CSeq_id_Handle > TSeqIds
CReadDispatcher * m_Dispatcher
void SetAndSaveBlobVersion(CReaderRequestResult &result, const TBlobId &blob_id, TBlobVersion version) const
vector< CBlob_Info > TBlobIds
void SetAndSaveBlobState(CReaderRequestResult &result, const TBlobId &blob_id, TBlobState blob_state) const
static int ReadInt(CNcbiIstream &stream)
vector< CSeq_id_Handle > TIds
int SetMaximumConnections(int max)
Template class helps to implement one driver class factory.
TSplitVersion GetSplitVersion(void) const
definition of a Culling tree
BLOB cache read/write/maintenance interface.
virtual bool HasBlobs(const string &key, const string &subkey)=0
Check if any BLOB exists (any version)
virtual void GetBlobAccess(const string &key, TBlobVersion version, const string &subkey, SBlobAccessDescr *blob_descr)=0
Get BLOB access using BlobAccessDescr.
virtual void SetBlobVersionAsCurrent(const string &key, const string &subkey, TBlobVersion version)=0
Set current valid version for a BLOB.
A very basic data-read interface.
static CS_CONNECTION * conn
static const char * str(char *buf, int n)
#define GI_FROM(T, value)
unsigned int TSeqPos
Type for sequence locations and lengths.
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
SStrictId_Tax::TId TTaxId
Taxon id type.
#define TAX_ID_FROM(T, value)
@ eTakeOwnership
An object can take ownership of another.
#define ERR_POST(message)
Error posting with file, line number information but without error codes.
#define NCBI_THROW(exception_class, err_code, message)
Generic macro to throw an exception, given the exception class, error code and message string.
#define NCBI_THROW_FMT(exception_class, err_code, message)
The same as NCBI_THROW but with message processed as output to ostream.
void Read(CObjectIStream &in, TObjectPtr object, const CTypeRef &type)
bool GetBool(const string &driver_name, const string ¶m_name, EErrAction on_error, bool default_value, const list< string > *synonyms=NULL)
Utility function to get an integer element of parameter tree Throws an exception when mandatory param...
@ eErr_NoThrow
Return default value on error.
static CSeq_id_Handle GetGiHandle(TGi gi)
Faster way to create a handle for a gi.
static CSeq_id_Handle GetHandle(const CSeq_id &id)
Normal way of getting a handle, works for any seq-id.
const TNamedAnnotAccessions & GetNamedAnnotAccessions(void) const
void Reset(void)
Reset reference object.
#define NCBI_PARAM_TYPE(section, name)
Generate typename for a parameter from its {section, name} attributes.
@ eParam_NoThread
Do not use per-thread values.
static void NCBI_EntryPointImpl(TDriverInfoList &info_list, EEntryPointRequest method)
Entry point implementation.
#define NCBI_INTERFACE_VERSION(iface)
Macro to construct CVersionInfo class using interface name (relies on CInterfaceVersion class)
list< SDriverInfo > TDriverInfoList
List of driver information.
EEntryPointRequest
Actions performed by the entry point.
uint8_t Uint1
1-byte (8-bit) unsigned integer
int32_t Int4
4-byte (32-bit) signed integer
uint32_t Uint4
4-byte (32-bit) unsigned integer
int64_t Int8
8-byte (64-bit) signed integer
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define END_SCOPE(ns)
End the previously defined scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
#define BEGIN_SCOPE(ns)
Define a new scope.
ERW_Result
Result codes for I/O operations.
IO_PREFIX::istream CNcbiIstream
Portable alias for istream.
@ eRW_Eof
End of data, should be considered permanent.
@ eRW_Success
Everything is okay, I/O completed.
static bool StringToBool(const CTempString str)
Convert string to bool.
static enable_if< is_arithmetic< TNumeric >::value||is_convertible< TNumeric, Int8 >::value, string >::type NumericToString(TNumeric value, TNumToStringFlags flags=0, int base=10)
Convert numeric value to string.
const TTreeType * FindNode(const TKeyType &key, TNodeSearchMode sflag=eImmediateAndTop) const
Search for node.
void AddNode(TTreeType *subnode)
Add new subnode.
const TTreeType * FindSubNode(const TKeyType &key) const
Non recursive linear scan of all subnodes, with key comparison.
const TValue & GetValue(void) const
Return node's value.
EMol
molecule class in living organism
unsigned int
A callback function used to compare two keys in a database.
Interfaces for a local cache of versioned binary large objects (BLOBS).
static void hex(unsigned char c)
const string version
version string
const struct ncbi::grid::netcache::search::fields::SIZE size
const struct ncbi::grid::netcache::search::fields::KEY key
const struct ncbi::grid::netcache::search::fields::SUBKEY subkey
string s_Value(TValue value)
const GenericPointer< typename T::ValueType > T2 value
Defines: CTimeFormat - storage class for time format.
void NCBI_EntryPoint_xreader_cache(CPluginManager< CReader >::TDriverInfoList &info_list, CPluginManager< CReader >::EEntryPointRequest method)
static const SPluginParams::SDefaultValue s_DefaultBlobParams[]
static const SPluginParams::SDefaultValue s_DefaultIdParams[]
void GenBankReaders_Register_Cache(void)
static const SPluginParams::SDefaultValue s_DefaultReaderParams[]
static SCacheInfo::TParams * GetCacheParamsCopy(const SCacheInfo::TParams *src_params, const char *section_name)
static SCacheEntryAccessCount s_CacheEntryAccessCounts[CCacheReader::eCacheEntry_Count]
SCacheInfo::TParams * GetCacheParams(const SCacheInfo::TParams *src_params, SCacheInfo::EReaderOrWriter reader_or_writer, SCacheInfo::EIdOrBlob id_or_blob)
NCBI_PARAM_DECL(int, GENBANK, CACHE_DEBUG)
void NCBI_EntryPoint_CacheReader(CPluginManager< CReader >::TDriverInfoList &info_list, CPluginManager< CReader >::EEntryPointRequest method)
static const SPluginParams::SDefaultValue s_DefaultParams[]
NCBI_PARAM_DEF_EX(int, GENBANK, CACHE_DEBUG, 0, eParam_NoThread, GENBANK_CACHE_DEBUG)
static bool IsDisabledCache(const SCacheInfo::TParams *params)
static SCacheInfo::TParams * GetDriverParams(SCacheInfo::TParams *params)
static const SPluginParams::SDefaultValue s_DefaultWriterParams[]
static const size_t kHashLimit
#define NCBI_GBLOADER_READER_CACHE_PARAM_ID_SECTION
#define NCBI_GBLOADER_WRITER_CACHE_PARAM_SHARE
#define NCBI_GBLOADER_READER_CACHE_PARAM_DRIVER
#define NCBI_GBLOADER_READER_CACHE_PARAM_JOINED_BLOB_VERSION
#define NCBI_GBLOADER_READER_CACHE_DRIVER_NAME
#define NCBI_GBLOADER_READER_CACHE_PARAM_BLOB_SECTION
Reader-writer based streams.
static sljit_uw total_size
static int GetDebugLevel()
Better replacement of GetAccVer(), this method should be defined in data loaders, GetAccVer() is left...
Better replacement of GetGi(), this method should be defined in data loaders, GetGi() is left for com...
Better replacement of GetSequenceHash(), this method should be defined in data loaders,...
Better replacement of GetSequenceType(), this method should be defined in data loaders,...
unsigned maximum_age
Set to a non-zero value to return a version not older than the specified value.
atomic< Uint8 > save_count
atomic< Uint8 > load_count
structure for common cache reader&writer implementation
static void GetBlob_idsSubkey(const SAnnotSelector *sel, string &subkey, string &true_subkey)
Id cache subkeys:
CConfig::TParamTree TParams
static ICache * CreateCache(const TParams *params, EReaderOrWriter reader_or_writer, EIdOrBlob id_or_blob)
static string GetBlobSubkey(CLoadLockBlob &blob, int chunk_id=kMain_ChunkId)
BLOB cache subkeys:
static string GetIdKey(const CSeq_id &id)
Return Id cache key string based on CSeq_id of gi.
static const char * GetAccVerSubkey(void)
static const char * GetTypeSubkey(void)
static const char * GetBlobStateSubkey(void)
static const char * GetGiSubkey(void)
static int GetDebugLevel(void)
static const char * GetHashSubkey(void)
static const char * GetLabelSubkey(void)
static const char *const BLOB_IDS_SUBKEY
static const char * GetLengthSubkey(void)
static const char * GetTaxIdSubkey(void)
static const char * GetSeq_idsSubkey(void)
static const char * GetBlobVersionSubkey(void)
static string GetBlobKey(const CBlob_id &blob_id)
Return BLOB cache key string based on Sat() and SatKey()
static const int BLOB_IDS_MAGIC
static const string & SetDefaultValue(TParams *params, const string &name, const char *value)
static const TParams * FindSubNode(const TParams *params, const string &name)
static const string & SetDefaultValue(TParams *params, const SDefaultValue &value)
static TParams * SetSubNode(TParams *params, const string &name, const char *default_value="")
static TParams * FindSubNode(TParams *params, const string &name)
SCacheInfo::TParams TParams
static TParams * SetSubSection(TParams *params, const string &name)
static void SetDefaultValues(TParams *params, const SDefaultValue *values)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4