56 #define FIX_BAD_ID2S_REPLY_DATA 1
95 return id.IsGi()?
GetIdKey(
id.GetGi()):
id.AsFastaString();
101 return id.IsGi()?
GetIdKey(
id.GetGi()):
id.AsString();
118 if ( accs.
empty() ) {
125 size_t total_size = 0;
127 total_size += 1+it->first.size();
237 oss << chunk_id <<
'-' << split_version;
248 : m_BlobCache(0), m_IdCache(0)
283 const string& driver_name)
287 bool joined_blob_version = conf.
GetBool(
341 class CParseBuffer :
public IReader {
346 const string&
key,
const string&
subkey);
352 int* get_current_version);
354 bool Found(
void)
const
356 return m_Descr.blob_found;
358 bool FoundSome(
void)
const
360 return m_Descr.actual_age != unsigned(-1);
362 TExpirationTime GetExpirationTime(
void)
const
364 return m_ExpirationTime;
366 bool GotCurrentVersion(
void)
const
368 return m_Descr.return_current_version_supported;
370 bool CurrentVersionExpired(
void)
const
372 return GetExpirationTime() == TExpirationTime(-1);
374 bool Done(
void)
const
384 Uint1 ParseUint1(
void)
386 return *x_NextBytes(1);
392 Uint4 ParseUint4(
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);
408 string ParseString(
void);
409 string FullString(
void);
415 size_t* bytes_read = 0)
423 count =
min(count, m_Size);
424 memcpy(
buf, m_Ptr, count);
432 virtual ERW_Result PendingCount(
size_t* count)
444 int* get_current_version,
445 bool set_expiration_time);
446 bool x_Eof(
void)
const;
447 const char* x_NextBytes(
size_t size);
450 CParseBuffer(
const CParseBuffer&);
451 void operator=(
const CParseBuffer&);
455 TExpirationTime m_ExpirationTime;
465 int* get_current_version,
466 bool set_expiration_time)
468 if ( set_expiration_time ) {
471 if ( get_current_version ) {
474 m_Descr.return_current_version =
true;
481 if ( get_current_version ) {
485 if ( !get_current_version ) {
490 if ( get_current_version && GotCurrentVersion() ) {
491 s <<
", ver="<<m_Descr.current_version;
496 if ( get_current_version && GotCurrentVersion() ) {
497 s <<
", ver="<<m_Descr.current_version;
500 s <<
", age="<<
int(m_Descr.actual_age);
504 if ( m_Descr.actual_age > m_ExpirationTime ) {
505 m_ExpirationTime = TExpirationTime(-1);
508 m_ExpirationTime -= m_Descr.actual_age;
511 if ( get_current_version ) {
512 if ( GotCurrentVersion() ) {
513 *get_current_version = m_Descr.current_version;
516 m_ExpirationTime = TExpirationTime(-1);
517 *get_current_version = 0;
520 if ( Found() && !m_Descr.reader.get() ) {
522 m_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)
555 string CParseBuffer::ParseString(
void)
559 size_t size = ParseUint4();
561 ret.assign(x_NextBytes(
size),
size);
566 size_t count =
min(
size,
sizeof(m_Buffer));
567 ret.assign(x_NextBytes(count), count);
574 string CParseBuffer::FullString(
void)
579 ret.assign(m_Ptr, m_Size);
585 while ( m_Descr.reader->Read(m_Buffer,
sizeof(m_Buffer), &count) ==
eRW_Success ) {
586 ret.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 bool CParseBuffer::x_Eof(
void)
const
629 IReader* CParseBuffer::GetReader(
void)
632 if ( !m_Descr.reader.get() ) {
635 return m_Descr.reader.get();
649 if ( lock.IsLoaded() ) {
655 if ( !
str.Found() ) {
661 size_t count =
static_cast<CObjectIStream&
>(obj_stream).ReadUint4();
663 for (
size_t i = 0;
i < count; ++
i ) {
670 str.GetExpirationTime());
708 if ( gi_num !=
Int4(gi_num) ) {
710 "64-bit gi overflow");
727 if ( ids_lock.IsLoaded() ) {
728 result.SetLoadedGiFromSeqIds(seq_id, ids_lock);
753 string data =
str.FullString();
756 if ( !data.empty() ) {
767 if ( ids_lock.IsLoaded() ) {
768 result.SetLoadedAccFromSeqIds(seq_id, ids_lock);
810 string data =
str.FullString();
819 if ( ids_lock.IsLoaded() ) {
821 ids_lock.GetExpirationTime());
842 if ( !
str.Found() ) {
871 if ( !
str.Found() ) {
872 if ( !seq_id.
IsGi() ) {
884 gi_hash.GetExpirationTime());
895 hash.sequence_found =
str.ParseBool();
896 hash.hash_known =
str.ParseBool();
921 if ( !
str.Found() ) {
950 if ( !
str.Found() ) {
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 ) {
1013 ret[
i] = lock.
GetGi(data);
1028 size_t count = ids.size();
1029 for (
size_t i = 0;
i < count; ++
i ) {
1053 size_t count = ids.size();
1054 for (
size_t i = 0;
i < count; ++
i ) {
1081 if( ids.IsLoaded() ) {
1086 string subkey, true_subkey;
1089 if ( !
str.Found() ) {
1100 size_t blob_count =
str.ParseUint4();
1101 blob_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_t name_count =
str.ParseUint4();
1113 for (
size_t j = 0; j < name_count; ++j ) {
1114 annots_info->AddNamedAnnotName(
str.ParseString());
1117 string s =
str.ParseString();
1119 if ( !annots_info ) {
1126 stream >> *annot_info;
1127 annots_info->AddAnnotInfo(*annot_info);
1130 if ( annots_info ) {
1131 info.SetAnnotInfo(annots_info);
1133 blob_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() ) {
1301 bool know_has_blobs =
false;
1305 if ( !
str.GotCurrentVersion() ) {
1310 "stopped to get current blob version");
1323 if ( !
str.Found() ) {
1324 know_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 ) {
1428 int processor_type =
ReadInt(stream);
1431 if ( processor_type != processor.
GetType() ) {
1433 "CCacheReader::LoadChunk: "
1434 "invalid processor type: "<<processor_type);
1436 int processor_magic =
ReadInt(stream);
1437 if ( processor_magic !=
int(processor.
GetMagic()) ) {
1439 "CCacheReader::LoadChunk: "
1440 "invalid processor magic number: "<<processor_magic);
1474 const char* default_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;
1631 unique_ptr<SCacheInfo::TParams> section
1633 if ( !section.get() ) {
1652 return section.release();
1660 unique_ptr<TParams> cache_params
1662 if ( !cache_params.get() ) {
1668 return manager->CreateInstanceFromKey
1680 unique_ptr<TParams> id_params
1682 unique_ptr<TParams> blob_params
1686 const TParams* share_id_param =
1688 bool share_id = !share_id_param ||
1690 const TParams* share_blob_param =
1692 bool share_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)
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
#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 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)
Defines: CTimeFormat - storage class for time format.
static pcre_uint8 * buffer
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 const char * str(char *buf, int n)
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)