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

📄 cs.c

📁 在Linux/Unix下面访问WINDOWS SQLSERVER 的ODBC驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	case SYBBINARY:	case SYBVARBINARY:	case SYBIMAGE:		if (len > destlen) {			free(cres.ib);			fprintf(stderr, "error_handler: Data-conversion resulted in overflow.\n");			ret = CS_FAIL;		} else {			memcpy(dest, cres.ib, len);			free(cres.ib);			for (i = len; i < destlen; i++)				dest[i] = '\0';			if (resultlen != NULL)				*resultlen = destlen;			ret = CS_SUCCEED;		}		break;	case SYBBIT:	case SYBBITN:		/* fall trough, act same way of TINYINT */	case SYBINT1:		memcpy(dest, &(cres.ti), 1);		if (resultlen != NULL)			*resultlen = 1;		ret = CS_SUCCEED;		break;	case SYBINT2:		memcpy(dest, &(cres.si), 2);		if (resultlen != NULL)			*resultlen = 2;		ret = CS_SUCCEED;		break;	case SYBINT4:		memcpy(dest, &(cres.i), 4);		if (resultlen != NULL)			*resultlen = 4;		ret = CS_SUCCEED;		break;	case SYBINT8:		memcpy(dest, &(cres.bi), 8);		if (resultlen != NULL)			*resultlen = 8;		ret = CS_SUCCEED;		break;	case SYBFLT8:		memcpy(dest, &(cres.f), 8);		if (resultlen != NULL)			*resultlen = 8;		ret = CS_SUCCEED;		break;	case SYBREAL:		memcpy(dest, &(cres.r), 4);		if (resultlen != NULL)			*resultlen = 4;		ret = CS_SUCCEED;		break;	case SYBMONEY:		tdsdump_log(TDS_DBG_FUNC, "cs_convert() copying %d bytes to src\n", (int) sizeof(TDS_MONEY));		memcpy(dest, &(cres.m), sizeof(TDS_MONEY));		if (resultlen != NULL)			*resultlen = sizeof(TDS_MONEY);		ret = CS_SUCCEED;		break;	case SYBMONEY4:		memcpy(dest, &(cres.m4), sizeof(TDS_MONEY4));		if (resultlen != NULL)			*resultlen = sizeof(TDS_MONEY4);		ret = CS_SUCCEED;		break;	case SYBDATETIME:		memcpy(dest, &(cres.dt), sizeof(TDS_DATETIME));		if (resultlen != NULL)			*resultlen = sizeof(TDS_DATETIME);		ret = CS_SUCCEED;		break;	case SYBDATETIME4:		memcpy(dest, &(cres.dt4), sizeof(TDS_DATETIME4));		if (resultlen != NULL)			*resultlen = sizeof(TDS_DATETIME4);		ret = CS_SUCCEED;		break;	case SYBNUMERIC:	case SYBDECIMAL:		src_len = tds_numeric_bytes_per_prec[cres.n.precision] + 2;		memcpy(dest, &(cres.n), src_len);		if (resultlen != NULL)			*resultlen = src_len;		ret = CS_SUCCEED;		break;	case SYBCHAR:	case SYBVARCHAR:	case SYBTEXT:		if (len > destlen) {			fprintf(stderr, "error_handler: Data-conversion resulted in overflow.\n");			ret = CS_FAIL;		} else {			switch (destfmt->format) {			case CS_FMT_NULLTERM:				tdsdump_log(TDS_DBG_FUNC, "cs_convert() FMT_NULLTERM\n");				if (len == destlen) {					tdsdump_log(TDS_DBG_FUNC, "not enough room for data + a null terminator - error\n");					ret = CS_FAIL;	/* not enough room for data + a null terminator - error */				} else {					memcpy(dest, cres.c, len);					dest[len] = 0;					if (resultlen != NULL)						*resultlen = len + 1;					ret = CS_SUCCEED;				}				break;			case CS_FMT_PADBLANK:				tdsdump_log(TDS_DBG_FUNC, "cs_convert() FMT_PADBLANK\n");				/* strcpy here can lead to a small buffer overflow */				memcpy(dest, cres.c, len);				for (i = len; i < destlen; i++)					dest[i] = ' ';				if (resultlen != NULL)					*resultlen = destlen;				ret = CS_SUCCEED;				break;			case CS_FMT_PADNULL:				tdsdump_log(TDS_DBG_FUNC, "cs_convert() FMT_PADNULL\n");				/* strcpy here can lead to a small buffer overflow */				memcpy(dest, cres.c, len);				for (i = len; i < destlen; i++)					dest[i] = '\0';				if (resultlen != NULL)					*resultlen = destlen;				ret = CS_SUCCEED;				break;			case CS_FMT_UNUSED:				tdsdump_log(TDS_DBG_FUNC, "cs_convert() FMT_UNUSED\n");				memcpy(dest, cres.c, len);				if (resultlen != NULL)					*resultlen = len;				ret = CS_SUCCEED;				break;			default:				ret = CS_FAIL;				break;			}		}		free(cres.c);		break;	default:		ret = CS_FAIL;		break;	}	tdsdump_log(TDS_DBG_FUNC, "cs_convert() returning  %d\n", ret);	return (ret);}CS_RETCODEcs_dt_crack(CS_CONTEXT * ctx, CS_INT datetype, CS_VOID * dateval, CS_DATEREC * daterec){TDS_DATETIME *dt;TDS_DATETIME4 *dt4;time_t tmp_secs_from_epoch;struct tm *t;TDSDATEREC dr;	if (datetype == CS_DATETIME_TYPE) {		dt = (TDS_DATETIME *) dateval;		tds_datecrack(SYBDATETIME, dt, &dr);	} else if (datetype == CS_DATETIME4_TYPE) {		dt4 = (TDS_DATETIME4 *) dateval;		tds_datecrack(SYBDATETIME4, dt4, &dr);	} else {		return CS_FAIL;	}	t = (struct tm *) gmtime(&tmp_secs_from_epoch);	daterec->dateyear = dr.year;	daterec->datemonth = dr.month;	daterec->datedmonth = dr.day;	daterec->datedyear = dr.dayofyear;	daterec->datedweek = dr.weekday;	daterec->datehour = dr.hour;	daterec->dateminute = dr.minute;	daterec->datesecond = dr.second;	daterec->datemsecond = dr.millisecond;	daterec->datetzone = 0;	return CS_SUCCEED;}CS_RETCODEcs_loc_alloc(CS_CONTEXT * ctx, CS_LOCALE ** locptr){	CS_LOCALE *tds_csloc;	tds_csloc = _cs_locale_alloc();	if (!tds_csloc)		return CS_FAIL;	*locptr = tds_csloc;	return CS_SUCCEED;}CS_RETCODEcs_loc_drop(CS_CONTEXT * ctx, CS_LOCALE * locale){	if (!locale)		return CS_FAIL;	_cs_locale_free(locale);	return CS_SUCCEED;}CS_RETCODEcs_locale(CS_CONTEXT * ctx, CS_INT action, CS_LOCALE * locale, CS_INT type, CS_VOID * buffer, CS_INT buflen, CS_INT * outlen){	CS_RETCODE code = CS_FAIL;	if (action == CS_SET) {		switch (type) {		case CS_LC_ALL:			/* what to do here if there is locale data? */			if (!buffer) {				code = CS_SUCCEED;			}			break;		case CS_SYB_CHARSET:			if (buflen == CS_NULLTERM) {				buflen = strlen((char *)buffer);			}						free(locale->charset);			locale->charset = (char *)malloc(buflen + 1);			if (!locale->charset)				break;			strncpy(locale->charset, (char *)buffer, buflen);			locale->charset[buflen] = '\0';			code = CS_SUCCEED;			break;		case CS_SYB_LANG:			if (buflen == CS_NULLTERM) {				buflen = strlen((char *)buffer);			}						free(locale->language);			locale->language = (char *)malloc(buflen + 1);			if (!locale->language)				break;			strncpy(locale->language, (char *)buffer, buflen);			locale->language[buflen] = '\0';			code = CS_SUCCEED;			break;		case CS_SYB_LANG_CHARSET:		{			int i;			char *b = (char *)buffer;			if (buflen == CS_NULLTERM) {				buflen = strlen(b);			}			/* find '.' character */			for (i = 0; i < buflen; ++i) {				if (b[i] == '.') {					break;				}								}			/* not found */			if (i == buflen) {				break;			}			if (i) {				free(locale->language);				locale->language = (char *)malloc(i + 1);				if (!locale->language)					break;				strncpy(locale->language, b, i);				locale->language[i] = '\0';			}			if (i != (buflen - 1)) {				free(locale->charset);				locale->charset = (char *)malloc(buflen - i);				if (!locale->charset)					break;								strncpy(locale->charset, b + i + 1, buflen - i - 1);				locale->charset[buflen - i - 1] = '\0';			}			code = CS_SUCCEED;			break;		}		/* TODO commented out until the code works end-to-end		case CS_SYB_SORTORDER:			if (buflen == CS_NULLTERM) {				buflen = strlen((char *)buffer);			}						free(locale->collate);			locale->collate = (char *)malloc(buflen + 1);			if (!locale->collate)				break;			strncpy(locale->collate, (char *)buffer, buflen);			locale->collate[buflen] = '\0';			code = CS_SUCCEED;			break;		*/		}	}	else if (action == CS_GET)	{		int tlen;		switch (type) {		case CS_SYB_CHARSET:			tlen = (locale->charset ? strlen(locale->charset) : 0) + 1;			if (buflen < tlen)			{				if (outlen)					*outlen = tlen;				break;			}			if (locale->charset)				strcpy((char *)buffer, locale->charset);			else				((char *)buffer)[0] = '\0';			code = CS_SUCCEED;			break;		case CS_SYB_LANG:			tlen = (locale->language ? strlen(locale->language) : 0) + 1;			if (buflen < tlen)			{				if (outlen)					*outlen = tlen;				break;			}			if (locale->language)				strcpy((char *)buffer, locale->language);			else				((char *)buffer)[0] = '\0';			code = CS_SUCCEED;			break;		case CS_SYB_LANG_CHARSET:		{			int clen;			tlen = (locale->language ? strlen(locale->language) : 0) + 1;			clen = (locale->charset ? strlen(locale->charset) : 0) + 1;						if (buflen < (tlen + clen))			{				if (outlen)					*outlen = tlen + clen;				break;			}			if (locale->language)				strcpy((char *)buffer, locale->language);			else				((char *)buffer)[0] = '\0';			strcat((char *)buffer, ".");			if (locale->charset) {				tlen = strlen((char *)buffer);				strcpy((char *)buffer + tlen, locale->charset);			}			code = CS_SUCCEED;			break;		}		case CS_SYB_SORTORDER:			tlen = (locale->collate ? strlen(locale->collate) : 0) + 1;			if (buflen < tlen)			{				if (outlen)					*outlen = tlen;				break;			}			if (locale->collate)				strcpy((char *)buffer, locale->collate);			else				((char *)buffer)[0] = '\0';			code = CS_SUCCEED;			break;		}	}	return code;}CS_RETCODEcs_dt_info(CS_CONTEXT * ctx, CS_INT action, CS_LOCALE * locale, CS_INT type, CS_INT item, CS_VOID * buffer, CS_INT buflen,	   CS_INT * outlen){	if (action == CS_SET) {		switch (type) {		case CS_DT_CONVFMT:			break;		}	}	return CS_SUCCEED;}CS_RETCODEcs_strbuild(CS_CONTEXT * ctx, CS_CHAR * buffer, CS_INT buflen, CS_INT * resultlen, CS_CHAR * text, CS_INT textlen,	    CS_CHAR * formats, CS_INT formatlen, ...){	va_list ap;	CS_RETCODE rc;	va_start(ap, formatlen);	rc = tds_vstrbuild(buffer, buflen, resultlen, text, textlen, formats, formatlen, ap);	va_end(ap);	return rc;}CS_RETCODEcs_calc(CS_CONTEXT * ctx, CS_INT op, CS_INT datatype, CS_VOID * var1, CS_VOID * var2, CS_VOID * dest){	tdsdump_log(TDS_DBG_FUNC, "UNIMPLEMENTED cs_calc()\n");	return CS_FAIL;}CS_RETCODEcs_cmp(CS_CONTEXT * ctx, CS_INT datatype, CS_VOID * var1, CS_VOID * var2, CS_INT * result){	tdsdump_log(TDS_DBG_FUNC, "UNIMPLEMENTED cs_cmp()\n");	return CS_FAIL;}CS_RETCODEcs_conv_mult(CS_CONTEXT * ctx, CS_LOCALE * srcloc, CS_LOCALE * destloc, CS_INT * conv_multiplier){	tdsdump_log(TDS_DBG_FUNC, "UNIMPLEMENTED cs_conv_mult()\n");	return CS_FAIL;}CS_RETCODEcs_diag(CS_CONTEXT * ctx, CS_INT operation, CS_INT type, CS_INT idx, CS_VOID * buffer){	switch (operation) {		case CS_INIT:			if ( ctx->cs_errhandletype == _CS_ERRHAND_CB) {				/* contrary to the manual page you don't seem to */				/* be able to turn on inline message handling    */				/* using cs_diag, once a callback is installed!  */				return CS_FAIL;			}			ctx->cs_errhandletype = _CS_ERRHAND_INLINE;			ctx->cs_diag_msglimit = CS_NO_LIMIT;			ctx->_cslibmsg_cb = (CS_CSLIBMSG_FUNC) cs_diag_storemsg; 			break;		case CS_MSGLIMIT:			if ( ctx->cs_errhandletype != _CS_ERRHAND_INLINE) {				return CS_FAIL;			}			ctx->cs_diag_msglimit = *(CS_INT *)buffer;			break;		case CS_CLEAR:			if ( ctx->cs_errhandletype != _CS_ERRHAND_INLINE) {				return CS_FAIL;			}			return (cs_diag_clearmsg(ctx, type));			break;		case CS_GET:			if ( ctx->cs_errhandletype != _CS_ERRHAND_INLINE) {				return CS_FAIL;			}			if (buffer == NULL)				return CS_FAIL;			if (idx == 0 || (ctx->cs_diag_msglimit != CS_NO_LIMIT && idx > ctx->cs_diag_msglimit) )				return CS_FAIL;			return (cs_diag_getmsg(ctx, idx, (CS_CLIENTMSG *)buffer)); 						break;		case CS_STATUS:			if ( ctx->cs_errhandletype != _CS_ERRHAND_INLINE) {				return CS_FAIL;			}			if (buffer == NULL) 				return CS_FAIL;			return (cs_diag_countmsg(ctx, (CS_INT *)buffer));			break;	}	return CS_SUCCEED;		}CS_RETCODEcs_manage_convert(CS_CONTEXT * ctx, CS_INT action, CS_INT srctype, CS_CHAR * srcname, CS_INT srcnamelen, CS_INT desttype,		  CS_CHAR * destname, CS_INT destnamelen, CS_INT * conv_multiplier, CS_CONV_FUNC * func){	tdsdump_log(TDS_DBG_FUNC, "UNIMPLEMENTED cs_manage_convert()\n");	return CS_FAIL;}CS_RETCODEcs_objects(CS_CONTEXT * ctx, CS_INT action, CS_OBJNAME * objname, CS_OBJDATA * objdata){	tdsdump_log(TDS_DBG_FUNC, "UNIMPLEMENTED cs_objects()\n");	return CS_FAIL;}CS_RETCODEcs_set_convert(CS_CONTEXT * ctx, CS_INT action, CS_INT srctype, CS_INT desttype, CS_CONV_FUNC * func){	tdsdump_log(TDS_DBG_FUNC, "UNIMPLEMENTED cs_set_convert()\n");	return CS_FAIL;}CS_RETCODEcs_setnull(CS_CONTEXT * ctx, CS_DATAFMT * datafmt, CS_VOID * buffer, CS_INT buflen){	tdsdump_log(TDS_DBG_FUNC, "UNIMPLEMENTED cs_setnull()\n");	return CS_FAIL;}CS_RETCODEcs_strcmp(CS_CONTEXT * ctx, CS_LOCALE * locale, CS_INT type, CS_CHAR * str1, CS_INT len1, CS_CHAR * str2, CS_INT len2,	  CS_INT * result){	tdsdump_log(TDS_DBG_FUNC, "UNIMPLEMENTED cs_strcmp()\n");	return CS_FAIL;}CS_RETCODEcs_time(CS_CONTEXT * ctx, CS_LOCALE * locale, CS_VOID * buffer, CS_INT buflen, CS_INT * outlen, CS_DATEREC * daterec){	tdsdump_log(TDS_DBG_FUNC, "UNIMPLEMENTED cs_time()\n");	return CS_FAIL;}CS_RETCODEcs_will_convert(CS_CONTEXT * ctx, CS_INT srctype, CS_INT desttype, CS_BOOL * result){	*result = (tds_willconvert(srctype, desttype) ? CS_TRUE : CS_FALSE);	return CS_SUCCEED;}static CS_INT cs_diag_storemsg(CS_CONTEXT *context, CS_CLIENTMSG *message){struct cs_diag_msg **curptr;CS_INT msg_count = 0;	curptr = &(context->msgstore);	/* if we already have a list of messages, */	/* go to the end of the list...           */	while (*curptr != NULL) {		msg_count++;		curptr = &((*curptr)->next);	}	/* messages over and above the agreed limit */	/* are simply discarded...                  */	if (context->cs_diag_msglimit != CS_NO_LIMIT &&		msg_count >= context->cs_diag_msglimit) {		return CS_FAIL;	}	*curptr = (struct cs_diag_msg *) malloc(sizeof(struct cs_diag_msg));	if (*curptr == NULL) { 		return CS_FAIL;	} else {		(*curptr)->next = NULL;		(*curptr)->msg  = malloc(sizeof(CS_CLIENTMSG));		if ((*curptr)->msg == NULL) {			return CS_FAIL;		} else {			memcpy((*curptr)->msg, message, sizeof(CS_CLIENTMSG));		}	}	return CS_SUCCEED;}static CS_INT cs_diag_getmsg(CS_CONTEXT *context, CS_INT idx, CS_CLIENTMSG *message){struct cs_diag_msg *curptr;CS_INT msg_count = 0, msg_found = 0;	curptr = context->msgstore;	/* if we already have a list of messages, */	/* go to the end of the list...           */	while (curptr != NULL) {		msg_count++;		if (msg_count == idx) {			msg_found++;			break;		}		curptr = curptr->next;	}	if (msg_found) {		memcpy(message, curptr->msg, sizeof(CS_CLIENTMSG));		return CS_SUCCEED;	} else {		return CS_NOMSG;	}}static CS_INT cs_diag_clearmsg(CS_CONTEXT *context, CS_INT type){struct cs_diag_msg *curptr, *freeptr;	curptr = context->msgstore;	context->msgstore = NULL;	while (curptr != NULL ) {        	freeptr = curptr;		curptr = freeptr->next;        	free(freeptr->msg);        	free(freeptr);	}	return CS_SUCCEED;}static CS_INT cs_diag_countmsg(CS_CONTEXT *context, CS_INT *count){struct cs_diag_msg *curptr;CS_INT msg_count = 0;	curptr = context->msgstore;	while (curptr != NULL) {		msg_count++;		curptr = curptr->next;	}	*count = msg_count;	return CS_SUCCEED;}

⌨️ 快捷键说明

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