w-orm-lmdb 1.0.3 → 1.0.5

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.
@@ -78,6 +78,9 @@ import waitFun from 'wsemi/src/waitFun.mjs'
78
78
  */
79
79
  function WOrmLmdb(opt = {}) {
80
80
 
81
+ //_cache
82
+ let _cache = null
83
+
81
84
  //url
82
85
  let url = get(opt, 'url')
83
86
  if (!isestr(url)) {
@@ -112,7 +115,11 @@ function WOrmLmdb(opt = {}) {
112
115
 
113
116
  //getData
114
117
  let getData = async() => {
115
- let errTemp = null
118
+
119
+ //check
120
+ if (isarr(_cache)) {
121
+ return cloneDeep(_cache) //與外部使用數據脫勾
122
+ }
116
123
 
117
124
  //waitFun
118
125
  await waitFun(() => {
@@ -121,18 +128,19 @@ function WOrmLmdb(opt = {}) {
121
128
  }
122
129
  return client.status === 'open'
123
130
  })
124
-
125
131
  // console.log('client.status',client.status)
132
+
133
+ //ltdt
126
134
  let ltdt = []
127
135
  for await (let { value: dt } of client.getRange()) {
128
136
  // console.log('dt',dt)
129
137
  ltdt.push(dt)
130
138
  }
131
139
 
132
- if (errTemp !== null) {
133
- return Promise.reject(errTemp)
134
- }
135
- return ltdt
140
+ //update
141
+ _cache = ltdt
142
+
143
+ return cloneDeep(ltdt) //與外部使用數據脫勾
136
144
  }
137
145
 
138
146
  //getValue
@@ -277,18 +285,33 @@ function WOrmLmdb(opt = {}) {
277
285
  ok: 1,
278
286
  }
279
287
 
280
- //emit
281
- ee.emit('change', 'insert', data, res)
282
-
283
288
  }
284
289
  catch (err) {
285
290
  isErr = true
286
291
  res = err
287
292
  }
288
293
 
294
+ //update, 不能保證插入多少, 一律重設快取
295
+ _cache = null
296
+
297
+ //emit, 於change可能須使用select, 故須放在重設快取之後
298
+ if (!isErr) {
299
+ try {
300
+
301
+ //emit
302
+ ee.emit('change', 'insert', data, res)
303
+
304
+ }
305
+ catch (err) {
306
+ console.log(err)
307
+ }
308
+ }
309
+
310
+ //check
289
311
  if (isErr) {
290
312
  return Promise.reject(res)
291
313
  }
314
+
292
315
  return res
293
316
  }
294
317
 
@@ -341,8 +364,11 @@ function WOrmLmdb(opt = {}) {
341
364
  //查找資料表內v.id
342
365
  let vv = await getValue(v.id) //不會有catch
343
366
 
367
+ //existed
368
+ let existed = iseobj(vv)
369
+
344
370
  //check
345
- if (iseobj(vv)) {
371
+ if (existed) {
346
372
  //已存在v.id
347
373
  if (isEqual(v, vv)) {
348
374
  //內容相同不更新
@@ -356,6 +382,9 @@ function WOrmLmdb(opt = {}) {
356
382
  rest = { update: true }
357
383
  }
358
384
  }
385
+ else {
386
+ //內容不存在
387
+ }
359
388
 
360
389
  //rest
361
390
  if (iseobj(rest)) {
@@ -372,27 +401,46 @@ function WOrmLmdb(opt = {}) {
372
401
  ok: 1,
373
402
  }
374
403
  }
404
+ //rest.n === 0:
405
+ // 內容相同不更新, 不須update
406
+ // 內容不存在, 若autoInsert則須insert
375
407
 
376
408
  //autoInsert
377
- if (autoInsert && rest.n === 0) {
409
+ if (autoInsert && rest.n === 0 && !existed) {
410
+ // console.log('insert(v)', v)
378
411
  rest = await insert(v)
379
412
  }
380
413
 
381
414
  return rest
382
415
  })
383
416
 
384
- //emit
385
- ee.emit('change', 'save', data, res)
386
-
387
417
  }
388
418
  catch (err) {
389
419
  isErr = true
390
420
  res = err
391
421
  }
392
422
 
423
+ //update, 不能保證變更多少, 一律重設快取
424
+ _cache = null
425
+
426
+ //emit, 於change可能須使用select, 故須放在重設快取之後
427
+ if (!isErr) {
428
+ try {
429
+
430
+ //emit
431
+ ee.emit('change', 'save', data, res)
432
+
433
+ }
434
+ catch (err) {
435
+ console.log(err)
436
+ }
437
+ }
438
+
439
+ //check
393
440
  if (isErr) {
394
441
  return Promise.reject(res)
395
442
  }
443
+
396
444
  return res
397
445
  }
398
446
 
@@ -481,18 +529,33 @@ function WOrmLmdb(opt = {}) {
481
529
  return rest
482
530
  })
