41 #include <unordered_map>
86 unique_ptr<CConfig> sub_config(
new CConfig(sub_tree));
88 return result.first->second.get();
116 if (!found)
return false;
139 template <
typename TType>
142 return to_string(
value);
147 return '"' +
value +
'"';
152 template <
class TParam>
157 template <
class TDescription>
160 const auto& section = TDescription::sm_ParamDescription.section;
161 const auto& name = TDescription::sm_ParamDescription.name;
168 template <
class... TParams>
174 template <
class TFirst,
class TSecond,
class... TOther>
177 return vs << SParamReporter<TFirst>() <<
SListReporter<TSecond, TOther...>();
180 template <
class TParam>
183 return vs << SParamReporter<TParam>();
191 template <
typename TType>
192 void Add(
const string& section,
const string& name, TType
value);
194 void Report(ostream& os)
const;
204 TServConn_ConnMaxRetries,
205 TServConn_RetryDelay,
206 TServConn_UserLinger2,
207 TServConn_MaxFineLBNameRetries,
208 TCGI_NetCacheFallbackServer,
209 TServConn_MaxConnPoolSize,
210 TServConn_ConnDataLogging,
211 TServConn_WarnOnUnexpectedReply,
212 TWorkerNode_MaxWaitForServers,
213 TWorkerNode_StopOnJobErrors,
214 TWorkerNode_AllowImplicitJobReturn>();
219 lock_guard<mutex> lock(m_Mutex);
221 for (
const auto& section : m_Values) {
222 os <<
'[' << section.first <<
']' << endl;;
224 for (
const auto& param : section.second) {
225 os << param.first <<
'=' << param.second << endl;
232 template <
typename TType>
235 lock_guard<mutex> lock(m_Mutex);
252 lock_guard<mutex> lock(m_Mutex);
254 for (
const auto& section : sections) {
255 auto result = m_Includes.insert({section, {}});
256 auto& included =
result.first->second;
260 auto included_value =
registry.
Get(
string(section),
".include");
265 rv.push_back(section);
266 rv.insert(rv.end(), included.begin(), included.end());
275 void Set(
string message);
276 void Report(ostream& os)
const;
287 lock_guard<mutex> lock(m_Mutex);
288 m_Alerts.emplace(++m_CurrentID, message);
293 lock_guard<mutex> lock(m_Mutex);
294 for (
const auto& alert : m_Alerts) {
295 os <<
"Alert_" << alert.first <<
": " << alert.second << endl;
301 lock_guard<mutex> lock(m_Mutex);
302 return m_Alerts.erase(
id) == 1;
342 template <
typename TType>
351 for (
const auto& section : sections_plus_included) {
352 for (
const auto& name :
names) {
379 m_Report->Add(sections.back(),
names.front(), default_value);
380 return default_value;
390 for (
const auto& section : sections_plus_included) {
391 for (
const auto& name :
names) {
524 return m_Registry->Get(section, name, default_value);
531 return m_Registry->Get(section, name, default_value);
538 return m_Registry->Get(section, name, default_value);
545 return m_Registry->Get(section, name, default_value);
bool x_HasEntry(const string §ion, const string &name, TFlags flags) const override
map< string, unique_ptr< CConfig > > m_SubConfigs
void x_Enumerate(const string §ion, list< string > &entries, TFlags flags) const override
void Reset(CConfig *config=nullptr)
const string & x_Get(const string §ion, const string &name, TFlags flags) const override
CConfigRegistry(CConfig *config=nullptr)
CConfig * GetSubConfig(const string §ion) const
bool x_Empty(TFlags flags) const override
Implementations of the fundamental operations above, to be run with the lock already acquired and som...
const string & x_GetComment(const string §ion, const string &name, TFlags flags) const override
void x_ChildLockAction(FLockAction action) final
const string & x_GetComment(const string §ion, const string &name, TFlags flags) const final
double GetDouble(const string §ion, const string &name, double default_value, TFlags flags=0, EErrAction err_action=eThrow) const final
Get double value of specified parameter name.
string GetString(const string §ion, const string &name, const string &default_value, TFlags flags=0) const final
Get the parameter string value.
void EnumerateInSectionComments(const string §ion, list< string > *comments, TFlags flags=fAllLayers) const final
Enumerate in-section comments.
bool x_HasEntry(const string §ion, const string &name, TFlags flags) const final
const string & Get(const string §ion, const string &name, TFlags flags=0) const final
Get the parameter value.
int GetInt(const string §ion, const string &name, int default_value, TFlags flags=0, EErrAction err_action=eThrow) const final
Get integer value of specified parameter name.
void x_SetModifiedFlag(bool modified, TFlags flags) final
bool x_Modified(TFlags flags) const final
void x_Enumerate(const string §ion, list< string > &entries, TFlags flags) const final
const string & GetComment(const string §ion=kEmptyStr, const string &name=kEmptyStr, TFlags flags=0) const final
Get comment of the registry entry "section:name".
bool HasEntry(const string §ion, const string &name=kEmptyStr, TFlags flags=0) const final
void EnumerateSections(list< string > *sections, TFlags flags=fAllLayers) const final
Enumerate section names.
CSynRegistryToIRegistry(CSynRegistry::TPtr registry)
IRegistry & GetIRegistry() const
CSynRegistry::TPtr m_Registry
const string & x_Get(const string §ion, const string &name, TFlags flags) const final
void EnumerateEntries(const string §ion, list< string > *entries, TFlags flags=fAllLayers) const final
Enumerate parameter names for a specified section.
bool GetBool(const string §ion, const string &name, bool default_value, TFlags flags=0, EErrAction err_action=eThrow) const final
Get boolean value of specified parameter name.
bool x_Empty(TFlags flags) const final
Implementations of the fundamental operations above, to be run with the lock already acquired and som...
void Report(ostream &os) const
map< size_t, string > m_Alerts
SRegSynonyms Get(const SRegSynonyms §ions, IRegistry ®istry)
unordered_map< string, vector< string > > m_Includes
void Add(const string §ion, const string &name, TType value)
void Report(ostream &os) const
unique_ptr< CReport > m_Report
void Add(const IRegistry ®istry)
unique_ptr< CAlert > m_Alert
CCompoundRegistry m_Registry
shared_ptr< CSynRegistry > TPtr
void Alerts(ostream &os) const
void Report(ostream &os) const
IRegistry & GetIRegistry()
unique_ptr< CInclude > m_Include
TType TGet(const SRegSynonyms §ions, SRegSynonyms names, TType default_value)
bool Has(const SRegSynonyms §ions, SRegSynonyms names)
definition of a Culling tree
const_iterator end() const
const_iterator find(const key_type &key) const
Classes to support using environment variables as a backend for the registry framework.
static const struct name_t names[]
static CNcbiApplicationGuard InstanceGuard(void)
Singleton method.
const CNcbiRegistry & GetConfig(void) const
Get the application's cached configuration parameters (read-only).
CNcbiApplicationAPI * Get(void)
#define NCBI_ALWAYS_TROUBLE(mess)
#define ERR_POST(message)
Error posting with file, line number information but without error codes.
const string & GetMsg(void) const
Get message string.
void Warning(CExceptionArgs_Base &args)
TErrCode GetErrCode(void) const
#define NCBI_RETHROW2(prev_exception, exception_class, err_code, message, extra)
Re-throw exception with extra parameter.
const CException * GetPredecessor(void) const
Get "previous" exception from the backlog.
const TParamTree * GetTree() const
@ eErr_Throw
Throw an exception on error.
@ eParameterMissing
Missing mandatory parameter.
static TValueType GetDefault(void)
Get global default value.
int TFlags
Binary OR of "EFlags".
virtual void EnumerateSections(list< string > *sections, TFlags flags=fAllLayers) const
Enumerate section names.
virtual const string & Get(const string §ion, const string &name, TFlags flags=0) const
Get the parameter value.
string GetValue(const string §ion, const string &name, const string &default_value, EErrAction=eReturn, TFlags flags=0) const
Overloading of getters for generic programming.
EErrAction
What to do if parameter value is present but cannot be converted into the requested type.
virtual void EnumerateInSectionComments(const string §ion, list< string > *comments, TFlags flags=fAllLayers) const
Enumerate in-section comments.
virtual bool HasEntry(const string §ion, const string &name=kEmptyStr, TFlags flags=0) const
bool Empty(TFlags flags=fAllLayers) const
Verify if Registry is empty.
virtual void EnumerateEntries(const string §ion, list< string > *entries, TFlags flags=fAllLayers) const
Enumerate parameter names for a specified section.
bool Modified(TFlags flags=fPersistent) const
Verify if persistent values have been modified.
virtual const string & GetComment(const string §ion=kEmptyStr, const string &name=kEmptyStr, TFlags flags=0) const
Get comment of the registry entry "section:name".
void Add(const IRegistry ®, TPriority prio=ePriority_Default, const string &name=kEmptyStr)
Non-empty names must be unique within each compound registry, but there is no limit to the number of ...
void SetModifiedFlag(bool modified, TFlags flags=fPersistent)
Indicate whether any relevant values are out of sync with some external resource (typically a configu...
@ eThrow
Throw an exception if an error occurs.
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
static list< string > & Split(const CTempString str, const CTempString delim, list< string > &arr, TSplitFlags flags=0, vector< SIZE_TYPE > *token_pos=NULL)
Split a string using specified delimiters.
static string JsonEncode(const CTempString str, EJsonEncode encoding=eJsonEnc_UTF8)
Encode a string for JSON.
@ eJsonEnc_Quoted
Quote resulting string.
@ fSplit_MergeDelimiters
Merge adjacent delimiters.
const GenericPointer< typename T::ValueType > T2 value
Process information in the NCBI Registry, including working with configuration files.
CSynRegistry::TPtr s_CreateISynRegistry(const CNcbiApplication *app)
static string s_ToString(TType value)
NCBI_PARAM_DEF(bool, netservice_api, use_linger2, false)
TValues & operator<<(TValues &vs, SParamReporter< CParam< TDescription >>)
#define RETRY_DELAY_DEFAULT
#define CONNECTION_MAX_RETRIES
CSynRegistryBuilder(const IRegistry ®istry)
CSynRegistry::TPtr m_Registry
static wxAcceleratorEntry entries[3]