descriptor.c
来自「postgresql8.3.4源码,开源数据库」· C语言 代码 · 共 730 行 · 第 1/2 页
C
730 行
/* dynamic SQL support routines * * $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.29 2008/01/15 10:31:47 meskes Exp $ */#define POSTGRES_ECPG_INTERNAL#include "postgres_fe.h"#include "pg_type.h"#include "ecpg-pthread-win32.h"#include "ecpgtype.h"#include "ecpglib.h"#include "ecpgerrno.h"#include "extern.h"#include "sqlca.h"#include "sql3types.h"static void descriptor_free(struct descriptor * desc);/* We manage descriptors separately for each thread. */#ifdef ENABLE_THREAD_SAFETYstatic pthread_key_t descriptor_key;static pthread_once_t descriptor_once = PTHREAD_ONCE_INIT;static void descriptor_deallocate_all(struct descriptor * list);static voiddescriptor_destructor(void *arg){ descriptor_deallocate_all(arg);}static voiddescriptor_key_init(void){ pthread_key_create(&descriptor_key, descriptor_destructor);}static struct descriptor *get_descriptors(void){ pthread_once(&descriptor_once, descriptor_key_init); return (struct descriptor *) pthread_getspecific(descriptor_key);}static voidset_descriptors(struct descriptor * value){ pthread_setspecific(descriptor_key, value);}#elsestatic struct descriptor *all_descriptors = NULL;#define get_descriptors() (all_descriptors)#define set_descriptors(value) do { all_descriptors = (value); } while(0)#endif/* old internal convenience function that might go away later */static PGresult *ecpg_result_by_descriptor(int line, const char *name){ struct descriptor *desc = ecpg_find_desc(line, name); if (desc == NULL) return NULL; return desc->result;}static unsigned intecpg_dynamic_type_DDT(Oid type){ switch (type) { case DATEOID: return SQL3_DDT_DATE; case TIMEOID: return SQL3_DDT_TIME; case TIMESTAMPOID: return SQL3_DDT_TIMESTAMP; case TIMESTAMPTZOID: return SQL3_DDT_TIMESTAMP_WITH_TIME_ZONE; case TIMETZOID: return SQL3_DDT_TIME_WITH_TIME_ZONE; default: return SQL3_DDT_ILLEGAL; }}boolECPGget_desc_header(int lineno, const char *desc_name, int *count){ PGresult *ECPGresult; struct sqlca_t *sqlca = ECPGget_sqlca(); ecpg_init_sqlca(sqlca); ECPGresult = ecpg_result_by_descriptor(lineno, desc_name); if (!ECPGresult) return false; *count = PQnfields(ECPGresult); sqlca->sqlerrd[2] = 1; ecpg_log("ECPGget_desc_header: found %d attributes.\n", *count); return true;}static boolget_int_item(int lineno, void *var, enum ECPGttype vartype, int value){ switch (vartype) { case ECPGt_short: *(short *) var = (short) value; break; case ECPGt_int: *(int *) var = (int) value; break; case ECPGt_long: *(long *) var = (long) value; break; case ECPGt_unsigned_short: *(unsigned short *) var = (unsigned short) value; break; case ECPGt_unsigned_int: *(unsigned int *) var = (unsigned int) value; break; case ECPGt_unsigned_long: *(unsigned long *) var = (unsigned long) value; break;#ifdef HAVE_LONG_LONG_INT_64 case ECPGt_long_long: *(long long int *) var = (long long int) value; break; case ECPGt_unsigned_long_long: *(unsigned long long int *) var = (unsigned long long int) value; break;#endif /* HAVE_LONG_LONG_INT_64 */ case ECPGt_float: *(float *) var = (float) value; break; case ECPGt_double: *(double *) var = (double) value; break; default: ecpg_raise(lineno, ECPG_VAR_NOT_NUMERIC, ECPG_SQLSTATE_RESTRICTED_DATA_TYPE_ATTRIBUTE_VIOLATION, NULL); return (false); } return (true);}static boolset_int_item(int lineno, int *target, const void *var, enum ECPGttype vartype){ switch (vartype) { case ECPGt_short: *target = *(short *) var; break; case ECPGt_int: *target = *(int *) var; break; case ECPGt_long: *target = *(long *) var; break; case ECPGt_unsigned_short: *target = *(unsigned short *) var; break; case ECPGt_unsigned_int: *target = *(unsigned int *) var; break; case ECPGt_unsigned_long: *target = *(unsigned long *) var; break;#ifdef HAVE_LONG_LONG_INT_64 case ECPGt_long_long: *target = *(long long int *) var; break; case ECPGt_unsigned_long_long: *target = *(unsigned long long int *) var; break;#endif /* HAVE_LONG_LONG_INT_64 */ case ECPGt_float: *target = *(float *) var; break; case ECPGt_double: *target = *(double *) var; break; default: ecpg_raise(lineno, ECPG_VAR_NOT_NUMERIC, ECPG_SQLSTATE_RESTRICTED_DATA_TYPE_ATTRIBUTE_VIOLATION, NULL); return (false); } return true;}static boolget_char_item(int lineno, void *var, enum ECPGttype vartype, char *value, int varcharsize){ switch (vartype) { case ECPGt_char: case ECPGt_unsigned_char: strncpy((char *) var, value, varcharsize); break; case ECPGt_varchar: { struct ECPGgeneric_varchar *variable = (struct ECPGgeneric_varchar *) var; if (varcharsize == 0) strncpy(variable->arr, value, strlen(value)); else strncpy(variable->arr, value, varcharsize); variable->len = strlen(value); if (varcharsize > 0 && variable->len > varcharsize) variable->len = varcharsize; } break; default: ecpg_raise(lineno, ECPG_VAR_NOT_CHAR, ECPG_SQLSTATE_RESTRICTED_DATA_TYPE_ATTRIBUTE_VIOLATION, NULL); return (false); } return (true);}boolECPGget_desc(int lineno, const char *desc_name, int index,...){ va_list args; PGresult *ECPGresult; enum ECPGdtype type; int ntuples, act_tuple; struct variable data_var; struct sqlca_t *sqlca = ECPGget_sqlca(); va_start(args, index); ecpg_init_sqlca(sqlca); ECPGresult = ecpg_result_by_descriptor(lineno, desc_name); if (!ECPGresult) return (false); ntuples = PQntuples(ECPGresult); if (ntuples < 1) { ecpg_raise(lineno, ECPG_NOT_FOUND, ECPG_SQLSTATE_NO_DATA, NULL); return (false); } if (index < 1 || index > PQnfields(ECPGresult)) { ecpg_raise(lineno, ECPG_INVALID_DESCRIPTOR_INDEX, ECPG_SQLSTATE_INVALID_DESCRIPTOR_INDEX, NULL); return (false); } ecpg_log("ECPGget_desc: reading items for tuple %d\n", index); --index; type = va_arg(args, enum ECPGdtype); memset(&data_var, 0, sizeof data_var); data_var.type = ECPGt_EORT; data_var.ind_type = ECPGt_NO_INDICATOR; while (type != ECPGd_EODT) { char type_str[20]; long varcharsize; long offset; long arrsize; enum ECPGttype vartype; void *var; vartype = va_arg(args, enum ECPGttype); var = va_arg(args, void *); varcharsize = va_arg(args, long); arrsize = va_arg(args, long); offset = va_arg(args, long); switch (type) { case (ECPGd_indicator): data_var.ind_type = vartype; data_var.ind_pointer = var; data_var.ind_varcharsize = varcharsize; data_var.ind_arrsize = arrsize; data_var.ind_offset = offset; if (data_var.ind_arrsize == 0 || data_var.ind_varcharsize == 0) data_var.ind_value = *((void **) (data_var.ind_pointer)); else data_var.ind_value = data_var.ind_pointer; break; case ECPGd_data: data_var.type = vartype; data_var.pointer = var; data_var.varcharsize = varcharsize; data_var.arrsize = arrsize; data_var.offset = offset; if (data_var.arrsize == 0 || data_var.varcharsize == 0) data_var.value = *((void **) (data_var.pointer)); else data_var.value = data_var.pointer; break; case ECPGd_name: if (!get_char_item(lineno, var, vartype, PQfname(ECPGresult, index), varcharsize)) return (false); ecpg_log("ECPGget_desc: NAME = %s\n", PQfname(ECPGresult, index)); break; case ECPGd_nullable: if (!get_int_item(lineno, var, vartype, 1)) return (false); break; case ECPGd_key_member: if (!get_int_item(lineno, var, vartype, 0)) return (false); break; case ECPGd_scale: if (!get_int_item(lineno, var, vartype, (PQfmod(ECPGresult, index) - VARHDRSZ) & 0xffff)) return (false); ecpg_log("ECPGget_desc: SCALE = %d\n", (PQfmod(ECPGresult, index) - VARHDRSZ) & 0xffff); break; case ECPGd_precision: if (!get_int_item(lineno, var, vartype, PQfmod(ECPGresult, index) >> 16)) return (false); ecpg_log("ECPGget_desc: PRECISION = %d\n", PQfmod(ECPGresult, index) >> 16); break; case ECPGd_octet: if (!get_int_item(lineno, var, vartype, PQfsize(ECPGresult, index))) return (false); ecpg_log("ECPGget_desc: OCTET_LENGTH = %d\n", PQfsize(ECPGresult, index)); break; case ECPGd_length: if (!get_int_item(lineno, var, vartype, PQfmod(ECPGresult, index) - VARHDRSZ)) return (false); ecpg_log("ECPGget_desc: LENGTH = %d\n", PQfmod(ECPGresult, index) - VARHDRSZ); break; case ECPGd_type: if (!get_int_item(lineno, var, vartype, ecpg_dynamic_type(PQftype(ECPGresult, index)))) return (false); ecpg_log("ECPGget_desc: TYPE = %d\n", ecpg_dynamic_type(PQftype(ECPGresult, index))); break; case ECPGd_di_code: if (!get_int_item(lineno, var, vartype, ecpg_dynamic_type_DDT(PQftype(ECPGresult, index)))) return (false);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?