483
531
 
484
- //emit
485
- ee.emit('change', 'del', data, res)
486
-
487
532
  }
488
533
  catch (err) {
489
534
  isErr = true
490
535
  res = err
491
536
  }
492
537
 
538
+ //update, 不能保證刪除多少, 一律重設快取
539
+ _cache = null
540
+
541
+ //emit, 於change可能須使用select, 故須放在重設快取之後
542
+ if (!isErr) {
543
+ try {
544
+
545
+ //emit
546
+ ee.emit('change', 'del', data, res)
547
+
548
+ }
549
+ catch (err) {
550
+ console.log(err)
551
+ }
552
+ }
553
+
554
+ //check
493
555
  if (isErr) {
494
556
  return Promise.reject(res)
495
557
  }
558
+
496
559
  return res
497
560
  }
498
561
 
@@ -580,18 +643,33 @@ function WOrmLmdb(opt = {}) {
580
643
  ok: 1,
581
644
  }
582
645
 
583
- //emit
584
- ee.emit('change', 'delAll', null, res)
585
-
586
646
  }
587
647
  catch (err) {
588
648
  isErr = true
589
649
  res = err
590
650
  }
591
651
 
652
+ //update, 不能保證刪除多少, 一律重設快取
653
+ _cache = null
654
+
655
+ //emit, 於change可能須使用select, 故須放在重設快取之後
656
+ if (!isErr) {
657
+ try {
658
+
659
+ //emit
660
+ ee.emit('change', 'delAll', null, res)
661
+
662
+ }
663
+ catch (err) {
664
+ console.log(err)
665
+ }
666
+ }
667
+
668
+ //check
592
669
  if (isErr) {
593
670
  return Promise.reject(res)
594
671
  }
672
+
595
673
  return res
596
674
  }
597
675
 
@@ -621,7 +699,7 @@ export default WOrmLmdb
621
699
  <br class="clear">
622
700
 
623
701
  <footer>
624
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Tue Oct 07 2025 23:37:26 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
702
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Thu May 14 2026 19:53:45 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
625
703
  </footer>
626
704
 
627
705
  <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.4</a> on Tue Oct 07 2025 23:37:26 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
74
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Thu May 14 2026 19:53:45 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
@@ -45,6 +45,14 @@ let rsm = [
45
45
  },
46
46
  ]
47
47
 
