dolphindb 0.0.1 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +74 -70
- package/README.zh.md +277 -0
- package/browser.d.ts +21 -7
- package/browser.js +141 -22
- package/browser.js.map +1 -1
- package/index.d.ts +17 -6
- package/index.js +131 -11
- package/index.js.map +1 -1
- package/package.json +8 -6
- package/test.js +27 -0
- package/test.js.map +1 -1
package/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DDB = exports.DdbFunction = exports.DdbPair = exports.DdbVectorAny = exports.DdbVectorDouble = exports.DdbVectorString = exports.DdbVectorInt = exports.DdbDouble = exports.DdbLong = exports.DdbString = exports.DdbInt = exports.DdbBool = exports.DdbVoid = exports.DdbObj = exports.nulls = exports.DdbFunctionType = exports.ddb_sizes = exports.DdbType = exports.DdbForm = void 0;
|
|
3
|
+
exports.DDB = exports.timestamp2str = exports.date2str = exports.DdbFunction = exports.DdbPair = exports.DdbVectorAny = exports.DdbVectorDouble = exports.DdbVectorString = exports.DdbVectorInt = exports.DdbDouble = exports.DdbLong = exports.DdbString = exports.DdbInt = exports.DdbBool = exports.DdbVoid = exports.DdbObj = exports.timezone_offset = exports.nulls = exports.DdbFunctionType = exports.ddb_sizes = exports.DdbType = exports.DdbForm = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const dayjs_1 = (0, tslib_1.__importDefault)(require("dayjs"));
|
|
4
6
|
const ws_1 = require("ws");
|
|
5
7
|
const utils_js_1 = require("xshell/utils.js");
|
|
6
8
|
var DdbForm;
|
|
@@ -109,6 +111,8 @@ exports.nulls = {
|
|
|
109
111
|
int32: -2147483648,
|
|
110
112
|
int64: -0x8000000000000000n, // -922_3372_0368_5477_5808
|
|
111
113
|
};
|
|
114
|
+
exports.timezone_offset = 1000 * 60 * new Date().getTimezoneOffset();
|
|
115
|
+
/** 可以表示所有 DolphinDB 数据库中的数据类型 */
|
|
112
116
|
class DdbObj {
|
|
113
117
|
constructor(data) {
|
|
114
118
|
/** 是否为小端 (little endian) */
|
|
@@ -367,16 +371,86 @@ class DdbObj {
|
|
|
367
371
|
static parse_vector(buf, le, type) {
|
|
368
372
|
const dv = new DataView(buf.buffer, buf.byteOffset);
|
|
369
373
|
const rows = dv.getUint32(0, le);
|
|
370
|
-
|
|
371
|
-
|
|
374
|
+
let i_items_start = 8;
|
|
375
|
+
if (type < 64 || type >= 128) {
|
|
376
|
+
const [len_items, value] = this.parse_vector_items(buf.subarray(i_items_start), le, type, rows);
|
|
377
|
+
return new this({
|
|
378
|
+
le,
|
|
379
|
+
form: DdbForm.vector,
|
|
380
|
+
type,
|
|
381
|
+
length: i_items_start + len_items,
|
|
382
|
+
cols: 1,
|
|
383
|
+
rows,
|
|
384
|
+
value,
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
// array vector
|
|
388
|
+
// av = array(INT[], 0, 3)
|
|
389
|
+
// append!(av, [1..4])
|
|
390
|
+
// append!(av, [1..70000])
|
|
391
|
+
// av
|
|
392
|
+
// <Buffer 44 01 type = array vector, form = vector
|
|
393
|
+
// 02 00 00 00 74 11 01 00 rows = 2, cols = 70004 (0x011174)
|
|
394
|
+
// block 0
|
|
395
|
+
// 01 00 block.rows = 1
|
|
396
|
+
// 04 block.unit = 4
|
|
397
|
+
// 00 reserved
|
|
398
|
+
// 04 00 00 00 block.lengths = [4]
|
|
399
|
+
// 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 block.data
|
|
400
|
+
// block 1
|
|
401
|
+
// 01 00 block.rows = 1
|
|
402
|
+
// 04 block.unit = 4
|
|
403
|
+
// 00 reserved
|
|
404
|
+
// 70 11 01 00 block.lengths = [70000 (0x00011170)]
|
|
405
|
+
// 01 00 00 00 02 00 00 00 ... 279992 more bytes> block.data
|
|
406
|
+
const cols = dv.getUint32(4, le);
|
|
407
|
+
let blocks = [];
|
|
408
|
+
let i_block_start = i_items_start;
|
|
409
|
+
// 解析一个 block
|
|
410
|
+
for (let i_row = 0; i_row < rows;) {
|
|
411
|
+
/** 对应 array vector 中元素个数 */
|
|
412
|
+
const rows = dv.getUint16(i_block_start, le);
|
|
413
|
+
/** 每个 length 占用的字节数 */
|
|
414
|
+
const unit = dv.getUint8(i_block_start + 2);
|
|
415
|
+
/** array vector 每个元素的子元素长度 */
|
|
416
|
+
let lengths;
|
|
417
|
+
const i_lengths_start = i_block_start + 4;
|
|
418
|
+
const i_data_start = i_lengths_start + rows * unit;
|
|
419
|
+
const lengths_buf = buf.slice(i_lengths_start, i_data_start);
|
|
420
|
+
switch (unit) {
|
|
421
|
+
case 1:
|
|
422
|
+
lengths = lengths_buf;
|
|
423
|
+
break;
|
|
424
|
+
case 2:
|
|
425
|
+
lengths = new Uint16Array(lengths_buf.buffer);
|
|
426
|
+
break;
|
|
427
|
+
case 4:
|
|
428
|
+
lengths = new Uint32Array(lengths_buf.buffer);
|
|
429
|
+
break;
|
|
430
|
+
default:
|
|
431
|
+
throw new Error(`array vector 存在非法 unit = ${unit}`);
|
|
432
|
+
}
|
|
433
|
+
let total_length = 0;
|
|
434
|
+
for (let i = 0; i < lengths.length; i++)
|
|
435
|
+
total_length += lengths[i];
|
|
436
|
+
const [len_items, data] = this.parse_vector_items(buf.subarray(i_data_start), le, type - 64, total_length);
|
|
437
|
+
blocks.push({
|
|
438
|
+
unit,
|
|
439
|
+
rows,
|
|
440
|
+
lengths,
|
|
441
|
+
data
|
|
442
|
+
});
|
|
443
|
+
i_block_start = i_data_start + len_items;
|
|
444
|
+
i_row += rows;
|
|
445
|
+
}
|
|
372
446
|
return new this({
|
|
373
447
|
le,
|
|
374
448
|
form: DdbForm.vector,
|
|
375
449
|
type,
|
|
376
|
-
length:
|
|
377
|
-
cols
|
|
450
|
+
length: i_block_start,
|
|
451
|
+
cols,
|
|
378
452
|
rows,
|
|
379
|
-
value
|
|
453
|
+
value: blocks
|
|
380
454
|
});
|
|
381
455
|
}
|
|
382
456
|
/** 有可能没有字节对齐,不能直接使用原有 message 的 arraybuffer, 统一复制出来,让原有 arraybuffer 被回收掉比较好 */
|
|
@@ -457,13 +531,13 @@ class DdbObj {
|
|
|
457
531
|
}
|
|
458
532
|
const value_start = 8 + base_length;
|
|
459
533
|
const value_end = value_start + length * 4;
|
|
460
|
-
const
|
|
534
|
+
const data = new Uint32Array(buf.buffer.slice(buf.byteOffset + value_start, buf.byteOffset + value_end));
|
|
461
535
|
return [
|
|
462
536
|
value_end,
|
|
463
537
|
{
|
|
464
538
|
base_id,
|
|
465
539
|
base,
|
|
466
|
-
|
|
540
|
+
data
|
|
467
541
|
}
|
|
468
542
|
];
|
|
469
543
|
}
|
|
@@ -588,11 +662,24 @@ class DdbObj {
|
|
|
588
662
|
return [Float64Array.from(this.value)];
|
|
589
663
|
case DdbType.duration:
|
|
590
664
|
return [value];
|
|
665
|
+
case DdbType.handle:
|
|
666
|
+
throw new Error('DolphinDB Server 不支持 handle 的反序列化');
|
|
591
667
|
default:
|
|
592
668
|
throw new Error(`${DdbType[type]} 暂时不支持序列化`);
|
|
593
669
|
}
|
|
594
670
|
case DdbForm.vector:
|
|
595
671
|
case DdbForm.pair:
|
|
672
|
+
// pack array vector
|
|
673
|
+
if (form === DdbForm.vector && 64 <= type && type < 128)
|
|
674
|
+
return [
|
|
675
|
+
Uint32Array.of(this.rows, this.cols),
|
|
676
|
+
...this.value.map(block => ([
|
|
677
|
+
Uint16Array.of(block.rows),
|
|
678
|
+
Uint8Array.of(block.unit, 0),
|
|
679
|
+
block.lengths,
|
|
680
|
+
block.data
|
|
681
|
+
])).flat()
|
|
682
|
+
];
|
|
596
683
|
return [
|
|
597
684
|
Uint32Array.of(this.rows, 1),
|
|
598
685
|
...DdbObj.pack_vector_body(value, type, this.rows)
|
|
@@ -708,6 +795,14 @@ class DdbObj {
|
|
|
708
795
|
bufs[i] = value[i].pack();
|
|
709
796
|
return bufs;
|
|
710
797
|
}
|
|
798
|
+
case DdbType.symbol_extended: {
|
|
799
|
+
const { base_id, base, data } = value;
|
|
800
|
+
return [
|
|
801
|
+
Uint32Array.of(base_id, base.length),
|
|
802
|
+
...this.pack_vector_body(base, DdbType.string, base.length),
|
|
803
|
+
data
|
|
804
|
+
];
|
|
805
|
+
}
|
|
711
806
|
default:
|
|
712
807
|
throw new Error(`vector ${DdbType[type]} 暂不支持序列化`);
|
|
713
808
|
}
|
|
@@ -721,6 +816,8 @@ class DdbObj {
|
|
|
721
816
|
return `functiondef<${DdbFunctionType[this.value.type]}>`;
|
|
722
817
|
return tname;
|
|
723
818
|
case DdbForm.vector:
|
|
819
|
+
if (64 <= this.type && this.type < 128)
|
|
820
|
+
return `${DdbType[this.type - 64]}[][${this.rows}]`;
|
|
724
821
|
return `${tname}[${this.rows}]`;
|
|
725
822
|
case DdbForm.pair:
|
|
726
823
|
return `pair<${tname}>`;
|
|
@@ -747,6 +844,15 @@ class DdbObj {
|
|
|
747
844
|
})();
|
|
748
845
|
return `${type.blue}(${this.name ? `${(0, utils_js_1.inspect)(this.name)}, ` : ''}${data})`;
|
|
749
846
|
}
|
|
847
|
+
to_dict() {
|
|
848
|
+
if (this.form !== DdbForm.dict)
|
|
849
|
+
throw new Error('this.form 不是 dict, 不能转换为 Object');
|
|
850
|
+
const [{ value: keys }, { value: values }] = this.value;
|
|
851
|
+
let obj = {};
|
|
852
|
+
for (let i = 0; i < this.rows; i++)
|
|
853
|
+
obj[keys[i]] = values[i].value;
|
|
854
|
+
return obj;
|
|
855
|
+
}
|
|
750
856
|
}
|
|
751
857
|
exports.DdbObj = DdbObj;
|
|
752
858
|
DdbObj.dec = new TextDecoder('utf-8');
|
|
@@ -896,6 +1002,20 @@ class DdbFunction extends DdbObj {
|
|
|
896
1002
|
}
|
|
897
1003
|
}
|
|
898
1004
|
exports.DdbFunction = DdbFunction;
|
|
1005
|
+
function date2str(date) {
|
|
1006
|
+
return date === exports.nulls.int32 ?
|
|
1007
|
+
''
|
|
1008
|
+
:
|
|
1009
|
+
(0, dayjs_1.default)(exports.timezone_offset + 1000 * 3600 * 24 * date).format('YYYY.MM.DD');
|
|
1010
|
+
}
|
|
1011
|
+
exports.date2str = date2str;
|
|
1012
|
+
function timestamp2str(timestamp) {
|
|
1013
|
+
return timestamp === exports.nulls.int64 ?
|
|
1014
|
+
''
|
|
1015
|
+
:
|
|
1016
|
+
(0, dayjs_1.default)(exports.timezone_offset + Number(timestamp)).format('YYYY.MM.DD HH:mm:ss.SSS');
|
|
1017
|
+
}
|
|
1018
|
+
exports.timestamp2str = timestamp2str;
|
|
899
1019
|
class DDB {
|
|
900
1020
|
constructor(ws_url) {
|
|
901
1021
|
this.port = 8848;
|
|
@@ -972,7 +1092,7 @@ class DDB {
|
|
|
972
1092
|
disconnect() {
|
|
973
1093
|
this.ws?.close(1000);
|
|
974
1094
|
}
|
|
975
|
-
/** rpc through websocket (function command)
|
|
1095
|
+
/** rpc through websocket (function/script/variable command)
|
|
976
1096
|
- type: API 类型: 'script' | 'function' | 'variable'
|
|
977
1097
|
- options:
|
|
978
1098
|
- urgent?: 决定 `行为标识` 那一行字符串的取值(只适用于 script 和 function)
|
|
@@ -1047,7 +1167,7 @@ class DDB {
|
|
|
1047
1167
|
- func: 函数名
|
|
1048
1168
|
- args?: `[ ]` 调用参数 (传入的原生 string 和 boolean 会被自动转换为 DdbObj<string> 和 DdbObj<boolean>)
|
|
1049
1169
|
- options?: 调用选项
|
|
1050
|
-
- urgent?: 紧急 flag
|
|
1170
|
+
- urgent?: 紧急 flag。使用 urgent worker 执行,防止被其它作业阻塞
|
|
1051
1171
|
- node?: 设置结点 alias 时发送到集群中对应的结点执行 (使用 DolphinDB 中的 rpc 方法)
|
|
1052
1172
|
- nodes?: 设置多个结点 alias 时发送到集群中对应的多个结点执行 (使用 DolphinDB 中的 pnodeRun 方法)
|
|
1053
1173
|
- func_type?: 设置 node 参数时必传,需指定函数类型,其它情况下不传
|
|
@@ -1100,7 +1220,7 @@ class DDB {
|
|
|
1100
1220
|
/** session id */
|
|
1101
1221
|
const sid = parts[0];
|
|
1102
1222
|
if (sid !== this.sid) {
|
|
1103
|
-
console.log(`
|
|
1223
|
+
console.log(`session.id: ${this.sid} -> ${sid}`);
|
|
1104
1224
|
this.sid = sid;
|
|
1105
1225
|
}
|
|
1106
1226
|
/** 返回对象的数量 */
|