& server_name)
79 if(pool_name.empty()) {
82 return conn->ServerName() == server_name
83||
conn->GetRequestedServer() == server_name;
85 return conn->PoolName() == pool_name;
169 boolsuccess =
true;
194 boolsuccess =
true;
246con->PopMsgHandler(h);
251con->PopMsgHandler(h);
266 if(
env.Get(
"LC_ALL") ==
"POSIX") {
268 env.Set(
"LC_ALL",
"C");
270 if(!
env.Get(
"SYBASE").empty()) {
271 stringreset =
env.Get(
"RESET_SYBASE");
312 if( !consumer.selected
313&& (consumer.subject_is_pool
314?
conn->PoolName() == consumer.subject
316consumer.selected =
true;
317recipient = &consumer.conn;
327 if(conn_reusable &&
conn->IsOpeningFinished() &&
conn->IsValid()) {
334 if(
conn->m_Pool.empty()) {
339 if(
n>=
conn->m_PoolMaxSize) {
344 if(keep &&
conn->m_ReuseCount + 1 >
conn->m_PoolMaxConnUse) {
353 conn->m_CleanupTime = now +
conn->m_PoolIdleTimeParam;
357 if(recipient !=
nullptr) {
372 if(
delta!= 0 &&
conn->IsReusable()) {
374 stringserver_name =
conn->GetServerName();
375 if(
conn->Host() != 0 && server_name.find(
'@') ==
NPOS) {
377 if(
conn->Port() != 0) {
385 _TRACE(server_name <<
" count += "<<
delta<<
" for pool " 386<<
conn->PoolName() <<
" ("<< pool_count <<
") and service " 387<<
conn->GetRequestedServer() <<
" ("<< service_count <<
')');
393 const string& name,
TCounts* counts)
const 396 autoit = main_map.
find(name);
397 if(it == main_map.
end()) {
400*counts = it->second;
406 const string& pool_name,
407 unsigned intmax_closings)
417 if( !srv_name.empty() && srv_name != con->ServerName()
418&& srv_name != con->GetRequestedServer() )
420 if((!pool_name.empty()) && pool_name.compare(con->PoolName()))
continue;
425 if(--max_closings == 0) {
432 const string& pool_name)
const 436 if((!svr_ref || !svr_ref->
IsValid()) && pool_name.empty()) {
455 if(!server.empty()) {
456 if(server != con->ServerName()
457&& server != con->GetRequestedServer())
460 else if(host != 0) {
461 if(host != con->Host() || port != con->Port())
464 if((!pool_name.empty()) && pool_name.compare(con->PoolName()))
continue;
473 const string& pool_name)
const 484 m_InUse.push_back(connection);
493 if(params.
GetParam(
"is_pooled") ==
"true") {
496 stringpool_name (params.
GetParam(
"pool_name")),
501 if(
s_Matches(t_con, pool_name, server_name)) {
525 stringpool_max_str(params.
GetParam(
"pool_maxsize"));
526 if(!pool_max_str.empty() && pool_max_str !=
"default") {
532 if(
s_Matches(t_con, pool_name, server_name)) {
536 if(total_cnt >= pool_max) {
538 stringtimeout_str(params.
GetParam(
"pool_wait_time"));
539 doubletimeout_val = 0.0;
540 if( !timeout_str.empty() && timeout_str !=
"default") {
545 if(pool_name.empty()) {
552 subject, !pool_name.empty()));
554 booltimed_out =
true;
555 boolrelocked =
false;
559 if(target->selected) {
562 if(&it != &*target && it.selected) {
577 if(*it == target->conn) {
578t_con = target->conn;
583 if(t_con !=
NULL) {
595 if(params.
GetParam(
"pool_allow_temp_overflow")
597 string msg=
FORMAT(
"Connection pool full (size " 598<< pool_max <<
") for " 599<< (pool_name.empty() ? server_name
608 if(params.
GetParam(
"do_not_connect") ==
"true") {
613 if(!TDbapi_CanUseKerberos::GetDefault()
617 stringerr_msg(
"Insufficient credentials to connect.");
620err_msg +=
" User name has not been set.";
623err_msg +=
" Password has not been set.";
762 const string& dn,
const string& pass)
782 string& db_name,
string& password)
784 if(!TDbapi_ConnUseEncryptData::GetDefault())
793 stringres_name = app_name;
794 if(!user_name.empty()) {
796res_name += user_name;
798 if(!server_name.empty()) {
800res_name += server_name;
802 if(!db_name.empty()) {
811password =
info.GetValue();
813 typedefTExtraMap::const_iterator TExtraMapIt;
814 constTExtraMap& extra =
info.GetExtraValues().GetPairs();
816TExtraMapIt it = extra.find(
"server");
817 if(it != extra.end())
818server_name = it->second;
819it = extra.find(
"username");
820 if(it != extra.end())
821user_name = it->second;
822it = extra.find(
"database");
823 if(it != extra.end())
824db_name = it->second;
827 SLoginData(server_name, user_name, db_name, password)).second)
830 "Circular dependency inside resources info file.", 100012);
863 if(service_name.empty())
877}
NCBI_CATCH(
"Password decryption for "+ service_name);
880<<
"Using unencrypted password for "+ service_name);
885params->
pool_name= service_name +
".dbservice.pool";
890 const string& section_name,
898params->
server= reg.
Get(section_name,
"service");
902params->
port= reg.
Get(section_name,
"port");
906params->
database= reg.
Get(section_name,
"database");
910params->
username= reg.
Get(section_name,
"username");
918params->
password= reg.
Get(section_name,
"password");
920 if(reg.
HasEntry(section_name,
"password_file",
934params->
io_timeout= reg.
Get(section_name,
"io_timeout");
946params->
is_pooled= reg.
Get(section_name,
"use_conn_pool");
950params->
pool_name= reg.
Get(section_name,
"conn_pool_name");
960 if(reg.
HasEntry(section_name,
"conn_pool_idle_time",
965 if(reg.
HasEntry(section_name,
"conn_pool_wait_time",
970 if(reg.
HasEntry(section_name,
"conn_pool_allow_temp_overflow",
974= reg.
Get(section_name,
"conn_pool_allow_temp_overflow");
976 if(reg.
HasEntry(section_name,
"continue_after_raiserror",
980= reg.
Get(section_name,
"continue_after_raiserror");
982 if(reg.
HasEntry(section_name,
"conn_pool_max_conn_use",
986= reg.
Get(section_name,
"conn_pool_max_conn_use");
988 if(reg.
HasEntry(section_name,
"log_minor_messages",
992= reg.
Get(section_name,
"log_minor_messages");
996params->
args= reg.
Get(section_name,
"args");
1005 stringpool_min_str = params.
GetParam(
"pool_minsize");
1006 if(pool_min_str.empty() || pool_min_str ==
"default")
1012 stringpool_name = params.
GetParam(
"pool_name"),
1032vector< AutoPtr<CDB_Connection> > conns(pool_min);
1033 for(
int i= total_cnt;
i< pool_min; ++
i) {
1038 ERR_POST_X(1,
"Error filling connection pool: "<< ex);
1051conf_params.
Clear();
1052 if(params.
GetParam(
"do_not_read_conf") !=
"true") {
1056unique_ptr<CDB_Connection> t_con;
1071 unsigned inttimeout;
1072 if(cfactory !=
nullptr) {
1082 if(
value==
"default") {
1084}
else if(!
value.empty()) {
1090 if(timeout == 0 && cfactory !=
nullptr) {
1103 if(
value==
"default") {
1105}
else if(!
value.empty()) {
1111 if(cfactory !=
nullptr) {
1112 autovalidation_timeout = cfactory->GetConnectionTimeout();
1113 if(validation_timeout == 0) {
1114validation_timeout = timeout ? timeout : 30;
1131 if(
value==
"default") {
1134 else if(!
value.empty()) {
1140act_params.
SetParam(
"single_server",
"true");
1143act_params.
SetParam(
"single_server",
1148 else if(params.
GetParam(
"single_server") ==
"default") {
1149act_params.
SetParam(
"single_server",
"true");
1153act_params.
SetParam(
"is_pooled",
"false");
1156act_params.
SetParam(
"is_pooled",
1162 else if(params.
GetParam(
"is_pooled") ==
"default") {
1163act_params.
SetParam(
"is_pooled",
"false");
1167 else if(params.
GetParam(
"pool_minsize") ==
"default") {
1168act_params.
SetParam(
"pool_minsize",
"0");
1172 else if(params.
GetParam(
"pool_maxsize") ==
"default") {
1173act_params.
SetParam(
"pool_maxsize",
"");
1177 else if(params.
GetParam(
"pool_idle_time") ==
"default") {
1178act_params.
SetParam(
"pool_idle_time",
"");
1182 else if(params.
GetParam(
"pool_wait_time") ==
"default") {
1183act_params.
SetParam(
"pool_wait_time",
"0");
1187act_params.
SetParam(
"pool_allow_temp_overflow",
"false");
1191(
"pool_allow_temp_overflow",
1197 else if(params.
GetParam(
"pool_allow_temp_overflow") ==
"default") {
1198act_params.
SetParam(
"pool_allow_temp_overflow",
"false");
1201act_params.
SetParam(
"pool_max_conn_use",
1203 else if(params.
GetParam(
"pool_max_conn_use") ==
"default") {
1204act_params.
SetParam(
"pool_max_conn_use",
"0");
1208act_params.
SetParam(
"continue_after_raiserror",
"false");
1212(
"continue_after_raiserror",
1218 else if(params.
GetParam(
"continue_after_raiserror") ==
"default") {
1219act_params.
SetParam(
"continue_after_raiserror",
"false");
1223act_params.
SetParam(
"log_minor_messages",
"false");
1227(
"log_minor_messages",
1233 else if(params.
GetParam(
"log_minor_messages") ==
"default") {
1234act_params.
SetParam(
"log_minor_messages",
"false");
1248 if(t_con.get() ==
NULL) {
1249 if(act_params.
GetParam(
"do_not_connect") ==
"true") {
1254err +=
"Cannot connect to the server '"+ act_params.
GetServerName();
1255err +=
"' as user '"+ act_params.
GetUserName() +
"'";
1261ex.AddPrevious(*it);
1266t_con->SetTimeout(timeout);
1272 returnt_con.release();
1278 size_tinvalidated_count = 0;
1284 if(t_con->
Host() != keep_host_ip || t_con->
Port() != keep_port) {
1286++invalidated_count;
1293 if(t_con->
Host() != keep_host_ip || t_con->
Port() != keep_port) {
1300 returninvalidated_count;
1305 const string& pool_name)
1308 if(max_closings == 0) {
1315 const string& pool_name_2 = (*it)->PoolName();
1317= pool_name_2.
empty() ? at_min_by_server : at_min_by_pool;
1318 if(pool_name_2.empty()) {
1319 if( !pool_name.empty()
1320|| at_min.
find((*it)->GetRequestedServer()) != at_min.
end()) {
1323}
else if(( !pool_name.empty() && pool_name != pool_name_2)
1324|| at_min.
find(pool_name_2) != at_min.
end()) {
1327 if((*it)->m_CleanupTime.IsEmpty() || (*it)->m_CleanupTime > now) {
1331 if(pool_name_2.empty()) {
1336 if(
n> (*it)->m_PoolMinSize) {
1340 if(--max_closings == 0) {
1344at_min.
insert(pool_name_2);
1353 impl->ReleaseInterface();
1386 if(!t_con)
continue;
1393 if(!t_con)
continue;
1406 if(!t_con)
continue;
1413 if(!t_con)
continue;
1423 #if defined(NCBI_OS_MSWIN) 1425 if(WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
1434 #if defined(NCBI_OS_MSWIN)unsigned int GetLoginTimeout(void) const
Uint2 GetPort(void) const
const string & GetName(void) const
Uint4 GetHost(void) const
CRef< IDBConnectionFactory > GetConnectionFactory(void) const
Retrieve a connection factory.
static CDbapiConnMgr & Instance(void)
Get access to the class instance.
void Guard(resource_type &resource)
Manually force the guard to protect some other resource.
void Release()
Manually force the resource to be released.
static CNcbiApplication * Instance(void)
Singleton method.
static bool IsEncrypted(const string &data)
Check if the string contains valid encrypted data.
static string Decrypt(const string &encrypted_string)
Decrypt a string using the matching key found in the NCBI keys files.
Class for handling resource info files.
static string GetDefaultFileName(void)
Get default resource info file location (/etc/ncbi/.info).
const CNcbiResourceInfo & GetResourceInfo(const string &res_name, const string &pwd) const
Get read-only resource info for the given name.
Class for storing encrypted resource information.
CTempString implements a light-weight string on top of a storage buffer whose lifetime management is ...
CTimeout â Timeout interval.
virtual CDB_Connection * MakeDBConnection(I_DriverContext &ctx, const CDBConnParams ¶ms, CDB_UserHandler::TExceptions &exceptions)=0
Create new connection object for the given context and connection attributes.
virtual void SetTimeout(size_t nof_secs)=0
virtual void SetBlobSize(size_t nof_bytes)
bool IsReusable(void) const
Check if this connection is a reusable one.
virtual bool IsAlive(void)=0
Check out if connection is alive (this function doesn't ping the server, it just checks the status of...
const string & PoolName(void) const
Find out which connection pool this connection belongs to.
impl::CDBConnParamsBase::
virtual string GetPassword(void) const
virtual string GetDatabaseName(void) const
virtual string GetUserName(void) const
void SetUserName(const string &name)
virtual string GetParam(const string &key) const
Parameters, which are not listed above explicitly, should be retrieved via SetParam() method.
void SetParam(const string &key, const string &value)
void SetServerName(const string &name)
void SetPassword(const string &passwd)
virtual string GetServerName(void) const
void SetDatabaseName(const string &name)
void Pop(CDB_UserHandler *h, bool last=true)
void Push(CDB_UserHandler *h, EOwnership ownership=eNoOwnership)
virtual void PopDefConnMsgHandler(CDB_UserHandler *h)
Remove `per-connection' mess. handler "h" and all above it in the stack.
virtual void PushDefConnMsgHandler(CDB_UserHandler *h, EOwnership ownership=eNoOwnership)
Add `per-connection' err.message handler "h" to the stack of default handlers which are inherited by ...
CDBHandlerStack m_ConnHandlers
Stacks of `per-connection' err.message handlers.
void x_AdjustCounts(const CConnection *conn, int delta)
virtual CDB_Connection * MakeConnection(const CDBConnParams ¶ms)
Create connection object using Load Balancer / connection factory.
size_t CloseConnsForPool(const string &pool_name, Uint4 keep_host_ip=0, Uint2 keep_port=0)
virtual void SetHostName(const string &host_name)
Set host name.
virtual void PushCntxMsgHandler(CDB_UserHandler *h, EOwnership ownership=eNoOwnership)
Add message handler "h" to process 'context-wide' (not bound to any particular connection) error mess...
list< SConsumer > m_PoolSemConsumers
void ReadDBConfParams(const string &service_name, SDBConfParams *params)
size_t GetMaxBlobSize(void) const
CDBHandlerStack m_CntxHandlers
Stack of `per-context' err.message handlers.
virtual string GetHostName(void) const
Get host name.
bool SatisfyPoolMinimum(const CDBConnParams ¶ms)
void x_Recycle(CConnection *conn, bool conn_reusable)
Return unused connection "conn" to the driver context for future reuse (if "conn_reusable" is TRUE) o...
virtual unsigned int GetCancelTimeout(void) const
unsigned int m_LoginTimeout
unsigned int m_CancelTimeout
virtual unsigned int NofConnections(const string &srv_name="", const string &pool_name="") const
Return number of currently open connections in this context.
TCountsMap m_CountsByPool
virtual bool SetTimeout(unsigned int nof_secs=0)
Set connection timeout.
static void ResetEnvSybase(void)
virtual ~CDriverContext(void)
void UpdateConnMaxBlobSize(void) const
TConnPool m_NotInUse
Unused(reserve) connections.
virtual string GetApplicationName(void) const
Return application name.
virtual void PopCntxMsgHandler(CDB_UserHandler *h)
Remove message handler "h" and all handlers above it in the stack.
CDB_Connection * MakePooledConnection(const CDBConnParams ¶ms)
Create connection object WITHOUT using of Load Balancer / connection factory.
virtual bool SetMaxBlobSize(size_t nof_bytes)
Set maximal size for BLOB data.
virtual void SetClientCharset(const string &charset)
virtual CRWLock & x_GetCtxLock(void) const
void CloseOldIdleConns(unsigned int max_closings, const string &pool_name=kEmptyStr)
virtual unsigned int GetLoginTimeout(void) const
Get login timeout.
virtual CConnection * MakeIConnection(const CDBConnParams ¶ms)=0
void x_ReadDBConfParams(const IRegistry ®, const string §ion_name, SDBConfParams *params)
virtual void SetApplicationName(const string &app_name)
Set application name.
virtual bool SetLoginTimeout(unsigned int nof_secs=0)
Set login timeout.
CDB_Connection * MakeCDBConnection(CConnection *connection, int delta)
TConnPool m_InUse
Used connections.
EEncoding m_ClientEncoding
virtual unsigned int GetTimeout(void) const
Get connection timeout.
TCountsMap m_CountsByService
void UpdateConnTimeout(void) const
void x_GetCounts(const TCountsMap &main_map, const string &name, TCounts *counts) const
void CloseUnusedConnections(const string &srv_name=kEmptyStr, const string &pool_name=kEmptyStr, unsigned int max_closings=kMax_UInt)
close reusable deleted connections for specified server and/or pool
void DestroyConnImpl(CConnection *impl)
list< CConnection * > TConnPool
virtual bool SetCancelTimeout(unsigned int nof_secs)
virtual string GetUserName(void) const
virtual Uint4 GetProtocolVersion(void) const
virtual CRef< IConnValidator > GetConnValidator(void) const
~CMakeConnActualParams(void)
virtual string GetDatabaseName(void) const
const CDBConnParams & m_Other
virtual string GetPassword(void) const
virtual Uint2 GetPort(void) const
void SetUserName(const string &name)
virtual EEncoding GetEncoding(void) const
virtual string GetParam(const string &key) const
Parameters, which are not listed above explicitly, should be retrieved via SetParam() method.
void SetParam(const string &key, const string &value)
virtual string GetServerName(void) const
virtual Uint4 GetHost(void) const
virtual EServerType GetServerType(void) const
void SetServerName(const string &name)
CMakeConnActualParams(const CDBConnParams &other)
void SetPassword(const string &passwd)
void SetDatabaseName(const string &name)
const_iterator end() const
const_iterator find(const key_type &key) const
iterator_bool insert(const value_type &val)
const_iterator find(const key_type &key) const
const_iterator end() const
NCBI_PARAM_DEF_EX(bool, dbapi, conn_use_encrypt_data, false, eParam_NoThread, NULL)
static CS_CONNECTION * conn
const CNcbiRegistry & GetConfig(void) const
Get the application's cached configuration parameters (read-only).
constexpr size_t ArraySize(const Element(&)[Size])
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
#define ERASE_ITERATE(Type, Var, Cont)
Non-constant version with ability to erase current element, if container permits.
const string & GetProgramDisplayName(void) const
Get the application's "display" name.
#define NON_CONST_REVERSE_ITERATE(Type, Var, Cont)
Non constant version of REVERSE_ITERATE macro.
@ eRetriable_No
It makes no sense to retry the action.
@ eNegative
Value is negative.
@ eTakeOwnership
An object can take ownership of another.
void SetDatabaseName(const string &d)
#define DATABASE_DRIVER_ERROR(message, err_code)
static CDB_UserHandler & GetDefault(void)
static void ClearExceptions(TExceptions &expts)
deque< CDB_Exception * > TExceptions
Exception container type.
virtual EEncoding GetEncoding(void) const =0
virtual EServerType GetServerType(void) const =0
virtual string GetPassword(void) const =0
virtual Uint4 GetProtocolVersion(void) const =0
virtual Uint4 GetHost(void) const =0
virtual string GetServerName(void) const =0
virtual Uint2 GetPort(void) const =0
virtual string GetDatabaseName(void) const =0
virtual CRef< IConnValidator > GetConnValidator(void) const =0
virtual string GetUserName(void) const =0
virtual string GetParam(const string &key) const =0
Parameters, which are not listed above explicitly, should be retrieved via SetParam() method.
virtual bool Refresh()
Reset the connection to the "ready" state (cancel all active commands)
#define DIAG_COMPILE_INFO
Make compile time diagnostic information object to use in CNcbiDiag and CException.
#define ERR_POST_X(err_subcode, message)
Error posting with default error code and given error subcode.
#define ERR_POST(message)
Error posting with file, line number information but without error codes.
@ eDiag_Error
Error message.
#define NCBI_CATCH(message)
Catch CExceptions as well This macro is deprecated - use *_X or *_XX variant instead of it.
#define STD_CATCH_ALL(message)
Standard handling of "exception"-derived exceptions; catches non-standard exceptions and generates "u...
void Warning(CExceptionArgs_Base &args)
#define FORMAT(message)
Format message using iostreams library.
TObjectType * GetPointerOrNull(void) THROWS_NONE
Get pointer value.
@ eParam_NoThread
Do not use per-thread values.
uint32_t Uint4
4-byte (32-bit) unsigned integer
uint16_t Uint2
2-byte (16-bit) unsigned integer
virtual const string & Get(const string §ion, const string &name, TFlags flags=0) const
Get the parameter value.
virtual bool HasEntry(const string §ion, const string &name=kEmptyStr, TFlags flags=0) const
@ fCountCleared
Let explicitly cleared entries stand.
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
static bool StringToBool(const CTempString str)
Convert string to bool.
static int CompareNocase(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2)
Case-insensitive compare of a substring with another string.
static int StringToInt(const CTempString str, TStringToNumFlags flags=0, int base=10)
Convert string to int.
static double StringToDouble(const CTempStringEx str, TStringToNumFlags flags=0)
Convert string to double.
static TNumeric StringToNumeric(const CTempString str, TStringToNumFlags flags=0, int base=10)
Convert string to a numeric value.
static const string BoolToString(bool value)
Convert bool to string.
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.
static bool Equal(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2, ECase use_case=eCase)
Test for equality of a substring with another string.
@ eEncoding_ISO8859_1
Note: From the point of view of the C++.
#define DEFINE_STATIC_MUTEX(id)
Define static mutex and initialize it.
bool TryWait(unsigned int timeout_sec=0, unsigned int timeout_nsec=0)
Timed wait.
void Post(unsigned int count=1)
Increment the semaphore by "count".
CTime & Clear(void)
Make the time "empty",.
@ eCurrent
Use current time. See also CCurrentTime.
enum ENcbiOwnership EOwnership
Ownership relations between objects.
Definition of all error codes used in dbapi libraries (dbapi_driver.lib and others).
string ConvertN2A(Uint4 host)
static bool s_Matches(CConnection *conn, const string &pool_name, const string &server_name)
static void s_TransformLoginData(string &server_name, string &user_name, string &db_name, string &password)
double value_type
The numeric datatype used by the parser.
const struct ncbi::grid::netcache::search::fields::KEY key
const GenericPointer< typename T::ValueType > T2 value
CRef< CDBServer > TSvrRef
const char * NCBI_GetDefaultSybasePath(void)
Get default Sybase client installation path.
const char * NCBI_GetSybasePath(void)
Get Sybase client installation path.
Defines classes: CDirEntry, CFile, CDir, CSymLink, CMemoryFile, CFileUtil, CFileLock,...
Int4 delta(size_t dimension_, const Int4 *score_)
Defines NCBI C++ secure resources API.
static SLJIT_INLINE sljit_ins msg(sljit_gpr r, sljit_s32 d, sljit_gpr x, sljit_gpr b)
bool IsPoolIdleTimeSet(void)
string log_minor_messages
bool IsPoolMinSizeSet(void)
bool IsSingleServerSet(void)
bool IsPoolWaitTimeSet(void)
bool IsPoolMaxConnUseSet(void)
bool IsIOTimeoutSet(void)
bool IsPoolMaxSizeSet(void)
bool IsLogMinorMessagesSet(void)
string pool_allow_temp_overflow
bool IsContinueAfterRaiserrorSet(void)
bool IsPoolAllowTempOverflowSet(void)
bool IsCancelTimeoutSet(void)
string continue_after_raiserror
bool IsLoginTimeoutSet(void)
bool operator<(const SLoginData &right) const
SLoginData(const string &sn, const string &un, const string &dn, const string &pass)
void operator()(CDB_UserHandler::TExceptions &) const
void operator()(CDB_UserHandler::TExceptions &resource) const
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