48
+ let rsa = [
49
+ {
50
+ id: 'id-rosemary',
51
+ name: 'rosemary',
52
+ value: 654.321,
53
+ },
54
+ ]
55
+
48
56
  async function test() {
49
57
 
50
58
  //wo
@@ -108,6 +116,15 @@ async function test() {
108
116
  // let sr = await wo.select({ name: { $regex: 'PeT', $options: '$i' } })
109
117
  // console.log('selectReg', sr)
110
118
 
119
+ //save
120
+ await wo.save(rsa, { autoInsert: true })
121
+ .then(function(msg) {
122
+ console.log('save then', msg)
123
+ })
124
+ .catch(function(msg) {
125
+ console.log('save catch', msg)
126
+ })
127
+
111
128
  //del
112
129
  let d = ss.filter(function(v) {
113
130
  return v.name === 'kettle'
@@ -162,6 +179,8 @@ test()
162
179
  // value: 123.456
163
180
  // }
164
181
  // ]
182
+ // change save
183
+ // save then [ { n: 1, nModified: 1, ok: 1 } ]
165
184
  // change del
166
185
  // del then [ { n: 1, nDeleted: 1, ok: 1 } ]
167
186
 
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "w-orm-lmdb",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "main": "dist/w-orm-lmdb.umd.js",
5
5
  "dependencies": {
6
- "lodash-es": "^4.17.21",
7
- "lmdb": "^3.4.3",
8
- "mingo": "^6.7.0",
9
- "wsemi": "^1.8.22"
6
+ "lodash-es": "^4.18.1",
7
+ "lmdb": "^3.5.4",
8
+ "mingo": "^7.2.1",
9
+ "wsemi": "^1.8.52"
10
10
  },
11
11
  "devDependencies": {
12
- "w-package-tools": "^1.1.2"
12
+ "w-package-tools": "^1.1.5"
13
13
  },
14
14
  "scripts": {
15
15
  "test": "mocha --parallel --timeout 60000",
package/src/WOrmLmdb.mjs CHANGED
@@ -31,6 +31,9 @@ import waitFun from 'wsemi/src/waitFun.mjs'
31
31
  */
32
32
  function WOrmLmdb(opt = {}) {
33
33
 
34
+ //_cache
35
+ let _cache = null
36
+
34
37
  //url
35
38
  let url = get(opt, 'url')
36
39
  if (!isestr(url)) {
@@ -65,7 +68,11 @@ function WOrmLmdb(opt = {}) {
65
68
 
66
69
  //getData
67
70
  let getData = async() => {
68
- let errTemp = null
71
+
72
+ //check
73
+ if (isarr(_cache)) {
74
+ return cloneDeep(_cache) //與外部使用數據脫勾
75
+ }
69
76
 
70
77
  //waitFun
71
78
  await waitFun(() => {
@@ -74,18 +81,19 @@ function WOrmLmdb(opt = {}) {
74
81
  }
75
82
  return client.status === 'open'
76
83
  })
77
-
78
84
  // console.log('client.status',client.status)
85
+
86
+ //ltdt
79
87
  let ltdt = []
80
88
  for await (let { value: dt } of client.getRange()) {
81
89
  // console.log('dt',dt)
82
90
  ltdt.push(dt)
83
91
  }
84
92
 
85
- if (errTemp !== null) {
86
- return Promise.reject(errTemp)
87
- }
88
- return ltdt
93
+ //update
94
+ _cache = ltdt
95
+
96
+ return cloneDeep(ltdt) //與外部使用數據脫勾
89
97
  }
90
98
 
91
99
  //getValue
@@ -230,18 +238,33 @@ function WOrmLmdb(opt = {}) {
230
238
  ok: 1,
231
239
  }
232
240
 
233
- //emit
234
- ee.emit('change', 'insert', data, res)
235
-
236
241
  }
237
242
  catch (err) {
238
243
  isErr = true
239
244
  res = err
240
245
  }
241
246
 
247
+ //update, 不能保證插入多少, 一律重設快取
248
+ _cache = null
249
+
250
+ //emit, 於change可能須使用select, 故須放在重設快取之後
251
+ if (!isErr) {
252
+ try {
253
+
254
+ //emit
255
+ ee.emit('change', 'insert', data, res)
256
+
257
+ }
258
+ catch (err) {
259
+ console.log(err)
260
+ }
261
+ }
262
+
263
+ //check
242
264
  if (isErr) {
243
265
  return Promise.reject(res)
244
266
  }
267
+
245
268
  return res
246
269
  }
247
270
 
@@ -294,8 +317,11 @@ function WOrmLmdb(opt = {}) {
294
317
  //查找資料表內v.id
295
318
  let vv = await getValue(v.id) //不會有catch
296
319
 
320
+ //existed
321
+ let existed = iseobj(vv)
322
+
297
323
  //check
298
- if (iseobj(vv)) {
324
+ if (existed) {
299
325
  //已存在v.id
300
326
  if (isEqual(v, vv)) {
301
327
  //內容相同不更新
@@ -309,6 +335,9 @@ function WOrmLmdb(opt = {}) {
309
335
  rest = { update: true }
310
336
  }
311
337
  }
338
+ else {
339
+ //內容不存在
340
+ }
312
341
 
313
342
  //rest
314
343
  if (iseobj(rest)) {
@@ -325,27 +354,46 @@ function WOrmLmdb(opt = {}) {
325
354
  ok: 1,
326
355
  }
327
356
  }
357
+ //rest.n === 0:
358
+ // 內容相同不更新, 不須update
359
+ // 內容不存在, 若autoInsert則須insert
328
360
 
329
361
  //autoInsert
330
- if (autoInsert && rest.n === 0) {
362
+ if (autoInsert && rest.n === 0 && !existed) {
363
+ // console.log('insert(v)', v)
331
364
  rest = await insert(v)
332
365
  }
333
366
 
334
367
  return rest
335
368
  })
336
369
 
337
- //emit
338
- ee.emit('change', 'save', data, res)
339
-
340
370
  }
341
371
  catch (err) {
342
372
  isErr = true
343
373
  res = err
344
374
  }
345
375
 
376
+ //update, 不能保證變更多少, 一律重設快取
377
+ _cache = null
378
+
379
+ //emit, 於change可能須使用select, 故須放在重設快取之後
380
+ if (!isErr) {
381
+ try {
382
+
383
+ //emit
384
+ ee.emit('change', 'save', data, res)
385
+
386
+ }
387
+ catch (err) {
388
+ console.log(err)
389
+ }
390
+ }
391
+
392
+ //check
346
393
  if (isErr) {
347
394
  return Promise.reject(res)
348
395
  }
396
+
349
397
  return res
350
398
  }
351
399
 
@@ -434,18 +482,33 @@ function WOrmLmdb(opt = {}) {
434
482
  return rest
435
483
  })
436
484
 
437
- //emit
438
- ee.emit('change', 'del', data, res)
439
-
440
485
  }
441
486
  catch (err) {
442
487
  isErr = true
443
488
  res = err
444
489
  }
445
490
 
491
+ //update, 不能保證刪除多少, 一律重設快取
492
+ _cache = null
493
+
494
+ //emit, 於change可能須使用select, 故須放在重設快取之後
495
+ if (!isErr) {
496
+ try {
497
+
498
+ //emit
499
+ ee.emit('change', 'del', data, res)
500
+
501
+ }
502
+ catch (err) {
503
+ console.log(err)
504
+ }
505
+ }
506
+
507
+ //check
446
508
  if (isErr) {
447
509
  return Promise.reject(res)
448
510
  }
511
+
449
512
  return res
450
513
  }
451
514
 
@@ -533,18 +596,33 @@ function WOrmLmdb(opt = {}) {
533
596
  ok: 1,
534
597
  }
535
598
 
536
- //emit
537
- ee.emit('change', 'delAll', null, res)
538
-
539
599
  }
540
600
  catch (err) {
541
601
  isErr = true
542
602
  res = err
543
603
  }
544
604
 
605
+ //update, 不能保證刪除多少, 一律重設快取
606
+ _cache = null
607
+
608
+ //emit, 於change可能須使用select, 故須放在重設快取之後
609
+ if (!isErr) {
610
+ try {
611
+
612
+ //emit
613
+ ee.emit('change', 'delAll', null, res)
614
+
615
+ }
616
+ catch (err) {
617
+ console.log(err)
618
+ }
619
+ }
620
+
621
+ //check
545
622
  if (isErr) {
546
623
  return Promise.reject(res)
547
624
  }
625
+
548
626
  return res
549
627
  }
550
628
 
@@ -57,6 +57,14 @@ if (isWindows()) {
57
57
  },
58
58
  ]
