w-orm-lmdb 1.0.17 → 1.0.19
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/README.md +44 -1
- package/dist/req-mingo.umd.js +1 -1
- package/dist/w-orm-lmdb.umd.js +2 -2
- package/dist/w-orm-lmdb.umd.js.map +1 -1
- package/docs/WOrmLmdb.html +189 -10
- package/docs/WOrmLmdb.mjs.html +202 -64
- package/docs/index.html +2 -2
- package/g-basic.mjs +43 -0
- package/package.json +1 -1
- package/src/WOrmLmdb.mjs +200 -62
- package/test/unit-event.test.mjs +242 -0
- package/test/unit-insertbulk.test.mjs +205 -0
- package//350/263/207/346/226/231/345/272/253/345/207/275/346/225/270/345/233/236/345/202/263/345/256/232/347/276/251/350/250/210/347/256/227.md +239 -35
package/docs/WOrmLmdb.html
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<nav >
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmLmdb.html">WOrmLmdb</a><ul class='methods'><li data-type='method'><a href="WOrmLmdb.html#.del">del</a></li><li data-type='method'><a href="WOrmLmdb.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmLmdb.html#.insert">insert</a></li><li data-type='method'><a href="WOrmLmdb.html#.save">save</a></li><li data-type='method'><a href="WOrmLmdb.html#.select">select</a></li><li data-type='method'><a href="WOrmLmdb.html#.selectByPk">selectByPk</a></li></ul></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmLmdb.html">WOrmLmdb</a><ul class='methods'><li data-type='method'><a href="WOrmLmdb.html#.del">del</a></li><li data-type='method'><a href="WOrmLmdb.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmLmdb.html#.insert">insert</a></li><li data-type='method'><a href="WOrmLmdb.html#.insertBulk">insertBulk</a></li><li data-type='method'><a href="WOrmLmdb.html#.save">save</a></li><li data-type='method'><a href="WOrmLmdb.html#.select">select</a></li><li data-type='method'><a href="WOrmLmdb.html#.selectByPk">selectByPk</a></li></ul></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -74,13 +74,27 @@
|
|
|
74
74
|
<dl class="details">
|
|
75
75
|
|
|
76
76
|
<dt class="tag-description">Description:</dt>
|
|
77
|
-
<dd class="tag-description"><ul class="dummy"><li><p>操作資料庫(LMDB)</p
|
|
77
|
+
<dd class="tag-description"><ul class="dummy"><li><p>操作資料庫(LMDB)</p>
|
|
78
|
+
<p>回傳物件為EventEmitter,除各操作函數外另發出change與error兩事件,供呼叫端於單一處集中觀察資料異動與失敗。
|
|
79
|
+
事件僅為附加通知,其所送出之資訊皆另有正規管道(操作結果經resolve、整批性錯誤經reject、逐筆失敗經該筆之err欄位),
|
|
80
|
+
故不監聽亦能取得完整資訊,且監聽與否不改變任何操作之回傳值。</p>
|
|
81
|
+
<p>change事件,參數為(mode, data, res),於資料實際異動成功後發出:
|
|
82
|
+
mode為操作別字串,可為'insert'、'insertBulk'、'save'、'del'、'delAll';save內若逐筆走自動插入則該筆另發出mode為'insert'之事件。
|
|
83
|
+
data為本次操作之輸入數據,delAll固定為null。
|
|
84
|
+
res為本次操作之回傳結果。
|
|
85
|
+
逐筆函數以整批為單位發出一次而不逐筆發出,select與selectByPk不發出本事件。</p>
|
|
86
|
+
<p>error事件,參數為(mode, data, err),於操作發生錯誤時發出:
|
|
87
|
+
mode為操作別字串,可為'select'、'selectByPk'、'insert'、'insertBulk'、'save'、'del'、'delAll'。
|
|
88
|
+
data為本次操作之輸入數據,無輸入數據者為null。
|
|
89
|
+
err為錯誤訊息字串,內容與正規管道所送出者一致。
|
|
90
|
+
整批性錯誤於reject之前發出;逐筆失敗於該筆結果定案後發出,每筆一次。
|
|
91
|
+
註: 逐筆失敗時整批仍resolve,故收到本事件不表示該次呼叫失敗;正常結果(如查無數據、主鍵未命中、全數已存在)不發出本事件。</p></li></ul></dd>
|
|
78
92
|
|
|
79
93
|
|
|
80
94
|
|
|
81
95
|
<dt class="tag-source">Source:</dt>
|
|
82
96
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
83
|
-
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#
|
|
97
|
+
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#line52">line 52</a>
|
|
84
98
|
</li></ul></dd>
|
|
85
99
|
|
|
86
100
|
|
|
@@ -509,7 +523,7 @@
|
|
|
509
523
|
|
|
510
524
|
<dt class="tag-source">Source:</dt>
|
|
511
525
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
512
|
-
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#
|
|
526
|
+
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#line714">line 714</a>
|
|
513
527
|
</li></ul></dd>
|
|
514
528
|
|
|
515
529
|
|
|
@@ -670,7 +684,7 @@
|
|
|
670
684
|
|
|
671
685
|
<dt class="tag-source">Source:</dt>
|
|
672
686
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
673
|
-
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#
|
|
687
|
+
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#line845">line 845</a>
|
|
674
688
|
</li></ul></dd>
|
|
675
689
|
|
|
676
690
|
|
|
@@ -848,7 +862,7 @@
|
|
|
848
862
|
|
|
849
863
|
<dt class="tag-source">Source:</dt>
|
|
850
864
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
851
|
-
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#
|
|
865
|
+
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#line325">line 325</a>
|
|
852
866
|
</li></ul></dd>
|
|
853
867
|
|
|
854
868
|
|
|
@@ -993,6 +1007,171 @@
|
|
|
993
1007
|
|
|
994
1008
|
|
|
995
1009
|
|
|
1010
|
+
<h4 class="name" id=".insertBulk"><span class="type-signature type-signature-async, static">(async, static) </span>insertBulk<span class="signature">(data)</span><span class="type-signature"> → {Promise}</span></h4>
|
|
1011
|
+
|
|
1012
|
+
|
|
1013
|
+
|
|
1014
|
+
|
|
1015
|
+
|
|
1016
|
+
|
|
1017
|
+
<dl class="details">
|
|
1018
|
+
|
|
1019
|
+
<dt class="tag-description">Description:</dt>
|
|
1020
|
+
<dd class="tag-description"><ul class="dummy"><li><p>批次插入數據,全批視為一個單位,全部插入成功或一筆都不寫入
|
|
1021
|
+
註: 本函數非insert之加速版,兩者衝突政策不同。insert於主鍵已存在時跳過該筆而整批ok為1,
|
|
1022
|
+
本函數則整批reject且不寫入任何一筆;同批含重複主鍵者亦視為衝突。確無衝突時兩者結果相同
|
|
1023
|
+
註: 於本套件不會較insert快,因insert本即以Promise.all一次送出全部條件寫入而非逐筆await,
|
|
1024
|
+
提供本函數係為與其他w-orm系列套件維持同一組函數,令呼叫端得於各套件間替換而不須改寫呼叫</p></li></ul></dd>
|
|
1025
|
+
|
|
1026
|
+
|
|
1027
|
+
|
|
1028
|
+
<dt class="tag-source">Source:</dt>
|
|
1029
|
+
<dd class="tag-source"><ul class="dummy"><li>
|
|
1030
|
+
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#line421">line 421</a>
|
|
1031
|
+
</li></ul></dd>
|
|
1032
|
+
|
|
1033
|
+
|
|
1034
|
+
|
|
1035
|
+
|
|
1036
|
+
|
|
1037
|
+
|
|
1038
|
+
|
|
1039
|
+
|
|
1040
|
+
|
|
1041
|
+
|
|
1042
|
+
|
|
1043
|
+
|
|
1044
|
+
|
|
1045
|
+
|
|
1046
|
+
|
|
1047
|
+
|
|
1048
|
+
|
|
1049
|
+
|
|
1050
|
+
|
|
1051
|
+
|
|
1052
|
+
|
|
1053
|
+
|
|
1054
|
+
|
|
1055
|
+
|
|
1056
|
+
|
|
1057
|
+
|
|
1058
|
+
|
|
1059
|
+
|
|
1060
|
+
|
|
1061
|
+
|
|
1062
|
+
|
|
1063
|
+
</dl>
|
|
1064
|
+
|
|
1065
|
+
|
|
1066
|
+
|
|
1067
|
+
|
|
1068
|
+
|
|
1069
|
+
|
|
1070
|
+
|
|
1071
|
+
|
|
1072
|
+
|
|
1073
|
+
|
|
1074
|
+
|
|
1075
|
+
|
|
1076
|
+
|
|
1077
|
+
<h5 class="h5-parameters">Parameters:</h5>
|
|
1078
|
+
|
|
1079
|
+
|
|
1080
|
+
<table class="params">
|
|
1081
|
+
<thead>
|
|
1082
|
+
<tr>
|
|
1083
|
+
|
|
1084
|
+
<th>Name</th>
|
|
1085
|
+
|
|
1086
|
+
|
|
1087
|
+
<th>Type</th>
|
|
1088
|
+
|
|
1089
|
+
|
|
1090
|
+
|
|
1091
|
+
|
|
1092
|
+
|
|
1093
|
+
<th class="last">Description</th>
|
|
1094
|
+
</tr>
|
|
1095
|
+
</thead>
|
|
1096
|
+
|
|
1097
|
+
<tbody>
|
|
1098
|
+
|
|
1099
|
+
|
|
1100
|
+
<tr>
|
|
1101
|
+
|
|
1102
|
+
<td class="name"><code>data</code></td>
|
|
1103
|
+
|
|
1104
|
+
|
|
1105
|
+
<td class="type">
|
|
1106
|
+
|
|
1107
|
+
|
|
1108
|
+
<span class="param-type">Object</span>
|
|
1109
|
+
|
|
|
1110
|
+
|
|
1111
|
+
<span class="param-type">Array</span>
|
|
1112
|
+
|
|
1113
|
+
|
|
1114
|
+
|
|
1115
|
+
|
|
1116
|
+
</td>
|
|
1117
|
+
|
|
1118
|
+
|
|
1119
|
+
|
|
1120
|
+
|
|
1121
|
+
|
|
1122
|
+
<td class="description last"><p>輸入數據物件或陣列</p></td>
|
|
1123
|
+
</tr>
|
|
1124
|
+
|
|
1125
|
+
|
|
1126
|
+
</tbody>
|
|
1127
|
+
</table>
|
|
1128
|
+
|
|
1129
|
+
|
|
1130
|
+
|
|
1131
|
+
|
|
1132
|
+
|
|
1133
|
+
|
|
1134
|
+
|
|
1135
|
+
|
|
1136
|
+
|
|
1137
|
+
|
|
1138
|
+
|
|
1139
|
+
|
|
1140
|
+
|
|
1141
|
+
|
|
1142
|
+
|
|
1143
|
+
|
|
1144
|
+
<h5 class="h5-returns">Returns:</h5>
|
|
1145
|
+
|
|
1146
|
+
|
|
1147
|
+
<div class="param-desc">
|
|
1148
|
+
<p>回傳Promise,resolve回傳插入結果物件{n,nInserted,ok},n為輸入筆數、nInserted成功時恆等於n,任一筆主鍵已存在則reject回傳錯誤訊息</p>
|
|
1149
|
+
</div>
|
|
1150
|
+
|
|
1151
|
+
|
|
1152
|
+
|
|
1153
|
+
<dl class="param-type">
|
|
1154
|
+
<dt>
|
|
1155
|
+
Type
|
|
1156
|
+
</dt>
|
|
1157
|
+
<dd>
|
|
1158
|
+
|
|
1159
|
+
<span class="param-type">Promise</span>
|
|
1160
|
+
|
|
1161
|
+
|
|
1162
|
+
|
|
1163
|
+
</dd>
|
|
1164
|
+
</dl>
|
|
1165
|
+
|
|
1166
|
+
|
|
1167
|
+
|
|
1168
|
+
|
|
1169
|
+
|
|
1170
|
+
|
|
1171
|
+
|
|
1172
|
+
|
|
1173
|
+
|
|
1174
|
+
|
|
996
1175
|
<h4 class="name" id=".save"><span class="type-signature type-signature-async, static">(async, static) </span>save<span class="signature">(data, option<span class="signature-attributes">opt</span>)</span><span class="type-signature"> → {Promise}</span></h4>
|
|
997
1176
|
|
|
998
1177
|
|
|
@@ -1009,7 +1188,7 @@
|
|
|
1009
1188
|
|
|
1010
1189
|
<dt class="tag-source">Source:</dt>
|
|
1011
1190
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
1012
|
-
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#
|
|
1191
|
+
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#line513">line 513</a>
|
|
1013
1192
|
</li></ul></dd>
|
|
1014
1193
|
|
|
1015
1194
|
|
|
@@ -1296,7 +1475,7 @@
|
|
|
1296
1475
|
|
|
1297
1476
|
<dt class="tag-source">Source:</dt>
|
|
1298
1477
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
1299
|
-
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#
|
|
1478
|
+
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#line214">line 214</a>
|
|
1300
1479
|
</li></ul></dd>
|
|
1301
1480
|
|
|
1302
1481
|
|
|
@@ -1475,7 +1654,7 @@
|
|
|
1475
1654
|
|
|
1476
1655
|
<dt class="tag-source">Source:</dt>
|
|
1477
1656
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
1478
|
-
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#
|
|
1657
|
+
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#line273">line 273</a>
|
|
1479
1658
|
</li></ul></dd>
|
|
1480
1659
|
|
|
1481
1660
|
|
|
@@ -1632,7 +1811,7 @@
|
|
|
1632
1811
|
<br class="clear">
|
|
1633
1812
|
|
|
1634
1813
|
<footer>
|
|
1635
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Aug 17 2026
|
|
1814
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Aug 17 2026 11:00:07 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
1636
1815
|
</footer>
|
|
1637
1816
|
|
|
1638
1817
|
<script>prettyPrint();</script>
|
package/docs/WOrmLmdb.mjs.html
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
<nav >
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmLmdb.html">WOrmLmdb</a><ul class='methods'><li data-type='method'><a href="WOrmLmdb.html#.del">del</a></li><li data-type='method'><a href="WOrmLmdb.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmLmdb.html#.insert">insert</a></li><li data-type='method'><a href="WOrmLmdb.html#.save">save</a></li><li data-type='method'><a href="WOrmLmdb.html#.select">select</a></li><li data-type='method'><a href="WOrmLmdb.html#.selectByPk">selectByPk</a></li></ul></li></ul>
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmLmdb.html">WOrmLmdb</a><ul class='methods'><li data-type='method'><a href="WOrmLmdb.html#.del">del</a></li><li data-type='method'><a href="WOrmLmdb.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmLmdb.html#.insert">insert</a></li><li data-type='method'><a href="WOrmLmdb.html#.insertBulk">insertBulk</a></li><li data-type='method'><a href="WOrmLmdb.html#.save">save</a></li><li data-type='method'><a href="WOrmLmdb.html#.select">select</a></li><li data-type='method'><a href="WOrmLmdb.html#.selectByPk">selectByPk</a></li></ul></li></ul>
|
|
33
33
|
|
|
34
34
|
</nav>
|
|
35
35
|
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
|
|
46
46
|
<section>
|
|
47
47
|
<article>
|
|
48
|
-
<pre class="prettyprint source linenums"><code>import { open } from 'lmdb'
|
|
48
|
+
<pre class="prettyprint source linenums"><code>import { open, ABORT } from 'lmdb'
|
|
49
49
|
// import mingo from 'mingo' //mingo內未更新import寫法, 會導致ERR_UNSUPPORTED_DIR_IMPORT, 故須改用require引入使用
|
|
50
50
|
import mingo from './reqMingo.js'
|
|
51
51
|
import size from 'lodash-es/size.js'
|
|
@@ -70,6 +70,23 @@ import waitFun from 'wsemi/src/waitFun.mjs'
|
|
|
70
70
|
/**
|
|
71
71
|
* 操作資料庫(LMDB)
|
|
72
72
|
*
|
|
73
|
+
* 回傳物件為EventEmitter,除各操作函數外另發出change與error兩事件,供呼叫端於單一處集中觀察資料異動與失敗。
|
|
74
|
+
* 事件僅為附加通知,其所送出之資訊皆另有正規管道(操作結果經resolve、整批性錯誤經reject、逐筆失敗經該筆之err欄位),
|
|
75
|
+
* 故不監聽亦能取得完整資訊,且監聽與否不改變任何操作之回傳值。
|
|
76
|
+
*
|
|
77
|
+
* change事件,參數為(mode, data, res),於資料實際異動成功後發出:
|
|
78
|
+
* mode為操作別字串,可為'insert'、'insertBulk'、'save'、'del'、'delAll';save內若逐筆走自動插入則該筆另發出mode為'insert'之事件。
|
|
79
|
+
* data為本次操作之輸入數據,delAll固定為null。
|
|
80
|
+
* res為本次操作之回傳結果。
|
|
81
|
+
* 逐筆函數以整批為單位發出一次而不逐筆發出,select與selectByPk不發出本事件。
|
|
82
|
+
*
|
|
83
|
+
* error事件,參數為(mode, data, err),於操作發生錯誤時發出:
|
|
84
|
+
* mode為操作別字串,可為'select'、'selectByPk'、'insert'、'insertBulk'、'save'、'del'、'delAll'。
|
|
85
|
+
* data為本次操作之輸入數據,無輸入數據者為null。
|
|
86
|
+
* err為錯誤訊息字串,內容與正規管道所送出者一致。
|
|
87
|
+
* 整批性錯誤於reject之前發出;逐筆失敗於該筆結果定案後發出,每筆一次。
|
|
88
|
+
* 註: 逐筆失敗時整批仍resolve,故收到本事件不表示該次呼叫失敗;正常結果(如查無數據、主鍵未命中、全數已存在)不發出本事件。
|
|
89
|
+
*
|
|
73
90
|
* @class
|
|
74
91
|
* @param {Object} [opt={}] 輸入設定物件,預設{}
|
|
75
92
|
* @param {String} [opt.url='_db'] 輸入資料庫用資料夾字串,預設'_db'
|
|
@@ -165,7 +182,30 @@ function WOrmLmdb(opt = {}) {
|
|
|
165
182
|
})
|
|
166
183
|
}
|
|
167
184
|
|
|
168
|
-
//
|
|
185
|
+
//emitChange, 資料實際異動成功後發出, 事件僅為附加通知不承擔回傳義務
|
|
186
|
+
//一律包try/catch, 令訂閱函數自身拋錯不影響本次操作之結果
|
|
187
|
+
let emitChange = (mode, data, res) => {
|
|
188
|
+
try {
|
|
189
|
+
ee.emit('change', mode, data, res)
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
console.log(err)
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
//emitError, 操作發生錯誤時發出, 錯誤訊息一律轉為字串
|
|
197
|
+
//此try/catch除攔訂閱函數之例外外另有必要: Node之EventEmitter於'error'無監聽者時會將錯誤直接拋出,
|
|
198
|
+
//若不攔則同一次操作會因呼叫端有無註冊監聽而走向不同結果
|
|
199
|
+
let emitError = (mode, data, err) => {
|
|
200
|
+
try {
|
|
201
|
+
ee.emit('error', mode, data, getErrMsg(err))
|
|
202
|
+
}
|
|
203
|
+
catch (errEmit) {
|
|
204
|
+
console.log(errEmit)
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
//getErrMsg, 取錯誤訊息字串, 供逐筆結果之err欄位與error事件使用
|
|
169
209
|
let getErrMsg = (err) => {
|
|
170
210
|
let m = get(err, 'message')
|
|
171
211
|
if (isestr(m)) {
|
|
@@ -259,6 +299,10 @@ function WOrmLmdb(opt = {}) {
|
|
|
259
299
|
|
|
260
300
|
//check
|
|
261
301
|
if (isErr) {
|
|
302
|
+
|
|
303
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
304
|
+
emitError('select', null, res)
|
|
305
|
+
|
|
262
306
|
return Promise.reject(res)
|
|
263
307
|
}
|
|
264
308
|
|
|
@@ -308,6 +352,10 @@ function WOrmLmdb(opt = {}) {
|
|
|
308
352
|
|
|
309
353
|
//check
|
|
310
354
|
if (isErr) {
|
|
355
|
+
|
|
356
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
357
|
+
emitError('selectByPk', null, res)
|
|
358
|
+
|
|
311
359
|
return Promise.reject(res)
|
|
312
360
|
}
|
|
313
361
|
|
|
@@ -391,19 +439,109 @@ function WOrmLmdb(opt = {}) {
|
|
|
391
439
|
|
|
392
440
|
//emit, 於change可能須使用select, 故須放在重設快取之後
|
|
393
441
|
if (!isErr) {
|
|
394
|
-
|
|
442
|
+
emitChange('insert', data, res)
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
//check
|
|
446
|
+
if (isErr) {
|
|
447
|
+
|
|
448
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
449
|
+
emitError('insert', data, res)
|
|
450
|
+
|
|
451
|
+
return Promise.reject(res)
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
return res
|
|
455
|
+
}
|
|
395
456
|
|
|
396
|
-
|
|
397
|
-
|
|
457
|
+
/**
|
|
458
|
+
* 批次插入數據,全批視為一個單位,全部插入成功或一筆都不寫入
|
|
459
|
+
* 註: 本函數非insert之加速版,兩者衝突政策不同。insert於主鍵已存在時跳過該筆而整批ok為1,
|
|
460
|
+
* 本函數則整批reject且不寫入任何一筆;同批含重複主鍵者亦視為衝突。確無衝突時兩者結果相同
|
|
461
|
+
* 註: 於本套件不會較insert快,因insert本即以Promise.all一次送出全部條件寫入而非逐筆await,
|
|
462
|
+
* 提供本函數係為與其他w-orm系列套件維持同一組函數,令呼叫端得於各套件間替換而不須改寫呼叫
|
|
463
|
+
*
|
|
464
|
+
* @memberOf WOrmLmdb
|
|
465
|
+
* @param {Object|Array} data 輸入數據物件或陣列
|
|
466
|
+
* @returns {Promise} 回傳Promise,resolve回傳插入結果物件{n,nInserted,ok},n為輸入筆數、nInserted成功時恆等於n,任一筆主鍵已存在則reject回傳錯誤訊息
|
|
467
|
+
*/
|
|
468
|
+
async function insertBulk(data) {
|
|
469
|
+
let isErr = false
|
|
470
|
+
|
|
471
|
+
//check
|
|
472
|
+
if (!iseobj(data) && !isearr(data)) {
|
|
473
|
+
return {
|
|
474
|
+
n: 0,
|
|
475
|
+
nInserted: 0,
|
|
476
|
+
ok: 1,
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
//cloneDeep, 與外部數據脫勾
|
|
481
|
+
data = cloneDeep(data)
|
|
482
|
+
|
|
483
|
+
//res
|
|
484
|
+
let res = null
|
|
485
|
+
try {
|
|
486
|
+
|
|
487
|
+
//check
|
|
488
|
+
if (!isarr(data)) {
|
|
489
|
+
data = [data]
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
//check id
|
|
493
|
+
data = procPk(data, 'insertBulk')
|
|
494
|
+
|
|
495
|
+
//nAll
|
|
496
|
+
let nAll = size(data)
|
|
497
|
+
|
|
498
|
+
//childTransaction, 全有全無由交易回滾保證
|
|
499
|
+
//註: 非同步之client.transaction於中止時並不回滾, 實測其內之put仍會落盤, 故此處須用childTransaction
|
|
500
|
+
//註: 交易內之client.get讀得到同一交易稍早之put, 故同批含重複主鍵者亦會於此被偵測為衝突
|
|
501
|
+
//註: 存在與否採鍵層判定, 與insert之ifNoExists一致
|
|
502
|
+
let pkConflict = null
|
|
503
|
+
await client.childTransaction(() => {
|
|
504
|
+
for (let v of data) {
|
|
505
|
+
if (client.get(v.id) !== undefined) {
|
|
506
|
+
pkConflict = v.id
|
|
507
|
+
return ABORT
|
|
508
|
+
}
|
|
509
|
+
client.put(v.id, v)
|
|
510
|
+
}
|
|
511
|
+
})
|
|
398
512
|
|
|
513
|
+
//check, 衝突則整批視為失敗, 交易已回滾故無任何寫入
|
|
514
|
+
if (isestr(pkConflict)) {
|
|
515
|
+
throw new Error(`can not insertBulk by existed id[${pkConflict}]`)
|
|
399
516
|
}
|
|
400
|
-
|
|
401
|
-
|
|
517
|
+
|
|
518
|
+
//res, 未衝突則全數插入, 故nInserted恆等於n
|
|
519
|
+
res = {
|
|
520
|
+
n: nAll,
|
|
521
|
+
nInserted: nAll,
|
|
522
|
+
ok: 1,
|
|
402
523
|
}
|
|
524
|
+
|
|
525
|
+
}
|
|
526
|
+
catch (err) {
|
|
527
|
+
isErr = true
|
|
528
|
+
res = err
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
//update, 不能保證插入多少, 一律重設快取
|
|
532
|
+
_cache = null
|
|
533
|
+
|
|
534
|
+
//emit, 於change可能須使用select, 故須放在重設快取之後
|
|
535
|
+
if (!isErr) {
|
|
536
|
+
emitChange('insertBulk', data, res)
|
|
403
537
|
}
|
|
404
538
|
|
|
405
539
|
//check
|
|
406
540
|
if (isErr) {
|
|
541
|
+
|
|
542
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
543
|
+
emitError('insertBulk', data, res)
|
|
544
|
+
|
|
407
545
|
return Promise.reject(res)
|
|
408
546
|
}
|
|
409
547
|
|
|
@@ -572,16 +710,15 @@ function WOrmLmdb(opt = {}) {
|
|
|
572
710
|
//update, 不能保證插入多少, 一律重設快取
|
|
573
711
|
_cache = null
|
|
574
712
|
|
|
575
|
-
|
|
713
|
+
//emit
|
|
714
|
+
emitChange('insert', [v], rest)
|
|
576
715
|
|
|
577
|
-
|
|
578
|
-
ee.emit('change', 'insert', [v], rest)
|
|
579
|
-
|
|
580
|
-
}
|
|
581
|
-
catch (err) {
|
|
582
|
-
console.log(err)
|
|
583
|
-
}
|
|
716
|
+
}
|
|
584
717
|
|
|
718
|
+
//emit, 逐筆失敗於該筆結果定案後發出, 每筆一次
|
|
719
|
+
//此事件之發出不表示整批失敗, 整批仍resolve, 該筆以ok為0回報
|
|
720
|
+
if (rest.ok === 0) {
|
|
721
|
+
emitError('save', [v], rest.err)
|
|
585
722
|
}
|
|
586
723
|
|
|
587
724
|
return rest
|
|
@@ -597,20 +734,17 @@ function WOrmLmdb(opt = {}) {
|
|
|
597
734
|
_cache = null
|
|
598
735
|
|
|
599
736
|
//emit, 於change可能須使用select, 故須放在重設快取之後
|
|
737
|
+
//逐筆失敗之error事件已於各筆定案時發出, 故必早於本整批change
|
|
600
738
|
if (!isErr) {
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
//emit
|
|
604
|
-
ee.emit('change', 'save', data, res)
|
|
605
|
-
|
|
606
|
-
}
|
|
607
|
-
catch (err) {
|
|
608
|
-
console.log(err)
|
|
609
|
-
}
|
|
739
|
+
emitChange('save', data, res)
|
|
610
740
|
}
|
|
611
741
|
|
|
612
742
|
//check
|
|
613
743
|
if (isErr) {
|
|
744
|
+
|
|
745
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
746
|
+
emitError('save', data, res)
|
|
747
|
+
|
|
614
748
|
return Promise.reject(res)
|
|
615
749
|
}
|
|
616
750
|
|
|
@@ -659,38 +793,42 @@ function WOrmLmdb(opt = {}) {
|
|
|
659
793
|
if (!isestr(id)) {
|
|
660
794
|
//未給有效v.id視為該筆數據有問題而無法處理, 以ok為0並附err回報,
|
|
661
795
|
//與[已給v.id但查無數據]之ok為1有別, 二者須可由ok分辨
|
|
662
|
-
return
|
|
796
|
+
//註: 此處不可直接return, 否則會跳過本回調末尾之error事件發出
|
|
797
|
+
rest = {
|
|
663
798
|
n: 0,
|
|
664
799
|
nDeleted: 0,
|
|
665
800
|
ok: 0,
|
|
666
801
|
err: `can not delete by invalid id[${id}]`,
|
|
667
802
|
}
|
|
668
803
|
}
|
|
804
|
+
else {
|
|
669
805
|
|
|
670
|
-
|
|
671
|
-
|
|
806
|
+
//查找資料表內v.id
|
|
807
|
+
let vv = await getValue(id) //不會有catch
|
|
672
808
|
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
809
|
+
//check
|
|
810
|
+
if (iseobj(vv)) {
|
|
811
|
+
//已存在v.id則須刪除
|
|
676
812
|
|
|
677
|
-
|
|
678
|
-
|
|
813
|
+
//del
|
|
814
|
+
await client.del(id)
|
|
815
|
+
|
|
816
|
+
//rest
|
|
817
|
+
rest = {
|
|
818
|
+
n: 1,
|
|
819
|
+
nDeleted: 1,
|
|
820
|
+
ok: 1,
|
|
821
|
+
}
|
|
679
822
|
|
|
680
|
-
//rest
|
|
681
|
-
rest = {
|
|
682
|
-
n: 1,
|
|
683
|
-
nDeleted: 1,
|
|
684
|
-
ok: 1,
|
|
685
823
|
}
|
|
824
|
+
else {
|
|
825
|
+
//不存在v.id則不刪除, 未命中故n為0
|
|
826
|
+
rest = {
|
|
827
|
+
n: 0,
|
|
828
|
+
nDeleted: 0,
|
|
829
|
+
ok: 1,
|
|
830
|
+
}
|
|
686
831
|
|
|
687
|
-
}
|
|
688
|
-
else {
|
|
689
|
-
//不存在v.id則不刪除, 未命中故n為0
|
|
690
|
-
rest = {
|
|
691
|
-
n: 0,
|
|
692
|
-
nDeleted: 0,
|
|
693
|
-
ok: 1,
|
|
694
832
|
}
|
|
695
833
|
|
|
696
834
|
}
|
|
@@ -708,6 +846,12 @@ function WOrmLmdb(opt = {}) {
|
|
|
708
846
|
|
|
709
847
|
}
|
|
710
848
|
|
|
849
|
+
//emit, 逐筆失敗於該筆結果定案後發出, 每筆一次
|
|
850
|
+
//此事件之發出不表示整批失敗, 整批仍resolve, 該筆以ok為0回報
|
|
851
|
+
if (rest.ok === 0) {
|
|
852
|
+
emitError('del', [v], rest.err)
|
|
853
|
+
}
|
|
854
|
+
|
|
711
855
|
return rest
|
|
712
856
|
})
|
|
713
857
|
|
|
@@ -721,20 +865,17 @@ function WOrmLmdb(opt = {}) {
|
|
|
721
865
|
_cache = null
|
|
722
866
|
|
|
723
867
|
//emit, 於change可能須使用select, 故須放在重設快取之後
|
|
868
|
+
//逐筆失敗之error事件已於各筆定案時發出, 故必早於本整批change
|
|
724
869
|
if (!isErr) {
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
//emit
|
|
728
|
-
ee.emit('change', 'del', data, res)
|
|
729
|
-
|
|
730
|
-
}
|
|
731
|
-
catch (err) {
|
|
732
|
-
console.log(err)
|
|
733
|
-
}
|
|
870
|
+
emitChange('del', data, res)
|
|
734
871
|
}
|
|
735
872
|
|
|
736
873
|
//check
|
|
737
874
|
if (isErr) {
|
|
875
|
+
|
|
876
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
877
|
+
emitError('del', data, res)
|
|
878
|
+
|
|
738
879
|
return Promise.reject(res)
|
|
739
880
|
}
|
|
740
881
|
|
|
@@ -836,19 +977,15 @@ function WOrmLmdb(opt = {}) {
|
|
|
836
977
|
|
|
837
978
|
//emit, 於change可能須使用select, 故須放在重設快取之後
|
|
838
979
|
if (!isErr) {
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
//emit
|
|
842
|
-
ee.emit('change', 'delAll', null, res)
|
|
843
|
-
|
|
844
|
-
}
|
|
845
|
-
catch (err) {
|
|
846
|
-
console.log(err)
|
|
847
|
-
}
|
|
980
|
+
emitChange('delAll', null, res)
|
|
848
981
|
}
|
|
849
982
|
|
|
850
983
|
//check
|
|
851
984
|
if (isErr) {
|
|
985
|
+
|
|
986
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
987
|
+
emitError('delAll', null, res)
|
|
988
|
+
|
|
852
989
|
return Promise.reject(res)
|
|
853
990
|
}
|
|
854
991
|
|
|
@@ -866,6 +1003,7 @@ function WOrmLmdb(opt = {}) {
|
|
|
866
1003
|
ee.select = select
|
|
867
1004
|
ee.selectByPk = selectByPk
|
|
868
1005
|
ee.insert = insert
|
|
1006
|
+
ee.insertBulk = insertBulk
|
|
869
1007
|
ee.save = save
|
|
870
1008
|
ee.del = del
|
|
871
1009
|
ee.delAll = delAll
|
|
@@ -890,7 +1028,7 @@ export default WOrmLmdb
|
|
|
890
1028
|
<br class="clear">
|
|
891
1029
|
|
|
892
1030
|
<footer>
|
|
893
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Aug 17 2026
|
|
1031
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Aug 17 2026 11:00:07 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
894
1032
|
</footer>
|
|
895
1033
|
|
|
896
1034
|
<script>prettyPrint();</script>
|