w-orm-lowdb 1.0.2 → 1.0.3

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.
@@ -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="WOrmLowdb.html">WOrmLowdb</a><ul class='methods'><li data-type='method'><a href="WOrmLowdb.html#.del">del</a></li><li data-type='method'><a href="WOrmLowdb.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmLowdb.html#.insert">insert</a></li><li data-type='method'><a href="WOrmLowdb.html#.save">save</a></li><li data-type='method'><a href="WOrmLowdb.html#.select">select</a></li></ul></li></ul>
32
+ <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmLowdb.html">WOrmLowdb</a><ul class='methods'><li data-type='method'><a href="WOrmLowdb.html#.delAllCore">delAllCore</a></li><li data-type='method'><a href="WOrmLowdb.html#.delCore">delCore</a></li><li data-type='method'><a href="WOrmLowdb.html#.insertCore">insertCore</a></li><li data-type='method'><a href="WOrmLowdb.html#.saveCore">saveCore</a></li><li data-type='method'><a href="WOrmLowdb.html#.selectCore">selectCore</a></li></ul></li></ul>
33
33
 
34
34
  </nav>
35
35
 
@@ -49,7 +49,6 @@
49
49
  import { Low } from 'lowdb'
50
50
  import { JSONFile } from 'lowdb/node'
51
51
  import { Query } from 'mingo' //須指定安裝6.5.6, 若6.6.0無法匯入Query
52
- import { Mutex } from 'async-mutex'
53
52
  import get from 'lodash-es/get.js'
54
53
  import each from 'lodash-es/each.js'
55
54
  import map from 'lodash-es/map.js'
@@ -65,6 +64,12 @@ import iseobj from 'wsemi/src/iseobj.mjs'
65
64
  import isearr from 'wsemi/src/isearr.mjs'
66
65
  import haskey from 'wsemi/src/haskey.mjs'
67
66
  import arrPullAt from 'wsemi/src/arrPullAt.mjs'
67
+ import waitFun from 'wsemi/src/waitFun.mjs'
68
+
69
+
70
+ //全域鎖, 一次僅能執行一種操作函數
71
+ //select理論上是不用鎖, 但因為操作上db.jon.tmp更名回db.json時似乎非rename而是串流寫入, 導致有機會撈到不完整json數據進而出錯, 故還是得要上鎖以策安全
72
+ let glock = false
68
73
 
69
74
 
70
75
  /**
@@ -106,9 +111,6 @@ function WOrmLowdb(opt = {}) {
106
111
  //lowdb
107
112
  let lowdb = new Low(adapter, {})
108
113
 
109
- //mutex
110
- let mutex = new Mutex()
111
-
112
114
  // //default, 此處偵測會失效, 因操作函數內會通過lowdb.read()初始化, 預設創建空陣列會被取代
113
115
  // if (!haskey(lowdb.data, key)) {
114
116
  // lowdb.data[key] = []
@@ -124,7 +126,7 @@ function WOrmLowdb(opt = {}) {
124
126
  * @param {Object} [find={}] 輸入查詢條件物件
125
127
  * @returns {Promise} 回傳Promise,resolve回傳數據,reject回傳錯誤訊息
126
128
  */
