diff --git a/src/connector/odbc/src/todbc.c b/src/connector/odbc/src/todbc.c index 03d47dad4d2990726ca8611b8270eb5fa6ae871b..62868163a369666e4b9c1b878c8d1aa57f277d74 100644 --- a/src/connector/odbc/src/todbc.c +++ b/src/connector/odbc/src/todbc.c @@ -74,7 +74,6 @@ do { if (Sqlstate) strncpy((char*)Sqlstate, (char*)obj->err.sql_state, n); \ if (NativeError) *NativeError = obj->err.err_no; \ snprintf((char*)MessageText, (size_t)BufferLength, "%s", obj->err.err_str); \ - if (TextLength && obj->err.err_str) *TextLength = (SQLSMALLINT)strlen(obj->err.err_str); \ if (TextLength && obj->err.err_str) *TextLength = (SQLSMALLINT)utf8_chars(obj->err.err_str); \ } while (0) @@ -264,10 +263,6 @@ struct sql_s { uint64_t refcount; conn_t *conn; - iconv_t w2c; // wchar* -> char* - iconv_t u2c; // unicode -> char* - iconv_t u2w; // unicode -> wchar* - TAOS_STMT *stmt; param_bind_t *params; int n_params; @@ -297,14 +292,6 @@ static pthread_once_t init_once = PTHREAD_ONCE_INIT; static void init_routine(void); static size_t do_field_display_size(TAOS_FIELD *field); -static iconv_t sql_get_w2c(sql_t *sql) { - if (sql->w2c == (iconv_t)-1) { - sql->w2c = iconv_open("UTF-8", "UCS-2LE"); - } - - return sql->w2c; -} - static tsdb_conv_t* tsdb_conn_client_to_server(conn_t *conn) { if (!conn->client_to_server) { @@ -409,22 +396,6 @@ do { } \ } while (0) -// static iconv_t sql_get_u2c(sql_t *sql) { -// if (sql->u2c == (iconv_t)-1) { -// sql->u2c = iconv_open("UTF-8", "UCS-4LE"); -// } -// -// return sql->u2c; -// } -// -// static iconv_t sql_get_u2w(sql_t *sql) { -// if (sql->u2w == (iconv_t)-1) { -// sql->u2w = iconv_open("UCS-2LE", "UCS-4LE"); -// } -// -// return sql->u2w; -// } - static SQLRETURN doSQLAllocEnv(SQLHENV *EnvironmentHandle) { pthread_once(&init_once, init_routine); @@ -666,10 +637,6 @@ static SQLRETURN doSQLAllocStmt(SQLHDBC ConnectionHandle, break; } - sql->w2c = (iconv_t)-1; - sql->u2c = (iconv_t)-1; - sql->u2w = (iconv_t)-1; - sql->conn = conn; DASSERT(INC_REF(sql)>0); @@ -767,19 +734,6 @@ static SQLRETURN doSQLFreeStmt(SQLHSTMT StatementHandle, FREE_ERROR(sql); - if (sql->w2c!=(iconv_t)-1) { - iconv_close(sql->w2c); - sql->w2c = (iconv_t)-1; - } - if (sql->u2c!=(iconv_t)-1) { - iconv_close(sql->u2c); - sql->u2c = (iconv_t)-1; - } - if (sql->u2w!=(iconv_t)-1) { - iconv_close(sql->u2w); - sql->u2w = (iconv_t)-1; - } - free(sql); return SQL_SUCCESS; @@ -793,11 +747,22 @@ SQLRETURN SQL_API SQLFreeStmt(SQLHSTMT StatementHandle, return r; } +static SQLRETURN do_exec_direct(sql_t *sql, TSDB_CONV_CODE code, const char *statement) { + if (code) CHK_CONV(1, code); + DASSERT(code==TSDB_CONV_OK); + + SQLRETURN r = SQL_ERROR; + do { + sql->rs = taos_query(sql->conn->taos, statement); + CHK_RS(r, sql, "failed to execute"); + } while (0); + + return r; +} + static SQLRETURN doSQLExecDirect(SQLHSTMT StatementHandle, SQLCHAR *StatementText, SQLINTEGER TextLength) { - stack_buffer_t buffer; buffer.next = 0; - sql_t *sql = (sql_t*)StatementHandle; if (!sql) return SQL_INVALID_HANDLE; @@ -825,20 +790,14 @@ static SQLRETURN doSQLExecDirect(SQLHSTMT StatementHandle, } sql->n_params = 0; + SQLRETURN r = SQL_SUCCESS; + stack_buffer_t buffer; buffer.next = 0; tsdb_conv_t *client_to_server = tsdb_conn_client_to_server(conn); const char *stxt = NULL; - - SQLRETURN r = SQL_ERROR; do { - tsdb_conv(client_to_server, &buffer, (const char*)StatementText, (size_t)TextLength, &stxt, NULL); - if (!stxt) { - SET_ERROR(sql, "HY001", TSDB_CODE_ODBC_OOM, ""); - break; - } - sql->rs = taos_query(sql->conn->taos, stxt); - CHK_RS(r, sql, "failed to execute"); + TSDB_CONV_CODE code = tsdb_conv(client_to_server, &buffer, (const char*)StatementText, (size_t)TextLength, &stxt, NULL); + r = do_exec_direct(sql, code, stxt); } while (0); - tsdb_conv_free(client_to_server, stxt, &buffer, (const char*)StatementText); return r; @@ -860,6 +819,8 @@ static SQLRETURN doSQLExecDirectW(SQLHSTMT hstmt, SQLWCHAR *szSqlStr, SQLINTEGER CHK_CONN(sql); CHK_CONN_TAOS(sql); + conn_t *conn = sql->conn; + if (!szSqlStr) { SET_ERROR(sql, "HY009", TSDB_CODE_ODBC_BAD_ARG, "szSqlStr [%p] not allowed", szSqlStr); return SQL_ERROR; @@ -869,10 +830,17 @@ static SQLRETURN doSQLExecDirectW(SQLHSTMT hstmt, SQLWCHAR *szSqlStr, SQLINTEGER return SQL_ERROR; } - size_t bytes = 0; - SQLCHAR *utf8 = wchars_to_chars(szSqlStr, (size_t)cbSqlStr, &bytes); - SQLRETURN r = SQLExecDirect(hstmt, utf8, (SQLINTEGER)bytes); - if (utf8) free(utf8); + SQLRETURN r = SQL_SUCCESS; + stack_buffer_t buffer; buffer.next = 0; + tsdb_conv_t *utf16_to_server = tsdb_conn_utf16_to_server(conn); + const char *stxt = NULL; + do { + size_t slen = (size_t)cbSqlStr * sizeof(*szSqlStr); + TSDB_CONV_CODE code = tsdb_conv(utf16_to_server, &buffer, (const char*)szSqlStr, slen, &stxt, NULL); + r = do_exec_direct(sql, code, stxt); + } while (0); + tsdb_conv_free(utf16_to_server, stxt, &buffer, (const char*)szSqlStr); + return r; } @@ -1572,7 +1540,11 @@ static SQLRETURN do_bind_param_value(sql_t *sql, int idx_row, int idx, param_bin CHK_CONV(1, tsdb_conv_chars_to_bit(client_to_utf8, &buffer, (const char *)paramValue, slen, &bind->u.b)); } break; case SQL_C_WCHAR: { - CHK_CONV(1, tsdb_wchars_to_bit(sql_get_w2c(sql), (const unsigned char*)paramValue, (size_t)*soi, &bind->u.b)); + stack_buffer_t buffer; buffer.next = 0; + tsdb_conv_t *utf16_to_utf8 = tsdb_conn_utf16_to_utf8(conn); + size_t slen = (size_t)*soi; + DASSERT(slen != SQL_NTS); + CHK_CONV(1, tsdb_conv_chars_to_bit(utf16_to_utf8, &buffer, (const char *)paramValue, slen, &bind->u.b)); } break; case SQL_C_USHORT: case SQL_C_ULONG: @@ -1629,7 +1601,11 @@ static SQLRETURN do_bind_param_value(sql_t *sql, int idx_row, int idx, param_bin // CHK_CONV(1, tsdb_chars_to_tinyint((const char *)paramValue, (size_t)*soi, &bind->u.v1)); } break; case SQL_C_WCHAR: { - CHK_CONV(1, tsdb_wchars_to_tinyint(sql_get_w2c(sql), (const unsigned char*)paramValue, (size_t)*soi, &bind->u.v1)); + stack_buffer_t buffer; buffer.next = 0; + tsdb_conv_t *utf16_to_utf8 = tsdb_conn_utf16_to_utf8(conn); + size_t slen = (size_t)*soi; + DASSERT(slen != SQL_NTS); + CHK_CONV(1, tsdb_conv_chars_to_tinyint(utf16_to_utf8, &buffer, (const char *)paramValue, slen, &bind->u.v1)); } break; case SQL_C_USHORT: case SQL_C_ULONG: @@ -1688,7 +1664,11 @@ static SQLRETURN do_bind_param_value(sql_t *sql, int idx_row, int idx, param_bin // CHK_CONV(1, tsdb_chars_to_smallint((const char*)paramValue, (size_t)*soi, &bind->u.v2)); } break; case SQL_C_WCHAR: { - CHK_CONV(1, tsdb_wchars_to_smallint(sql_get_w2c(sql), (const unsigned char*)paramValue, (size_t)*soi, &bind->u.v2)); + stack_buffer_t buffer; buffer.next = 0; + tsdb_conv_t *utf16_to_utf8 = tsdb_conn_utf16_to_utf8(conn); + size_t slen = (size_t)*soi; + DASSERT(slen != SQL_NTS); + CHK_CONV(1, tsdb_conv_chars_to_smallint(utf16_to_utf8, &buffer, (const char *)paramValue, slen, &bind->u.v2)); } break; case SQL_C_USHORT: case SQL_C_ULONG: @@ -1747,7 +1727,11 @@ static SQLRETURN do_bind_param_value(sql_t *sql, int idx_row, int idx, param_bin // CHK_CONV(1, tsdb_chars_to_int((const char*)paramValue, (size_t)*soi, &bind->u.v4)); } break; case SQL_C_WCHAR: { - CHK_CONV(1, tsdb_wchars_to_int(sql_get_w2c(sql), (const unsigned char*)paramValue, (size_t)*soi, &bind->u.v4)); + stack_buffer_t buffer; buffer.next = 0; + tsdb_conv_t *utf16_to_utf8 = tsdb_conn_utf16_to_utf8(conn); + size_t slen = (size_t)*soi; + DASSERT(slen != SQL_NTS); + CHK_CONV(1, tsdb_conv_chars_to_int(utf16_to_utf8, &buffer, (const char *)paramValue, slen, &bind->u.v4)); } break; case SQL_C_USHORT: case SQL_C_ULONG: @@ -1806,7 +1790,11 @@ static SQLRETURN do_bind_param_value(sql_t *sql, int idx_row, int idx, param_bin // CHK_CONV(1, tsdb_chars_to_bigint((const char*)paramValue, (size_t)*soi, &bind->u.v8)); } break; case SQL_C_WCHAR: { - CHK_CONV(1, tsdb_wchars_to_bigint(sql_get_w2c(sql), (const unsigned char*)paramValue, (size_t)*soi, &bind->u.v8)); + stack_buffer_t buffer; buffer.next = 0; + tsdb_conv_t *utf16_to_utf8 = tsdb_conn_utf16_to_utf8(conn); + size_t slen = (size_t)*soi; + DASSERT(slen != SQL_NTS); + CHK_CONV(1, tsdb_conv_chars_to_bigint(utf16_to_utf8, &buffer, (const char *)paramValue, slen, &bind->u.v8)); } break; case SQL_C_USHORT: case SQL_C_ULONG: @@ -1868,7 +1856,6 @@ static SQLRETURN do_bind_param_value(sql_t *sql, int idx_row, int idx, param_bin size_t slen = (size_t)*soi; if (slen==SQL_NTS) slen = strlen((const char*)paramValue); CHK_CONV(1, tsdb_conv_chars_to_float(client_to_utf8, &buffer, (const char *)paramValue, slen, &bind->u.f4)); - // CHK_CONV(1, tsdb_chars_to_float((const char*)paramValue, (size_t)*soi, &bind->u.f4)); } break; case SQL_C_WCHAR: { stack_buffer_t buffer; buffer.next = 0; @@ -1876,7 +1863,6 @@ static SQLRETURN do_bind_param_value(sql_t *sql, int idx_row, int idx, param_bin size_t slen = (size_t)*soi; DASSERT(slen != SQL_NTS); CHK_CONV(1, tsdb_conv_chars_to_float(utf16_to_utf8, &buffer, (const char *)paramValue, slen, &bind->u.f4)); - // CHK_CONV(1, tsdb_wchars_to_float(sql_get_w2c(sql), (const unsigned char*)paramValue, (size_t)*soi, &bind->u.f4)); } break; case SQL_C_USHORT: case SQL_C_ULONG: @@ -1944,7 +1930,6 @@ static SQLRETURN do_bind_param_value(sql_t *sql, int idx_row, int idx, param_bin size_t slen = (size_t)*soi; DASSERT(slen != SQL_NTS); CHK_CONV(1, tsdb_conv_chars_to_double(utf16_to_utf8, &buffer, (const char *)paramValue, slen, &bind->u.f8)); - // CHK_CONV(1, tsdb_wchars_to_double(sql_get_w2c(sql), (const unsigned char*)paramValue, (size_t)*soi, &bind->u.f8)); } break; case SQL_C_USHORT: case SQL_C_ULONG: @@ -2817,11 +2802,6 @@ SQLRETURN SQL_API SQLSetStmtAttr(SQLHSTMT StatementHandle, static void init_routine(void) { - if (0) { - string_conv(NULL, NULL, NULL, 0, NULL, 0, NULL, NULL); - utf8_to_ucs4le(NULL, NULL); - ucs4le_to_utf8(NULL, 0, NULL); - } taos_init(); } diff --git a/src/connector/odbc/src/todbc_conv.c b/src/connector/odbc/src/todbc_conv.c index 4f7171d14988e2bb91302ab4bbb223259dcff8a5..978c6c2d84228f3285104166681dd7e7b8d76426 100644 --- a/src/connector/odbc/src/todbc_conv.c +++ b/src/connector/odbc/src/todbc_conv.c @@ -23,35 +23,6 @@ #include #include -typedef struct buf_s buf_t; - -struct buf_s { - char buf[1024*16+1]; - - char *ptr; -}; - -static char* buf_init(buf_t *buf, size_t len); -static void buf_clean(buf_t *buf); - -static char* buf_init(buf_t *buf, size_t len) { - if (len>sizeof(buf->buf)) { - buf->ptr = (char*)malloc(len); - } else if (len>0) { - buf->ptr = &buf->buf[0]; - } else { - buf->ptr = NULL; - } - return buf->ptr; -} - -static void buf_clean(buf_t *buf) { - if (buf->ptr && buf->ptr != buf->buf) { - free(buf->ptr); - buf->ptr = NULL; - } -} - const char* tsdb_conv_code_str(TSDB_CONV_CODE code) { switch (code) { case TSDB_CONV_OK: return "TSDB_CONV_OK"; @@ -69,36 +40,6 @@ const char* tsdb_conv_code_str(TSDB_CONV_CODE code) { }; } -TSDB_CONV_CODE tsdb_iconv_conv(iconv_t cnv, const unsigned char *src, size_t *slen, unsigned char *dst, size_t *dlen) { - if(cnv == (iconv_t)-1) return TSDB_CONV_GENERAL; - - char *s = (char*)src; - char *d = (char*)dst; - size_t sl = *slen; - size_t dl = *dlen; - - size_t n = iconv(cnv, &s, &sl, &d, &dl); - int e = errno; - if (dl) *d = '\0'; // what if all consumed? - - *slen = sl; - *dlen = dl; - - if (e==0) { - if (n) return TSDB_CONV_BAD_CHAR; - return TSDB_CONV_OK; - } - - iconv(cnv, NULL, NULL, NULL, NULL); - - switch (e) { - case E2BIG: return TSDB_CONV_TRUNC; - case EILSEQ: return TSDB_CONV_BAD_CHAR; - case EINVAL: return TSDB_CONV_BAD_CHAR; - default: return TSDB_CONV_GENERAL; - } -} - // src: int TSDB_CONV_CODE tsdb_int64_to_bit(int64_t src, int8_t *dst) { *dst = (int8_t)src; @@ -425,148 +366,6 @@ TSDB_CONV_CODE tsdb_chars_to_char(const char *src, size_t smax, char *dst, size_ } -// src: wchars -TSDB_CONV_CODE tsdb_wchars_to_bit(iconv_t cnv, const unsigned char *src, size_t smax, int8_t *dst) { - if(cnv == (iconv_t)-1) return TSDB_CONV_GENERAL; - - size_t len = smax * 2; - buf_t buf; - buf_init(&buf, len+1); - if (!buf.ptr) return TSDB_CONV_OOM; - - size_t dmax = len + 1; - TSDB_CONV_CODE code = tsdb_iconv_conv(cnv, src, &smax, (unsigned char*)buf.ptr, &dmax); - if (code==TSDB_CONV_OK) { - code = tsdb_chars_to_bit(buf.ptr, len+1-dmax, dst); - } - - buf_clean(&buf); - - return code; -} - -TSDB_CONV_CODE tsdb_wchars_to_tinyint(iconv_t cnv, const unsigned char *src, size_t smax, int8_t *dst) { - if(cnv == (iconv_t)-1) return TSDB_CONV_GENERAL; - - size_t len = smax * 2; - buf_t buf; - buf_init(&buf, len+1); - if (!buf.ptr) return TSDB_CONV_OOM; - - size_t dmax = len + 1; - TSDB_CONV_CODE code = tsdb_iconv_conv(cnv, src, &smax, (unsigned char*)buf.ptr, &dmax); - if (code==TSDB_CONV_OK) { - code = tsdb_chars_to_tinyint(buf.ptr, len+1-dmax, dst); - } - - buf_clean(&buf); - - return code; -} - -TSDB_CONV_CODE tsdb_wchars_to_smallint(iconv_t cnv, const unsigned char *src, size_t smax, int16_t *dst) { - if(cnv == (iconv_t)-1) return TSDB_CONV_GENERAL; - - size_t len = smax * 2; - buf_t buf; - buf_init(&buf, len+1); - if (!buf.ptr) return TSDB_CONV_OOM; - - size_t dmax = len + 1; - TSDB_CONV_CODE code = tsdb_iconv_conv(cnv, src, &smax, (unsigned char*)buf.ptr, &dmax); - if (code==TSDB_CONV_OK) { - code = tsdb_chars_to_smallint(buf.ptr, len+1-dmax, dst); - } - - buf_clean(&buf); - - return code; -} - -TSDB_CONV_CODE tsdb_wchars_to_int(iconv_t cnv, const unsigned char *src, size_t smax, int32_t *dst) { - if(cnv == (iconv_t)-1) return TSDB_CONV_GENERAL; - - size_t len = smax * 2; - buf_t buf; - buf_init(&buf, len+1); - if (!buf.ptr) return TSDB_CONV_OOM; - - size_t dmax = len + 1; - TSDB_CONV_CODE code = tsdb_iconv_conv(cnv, src, &smax, (unsigned char*)buf.ptr, &dmax); - if (code==TSDB_CONV_OK) { - code = tsdb_chars_to_int(buf.ptr, len+1-dmax, dst); - } - - buf_clean(&buf); - - return code; -} - -TSDB_CONV_CODE tsdb_wchars_to_bigint(iconv_t cnv, const unsigned char *src, size_t smax, int64_t *dst) { - if(cnv == (iconv_t)-1) return TSDB_CONV_GENERAL; - - size_t len = smax * 2; - buf_t buf; - buf_init(&buf, len+1); - if (!buf.ptr) return TSDB_CONV_OOM; - - size_t dmax = len + 1; - TSDB_CONV_CODE code = tsdb_iconv_conv(cnv, src, &smax, (unsigned char*)buf.ptr, &dmax); - if (code==TSDB_CONV_OK) { - code = tsdb_chars_to_bigint(buf.ptr, len+1-dmax, dst); - } - - buf_clean(&buf); - - return code; -} - -TSDB_CONV_CODE tsdb_wchars_to_ts(iconv_t cnv, const unsigned char *src, size_t smax, int64_t *dst) { - return tsdb_wchars_to_bigint(cnv, src, smax, dst); -} - -TSDB_CONV_CODE tsdb_wchars_to_float(iconv_t cnv, const unsigned char *src, size_t smax, float *dst) { - if(cnv == (iconv_t)-1) return TSDB_CONV_GENERAL; - - size_t len = smax * 2; - buf_t buf; - buf_init(&buf, len+1); - if (!buf.ptr) return TSDB_CONV_OOM; - - size_t dmax = len + 1; - TSDB_CONV_CODE code = tsdb_iconv_conv(cnv, src, &smax, (unsigned char*)buf.ptr, &dmax); - if (code==TSDB_CONV_OK) { - code = tsdb_chars_to_float(buf.ptr, len+1-dmax, dst); - } - - buf_clean(&buf); - - return code; -} - -TSDB_CONV_CODE tsdb_wchars_to_double(iconv_t cnv, const unsigned char *src, size_t smax, double *dst) { - if(cnv == (iconv_t)-1) return TSDB_CONV_GENERAL; - - size_t len = smax * 2; - buf_t buf; - buf_init(&buf, len+1); - if (!buf.ptr) return TSDB_CONV_OOM; - - size_t dmax = len + 1; - TSDB_CONV_CODE code = tsdb_iconv_conv(cnv, src, &smax, (unsigned char*)buf.ptr, &dmax); - if (code==TSDB_CONV_OK) { - code = tsdb_chars_to_double(buf.ptr, len+1-dmax, dst); - } - - buf_clean(&buf); - - return code; -} - -TSDB_CONV_CODE tsdb_wchars_to_char(iconv_t cnv, const unsigned char *src, size_t smax, char *dst, size_t dmax) { - return tsdb_iconv_conv(cnv, src, &smax, (unsigned char*)dst, &dmax); -} - char* stack_buffer_alloc(stack_buffer_t *buffer, size_t bytes) { if (!buffer) return NULL; // align-by-size_of-size_t-bytes diff --git a/src/connector/odbc/src/todbc_conv.h b/src/connector/odbc/src/todbc_conv.h index 2075d2287000538c393e7a146113c832d1d77207..8dcaca0d02814d81d9e3f856c625b09872675456 100644 --- a/src/connector/odbc/src/todbc_conv.h +++ b/src/connector/odbc/src/todbc_conv.h @@ -70,10 +70,6 @@ TSDB_CONV_CODE tsdb_conv(tsdb_conv_t *cnv, stack_buffer_t *buffer, const char *s void tsdb_conv_free(tsdb_conv_t *cnv, const char *ptr, stack_buffer_t *buffer, const char *src); -TSDB_CONV_CODE tsdb_iconv_conv(iconv_t cnv, const unsigned char *src, size_t *slen, unsigned char *dst, size_t *dlen); - - - TSDB_CONV_CODE tsdb_int64_to_bit(int64_t src, int8_t *dst); TSDB_CONV_CODE tsdb_int64_to_tinyint(int64_t src, int8_t *dst); TSDB_CONV_CODE tsdb_int64_to_smallint(int64_t src, int16_t *dst); @@ -105,15 +101,5 @@ TSDB_CONV_CODE tsdb_chars_to_double(const char *src, size_t smax, double *dst); TSDB_CONV_CODE tsdb_chars_to_timestamp(const char *src, size_t smax, SQL_TIMESTAMP_STRUCT *dst); TSDB_CONV_CODE tsdb_chars_to_char(const char *src, size_t smax, char *dst, size_t dmax); -TSDB_CONV_CODE tsdb_wchars_to_bit(iconv_t cnv, const unsigned char *src, size_t smax, int8_t *dst); -TSDB_CONV_CODE tsdb_wchars_to_tinyint(iconv_t cnv, const unsigned char *src, size_t smax, int8_t *dst); -TSDB_CONV_CODE tsdb_wchars_to_smallint(iconv_t cnv, const unsigned char *src, size_t smax, int16_t *dst); -TSDB_CONV_CODE tsdb_wchars_to_int(iconv_t cnv, const unsigned char *src, size_t smax, int32_t *dst); -TSDB_CONV_CODE tsdb_wchars_to_bigint(iconv_t cnv, const unsigned char *src, size_t smax, int64_t *dst); -TSDB_CONV_CODE tsdb_wchars_to_ts(iconv_t cnv, const unsigned char *src, size_t smax, int64_t *dst); -TSDB_CONV_CODE tsdb_wchars_to_float(iconv_t cnv, const unsigned char *src, size_t smax, float *dst); -TSDB_CONV_CODE tsdb_wchars_to_double(iconv_t cnv, const unsigned char *src, size_t smax, double *dst); -TSDB_CONV_CODE tsdb_wchars_to_char(iconv_t cnv, const unsigned char *src, size_t smax, char *dst, size_t dmax); - #endif // _todbc_conv_h_ diff --git a/src/connector/odbc/src/todbc_util.c b/src/connector/odbc/src/todbc_util.c index 34008a83556caec3366b651d81f886a5279a936e..9c130b4f2f2e6d0f5d4a19e11ab323d42b800195 100644 --- a/src/connector/odbc/src/todbc_util.c +++ b/src/connector/odbc/src/todbc_util.c @@ -107,39 +107,6 @@ int is_valid_sql_sql_type(int type) { return 1; } -int string_conv(const char *fromcode, const char *tocode, - const unsigned char *src, size_t sbytes, - unsigned char *dst, size_t dbytes, - size_t *consumed, size_t *generated) -{ - if (consumed) *consumed = 0; - if (generated) *generated = 0; - - if (dbytes <= 0) return -1; - dst[0] = '\0'; - - iconv_t conv = iconv_open(tocode, fromcode); - if (!conv) return -1; - - size_t r = 0; - do { - char *s = (char*)src; - char *d = (char*)dst; - size_t sl = sbytes; - size_t dl = dbytes; - - r = iconv(conv, &s, &sl, &d, &dl); - *d = '\0'; - - if (consumed) *consumed = sbytes - sl; - if (generated) *generated = dbytes - dl; - - } while (0); - - iconv_close(conv); - return (int)r; -} - int utf8_chars(const char *src) { const char *fromcode = "UTF-8"; @@ -160,91 +127,3 @@ int utf8_chars(const char *src) return (int)chars; } -unsigned char* utf8_to_ucs4le(const char *utf8, size_t *chars) -{ - const char *tocode = "UCS-4LE"; - const char *fromcode = "UTF-8"; - - iconv_t conv = iconv_open(tocode, fromcode); - if (!conv) return NULL; - - unsigned char *ucs4le = NULL; - - do { - size_t slen = strlen(utf8); - size_t dlen = slen * 4; - - ucs4le = (unsigned char*)malloc(dlen+1); - if (!ucs4le) break; - - char *src = (char*)utf8; - char *dst = (char*)ucs4le; - size_t s = slen; - size_t d = dlen; - iconv(conv, &src, &s, &dst, &d); - dst[0] = '\0'; - - if (chars) *chars = (dlen - d) / 4; - } while (0); - - iconv_close(conv); - return ucs4le; -} - -char* ucs4le_to_utf8(const unsigned char *ucs4le, size_t slen, size_t *chars) -{ - const char *fromcode = "UCS-4LE"; - const char *tocode = "UTF-8"; - - iconv_t conv = iconv_open(tocode, fromcode); - if (!conv) return NULL; - - char *utf8 = NULL; - - do { - size_t dlen = slen; - - utf8 = (char*)malloc(dlen+1); - if (!utf8) break; - - char *dst = utf8; - char *src = (char*)ucs4le; - size_t s = slen; - size_t d = dlen; - iconv(conv, &src, &s, &dst, &d); - dst[0] = '\0'; - - if (chars) *chars = (slen - s) / 4; - } while (0); - - iconv_close(conv); - return utf8; -} - -SQLCHAR* wchars_to_chars(const SQLWCHAR *wchars, size_t chs, size_t *bytes) -{ - size_t dlen = chs * 4; - SQLCHAR *dst = (SQLCHAR*)malloc(dlen + 1); - if (!dst) return NULL; - - string_conv("UCS-2LE", "UTF-8", (const unsigned char*)wchars, chs * sizeof(*wchars), dst, dlen + 1, NULL, bytes); - - return dst; -} - -size_t wchars_to_chars2(const SQLWCHAR *src, size_t slen, SQLCHAR *dst, size_t dlen) -{ - size_t consumed=0, generated=0; - int n = string_conv("UCS-2LE", "UTF-8", (const unsigned char*)src, slen, dst, dlen, &consumed, &generated); - if (n) return (size_t)-1; - return generated; -} - -size_t chars_to_wchars2(const SQLCHAR *src, size_t slen, SQLWCHAR *dst, size_t dlen) -{ - size_t consumed=0, generated=0; - int n = string_conv("UTF-8", "UCS-2LE", (const unsigned char*)src, slen, (unsigned char*)dst, dlen, &consumed, &generated); - if (n) return (size_t)-1; - return generated; -} - diff --git a/src/connector/odbc/src/todbc_util.h b/src/connector/odbc/src/todbc_util.h index f9339f939633842cc441609656d099d28160384d..ead0d7348973409c85741cc4d676e40f6f140447 100644 --- a/src/connector/odbc/src/todbc_util.h +++ b/src/connector/odbc/src/todbc_util.h @@ -27,18 +27,7 @@ const char* sql_c_type(int type); int is_valid_sql_c_type(int type); int is_valid_sql_sql_type(int type); -int string_conv(const char *fromcode, const char *tocode, - const unsigned char *src, size_t sbytes, - unsigned char *dst, size_t dbytes, - size_t *consumed, size_t *generated); int utf8_chars(const char *src); -unsigned char* utf8_to_ucs4le(const char *utf8, size_t *chars); -char* ucs4le_to_utf8(const unsigned char *ucs4le, size_t slen, size_t *chars); -SQLCHAR* wchars_to_chars(const SQLWCHAR *wchars, size_t chs, size_t *bytes); - -size_t wchars_to_chars2(const SQLWCHAR *src, size_t slen, SQLCHAR *dst, size_t dlen); -size_t chars_to_wchars2(const SQLCHAR *src, size_t slen, SQLWCHAR *dst, size_t dlen); - #endif // _TODBC_UTIL_H_