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 + -
显示快捷键?