From 026293617acd3193ae2c45ed5f167166cca6fafd Mon Sep 17 00:00:00 2001 From: robot Date: Sat, 10 Aug 2019 22:30:23 +0800 Subject: [PATCH] Return records with seperated fields in lua connector. Field names and values are both returned. Client application gets value by field name. It runs as convention except that bool type is returned as one byte,tiny integer. Bool type will be returned in future if tiny integer causes confusion. --- tests/examples/lua/README.md | 2 +- tests/examples/lua/lua_connector.c | 59 ++++++++++++++++++++++++++---- tests/examples/lua/test.lua | 33 +++++++++++------ 3 files changed, 75 insertions(+), 19 deletions(-) diff --git a/tests/examples/lua/README.md b/tests/examples/lua/README.md index db2d56c937..8efc52b35c 100644 --- a/tests/examples/lua/README.md +++ b/tests/examples/lua/README.md @@ -1,6 +1,6 @@ # TDengine driver connector for Lua -It's a lua implementation for [TDengine](https://github.com/taosdata/TDengine), an open-sourced big data platform designed and optimized for the Internet of Things (IoT), Connected Cars, Industrial IoT, and IT Infrastructure and Application Monitoring. You may needs install Lua5.3 . +It's a Lua implementation for [TDengine](https://github.com/taosdata/TDengine), an open-sourced big data platform designed and optimized for the Internet of Things (IoT), Connected Cars, Industrial IoT, and IT Infrastructure and Application Monitoring. You may need to install Lua5.3 . ## Dependencies - Lua: diff --git a/tests/examples/lua/lua_connector.c b/tests/examples/lua/lua_connector.c index c42da2789f..f37657e822 100644 --- a/tests/examples/lua/lua_connector.c +++ b/tests/examples/lua/lua_connector.c @@ -22,7 +22,7 @@ static int l_connect(lua_State *L) taos = taos_connect(host, user,password,database, port); if (taos == NULL) { - printf("failed to connect to server, reason:%s\n", taos_errstr(taos)); + printf("failed to connect server, reason:%s\n", taos_errstr(taos)); lua_pushnumber(L, -1); lua_setfield(L, table_index, "code"); @@ -30,7 +30,7 @@ static int l_connect(lua_State *L) lua_setfield(L, table_index, "error"); lua_pushlightuserdata(L,NULL); }else{ - printf("success to connect to server\n"); + printf("success to connect server\n"); lua_pushnumber(L, 0); lua_setfield(L, table_index, "code"); lua_pushstring(L, taos_errstr(taos)); @@ -60,6 +60,7 @@ static int l_query(lua_State *L){ return 1; }else{ + //printf("success to query.\n"); result = taos_use_result(taos); if (result == NULL) { @@ -82,17 +83,61 @@ static int l_query(lua_State *L){ lua_newtable(L); while ((row = taos_fetch_row(result))) { + //printf("row index:%d\n",rows); rows++; - taos_print_row(temp, row, fields, num_fields); - printf("%s\n", temp); + lua_pushnumber(L,rows); - lua_pushstring(L,temp); + lua_newtable(L); + + for (int i = 0; i < num_fields; ++i) { + if (row[i] == NULL) { + continue; + } + + lua_pushstring(L,fields[i].name); + //printf("field name:%s,type:%d\n",fields[i].name,fields[i].type); + switch (fields[i].type) { + case TSDB_DATA_TYPE_TINYINT: + lua_pushinteger(L,*((char *)row[i])); + break; + case TSDB_DATA_TYPE_SMALLINT: + lua_pushinteger(L,*((short *)row[i])); + break; + case TSDB_DATA_TYPE_INT: + lua_pushinteger(L,*((int *)row[i])); + break; + case TSDB_DATA_TYPE_BIGINT: + lua_pushinteger(L,*((int64_t *)row[i])); + break; + case TSDB_DATA_TYPE_FLOAT: + lua_pushnumber(L,*((float *)row[i])); + break; + case TSDB_DATA_TYPE_DOUBLE: + lua_pushnumber(L,*((double *)row[i])); + break; + case TSDB_DATA_TYPE_BINARY: + case TSDB_DATA_TYPE_NCHAR: + lua_pushstring(L,(char *)row[i]); + break; + case TSDB_DATA_TYPE_TIMESTAMP: + lua_pushinteger(L,*((int64_t *)row[i])); + break; + case TSDB_DATA_TYPE_BOOL: + lua_pushinteger(L,*((char *)row[i])); + break; + default: + lua_pushnil(L); + break; + } + + lua_settable(L,-3); + } + lua_settable(L,-3); } - taos_free_result(result); } - + lua_setfield(L, table_index, "item"); return 1; } diff --git a/tests/examples/lua/test.lua b/tests/examples/lua/test.lua index f0210db9f1..f644b82dd4 100644 --- a/tests/examples/lua/test.lua +++ b/tests/examples/lua/test.lua @@ -1,4 +1,4 @@ -local mylib = require "luaconnector" +local driver = require "luaconnector" local host="127.0.0.1" local user="root" @@ -7,7 +7,7 @@ local db =nil local port=6030 local conn -local res = mylib.connect(host,user,password,db,port) +local res = driver.connect(host,user,password,db,port) if res.code ~=0 then print(res.error) return @@ -15,33 +15,44 @@ else conn = res.conn end -local res = mylib.query(conn,"drop database demo") +local res = driver.query(conn,"drop database demo") -res = mylib.query(conn,"create database demo") +res = driver.query(conn,"create database demo") if res.code ~=0 then print(res.error) return end -res = mylib.query(conn,"use demo") +res = driver.query(conn,"use demo") if res.code ~=0 then print(res.error) return end -res = mylib.query(conn,"create table m1 (ts timestamp, speed int)") +res = driver.query(conn,"create table m1 (ts timestamp, speed int,owner binary(20))") if res.code ~=0 then print(res.error) return end -res = mylib.query(conn,"insert into m1 values (1592222222223,3)") +res = driver.query(conn,"insert into m1 values (1592222222222,0,'robotspace'), (1592222222223,1,'Hilink'),(1592222222224,2,'Harmony')") +if res.code ~=0 then + print(res.error) + return +end -res = mylib.query(conn,"select * from m1") +res = driver.query(conn,"select * from m1") -if res.code ==0 then +if res.code ~=0 then + print("select error:"..res.error) + return +else print("in lua, result:") - for i=1,#(res.item) do - print(res.item[i]) + for i = 1, #(res.item) do + print("timestamp:"..res.item[i].ts) + print("speed:"..res.item[i].speed) + print("owner:"..res.item[i].owner) end end + +driver.close(conn) -- GitLab