The version is now 8.2.0103.
authorHiroshi Inoue <inoue@tpf.co.jp>
Fri, 13 Oct 2006 13:13:33 +0000 (13:13 +0000)
committerHiroshi Inoue <inoue@tpf.co.jp>
Fri, 13 Oct 2006 13:13:33 +0000 (13:13 +0000)
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.

28 files changed:
bind.c
connection.c
convert.c
descriptor.h
dlg_specific.c
drvconn.c
execute.c
info.c
loadlib.c
loadlib.h
mylog.c
odbcapi.c
odbcapi30.c
odbcapi30w.c
options.c
parse.c
pgapi30.c
pgtypes.c
psqlodbc.c
qresult.c
results.c
socket.c
socket.h
statement.c
statement.h
tuple.c
version.h
win_unicode.c

diff --git a/bind.c b/bind.c
index d6c35aae5b3fc639283796ac723e8dbe3115a92a..17619e1765a3ac5de7e8ae162da0ef5ec615bc6c 100644 (file)
--- a/bind.c
+++ b/bind.c
@@ -393,6 +393,7 @@ cleanup:
 }
 
 
+#if (ODBCVER < 0x0300)
 /* Sets multiple values (arrays) for the set of parameter markers. */
 RETCODE        SQL_API
 PGAPI_ParamOptions(
@@ -403,14 +404,17 @@ 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 */
 
 
 /*
@@ -459,8 +463,8 @@ inolog("num_params=%d,%d\n", stmt->num_params, stmt->proc_return);
    {
        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;
@@ -527,7 +531,7 @@ inolog("num_params=%d,%d\n", stmt->num_params, stmt->proc_return);
                    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;
index 3f14733627dcd05f06d791042ded8e31412f0846..5b9eae905e41637f204db6adfa654a3c791597e8 100644 (file)
@@ -236,6 +236,31 @@ PGAPI_FreeConnect(
 }
 
 
+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)
 {
@@ -259,6 +284,10 @@ 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
  */
@@ -313,6 +342,10 @@ CC_Constructor()
        // 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;
@@ -668,8 +701,9 @@ md5_auth_send(ConnectionClass *self, const char *salt)
    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))
@@ -691,12 +725,14 @@ inolog("md5 pwd=%s user=%s\n", ci->password, ci->username);
    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; 
 }
@@ -704,7 +740,7 @@ inolog("putting p\n");
 int
 EatReadyForQuery(ConnectionClass *conn)
 {
-   int id;
+   int id = 0;
 
    if (PROTOCOL_74(&(conn->connInfo)))
    {
@@ -972,11 +1008,9 @@ inolog("parameter value=%s\n", msgbuffer);
 
 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])
@@ -1040,13 +1074,11 @@ static int  protocol3_packet_build(ConnectionClass *self)
 {
    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]));
 
@@ -1094,7 +1126,6 @@ CSTR  l_login_timeout = "connect_timeout";
 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];
@@ -1114,7 +1145,7 @@ static char   *protocol3_opts_build(ConnectionClass *self)
        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++;
@@ -1151,7 +1182,7 @@ static char   *protocol3_opts_build(ConnectionClass *self)
    {
        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';
@@ -1223,7 +1254,6 @@ static int LIBPQ_connect(ConnectionClass *self);
 static char
 LIBPQ_CC_connect(ConnectionClass *self, char password_req, char *salt_para)
 {
-   ConnInfo   *ci = &(self->connInfo);
    int     ret;
    CSTR        func = "LIBPQ_CC_connect";
 
@@ -1261,9 +1291,10 @@ original_CC_connect(ConnectionClass *self, char password_req, char *salt_para)
    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))
