From 1eec11e9872afdbf1a12bcc33e395d7e454de341 Mon Sep 17 00:00:00 2001 From: freemine Date: Tue, 27 Oct 2020 21:41:16 +0800 Subject: [PATCH] first version of runnable win odbc driver --- src/connector/odbc/CMakeLists.txt | 8 +++++ src/connector/odbc/src/CMakeLists.txt | 24 +++++++++----- src/connector/odbc/src/todbc.c | 10 +++--- src/connector/odbc/src/todbc.def | 28 +++++++++++++++++ src/connector/odbc/src/todbc.rc.in | 31 +++++++++++++++++++ src/connector/odbc/src/todbc.rsp | 5 +++ src/connector/odbc/src/todbc_conv.c | 3 -- src/connector/odbc/src/todbc_conv.h | 7 ++--- .../{todbc_flex_workaround.h => todbc_flex.h} | 16 +++------- src/connector/odbc/src/todbc_log.h | 8 +---- src/connector/odbc/src/todbc_scanner.l | 6 ++-- src/connector/odbc/src/todbc_util.c | 7 ++--- src/connector/odbc/src/todbc_util.h | 7 ++--- src/connector/odbc/tests/CMakeLists.txt | 2 +- src/connector/odbc/tests/main.c | 22 +++++++------ src/os/inc/osWindows.h | 1 + 16 files changed, 123 insertions(+), 62 deletions(-) create mode 100644 src/connector/odbc/src/todbc.def create mode 100644 src/connector/odbc/src/todbc.rc.in create mode 100644 src/connector/odbc/src/todbc.rsp rename src/connector/odbc/src/{todbc_flex_workaround.h => todbc_flex.h} (71%) diff --git a/src/connector/odbc/CMakeLists.txt b/src/connector/odbc/CMakeLists.txt index 322f9c12cc..3d6564c230 100644 --- a/src/connector/odbc/CMakeLists.txt +++ b/src/connector/odbc/CMakeLists.txt @@ -29,6 +29,14 @@ IF (TD_LINUX_64) ENDIF () IF (TD_WINDOWS_64) + find_package(ODBC) + if (NOT ODBC_FOUND) + message(FATAL_ERROR "you need to install ODBC first") + else () + message(STATUS "ODBC_INCLUDE_DIRS: ${ODBC_INCLUDE_DIRS}") + message(STATUS "ODBC_LIBRARIES: ${ODBC_LIBRARIES}") + message(STATUS "ODBC_CONFIG: ${ODBC_CONFIG}") + endif () find_package(FLEX) if(NOT FLEX_FOUND) message(FATAL_ERROR "you need to install flex first") diff --git a/src/connector/odbc/src/CMakeLists.txt b/src/connector/odbc/src/CMakeLists.txt index 19ee23b19f..7249e2d1de 100644 --- a/src/connector/odbc/src/CMakeLists.txt +++ b/src/connector/odbc/src/CMakeLists.txt @@ -16,8 +16,7 @@ IF (TD_LINUX_64) SET_TARGET_PROPERTIES(todbc PROPERTIES CLEAN_DIRECT_OUTPUT 1) SET_TARGET_PROPERTIES(todbc PROPERTIES VERSION ${TD_VER_NUMBER} SOVERSION 1) TARGET_LINK_LIBRARIES(todbc taos) - target_include_directories(todbc PUBLIC - .) + target_include_directories(todbc PUBLIC .) install(CODE "execute_process(COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/install.sh ${CMAKE_BINARY_DIR})") ENDIF () @@ -32,11 +31,20 @@ IF (TD_WINDOWS_64) ) AUX_SOURCE_DIRECTORY(. SRC) - # generate dynamic library (*.so) - ADD_LIBRARY(todbc SHARED ${SRC} ${todbc_flex_scanner_src}) - SET_TARGET_PROPERTIES(todbc PROPERTIES CLEAN_DIRECT_OUTPUT 1) - SET_TARGET_PROPERTIES(todbc PROPERTIES VERSION ${TD_VER_NUMBER} SOVERSION 1) + # generate dynamic library (*.dll) + ADD_LIBRARY(todbc SHARED + ${SRC} + ${todbc_flex_scanner_src} + ${CMAKE_CURRENT_BINARY_DIR}/todbc.rc + todbc.def) TARGET_LINK_LIBRARIES(todbc taos_static) - target_include_directories(todbc PUBLIC - .) + target_include_directories(todbc PUBLIC .) + target_compile_definitions(todbc PRIVATE "todbc_EXPORT") + + CONFIGURE_FILE("todbc.rc.in" + "${CMAKE_CURRENT_BINARY_DIR}/todbc.rc") + SET_TARGET_PROPERTIES(todbc PROPERTIES LINK_FLAGS + /DEF:todbc.def) + SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /GL") + SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /GL") ENDIF () diff --git a/src/connector/odbc/src/todbc.c b/src/connector/odbc/src/todbc.c index 9bde4fd2ec..2805a75ff0 100644 --- a/src/connector/odbc/src/todbc.c +++ b/src/connector/odbc/src/todbc.c @@ -17,19 +17,17 @@ #define _XOPEN_SOURCE #define _DEFAULT_SOURCE +#include "todbc_log.h" +#include "todbc_flex.h" + #include "taos.h" -#include "os.h" #include "taoserror.h" #include "todbc_util.h" #include "todbc_conv.h" -#include #include -#include - - #define GET_REF(obj) atomic_load_64(&obj->refcount) #define INC_REF(obj) atomic_add_fetch_64(&obj->refcount, 1) #define DEC_REF(obj) atomic_sub_fetch_64(&obj->refcount, 1) @@ -1919,7 +1917,7 @@ static SQLRETURN doSQLGetDiagField(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT *StringLength) { // if this function is not exported, isql will never call SQLGetDiagRec - return SQL_ERROR; + return SQL_SUCCESS; } SQLRETURN SQL_API SQLGetDiagField(SQLSMALLINT HandleType, SQLHANDLE Handle, diff --git a/src/connector/odbc/src/todbc.def b/src/connector/odbc/src/todbc.def new file mode 100644 index 0000000000..3d34eef86b --- /dev/null +++ b/src/connector/odbc/src/todbc.def @@ -0,0 +1,28 @@ +EXPORTS +SQLAllocEnv +SQLFreeEnv +SQLAllocConnect +SQLFreeConnect +SQLConnect +SQLDisconnect +SQLAllocStmt +SQLAllocHandle +SQLFreeStmt +SQLExecDirect +SQLExecDirectW +SQLNumResultCols +SQLRowCount +SQLColAttribute +SQLGetData +SQLFetch +SQLPrepare +SQLExecute +SQLGetDiagField +SQLGetDiagRec +SQLBindParameter +SQLDriverConnect +SQLSetConnectAttr +SQLDescribeCol +SQLNumParams +SQLSetStmtAttr + diff --git a/src/connector/odbc/src/todbc.rc.in b/src/connector/odbc/src/todbc.rc.in new file mode 100644 index 0000000000..cf0b211454 --- /dev/null +++ b/src/connector/odbc/src/todbc.rc.in @@ -0,0 +1,31 @@ +1 VERSIONINFO + FILEVERSION ${TD_VER_NUMBER} + PRODUCTVERSION ${TD_VER_NUMBER} + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x0L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "FileDescription", "ODBC Driver for TDengine" + VALUE "FileVersion", "${TD_VER_NUMBER}" + VALUE "InternalName", "todbc.dll(${TD_VER_CPUTYPE})" + VALUE "LegalCopyright", "Copyright (C) 2020 TAOS Data" + VALUE "OriginalFilename", "" + VALUE "ProductName", "todbc.dll(${TD_VER_CPUTYPE})" + VALUE "ProductVersion", "${TD_VER_NUMBER}" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END \ No newline at end of file diff --git a/src/connector/odbc/src/todbc.rsp b/src/connector/odbc/src/todbc.rsp new file mode 100644 index 0000000000..f5e5115658 --- /dev/null +++ b/src/connector/odbc/src/todbc.rsp @@ -0,0 +1,5 @@ +INSTALLDRIVER "TAOS ODBC|Driver=todbc.dll|FileUsage=0|ConnectFunctions=YYN" + + + + diff --git a/src/connector/odbc/src/todbc_conv.c b/src/connector/odbc/src/todbc_conv.c index c6ce6a29f6..d9ed708a5d 100644 --- a/src/connector/odbc/src/todbc_conv.c +++ b/src/connector/odbc/src/todbc_conv.c @@ -14,9 +14,6 @@ */ #include "todbc_conv.h" -#include "todbc_util.h" - -#include "os.h" #include #include diff --git a/src/connector/odbc/src/todbc_conv.h b/src/connector/odbc/src/todbc_conv.h index 9753620ee2..21c74b5474 100644 --- a/src/connector/odbc/src/todbc_conv.h +++ b/src/connector/odbc/src/todbc_conv.h @@ -16,10 +16,9 @@ #ifndef _todbc_conv_h_ #define _todbc_conv_h_ -#include "todbc_flex_workaround.h" -#include - -#include "iconv.h" +#include "os.h" +#include +#include typedef enum { diff --git a/src/connector/odbc/src/todbc_flex_workaround.h b/src/connector/odbc/src/todbc_flex.h similarity index 71% rename from src/connector/odbc/src/todbc_flex_workaround.h rename to src/connector/odbc/src/todbc_flex.h index d6c79cf19a..5ee5b53676 100644 --- a/src/connector/odbc/src/todbc_flex_workaround.h +++ b/src/connector/odbc/src/todbc_flex.h @@ -13,18 +13,10 @@ * along with this program. If not, see . */ -#ifndef _todbc_flex_workaround_h_ -#define _todbc_flex_workaround_h_ +#ifndef _TODBC_FLEX_H_ +#define _TODBC_FLEX_H_ -#ifdef _MSC_VER -#include -#include -#endif -#ifndef INT8_MIN -#include -#endif -#include -#include +int todbc_parse_conn_string(const char *conn, char **dsn, char **uid, char **pwd, char **host); -#endif // _todbc_flex_workaround_h_ +#endif // _TODBC_FLEX_H_ diff --git a/src/connector/odbc/src/todbc_log.h b/src/connector/odbc/src/todbc_log.h index 4f5b008d05..391a690ccc 100644 --- a/src/connector/odbc/src/todbc_log.h +++ b/src/connector/odbc/src/todbc_log.h @@ -16,13 +16,7 @@ #ifndef _todbc_log_h_ #define _todbc_log_h_ -#ifdef _MSC_VER -#include "msvcLibgen.h" -#else -#include -#endif -#include -#include +#include "os.h" #define D(fmt, ...) \ fprintf(stderr, \ diff --git a/src/connector/odbc/src/todbc_scanner.l b/src/connector/odbc/src/todbc_scanner.l index 2f8fd42950..25a46e03cf 100644 --- a/src/connector/odbc/src/todbc_scanner.l +++ b/src/connector/odbc/src/todbc_scanner.l @@ -1,6 +1,5 @@ %{ -#include "todbc_util.h" - +#include "todbc_flex.h" #include #ifdef _MSC_VER @@ -105,8 +104,7 @@ do { \ [{] { CHG_STATE(BRACE1); } .|\n { return -1; } -[[:space:]]+ { } -[^{}\n[:space:]]+ { set_val(); CHG_STATE(BRACE2); } +[^{}\n]+ { set_val(); CHG_STATE(BRACE2); } .|\n { return -1; } [[:space:]]+ { } diff --git a/src/connector/odbc/src/todbc_util.c b/src/connector/odbc/src/todbc_util.c index 35f02bedd5..34008a8355 100644 --- a/src/connector/odbc/src/todbc_util.c +++ b/src/connector/odbc/src/todbc_util.c @@ -14,11 +14,10 @@ */ #include "todbc_util.h" +#include "todbc_log.h" +#include +#include -#include "iconv.h" - -#include -#include const char* sql_sql_type(int type) { switch (type) { diff --git a/src/connector/odbc/src/todbc_util.h b/src/connector/odbc/src/todbc_util.h index b987c633a2..f9339f9396 100644 --- a/src/connector/odbc/src/todbc_util.h +++ b/src/connector/odbc/src/todbc_util.h @@ -16,9 +16,10 @@ #ifndef _TODBC_UTIL_H_ #define _TODBC_UTIL_H_ -#include "todbc_flex_workaround.h" -#include "todbc_log.h" +#include "os.h" +#include +#include const char* sql_sql_type(int type); const char* sql_c_type(int type); @@ -26,8 +27,6 @@ const char* sql_c_type(int type); int is_valid_sql_c_type(int type); int is_valid_sql_sql_type(int type); -int todbc_parse_conn_string(const char *conn, char **dsn, char **uid, char **pwd, char **host); - int string_conv(const char *fromcode, const char *tocode, const unsigned char *src, size_t sbytes, unsigned char *dst, size_t dbytes, diff --git a/src/connector/odbc/tests/CMakeLists.txt b/src/connector/odbc/tests/CMakeLists.txt index d998527dc8..2edf45a852 100644 --- a/src/connector/odbc/tests/CMakeLists.txt +++ b/src/connector/odbc/tests/CMakeLists.txt @@ -9,5 +9,5 @@ ENDIF () IF (TD_WINDOWS_64) AUX_SOURCE_DIRECTORY(. SRC) ADD_EXECUTABLE(tcodbc main.c) - # TARGET_LINK_LIBRARIES(tcodbc odbc) + TARGET_LINK_LIBRARIES(tcodbc odbc32 os) ENDIF () diff --git a/src/connector/odbc/tests/main.c b/src/connector/odbc/tests/main.c index 2a0dca7a4d..c2d0869e02 100644 --- a/src/connector/odbc/tests/main.c +++ b/src/connector/odbc/tests/main.c @@ -1,17 +1,16 @@ +#include "../src/todbc_log.h" + +#ifdef _MSC_VER +#include +#include #include "os.h" +#endif #include #include #include #include -#include "os.h" -#include "../src/todbc_log.h" - -// static const char *dsn = "TAOS_DSN"; -// static const char *uid = "root"; -// static const char *pwd = "taosdata"; - #define CHK_TEST(statement) \ do { \ D("testing: %s", #statement); \ @@ -425,7 +424,7 @@ int test_sqls_in_stmt(SQLHENV env, SQLHDBC conn, SQLHSTMT stmt, const char *sqls ssize_t n = 0; #ifdef _MSC_VER - n = taosGetlineImp(&line, &len, f); + n = taosGetline(&line, &len, f); #else n = getline(&line, &len, f); #endif @@ -503,7 +502,12 @@ int main(int argc, char *argv[]) { const char *connstr = (argc>4) ? argv[4] : NULL; const char *sqls = (argc>5) ? argv[5] : NULL; - if (1) { + dsn = NULL; + uid = NULL; + pwd = NULL; + connstr = argv[1]; + sqls = argv[2]; + if (0) { CHK_TEST(test_env()); CHK_TEST(test1(dsn, uid, pwd)); diff --git a/src/os/inc/osWindows.h b/src/os/inc/osWindows.h index dc1da35037..518719c3f0 100644 --- a/src/os/inc/osWindows.h +++ b/src/os/inc/osWindows.h @@ -43,6 +43,7 @@ #include "msvcProcess.h" #include "msvcDirect.h" #include "msvcFcntl.h" +#include "msvcLibgen.h" #include "msvcStdio.h" #include "sys/msvcStat.h" #include "sys/msvcTypes.h" -- GitLab