UNPKG

@tdengine/websocket

Version:

The websocket Node.js connector for TDengine. TDengine versions 3.3.2.0 and above are recommended to use this connector.

406 lines (405 loc) 15.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const wsConnectorPool_1 = require("../../src/client/wsConnectorPool"); const config_1 = require("../../src/common/config"); const log_1 = require("../../src/common/log"); const wsSql_1 = require("../../src/sql/wsSql"); let dns = 'ws://localhost:6041'; (0, log_1.setLevel)("debug"); beforeAll(async () => { let conf = new config_1.WSConfig(dns); conf.setUser('root'); conf.setPwd('taosdata'); let wsSql = await wsSql_1.WsSql.open(conf); await wsSql.exec('create database if not exists power_stmt KEEP 3650 DURATION 10 BUFFER 16 WAL_LEVEL 1;'); await wsSql.exec('CREATE STABLE if not exists power_stmt.meters (ts timestamp, current float, voltage int, phase float) TAGS (location binary(64), groupId int);'); await wsSql.close(); }); describe('TDWebSocket.Stmt()', () => { jest.setTimeout(20 * 1000); let tags = ['California', 3]; let multi = [ // [1709183268567], // [10.2], // [292], // [0.32], [1709183268567, 1709183268568, 1709183268569], [10.2, 10.3, 10.4], [292, 293, 294], [0.32, 0.33, 0.34], ]; test('normal connect', async () => { let conf = new config_1.WSConfig(dns); conf.setUser('root'); conf.setPwd('taosdata'); conf.setDb('power_stmt'); let connector = await wsSql_1.WsSql.open(conf); let stmt = await connector.stmtInit(); expect(stmt).toBeTruthy(); expect(connector.state()).toBeGreaterThan(0); await stmt.close(); await connector.close(); }); test('connect db with error', async () => { expect.assertions(1); let connector = null; try { let conf = new config_1.WSConfig(dns); conf.setUser('root'); conf.setPwd('taosdata'); conf.setDb('jest'); connector = await wsSql_1.WsSql.open(conf); let stmt = await connector.stmtInit(); await stmt.close(); } catch (e) { let err = e; expect(err.message).toMatch('Database not exist'); } finally { if (connector) { await connector.close(); } } }); test('normal Prepare', async () => { let conf = new config_1.WSConfig(dns); conf.setUser('root'); conf.setPwd('taosdata'); conf.setDb('power_stmt'); let connector = await wsSql_1.WsSql.open(conf); let stmt = await connector.stmtInit(); expect(stmt).toBeTruthy(); expect(connector.state()).toBeGreaterThan(0); await stmt.prepare('INSERT INTO ? USING meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); await stmt.setTableName('d1001'); let params = stmt.newStmtParam(); params.setVarchar([tags[0]]); params.setInt([tags[1]]); await stmt.setTags(params); await stmt.close(); await connector.close(); }); test('set tag error', async () => { let conf = new config_1.WSConfig(dns); conf.setUser('root'); conf.setPwd('taosdata'); conf.setDb('power_stmt'); let connector = await wsSql_1.WsSql.open(conf); let stmt = await connector.stmtInit(); expect(stmt).toBeTruthy(); expect(connector.state()).toBeGreaterThan(0); await stmt.prepare('INSERT INTO ? USING meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); await stmt.setTableName('d1001'); let params = stmt.newStmtParam(); params.setVarchar([tags[0]]); try { await stmt.setTags(params); } catch (err) { expect(err.message).toMatch('stmt tags count not match'); } await stmt.close(); await connector.close(); }); test('error Prepare table', async () => { let conf = new config_1.WSConfig(dns); conf.setUser('root'); conf.setPwd('taosdata'); conf.setDb('power_stmt'); let connector = await wsSql_1.WsSql.open(conf); let stmt = await connector.stmtInit(); expect(stmt).toBeTruthy(); expect(connector.state()).toBeGreaterThan(0); try { await stmt.prepare('INSERT ? INTO ? USING meters TAGS (?, ?) VALUES (?, ?, ?, ?)'); await stmt.setTableName('d1001'); } catch (e) { let err = e; expect(err.message).toMatch("syntax error near '? into ? using meters tags (?, ?) values (?, ?, ?, ?)' (keyword INTO is expected)"); } await stmt.close(); await connector.close(); }); test('error Prepare tag', async () => { let conf = new config_1.WSConfig(dns); conf.setUser('root'); conf.setPwd('taosdata'); conf.setDb('power_stmt'); let connector = await wsSql_1.WsSql.open(conf); let stmt = await connector.stmtInit(); expect(stmt).toBeTruthy(); expect(connector.state()).toBeGreaterThan(0); try { await stmt.prepare('INSERT INTO ? USING meters TAGS (?, ?, ?) VALUES (?, ?, ?, ?)'); await stmt.setTableName('d1001'); } catch (e) { let err = e; expect(err.message).toMatch("Tags number not matched"); } await stmt.close(); await connector.close(); }); test('normal BindParam', async () => { let conf = new config_1.WSConfig(dns); conf.setUser('root'); conf.setPwd('taosdata'); conf.setDb('power_stmt'); let connector = await wsSql_1.WsSql.open(conf); let stmt = await connector.stmtInit(); expect(stmt).toBeTruthy(); await stmt.prepare('INSERT INTO ? USING meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); await stmt.setTableName('d1001'); let params = stmt.newStmtParam(); params.setVarchar(['SanFrancisco']); params.setInt([7]); await stmt.setTags(params); let lastTs = 0; const allp = []; for (let i = 0; i < 10; i++) { for (let j = 0; j < multi[0].length; j++) { multi[0][j] = multi[0][0] + j; lastTs = multi[0][j]; } let dataParams = stmt.newStmtParam(); dataParams.setTimestamp(multi[0]); dataParams.setFloat(multi[1]); dataParams.setInt(multi[2]); dataParams.setFloat(multi[3]); allp.push(stmt.bind(dataParams)); multi[0][0] = lastTs + 1; } await Promise.all(allp); await stmt.batch(); await stmt.exec(); expect(stmt.getLastAffected()).toEqual(30); await stmt.close(); await connector.close(); }); test('error BindParam', async () => { let conf = new config_1.WSConfig(dns); conf.setUser('root'); conf.setPwd('taosdata'); conf.setDb('power_stmt'); let connector = await wsSql_1.WsSql.open(conf); let stmt = await connector.stmtInit(); expect(stmt).toBeTruthy(); expect(connector.state()).toBeGreaterThan(0); await stmt.prepare('INSERT INTO ? USING meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); await stmt.setTableName('d1001'); let params = stmt.newStmtParam(); params.setVarchar(['SanFrancisco']); params.setInt([7]); await stmt.setTags(params); let multi = [ [1709183268567, 1709183268568], [10.2, 10.3, 10.4, 10.5], [292, 293, 294], [0.32, 0.33, 0.31], ]; try { let dataParams = stmt.newStmtParam(); dataParams.setTimestamp(multi[0]); dataParams.setFloat(multi[1]); dataParams.setInt(multi[2]); dataParams.setFloat(multi[3]); await stmt.bind(dataParams); await stmt.batch(); await stmt.exec(); } catch (e) { let err = e; expect(err.message).toMatch("wrong row length"); } await stmt.close(); await connector.close(); }); test('no Batch', async () => { let conf = new config_1.WSConfig(dns); conf.setUser('root'); conf.setPwd('taosdata'); conf.setDb('power_stmt'); let connector = await wsSql_1.WsSql.open(conf); let stmt = await connector.stmtInit(); expect(stmt).toBeTruthy(); expect(connector.state()).toBeGreaterThan(0); await stmt.prepare('INSERT INTO ? USING meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); await stmt.setTableName('d1001'); let params = stmt.newStmtParam(); params.setVarchar(['SanFrancisco']); params.setInt([7]); await stmt.setTags(params); let multi = [ [1709183268567, 1709183268568], [10.2, 10.3], [292, 293], [0.32, 0.33], ]; try { let dataParams = stmt.newStmtParam(); dataParams.setTimestamp(multi[0]); dataParams.setFloat(multi[1]); dataParams.setInt(multi[2]); dataParams.setFloat(multi[3]); await stmt.bind(dataParams); await stmt.exec(); } catch (e) { let err = e; expect(err.message).toMatch("Stmt API usage error"); } await stmt.close(); await connector.close(); }); test('Batch after BindParam', async () => { let conf = new config_1.WSConfig(dns); conf.setUser('root'); conf.setPwd('taosdata'); conf.setDb('power_stmt'); let connector = await wsSql_1.WsSql.open(conf); let stmt = await connector.stmtInit(); expect(stmt).toBeTruthy(); expect(connector.state()).toBeGreaterThan(0); await stmt.prepare('INSERT INTO ? USING meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); await stmt.setTableName('d1001'); let params = stmt.newStmtParam(); params.setVarchar(['SanFrancisco']); params.setInt([7]); await stmt.setTags(params); let multi1 = [ [1709188881548, 1709188881549], [10.2, 10.3], [292, 293], [0.32, 0.33], ]; let multi2 = [ [1709188881550, 1709188881551], [10.2, 10.3], [292, 293], [0.32, 0.33], ]; let dataParams = stmt.newStmtParam(); dataParams.setTimestamp(multi1[0]); dataParams.setFloat(multi1[1]); dataParams.setInt(multi1[2]); dataParams.setFloat(multi1[3]); await stmt.bind(dataParams); await stmt.batch(); await stmt.setTableName('d1002'); params = stmt.newStmtParam(); params.setVarchar(['SanFrancisco']); params.setInt([5]); await stmt.setTags(params); dataParams = stmt.newStmtParam(); dataParams.setTimestamp(multi2[0]); dataParams.setFloat(multi2[1]); dataParams.setInt(multi2[2]); dataParams.setFloat(multi2[3]); await stmt.bind(dataParams); await stmt.batch(); await stmt.exec(); expect(stmt.getLastAffected()).toEqual(4); await stmt.close(); await connector.close(); }); test('no set tag', async () => { let conf = new config_1.WSConfig(dns); conf.setUser('root'); conf.setPwd('taosdata'); conf.setDb('power_stmt'); let connector = await wsSql_1.WsSql.open(conf); let stmt = await connector.stmtInit(); expect(stmt).toBeTruthy(); expect(connector.state()).toBeGreaterThan(0); await stmt.prepare('INSERT INTO ? USING meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); await stmt.setTableName('d1001'); // await stmt.SetTags(tags) try { let dataParams = stmt.newStmtParam(); dataParams.setTimestamp(multi[0]); dataParams.setFloat(multi[1]); dataParams.setInt(multi[2]); dataParams.setFloat(multi[3]); await stmt.bind(dataParams); await stmt.batch(); await stmt.exec(); } catch (e) { let err = e; expect(err.message).toMatch("Retry needed"); } await stmt.close(); await connector.close(); }); test('normal binary BindParam', async () => { let conf = new config_1.WSConfig(dns); conf.setUser('root'); conf.setPwd('taosdata'); conf.setDb('power_stmt'); let connector = await wsSql_1.WsSql.open(conf); let stmt = await connector.stmtInit(); expect(stmt).toBeTruthy(); expect(connector.state()).toBeGreaterThan(0); await stmt.prepare('INSERT INTO ? USING meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); await stmt.setTableName('d1002'); let params = stmt.newStmtParam(); params.setVarchar(['SanFrancisco']); params.setInt([7]); await stmt.setTags(params); let dataParams = stmt.newStmtParam(); dataParams.setTimestamp(multi[0]); dataParams.setFloat(multi[1]); dataParams.setInt(multi[2]); dataParams.setFloat(multi[3]); await stmt.bind(dataParams); await stmt.batch(); await stmt.exec(); let result = await connector.exec("select * from power_stmt.meters"); console.log(result); await stmt.close(); await connector.close(); }); test('normal json BindParam', async () => { let conf = new config_1.WSConfig(dns); conf.setUser('root'); conf.setPwd('taosdata'); conf.setDb('power_stmt'); let connector = await wsSql_1.WsSql.open(conf); let stmt = await connector.stmtInit(); expect(stmt).toBeTruthy(); expect(connector.state()).toBeGreaterThan(0); await stmt.prepare('INSERT INTO ? USING meters (location, groupId) TAGS (?, ?) VALUES (?, ?, ?, ?)'); await stmt.setTableName('d1001'); let params = stmt.newStmtParam(); params.setVarchar(['SanFrancisco']); params.setInt([7]); await stmt.setTags(params); let multi1 = [ [1709188881548, 1709188881549], [10.2, 10.3], [292, 293], [0.32, 0.33], ]; let dataParams = stmt.newStmtParam(); dataParams.setTimestamp(multi1[0]); dataParams.setFloat(multi1[1]); dataParams.setInt(multi1[2]); dataParams.setFloat(multi1[3]); await stmt.bind(dataParams); await stmt.batch(); await stmt.exec(); await stmt.close(); await connector.close(); }); }); afterAll(async () => { let conf = new config_1.WSConfig(dns); conf.setUser('root'); conf.setPwd('taosdata'); let wsSql = await wsSql_1.WsSql.open(conf); await wsSql.exec('drop database power_stmt'); await wsSql.close(); wsConnectorPool_1.WebSocketConnectionPool.instance().destroyed(); });