Skip to content

Commit 23e82c8

Browse files
authored
feat: support stmt2 writing (#89)
* feat: add stmt2 encode * feat: stmt interface abstraction * feat: support stmt2 writing * feat: support binding super tables * feat: add stmt version adaptation * feat: resolve conflicts in CI database creation * feat: modify stmt2 test case error * feat: modify stmt2 test case ip * feat: modify stmt2 case errors * feat: modify stmt2 case url * feat: modify stmt2 test query case * feat: modify stmt2 test query case url * feat: add stmt2 query case debug info * feat: modify stmt2 test query case tim * feat: clean up memory data after stmt2 execution * feat: improve stmt query parameters * feat: improve stmt2 common issues * feat: improve stmt export * feat: optimize stmt2 encoding * feat: optimize stmt2 parameter binding serialization * feat: remove stmt2 parameter binding debugging log * feat: remove code with invalid stmt2 parameter binding * feat: modify version
1 parent 1810ce2 commit 23e82c8

27 files changed

+2729
-783
lines changed

nodejs/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export * from "./src/index"
1616
export * from "./src/sql/wsProto"
1717
export * from "./src/sql/wsRows"
1818
export * from "./src/sql/wsSql"
19-
export * from "./src/stmt/wsParams"
19+
export * from "./src/stmt/wsParamsBase"
2020
export * from "./src/stmt/wsProto"
2121
export * from "./src/stmt/wsStmt"
2222
export * from "./src/tmq/config"

nodejs/package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

nodejs/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@tdengine/websocket",
3-
"version": "3.1.9",
3+
"version": "3.2.0",
44
"description": "The websocket Node.js connector for TDengine. TDengine versions 3.3.2.0 and above are recommended to use this connector.",
55
"source": "index.ts",
66
"main": "lib/index.js",

nodejs/src/client/wsClient.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export class WsClient {
1818
private _timezone?:string | undefined | null;
1919
private readonly _url:URL;
2020
private static readonly _minVersion = "3.3.2.0";
21+
private _version?: string | undefined | null;
2122

2223
constructor(url: URL, timeout ?:number | undefined | null) {
2324
this.checkURL(url);
@@ -203,6 +204,10 @@ export class WsClient {
203204
}
204205

205206
async version(): Promise<string> {
207+
if (this._version) {
208+
return this._version;
209+
}
210+
206211
let versionMsg = {
207212
action: 'version',
208213
args: {
@@ -246,11 +251,11 @@ export class WsClient {
246251
}
247252

248253
async checkVersion() {
249-
let version = await this.version();
250-
let result = compareVersions(version, WsClient._minVersion);
254+
this._version = await this.version();
255+
let result = compareVersions(this._version, WsClient._minVersion);
251256
if (result < 0) {
252-
logger.error(`TDengine version is too low, current version: ${version}, minimum required version: ${WsClient._minVersion}`);
253-
throw(new WebSocketQueryError(ErrorCode.ERR_TDENIGNE_VERSION_IS_TOO_LOW, `Version mismatch. The minimum required TDengine version is ${WsClient._minVersion}`));
257+
logger.error(`TDengine version is too low, current version: ${this._version}, minimum required version: ${WsClient._minVersion}`);
258+
throw(new WebSocketQueryError(ErrorCode.ERR_TDENIGNE_VERSION_IS_TOO_LOW, `Version mismatch. The minimum required TDengine version is ${WsClient._minVersion}`));
254259
}
255260
}
256261
}

nodejs/src/common/config.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { MinStmt2Version } from "./constant";
2+
13
export class WSConfig {
24
private _user: string | undefined | null;
35
private _password: string | undefined | null;
@@ -6,9 +8,15 @@ export class WSConfig {
68
private _timeout:number| undefined | null;
79
private _token:string | undefined | null;
810
private _timezone:string | undefined | null;
11+
private _minStmt2Version:string;
912

10-
constructor(url:string) {
13+
constructor(url:string, minStmt2Version?:string) {
1114
this._url = url;
15+
if (!minStmt2Version){
16+
this._minStmt2Version = MinStmt2Version;
17+
} else {
18+
this._minStmt2Version = minStmt2Version;
19+
}
1220
}
1321

1422
public getToken(): string | undefined | null {
@@ -59,4 +67,7 @@ export class WSConfig {
5967
public getTimezone(): string | undefined | null {
6068
return this._timezone;
6169
}
70+
public getMinStmt2Version(){
71+
return this._minStmt2Version;
72+
}
6273
}

nodejs/src/common/constant.ts

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@ export interface StringIndexable {
66
[index: string]: number
77
}
88

9+
export interface NumberIndexable {
10+
[index: number]: number
11+
}
12+
913
export const BinaryQueryMessage: bigint = BigInt(6);
1014
export const FetchRawBlockMessage: bigint = BigInt(7);
11-
15+
export const MinStmt2Version:string = "3.3.6.0";
1216
export const TDengineTypeName: IndexableString = {
1317
0: 'NULL',
1418
1: 'BOOL',
@@ -70,25 +74,32 @@ export enum TSDB_OPTION_CONNECTION {
7074
TSDB_OPTION_CONNECTION_USER_APP, // user app
7175
}
7276

77+
export enum FieldBindType {
78+
TAOS_FIELD_COL = 1,
79+
TAOS_FIELD_TAG = 2,
80+
TAOS_FIELD_QUERY = 3,
81+
TAOS_FIELD_TBNAME = 4,
82+
}
83+
7384
export const TDenginePrecision: IndexableString = {
7485
0: 'MILLISECOND',
7586
1: "MICROSECOND",
7687
2: "NANOSECOND",
7788
}
7889

79-
export const TDengineTypeLength: StringIndexable = {
80-
'BOOL': 1,
81-
'TINYINT': 1,
82-
'SMALLINT': 2,
83-
'INT': 4,
84-
'BIGINT': 8,
85-
'FLOAT': 4,
86-
'DOUBLE': 8,
87-
'TIMESTAMP': 8,
88-
'TINYINT UNSIGNED': 1,
89-
'SMALLINT UNSIGNED': 2,
90-
'INT UNSIGNED': 4,
91-
'BIGINT UNSIGNED': 8,
90+
export const TDengineTypeLength: NumberIndexable = {
91+
[TDengineTypeCode.BOOL]: 1,
92+
[TDengineTypeCode.TINYINT]: 1,
93+
[TDengineTypeCode.SMALLINT]: 2,
94+
[TDengineTypeCode.INT]: 4,
95+
[TDengineTypeCode.BIGINT]: 8,
96+
[TDengineTypeCode.FLOAT]: 4,
97+
[TDengineTypeCode.DOUBLE]: 8,
98+
[TDengineTypeCode.TIMESTAMP]: 8,
99+
[TDengineTypeCode.TINYINT_UNSIGNED]: 1,
100+
[TDengineTypeCode.SMALLINT_UNSIGNED]: 2,
101+
[TDengineTypeCode.INT_UNSIGNED]: 4,
102+
[TDengineTypeCode.BIGINT_UNSIGNED]: 8,
92103
}
93104

94105
export const PrecisionLength: StringIndexable = {

nodejs/src/common/utils.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,5 +175,4 @@ export function decimalToString(valueStr: string, fields_scale: bigint | null):
175175
}
176176
}
177177
return decimalStr;
178-
}
179-
178+
}

nodejs/src/sql/wsSql.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ import { parseBlock, TaosResult } from '../common/taosResult'
33
import { WsClient } from '../client/wsClient'
44
import { ErrorCode, TDWebSocketClientError, TaosResultError, WebSocketInterfaceError } from '../common/wsError'
55
import { WSConfig } from '../common/config'
6-
import { getBinarySql, getUrl } from '../common/utils'
6+
import { compareVersions, getBinarySql, getUrl } from '../common/utils'
77
import { WSFetchBlockResponse, WSQueryResponse } from '../client/wsResponse'
88
import { Precision, SchemalessMessageInfo, SchemalessProto } from './wsProto'
9-
import { WsStmt } from '../stmt/wsStmt'
109
import { ReqId } from '../common/reqid'
11-
import { BinaryQueryMessage, FetchRawBlockMessage, PrecisionLength, TSDB_OPTION_CONNECTION } from '../common/constant'
10+
import { BinaryQueryMessage, FetchRawBlockMessage, MinStmt2Version, PrecisionLength, TSDB_OPTION_CONNECTION } from '../common/constant'
1211
import logger from '../common/log'
12+
import { WsStmt } from '../stmt/wsStmt'
13+
import { WsStmt1 } from '../stmt/wsStmt1'
14+
import { WsStmt2 } from '../stmt/wsStmt2'
1315

1416
export class WsSql{
1517
private wsConfig:WSConfig;
@@ -106,7 +108,12 @@ export class WsSql{
106108
precision = PrecisionLength[data[0][0]]
107109
}
108110
}
109-
return await WsStmt.newStmt(this._wsClient, precision, reqId);
111+
let version = await this.version();
112+
let result = compareVersions(version, this.wsConfig.getMinStmt2Version());
113+
if (result < 0) {
114+
return await WsStmt1.newStmt(this._wsClient, precision, reqId);
115+
}
116+
return await WsStmt2.newStmt(this._wsClient, precision, reqId);
110117
} catch (e: any) {
111118
logger.error(`stmtInit failed, code: ${e.code}, message: ${e.message}`);
112119
throw(e);

nodejs/src/stmt/FieldBindParams.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
export class FieldBindParams {
3+
params: any[];
4+
dataType: string;
5+
typeLen: number;
6+
columnType: number;
7+
bindType: number; // 0: normal, 1: table name, 2: tag
8+
constructor(params:any[], dataType:string, typeLen:number, columnType:number, bindType:number) {
9+
this.params = [...params];
10+
this.dataType = dataType;
11+
this.typeLen = typeLen;
12+
this.columnType = columnType;
13+
this.bindType = bindType;
14+
}
15+
}

nodejs/src/stmt/wsColumnInfo.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
2+
export class ColumnInfo {
3+
data:ArrayBuffer;
4+
length:number;
5+
type:number;
6+
typeLen:number;
7+
isNull?: number[];
8+
_rows: number;
9+
_haveLength: number = 0;
10+
_dataLengths?: number[];
11+
constructor([length,data]:[number, ArrayBuffer], type:number, typeLen:number, rows:number,
12+
isNull?: number[], dataLengths?: number[], haveLength: number = 0) {
13+
this.data = data;
14+
this.type = type;
15+
this.length = length;
16+
this.typeLen = typeLen;
17+
this._rows = rows;
18+
this.isNull = isNull;
19+
this._dataLengths = dataLengths;
20+
this._haveLength = haveLength;
21+
}
22+
23+
}

0 commit comments

Comments
 (0)