columninfo.c

来自「postgresql-odbc,跨平台应用」· C语言 代码 · 共 182 行

C
182
字号
/*------- * Module:			columninfo.c * * Description:		This module contains routines related to *					reading and storing the field information from a query. * * Classes:			ColumnInfoClass (Functions prefix: "CI_") * * API functions:	none * * Comments:		See "notice.txt" for copyright and license information. *------- */#include "pgtypes.h"#include "columninfo.h"#include "connection.h"#include "socket.h"#include <stdlib.h>#include <string.h>#include "pgapifunc.h"ColumnInfoClass *CI_Constructor(){	ColumnInfoClass *rv;	rv = (ColumnInfoClass *) malloc(sizeof(ColumnInfoClass));	if (rv)	{		rv->num_fields = 0;		rv->coli_array = NULL;	}	return rv;}voidCI_Destructor(ColumnInfoClass *self){	CI_free_memory(self);	free(self);}/* *	Read in field descriptions. *	If self is not null, then also store the information. *	If self is null, then just read, don't store. */charCI_read_fields(ColumnInfoClass *self, ConnectionClass *conn){	CSTR		func = "CI_read_fields";	Int2		lf;	int			new_num_fields;	OID		new_adtid, new_relid = 0, new_attid = 0;	Int2		new_adtsize;	Int4		new_atttypmod = -1;	/* COLUMN_NAME_STORAGE_LEN may be sufficient but for safety */	char		new_field_name[2 * COLUMN_NAME_STORAGE_LEN + 1];	SocketClass *sock;	ConnInfo   *ci;	sock = CC_get_socket(conn);	ci = &conn->connInfo;	/* at first read in the number of fields that are in the query */	new_num_fields = (Int2) SOCK_get_int(sock, sizeof(Int2));	mylog("num_fields = %d\n", new_num_fields);	if (self)		/* according to that allocate memory */		CI_set_num_fields(self, new_num_fields, PROTOCOL_74(ci));	/* now read in the descriptions */	for (lf = 0; lf < new_num_fields; lf++)	{		SOCK_get_string(sock, new_field_name, 2 * COLUMN_NAME_STORAGE_LEN);		if (PROTOCOL_74(ci))	/* tableid & columnid */		{			new_relid = SOCK_get_int(sock, sizeof(Int4));			new_attid = SOCK_get_int(sock, sizeof(Int2));		}		new_adtid = (OID) SOCK_get_int(sock, 4);		new_adtsize = (Int2) SOCK_get_int(sock, 2);		/* If 6.4 protocol, then read the atttypmod field */		if (PG_VERSION_GE(conn, 6.4))		{			mylog("READING ATTTYPMOD\n");			new_atttypmod = (Int4) SOCK_get_int(sock, 4);			/* Subtract the header length */			switch (new_adtid)			{				case PG_TYPE_DATETIME:				case PG_TYPE_TIMESTAMP_NO_TMZONE:				case PG_TYPE_TIME:				case PG_TYPE_TIME_WITH_TMZONE:					break;				default:					new_atttypmod -= 4;			}			if (new_atttypmod < 0)				new_atttypmod = -1;			if (PROTOCOL_74(ci))	/* format */				SOCK_get_int(sock, sizeof(Int2));		}		mylog("%s: fieldname='%s', adtid=%d, adtsize=%d, atttypmod=%d (rel,att)=(%d,%d)\n", func, new_field_name, new_adtid, new_adtsize, new_atttypmod, new_relid, new_attid);		if (self)			CI_set_field_info(self, lf, new_field_name, new_adtid, new_adtsize, new_atttypmod, new_relid, new_attid);	}	return (SOCK_get_errcode(sock) == 0);}voidCI_free_memory(ColumnInfoClass *self){	register Int2 lf;	int			num_fields = self->num_fields;	/* Safe to call even if null */	self->num_fields = 0;	if (self->coli_array)	{		for (lf = 0; lf < num_fields; lf++)		{			if (self->coli_array[lf].name)			{				free(self->coli_array[lf].name);				self->coli_array[lf].name = NULL;			}		}		free(self->coli_array);		self->coli_array = NULL;	}}voidCI_set_num_fields(ColumnInfoClass *self, int new_num_fields, BOOL allocrelatt){	CI_free_memory(self);		/* always safe to call */	self->num_fields = new_num_fields;	self->coli_array = (struct srvr_info *) calloc(sizeof(struct srvr_info), self->num_fields);}voidCI_set_field_info(ColumnInfoClass *self, int field_num, char *new_name,		OID new_adtid, Int2 new_adtsize, Int4 new_atttypmod,		OID new_relid, OID new_attid){	/* check bounds */	if ((field_num < 0) || (field_num >= self->num_fields))		return;	/* store the info */	self->coli_array[field_num].name = strdup(new_name);	self->coli_array[field_num].adtid= new_adtid;	self->coli_array[field_num].adtsize = new_adtsize;	self->coli_array[field_num].atttypmod = new_atttypmod;	self->coli_array[field_num].display_size = 0;	self->coli_array[field_num].relid = new_relid;	self->coli_array[field_num].attid = new_attid;}

⌨️ 快捷键说明

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