59
59
 
60
+ let rsa = [
61
+ {
62
+ id: 'id-rosemary',
63
+ name: 'rosemary',
64
+ value: 654.321,
65
+ },
66
+ ]
67
+
60
68
  //wo
61
69
  let wo = WOrm(opt)
62
70
 
@@ -287,9 +295,28 @@ if (isWindows()) {
287
295
  // })
288
296
  // vget[9] = rt
289
297
 
298
+ //save
299
+ rt = null
300
+ // vans[10] = [ { n: 1, nModified: 1, ok: 1 } ]
301
+ await wo.save(rsa, { autoInsert: true })
302
+ .then(function(msg) {
303
+ // console.log('save then', msg)
304
+ // save then [
305
+ // { n: 1, nModified: 1, ok: 1 },
306
+ // { n: 1, nModified: 1, ok: 1 },
307
+ // { n: 0, nModified: 0, ok: 1 }
308
+ // ]
309
+ rt = msg
310
+ })
311
+ .catch(function(msg) {
312
+ // console.log('save catch', msg)
313
+ rt = msg.toString()
314
+ })
315
+ vget[10] = rt
316
+
290
317
  //del
291
318
  rt = null
292
- // vans[10] = [{ n: 1, nDeleted: 1, ok: 1 }]
319
+ // vans[11] = [{ n: 1, nDeleted: 1, ok: 1 }]
293
320
  let ss = await wo.select()
294
321
  let d = ss.filter(function(v) {
295
322
  return v.name === 'kettle'
@@ -304,7 +331,7 @@ if (isWindows()) {
304
331
  // console.log('del catch', msg)
305
332
  rt = msg.toString()
306
333
  })
307
- vget[10] = rt
334
+ vget[11] = rt
308
335
 
309
336
  })
