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

📄 informix.c

📁 postgresql8.3.4源码,开源数据库
💻 C
📖 第 1 页 / 共 2 页
字号:
{	/* TODO: take care of DBCENTURY environment variable */	/* PGSQL functions allow all centuries */	errno = 0;	if (PGTYPESdate_defmt_asc(d, fmt, str) == 0)		return 0;	switch (errno)	{		case PGTYPES_DATE_ERR_ENOSHORTDATE:			return ECPG_INFORMIX_ENOSHORTDATE;		case PGTYPES_DATE_ERR_EARGS:		case PGTYPES_DATE_ERR_ENOTDMY:			return ECPG_INFORMIX_ENOTDMY;		case PGTYPES_DATE_BAD_DAY:			return ECPG_INFORMIX_BAD_DAY;		case PGTYPES_DATE_BAD_MONTH:			return ECPG_INFORMIX_BAD_MONTH;		default:			return ECPG_INFORMIX_BAD_YEAR;	}}intrfmtdate(date d, char *fmt, char *str){	errno = 0;	if (PGTYPESdate_fmt_asc(d, fmt, str) == 0)		return 0;	if (errno == ENOMEM)		return ECPG_INFORMIX_OUT_OF_MEMORY;	return ECPG_INFORMIX_DATE_CONVERT;}intrmdyjul(short mdy[3], date * d){	int			mdy_int[3];	mdy_int[0] = mdy[0];	mdy_int[1] = mdy[1];	mdy_int[2] = mdy[2];	PGTYPESdate_mdyjul(mdy_int, d);	return 0;}intrdayofweek(date d){	return (PGTYPESdate_dayofweek(d));}/* And the datetime stuff */voiddtcurrent(timestamp * ts){	PGTYPEStimestamp_current(ts);}intdtcvasc(char *str, timestamp * ts){	timestamp	ts_tmp;	int			i;	char	  **endptr = &str;	errno = 0;	ts_tmp = PGTYPEStimestamp_from_asc(str, endptr);	i = errno;	if (i)		/* TODO: rewrite to Informix error codes */		return i;	if (**endptr)	{		/* extra characters exist at the end */		return ECPG_INFORMIX_EXTRA_CHARS;	}	/* TODO: other Informix error codes missing */	/* everything went fine */	*ts = ts_tmp;	return 0;}intdtcvfmtasc(char *inbuf, char *fmtstr, timestamp * dtvalue){	return PGTYPEStimestamp_defmt_asc(inbuf, fmtstr, dtvalue);}intdtsub(timestamp * ts1, timestamp * ts2, interval * iv){	return PGTYPEStimestamp_sub(ts1, ts2, iv);}intdttoasc(timestamp * ts, char *output){	char	   *asctime = PGTYPEStimestamp_to_asc(*ts);	strcpy(output, asctime);	free(asctime);	return 0;}intdttofmtasc(timestamp * ts, char *output, int str_len, char *fmtstr){	return PGTYPEStimestamp_fmt_asc(ts, output, str_len, fmtstr);}intintoasc(interval * i, char *str){	errno = 0;	str = PGTYPESinterval_to_asc(i);	if (!str)		return -errno;	return 0;}/* *	rfmt.c	-  description *	by Carsten Wolff <carsten.wolff@credativ.de>, Wed Apr 2 2003 */static struct{	long		val;	int			maxdigits;	int			digits;	int			remaining;	char		sign;	char	   *val_string;}	value;/** * initialize the struct, which holds the different forms * of the long value */static intinitValue(long lng_val){	int			i,				j;	long		l,				dig;	/* set some obvious things */	value.val = lng_val >= 0 ? lng_val : lng_val * (-1);	value.sign = lng_val >= 0 ? '+' : '-';	value.maxdigits = log10(2) * (8 * sizeof(long) - 1);	/* determine the number of digits */	i = 0;	l = 1;	do	{		i++;		l *= 10;	}	while ((l - 1) < value.val && l <= LONG_MAX / 10);	if (l <= LONG_MAX / 10)	{		value.digits = i;		l /= 10;	}	else		value.digits = i + 1;	value.remaining = value.digits;	/* convert the long to string */	if ((value.val_string = (char *) malloc(value.digits + 1)) == NULL)		return -1;	dig = value.val;	for (i = value.digits, j = 0; i > 0; i--, j++)	{		value.val_string[j] = dig / l + '0';		dig = dig % l;		l /= 10;	}	value.val_string[value.digits] = '\0';	return 0;}/* return the position oft the right-most dot in some string */static intgetRightMostDot(char *str){	size_t		len = strlen(str);	int			i,				j;	j = 0;	for (i = len - 1; i >= 0; i--)	{		if (str[i] == '.')			return len - j - 1;		j++;	}	return -1;}/* And finally some misc functions */intrfmtlong(long lng_val, char *fmt, char *outbuf){	size_t		fmt_len = strlen(fmt);	size_t		temp_len;	int			i,				j,				k,				dotpos;	int			leftalign = 0,				blank = 0,				sign = 0,				entity = 0,				entitydone = 0,				signdone = 0,				brackets_ok = 0;	char	   *temp;	char		tmp[2] = " ";	char		lastfmt = ' ',				fmtchar = ' ';	temp = (char *) malloc(fmt_len + 1);	/* put all info about the long in a struct */	if (!temp || initValue(lng_val) == -1)	{		errno = ENOMEM;		return -1;	}	/* '<' is the only format, where we have to align left */	if (strchr(fmt, (int) '<'))		leftalign = 1;	/* '(' requires ')' */	if (strchr(fmt, (int) '(') && strchr(fmt, (int) ')'))		brackets_ok = 1;	/* get position of the right-most dot in the format-string */	/* and fill the temp-string wit '0's up to there. */	dotpos = getRightMostDot(fmt);	/* start to parse the formatstring */	temp[0] = '\0';	j = 0;						/* position in temp */	k = value.digits - 1;		/* position in the value_string */	for (i = fmt_len - 1, j = 0; i >= 0; i--, j++)	{		/* qualify, where we are in the value_string */		if (k < 0)		{			blank = 1;			if (k == -2)				entity = 1;			else if (k == -1)				sign = 1;			if (leftalign)			{				/* can't use strncat(,,0) here, Solaris would freek out */				if (sign)					if (signdone)					{						temp[j] = '\0';						break;					}			}		}		/* if we're right side of the right-most dot, print '0' */		if (dotpos >= 0 && dotpos <= i)		{			if (dotpos < i)			{				if (fmt[i] == ')')					tmp[0] = value.sign == '-' ? ')' : ' ';				else					tmp[0] = '0';			}			else				tmp[0] = '.';			strcat(temp, tmp);			continue;		}		/* the ',' needs special attention, if it is in the blank area */		if (blank && fmt[i] == ',')			fmtchar = lastfmt;		else			fmtchar = fmt[i];		/* waiting for the sign */		if (k < 0 && leftalign && sign && !signdone && fmtchar != '+' && fmtchar != '-')			continue;		/* analyse this format-char */		switch (fmtchar)		{			case ',':				tmp[0] = ',';				k++;				break;			case '*':				if (blank)					tmp[0] = '*';				else					tmp[0] = value.val_string[k];				break;			case '&':				if (blank)					tmp[0] = '0';				else					tmp[0] = value.val_string[k];				break;			case '#':				if (blank)					tmp[0] = ' ';				else					tmp[0] = value.val_string[k];				break;			case '-':				if (sign && value.sign == '-' && !signdone)				{					tmp[0] = '-';					signdone = 1;				}				else if (blank)					tmp[0] = ' ';				else					tmp[0] = value.val_string[k];				break;			case '+':				if (sign && !signdone)				{					tmp[0] = value.sign;					signdone = 1;				}				else if (blank)					tmp[0] = ' ';				else					tmp[0] = value.val_string[k];				break;			case '(':				if (sign && brackets_ok && value.sign == '-')					tmp[0] = '(';				else if (blank)					tmp[0] = ' ';				else					tmp[0] = value.val_string[k];				break;			case ')':				if (brackets_ok && value.sign == '-')					tmp[0] = ')';				else					tmp[0] = ' ';				break;			case '$':				if (blank && !entitydone)				{					tmp[0] = '$';					entitydone = 1;				}				else if (blank)					tmp[0] = ' ';				else					tmp[0] = value.val_string[k];				break;			case '<':				tmp[0] = value.val_string[k];				break;			default:				tmp[0] = fmt[i];		}		strcat(temp, tmp);		lastfmt = fmt[i];		k--;	}	/* safety-net */	temp[fmt_len] = '\0';	/* reverse the temp-string and put it into the outbuf */	temp_len = strlen(temp);	outbuf[0] = '\0';	for (i = temp_len - 1; i >= 0; i--)	{		tmp[0] = temp[i];		strcat(outbuf, tmp);	}	outbuf[temp_len] = '\0';	/* cleaning up */	free(temp);	free(value.val_string);	return 0;}voidrupshift(char *str){	for (; *str != '\0'; str++)		if (islower((unsigned char) *str))			*str = toupper((unsigned char) *str);	return;}intbyleng(char *str, int len){	for (len--; str[len] && str[len] == ' '; len--);	return (len + 1);}voidldchar(char *src, int len, char *dest){	int			dlen = byleng(src, len);	memmove(dest, src, dlen);	dest[dlen] = '\0';}intrgetmsg(int msgnum, char *s, int maxsize){	return 0;}intrtypalign(int offset, int type){	return 0;}intrtypmsize(int type, int len){	return 0;}intrtypwidth(int sqltype, int sqllen){	return 0;}static struct var_list{	int			number;	void	   *pointer;	struct var_list *next;}	*ivlist = NULL;voidECPG_informix_set_var(int number, void *pointer, int lineno){	struct var_list *ptr;	for (ptr = ivlist; ptr != NULL; ptr = ptr->next)	{		if (ptr->number == number)		{			/* already known => just change pointer value */			ptr->pointer = pointer;			return;		}	}	/* a new one has to be added */	ptr = (struct var_list *) calloc(1L, sizeof(struct var_list));	if (!ptr)	{		struct sqlca_t *sqlca = ECPGget_sqlca();		sqlca->sqlcode = ECPG_OUT_OF_MEMORY;		strncpy(sqlca->sqlstate, "YE001", sizeof("YE001"));		snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc), "Out of memory in line %d.", lineno);		sqlca->sqlerrm.sqlerrml = strlen(sqlca->sqlerrm.sqlerrmc);		/* free all memory we have allocated for the user */		ECPGfree_auto_mem();	}	else	{		ptr->number = number;		ptr->pointer = pointer;		ptr->next = ivlist;		ivlist = ptr;	}}void *ECPG_informix_get_var(int number){	struct var_list *ptr;	for (ptr = ivlist; ptr != NULL && ptr->number != number; ptr = ptr->next);	return (ptr) ? ptr->pointer : NULL;}intrsetnull(int t, char *ptr){	ECPGset_noind_null(t, ptr);	return 0;}intrisnull(int t, char *ptr){	return (ECPGis_noind_null(t, ptr));}

⌨️ 快捷键说明

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