tdengine-client
Version:
A Node.js connector for TDengine.
557 lines (485 loc) • 23.2 kB
JavaScript
const ref = require('ref-napi');
const { C_JSON_TAG } = require('./constants');
const StructType = require('ref-struct-di')(ref);
const taosConst = require('./constants');
var TAOS_MULTI_BIND = StructType({
'buffer_type': ref.types.int,
'buffer': ref.refType(ref.types.void),
'buffer_length': ref.types.ulong,
'length': ref.refType(ref.types.int),
'is_null': ref.refType(ref.types.char),
'num': ref.types.int,
})
class TaosMultiBind {
constructor() {
}
/**
* To bind bool through an array.
* @param {*} boolArray is an boolean array that stores one column's value.
* @returns A instance of struct TAOS_MULTI_BIND that contains one column's data with bool type.
*/
multiBindBool(boolArray) {
let mbindBufferBuf = Buffer.alloc(ref.types.bool.size * boolArray.length);
let mbindLengBuf = Buffer.alloc(ref.types.int.size * boolArray.length);
let mbindIsNullBuf = Buffer.alloc(ref.types.char.size * boolArray.length);
boolArray.forEach((element, index) => {
ref.set(mbindLengBuf, index * ref.types.int.size, ref.types.bool.size, ref.types.int)
if (element == null || element == undefined) {
// ref.set(mbindBufferBuf,index * ref.types.int64.size,taosConst.C_BIGINT_NULL,ref.types.int64);
ref.set(mbindIsNullBuf, index * ref.types.char.size, 1, ref.types.char);
} else {
ref.set(mbindBufferBuf, index * ref.types.bool.size, element, ref.types.bool);
ref.set(mbindIsNullBuf, index * ref.types.char.size, 0, ref.types.char);
}
});
let mbind = new TAOS_MULTI_BIND({
buffer_type: taosConst.C_BOOL,
buffer: mbindBufferBuf,
buffer_length: ref.types.bool.size,
length: mbindLengBuf,
is_null: mbindIsNullBuf,
num: boolArray.length,
})
return mbind;
}
/**
* to bind tiny int through an array.
* @param {*} tinyIntArray is an array that stores tiny int.
* @returns A instance of struct TAOS_MULTI_BIND that contains one column's data with tiny int.
*/
multiBindTinyInt(tinyIntArray) {
let mbindBufferBuf = Buffer.alloc(ref.types.int8.size * tinyIntArray.length);
let mbindLengBuf = Buffer.alloc(ref.types.int.size * tinyIntArray.length);
let mbindIsNullBuf = Buffer.alloc(ref.types.char.size * tinyIntArray.length);
tinyIntArray.forEach((element, index) => {
ref.set(mbindLengBuf, index * ref.types.int.size, ref.types.int8.size, ref.types.int)
if (element == null || element == undefined) {
// ref.set(mbindBufferBuf,index * ref.types.int64.size,taosConst.C_BIGINT_NULL,ref.types.int64);
ref.set(mbindIsNullBuf, index * ref.types.char.size, 1, ref.types.char);
} else {
ref.set(mbindBufferBuf, index * ref.types.int8.size, element, ref.types.int8);
ref.set(mbindIsNullBuf, index * ref.types.char.size, 0, ref.types.char);
}
});
let mbind = new TAOS_MULTI_BIND({
buffer_type: taosConst.C_TINYINT,
buffer: mbindBufferBuf,
buffer_length: ref.types.int8.size,
length: mbindLengBuf,
is_null: mbindIsNullBuf,
num: tinyIntArray.length,
})
return mbind;
}
/**
* To bind small int through an array.
* @param {*} smallIntArray is an array that stores small int.
* @returns A instance of struct TAOS_MULTI_BIND that contains one column's data with small int.
*/
multiBindSmallInt(smallIntArray) {
let mbindBufferBuf = Buffer.alloc(ref.types.int16.size * smallIntArray.length);
let mbindLengBuf = Buffer.alloc(ref.types.int.size * smallIntArray.length);
let mbindIsNullBuf = Buffer.alloc(ref.types.char.size * smallIntArray.length);
smallIntArray.forEach((element, index) => {
ref.set(mbindLengBuf, index * ref.types.int.size, ref.types.int16.size, ref.types.int)
if (element == null || element == undefined) {
ref.set(mbindIsNullBuf, index * ref.types.char.size, 1, ref.types.char);
} else {
ref.set(mbindBufferBuf, index * ref.types.int16.size, element, ref.types.int16);
ref.set(mbindIsNullBuf, index * ref.types.char.size, 0, ref.types.char);
}
});
let mbind = new TAOS_MULTI_BIND({
buffer_type: taosConst.C_SMALLINT,
buffer: mbindBufferBuf,
buffer_length: ref.types.int16.size,
length: mbindLengBuf,
is_null: mbindIsNullBuf,
num: smallIntArray.length,
})
return mbind;
}
/**
* To bind int through an array.
* @param {*} intArray is an array that stores int.
* @returns A instance of struct TAOS_MULTI_BIND that contains one column's data with int.
*/
multiBindInt(intArray) {
let mbindBufferBuf = Buffer.alloc(ref.types.int.size * intArray.length);
let mbindLengBuf = Buffer.alloc(ref.types.int.size * intArray.length);
let mbindIsNullBuf = Buffer.alloc(ref.types.char.size * intArray.length);
intArray.forEach((element, index) => {
ref.set(mbindLengBuf, index * ref.types.int.size, ref.types.int.size, ref.types.int)
if (element == null || element == undefined) {
ref.set(mbindIsNullBuf, index * ref.types.char.size, 1, ref.types.char);
} else {
ref.set(mbindBufferBuf, index * ref.types.int.size, element, ref.types.int);
ref.set(mbindIsNullBuf, index * ref.types.char.size, 0, ref.types.char);
}
});
let mbind = new TAOS_MULTI_BIND({
buffer_type: taosConst.C_INT,
buffer: mbindBufferBuf,
buffer_length: ref.types.int.size,
length: mbindLengBuf,
is_null: mbindIsNullBuf,
num: intArray.length,
})
return mbind;
}
/**
* To bind big int through an array.
* @param {*} bigIntArray is an array that stores big int.
* @returns A instance of struct TAOS_MULTI_BIND that contains one column's data with big int.
*/
multiBindBigInt(bigIntArray) {
let mbindBufferBuf = Buffer.alloc(ref.types.int64.size * bigIntArray.length);
let mbindLengBuf = Buffer.alloc(ref.types.int.size * bigIntArray.length);
let mbindIsNullBuf = Buffer.alloc(ref.types.char.size * bigIntArray.length);
bigIntArray.forEach((element, index) => {
ref.set(mbindLengBuf, index * ref.types.int.size, ref.types.int64.size, ref.types.int)
if (element == null || element == undefined) {
ref.set(mbindIsNullBuf, index * ref.types.char.size, 1, ref.types.char);
} else {
ref.writeInt64LE(mbindBufferBuf, index * ref.types.int64.size, element.toString())
ref.set(mbindIsNullBuf, index * ref.types.char.size, 0, ref.types.char);
}
});
let mbind = new TAOS_MULTI_BIND({
buffer_type: taosConst.C_BIGINT,
buffer: mbindBufferBuf,
buffer_length: ref.types.int64.size,
length: mbindLengBuf,
is_null: mbindIsNullBuf,
num: bigIntArray.length,
})
return mbind;
}
/**
* To bind float through an array.
* @param {*} floatArray is an array that stores float.
* @returns A instance of struct TAOS_MULTI_BIND that contains one column's data with float.
*/
multiBindFloat(floatArray) {
let mbindBufferBuf = Buffer.alloc(ref.types.float.size * floatArray.length);
let mbindLengBuf = Buffer.alloc(ref.types.int.size * floatArray.length);
let mbindIsNullBuf = Buffer.alloc(ref.types.char.size * floatArray.length);
floatArray.forEach((element, index) => {
ref.set(mbindLengBuf, index * ref.types.int.size, ref.types.float.size, ref.types.int)
if (element == null || element == undefined) {
ref.set(mbindIsNullBuf, index * ref.types.char.size, 1, ref.types.char);
} else {
ref.set(mbindBufferBuf, index * ref.types.float.size, element, ref.types.float);
ref.set(mbindIsNullBuf, index * ref.types.char.size, 0, ref.types.char);
}
});
let mbind = new TAOS_MULTI_BIND({
buffer_type: taosConst.C_FLOAT,
buffer: mbindBufferBuf,
buffer_length: ref.types.float.size,
length: mbindLengBuf,
is_null: mbindIsNullBuf,
num: floatArray.length,
})
return mbind;
}
/**
* To bind double through an array.
* @param {*} doubleArray is an array that stores double.
* @returns A instance of struct TAOS_MULTI_BIND that contains one column's data with double.
*/
multiBindDouble(doubleArray) {
let mbindBufferBuf = Buffer.alloc(ref.types.double.size * doubleArray.length);
let mbindLengBuf = Buffer.alloc(ref.types.int.size * doubleArray.length);
let mbindIsNullBuf = Buffer.alloc(ref.types.char.size * doubleArray.length);
doubleArray.forEach((element, index) => {
ref.set(mbindLengBuf, index * ref.types.int.size, ref.types.double.size, ref.types.int)
if (element == null || element == undefined) {
ref.set(mbindIsNullBuf, index * ref.types.char.size, 1, ref.types.char);
} else {
ref.set(mbindBufferBuf, index * ref.types.double.size, element, ref.types.double);
ref.set(mbindIsNullBuf, index * ref.types.char.size, 0, ref.types.char);
}
});
let mbind = new TAOS_MULTI_BIND({
buffer_type: taosConst.C_DOUBLE,
buffer: mbindBufferBuf,
buffer_length: ref.types.double.size,
length: mbindLengBuf,
is_null: mbindIsNullBuf,
num: doubleArray.length,
})
return mbind;
}
/**
* To bind tdengine's binary through an array.
* @param {*} strArr is an array that stores string.
* (Null string can be defined as undefined or null,notice '' is not null.)
* @returns A instance of struct TAOS_MULTI_BIND that contains one column's data with binary.
*/
multiBindBinary(strArr) {
let encoder = new TextEncoder();
let strUTF8Arr = [];
strArr.forEach(item => {
let tmpUint8Array = encoder.encode(item);
strUTF8Arr.push(tmpUint8Array);
})
let maxStrUFT8Length = this._maxUint8Array(strUTF8Arr) + 1;
let mbindBufferBuf = Buffer.alloc(maxStrUFT8Length * strArr.length);
let mbindLengBuf = Buffer.alloc(ref.types.int.size * strArr.length);
let mbindIsNullBuf = Buffer.alloc(ref.types.char.size * strArr.length);
strArr.forEach((element, index) => {
ref.set(mbindLengBuf, index * ref.types.int.size, strUTF8Arr[index].length, ref.types.int)
if (element == null || element == undefined) {
ref.set(mbindIsNullBuf, index * ref.types.char.size, 1, ref.types.char);
} else {
ref.writeCString(mbindBufferBuf, index * maxStrUFT8Length, element, 'utf8');
ref.set(mbindIsNullBuf, index * ref.types.char.size, 0, ref.types.char);
}
});
let mbind = new TAOS_MULTI_BIND({
buffer_type: taosConst.C_BINARY,
buffer: mbindBufferBuf,
buffer_length: maxStrUFT8Length,
length: mbindLengBuf,
is_null: mbindIsNullBuf,
num: strArr.length,
})
return mbind;
}
/**
* To bind timestamp through an array.
* @param {*} timestampArray is an array that stores timestamp.
* @returns A instance of struct TAOS_MULTI_BIND that contains one column's data with timestamp.
*/
multiBindTimestamp(timestampArray) {
let mbindBufferBuf = Buffer.alloc(ref.types.int64.size * timestampArray.length);
let mbindLengBuf = Buffer.alloc(ref.types.int.size * timestampArray.length);
let mbindIsNullBuf = Buffer.alloc(ref.types.char.size * timestampArray.length);
timestampArray.forEach((element, index) => {
ref.set(mbindLengBuf, index * ref.types.int.size, ref.types.int64.size, ref.types.int)
if (element == null || element == undefined) {
ref.set(mbindIsNullBuf, index * ref.types.char.size, 1, ref.types.char);
} else {
ref.writeInt64LE(mbindBufferBuf, index * ref.types.int64.size, element.toString())
ref.set(mbindIsNullBuf, index * ref.types.char.size, 0, ref.types.char);
}
});
let mbind = new TAOS_MULTI_BIND({
buffer_type: taosConst.C_TIMESTAMP,
buffer: mbindBufferBuf,
buffer_length: ref.types.int64.size,
length: mbindLengBuf,
is_null: mbindIsNullBuf,
num: timestampArray.length,
})
return mbind;
}
/**
* To bind tdengine's nchar through an array.
* @param {*} strArr is an array that stores string.
* (Null string can be defined as undefined or null,notice '' is not null.)
* @returns A instance of struct TAOS_MULTI_BIND that contains one nchar column's data with nchar.
*/
multiBindNchar(strArr) {
let encoder = new TextEncoder();
let strUTF8Arr = [];
strArr.forEach(item => {
let tmpUint8Array = encoder.encode(item);
strUTF8Arr.push(tmpUint8Array);
})
let maxStrUFT8Length = this._maxUint8Array(strUTF8Arr) + 1;
let mbindBufferBuf = Buffer.alloc(maxStrUFT8Length * strArr.length);
let mbindLengBuf = Buffer.alloc(ref.types.int.size * strArr.length);
let mbindIsNullBuf = Buffer.alloc(ref.types.char.size * strArr.length);
strArr.forEach((element, index) => {
ref.set(mbindLengBuf, index * ref.types.int.size, strUTF8Arr[index].length, ref.types.int)
if (element == null || element == undefined) {
ref.set(mbindIsNullBuf, index * ref.types.char.size, 1, ref.types.char);
} else {
ref.writeCString(mbindBufferBuf, index * maxStrUFT8Length, element, 'utf8');
ref.set(mbindIsNullBuf, index * ref.types.char.size, 0, ref.types.char);
}
});
let mbind = new TAOS_MULTI_BIND({
buffer_type: taosConst.C_NCHAR,
buffer: mbindBufferBuf,
buffer_length: maxStrUFT8Length,
length: mbindLengBuf,
is_null: mbindIsNullBuf,
num: strArr.length,
})
return mbind;
}
/**
* To bind tdengine's JSON tag through an array.
* @param {*} strArr is an array that stores string.
* (Null string can be defined as undefined or null,notice '' is not null.)
* @returns A instance of struct TAOS_MULTI_BIND that contains one nchar column's data with nchar.
*/
multiBindJSON(jsonStr) {
let strArr = [];
if(jsonStr.constructor===Array && jsonStr.length!=1){
throw new Error("Only accept bind one tag at once")
}else if (typeof(jsonStr)=='string'){
strArr.push(jsonStr)
}else if(jsonStr.constructor===Array && jsonStr.length==1){
strArr.push(jsonStr[0]);
}else{
throw new Error("Only accept bind one json tag with string or an Array with one element");
}
let encoder = new TextEncoder();
let strUTF8Arr = [];
strArr.forEach(item => {
let tmpUint8Array = encoder.encode(item);
strUTF8Arr.push(tmpUint8Array);
})
let maxStrUFT8Length = this._maxUint8Array(strUTF8Arr) + 1;
let mbindBufferBuf = Buffer.alloc(maxStrUFT8Length * strArr.length);
let mbindLengBuf = Buffer.alloc(ref.types.int.size * strArr.length);
let mbindIsNullBuf = Buffer.alloc(ref.types.char.size * strArr.length);
strArr.forEach((element, index) => {
ref.set(mbindLengBuf, index * ref.types.int.size, strUTF8Arr[index].length, ref.types.int)
if (element == null || element == undefined) {
ref.set(mbindIsNullBuf, index * ref.types.char.size, 1, ref.types.char);
} else {
ref.writeCString(mbindBufferBuf, index * maxStrUFT8Length, element, 'utf8');
ref.set(mbindIsNullBuf, index * ref.types.char.size, 0, ref.types.char);
}
});
let mbind = new TAOS_MULTI_BIND({
buffer_type: taosConst.C_JSON_TAG,
buffer: mbindBufferBuf,
buffer_length: maxStrUFT8Length,
length: mbindLengBuf,
is_null: mbindIsNullBuf,
num: strArr.length,
})
return mbind;
}
/**
* to bind unsigned tiny int through an array.
* @param {*} uTinyIntArray is an array that stores unsigned tiny int.
* @returns A instance of struct TAOS_MULTI_BIND that contains one column's data with unsigned tiny int.
*/
multiBindUTinyInt(uTinyIntArray) {
let mbindBufferBuf = Buffer.alloc(ref.types.uint8.size * uTinyIntArray.length);
let mbindLengBuf = Buffer.alloc(ref.types.int.size * uTinyIntArray.length);
let mbindIsNullBuf = Buffer.alloc(ref.types.char.size * uTinyIntArray.length);
uTinyIntArray.forEach((element, index) => {
ref.set(mbindLengBuf, index * ref.types.int.size, ref.types.uint8.size, ref.types.int)
if (element == null || element == undefined) {
ref.set(mbindIsNullBuf, index * ref.types.char.size, 1, ref.types.char);
} else {
ref.set(mbindBufferBuf, index * ref.types.uint8.size, element, ref.types.uint8);
ref.set(mbindIsNullBuf, index * ref.types.char.size, 0, ref.types.char);
}
});
let mbind = new TAOS_MULTI_BIND({
buffer_type: taosConst.C_TINYINT_UNSIGNED,
buffer: mbindBufferBuf,
buffer_length: ref.types.uint8.size,
length: mbindLengBuf,
is_null: mbindIsNullBuf,
num: uTinyIntArray.length,
})
return mbind;
}
/**
* To bind unsigned small int through an array.
* @param {*} uSmallIntArray is an array that stores unsigned small int.
* @returns A instance of struct TAOS_MULTI_BIND that contains one column's data with unsigned small int.
*/
multiBindUSmallInt(uSmallIntArray) {
let mbindBufferBuf = Buffer.alloc(ref.types.uint16.size * uSmallIntArray.length);
let mbindLengBuf = Buffer.alloc(ref.types.int.size * uSmallIntArray.length);
let mbindIsNullBuf = Buffer.alloc(ref.types.char.size * uSmallIntArray.length);
uSmallIntArray.forEach((element, index) => {
ref.set(mbindLengBuf, index * ref.types.int.size, ref.types.uint16.size, ref.types.int)
if (element == null || element == undefined) {
ref.set(mbindIsNullBuf, index * ref.types.char.size, 1, ref.types.char);
} else {
ref.set(mbindBufferBuf, index * ref.types.uint16.size, element, ref.types.uint16);
ref.set(mbindIsNullBuf, index * ref.types.char.size, 0, ref.types.char);
}
});
let mbind = new TAOS_MULTI_BIND({
buffer_type: taosConst.C_SMALLINT_UNSIGNED,
buffer: mbindBufferBuf,
buffer_length: ref.types.uint16.size,
length: mbindLengBuf,
is_null: mbindIsNullBuf,
num: uSmallIntArray.length,
})
return mbind;
}
/**
* To bind unsigned int through an array.
* @param {*} uIntArray is an array that stores unsigned int.
* @returns A instance of struct TAOS_MULTI_BIND that contains one column's data with unsigned int.
*/
multiBindUInt(uIntArray) {
let mbindBufferBuf = Buffer.alloc(ref.types.uint.size * uIntArray.length);
let mbindLengBuf = Buffer.alloc(ref.types.int.size * uIntArray.length);
let mbindIsNullBuf = Buffer.alloc(ref.types.char.size * uIntArray.length);
uIntArray.forEach((element, index) => {
ref.set(mbindLengBuf, index * ref.types.int.size, ref.types.uint.size, ref.types.int)
if (element == null || element == undefined) {
ref.set(mbindIsNullBuf, index * ref.types.char.size, 1, ref.types.char);
} else {
ref.set(mbindBufferBuf, index * ref.types.uint.size, element, ref.types.uint);
ref.set(mbindIsNullBuf, index * ref.types.char.size, 0, ref.types.char);
}
});
let mbind = new TAOS_MULTI_BIND({
buffer_type: taosConst.C_INT_UNSIGNED,
buffer: mbindBufferBuf,
buffer_length: ref.types.uint.size,
length: mbindLengBuf,
is_null: mbindIsNullBuf,
num: uIntArray.length,
})
return mbind;
}
/**
* To bind unsigned big int through an array.
* @param {*} uBigIntArray is an array that stores unsigned big int.
* @returns A instance of struct TAOS_MULTI_BIND that contains one column's data with unsigned big int.
*/
multiBindUBigInt(uBigIntArray) {
let mbindBufferBuf = Buffer.alloc(ref.types.uint64.size * uBigIntArray.length);
let mbindLengBuf = Buffer.alloc(ref.types.int.size * uBigIntArray.length);
let mbindIsNullBuf = Buffer.alloc(ref.types.char.size * uBigIntArray.length);
uBigIntArray.forEach((element, index) => {
ref.set(mbindLengBuf, index * ref.types.int.size, ref.types.uint64.size, ref.types.int)
if (element == null || element == undefined) {
ref.set(mbindIsNullBuf, index * ref.types.char.size, 1, ref.types.char);
} else {
ref.writeUInt64LE(mbindBufferBuf, index * ref.types.uint64.size, element.toString())
ref.set(mbindIsNullBuf, index * ref.types.char.size, 0, ref.types.char);
}
});
let mbind = new TAOS_MULTI_BIND({
buffer_type: taosConst.C_BIGINT_UNSIGNED,
buffer: mbindBufferBuf,
buffer_length: ref.types.uint64.size,
length: mbindLengBuf,
is_null: mbindIsNullBuf,
num: uBigIntArray.length,
})
return mbind;
}
// multiBJson(jsonArray) no need to support.Since till now TDengine only support json tag
// and there is no need to support bind json tag in TAOS_MULTI_BIND.
_maxUint8Array(strUTF8Arr) {
let max = -1;
strUTF8Arr.forEach(utf8Arr => {
if (max < utf8Arr.length) {
max = utf8Arr.length;
}
})
return max;
}
}
// console.log(TAOS_MULTI_BIND.size)
module.exports = { TaosMultiBind, TAOS_MULTI_BIND };