w-orm-lmdb 1.0.1

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.
Files changed (51) hide show
  1. package/.editorconfig +9 -0
  2. package/.eslintignore +3 -0
  3. package/.eslintrc.js +55 -0
  4. package/.jsdoc +25 -0
  5. package/LICENSE +21 -0
  6. package/README.md +187 -0
  7. package/SECURITY.md +5 -0
  8. package/babel.config.js +15 -0
  9. package/dist/w-orm-lmdb.umd.js +7 -0
  10. package/dist/w-orm-lmdb.umd.js.map +1 -0
  11. package/docs/WOrmLmdb.html +1406 -0
  12. package/docs/WOrmLmdb.mjs.html +633 -0
  13. package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  14. package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  15. package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  16. package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  17. package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  18. package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  19. package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  20. package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  21. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  22. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
  23. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  24. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  25. package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  26. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  27. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
  28. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  29. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  30. package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  31. package/docs/index.html +84 -0
  32. package/docs/scripts/collapse.js +39 -0
  33. package/docs/scripts/commonNav.js +28 -0
  34. package/docs/scripts/linenumber.js +25 -0
  35. package/docs/scripts/nav.js +12 -0
  36. package/docs/scripts/polyfill.js +4 -0
  37. package/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  38. package/docs/scripts/prettify/lang-css.js +2 -0
  39. package/docs/scripts/prettify/prettify.js +28 -0
  40. package/docs/scripts/search.js +99 -0
  41. package/docs/styles/jsdoc.css +776 -0
  42. package/docs/styles/prettify.css +80 -0
  43. package/g-basic.mjs +169 -0
  44. package/package.json +32 -0
  45. package/script.txt +18 -0
  46. package/src/WOrmLmdb.mjs +561 -0
  47. package/test/basic.test.mjs +395 -0
  48. package/toolg/addVersion.mjs +4 -0
  49. package/toolg/cleanFolder.mjs +4 -0
  50. package/toolg/gDistRollup.mjs +23 -0
  51. package/toolg/modifyReadme.mjs +4 -0