@@ -1364,7 +1395,10 @@ inolog("protocol=%s version=%d,%d\n", ci->protocol, self->pg_version_major, self
        do
        {
            if (password_req != AUTH_REQ_OK)
+           {
                beresp = 'R';
+               startPacketReceived = TRUE;
+           }
            else
            {
                beresp = SOCK_get_id(sock);
@@ -1412,17 +1446,19 @@ inolog("Ekita\n");
                        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)
                    {
@@ -1592,7 +1628,6 @@ CC_connect(ConnectionClass *self, char password_req, char *salt_para)
    char       ret;
    // char    *encoding;
    // BOOL startPacketReceived = FALSE;
-   BOOL    usessl = TRUE;
 
    mylog("%s: entering...\n", func);
 
@@ -2735,14 +2770,10 @@ CC_setenv(ConnectionClass *self)
 {
    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";
 
 
index 6aad8e3c27c1c05f71e67fb4a18982bcd796a6d3..ef3074b51e1ce6b3b8283f5954e72d69c28036b1 100644 (file)
--- a/convert.c
+++ b/convert.c
@@ -511,8 +511,11 @@ mylog("null_cvt_date_string=%d\n", conn->connInfo.cvt_null_date_string);
        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:
@@ -521,15 +524,26 @@ mylog("null_cvt_date_string=%d\n", conn->connInfo.cvt_null_date_string);
                    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; 
        }
        /*
@@ -855,7 +869,7 @@ inolog("2stime fr=%d\n", std_time.fr);
 #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;
                    }
@@ -871,9 +885,9 @@ inolog("2stime fr=%d\n", std_time.fr);
 #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;
                    }
@@ -916,7 +930,7 @@ inolog("2stime fr=%d\n", std_time.fr);
 #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 */
@@ -2044,7 +2058,7 @@ Prepare_and_convert(StatementClass *stmt, QueryParse *qp, QueryBuild *qb)
 
        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;
@@ -2169,7 +2183,7 @@ inolog("prep_params\n");
 #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);
 
@@ -2647,7 +2661,7 @@ inner_process_tokens(QueryParse *qp, QueryBuild *qb)
            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);
@@ -3065,7 +3079,7 @@ ResolveOneParam(QueryBuild *qb, QueryParse *qp)
    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;
@@ -3339,7 +3353,7 @@ mylog("C_WCHAR=%s(%d)\n", buffer, used);
 
        case SQL_C_SLONG:
        case SQL_C_LONG:
-           sprintf(param_string, "%d",
+           sprintf(param_string, "%ld",
                    *((SQLINTEGER *) buffer));
            break;
 
@@ -3369,8 +3383,8 @@ mylog("C_WCHAR=%s(%d)\n", buffer, used);
            break;
 
        case SQL_C_ULONG:
-           sprintf(param_string, "%u",
-                   *((UDWORD *) buffer));
+           sprintf(param_string, "%lu",
+                   *((SQLUINTEGER *) buffer));
            break;
 
        case SQL_C_USHORT:
index 40347d174284455d3203c94924d9f9e08ab5c103..826edfd0b8cc91223b171c55f8eee01ded89a76c 100644 (file)
@@ -5,7 +5,7 @@
  *
  * 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 $
  *
  */
 
@@ -126,7 +126,8 @@ typedef struct
    int     decimal_digits; /* scale in 2.x */
    int     display_size;
    SQLLEN      length;
-   OID     type;
+   OID     columntype;
+   OID     basetype;
    char        expr;
    char        quote;
    char        dquote;
@@ -138,6 +139,7 @@ Int4 FI_scale(const FIELD_INFO *);
 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_
 {
@@ -198,10 +200,14 @@ struct IRDFields_
 
 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
index 54147c67f21af98575b31d8accda7c276f265d02..d813d83c3cff9c9cf745b56532f358d8b2fa38f9 100644 (file)
@@ -306,7 +306,7 @@ inolog("hlen=%d", hlen);
                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,
@@ -341,7 +341,7 @@ inolog("hlen=%d", hlen);
            hlen = strlen(connect_string);
            nlen = MAX_CONNECT_STRING - hlen;
            olen = snprintf(&connect_string[hlen], nlen, ";"
-               INI_EXTRAOPTIONS "=%lx;",
+               INI_EXTRAOPTIONS "=%x;",
                flag);
        }
    }
@@ -358,7 +358,7 @@ unfoldCXAttribute(ConnInfo *ci, const char *value)
    if (strlen(value) < 2)
    {
        count = 3;
-       sscanf(value, "%lx", &flag);
+       sscanf(value, "%x", &flag);
    }
    else
    {
@@ -366,7 +366,7 @@ unfoldCXAttribute(ConnInfo *ci, const char *value)
        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);
@@ -737,7 +737,7 @@ getDSNinfo(ConnInfo *ci, char overwrite)
    {
        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)
@@ -1058,7 +1058,7 @@ writeDSNinfo(const ConnInfo *ci)
                                 INI_INT8AS,
                                 temp,
                                 ODBC_INI);
-   sprintf(temp, "%lx", getExtraOptions(ci));
+   sprintf(temp, "%x", getExtraOptions(ci));
    SQLWritePrivateProfileString(DSN,
                            INI_EXTRAOPTIONS,
                             temp,
index a7952c2c45f23d88cd82296af6e9091b3eaf7da1..76afa94ea6d87110a557d60b1554a13826a94957 100644 (file)
--- a/drvconn.c
+++ b/drvconn.c
@@ -146,7 +146,7 @@ PGAPI_DriverConnect(
    getDSNdefaults(ci);
    /* initialize pg_version */
    CC_initialize_pg_version(conn);
-   salt[0] = '\0';
+   memset(salt, 0, sizeof(salt));
 
 #ifdef WIN32
 dialog:
index b2fad493e62ff48c3b873d04a78584cd807d2436..4a6a6211ddc4cf7a1c081e69f7f2d4391b3c6015 100644 (file)
--- a/execute.c
+++ b/execute.c
@@ -147,7 +147,6 @@ PGAPI_ExecDirect(
    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);
 
@@ -580,7 +579,7 @@ SetStatementSvp(StatementClass *stmt)
        }
        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))
