w-orm-lmdb 1.0.16 → 1.0.18
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 +15 -0
- 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 +63 -9
- package/docs/WOrmLmdb.mjs.html +139 -78
- package/docs/index.html +1 -1
- package/g-basic.mjs +15 -0
- package/package.json +1 -1
- package/src/WOrmLmdb.mjs +138 -77
- package/test/unit-autogenpk.test.mjs +188 -0
- package/test/unit-event.test.mjs +242 -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 +165 -22
package/docs/WOrmLmdb.html
CHANGED
|
@@ -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'、'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'、'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
|
|
|
@@ -376,6 +390,46 @@
|
|
|
376
390
|
</tr>
|
|
377
391
|
|
|
378
392
|
|
|
393
|
+
|
|
394
|
+
<tr>
|
|
395
|
+
|
|
396
|
+
<td class="name"><code>autoGenPk</code></td>
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
<td class="type">
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
<span class="param-type">Boolean</span>
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
</td>
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
<td class="attributes">
|
|
411
|
+
|
|
412
|
+
<optional><br>
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
</td>
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
<td class="default">
|
|
423
|
+
|
|
424
|
+
<code>true</code>
|
|
425
|
+
|
|
426
|
+
</td>
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
<td class="description last"><p>輸入insert與save於數據未帶有效主鍵(本套件為id欄位)時是否自動產生主鍵值,預設true;給false代表主鍵改由呼叫端自備,套件不產生亦不檢查其唯一性與格式,未帶有效主鍵者將reject</p></td>
|
|
430
|
+
</tr>
|
|
431
|
+
|
|
432
|
+
|
|
379
433
|
</tbody>
|
|
380
434
|
</table>
|
|
381
435
|
|
|
@@ -469,7 +523,7 @@
|
|
|
469
523
|
|
|
470
524
|
<dt class="tag-source">Source:</dt>
|
|
471
525
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
472
|
-
<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#line620">line 620</a>
|
|
473
527
|
</li></ul></dd>
|
|
474
528
|
|
|
475
529
|
|
|
@@ -630,7 +684,7 @@
|
|
|
630
684
|
|
|
631
685
|
<dt class="tag-source">Source:</dt>
|
|
632
686
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
633
|
-
<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#line751">line 751</a>
|
|
634
688
|
</li></ul></dd>
|
|
635
689
|
|
|
636
690
|
|
|
@@ -808,7 +862,7 @@
|
|
|
808
862
|
|
|
809
863
|
<dt class="tag-source">Source:</dt>
|
|
810
864
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
811
|
-
<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>
|
|
812
866
|
</li></ul></dd>
|
|
813
867
|
|
|
814
868
|
|
|
@@ -969,7 +1023,7 @@
|
|
|
969
1023
|
|
|
970
1024
|
<dt class="tag-source">Source:</dt>
|
|
971
1025
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
972
|
-
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#
|
|
1026
|
+
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#line419">line 419</a>
|
|
973
1027
|
</li></ul></dd>
|
|
974
1028
|
|
|
975
1029
|
|
|
@@ -1256,7 +1310,7 @@
|
|
|
1256
1310
|
|
|
1257
1311
|
<dt class="tag-source">Source:</dt>
|
|
1258
1312
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
1259
|
-
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#
|
|
1313
|
+
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#line214">line 214</a>
|
|
1260
1314
|
</li></ul></dd>
|
|
1261
1315
|
|
|
1262
1316
|
|
|
@@ -1435,7 +1489,7 @@
|
|
|
1435
1489
|
|
|
1436
1490
|
<dt class="tag-source">Source:</dt>
|
|
1437
1491
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
1438
|
-
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#
|
|
1492
|
+
<a href="WOrmLmdb.mjs.html">WOrmLmdb.mjs</a>, <a href="WOrmLmdb.mjs.html#line273">line 273</a>
|
|
1439
1493
|
</li></ul></dd>
|
|
1440
1494
|
|
|
1441
1495
|
|
|
@@ -1592,7 +1646,7 @@
|
|
|
1592
1646
|
<br class="clear">
|
|
1593
1647
|
|
|
1594
1648
|
<footer>
|
|
1595
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
1649
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Aug 17 2026 08:38:27 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
1596
1650
|
</footer>
|
|
1597
1651
|
|
|
1598
1652
|
<script>prettyPrint();</script>
|
package/docs/WOrmLmdb.mjs.html
CHANGED
|
@@ -70,12 +70,30 @@ 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'、'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'、'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'
|
|
76
93
|
* @param {String} [opt.db='worm'] 輸入使用資料庫名稱字串,預設'worm'
|
|
77
94
|
* @param {String} [opt.cl='test'] 輸入使用資料表名稱字串,預設'test'
|
|
78
95
|
* @param {Boolean} [opt.useCache=false] 輸入是否使用select快取,適用於單程序操作,預設false
|
|
96
|
+
* @param {Boolean} [opt.autoGenPk=true] 輸入insert與save於數據未帶有效主鍵(本套件為id欄位)時是否自動產生主鍵值,預設true;給false代表主鍵改由呼叫端自備,套件不產生亦不檢查其唯一性與格式,未帶有效主鍵者將reject
|
|
79
97
|
* @returns {Object} 回傳操作資料庫物件,各事件功能詳見說明
|
|
80
98
|
*/
|
|
81
99
|
function WOrmLmdb(opt = {}) {
|
|
@@ -107,6 +125,13 @@ function WOrmLmdb(opt = {}) {
|
|
|
107
125
|
useCache = false
|
|
108
126
|
}
|
|
109
127
|
|
|
128
|
+
//autoGenPk, 主鍵由誰產生為整個資料表之政策, 故為建構層設定, 不可於insert與save之option逐次覆寫,
|
|
129
|
+
//否則同一資料表將混入兩種來源之主鍵而難以追溯
|
|
130
|
+
let autoGenPk = get(opt, 'autoGenPk')
|
|
131
|
+
if (!isbol(autoGenPk)) {
|
|
132
|
+
autoGenPk = true
|
|
133
|
+
}
|
|
134
|
+
|
|
110
135
|
//storage
|
|
111
136
|
let storage = `${url}/${db}/${cl}`
|
|
112
137
|
// console.log('storage',storage)
|
|
@@ -157,7 +182,30 @@ function WOrmLmdb(opt = {}) {
|
|
|
157
182
|
})
|
|
158
183
|
}
|
|
159
184
|
|
|
160
|
-
//
|
|
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事件使用
|
|
161
209
|
let getErrMsg = (err) => {
|
|
162
210
|
let m = get(err, 'message')
|
|
163
211
|
if (isestr(m)) {
|
|
@@ -166,6 +214,26 @@ function WOrmLmdb(opt = {}) {
|
|
|
166
214
|
return String(err)
|
|
167
215
|
}
|
|
168
216
|
|
|
217
|
+
//procPk, 依autoGenPk處理各數據之主鍵, 供insert與save共用
|
|
218
|
+
//autoGenPk為true時補值; 為false時不補值, 未帶有效主鍵者屬呼叫端未履行契約, 拋出為整批性錯誤,
|
|
219
|
+
//且檢查於任何寫入之前完成, 故不會有部份筆數已寫入而整批失敗之情形
|
|
220
|
+
let procPk = (data, fnName) => {
|
|
221
|
+
if (autoGenPk) {
|
|
222
|
+
return map(data, function(v) {
|
|
223
|
+
if (!isestr(v.id)) {
|
|
224
|
+
v.id = genIDSeq()
|
|
225
|
+
}
|
|
226
|
+
return v
|
|
227
|
+
})
|
|
228
|
+
}
|
|
229
|
+
each(data, function(v, k) {
|
|
230
|
+
if (!isestr(get(v, 'id'))) {
|
|
231
|
+
throw new Error(`can not ${fnName} by data[${k}] without valid id when autoGenPk is false`)
|
|
232
|
+
}
|
|
233
|
+
})
|
|
234
|
+
return data
|
|
235
|
+
}
|
|
236
|
+
|
|
169
237
|
//getValue
|
|
170
238
|
let getValue = async (key) => {
|
|
171
239
|
let value = null
|
|
@@ -231,6 +299,10 @@ function WOrmLmdb(opt = {}) {
|
|
|
231
299
|
|
|
232
300
|
//check
|
|
233
301
|
if (isErr) {
|
|
302
|
+
|
|
303
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
304
|
+
emitError('select', null, res)
|
|
305
|
+
|
|
234
306
|
return Promise.reject(res)
|
|
235
307
|
}
|
|
236
308
|
|
|
@@ -280,6 +352,10 @@ function WOrmLmdb(opt = {}) {
|
|
|
280
352
|
|
|
281
353
|
//check
|
|
282
354
|
if (isErr) {
|
|
355
|
+
|
|
356
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
357
|
+
emitError('selectByPk', null, res)
|
|
358
|
+
|
|
283
359
|
return Promise.reject(res)
|
|
284
360
|
}
|
|
285
361
|
|
|
@@ -318,12 +394,7 @@ function WOrmLmdb(opt = {}) {
|
|
|
318
394
|
}
|
|
319
395
|
|
|
320
396
|
//check id
|
|
321
|
-
data =
|
|
322
|
-
if (!isestr(v.id)) {
|
|
323
|
-
v.id = genIDSeq()
|
|
324
|
-
}
|
|
325
|
-
return v
|
|
326
|
-
})
|
|
397
|
+
data = procPk(data, 'insert')
|
|
327
398
|
|
|
328
399
|
//each
|
|
329
400
|
//ifNoExists, 由LMDB於同一寫交易內原子完成[檢查v.id未存在]與[寫入], 併發時同一v.id僅有一次成功,
|
|
@@ -368,19 +439,15 @@ function WOrmLmdb(opt = {}) {
|
|
|
368
439
|
|
|
369
440
|
//emit, 於change可能須使用select, 故須放在重設快取之後
|
|
370
441
|
if (!isErr) {
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
//emit
|
|
374
|
-
ee.emit('change', 'insert', data, res)
|
|
375
|
-
|
|
376
|
-
}
|
|
377
|
-
catch (err) {
|
|
378
|
-
console.log(err)
|
|
379
|
-
}
|
|
442
|
+
emitChange('insert', data, res)
|
|
380
443
|
}
|
|
381
444
|
|
|
382
445
|
//check
|
|
383
446
|
if (isErr) {
|
|
447
|
+
|
|
448
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
449
|
+
emitError('insert', data, res)
|
|
450
|
+
|
|
384
451
|
return Promise.reject(res)
|
|
385
452
|
}
|
|
386
453
|
|
|
@@ -420,12 +487,7 @@ function WOrmLmdb(opt = {}) {
|
|
|
420
487
|
}
|
|
421
488
|
|
|
422
489
|
//check id
|
|
423
|
-
data =
|
|
424
|
-
if (!isestr(v.id)) {
|
|
425
|
-
v.id = genIDSeq()
|
|
426
|
-
}
|
|
427
|
-
return v
|
|
428
|
-
})
|
|
490
|
+
data = procPk(data, 'save')
|
|
429
491
|
|
|
430
492
|
//pmSeries
|
|
431
493
|
res = await pmSeries(data, async(v) => {
|
|
@@ -554,16 +616,15 @@ function WOrmLmdb(opt = {}) {
|
|
|
554
616
|
//update, 不能保證插入多少, 一律重設快取
|
|
555
617
|
_cache = null
|
|
556
618
|
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
//emit
|
|
560
|
-
ee.emit('change', 'insert', [v], rest)
|
|
619
|
+
//emit
|
|
620
|
+
emitChange('insert', [v], rest)
|
|
561
621
|
|
|
562
|
-
|
|
563
|
-
catch (err) {
|
|
564
|
-
console.log(err)
|
|
565
|
-
}
|
|
622
|
+
}
|
|
566
623
|
|
|
624
|
+
//emit, 逐筆失敗於該筆結果定案後發出, 每筆一次
|
|
625
|
+
//此事件之發出不表示整批失敗, 整批仍resolve, 該筆以ok為0回報
|
|
626
|
+
if (rest.ok === 0) {
|
|
627
|
+
emitError('save', [v], rest.err)
|
|
567
628
|
}
|
|
568
629
|
|
|
569
630
|
return rest
|
|
@@ -579,20 +640,17 @@ function WOrmLmdb(opt = {}) {
|
|
|
579
640
|
_cache = null
|
|
580
641
|
|
|
581
642
|
//emit, 於change可能須使用select, 故須放在重設快取之後
|
|
643
|
+
//逐筆失敗之error事件已於各筆定案時發出, 故必早於本整批change
|
|
582
644
|
if (!isErr) {
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
//emit
|
|
586
|
-
ee.emit('change', 'save', data, res)
|
|
587
|
-
|
|
588
|
-
}
|
|
589
|
-
catch (err) {
|
|
590
|
-
console.log(err)
|
|
591
|
-
}
|
|
645
|
+
emitChange('save', data, res)
|
|
592
646
|
}
|
|
593
647
|
|
|
594
648
|
//check
|
|
595
649
|
if (isErr) {
|
|
650
|
+
|
|
651
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
652
|
+
emitError('save', data, res)
|
|
653
|
+
|
|
596
654
|
return Promise.reject(res)
|
|
597
655
|
}
|
|
598
656
|
|
|
@@ -641,38 +699,42 @@ function WOrmLmdb(opt = {}) {
|
|
|
641
699
|
if (!isestr(id)) {
|
|
642
700
|
//未給有效v.id視為該筆數據有問題而無法處理, 以ok為0並附err回報,
|
|
643
701
|
//與[已給v.id但查無數據]之ok為1有別, 二者須可由ok分辨
|
|
644
|
-
return
|
|
702
|
+
//註: 此處不可直接return, 否則會跳過本回調末尾之error事件發出
|
|
703
|
+
rest = {
|
|
645
704
|
n: 0,
|
|
646
705
|
nDeleted: 0,
|
|
647
706
|
ok: 0,
|
|
648
707
|
err: `can not delete by invalid id[${id}]`,
|
|
649
708
|
}
|
|
650
709
|
}
|
|
710
|
+
else {
|
|
651
711
|
|
|
652
|
-
|
|
653
|
-
|
|
712
|
+
//查找資料表內v.id
|
|
713
|
+
let vv = await getValue(id) //不會有catch
|
|
654
714
|
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
715
|
+
//check
|
|
716
|
+
if (iseobj(vv)) {
|
|
717
|
+
//已存在v.id則須刪除
|
|
658
718
|
|
|
659
|
-
|
|
660
|
-
|
|
719
|
+
//del
|
|
720
|
+
await client.del(id)
|
|
721
|
+
|
|
722
|
+
//rest
|
|
723
|
+
rest = {
|
|
724
|
+
n: 1,
|
|
725
|
+
nDeleted: 1,
|
|
726
|
+
ok: 1,
|
|
727
|
+
}
|
|
661
728
|
|
|
662
|
-
//rest
|
|
663
|
-
rest = {
|
|
664
|
-
n: 1,
|
|
665
|
-
nDeleted: 1,
|
|
666
|
-
ok: 1,
|
|
667
729
|
}
|
|
730
|
+
else {
|
|
731
|
+
//不存在v.id則不刪除, 未命中故n為0
|
|
732
|
+
rest = {
|
|
733
|
+
n: 0,
|
|
734
|
+
nDeleted: 0,
|
|
735
|
+
ok: 1,
|
|
736
|
+
}
|
|
668
737
|
|
|
669
|
-
}
|
|
670
|
-
else {
|
|
671
|
-
//不存在v.id則不刪除, 未命中故n為0
|
|
672
|
-
rest = {
|
|
673
|
-
n: 0,
|
|
674
|
-
nDeleted: 0,
|
|
675
|
-
ok: 1,
|
|
676
738
|
}
|
|
677
739
|
|
|
678
740
|
}
|
|
@@ -690,6 +752,12 @@ function WOrmLmdb(opt = {}) {
|
|
|
690
752
|
|
|
691
753
|
}
|
|
692
754
|
|
|
755
|
+
//emit, 逐筆失敗於該筆結果定案後發出, 每筆一次
|
|
756
|
+
//此事件之發出不表示整批失敗, 整批仍resolve, 該筆以ok為0回報
|
|
757
|
+
if (rest.ok === 0) {
|
|
758
|
+
emitError('del', [v], rest.err)
|
|
759
|
+
}
|
|
760
|
+
|
|
693
761
|
return rest
|
|
694
762
|
})
|
|
695
763
|
|
|
@@ -703,20 +771,17 @@ function WOrmLmdb(opt = {}) {
|
|
|
703
771
|
_cache = null
|
|
704
772
|
|
|
705
773
|
//emit, 於change可能須使用select, 故須放在重設快取之後
|
|
774
|
+
//逐筆失敗之error事件已於各筆定案時發出, 故必早於本整批change
|
|
706
775
|
if (!isErr) {
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
//emit
|
|
710
|
-
ee.emit('change', 'del', data, res)
|
|
711
|
-
|
|
712
|
-
}
|
|
713
|
-
catch (err) {
|
|
714
|
-
console.log(err)
|
|
715
|
-
}
|
|
776
|
+
emitChange('del', data, res)
|
|
716
777
|
}
|
|
717
778
|
|
|
718
779
|
//check
|
|
719
780
|
if (isErr) {
|
|
781
|
+
|
|
782
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
783
|
+
emitError('del', data, res)
|
|
784
|
+
|
|
720
785
|
return Promise.reject(res)
|
|
721
786
|
}
|
|
722
787
|
|
|
@@ -818,19 +883,15 @@ function WOrmLmdb(opt = {}) {
|
|
|
818
883
|
|
|
819
884
|
//emit, 於change可能須使用select, 故須放在重設快取之後
|
|
820
885
|
if (!isErr) {
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
//emit
|
|
824
|
-
ee.emit('change', 'delAll', null, res)
|
|
825
|
-
|
|
826
|
-
}
|
|
827
|
-
catch (err) {
|
|
828
|
-
console.log(err)
|
|
829
|
-
}
|
|
886
|
+
emitChange('delAll', null, res)
|
|
830
887
|
}
|
|
831
888
|
|
|
832
889
|
//check
|
|
833
890
|
if (isErr) {
|
|
891
|
+
|
|
892
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
893
|
+
emitError('delAll', null, res)
|
|
894
|
+
|
|
834
895
|
return Promise.reject(res)
|
|
835
896
|
}
|
|
836
897
|
|
|
@@ -872,7 +933,7 @@ export default WOrmLmdb
|
|
|
872
933
|
<br class="clear">
|
|
873
934
|
|
|
874
935
|
<footer>
|
|
875
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
936
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Aug 17 2026 08:38:27 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
876
937
|
</footer>
|
|
877
938
|
|
|
878
939
|
<script>prettyPrint();</script>
|
package/docs/index.html
CHANGED
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
<br class="clear">
|
|
72
72
|
|
|
73
73
|
<footer>
|
|
74
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
74
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Aug 17 2026 08:38:27 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
75
75
|
</footer>
|
|
76
76
|
|
|
77
77
|
<script>prettyPrint();</script>
|
package/g-basic.mjs
CHANGED
|
@@ -62,6 +62,9 @@ async function test() {
|
|
|
62
62
|
wo.on('change', function(mode, data, res) {
|
|
63
63
|
console.log('change', mode)
|
|
64
64
|
})
|
|
65
|
+
wo.on('error', function(mode, data, err) {
|
|
66
|
+
console.log('error', mode, err)
|
|
67
|
+
})
|
|
65
68
|
|
|
66
69
|
//delAll
|
|
67
70
|
await wo.delAll()
|
|
@@ -145,6 +148,15 @@ async function test() {
|
|
|
145
148
|
console.log('del catch', msg)
|
|
146
149
|
})
|
|
147
150
|
|
|
151
|
+
//del by data without id, 該筆無法處理故ok為0並附err, 整批仍resolve且另發出error事件
|
|
152
|
+
await wo.del({ name: 'no-id' })
|
|
153
|
+
.then(function(msg) {
|
|
154
|
+
console.log('del by data without id then', msg)
|
|
155
|
+
})
|
|
156
|
+
.catch(function(msg) {
|
|
157
|
+
console.log('del by data without id catch', msg)
|
|
158
|
+
})
|
|
159
|
+
|
|
148
160
|
}
|
|
149
161
|
test()
|
|
150
162
|
// change delAll
|
|
@@ -193,6 +205,9 @@ test()
|
|
|
193
205
|
// save then [ { n: 1, nInserted: 0, nModified: 1, ok: 1 } ]
|
|
194
206
|
// change del
|
|
195
207
|
// del then [ { n: 1, nDeleted: 1, ok: 1 } ]
|
|
208
|
+
// error del can not delete by invalid id[]
|
|
209
|
+
// change del
|
|
210
|
+
// del by data without id then [ { n: 0, nDeleted: 0, ok: 0, err: 'can not delete by invalid id[]' } ]
|
|
196
211
|
|
|
197
212
|
|
|
198
213
|
//node g-basic.mjs
|