w-orm-lowdb 1.0.2 → 1.0.4

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