}
inolog("new_format=%d\n", new_format);
- truncated = SOCK_get_string(sock, msgbuffer, sizeof(msgbuffer));
+ truncated = SOCK_get_string(sock, new_format ? msgbuffer : msgbuf, new_format ? sizeof(msgbuffer) : buflen);
if (new_format)
{
size_t msgl;
}
else
{
- strncpy(msgbuf, msgbuffer, buflen);
+ msg_truncated = truncated;
/* Remove a newline */
if (msgbuf[0] != '\0' && msgbuf[(int)strlen(msgbuf) - 1] == '\n')
msgbuf[(int)strlen(msgbuf) - 1] = '\0';
mylog("%s: 'E' - %s\n", comment, msgbuf);
qlog("ERROR from backend during %s: '%s'\n", comment, msgbuf);
- for (truncated = msg_truncated; truncated;)
+ while (truncated)
truncated = SOCK_get_string(sock, msgbuffer, sizeof(msgbuffer));
}
abort_opt = 0;
{
ConnInfo *ci = &(self->connInfo);
CSTR func = "CC_connect";
- char ret;
+ char ret, *saverr = NULL;
#ifndef NOT_USE_LIBPQ
BOOL call_libpq = FALSE;
#endif /* NOT_USE_LIBPQ */
inolog("CC_send_settings\n");
CC_send_settings(self);
+ if (CC_get_errornumber(self) > 0)
+ saverr = strdup(CC_get_errormsg(self));
CC_clear_error(self); /* clear any error */
CC_lookup_lo(self); /* a hack to get the oid of
our large object oid type */
{
CC_lookup_characterset(self);
if (CC_get_errornumber(self) > 0)
- return 0;
+ {
+ ret = 0;
+ goto cleanup;
+ }
#ifdef UNICODE_SUPPORT
if (CC_is_in_unicode_driver(self))
{
if (PG_VERSION_LT(self, 7.1))
{
CC_set_error(self, CONN_NOT_IMPLEMENTED_ERROR, "UTF-8 conversion isn't implemented before 7.1", func);
- return 0;
+ ret = 0;
+ goto cleanup;
}
if (self->original_client_encoding)
free(self->original_client_encoding);
else if (CC_is_in_unicode_driver(self))
{
CC_set_error(self, CONN_NOT_IMPLEMENTED_ERROR, "Unicode isn't supported before 6.4", func);
- return 0;
+ ret = 0;
+ goto cleanup;
}
#endif /* UNICODE_SUPPORT */
ci->updatable_cursors = DISALLOW_UPDATABLE_CURSORS;
&& 0 < ci->bde_environment)
self->unicode |= CONN_DISALLOW_WCHAR;
mylog("conn->unicode=%d\n", self->unicode);
+ ret = 1;
- mylog("%s: returning...\n", func);
+cleanup:
+ mylog("%s: returning...%d\n", func, ret);
+ if (NULL != saverr)
+ {
+ if (ret > 0 && CC_get_errornumber(self) <= 0)
+ CC_set_error(self, -1, saverr, func);
+ free(saverr);
+ }
- return 1;
+ return ret;
}
CC_set_errornumber(self, 0);
else if (retres)
{
- if ((!CC_get_errormsg(self) || !CC_get_errormsg(self)[0]))
+ if (NULL == CC_get_errormsg(self) ||
+ !CC_get_errormsg(self)[0])
CC_set_errormsg(self, QR_get_message(retres));
if (!self->sqlstate[0])
strcpy(self->sqlstate, retres->sqlstate);
if (strnicmp(value, MINFINITY_STRING, 9) == 0)
{
std_time.infinity = -1;
- std_time.m = 0;
- std_time.d = 0;
- std_time.y = 0;
+ std_time.m = 1;
+ std_time.d = 1;
+ // std_time.y = -4713;
+ std_time.y = -9999;
std_time.hh = 0;
std_time.mm = 0;
std_time.ss = 0;
case PG_TYPE_BPCHAR:
case PG_TYPE_VARCHAR:
case PG_TYPE_TEXT:
+ case PG_TYPE_XML:
case PG_TYPE_BPCHARARRAY:
case PG_TYPE_VARCHARARRAY:
case PG_TYPE_TEXTARRAY:
+ case PG_TYPE_XMLARRAY:
text_handling = TRUE;
break;
}
}
if (!req_bind)
{
+mylog("!!param_type=%d\n", param_sqltype);
switch (param_sqltype)
{
case SQL_INTEGER:
case SQL_CHAR:
case SQL_VARCHAR:
case SQL_LONGVARCHAR:
+ case SQL_BINARY:
case SQL_VARBINARY:
case SQL_LONGVARBINARY:
#ifdef UNICODE_SUPPORT
case SQL_WVARCHAR:
case SQL_WLONGVARCHAR:
#endif /* UNICODE_SUPPORT */
+mylog("buf=%p flag=%d\n", buf, qb->flags);
if (buf && (qb->flags & FLGB_LITERAL_EXTENSION) != 0)
{
CVT_APPEND_CHAR(qb, LITERAL_EXT);
static void encode(const UCHAR *in, UCHAR *out);
static void decode(const UCHAR *in, UCHAR *out);
+#define OVR_EXTRA_BITS (BIT_FORCEABBREVCONNSTR | BIT_FAKE_MSS | BIT_BDE_ENVIRONMENT | BIT_CVT_NULL_DATE | BIT_ACCESSIBLE_ONLY)
UInt4 getExtraOptions(const ConnInfo *ci)
{
- UInt4 flag = 0;
+ UInt4 flag = ci->extra_opts & (~OVR_EXTRA_BITS);
- if (ci->force_abbrev_connstr)
+ if (ci->force_abbrev_connstr > 0)
flag |= BIT_FORCEABBREVCONNSTR;
- if (ci->fake_mss)
+ if (ci->fake_mss > 0)
flag |= BIT_FAKE_MSS;
- if (ci->bde_environment)
+ if (ci->bde_environment > 0)
flag |= BIT_BDE_ENVIRONMENT;
- if (ci->cvt_null_date_string)
+ if (ci->cvt_null_date_string > 0)
flag |= BIT_CVT_NULL_DATE;
+ if (ci->accessible_only > 0)
+ flag |= BIT_ACCESSIBLE_ONLY;
return flag;
}
CSTR octal_format = "%o";
static UInt4 replaceExtraOptions(ConnInfo *ci, UInt4 flag, BOOL overwrite)
{
+ if (overwrite)
+ ci->extra_opts = flag;
+ else
+ ci->extra_opts |= (flag & ~(OVR_EXTRA_BITS));
if (overwrite || ci->force_abbrev_connstr < 0)
ci->force_abbrev_connstr = (0 != (flag & BIT_FORCEABBREVCONNSTR));
if (overwrite || ci->fake_mss < 0)
ci->bde_environment = (0 != (flag & BIT_BDE_ENVIRONMENT));
if (overwrite || ci->cvt_null_date_string < 0)
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));
- return getExtraOptions(ci);
+ return (ci->extra_opts = getExtraOptions(ci));
}
BOOL setExtraOptions(ConnInfo *ci, const char *optstr, const char *format)
{
}
UInt4 add_removeExtraOptions(ConnInfo *ci, UInt4 aflag, UInt4 dflag)
{
+ ci->extra_opts |= aflag;
+ ci->extra_opts &= (~dflag);
if (0 != (aflag & BIT_FORCEABBREVCONNSTR))
ci->force_abbrev_connstr = TRUE;
if (0 != (aflag & BIT_FAKE_MSS))
ci->bde_environment = TRUE;
if (0 != (aflag & BIT_CVT_NULL_DATE))
ci->cvt_null_date_string = TRUE;
+ if (0 != (aflag & BIT_ACCESSIBLE_ONLY))
+ ci->accessible_only = TRUE;
if (0 != (dflag & BIT_FORCEABBREVCONNSTR))
ci->force_abbrev_connstr = FALSE;
if (0 != (dflag & BIT_FAKE_MSS))
ci->fake_mss =FALSE;
if (0 != (dflag & BIT_CVT_NULL_DATE))
ci->cvt_null_date_string = FALSE;
+ if (0 != (dflag & BIT_ACCESSIBLE_ONLY))
+ ci->accessible_only = FALSE;
- return getExtraOptions(ci);
+ return (ci->extra_opts = getExtraOptions(ci));
}
void
#define BIT_FAKE_MSS (1L << 1)
#define BIT_BDE_ENVIRONMENT (1L << 2)
#define BIT_CVT_NULL_DATE (1L << 3)
+#define BIT_ACCESSIBLE_ONLY (1L << 4)
+#define BIT_IGNORE_ROUND_TRIP_TIME (1L << 5)
/* Connection Defaults */
#define DEFAULT_PORT "5432"
mylog("checking libpq library\n");
/* First search the driver's folder */
-#ifdef NOT_USE_LIBPQ
+#ifndef NOT_USE_LIBPQ
if (NULL == (hmodule = MODULE_load_from_psqlodbc_path(libpq)))
/* Second try the PATH ordinarily */
hmodule = LoadLibrary(libpq);
#endif /* NOT_USE_LIBPQ */
#ifdef USE_SSPI
if (NULL == hmodule)
+ {
hmodule = LoadLibrary("secur32.dll");
- mylog("secur32 hmodule=%p\n", hmodule);
+ mylog("secur32 hmodule=%p\n", hmodule);
+ }
#endif /* USE_SSPI */
if (hmodule)
FreeLibrary(hmodule);
{
char msg[256];
- snprintf(msg, sizeof(msg), "would handle the encoding '%s' like ASCII", tencstr);
+ snprintf(msg, sizeof(msg), "would handle the encoding '%s' like ASCII", tencstr);
CC_set_error(self, CONN_OPTION_VALUE_CHANGED, msg, func);
}
}
PG_VERSION_LE(conn, 7.0))
retval = SQL_ERROR;
break;
+ case SQL_TXN_REPEATABLE_READ:
+ if (PG_VERSION_LT(conn, 8.0))
+ retval = SQL_ERROR;
+ break;
case SQL_TXN_READ_COMMITTED:
if (PG_VERSION_LT(conn, 6.5))
retval = SQL_ERROR;
break;
+ case SQL_TXN_READ_UNCOMMITTED:
+ if (PG_VERSION_LT(conn, 8.0))
+ retval = SQL_ERROR;
+ break;
default:
retval = SQL_ERROR;
}
char *query;
QResultClass *res;
- if (vParam == SQL_TXN_SERIALIZABLE)
- query = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE";
- else
- query = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED";
+ switch (vParam)
+ {
+ case SQL_TXN_SERIALIZABLE:
+ query = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE";
+ break;
+ case SQL_TXN_REPEATABLE_READ:
+ query = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL REPEATABLE READ";
+ break;
+ case SQL_TXN_READ_UNCOMMITTED:
+ query = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ UNCOMMITTED";
+ break;
+ default:
+ query = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED";
+ break;
+ }
res = CC_send_query(conn, query, NULL, 0, NULL);
if (!QR_command_maybe_successful(res))
retval = SQL_ERROR;
return SQL_FLOAT;
case PG_TYPE_BOOL:
return ci->drivers.bools_as_char ? SQL_CHAR : SQL_BIT;
-
+ case PG_TYPE_XML:
+ return CC_is_in_unicode_driver(conn) ? SQL_WLONGVARCHAR : SQL_LONGVARCHAR;
default:
/*
#define PG_TYPE_CID 29
#define PG_TYPE_OIDVECTOR 30
#define PG_TYPE_SET 32
+#define PG_TYPE_XML 142
+#define PG_TYPE_XMLARRAY 143
#define PG_TYPE_CHAR2 409
#define PG_TYPE_CHAR4 410
#define PG_TYPE_CHAR8 411
}
+#include "dlg_specific.h"
RETCODE
SC_execute(StatementClass *self)
{
sprintf(fetch, "%s " FORMAT_LEN " in \"%s\"", fetch_cmd, qi.row_size, SC_cursor_name(self));
qryi = &qi;
appendq = fetch;
-#ifdef NOT_USED
if (0 != (ci->extra_opts & BIT_IGNORE_ROUND_TRIP_TIME))
qflag |= IGNORE_ROUND_TRIP;
-#endif /* NOT_USED */
}
res = CC_send_query_append(conn, self->stmt_with_params, qryi, qflag, SC_get_ancestor(self), appendq);
if (SC_is_fetchcursor(self) && QR_command_maybe_successful(res))
#define POSTGRESDRIVERVERSION "08.02.0501"
#define POSTGRES_RESOURCE_VERSION "08.02.0501\0"
#define PG_DRVFILE_VERSION 8,2,05,01
-#define PG_BUILD_VERSION "200711030001"
+#define PG_BUILD_VERSION "200712180001"
#endif