data.c

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

C
597
字号
					{						/* NULL is valid */						break;					}				}				ECPGraise(lineno, ECPG_CONVERT_BOOL, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);				return (false);				break;			case ECPGt_char:			case ECPGt_unsigned_char:				{					if (varcharsize == 0)						strncpy((char *) ((long) var + offset * act_tuple), pval, strlen(pval) + 1);					else					{						strncpy((char *) ((long) var + offset * act_tuple), pval, varcharsize);						if (varcharsize < strlen(pval))						{							/* truncation */							switch (ind_type)							{								case ECPGt_short:								case ECPGt_unsigned_short:									*((short *) (ind + ind_offset * act_tuple)) = strlen(pval);									break;								case ECPGt_int:								case ECPGt_unsigned_int:									*((int *) (ind + ind_offset * act_tuple)) = strlen(pval);									break;								case ECPGt_long:								case ECPGt_unsigned_long:									*((long *) (ind + ind_offset * act_tuple)) = strlen(pval);									break;#ifdef HAVE_LONG_LONG_INT_64								case ECPGt_long_long:								case ECPGt_unsigned_long_long:									*((long long int *) (ind + ind_offset * act_tuple)) = strlen(pval);									break;#endif   /* HAVE_LONG_LONG_INT_64 */								default:									break;							}							sqlca->sqlwarn[0] = sqlca->sqlwarn[1] = 'W';						}					}				}				break;			case ECPGt_varchar:				{					struct ECPGgeneric_varchar *variable =					(struct ECPGgeneric_varchar *) ((long) var + offset * act_tuple);					variable->len = strlen(pval);					if (varcharsize == 0)						strncpy(variable->arr, pval, variable->len);					else					{						strncpy(variable->arr, pval, varcharsize);						if (variable->len > varcharsize)						{							/* truncation */							switch (ind_type)							{								case ECPGt_short:								case ECPGt_unsigned_short:									*((short *) (ind + offset * act_tuple)) = variable->len;									break;								case ECPGt_int:								case ECPGt_unsigned_int:									*((int *) (ind + offset * act_tuple)) = variable->len;									break;								case ECPGt_long:								case ECPGt_unsigned_long:									*((long *) (ind + offset * act_tuple)) = variable->len;									break;#ifdef HAVE_LONG_LONG_INT_64								case ECPGt_long_long:								case ECPGt_unsigned_long_long:									*((long long int *) (ind + ind_offset * act_tuple)) = variable->len;									break;#endif   /* HAVE_LONG_LONG_INT_64 */								default:									break;							}							sqlca->sqlwarn[0] = sqlca->sqlwarn[1] = 'W';							variable->len = varcharsize;						}					}				}				break;			case ECPGt_decimal:			case ECPGt_numeric:				if (pval)				{					if (isarray && *pval == '"')						nres = PGTYPESnumeric_from_asc(pval + 1, &scan_length);					else						nres = PGTYPESnumeric_from_asc(pval, &scan_length);					/* did we get an error? */					if (errno != 0)					{						ECPGlog("ECPGget_data line %d: RESULT: %s errno %d\n", lineno, pval ? pval : "", errno);						if (INFORMIX_MODE(compat))						{							/* Informix wants its own NULL value here instead of an error */							ECPGset_informix_null(ECPGt_numeric, nres);						}						else						{							ECPGraise(lineno, ECPG_NUMERIC_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);							return (false);						}					}					else					{						if (isarray && *scan_length == '"')							scan_length++;						if (garbage_left(isarray, scan_length, compat))						{							ECPGraise(lineno, ECPG_NUMERIC_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);							return (false);						}					}				}				else					nres = PGTYPESnumeric_from_asc("0.0", &scan_length);				if (type == ECPGt_numeric)					PGTYPESnumeric_copy(nres, (numeric *) (var + offset * act_tuple));				else					PGTYPESnumeric_to_decimal(nres, (decimal *) (var + offset * act_tuple));				break;			case ECPGt_interval:				if (pval)				{					if (isarray && *pval == '"')						ires = PGTYPESinterval_from_asc(pval + 1, &scan_length);					else						ires = PGTYPESinterval_from_asc(pval, &scan_length);					/* did we get an error? */					if (errno != 0)					{						if (INFORMIX_MODE(compat))						{							/* Informix wants its own NULL value here instead of an error */							ECPGset_informix_null(ECPGt_interval, ires);						}						else						{							ECPGraise(lineno, ECPG_INTERVAL_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);							return (false);						}					}					else					{						if (isarray && *scan_length == '"')							scan_length++;						if (garbage_left(isarray, scan_length, compat))						{							ECPGraise(lineno, ECPG_INTERVAL_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);							return (false);						}					}				}				else					ires = PGTYPESinterval_from_asc("0 seconds", NULL);				PGTYPESinterval_copy(ires, (interval *) (var + offset * act_tuple));				break;			case ECPGt_date:				if (pval)				{					if (isarray && *pval == '"')						ddres = PGTYPESdate_from_asc(pval + 1, &scan_length);					else						ddres = PGTYPESdate_from_asc(pval, &scan_length);					/* did we get an error? */					if (errno != 0)					{						if (INFORMIX_MODE(compat))						{							/* Informix wants its own NULL value here instead of an error */							ECPGset_informix_null(ECPGt_date, &ddres);						}						else						{							ECPGraise(lineno, ECPG_DATE_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);							return (false);						}					}					else					{						if (isarray && *scan_length == '"')							scan_length++;						if (garbage_left(isarray, scan_length, compat))						{							ECPGraise(lineno, ECPG_DATE_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);							return (false);						}					}					*((date *) (var + offset * act_tuple)) = ddres;				}				break;			case ECPGt_timestamp:				if (pval)				{					if (isarray && *pval == '"')						tres = PGTYPEStimestamp_from_asc(pval + 1, &scan_length);					else						tres = PGTYPEStimestamp_from_asc(pval, &scan_length);					/* did we get an error? */					if (errno != 0)					{						if (INFORMIX_MODE(compat))						{							/* Informix wants its own NULL value here instead of an error */							ECPGset_informix_null(ECPGt_timestamp, &tres);						}						else						{							ECPGraise(lineno, ECPG_TIMESTAMP_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);							return (false);						}					}					else					{						if (isarray && *scan_length == '"')							scan_length++;						if (garbage_left(isarray, scan_length, compat))						{							ECPGraise(lineno, ECPG_TIMESTAMP_FORMAT, ECPG_SQLSTATE_DATATYPE_MISMATCH, pval);							return (false);						}					}					*((timestamp *) (var + offset * act_tuple)) = tres;				}				break;			default:				ECPGraise(lineno, ECPG_UNSUPPORTED, ECPG_SQLSTATE_ECPG_INTERNAL_ERROR, ECPGtype_name(type));				return (false);				break;		}		if (isarray == ECPG_ARRAY_ARRAY)		{			bool		string = false;			/* set array to next entry */			++act_tuple;			/* set pval to the next entry */			for (; string || (*pval != ',' && *pval != '}'); ++pval)				if (*pval == '"')					string = string ? false : true;			if (*pval == ',')				++pval;		}		else if (isarray == ECPG_ARRAY_VECTOR)		{			bool		string = false;			/* set array to next entry */			++act_tuple;			/* set pval to the next entry */			for (; string || (*pval != ' ' && *pval != '\0'); ++pval)				if (*pval == '"')					string = string ? false : true;			if (*pval == ' ')				++pval;		}	} while ((isarray == ECPG_ARRAY_ARRAY && *pval != '}') || (isarray == ECPG_ARRAY_VECTOR && *pval != '\0'));	return (true);}

⌨️ 快捷键说明

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