1. Remove the implicit sslverify option and add 'verify-ca' and 'verify-full'
authorHiroshi Inoue <inoue@tpf.co.jp>
Fri, 24 Apr 2009 22:30:48 +0000 (22:30 +0000)
committerHiroshi Inoue <inoue@tpf.co.jp>
Fri, 24 Apr 2009 22:30:48 +0000 (22:30 +0000)
   to the sslmode option.
2. Take the platforms where char is unsigned into account per report from Alex Goncharov.

17 files changed:
bind.c
configure.ac
connection.c
connection.h
convert.c
dlg_specific.c
dlg_specific.h
dlg_wingui.c
environ.c
loadlib.c
loadlib.h
psqlodbc.h
psqlodbc.rc
resource.h
statement.c
statement.h
version.h

diff --git a/bind.c b/bind.c
index b97f148dcab69d2e29803cfadaa5e05260ed0941..f8c270439b308a2495453a26f265e63392802f09 100644 (file)
--- a/bind.c
+++ b/bind.c
@@ -471,7 +471,7 @@ inolog("num_params=%d,%d\n", stmt->num_params, stmt->proc_return);
    }
    else
    {
-       char    multi = FALSE, proc_return = 0;
+       po_ind_t multi = FALSE, proc_return = 0;
 
        stmt->proc_return = 0;
        SC_scanQueryAndCountParams(stmt->statement, SC_get_conn(stmt), NULL, pcpar, &multi, &proc_return);
index 6813ffd5c8588d08e5c816fb08a918f44a4dc7f0..efac22d268fdb77dba371ad4c92137d6e3150802 100644 (file)
@@ -197,6 +197,7 @@ AC_HEADER_TIME
 AC_CHECK_SIZEOF(long)
 AC_CHECK_SIZEOF(void *)
 AC_CHECK_TYPES(long long)
+AC_CHECK_TYPES(signed char)
 
 AC_CHECK_TYPES(ssize_t)
 AC_TYPE_SIZE_T
@@ -238,7 +239,7 @@ if test "$enable_pthreads" = yes; then
 fi
 
 # 8. Libltdl
-AC_CHECK_LIB(ltdl, lt_dloepn)
+AC_CHECK_LIB(ltdl, lt_dlopen)
 
 
 AC_CONFIG_FILES([Makefile])
index c48a7cfc100a8f052ac6794753b92d291137f16b..e75b23df01cf6cc1b7337abb1207078dc4de7b7b 100644 (file)
@@ -1083,18 +1083,34 @@ static int  protocol3_opts_array(ConnectionClass *self, const char *opts[][2], BO
        {
            case '\0':
                break;
-           case 'd':
+           case SSLLBYTE_VERIFY:
                opts[cnt][0] = "sslmode";
-               opts[cnt++][1] = ci->sslmode;
+               if (ssl_verify_available())
+               {
+                   switch (ci->sslmode[1])
+                   {
+                       case 'f':
+                           opts[cnt++][1] = SSLMODE_VERIFY_FULL;
+                               break;
+                       case 'c':
+                           opts[cnt++][1] = SSLMODE_VERIFY_CA;
+                               break;
+                       default:
+                           opts[cnt++][1] = ci->sslmode;
+                   }
+               }
+               else
+               {
+                   char msg[128];
+
+                   snprintf(msg, sizeof(msg), "sslmode=%s can't be specified for 8.3 or older version of libpq", ci->sslmode);
+                   CC_set_error(self, CONN_NOT_IMPLEMENTED_ERROR, msg, __FUNCTION__); 
+                   return -1;
+               }
                break;
            default:
                opts[cnt][0] = "sslmode";
                opts[cnt++][1] = ci->sslmode;
-               if (sslverify_needed())
-               {
-                   opts[cnt][0] = "sslverify";
-                   opts[cnt++][1] = "none";
-               }
        }
        if (ci->password[0])
        {
@@ -1136,6 +1152,8 @@ static int    protocol3_packet_build(ConnectionClass *self)
    int cnt, i;
 
    cnt = protocol3_opts_array(self, opts, FALSE, sizeof(opts) / sizeof(opts[0]));
+   if (cnt < 0)
+       return 0;
 
    slen =  sizeof(ProtocolVersion);
    for (i = 0; i < cnt; i++)
@@ -1188,6 +1206,8 @@ static char   *protocol3_opts_build(ConnectionClass *self)
    BOOL    blankExist;
 
    cnt = protocol3_opts_array(self, opts, TRUE, sizeof(opts) / sizeof(opts[0]));
+   if (cnt < 0)
+       return NULL;
 
    slen =  sizeof(ProtocolVersion);
    for (i = 0, slen = 0; i < cnt; i++)
@@ -1388,14 +1408,15 @@ original_CC_connect(ConnectionClass *self, char password_req, char *salt_para)
        ssl_try_count = 0;
        switch (self->connInfo.sslmode[0])
        {
-           case 'r':
+           case SSLLBYTE_REQUIRE:
+           case SSLLBYTE_VERIFY:
                ssl_call[ssl_try_count++] = 'y';
                break;
-           case 'p':
+           case SSLLBYTE_PREFER:
                ssl_call[ssl_try_count++] = 'y';
                ssl_call[ssl_try_count++] = 'n';
                break;
-           case 'a':
+           case SSLLBYTE_ALLOW:
                ssl_call[ssl_try_count++] = 'n';
                ssl_call[ssl_try_count++] = 'y';
                break;
@@ -1821,7 +1842,7 @@ CC_connect(ConnectionClass *self, char password_req, char *salt_para)
 #ifndef    NOT_USE_LIBPQ
    if (self->connInfo.username[0] == '\0')
        call_libpq = TRUE;
-   else if (self->connInfo.sslmode[0] != 'd'
+   else if (self->connInfo.sslmode[0] != SSLLBYTE_DISABLE
 #ifdef USE_SSPI
    {
        if (0 == (SchannelService & self->svcs_allowed))
@@ -3662,7 +3683,8 @@ inolog("sock=%p\n", sock);
 
    if (!(conninfo = protocol3_opts_build(self)))
    {
-       CC_set_error(self, CONN_OPENDB_ERROR, "Couldn't allcate conninfo", func);
+       if (CC_get_errornumber(self) <= 0)
+           CC_set_error(self, CONN_OPENDB_ERROR, "Couldn't allcate conninfo", func);
        goto cleanup1;
    }
    pqconn = CALL_PQconnectdb(conninfo, &libpqLoaded);
index 060190974132e653cb4fd42ab1c6265df5940306..f0d6d047e49b62314a120eb2d4b43c1858a2ac6a 100644 (file)
@@ -286,7 +286,7 @@ typedef struct
    char        conn_settings[LARGE_REGISTRY_LEN];
    char        protocol[SMALL_REGISTRY_LEN];
    char        port[SMALL_REGISTRY_LEN];
-   char        sslmode[SMALL_REGISTRY_LEN];
+   char        sslmode[16];
    char        onlyread[SMALL_REGISTRY_LEN];
    char        fake_oid_index[SMALL_REGISTRY_LEN];
    char        show_oid_column[SMALL_REGISTRY_LEN];
index ab46fb01dc485ac59772244a78ee30feaeb4e79d..2688ea12af9cc8d55e3012905949bfb3d6b198fb 100644 (file)
--- a/convert.c
+++ b/convert.c
@@ -2325,7 +2325,8 @@ RETCODE   prep_params(StatementClass *stmt, QueryParse *qp, QueryBuild *qb)
    BOOL        ret, once_descr;
    ConnectionClass *conn = SC_get_conn(stmt);
    QResultClass    *res, *dest_res = NULL;
-   char        plan_name[32], multi;
+   char        plan_name[32];
+   po_ind_t    multi;
    int     func_cs_count = 0;
    const char  *orgquery = NULL, *srvquery = NULL;
    Int4        endp1, endp2;
index 82c0b9198ebfd9a9fb3e8e0cd685dbadcd6465a1..c5a35234e2072c02d163882d733897befb0da709 100644 (file)
@@ -129,6 +129,40 @@ UInt4  add_removeExtraOptions(ConnInfo *ci, UInt4 aflag, UInt4 dflag)
    return (ci->extra_opts = getExtraOptions(ci));
 }
 
+static const char *
+abbrev_sslmode(const char *sslmode, char *abbrevmode)
+{
+   switch (sslmode[0])
+   {
+       case SSLLBYTE_DISABLE:
+       case SSLLBYTE_ALLOW:
+       case SSLLBYTE_PREFER:
+       case SSLLBYTE_REQUIRE:
+           abbrevmode[0] = sslmode[0];
+           abbrevmode[1] = '\0';
+           break;
+       case SSLLBYTE_VERIFY:
+           abbrevmode[0] = sslmode[0];
+           abbrevmode[2] = '\0';
+           switch (sslmode[1])
+           {
+               case 'f':
+               case 'c':
+                   abbrevmode[1] = sslmode[1];
+                   break;
+               default:
+                   if (strnicmp(sslmode, "verify_", 7) == 0)
+                   {
+                       abbrevmode[1] = sslmode[7];
+                   }
+                   else
+                       strcpy(abbrevmode, sslmode);    
+           }
+           break;
+   } 
+   return abbrevmode;
+}
+
 void
 makeConnectString(char *connect_string, const ConnInfo *ci, UWORD len)
 {
@@ -310,8 +344,12 @@ inolog("hlen=%d", hlen);
            flag |= BIT_LOWERCASEIDENTIFIER;
 
        if (ci->sslmode[0])
+       {
+           char    abbrevmode[sizeof(ci->sslmode)];
+
            olen = snprintf(&connect_string[hlen], nlen, ";"
-               ABBR_SSLMODE "=%c", ci->sslmode[0]);
+               ABBR_SSLMODE "=%s", abbrev_sslmode(ci->sslmode, abbrevmode));
+       }
        hlen = strlen(connect_string);
        nlen = MAX_CONNECT_STRING - hlen;
        olen = snprintf(&connect_string[hlen], nlen, ";"
@@ -522,16 +560,29 @@ copyAttributes(ConnInfo *ci, const char *attribute, const char *value)
    {
        switch (value[0])
        {
-           case 'a':
+           case SSLLBYTE_ALLOW:
                strcpy(ci->sslmode, SSLMODE_ALLOW);
                break;
-           case 'p':
+           case SSLLBYTE_PREFER:
                strcpy(ci->sslmode, SSLMODE_PREFER);
                break;
-           case 'r':
+           case SSLLBYTE_REQUIRE:
                strcpy(ci->sslmode, SSLMODE_REQUIRE);
                break;
-           case 'd':
+           case SSLLBYTE_VERIFY:
+               switch (value[1])
+               {
+                   case 'f':
+                       strcpy(ci->sslmode, SSLMODE_VERIFY_FULL);
+                       break;
+                   case 'c':
+                       strcpy(ci->sslmode, SSLMODE_VERIFY_CA);
+                       break;
+                   default:
+                       strcpy(ci->sslmode, value);
+               }
+               break;
+           case SSLLBYTE_DISABLE:
            default:
                strcpy(ci->sslmode, SSLMODE_DISABLE);
                break;
index 37f1064d0825cafd294f79cfe7ec5ea6fe6598a9..84e09f4ef47119e11299d50274f816681ce5d264 100644 (file)
@@ -149,6 +149,13 @@ extern "C" {
 #define    SSLMODE_ALLOW       "allow"
 #define    SSLMODE_PREFER      "prefer"
 #define    SSLMODE_REQUIRE     "require"
+#define    SSLMODE_VERIFY_CA   "verify-ca"
+#define    SSLMODE_VERIFY_FULL "verify-full"
+#define    SSLLBYTE_DISABLE    'd'
+#define    SSLLBYTE_ALLOW      'a'
+#define    SSLLBYTE_PREFER     'p'
+#define    SSLLBYTE_REQUIRE    'r'
+#define    SSLLBYTE_VERIFY     'v'
 
 #ifdef _HANDLE_ENLIST_IN_DTC_
 #define INI_XAOPT          "XaOpt"
index 5114987af61c23c1fe5ab8963a39085c72b3d8e0..b0f2464e8730639102591a807692c064cc83b190 100644 (file)
@@ -33,11 +33,25 @@ extern HINSTANCE NEAR s_hModule;
 static int driver_optionsDraw(HWND, const ConnInfo *, int src, BOOL enable);
 static int driver_options_update(HWND hdlg, ConnInfo *ci, const char *);
 
+static struct {
+   int ids;
+   const char * const  modestr;
+} modetab[] = {
+         {IDS_SSLREQUEST_DISABLE, SSLMODE_DISABLE}
+       , {IDS_SSLREQUEST_ALLOW, SSLMODE_ALLOW}
+       , {IDS_SSLREQUEST_PREFER, SSLMODE_PREFER}
+       , {IDS_SSLREQUEST_REQUIRE, SSLMODE_REQUIRE}
+       , {IDS_SSLREQUEST_VERIFY_CA, SSLMODE_VERIFY_CA}
+       , {IDS_SSLREQUEST_VERIFY_FULL, SSLMODE_VERIFY_FULL}
+   };
+static int dspcount_bylevel[] = {1, 4, 6};
+
 void
 SetDlgStuff(HWND hdlg, const ConnInfo *ci)
 {
    char    buff[MEDIUM_REGISTRY_LEN + 1];
    BOOL    libpq_exist = FALSE;
+   int i, dsplevel, selidx, dspcount;
 
    /*
     * If driver attribute NOT present, then set the datasource name and
@@ -52,6 +66,7 @@ SetDlgStuff(HWND hdlg, const ConnInfo *ci)
    SetDlgItemText(hdlg, IDC_PASSWORD, ci->password);
    SetDlgItemText(hdlg, IDC_PORT, ci->port);
 
+   dsplevel = 0;
    libpq_exist = SSLLIB_check();
 mylog("libpq_exist=%d\n", libpq_exist);
    if (libpq_exist)
@@ -60,28 +75,36 @@ mylog("libpq_exist=%d\n", libpq_exist);
    {
 mylog("SendMessage CTL_COLOR\n");
        SendMessage(GetDlgItem(hdlg, IDC_NOTICE_USER), WM_CTLCOLOR, 0, 0);
+       if (ssl_verify_available())
+           dsplevel = 2;
+       else
+           dsplevel = 1;
    }
-   LoadString(GetWindowInstance(hdlg), IDS_SSLREQUEST_DISABLE, buff, MEDIUM_REGISTRY_LEN);
-   SendDlgItemMessage(hdlg, IDC_SSLMODE, CB_ADDSTRING, 0, (WPARAM) buff);
-   if (libpq_exist || (ci->sslmode[0] && stricmp(ci->sslmode, "disable")))
+
+   selidx = -1;
+   for (i = 0; i < sizeof(modetab) / sizeof(modetab[0]); i++)
    {
-       LoadString(GetWindowInstance(hdlg), IDS_SSLREQUEST_PREFER, buff, MEDIUM_REGISTRY_LEN);
-       SendDlgItemMessage(hdlg, IDC_SSLMODE, CB_ADDSTRING, 0, (WPARAM) buff);
-       LoadString(GetWindowInstance(hdlg), IDS_SSLREQUEST_ALLOW, buff, MEDIUM_REGISTRY_LEN);
-       SendDlgItemMessage(hdlg, IDC_SSLMODE, CB_ADDSTRING, 0, (WPARAM) buff);
-       LoadString(GetWindowInstance(hdlg), IDS_SSLREQUEST_REQUIRE, buff, MEDIUM_REGISTRY_LEN);
+       if (!stricmp(ci->sslmode, modetab[i].modestr))
+       {
+           selidx = i;
+           break;
+       }
+   }
+   for (i = dsplevel; i < sizeof(dspcount_bylevel) / sizeof(int); i++)
+   {
+       if (selidx < dspcount_bylevel[i])
+           break;
+       dsplevel++;
+   }
+   
+   dspcount = dspcount_bylevel[dsplevel];
+   for (i = 0; i < dspcount; i++)
+   {
+       LoadString(GetWindowInstance(hdlg), modetab[i].ids, buff, MEDIUM_REGISTRY_LEN);
        SendDlgItemMessage(hdlg, IDC_SSLMODE, CB_ADDSTRING, 0, (WPARAM) buff);
    }
-   if (!stricmp(ci->sslmode, "allow"))
-       LoadString(GetWindowInstance(hdlg), IDS_SSLREQUEST_ALLOW, buff, MEDIUM_REGISTRY_LEN);
-   else if (!stricmp(ci->sslmode, "require"))
-       LoadString(GetWindowInstance(hdlg), IDS_SSLREQUEST_REQUIRE, buff, MEDIUM_REGISTRY_LEN);
-   else if (!stricmp(ci->sslmode, "prefer"))
-       LoadString(GetWindowInstance(hdlg), IDS_SSLREQUEST_PREFER, buff, MEDIUM_REGISTRY_LEN);
-   else
-       LoadString(GetWindowInstance(hdlg), IDS_SSLREQUEST_DISABLE, buff, MEDIUM_REGISTRY_LEN);
 
-   SendDlgItemMessage(hdlg, IDC_SSLMODE, CB_SELECTSTRING, -1, (WPARAM) ((LPSTR) buff));
+   SendDlgItemMessage(hdlg, IDC_SSLMODE, CB_SETCURSEL, selidx, (WPARAM) 0);
 }
 
 
@@ -98,17 +121,7 @@ GetDlgStuff(HWND hdlg, ConnInfo *ci)
    GetDlgItemText(hdlg, IDC_PASSWORD, ci->password, sizeof(ci->password));
    GetDlgItemText(hdlg, IDC_PORT, ci->port, sizeof(ci->port));
    sslposition = (int)(DWORD)SendMessage(GetDlgItem(hdlg, IDC_SSLMODE), CB_GETCURSEL, 0L, 0L);
-   switch (sslposition)
-   {
-       case 1: strncpy_null(ci->sslmode, "prefer", sizeof(ci->sslmode));
-           break;
-       case 2: strncpy_null(ci->sslmode, "allow", sizeof(ci->sslmode));
-           break;
-       case 3: strncpy_null(ci->sslmode, "require", sizeof(ci->sslmode));
-           break;
-       default:strncpy_null(ci->sslmode, "disable", sizeof(ci->sslmode));
-           break;
-   }
+   strncpy_null(ci->sslmode, modetab[sslposition].modestr, sizeof(ci->sslmode));
 }
 
 
@@ -508,7 +521,7 @@ ds_options2Proc(HWND hdlg,
            CheckDlgButton(hdlg, DS_READONLY, atoi(ci->onlyread));
 
            /* Protocol */
-           enable = (ci->sslmode[0] == 'd' || ci->username[0] == '\0');
+           enable = (ci->sslmode[0] == SSLLBYTE_DISABLE || ci->username[0] == '\0');
            EnableWindow(GetDlgItem(hdlg, DS_PG62), enable);
            EnableWindow(GetDlgItem(hdlg, DS_PG63), enable);
            EnableWindow(GetDlgItem(hdlg, DS_PG64), enable);
index d96e760c622329858169cc6983b50dc4d35cd0d3..651663e4485dac856baabe2190d285942b6ed447 100644 (file)
--- a/environ.c
+++ b/environ.c
@@ -388,7 +388,7 @@ PGAPI_ConnectError( HDBC hdbc,
        }
    }
 
-   mylog("      szSqlState = '%s',len=%d, szError='%s'\n", szSqlState, msglen, szErrorMsg);
+   mylog("      szSqlState = '%s',len=%d, szError='%s'\n", szSqlState ? (char *) szSqlState : PRINT_NULL, msglen, szErrorMsg ? (char *) szErrorMsg : PRINT_NULL);
    if (once_again)
    {
        CC_set_errornumber(conn, status);
index 6cf8d991debaca31eec85449c65d8b5a1abaac7f..2223f24dc97df5d0cb73a725d694f1c5768abe4e 100644 (file)
--- a/loadlib.c
+++ b/loadlib.c
@@ -245,7 +245,7 @@ static int filter_env2encoding(int level)
 }
 #endif /* _MSC_DELAY_LOAD_IMPORT */
 
-BOOL   sslverify_needed(void)
+BOOL   ssl_verify_available(void)
 {
    if (sslverify_available < 0)
    {
index 2fac4d7515f00ac167138bbabf6ec5bf44ec8615..0f15195b3c562a7d48bffa488aad7e8d4f992c7d 100644 (file)
--- a/loadlib.h
+++ b/loadlib.h
@@ -26,7 +26,7 @@ extern "C" {
 BOOL   SSLLIB_check(void);
 #ifndef    NOT_USE_LIBPQ
 void   *CALL_PQconnectdb(const char *conninfo, BOOL *);
-BOOL   sslverify_needed(void);
+BOOL   ssl_verify_available(void);
 #endif /* NOT_USE_LIBPQ */
 #ifdef _HANDLE_ENLIST_IN_DTC_
 RETCODE    CALL_EnlistInDtc(ConnectionClass *conn, void * pTra, int method);
index 6b73c26b1a647f01010e94e4a25814172f0ab60a..0b9ca02b432f19e75f9542c0cc82e233f977e253 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Comments:       See "notice.txt" for copyright and license information.
  *
- * $Id: psqlodbc.h,v 1.128 2009/04/06 21:32:57 hinoue Exp $
+ * $Id: psqlodbc.h,v 1.129 2009/04/24 22:30:48 hinoue Exp $
  *
  */
 
@@ -124,6 +124,7 @@ typedef UInt4   OID;
 #ifndef    HAVE_SSIZE_T
 typedef    long    ssize_t
 #endif /* HAVE_SSIZE_T */
+
 #if (SIZEOF_VOID_P == SIZEOF_LONG)
 typedef    long    LONG_PTR;
 typedef    unsigned long   ULONG_PTR;
@@ -159,6 +160,11 @@ typedef    unsigned long long ULONG_PTR;
 #ifndef    SQL_IS_LEN
 #define    SQL_IS_LEN  (-1000)
 #endif /* SQL_IS_LEN */
+#ifdef HAVE_SIGNED_CHAR
+typedef    signed char po_ind_t;
+#else
+typedef char   po_ind_t;
+#endif /* HAVE_SIGNED_CHAR */
 
 #ifndef WIN32
 #if !defined(WITH_UNIXODBC) && !defined(WITH_IODBC)
index 38a046f900eeced1d7973856997328c44023cf9c..1ac1c6dadef75807a15d4271093309da47746ba0 100644 (file)
@@ -397,8 +397,10 @@ STRINGTABLE DISCARDABLE
 BEGIN
     IDS_SSLREQUEST_PREFER   "\97D\90æ"
     IDS_SSLREQUEST_ALLOW    "\8dl\97¶"
-    IDS_SSLREQUEST_REQUIRE  "\95K\97v"
+    IDS_SSLREQUEST_REQUIRE  "\95K\90{"
     IDS_SSLREQUEST_DISABLE  "\96³\8cø"
+    IDS_SSLREQUEST_VERIFY_CA   "\95K\90{:\8fØ\96¾\8f\91\94F\8fØ"
+    IDS_SSLREQUEST_VERIFY_FULL "\95K\90{:\8fØ\96¾\8f\91\8a®\91S\94F\8fØ"
 END
 
 #endif    // Japanese resources
@@ -757,6 +759,8 @@ BEGIN
     IDS_SSLREQUEST_ALLOW    "allow"
     IDS_SSLREQUEST_REQUIRE  "require"
     IDS_SSLREQUEST_DISABLE  "disable"
+    IDS_SSLREQUEST_VERIFY_CA       "verify-ca"
+    IDS_SSLREQUEST_VERIFY_FULL     "verify-full"
 END
 
 #endif    // English (U.S.) resources
index aa5743416fc8b83684c080dd31a5a8ff187f0a00..1239facb21f3a2dce55a7be5da9e951e71ca0fbc 100644 (file)
@@ -27,6 +27,8 @@
 #define IDS_SSLREQUEST_REQUIRE     412
 #define IDS_SSLREQUEST_DISABLE     413
 #define IDC_NOTICE_USER            414
+#define IDS_SSLREQUEST_VERIFY_CA   415
+#define IDS_SSLREQUEST_VERIFY_FULL 416
 #define DLG_CONFIG                      1001
 #define IDC_PORT                        1002
 #define DLG_DRIVER_CHANGE               1002
index caa80832458a944bb1b8e2e38448578b02c9fcbd..49e42e64cdac429459d4d0db24d10e12c05691d8 100644 (file)
@@ -237,8 +237,7 @@ PGAPI_FreeStmt(HSTMT hstmt,
            if (STMT_EXECUTING == stmt->status)
            {
                SC_set_error(stmt, STMT_SEQUENCE_ERROR, "Statement is currently executing a transaction.", func);
-               return SQL_ERROR;       /* stmt may be executing a
-                                        * transaction */
+               return SQL_ERROR; /* stmt may be executing a transaction */
            }
            /*
             * Free any cursors and discard any result info.
@@ -856,7 +855,7 @@ inolog("%s statement=%p ommitted=0\n", func, self);
 void
 SC_scanQueryAndCountParams(const char *query, const ConnectionClass *conn,
        Int4 *next_cmd, SQLSMALLINT * pcpar,
-       char *multi_st, char *proc_return)
+       po_ind_t *multi_st, po_ind_t *proc_return)
 {
    CSTR func = "SC_scanQueryAndCountParams";
    char    literal_quote = LITERAL_QUOTE, identifier_quote = IDENTIFIER_QUOTE, dollar_quote = DOLLAR_QUOTE;
@@ -865,7 +864,8 @@ SC_scanQueryAndCountParams(const char *query, const ConnectionClass *conn,
    char    tchar, bchar, escape_in_literal = '\0';
    char    in_literal = FALSE, in_identifier = FALSE,
        in_dollar_quote = FALSE, in_escape = FALSE,
-       del_found = FALSE, multi = FALSE;
+       del_found = FALSE;
+   po_ind_t multi = FALSE;
    SQLSMALLINT num_p;
    encoded_str encstr;
 
@@ -1750,7 +1750,7 @@ SC_execute(StatementClass *self)
        /* || SC_is_with_hold(self) thiw would lose the performance */
         ))
        issue_begin = FALSE;
-   if (issue_begin)
+   else
    {
        switch (self->statement_type)
        {
index 453d61bdcee96f4701bfdf8864822d502b09ac30..a9c41274dca74181aed1bae69783dcd9680399a0 100644 (file)
@@ -226,25 +226,25 @@ struct StatementClass_
    Int2        current_exec_param; /* The current parameter for
                         * SQLPutData */
    PutDataInfo pdata_info;
-   char        parse_status;
-   char        proc_return;
-   char        put_data;   /* Has SQLPutData been called ? */
-   char        catalog_result; /* Is this a result of catalog function ? */
-   char        prepare;    /* is this a prepared statement ? */
-   char        prepared;   /* is this statement already
+   po_ind_t    parse_status;
+   po_ind_t    proc_return;
+   po_ind_t    put_data;   /* Has SQLPutData been called ? */
+   po_ind_t    catalog_result; /* Is this a result of catalog function ? */
+   po_ind_t    prepare;    /* is this a prepared statement ? */
+   po_ind_t    prepared;   /* is this statement already
                     * prepared at the server ? */
-   char        internal;   /* Is this statement being called
+   po_ind_t    internal;   /* Is this statement being called
                             * internally ? */
-   char        transition_status;  /* Transition status */
-   char        multi_statement; /* -1:unknown 0:single 1:multi */
-   char        rbonerr;    /* rollback on error */
-   char        discard_output_params;   /* discard output parameters on parse stage */
-   char        cancel_info;    /* cancel information */
-   char        ref_CC_error;   /* refer to CC_error ? */
-   char        lock_CC_for_rb; /* lock CC for statement rollback ? */
-   char        join_info;  /* have joins ? */
-   char        parse_method;   /* parse_statement is forced or ? */
-   char        curr_param_result; /* current param result is set ? */
+   po_ind_t    transition_status;  /* Transition status */
+   po_ind_t    multi_statement; /* -1:unknown 0:single 1:multi */
+   po_ind_t    rbonerr;    /* rollback on error */
+   po_ind_t    discard_output_params;   /* discard output parameters on parse stage */
+   po_ind_t    cancel_info;    /* cancel information */
+   po_ind_t    ref_CC_error;   /* refer to CC_error ? */
+   po_ind_t    lock_CC_for_rb; /* lock CC for statement rollback ? */
+   po_ind_t    join_info;  /* have joins ? */
+   po_ind_t    parse_method;   /* parse_statement is forced or ? */
+   po_ind_t    curr_param_result; /* current param result is set ? */
    pgNAME      cursor_name;
    char        *plan_name;
 
@@ -486,7 +486,7 @@ int     SC_set_current_col(StatementClass *self, int col);
 void       SC_setInsertedTable(StatementClass *, RETCODE);
 void       SC_scanQueryAndCountParams(const char *, const ConnectionClass *,
            Int4 *next_cmd, SQLSMALLINT *num_params,
-           char *multi, char *proc_return);
+           po_ind_t *multi, po_ind_t *proc_return);
 
 BOOL   SC_IsExecuting(const StatementClass *self);
 BOOL   SC_SetExecuting(StatementClass *self, BOOL on);
index ebf44c46f8e1947970e0bea597ee76d4bc2aeec3..6daedb47cccb3146dea4f3053f36598a33bb5a42 100644 (file)
--- a/version.h
+++ b/version.h
@@ -12,6 +12,6 @@
 #define POSTGRESDRIVERVERSION      "08.04.0100"
 #define POSTGRES_RESOURCE_VERSION  "08.04.0100\0"
 #define PG_DRVFILE_VERSION     8,4,01,00
-#define PG_BUILD_VERSION       "200904080001"
+#define PG_BUILD_VERSION       "200904250001"
 
 #endif