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.
- package/dist/w-orm-lowdb.umd.js +2 -2
- package/dist/w-orm-lowdb.umd.js.map +1 -1
- package/docs/WOrmLowdb.html +42 -42
- package/docs/WOrmLowdb.mjs.html +389 -335
- package/docs/index.html +2 -2
- package/package.json +1 -2
- package/src/WOrmLowdb.mjs +387 -333
package/docs/WOrmLowdb.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="WOrmLowdb.html">WOrmLowdb</a><ul class='methods'><li data-type='method'><a href="WOrmLowdb.html#.
|
|
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
|
|
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
|
|
178
|
-
|
|
179
|
-
let isErr = false
|
|
180
|
-
|
|
181
|
-
//check
|
|
182
|
-
if (!iseobj(data) && !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
|
-
|
|
190
|
-
|
|
191
|
-
|
|
194
|
+
//check
|
|
195
|
+
if (!iseobj(data) && !isearr(data)) {
|
|
196
|
+
return Promise.reject(`data is not an effective object or array`)
|
|
197
|
+
}
|
|
192
198
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
data = [data]
|
|
196
|
-
}
|
|
199
|
+
//cloneDeep, 與外部數據脫勾
|
|
200
|
+
data = cloneDeep(data)
|
|
197
201
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
v.id = genID()
|
|
202
|
-
}
|
|
203
|
-
return v
|
|
204
|
-
})
|
|
202
|
+
//res
|
|
203
|
+
let res = null
|
|
204
|
+
try {
|
|
205
205
|
|
|
206
|
-
|
|
207
|
-
|
|
206
|
+
//check
|
|
207
|
+
if (!isarr(data)) {
|
|
208
|
+
data = [data]
|
|
209
|
+
}
|
|
208
210
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
-
|
|
215
|
-
|
|
216
|
-
each(lowdb.data[key], (v, k) => {
|
|
217
|
-
kp[v.id] = { k, v }
|
|
218
|
-
})
|
|
219
|
+
//read
|
|
220
|
+
await lowdb.read()
|
|
219
221
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
each(data, (v) => {
|
|
222
|
+
//default, 使用lowdb.read()初始化後須馬上檢測, 若無key則須先創建空陣列
|
|
223
|
+
if (!haskey(lowdb.data, key)) {
|
|
224
|
+
lowdb.data[key] = []
|
|
225
|
+
}
|
|
225
226
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
227
|
+
//kp
|
|
228
|
+
let kp = {}
|
|
229
|
+
each(lowdb.data[key], (v, k) => {
|
|
230
|
+
kp[v.id] = { k, v }
|
|
231
|
+
})
|
|
229
232
|
|
|
230
|
-
|
|
231
|
-
|
|
233
|
+
//each
|
|
234
|
+
let nAll = size(data)
|
|
235
|
+
let nPush = 0
|
|
236
|
+
let b = false
|
|
237
|
+
each(data, (v) => {
|
|
232
238
|
|
|
233
|
-
|
|
234
|
-
|
|
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
|
-
|
|
243
|
-
|
|
244
|
-
await lowdb.write()
|
|
246
|
+
nPush++
|
|
247
|
+
b = true
|
|
245
248
|
}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
res = {
|
|
249
|
-
n: nAll,
|
|
250
|
-
nInserted: nPush,
|
|
251
|
-
ok: 1,
|
|
249
|
+
else {
|
|
250
|
+
//已存在v.id則不push
|
|
252
251
|
}
|
|
253
252
|
|
|
254
|
-
|
|
255
|
-
ee.emit('change', 'insert', data, res)
|
|
253
|
+
})
|
|
256
254
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
res = err
|
|
255
|
+
//write
|
|
256
|
+
if (b) {
|
|
257
|
+
await lowdb.write()
|
|
261
258
|
}
|
|
262
259
|
|
|
263
|
-
|
|
264
|
-
|
|
260
|
+
//res
|
|
261
|
+
res = {
|
|
262
|
+
n: nAll,
|
|
263
|
+
nInserted: nPush,
|
|
264
|
+
ok: 1,
|
|
265
265
|
}
|
|
266
|
-
|
|
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
|
|
280
|
-
|
|
281
|
-
let isErr = false
|
|
282
|
-
|
|
283
|
-
//check
|
|
284
|
-
if (!iseobj(data) && !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
|
-
|
|
292
|
-
|
|
306
|
+
//check
|
|
307
|
+
if (!iseobj(data) && !isearr(data)) {
|
|
308
|
+
return Promise.reject(`data is not an effective object or array`)
|
|
309
|
+
}
|
|
293
310
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
try {
|
|
311
|
+
//cloneDeep, 與外部數據脫勾
|
|
312
|
+
data = cloneDeep(data)
|
|
297
313
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
data = [data]
|
|
301
|
-
}
|
|
314
|
+
//autoInsert
|
|
315
|
+
let autoInsert = get(option, 'autoInsert', true)
|
|
302
316
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
v.id = genID()
|
|
307
|
-
}
|
|
308
|
-
return v
|
|
309
|
-
})
|
|
317
|
+
//res
|
|
318
|
+
let res = null
|
|
319
|
+
try {
|
|
310
320
|
|
|
311
|
-
|
|
312
|
-
|
|
321
|
+
//check
|
|
322
|
+
if (!isarr(data)) {
|
|
323
|
+
data = [data]
|
|
324
|
+
}
|
|
313
325
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
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
|
-
|
|
320
|
-
|
|
321
|
-
each(lowdb.data[key], (v, k) => {
|
|
322
|
-
kp[v.id] = { k, v }
|
|
323
|
-
})
|
|
334
|
+
//read
|
|
335
|
+
await lowdb.read()
|
|
324
336
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
337
|
+
//default, 使用lowdb.read()初始化後須馬上檢測, 若無key則須先創建空陣列
|
|
338
|
+
if (!haskey(lowdb.data, key)) {
|
|
339
|
+
lowdb.data[key] = []
|
|
340
|
+
}
|
|
328
341
|
|
|
329
|
-
|
|
330
|
-
|
|
342
|
+
//kp
|
|
343
|
+
let kp = {}
|
|
344
|
+
each(lowdb.data[key], (v, k) => {
|
|
345
|
+
kp[v.id] = { k, v }
|
|
346
|
+
})
|
|
331
347
|
|
|
332
|
-
|
|
333
|
-
|
|
348
|
+
//pmSeries
|
|
349
|
+
let b = false
|
|
350
|
+
res = await pmSeries(data, async(v) => {
|
|
334
351
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
//已存在v.id
|
|
338
|
-
if (isEqual(v, r.v)) {
|
|
339
|
-
//內容相同不更新
|
|
340
|
-
}
|
|
341
|
-
else {
|
|
342
|
-
//內容不同須更新
|
|
352
|
+
//rest
|
|
353
|
+
let rest = null
|
|
343
354
|
|
|
344
|
-
|
|
345
|
-
|
|
355
|
+
//查找資料表內v.id
|
|
356
|
+
let r = get(kp, v.id, null)
|
|
346
357
|
|
|
347
|
-
|
|
348
|
-
|
|
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
|
-
|
|
362
|
-
n: 0,
|
|
363
|
-
nModified: 0,
|
|
364
|
-
ok: 1,
|
|
365
|
-
}
|
|
366
|
-
}
|
|
365
|
+
//內容不同須更新
|
|
367
366
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
377
|
-
if (
|
|
378
|
-
await
|
|
391
|
+
//autoInsert
|
|
392
|
+
if (autoInsert && rest.n === 0) {
|
|
393
|
+
rest = await insertCore(v)
|
|
379
394
|
}
|
|
380
395
|
|
|
381
|
-
|
|
382
|
-
|
|
396
|
+
return rest
|
|
397
|
+
})
|
|
383
398
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
res = err
|
|
399
|
+
//write
|
|
400
|
+
if (b) {
|
|
401
|
+
await lowdb.write()
|
|
388
402
|
}
|
|
389
403
|
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
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
|
|
405
|
-
|
|
406
|
-
let isErr = false
|
|
407
|
-
|
|
408
|
-
//check
|
|
409
|
-
if (!iseobj(data) && !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
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
441
|
+
//check
|
|
442
|
+
if (!iseobj(data) && !isearr(data)) {
|
|
443
|
+
return Promise.reject(`data is not an effective object or array`)
|
|
444
|
+
}
|
|
424
445
|
|
|
425
|
-
|
|
426
|
-
|
|
446
|
+
//cloneDeep, 與外部數據脫勾
|
|
447
|
+
data = cloneDeep(data)
|
|
427
448
|
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
}
|
|
449
|
+
//res
|
|
450
|
+
let res = null
|
|
451
|
+
try {
|
|
432
452
|
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
})
|
|
453
|
+
//check
|
|
454
|
+
if (!isarr(data)) {
|
|
455
|
+
data = [data]
|
|
456
|
+
}
|
|
438
457
|
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
let b = false
|
|
442
|
-
res = await pmSeries(data, async(v) => {
|
|
458
|
+
//read
|
|
459
|
+
await lowdb.read()
|
|
443
460
|
|
|
444
|
-
|
|
445
|
-
|
|
461
|
+
//default, 使用lowdb.read()初始化後須馬上檢測, 若無key則須先創建空陣列
|
|
462
|
+
if (!haskey(lowdb.data, key)) {
|
|
463
|
+
lowdb.data[key] = []
|
|
464
|
+
}
|
|
446
465
|
|
|
447
|
-
|
|
448
|
-
|
|
466
|
+
//kp
|
|
467
|
+
let kp = {}
|
|
468
|
+
each(lowdb.data[key], (v, k) => {
|
|
469
|
+
kp[v.id] = { k, v }
|
|
470
|
+
})
|
|
449
471
|
|
|
450
|
-
|
|
451
|
-
|
|
472
|
+
//pmSeries
|
|
473
|
+
let ks = []
|
|
474
|
+
let b = false
|
|
475
|
+
res = await pmSeries(data, async(v) => {
|
|
452
476
|
|
|
453
|
-
|
|
454
|
-
|
|
477
|
+
//rest
|
|
478
|
+
let rest = null
|
|
455
479
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
//已存在v.id則須刪除
|
|
480
|
+
//id
|
|
481
|
+
let id = get(v, 'id', '')
|
|
459
482
|
|
|
460
|
-
|
|
461
|
-
|
|
483
|
+
//check
|
|
484
|
+
if (isestr(id)) {
|
|
462
485
|
|
|
463
|
-
|
|
486
|
+
//查找資料表內v.id為_v
|
|
487
|
+
let r = get(kp, id, null)
|
|
464
488
|
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
nDeleted: 1,
|
|
469
|
-
ok: 1,
|
|
470
|
-
}
|
|
489
|
+
//check
|
|
490
|
+
if (iseobj(r)) {
|
|
491
|
+
//已存在v.id則須刪除
|
|
471
492
|
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
//不存在v.id則不刪除
|
|
493
|
+
//push
|
|
494
|
+
ks.push(r.k)
|
|
475
495
|
|
|
476
|
-
|
|
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
|
-
|
|
507
|
+
//不存在v.id則不刪除
|
|
488
508
|
|
|
489
509
|
//rest
|
|
490
510
|
rest = {
|
|
491
511
|
n: 1,
|
|
492
512
|
nDeleted: 0,
|
|
493
|
-
ok:
|
|
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
|
-
|
|
512
|
-
|
|
531
|
+
return rest
|
|
532
|
+
})
|
|
513
533
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
res = err
|
|
534
|
+
//update
|
|
535
|
+
if (b) {
|
|
536
|
+
lowdb.data[key] = arrPullAt(lowdb.data[key], ks)
|
|
518
537
|
}
|
|
519
538
|
|
|
520
|
-
|
|
521
|
-
|
|
539
|
+
//write
|
|
540
|
+
if (b) {
|
|
541
|
+
await lowdb.write()
|
|
522
542
|
}
|
|
523
|
-
|
|
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
|
|
535
|
-
|
|
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
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
let b = false
|
|
554
|
-
if (iseobj(find)) {
|
|
581
|
+
//res
|
|
582
|
+
let res = null
|
|
583
|
+
try {
|
|
555
584
|
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
// console.log('q', q)
|
|
585
|
+
//read
|
|
586
|
+
await lowdb.read()
|
|
559
587
|
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
588
|
+
//default, 使用lowdb.read()初始化後須馬上檢測, 若無key則須先創建空陣列
|
|
589
|
+
if (!haskey(lowdb.data, key)) {
|
|
590
|
+
lowdb.data[key] = []
|
|
591
|
+
}
|
|
563
592
|
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
593
|
+
//filter
|
|
594
|
+
let nAll = size(lowdb.data[key])
|
|
595
|
+
let nDel = 0
|
|
596
|
+
let b = false
|
|
597
|
+
if (iseobj(find)) {
|
|
567
598
|
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
else if (nAll === nDel) {
|
|
572
|
-
//全在find結果內等於全部刪除
|
|
599
|
+
//q
|
|
600
|
+
let q = new Query(find)
|
|
601
|
+
// console.log('q', q)
|
|
573
602
|
|
|
574
|
-
|
|
575
|
-
|
|
603
|
+
//find
|
|
604
|
+
let _res = q.find(lowdb.data[key]).all()
|
|
605
|
+
// console.log('_res', _res)
|
|
576
606
|
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
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
|
-
|
|
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
|
-
|
|
615
|
-
|
|
616
|
-
await lowdb.write()
|
|
617
|
-
}
|
|
640
|
+
//update
|
|
641
|
+
lowdb.data[key] = arr
|
|
618
642
|
|
|
619
|
-
|
|
620
|
-
res = {
|
|
621
|
-
n: nAll,
|
|
622
|
-
nDeleted: nDel,
|
|
623
|
-
ok: 1,
|
|
643
|
+
b = true
|
|
624
644
|
}
|
|
645
|
+
}
|
|
646
|
+
else {
|
|
625
647
|
|
|
626
|
-
//
|
|
627
|
-
|
|
648
|
+
//nDel
|
|
649
|
+
nDel = nAll
|
|
650
|
+
|
|
651
|
+
//empty
|
|
652
|
+
lowdb.data[key] = []
|
|
628
653
|
|
|
654
|
+
b = true
|
|
629
655
|
}
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
656
|
+
|
|
657
|
+
//write
|
|
658
|
+
if (b) {
|
|
659
|
+
await lowdb.write()
|
|
633
660
|
}
|
|
634
661
|
|
|
635
|
-
|
|
636
|
-
|
|
662
|
+
//res
|
|
663
|
+
res = {
|
|
664
|
+
n: nAll,
|
|
665
|
+
nDeleted: nDel,
|
|
666
|
+
ok: 1,
|
|
637
667
|
}
|
|
638
|
-
|
|
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
|
|
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>
|