descriptor.h

来自「postgresql-odbc,跨平台应用」· C头文件 代码 · 共 311 行

H
311
字号
/* File:			descriptor.h * * Description:		This file contains defines and declarations that are related to *					the entire driver. * * Comments:		See "notice.txt" for copyright and license information. * * $Id: descriptor.h,v 1.20 2007/08/31 23:40:10 hinoue Exp $ * */#ifndef __DESCRIPTOR_H__#define __DESCRIPTOR_H__#include "psqlodbc.h"typedef struct{	char	*name;} pgNAME;#define	GET_NAME(the_name)	((the_name).name)#define	SAFE_NAME(the_name)	((the_name).name ? (the_name).name : NULL_STRING)#define	PRINT_NAME(the_name)	((the_name).name ? (the_name).name : PRINT_NULL)#define	NAME_IS_NULL(the_name)	(NULL == (the_name).name)#define	NAME_IS_VALID(the_name)	(NULL != (the_name).name)#define	INIT_NAME(the_name) ((the_name).name = NULL)#define	NULL_THE_NAME(the_name) \do { \	if ((the_name).name) free((the_name).name); \	(the_name).name = NULL; \} while (0)#define	STR_TO_NAME(the_name, str) \do { \	if ((the_name).name) \		free((the_name).name); \	(the_name).name = (str ? strdup((str)) : NULL); \} while (0)#define	STRN_TO_NAME(the_name, str, n) \do { \	if ((the_name).name) \		free((the_name).name); \	if (str) \	{ \		(the_name).name = malloc(n + 1); \		memcpy((the_name).name, str, n); \		(the_name).name[n] = '\0'; \	} \	else \		(the_name).name = NULL; \} while (0)#define	NAME_TO_STR(str, the_name) \do {\	if ((the_name).name) strcpy(str, (the_name).name); \	else *str = '\0'; \} while (0)#define	NAME_TO_NAME(to, from) \do { \	if ((to).name) \		free((to).name); \	if ((from).name) \		(to).name = strdup(from.name); \	else \		(to).name = NULL; \} while (0)#define	MOVE_NAME(to, from) \do { \	if ((to).name) \		free((to).name); \	(to).name = (from).name; \	(from).name = NULL; \} while (0)#define	SET_NAME(the_name, str) ((the_name).name = (str))#define	NAMECMP(name1, name2) (strcmp(SAFE_NAME(name1), SAFE_NAME(name2)))#define	NAMEICMP(name1, name2) (stricmp(SAFE_NAME(name1), SAFE_NAME(name2)))enum {	TI_UPDATABLE	=	1L	,TI_HASOIDS_CHECKED	=	(1L << 1)	,TI_HASOIDS	=	(1L << 2)	,TI_COLATTRIBUTE	=	(1L << 3)};typedef struct{	OID		table_oid;	COL_INFO	*col_info; /* cached SQLColumns info for this table */	pgNAME		schema_name;	pgNAME		table_name;	pgNAME		table_alias;	pgNAME		bestitem;	pgNAME		bestqual;	UInt4		flags;} TABLE_INFO;#define	TI_set_updatable(ti)	(ti->flags |= TI_UPDATABLE)#define	TI_is_updatable(ti)	(0 != (ti->flags &= TI_UPDATABLE))#define	TI_no_updatable(ti)	(ti->flags &= (~TI_UPDATABLE))#define	TI_set_hasoids_checked(ti)	(ti->flags |= TI_HASOIDS_CHECKED)#define	TI_checked_hasoids(ti)		(0 != (ti->flags &= TI_HASOIDS))#define	TI_set_hasoids(ti)	(ti->flags |= TI_HASOIDS)#define	TI_has_oids(ti)		(0 != (ti->flags &= TI_HASOIDS))#define	TI_set_has_no_oids(ti)	(ti->flags &= (~TI_HASOIDS))void	TI_Constructor(TABLE_INFO *, const ConnectionClass *);void	TI_Destructor(TABLE_INFO **, int);enum {	FIELD_INITIALIZED 	= 0	,FIELD_PARSING		= 1L	,FIELD_TEMP_SET		= (1L << 1)	,FIELD_COL_ATTRIBUTE	= (1L << 2)	,FIELD_PARSED_OK	= (1L << 3)	,FIELD_PARSED_INCOMPLETE = (1L << 4)};typedef struct{	char		flag;	char		updatable;	Int2		attnum;	pgNAME		schema_name;	TABLE_INFO *ti;	/* to resolve explicit table names */	pgNAME		column_name;	pgNAME		column_alias;	char		nullable;	char		auto_increment;	char		func;	char		columnkey;	int		column_size; /* precision in 2.x */	int		decimal_digits; /* scale in 2.x */	int		display_size;	SQLLEN		length;	OID		columntype;	OID		basetype;	char		expr;	char		quote;	char		dquote;	char		numeric;	pgNAME		before_dot;} FIELD_INFO;Int4 FI_precision(const FIELD_INFO *);Int4 FI_scale(const FIELD_INFO *);void	FI_Constructor(FIELD_INFO *, BOOL reuse);void	FI_Destructor(FIELD_INFO **, int, BOOL freeFI);#define	FI_is_applicable(fi) (NULL != fi && (fi->flag & (FIELD_PARSED_OK | FIELD_COL_ATTRIBUTE)) != 0)#define	FI_type(fi) (0 == (fi)->basetype ? (fi)->columntype : (fi)->basetype)typedef struct DescriptorHeader_{	ConnectionClass	*conn_conn;	char	embedded;	char	type_defined;	UInt4	desc_type;	UInt4	error_row;	/* 1-based row */	UInt4	error_index;	/* 1-based index */	Int4	__error_number;	char	*__error_message;	PG_ErrorInfo	*pgerror;} DescriptorClass;/* *	ARD and APD are(must be) of the same format */struct ARDFields_{#if (ODBCVER >= 0x0300)	SQLLEN		size_of_rowset; /* for ODBC3 fetch operation */#endif /* ODBCVER */	SQLUINTEGER	bind_size;	/* size of each structure if using					 * Row-wise Binding */	SQLUSMALLINT	*row_operation_ptr;	SQLULEN		*row_offset_ptr;	BindInfoClass	*bookmark;	BindInfoClass	*bindings;	SQLSMALLINT	allocated;	SQLLEN		size_of_rowset_odbc2; /* for SQLExtendedFetch */};/* *	APD must be of the same format as ARD */struct APDFields_{	SQLLEN		paramset_size;	/* really an SQLINTEGER type */ 	SQLUINTEGER	param_bind_type; /* size of each structure if using					  * Row-wise Parameter Binding */	SQLUSMALLINT	*param_operation_ptr;	SQLULEN		*param_offset_ptr;	ParameterInfoClass	*bookmark; /* dummy item to fit APD to ARD */	ParameterInfoClass	*parameters;	SQLSMALLINT	allocated;	SQLLEN		paramset_size_dummy; /* dummy item to fit APD to ARD */};struct IRDFields_{	StatementClass	*stmt;	SQLULEN		*rowsFetched;	SQLUSMALLINT	*rowStatusArray;	UInt4		nfields;	SQLSMALLINT	allocated;	FIELD_INFO	**fi;};struct IPDFields_{#if (ODBCVER >= 0x0300)	SQLUINTEGER		*param_processed_ptr;#else	SQLULEN			*param_processed_ptr; /* SQLParamOptions */#endif /* ODBCVER */	SQLUSMALLINT		*param_status_ptr;	SQLSMALLINT		allocated;	ParameterImplClass	*parameters;};typedef	struct{	DescriptorClass	deschd;	union {		ARDFields	ard;		APDFields	apd;		IRDFields	ird;		IPDFields	ipd;	} flds;}	DescriptorAlloc;typedef struct{	DescriptorClass	deschd;	ARDFields	ardopts;}	ARDClass;typedef struct{	DescriptorClass	deschd;	APDFields	apdopts;}	APDClass;typedef struct{	DescriptorClass	deschd;	IRDFields	irdopts;}	IRDClass;typedef struct{	DescriptorClass	deschd;	IPDFields	ipdopts;}	IPDClass;#define	DC_get_conn(a)	(a->conn_conn)void InitializeEmbeddedDescriptor(DescriptorClass *, StatementClass *stmt,				UInt4 desc_type);void	DC_Destructor(DescriptorClass *desc);void	InitializeARDFields(ARDFields *self);void	InitializeAPDFields(APDFields *self);/* void	InitializeIRDFields(IRDFields *self);void	InitializeIPDFiedls(IPDFields *self); */BindInfoClass	*ARD_AllocBookmark(ARDFields *self);void	ARD_unbind_cols(ARDFields *self, BOOL freeall);void	APD_free_params(APDFields *self, char option);void	IPD_free_params(IPDFields *self, char option);BOOL	getCOLIfromTI(const char *, ConnectionClass *, StatementClass *, const OID, TABLE_INFO **);#if (ODBCVER >= 0x0300)RETCODE	DC_set_stmt(DescriptorClass *desc, StatementClass *stmt);void	DC_clear_error(DescriptorClass *desc);void	DC_set_error(DescriptorClass *desc, int errornumber, const char * errormsg);void	DC_set_errormsg(DescriptorClass *desc, const char * errormsg);PG_ErrorInfo *DC_get_error(DescriptorClass *self);int	DC_get_errornumber(const DescriptorClass *self);const char *DC_get_errormsg(const DescriptorClass *self);void	DC_log_error(const char *func, const char *desc, const DescriptorClass *self);#endif /* ODBCVER *//*	Error numbers about descriptor handle */enum {	LOWEST_DESC_ERROR		= -2	/* minus means warning/notice message */	,DESC_ERROR_IN_ROW		= -2	,DESC_OPTION_VALUE_CHANGED	= -1	,DESC_OK			= 0	,DESC_EXEC_ERROR	,DESC_STATUS_ERROR	,DESC_SEQUENCE_ERROR	,DESC_NO_MEMORY_ERROR	,DESC_COLNUM_ERROR	,DESC_NO_STMTSTRING	,DESC_ERROR_TAKEN_FROM_BACKEND	,DESC_INTERNAL_ERROR	,DESC_STILL_EXECUTING	,DESC_NOT_IMPLEMENTED_ERROR	,DESC_BAD_PARAMETER_NUMBER_ERROR	,DESC_OPTION_OUT_OF_RANGE_ERROR	,DESC_INVALID_COLUMN_NUMBER_ERROR	,DESC_RESTRICTED_DATA_TYPE_ERROR	,DESC_INVALID_CURSOR_STATE_ERROR	,DESC_CREATE_TABLE_ERROR	,DESC_NO_CURSOR_NAME	,DESC_INVALID_CURSOR_NAME	,DESC_INVALID_ARGUMENT_NO	,DESC_ROW_OUT_OF_RANGE	,DESC_OPERATION_CANCELLED	,DESC_INVALID_CURSOR_POSITION	,DESC_VALUE_OUT_OF_RANGE	,DESC_OPERATION_INVALID		,DESC_PROGRAM_TYPE_OUT_OF_RANGE	,DESC_BAD_ERROR	,DESC_INVALID_OPTION_IDENTIFIER	,DESC_RETURN_NULL_WITHOUT_INDICATOR	,DESC_INVALID_DESCRIPTOR_IDENTIFIER	,DESC_OPTION_NOT_FOR_THE_DRIVER	,DESC_FETCH_OUT_OF_RANGE	,DESC_COUNT_FIELD_INCORRECT};#endif /* __DESCRIPTOR_H__ */

⌨️ 快捷键说明

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