⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 execute.c

📁 PostgreSQL 8.1.4的源码 适用于Linux下的开源数据库系统
💻 C
📖 第 1 页 / 共 3 页
字号:
		}		/* terminate the list */		*current_string = NULL;	}	else	{		for (act_tuple = 0; act_tuple < ntuples && status; act_tuple++)		{			if (!ECPGget_data(results, act_tuple, act_field, stmt->lineno,							  var->type, var->ind_type, var->value,							  var->ind_value, var->varcharsize, var->offset, var->ind_offset, isarray, stmt->compat, stmt->force_indicator))				status = false;		}	}	return status;}boolECPGstore_input(const int lineno, const bool force_indicator, const struct variable * var,				const char **tobeinserted_p, bool *malloced_p){	char	   *mallocedval = NULL;	char	   *newcopy = NULL;	/*	 * arrays are not possible unless the attribute is an array too FIXME: we	 * do not know if the attribute is an array here	 */#if 0	if (var->arrsize > 1 &&...)	{		ECPGraise(lineno, ECPG_ARRAY_INSERT, ECPG_SQLSTATE_DATATYPE_MISMATCH, NULL);		return false;	}#endif	/*	 * Some special treatment is needed for records since we want their	 * contents to arrive in a comma-separated list on insert (I think).	 */	*malloced_p = false;	*tobeinserted_p = "";	/* check for null value and set input buffer accordingly */	switch (var->ind_type)	{		case ECPGt_short:		case ECPGt_unsigned_short:			if (*(short *) var->ind_value < 0)				*tobeinserted_p = "null";			break;		case ECPGt_int:		case ECPGt_unsigned_int:			if (*(int *) var->ind_value < 0)				*tobeinserted_p = "null";			break;		case ECPGt_long:		case ECPGt_unsigned_long:			if (*(long *) var->ind_value < 0L)				*tobeinserted_p = "null";			break;#ifdef HAVE_LONG_LONG_INT_64		case ECPGt_long_long:		case ECPGt_unsigned_long_long:			if (*(long long int *) var->ind_value < (long long) 0)				*tobeinserted_p = "null";			break;#endif   /* HAVE_LONG_LONG_INT_64 */		case ECPGt_NO_INDICATOR:			if (force_indicator == false)			{				if (ECPGis_noind_null(var->type, var->value))					*tobeinserted_p = "null";			}			break;		default:			break;	}	if (**tobeinserted_p == '\0')	{		switch (var->type)		{				int			element;			case ECPGt_short:				if (!(mallocedval = ECPGalloc(var->arrsize * 20, lineno)))					return false;				if (var->arrsize > 1)				{					strcpy(mallocedval, "array [");					for (element = 0; element < var->arrsize; element++)						sprintf(mallocedval + strlen(mallocedval), "%hd,", ((short *) var->value)[element]);					strcpy(mallocedval + strlen(mallocedval) - 1, "]");				}				else					sprintf(mallocedval, "%hd", *((short *) var->value));				*tobeinserted_p = mallocedval;				*malloced_p = true;				break;			case ECPGt_int:				if (!(mallocedval = ECPGalloc(var->arrsize * 20, lineno)))					return false;				if (var->arrsize > 1)				{					strcpy(mallocedval, "array [");					for (element = 0; element < var->arrsize; element++)						sprintf(mallocedval + strlen(mallocedval), "%d,", ((int *) var->value)[element]);					strcpy(mallocedval + strlen(mallocedval) - 1, "]");				}				else					sprintf(mallocedval, "%d", *((int *) var->value));				*tobeinserted_p = mallocedval;				*malloced_p = true;				break;			case ECPGt_unsigned_short:				if (!(mallocedval = ECPGalloc(var->arrsize * 20, lineno)))					return false;				if (var->arrsize > 1)				{					strcpy(mallocedval, "array [");					for (element = 0; element < var->arrsize; element++)						sprintf(mallocedval + strlen(mallocedval), "%hu,", ((unsigned short *) var->value)[element]);					strcpy(mallocedval + strlen(mallocedval) - 1, "]");				}				else					sprintf(mallocedval, "%hu", *((unsigned short *) var->value));				*tobeinserted_p = mallocedval;				*malloced_p = true;				break;			case ECPGt_unsigned_int:				if (!(mallocedval = ECPGalloc(var->arrsize * 20, lineno)))					return false;				if (var->arrsize > 1)				{					strcpy(mallocedval, "array [");					for (element = 0; element < var->arrsize; element++)						sprintf(mallocedval + strlen(mallocedval), "%u,", ((unsigned int *) var->value)[element]);					strcpy(mallocedval + strlen(mallocedval) - 1, "]");				}				else					sprintf(mallocedval, "%u", *((unsigned int *) var->value));				*tobeinserted_p = mallocedval;				*malloced_p = true;				break;			case ECPGt_long:				if (!(mallocedval = ECPGalloc(var->arrsize * 20, lineno)))					return false;				if (var->arrsize > 1)				{					strcpy(mallocedval, "array [");					for (element = 0; element < var->arrsize; element++)						sprintf(mallocedval + strlen(mallocedval), "%ld,", ((long *) var->value)[element]);					strcpy(mallocedval + strlen(mallocedval) - 1, "]");				}				else					sprintf(mallocedval, "%ld", *((long *) var->value));				*tobeinserted_p = mallocedval;				*malloced_p = true;				break;			case ECPGt_unsigned_long:				if (!(mallocedval = ECPGalloc(var->arrsize * 20, lineno)))					return false;				if (var->arrsize > 1)				{					strcpy(mallocedval, "array [");					for (element = 0; element < var->arrsize; element++)						sprintf(mallocedval + strlen(mallocedval), "%lu,", ((unsigned long *) var->value)[element]);					strcpy(mallocedval + strlen(mallocedval) - 1, "]");				}				else					sprintf(mallocedval, "%lu", *((unsigned long *) var->value));				*tobeinserted_p = mallocedval;				*malloced_p = true;				break;#ifdef HAVE_LONG_LONG_INT_64			case ECPGt_long_long:				if (!(mallocedval = ECPGalloc(var->arrsize * 30, lineno)))					return false;				if (var->arrsize > 1)				{					strcpy(mallocedval, "array [");					for (element = 0; element < var->arrsize; element++)						sprintf(mallocedval + strlen(mallocedval), "%lld,", ((long long *) var->value)[element]);					strcpy(mallocedval + strlen(mallocedval) - 1, "]");				}				else					sprintf(mallocedval, "%lld", *((long long *) var->value));				*tobeinserted_p = mallocedval;				*malloced_p = true;				break;			case ECPGt_unsigned_long_long:				if (!(mallocedval = ECPGalloc(var->arrsize * 30, lineno)))					return false;				if (var->arrsize > 1)				{					strcpy(mallocedval, "array [");					for (element = 0; element < var->arrsize; element++)						sprintf(mallocedval + strlen(mallocedval), "%llu,", ((unsigned long long *) var->value)[element]);					strcpy(mallocedval + strlen(mallocedval) - 1, "]");				}				else					sprintf(mallocedval, "%llu", *((unsigned long long *) var->value));				*tobeinserted_p = mallocedval;				*malloced_p = true;				break;#endif   /* HAVE_LONG_LONG_INT_64 */			case ECPGt_float:				if (!(mallocedval = ECPGalloc(var->arrsize * 25, lineno)))					return false;				if (var->arrsize > 1)				{					strcpy(mallocedval, "array [");					for (element = 0; element < var->arrsize; element++)						sprintf(mallocedval + strlen(mallocedval), "%.14g,", ((float *) var->value)[element]);					strcpy(mallocedval + strlen(mallocedval) - 1, "]");				}				else					sprintf(mallocedval, "%.14g", *((float *) var->value));				*tobeinserted_p = mallocedval;				*malloced_p = true;				break;			case ECPGt_double:				if (!(mallocedval = ECPGalloc(var->arrsize * 25, lineno)))					return false;				if (var->arrsize > 1)				{					strcpy(mallocedval, "array [");					for (element = 0; element < var->arrsize; element++)						sprintf(mallocedval + strlen(mallocedval), "%.14g,", ((double *) var->value)[element]);					strcpy(mallocedval + strlen(mallocedval) - 1, "]");				}				else					sprintf(mallocedval, "%.14g", *((double *) var->value));				*tobeinserted_p = mallocedval;				*malloced_p = true;				break;			case ECPGt_bool:				if (!(mallocedval = ECPGalloc(var->arrsize + sizeof("array []"), lineno)))					return false;				if (var->arrsize > 1)				{					strcpy(mallocedval, "array [");					if (var->offset == sizeof(char))						for (element = 0; element < var->arrsize; element++)							sprintf(mallocedval + strlen(mallocedval), "%c,", (((char *) var->value)[element]) ? 't' : 'f');					/*					 * this is necessary since sizeof(C++'s bool)==sizeof(int)					 */					else if (var->offset == sizeof(int))						for (element = 0; element < var->arrsize; element++)							sprintf(mallocedval + strlen(mallocedval), "%c,", (((int *) var->value)[element]) ? 't' : 'f');					else						ECPGraise(lineno, ECPG_CONVERT_BOOL, ECPG_SQLSTATE_DATATYPE_MISMATCH, "different size");					strcpy(mallocedval + strlen(mallocedval) - 1, "]");				}				else				{					if (var->offset == sizeof(char))						sprintf(mallocedval, "'%c'", (*((char *) var->value)) ? 't' : 'f');					else if (var->offset == sizeof(int))						sprintf(mallocedval, "'%c'", (*((int *) var->value)) ? 't' : 'f');					else						ECPGraise(lineno, ECPG_CONVERT_BOOL, ECPG_SQLSTATE_DATATYPE_MISMATCH, "different size");				}				*tobeinserted_p = mallocedval;				*malloced_p = true;				break;			case ECPGt_char:			case ECPGt_unsigned_char:				{					/* set slen to string length if type is char * */					int			slen = (var->varcharsize == 0) ? strlen((char *) var->value) : var->varcharsize;					if (!(newcopy = ECPGalloc(slen + 1, lineno)))						return false;					strncpy(newcopy, (char *) var->value, slen);					newcopy[slen] = '\0';					mallocedval = quote_postgres(newcopy, lineno);					if (!mallocedval)						return false;					*tobeinserted_p = mallocedval;					*malloced_p = true;				}				break;			case ECPGt_const:			case ECPGt_char_variable:				{					int			slen = strlen((char *) var->value);					if (!(mallocedval = ECPGalloc(slen + 1, lineno)))						return false;					strncpy(mallocedval, (char *) var->value, slen);					mallocedval[slen] = '\0';					*tobeinserted_p = mallocedval;					*malloced_p = true;				}				break;			case ECPGt_varchar:				{					struct ECPGgeneric_varchar *variable =					(struct ECPGgeneric_varchar *) (var->value);					if (!(newcopy = (char *) ECPGalloc(variable->len + 1, lineno)))						return false;					strncpy(newcopy, variable->arr, variable->len);					newcopy[variable->len] = '\0';					mallocedval = quote_postgres(newcopy, lineno);					if (!mallocedval)						return false;					*tobeinserted_p = mallocedval;					*malloced_p = true;				}				break;			case ECPGt_decimal:			case ECPGt_numeric:				{					char	   *str = NULL;					int			slen;					numeric    *nval = PGTYPESnumeric_new();					if (var->arrsize > 1)					{						for (element = 0; element < var->arrsize; element++, nval = PGTYPESnumeric_new())						{							if (var->type == ECPGt_numeric)								PGTYPESnumeric_copy((numeric *) ((var + var->offset * element)->value), nval);							else								PGTYPESnumeric_from_decimal((decimal *) ((var + var->offset * element)->value), nval);							str = PGTYPESnumeric_to_asc(nval, nval->dscale);							PGTYPESnumeric_free(nval);							slen = strlen(str);							if (!(mallocedval = ECPGrealloc(mallocedval, strlen(mallocedval) + slen + sizeof("array [] "), lineno)))								return false;							if (!element)								strcpy(mallocedval, "array [");							strncpy(mallocedval + strlen(mallocedval), str, slen + 1);							strcpy(mallocedval + strlen(mallocedval), ",");						}						strcpy(mallocedval + strlen(mallocedval) - 1, "]");					}					else					{						if (var->type == ECPGt_numeric)							PGTYPESnumeric_copy((numeric *) (var->value), nval);						else							PGTYPESnumeric_from_decimal((decimal *) (var->value), nval);						str = PGTYPESnumeric_to_asc(nval, nval->dscale);						PGTYPESnumeric_free(nval);						slen = strlen(str);						if (!(mallocedval = ECPGalloc(slen + 1, lineno)))							return false;						strncpy(mallocedval, str, slen);						mallocedval[slen] = '\0';					}					*tobeinserted_p = mallocedval;					*malloced_p = true;					free(str);				}				break;			case ECPGt_interval:				{					char	   *str = NULL;					int			slen;					if (var->arrsize > 1)					{						for (element = 0; element < var->arrsize; element++)						{							str = quote_postgres(PGTYPESinterval_to_asc((interval *) ((var + var->offset * element)->value)), lineno);							slen = strlen(str);							if (!(mallocedval = ECPGrealloc(mallocedval, strlen(mallocedval) + slen + sizeof("array [],interval "), lineno)))								return false;							if (!element)								strcpy(mallocedval, "array [");							strcpy(mallocedval + strlen(mallocedval), "interval ");							strncpy(mallocedval + strlen(mallocedval), str, slen + 1);							strcpy(mallocedval + strlen(mallocedval), ",");						}						strcpy(mallocedval + strlen(mallocedval) - 1, "]");					}					else					{						str = quote_postgres(PGTYPESinterval_to_asc((interval *) (var->value)), lineno);						slen = strlen(str);						if (!(mallocedval = ECPGalloc(slen + sizeof("interval ") + 1, lineno)))							return false;						strcpy(mallocedval, "interval ");						/* also copy trailing '\0' */						strncpy(mallocedval + strlen(mallocedval), str, slen + 1);					}					*tobeinserted_p = mallocedval;					*malloced_p = true;					free(str);				}

⌨️ 快捷键说明

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