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