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

📄 convert.c

📁 ncbi源码
💻 C
📖 第 1 页 / 共 5 页
字号:
            return 4;            break;	    /* TODO conversions to money */		/* conversions not allowed */		case SYBUNIQUE:		case SYBDATETIME4:		case SYBDATETIME:		case SYBDATETIMN:		default:			return TDS_CONVERT_NOAVAIL;			break;	}#ifndef NCBI_FTDS	return TDS_CONVERT_FAIL;#endif}static TDS_INT tds_convert_money4(int srctype, const TDS_CHAR *src, int srclen,	int desttype, CONV_RESULT *cr){TDS_MONEY4 mny;long dollars, fraction;char tmp_str[33];	memcpy(&mny, src, sizeof(mny));	switch(desttype) {		case SYBCHAR:		case SYBTEXT:		case SYBVARCHAR:			/* FIXME should be rounded ??			 * see also all conversion to int and from money 			 * rounding with dollars = (mny.mny4 + 5000) /10000			 * can give arithmetic overflow solution should be			 * dollars = (mny.mny4/2 + 2500)/5000 */			dollars  = mny.mny4 / 10000;			fraction = mny.mny4 % 10000;			if (fraction < 0)	{ fraction = -fraction; }			/* TODO print 4 decimal digits ?? */			sprintf(tmp_str,"%ld.%02lu",dollars,fraction/100);			return string_to_result(tmp_str,cr);			break;		case SYBBINARY:		case SYBIMAGE:		case SYBVARBINARY:			return binary_to_result(src,sizeof(TDS_MONEY4),cr);			break;		case SYBINT1:			dollars  = mny.mny4 / 10000;			if (!IS_TINYINT(dollars))				return TDS_CONVERT_OVERFLOW;			cr->ti = (TDS_TINYINT) dollars;			return sizeof(TDS_TINYINT);			break;		case SYBINT2:			dollars  = mny.mny4 / 10000;			if (!IS_SMALLINT(dollars))				return TDS_CONVERT_OVERFLOW;			cr->si = (TDS_SMALLINT) dollars;			return sizeof(TDS_SMALLINT);			break;		case SYBINT4:			cr->i = mny.mny4 / 10000;			return sizeof(TDS_INT);			break;		case SYBINT8:			cr->bi = mny.mny4 / 10000;			return sizeof(TDS_INT8);			break;		case SYBBIT:		case SYBBITN:			cr->ti = mny.mny4 ? 1 : 0;			return sizeof(TDS_TINYINT);			break;		case SYBFLT8:			cr->f = ((TDS_FLOAT)mny.mny4) / 10000.0;			return sizeof(TDS_FLOAT);			break;		case SYBREAL:			cr->r = (TDS_REAL) (mny.mny4 / 10000.0);			return sizeof(TDS_REAL);			break;		case SYBMONEY:			cr->m.mny = (TDS_INT8)mny.mny4; 			return sizeof(TDS_MONEY);			break;		case SYBMONEY4:			memcpy(&(cr->m4), src, sizeof(TDS_MONEY4));			return sizeof(TDS_MONEY4);			break;		/* conversions not allowed */		case SYBUNIQUE:		case SYBDATETIME4:		case SYBDATETIME:		case SYBDATETIMN:			break;		case SYBDECIMAL:		case SYBNUMERIC:			dollars  = mny.mny4 / 10000;			fraction = mny.mny4 % 10000;			if (fraction < 0)	{ fraction = -fraction; }			sprintf(tmp_str,"%ld.%04lu",dollars,fraction);			return stringz_to_numeric(tmp_str,cr);		default:			return TDS_CONVERT_NOAVAIL;			break;	}	return TDS_CONVERT_FAIL;}static TDS_INT tds_convert_money(int srctype, const TDS_CHAR *src,	int desttype, CONV_RESULT *cr){char *s;TDS_INT8 mymoney,dollars;char tmpstr [64];    tdsdump_log(TDS_DBG_FUNC, "%L inside tds_convert_money()\n");#if defined(WORDS_BIGENDIAN) || !defined(HAVE_INT64)    memcpy(&mymoney, src, sizeof(TDS_INT8)); #else    memcpy(((char*)&mymoney)+4, src, 4);    memcpy(&mymoney, src+4, 4);#endif#	if (SIZEOF_LONG_LONG > 0)	tdsdump_log(TDS_DBG_FUNC, "%L mymoney = %lld\n", mymoney);#	else	tdsdump_log(TDS_DBG_FUNC, "%L mymoney = %ld\n", mymoney);#	endif	switch(desttype) {		case SYBCHAR:		case SYBVARCHAR:		case SYBTEXT:			s = tds_money_to_string((const TDS_MONEY *)src, tmpstr);			return string_to_result(s,cr);			break;		case SYBBINARY:		case SYBIMAGE:		case SYBVARBINARY:			return binary_to_result(src,sizeof(TDS_MONEY),cr);			break;		case SYBINT1:			dollars  = mymoney / 10000;			if (!IS_TINYINT(dollars))				return TDS_CONVERT_OVERFLOW;			cr->ti = (TDS_TINYINT) dollars;			return sizeof(TDS_TINYINT);			break;		case SYBINT2:			dollars  = mymoney / 10000;			if (!IS_SMALLINT(dollars))				return TDS_CONVERT_OVERFLOW;			cr->si = (TDS_SMALLINT) dollars;			return sizeof(TDS_SMALLINT);			break;		case SYBINT4:			dollars  = mymoney / 10000;			if (!IS_INT(dollars))				return TDS_CONVERT_OVERFLOW;			cr->i = (TDS_INT) dollars;			return sizeof(TDS_INT);			break;		case SYBINT8:			cr->bi = mymoney / 10000;			return sizeof(TDS_INT8);			break;		case SYBBIT:		case SYBBITN:			cr->ti = mymoney ? 1 : 0;			return sizeof(TDS_TINYINT);			break;		case SYBFLT8:			cr->f  = ((TDS_FLOAT)mymoney) / 10000.0;			return sizeof(TDS_FLOAT);			break;		case SYBREAL:			cr->r  = (TDS_REAL) (mymoney / 10000.0);			return sizeof(TDS_REAL);			break;		case SYBMONEY4:			if (!IS_INT(mymoney))				return TDS_CONVERT_OVERFLOW;			cr->m4.mny4 = (TDS_INT) mymoney;			return sizeof(TDS_MONEY4);			break;		case SYBMONEY:			cr->m.mny = mymoney;			return sizeof(TDS_MONEY);			break;		case SYBDECIMAL:		case SYBNUMERIC:			s = tds_money_to_string((const TDS_MONEY *)src, tmpstr);			return stringz_to_numeric(tmpstr,cr);			break;		/* conversions not allowed */		case SYBUNIQUE:		case SYBDATETIME4:		case SYBDATETIME:		case SYBDATETIMN:		default:			return TDS_CONVERT_NOAVAIL;			break;	}#ifndef NCBI_FTDS	return TDS_CONVERT_FAIL;#endif}static TDS_INT tds_convert_datetime(TDSCONTEXT *tds_ctx, int srctype, const TDS_CHAR *src,	int desttype, CONV_RESULT *cr){unsigned int dt_days, dt_time;char whole_date_string[30];TDSDATEREC when;	switch(desttype) {		case SYBCHAR:		case SYBVARCHAR:		case SYBTEXT:			if (!src) {				cr->c = (TDS_CHAR *) malloc(1);				test_alloc(cr->c);				*(cr->c) = '\0';                return 0;			} else {				memset( &when, 0, sizeof(when) );                tds_datecrack (SYBDATETIME, src, &when);                tds_strftime  (whole_date_string, sizeof(whole_date_string), tds_ctx->locale->date_fmt, &when );				return string_to_result(whole_date_string,cr);			}			break;		case SYBBINARY:		case SYBIMAGE:		case SYBVARBINARY:			return binary_to_result(src,sizeof(TDS_DATETIME),cr);			break;		case SYBDATETIME:			memcpy(&dt_days, src, 4);			memcpy(&dt_time, src + 4, 4);			cr->dt.dtdays = dt_days;			cr->dt.dttime = dt_time;            return sizeof(TDS_DATETIME);			break;		case SYBDATETIME4:			memcpy(&dt_days, src, 4);			memcpy(&dt_time, src + 4, 4);			cr->dt4.days    = dt_days;			cr->dt4.minutes = (dt_time / 300) / 60;            return sizeof(TDS_DATETIME4);			break;		/* conversions not allowed */		case SYBUNIQUE:		case SYBBIT:		case SYBBITN:		case SYBINT1:		case SYBINT2:		case SYBINT4:		case SYBINT8:		case SYBMONEY4:		case SYBMONEY:		case SYBNUMERIC:		case SYBDECIMAL:		default:			return TDS_CONVERT_NOAVAIL;			break;	}#ifndef NCBI_FTDS	return TDS_CONVERT_FAIL;#endif}/*static int days_this_year (int years){int year;   year = 1900 + years;   if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)      return 366;   else      return 365;}*/static TDS_INT tds_convert_datetime4(TDSCONTEXT *tds_ctx, int srctype, const TDS_CHAR *src,	int desttype, CONV_RESULT *cr){TDS_USMALLINT dt_days, dt_mins;char whole_date_string[30];TDSDATEREC when;	switch(desttype) {		case SYBCHAR:		case SYBVARCHAR:		case SYBTEXT:			if (!src) {				cr->c = (TDS_CHAR *) malloc(1);				test_alloc(cr->c);				*(cr->c) = '\0';                return 0;			} else {				memset( &when, 0, sizeof(when) );                tds_datecrack (SYBDATETIME4, src, &when);                tds_strftime  (whole_date_string, sizeof(whole_date_string), tds_ctx->locale->date_fmt, &when );				return string_to_result(whole_date_string,cr);			}			break;		case SYBBINARY:		case SYBIMAGE:		case SYBVARBINARY:			return binary_to_result(src,sizeof(TDS_DATETIME4),cr);			break;		case SYBDATETIME:			memcpy(&dt_days, src, 2);			memcpy(&dt_mins, src + 2, 2);			cr->dt.dtdays = dt_days;			cr->dt.dttime = (dt_mins * 60) * 300;            return sizeof(TDS_DATETIME);			break;		case SYBDATETIME4:			memcpy(&dt_days, src, 2);			memcpy(&dt_mins, src + 2, 2);			cr->dt4.days    = dt_days;			cr->dt4.minutes = dt_mins;            return sizeof(TDS_DATETIME4);			break;		/* conversions not allowed */		case SYBUNIQUE:		case SYBBIT:		case SYBBITN:		case SYBINT1:		case SYBINT2:		case SYBINT4:		case SYBINT8:		case SYBMONEY4:		case SYBMONEY:		case SYBNUMERIC:		case SYBDECIMAL:		default:			return TDS_CONVERT_NOAVAIL;			break;	}#ifndef NCBI_FTDS	return TDS_CONVERT_FAIL;#endif}static TDS_INT tds_convert_real(int srctype, const TDS_CHAR *src,	int desttype, CONV_RESULT *cr){TDS_REAL the_value;/* FIXME how many big should be this buffer ?? */char tmp_str[128];TDS_INT  mymoney4;TDS_INT8 mymoney;   memcpy(&the_value, src, 4);   switch(desttype) {      case SYBCHAR:      case SYBTEXT:      case SYBVARCHAR:            sprintf(tmp_str,"%.7g", the_value);	    return string_to_result(tmp_str,cr);            break;		case SYBBINARY:		case SYBIMAGE:		case SYBVARBINARY:			return binary_to_result(src,sizeof(TDS_REAL),cr);			break;		case SYBINT1:			if (!IS_TINYINT(the_value))				return TDS_CONVERT_OVERFLOW;			cr->ti = (TDS_TINYINT) the_value;			return sizeof(TDS_TINYINT);			break;		case SYBINT2:			if (!IS_SMALLINT(the_value))				return TDS_CONVERT_OVERFLOW;			cr->si = (TDS_SMALLINT) the_value;			return sizeof(TDS_SMALLINT);			break;		case SYBINT4:			if (!IS_INT(the_value))				return TDS_CONVERT_OVERFLOW;			cr->i = (TDS_INT) the_value;			return sizeof(TDS_INT);			break;		case SYBINT8:			/* TODO check overflow */			cr->bi = the_value;			return sizeof(TDS_INT8);			break;		case SYBBIT:		case SYBBITN:			cr->ti = the_value ? 1 : 0;			return sizeof(TDS_TINYINT);			break;		case SYBFLT8:			cr->f = the_value;			return sizeof(TDS_FLOAT);			break;		case SYBREAL:			cr->r = the_value;			return sizeof(TDS_REAL);			break;		case SYBMONEY:			/* TODO check overflow */			mymoney = the_value * 10000;			memcpy(&(cr->m), &mymoney, sizeof(TDS_MONEY));			return sizeof(TDS_MONEY);			break;		case SYBMONEY4:			/* TODO check overflow */			mymoney4 = the_value * 10000;			memcpy(&(cr->m4), &mymoney4, sizeof(TDS_MONEY4));			return sizeof(TDS_MONEY4);			break;		case SYBNUMERIC:		case SYBDECIMAL:			sprintf(tmp_str,"%.*f", cr->n.scale,  the_value);			return stringz_to_numeric(tmp_str, cr);			break;		/* not allowed */		case SYBUNIQUE:		case SYBDATETIME4:		case SYBDATETIME:		case SYBDATETIMN:		default:			return TDS_CONVERT_NOAVAIL;			break;	}#ifndef NCBI_FTDS	return TDS_CONVERT_FAIL;#endif}static TDS_INT tds_convert_flt8(int srctype, const TDS_CHAR *src,	int desttype, CONV_RESULT *cr){TDS_FLOAT the_value;char      tmp_str[25];   memcpy(&the_value, src, 8);   switch(desttype) {      case SYBCHAR:      case SYBVARCHAR:      case SYBTEXT:            sprintf(tmp_str,"%.15g", the_value);	    return string_to_result(tmp_str,cr);            break;		case SYBBINARY:		case SYBIMAGE:		case SYBVARBINARY:			return binary_to_result(src,sizeof(TDS_FLOAT),cr);			break;		case SYBINT1:			if (!IS_TINYINT(the_value))				return TDS_CONVERT_OVERFLOW;			cr->ti = (TDS_TINYINT) the_value;			return sizeof(TDS_TINYINT);			break;		case SYBINT2:			if (!IS_SMALLINT(the_value))				return TDS_CONVERT_OVERFLOW;			cr->si = (TDS_SMALLINT) the_value;			return sizeof(TDS_SMALLINT);			break;		case SYBINT4:			if (!IS_INT(the_value))				return TDS_CONVERT_OVERFLOW;			cr->i = (TDS_INT) the_value;			return sizeof(TDS_INT);			break;		case SYBINT8:			/* TODO check overflow */			cr->bi = the_value;			return sizeof(TDS_INT8);			break;		case SYBBIT:		case SYBBITN:			cr->ti = the_value ? 1 : 0;			return sizeof(TDS_TINYINT);			break;      case SYBMONEY:			/* TODO check overflow */            cr->m.mny = (TDS_INT8)the_value * 10000.0;            return sizeof(TDS_MONEY);            break;      case SYBMONEY4:			/* TODO check overflow */            cr->m4.mny4 = the_value * 10000.0;            return sizeof(TDS_MONEY4);            break;		case SYBREAL:			cr->r = the_value;

⌨️ 快捷键说明

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