1.Improve the handling of connection error messages.
2.Add an option to convert empty strings to NULL.
3.Handle domain type as the basetype.
4.Fake MSS in case of not only SQLExecute but also SQLParamData.
5.Prevent SQLColumns from displaying system columns.
6.Unload delayLoaded libraries on dll detach (not on disconnect time).
7.Fix a SQLGetDiagField crash bug.
8.Fix a insertion count bug.
9.Take win98 cases into account a little.
}
+#if (ODBCVER < 0x0300)
/* Sets multiple values (arrays) for the set of parameter markers. */
RETCODE SQL_API
PGAPI_ParamOptions(
CSTR func = "PGAPI_ParamOptions";
StatementClass *stmt = (StatementClass *) hstmt;
APDFields *apdopts;
+ IPDFields *ipdopts;
mylog("%s: entering... %d %x\n", func, crow, pirow);
apdopts = SC_get_APDF(stmt);
apdopts->paramset_size = crow;
- SC_get_IPDF(stmt)->param_processed_ptr = pirow;
+ ipdopts = SC_get_IPDF(stmt);
+ ipdopts->param_processed_ptr = pirow;
return SQL_SUCCESS;
}
+#endif /* ODBCVER */
/*
{
const char *sptr, *tag = NULL;
ConnectionClass *conn = SC_get_conn(stmt);
- size_t taglen;
- char tchar, bchar, escape_in_literal;
+ size_t taglen = 0;
+ char tchar, bchar, escape_in_literal = '\0';
char in_literal = FALSE, in_identifier = FALSE,
in_dollar_quote = FALSE, in_escape = FALSE,
multi = FALSE, del_found = FALSE;
in_dollar_quote = TRUE;
tag = sptr;
taglen = 0;
- if (dollar_next = strchr(sptr + 1, dollar_quote))
+ if (dollar_next = strchr(sptr + 1, dollar_quote), NULL != dollar_next)
{
taglen = dollar_next - sptr + 1;
sptr = dollar_next;
}
+static void
+CC_globals_init(GLOBAL_VALUES *globs)
+{
+ memset(globs, 0, sizeof(GLOBAL_VALUES));
+ globs->fetch_max = -1001;
+ globs->socket_buffersize = -1001;
+ globs->unknown_sizes = -1;
+ globs->max_varchar_size = -1001;
+ globs->max_longvarchar_size = -1001;
+
+ globs->debug = -1;
+ globs->commlog = -1;
+ globs->disable_optimizer = -1;
+ globs->ksqo = -1;
+ globs->unique_index = -1;
+ globs->onlyread = -1;
+ globs->use_declarefetch = -1;
+ globs->text_as_longvarchar = -1;
+ globs->unknowns_as_longvarchar = -1;
+ globs->bools_as_char = -1;
+ globs->lie = -1;
+ globs->parse = -1;
+ globs->cancel_as_freestmt = -1;
+}
+
void
CC_conninfo_init(ConnInfo *conninfo)
{
#endif /* _HANDLE_ENLIST_IN_DTC_ */
memcpy(&(conninfo->drivers), &globals, sizeof(globals));
}
+
+#ifdef WIN32
+extern int platformId;
+#endif /* WIN32 */
/*
* IMPLEMENTATION CONNECTION CLASS
*/
// rv->DataSourceToDriver = NULL;
// rv->DriverToDataSource = NULL;
rv->driver_version = ODBCVER;
+#ifdef WIN32
+ if (VER_PLATFORM_WIN32_WINDOWS == platformId && rv->driver_version > 0x0300)
+ rv->driver_version = 0x0300;
+#endif /* WIN32 */
// memset(rv->pg_version, 0, sizeof(rv->pg_version));
// rv->pg_version_number = .0;
// rv->pg_version_major = 0;
char *pwd1 = NULL, *pwd2 = NULL;
ConnInfo *ci = &(self->connInfo);
SocketClass *sock = self->sock;
+ size_t md5len;
-inolog("md5 pwd=%s user=%s\n", ci->password, ci->username);
+inolog("md5 pwd=%s user=%s salt=%02x%02x%02x%02x%02x\n", ci->password, ci->username, (UCHAR)salt[0], (UCHAR)salt[1], (UCHAR)salt[2], (UCHAR)salt[3], (UCHAR)salt[4]);
if (!(pwd1 = malloc(MD5_PASSWD_LEN + 1)))
return 1;
if (!EncryptMD5(ci->password, ci->username, strlen(ci->username), pwd1))
free(pwd1);
if (PROTOCOL_74(&(self->connInfo)))
{
-inolog("putting p\n");
+inolog("putting p and %s\n", pwd2);
SOCK_put_char(sock, 'p');
}
- SOCK_put_int(sock, (Int4) (4 + strlen(pwd2) + 1), 4);
- SOCK_put_n_char(sock, pwd2, (Int4) strlen(pwd2) + 1);
+ md5len = strlen(pwd2);
+ SOCK_put_int(sock, (Int4) (4 + md5len + 1), 4);
+ SOCK_put_n_char(sock, pwd2, (Int4) (md5len + 1));
SOCK_flush_output(sock);
+inolog("sockerr=%d\n", SOCK_get_errcode(sock));
free(pwd2);
return 0;
}
int
EatReadyForQuery(ConnectionClass *conn)
{
- int id;
+ int id = 0;
if (PROTOCOL_74(&(conn->connInfo)))
{
static int protocol3_opts_array(ConnectionClass *self, const char *opts[][2], BOOL libpqopt, int dim_opts)
{
- SocketClass *sock = self->sock;
ConnInfo *ci = &(self->connInfo);
const char *enc = NULL;
int cnt;
- BOOL set_client_encode = FALSE;
cnt = 0;
if (libpqopt && ci->server[0])
{
CSTR func = "protocol3_packet_build";
SocketClass *sock = self->sock;
- ConnInfo *ci = &(self->connInfo);
size_t slen;
char *packet, *ppacket;
ProtocolVersion pversion;
- const char *opts[20][2], *enc = NULL;
+ const char *opts[20][2];
int cnt, i;
- BOOL set_client_encode = FALSE;
cnt = protocol3_opts_array(self, opts, FALSE, sizeof(opts) / sizeof(opts[0]));
static char *protocol3_opts_build(ConnectionClass *self)
{
CSTR func = "protocol3_opts_build";
- ConnInfo *ci = &(self->connInfo);
size_t slen;
char *conninfo, *ppacket;
const char *opts[20][2];
char tmout[16];
slen += (strlen(l_login_timeout) + 2 + 2);
- snprintf(tmout, sizeof(tmout), "%d", self->login_timeout);
+ snprintf(tmout, sizeof(tmout), "%lu", self->login_timeout);
slen += strlen(tmout);
}
slen++;
{
sprintf(ppacket, " %s=", l_login_timeout);
ppacket += (strlen(l_login_timeout) + 2);
- sprintf(ppacket, "%d", self->login_timeout);
+ sprintf(ppacket, "%lu", self->login_timeout);
ppacket = strchr(ppacket, '\0');
}
*ppacket = '\0';
static char
LIBPQ_CC_connect(ConnectionClass *self, char password_req, char *salt_para)
{
- ConnInfo *ci = &(self->connInfo);
int ret;
CSTR func = "LIBPQ_CC_connect";
mylog("%s: entering...\n", func);
if (password_req != AUTH_REQ_OK)
-
+ {
sock = self->sock; /* already connected, just authenticate */
-
+ CC_clear_error(self);
+ }
else
{
if (0 == CC_initial_log(self, func))
do
{
if (password_req != AUTH_REQ_OK)
+ {
beresp = 'R';
+ startPacketReceived = TRUE;
+ }
else
{
beresp = SOCK_get_id(sock);
if (salt_para)
memcpy(salt, salt_para, sizeof(salt));
password_req = AUTH_REQ_OK;
+ mylog("salt=%02x%02x%02x%02x%02x\n", (UCHAR)salt[0], (UCHAR)salt[1], (UCHAR)salt[2], (UCHAR)salt[3], (UCHAR)salt[4]);
}
else
{
areq = SOCK_get_int(sock, 4);
+ memset(salt, 0, sizeof(salt));
if (areq == AUTH_REQ_MD5)
SOCK_get_n_char(sock, salt, 4);
else if (areq == AUTH_REQ_CRYPT)
SOCK_get_n_char(sock, salt, 2);
- mylog("areq = %d\n", areq);
+ mylog("areq = %d salt=%02x%02x%02x%02x%02x\n", areq, (UCHAR)salt[0], (UCHAR)salt[1], (UCHAR)salt[2], (UCHAR)salt[3], (UCHAR)salt[4]);
}
switch (areq)
{
char ret;
// char *encoding;
// BOOL startPacketReceived = FALSE;
- BOOL usessl = TRUE;
mylog("%s: entering...\n", func);
{
ConnInfo *ci = &(self->connInfo);
-/* QResultClass *res; */
HSTMT hstmt;
StatementClass *stmt;
RETCODE result;
char status = TRUE;
-#ifdef HAVE_STRTOK_R
- char *last;
-#endif /* HAVE_STRTOK_R */
CSTR func = "CC_setenv";
if (conn->connInfo.cvt_null_date_string > 0 &&
PG_TYPE_DATE == field_type &&
(SQL_C_CHAR == fCType ||
- SQL_C_WCHAR == fCType))
+ SQL_C_TYPE_DATE == fCType ||
+ SQL_C_DEFAULT == fCType))
{
+ if (pcbValueBindRow)
+ *((SQLLEN *) pcbValueBindRow) = 0;
switch (fCType)
{
case SQL_C_CHAR:
else
result = COPY_RESULT_TRUNCATED;
break;
+ case SQL_C_TYPE_DATE:
+ case SQL_C_DEFAULT:
+ if (rgbValueBindRow && cbValueMax >= sizeof(DATE_STRUCT))
+ {
+ memset(rgbValueBindRow, 0, cbValueMax);
+ if (pcbValueBindRow)
+ *((SQLLEN *) pcbValueBindRow) = sizeof(DATE_STRUCT);
+ }
+ else
+ result = COPY_RESULT_TRUNCATED;
+ break;
+#ifdef UNICODE_SUPPORT
case SQL_C_WCHAR:
if (rgbValueBindRow && cbValueMax >= WCLEN)
- memcpy(rgbValueBindRow, 0, WCLEN);
+ memset(rgbValueBindRow, 0, WCLEN);
else
result = COPY_RESULT_TRUNCATED;
break;
+#endif /* UNICODE_SUPPORT */
}
- if (pcbValueBindRow)
- *((SQLLEN *) pcbValueBindRow) = 0;
return result;
}
/*
#ifdef UNICODE_SUPPORT
if (fCType == SQL_C_WCHAR)
{
- len = utf8_to_ucs2_lf(neut_str, -1, lf_conv, NULL, 0);
+ len = utf8_to_ucs2_lf(neut_str, SQL_NTS, lf_conv, NULL, 0);
len *= WCLEN;
changed = TRUE;
}
#ifdef WIN_UNICODE_SUPPORT
if (localize_needed)
{
- wstrlen = utf8_to_ucs2_lf(neut_str, -1, lf_conv, NULL, 0);
+ wstrlen = utf8_to_ucs2_lf(neut_str, SQL_NTS, lf_conv, NULL, 0);
allocbuf = (SQLWCHAR *) malloc(WCLEN * (wstrlen + 1));
- wstrlen = utf8_to_ucs2_lf(neut_str, -1, lf_conv, allocbuf, wstrlen + 1);
+ wstrlen = utf8_to_ucs2_lf(neut_str, SQL_NTS, lf_conv, allocbuf, wstrlen + 1);
len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR) allocbuf, (int) wstrlen, NULL, 0, NULL, NULL);
changed = TRUE;
}
#ifdef UNICODE_SUPPORT
if (fCType == SQL_C_WCHAR)
{
- utf8_to_ucs2_lf(neut_str, -1, lf_conv, (SQLWCHAR *) pgdc->ttlbuf, len / WCLEN);
+ utf8_to_ucs2_lf(neut_str, SQL_NTS, lf_conv, (SQLWCHAR *) pgdc->ttlbuf, len / WCLEN);
}
else
#endif /* UNICODE_SUPPORT */
new_statement = qb->query_statement;
qb->flags |= FLGB_BUILDING_PREPARE_STATEMENT;
- sprintf(plan_name, "_PLAN%0x", stmt);
+ sprintf(plan_name, "_PLAN%p", stmt);
sprintf(new_statement, "PREPARE \"%s\"", plan_name);
qb->npos = strlen(new_statement);
marker_count = stmt->num_params - qb->num_discard_params;
#define return DONT_CALL_RETURN_FROM_HERE???
ENTER_INNER_CONN_CS(conn, func_cs_count);
if (NAMED_PARSE_REQUEST == SC_get_prepare_method(stmt))
- sprintf(plan_name, "_PLAN%0x", stmt);
+ sprintf(plan_name, "_PLAN%p", stmt);
else
strcpy(plan_name, NULL_STRING);
qp->in_dollar_quote = TRUE;
qp->dollar_tag = F_OldPtr(qp);
qp->taglen = 1;
- if (next_dollar = (strchr(F_OldPtr(qp) + 1, dollar_quote)))
+ if (next_dollar = strchr(F_OldPtr(qp) + 1, dollar_quote), NULL != next_dollar)
{
qp->taglen = next_dollar - F_OldPtr(qp) + 1;
CVT_APPEND_DATA(qb, F_OldPtr(qp), qp->taglen);
OID lobj_oid;
int lobj_fd, retval;
SQLULEN offset = apdopts->param_offset_ptr ? *apdopts->param_offset_ptr : 0;
- size_t current_row = qb->current_row, npos;
+ size_t current_row = qb->current_row, npos = 0;
BOOL handling_large_object = FALSE, req_bind, add_quote = FALSE;
ParameterInfoClass *apara;
ParameterImplClass *ipara;
case SQL_C_SLONG:
case SQL_C_LONG:
- sprintf(param_string, "%d",
+ sprintf(param_string, "%ld",
*((SQLINTEGER *) buffer));
break;
break;
case SQL_C_ULONG:
- sprintf(param_string, "%u",
- *((UDWORD *) buffer));
+ sprintf(param_string, "%lu",
+ *((SQLUINTEGER *) buffer));
break;
case SQL_C_USHORT:
*
* Comments: See "notice.txt" for copyright and license information.
*
- * $Id: descriptor.h,v 1.18 2006/09/11 16:28:02 hinoue Exp $
+ * $Id: descriptor.h,v 1.19 2006/10/13 13:13:31 hinoue Exp $
*
*/
int decimal_digits; /* scale in 2.x */
int display_size;
SQLLEN length;
- OID type;
+ OID columntype;
+ OID basetype;
char expr;
char quote;
char dquote;
void FI_Constructor(FIELD_INFO *, BOOL reuse);
void FI_Destructor(FIELD_INFO **, int, BOOL freeFI);
#define FI_is_applicable(fi) (NULL != fi && (fi->flag & (FIELD_PARSED_OK | FIELD_COL_ATTRIBUTE)) != 0)
+#define FI_type(fi) (0 == (fi)->basetype ? (fi)->columntype : (fi)->basetype)
typedef struct DescriptorHeader_
{
struct IPDFields_
{
+#if (ODBCVER >= 0x0300)
SQLUINTEGER *param_processed_ptr;
- SQLUSMALLINT *param_status_ptr;
- ParameterImplClass *parameters;
+#else
+ SQLULEN *param_processed_ptr; /* SQLParamOptions */
+#endif /* ODBCVER */
+ SQLUSMALLINT *param_status_ptr;
SQLSMALLINT allocated;
+ ParameterImplClass *parameters;
};
typedef struct
ABBR_MAXLONGVARCHARSIZE "=%d;"
INI_INT8AS "=%d;"
ABBR_EXTRASYSTABLEPREFIXES "=%s;"
- INI_ABBREVIATE "=%02x%lx",
+ INI_ABBREVIATE "=%02x%x",
encoded_conn_settings,
ci->drivers.fetch_max,
ci->drivers.socket_buffersize,
hlen = strlen(connect_string);
nlen = MAX_CONNECT_STRING - hlen;
olen = snprintf(&connect_string[hlen], nlen, ";"
- INI_EXTRAOPTIONS "=%lx;",
+ INI_EXTRAOPTIONS "=%x;",
flag);
}
}
if (strlen(value) < 2)
{
count = 3;
- sscanf(value, "%lx", &flag);
+ sscanf(value, "%x", &flag);
}
else
{
memcpy(cnt, value, 2);
cnt[2] = '\0';
sscanf(cnt, "%x", &count);
- sscanf(value + 2, "%lx", &flag);
+ sscanf(value + 2, "%x", &flag);
}
ci->disallow_premature = (char)((flag & BIT_DISALLOWPREMATURE) != 0);
ci->allow_keyset = (char)((flag & BIT_UPDATABLECURSORS) != 0);
{
char *ptr;
SQLGetPrivateProfileString(DSN, INI_PROTOCOL, "", ci->protocol, sizeof(ci->protocol), ODBC_INI);
- if (ptr = strchr(ci->protocol, '-'))
+ if (ptr = strchr(ci->protocol, '-'), NULL != ptr)
{
*ptr = '\0';
if (overwrite || ci->rollback_on_error < 0)
INI_INT8AS,
temp,
ODBC_INI);
- sprintf(temp, "%lx", getExtraOptions(ci));
+ sprintf(temp, "%x", getExtraOptions(ci));
SQLWritePrivateProfileString(DSN,
INI_EXTRAOPTIONS,
temp,
getDSNdefaults(ci);
/* initialize pg_version */
CC_initialize_pg_version(conn);
- salt[0] = '\0';
+ memset(salt, 0, sizeof(salt));
#ifdef WIN32
dialog:
RETCODE result;
CSTR func = "PGAPI_ExecDirect";
const ConnectionClass *conn = SC_get_conn(stmt);
- const ConnInfo *ci = &(conn->connInfo);
mylog("%s: entering...%x\n", func, flag);
}
if (need_savep)
{
- sprintf(esavepoint, "_EXEC_SVP_%08x", stmt);
+ sprintf(esavepoint, "_EXEC_SVP_%p", stmt);
snprintf(cmd, sizeof(cmd), "SAVEPOINT %s", esavepoint);
res = CC_send_query(conn, cmd, NULL, 0, NULL);
if (QR_command_maybe_successful(res))
goto cleanup;
if (!SC_is_rb_stmt(stmt) && !SC_is_tc_stmt(stmt))
goto cleanup;
- sprintf(esavepoint, "_EXEC_SVP_%08x", stmt);
+ sprintf(esavepoint, "_EXEC_SVP_%p", stmt);
if (SQL_ERROR == ret)
{
if (SC_started_rbpoint(stmt))
parameters even in case of non-prepared statements.
*/
BOOL bCallPrepare = FALSE;
- int pre_decided = stmt->prepare;
ConnInfo *ci = &(conn->connInfo);
if (NOT_YET_PREPARED == stmt->prepared &&
if (retval = prepareParameters(stmt), SQL_ERROR == retval)
goto cleanup;
}
- else
- /* stmt->prepare = pre_decided; */ /* put back */
mylog("prepareParameters %d end\n", stmt->prepare);
if (ipdopts->param_processed_ptr)
* the application.
*/
-#if (ODBCVER < 0x0350)
+ if (conn->driver_version < 0x0350)
+ {
#ifdef WIN32
if (ci->drivers.cancel_as_freestmt)
{
}
mylog("PGAPI_Cancel: PGAPI_FreeStmt returned %d\n", ret);
-#endif /* ODBCVER */
+ }
goto cleanup;
}
RETCODE retval;
int i;
Int2 num_p;
+ ConnectionClass *conn = NULL;
ConnInfo *ci;
mylog("%s: entering...\n", func);
retval = SQL_INVALID_HANDLE;
goto cleanup;
}
- ci = &(SC_get_conn(stmt)->connInfo);
+ conn = SC_get_conn(stmt);
+ ci = &(conn->connInfo);
estmt = stmt->execute_delegate ? stmt->execute_delegate : stmt;
apdopts = SC_get_APDF(estmt);
/* close the large object */
if (estmt->lobj_fd >= 0)
{
- ConnectionClass *conn = SC_get_conn(estmt);
-
odbc_lo_close(conn, estmt->lobj_fd);
/* commit transaction if needed */
inolog("return SQL_NEED_DATA\n");
cleanup:
#undef return
+ if (STMT_TYPE_INSERT == stmt->statement_type &&
+ CC_fake_mss(conn) &&
+ (SQL_SUCCESS == retval ||
+ SQL_SUCCESS_WITH_INFO == retval)
+ )
+ SetInsertTable(stmt);
if (stmt->internal)
retval = DiscardStatementSvp(stmt, retval, FALSE);
mylog("%s: returning %d\n", func, retval);
value = 0;
RETCODE result;
char odbcver[16];
+ int i_odbcver;
mylog("%s: entering...fInfoType=%d\n", func, fInfoType);
break;
case SQL_DRIVER_ODBC_VER:
- snprintf(odbcver, sizeof(odbcver), "%02x.%02x", ODBCVER / 256, ODBCVER % 256);
+ i_odbcver = conn->driver_version;
+ snprintf(odbcver, sizeof(odbcver), "%02x.%02x", i_odbcver / 256, i_odbcver % 256);
/* p = DRIVER_ODBC_VER; */
p = odbcver;
break;
int i, outlen;
const char *in;
char *dest = NULL, escape_ch = CC_get_escape(conn);
- BOOL escape_in = FALSE;
encoded_str encstr;
if (result_len)
char not_null[MAX_INFO_STRING],
relhasrules[MAX_INFO_STRING], relkind[8];
char *escSchemaName = NULL, *escTableName = NULL, *escColumnName = NULL;
- BOOL search_pattern, search_by_ids, relisaview;
+ BOOL search_pattern = TRUE, search_by_ids, relisaview;
ConnInfo *ci;
ConnectionClass *conn;
SQLSMALLINT internal_asis_type = SQL_C_CHAR, cbSchemaName;
SQLINTEGER greloid;
- const char *like_or_eq;
+ const char *like_or_eq = likeop;
const char *szSchemaName;
mylog("%s: entering...stmt=%x scnm=%x len=%d\n", func, stmt, NULL_IF_NULL(szTableOwner), cbTableOwner);
}
strcat(columns_query, ") inner join pg_catalog.pg_attribute a"
" on (not a.attisdropped)");
- if (0 == attnum && NULL == escColumnName)
+ if (0 == attnum && (NULL == escColumnName || like_or_eq != eqop))
strcat(columns_query, " and a.attnum > 0");
if (search_by_ids)
{
*ret = serverColumnName;
BOOL continueExec = TRUE,
bError = FALSE;
- QResultClass *res;
+ QResultClass *res = NULL;
UWORD flag = IGNORE_ABORT_ON_CONN | ROLLBACK_ON_ERROR;
*nameAlloced = FALSE;
if (QR_get_num_cached_tuples(res) > 0)
conn->server_encoding = strdup(QR_get_value_backend_row(res, 0, 0));
}
+ QR_Destructor(res);
+ res = NULL;
}
- QR_Destructor(res);
if (!conn->server_encoding)
return ret;
snprintf(query, sizeof(query), "SET CLIENT_ENCODING TO '%s'", conn->server_encoding);
TupleField *tuple;
char *schema_name, *procname;
char *escSchemaName = NULL, *escProcName = NULL;
- char *params, *proargnames, *proargmodes, *delim;
+ char *params, *proargnames, *proargmodes, *delim = NULL;
char *atttypid, *attname, *column_name;
QResultClass *res, *tres;
SQLLEN tcount;
#endif /* WIN32 */
#if defined(_MSC_DELAY_LOAD_IMPORT)
+static BOOL loaded_libpq = FALSE, loaded_ssllib = FALSE;
/*
* Load psqlodbc path based libpq dll.
*/
#endif /* SSL_DLL */
typedef BOOL (WINAPI *UnloadFunc)(LPCSTR);
-void UnloadDelayLoadedDLLs(BOOL ssllibLoaded)
+static void UnloadDelayLoadedDLLs(BOOL ssllibLoaded)
{
BOOL success;
#if (_MSC_VER < 1300) /* VC6 DELAYLOAD IMPORT */
}
return;
}
+void CleanupDelayLoadedDLLs(void)
+{
+ if (loaded_libpq)
+ UnloadDelayLoadedDLLs(loaded_ssllib);
+}
#else
-void UnloadDelayLoadedDLLs(BOOL SSLLoaded)
+static void UnloadDelayLoadedDLLs(BOOL SSLLoaded)
+{
+ return;
+}
+void CleanupDelayLoadedDLLs(void)
{
return;
}
void *CALL_PQconnectdb(const char *conninfo, BOOL *libpqLoaded)
{
- void *pqconn;
+ void *pqconn = NULL;
*libpqLoaded = TRUE;
#if defined(_MSC_DELAY_LOAD_IMPORT)
__try {
__except ((GetExceptionCode() & 0xffff) == ERROR_MOD_NOT_FOUND ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
*libpqLoaded = FALSE;
}
+ if (*libpqLoaded)
+ {
+ loaded_libpq = TRUE;
+ if (PQgetssl(pqconn))
+ loaded_ssllib = TRUE;
+ }
#else
pqconn = PQconnectdb(conninfo);
#endif /* _MSC_DELAY_LOAD_IMPORT */
#endif
BOOL LIBPQ_check(void);
void *CALL_PQconnectdb(const char *conninfo, BOOL *);
-void UnloadDelayLoadedDLLs(BOOL);
+/* void UnloadDelayLoadedDLLs(BOOL); */
+void CleanupDelayLoadedDLLs(void);
#ifdef __cplusplus
}
#endif /* WIN_MULTITHREAD_SUPPORT */
#if defined(POSIX_MULTITHREAD_SUPPORT)
if (MLOGFP)
- fprintf(MLOGFP, "[%d]", pthread_self());
+ fprintf(MLOGFP, "[%u]", pthread_self());
#endif /* POSIX_MULTITHREAD_SUPPORT */
if (MLOGFP)
vfprintf(MLOGFP, fmt, args);
#endif /* WIN32 */
#endif /* WIN_MULTITHREAD_SUPPORT */
#if defined(POSIX_MULTITHREAD_SUPPORT)
- fprintf(MLOGFP, "[%d]", pthread_self());
+ fprintf(MLOGFP, "[%u]", pthread_self());
#endif /* POSIX_MULTITHREAD_SUPPORT */
vfprintf(MLOGFP, fmt, args);
}
if (SC_is_lower_case(stmt, conn)) /* case-insensitive identifier */
ifallupper = FALSE;
- if (newCt = make_lstring_ifneeded(conn, CatalogName, NameLength1, ifallupper))
+ if (newCt = make_lstring_ifneeded(conn, CatalogName, NameLength1, ifallupper), NULL != newCt)
{
ctName = newCt;
reexec = TRUE;
}
- if (newSc = make_lstring_ifneeded(conn, SchemaName, NameLength2, ifallupper))
+ if (newSc = make_lstring_ifneeded(conn, SchemaName, NameLength2, ifallupper), NULL != newSc)
{
scName = newSc;
reexec = TRUE;
}
- if (newTb = make_lstring_ifneeded(conn, TableName, NameLength3, ifallupper))
+ if (newTb = make_lstring_ifneeded(conn, TableName, NameLength3, ifallupper), NULL != newTb)
{
tbName = newTb;
reexec = TRUE;
}
- if (newCl = make_lstring_ifneeded(conn, ColumnName, NameLength4, ifallupper))
+ if (newCl = make_lstring_ifneeded(conn, ColumnName, NameLength4, ifallupper), NULL != newCl)
{
clName = newCl;
reexec = TRUE;
if (SC_is_lower_case(stmt, conn)) /* case-insensitive identifier */
ifallupper = FALSE;
- if (newCt = make_lstring_ifneeded(conn, CatalogName, NameLength1, ifallupper))
+ if (newCt = make_lstring_ifneeded(conn, CatalogName, NameLength1, ifallupper), NULL != newCt)
{
ctName = newCt;
reexec = TRUE;
}
- if (newSc = make_lstring_ifneeded(conn, SchemaName, NameLength2, ifallupper))
+ if (newSc = make_lstring_ifneeded(conn, SchemaName, NameLength2, ifallupper), NULL != newSc)
{
scName = newSc;
reexec = TRUE;
}
- if (newTb = make_lstring_ifneeded(conn, TableName, NameLength3, ifallupper))
+ if (newTb = make_lstring_ifneeded(conn, TableName, NameLength3, ifallupper), NULL != newTb)
{
tbName = newTb;
reexec = TRUE;
if (SC_is_lower_case(stmt, conn)) /* case-insensitive identifier */
ifallupper = FALSE;
- if (newCt = make_lstring_ifneeded(conn, CatalogName, NameLength1, ifallupper))
+ if (newCt = make_lstring_ifneeded(conn, CatalogName, NameLength1, ifallupper), NULL != newCt)
{
ctName = newCt;
reexec = TRUE;
}
- if (newSc = make_lstring_ifneeded(conn, SchemaName, NameLength2, ifallupper))
+ if (newSc = make_lstring_ifneeded(conn, SchemaName, NameLength2, ifallupper), NULL != newSc)
{
scName = newSc;
reexec = TRUE;
}
- if (newTb = make_lstring_ifneeded(conn, TableName, NameLength3, ifallupper))
+ if (newTb = make_lstring_ifneeded(conn, TableName, NameLength3, ifallupper), NULL != newTb)
{
tbName = newTb;
reexec = TRUE;
if (SC_is_lower_case(stmt, conn)) /* case-insensitive identifier */
ifallupper = FALSE;
- if (newCt = make_lstring_ifneeded(conn, CatalogName, NameLength1, ifallupper))
+ if (newCt = make_lstring_ifneeded(conn, CatalogName, NameLength1, ifallupper), NULL != newCt)
{
ctName = newCt;
reexec = TRUE;
}
- if (newSc = make_lstring_ifneeded(conn, SchemaName, NameLength2, ifallupper))
+ if (newSc = make_lstring_ifneeded(conn, SchemaName, NameLength2, ifallupper), NULL != newSc)
{
scName = newSc;
reexec = TRUE;
}
- if (newTb = make_lstring_ifneeded(conn, TableName, NameLength3, ifallupper))
+ if (newTb = make_lstring_ifneeded(conn, TableName, NameLength3, ifallupper), NULL != newTb)
{
tbName = newTb;
reexec = TRUE;
if (SC_is_lower_case(stmt, conn)) /* case-insensitive identifier */
ifallupper = FALSE;
- if (newCt = make_lstring_ifneeded(conn, szCatalogName, cbCatalogName, ifallupper))
+ if (newCt = make_lstring_ifneeded(conn, szCatalogName, cbCatalogName, ifallupper), NULL != newCt)
{
ctName = newCt;
reexec = TRUE;
}
- if (newSc = make_lstring_ifneeded(conn, szSchemaName, cbSchemaName, ifallupper))
+ if (newSc = make_lstring_ifneeded(conn, szSchemaName, cbSchemaName, ifallupper), NULL != newSc)
{
scName = newSc;
reexec = TRUE;
}
- if (newTb = make_lstring_ifneeded(conn, szTableName, cbTableName, ifallupper))
+ if (newTb = make_lstring_ifneeded(conn, szTableName, cbTableName, ifallupper), NULL != newTb)
{
tbName = newTb;
reexec = TRUE;
}
- if (newCl = make_lstring_ifneeded(conn, szColumnName, cbColumnName, ifallupper))
+ if (newCl = make_lstring_ifneeded(conn, szColumnName, cbColumnName, ifallupper), NULL != newCl)
{
clName = newCl;
reexec = TRUE;
if (SC_is_lower_case(stmt, conn)) /* case-insensitive identifier */
ifallupper = FALSE;
- if (newPkct = make_lstring_ifneeded(conn, szPkCatalogName, cbPkCatalogName, ifallupper))
+ if (newPkct = make_lstring_ifneeded(conn, szPkCatalogName, cbPkCatalogName, ifallupper), NULL != newPkct)
{
pkctName = newPkct;
reexec = TRUE;
}
- if (newPksc = make_lstring_ifneeded(conn, szPkSchemaName, cbPkSchemaName, ifallupper))
+ if (newPksc = make_lstring_ifneeded(conn, szPkSchemaName, cbPkSchemaName, ifallupper), NULL != newPksc)
{
pkscName = newPksc;
reexec = TRUE;
}
- if (newPktb = make_lstring_ifneeded(conn, szPkTableName, cbPkTableName, ifallupper))
+ if (newPktb = make_lstring_ifneeded(conn, szPkTableName, cbPkTableName, ifallupper), NULL != newPktb)
{
pktbName = newPktb;
reexec = TRUE;
}
- if (newFkct = make_lstring_ifneeded(conn, szFkCatalogName, cbFkCatalogName, ifallupper))
+ if (newFkct = make_lstring_ifneeded(conn, szFkCatalogName, cbFkCatalogName, ifallupper), NULL != newFkct)
{
fkctName = newFkct;
reexec = TRUE;
}
- if (newFksc = make_lstring_ifneeded(conn, szFkSchemaName, cbFkSchemaName, ifallupper))
+ if (newFksc = make_lstring_ifneeded(conn, szFkSchemaName, cbFkSchemaName, ifallupper), NULL != newFksc)
{
fkscName = newFksc;
reexec = TRUE;
}
- if (newFktb = make_lstring_ifneeded(conn, szFkTableName, cbFkTableName, ifallupper))
+ if (newFktb = make_lstring_ifneeded(conn, szFkTableName, cbFkTableName, ifallupper), NULL != newFktb)
{
fktbName = newFktb;
reexec = TRUE;
return ret;
}
+#if (ODBCVER < 0x0300)
RETCODE SQL_API
SQLParamOptions(
HSTMT hstmt,
LEAVE_STMT_CS(stmt);
return ret;
}
+#endif /* ODBCVER */
RETCODE SQL_API
SQLPrimaryKeys(
if (SC_is_lower_case(stmt, conn)) /* case-insensitive identifier */
ifallupper = FALSE;
- if (newCt = make_lstring_ifneeded(conn, szCatalogName, cbCatalogName, ifallupper))
+ if (newCt = make_lstring_ifneeded(conn, szCatalogName, cbCatalogName, ifallupper), NULL != newCt)
{
ctName = newCt;
reexec = TRUE;
}
- if (newSc = make_lstring_ifneeded(conn, szSchemaName, cbSchemaName, ifallupper))
+ if (newSc = make_lstring_ifneeded(conn, szSchemaName, cbSchemaName, ifallupper), NULL != newSc)
{
scName = newSc;
reexec = TRUE;
}
- if (newTb = make_lstring_ifneeded(conn, szTableName, cbTableName, ifallupper))
+ if (newTb = make_lstring_ifneeded(conn, szTableName, cbTableName, ifallupper), NULL != newTb)
{
tbName = newTb;
reexec = TRUE;
if (SC_is_lower_case(stmt, conn)) /* case-insensitive identifier */
ifallupper = FALSE;
- if (newCt = make_lstring_ifneeded(conn, szCatalogName, cbCatalogName, ifallupper))
+ if (newCt = make_lstring_ifneeded(conn, szCatalogName, cbCatalogName, ifallupper), NULL != newCt)
{
ctName = newCt;
reexec = TRUE;
}
- if (newSc = make_lstring_ifneeded(conn, szSchemaName, cbSchemaName, ifallupper))
+ if (newSc = make_lstring_ifneeded(conn, szSchemaName, cbSchemaName, ifallupper), NULL != newSc)
{
scName = newSc;
reexec = TRUE;
}
- if (newPr = make_lstring_ifneeded(conn, szProcName, cbProcName, ifallupper))
+ if (newPr = make_lstring_ifneeded(conn, szProcName, cbProcName, ifallupper), NULL != newPr)
{
prName = newPr;
reexec = TRUE;
}
- if (newCl = make_lstring_ifneeded(conn, szColumnName, cbColumnName, ifallupper))
+ if (newCl = make_lstring_ifneeded(conn, szColumnName, cbColumnName, ifallupper), NULL != newCl)
{
clName = newCl;
reexec = TRUE;
if (SC_is_lower_case(stmt, conn)) /* case-insensitive identifier */
ifallupper = FALSE;
- if (newCt = make_lstring_ifneeded(conn, szCatalogName, cbCatalogName, ifallupper))
+ if (newCt = make_lstring_ifneeded(conn, szCatalogName, cbCatalogName, ifallupper), NULL != newCt)
{
ctName = newCt;
reexec = TRUE;
}
- if (newSc = make_lstring_ifneeded(conn, szSchemaName, cbSchemaName, ifallupper))
+ if (newSc = make_lstring_ifneeded(conn, szSchemaName, cbSchemaName, ifallupper), NULL != newSc)
{
scName = newSc;
reexec = TRUE;
}
- if (newPr = make_lstring_ifneeded(conn, szProcName, cbProcName, ifallupper))
+ if (newPr = make_lstring_ifneeded(conn, szProcName, cbProcName, ifallupper), NULL != newPr)
{
prName = newPr;
reexec = TRUE;
if (SC_is_lower_case(stmt, conn)) /* case-insensitive identifier */
ifallupper = FALSE;
- if (newCt = make_lstring_ifneeded(conn, szCatalogName, cbCatalogName, ifallupper))
+ if (newCt = make_lstring_ifneeded(conn, szCatalogName, cbCatalogName, ifallupper), NULL != newCt)
{
ctName = newCt;
reexec = TRUE;
}
- if (newSc = make_lstring_ifneeded(conn, szSchemaName, cbSchemaName, ifallupper))
+ if (newSc = make_lstring_ifneeded(conn, szSchemaName, cbSchemaName, ifallupper), NULL != newSc)
{
scName = newSc;
reexec = TRUE;
}
- if (newTb = make_lstring_ifneeded(conn, szTableName, cbTableName, ifallupper))
+ if (newTb = make_lstring_ifneeded(conn, szTableName, cbTableName, ifallupper), NULL != newTb)
{
tbName = newTb;
reexec = TRUE;
PTR DiagInfo, SQLSMALLINT BufferLength,
SQLSMALLINT *StringLength)
{
+ CSTR func = "SQLGetDiagField";
RETCODE ret;
- mylog("[[SQLGetDiagField]] Handle=(%u,%x) Rec=%d Id=%d\n", HandleType, Handle, RecNumber, DiagIdentifier);
+ mylog("[[%s]] Handle=(%u,%x) Rec=%d Id=%d info=(%x,%d)\n", func, HandleType, Handle, RecNumber, DiagIdentifier, DiagInfo, BufferLength);
ret = PGAPI_GetDiagField(HandleType, Handle, RecNumber, DiagIdentifier,
DiagInfo, BufferLength, StringLength);
return ret;
RETCODE ret;
SQLSMALLINT *rgbL, blen = 0, bMax;
char *rgbD = NULL;
- StatementClass *stmt = (StatementClass *) handle;
mylog("[[%s]] Handle=(%u,%x) Rec=%d Id=%d info=(%x,%d)\n", func, fHandleType,
handle, iRecord, fDiagField, rgbDiagInfo, cbDiagInfoMax);
case SQL_DIAG_SERVER_NAME:
case SQL_DIAG_SQLSTATE:
case SQL_DIAG_SUBCLASS_ORIGIN:
- bMax = cbDiagInfoMax * 3 / WCLEN;
- if (rgbD = malloc(bMax + 1), !rgbD)
- {
- SC_set_error(stmt, STMT_NO_MEMORY_ERROR, "Can't allocate a rgbD buffer.", func);
+ bMax = cbDiagInfoMax * 3 / WCLEN + 1;
+ if (rgbD = malloc(bMax), !rgbD)
return SQL_ERROR;
- }
rgbL = &blen;
for (;; bMax = blen + 1, rgbD = realloc(rgbD, bMax))
{
{
blen = (SQLSMALLINT) utf8_to_ucs2(rgbD, blen, (SQLWCHAR *) rgbDiagInfo, cbDiagInfoMax / WCLEN);
if (SQL_SUCCESS == ret && blen * WCLEN >= cbDiagInfoMax)
- {
ret = SQL_SUCCESS_WITH_INFO;
- SC_set_error(stmt, STMT_TRUNCATED, "The buffer was too small for the rgbDiagInfo.", func);
- }
if (pcbDiagInfo)
+ {
+#ifdef WIN32
+ extern int platformId;
+
+ if (VER_PLATFORM_WIN32_WINDOWS == platformId && NULL == rgbDiagInfo && 0 == cbDiagInfoMax)
+ blen++;
+#endif /* WIN32 */
*pcbDiagInfo = blen * WCLEN;
+ }
}
if (rgbD)
free(rgbD);
CSTR func = "PGAPI_GetStmtOption";
StatementClass *stmt = (StatementClass *) hstmt;
QResultClass *res;
- ConnInfo *ci = &(SC_get_conn(stmt)->connInfo);
SQLLEN ridx;
SQLINTEGER len = sizeof(SQLINTEGER);
Int4 FI_precision(const FIELD_INFO *fi)
{
+ OID ftype;
+
if (!fi) return -1;
- switch (fi->type)
+ ftype = FI_type(fi);
+ switch (ftype)
{
case PG_TYPE_NUMERIC:
return fi->column_size;
}
Int4 FI_scale(const FIELD_INFO *fi)
{
+ OID ftype;
+
if (!fi) return -1;
- switch (fi->type)
+ ftype = FI_type(fi);
+ switch (ftype)
{
case PG_TYPE_NUMERIC:
return fi->decimal_digits;
break;
/* Handle quoted stuff */
in_quote = in_dollar_quote = FALSE;
+ taglen = 0;
+ tag = NULL;
+ escape_in_literal = '\0';
if (out == 0)
{
qc = s[i];
in_quote = in_dollar_quote = TRUE;
tag = s + i;
taglen = 1;
- if (tagend = strchr(s + i + 1, dollar_quote))
+ if (tagend = strchr(s + i + 1, dollar_quote), NULL != tagend)
taglen = tagend - s - i + 1;
i += (taglen - 1);
encoded_position_shift(&encstr, taglen - 1);
fi->dquote = TRUE;
STR_TO_NAME(fi->column_name, QR_get_value_backend_row(col_info->result, k, COLUMNS_COLUMN_NAME));
- fi->type = atoi(QR_get_value_backend_row(col_info->result, k, COLUMNS_FIELD_TYPE));
+ fi->columntype = atoi(QR_get_value_backend_row(col_info->result, k, COLUMNS_FIELD_TYPE));
fi->column_size = atoi(QR_get_value_backend_row(col_info->result, k, COLUMNS_PRECISION));
fi->length = atoi(QR_get_value_backend_row(col_info->result, k, COLUMNS_LENGTH));
if (str = QR_get_value_backend_row(col_info->result, k, COLUMNS_SCALE), str)
static void xxxxx(FIELD_INFO *fi, QResultClass *res, int i)
{
STR_TO_NAME(fi->column_alias, QR_get_fieldname(res, i));
- fi->type = QR_get_field_type(res, i);
+ fi->basetype = QR_get_field_type(res, i);
+ if (0 == fi->columntype)
+ fi->columntype = fi->basetype;
if (fi->attnum < 0)
{
fi->nullable = FALSE;
if (searchColInfo(col_info, wfi))
{
STR_TO_NAME(wfi->column_alias, QR_get_fieldname(res, i));
+ wfi->basetype = QR_get_field_type(res, i);
wfi->updatable = updatable;
}
else
if (wfi->func || wfi->expr || wfi->numeric)
{
wfi->ti = NULL;
- wfi->type = (OID) 0;
+ wfi->columntype = wfi->basetype = (OID) 0;
parse = FALSE;
continue;
}
* wfi->type = PG_TYPE_TEXT; wfi->column_size = 0; the
* following may be better
*/
- wfi->type = PG_TYPE_UNKNOWN;
+ wfi->basetype = PG_TYPE_UNKNOWN;
if (wfi->column_size == 0)
{
- wfi->type = PG_TYPE_VARCHAR;
+ wfi->basetype = PG_TYPE_VARCHAR;
wfi->column_size = 254;
}
wfi->length = wfi->column_size;
for (i = 0; i < stmt->ntab; i++)
{
/* See if already got it */
- char found = FALSE;
-
wti = ti[i];
if (!getCOLIfromTI(func, NULL, stmt, 0, &wti))
{
wfi = fi[i];
wfi->flag &= ~FIELD_PARSING;
- if (0 != wfi->type)
+ if (0 != wfi->columntype || 0 != wfi->basetype)
wfi->flag |= FIELD_PARSED_OK;
}
strncpy_null((SQLCHAR *) DiagInfoPtr, CC_get_DSN(conn), BufferLength);
ret = (BufferLength > rtnlen ? SQL_SUCCESS : SQL_SUCCESS_WITH_INFO);
}
+ else
+ ret = SQL_SUCCESS_WITH_INFO;
break;
case SQL_DIAG_MESSAGE_TEXT:
ret = PGAPI_ConnectError(Handle, RecNumber,
strncpy_null((SQLCHAR *) DiagInfoPtr, CC_get_DSN(conn), BufferLength);
ret = (BufferLength > rtnlen ? SQL_SUCCESS : SQL_SUCCESS_WITH_INFO);
}
+ else
+ ret = SQL_SUCCESS_WITH_INFO;
break;
case SQL_DIAG_MESSAGE_TEXT:
ret = PGAPI_StmtError(Handle, RecNumber,
strncpy_null((SQLCHAR *) DiagInfoPtr, CC_get_DSN(conn), BufferLength);
ret = (BufferLength > rtnlen ? SQL_SUCCESS : SQL_SUCCESS_WITH_INFO);
}
+ else
+ ret = SQL_SUCCESS_WITH_INFO;
break;
case SQL_DIAG_MESSAGE_TEXT:
case SQL_DIAG_NATIVE:
SQLINTEGER *StringLength)
{
RETCODE ret = SQL_SUCCESS;
- SQLLEN ival;
+ SQLLEN ival = 0;
SQLINTEGER len, rettype = 0;
PTR ptr = NULL;
const ARDFields *opts = (ARDFields *) (desc + 1);
{
RETCODE ret = SQL_SUCCESS;
SQLLEN ival = 0;
- SQLINTEGER len, rettype = 0;
+ SQLINTEGER len = 0, rettype = 0;
PTR ptr = NULL;
BOOL bCallColAtt = FALSE;
const IRDFields *opts = (IRDFields *) (desc + 1);
if (unsupported)
{
char msg[64];
- snprintf(msg, sizeof(msg), "Couldn't set unsupported connect attribute %d", Value);
+ snprintf(msg, sizeof(msg), "Couldn't set unsupported connect attribute %ld", (LONG_PTR) Value);
CC_set_error(conn, CONN_OPTION_NOT_FOR_THE_DRIVER, msg, func);
return SQL_ERROR;
}
default:
return PGAPI_SetStmtOption(StatementHandle, (SQLUSMALLINT) Attribute, (SQLULEN) Value);
}
- return SQL_SUCCESS;
+ return ret;
}
#define CALC_BOOKMARK_ADDR(book, offset, bind_size, index) \
static Int4 /* PostgreSQL restritiction */
getNumericColumnSize(StatementClass *stmt, OID type, int col)
{
- Int4 atttypmod = -1, max_column_size = PG_NUMERIC_MAX_PRECISION + PG_NUMERIC_MAX_SCALE, default_column_size = 28;
+ Int4 atttypmod = -1, default_column_size = 28;
QResultClass *result;
ColumnInfoClass *flds;
#ifdef WIN32
#include <winsock2.h>
+#include "loadlib.h"
+int platformId = 0;
#endif
-GLOBAL_VALUES globals;
int exepgm = 0;
+GLOBAL_VALUES globals;
RETCODE SQL_API SQLDummyOrdinal(void);
if (initialize_global_cs() == 0)
{
char pathname[_MAX_PATH], fname[_MAX_FNAME];
+ OSVERSIONINFO osversion;
+ getCommonDefaults(DBMS_NAME, ODBCINST_INI, NULL);
if (GetModuleFileName(NULL, pathname, sizeof(pathname)) > 0)
{
_splitpath(pathname, NULL, NULL, fname, NULL);
if (stricmp(fname, "msaccess") == 0)
exepgm = 1;
- forcelog("exe name=%s\n", fname);
}
+ osversion.dwOSVersionInfoSize = sizeof(osversion);
+ if (GetVersionEx(&osversion))
+ {
+ platformId=osversion.dwPlatformId;
+ }
+ mylog("exe name=%s plaformId=%d\n", fname, platformId);
}
- getCommonDefaults(DBMS_NAME, ODBCINST_INI, NULL);
break;
case DLL_THREAD_ATTACH:
case DLL_PROCESS_DETACH:
mylog("DETACHING PROCESS\n");
+ CleanupDelayLoadedDLLs();
/* my(q)log is unavailable from here */
finalize_global_cs();
+ CleanupDelayLoadedDLLs();
WSACleanup();
return TRUE;
void
QR_free_memory(QResultClass *self)
{
- TupleField *tuple = self->backend_tuples;
SQLLEN num_backend_rows = self->num_cached_rows;
int num_fields = self->num_fields;
{
char plannm[32];
- sprintf(plannm, "_KEYSET_%x", self);
+ sprintf(plannm, "_KEYSET_%p", self);
if (CC_is_in_error_trans(conn))
{
CC_mark_a_object_to_discard(conn, 's',plannm);
SocketClass *sock;
/* Speed up access */
- SQLLEN fetch_number = self->fetch_number, cur_fetch;
+ SQLLEN fetch_number = self->fetch_number, cur_fetch = 0;
SQLLEN num_total_rows;
SQLLEN num_backend_rows = self->num_cached_rows, num_rows_in;
Int4 num_fields = self->num_fields, fetch_size, req_size;
num_total_rows = QR_get_num_total_tuples(self);
conn = QR_get_conn(self);
+ curr_eof = FALSE;
req_size = self->rowset_size_include_ommitted;
if (QR_once_reached_eof(self) && self->cursTuple >= (Int4) QR_get_num_total_read(self))
curr_eof = TRUE;
else
self->cache_size = req_size;
inolog("cache=%d rowset=%d movement=%d\n", self->cache_size, req_size, movement);
- sprintf(movecmd, "move backward %u in \"%s\"", movement, QR_get_cursor(self));
+ sprintf(movecmd, "move backward %lu in \"%s\"", movement, QR_get_cursor(self));
}
else if (QR_is_moving_forward(self))
- sprintf(movecmd, "move %u in \"%s\"", movement, QR_get_cursor(self));
+ sprintf(movecmd, "move %lu in \"%s\"", movement, QR_get_cursor(self));
else
{
sprintf(movecmd, "move all in \"%s\"", QR_get_cursor(self));
return -1;
}
moved = movement;
- if (sscanf(mres->command, "MOVE %u", &moved) > 0)
+ if (sscanf(mres->command, "MOVE %lu", &moved) > 0)
{
inolog("moved=%d ? %d\n", moved, movement);
if (moved < movement)
if (back_offset + 1 > (Int4) self->ad_count)
{
bmovement = back_offset + 1 - self->ad_count;
- sprintf(movecmd, "move backward %u in \"%s\"", bmovement, QR_get_cursor(self));
+ sprintf(movecmd, "move backward %lu in \"%s\"", bmovement, QR_get_cursor(self));
QR_Destructor(mres);
mres = CC_send_query(conn, movecmd, NULL, 0, stmt);
if (!QR_command_maybe_successful(mres))
return -1;
}
- if (sscanf(mres->command, "MOVE %u", &mback) > 0)
+ if (sscanf(mres->command, "MOVE %lu", &mback) > 0)
{
if (mback < bmovement)
mback++;
*/
self->tupleField = NULL;
+ fetch_size = 0;
if (!QR_is_fetching_tuples(self))
{
ci = &(conn->connInfo);
{
int numf = SOCK_get_int(sock, sizeof(Int2));
if (effective_cols > 0)
-inolog("%dth record in cache numf=%d\n", self->num_cached_rows, numf);
+{inolog("%dth record in cache numf=%d\n", self->num_cached_rows, numf);}
else
-inolog("%dth record in key numf=%d\n", self->num_cached_keys, numf);
+{inolog("%dth record in key numf=%d\n", self->num_cached_keys, numf);}
}
else
SOCK_get_n_char(sock, bitmap, bitmaplen);
if (field_lf >= effective_cols)
{
if (field_lf == effective_cols)
- sscanf(buffer, "(%lu,%hu)",
+ sscanf(buffer, "(%u,%hu)",
&this_keyset->blocknum, &this_keyset->offset);
else
this_keyset->oid = strtoul(buffer, NULL, 10);
&& 0 != (ti->flags & TI_COLATTRIBUTE))
fi->flag |= FIELD_COL_ATTRIBUTE;
}
- if (0 == fi->type)
- fi->type = QR_get_field_type(result, col_idx);
+ fi->basetype = QR_get_field_type(result, col_idx);
+ if (0 == fi->columntype)
+ fi->columntype = fi->basetype;
}
}
}
StatementClass *stmt = (StatementClass *) hstmt;
ConnectionClass *conn;
IRDFields *irdflds;
- QResultClass *res;
+ QResultClass *res = NULL;
char *col_name = NULL;
OID fieldtype = 0;
SQLLEN column_size = 0;
}
if (FI_is_applicable(fi))
{
- fieldtype = fi->type;
+ fieldtype = (conn->lobj_type == fi->columntype) ? fi->columntype : FI_type(fi);
if (NAME_IS_VALID(fi->column_alias))
col_name = GET_NAME(fi->column_alias);
else
if (col_idx < irdflds->nfields && irdflds->fi)
fi = irdflds->fi[col_idx];
if (FI_is_applicable(fi))
- field_type = fi->type;
+ field_type = (conn->lobj_type == fi->columntype) ? fi->columntype : FI_type(fi);
else
{
BOOL build_fi = FALSE;
if (FI_is_applicable(fi))
{
ti = fi->ti;
- field_type = fi->type;
+ field_type = (conn->lobj_type == fi->columntype) ? fi->columntype : FI_type(fi);
}
mylog("colAttr: col %d field_type=%d fi,ti=%x,%x\n", col_idx, field_type, fi, ti);
static void CommitUpdated(QResultClass *res)
{
KeySet *updated_keyset;
- TupleField *updated_tuples = NULL;
- int i, num_fields = res->num_fields;
+ int i;
UWORD status;
mylog("CommitUpdated res=%x\n", res);
SQLLEN index, ridx, kres_ridx;
UWORD status;
Rollback *rollback;
- KeySet *keyset, keys, *wkey;
- BOOL curs = (NULL != QR_get_cursor(res)),
- reached_eof = QR_once_reached_eof(res), kres_is_valid, texist;
+ KeySet *keyset, keys, *wkey = NULL;
+ BOOL curs = (NULL != QR_get_cursor(res)), texist, kres_is_valid;
if (0 == res->rb_count || NULL == res->rollback)
return;
BOOL prepare;
OID oid;
UInt4 blocknum;
- size_t lodlen;
SQLLEN kres_ridx;
UInt2 offset;
- char *qval = NULL, *sval;
+ char *qval = NULL, *sval = NULL;
int keys_per_fetch = 10;
prepare = PG_VERSION_GE(conn, 7.3);
}
if (!rowc)
{
+ size_t lodlen = 0;
+
if (!qval)
{
size_t allen;
if (!keys_per_fetch)
keys_per_fetch = 2;
lodlen = strlen(stmt->load_statement);
- sprintf(planname, "_KEYSET_%0x", res);
+ sprintf(planname, "_KEYSET_%p", res);
allen = 8 + strlen(planname) +
3 + 4 * keys_per_fetch + 1
+ 1 + 2 + lodlen + 20 +
}
if (res->reload_count > 0)
{
- sprintf(qval, "EXECUTE \"_KEYSET_%x\"(", res);
+ sprintf(qval, "EXECUTE \"_KEYSET_%p\"(", res);
sval = qval;
}
else
SQLLEN i, limitrow;
UInt2 qcount;
QResultClass *res;
- IRDFields *irdflds = SC_get_IRDF(stmt);
RETCODE ret = SQL_ERROR;
- ConnectionClass *conn = SC_get_conn(stmt);
SQLLEN kres_ridx, rowc;
Int4 rows_per_fetch;
BOOL create_from_scratch = (0 != flag);
limitrow = res->num_cached_keys;
if (create_from_scratch)
{
- SQLLEN flds_cnt = res->num_cached_rows * res->num_fields,
- brows;
+ SQLLEN brows;
ClearCachedRows(res->backend_tuples, res->num_fields, res->num_cached_rows);
brows = GIdx2RowIdx(limitrow, stmt);
{
HSTMT hstmt;
int j;
- Int2 res_cols = QR_NumResultCols(s.res);
ConnInfo *ci = &(conn->connInfo);
APDFields *apdopts;
OID fieldtype = 0;
UWORD offset;
QResultClass *res, *qres;
ConnectionClass *conn = SC_get_conn(stmt);
- ARDFields *opts = SC_get_ARDF(stmt);
IRDFields *irdflds = SC_get_IRDF(stmt);
- BindInfoClass *bindings = opts->bindings;
char dltstr[4096];
RETCODE ret;
SQLLEN kres_ridx;
spos_cdata *s = (spos_cdata *) para;
ConnectionClass *conn;
SQLULEN global_ridx;
- SQLLEN kres_ridx, pos_ridx;
+ SQLLEN kres_ridx, pos_ridx = 0;
ret = retcode;
if (s->need_data_callback)
{
if (self->pqconn)
PQfinish(self->pqconn);
- UnloadDelayLoadedDLLs(NULL != self->ssl);
+ /* UnloadDelayLoadedDLLs(NULL != self->ssl); */
}
self->via_libpq = FALSE;
self->pqconn = NULL;
SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname, long timeout)
{
struct addrinfo rest, *addrs = NULL, *curadr = NULL;
- int family;
+ int family = 0;
char retval = 0;
fd_set fds, except_fds;
struct timeval tm;
socklen_t optlen = sizeof(optval);
- time_t t_now, t_finish;
+ time_t t_now, t_finish = 0;
BOOL tm_exp = FALSE;
switch (SOCK_ERRNO)
if (SOCK_wait_for_ready(self, FALSE, retry_count) >= 0)
goto retry;
break;
+ case ECONNRESET:
+inolog("ECONNRESET\n");
+ maybeEOF = TRUE;
+ SOCK_set_error(self, SOCKET_CLOSED, "Connection reset by peer.");
+ break;
}
if (0 == self->errornumber)
SOCK_set_error(self, SOCKET_READ_ERROR, "Error while reading from the socket.");
typedef int (WSAAPI *getaddrinfo_func) (const char *, const char *,
const struct addrinfo *, struct addrinfo **);
typedef int (WSAAPI *getnameinfo_func) (const struct sockaddr *,
- socklen_t, char *, DWORD, char *, DWORD, int);
+ socklen_t, char *, size_t, char *, size_t, int);
#define SOCKET_ALREADY_CONNECTED 1
#define SOCKET_HOST_NOT_FOUND 2
BindInfoClass *bookmark;
/* TupleField *tupleField; */
- ConnInfo *ci = &(SC_get_conn(self)->connInfo);
inolog("%s statement=%x ommitted=0\n", func, self);
self->last_fetch_count = self->last_fetch_count_include_ommitted = 0;
*/
#define return DONT_CALL_RETURN_FROM_HERE???
ENTER_INNER_CONN_CS(conn, func_cs_count);
+ oldstatus = conn->status;
if (CONN_EXECUTING == conn->status)
{
SC_set_error(self, STMT_SEQUENCE_ERROR, "Connection is already in use.", func);
}
}
- oldstatus = conn->status;
/* self->status = STMT_EXECUTING; */
if (!SC_SetExecuting(self, TRUE))
{
* will correct for any discrepancies in sizes and adjust the
* cache accordingly.
*/
- sprintf(fetch, "fetch %d in \"%s\"", qi.row_size, SC_cursor_name(self));
+ sprintf(fetch, "fetch %ld in \"%s\"", qi.row_size, SC_cursor_name(self));
res = CC_send_query(conn, fetch, &qi, qflag, SC_get_ancestor(self));
if (SC_is_with_hold(self))
{
CSTR func = "SendBindRequest";
ConnectionClass *conn = SC_get_conn(stmt);
- SocketClass *sock = conn->sock;
mylog("%s: plan_name=%s\n", func, plan_name);
if (!RequestStart(stmt, conn, func))
}
else
{
- res->recent_processed_row_count = 0;
- sscanf(msgbuffer, "%*s %d", &res->recent_processed_row_count);
+ int ret1, ret2;
+
+ ret1 = ret2 = 0;
+ if (sscanf(msgbuffer, "%*s %d %d", &ret1, &ret2) > 1)
+ res->recent_processed_row_count = ret2;
+ else
+ res->recent_processed_row_count = ret1;
}
}
break;
StatementClass *SC_get_ancestor(StatementClass *);
#if (ODBCVER >= 0x0300)
-#define SC_is_lower_case(a, b) (a->options.metadata_id, b->connInfo.lower_case_identifier)
+#define SC_is_lower_case(a, b) (a->options.metadata_id || b->connInfo.lower_case_identifier)
#else
#define SC_is_lower_case(a, b) (b->connInfo.lower_case_identifier)
#endif /* ODBCVER */
{
char buffer[15];
- sprintf(buffer, "%ld", value);
+ sprintf(buffer, "%d", value);
tuple_field->len = (Int4) (strlen(buffer) + 1);
/* +1 ... is this correct (better be on the save side-...) */
#ifndef __VERSION_H__
#define __VERSION_H__
-#define POSTGRESDRIVERVERSION "08.02.0102"
-#define POSTGRES_RESOURCE_VERSION "08.02.0102\0"
-#define PG_DRVFILE_VERSION 8,2,01,02
+#define POSTGRESDRIVERVERSION "08.02.0103"
+#define POSTGRES_RESOURCE_VERSION "08.02.0103\0"
+#define PG_DRVFILE_VERSION 8,2,01,03
#endif
bufcount = 0;
if (ilen < 0)
ilen = strlen(utf8str);
- for (i = 0, ocount = 0, str = utf8str; i < ilen;)
+ for (i = 0, ocount = 0, str = utf8str; i < ilen && *str;)
{
- if (iswascii(*str))
+ /* if (iswascii(*str)) */
+ if (isascii(*str))
{
if (lfconv && PG_LINEFEED == *str &&
(i == 0 || PG_CARRIAGE_RETURN != str[-1]))