📄 cs.c
字号:
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 + -