⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dlg_specific.c

📁 postgresql-odbc,跨平台应用
💻 C
📖 第 1 页 / 共 3 页
字号:
/*------- * Module:			dlg_specific.c * * Description:		This module contains any specific code for handling *					dialog boxes such as driver/datasource options.  Both the *					ConfigDSN() and the SQLDriverConnect() functions use *					functions in this module.  If you were to add a new option *					to any dialog box, you would most likely only have to change *					things in here rather than in 2 separate places as before. * * Classes:			none * * API functions:	none * * Comments:		See "notice.txt" for copyright and license information. *------- *//* Multibyte support	Eiji Tokuya 2001-03-15 */#include <ctype.h>#include "dlg_specific.h"#include "convert.h"#include "multibyte.h"#include "pgapifunc.h"extern GLOBAL_VALUES globals;static void encode(const UCHAR *in, UCHAR *out);static void decode(const UCHAR *in, UCHAR *out);UInt4	getExtraOptions(const ConnInfo *ci){	UInt4	flag = 0;	if (ci->force_abbrev_connstr)		flag |= BIT_FORCEABBREVCONNSTR;	if (ci->fake_mss)		flag |= BIT_FAKE_MSS;	if (ci->bde_environment)		flag |= BIT_BDE_ENVIRONMENT;	if (ci->cvt_null_date_string)		flag |= BIT_CVT_NULL_DATE;			return flag;}CSTR	hex_format = "%x";CSTR	dec_format = "%u";CSTR	octal_format = "%o";static UInt4	replaceExtraOptions(ConnInfo *ci, UInt4 flag, BOOL overwrite){	if (overwrite || ci->force_abbrev_connstr < 0)		ci->force_abbrev_connstr = (0 != (flag & BIT_FORCEABBREVCONNSTR));	if (overwrite || ci->fake_mss < 0)		ci->fake_mss = (0 != (flag & BIT_FAKE_MSS));	if (overwrite || ci->bde_environment < 0)		ci->bde_environment = (0 != (flag & BIT_BDE_ENVIRONMENT));	if (overwrite || ci->cvt_null_date_string < 0)		ci->cvt_null_date_string = (0 != (flag & BIT_CVT_NULL_DATE));			return getExtraOptions(ci);}BOOL	setExtraOptions(ConnInfo *ci, const char *optstr, const char *format){	UInt4	flag = 0;	if (!format)	{		if ('0' == *optstr)		{			switch (optstr[1])			{				case '\0':					format = dec_format;					break;				case 'x':				case 'X':					optstr += 2;					format = hex_format;					break;				default:					format = octal_format;					break;			}		}		else			format = dec_format;	}			if (sscanf(optstr, format, &flag) < 1)		return FALSE;	replaceExtraOptions(ci, flag, TRUE);	return TRUE;}UInt4	add_removeExtraOptions(ConnInfo *ci, UInt4 aflag, UInt4 dflag){	if (0 != (aflag & BIT_FORCEABBREVCONNSTR))		ci->force_abbrev_connstr = TRUE;	if (0 != (aflag & BIT_FAKE_MSS))		ci->fake_mss = TRUE;	if (0 != (aflag & BIT_BDE_ENVIRONMENT))		ci->bde_environment = TRUE;	if (0 != (aflag & BIT_CVT_NULL_DATE))		ci->cvt_null_date_string = TRUE;	if (0 != (dflag & BIT_FORCEABBREVCONNSTR))		ci->force_abbrev_connstr = FALSE;	if (0 != (dflag & BIT_FAKE_MSS))		ci->fake_mss =FALSE;	if (0 != (dflag & BIT_CVT_NULL_DATE))		ci->cvt_null_date_string = FALSE;	return getExtraOptions(ci);}voidmakeConnectString(char *connect_string, const ConnInfo *ci, UWORD len){	char		got_dsn = (ci->dsn[0] != '\0');	char		encoded_conn_settings[LARGE_REGISTRY_LEN];	ssize_t		hlen, nlen, olen;	/*BOOL		abbrev = (len <= 400);*/	BOOL		abbrev = (len < 1024) || 0 < ci->force_abbrev_connstr;	UInt4		flag;inolog("force_abbrev=%d abbrev=%d\n", ci->force_abbrev_connstr, abbrev);	/* fundamental info */	nlen = MAX_CONNECT_STRING;	olen = snprintf(connect_string, nlen, "%s=%s;DATABASE=%s;SERVER=%s;PORT=%s;UID=%s;PWD=%s",			got_dsn ? "DSN" : "DRIVER",			got_dsn ? ci->dsn : ci->drivername,			ci->database,			ci->server,			ci->port,			ci->username,			ci->password);	if (olen < 0 || olen >= nlen)	{		connect_string[0] = '\0';		return;	}	encode(ci->conn_settings, encoded_conn_settings);	/* extra info */	hlen = strlen(connect_string);	nlen = MAX_CONNECT_STRING - hlen;inolog("hlen=%d", hlen);	if (!abbrev)	{		char	protocol_and[16];				if (ci->rollback_on_error >= 0)			snprintf(protocol_and, sizeof(protocol_and), "%s-%d", ci->protocol, ci->rollback_on_error);		else			strncpy(protocol_and, ci->protocol, sizeof(protocol_and));		olen = snprintf(&connect_string[hlen], nlen, ";"			INI_SSLMODE "=%s;"			INI_READONLY "=%s;"			INI_PROTOCOL "=%s;"			INI_FAKEOIDINDEX "=%s;"			INI_SHOWOIDCOLUMN "=%s;"			INI_ROWVERSIONING "=%s;"			INI_SHOWSYSTEMTABLES "=%s;"			INI_CONNSETTINGS "=%s;"			INI_FETCH "=%d;"			INI_SOCKET "=%d;"			INI_UNKNOWNSIZES "=%d;"			INI_MAXVARCHARSIZE "=%d;"			INI_MAXLONGVARCHARSIZE "=%d;"			INI_DEBUG "=%d;"			INI_COMMLOG "=%d;"			INI_OPTIMIZER "=%d;"			INI_KSQO "=%d;"			INI_USEDECLAREFETCH "=%d;"			INI_TEXTASLONGVARCHAR "=%d;"			INI_UNKNOWNSASLONGVARCHAR "=%d;"			INI_BOOLSASCHAR "=%d;"			INI_PARSE "=%d;"			INI_CANCELASFREESTMT "=%d;"			INI_EXTRASYSTABLEPREFIXES "=%s;"			INI_LFCONVERSION "=%d;"			INI_UPDATABLECURSORS "=%d;"			INI_DISALLOWPREMATURE "=%d;"			INI_TRUEISMINUS1 "=%d;"			INI_INT8AS "=%d;"			INI_BYTEAASLONGVARBINARY "=%d;"			INI_USESERVERSIDEPREPARE "=%d;"			INI_LOWERCASEIDENTIFIER "=%d;"#ifdef	_HANDLE_ENLIST_IN_DTC_			INI_XAOPT "=%d"	/* XAOPT */#endif /* _HANDLE_ENLIST_IN_DTC_ */			,ci->sslmode			,ci->onlyread			,protocol_and			,ci->fake_oid_index			,ci->show_oid_column			,ci->row_versioning			,ci->show_system_tables			,encoded_conn_settings			,ci->drivers.fetch_max			,ci->drivers.socket_buffersize			,ci->drivers.unknown_sizes			,ci->drivers.max_varchar_size			,ci->drivers.max_longvarchar_size			,ci->drivers.debug			,ci->drivers.commlog			,ci->drivers.disable_optimizer			,ci->drivers.ksqo			,ci->drivers.use_declarefetch			,ci->drivers.text_as_longvarchar			,ci->drivers.unknowns_as_longvarchar			,ci->drivers.bools_as_char			,ci->drivers.parse			,ci->drivers.cancel_as_freestmt			,ci->drivers.extra_systable_prefixes			,ci->lf_conversion			,ci->allow_keyset			,ci->disallow_premature			,ci->true_is_minus1			,ci->int8_as			,ci->bytea_as_longvarbinary			,ci->use_server_side_prepare			,ci->lower_case_identifier#ifdef	_HANDLE_ENLIST_IN_DTC_			,ci->xa_opt#endif /* _HANDLE_ENLIST_IN_DTC_ */				);	}	/* Abbreviation is needed ? */	if (abbrev || olen >= nlen || olen < 0)	{		flag = 0;		if (ci->disallow_premature)			flag |= BIT_DISALLOWPREMATURE;		if (ci->allow_keyset)			flag |= BIT_UPDATABLECURSORS;		if (ci->lf_conversion)			flag |= BIT_LFCONVERSION;		if (ci->drivers.unique_index)			flag |= BIT_UNIQUEINDEX;		if (PROTOCOL_74(ci))			flag |= (BIT_PROTOCOL_64 | BIT_PROTOCOL_63);		else if (PROTOCOL_64(ci))			flag |= BIT_PROTOCOL_64;		else if (PROTOCOL_63(ci))			flag |= BIT_PROTOCOL_63;		switch (ci->drivers.unknown_sizes)		{			case UNKNOWNS_AS_DONTKNOW:				flag |= BIT_UNKNOWN_DONTKNOW;				break;			case UNKNOWNS_AS_MAX:				flag |= BIT_UNKNOWN_ASMAX;				break;		}		if (ci->drivers.disable_optimizer)			flag |= BIT_OPTIMIZER;		if (ci->drivers.ksqo)			flag |= BIT_KSQO;		if (ci->drivers.commlog)			flag |= BIT_COMMLOG;		if (ci->drivers.debug)			flag |= BIT_DEBUG;		if (ci->drivers.parse)			flag |= BIT_PARSE;		if (ci->drivers.cancel_as_freestmt)			flag |= BIT_CANCELASFREESTMT;		if (ci->drivers.use_declarefetch)			flag |= BIT_USEDECLAREFETCH;		if (ci->onlyread[0] == '1')			flag |= BIT_READONLY;		if (ci->drivers.text_as_longvarchar)			flag |= BIT_TEXTASLONGVARCHAR;		if (ci->drivers.unknowns_as_longvarchar)			flag |= BIT_UNKNOWNSASLONGVARCHAR;		if (ci->drivers.bools_as_char)			flag |= BIT_BOOLSASCHAR;		if (ci->row_versioning[0] == '1')			flag |= BIT_ROWVERSIONING;		if (ci->show_system_tables[0] == '1')			flag |= BIT_SHOWSYSTEMTABLES;		if (ci->show_oid_column[0] == '1')			flag |= BIT_SHOWOIDCOLUMN;		if (ci->fake_oid_index[0] == '1')			flag |= BIT_FAKEOIDINDEX;		if (ci->true_is_minus1)			flag |= BIT_TRUEISMINUS1;		if (ci->bytea_as_longvarbinary)			flag |= BIT_BYTEAASLONGVARBINARY;		if (ci->use_server_side_prepare)			flag |= BIT_USESERVERSIDEPREPARE;		if (ci->lower_case_identifier)			flag |= BIT_LOWERCASEIDENTIFIER;		if (ci->sslmode[0])			olen = snprintf(&connect_string[hlen], nlen, ";"				ABBR_SSLMODE "=%c", ci->sslmode[0]);		hlen = strlen(connect_string);		nlen = MAX_CONNECT_STRING - hlen;		olen = snprintf(&connect_string[hlen], nlen, ";"				ABBR_CONNSETTINGS "=%s;"				ABBR_FETCH "=%d;"				ABBR_SOCKET "=%d;"				ABBR_MAXVARCHARSIZE "=%d;"				ABBR_MAXLONGVARCHARSIZE "=%d;"				INI_INT8AS "=%d;"				ABBR_EXTRASYSTABLEPREFIXES "=%s;"				INI_ABBREVIATE "=%02x%x",				encoded_conn_settings,				ci->drivers.fetch_max,				ci->drivers.socket_buffersize,				ci->drivers.max_varchar_size,				ci->drivers.max_longvarchar_size,				ci->int8_as,				ci->drivers.extra_systable_prefixes,				EFFECTIVE_BIT_COUNT, flag);		if (olen < nlen && (PROTOCOL_74(ci) || ci->rollback_on_error >= 0))		{			hlen = strlen(connect_string);			nlen = MAX_CONNECT_STRING - hlen;			/*			 * The PROTOCOL setting must be placed after CX flag			 * so that this option can override the CX setting.			 */			if (ci->rollback_on_error >= 0)				olen = snprintf(&connect_string[hlen], nlen, ";"				ABBR_PROTOCOL "=%s-%d",				ci->protocol, ci->rollback_on_error);			else				olen = snprintf(&connect_string[hlen], nlen, ";"				ABBR_PROTOCOL "=%s",				ci->protocol);		}	}	if (olen < nlen)	{		flag = getExtraOptions(ci);		if (0 != flag)		{			hlen = strlen(connect_string);			nlen = MAX_CONNECT_STRING - hlen;			olen = snprintf(&connect_string[hlen], nlen, ";"				INI_EXTRAOPTIONS "=%x;",				flag);		}	}	if (olen < 0 || olen >= nlen) /* failed */		connect_string[0] = '\0';}static voidunfoldCXAttribute(ConnInfo *ci, const char *value){	int	count;	UInt4	flag;	if (strlen(value) < 2)	{		count = 3;		sscanf(value, "%x", &flag);	}	else	{		char	cnt[8];		memcpy(cnt, value, 2);		cnt[2] = '\0';		sscanf(cnt, "%x", &count);		sscanf(value + 2, "%x", &flag);	}	ci->disallow_premature = (char)((flag & BIT_DISALLOWPREMATURE) != 0);	ci->allow_keyset = (char)((flag & BIT_UPDATABLECURSORS) != 0);	ci->lf_conversion = (char)((flag & BIT_LFCONVERSION) != 0);	if (count < 4)		return;	ci->drivers.unique_index = (char)((flag & BIT_UNIQUEINDEX) != 0);	if ((flag & BIT_PROTOCOL_64) != 0)	{		if ((flag & BIT_PROTOCOL_63) != 0)			strcpy(ci->protocol, PG74);		else			strcpy(ci->protocol, PG64);	}	else if ((flag & BIT_PROTOCOL_63) != 0)		strcpy(ci->protocol, PG63);	else		strcpy(ci->protocol, PG62);	if ((flag & BIT_UNKNOWN_DONTKNOW) != 0)		ci->drivers.unknown_sizes = UNKNOWNS_AS_DONTKNOW;	else if ((flag & BIT_UNKNOWN_ASMAX) != 0)		ci->drivers.unknown_sizes = UNKNOWNS_AS_MAX;	else 		ci->drivers.unknown_sizes = UNKNOWNS_AS_LONGEST;	ci->drivers.disable_optimizer = (char)((flag & BIT_OPTIMIZER) != 0);	ci->drivers.ksqo = (char)((flag & BIT_KSQO) != 0);	ci->drivers.commlog = (char)((flag & BIT_COMMLOG) != 0);	ci->drivers.debug = (char)((flag & BIT_DEBUG) != 0);	ci->drivers.parse = (char)((flag & BIT_PARSE) != 0);	ci->drivers.cancel_as_freestmt = (char)((flag & BIT_CANCELASFREESTMT) != 0);	ci->drivers.use_declarefetch = (char)((flag & BIT_USEDECLAREFETCH) != 0);	sprintf(ci->onlyread, "%d", (char)((flag & BIT_READONLY) != 0));	ci->drivers.text_as_longvarchar = (char)((flag & BIT_TEXTASLONGVARCHAR) !=0);	ci->drivers.unknowns_as_longvarchar = (char)((flag & BIT_UNKNOWNSASLONGVARCHAR) !=0);	ci->drivers.bools_as_char = (char)((flag & BIT_BOOLSASCHAR) != 0);	sprintf(ci->row_versioning, "%d", (char)((flag & BIT_ROWVERSIONING) != 0));	sprintf(ci->show_system_tables, "%d", (char)((flag & BIT_SHOWSYSTEMTABLES) != 0));	sprintf(ci->show_oid_column, "%d", (char)((flag & BIT_SHOWOIDCOLUMN) != 0));	sprintf(ci->fake_oid_index, "%d", (char)((flag & BIT_FAKEOIDINDEX) != 0));	ci->true_is_minus1 = (char)((flag & BIT_TRUEISMINUS1) != 0);	ci->bytea_as_longvarbinary = (char)((flag & BIT_BYTEAASLONGVARBINARY) != 0);	ci->use_server_side_prepare = (char)((flag & BIT_USESERVERSIDEPREPARE) != 0);	ci->lower_case_identifier = (char)((flag & BIT_LOWERCASEIDENTIFIER) != 0);}BOOLcopyAttributes(ConnInfo *ci, const char *attribute, const char *value){	CSTR	func = "copyAttributes";	BOOL	found = TRUE;	if (stricmp(attribute, "DSN") == 0)		strcpy(ci->dsn, value);	else if (stricmp(attribute, "driver") == 0)		strcpy(ci->drivername, value);	else if (stricmp(attribute, INI_DATABASE) == 0)		strcpy(ci->database, value);	else if (stricmp(attribute, INI_SERVER) == 0 || stricmp(attribute, SPEC_SERVER) == 0)		strcpy(ci->server, value);	else if (stricmp(attribute, INI_USER) == 0 || stricmp(attribute, INI_UID) == 0)		strcpy(ci->username, value);	else if (stricmp(attribute, INI_PASSWORD) == 0 || stricmp(attribute, "pwd") == 0)		strcpy(ci->password, value);	else if (stricmp(attribute, INI_PORT) == 0)		strcpy(ci->port, value);	else if (stricmp(attribute, INI_READONLY) == 0 || stricmp(attribute, ABBR_READONLY) == 0)		strcpy(ci->onlyread, value);	else if (stricmp(attribute, INI_PROTOCOL) == 0 || stricmp(attribute, ABBR_PROTOCOL) == 0)	{		char	*ptr;		ptr = strchr(value, '-');		if (ptr)		{			if ('-' != *value)			{				*ptr = '\0';				strcpy(ci->protocol, value);			}			ci->rollback_on_error = atoi(ptr + 1);			mylog("rollback_on_error=%d\n", ci->rollback_on_error);		}		else			strcpy(ci->protocol, value);	}	else if (stricmp(attribute, INI_SHOWOIDCOLUMN) == 0 || stricmp(attribute, ABBR_SHOWOIDCOLUMN) == 0)		strcpy(ci->show_oid_column, value);	else if (stricmp(attribute, INI_FAKEOIDINDEX) == 0 || stricmp(attribute, ABBR_FAKEOIDINDEX) == 0)		strcpy(ci->fake_oid_index, value);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -