]> granicus.if.org Git - postgresql/commitdiff
Update for version 06-40-0001
authorByron Nikolaidis <byronn@insightdist.com>
Wed, 11 Nov 1998 21:54:01 +0000 (21:54 +0000)
committerByron Nikolaidis <byronn@insightdist.com>
Wed, 11 Nov 1998 21:54:01 +0000 (21:54 +0000)
19 files changed:
src/interfaces/odbc/columninfo.c
src/interfaces/odbc/columninfo.h
src/interfaces/odbc/connection.c
src/interfaces/odbc/connection.h
src/interfaces/odbc/convert.c
src/interfaces/odbc/dlg_specific.c
src/interfaces/odbc/dlg_specific.h
src/interfaces/odbc/execute.c
src/interfaces/odbc/misc.c
src/interfaces/odbc/misc.h
src/interfaces/odbc/pgtypes.c
src/interfaces/odbc/psqlodbc.h
src/interfaces/odbc/psqlodbc.rc
src/interfaces/odbc/qresult.c
src/interfaces/odbc/qresult.h
src/interfaces/odbc/resource.h
src/interfaces/odbc/results.c
src/interfaces/odbc/socket.h
src/interfaces/odbc/statement.h

index 41e6e74635104dcd5eef59e92f18597465b50a0e..fed86d5dcd88db6ad2f2f0b713251aeada642879 100644 (file)
@@ -13,6 +13,7 @@
  */
 
 #include "columninfo.h"
+#include "connection.h"
 #include "socket.h"
 #include <stdlib.h>
 #include <malloc.h>
@@ -31,6 +32,7 @@ ColumnInfoClass *rv;
                rv->adtid = NULL;
                rv->adtsize = NULL;
                rv->display_size = NULL;
+               rv->atttypmod = NULL;
        }
 
        return rv;
@@ -49,14 +51,19 @@ CI_Destructor(ColumnInfoClass *self)
        If self is null, then just read, don't store.
 */
 char
-CI_read_fields(ColumnInfoClass *self, SocketClass *sock)
+CI_read_fields(ColumnInfoClass *self, ConnectionClass *conn)
 {
 Int2 lf;
 int new_num_fields;
 Oid new_adtid;
 Int2 new_adtsize;
+Int4 new_atttypmod = -1;
 char new_field_name[MAX_MESSAGE_LEN+1];
+SocketClass *sock;
+ConnInfo *ci;
 
+       sock = CC_get_socket(conn);
+       ci = &conn->connInfo;
 
        /* at first read in the number of fields that are in the query */
        new_num_fields = (Int2) SOCK_get_int(sock, sizeof(Int2));
@@ -74,10 +81,23 @@ char new_field_name[MAX_MESSAGE_LEN+1];
                new_adtid = (Oid) SOCK_get_int(sock, 4);
                new_adtsize = (Int2) SOCK_get_int(sock, 2);
 
-               mylog("CI_read_fields: fieldname='%s', adtid=%d, adtsize=%d\n", new_field_name, new_adtid, new_adtsize);
+               /*      If 6.4 protocol, then read the atttypmod field */
+               if ( ! PROTOCOL_63(ci) && ! PROTOCOL_62(ci)) {
+
+                       mylog("READING ATTTYPMOD\n");
+                       new_atttypmod = (Int4) SOCK_get_int(sock, 4);
+
+                       /*      Subtract the header length */
+                       new_atttypmod -= 4;
+                       if (new_atttypmod < 0)
+                               new_atttypmod = -1;
+
+               }
+
+               mylog("CI_read_fields: fieldname='%s', adtid=%d, adtsize=%d, atttypmod=%d\n", new_field_name, new_adtid, new_adtsize, new_atttypmod);
 
                if (self)
-                       CI_set_field_info(self, lf, new_field_name, new_adtid, new_adtsize);
+                       CI_set_field_info(self, lf, new_field_name, new_adtid, new_adtsize, new_atttypmod);
        }
 
        return (SOCK_get_errcode(sock) == 0);
@@ -101,6 +121,8 @@ int num_fields = self->num_fields;
        free(self->adtid);
        free(self->adtsize);
        free(self->display_size);
+
+       free(self->atttypmod);
 }
 
 void
@@ -114,11 +136,12 @@ CI_set_num_fields(ColumnInfoClass *self, int new_num_fields)
        self->adtid = (Oid *) malloc (sizeof(Oid) * self->num_fields);
        self->adtsize = (Int2 *) malloc (sizeof(Int2) * self->num_fields);
        self->display_size = (Int2 *) malloc(sizeof(Int2) * self->num_fields);