@@ -0,0 +1,633 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+
5
+ <meta charset="utf-8">
6
+ <title>WOrmLmdb.mjs - Documentation</title>
7
+
8
+
9
+ <script src="scripts/prettify/prettify.js"></script>
10
+ <script src="scripts/prettify/lang-css.js"></script>
11
+ <!--[if lt IE 9]>
12
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
13
+ <![endif]-->
14
+ <link type="text/css" rel="stylesheet" href="styles/prettify.css">
15
+ <link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
16
+ <script src="scripts/nav.js" defer></script>
17
+
18
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
19
+ </head>
20
+ <body>
21
+
22
+ <input type="checkbox" id="nav-trigger" class="nav-trigger" />
23
+ <label for="nav-trigger" class="navicon-button x">
24
+ <div class="navicon"></div>
25
+ </label>
26
+
27
+ <label for="nav-trigger" class="overlay"></label>
28
+
29
+ <nav >
30
+
31
+
32
+ <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WOrmLmdb.html">WOrmLmdb</a><ul class='methods'><li data-type='method'><a href="WOrmLmdb.html#.del">del</a></li><li data-type='method'><a href="WOrmLmdb.html#.delAll">delAll</a></li><li data-type='method'><a href="WOrmLmdb.html#.insert">insert</a></li><li data-type='method'><a href="WOrmLmdb.html#.save">save</a></li><li data-type='method'><a href="WOrmLmdb.html#.select">select</a></li></ul></li></ul>
33
+
34
+ </nav>
35
+
36
+ <div id="main">
37
+
38
+ <h1 class="page-title">WOrmLmdb.mjs</h1>
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ <section>
47
+ <article>
48
+ <pre class="prettyprint source linenums"><code>import { open } from 'lmdb'
49
+ import { Query } from 'mingo'
50
+ import size from 'lodash-es/size.js'
51
+ import get from 'lodash-es/get.js'
52
+ import each from 'lodash-es/each.js'
53
+ import map from 'lodash-es/map.js'
54
+ import merge from 'lodash-es/merge.js'
55
+ import isEqual from 'lodash-es/isEqual.js'
56
+ import cloneDeep from 'lodash-es/cloneDeep.js'
57
+ import isestr from 'wsemi/src/isestr.mjs'
58
+ import isarr from 'wsemi/src/isarr.mjs'
59
+ import isearr from 'wsemi/src/isearr.mjs'
60
+ import iseobj from 'wsemi/src/iseobj.mjs'
61
+ import haskey from 'wsemi/src/haskey.mjs'
62
+ import evem from 'wsemi/src/evem.mjs'
63
+ import genID from 'wsemi/src/genID.mjs'
64
+ import pmSeries from 'wsemi/src/pmSeries.mjs'
65
+ import waitFun from 'wsemi/src/waitFun.mjs'
66
+
67
+
68
+ /**
69
+ * 操作資料庫(LMDB)
70
+ *
71
+ * @class
72
+ * @param {Object} [opt={}] 輸入設定物件,預設{}
73
+ * @param {String} [opt.url='_db'] 輸入資料庫用資料夾字串,預設'_db'
74
+ * @param {String} [opt.db='worm'] 輸入使用資料庫名稱字串,預設'worm'
75
+ * @param {String} [opt.cl='test'] 輸入使用資料表名稱字串,預設'test'
76
+ * @returns {Object} 回傳操作資料庫物件,各事件功能詳見說明
77
+ */
78
+ function WOrmLmdb(opt = {}) {
79
+
80
+ //url
81
+ let url = get(opt, 'url')
82
+ if (!isestr(url)) {
83
+ url = './_db'
84
+ }
85
+
86
+ //db
87
+ let db = get(opt, 'db')
88
+ if (!isestr(db)) {
89
+ db = 'worm'
90
+ }
91
+
92
+ //cl
93
+ let cl = get(opt, 'cl')
94
+ if (!isestr(cl)) {
95
+ cl = 'test'
96
+ }
97
+
98
+ //storage
99
+ let storage = `${url}/${db}/${cl}`
100
+ // console.log('storage',storage)
101
+
102
+ // client
103
+ let client = open({
104
+ path: storage,
105
+ compression: true,
106
+ useVersions: true,
107
+ })
108
+
109
+ //ee
110
+ let ee = evem()
111
+
112
+ //getData
113
+ let getData = async() => {
114
+ let errTemp = null
115
+
116
+ //waitFun
117
+ await waitFun(() => {
118
+ if (client.status === 'closed') {
119
+ console.log(`client.status[${client.status}], level is closed`)
120
+ }
121
+ return client.status === 'open'
122
+ })
123
+
124
+ // console.log('client.status',client.status)
125
+ let ltdt = []
126
+ for await (let { value: dt } of client.getRange()) {
127
+ // console.log('dt',dt)
128
+ ltdt.push(dt)
129
+ }
130
+
131
+ if (errTemp !== null) {
132
+ return Promise.reject(errTemp)
133
+ }
134
+ return ltdt
135
+ }
136
+
137
+ //getValue
138
+ let getValue = async (key) => {
139
+ let value = null
140
+ try {
141
+ value = await client.get(key)
142
+ }
143
+ catch (err) {
144
+ // if (err.notFound) {
145
+ // console.log('資料不存在')
146
+ // }
147
+ // else {
148
+ // console.log('其他錯誤:', err)
149
+ // }
150
+ }
151
+ return value
152
+ }
153
+
154
+ /**
155
+ * 查詢數據
156
+ *
157
+ * @memberOf WOrmLmdb
158
+ * @param {Object} [find={}] 輸入查詢條件物件
159
+ * @returns {Promise} 回傳Promise,resolve回傳數據,reject回傳錯誤訊息
160
+ */
161
+ async function select(find = {}) {
162
+ let isErr = false
163
+ let res = null
164
+
165
+ try {
166
+
167
+ //ltdt
168
+ let ltdt = await getData()
169
+ // console.log('select ltdt',ltdt)
170
+
171
+ //filter
172
+ if (iseobj(find)) {
173
+
174
+ //q
175
+ let q = new Query(find)
176
+ // console.log('q', q)
177
+
178
+ //find
179
+ res = q.find(ltdt).all()
180
+ // console.log('select(find) ltdt',res)
181
+
182
+ }
183
+ else {
184
+ res = ltdt
185
+ }
186
+
187
+ //check
188
+ if (!isarr(res)) {
189
+ isErr = true
190
+ res = `can not select by find[${JSON.stringify(find)}]`
191
+ }
192
+
193
+ }
194
+ catch (err) {
195
+ isErr = true
196
+ res = err
197
+ }
198
+ // console.log('res', res)
199
+
200
+ //check
201
+ if (isErr) {
202
+ return Promise.reject(res)
203
+ }
204
+
205
+ return res
206
+ }
207
+
208
+ /**
209
+ * 插入數據
210
+ *
211
+ * @memberOf WOrmLmdb
212
+ * @param {Object|Array} data 輸入數據物件或陣列
213
+ * @returns {Promise} 回傳Promise,resolve回傳插入結果,reject回傳錯誤訊息
214
+ */
215
+ async function insert(data) {
216
+ let isErr = false
217
+
218
+ //check
219
+ if (!iseobj(data) &amp;&amp; !isearr(data)) {
220
+ return {
221
+ n: 0,
222
+ nInserted: 0,
223
+ ok: 1,
224
+ }
225
+ }
226
+
227
+ //cloneDeep, 與外部數據脫勾
228
+ data = cloneDeep(data)
229
+
230
+ //res
231
+ let res = null
232
+ try {
233
+
234
+ //check
235
+ if (!isarr(data)) {
236
+ data = [data]
237
+ }
238
+
239
+ //check id
240
+ data = map(data, function(v) {
241
+ if (!isestr(v.id)) {
242
+ v.id = genID()
243
+ }
244
+ return v
245
+ })
246
+
247
+ //each
248
+ let nAll = size(data)
249
+ let nPush = 0
250
+ for (let v of data) {
251
+ // console.log(v)
252
+
253
+ //查找資料表內v.id
254
+ let vv = await getValue(v.id) //不會有catch
255
+ // console.log('getValue',vv)
256
+
257
+ //check
258
+ if (!iseobj(vv)) {
259
+ //未存在v.id
260
+
261
+ //put
262
+ await client.put(v.id, v)
263
+
264
+ nPush++
265
+ }
266
+ else {
267
+ //已存在v.id則不push
268
+ }
269
+
270
+ }
271
+
272
+ //res
273
+ res = {
274
+ n: nAll,
275
+ nInserted: nPush,
276
+ ok: 1,
277
+ }
278
+
279
+ //emit
280
+ ee.emit('change', 'insert', data, res)
281
+
282
+ }
283
+ catch (err) {
284
+ isErr = true
285
+ res = err
286
+ }
287
+
288
+ if (isErr) {
289
+ return Promise.reject(res)
290
+ }
291
+ return res
292
+ }
293
+
294
+ /**
295
+ * 儲存數據
296
+ *
297
+ * @memberOf WOrmLmdb
298
+ * @param {Object|Array} data 輸入數據物件或陣列
299
+ * @param {Object} [option={}] 輸入設定物件,預設為{}
300
+ * @param {boolean} [option.autoInsert=true] 輸入是否於儲存時發現原本無數據,則自動改以插入處理,預設為true
301
+ * @returns {Promise} 回傳Promise,resolve回傳儲存結果,reject回傳錯誤訊息
302
+ */
303
+ async function save(data, option = {}) {
304
+ let isErr = false
305
+
306
+ //check
307
+ if (!iseobj(data) &amp;&amp; !isearr(data)) {
308
+ return []
309
+ }
310
+
311
+ //cloneDeep, 與外部數據脫勾
312
+ data = cloneDeep(data)
313
+
314
+ //autoInsert
315
+ let autoInsert = get(option, 'autoInsert', true)
316
+
317
+ //res
318
+ let res = null
319
+ try {
320
+
321
+ //check
322
+ if (!isarr(data)) {
323
+ data = [data]
324
+ }
325
+
326
+ //check id
327
+ data = map(data, function(v) {
328
+ if (!isestr(v.id)) {
329
+ v.id = genID()
330
+ }
331
+ return v
332
+ })
333
+
334
+ //pmSeries
335
+ res = await pmSeries(data, async(v) => {
336
+
337
+ //rest
338
+ let rest = null
339
+
340
+ //查找資料表內v.id
341
+ let vv = await getValue(v.id) //不會有catch
342
+
343
+ //check
344
+ if (iseobj(vv)) {
345
+ //已存在v.id
346
+ if (isEqual(v, vv)) {
347
+ //內容相同不更新
348
+ }
349
+ else {
350
+ //內容不同須更新
351
+
352
+ //merge and put
353
+ await client.put(v.id, merge(vv, v))
354
+
355
+ rest = { update: true }
356
+ }
357
+ }
358
+
359
+ //rest
360
+ if (iseobj(rest)) {
361
+ rest = {
362
+ n: 1,
363
+ nModified: 1,
364
+ ok: 1,
365
+ }
366
+ }
367
+ else {
368
+ rest = {
369
+ n: 0,
370
+ nModified: 0,
371
+ ok: 1,
372
+ }
373
+ }
374
+
375
+ //autoInsert
376
+ if (autoInsert &amp;&amp; rest.n === 0) {
377
+ rest = await insert(v)
378
+ }
379
+
380
+ return rest
381
+ })
382
+
383
+ //emit
384
+ ee.emit('change', 'save', data, res)
385
+
386
+ }
387
+ catch (err) {
388
+ isErr = true
389
+ res = err
390
+ }
391
+
392
+ if (isErr) {
393
+ return Promise.reject(res)
394
+ }
395
+ return res
396
+ }
397
+
398
+ /**
399
+ * 刪除數據
400
+ *
401
+ * @memberOf WOrmLmdb
402
+ * @param {Object|Array} data 輸入數據物件或陣列
403
+ * @returns {Promise} 回傳Promise,resolve回傳刪除結果,reject回傳錯誤訊息
404
+ */
405
+ async function del(data) {
406
+ let isErr = false
407
+
408
+ //check
409
+ if (!iseobj(data) &amp;&amp; !isearr(data)) {
410
+ return []
411
+ }
412
+
413
+ //cloneDeep, 與外部數據脫勾
414
+ data = cloneDeep(data)
415
+
416
+ //res
417
+ let res = null
418
+ try {
419
+
420
+ //check
421
+ if (!isarr(data)) {
422
+ data = [data]
423
+ }
424
+
425
+ //pmSeries
426
+ res = await pmSeries(data, async(v) => {
427
+
428
+ //rest
429
+ let rest = null
430
+
431
+ //id
432
+ let id = get(v, 'id', '')
433
+
434
+ //check
435
+ if (isestr(id)) {
436
+
437
+ //查找資料表內v.id
438
+ let vv = await getValue(v.id) //不會有catch
439
+
440
+ //check
441
+ if (iseobj(vv)) {
442
+ //已存在v.id則須刪除
443
+
444
+ //del
445
+ await client.del(v.id)
446
+
447
+ //rest
448
+ rest = {
449
+ n: 1,
450
+ nDeleted: 1,
451
+ ok: 1,
452
+ }
453
+
454
+ }
455
+ else {
456
+ //不存在v.id則不刪除
457
+
458
+ //rest
459
+ rest = {
460
+ n: 1,
461
+ nDeleted: 0,
462
+ ok: 1,
463
+ }
464
+
465
+ }
466
+
467
+ }
468
+ else {
469
+ //未給v.id則不刪除
470
+
471
+ //rest
472
+ rest = {
473
+ n: 1,
474
+ nDeleted: 0,
475
+ ok: 0, //未給v.id視為有問題數據, 故ok給0
476
+ }
477
+
478
+ }
479
+
480
+ return rest
481
+ })
482
+
483
+ //emit
484
+ ee.emit('change', 'del', data, res)
485
+
486
+ }
487
+ catch (err) {
488
+ isErr = true
489
+ res = err
490
+ }
491
+
492
+ if (isErr) {
493
+ return Promise.reject(res)
494
+ }
495
+ return res
496
+ }
497
+
498
+ /**
499
+ * 刪除全部數據,需與del分開,避免未傳數據導致直接刪除全表
500
+ *
501
+ * @memberOf WOrmLmdb
502
+ * @param {Object} [find={}] 輸入刪除條件物件
503
+ * @returns {Promise} 回傳Promise,resolve回傳刪除結果,reject回傳錯誤訊息
504
+ */
505
+ async function delAll(find = {}) {
506
+ let isErr = false
507
+
508
+ //res
509
+ let res = null
510
+ try {
511
+
512
+ //ltdt
513
+ let ltdt = await getData()
514
+
515
+ //filter
516
+ let nAll = size(ltdt)
517
+ let nDel = 0
518
+ if (iseobj(find)) {
519
+
520
+ //q
521
+ let q = new Query(find)
522
+ // console.log('q', q)
523
+
524
+ //find
525
+ let _res = q.find(ltdt).all()
526
+ // console.log('_res', _res)
527
+
528
+ //nDel
529
+ nDel = size(_res)
530
+ // console.log('nDel', nDel)
531
+
532
+ if (nDel === 0) {
533
+ //未有find結果等於不刪除
534
+ }
535
+ else if (nAll === nDel) {
536
+ //全在find結果內等於全部刪除
537
+
538
+ //empty
539
+ for (let v of ltdt) {
540
+ await client.del(v.id)
541
+ }
542
+
543
+ }
544
+ else {
545
+ //部份在find結果內
546
+
547
+ //_kp
548
+ let _kp = {}
549
+ each(_res, (v, k) => {
550
+ _kp[v.id] = { k, v }
551
+ })
552
+
553
+ //del
554
+ for (let v of ltdt) {
555
+ if (haskey(_kp, v.id)) {
556
+ //在find結果內代表須刪除
557
+ await client.del(v.id)
558
+ }
559
+ }
560
+
561
+ }
562
+ }
563
+ else {
564
+
565
+ //nDel
566
+ nDel = nAll
567
+
568
+ //empty
569
+ for (let v of ltdt) {
570
+ await client.del(v.id)
571
+ }
572
+
573
+ }
574
+
575
+ //res
576
+ res = {
577
+ n: nAll,
578
+ nDeleted: nDel,
579
+ ok: 1,
580
+ }
581
+
582
+ //emit
583
+ ee.emit('change', 'delAll', null, res)
584
+
585
+ }
586
+ catch (err) {
587
+ isErr = true
588
+ res = err
589
+ }
590
+
591
+ if (isErr) {
592
+ return Promise.reject(res)
593
+ }
594
+ return res
595
+ }
596
+
597
+ //save
598
+ ee.select = select
599
+ ee.insert = insert
600
+ ee.save = save
601
+ ee.del = del
602
+ ee.delAll = delAll
603
+
604
+ return ee
605
+ }
606
+
607
+
608
+ export default WOrmLmdb
609
+ </code></pre>
610
+ </article>
611
+ </section>
612
+
613
+
614
+
615
+
616
+
617
+
618
+ </div>
619
+
620
+ <br class="clear">
621
+
622
+ <footer>
623
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.4</a> on Sun May 11 2025 23:16:04 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
624
+ </footer>
625
+
626
+ <script>prettyPrint();</script>
627
+ <script src="scripts/polyfill.js"></script>
628
+ <script src="scripts/linenumber.js"></script>
629
+
630
+
631
+
632
+ </body>
633
+ </html>