40 #define NCBI_USE_ERRCODE_X Connect_Conn
43 #define CONNECTION_MAGIC 0xEFCDAB09
52 #define CONN_LOG_EX(subcode, func_name, level, message, status) \
54 const char* ststr = ((EIO_Status) status != eIO_Success \
55 ? IO_StatusStr((EIO_Status) status) \
57 const char* ctype = (conn && conn->meta.get_type \
58 ? conn->meta.get_type(conn->meta.c_get_type) \
60 char* descr = (conn && conn->meta.descr \
61 ? conn->meta.descr(conn->meta.c_descr) \
64 if ((EIO_Status) status == eIO_Timeout && timeout) { \
65 assert(timeout != kDefaultTimeout); \
66 sprintf(stbuf, "%s[%u.%06u]", ststr, \
67 timeout->usec / 1000000 + timeout->sec, \
68 timeout->usec % 1000000); \
69 assert(strlen(stbuf) < sizeof(stbuf)); \
72 CORE_LOGF_X(subcode, level, \
73 ("[CONN_" #func_name "(%s%s%s)] %s%s%s", \
74 ctype && *ctype ? ctype : "UNDEF", \
75 descr && *descr ? "; " : "", descr ? descr : "", \
77 ststr && *ststr ? ": " : "", \
78 ststr ? ststr : "")); \
83 #define CONN_LOG(s_c, f_n, lvl, msg) CONN_LOG_EX(s_c, f_n, lvl, msg, status)
86 # define CONN_CALLTRACE(func_name) \
88 static const STimeout* timeout = 0; \
90 sprintf(handle, "0x%p", conn); \
91 CONN_LOG_EX(0, func_name, eLOG_Trace, handle, 0); \
94 # define CONN_CALLTRACE(func_name)
101 #define CONN_NOT_NULL_EX(subcode, func_name, retval) \
103 CONN_CALLTRACE(func_name); \
105 static const STimeout* timeout = 0; \
106 CONN_LOG_EX(subcode, func_name, eLOG_Error, \
107 "NULL connection handle", retval); \
111 if (conn->magic != CONNECTION_MAGIC) { \
112 static const STimeout* timeout = 0
; \
113 CONN_LOG_EX(subcode, func_name, eLOG_Critical, \
114 "Corrupt connection handle", 0); \
120 #define CONN_NOT_NULL(s_c, f_n) CONN_NOT_NULL_EX(s_c, f_n, eIO_InvalidArg)
123 # define CONN_TRACE(f_n, msg) CONN_LOG(0, f_n, eLOG_Trace, msg)
125 # define CONN_TRACE(f_n, msg)
226 if (!(func =
conn->cb[idx].func))
228 data =
conn->cb[idx].data;
245 if (!
conn->meta.flush)
249 timeout =
conn->meta.default_timeout;
251 status =
conn->meta.flush(
conn->meta.c_flush, timeout);
253 conn->w_status = status;
277 status =
conn->meta.list
282 for (x_conn =
conn->meta.list; x_conn; x_conn = x_conn->
next) {
283 if (x_conn == connector) {
286 if (!x_conn->
next && x_conn ==
conn->meta.list)
295 if (
conn->meta.list) {
305 if (
conn->meta.close) {
308 ?
conn->meta.default_timeout
311 closed =
conn->meta.close(
conn->meta.c_close, timeout);
316 && (status != eIO_Closed || connector)) {
320 "Connection failed to close properly");
323 "Connection failed to close properly");
332 memset(&
conn->meta, 0,
sizeof(
conn->meta));
339 }
else if (!connector)
342 if (!x_conn && connector) {
362 switch (
conn->state) {
377 if (
conn->meta.open) {
385 ?
conn->meta.default_timeout
388 status =
conn->meta.open(
conn->meta.c_open, timeout);
409 return status == eIO_Closed ?
eIO_Unknown : status;
437 conn->magic = (
unsigned int)(-1);
480 !
conn->meta.get_type ? 0 :
conn->meta.get_type(
conn->meta.c_get_type);
489 !
conn->meta.descr ? 0 :
conn->meta.descr(
conn->meta.c_descr);
510 sprintf(errbuf,
"Unknown direction #%u", (
unsigned int) event);
532 if (&
conn->oo_timeout != timeout)
533 conn->oo_timeout = *timeout;
534 conn->o_timeout = &
conn->oo_timeout;
536 conn->o_timeout = timeout;
541 if (&
conn->rr_timeout != timeout)
542 conn->rr_timeout = *timeout;
543 conn->r_timeout = &
conn->rr_timeout;
545 conn->r_timeout = timeout;
551 if (&
conn->ww_timeout != timeout)
552 conn->ww_timeout = *timeout;
553 conn->w_timeout = &
conn->ww_timeout;
555 conn->w_timeout = timeout;
559 if (&
conn->cc_timeout != timeout)
560 conn->cc_timeout = *timeout;
561 conn->c_timeout = &
conn->cc_timeout;
563 conn->c_timeout = timeout;
566 sprintf(errbuf,
"Unknown event #%u", (
unsigned int) event);
587 timeout =
conn->o_timeout;
592 "ReadWrite timeout requested", 0);
595 timeout =
conn->r_timeout;
598 timeout =
conn->w_timeout;
601 timeout =
conn->c_timeout;
605 sprintf(errbuf,
"Unknown event #%u", (
unsigned int) event);
640 timeout =
conn->meta.default_timeout;
643 status =
conn->meta.wait
644 ?
conn->meta.wait(
conn->meta.c_wait, event, timeout)
648 static const char* kErrMsg[] = {
"Read event failed",
649 "Write event failed" };
655 else if (timeout->
sec | timeout->
usec)
689 if (!
conn->meta.write) {
701 ?
conn->meta.default_timeout
704 status =
conn->meta.write(
conn->meta.c_write, data,
size,
708 conn->w_status = status;
711 conn->w_pos += *n_written;
731 else if (!timeout || (timeout->
sec | timeout->
usec))
753 size_t x_written = 0;
755 size - *n_written, &x_written);
756 *n_written += x_written;
757 if (*n_written ==
size)
826 if (!
conn->meta.read)
850 ?
conn->meta.default_timeout
875 if (!
conn->meta.read) {
892 if (x_read && (*n_read ==
size || !peek)) {
896 buf = (
char*)
buf + x_read;
905 ?
conn->meta.default_timeout
912 conn->r_status = status;
916 conn->r_pos += x_read;
920 "Cannot save peek data", 0);
938 }
else if (
size && status != eIO_Closed) {
942 else if (!timeout || (timeout->
sec | timeout->
usec))
968 size - *n_read, &x_read, 0);
1051 if (!
size || !line) {
1068 char* x_buf =
size -
len <
sizeof(w) ? w : line +
len;
1080 char c = x_buf[
i++];
1099 static const STimeout* timeout = 0;
1101 "Cannot pushback extra data", 0);
1146 return conn->r_status;
1150 return conn->w_status;
1156 return conn->meta.status
1157 ?
conn->meta.status(
conn->meta.c_status, dir)
1174 return status == eIO_Closed ?
eIO_Success : status;
1189 static const STimeout* timeout = 0;
1191 sprintf(errbuf,
"Unknown callback type #%u", (
unsigned int)
type);
1198 if (newcb || oldcb) {
1201 conn->cb[idx] = *newcb;
1225 x_conn =
conn->meta.list;
1229 || ((
type = strrchr(
type,
'/')) != 0
static CS_CONNECTION * conn
int BUF_Write(BUF *pBuf, const void *data, size_t size)
int BUF_Pushback(BUF *pBuf, const void *data, size_t size)
size_t BUF_Read(BUF buf, void *data, size_t size)
size_t BUF_Peek(BUF buf, void *data, size_t size)
void BUF_Destroy(BUF buf)
unsigned int TCONN_Flags
bitwise OR of ECONN_Flag
EIO_Status CONN_SetFlags(CONN conn, TCONN_Flags flags)
Set connection processing flags.
ECONN_Callback
Set user callback function to be invoked upon an event specified by the callback type.
EIO_Status CONN_SetUserData(CONN conn, void *data)
Associate an arbitraty user data pointer with the connection.
EIO_Status CONN_ReadLine(CONN conn, char *line, size_t size, size_t *n_read)
Read up to "size" bytes from connection into a string buffer pointed to by "line".
EIO_Status CONN_CreateEx(CONNECTOR connector, TCONN_Flags flags, CONN *connection)
Create all data necessary to establish a new connection (merely bind it to the specified CONNECTOR).
EIO_Status CONN_Read(CONN conn, void *buf, size_t size, size_t *n_read, EIO_ReadMethod how)
FConnectorGetType get_type
EIO_Status CONN_Flush(CONN conn)
Explicitly flush connection from any pending data written by CONN_Write().
void * CONN_GetUserData(CONN conn)
Get current value of the user's data pointer last associated with the connection, or NULL (if CONN is...
EIO_Status CONN_SetCallback(CONN conn, ECONN_Callback type, const SCONN_Callback *newcb, SCONN_Callback *oldcb)
unsigned int TCONN_Callback
TNCBI_BigCount CONN_GetPosition(CONN conn, EIO_Event event)
Get read ("event" == eIO_Read) or write ("event" == eIO_Write) position within the connection.
EIO_Status CONN_Write(CONN conn, const void *data, size_t size, size_t *n_written, EIO_WriteMethod how)
CONNECTOR next
linked list
EIO_Status CONN_SetTimeout(CONN conn, EIO_Event event, const STimeout *timeout)
Specify timeout for the connection I/O, including "Connect" (aka "Open") and "Close".
char * CONN_Description(CONN conn)
Return a human-readable description of the connection as a character '\0'-terminated string.
EIO_Status CONN_Create(CONNECTOR connector, CONN *conn)
Same as CONN_CreateEx() called with 0 in the "flags" parameter.
EIO_Status CONN_ReInit(CONN conn, CONNECTOR connector)
Reinit using new "connector".
EIO_Status(* FCONN_Callback)(CONN conn, TCONN_Callback type, void *data)
EIO_Status CONN_Wait(CONN conn, EIO_Event event, const STimeout *timeout)
Block on the connection until it becomes available for either reading or writing (depending on "event...
EIO_Status METACONN_Remove(SMetaConnector *meta, CONNECTOR connector)
Delete given "connector" all its descendants (all connectors if "connector" is NULL) from the connect...
EIO_Status METACONN_Insert(SMetaConnector *meta, CONNECTOR connector)
Insert a connector in the beginning of the connection's list of connectors.
void * handle
data handle of the connector
SMetaConnector * meta
back link to original meta
const char * CONN_GetType(CONN conn)
Get verbal representation of connection type as a character string.
EIO_Status CONN_Close(CONN conn)
Close the connection and destroy all relevant internal data.
EIO_Status CONN_GetSOCK(CONN conn, SOCK *sock)
Get an underlying SOCK handle for connection that is implemented as a socket.
const STimeout * CONN_GetTimeout(CONN conn, EIO_Event event)
Retrieve current timeout, return NULL(kInfiniteTimeout) if it is infinite.
TCONN_Flags CONN_GetFlags(CONN conn)
Get connection processing flags currently in effect.
EIO_Status CONN_Status(CONN conn, EIO_Event dir)
Obtain status of the last I/O operation.
EIO_Status CONN_Pushback(CONN conn, const void *data, size_t size)
Push "size" bytes from the buffer "data" back into connection.
@ eCONN_OnFlush
About to be flushed (NB: == eIO_ReadWrite)
@ eCONN_OnWrite
Write to CONNECTOR is about to occur.
@ eCONN_OnTimeout
CONNECTOR I/O has timed out.
@ eCONN_OnClose
NB: CONN has been flushed prior to the call.
@ eCONN_OnRead
Read from CONNECTOR is about to occur.
@ eCONN_OnOpen
Call prior to open (NB: "conn" still closed)
@ fCONN_Untie
do not call flush method prior to reading
@ fCONN_Supplement
supplement I/O with extended return codes
void Read(CObjectIStream &in, TObjectPtr object, const CTypeRef &type)
void Write(CObjectOStream &out, TConstObjectPtr object, const CTypeRef &type)
ELOG_Level
Log severity level.
unsigned int usec
microseconds (modulo 1,000,000)
EIO_ReadMethod
I/O read method.
EIO_WriteMethod
I/O write method.
EIO_Event
I/O event (or direction).
uint64_t TNCBI_BigCount
Big unsigned integer for file size and position.
@ eIO_Timeout
timeout expired before any I/O succeeded
@ eIO_Interrupt
signal arrival prevented any I/O to succeed
@ eIO_NotSupported
operation is not supported or is not available
@ eIO_Success
everything is fine, no error occurred
@ eIO_Unknown
unknown I/O error (likely fatal but can retry)
@ eIO_InvalidArg
bad argument / parameter value(s) supplied
@ eIO_ReadPlain
read readily available data only, wait if none
@ eIO_ReadPeek
do eIO_ReadPlain but leave data in input queue
@ eIO_ReadPersist
read exactly as much as requested, w/waits
@ eIO_WritePlain
write as much as possible, report back how much
@ eIO_WritePersist
write exactly as much as specified, w/waits
@ eIO_ReadWrite
eIO_Read | eIO_Write (also, eCONN_OnFlush)
@ eIO_Open
also serves as no-event indicator in SOCK_Poll
@ eIO_Close
also serves as an error indicator in SOCK_Poll
unsigned int
A callback function used to compare two keys in a database.
if(yy_accept[yy_current_state])
const struct ncbi::grid::netcache::search::fields::SIZE size
int strcmp(const char *str1, const char *str2)
#define CONN_NOT_NULL(s_c, f_n)
static EIO_Status s_CONN_Read(CONN conn, void *buf, const size_t size, size_t *n_read, int peek)
static EIO_Status s_Open(CONN conn)
static EIO_Status s_CONN_WritePersist(CONN conn, const void *data, const size_t size, size_t *n_written)
static size_t x_CB2IDX(ECONN_Callback type)
static EIO_Status s_CONN_Write(CONN conn, const void *data, const size_t size, size_t *n_written)
#define CONN_LOG(s_c, f_n, lvl, msg)
static EIO_Status s_CONN_ReadPersist(CONN conn, void *buf, const size_t size, size_t *n_read)
#define CONN_LOG_EX(subcode, func_name, level, message, status)
#define CONN_NOT_NULL_EX(subcode, func_name, retval)
#define CONN_CALLTRACE(func_name)
#define CONN_TRACE(f_n, msg)
static EIO_Status x_Callback(CONN conn, ECONN_Callback type, unsigned int flag)
static EIO_Status x_Flush(CONN conn, const STimeout *timeout, int isflush)
static EIO_Status x_ReInit(CONN conn, CONNECTOR connector, int close)
struct SConnectionTag SConnection
static size_t x_size(const char *dst, size_t len, const char *ptr)
const char g_kNcbiSockNameAbbr[]
string ReadLine(CNcbiIstream &in)
const STimeout * c_timeout
SCONN_Callback cb[CONN_N_CALLBACKS+1]
const STimeout * o_timeout
const STimeout * w_timeout
const STimeout * r_timeout
voidp calloc(uInt items, uInt size)