+       self->atttypmod = (Int4 *) malloc(sizeof(Int4) * self->num_fields);
 }
 
 void
 CI_set_field_info(ColumnInfoClass *self, int field_num, char *new_name, 
-                                      Oid new_adtid, Int2 new_adtsize)
+                                      Oid new_adtid, Int2 new_adtsize, Int4 new_atttypmod)
 {
     
        // check bounds
@@ -130,6 +153,7 @@ CI_set_field_info(ColumnInfoClass *self, int field_num, char *new_name,
        self->name[field_num] = strdup(new_name);  
        self->adtid[field_num] = new_adtid;
        self->adtsize[field_num] = new_adtsize;
+       self->atttypmod[field_num] = new_atttypmod;
 
        self->display_size[field_num] = 0;
 }
index 01c654da844f5ec5b4d654d30e3163162b528a4a..3ec1cc92d50e3edee351f108a9dfed30f65f091c 100644 (file)
@@ -18,6 +18,7 @@ struct ColumnInfoClass_ {
        Oid             *adtid;                         /* list of type ids */
        Int2    *adtsize;                       /* list type sizes */
        Int2    *display_size;          /* the display size (longest row) */
+       Int4    *atttypmod;                     /* the length of bpchar/varchar */
 };
 
 #define CI_get_num_fields(self)                        (self->num_fields)
@@ -25,17 +26,18 @@ struct ColumnInfoClass_ {
 #define CI_get_fieldname(self, col)            (self->name[col])
 #define CI_get_fieldsize(self, col)            (self->adtsize[col])
 #define CI_get_display_size(self, col) (self->display_size[col])
+#define CI_get_atttypmod(self, col)            (self->atttypmod[col])
 
 ColumnInfoClass *CI_Constructor(void);
 void CI_Destructor(ColumnInfoClass *self);
 void CI_free_memory(ColumnInfoClass *self);
-char CI_read_fields(ColumnInfoClass *self, SocketClass *sock);
+char CI_read_fields(ColumnInfoClass *self, ConnectionClass *conn);
 
 /* functions for setting up the fields from within the program, */
 /* without reading from a socket */
 void CI_set_num_fields(ColumnInfoClass *self, int new_num_fields);
 void CI_set_field_info(ColumnInfoClass *self, int field_num, char *new_name, 
-                       Oid new_adtid, Int2 new_adtsize);
+                       Oid new_adtid, Int2 new_adtsize, Int4 atttypmod);
 
 
 #endif
index 3857f73d708d6cefd43ffcde1e45c05875f91125..c07b0510705f5aa1f1e336d5986395468329e452 100644 (file)
@@ -472,8 +472,9 @@ static char *func="CC_connect";
                        globals.unknown_sizes, 
                        globals.max_varchar_size, 
                        globals.max_longvarchar_size);
-               qlog("                disable_optimizer=%d, unique_index=%d, use_declarefetch=%d\n",
+               qlog("                disable_optimizer=%d, ksqo=%d, unique_index=%d, use_declarefetch=%d\n",
                        globals.disable_optimizer,
+                       globals.ksqo,
                        globals.unique_index,
                        globals.use_declarefetch);
                qlog("                text_as_longvarchar=%d, unknowns_as_longvarchar=%d, bools_as_char=%d\n",
@@ -542,7 +543,11 @@ static char *func="CC_connect";
                        // Send length of Authentication Block
                        SOCK_put_int(sock, 4+sizeof(StartupPacket), 4); 
 
-                       sp.protoVersion = (ProtocolVersion) htonl(PG_PROTOCOL_LATEST);
+                       if ( PROTOCOL_63(ci))
+                               sp.protoVersion = (ProtocolVersion) htonl(PG_PROTOCOL_63);
+                       else
+                               sp.protoVersion = (ProtocolVersion) htonl(PG_PROTOCOL_LATEST);
+
                        strncpy(sp.database, ci->database, SM_DATABASE);
                        strncpy(sp.user, ci->username, SM_USER);
 
@@ -913,22 +918,41 @@ char cmdbuffer[MAX_MESSAGE_LEN+1];        // QR_set_command() dups this string so dont
 
                                SOCK_put_string(sock, "Q ");
                                SOCK_flush_output(sock);
-                               while(!clear) {
-                                       SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH);
-                                       mylog("send_query: read command '%s'\n", cmdbuffer);
-                                       clear = (cmdbuffer[0] == 'I');
-
-                                       if (cmdbuffer[0] == 'N')
-                                               qlog("NOTICE from backend during send_query: '%s'\n", &cmdbuffer[1]);
-                                       else if (cmdbuffer[0] == 'E')
-                                               qlog("ERROR from backend during send_query: '%s'\n", &cmdbuffer[1]);
-                                       else if (cmdbuffer[0] == 'C')
-                                               qlog("Command response: '%s'\n", &cmdbuffer[1]);
-                               }
 
+                               while( ! clear) {
+                                       id = SOCK_get_char(sock);
+                                       switch(id) {
+                                       case 'I':
+                                               (void) SOCK_get_char(sock);
+                                               clear = TRUE;
+                                               break;
+                                       case 'Z':
+                                               break;
+                                       case 'C':
+                                               SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH);
+                                               qlog("Command response: '%s'\n", cmdbuffer);
+                                               break;
+                                       case 'N':
+                                               SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH);
+                                               qlog("NOTICE from backend during clear: '%s'\n", cmdbuffer);
+                                               break;
+                                       case 'E':
+                                               SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH);
+                                               qlog("ERROR from backend during clear: '%s'\n", cmdbuffer);
+                                               break;
+                                       }
+                               }
+                               
                                mylog("send_query: returning res = %u\n", res);
                                return res;
                        }
+               case 'K':       /* Secret key (6.4 protocol) */
+                       (void)SOCK_get_int(sock, 4); /* pid */
+                       (void)SOCK_get_int(sock, 4); /* key */
+
+                       break;
+               case 'Z':       /* Backend is ready for new query (6.4) */
+                       break;
                case 'N' : /* NOTICE: */
                        SOCK_get_string(sock, cmdbuffer, ERROR_MSG_LENGTH);
 
@@ -1209,6 +1233,16 @@ static char *func="CC_send_settings";
        
        }
 
