From 49f10ddb39f1eb3fc7889892468aa1c563f7ef11 Mon Sep 17 00:00:00 2001 From: freemine Date: Wed, 11 May 2022 23:59:04 +0800 Subject: [PATCH] odbc: support DRIVER parameter for odbc connection string (#12351) --- src/connector/odbc/examples/c/main.c | 3 +++ src/connector/odbc/src/base/tsdb_impl.c | 7 +++++-- src/connector/odbc/src/todbc_flex.h | 1 + src/connector/odbc/src/todbc_scanner.l | 18 +++++++++++++----- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/connector/odbc/examples/c/main.c b/src/connector/odbc/examples/c/main.c index de01d2b85e..e84f772f6d 100644 --- a/src/connector/odbc/examples/c/main.c +++ b/src/connector/odbc/examples/c/main.c @@ -203,6 +203,9 @@ static int do_statement(SQLHSTMT stmt, const char *statement) { fprintf(stdout, "\n"); } } while (0); + if (r==SQL_SUCCESS || r==SQL_NO_DATA) + return SQL_SUCCESS; + return r; } diff --git a/src/connector/odbc/src/base/tsdb_impl.c b/src/connector/odbc/src/base/tsdb_impl.c index eebe96c7ff..a2e37d4816 100644 --- a/src/connector/odbc/src/base/tsdb_impl.c +++ b/src/connector/odbc/src/base/tsdb_impl.c @@ -190,17 +190,20 @@ static SQLRETURN tsdb_conn_connect(conn_t *conn) { conn_val_t *val = &conn->val; const char *dsn = val->dsn; + const char *driver = val->driver; const char *uid = val->uid; const char *pwd = val->pwd; const char *db = val->db; const char *svr = val->server; - OILE(dsn, ""); + OILE(dsn || driver, ""); int use_default = 0; char server[4096]; server[0] = '\0'; if (!svr || !svr[0]) { - int n = SQLGetPrivateProfileString(dsn, "Server", "", server, sizeof(server)-1, "Odbc.ini"); + const char *filename = dsn ? "Odbc.ini" : "odbcinst.ini"; + int n; + n = SQLGetPrivateProfileString(dsn, "Server", "", server, sizeof(server)-1, filename); if (n<=0) { snprintf(server, sizeof(server), DEFAULT_SERVER); n = (int)strlen(server); diff --git a/src/connector/odbc/src/todbc_flex.h b/src/connector/odbc/src/todbc_flex.h index 762ffba0be..347a8dc0d7 100644 --- a/src/connector/odbc/src/todbc_flex.h +++ b/src/connector/odbc/src/todbc_flex.h @@ -40,6 +40,7 @@ struct map_tsdb_type_s { typedef struct conn_val_s conn_val_t; struct conn_val_s { char *dsn; + char *driver; char *uid; char *pwd; char *db; diff --git a/src/connector/odbc/src/todbc_scanner.l b/src/connector/odbc/src/todbc_scanner.l index b36c894f73..ef558efb93 100644 --- a/src/connector/odbc/src/todbc_scanner.l +++ b/src/connector/odbc/src/todbc_scanner.l @@ -46,6 +46,10 @@ do { \ free(yyextra->dsn); \ yyextra->dsn = strdup(yytext); \ } break; \ + case DRIVER: { \ + free(yyextra->driver); \ + yyextra->driver = strdup(yytext); \ + } break; \ case UID: { \ free(yyextra->uid); \ yyextra->uid = strdup(yytext); \ @@ -121,7 +125,7 @@ do { %option 8bit %option case-insensitive -%x DSN UID PWD SERVER DB +%x DSN DRIVER UID PWD SERVER DB %x ENC_CHAR ENC_WCHAR ENC_DB ENC_LOCAL %x TSDB_FLOAT TSDB_BIGINT %x KEY EQ BRACE1 BRACE2 VAL @@ -132,6 +136,7 @@ do { if (state == VAL) yyterminate(); FAIL(); } [[:space:]]+ { } +"DRIVER" { PUSH_STATE(DRIVER); } "DSN" { PUSH_STATE(DSN); } "UID" { PUSH_STATE(UID); } "PWD" { PUSH_STATE(PWD); } @@ -146,9 +151,9 @@ do { [[:alnum:]_]+ { PUSH_STATE(KEY); } .|\n { FAIL(); } -[[:space:]]+ { } -[=] { PUSH_STATE(EQ); } -.|\n { FAIL(); } +[[:space:]]+ { } +[=] { PUSH_STATE(EQ); } +.|\n { FAIL(); } [[:space:]]+ { } [{] { CHG_STATE(BRACE1); } @@ -181,7 +186,7 @@ int todbc_parse_conn_string(const char *conn, conn_val_t *val) { yy_scan_string(conn, arg); int ret =yylex(arg); yylex_destroy(arg); - if (ret || !val->dsn) { + if (ret || (!val->dsn && !val->driver)) { conn_val_reset(val); } else { if (!val->uid) { @@ -201,6 +206,9 @@ void conn_val_reset(conn_val_t *val) { if (val->dsn) { free(val->dsn); val->dsn = NULL; } + if (val->driver) { + free(val->driver); val->driver = NULL; + } if (val->uid) { free(val->uid); val->uid = NULL; } -- GitLab