pgapi30.c

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

C
2,004
字号
		case SQL_DESC_DATETIME_INTERVAL_CODE:		case SQL_DESC_CONCISE_TYPE:			column_bindings_set(opts, RecNumber, TRUE);			break;	}	if (RecNumber < 0 || RecNumber > opts->allocated)	{		DC_set_error(desc, DESC_INVALID_COLUMN_NUMBER_ERROR, "invalid column number");		return SQL_ERROR;	}	if (0 == RecNumber) /* bookmark column */	{		BindInfoClass	*bookmark = ARD_AllocBookmark(opts);		switch (FieldIdentifier)		{			case SQL_DESC_DATA_PTR:				bookmark->buffer = Value;				break;			case SQL_DESC_INDICATOR_PTR:				bookmark->indicator = Value;				break;			case SQL_DESC_OCTET_LENGTH_PTR:				bookmark->used = Value;				break;			default:				DC_set_error(desc, DESC_INVALID_COLUMN_NUMBER_ERROR, "invalid column number");				ret = SQL_ERROR;		}		return ret;	}	row_idx = RecNumber - 1;	switch (FieldIdentifier)	{		case SQL_DESC_TYPE:			opts->bindings[row_idx].returntype = CAST_PTR(SQLSMALLINT, Value);			break;		case SQL_DESC_DATETIME_INTERVAL_CODE:			switch (opts->bindings[row_idx].returntype)			{				case SQL_DATETIME:				case SQL_C_TYPE_DATE:				case SQL_C_TYPE_TIME:				case SQL_C_TYPE_TIMESTAMP:				switch ((LONG_PTR) Value)				{					case SQL_CODE_DATE:						opts->bindings[row_idx].returntype = SQL_C_TYPE_DATE;						break;					case SQL_CODE_TIME:						opts->bindings[row_idx].returntype = SQL_C_TYPE_TIME;						break;					case SQL_CODE_TIMESTAMP:						opts->bindings[row_idx].returntype = SQL_C_TYPE_TIMESTAMP;						break;				}				break;			}			break;		case SQL_DESC_CONCISE_TYPE:			opts->bindings[row_idx].returntype = CAST_PTR(SQLSMALLINT, Value);			break;		case SQL_DESC_DATA_PTR:			unbind = FALSE;			opts->bindings[row_idx].buffer = Value;			break;		case SQL_DESC_INDICATOR_PTR:			unbind = FALSE;			opts->bindings[row_idx].indicator = Value;			break;		case SQL_DESC_OCTET_LENGTH_PTR:			unbind = FALSE;			opts->bindings[row_idx].used = Value;			break;		case SQL_DESC_OCTET_LENGTH:			opts->bindings[row_idx].buflen = CAST_PTR(SQLLEN, Value);			break;		case SQL_DESC_PRECISION:			opts->bindings[row_idx].precision = CAST_PTR(SQLSMALLINT, Value);			break;		case SQL_DESC_SCALE:			opts->bindings[row_idx].scale = CAST_PTR(SQLSMALLINT, Value);			break;		case SQL_DESC_ALLOC_TYPE: /* read-only */		case SQL_DESC_DATETIME_INTERVAL_PRECISION:		case SQL_DESC_LENGTH:		case SQL_DESC_NUM_PREC_RADIX:		default:ret = SQL_ERROR;			DC_set_error(desc, DESC_INVALID_DESCRIPTOR_IDENTIFIER,				"invalid descriptor identifier"); 	}	if (unbind)		opts->bindings[row_idx].buffer = NULL;	return ret;}static  void parameter_bindings_set(APDFields *opts, int params, BOOL maxset){	int	i;	if (params == opts->allocated)		return;	if (params > opts->allocated)	{		extend_parameter_bindings(opts, params);		return;	}	if (maxset)	return;	for (i = opts->allocated; i > params; i--)		reset_a_parameter_binding(opts, i);	opts->allocated = params;	if (0 == params)	{		free(opts->parameters);		opts->parameters = NULL;	}}static  void parameter_ibindings_set(IPDFields *opts, int params, BOOL maxset){	int	i;	if (params == opts->allocated)		return;	if (params > opts->allocated)	{		extend_iparameter_bindings(opts, params);		return;	}	if (maxset)	return;	for (i = opts->allocated; i > params; i--)		reset_a_iparameter_binding(opts, i);	opts->allocated = params;	if (0 == params)	{		free(opts->parameters);		opts->parameters = NULL;	}}static RETCODE SQL_APIAPDSetField(DescriptorClass *desc, SQLSMALLINT RecNumber,		SQLSMALLINT FieldIdentifier, PTR Value, SQLINTEGER BufferLength){	CSTR		func = "APDSetField";	RETCODE		ret = SQL_SUCCESS;	APDFields	*opts = (APDFields *) (desc + 1);	SQLSMALLINT	para_idx;	BOOL		unbind = TRUE;	switch (FieldIdentifier)	{		case SQL_DESC_ARRAY_SIZE:			opts->paramset_size = CAST_UPTR(SQLUINTEGER, Value);			return ret; 		case SQL_DESC_ARRAY_STATUS_PTR:			opts->param_operation_ptr = Value;			return ret;		case SQL_DESC_BIND_OFFSET_PTR:			opts->param_offset_ptr = Value;			return ret;		case SQL_DESC_BIND_TYPE:			opts->param_bind_type = CAST_UPTR(SQLUINTEGER, Value);			return ret;		case SQL_DESC_COUNT:			parameter_bindings_set(opts, CAST_PTR(SQLSMALLINT, Value), FALSE);			return ret; 		case SQL_DESC_TYPE:		case SQL_DESC_DATETIME_INTERVAL_CODE:		case SQL_DESC_CONCISE_TYPE:			parameter_bindings_set(opts, RecNumber, TRUE);			break;	}	if (RecNumber <=0)	{inolog("%s RecN=%d allocated=%d\n", func, RecNumber, opts->allocated);		DC_set_error(desc, DESC_BAD_PARAMETER_NUMBER_ERROR,				"bad parameter number");		return SQL_ERROR;	}	if (RecNumber > opts->allocated)	{inolog("%s RecN=%d allocated=%d\n", func, RecNumber, opts->allocated);		parameter_bindings_set(opts, RecNumber, TRUE);		/* DC_set_error(desc, DESC_BAD_PARAMETER_NUMBER_ERROR,				"bad parameter number");		return SQL_ERROR;*/	}	para_idx = RecNumber - 1; 	switch (FieldIdentifier)	{		case SQL_DESC_TYPE:			opts->parameters[para_idx].CType = CAST_PTR(SQLSMALLINT, Value);			break;		case SQL_DESC_DATETIME_INTERVAL_CODE:			switch (opts->parameters[para_idx].CType)			{				case SQL_DATETIME:				case SQL_C_TYPE_DATE:				case SQL_C_TYPE_TIME:				case SQL_C_TYPE_TIMESTAMP:				switch ((LONG_PTR) Value)				{					case SQL_CODE_DATE:						opts->parameters[para_idx].CType = SQL_C_TYPE_DATE;						break;					case SQL_CODE_TIME:						opts->parameters[para_idx].CType = SQL_C_TYPE_TIME;						break;					case SQL_CODE_TIMESTAMP:						opts->parameters[para_idx].CType = SQL_C_TYPE_TIMESTAMP;						break;				}				break;			}			break;		case SQL_DESC_CONCISE_TYPE:			opts->parameters[para_idx].CType = CAST_PTR(SQLSMALLINT, Value);			break;		case SQL_DESC_DATA_PTR:			unbind = FALSE;			opts->parameters[para_idx].buffer = Value;			break;		case SQL_DESC_INDICATOR_PTR:			unbind = FALSE;			opts->parameters[para_idx].indicator = Value;			break;		case SQL_DESC_OCTET_LENGTH:			opts->parameters[para_idx].buflen = CAST_PTR(Int4, Value);			break;		case SQL_DESC_OCTET_LENGTH_PTR:			unbind = FALSE;			opts->parameters[para_idx].used = Value;			break;		case SQL_DESC_PRECISION:			opts->parameters[para_idx].precision = CAST_PTR(SQLSMALLINT, Value);			break;		case SQL_DESC_SCALE:			opts->parameters[para_idx].scale = CAST_PTR(SQLSMALLINT, Value);			break;		case SQL_DESC_ALLOC_TYPE: /* read-only */		case SQL_DESC_DATETIME_INTERVAL_PRECISION:		case SQL_DESC_LENGTH:		case SQL_DESC_NUM_PREC_RADIX:		default:ret = SQL_ERROR;			DC_set_error(desc, DESC_INVALID_DESCRIPTOR_IDENTIFIER,				"invaid descriptor identifier"); 	}	if (unbind)		opts->parameters[para_idx].buffer = NULL;	return ret;}static RETCODE SQL_APIIRDSetField(DescriptorClass *desc, SQLSMALLINT RecNumber,		SQLSMALLINT FieldIdentifier, PTR Value, SQLINTEGER BufferLength){	RETCODE		ret = SQL_SUCCESS;	IRDFields	*opts = (IRDFields *) (desc + 1);	switch (FieldIdentifier)	{		case SQL_DESC_ARRAY_STATUS_PTR:			opts->rowStatusArray = (SQLUSMALLINT *) Value;			break;		case SQL_DESC_ROWS_PROCESSED_PTR:			opts->rowsFetched = (SQLULEN *) Value;			break;		case SQL_DESC_ALLOC_TYPE: /* read-only */		case SQL_DESC_COUNT: /* read-only */		case SQL_DESC_AUTO_UNIQUE_VALUE: /* read-only */		case SQL_DESC_BASE_COLUMN_NAME: /* read-only */		case SQL_DESC_BASE_TABLE_NAME: /* read-only */		case SQL_DESC_CASE_SENSITIVE: /* read-only */		case SQL_DESC_CATALOG_NAME: /* read-only */		case SQL_DESC_CONCISE_TYPE: /* read-only */		case SQL_DESC_DATETIME_INTERVAL_CODE: /* read-only */		case SQL_DESC_DATETIME_INTERVAL_PRECISION: /* read-only */		case SQL_DESC_DISPLAY_SIZE: /* read-only */		case SQL_DESC_FIXED_PREC_SCALE: /* read-only */		case SQL_DESC_LABEL: /* read-only */		case SQL_DESC_LENGTH: /* read-only */		case SQL_DESC_LITERAL_PREFIX: /* read-only */		case SQL_DESC_LITERAL_SUFFIX: /* read-only */		case SQL_DESC_LOCAL_TYPE_NAME: /* read-only */		case SQL_DESC_NAME: /* read-only */		case SQL_DESC_NULLABLE: /* read-only */		case SQL_DESC_NUM_PREC_RADIX: /* read-only */		case SQL_DESC_OCTET_LENGTH: /* read-only */		case SQL_DESC_PRECISION: /* read-only */#if (ODBCVER >= 0x0350)		case SQL_DESC_ROWVER: /* read-only */#endif /* ODBCVER */		case SQL_DESC_SCALE: /* read-only */		case SQL_DESC_SCHEMA_NAME: /* read-only */		case SQL_DESC_SEARCHABLE: /* read-only */		case SQL_DESC_TABLE_NAME: /* read-only */		case SQL_DESC_TYPE: /* read-only */		case SQL_DESC_TYPE_NAME: /* read-only */		case SQL_DESC_UNNAMED: /* read-only */		case SQL_DESC_UNSIGNED: /* read-only */		case SQL_DESC_UPDATABLE: /* read-only */		default:ret = SQL_ERROR;			DC_set_error(desc, DESC_INVALID_DESCRIPTOR_IDENTIFIER,				"invalid descriptor identifier"); 	}	return ret;}static RETCODE SQL_APIIPDSetField(DescriptorClass *desc, SQLSMALLINT RecNumber,		SQLSMALLINT FieldIdentifier, PTR Value, SQLINTEGER BufferLength){	RETCODE		ret = SQL_SUCCESS;	IPDFields	*ipdopts = (IPDFields *) (desc + 1);	SQLSMALLINT	para_idx;	switch (FieldIdentifier)	{		case SQL_DESC_ARRAY_STATUS_PTR:			ipdopts->param_status_ptr = (SQLUSMALLINT *) Value;			return ret;		case SQL_DESC_ROWS_PROCESSED_PTR:			ipdopts->param_processed_ptr = (SQLUINTEGER *) Value;			return ret;		case SQL_DESC_COUNT:			parameter_ibindings_set(ipdopts, CAST_PTR(SQLSMALLINT, Value), FALSE);			return ret;		case SQL_DESC_UNNAMED: /* only SQL_UNNAMED is allowed */ 			if (SQL_UNNAMED !=  CAST_PTR(SQLSMALLINT, Value))			{				ret = SQL_ERROR;				DC_set_error(desc, DESC_INVALID_DESCRIPTOR_IDENTIFIER,					"invalid descriptor identifier");				return ret;			}		case SQL_DESC_NAME:		case SQL_DESC_TYPE:		case SQL_DESC_DATETIME_INTERVAL_CODE:		case SQL_DESC_CONCISE_TYPE:			parameter_ibindings_set(ipdopts, RecNumber, TRUE);			break;	}	if (RecNumber <= 0 || RecNumber > ipdopts->allocated)	{inolog("IPDSetField RecN=%d allocated=%d\n", RecNumber, ipdopts->allocated);		DC_set_error(desc, DESC_BAD_PARAMETER_NUMBER_ERROR,				"bad parameter number");		return SQL_ERROR;	}	para_idx = RecNumber - 1;	switch (FieldIdentifier)	{		case SQL_DESC_TYPE:			if (ipdopts->parameters[para_idx].SQLType != CAST_PTR(SQLSMALLINT, Value))			{				reset_a_iparameter_binding(ipdopts, RecNumber);				ipdopts->parameters[para_idx].SQLType = CAST_PTR(SQLSMALLINT, Value);			}			break;		case SQL_DESC_DATETIME_INTERVAL_CODE:			switch (ipdopts->parameters[para_idx].SQLType)			{				case SQL_DATETIME:				case SQL_TYPE_DATE:				case SQL_TYPE_TIME:				case SQL_TYPE_TIMESTAMP:				switch ((LONG_PTR) Value)				{					case SQL_CODE_DATE:						ipdopts->parameters[para_idx].SQLType = SQL_TYPE_DATE;						break;					case SQL_CODE_TIME:						ipdopts->parameters[para_idx].SQLType = SQL_TYPE_TIME;						break;					case SQL_CODE_TIMESTAMP:						ipdopts->parameters[para_idx].SQLType = SQL_TYPE_TIMESTAMP;						break;				}				break;			}			break;		case SQL_DESC_CONCISE_TYPE:			ipdopts->parameters[para_idx].SQLType = CAST_PTR(SQLSMALLINT, Value);			break;		case SQL_DESC_NAME:			if (Value)				STR_TO_NAME(ipdopts->parameters[para_idx].paramName, Value);			else				NULL_THE_NAME(ipdopts->parameters[para_idx].paramName);			break;		case SQL_DESC_PARAMETER_TYPE:			ipdopts->parameters[para_idx].paramType = CAST_PTR(SQLSMALLINT, Value);			break;		case SQL_DESC_SCALE:			ipdopts->parameters[para_idx].decimal_digits = CAST_PTR(SQLSMALLINT, Value);			break;		case SQL_DESC_UNNAMED: /* only SQL_UNNAMED is allowed */ 			if (SQL_UNNAMED !=  CAST_PTR(SQLSMALLINT, Value))			{				ret = SQL_ERROR;				DC_set_error(desc, DESC_INVALID_DESCRIPTOR_IDENTIFIER,					"invalid descriptor identifier");			}			else				NULL_THE_NAME(ipdopts->parameters[para_idx].paramName);			break;		case SQL_DESC_ALLOC_TYPE: /* read-only */ 		case SQL_DESC_CASE_SENSITIVE: /* read-only */		case SQL_DESC_DATETIME_INTERVAL_PRECISION:		case SQL_DESC_FIXED_PREC_SCALE: /* read-only */		case SQL_DESC_LENGTH:		case SQL_DESC_LOCAL_TYPE_NAME: /* read-only */		case SQL_DESC_NULLABLE: /* read-only */		case SQL_DESC_NUM_PREC_RADIX:		case SQL_DESC_OCTET_LENGTH:		case SQL_DESC_PRECISION:#if (ODBCVER >= 0x0350)		case SQL_DESC_ROWVER: /* read-only */#endif /* ODBCVER */		case SQL_DESC_TYPE_NAME: /* read-only */		case SQL_DESC_UNSIGNED: /* read-only */		default:ret = SQL_ERROR;			DC_set_error(desc, DESC_INVALID_DESCRIPTOR_IDENTIFIER,				"invalid descriptor identifier"); 	}	return ret;}static RETCODE SQL_APIARDGetField(DescriptorClass *desc, SQLSMALLINT RecNumber,		SQLSMALLINT FieldIdentifier, PTR Value, SQLINTEGER BufferLength,		SQLINTEGER *StringLength){	RETCODE		ret = SQL_SUCCESS;	SQLLEN		ival = 0;	SQLINTEGER	len, rettype = 0;	PTR		ptr = NULL;	const ARDFields	*opts = (ARDFields *) (desc + 1);	SQLSMALLINT	row_idx;	len = sizeof(SQLINTEGER);	if (0 == RecNumber) /* bookmark */	{		BindInfoClass	*bookmark = opts->bookmark;		switch (FieldIdentifier)		{			case SQL_DESC_DATA_PTR:				rettype = SQL_IS_POINTER;				ptr = bookmark ? bookmark->buffer : NULL;				break;			case SQL_DESC_INDICATOR_PTR:				rettype = SQL_IS_POINTER;				ptr = bookmark ? bookmark->indicator : NULL;				break;			case SQL_DESC_OCTET_LENGTH_PTR:				rettype = SQL_IS_POINTER;				ptr = bookmark ? bookmark->used : NULL;				break;		}		if (ptr)		{			*((void **) Value) = ptr;			if (StringLength)				*StringLength = len;			return ret;		}	}	switch (FieldIdentifier)	{		case SQL_DESC_ARRAY_SIZE:		case SQL_DESC_ARRAY_STATUS_PTR:		case SQL_DESC_BIND_OFFSET_PTR:		case SQL_DESC_BIND_TYPE:		case SQL_DESC_COUNT:			break;		default:			if (RecNumber <= 0 || RecNumber > opts->allocated)			{				DC_set_error(desc, DESC_INVALID_COLUMN_NUMBER_ERROR,					"invalid column number");				return SQL_ERROR;			}	}	row_idx = RecNumber - 1;	switch (FieldIdentifier)	{		case SQL_DESC_ARRAY_SIZE:			ival = opts->size_of_rowset;			break; 		case SQL_DESC_ARRAY_STATUS_PTR:			rettype = SQL_IS_POINTER;			ptr = opts->row_operation_ptr;			break;		case SQL_DESC_BIND_OFFSET_PTR:			rettype = SQL_IS_POINTER;

⌨️ 快捷键说明

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