@@ -630,7 +629,7 @@ CC_is_in_trans(conn), SC_is_rb_stmt(stmt), SC_is_tc_stmt(stmt));
        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))
@@ -881,7 +880,6 @@ PGAPI_Execute(HSTMT hstmt, UWORD flag)
           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 &&
@@ -937,8 +935,6 @@ PGAPI_Execute(HSTMT hstmt, UWORD flag)
            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)
@@ -1188,7 +1184,8 @@ PGAPI_Cancel(
         * the application.
         */
 
-#if (ODBCVER < 0x0350)
+       if (conn->driver_version < 0x0350)
+       {
 #ifdef WIN32
        if (ci->drivers.cancel_as_freestmt)
        {
@@ -1209,7 +1206,7 @@ PGAPI_Cancel(
        }
 
        mylog("PGAPI_Cancel:  PGAPI_FreeStmt returned %d\n", ret);
-#endif /* ODBCVER */
+       }
        goto cleanup;
    }
 
@@ -1309,6 +1306,7 @@ PGAPI_ParamData(
    RETCODE     retval;
    int     i;
    Int2        num_p;
+   ConnectionClass *conn = NULL;
    ConnInfo   *ci;
 
    mylog("%s: entering...\n", func);
@@ -1319,7 +1317,8 @@ PGAPI_ParamData(
        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);
@@ -1349,8 +1348,6 @@ PGAPI_ParamData(
    /* 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 */
@@ -1431,6 +1428,12 @@ inolog("\n");
 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);
diff --git a/info.c b/info.c
index 4dc4af4b108fb0b9284d599fac2120ebdb272eb0..d0cd6f10fac578054c11dabf335b7a58423ebbe6 100644 (file)
--- a/info.c
+++ b/info.c
@@ -72,6 +72,7 @@ PGAPI_GetInfo(
                value = 0;
    RETCODE     result;
    char        odbcver[16];
+   int     i_odbcver;
 
    mylog("%s: entering...fInfoType=%d\n", func, fInfoType);
 
@@ -260,7 +261,8 @@ mylog("CONVERT_FUNCTIONS=%x\n", value);
            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;
@@ -1351,7 +1353,6 @@ simpleCatalogEscape(const char *src, int srclen, int *result_len, const Connecti
    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)
@@ -1939,12 +1940,12 @@ PGAPI_Columns(
    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);
@@ -2021,7 +2022,7 @@ retry_public_schema:
        }
        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)
        {
@@ -3717,7 +3718,7 @@ getClientColumnName(ConnectionClass *conn, UInt4 relid, char *serverColumnName,
               *ret = serverColumnName;
    BOOL        continueExec = TRUE,
                bError = FALSE;
-   QResultClass *res;
+   QResultClass *res = NULL;
    UWORD   flag = IGNORE_ABORT_ON_CONN | ROLLBACK_ON_ERROR;
 
    *nameAlloced = FALSE;
@@ -3730,8 +3731,9 @@ getClientColumnName(ConnectionClass *conn, UInt4 relid, char *serverColumnName,
            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);
@@ -4680,7 +4682,7 @@ PGAPI_ProcedureColumns(
    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;
index 49cb15d17b14628c3b3f62bc627874fc5f37019a..4c1dd9010d4f6b4b65f3896a66732826f8f8706e 100644 (file)
--- a/loadlib.c
+++ b/loadlib.c
@@ -40,6 +40,7 @@ CSTR  libpq = "libpq";
 #endif /* WIN32 */
 
 #if defined(_MSC_DELAY_LOAD_IMPORT)
+static BOOL    loaded_libpq = FALSE, loaded_ssllib = FALSE;
 /*
  * Load psqlodbc path based libpq dll.
  */
@@ -115,7 +116,7 @@ DliErrorHook(unsigned   dliNotify,
 #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 */
@@ -133,8 +134,17 @@ void UnloadDelayLoadedDLLs(BOOL ssllibLoaded)
    }
    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;
 }
@@ -142,7 +152,7 @@ void UnloadDelayLoadedDLLs(BOOL SSLLoaded)
 
 void *CALL_PQconnectdb(const char *conninfo, BOOL *libpqLoaded)
 {
-   void *pqconn;
+   void *pqconn = NULL;
    *libpqLoaded = TRUE;
 #if defined(_MSC_DELAY_LOAD_IMPORT)
    __try {
@@ -156,6 +166,12 @@ void *CALL_PQconnectdb(const char *conninfo, BOOL *libpqLoaded)
    __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 */
index 33a7662790b598a2af4e79f13c1554e7ecc80a86..00fd36ead5c7982ea9ca4e6ab7df82a6a83291aa 100644 (file)
--- a/loadlib.h
+++ b/loadlib.h
@@ -17,7 +17,8 @@ extern "C" {
 #endif
 BOOL   LIBPQ_check(void);
 void   *CALL_PQconnectdb(const char *conninfo, BOOL *);
-void   UnloadDelayLoadedDLLs(BOOL);
+/* void    UnloadDelayLoadedDLLs(BOOL); */
+void   CleanupDelayLoadedDLLs(void);
 
 #ifdef __cplusplus
 }
diff --git a/mylog.c b/mylog.c
index d3be0215ccbf64fcc0e29881bd87a99444aa0670..efcf3b3a803f1cfbc8e897f30c8115b442fb756a 100644 (file)
--- a/mylog.c
+++ b/mylog.c
@@ -140,7 +140,7 @@ mylog(char *fmt,...)
 #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);
@@ -185,7 +185,7 @@ forcelog(const char *fmt,...)
 #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);
    }
index 638654b79fd9c269cee89259202be724c89d3b54..7226077a70201ab197a383265290904994addb2d 100644 (file)
--- a/odbcapi.c
+++ b/odbcapi.c
@@ -146,22 +146,22 @@ SQLColumns(HSTMT StatementHandle,
 
        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;
@@ -786,17 +786,17 @@ SQLSpecialColumns(HSTMT StatementHandle,
 
        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;
@@ -849,17 +849,17 @@ SQLStatistics(HSTMT StatementHandle,
 
        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;
@@ -917,17 +917,17 @@ SQLTables(HSTMT StatementHandle,
 
        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;
@@ -1036,22 +1036,22 @@ SQLColumnPrivileges(
 
        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;
@@ -1164,32 +1164,32 @@ SQLForeignKeys(
 
        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;
@@ -1274,6 +1274,7 @@ SQLNumParams(
    return ret;
 }
 
+#if (ODBCVER < 0x0300)
 RETCODE        SQL_API
 SQLParamOptions(
                HSTMT hstmt,
@@ -1292,6 +1293,7 @@ SQLParamOptions(
    LEAVE_STMT_CS(stmt);
    return ret;
 }
+#endif /* ODBCVER */
 
 RETCODE        SQL_API
 SQLPrimaryKeys(
@@ -1326,17 +1328,17 @@ 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;
@@ -1399,22 +1401,22 @@ SQLProcedureColumns(
 
        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;
@@ -1478,17 +1480,17 @@ SQLProcedures(
 
        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;
@@ -1568,17 +1570,17 @@ SQLTablePrivileges(
 
        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;
index 6952f259dfdc18cfff24e3de4a9c84256aaae9da..6e092a60bfea7b75eca3007f908a06543224f39c 100644 (file)
@@ -293,9 +293,10 @@ SQLGetDiagField(SQLSMALLINT HandleType, SQLHANDLE Handle,
                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;
index bfc14f63e8401d2a2624295c2b908ffe23f51c44..8b36af6d35ef980271333cd2ad043dcaca0c9981 100644 (file)
@@ -337,7 +337,6 @@ RETCODE SQL_API SQLGetDiagFieldW(
    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);
@@ -350,12 +349,9 @@ RETCODE SQL_API SQLGetDiagFieldW(
        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))
            {
@@ -368,12 +364,17 @@ RETCODE SQL_API SQLGetDiagFieldW(
            {
                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);
index cf0133b4d8b4b669c657be13bc9d472a0ce1bf31..f9e8f64dc6ac7678ac41f920f56d48b15971a1ee 100644 (file)
--- a/options.c
+++ b/options.c
@@ -657,7 +657,6 @@ PGAPI_GetStmtOption(
    CSTR func = "PGAPI_GetStmtOption";
    StatementClass *stmt = (StatementClass *) hstmt;
    QResultClass *res;
-   ConnInfo   *ci = &(SC_get_conn(stmt)->connInfo);
    SQLLEN      ridx;
    SQLINTEGER  len = sizeof(SQLINTEGER);
 
diff --git a/parse.c b/parse.c
index df1adcae733c69434a30a6c3f6373bf45a8a83ab..39923b242ffa0c728ab74f9c674b62f1aa4750f3 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -47,8 +47,11 @@ static   char    searchColInfo(COL_INFO *col_info, FIELD_INFO *fi);
 
 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;
@@ -60,8 +63,11 @@ Int4 FI_precision(const FIELD_INFO *fi)
 }
 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;
@@ -121,6 +127,9 @@ getNextToken(
            break;
        /* Handle quoted stuff */
        in_quote = in_dollar_quote = FALSE;
+       taglen = 0;
+       tag = NULL;
+       escape_in_literal = '\0';
        if (out == 0)
        {
            qc = s[i];
@@ -129,7 +138,7 @@ getNextToken(
                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);
@@ -268,7 +277,7 @@ inolog("getColInfo non-manual result\n");
    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)
@@ -446,7 +455,9 @@ static BOOL increaseNtab(StatementClass *stmt, const char *func)
 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;
@@ -556,6 +567,7 @@ mylog("->%d\n", updatable);
            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
@@ -1365,7 +1377,7 @@ parse_statement(StatementClass *stmt, BOOL check_hasoids)
        if (wfi->func || wfi->expr || wfi->numeric)
        {
            wfi->ti = NULL;
-           wfi->type = (OID) 0;
+           wfi->columntype = wfi->basetype = (OID) 0;
            parse = FALSE;
            continue;
        }
@@ -1377,10 +1389,10 @@ parse_statement(StatementClass *stmt, BOOL check_hasoids)
             * 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;
@@ -1474,8 +1486,6 @@ parse_statement(StatementClass *stmt, BOOL check_hasoids)
    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))
@@ -1653,7 +1663,7 @@ parse_statement(StatementClass *stmt, BOOL check_hasoids)
    {
        wfi = fi[i];
        wfi->flag &= ~FIELD_PARSING;
-       if (0 != wfi->type)
+       if (0 != wfi->columntype || 0 != wfi->basetype)
            wfi->flag |= FIELD_PARSED_OK;
    }
 
index 08a8e0a1e8315029ac2bda014051f9d66a78ee97..74c7b28a9bc40fa78d834ba17a374b95e3699faa 100644 (file)
--- a/pgapi30.c
+++ b/pgapi30.c
@@ -170,6 +170,8 @@ PGAPI_GetDiagField(SQLSMALLINT HandleType, SQLHANDLE Handle,
                        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,
@@ -234,6 +236,8 @@ PGAPI_GetDiagField(SQLSMALLINT HandleType, SQLHANDLE Handle,
                        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,
@@ -336,6 +340,8 @@ inolog("rc=%d\n", rc);
                        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:
@@ -933,7 +939,7 @@ ARDGetField(DescriptorClass *desc, SQLSMALLINT RecNumber,
        SQLINTEGER *StringLength)
 {
    RETCODE     ret = SQL_SUCCESS;
-   SQLLEN      ival;
+   SQLLEN      ival = 0;
    SQLINTEGER  len, rettype = 0;
    PTR     ptr = NULL;
    const ARDFields *opts = (ARDFields *) (desc + 1);
@@ -1258,7 +1264,7 @@ IRDGetField(DescriptorClass *desc, SQLSMALLINT RecNumber,
 {
    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);
@@ -1663,7 +1669,7 @@ PGAPI_SetConnectAttr(HDBC ConnectionHandle,
    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;
    }
@@ -1866,7 +1872,7 @@ inolog("set ard=%x\n", stmt->ard);
        default:
            return PGAPI_SetStmtOption(StatementHandle, (SQLUSMALLINT) Attribute, (SQLULEN) Value);
    }
-   return SQL_SUCCESS;
+   return ret;
 }
 
 #define    CALC_BOOKMARK_ADDR(book, offset, bind_size, index) \
index 490293ed2569b78e00cb4977d3ace0aff9982c1d..47371e78147922ec57a8c18149c126a61a6a70cd 100644 (file)
--- a/pgtypes.c
+++ b/pgtypes.c
@@ -628,7 +628,7 @@ getNumericDecimalDigits(StatementClass *stmt, OID type, int col)
 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;
 
index 996caea2acfc10fddff00ad358bf9581d778c967..6cf06961ec1d34d279bce4e2db845d9eebf14399 100644 (file)
 
 #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);
 
@@ -129,16 +131,22 @@ DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
            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:
@@ -146,8 +154,10 @@ DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
 
        case DLL_PROCESS_DETACH:
            mylog("DETACHING PROCESS\n");
+           CleanupDelayLoadedDLLs();
            /* my(q)log is unavailable from here */
            finalize_global_cs();
+           CleanupDelayLoadedDLLs();
            WSACleanup();
            return TRUE;
 
index 111663cd70931c2c6ee3b172cee735cffd6f84d7..7b133711bc804fa8e6ddc09d42360212f355f6af 100644 (file)
--- a/qresult.c
+++ b/qresult.c
@@ -398,7 +398,6 @@ inolog("QR_AddNew %dth row(%d fields) alloc=%d\n", self->num_cached_rows, QR_Num
 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;
 
@@ -422,7 +421,7 @@ QR_free_memory(QResultClass *self)
        {
            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);
@@ -788,7 +787,7 @@ QR_next_tuple(QResultClass *self, StatementClass *stmt)
    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;
@@ -814,6 +813,7 @@ inolog("in total_read=%d cursT=%d currT=%d ad=%d total=%d rowsetSize=%d\n", self
 
    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;
@@ -837,10 +837,10 @@ inolog("in total_read=%d cursT=%d currT=%d ad=%d total=%d rowsetSize=%d\n", self
            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));
@@ -855,7 +855,7 @@ inolog("cache=%d rowset=%d movement=%d\n", self->cache_size, req_size, movement)
            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)
@@ -895,7 +895,7 @@ inolog("back_offset=%d and move_offset=%d\n", back_offset, self->move_offset);
                    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))
@@ -906,7 +906,7 @@ inolog("back_offset=%d and move_offset=%d\n", back_offset, self->move_offset);
                            return -1;
                        }
 
-                       if (sscanf(mres->command, "MOVE %u", &mback) > 0)
+                       if (sscanf(mres->command, "MOVE %lu", &mback) > 0)
                        {
                            if (mback < bmovement)
                                mback++;
@@ -1002,6 +1002,7 @@ inolog("tupleField=%x\n", self->tupleField);
     */
    self->tupleField = NULL;
 
+   fetch_size = 0;
    if (!QR_is_fetching_tuples(self))
    {
        ci = &(conn->connInfo);
@@ -1426,9 +1427,9 @@ QR_read_a_tuple_from_db(QResultClass *self, char binary)
    {
        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);
@@ -1482,7 +1483,7 @@ inolog("QR_read_a_tuple_from_db len=%d\n", len);
            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);
index e1797506e28ed20950ca71407b51f205e97708e5..7d1a53c80711c2a6990ce3dd5652aeb6fb00721e 100644 (file)
--- a/results.c
+++ b/results.c
@@ -127,8 +127,9 @@ inolog("nfields=%d\n", irdflds->nfields);
                        && 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;
            }
        }
    }
@@ -227,7 +228,7 @@ PGAPI_DescribeCol(
    StatementClass *stmt = (StatementClass *) hstmt;
    ConnectionClass *conn;
    IRDFields   *irdflds;
-   QResultClass *res;
+   QResultClass    *res = NULL;
    char       *col_name = NULL;
    OID     fieldtype = 0;
    SQLLEN      column_size = 0;
@@ -338,7 +339,7 @@ inolog("answering bookmark info\n");
    }
    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
@@ -551,7 +552,7 @@ inolog("answering bookmark info\n");
    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;
@@ -613,7 +614,7 @@ inolog("answering bookmark info\n");
    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);
@@ -2635,8 +2636,7 @@ static void RemoveUpdatedAfterTheKey(QResultClass *res, SQLLEN index, const KeyS
 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);
@@ -2779,9 +2779,8 @@ static void UndoRollback(StatementClass *stmt, QResultClass *res, BOOL partial)
    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;
@@ -3170,10 +3169,9 @@ static SQLLEN LoadFromKeyset(StatementClass *stmt, QResultClass * res, int rows_
    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);
@@ -3248,6 +3246,8 @@ static SQLLEN LoadFromKeyset(StatementClass *stmt, QResultClass * res, int rows_
        }
        if (!rowc)
        {
+           size_t lodlen = 0;
+
            if (!qval)
            {
                size_t  allen;
@@ -3269,7 +3269,7 @@ static SQLLEN LoadFromKeyset(StatementClass *stmt, QResultClass * res, int rows_
                        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 +
@@ -3324,7 +3324,7 @@ static SQLLEN LoadFromKeyset(StatementClass *stmt, QResultClass * res, int rows_
            }
            if (res->reload_count > 0)
            {
-               sprintf(qval, "EXECUTE \"_KEYSET_%x\"(", res);
+               sprintf(qval, "EXECUTE \"_KEYSET_%p\"(", res);
                sval = qval;
            }
            else
@@ -3361,9 +3361,7 @@ SC_pos_reload_needed(StatementClass *stmt, SQLULEN req_size, UDWORD flag)
    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);
@@ -3399,8 +3397,7 @@ SC_pos_reload_needed(StatementClass *stmt, SQLULEN req_size, UDWORD 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);
@@ -3765,7 +3762,6 @@ SC_pos_update(StatementClass *stmt,
    {
        HSTMT       hstmt;
        int         j;
-       Int2        res_cols = QR_NumResultCols(s.res);
        ConnInfo    *ci = &(conn->connInfo);
        APDFields   *apdopts;
        OID     fieldtype = 0;
@@ -3847,9 +3843,7 @@ SC_pos_delete(StatementClass *stmt,
    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;
@@ -4325,7 +4319,7 @@ RETCODE spos_callback(RETCODE retcode, void *para)
    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)
index ea072e0fcf358d4cb14dc1089fcfde05fb15197e..badfc502be0a4c09b41390700600787c9cf46fc3 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -108,7 +108,7 @@ SOCK_Destructor(SocketClass *self)
            {
                if (self->pqconn)
                    PQfinish(self->pqconn);
-               UnloadDelayLoadedDLLs(NULL != self->ssl);
+               /* UnloadDelayLoadedDLLs(NULL != self->ssl); */
            }
            self->via_libpq = FALSE;
            self->pqconn = NULL;
@@ -148,7 +148,7 @@ char
 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;
 
 
@@ -258,7 +258,7 @@ retry:
        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)
@@ -732,6 +732,11 @@ mylog("Lasterror=%d\n", 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.");
index d8fe2edc5ec959083a30981917f7092fcfc20d1f..d98ed0099b6e45b463c2d3dbf0a8869e1eaa5d87 100644 (file)
--- a/socket.h
+++ b/socket.h
@@ -100,7 +100,7 @@ typedef void (WSAAPI *freeaddrinfo_func) (struct addrinfo *);
 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
index 701d707a82b4004fa5994cccd537c3e34f312e1d..1f6e6493c4b98865afe94f829aa25b1edc976afe 100644 (file)
@@ -1342,7 +1342,6 @@ SC_fetch(StatementClass *self)
    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;
@@ -1553,6 +1552,7 @@ SC_execute(StatementClass *self)
     */
 #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);
@@ -1591,7 +1591,6 @@ SC_execute(StatementClass *self)
                 }
    }
 
-   oldstatus = conn->status;
    /* self->status = STMT_EXECUTING; */
    if (!SC_SetExecuting(self, TRUE))
    {
@@ -1687,7 +1686,7 @@ inolog("get_Result=%x\n", res);
             * 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))
@@ -2072,7 +2071,6 @@ SendBindRequest(StatementClass *stmt, const char *plan_name)
 {
    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))
@@ -2140,8 +2138,13 @@ inolog(" response_length=%d\n", response_length);
                    }
                    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;
index 517171a6d2ae92cdf3c14adff18d740a72e87862..2856627618230f9c5865c1df374750678f6b785e 100644 (file)
@@ -319,7 +319,7 @@ void    SC_reset_delegate(RETCODE, StatementClass *);
 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 */
diff --git a/tuple.c b/tuple.c
index de7f76c86c5f432ceda0ef6d17ca1a2e0e0b6b00..2acc0bda5f972c1b959079370dc985415c33d247 100644 (file)
--- a/tuple.c
+++ b/tuple.c
@@ -63,7 +63,7 @@ set_tuplefield_int4(TupleField *tuple_field, Int4 value)
 {
    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-...) */
index 6e512c40441f03a5131db83bf7e621c08e0414f6..43e13d19cfcf608fde0547fd6d456ed928fe1427 100644 (file)
--- a/version.h
+++ b/version.h
@@ -9,8 +9,8 @@
 #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,0
 
 #endif
index 47ab93abed1527bf9199d80bb9bb45c5e2183cac..0094da220531648ba634af712ed95e82f109fcfc 100644 (file)
@@ -128,9 +128,10 @@ SQLULEN    utf8_to_ucs2_lf(const char *utf8str, SQLLEN ilen, BOOL lfconv, SQLWCHAR
        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]))