*/
#include "columninfo.h"
+#include "connection.h"
#include "socket.h"
#include <stdlib.h>
#include <malloc.h>
rv->adtid = NULL;
rv->adtsize = NULL;
rv->display_size = NULL;
+ rv->atttypmod = NULL;
}
return rv;
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));
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);
free(self->adtid);
free(self->adtsize);
free(self->display_size);
+
+ free(self->atttypmod);
}
void
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
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;
}
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)
#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
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",
// 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);
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);
}
+ /* 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);
#include "config.h"
#endif
+#include "psqlodbc.h"
+
#ifndef WIN32
#include "iodbc.h"
#include "isql.h"
#include <sqlext.h>
#endif
-#include "psqlodbc.h"
typedef enum {
CONN_NOT_CONNECTED, /* Connection has not been established */
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;
/* 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 */
#include <string.h>
#include <ctype.h>
+#include "psqlodbc.h"
+
#ifndef WIN32
#include "iodbc.h"
#include "isql.h"
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, */
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);
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);
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);
/* 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));
/* 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));
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, "",
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);
#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 */
#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
SDWORD cbSqlStr)
{
StatementClass *stmt = (StatementClass *) hstmt;
-RETCODE SQL_API result;
+RETCODE result;
static char *func = "SQLExecDirect";
mylog( "%s: entering...\n", func);
return;
strcpy(filename,dirname);
- strcat(filename,DIRSEPARATOR);
+ strcat(filename,DIRSEPERATOR);
if(prefix != 0)
strcat(filename,prefix);
#ifndef WIN32
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);
}
/* 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);
typedef UInt4 Oid;
+# define ODBCVER 0x0200
/* Limits */
#define MAX_MESSAGE_LEN 8192
/* 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"
#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;
char debug;
char commlog;
char disable_optimizer;
+ char ksqo;
char unique_index;
char readonly;
char use_declarefetch;
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
RIGHTMARGIN, 260
VERTGUIDE, 55
TOPMARGIN, 7
- BOTTOMMARGIN, 163
+ BOTTOMMARGIN, 154
END
END
#endif // APSTUDIO_INVOKED
//
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
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"
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);
// 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);
}
// 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;
for ( ; ;) {
id = SOCK_get_char(sock);
+
switch (id) {
case 'T': /* Tuples within tuples cannot be handled */
self->status = PGRES_BAD_RESPONSE;
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);
#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))
#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
#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
#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
//
#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
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);
#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
#include "config.h"
#endif
+#include "psqlodbc.h"
+
#ifndef WIN32
#include "iodbc.h"
#include "isql.h"
#include <sql.h>
#endif
-#include "psqlodbc.h"
#ifndef FALSE
#define FALSE (BOOL)0