descriptor.c

来自「postgresql-odbc,跨平台应用」· C语言 代码 · 共 644 行 · 第 1/2 页

C
644
字号
		ConnectionClass	*conn = DC_get_conn(desc);		for (i = 0; i < conn->num_descs; i++)		{			if (conn->descs[i] == desc)			{				conn->descs[i] = NULL;				break;			}		}		free(desc);	}	return ret;}static void BindInfoClass_copy(const BindInfoClass *src, BindInfoClass *target){	memcpy(target, src, sizeof(BindInfoClass));}static void ARDFields_copy(const ARDFields *src, ARDFields *target){	memcpy(target, src, sizeof(ARDFields));	target->bookmark = NULL;	if (src->bookmark)	{		BindInfoClass *bookmark = ARD_AllocBookmark(target);		BindInfoClass_copy(src->bookmark, bookmark);	}	if (src->allocated <= 0)	{		target->allocated = 0;		target->bindings = NULL;	}	else	{		int	i;		target->bindings = malloc(target->allocated * sizeof(BindInfoClass));		for (i = 0; i < target->allocated; i++)			BindInfoClass_copy(&src->bindings[i], &target->bindings[i]);	}}static void ParameterInfoClass_copy(const ParameterInfoClass *src, ParameterInfoClass *target){	memcpy(target, src, sizeof(ParameterInfoClass));}static void APDFields_copy(const APDFields *src, APDFields *target){	memcpy(target, src, sizeof(APDFields));	if (src->bookmark)	{		target->bookmark = malloc(sizeof(BindInfoClass));		ParameterInfoClass_copy(src->bookmark, target->bookmark);	}	if (src->allocated <= 0)	{		target->allocated = 0;		target->parameters = NULL;	}	else	{		int	i;		target->parameters = malloc(target->allocated * sizeof(ParameterInfoClass));		for (i = 0; i < target->allocated; i++)			ParameterInfoClass_copy(&src->parameters[i], &target->parameters[i]);	}}static void ParameterImplClass_copy(const ParameterImplClass *src, ParameterImplClass *target){	memcpy(target, src, sizeof(ParameterImplClass));}static void IPDFields_copy(const IPDFields *src, IPDFields *target){	memcpy(target, src, sizeof(IPDFields));	if (src->allocated <= 0)	{		target->allocated = 0;		target->parameters = NULL;	}	else	{		int	i;		target->parameters = (ParameterImplClass *) malloc(target->allocated * sizeof(ParameterInfoClass));		for (i = 0; i < target->allocated; i++)			ParameterImplClass_copy(&src->parameters[i], &target->parameters[i]);	}}RETCODE	SQL_APIPGAPI_CopyDesc(SQLHDESC SourceDescHandle,			SQLHDESC TargetDescHandle){	CSTR func = "PGAPI_CopyDesc";	RETCODE ret = SQL_ERROR;	DescriptorClass	*src, *target;	ARDFields	*ard_src, *ard_tgt;	APDFields	*apd_src, *apd_tgt;	IPDFields	*ipd_src, *ipd_tgt;	mylog("%s: entering...\n", func);	src = (DescriptorClass *) SourceDescHandle;	target = (DescriptorClass *) TargetDescHandle;	if (!src->type_defined)	{		mylog("source type undefined\n");		DC_set_error(target, DESC_EXEC_ERROR, "source handle type undefined");		return ret;	}	if (target->type_defined)	{inolog("source type=%d -> target type=%d\n", src->desc_type, target->desc_type);		if (SQL_ATTR_IMP_ROW_DESC == target->desc_type)		{			mylog("can't modify IRD\n");			DC_set_error(target, DESC_EXEC_ERROR, "can't copy to IRD");			return ret;		}		else if (target->desc_type != src->desc_type)		{			mylog("src type != target type\n");			DC_set_error(target, DESC_EXEC_ERROR, "src descriptor != target type");			return ret;		}		DC_Destructor(target);	}	ret = SQL_SUCCESS;	switch (src->desc_type)	{		case SQL_ATTR_APP_ROW_DESC:inolog("src=%p target=%p type=%d", src, target, src->desc_type);			if (!target->type_defined)			{				target->desc_type = src->desc_type;			}			ard_src = (ARDFields *) (src + 1);inolog(" rowset_size=%d bind_size=%d ope_ptr=%p off_ptr=%p\n",ard_src->size_of_rowset, ard_src->bind_size,ard_src->row_operation_ptr, ard_src->row_offset_ptr);			ard_tgt = (ARDFields *) (target + 1);inolog(" target=%p", ard_tgt);			ARDFields_copy(ard_src, ard_tgt);inolog(" offset_ptr=%p\n", ard_tgt->row_offset_ptr);			break;		case SQL_ATTR_APP_PARAM_DESC:			if (!target->type_defined)			{				target->desc_type = src->desc_type;			}			apd_src = (APDFields *) (src + 1);			apd_tgt = (APDFields *) (target + 1);			APDFields_copy(apd_src, apd_tgt);			break;		case SQL_ATTR_IMP_PARAM_DESC:			if (!target->type_defined)			{				target->desc_type = src->desc_type;			}			ipd_src = (IPDFields *) (src + 1);			ipd_tgt = (IPDFields *) (target + 1);			IPDFields_copy(ipd_src, ipd_tgt);			break;		default:			mylog("invalid descriptor handle type=%d\n", src->desc_type);			DC_set_error(target, DESC_EXEC_ERROR, "invalid descriptor type");			ret = SQL_ERROR;	}	if (SQL_SUCCESS == ret)		target->type_defined = TRUE;        return ret;}void	DC_clear_error(DescriptorClass *self){	if (self->__error_message)	{		free(self->__error_message);		self->__error_message = NULL;	}	if (self->pgerror)	{		ER_Destructor(self->pgerror);		self->pgerror = NULL;	}	self->__error_number = 0;	self->error_row = 0;	self->error_index = 0;}void    DC_set_error(DescriptorClass *desc, int errornumber, const char *errormsg){	if (desc->__error_message)		free(desc->__error_message);	desc->__error_number = errornumber;	desc->__error_message = errormsg ? strdup(errormsg) : NULL;}void    DC_set_errormsg(DescriptorClass *desc, const char *errormsg){	if (desc->__error_message)		free(desc->__error_message);	desc->__error_message = errormsg ? strdup(errormsg) : NULL;}const char	*DC_get_errormsg(const DescriptorClass *desc){        return desc->__error_message;}int	DC_get_errornumber(const DescriptorClass *desc){        return desc->__error_number;}/*	Map sql commands to statement types */static struct{	int	number;	const	char	* ver3str;	const	char	* ver2str;}	Descriptor_sqlstate[] ={	{ DESC_ERROR_IN_ROW, "01S01", "01S01" },	{ DESC_OPTION_VALUE_CHANGED, "01S02", "01S02" },	{ DESC_OK,  "00000", "00000" }, /* OK */	{ DESC_EXEC_ERROR, "HY000", "S1000" }, /* also a general error */	{ DESC_STATUS_ERROR, "HY010", "S1010" },	{ DESC_SEQUENCE_ERROR, "HY010", "S1010" }, /* Function sequence error */	{ DESC_NO_MEMORY_ERROR, "HY001", "S1001" }, /* memory allocation failure */	{ DESC_COLNUM_ERROR, "07009", "S1002" }, /* invalid column number */	{ DESC_NO_STMTSTRING, "HY001", "S1001" }, /* having no stmtstring is also a malloc problem */	{ DESC_ERROR_TAKEN_FROM_BACKEND, "HY000", "S1000" }, /* general error */	{ DESC_INTERNAL_ERROR, "HY000", "S1000" }, /* general error */	{ DESC_STILL_EXECUTING, "HY010", "S1010" },	{ DESC_NOT_IMPLEMENTED_ERROR, "HYC00", "S1C00" }, /* == 'driver not 							  * capable' */	{ DESC_BAD_PARAMETER_NUMBER_ERROR, "07009", "S1093" },	{ DESC_OPTION_OUT_OF_RANGE_ERROR, "HY092", "S1092" },	{ DESC_INVALID_COLUMN_NUMBER_ERROR, "07009", "S1002" },	{ DESC_RESTRICTED_DATA_TYPE_ERROR, "07006", "07006" },	{ DESC_INVALID_CURSOR_STATE_ERROR, "07005", "24000" },	{ DESC_CREATE_TABLE_ERROR, "42S01", "S0001" }, /* table already exists */	{ DESC_NO_CURSOR_NAME, "S1015", "S1015" },	{ DESC_INVALID_CURSOR_NAME, "34000", "34000" },	{ DESC_INVALID_ARGUMENT_NO, "HY024", "S1009" }, /* invalid argument value */	{ DESC_ROW_OUT_OF_RANGE, "HY107", "S1107" },	{ DESC_OPERATION_CANCELLED, "HY008", "S1008" },	{ DESC_INVALID_CURSOR_POSITION, "HY109", "S1109" },	{ DESC_VALUE_OUT_OF_RANGE, "HY019", "22003" },	{ DESC_OPERATION_INVALID, "HY011", "S1011" },	{ DESC_PROGRAM_TYPE_OUT_OF_RANGE, "?????", "?????" }, 	{ DESC_BAD_ERROR, "08S01", "08S01" }, /* communication link failure */	{ DESC_INVALID_OPTION_IDENTIFIER, "HY092", "HY092" },	{ DESC_RETURN_NULL_WITHOUT_INDICATOR, "22002", "22002" },	{ DESC_INVALID_DESCRIPTOR_IDENTIFIER, "HY091", "HY091" },	{ DESC_OPTION_NOT_FOR_THE_DRIVER, "HYC00", "HYC00" },	{ DESC_FETCH_OUT_OF_RANGE, "HY106", "S1106" },	{ DESC_COUNT_FIELD_INCORRECT, "07002", "07002" },};static	PG_ErrorInfo	*DC_create_errorinfo(const DescriptorClass *desc){	CSTR func = "DC_create_erroinfo";	PG_ErrorInfo	*error;	ConnectionClass	*conn;	EnvironmentClass	*env;	Int4	errornum;	BOOL		env_is_odbc3 = TRUE;	if (desc->pgerror)		return desc->pgerror;	errornum = desc->__error_number;	error = ER_Constructor(errornum, desc->__error_message);	if (!error)		return error;	conn = DC_get_conn(desc);	if (conn && (env = (EnvironmentClass *) conn->henv))		env_is_odbc3 = EN_is_odbc3(env);	errornum -= LOWEST_DESC_ERROR;	if (errornum < 0 ||	    errornum >= sizeof(Descriptor_sqlstate) / sizeof(Descriptor_sqlstate[0]))		errornum = 1 - LOWEST_DESC_ERROR;	strcpy(error->sqlstate, env_is_odbc3 ? Descriptor_sqlstate[errornum].ver3str : Descriptor_sqlstate[errornum].ver2str);         return error;}voidDC_log_error(const char *func, const char *desc, const DescriptorClass *self){#define nullcheck(a) (a ? a : "(NULL)")	if (self)	{		qlog("DESCRIPTOR ERROR: func=%s, desc='%s', errnum=%d, errmsg='%s'\n", func, desc, self->__error_number, nullcheck(self->__error_message));		mylog("DESCRIPTOR ERROR: func=%s, desc='%s', errnum=%d, errmsg='%s'\n", func, desc, self->__error_number, nullcheck(self->__error_message));	}}/*		Returns the next SQL error information. */RETCODE		SQL_APIPGAPI_DescError(	SQLHDESC hdesc,			SQLSMALLINT	RecNumber,			SQLCHAR FAR * szSqlState,			SQLINTEGER FAR * pfNativeError,			SQLCHAR FAR * szErrorMsg,			SQLSMALLINT cbErrorMsgMax,			SQLSMALLINT FAR * pcbErrorMsg,			UWORD flag){	CSTR func = "PGAPI_DescError";	/* CC: return an error of a hdesc  */	DescriptorClass *desc = (DescriptorClass *) hdesc;	mylog("%s RecN=%d\n", func);	desc->pgerror = DC_create_errorinfo(desc);	return ER_ReturnError(&(desc->pgerror), RecNumber, szSqlState,				pfNativeError, szErrorMsg, cbErrorMsgMax,				pcbErrorMsg, flag);}#endif /* ODBCVER */

⌨️ 快捷键说明

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