w-orm-lmdb 1.0.11 → 1.0.12
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/README.md +10 -0
- package/dist/req-mingo.umd.js +1 -1
- package/dist/w-orm-lmdb.umd.js +2 -2
- package/dist/w-orm-lmdb.umd.js.map +1 -1
- package/docs/WOrmLmdb.html +165 -7
- package/docs/WOrmLmdb.mjs.html +158 -50
- package/docs/index.html +2 -2
- package/g-basic.mjs +10 -0
- package/package.json +1 -1
- package/src/WOrmLmdb.mjs +156 -48
- package/test/{basic.test.mjs → unit-basic.test.mjs} +41 -0
- package/test/unit-insert.test.mjs +170 -0
- package/test/unit-save.test.mjs +203 -0
- package/_db_cache/worm/users/data.mdb +0 -0
- package/_db_cache/worm/users/lock.mdb +0 -0
- /package/test/{cache.test.mjs → unit-cache.test.mjs} +0 -0
package/src/WOrmLmdb.mjs
CHANGED
|
@@ -82,13 +82,8 @@ function WOrmLmdb(opt = {}) {
|
|
|
82
82
|
return cloneDeep(_cache) //與外部使用數據脫勾
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
//
|
|
86
|
-
await
|
|
87
|
-
if (client.status === 'closed') {
|
|
88
|
-
console.log(`client.status[${client.status}], level is closed`)
|
|
89
|
-
}
|
|
90
|
-
return client.status === 'open'
|
|
91
|
-
})
|
|
85
|
+
//waitOpen
|
|
86
|
+
await waitOpen()
|
|
92
87
|
// console.log('client.status',client.status)
|
|
93
88
|
|
|
94
89
|
//ltdt
|
|
@@ -105,6 +100,16 @@ function WOrmLmdb(opt = {}) {
|
|
|
105
100
|
return ltdt
|
|
106
101
|
}
|
|
107
102
|
|
|
103
|
+
//waitOpen, 等待client開啟, 因getRange與get於client關閉時會拋錯
|
|
104
|
+
let waitOpen = async () => {
|
|
105
|
+
await waitFun(() => {
|
|
106
|
+
if (client.status === 'closed') {
|
|
107
|
+
console.log(`client.status[${client.status}], level is closed`)
|
|
108
|
+
}
|
|
109
|
+
return client.status === 'open'
|
|
110
|
+
})
|
|
111
|
+
}
|
|
112
|
+
|
|
108
113
|
//getValue
|
|
109
114
|
let getValue = async (key) => {
|
|
110
115
|
let value = null
|
|
@@ -176,6 +181,54 @@ function WOrmLmdb(opt = {}) {
|
|
|
176
181
|
return res
|
|
177
182
|
}
|
|
178
183
|
|
|
184
|
+
/**
|
|
185
|
+
* 由主鍵id查詢單筆數據,因直接由LMDB取值,不需如select提取全表數據再過濾,故數據量大時效能較佳
|
|
186
|
+
*
|
|
187
|
+
* @memberOf WOrmLmdb
|
|
188
|
+
* @param {String} id 輸入主鍵字串
|
|
189
|
+
* @returns {Promise} 回傳Promise,resolve回傳數據物件,若無此id則回傳null,reject回傳錯誤訊息
|
|
190
|
+
*/
|
|
191
|
+
async function selectById(id) {
|
|
192
|
+
let isErr = false
|
|
193
|
+
let res = null
|
|
194
|
+
|
|
195
|
+
try {
|
|
196
|
+
|
|
197
|
+
//check
|
|
198
|
+
if (!isestr(id)) {
|
|
199
|
+
//未給有效id視為查無數據
|
|
200
|
+
return null
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
//waitOpen
|
|
204
|
+
await waitOpen()
|
|
205
|
+
|
|
206
|
+
//查找資料表內id
|
|
207
|
+
let v = await getValue(id) //不會有catch
|
|
208
|
+
|
|
209
|
+
//check, 判定基準與insert、save、del內對既有數據之認定一致
|
|
210
|
+
if (iseobj(v)) {
|
|
211
|
+
res = v
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
//不存在id, 回傳null
|
|
215
|
+
res = null
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
isErr = true
|
|
221
|
+
res = err
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
//check
|
|
225
|
+
if (isErr) {
|
|
226
|
+
return Promise.reject(res)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return res
|
|
230
|
+
}
|
|
231
|
+
|
|
179
232
|
/**
|
|
180
233
|
* 插入數據
|
|
181
234
|
*
|
|
@@ -216,29 +269,29 @@ function WOrmLmdb(opt = {}) {
|
|
|
216
269
|
})
|
|
217
270
|
|
|
218
271
|
//each
|
|
272
|
+
//ifNoExists, 由LMDB於同一寫交易內原子完成[檢查v.id未存在]與[寫入], 併發時同一v.id僅有一次成功,
|
|
273
|
+
//同批含重複v.id時亦僅首筆成功, 故不逐筆await而一次送出, 由LMDB寫執行緒依序處理並合併為批次寫交易
|
|
274
|
+
//注意: 回調函數須為同步函數, 且client.put須於回調函數內直接呼叫,
|
|
275
|
+
//若將client.put置於await之後, 該寫入會逸出條件批次而變成無條件寫入, 並使回傳值與實際狀態不一致
|
|
219
276
|
let nAll = size(data)
|
|
220
|
-
let
|
|
221
|
-
for (let v of data) {
|
|
277
|
+
let ltdone = await Promise.all(map(data, function(v) {
|
|
222
278
|
// console.log(v)
|
|
279
|
+
return client.ifNoExists(v.id, () => {
|
|
280
|
+
client.put(v.id, v)
|
|
281
|
+
})
|
|
282
|
+
}))
|
|
223
283
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
if (!iseobj(vv)) {
|
|
230
|
-
//未存在v.id
|
|
231
|
-
|
|
232
|
-
//put
|
|
233
|
-
await client.put(v.id, v)
|
|
234
|
-
|
|
284
|
+
//nPush
|
|
285
|
+
let nPush = 0
|
|
286
|
+
each(ltdone, function(done) {
|
|
287
|
+
if (done) {
|
|
288
|
+
//未存在v.id, 已寫入
|
|
235
289
|
nPush++
|
|
236
290
|
}
|
|
237
291
|
else {
|
|
238
292
|
//已存在v.id則不push
|
|
239
293
|
}
|
|
240
|
-
|
|
241
|
-
}
|
|
294
|
+
})
|
|
242
295
|
|
|
243
296
|
//res
|
|
244
297
|
res = {
|
|
@@ -323,33 +376,74 @@ function WOrmLmdb(opt = {}) {
|
|
|
323
376
|
//rest
|
|
324
377
|
let rest = null
|
|
325
378
|
|
|
326
|
-
|
|
327
|
-
|
|
379
|
+
//快速路徑, 先不開寫交易直接預讀, 內容相同者本就不須寫入, 可省去開啟寫交易之成本
|
|
380
|
+
//預讀值縱使已被其他寫入者更動而過期亦不影響正確性, 因內容相同時本次save等價於無操作,
|
|
381
|
+
//無操作可視為於預讀當下即已完成, 其後他人之寫入結果與[本次save先執行再輪到他人]相同
|
|
382
|
+
let vp = await getValue(v.id) //不會有catch
|
|
383
|
+
if (iseobj(vp) && isEqual(v, vp)) {
|
|
384
|
+
//內容相同不更新
|
|
385
|
+
return {
|
|
386
|
+
n: 0,
|
|
387
|
+
nModified: 0,
|
|
388
|
+
ok: 1,
|
|
389
|
+
}
|
|
390
|
+
}
|
|
328
391
|
|
|
329
|
-
//existed
|
|
330
|
-
let existed =
|
|
392
|
+
//existed, updated, inserted
|
|
393
|
+
let existed = false
|
|
394
|
+
let updated = false
|
|
395
|
+
let inserted = false
|
|
331
396
|
|
|
332
|
-
//
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
397
|
+
//transaction, 由LMDB於同一寫交易內原子完成[查找v.id]與[合併寫入],
|
|
398
|
+
//併發時不會有兩方各自讀到同一舊值再各自寫入而導致遺失更新
|
|
399
|
+
//注意: 回調函數須為同步函數, client.get於寫交易內為同步取值, 不可使用await,
|
|
400
|
+
//若將client.get或client.put置於await之後, 該操作會逸出本交易而失去原子性
|
|
401
|
+
await client.transaction(() => {
|
|
402
|
+
|
|
403
|
+
//查找資料表內v.id
|
|
404
|
+
let vv = client.get(v.id)
|
|
405
|
+
|
|
406
|
+
//existed
|
|
407
|
+
existed = iseobj(vv)
|
|
408
|
+
|
|
409
|
+
//check
|
|
410
|
+
if (existed) {
|
|
411
|
+
//已存在v.id
|
|
412
|
+
if (isEqual(v, vv)) {
|
|
413
|
+
//內容相同不更新
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
//內容不同須更新
|
|
417
|
+
|
|
418
|
+
//merge and put
|
|
419
|
+
client.put(v.id, merge(vv, v))
|
|
420
|
+
|
|
421
|
+
updated = true
|
|
422
|
+
}
|
|
337
423
|
}
|
|
338
424
|
else {
|
|
339
|
-
|
|
425
|
+
//內容不存在, 若autoInsert則須插入
|
|
426
|
+
if (autoInsert) {
|
|
340
427
|
|
|
341
|
-
|
|
342
|
-
|
|
428
|
+
//put
|
|
429
|
+
client.put(v.id, v)
|
|
343
430
|
|
|
344
|
-
|
|
431
|
+
inserted = true
|
|
432
|
+
}
|
|
345
433
|
}
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
//內容不存在
|
|
349
|
-
}
|
|
434
|
+
|
|
435
|
+
})
|
|
350
436
|
|
|
351
437
|
//rest
|
|
352
|
-
if (
|
|
438
|
+
if (inserted) {
|
|
439
|
+
//內容不存在而自動插入, 回傳形狀同insert
|
|
440
|
+
rest = {
|
|
441
|
+
n: 1,
|
|
442
|
+
nInserted: 1,
|
|
443
|
+
ok: 1,
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
else if (updated) {
|
|
353
447
|
rest = {
|
|
354
448
|
n: 1,
|
|
355
449
|
nModified: 1,
|
|
@@ -357,20 +451,33 @@ function WOrmLmdb(opt = {}) {
|
|
|
357
451
|
}
|
|
358
452
|
}
|
|
359
453
|
else {
|
|
454
|
+
//rest.n === 0:
|
|
455
|
+
// 內容相同不更新, 不須update
|
|
456
|
+
// 內容不存在且未開啟autoInsert
|
|
360
457
|
rest = {
|
|
361
458
|
n: 0,
|
|
362
459
|
nModified: 0,
|
|
363
460
|
ok: 1,
|
|
364
461
|
}
|
|
365
462
|
}
|
|
366
|
-
|
|
367
|
-
//
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
463
|
+
|
|
464
|
+
//emit, 原autoInsert係轉呼叫insert故會發出insert事件, 此處維持既有行為,
|
|
465
|
+
//須於交易外發出, 避免外部訂閱函數於寫交易內執行
|
|
466
|
+
if (inserted) {
|
|
467
|
+
|
|
468
|
+
//update, 不能保證插入多少, 一律重設快取
|
|
469
|
+
_cache = null
|
|
470
|
+
|
|
471
|
+
try {
|
|
472
|
+
|
|
473
|
+
//emit
|
|
474
|
+
ee.emit('change', 'insert', [v], rest)
|
|
475
|
+
|
|
476
|
+
}
|
|
477
|
+
catch (err) {
|
|
478
|
+
console.log(err)
|
|
479
|
+
}
|
|
480
|
+
|
|
374
481
|
}
|
|
375
482
|
|
|
376
483
|
return rest
|
|
@@ -644,6 +751,7 @@ function WOrmLmdb(opt = {}) {
|
|
|
644
751
|
|
|
645
752
|
//save
|
|
646
753
|
ee.select = select
|
|
754
|
+
ee.selectById = selectById
|
|
647
755
|
ee.insert = insert
|
|
648
756
|
ee.save = save
|
|
649
757
|
ee.del = del
|
|
@@ -184,6 +184,36 @@ describe('basic', function() {
|
|
|
184
184
|
})
|
|
185
185
|
vget[5] = rt
|
|
186
186
|
|
|
187
|
+
//selectById
|
|
188
|
+
rt = null
|
|
189
|
+
// vans[12] = { id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 }
|
|
190
|
+
await wo.selectById('id-rosemary')
|
|
191
|
+
.then(function(msg) {
|
|
192
|
+
// console.log('selectById then', msg)
|
|
193
|
+
// selectById { id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 }
|
|
194
|
+
rt = msg
|
|
195
|
+
})
|
|
196
|
+
.catch(function(msg) {
|
|
197
|
+
// console.log('selectById catch', msg)
|
|
198
|
+
rt = msg.toString()
|
|
199
|
+
})
|
|
200
|
+
vget[12] = rt
|
|
201
|
+
|
|
202
|
+
//selectById by id not existed
|
|
203
|
+
rt = null
|
|
204
|
+
// vans[13] = null
|
|
205
|
+
await wo.selectById('id-not-existed')
|
|
206
|
+
.then(function(msg) {
|
|
207
|
+
// console.log('selectById by id not existed then', msg)
|
|
208
|
+
// selectById by id not existed null
|
|
209
|
+
rt = msg
|
|
210
|
+
})
|
|
211
|
+
.catch(function(msg) {
|
|
212
|
+
// console.log('selectById by id not existed catch', msg)
|
|
213
|
+
rt = msg.toString()
|
|
214
|
+
})
|
|
215
|
+
vget[13] = rt
|
|
216
|
+
|
|
187
217
|
//select by $and, $gt, $lt
|
|
188
218
|
rt = null
|
|
189
219
|
// vans[6] = [{ id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 }]
|
|
@@ -370,6 +400,17 @@ describe('basic', function() {
|
|
|
370
400
|
assert.strict.deepStrictEqual(vget[5], vans[5])
|
|
371
401
|
})
|
|
372
402
|
|
|
403
|
+
//vans[12]、vans[13]為後續新增之selectById, 為不更動既有編號故接續於末號之後
|
|
404
|
+
vans[12] = { id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 }
|
|
405
|
+
it(`should get ${JSON.stringify(vans[12])} for selectById`, async function() {
|
|
406
|
+
assert.strict.deepStrictEqual(vget[12], vans[12])
|
|
407
|
+
})
|
|
408
|
+
|
|
409
|
+
vans[13] = null
|
|
410
|
+
it(`should get ${JSON.stringify(vans[13])} for selectById by id not existed`, async function() {
|
|
411
|
+
assert.strict.deepStrictEqual(vget[13], vans[13])
|
|
412
|
+
})
|
|
413
|
+
|
|
373
414
|
vans[6] = [{ id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 }]
|
|
374
415
|
it(`should get ${JSON.stringify(vans[6])} for select by $and, $gt, $lt`, async function() {
|
|
375
416
|
assert.strict.deepStrictEqual(vget[6], vans[6])
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import assert from 'assert'
|
|
2
|
+
import { spawn } from 'child_process'
|
|
3
|
+
import path from 'path'
|
|
4
|
+
import _ from 'lodash-es'
|
|
5
|
+
import w from 'wsemi'
|
|
6
|
+
import WOrm from '../src/WOrmLmdb.mjs'
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
//runProc, 另起行程對同一資料表插入相同id, 用於驗證跨行程之插入原子性
|
|
10
|
+
function runProc(tag, url, ids) {
|
|
11
|
+
return new Promise(function(resolve) {
|
|
12
|
+
let code = `
|
|
13
|
+
import { pathToFileURL } from 'url'
|
|
14
|
+
let { default: WOrm } = await import(pathToFileURL(process.env.SRC).href)
|
|
15
|
+
let wo = WOrm({ url: process.env.URL, db: 'worm', cl: 'race' })
|
|
16
|
+
let ids = JSON.parse(process.env.IDS)
|
|
17
|
+
let n = 0
|
|
18
|
+
for (let id of ids) {
|
|
19
|
+
let r = await wo.insert({ id, from: process.env.TAG })
|
|
20
|
+
n += r.nInserted
|
|
21
|
+
}
|
|
22
|
+
console.log(JSON.stringify({ tag: process.env.TAG, nInserted: n }))
|
|
23
|
+
await wo.close()
|
|
24
|
+
`
|
|
25
|
+
let out = ''
|
|
26
|
+
let p = spawn(process.execPath, ['--input-type=module', '-e', code], {
|
|
27
|
+
shell: false,
|
|
28
|
+
env: {
|
|
29
|
+
...process.env,
|
|
30
|
+
SRC: path.resolve('./src/WOrmLmdb.mjs'),
|
|
31
|
+
URL: url,
|
|
32
|
+
IDS: JSON.stringify(ids),
|
|
33
|
+
TAG: tag,
|
|
34
|
+
},
|
|
35
|
+
})
|
|
36
|
+
p.stdout.on('data', function(d) {
|
|
37
|
+
out += d.toString()
|
|
38
|
+
})
|
|
39
|
+
p.stderr.on('data', function(d) {
|
|
40
|
+
out += d.toString()
|
|
41
|
+
})
|
|
42
|
+
p.on('close', function() {
|
|
43
|
+
let r = null
|
|
44
|
+
try {
|
|
45
|
+
r = JSON.parse(_.trim(out))
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
r = { tag, error: _.trim(out) }
|
|
49
|
+
}
|
|
50
|
+
resolve(r)
|
|
51
|
+
})
|
|
52
|
+
})
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
describe('insert', function() {
|
|
57
|
+
let rt = null
|
|
58
|
+
let vans = {}
|
|
59
|
+
let vget = {}
|
|
60
|
+
|
|
61
|
+
before(async function() {
|
|
62
|
+
|
|
63
|
+
w.fsDeleteFolder('./_db_insert')
|
|
64
|
+
|
|
65
|
+
let url = './_db_insert'
|
|
66
|
+
|
|
67
|
+
//insert同批含重複id, 僅首筆應被插入
|
|
68
|
+
rt = null
|
|
69
|
+
// vans[1] = { n: 3, nInserted: 2, ok: 1 }
|
|
70
|
+
let woDup = WOrm({ url, db: 'worm', cl: 'dup' })
|
|
71
|
+
await woDup.insert([
|
|
72
|
+
{ id: 'id-dup', name: 'first' },
|
|
73
|
+
{ id: 'id-dup', name: 'second' },
|
|
74
|
+
{ id: 'id-other', name: 'other' },
|
|
75
|
+
])
|
|
76
|
+
.then(function(msg) {
|
|
77
|
+
// console.log('insert(含重複id) then', msg)
|
|
78
|
+
// insert(含重複id) then { n: 3, nInserted: 2, ok: 1 }
|
|
79
|
+
rt = msg
|
|
80
|
+
})
|
|
81
|
+
.catch(function(msg) {
|
|
82
|
+
// console.log('insert(含重複id) catch', msg)
|
|
83
|
+
rt = msg.toString()
|
|
84
|
+
})
|
|
85
|
+
vget[1] = rt
|
|
86
|
+
|
|
87
|
+
//同批重複id時應保留首筆內容
|
|
88
|
+
vget[2] = await woDup.selectById('id-dup')
|
|
89
|
+
|
|
90
|
+
//對已存在id再insert, 應不插入且不覆寫
|
|
91
|
+
rt = null
|
|
92
|
+
// vans[3] = { n: 1, nInserted: 0, ok: 1 }
|
|
93
|
+
await woDup.insert({ id: 'id-dup', name: 'third' })
|
|
94
|
+
.then(function(msg) {
|
|
95
|
+
rt = msg
|
|
96
|
+
})
|
|
97
|
+
.catch(function(msg) {
|
|
98
|
+
rt = msg.toString()
|
|
99
|
+
})
|
|
100
|
+
vget[3] = rt
|
|
101
|
+
vget[4] = await woDup.selectById('id-dup')
|
|
102
|
+
await woDup.close()
|
|
103
|
+
|
|
104
|
+
//單行程併發: 對同一id併發insert 100次, nInserted總和須為1
|
|
105
|
+
let woPar = WOrm({ url, db: 'worm', cl: 'par' })
|
|
106
|
+
let rs = await Promise.all(_.times(100, function(k) {
|
|
107
|
+
return woPar.insert({ id: 'id-race', k })
|
|
108
|
+
}))
|
|
109
|
+
vget[5] = _.sum(_.map(rs, 'nInserted'))
|
|
110
|
+
vget[6] = _.size(await woPar.select())
|
|
111
|
+
await woPar.close()
|
|
112
|
+
|
|
113
|
+
//跨行程併發: 兩行程各自對同50個id插入, nInserted總和須為50且資料表僅50筆
|
|
114
|
+
let ids = _.times(50, function(k) {
|
|
115
|
+
return `id-x${k}`
|
|
116
|
+
})
|
|
117
|
+
let rps = await Promise.all([
|
|
118
|
+
runProc('P1', url, ids),
|
|
119
|
+
runProc('P2', url, ids),
|
|
120
|
+
])
|
|
121
|
+
// console.log('跨行程結果', rps)
|
|
122
|
+
// 跨行程結果 [ { tag: 'P1', nInserted: 34 }, { tag: 'P2', nInserted: 16 } ]
|
|
123
|
+
vget[7] = _.sum(_.map(rps, 'nInserted'))
|
|
124
|
+
let woX = WOrm({ url, db: 'worm', cl: 'race' })
|
|
125
|
+
vget[8] = _.size(await woX.select())
|
|
126
|
+
await woX.close()
|
|
127
|
+
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
vans[1] = { n: 3, nInserted: 2, ok: 1 }
|
|
131
|
+
it(`should get ${JSON.stringify(vans[1])} for insert with duplicated id in same batch`, async function() {
|
|
132
|
+
assert.strict.deepStrictEqual(vget[1], vans[1])
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
vans[2] = { id: 'id-dup', name: 'first' }
|
|
136
|
+
it(`should get ${JSON.stringify(vans[2])} for keeping first one of duplicated id`, async function() {
|
|
137
|
+
assert.strict.deepStrictEqual(vget[2], vans[2])
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
vans[3] = { n: 1, nInserted: 0, ok: 1 }
|
|
141
|
+
it(`should get ${JSON.stringify(vans[3])} for insert existed id`, async function() {
|
|
142
|
+
assert.strict.deepStrictEqual(vget[3], vans[3])
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
vans[4] = { id: 'id-dup', name: 'first' }
|
|
146
|
+
it(`should get ${JSON.stringify(vans[4])} for not overwriting existed id`, async function() {
|
|
147
|
+
assert.strict.deepStrictEqual(vget[4], vans[4])
|
|
148
|
+
})
|
|
149
|
+
|
|
150
|
+
vans[5] = 1
|
|
151
|
+
it(`should get ${JSON.stringify(vans[5])} for sum of nInserted by 100 concurrent insert with same id`, async function() {
|
|
152
|
+
assert.strict.deepStrictEqual(vget[5], vans[5])
|
|
153
|
+
})
|
|
154
|
+
|
|
155
|
+
vans[6] = 1
|
|
156
|
+
it(`should get ${JSON.stringify(vans[6])} for records after 100 concurrent insert with same id`, async function() {
|
|
157
|
+
assert.strict.deepStrictEqual(vget[6], vans[6])
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
vans[7] = 50
|
|
161
|
+
it(`should get ${JSON.stringify(vans[7])} for sum of nInserted by 2 processes inserting same 50 ids`, async function() {
|
|
162
|
+
assert.strict.deepStrictEqual(vget[7], vans[7])
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
vans[8] = 50
|
|
166
|
+
it(`should get ${JSON.stringify(vans[8])} for records after 2 processes inserting same 50 ids`, async function() {
|
|
167
|
+
assert.strict.deepStrictEqual(vget[8], vans[8])
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
})
|