未验证 提交 49f10ddb 编写于 作者: F freemine 提交者: GitHub

odbc: support DRIVER parameter for odbc connection string (#12351)

上级 6e3b25d2
......@@ -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;
}
......
......@@ -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);
......
......@@ -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;
......
......@@ -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(); }
<DSN,UID,PWD,SERVER,DB,ENC_CHAR,ENC_WCHAR,ENC_DB,ENC_LOCAL,TSDB_FLOAT,TSDB_BIGINT,KEY>[[:space:]]+ { }
<DSN,UID,PWD,SERVER,DB,ENC_CHAR,ENC_WCHAR,ENC_DB,ENC_LOCAL,TSDB_FLOAT,TSDB_BIGINT,KEY>[=] { PUSH_STATE(EQ); }
<DSN,UID,PWD,SERVER,DB,ENC_CHAR,ENC_WCHAR,ENC_DB,ENC_LOCAL,TSDB_FLOAT,TSDB_BIGINT,KEY>.|\n { FAIL(); }
<DSN,DRIVER,UID,PWD,SERVER,DB,ENC_CHAR,ENC_WCHAR,ENC_DB,ENC_LOCAL,TSDB_FLOAT,TSDB_BIGINT,KEY>[[:space:]]+ { }
<DSN,DRIVER,UID,PWD,SERVER,DB,ENC_CHAR,ENC_WCHAR,ENC_DB,ENC_LOCAL,TSDB_FLOAT,TSDB_BIGINT,KEY>[=] { PUSH_STATE(EQ); }
<DSN,DRIVER,UID,PWD,SERVER,DB,ENC_CHAR,ENC_WCHAR,ENC_DB,ENC_LOCAL,TSDB_FLOAT,TSDB_BIGINT,KEY>.|\n { FAIL(); }
<EQ>[[:space:]]+ { }
<EQ>[{] { 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;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册