execute.c

来自「PostgreSQL7.4.6 for Linux」· C语言 代码 · 共 1,337 行 · 第 1/3 页

C
1,337
字号
		for (act_tuple = 0; act_tuple < ntuples && status; act_tuple++)		{			int			len = strlen(PQgetvalue(results, act_tuple, act_field)) + 1;			if (!ECPGget_data(results, act_tuple, act_field, stmt->lineno,						 var->type, var->ind_type, current_data_location,							  var->ind_value, len, 0, var->ind_offset, isarray, stmt->compat, stmt->force_indicator))				status = false;			else			{				*current_string = current_data_location;				current_data_location += len;				current_string++;			}		}		/* 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;}static boolECPGstore_input(const struct statement * stmt, 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(stmt->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 (stmt->force_indicator == false)			{				if (ECPGis_informix_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, stmt->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, stmt->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, stmt->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, stmt->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, stmt->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, stmt->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, stmt->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, stmt->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, stmt->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, stmt->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 []"), stmt->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(stmt->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(stmt->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, stmt->lineno)))						return false;					strncpy(newcopy, (char *) var->value, slen);					newcopy[slen] = '\0';					mallocedval = quote_postgres(newcopy, stmt->lineno);					if (!mallocedval)						return false;					ECPGfree(newcopy);					*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, stmt->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, stmt->lineno)))						return false;					strncpy(newcopy, variable->arr, variable->len);					newcopy[variable->len] = '\0';					mallocedval = quote_postgres(newcopy, stmt->lineno);					if (!mallocedval)						return false;					ECPGfree(newcopy);					*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++)						{							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 [] "), stmt->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, stmt->lineno)))							return false;						strncpy(mallocedval, str, slen);						mallocedval[slen] = '\0';

⌨️ 快捷键说明

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