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/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
- const i_items_start = 8;
371
- const [len_items, value] = this.parse_vector_items(buf.subarray(i_items_start), le, type, rows);
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: i_items_start + len_items,
377
- cols: 1,
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 value = new Uint32Array(buf.buffer.slice(buf.byteOffset + value_start, buf.byteOffset + value_end));
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
- value
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,使用 urgent worker 处理,防止被其它作业阻塞
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(`sid 从 ${this.sid} 变为 ${sid}`);
1223
+ console.log(`session.id: ${this.sid} -> ${sid}`);
1104
1224
  this.sid = sid;
1105
1225
  }
1106
1226
  /** 返回对象的数量 */