unify calls and remove obsoletes
This commit is contained in:
parent
23f49cca86
commit
b1792612cc
|
@ -74,7 +74,6 @@ do {
|
||||||
if (Sqlstate) strncpy((char*)Sqlstate, (char*)obj->err.sql_state, n); \
|
if (Sqlstate) strncpy((char*)Sqlstate, (char*)obj->err.sql_state, n); \
|
||||||
if (NativeError) *NativeError = obj->err.err_no; \
|
if (NativeError) *NativeError = obj->err.err_no; \
|
||||||
snprintf((char*)MessageText, (size_t)BufferLength, "%s", obj->err.err_str); \
|
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); \
|
if (TextLength && obj->err.err_str) *TextLength = (SQLSMALLINT)utf8_chars(obj->err.err_str); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
@ -264,10 +263,6 @@ struct sql_s {
|
||||||
uint64_t refcount;
|
uint64_t refcount;
|
||||||
conn_t *conn;
|
conn_t *conn;
|
||||||
|
|
||||||
iconv_t w2c; // wchar* -> char*
|
|
||||||
iconv_t u2c; // unicode -> char*
|
|
||||||
iconv_t u2w; // unicode -> wchar*
|
|
||||||
|
|
||||||
TAOS_STMT *stmt;
|
TAOS_STMT *stmt;
|
||||||
param_bind_t *params;
|
param_bind_t *params;
|
||||||
int n_params;
|
int n_params;
|
||||||
|
@ -297,14 +292,6 @@ static pthread_once_t init_once = PTHREAD_ONCE_INIT;
|
||||||
static void init_routine(void);
|
static void init_routine(void);
|
||||||
|
|
||||||
static size_t do_field_display_size(TAOS_FIELD *field);
|
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) {
|
static tsdb_conv_t* tsdb_conn_client_to_server(conn_t *conn) {
|
||||||
if (!conn->client_to_server) {
|
if (!conn->client_to_server) {
|
||||||
|
@ -409,22 +396,6 @@ do {
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} 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)
|
static SQLRETURN doSQLAllocEnv(SQLHENV *EnvironmentHandle)
|
||||||
{
|
{
|
||||||
pthread_once(&init_once, init_routine);
|
pthread_once(&init_once, init_routine);
|
||||||
|
@ -666,10 +637,6 @@ static SQLRETURN doSQLAllocStmt(SQLHDBC ConnectionHandle,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
sql->w2c = (iconv_t)-1;
|
|
||||||
sql->u2c = (iconv_t)-1;
|
|
||||||
sql->u2w = (iconv_t)-1;
|
|
||||||
|
|
||||||
sql->conn = conn;
|
sql->conn = conn;
|
||||||
DASSERT(INC_REF(sql)>0);
|
DASSERT(INC_REF(sql)>0);
|
||||||
|
|
||||||
|
@ -767,19 +734,6 @@ static SQLRETURN doSQLFreeStmt(SQLHSTMT StatementHandle,
|
||||||
|
|
||||||
FREE_ERROR(sql);
|
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);
|
free(sql);
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
return SQL_SUCCESS;
|
||||||
|
@ -793,11 +747,22 @@ SQLRETURN SQL_API SQLFreeStmt(SQLHSTMT StatementHandle,
|
||||||
return r;
|
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,
|
static SQLRETURN doSQLExecDirect(SQLHSTMT StatementHandle,
|
||||||
SQLCHAR *StatementText, SQLINTEGER TextLength)
|
SQLCHAR *StatementText, SQLINTEGER TextLength)
|
||||||
{
|
{
|
||||||
stack_buffer_t buffer; buffer.next = 0;
|
|
||||||
|
|
||||||
sql_t *sql = (sql_t*)StatementHandle;
|
sql_t *sql = (sql_t*)StatementHandle;
|
||||||
if (!sql) return SQL_INVALID_HANDLE;
|
if (!sql) return SQL_INVALID_HANDLE;
|
||||||
|
|
||||||
|
@ -825,20 +790,14 @@ static SQLRETURN doSQLExecDirect(SQLHSTMT StatementHandle,
|
||||||
}
|
}
|
||||||
sql->n_params = 0;
|
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);
|
tsdb_conv_t *client_to_server = tsdb_conn_client_to_server(conn);
|
||||||
const char *stxt = NULL;
|
const char *stxt = NULL;
|
||||||
|
|
||||||
SQLRETURN r = SQL_ERROR;
|
|
||||||
do {
|
do {
|
||||||
tsdb_conv(client_to_server, &buffer, (const char*)StatementText, (size_t)TextLength, &stxt, NULL);
|
TSDB_CONV_CODE code = tsdb_conv(client_to_server, &buffer, (const char*)StatementText, (size_t)TextLength, &stxt, NULL);
|
||||||
if (!stxt) {
|
r = do_exec_direct(sql, code, 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");
|
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
tsdb_conv_free(client_to_server, stxt, &buffer, (const char*)StatementText);
|
tsdb_conv_free(client_to_server, stxt, &buffer, (const char*)StatementText);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
|
@ -860,6 +819,8 @@ static SQLRETURN doSQLExecDirectW(SQLHSTMT hstmt, SQLWCHAR *szSqlStr, SQLINTEGER
|
||||||
CHK_CONN(sql);
|
CHK_CONN(sql);
|
||||||
CHK_CONN_TAOS(sql);
|
CHK_CONN_TAOS(sql);
|
||||||
|
|
||||||
|
conn_t *conn = sql->conn;
|
||||||
|
|
||||||
if (!szSqlStr) {
|
if (!szSqlStr) {
|
||||||
SET_ERROR(sql, "HY009", TSDB_CODE_ODBC_BAD_ARG, "szSqlStr [%p] not allowed", szSqlStr);
|
SET_ERROR(sql, "HY009", TSDB_CODE_ODBC_BAD_ARG, "szSqlStr [%p] not allowed", szSqlStr);
|
||||||
return SQL_ERROR;
|
return SQL_ERROR;
|
||||||
|
@ -869,10 +830,17 @@ static SQLRETURN doSQLExecDirectW(SQLHSTMT hstmt, SQLWCHAR *szSqlStr, SQLINTEGER
|
||||||
return SQL_ERROR;
|
return SQL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t bytes = 0;
|
SQLRETURN r = SQL_SUCCESS;
|
||||||
SQLCHAR *utf8 = wchars_to_chars(szSqlStr, (size_t)cbSqlStr, &bytes);
|
stack_buffer_t buffer; buffer.next = 0;
|
||||||
SQLRETURN r = SQLExecDirect(hstmt, utf8, (SQLINTEGER)bytes);
|
tsdb_conv_t *utf16_to_server = tsdb_conn_utf16_to_server(conn);
|
||||||
if (utf8) free(utf8);
|
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;
|
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));
|
CHK_CONV(1, tsdb_conv_chars_to_bit(client_to_utf8, &buffer, (const char *)paramValue, slen, &bind->u.b));
|
||||||
} break;
|
} break;
|
||||||
case SQL_C_WCHAR: {
|
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;
|
} break;
|
||||||
case SQL_C_USHORT:
|
case SQL_C_USHORT:
|
||||||
case SQL_C_ULONG:
|
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));
|
// CHK_CONV(1, tsdb_chars_to_tinyint((const char *)paramValue, (size_t)*soi, &bind->u.v1));
|
||||||
} break;
|
} break;
|
||||||
case SQL_C_WCHAR: {
|
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;
|
} break;
|
||||||
case SQL_C_USHORT:
|
case SQL_C_USHORT:
|
||||||
case SQL_C_ULONG:
|
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));
|
// CHK_CONV(1, tsdb_chars_to_smallint((const char*)paramValue, (size_t)*soi, &bind->u.v2));
|
||||||
} break;
|
} break;
|
||||||
case SQL_C_WCHAR: {
|
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;
|
} break;
|
||||||
case SQL_C_USHORT:
|
case SQL_C_USHORT:
|
||||||
case SQL_C_ULONG:
|
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));
|
// CHK_CONV(1, tsdb_chars_to_int((const char*)paramValue, (size_t)*soi, &bind->u.v4));
|
||||||
} break;
|
} break;
|
||||||
case SQL_C_WCHAR: {
|
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;
|
} break;
|
||||||
case SQL_C_USHORT:
|
case SQL_C_USHORT:
|
||||||
case SQL_C_ULONG:
|
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));
|
// CHK_CONV(1, tsdb_chars_to_bigint((const char*)paramValue, (size_t)*soi, &bind->u.v8));
|
||||||
} break;
|
} break;
|
||||||
case SQL_C_WCHAR: {
|
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;
|
} break;
|
||||||
case SQL_C_USHORT:
|
case SQL_C_USHORT:
|
||||||
case SQL_C_ULONG:
|
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;
|
size_t slen = (size_t)*soi;
|
||||||
if (slen==SQL_NTS) slen = strlen((const char*)paramValue);
|
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_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;
|
} break;
|
||||||
case SQL_C_WCHAR: {
|
case SQL_C_WCHAR: {
|
||||||
stack_buffer_t buffer; buffer.next = 0;
|
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;
|
size_t slen = (size_t)*soi;
|
||||||
DASSERT(slen != SQL_NTS);
|
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_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;
|
} break;
|
||||||
case SQL_C_USHORT:
|
case SQL_C_USHORT:
|
||||||
case SQL_C_ULONG:
|
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;
|
size_t slen = (size_t)*soi;
|
||||||
DASSERT(slen != SQL_NTS);
|
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_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;
|
} break;
|
||||||
case SQL_C_USHORT:
|
case SQL_C_USHORT:
|
||||||
case SQL_C_ULONG:
|
case SQL_C_ULONG:
|
||||||
|
@ -2817,11 +2802,6 @@ SQLRETURN SQL_API SQLSetStmtAttr(SQLHSTMT StatementHandle,
|
||||||
|
|
||||||
|
|
||||||
static void init_routine(void) {
|
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();
|
taos_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,35 +23,6 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
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) {
|
const char* tsdb_conv_code_str(TSDB_CONV_CODE code) {
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case TSDB_CONV_OK: return "TSDB_CONV_OK";
|
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
|
// src: int
|
||||||
TSDB_CONV_CODE tsdb_int64_to_bit(int64_t src, int8_t *dst) {
|
TSDB_CONV_CODE tsdb_int64_to_bit(int64_t src, int8_t *dst) {
|
||||||
*dst = (int8_t)src;
|
*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) {
|
char* stack_buffer_alloc(stack_buffer_t *buffer, size_t bytes) {
|
||||||
if (!buffer) return NULL;
|
if (!buffer) return NULL;
|
||||||
// align-by-size_of-size_t-bytes
|
// align-by-size_of-size_t-bytes
|
||||||
|
|
|
@ -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);
|
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_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_tinyint(int64_t src, int8_t *dst);
|
||||||
TSDB_CONV_CODE tsdb_int64_to_smallint(int64_t src, int16_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_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_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_
|
#endif // _todbc_conv_h_
|
||||||
|
|
||||||
|
|
|
@ -107,39 +107,6 @@ int is_valid_sql_sql_type(int type) {
|
||||||
return 1;
|
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)
|
int utf8_chars(const char *src)
|
||||||
{
|
{
|
||||||
const char *fromcode = "UTF-8";
|
const char *fromcode = "UTF-8";
|
||||||
|
@ -160,91 +127,3 @@ int utf8_chars(const char *src)
|
||||||
return (int)chars;
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -27,18 +27,7 @@ const char* sql_c_type(int type);
|
||||||
int is_valid_sql_c_type(int type);
|
int is_valid_sql_c_type(int type);
|
||||||
int is_valid_sql_sql_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);
|
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_
|
#endif // _TODBC_UTIL_H_
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue