conninfo->cvt_null_date_string = -1;
conninfo->autocommit_public = SQL_AUTOCOMMIT_ON;
conninfo->accessible_only = -1;
+ conninfo->ignore_round_trip_time = -1;
+ conninfo->disable_keepalive = -1;
conninfo->gssauth_use_gssapi = -1;
#ifdef _HANDLE_ENLIST_IN_DTC_
conninfo->xa_opt = -1;
CORR_VALCPY(cvt_null_date_string);
CORR_VALCPY(autocommit_public);
CORR_VALCPY(accessible_only);
+ CORR_VALCPY(ignore_round_trip_time);
+ CORR_VALCPY(disable_keepalive);
CORR_VALCPY(gssauth_use_gssapi);
CORR_VALCPY(extra_opts);
#ifdef _HANDLE_ENLIST_IN_DTC_
{
opts[cnt] = "gsslib"; vals[cnt++] = "gssapi";
}
+ if (ci->disable_keepalive)
+ {
+ opts[cnt] = "keepalives"; vals[cnt++] = "0";
+ }
}
else
{
static pgNAME decode(const UCHAR *in);
static pgNAME decode_or_remove_braces(const UCHAR *in);
-#define OVR_EXTRA_BITS (BIT_FORCEABBREVCONNSTR | BIT_FAKE_MSS | BIT_BDE_ENVIRONMENT | BIT_CVT_NULL_DATE | BIT_ACCESSIBLE_ONLY)
+#define OVR_EXTRA_BITS (BIT_FORCEABBREVCONNSTR | BIT_FAKE_MSS | BIT_BDE_ENVIRONMENT | BIT_CVT_NULL_DATE | BIT_ACCESSIBLE_ONLY | BIT_IGNORE_ROUND_TRIP_TIME | BIT_DISABLE_KEEPALIVE)
UInt4 getExtraOptions(const ConnInfo *ci)
{
UInt4 flag = ci->extra_opts & (~OVR_EXTRA_BITS);
if (ci->force_abbrev_connstr > 0)
flag |= BIT_FORCEABBREVCONNSTR;
+ else if (ci->force_abbrev_connstr == 0)
+ flag &= (~BIT_FORCEABBREVCONNSTR);
if (ci->fake_mss > 0)
flag |= BIT_FAKE_MSS;
+ else if (ci->fake_mss == 0)
+ flag &= (~BIT_FAKE_MSS);
if (ci->bde_environment > 0)
flag |= BIT_BDE_ENVIRONMENT;
+ else if (ci->bde_environment == 0)
+ flag &= (~BIT_BDE_ENVIRONMENT);
if (ci->cvt_null_date_string > 0)
flag |= BIT_CVT_NULL_DATE;
+ else if (ci->cvt_null_date_string == 0)
+ flag &= (~BIT_CVT_NULL_DATE);
if (ci->accessible_only > 0)
flag |= BIT_ACCESSIBLE_ONLY;
+ else if (ci->accessible_only == 0)
+ flag &= (~BIT_ACCESSIBLE_ONLY);
+ if (ci->ignore_round_trip_time > 0)
+ flag |= BIT_IGNORE_ROUND_TRIP_TIME;
+ else if (ci->ignore_round_trip_time == 0)
+ flag &= (~BIT_IGNORE_ROUND_TRIP_TIME);
+ if (ci->disable_keepalive > 0)
+ flag |= BIT_DISABLE_KEEPALIVE;
+ else if (ci->disable_keepalive == 0)
+ flag &= (~BIT_DISABLE_KEEPALIVE);
return flag;
}
ci->cvt_null_date_string = (0 != (flag & BIT_CVT_NULL_DATE));
if (overwrite || ci->accessible_only < 0)
ci->accessible_only = (0 != (flag & BIT_ACCESSIBLE_ONLY));
+ if (overwrite || ci->ignore_round_trip_time < 0)
+ ci->ignore_round_trip_time = (0 != (flag & BIT_IGNORE_ROUND_TRIP_TIME));
+ if (overwrite || ci->disable_keepalive < 0)
+ ci->disable_keepalive = (0 != (flag & BIT_DISABLE_KEEPALIVE));
return (ci->extra_opts = getExtraOptions(ci));
}
ci->cvt_null_date_string = TRUE;
if (0 != (aflag & BIT_ACCESSIBLE_ONLY))
ci->accessible_only = TRUE;
+ if (0 != (aflag & BIT_IGNORE_ROUND_TRIP_TIME))
+ ci->ignore_round_trip_time = TRUE;
+ if (0 != (aflag & BIT_DISABLE_KEEPALIVE))
+ ci->disable_keepalive = TRUE;
if (0 != (dflag & BIT_FORCEABBREVCONNSTR))
ci->force_abbrev_connstr = FALSE;
if (0 != (dflag & BIT_FAKE_MSS))
ci->cvt_null_date_string = FALSE;
if (0 != (dflag & BIT_ACCESSIBLE_ONLY))
ci->accessible_only = FALSE;
+ if (0 != (dflag & BIT_IGNORE_ROUND_TRIP_TIME))
+ ci->ignore_round_trip_time = FALSE;
+ if (0 != (dflag & BIT_DISABLE_KEEPALIVE))
+ ci->disable_keepalive = FALSE;
return (ci->extra_opts = getExtraOptions(ci));
}
ci->bde_environment = 0;
if (ci->cvt_null_date_string < 0)
ci->cvt_null_date_string = 0;
+ if (ci->accessible_only < 0)
+ ci->accessible_only = 0;
+ if (ci->ignore_round_trip_time < 0)
+ ci->ignore_round_trip_time = 0;
+ if (ci->disable_keepalive < 0)
+ ci->disable_keepalive = 0;
#ifdef _HANDLE_ENLIST_IN_DTC_
if (ci->xa_opt < 0)
ci->xa_opt = DEFAULT_XAOPT;
rv->buffer_read_in = 0;
if (conn)
+ {
rv->buffer_size = conn->connInfo.drivers.socket_buffersize;
+ rv->keepalive = !conn->connInfo.disable_keepalive;
+ }
else
+ {
rv->buffer_size = globals.socket_buffersize;
+ rv->keepalive = TRUE;
+ }
rv->buffer_in = (UCHAR *) malloc(rv->buffer_size);
if (!rv->buffer_in)
{
rest.ai_socktype = SOCK_STREAM;
rest.ai_family = AF_UNSPEC;
snprintf(portstr, sizeof(portstr), "%d", port);
+#ifdef AI_NUMERICSERV
rest.ai_flags |= AI_NUMERICSERV;
+#endif /* AI_NUMERICSERV */
if (is_numeric_address(hostname))
/* don't resolve address in getaddrinfo() if not necessary */
rest.ai_flags |= AI_NUMERICHOST;
}
}
#endif /* TCP_NODELAY */
+#ifdef SO_KEEPALIVE
+ if (family != AF_UNIX && self->keepalive)
+ {
+ int i;
+ socklen_t len;
+
+ i = 1;
+ len = sizeof(i);
+ if (setsockopt(self->socket, SOL_SOCKET, SO_KEEPALIVE, (char *) &i, len) < 0)
+ {
+ SOCK_set_error(self, SOCKET_COULD_NOT_CONNECT, "Could not set socket to SO_KEEPALIVE.");
+ goto cleanup;
+ }
+ }
+#endif /* SO_KEEPALIVE */
#ifdef WIN32
{
long ioctlsocket_ret = 1;