127
- async function select(find = {}) {
129
+ async function selectCore(find = {}) {
128
130
  let isErr = false
129
131
 
130
132
  //res
@@ -166,6 +168,18 @@ function WOrmLowdb(opt = {}) {
166
168
  }
167
169
  return res
168
170
  }
171
+ async function select(find = {}) {
172
+ if (glock) {
173
+ await waitFun(() => {
174
+ return !glock
175
+ })
176
+ }
177
+ glock = true
178
+ return await selectCore(find)
179
+ .finally(() => {
180
+ glock = false
181
+ })
182
+ }
169
183
 
170
184
  /**
171
185
  * 插入數據,插入同樣數據會自動產生不同_id,故insert前需自行判斷有無重複
@@ -174,97 +188,107 @@ function WOrmLowdb(opt = {}) {
174
188
  * @param {Object|Array} data 輸入數據物件或陣列
175
189
  * @returns {Promise} 回傳Promise,resolve回傳插入結果,reject回傳錯誤訊息
176
190
  */
177
- async function insert(data) {
178
- return await mutex.runExclusive(async () => {
179
- let isErr = false
180
-
181
- //check
182
- if (!iseobj(data) &amp;&amp; !isearr(data)) {
183
- return Promise.reject(`data is not an effective object or array`)
184
- }
185
-
186
- //cloneDeep, 與外部數據脫勾
187
- data = cloneDeep(data)
191
+ async function insertCore(data) {
192
+ let isErr = false
188
193
 
189
- //res
190
- let res = null
191
- try {
194
+ //check
195
+ if (!iseobj(data) &amp;&amp; !isearr(data)) {
196
+ return Promise.reject(`data is not an effective object or array`)
197
+ }
192
198
 
193
- //check
194
- if (!isarr(data)) {
195
- data = [data]
196
- }
199
+ //cloneDeep, 與外部數據脫勾
200
+ data = cloneDeep(data)
197
201
 
198
- //check id
199
- data = map(data, function(v) {
200
- if (!isestr(v.id)) {
201
- v.id = genID()
202
- }
203
- return v
204
- })
202
+ //res
203
+ let res = null
204
+ try {
205
205
 
206
- //read
207
- await lowdb.read()
206
+ //check
207
+ if (!isarr(data)) {
208
+ data = [data]
209
+ }
208
210
 
209
- //default, 使用lowdb.read()初始化後須馬上檢測, 若無key則須先創建空陣列
210
- if (!haskey(lowdb.data, key)) {
211
- lowdb.data[key] = []
211
+ //check id
212
+ data = map(data, function(v) {
213
+ if (!isestr(v.id)) {
214
+ v.id = genID()
212
215
  }
216
+ return v
217
+ })
213
218
 
214
- //kp
215
- let kp = {}
216
- each(lowdb.data[key], (v, k) => {
217
- kp[v.id] = { k, v }
218
- })
219
+ //read
220
+ await lowdb.read()
219
221
 
220
- //each
221
- let nAll = size(data)
222
- let nPush = 0
223
- let b = false
224
- each(data, (v) => {
222
+ //default, 使用lowdb.read()初始化後須馬上檢測, 若無key則須先創建空陣列
223
+ if (!haskey(lowdb.data, key)) {
224
+ lowdb.data[key] = []
225
+ }
225
226
 
226
- //check
227
- if (!haskey(kp, v.id)) {
228
- //未存在v.id
227
+ //kp
228
+ let kp = {}
229
+ each(lowdb.data[key], (v, k) => {
230
+ kp[v.id] = { k, v }
231
+ })
229
232
 
230
- //push
231
- lowdb.data[key].push(v)
233
+ //each
234
+ let nAll = size(data)
235
+ let nPush = 0
236
+ let b = false
237
+ each(data, (v) => {
232
238
 
233
- nPush++
234
- b = true
235
- }
236
- else {
237
- //已存在v.id則不push
238
- }
239
+ //check
240
+ if (!haskey(kp, v.id)) {
241
+ //未存在v.id
239
242
 
240
- })
243
+ //push
244
+ lowdb.data[key].push(v)
241
245
 
242
- //write
243
- if (b) {
244
- await lowdb.write()
246
+ nPush++
247
+ b = true
245
248
  }
246
-
247
- //res
248
- res = {
249
- n: nAll,
250
- nInserted: nPush,
251
- ok: 1,
249
+ else {
250
+ //已存在v.id則不push
252
251
  }
253
252
 
254
- //emit
255
- ee.emit('change', 'insert', data, res)
253
+ })
256
254
 
257
- }
258
- catch (err) {
259
- isErr = true
260
- res = err
255
+ //write
256
+ if (b) {
257
+ await lowdb.write()
261
258
  }
262
259
 
263
- if (isErr) {
264
- return Promise.reject(res)
260
+ //res
261
+ res = {
262
+ n: nAll,
263
+ nInserted: nPush,
264
+ ok: 1,
265
265
  }
266
- return res
267
- })
266
+
267
+ //emit
268
+ ee.emit('change', 'insert', data, res)
269
+
270
+ }
271
+ catch (err) {
272
+ isErr = true
273
+ res = err
274
+ }
275
+
276
+ if (isErr) {
277
+ return Promise.reject(res)
278
+ }
279
+ return res
280
+ }
281
+ async function insert(data) {
282
+ if (glock) {
283
+ await waitFun(() => {
284
+ return !glock
285
+ })
286
+ }
287
+ glock = true
288
+ return await insertCore(data)
289
+ .finally(() => {
290
+ glock = false
291
+ })
268
292
  }
269
293
 
270
294
  /**
@@ -276,122 +300,132 @@ function WOrmLowdb(opt = {}) {
276
300
  * @param {boolean} [option.autoInsert=true] 輸入是否於儲存時發現原本無數據,則自動改以插入處理,預設為true
277
301
  * @returns {Promise} 回傳Promise,resolve回傳儲存結果,reject回傳錯誤訊息
278
302
  */
279
- async function save(data, option = {}) {
280
- return await mutex.runExclusive(async () => {
281
- let isErr = false
282
-
283
- //check
284
- if (!iseobj(data) &amp;&amp; !isearr(data)) {
285
- return Promise.reject(`data is not an effective object or array`)
286
- }
287
-
288
- //cloneDeep, 與外部數據脫勾
289
- data = cloneDeep(data)
303
+ async function saveCore(data, option = {}) {
304
+ let isErr = false
290
305
 
291
- //autoInsert
292
- let autoInsert = get(option, 'autoInsert', true)
306
+ //check
307
+ if (!iseobj(data) &amp;&amp; !isearr(data)) {
308
+ return Promise.reject(`data is not an effective object or array`)
309
+ }
293
310
 
294
- //res
295
- let res = null
296
- try {
311
+ //cloneDeep, 與外部數據脫勾
312
+ data = cloneDeep(data)
297
313
 
298
- //check
299
- if (!isarr(data)) {
300
- data = [data]
301
- }
314
+ //autoInsert
315
+ let autoInsert = get(option, 'autoInsert', true)
302
316
 
303
- //check id
304
- data = map(data, function(v) {
305
- if (!isestr(v.id)) {
306
- v.id = genID()
307
- }
308
- return v
309
- })
317
+ //res
318
+ let res = null
319
+ try {
310
320
 
311
- //read
312
- await lowdb.read()
321
+ //check
322
+ if (!isarr(data)) {
323
+ data = [data]
324
+ }
313
325
 
314
- //default, 使用lowdb.read()初始化後須馬上檢測, 若無key則須先創建空陣列
315
- if (!haskey(lowdb.data, key)) {
316
- lowdb.data[key] = []
326
+ //check id
327
+ data = map(data, function(v) {
328
+ if (!isestr(v.id)) {
329
+ v.id = genID()
317
330
  }
331
+ return v
332
+ })
318
333
 
319
- //kp
320
- let kp = {}
321
- each(lowdb.data[key], (v, k) => {
322
- kp[v.id] = { k, v }
323
- })
334
+ //read
335
+ await lowdb.read()
324
336
 
325
- //pmSeries
326
- let b = false
327
- res = await pmSeries(data, async(v) => {
337
+ //default, 使用lowdb.read()初始化後須馬上檢測, 若無key則須先創建空陣列
338
+ if (!haskey(lowdb.data, key)) {
339
+ lowdb.data[key] = []
340
+ }
328
341
 
329
- //rest
330
- let rest = null
342
+ //kp
343
+ let kp = {}
344
+ each(lowdb.data[key], (v, k) => {
345
+ kp[v.id] = { k, v }
346
+ })
331
347
 
332
- //查找資料表內v.id
333
- let r = get(kp, v.id, null)
348
+ //pmSeries
349
+ let b = false
350
+ res = await pmSeries(data, async(v) => {
334
351
 
335
- //check
336
- if (iseobj(r)) {
337
- //已存在v.id
338
- if (isEqual(v, r.v)) {
339
- //內容相同不更新
340
- }
341
- else {
342
- //內容不同須更新
352
+ //rest
353
+ let rest = null
343
354
 
344
- //merge
345
- lowdb.data[key][r.k] = merge(lowdb.data[key][r.k], v)
355
+ //查找資料表內v.id
356
+ let r = get(kp, v.id, null)
346
357
 
347
- rest = { update: true }
348
- b = true
349
- }
350
- }
351
-
352
- //rest
353
- if (iseobj(rest)) {
354
- rest = {
355
- n: 1,
356
- nModified: 1,
357
- ok: 1,
358
- }
358
+ //check
359
+ if (iseobj(r)) {
360
+ //已存在v.id
361
+ if (isEqual(v, r.v)) {
362
+ //內容相同不更新
359
363
  }
360
364
  else {
361
- rest = {
362
- n: 0,
363
- nModified: 0,
364
- ok: 1,
365
- }
366
- }
365
+ //內容不同須更新
367
366
 
368
- //autoInsert
369
- if (autoInsert &amp;&amp; rest.n === 0) {
370
- rest = await insert(v)
367
+ //merge
368
+ lowdb.data[key][r.k] = merge(lowdb.data[key][r.k], v)
369
+
370
+ rest = { update: true }
371
+ b = true
371
372
  }
373
+ }
372
374
 
373
- return rest
374
- })
375
+ //rest
376
+ if (iseobj(rest)) {
377
+ rest = {
378
+ n: 1,
379
+ nModified: 1,
380
+ ok: 1,
381
+ }
382
+ }
383
+ else {
384
+ rest = {
385
+ n: 0,
386
+ nModified: 0,
387
+ ok: 1,
388
+ }
389
+ }
375
390
 
376
- //write
377
- if (b) {
378
- await lowdb.write()
391
+ //autoInsert
392
+ if (autoInsert &amp;&amp; rest.n === 0) {
393
+ rest = await insertCore(v)
379
394
  }
380
395
 
381
- //emit
382
- ee.emit('change', 'save', data, res)
396
+ return rest
397
+ })
383
398
 
384
- }
385
- catch (err) {
386
- isErr = true
387
- res = err
399
+ //write
400
+ if (b) {
401
+ await lowdb.write()
388
402
  }
389
403
 
390
- if (isErr) {
391
- return Promise.reject(res)
392
- }
393
- return res
394
- })
404
+ //emit
405
+ ee.emit('change', 'save', data, res)
406
+
407
+ }
408
+ catch (err) {
409
+ isErr = true
410
+ res = err
411
+ }
412
+
413
+ if (isErr) {
414
+ return Promise.reject(res)
415
+ }
416
+ return res
417
+ }
418
+ async function save(data, option = {}) {
419
+ if (glock) {
420
+ await waitFun(() => {
421
+ return !glock
422
+ })
423
+ }
424
+ glock = true
425
+ return await saveCore(data, option)
426
+ .finally(() => {
427
+ glock = false
428
+ })
395
429
  }
396
430
 
397
431
  /**
@@ -401,127 +435,137 @@ function WOrmLowdb(opt = {}) {
401
435
  * @param {Object|Array} data 輸入數據物件或陣列
402
436
  * @returns {Promise} 回傳Promise,resolve回傳刪除結果,reject回傳錯誤訊息
403
437
  */
404
- async function del(data) {
405
- return await mutex.runExclusive(async () => {
406
- let isErr = false
407
-
408
- //check
409
- if (!iseobj(data) &amp;&amp; !isearr(data)) {
410
- return Promise.reject(`data is not an effective object or array`)
411
- }
412
-
413
- //cloneDeep, 與外部數據脫勾
414
- data = cloneDeep(data)
415
-
416
- //res
417
- let res = null
418
- try {
438
+ async function delCore(data) {
439
+ let isErr = false
419
440
 
420
- //check
421
- if (!isarr(data)) {
422
- data = [data]
423
- }
441
+ //check
442
+ if (!iseobj(data) &amp;&amp; !isearr(data)) {
443
+ return Promise.reject(`data is not an effective object or array`)
444
+ }
424
445
 
425
- //read
426
- await lowdb.read()
446
+ //cloneDeep, 與外部數據脫勾
447
+ data = cloneDeep(data)
427
448
 
428
- //default, 使用lowdb.read()初始化後須馬上檢測, 若無key則須先創建空陣列
429
- if (!haskey(lowdb.data, key)) {
430
- lowdb.data[key] = []
431
- }
449
+ //res
450
+ let res = null
451
+ try {
432
452
 
433
- //kp
434
- let kp = {}
435
- each(lowdb.data[key], (v, k) => {
436
- kp[v.id] = { k, v }
437
- })
453
+ //check
454
+ if (!isarr(data)) {
455
+ data = [data]
456
+ }
438
457
 
439
- //pmSeries
440
- let ks = []
441
- let b = false
442
- res = await pmSeries(data, async(v) => {
458
+ //read
459
+ await lowdb.read()
443
460
 
444
- //rest
445
- let rest = null
461
+ //default, 使用lowdb.read()初始化後須馬上檢測, 若無key則須先創建空陣列
462
+ if (!haskey(lowdb.data, key)) {
463
+ lowdb.data[key] = []
464
+ }
446
465
 
447
- //id
448
- let id = get(v, 'id', '')
466
+ //kp
467
+ let kp = {}
468
+ each(lowdb.data[key], (v, k) => {
469
+ kp[v.id] = { k, v }
470
+ })
449
471
 
450
- //check
451
- if (isestr(id)) {
472
+ //pmSeries
473
+ let ks = []
474
+ let b = false
475
+ res = await pmSeries(data, async(v) => {
452
476
 
453
- //查找資料表內v.id為_v
454
- let r = get(kp, id, null)
477
+ //rest
478
+ let rest = null
455
479
 
456
- //check
457
- if (iseobj(r)) {
458
- //已存在v.id則須刪除
480
+ //id
481
+ let id = get(v, 'id', '')
459
482
 
460
- //push
461
- ks.push(r.k)
483
+ //check
484
+ if (isestr(id)) {
462
485
 
463
- b = true
486
+ //查找資料表內v.id為_v
487
+ let r = get(kp, id, null)
464
488
 
465
- //rest
466
- rest = {
467
- n: 1,
468
- nDeleted: 1,
469
- ok: 1,
470
- }
489
+ //check
490
+ if (iseobj(r)) {
491
+ //已存在v.id則須刪除
471
492
 
472
- }
473
- else {
474
- //不存在v.id則不刪除
493
+ //push
494
+ ks.push(r.k)
475
495
 
476
- //rest
477
- rest = {
478
- n: 1,
479
- nDeleted: 0,
480
- ok: 1,
481
- }
496
+ b = true
482
497
 
498
+ //rest
499
+ rest = {
500
+ n: 1,
501
+ nDeleted: 1,
502
+ ok: 1,
483
503
  }
484
504
 
485
505
  }
486
506
  else {
487
- //未給v.id則不刪除
507
+ //不存在v.id則不刪除
488
508
 
489
509
  //rest
490
510
  rest = {
491
511
  n: 1,
492
512
  nDeleted: 0,
493
- ok: 0, //未給v.id視為有問題數據, 故ok給0
513
+ ok: 1,
494
514
  }
495
515
 
496
516
  }
497
517
 
498
- return rest
499
- })
500
-
501
- //update
502
- if (b) {
503
- lowdb.data[key] = arrPullAt(lowdb.data[key], ks)
504
518
  }
519
+ else {
520
+ //未給v.id則不刪除
521
+
522
+ //rest
523
+ rest = {
524
+ n: 1,
525
+ nDeleted: 0,
526
+ ok: 0, //未給v.id視為有問題數據, 故ok給0
527
+ }
505
528
 
506
- //write
507
- if (b) {
508
- await lowdb.write()
509
529
  }
510
530
 
511
- //emit
512
- ee.emit('change', 'del', data, res)
531
+ return rest
532
+ })
513
533
 
514
- }
515
- catch (err) {
516
- isErr = true
517
- res = err
534
+ //update
535
+ if (b) {
536
+ lowdb.data[key] = arrPullAt(lowdb.data[key], ks)
518
537
  }
519
538
 
520
- if (isErr) {
521
- return Promise.reject(res)
539
+ //write
540
+ if (b) {
541
+ await lowdb.write()
522
542
  }
523
- return res
524
- })
543
+
544
+ //emit
545
+ ee.emit('change', 'del', data, res)
546
+
547
+ }
548
+ catch (err) {
549
+ isErr = true
550
+ res = err
551
+ }
552
+
553
+ if (isErr) {
554
+ return Promise.reject(res)
555
+ }
556
+ return res
557
+ }
558
+ async function del(data) {
559
+ if (glock) {
560
+ await waitFun(() => {
561
+ return !glock
562
+ })
563
+ }
564
+ glock = true
565
+ return await delCore(data)
566
+ .finally(() => {
567
+ glock = false
568
+ })
525
569
  }
526
570
 
527
571
  /**
@@ -531,112 +575,122 @@ function WOrmLowdb(opt = {}) {
531
575
  * @param {Object} [find={}] 輸入刪除條件物件
532
576
  * @returns {Promise} 回傳Promise,resolve回傳刪除結果,reject回傳錯誤訊息
533
577
  */
534
- async function delAll(find = {}) {
535
- return await mutex.runExclusive(async () => {
536
- let isErr = false
537
-
538
- //res
539
- let res = null
540
- try {
541
-
542
- //read
543
- await lowdb.read()
544
-
545
- //default, 使用lowdb.read()初始化後須馬上檢測, 若無key則須先創建空陣列
546
- if (!haskey(lowdb.data, key)) {
547
- lowdb.data[key] = []
548
- }
578
+ async function delAllCore(find = {}) {
579
+ let isErr = false
549
580
 
550
- //filter
551
- let nAll = size(lowdb.data[key])
552
- let nDel = 0
553
- let b = false
554
- if (iseobj(find)) {
581
+ //res
582
+ let res = null
583
+ try {
555
584
 
556
- //q
557
- let q = new Query(find)
558
- // console.log('q', q)
585
+ //read
586
+ await lowdb.read()
559
587
 
560
- //find
561
- let _res = q.find(lowdb.data[key]).all()
562
- // console.log('_res', _res)
588
+ //default, 使用lowdb.read()初始化後須馬上檢測, 若無key則須先創建空陣列
589
+ if (!haskey(lowdb.data, key)) {
590
+ lowdb.data[key] = []
591
+ }
563
592
 
564
- //nDel
565
- nDel = size(_res)
566
- // console.log('nDel', nDel)
593
+ //filter
594
+ let nAll = size(lowdb.data[key])
595
+ let nDel = 0
596
+ let b = false
597
+ if (iseobj(find)) {
567
598
 
568
- if (nDel === 0) {
569
- //未有find結果等於不刪除
570
- }
571
- else if (nAll === nDel) {
572
- //全在find結果內等於全部刪除
599
+ //q
600
+ let q = new Query(find)
601
+ // console.log('q', q)
573
602
 
574
- //empty
575
- lowdb.data[key] = []
603
+ //find
604
+ let _res = q.find(lowdb.data[key]).all()
605
+ // console.log('_res', _res)
576
606
 
577
- b = true
578
- }
579
- else {
580
- //部份在find結果內
581
-
582
- //_kp
583
- let _kp = {}
584
- each(_res, (v, k) => {
585
- _kp[v.id] = { k, v }
586
- })
587
-
588
- //arr
589
- let arr = []
590
- each(lowdb.data[key], (v, k) => {
591
- if (!haskey(_kp, v.id)) {
592
- //未在find結果內代表須保留
593
- arr.push(v)
594
- }
595
- })
596
-
597
- //update
598
- lowdb.data[key] = arr
607
+ //nDel
608
+ nDel = size(_res)
609
+ // console.log('nDel', nDel)
599
610
 
600
- b = true
601
- }
611
+ if (nDel === 0) {
612
+ //未有find結果等於不刪除
602
613
  }
603
- else {
604
-
605
- //nDel
606
- nDel = nAll
614
+ else if (nAll === nDel) {
615
+ //全在find結果內等於全部刪除
607
616
 
608
617
  //empty
609
618
  lowdb.data[key] = []
610
619
 
611
620
  b = true
612
621
  }
622
+ else {
623
+ //部份在find結果內
624
+
625
+ //_kp
626
+ let _kp = {}
627
+ each(_res, (v, k) => {
628
+ _kp[v.id] = { k, v }
629
+ })
630
+
631
+ //arr
632
+ let arr = []
633
+ each(lowdb.data[key], (v, k) => {
634
+ if (!haskey(_kp, v.id)) {
635
+ //未在find結果內代表須保留
636
+ arr.push(v)
637
+ }
638
+ })
613
639
 
614
- //write
615
- if (b) {
616
- await lowdb.write()
617
- }
640
+ //update
641
+ lowdb.data[key] = arr
618
642
 
619
- //res
620
- res = {
621
- n: nAll,
622
- nDeleted: nDel,
623
- ok: 1,
643
+ b = true
624
644
  }
645
+ }
646
+ else {
625
647
 
626
- //emit
627
- ee.emit('change', 'delAll', null, res)
648
+ //nDel
649
+ nDel = nAll
650
+
651
+ //empty
652
+ lowdb.data[key] = []
628
653
 
654
+ b = true
629
655
  }
630
- catch (err) {
631
- isErr = true
632
- res = err
656
+
657
+ //write
658
+ if (b) {
659
+ await lowdb.write()
633
660
  }
634
661
 
635
- if (isErr) {
636
- return Promise.reject(res)
662
+ //res
663
+ res = {
664
+ n: nAll,
665
+ nDeleted: nDel,
666
+ ok: 1,
637
667
  }
638
- return res
639
- })
668
+
669
+ //emit
670
+ ee.emit('change', 'delAll', null, res)
671
+
672
+ }
673
+ catch (err) {
674
+ isErr = true
675
+ res = err
676
+ }
677
+
678
+ if (isErr) {
679
+ return Promise.reject(res)
680
+ }
681
+ return res
682
+ }
683
+ async function delAll(find = {}) {
684
+ if (glock) {
685
+ await waitFun(() => {
686
+ return !glock
687
+ })
688
+ }
689
+ glock = true
690
+ return await delAllCore(find)
691
+ .finally(() => {
692
+ glock = false
693
+ })
640
694
  }
641
695
 
642
696
  //bind
@@ -665,7 +719,7 @@ export default WOrmLowdb
665
719
  <br class="clear">
666
720
 
667
721
  <footer>
668
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Fri May 09 2025 11:30:47 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
722
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Fri May 09 2025 12:29:37 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
669
723
  </footer>
670
724
 
671
725
  <script>prettyPrint();</script>