* output_buffer,
size_toutput_buffer_size)
80 while(output_buffer_size > 0) {
82output_buffer_size, &bytes_written);
88 if(output_buffer_size > 32) {
91message_start +=
" (TRUNCATED)";
93 CTempStringbuffer_head(output_buffer, output_buffer_size);
98 "Error writing message to the NetStorage server "<<
100 "Socket write error status: "<<
104 "Message begins with: "<< message_start);
107output_buffer += bytes_written;
108output_buffer_size -= bytes_written;
143 const char* output_buffer;
144 size_toutput_buffer_size;
163 const char* output_buffer;
164 size_toutput_buffer_size;
175 template<
classTContiguousContainer>
189 "I/O error while reading from NetStorage server "<<
209 code(builder.GetCode()),
210 message(builder.GetMessage()),
215 template<
classTOstream>
216TOstream&
Print(TOstream& os)
const 221 returnos <<
" ("<<
message<<
')';
252 return scope.AsString();
276 returnissue.
Print(diag);
281 returnissue.
Print(os);
322 const stringstatus = reply.
GetString(
"Status");
323 const boolstatus_ok = status ==
"OK";
327 if(!status_ok || issues) {
332listener.
OnError(issue, server);
338ostringstream errors;
343 const char* prefix =
"error ";
349errors << prefix << issue;
350prefix =
", error ";
354 stringerr_msg =
FORMAT(
"Error while executing "<<
356 "on NetStorage server "<<
358 "Server returned "<< errors.str());
366 "Message serial number mismatch " 368 "request: "<< request.
Repr() <<
"; " 369 "reply: "<< reply.
Repr() <<
").");
396 "Extra bytes past message end while reading from "<<
397server_address <<
" after receiving "<<
413storage_flags.
SetBoolean(
"Persistent",
true);
415storage_flags.
SetBoolean(
"NetCache",
true);
417storage_flags.
SetBoolean(
"FileTrack",
true);
419storage_flags.
SetBoolean(
"Movable",
true);
421storage_flags.
SetBoolean(
"Cacheable",
true);
423storage_flags.
SetBoolean(
"NoMetaData",
true);
425node.
SetByKey(
"StorageFlags", storage_flags);
468 " issued error "<< err_msg);
476 " issued warning "<< warn_msg);
519 m_ErrMode(netstorage_rpc->m_Config.err_mode),
539 bool Eof()
override;
541 void Close()
override;
542 void Abort()
override;
568 void Close()
override;
569 void Abort()
override;
584 const string& object_loc);
591 void Close()
override;
592 void Abort()
override;
595 bool Eof()
override;
598 string GetAttribute(
const string& attr_name)
const override;
599 void SetAttribute(
const string& attr_name,
const string& attr_value)
override;
638 TBuilderbuilder,
const string& object_loc) :
639m_NetStorageRPC(netstorage_rpc),
640m_OwnService(service),
642m_Context(netstorage_rpc, object_loc),
643m_IState(fsm, m_Context),
644m_OState(fsm, m_Context)
660 "Invalid default_storage value '"<<
value<<
'\'');
678 if(name ==
"domain")
680 else if(name ==
"default_storage")
681default_storage = GetDefaultStorage(
value);
682 else if(name ==
"metadata")
684 else if(name ==
"namespace")
686 else if(name ==
"nst")
688 else if(name ==
"nc")
690 else if(name ==
"cache")
692 else if(name ==
"client")
693client_name =
value;
694 else if(name ==
"err_mode")
695err_mode = GetErrMode(
value);
696 else if(name ==
"ticket")
698 else if(name ==
"hello_service")
699hello_service =
value;
704SNetStorage::SLimits::Check<SNetStorage::SLimits::SNamespace>(app_domain);
706 if(client_name.empty()) {
711&path, &client_name);
713path.erase(path.length() - 1);
716 if(!parent_dir.empty()) {
718client_name += parent_dir;
723 if(client_name.empty()) {
725 "Client name is required.");
728 switch(default_storage) {
737 if(service.empty()) {
739init_string <<
": 'nst=' parameter is required " 740 "when 'default_storage=nst'");
745 if(nc_service.empty()) {
747init_string <<
": 'nc=' parameter is required " 748 "when 'default_storage=nc'");
756 if(hello_service.empty()) hello_service = service;
761m_DefaultFlags(default_flags),
784registry_builder, sections);
789m_DefaultFlags(parent->m_DefaultFlags),
791m_Config(parent->m_Config),
792m_CompoundIDPool(parent->m_CompoundIDPool),
793m_NetCacheAPI(parent->m_NetCacheAPI),
794m_ServiceMap(parent->m_ServiceMap)
808 returnSNetStorageObjectImpl::CreateAndStart<SNetStorage_NetCacheBlob>(
813 "Object creation is disabled.");
821 const autoobject_loc = reply.GetString(
"ObjectLoc");
823 autobuilder = [
this](
const string&
r,
const string&
l) {
return MkObjectRequest(
r,
l); };
826 returnSNetStorageObjectImpl::CreateAndStart<SNetStorageObjectRPC>(starter,
this, service, builder, object_loc);
834 returnSNetStorageObjectImpl::Create<SNetStorage_NetCacheBlob>(
m_NetCacheAPI, object_loc);
837 autobuilder = [
this](
const string&
r,
const string&
l) {
return MkObjectRequest(
r,
l); };
839 returnSNetStorageObjectImpl::Create<SNetStorageObjectRPC>(
this, service, builder, object_loc);
859server->
TryExec(json_over_uttp_sender);
867 if(object_loc)
returnobject_loc.
AsString();
872 if(cb) cb(progress_info);
885 returnreply.GetBoolean(
"Exists");
900 const auto not_found= reply.GetByKeyOrNull(
"NotFound");
922server->
TryExec(json_over_uttp_sender);
926 if(pconn) *pconn =
conn;
935new_request.
SetString(
"Type", request_type);
954 if(!ncbi_context.empty()) {
955new_request.
SetString(
"ncbi_context", ncbi_context);
962 const string& object_loc)
const 966new_request.
SetString(
"ObjectLoc", object_loc);
978user_key.
SetString(
"UniqueID", unique_key);
979new_request.
SetByKey(
"UserKey", user_key);
1007 if(service_name.empty())
1048 "Extra bytes past confirmation message " 1057 size_t* bytes_read)
1065server->
TryExec(json_over_uttp_sender);
1077m_UTTPReader.Reset();
1078m_CurrentChunk =
nullptr;
1079m_CurrentChunkSize = 0;
1087}
while(!json_reader.
ReadMessage(m_UTTPReader));
1099 if(bytes_read) *bytes_read = 0;
1101 if(!m_CurrentChunkSize && m_EOF)
return eRW_Eof;
1106 while(!m_CurrentChunkSize) {
1107 switch(m_UTTPReader.GetNextEvent()) {
1110m_CurrentChunk = m_UTTPReader.GetChunkPart();
1111m_CurrentChunkSize = m_UTTPReader.GetChunkPartSize();
1124 "NetStorage API: invalid UTTP status " 1134 if(
autobytes_copied =
min(m_CurrentChunkSize, buf_size)) {
1135memcpy(buf_pos, m_CurrentChunk, bytes_copied);
1136m_CurrentChunk += bytes_copied;
1137m_CurrentChunkSize -= bytes_copied;
1139 if(bytes_read) *bytes_read = bytes_copied;
1152 returnm_CurrentChunkSize == 0 && m_EOF;
1156 size_t* bytes_written)
1163 return m_OState.Write(buf_pos, buf_size, bytes_written);
1169 const char* chunk =
reinterpret_cast<const char*
>(buf_pos);
1170 auto f= [&](
CUTTPWriter& w) { w.SendChunk(chunk, buf_size,
false); };
1173 if(bytes_written !=
NULL)
1174*bytes_written = buf_size;
1177 catch(exception&) {
1200 result.push_back((*it).AsString());
1217 const string& attr_value)
1263m_UTTPReader.Reset();
1312m_UTTPReader.Reset();
1345 "'domain' parameter is missing from the initialization string");
1353 autobuilder = [=](
const string&
r,
const string&) {
1354 returnrpc->MkObjectRequest(
r, unique_key,
flags);
1357 returnSNetStorageObjectImpl::Create<SNetStorageObjectRPC>(rpc, rpc->m_Service, builder,
kEmptyStr);
1377 returnm_Impl->m_NetStorageRPC->m_Service;
1382 returnm_Impl->m_NetStorageRPC->MkStdRequest(request_type);
1388 returnm_Impl->m_NetStorageRPC->Exchange(m_Impl->m_NetStorageRPC->m_Service,
1389request,
conn, server_to_use);
1399 returnm_Impl->m_NetStorageRPC->Open(object_loc);
CCompoundID FromString(const string &cid)
Unpack the base64-encoded ID and return a CCompoundID object for field extraction.
Base64-encoded ID string that contains extractable typed fields.
ECompoundIDClass GetClass() const
One of the registered ID classes.
Iterator for JSON arrays and objects.
string Repr(TReprFlags flags=0) const
Return a string representation of this node.
SJsonIteratorImpl * Iterate(EIterationMode mode=eNatural) const
For a container node (that is, either an array or an object), begin iteration over its elements.
void SetString(const string &key, const string &value)
Set a JSON object element to the specified string value.
Int8 GetInteger(const string &key) const
For a JSON object node, return the integer referred to by the specified key.
const string AsString() const
Provided that this is a string node, return the string value of this node.
string GetString(const string &key) const
For a JSON object node, return the string referred to by the specified key.
void SetBoolean(const string &key, bool value)
Set a JSON object element to the specified boolean value.
void SetInteger(const string &key, Int8 value)
Set a JSON object element to the specified integer value.
void SetByKey(const string &key, CJsonNode::TInstance value)
For a JSON object node, insert a new element or update an existing element.
static CJsonNode NewObjectNode()
Create a new JSON object node.
CJsonNode GetByKeyOrNull(const string &key) const
For a JSON object node, return the value associated with the specified key.
virtual void Exec(CNetServerConnection::TInstance conn_impl, const STimeout *timeout)
CNetServerConnection GetConnection() const
CNetServerConnection m_Connection
CJsonOverUTTPExecHandler(const CJsonNode &request)
const CJsonNode GetMessage() const
bool ReadMessage(CUTTPReader &reader)
bool WriteMessage(const CJsonNode &root_node)
void GetOutputBuffer(const char **output_buffer, size_t *output_buffer_size)
static CNcbiApplication * Instance(void)
Singleton method.
Client API for NetCache server.
CNetServiceIterator Iterate(EIterationMode mode=eSortByLoad)
CNetService Clone(const string &name)
CNetStorageAdmin GetServer(CNetServer::TInstance server)
CNetStorageObject Open(const string &object_loc)
CNetStorageAdmin(CNetStorage::TInstance netstorage_impl)
CJsonNode MkNetStorageRequest(const string &request_type)
CJsonNode ExchangeJson(const CJsonNode &request, CNetServer::TInstance server_to_use=NULL, CNetServerConnection *conn=NULL)
Exception class for use by CNetStorage, CNetStorageByKey, and CNetStorageObject.
Detailed information about a CNetStorage object.
string GetServiceName() const
Basic network-based data object I/O.
@ eNetStorageObjectExpired
@ eNetStorageObjectNotFound
INetServerConnectionListener * Clone() override
void OnErrorImpl(const string &err_msg, CNetServer &server) override
CNetStorageServerListener(const CJsonNode &hello, SNetStorage::SConfig::EErrMode err_mode)
const SNetStorage::SConfig::EErrMode m_ErrMode
void OnConnected(CNetServerConnection &connection) override
void OnWarningImpl(const string &warn_msg, CNetServer &server) override
Request context properties passed between tasks.
CJsonOverUTTPWriter m_JSONWriter
void x_SendOutputBuffer()
void SendMessage(const CJsonNode &message)
CSendJsonOverSocket(CSocket &sock)
CTempString implements a light-weight string on top of a storage buffer whose lifetime management is ...
CTimeout â Timeout interval.
Class for reading series of chunks sent by a CUTTPWriter instance as a stream of bytes.
EStreamParsingEvent GetNextEvent()
Parse the input buffer until a parsing event occurs.
char GetControlSymbol() const
Return the control symbol that has been just read.
@ eChunk
Notify that the last part of the chunk has been read.
@ eEndOfBuffer
Notify that the end of the input buffer has been reached.
@ eChunkPart
Notify that a part of a chunk has been read and can be fetched by a call to the GetChunkPart() method...
@ eControlSymbol
Notify that a control symbol has been read.
void SetNewBuffer(const char *buffer, size_t buffer_size)
Start processing of the next chunk of data.
Class that serializes series of chunks of data for sending over binary streams.
void GetOutputBuffer(const char **output_buffer, size_t *output_buffer_size)
Return data to be sent over the output stream and extend internal pointers to the next buffer.
bool NextOutputBuffer()
Proceed to the next output buffer.
void Reset(char *buffer, size_t buffer_size)
Initialize or reinitialize this object.
const_iterator end() const
iterator_bool insert(const value_type &val)
const_iterator find(const key_type &key) const
static CS_CONNECTION * conn
static const struct name_t names[]
const string & GetProgramExecutablePath(EFollowLinks follow_links=eIgnoreLinks) const
Get the application's executable path.
static CNcbiApplicationGuard InstanceGuard(void)
Singleton method.
void Set(TValue new_value) THROWS_NONE
Set atomic counter value.
TValue Add(int delta) THROWS_NONE
Atomically add value (=delta), and return new counter value.
string GetSessionID(void) const
Session ID.
#define DIAG_COMPILE_INFO
Make compile time diagnostic information object to use in CNcbiDiag and CException.
const string & GetNextSubHitID(CTempString prefix=CTempString())
Get current hit id appended with auto-incremented sub-hit id.
bool IsSetSessionID(void) const
static CRequestContext & GetRequestContext(void)
Shortcut to CDiagContextThreadData::GetThreadData().GetRequestContext()
string GetClientIP(void) const
Client IP/hostname.
bool IsSetClientIP(void) const
#define ERR_POST(message)
Error posting with file, line number information but without error codes.
@ eFormat_UrlEncoded
name=value pairs URL-encoded and separated with '&'
TErrCode GetErrCode(void) const
Get error code.
#define NCBI_THROW(exception_class, err_code, message)
Generic macro to throw an exception, given the exception class, error code and message string.
void Warning(CExceptionArgs_Base &args)
#define NCBI_THROW_FMT(exception_class, err_code, message)
The same as NCBI_THROW but with message processed as output to ostream.
virtual const char * GetErrCodeString(void) const
Get error code interpreted as text.
#define FORMAT(message)
Format message using iostreams library.
static char GetPathSeparator(void)
Get path separator symbol specific for the current platform.
static void SplitPath(const string &path, string *dir=0, string *base=0, string *ext=0)
Split a path string into its basic components.
#define nc_use_compound_id
Whether to return NetCache keys in CompoundID format.
static bool ParseBlobKey(const char *key_str, size_t key_len, CNetCacheKey *key_obj, CCompoundIDPool::TInstance id_pool=NULL)
Parse blob key string into a CNetCacheKey structure.
void SetCompoundIDPool(CCompoundIDPool::TInstance compound_id_pool)
void SetDefaultParameters(const CNamedParameterList *parameters)
Override defaults used by this object.
unsigned TNetStorageFlags
Bitwise OR of ENetStorageFlags.
function< void(CJsonNode)> TNetStorageProgressCb
Progress callback.
virtual const char * GetErrCodeString() const override
Get error code interpreted as text.
ENetStorageRemoveResult
Result returned by Remove() methods.
@ fNST_NoMetaData
Do not use NetStorage relational database to track ownership & changes.
@ fNST_Cacheable
Has no effect at the moment.
@ fNST_NetCache
Use NetCache as the primary storage.
@ fNST_FileTrack
Use FileTrack as the primary storage.
@ fNST_Movable
Allow the object to move between storages.
@ eNotSupported
Feature is not supported.
@ eServerError
NetStorage server error.
@ eUnknown
Unknown error.
@ eIOError
I/O error encountered while performing an op.
@ eExpired
Object has expired on server.
@ eInvalidArg
Caller passed invalid arguments to the API.
@ eNotExists
Illegal op applied to non-existent object.
@ eAuthError
Authentication error (e.g. no FileTrack API key)
@ eTimeout
Timeout encountered while performing an op.
@ eInterrupted
Operation has been interrupted.
@ eNSTRR_Removed
Object has been removed successfully.
@ eNSTRR_NotFound
Removing failed due to object not found.
int64_t Int8
8-byte (64-bit) signed integer
uint64_t Uint8
8-byte (64-bit) unsigned integer
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
EIO_Status Close(void)
Close socket.
void GetPeerAddress(unsigned int *host, unsigned short *port, ENH_ByteOrder byte_order) const
Get peer address.
EIO_Status Write(const void *buf, size_t size, size_t *n_written=0, EIO_WriteMethod how=eIO_WritePersist)
Write to socket.
EIO_Status Read(void *buf, size_t size, size_t *n_read=0, EIO_ReadMethod how=eIO_ReadPlain)
Read from socket.
ERW_Result
Result codes for I/O operations.
@ eRW_Eof
End of data, should be considered permanent.
@ eRW_Success
Everything is okay, I/O completed.
static string PrintableString(const CTempString str, TPrintableMode mode=fNewLine_Quote|fNonAscii_Passthru)
Get a printable version of the specified string.
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 bool EndsWith(const CTempString str, const CTempString end, ECase use_case=eCase)
Check if a string ends with a specified suffix value.
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.
CTimeSpan GetAsTimeSpan(void) const
Convert to CTimeSpan.
string AsString(const CTimeFormat &fmt=kEmptyStr) const
Transform time span to string.
bool IsFinite() const
Check if timeout holds a numeric value.
const char * IO_StatusStr(EIO_Status status)
Get the text form of an enum status value.
@ eIO_Interrupt
signal arrival prevented any I/O to succeed
@ eIO_Success
everything is fine, no error occurred
Definition of all error codes used in connect services library (xconnserv.lib and others).
The blob sat and sat key Both must be positive integers</td > n< td > Non empty string The interpretation of the blob id depends on a processor Cassandra n processor expects the following format
const GenericPointer< typename T::ValueType > T2 value
EVoid
To create a void (uninitialized) component instance.
@ eVoid
To create a void (uninitialized) instance of a component.
CNetStorageObjectInfo g_CreateNetStorageObjectInfo(const string &object_loc, ENetStorageObjectLocation location, const CNetStorageObjectLoc *object_loc_struct, Uint8 file_size, CJsonNode::TInstance storage_specific_info)
const CNcbiDiag & operator<<(const CNcbiDiag &diag, const SIssue &issue)
void s_ReadSocket(CSocket &sock, TContiguousContainer &buffer, CUTTPReader &uttp_reader)
CJsonNode s_ReadMessage(const CJsonNode &request, CNetServerConnection &conn, SNetStorage::SConfig::EErrMode err_mode, INetServerConnectionListener &listener)
void s_TrapErrors(const CJsonNode &request, const CJsonNode &reply, CNetServerConnection &conn, SNetStorage::SConfig::EErrMode err_mode, INetServerConnectionListener &listener)
#define WRITE_BUFFER_SIZE
#define NST_PROTOCOL_VERSION
void s_SetStorageFlags(CJsonNode &node, TNetStorageFlags flags)
void s_ThrowError(Int8 code, Int8 sub_code, const string &err_msg)
static void s_WriteToSocket(CSocket &sock, const char *output_buffer, size_t output_buffer_size)
void s_SendUTTP(CSocket &sock, function< void(CUTTPWriter &)> f)
#define END_OF_DATA_MARKER
double r(size_t dimension_, const Int4 *score_, const double *prob_, double theta_)
Defines CRequestContext class for NCBI C++ diagnostic API.
static SLJIT_INLINE sljit_ins l(sljit_gpr r, sljit_s32 d, sljit_gpr x, sljit_gpr b)
void OnError(const string &err_msg, CNetServer &server)
void OnWarning(const string &warn_msg, CNetServer &server)
void EnterState(INetStorageObjectState *state)
SConnReset(CNetServerConnection &c)
CNetServerConnection & conn
SBuilder(const CJsonNode &node)
string GetMessage() const
TOstream & Print(TOstream &os) const
static const Int8 kEmptySubCode
CRef< SNetServerInPool > m_ServerInPool
void TryExec(INetServerExecHandler &handler, const STimeout *timeout=NULL)
CRef< INetServerConnectionListener > m_Listener
static SNetServiceImpl * Create(const string &api_name, const string &service_name, const string &client_name, INetServerConnectionListener *listener, CSynRegistry ®istry, SRegSynonyms §ions, const string &ns_client_name=kEmptyStr)
CNetRef< SNetStorageRPC > m_NetStorageRPC
SNetStorageAdminImpl(CNetStorage::TInstance netstorage_impl)
CNetRef< SNetStorageRPC > m_NetStorageRPC
SNetStorageByKeyRPC(const TConfig &config, TNetStorageFlags default_flags)
SNetStorageObjectImpl * Open(const string &unique_key, TNetStorageFlags flags) override
CRef< INetServerConnectionListener > m_Listener
void TrapErrors(const CJsonNode &reply)
CJsonNode m_OriginalRequest
SContext(SNetStorageRPC *netstorage_rpc, const string &object_loc)
CNetServerConnection m_Connection
const SNetStorage::SConfig::EErrMode m_ErrMode
ERW_Result Read(void *buf, size_t count, size_t *read) override
Read as many as "count" bytes into a buffer pointed to by the "buf" argument.
vector< char > m_ReadBuffer
SIState(SContext &context)
const char * m_CurrentChunk
ERW_Result PendingCount(size_t *count) override
Via parameter "count" (which is guaranteed to be supplied non-NULL) return the number of bytes that a...
size_t m_CurrentChunkSize
string GetLoc() const override
string GetLoc() const override
ERW_Result Flush() override
Flush pending data (if any) down to the output device.
SOState(SContext &context)
ERW_Result Write(const void *buf, size_t count, size_t *written) override
Write up to "count" bytes from the buffer pointed to by the "buf" argument onto the output device.
void SetAttribute(const string &attr_name, const string &attr_value) override
list< string > GetAttributeList() const override
CJsonNode Exchange() const
void StartWriting(CJsonNode::TInstance request, CNetServerConnection::TInstance conn)
void MkRequest(const string &request_type) const
ENetStorageRemoveResult Remove() override
string GetAttribute(const string &attr_name) const override
CNetRef< SNetStorageRPC > m_NetStorageRPC
string GetLoc() const override
ERW_Result Flush() override
Flush pending data (if any) down to the output device.
void SetExpiration(const CTimeout &) override
SNetStorageObjectState< SIState > m_IState
SNetStorageObjectState< SOState > m_OState
string Relocate(TNetStorageFlags flags, TNetStorageProgressCb cb) override
CNetStorageObjectInfo GetInfo() override
SNetStorageObjectRPC(SNetStorageObjectImpl &fsm, SNetStorageRPC *netstorage_rpc, CNetService service, TBuilder builder, const string &object_loc)
ERW_Result Read(void *buf, size_t count, size_t *bytes_read) override
Read as many as "count" bytes into a buffer pointed to by the "buf" argument.
string FileTrack_Path() override
function< CJsonNode(const string &, const string &)> TBuilder
ERW_Result PendingCount(size_t *count) override
Via parameter "count" (which is guaranteed to be supplied non-NULL) return the number of bytes that a...
ERW_Result Write(const void *buf, size_t count, size_t *bytes_written) override
Write up to "count" bytes from the buffer pointed to by the "buf" argument onto the output device.
SNetStorageObjectImpl * Open(const string &object_loc) override
SNetStorageObjectImpl * Create(TNetStorageFlags flags) override
CJsonNode MkStdRequest(const string &request_type) const
TNetStorageFlags GetFlags(TNetStorageFlags flags) const
map< string, CNetService > m_ServiceMap
CNetService GetServiceIfLocator(const string &object_loc)
CNetCacheAPI m_NetCacheAPI
CCompoundIDPool m_CompoundIDPool
CJsonNode MkObjectRequest(const string &request_type, const string &object_loc) const
CJsonNode Exchange(CNetService service, const CJsonNode &request, CNetServerConnection *conn=NULL, CNetServer::TInstance server_to_use=NULL) const
EVoid x_InitNetCacheAPI()
CAtomicCounter m_RequestNumber
SNetStorageRPC(const TConfig &config, TNetStorageFlags default_flags)
static EErrMode GetErrMode(const string &)
void ParseArg(const string &, const string &)
static EDefaultStorage GetDefaultStorage(const string &)
void Validate(const string &)
EDefaultStorage default_storage
static SNetStorageImpl * CreateImpl(const SConfig &, TNetStorageFlags)
static SNetStorageByKeyImpl * CreateByKeyImpl(const SConfig &, TNetStorageFlags)
static CS_CONTEXT * context
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