descriptor.c

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

C
644
字号
/*------- * Module:			descriptor.c * * Description:		This module contains functions related to creating *					and manipulating a statement. * * Classes:			DescriptorClass (Functions prefix: "DC_") * * * Comments:		See "notice.txt" for copyright and license information. *------- */#include "environ.h"#include "connection.h"#include "descriptor.h"#include "statement.h"#include <stdio.h>#include <string.h>#include <ctype.h>#include "pgapifunc.h"void	TI_Constructor(TABLE_INFO *self, const ConnectionClass *conn){	memset(self, 0, sizeof(TABLE_INFO));	TI_set_updatable(self);	if (PG_VERSION_LT(conn, 7.2))	{		char	qual[32];		STR_TO_NAME(self->bestitem, OID_NAME);		sprintf(qual, "\"%s\" = %%u", OID_NAME);		STR_TO_NAME(self->bestqual, qual);		TI_set_hasoids(self);		TI_set_hasoids_checked(self);	}}void	TI_Destructor(TABLE_INFO **ti, int count){	int	i;inolog("TI_Destructor count=%d\n", count);	if (ti)	{		for (i = 0; i < count; i++)		{			if (ti[i])			{				NULL_THE_NAME(ti[i]->schema_name);				NULL_THE_NAME(ti[i]->table_name);				NULL_THE_NAME(ti[i]->table_alias);				NULL_THE_NAME(ti[i]->bestitem);				NULL_THE_NAME(ti[i]->bestqual);				free(ti[i]);				ti[i] = NULL;			}		}	}}void	FI_Constructor(FIELD_INFO *self, BOOL reuse){inolog("FI_Constructor reuse=%d\n", reuse);	if (reuse)		FI_Destructor(&self, 1, FALSE);	memset(self, 0, sizeof(FIELD_INFO));	self->nullable = TRUE;	self->columnkey = -1;}void	FI_Destructor(FIELD_INFO **fi, int count, BOOL freeFI){	int	i;inolog("FI_Destructor count=%d\n", count);	if (fi)	{		for (i = 0; i < count; i++)		{			if (fi[i])			{				NULL_THE_NAME(fi[i]->column_name);				NULL_THE_NAME(fi[i]->column_alias);				NULL_THE_NAME(fi[i]->schema_name);				NULL_THE_NAME(fi[i]->before_dot);				if (freeFI)				{					free(fi[i]);					fi[i] = NULL;				}			}		}		if (freeFI)			free(fi);	}}void	DC_Constructor(DescriptorClass *self, BOOL embedded, StatementClass *stmt){	memset(self, 0, sizeof(DescriptorClass));	self->embedded = embedded;}static void ARDFields_free(ARDFields * self){inolog("ARDFields_free %p bookmark=%p", self, self->bookmark);	if (self->bookmark)	{		free(self->bookmark);		self->bookmark = NULL;	}inolog(" hey");	/*	 * the memory pointed to by the bindings is not deallocated by the	 * driver but by the application that uses that driver, so we don't	 * have to care	 */	ARD_unbind_cols(self, TRUE);}static void APDFields_free(APDFields * self){	if (self->bookmark)	{		free(self->bookmark);		self->bookmark = NULL;	}	/* param bindings */	APD_free_params(self, STMT_FREE_PARAMS_ALL);}static void IRDFields_free(IRDFields * self){	/* Free the parsed field information */	if (self->fi)	{		FI_Destructor(self->fi, self->allocated, TRUE);		self->fi = NULL;	}	self->allocated = 0;	self->nfields = 0;}static void IPDFields_free(IPDFields * self){	/* param bindings */	IPD_free_params(self, STMT_FREE_PARAMS_ALL);}void	DC_Destructor(DescriptorClass *self){	if (self->__error_message)	{		free(self->__error_message);		self->__error_message = NULL;	}	if (self->pgerror)	{		ER_Destructor(self->pgerror);		self->pgerror = NULL;	}	if (self->type_defined)	{		switch (self->desc_type)		{			case SQL_ATTR_APP_ROW_DESC:				ARDFields_free((ARDFields *) (self + 1));				break;			case SQL_ATTR_APP_PARAM_DESC:				APDFields_free((APDFields *) (self + 1));				break;			case SQL_ATTR_IMP_ROW_DESC:				IRDFields_free((IRDFields *) (self + 1));				break;			case SQL_ATTR_IMP_PARAM_DESC:				IPDFields_free((IPDFields *) (self + 1));				break;		}	}}void InitializeEmbeddedDescriptor(DescriptorClass *desc, StatementClass *stmt,		 UInt4 desc_type) {	DC_Constructor(desc, TRUE, stmt);	DC_get_conn(desc) = SC_get_conn(stmt);	desc->type_defined = TRUE;	desc->desc_type = desc_type;	switch (desc_type)	{		case SQL_ATTR_APP_ROW_DESC:			memset(desc + 1, 0, sizeof(ARDFields));			stmt->ard = (ARDClass *) desc;			break; 		case SQL_ATTR_APP_PARAM_DESC:			memset(desc + 1, 0, sizeof(APDFields));			stmt->apd = (APDClass *) desc;			break; 		case SQL_ATTR_IMP_ROW_DESC:			memset(desc + 1, 0, sizeof(IRDFields));			stmt->ird = (IRDClass *) desc;			stmt->ird->irdopts.stmt = stmt;			break; 		case SQL_ATTR_IMP_PARAM_DESC:			memset(desc + 1, 0, sizeof(IPDFields));			stmt->ipd = (IPDClass *) desc;			break; 	}}/* * ARDFields initialize */voidInitializeARDFields(ARDFields *opt){	memset(opt, 0, sizeof(ARDFields));#if (ODBCVER >= 0x0300)	opt->size_of_rowset = 1;#endif /* ODBCVER */	opt->bind_size = 0;		/* default is to bind by column */	opt->size_of_rowset_odbc2 = 1;}/* * APDFields initialize */voidInitializeAPDFields(APDFields *opt){	memset(opt, 0, sizeof(APDFields));	opt->paramset_size = 1;	opt->param_bind_type = 0;	/* default is to bind by column */	opt->paramset_size_dummy = 1;	/* dummy setting */}BindInfoClass	*ARD_AllocBookmark(ARDFields *ardopts){	if (!ardopts->bookmark)	{		ardopts->bookmark = (BindInfoClass *) malloc(sizeof(BindInfoClass));		memset(ardopts->bookmark, 0, sizeof(BindInfoClass));	}	return ardopts->bookmark;}#if (ODBCVER >= 0x0300)#define	DESC_INCREMENT	10char CC_add_descriptor(ConnectionClass *self, DescriptorClass *desc){	int	i;	mylog("CC_add_descriptor: self=%p, desc=%p\n", self, desc);	for (i = 0; i < self->num_descs; i++)	{		if (!self->descs[i])		{			DC_get_conn(desc) = self;			self->descs[i] = desc;			return TRUE;		}	}        /* no more room -- allocate more memory */	self->descs = (DescriptorClass **) realloc(self->descs, sizeof(DescriptorClass *) * (DESC_INCREMENT + self->num_descs));	if (!self->descs)		return FALSE;	memset(&self->descs[self->num_descs], 0, sizeof(DescriptorClass *) *				DESC_INCREMENT);        DC_get_conn(desc) = self;	self->descs[self->num_descs] = desc;	self->num_descs += DESC_INCREMENT;	return TRUE;}/* *	This API allocates a Application descriptor. */RETCODE SQL_API PGAPI_AllocDesc(HDBC ConnectionHandle,					SQLHDESC *DescriptorHandle){	CSTR func = "PGAPI_AllocDesc";	ConnectionClass	*conn = (ConnectionClass *) ConnectionHandle;	RETCODE	ret = SQL_SUCCESS;	DescriptorClass	*desc = (DescriptorClass *) malloc(sizeof(DescriptorAlloc));	mylog("%s: entering...\n", func);	if (desc)	{		memset(desc, 0, sizeof(DescriptorAlloc));		DC_get_conn(desc) = conn;		if (CC_add_descriptor(conn, desc))			*DescriptorHandle = desc;		else		{			free(desc);			CC_set_error(conn, CONN_STMT_ALLOC_ERROR, "Maximum number of descriptors exceeded", func);			ret = SQL_ERROR;		} 	}	else	{		CC_set_error(conn, CONN_STMT_ALLOC_ERROR, "No more memory ti allocate a further descriptor",func);		ret = SQL_ERROR;	}	return ret;}RETCODE SQL_API PGAPI_FreeDesc(SQLHDESC DescriptorHandle){	CSTR func = "PGAPI_FreeDesc";	DescriptorClass	*desc = (DescriptorClass *) DescriptorHandle;	RETCODE	ret = SQL_SUCCESS;	mylog("%s: entering...\n", func);	DC_Destructor(desc);	if (!desc->embedded)	{		int	i;

⌨️ 快捷键说明

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