Update for version 06-40-0001

This commit is contained in:
Byron Nikolaidis 1998-11-11 21:54:01 +00:00
parent f03729c621
commit 87225ca31d
19 changed files with 210 additions and 132 deletions

View 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;
}

View 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

View 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);

View 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 */

View 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, */

View 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);

View 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

View 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);

View 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

View 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).
@ -39,41 +39,33 @@
#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
#ifndef WIN32
#define mylog(args...) /* GNU convention for variable arguments */
#else
#define mylog // mylog
#endif
#define MYLOGDIR "c:"
#endif
void mylog(); /* prototype */
#else
#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
#ifndef WIN32
#define qlog(args...) /* GNU convention for variable arguments */
#else
#define qlog // qlog
#endif
#define QLOGDIR "c:"
#endif
void qlog(); /* prototype */
#else
#define qlog // qlog
#endif
#ifndef WIN32
#define DIRSEPARATOR "/"
#define DIRSEPERATOR "/"
#else
#define DIRSEPARATOR "\\"
#define DIRSEPERATOR "\\"
#endif
void remove_newlines(char *string);

View 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);

View 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;

View 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"

View 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);

View 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))

View 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

View 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);

View File

@ -23,13 +23,6 @@
#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

View 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