310
337
 
@@ -326,7 +353,7 @@ if (isWindows()) {
326
353
  { n: 1, nModified: 1, ok: 1 },
327
354
  { n: 0, nModified: 0, ok: 1 }
328
355
  ]
329
- it(`should get ${JSON.stringify(vans[3])} for save`, async function() {
356
+ it(`should get ${JSON.stringify(vans[3])} for save(autoInsert=false)`, async function() {
330
357
  assert.strict.deepStrictEqual(vget[3], vans[3])
331
358
  })
332
359
 
@@ -385,11 +412,16 @@ if (isWindows()) {
385
412
  // assert.strict.deepStrictEqual(vget[9], vans[9])
386
413
  // })
387
414
 
388
- vans[10] = [{ n: 1, nDeleted: 1, ok: 1 }]
389
- it(`should get ${JSON.stringify(vans[10])} for del`, async function() {
415
+ vans[10] = [{ n: 1, nModified: 1, ok: 1 }]
416
+ it(`should get ${JSON.stringify(vans[10])} for save(autoInsert=true)`, async function() {
390
417
  assert.strict.deepStrictEqual(vget[10], vans[10])
391
418
  })
392
419
 
420
+ vans[11] = [{ n: 1, nDeleted: 1, ok: 1 }]
421
+ it(`should get ${JSON.stringify(vans[11])} for del`, async function() {
422
+ assert.strict.deepStrictEqual(vget[11], vans[11])
423
+ })
424
+
393
425
  })
394
426
  }
395
427