+       /*      KSQO */
+       if (globals.ksqo) {
+               result = SQLExecDirect(hstmt, "set ksqo to 'ON'", SQL_NTS);
+               if((result != SQL_SUCCESS) && (result != SQL_SUCCESS_WITH_INFO))
+                       status = FALSE;
+
+               mylog("%s: result %d, status %d from set ksqo\n", func, result, status);
+       
+       }
+
        /*      Global settings */
        if (globals.conn_settings[0] != '\0') {
                cs = strdup(globals.conn_settings);
index 895e4ce826bca8d01026083e7cdbc356d015a211..3340e15cbeed0a2cc8a14b25970c16b225d31fc1 100644 (file)
@@ -14,6 +14,8 @@
 #include "config.h"
 #endif
 
+#include "psqlodbc.h"
+
 #ifndef WIN32
 #include "iodbc.h"
 #include "isql.h"
@@ -24,7 +26,6 @@
 #include <sqlext.h>
 #endif
 
-#include "psqlodbc.h"
 
 typedef enum {
     CONN_NOT_CONNECTED,      /* Connection has not been established */
@@ -100,10 +101,11 @@ typedef enum {
 typedef unsigned int ProtocolVersion;
 
 #define PG_PROTOCOL(major, minor)      (((major) << 16) | (minor))
-#define PG_PROTOCOL_LATEST             PG_PROTOCOL(1, 0)
-#define PG_PROTOCOL_EARLIEST   PG_PROTOCOL(0, 0)
+#define PG_PROTOCOL_LATEST             PG_PROTOCOL(2, 0)
+#define PG_PROTOCOL_63                 PG_PROTOCOL(1, 0)
+#define PG_PROTOCOL_62                 PG_PROTOCOL(0, 0)
 
-/*     This startup packet is to support latest Postgres protocol (6.3) */
+/*     This startup packet is to support latest Postgres protocol (6.4, 6.3) */
 typedef struct _StartupPacket
 {
        ProtocolVersion protoVersion;
@@ -154,6 +156,8 @@ typedef struct {
 /*     Macro to determine is the connection using 6.2 protocol? */
 #define PROTOCOL_62(conninfo_)         (strncmp((conninfo_)->protocol, PG62, strlen(PG62)) == 0)
 
+/*     Macro to determine is the connection using 6.3 protocol? */
+#define PROTOCOL_63(conninfo_)         (strncmp((conninfo_)->protocol, PG63, strlen(PG63)) == 0)
 
 
 /*     This is used to store cached table information in the connection */
index 1389c7ca3a41c57239d274a9572a9b95ba23cc5d..a5b3cbfd3f4c354b762ca4c99e86692d379c7986 100644 (file)
@@ -24,6 +24,8 @@
 #include <string.h>
 #include <ctype.h>
 
+#include "psqlodbc.h"
+
 #ifndef WIN32
 #include "iodbc.h"
 #include "isql.h"
@@ -120,7 +122,7 @@ struct tm *tim;
        st.d = tim->tm_mday;
        st.y = tim->tm_year + 1900;
 
-       mylog("copy_and_convert: field_type = %d, fctype = %d, value = '%s', cbValueMax=%d\n", field_type, fCType, (value==NULL)?"<NULL>":value, cbValueMax);
+       mylog("copy_and_convert: field_type = %d, fctype = %d, value = '%s', cbValueMax=%d\n", field_type, fCType, value, cbValueMax);
 
        if ( ! value) {
         /* handle a null just by returning SQL_NULL_DATA in pcbValue, */
index 82e7e5a2b8dd261f8358d668e95bc7e632392708..371b2d7ad891a32ebf86191da1b52d70764cecdf 100644 (file)
@@ -87,6 +87,7 @@ int CALLBACK driver_optionsProc(HWND   hdlg,
 
                CheckDlgButton(hdlg, DRV_COMMLOG, globals.commlog);
                CheckDlgButton(hdlg, DRV_OPTIMIZER, globals.disable_optimizer);
+               CheckDlgButton(hdlg, DRV_KSQO, globals.ksqo);
                CheckDlgButton(hdlg, DRV_UNIQUEINDEX, globals.unique_index);
                CheckDlgButton(hdlg, DRV_READONLY, globals.readonly);
                CheckDlgButton(hdlg, DRV_USEDECLAREFETCH, globals.use_declarefetch);
@@ -128,6 +129,7 @@ int CALLBACK driver_optionsProc(HWND   hdlg,
 
                        globals.commlog = IsDlgButtonChecked(hdlg, DRV_COMMLOG);
                        globals.disable_optimizer = IsDlgButtonChecked(hdlg, DRV_OPTIMIZER);
+                       globals.ksqo = IsDlgButtonChecked(hdlg, DRV_KSQO);
                        globals.unique_index = IsDlgButtonChecked(hdlg, DRV_UNIQUEINDEX);
                        globals.readonly = IsDlgButtonChecked(hdlg, DRV_READONLY);
                        globals.use_declarefetch = IsDlgButtonChecked(hdlg, DRV_USEDECLAREFETCH);
@@ -168,6 +170,7 @@ int CALLBACK driver_optionsProc(HWND   hdlg,
                case IDDEFAULTS:
                        CheckDlgButton(hdlg, DRV_COMMLOG, DEFAULT_COMMLOG);
                        CheckDlgButton(hdlg, DRV_OPTIMIZER, DEFAULT_OPTIMIZER);
+                       CheckDlgButton(hdlg, DRV_KSQO, DEFAULT_KSQO);
                        CheckDlgButton(hdlg, DRV_UNIQUEINDEX, DEFAULT_UNIQUEINDEX);
                        CheckDlgButton(hdlg, DRV_READONLY, DEFAULT_READONLY);
                        CheckDlgButton(hdlg, DRV_USEDECLAREFETCH, DEFAULT_USEDECLAREFETCH);
@@ -238,8 +241,11 @@ char buf[128];
                /*      Protocol */
                if (strncmp(ci->protocol, PG62, strlen(PG62)) == 0)
                        CheckDlgButton(hdlg, DS_PG62, 1);
-               else
-                       CheckDlgButton(hdlg, DS_PG62, 0);
+               else if (strncmp(ci->protocol, PG63, strlen(PG63)) == 0)
+                       CheckDlgButton(hdlg, DS_PG63, 1);
+               else 
+                       CheckDlgButton(hdlg, DS_PG64, 1);
+
 
 
                CheckDlgButton(hdlg, DS_SHOWOIDCOLUMN, atoi(ci->show_oid_column));
@@ -273,11 +279,11 @@ char buf[128];
                        /*      Protocol */
                        if ( IsDlgButtonChecked(hdlg, DS_PG62))
                                strcpy(ci->protocol, PG62);
-                       else 
+                       else if ( IsDlgButtonChecked(hdlg, DS_PG63))
+                               strcpy(ci->protocol, PG63);
+                       else
                                ci->protocol[0] = '\0';
 
-
-
                        sprintf(ci->show_system_tables, "%d", IsDlgButtonChecked(hdlg, DS_SHOWSYSTEMTABLES));
 
                        sprintf(ci->row_versioning, "%d", IsDlgButtonChecked(hdlg, DS_ROWVERSIONING));
@@ -634,6 +640,13 @@ char temp[256];
        else if ( ! override)
                globals.disable_optimizer = DEFAULT_OPTIMIZER;
 
+       //      KSQO is stored in the driver section only
+       SQLGetPrivateProfileString(section, INI_KSQO, "", 
+                               temp, sizeof(temp), filename);
+       if ( temp[0] ) 
+               globals.ksqo = atoi(temp);
+       else if ( ! override)
+               globals.ksqo = DEFAULT_KSQO;
 
        //      Recognize Unique Index is stored in the driver section only
        SQLGetPrivateProfileString(section, INI_UNIQUEINDEX, "", 
@@ -769,6 +782,10 @@ char tmp[128];
        SQLWritePrivateProfileString(DBMS_NAME,
                INI_OPTIMIZER, tmp, ODBCINST_INI);
 
+       sprintf(tmp, "%d", globals.ksqo);
+       SQLWritePrivateProfileString(DBMS_NAME,
+               INI_KSQO, tmp, ODBCINST_INI);
+
        sprintf(tmp, "%d", globals.unique_index);
        SQLWritePrivateProfileString(DBMS_NAME,
                INI_UNIQUEINDEX, tmp, ODBCINST_INI);
index b4e5ef05f1501dbb343ae487931f4c42e56cb053..829c9aeab7d0f56659b64992d2f9ca83e06c755e 100644 (file)
@@ -59,6 +59,7 @@
 #define INI_COMMLOG       "CommLog"                    /* Communication to backend logging */
 #define INI_PROTOCOL      "Protocol"           /* What protocol (6.2) */
 #define INI_OPTIMIZER     "Optimizer"          /* Use backend genetic optimizer */
+#define INI_KSQO          "Ksqo"            /* Keyset query optimization */
 #define INI_CONNSETTINGS  "ConnSettings"       /* Anything to send to backend on successful connection */
 #define INI_UNIQUEINDEX   "UniqueIndex"                /* Recognize unique indexes */
 #define INI_UNKNOWNSIZES  "UnknownSizes"       /* How to handle unknown result set sizes */
@@ -93,6 +94,7 @@
 #define DEFAULT_UNKNOWNSASLONGVARCHAR  0
 #define DEFAULT_BOOLSASCHAR                            1
 #define DEFAULT_OPTIMIZER                              1               // disable
+#define DEFAULT_KSQO                                   1               // on
 #define DEFAULT_UNIQUEINDEX                            0               // dont recognize
 #define DEFAULT_COMMLOG                                        0               // dont log
 #define DEFAULT_DEBUG                                  0
index 1baaaffc71f90e003253a1b7af61de32f7c1934b..d87859c9fc6971dcda3db7123f206d89a99d04ce 100644 (file)
@@ -129,7 +129,7 @@ RETCODE SQL_API SQLExecDirect(
         SDWORD    cbSqlStr)
 {
 StatementClass *stmt = (StatementClass *) hstmt;
-RETCODE SQL_API result;
+RETCODE result;
 static char *func = "SQLExecDirect";
 
        mylog( "%s: entering...\n", func);
index 94a116299b1a07748761bef70ab2e183123ac20a..7e1501842c6ce98248887920a60dd0943b0a42bf 100644 (file)
@@ -44,7 +44,7 @@ generate_filename(char* dirname,char* prefix,char* filename)
                return;
 
        strcpy(filename,dirname);
-       strcat(filename,DIRSEPARATOR);
+       strcat(filename,DIRSEPERATOR);
        if(prefix != 0)
                strcat(filename,prefix);
 #ifndef WIN32
index 10cb5114d13a0597e5217d632575e41f03761cef..194a08161c85695c1a96cd33ae460f2b2eba77b6 100644 (file)
@@ -26,7 +26,7 @@
        portion of the registry.  You may have to manually add this key.
        This logfile is intended for development use, not for an end user!
 */
-#define MY_LOG
+// #define MY_LOG
 
 
 /*     Uncomment Q_LOG to compile in the qlog() statements (Communications log, i.e. CommLog).
 
 
 #ifdef MY_LOG
-  #define MYLOGFILE    "mylog_"
-  #ifndef WIN32
-    #define MYLOGDIR   "/tmp"
-  #else
-    #define MYLOGDIR   "c:"
-  #endif
-  void mylog();        /* prototype */
+#define MYLOGFILE      "mylog_"
+#ifndef WIN32
+#define MYLOGDIR       "/tmp"
+#else
+#define MYLOGDIR       "c:"
+#endif
+void mylog();  /* prototype */
 #else
-  #ifndef WIN32
-    #define mylog(args...)     /* GNU convention for variable arguments */
-  #else
-    #define mylog    // mylog
-  #endif
+#define mylog    // mylog
 #endif
 
 #ifdef Q_LOG
-  #define QLOGFILE     "psqlodbc_"
-  #ifndef WIN32
-    #define QLOGDIR            "/tmp"
-  #else
-    #define QLOGDIR            "c:"
-  #endif
-  void qlog(); /* prototype */
+#define QLOGFILE       "psqlodbc_"
+#ifndef WIN32
+#define QLOGDIR                "/tmp"
+#else
+#define QLOGDIR                "c:"
+#endif
+void qlog();   /* prototype */
 #else
-  #ifndef WIN32
-    #define qlog(args...)      /* GNU convention for variable arguments */
-  #else
-    #define qlog    // qlog
-  #endif
+#define qlog    // qlog
 #endif
 
 #ifndef WIN32
-#define DIRSEPARATOR   "/"
+#define DIRSEPERATOR   "/"
 #else
-#define DIRSEPARATOR   "\\"
+#define DIRSEPERATOR   "\\"
 #endif
 
 void remove_newlines(char *string);
index 24ef584374441c57d66b7c20e9c8a0e527fe7441..cdd9fc2654a7fada8b16d4b93ee1ec51fceadb86 100644 (file)
@@ -242,6 +242,9 @@ mylog("getCharPrecision: type=%d, col=%d, unknown = %d\n", type,col,handle_unkno
        }
 
        /*      Size is unknown -- handle according to parameter */
+       if (QR_get_atttypmod(result, col) > -1)
+               return QR_get_atttypmod(result, col);
+
        if (type == PG_TYPE_BPCHAR || handle_unknown_size_as == UNKNOWNS_AS_LONGEST) {
                p = QR_get_display_size(result, col);
                mylog("getCharPrecision: LONGEST: p = %d\n", p);
index 05b3ee3018d184e90d70a28b1608d9e87ff1628c..d00c67dd82bed37cd784f79d1e781fdb48370f73 100644 (file)
@@ -33,6 +33,7 @@ typedef double SDOUBLE;
 
 typedef UInt4 Oid;
 
+# define ODBCVER   0x0200
 
 /* Limits */
 #define MAX_MESSAGE_LEN                                8192
@@ -69,8 +70,8 @@ typedef UInt4 Oid;
 /* Driver stuff */
 #define DRIVERNAME             "PostgreSQL ODBC"
 #define DBMS_NAME              "PostgreSQL"
-#define DBMS_VERSION           "06.30.0250 PostgreSQL 6.3"
-#define POSTGRESDRIVERVERSION  "06.30.0250"
+#define DBMS_VERSION           "06.40.0001 PostgreSQL 6.4"
+#define POSTGRESDRIVERVERSION  "06.40.0001"
 
 #ifdef WIN32
 #define DRIVER_FILE_NAME               "PSQLODBC.DLL"
@@ -79,7 +80,7 @@ typedef UInt4 Oid;
 #endif
 
 #define PG62   "6.2"           /* "Protocol" key setting to force Postgres 6.2 */
-
+#define PG63   "6.3"           /* "Protocol" key setting to force postgres 6.3 */
 
 typedef struct ConnectionClass_ ConnectionClass;
 typedef struct StatementClass_ StatementClass;
@@ -106,6 +107,7 @@ typedef struct GlobalValues_
        char                            debug;
        char                            commlog;
        char                            disable_optimizer;
+       char                            ksqo;
        char                            unique_index;
        char                            readonly;
        char                            use_declarefetch;
index 3e6cafded4e7c58622a70f29d2798328c70baef9..779e82fea6e9c442f8dca83d3a6b301ee14a54f7 100644 (file)
@@ -88,78 +88,77 @@ CAPTION "Advanced Options (Driver)"
 FONT 8, "MS Sans Serif"
 BEGIN
     CONTROL         "Disable Genetic &Optimizer",DRV_OPTIMIZER,"Button",
-                    BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,15,10,97,10
+                    BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,15,5,97,10
     CONTROL         "Comm&Log (C:\\psqlodbc.log)",DRV_COMMLOG,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,140,10,113,10
-    CONTROL         "Recognize Unique &Indexes",DRV_UNIQUEINDEX,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,15,25,101,10
+                    BS_AUTOCHECKBOX | WS_TABSTOP,140,5,113,10
+    CONTROL         "&KSQO (Keyset Query Optimization)",DRV_KSQO,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,15,20,124,10
     CONTROL         "&ReadOnly (Default)",DRV_READONLY,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,140,25,80,10
-    CONTROL         "&Use Declare/Fetch",DRV_USEDECLAREFETCH,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,15,40,80,10
+                    BS_AUTOCHECKBOX | WS_TABSTOP,140,20,80,10
+    CONTROL         "Recognize Unique &Indexes",DRV_UNIQUEINDEX,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,15,35,101,10
     CONTROL         "P&arse Statements",DRV_PARSE,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,140,40,80,10
-    GROUPBOX        "Unknown Sizes",IDC_STATIC,10,55,175,25
+                    WS_TABSTOP,140,35,80,10
+    CONTROL         "&Use Declare/Fetch",DRV_USEDECLAREFETCH,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,15,50,80,10
+    GROUPBOX        "Unknown Sizes",IDC_STATIC,10,65,175,25
     CONTROL         "Maximum",DRV_UNKNOWN_MAX,"Button",BS_AUTORADIOBUTTON | 
-                    WS_GROUP | WS_TABSTOP,15,65,45,10
+                    WS_GROUP | WS_TABSTOP,15,76,45,10
     CONTROL         "Don't Know",DRV_UNKNOWN_DONTKNOW,"Button",
-                    BS_AUTORADIOBUTTON | WS_TABSTOP,70,65,53,10
+                    BS_AUTORADIOBUTTON | WS_TABSTOP,70,76,53,10
     CONTROL         "Longest",DRV_UNKNOWN_LONGEST,"Button",
-                    BS_AUTORADIOBUTTON | WS_TABSTOP,130,65,50,10
-    GROUPBOX        "Data Type Options",IDC_STATIC,10,85,270,25
+                    BS_AUTORADIOBUTTON | WS_TABSTOP,130,76,50,10
+    GROUPBOX        "Data Type Options",IDC_STATIC,10,95,270,25
     CONTROL         "Text as LongVarChar",DRV_TEXT_LONGVARCHAR,"Button",
-                    BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,15,95,80,10
+                    BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,15,105,80,10
     CONTROL         "Unknowns as LongVarChar",DRV_UNKNOWNS_LONGVARCHAR,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,105,95,100,10
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,105,105,100,10
     CONTROL         "Bools as Char",DRV_BOOLS_CHAR,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,215,95,60,10
-    LTEXT           "&Cache Size:",IDC_STATIC,10,120,40,10
-    EDITTEXT        DRV_CACHE_SIZE,50,120,35,12,ES_AUTOHSCROLL
-    LTEXT           "Max &Varchar:",IDC_STATIC,90,120,45,10
-    EDITTEXT        DRV_VARCHAR_SIZE,135,120,35,12,ES_AUTOHSCROLL
-    LTEXT           "Max Lon&gVarChar:",IDC_STATIC,180,120,60,10
-    EDITTEXT        DRV_LONGVARCHAR_SIZE,240,120,35,12,ES_AUTOHSCROLL
-    LTEXT           "SysTable &Prefixes:",IDC_STATIC,15,135,35,20
-    EDITTEXT        DRV_EXTRASYSTABLEPREFIXES,50,140,75,12,ES_AUTOHSCROLL
-    RTEXT           "Connect &Settings:",IDC_STATIC,10,165,35,25
-    EDITTEXT        DRV_CONNSETTINGS,50,160,225,35,ES_MULTILINE | 
+                    WS_TABSTOP,215,105,60,10
+    LTEXT           "&Cache Size:",IDC_STATIC,10,130,40,10
+    EDITTEXT        DRV_CACHE_SIZE,50,130,35,12,ES_AUTOHSCROLL
+    LTEXT           "Max &Varchar:",IDC_STATIC,90,130,45,10
+    EDITTEXT        DRV_VARCHAR_SIZE,135,130,35,12,ES_AUTOHSCROLL
+    LTEXT           "Max Lon&gVarChar:",IDC_STATIC,180,130,60,10
+    EDITTEXT        DRV_LONGVARCHAR_SIZE,240,130,35,12,ES_AUTOHSCROLL
+    LTEXT           "SysTable &Prefixes:",IDC_STATIC,15,145,35,20
+    EDITTEXT        DRV_EXTRASYSTABLEPREFIXES,50,151,75,12,ES_AUTOHSCROLL
+    RTEXT           "Connect &Settings:",IDC_STATIC,10,170,35,20
+    EDITTEXT        DRV_CONNSETTINGS,50,170,225,25,ES_MULTILINE | 
                     ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN
     DEFPUSHBUTTON   "OK",IDOK,45,205,50,14,WS_GROUP
     PUSHBUTTON      "Cancel",IDCANCEL,115,205,50,14
     PUSHBUTTON      "Defaults",IDDEFAULTS,185,205,50,15
 END
 
-DLG_OPTIONS_DS DIALOG DISCARDABLE  0, 0, 267, 170
+DLG_OPTIONS_DS DIALOG DISCARDABLE  0, 0, 267, 161
 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "Advanced Options (DataSource)"
 FONT 8, "MS Sans Serif"
 BEGIN
     CONTROL         "&ReadOnly",DS_READONLY,"Button",BS_AUTOCHECKBOX | 
-                    WS_GROUP | WS_TABSTOP,25,10,45,15
-    CONTROL         "&6.2 Protocol",DS_PG62,"Button",BS_AUTOCHECKBOX | 
-                    WS_TABSTOP,130,10,60,14
-    CONTROL         "Show System &Tables",DS_SHOWSYSTEMTABLES,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,25,30,85,10
+                    WS_GROUP | WS_TABSTOP,25,10,53,10
     CONTROL         "Row &Versioning",DS_ROWVERSIONING,"Button",
-                    BS_AUTOCHECKBOX | WS_TABSTOP,130,30,85,10
-    GROUPBOX        "OID Options",IDC_STATIC,15,50,180,25
+                    BS_AUTOCHECKBOX | WS_TABSTOP,130,10,85,10
+    CONTROL         "Show System &Tables",DS_SHOWSYSTEMTABLES,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,25,25,85,10
+    GROUPBOX        "Protocol",IDC_STATIC,15,40,180,25
+    CONTROL         "6.4",DS_PG64,"Button",BS_AUTORADIOBUTTON | WS_GROUP,25,
+                    50,26,10
+    CONTROL         "6.3",DS_PG63,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,
+                    75,50,26,10
+    CONTROL         "6.2",DS_PG62,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,
+                    130,50,26,10
+    GROUPBOX        "OID Options",IDC_STATIC,15,70,180,25
     CONTROL         "Show &Column",DS_SHOWOIDCOLUMN,"Button",BS_AUTOCHECKBOX | 
-                    WS_GROUP | WS_TABSTOP,25,60,59,10
+                    WS_GROUP | WS_TABSTOP,25,81,59,10
     CONTROL         "Fake &Index",DS_FAKEOIDINDEX,"Button",BS_AUTOCHECKBOX | 
-                    WS_GROUP | WS_TABSTOP,115,60,51,10
-    RTEXT           "Connect &Settings:",IDC_STATIC,10,90,35,25
-    EDITTEXT        DS_CONNSETTINGS,50,85,200,35,ES_MULTILINE | 
+                    WS_GROUP | WS_TABSTOP,115,81,51,10
+    RTEXT           "Connect &Settings:",IDC_STATIC,10,105,35,25
+    EDITTEXT        DS_CONNSETTINGS,50,105,200,20,ES_MULTILINE | 
                     ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN
-    DEFPUSHBUTTON   "OK",IDOK,65,130,50,14,WS_GROUP
-    PUSHBUTTON      "Cancel",IDCANCEL,140,130,50,14
-    GROUPBOX        "Unknown Sizes",IDC_STATIC,10,145,175,25,NOT WS_VISIBLE
-    CONTROL         "Maximum",DS_UNKNOWN_MAX,"Button",BS_AUTORADIOBUTTON | 
-                    NOT WS_VISIBLE | WS_GROUP | WS_TABSTOP,15,155,45,10
-    CONTROL         "Don't Know",DS_UNKNOWN_DONTKNOW,"Button",
-                    BS_AUTORADIOBUTTON | NOT WS_VISIBLE | WS_TABSTOP,70,155,
-                    53,10
-    CONTROL         "Longest",DS_UNKNOWN_LONGEST,"Button",BS_AUTORADIOBUTTON | 
-                    NOT WS_VISIBLE | WS_TABSTOP,130,155,50,10
+    DEFPUSHBUTTON   "OK",IDOK,71,135,50,14,WS_GROUP
+    PUSHBUTTON      "Cancel",IDCANCEL,146,135,50,14
 END
 
 
@@ -190,7 +189,7 @@ BEGIN
         RIGHTMARGIN, 260
         VERTGUIDE, 55
         TOPMARGIN, 7
-        BOTTOMMARGIN, 163
+        BOTTOMMARGIN, 154
     END
 END
 #endif    // APSTUDIO_INVOKED
@@ -203,8 +202,8 @@ END
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 6,30,2,50
- PRODUCTVERSION 6,30,2,50
+ FILEVERSION 6,40,0,1
+ PRODUCTVERSION 6,40,0,1
  FILEFLAGSMASK 0x3L
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -222,12 +221,12 @@ BEGIN
             VALUE "Comments", "PostgreSQL ODBC driver for Windows 95\0"
             VALUE "CompanyName", "Insight Distribution Systems\0"
             VALUE "FileDescription", "PostgreSQL Driver\0"
-            VALUE "FileVersion", " 6.30.0250\0"
+            VALUE "FileVersion", " 6.40.0001\0"
             VALUE "InternalName", "psqlodbc\0"
             VALUE "LegalTrademarks", "ODBC(TM) is a trademark of Microsoft Corporation.  Microsoft® is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation.\0"
             VALUE "OriginalFilename", "psqlodbc.dll\0"
             VALUE "ProductName", "Microsoft Open Database Connectivity\0"
-            VALUE "ProductVersion", " 6.30.0250\0"
+            VALUE "ProductVersion", " 6.40.0001\0"
         END
     END
     BLOCK "VarFileInfo"
index cae730d8ae2ad3c71058c38c67201ea9abc10df8..d5ee8407c80670f8410cecaff4080c62ad6b9967 100644 (file)
@@ -186,8 +186,7 @@ QR_fetch_tuples(QResultClass *self, ConnectionClass *conn, char *cursor)
        if (conn != NULL) {
                self->conn = conn;
 
-               mylog("QR_fetch_tuples: cursor = '%s', self->cursor=%u\n", 
-               (cursor==NULL)?"":cursor, self->cursor);
+               mylog("QR_fetch_tuples: cursor = '%s', self->cursor=%u\n", cursor, self->cursor);
 
                if (self->cursor)
                        free(self->cursor);
@@ -203,7 +202,7 @@ QR_fetch_tuples(QResultClass *self, ConnectionClass *conn, char *cursor)
 
                //      Read the field attributes.
                //      $$$$ Should do some error control HERE! $$$$
-               if ( CI_read_fields(self->fields, CC_get_socket(self->conn))) {
+               if ( CI_read_fields(self->fields, self->conn)) {
                        self->status = PGRES_FIELDS_OK;
                        self->num_fields = CI_get_num_fields(self->fields);
                }
@@ -236,7 +235,7 @@ QR_fetch_tuples(QResultClass *self, ConnectionClass *conn, char *cursor)
                //      Always have to read the field attributes.
                //      But we dont have to reallocate memory for them!
 
-               if ( ! CI_read_fields(NULL, CC_get_socket(self->conn))) {
+               if ( ! CI_read_fields(NULL, self->conn)) {
                        self->status = PGRES_BAD_RESPONSE;
                        QR_set_message(self, "Error reading field information");
                        return FALSE;
@@ -369,6 +368,7 @@ char cmdbuffer[MAX_MESSAGE_LEN+1];  // QR_set_command() dups this string so dont
        for ( ; ;) {
 
                id = SOCK_get_char(sock);
+
                switch (id) {
                case 'T': /* Tuples within tuples cannot be handled */
                        self->status = PGRES_BAD_RESPONSE;
@@ -441,6 +441,8 @@ char cmdbuffer[MAX_MESSAGE_LEN+1];  // QR_set_command() dups this string so dont
                        continue;
 
                default: /* this should only happen if the backend dumped core */
+                       mylog("QR_next_tuple: Unexpected result from backend: id = '%c' (%d)\n", id, id);
+                       qlog("QR_next_tuple: Unexpected result from backend: id = '%c' (%d)\n", id, id);
                        QR_set_message(self, "Unexpected result from backend. It probably crashed");
                        self->status = PGRES_FATAL_ERROR;
                        CC_set_no_trans(self->conn);
index f05830d6d4b77142ead94f65dca33dd395ae077e..7cc2303173b6303cb098ae893591464c4c6d1fde 100644 (file)
@@ -72,12 +72,13 @@ struct QResultClass_ {
 #define QR_get_fieldname(self, fieldno_)       (CI_get_fieldname(self->fields, fieldno_))
 #define QR_get_fieldsize(self, fieldno_)       (CI_get_fieldsize(self->fields, fieldno_))    
 #define QR_get_display_size(self, fieldno_)    (CI_get_display_size(self->fields, fieldno_))    
+#define QR_get_atttypmod(self, fieldno_)       (CI_get_atttypmod(self->fields, fieldno_))    
 #define QR_get_field_type(self, fieldno_)   (CI_get_oid(self->fields, fieldno_))
 
 /*     These functions are used only for manual result sets */
 #define QR_get_num_tuples(self)                                (self->manual_tuples ? TL_get_num_tuples(self->manual_tuples) : self->fcount)
 #define QR_add_tuple(self, new_tuple)          (TL_add_tuple(self->manual_tuples, new_tuple))
-#define QR_set_field_info(self, field_num, name, adtid, adtsize)  (CI_set_field_info(self->fields, field_num, name, adtid, adtsize))
+#define QR_set_field_info(self, field_num, name, adtid, adtsize)  (CI_set_field_info(self->fields, field_num, name, adtid, adtsize, -1))
 
 /* status macros */
 #define QR_command_successful(self)            ( !(self->status == PGRES_BAD_RESPONSE || self->status == PGRES_NONFATAL_ERROR || self->status == PGRES_FATAL_ERROR))
index c69953fe8dffca31593336bc12129328d2cde652..16db18bbd2caa1beb54c0c54b891c952c67f23ee 100644 (file)
@@ -24,8 +24,6 @@
 #define DRV_OPTIMIZER                   1019
 #define DS_CONNSETTINGS                 1020
 #define IDC_DRIVER                      1021
-#define DS_UNKNOWN_MAX                  1023
-#define DS_UNKNOWN_DONTKNOW             1024
 #define DRV_CONNSETTINGS                1031
 #define DRV_UNIQUEINDEX                 1032
 #define DRV_UNKNOWN_MAX                 1035
@@ -34,7 +32,6 @@
 #define IDC_DESCTEXT                    1039
 #define DRV_MSG_LABEL                   1040
 #define DRV_UNKNOWN_LONGEST             1041
-#define DS_UNKNOWN_LONGEST              1042
 #define DRV_TEXT_LONGVARCHAR            1043
 #define DRV_UNKNOWNS_LONGVARCHAR        1044
 #define DRV_CACHE_SIZE                  1045
@@ -48,6 +45,9 @@
 #define DS_ROWVERSIONING                1052
 #define DRV_PARSE                       1052
 #define IDC_OPTIONS                     1054
+#define DRV_KSQO                        1055
+#define DS_PG64                         1057
+#define DS_PG63                         1058
 
 // Next default values for new objects
 // 
@@ -55,7 +55,7 @@
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NEXT_RESOURCE_VALUE        104
 #define _APS_NEXT_COMMAND_VALUE         40001
-#define _APS_NEXT_CONTROL_VALUE         1055
+#define _APS_NEXT_CONTROL_VALUE         1060
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif
index 6bac9d0ede5bc5d798e57402141fe520234f7399..5d9dfc30fbb85b66e11b366c3e247d36c5e2f85c 100644 (file)
@@ -855,7 +855,7 @@ mylog("SQLFetch: stmt = %u, stmt->result= %u\n", stmt, stmt->result);
                                value = QR_get_value_backend_row(res, stmt->currTuple, lf);
                        }
 
-                       mylog("value = '%s'\n", (value==NULL)?"<NULL>":value);
+                       mylog("value = '%s'\n", value);
 
                        retval = copy_and_convert_field_bindinfo(stmt, type, value, lf);
 
index 50418f9942fb5ebb372c322d9f97d7c82649ac48..d57d012a48fb2c69f6d48c90a1da8fab85689dfa 100644 (file)
 #include <arpa/inet.h>
 #define closesocket(xxx) close(xxx)
 #define SOCKETFD int
-#ifndef       INADDR_NONE
-#ifndef _IN_ADDR_T
-#define _IN_ADDR_T
-typedef unsigned int    in_addr_t;
-#endif
-#define INADDR_NONE ((in_addr_t)-1)
-#endif
 #else
 #include <winsock.h>
 #define SOCKETFD SOCKET
index 52b64278c113f83baba6328b1d4a8b671da067e9..e9661ad83ad8fd9af5e0bf813b483086ea6ee190 100644 (file)
@@ -14,6 +14,8 @@
 #include "config.h"
 #endif
 
+#include "psqlodbc.h"
+
 #ifndef WIN32
 #include "iodbc.h"
 #include "isql.h"
@@ -22,7 +24,6 @@
 #include <sql.h>
 #endif
 
-#include "psqlodbc.h"
 
 #ifndef FALSE
 #define FALSE  (BOOL)0