提交 8b146842 编写于 作者: F freemine

Merge branch 'odbc-win' into odbc

...@@ -17,6 +17,8 @@ IF (TD_LINUX_64) ...@@ -17,6 +17,8 @@ IF (TD_LINUX_64)
if(NOT FLEX_FOUND) if(NOT FLEX_FOUND)
message(FATAL_ERROR "you need to install flex first") message(FATAL_ERROR "you need to install flex first")
else () else ()
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wconversion")
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Wconversion")
ADD_SUBDIRECTORY(src) ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(tests) ADD_SUBDIRECTORY(tests)
endif() endif()
...@@ -26,3 +28,20 @@ IF (TD_LINUX_64) ...@@ -26,3 +28,20 @@ IF (TD_LINUX_64)
ENDIF () ENDIF ()
ENDIF () 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")
else ()
ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(tests)
endif()
ENDIF ()
...@@ -16,9 +16,35 @@ IF (TD_LINUX_64) ...@@ -16,9 +16,35 @@ IF (TD_LINUX_64)
SET_TARGET_PROPERTIES(todbc PROPERTIES CLEAN_DIRECT_OUTPUT 1) SET_TARGET_PROPERTIES(todbc PROPERTIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(todbc PROPERTIES VERSION ${TD_VER_NUMBER} SOVERSION 1) SET_TARGET_PROPERTIES(todbc PROPERTIES VERSION ${TD_VER_NUMBER} SOVERSION 1)
TARGET_LINK_LIBRARIES(todbc taos) 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})") install(CODE "execute_process(COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/install.sh ${CMAKE_BINARY_DIR})")
ENDIF () ENDIF ()
IF (TD_WINDOWS_64)
FLEX_TARGET(todbcFlexScanner
todbc_scanner.l
${CMAKE_CURRENT_BINARY_DIR}/todbc_scanner.c
)
set(todbc_flex_scanner_src
${FLEX_todbcFlexScanner_OUTPUTS}
)
AUX_SOURCE_DIRECTORY(. SRC)
# 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_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 ()
此差异已折叠。
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
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
INSTALLDRIVER "TAOS ODBC|Driver=todbc.dll|FileUsage=0|ConnectFunctions=YYN"
...@@ -15,8 +15,6 @@ ...@@ -15,8 +15,6 @@
#include "todbc_conv.h" #include "todbc_conv.h"
#include "todbc_util.h"
#include <errno.h> #include <errno.h>
#include <limits.h> #include <limits.h>
#include <stdio.h> #include <stdio.h>
...@@ -74,7 +72,7 @@ TSDB_CONV_CODE tsdb_iconv_conv(iconv_t cnv, const unsigned char *src, size_t *sl ...@@ -74,7 +72,7 @@ TSDB_CONV_CODE tsdb_iconv_conv(iconv_t cnv, const unsigned char *src, size_t *sl
size_t sl = *slen; size_t sl = *slen;
size_t dl = *dlen; size_t dl = *dlen;
int n = iconv(cnv, &s, &sl, &d, &dl); size_t n = iconv(cnv, &s, &sl, &d, &dl);
int e = errno; int e = errno;
if (dl) *d = '\0'; // what if all consumed? if (dl) *d = '\0'; // what if all consumed?
......
...@@ -16,11 +16,9 @@ ...@@ -16,11 +16,9 @@
#ifndef _todbc_conv_h_ #ifndef _todbc_conv_h_
#define _todbc_conv_h_ #define _todbc_conv_h_
#include <inttypes.h> #include "os.h"
#include <sqltypes.h> #include <iconv.h>
#include <stddef.h> #include <sql.h>
#include "iconv.h"
typedef enum { typedef enum {
......
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _TODBC_FLEX_H_
#define _TODBC_FLEX_H_
int todbc_parse_conn_string(const char *conn, char **dsn, char **uid, char **pwd, char **host);
#endif // _TODBC_FLEX_H_
...@@ -16,9 +16,7 @@ ...@@ -16,9 +16,7 @@
#ifndef _todbc_log_h_ #ifndef _todbc_log_h_
#define _todbc_log_h_ #define _todbc_log_h_
#include <libgen.h> #include "os.h"
#include <stdio.h>
#include <stdlib.h>
#define D(fmt, ...) \ #define D(fmt, ...) \
fprintf(stderr, \ fprintf(stderr, \
......
%{ %{
#include "todbc_util.h" #include "todbc_flex.h"
#include <stdio.h> #include <stdio.h>
#ifdef _MSC_VER
#define strncasecmp _strnicmp
#define strcasecmp _stricmp
#endif
typedef struct params_s params_t; typedef struct params_s params_t;
struct params_s { struct params_s {
char *key; char *key;
...@@ -68,6 +72,8 @@ do { \ ...@@ -68,6 +72,8 @@ do { \
%option prefix="todbc_yy" %option prefix="todbc_yy"
%option extra-type="struct params_s *" %option extra-type="struct params_s *"
%option nounistd
%option never-interactive
%option reentrant %option reentrant
%option noyywrap %option noyywrap
%option noinput nounput %option noinput nounput
...@@ -98,8 +104,7 @@ do { \ ...@@ -98,8 +104,7 @@ do { \
<EQ>[{] { CHG_STATE(BRACE1); } <EQ>[{] { CHG_STATE(BRACE1); }
<EQ>.|\n { return -1; } <EQ>.|\n { return -1; }
<BRACE1>[[:space:]]+ { } <BRACE1>[^{}\n]+ { set_val(); CHG_STATE(BRACE2); }
<BRACE1>[^{}\n[:space:]]+ { set_val(); CHG_STATE(BRACE2); }
<BRACE1>.|\n { return -1; } <BRACE1>.|\n { return -1; }
<BRACE2>[[:space:]]+ { } <BRACE2>[[:space:]]+ { }
......
...@@ -14,14 +14,10 @@ ...@@ -14,14 +14,10 @@
*/ */
#include "todbc_util.h" #include "todbc_util.h"
#include "todbc_log.h"
#include "iconv.h" #include <iconv.h>
#include <sql.h>
#include <sqltypes.h>
#include <sqlext.h> #include <sqlext.h>
#include <stdlib.h>
#include <string.h>
const char* sql_sql_type(int type) { const char* sql_sql_type(int type) {
switch (type) { switch (type) {
...@@ -125,7 +121,7 @@ int string_conv(const char *fromcode, const char *tocode, ...@@ -125,7 +121,7 @@ int string_conv(const char *fromcode, const char *tocode,
iconv_t conv = iconv_open(tocode, fromcode); iconv_t conv = iconv_open(tocode, fromcode);
if (!conv) return -1; if (!conv) return -1;
int r = 0; size_t r = 0;
do { do {
char *s = (char*)src; char *s = (char*)src;
char *d = (char*)dst; char *d = (char*)dst;
...@@ -141,7 +137,7 @@ int string_conv(const char *fromcode, const char *tocode, ...@@ -141,7 +137,7 @@ int string_conv(const char *fromcode, const char *tocode,
} while (0); } while (0);
iconv_close(conv); iconv_close(conv);
return r; return (int)r;
} }
int utf8_chars(const char *src) int utf8_chars(const char *src)
...@@ -161,7 +157,7 @@ int utf8_chars(const char *src) ...@@ -161,7 +157,7 @@ int utf8_chars(const char *src)
size_t chars = (sizeof(buf) - dlen) / 2; size_t chars = (sizeof(buf) - dlen) / 2;
iconv_close(conv); iconv_close(conv);
return chars; return (int)chars;
} }
unsigned char* utf8_to_ucs4le(const char *utf8, size_t *chars) unsigned char* utf8_to_ucs4le(const char *utf8, size_t *chars)
...@@ -240,7 +236,7 @@ size_t wchars_to_chars2(const SQLWCHAR *src, size_t slen, SQLCHAR *dst, size_t d ...@@ -240,7 +236,7 @@ size_t wchars_to_chars2(const SQLWCHAR *src, size_t slen, SQLCHAR *dst, size_t d
{ {
size_t consumed=0, generated=0; size_t consumed=0, generated=0;
int n = string_conv("UCS-2LE", "UTF-8", (const unsigned char*)src, slen, dst, dlen, &consumed, &generated); int n = string_conv("UCS-2LE", "UTF-8", (const unsigned char*)src, slen, dst, dlen, &consumed, &generated);
if (n) return -1; if (n) return (size_t)-1;
return generated; return generated;
} }
...@@ -248,7 +244,7 @@ size_t chars_to_wchars2(const SQLCHAR *src, size_t slen, SQLWCHAR *dst, size_t d ...@@ -248,7 +244,7 @@ size_t chars_to_wchars2(const SQLCHAR *src, size_t slen, SQLWCHAR *dst, size_t d
{ {
size_t consumed=0, generated=0; 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); int n = string_conv("UTF-8", "UCS-2LE", (const unsigned char*)src, slen, (unsigned char*)dst, dlen, &consumed, &generated);
if (n) return -1; if (n) return (size_t)-1;
return generated; return generated;
} }
...@@ -16,10 +16,10 @@ ...@@ -16,10 +16,10 @@
#ifndef _TODBC_UTIL_H_ #ifndef _TODBC_UTIL_H_
#define _TODBC_UTIL_H_ #define _TODBC_UTIL_H_
#include "todbc_log.h" #include "os.h"
#include <stddef.h>
#include <sql.h> #include <sql.h>
#include <sqltypes.h>
const char* sql_sql_type(int type); const char* sql_sql_type(int type);
const char* sql_c_type(int type); const char* sql_c_type(int type);
...@@ -27,8 +27,6 @@ const char* sql_c_type(int type); ...@@ -27,8 +27,6 @@ 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 todbc_parse_conn_string(const char *conn, char **dsn, char **uid, char **pwd, char **host);
int string_conv(const char *fromcode, const char *tocode, int string_conv(const char *fromcode, const char *tocode,
const unsigned char *src, size_t sbytes, const unsigned char *src, size_t sbytes,
unsigned char *dst, size_t dbytes, unsigned char *dst, size_t dbytes,
......
...@@ -5,3 +5,9 @@ IF (TD_LINUX) ...@@ -5,3 +5,9 @@ IF (TD_LINUX)
ADD_EXECUTABLE(tcodbc main.c) ADD_EXECUTABLE(tcodbc main.c)
TARGET_LINK_LIBRARIES(tcodbc odbc) TARGET_LINK_LIBRARIES(tcodbc odbc)
ENDIF () ENDIF ()
IF (TD_WINDOWS_64)
AUX_SOURCE_DIRECTORY(. SRC)
ADD_EXECUTABLE(tcodbc main.c)
TARGET_LINK_LIBRARIES(tcodbc odbc32 os)
ENDIF ()
#include <libgen.h> #include "../src/todbc_log.h"
#ifdef _MSC_VER
#include <winsock2.h>
#include <windows.h>
#include "os.h"
#endif
#include <sql.h> #include <sql.h>
#include <sqlext.h> #include <sqlext.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#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) \ #define CHK_TEST(statement) \
do { \ do { \
D("testing: %s", #statement); \ D("testing: %s", #statement); \
...@@ -72,9 +71,9 @@ static int open_connect(const char *dsn, const char *uid, const char *pwd, SQLHE ...@@ -72,9 +71,9 @@ static int open_connect(const char *dsn, const char *uid, const char *pwd, SQLHE
CHK_RESULT(r, SQL_HANDLE_ENV, env, ""); CHK_RESULT(r, SQL_HANDLE_ENV, env, "");
if (r!=SQL_SUCCESS) break; if (r!=SQL_SUCCESS) break;
do { do {
r = SQLConnect(conn, (SQLCHAR*)dsn, strlen(dsn), r = SQLConnect(conn, (SQLCHAR*)dsn, (SQLSMALLINT)strlen(dsn),
(SQLCHAR*)uid, strlen(uid), (SQLCHAR*)uid, (SQLSMALLINT)strlen(uid),
(SQLCHAR*)pwd, strlen(pwd)); (SQLCHAR*)pwd, (SQLSMALLINT)strlen(pwd));
CHK_RESULT(r, SQL_HANDLE_DBC, conn, ""); CHK_RESULT(r, SQL_HANDLE_DBC, conn, "");
if (r==SQL_SUCCESS) { if (r==SQL_SUCCESS) {
*pEnv = env; *pEnv = env;
...@@ -105,7 +104,7 @@ static int open_driver_connect(const char *connstr, SQLHENV *pEnv, SQLHDBC *pCon ...@@ -105,7 +104,7 @@ static int open_driver_connect(const char *connstr, SQLHENV *pEnv, SQLHDBC *pCon
SQLHDBC ConnectionHandle = conn; SQLHDBC ConnectionHandle = conn;
SQLHWND WindowHandle = NULL; SQLHWND WindowHandle = NULL;
SQLCHAR * InConnectionString = (SQLCHAR*)connstr; SQLCHAR * InConnectionString = (SQLCHAR*)connstr;
SQLSMALLINT StringLength1 = strlen(connstr); SQLSMALLINT StringLength1 = (SQLSMALLINT)strlen(connstr);
SQLCHAR * OutConnectionString = buf; SQLCHAR * OutConnectionString = buf;
SQLSMALLINT BufferLength = sizeof(buf); SQLSMALLINT BufferLength = sizeof(buf);
SQLSMALLINT * StringLength2Ptr = &blen; SQLSMALLINT * StringLength2Ptr = &blen;
...@@ -144,7 +143,7 @@ static int do_statement(SQLHSTMT stmt, const char *statement) { ...@@ -144,7 +143,7 @@ static int do_statement(SQLHSTMT stmt, const char *statement) {
CHK_RESULT(r, SQL_HANDLE_STMT, stmt, ""); CHK_RESULT(r, SQL_HANDLE_STMT, stmt, "");
for (size_t i=0; i<cols; ++i) { for (size_t i=0; i<cols; ++i) {
SQLLEN soi = 0; SQLLEN soi = 0;
r = SQLGetData(stmt, i+1, SQL_C_CHAR, buf, sizeof(buf), &soi); r = SQLGetData(stmt, (SQLUSMALLINT)(i+1), SQL_C_CHAR, buf, sizeof(buf), &soi);
CHK_RESULT(r, SQL_HANDLE_STMT, stmt, ""); CHK_RESULT(r, SQL_HANDLE_STMT, stmt, "");
if (r) { if (r) {
if (r!=SQL_SUCCESS_WITH_INFO) { if (r!=SQL_SUCCESS_WITH_INFO) {
...@@ -185,10 +184,10 @@ static int do_insert(SQLHSTMT stmt, data_t data) { ...@@ -185,10 +184,10 @@ static int do_insert(SQLHSTMT stmt, data_t data) {
SQLLEN lblob; SQLLEN lblob;
const char *statement = "insert into t values (?, ?, ?, ?, ?, ?, ?, ?, ?,?)"; const char *statement = "insert into t values (?, ?, ?, ?, ?, ?, ?, ?, ?,?)";
int ignored = 0; #define ignored 0
do { do {
r = SQLPrepare(stmt, (SQLCHAR*)statement, strlen(statement)); r = SQLPrepare(stmt, (SQLCHAR*)statement, (SQLINTEGER)strlen(statement));
CHK_RESULT(r, SQL_HANDLE_STMT, stmt, "statement: %s", statement); CHK_RESULT(r, SQL_HANDLE_STMT, stmt, "statement: %s", statement);
if (r) break; if (r) break;
...@@ -243,28 +242,30 @@ static int do_insert(SQLHSTMT stmt, data_t data) { ...@@ -243,28 +242,30 @@ static int do_insert(SQLHSTMT stmt, data_t data) {
// r = SQLExecute(stmt); // r = SQLExecute(stmt);
// if (r) break; // if (r) break;
} while (0); } while (0);
#undef ignored
return r; return r;
} }
static int test1(const char *dsn, const char *uid, const char *pwd) { static int test1(const char *dsn, const char *uid, const char *pwd) {
SQLRETURN r = SQL_SUCCESS;
SQLHENV env = {0}; SQLHENV env = {0};
SQLHDBC conn = {0}; SQLHDBC conn = {0};
int n = open_connect(dsn, uid, pwd, &env, &conn); int n = open_connect(dsn, uid, pwd, &env, &conn);
if (n) return 1; if (n) return 1;
int ok = 0;
do { do {
SQLRETURN r = SQL_SUCCESS;
SQLHSTMT stmt = {0}; SQLHSTMT stmt = {0};
r = SQLAllocHandle(SQL_HANDLE_STMT, conn, &stmt); r = SQLAllocHandle(SQL_HANDLE_STMT, conn, &stmt);
if (r!=SQL_SUCCESS) break; if (r!=SQL_SUCCESS) break;
do { do {
if (do_statement(stmt, "drop database if exists db")) { if (do_statement(stmt, "drop database if exists db")) {
r = SQL_ERROR;
break; break;
} }
for (size_t i=0; i<sizeof(pre_stmts)/sizeof(pre_stmts[0]); ++i) { for (size_t i=0; i<sizeof(pre_stmts)/sizeof(pre_stmts[0]); ++i) {
r = do_statement(stmt, pre_stmts[i]); n = do_statement(stmt, pre_stmts[i]);
if (r!=SQL_SUCCESS) break; if (n) break;
} }
do { do {
data_t data = {0}; data_t data = {0};
...@@ -274,7 +275,7 @@ static int test1(const char *dsn, const char *uid, const char *pwd) { ...@@ -274,7 +275,7 @@ static int test1(const char *dsn, const char *uid, const char *pwd) {
data.v2 = 32767; data.v2 = 32767;
data.v4 = 2147483647; data.v4 = 2147483647;
data.v8 = 9223372036854775807; data.v8 = 9223372036854775807;
data.f4 = 123.456; data.f4 = 123.456f;
data.f8 = 9999999.999999; data.f8 = 9999999.999999;
memset(data.bin, 0, sizeof(data.bin)); memset(data.bin, 0, sizeof(data.bin));
memset(data.blob, 0, sizeof(data.blob)); memset(data.blob, 0, sizeof(data.blob));
...@@ -285,8 +286,8 @@ static int test1(const char *dsn, const char *uid, const char *pwd) { ...@@ -285,8 +286,8 @@ static int test1(const char *dsn, const char *uid, const char *pwd) {
r = SQLAllocHandle(SQL_HANDLE_STMT, conn, &stmt); r = SQLAllocHandle(SQL_HANDLE_STMT, conn, &stmt);
if (r!=SQL_SUCCESS) break; if (r!=SQL_SUCCESS) break;
do { do {
r = do_insert(stmt, data); n = do_insert(stmt, data);
if (r!=SQL_SUCCESS) break; if (n) break;
} while (0); } while (0);
SQLFreeHandle(SQL_HANDLE_STMT, stmt); SQLFreeHandle(SQL_HANDLE_STMT, stmt);
...@@ -297,12 +298,15 @@ static int test1(const char *dsn, const char *uid, const char *pwd) { ...@@ -297,12 +298,15 @@ static int test1(const char *dsn, const char *uid, const char *pwd) {
// if (r!=SQL_SUCCESS) break; // if (r!=SQL_SUCCESS) break;
// } while (0); // } while (0);
// SQLFreeHandle(SQL_HANDLE_STMT, stmt); // SQLFreeHandle(SQL_HANDLE_STMT, stmt);
ok = 1;
} while (0); } while (0);
if (r!=SQL_SUCCESS) break; if (!ok) break;
ok = 0;
for (size_t i=0; i<sizeof(pro_stmts)/sizeof(pro_stmts[0]); ++i) { for (size_t i=0; i<sizeof(pro_stmts)/sizeof(pro_stmts[0]); ++i) {
r = do_statement(stmt, pro_stmts[i]); n = do_statement(stmt, pro_stmts[i]);
if (r!=SQL_SUCCESS) break; if (n) break;
} }
ok = 1;
} while (0); } while (0);
SQLFreeHandle(SQL_HANDLE_STMT, stmt); SQLFreeHandle(SQL_HANDLE_STMT, stmt);
} while (0); } while (0);
...@@ -310,7 +314,7 @@ static int test1(const char *dsn, const char *uid, const char *pwd) { ...@@ -310,7 +314,7 @@ static int test1(const char *dsn, const char *uid, const char *pwd) {
SQLFreeConnect(conn); SQLFreeConnect(conn);
SQLFreeEnv(env); SQLFreeEnv(env);
return r ? 1 : 0; return ok ? 0 : 1;
} }
int test_statements(const char *dsn, const char *uid, const char *pwd, const char **statements) { int test_statements(const char *dsn, const char *uid, const char *pwd, const char **statements) {
...@@ -418,7 +422,12 @@ int test_sqls_in_stmt(SQLHENV env, SQLHDBC conn, SQLHSTMT stmt, const char *sqls ...@@ -418,7 +422,12 @@ int test_sqls_in_stmt(SQLHENV env, SQLHDBC conn, SQLHSTMT stmt, const char *sqls
char *line = NULL; char *line = NULL;
size_t len = 0; size_t len = 0;
ssize_t n = getline(&line, &len, f); ssize_t n = 0;
#ifdef _MSC_VER
n = taosGetline(&line, &len, f);
#else
n = getline(&line, &len, f);
#endif
if (n==-1) break; if (n==-1) break;
const char *p = NULL; const char *p = NULL;
...@@ -493,6 +502,11 @@ int main(int argc, char *argv[]) { ...@@ -493,6 +502,11 @@ int main(int argc, char *argv[]) {
const char *connstr = (argc>4) ? argv[4] : NULL; const char *connstr = (argc>4) ? argv[4] : NULL;
const char *sqls = (argc>5) ? argv[5] : NULL; const char *sqls = (argc>5) ? argv[5] : NULL;
dsn = NULL;
uid = NULL;
pwd = NULL;
connstr = argv[1];
sqls = argv[2];
if (0) { if (0) {
CHK_TEST(test_env()); CHK_TEST(test_env());
......
P:drop database if exists m;
P:create database m;
P:use m;
P:create table t (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, blob binary(1), name nchar(1));
P:insert into t (ts, b) values('2020-10-10 00:00:00', 0);
P:insert into t (ts, b) values('2020-10-10 00:00:00.001', 1);
P:insert into t (ts, b) values('2020-10-10 00:00:00.002', 10);
P:select * from t;
P:drop table t;
P:create table t (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, blob binary(1), name nchar(1));
P:insert into t (ts, v1) values('2020-10-10 00:00:00', 0);
P:insert into t (ts, v1) values('2020-10-10 00:00:00.001', 1);
P:insert into t (ts, v1) values('2020-10-10 00:00:00.002', 10);
P:select * from t;
P:drop table t;
P:create table t (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, blob binary(1), name nchar(1));
P:insert into t (ts, name) values('2020-10-10 00:00:00', 0);
P:insert into t (ts, name) values('2020-10-10 00:00:00.001', 1);
P:insert into t (ts, name) values('2020-10-10 00:00:00.002', '人');
P:insert into t (ts, name) values('2020-10-10 00:00:00.003', 'a');
P:select * from t;
P:drop table t;
P:create table t (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, blob binary(3), name nchar(1));
P:insert into t (ts, blob) values('2020-10-10 00:00:00', 0);
P:insert into t (ts, blob) values('2020-10-10 00:00:00.001', 1);
P:insert into t (ts, blob) values('2020-10-10 00:00:00.002', 'a');
P:insert into t (ts, blob) values('2020-10-10 00:00:00.003', 'b');
P:insert into t (ts, blob) values('2020-10-10 00:00:00.004', '人');
P:select * from t;
P:drop table t;
P:create table t (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, blob binary(3), name nchar(1));
N:insert into t (ts, blob) values('2020-10-10 00:00:00', '1234');
N:insert into t (ts, blob) values('2020-10-10 00:00:00.001', '0000');
N:insert into t (ts, blob) values('2020-10-10 00:00:00.002', '人a');
P:insert into t (ts, blob) values('2020-10-10 00:00:00.003', 'a');
P:insert into t (ts, blob) values('2020-10-10 00:00:00.004', 'b');
P:insert into t (ts, blob) values('2020-10-10 00:00:00.005', '人');
P:select * from t;
...@@ -24,9 +24,9 @@ extern "C" { ...@@ -24,9 +24,9 @@ extern "C" {
#include <stdbool.h> #include <stdbool.h>
#ifdef TAOS_ERROR_C #ifdef TAOS_ERROR_C
#define TAOS_DEFINE_ERROR(name, mod, code, msg) {.val = (0x80000000 | ((mod)<<16) | (code)), .str=(msg)}, #define TAOS_DEFINE_ERROR(name, mod, code, msg) {.val = (int32_t)((0x80000000 | ((mod)<<16) | (code))), .str=(msg)},
#else #else
#define TAOS_DEFINE_ERROR(name, mod, code, msg) static const int32_t name = (0x80000000 | ((mod)<<16) | (code)); #define TAOS_DEFINE_ERROR(name, mod, code, msg) static const int32_t name = (int32_t)((0x80000000 | ((mod)<<16) | (code)));
#endif #endif
#define TAOS_SYSTEM_ERROR(code) (0x80ff0000 | (code)) #define TAOS_SYSTEM_ERROR(code) (0x80ff0000 | (code))
......
...@@ -38,14 +38,14 @@ int32_t taosGetTimestampSec(); ...@@ -38,14 +38,14 @@ int32_t taosGetTimestampSec();
static FORCE_INLINE int64_t taosGetTimestampMs() { static FORCE_INLINE int64_t taosGetTimestampMs() {
struct timeval systemTime; struct timeval systemTime;
gettimeofday(&systemTime, NULL); gettimeofday(&systemTime, NULL);
return (int64_t)systemTime.tv_sec * 1000L + (uint64_t)systemTime.tv_usec / 1000; return (int64_t)systemTime.tv_sec * 1000L + (int64_t)systemTime.tv_usec / 1000;
} }
//@return timestamp in microsecond //@return timestamp in microsecond
static FORCE_INLINE int64_t taosGetTimestampUs() { static FORCE_INLINE int64_t taosGetTimestampUs() {
struct timeval systemTime; struct timeval systemTime;
gettimeofday(&systemTime, NULL); gettimeofday(&systemTime, NULL);
return (int64_t)systemTime.tv_sec * 1000000L + (uint64_t)systemTime.tv_usec; return (int64_t)systemTime.tv_sec * 1000000L + (int64_t)systemTime.tv_usec;
} }
/* /*
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include "msvcProcess.h" #include "msvcProcess.h"
#include "msvcDirect.h" #include "msvcDirect.h"
#include "msvcFcntl.h" #include "msvcFcntl.h"
#include "msvcLibgen.h"
#include "msvcStdio.h" #include "msvcStdio.h"
#include "sys/msvcStat.h" #include "sys/msvcStat.h"
#include "sys/msvcTypes.h" #include "sys/msvcTypes.h"
......
...@@ -31,7 +31,10 @@ ...@@ -31,7 +31,10 @@
#pragma comment(lib, "Mswsock.lib ") #pragma comment(lib, "Mswsock.lib ")
#endif #endif
#pragma warning(push)
#pragma warning(disable:4091)
#include <DbgHelp.h> #include <DbgHelp.h>
#pragma warning(pop)
static void taosGetSystemTimezone() { static void taosGetSystemTimezone() {
// get and set default timezone // get and set default timezone
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册