w-orm-reladb 1.0.47 → 1.0.49
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 +106 -50
- package/dist/w-orm-reladb.umd.js +2 -2
- package/dist/w-orm-reladb.umd.js.map +1 -1
- package/docs/WOrmReladb.html +802 -73
- package/docs/WOrmReladb.mjs.html +988 -298
- package/docs/index.html +2 -2
- package/g-genModelsByTabs.mjs +1 -1
- package/g-mssql-concurrency.mjs +1 -1
- package/g-mssql-timerQuery.mjs +3 -3
- package/g-mssql-transaction-commit.mjs +7 -7
- package/g-mssql-transaction-rollback.mjs +7 -7
- package/g-mssql.mjs +7 -7
- package/g-sqlite-concurrency.mjs +1 -1
- package/g-sqlite-encryption-transaction-commit.mjs +3 -3
- package/g-sqlite-encryption.mjs +7 -7
- package/g-sqlite-transaction-commit.mjs +7 -7
- package/g-sqlite-transaction-rollback.mjs +7 -7
- package/g-sqlite.mjs +7 -7
- package/package.json +1 -1
- package/script.txt +0 -1
- package/src/WOrmReladb.mjs +986 -296
- package/test/api-mssql.test.mjs +4 -201
- package/test/api-sqlite.test.mjs +12 -206
- package/test/api-suite.mjs +874 -0
- package/toolg/gDistRollup.mjs +1 -0
- package/worm.sqlite +0 -0
- package/test/api-fixtures.mjs +0 -48
package/test/api-mssql.test.mjs
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import assert from 'assert'
|
|
2
1
|
import net from 'net'
|
|
3
2
|
import { execFile } from 'child_process'
|
|
4
3
|
import { promisify } from 'util'
|
|
5
|
-
import
|
|
6
|
-
import { genRs, genRsm, sortByName } from './api-fixtures.mjs'
|
|
4
|
+
import { defineSuites } from './api-suite.mjs'
|
|
7
5
|
|
|
8
6
|
|
|
9
7
|
//測試自行創建docker容器供MSSQL服務, 測試結束即銷毀, 故僅需環境已安裝docker
|
|
@@ -92,12 +90,13 @@ let stopContainer = async () => {
|
|
|
92
90
|
}
|
|
93
91
|
|
|
94
92
|
|
|
95
|
-
let
|
|
93
|
+
let getOpt = (ex = {}) => {
|
|
96
94
|
return {
|
|
97
95
|
url: `mssql://username:password@localhost:${ctPort}`,
|
|
98
96
|
db: 'worm',
|
|
99
97
|
cl: 'users',
|
|
100
98
|
fdModels: './models',
|
|
99
|
+
...ex,
|
|
101
100
|
}
|
|
102
101
|
}
|
|
103
102
|
|
|
@@ -113,200 +112,4 @@ after(async function() {
|
|
|
113
112
|
})
|
|
114
113
|
|
|
115
114
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
let w = null
|
|
119
|
-
|
|
120
|
-
before(async function() {
|
|
121
|
-
w = wo(genOpt())
|
|
122
|
-
await w.createStorage()
|
|
123
|
-
await w.delAll().catch(() => {})
|
|
124
|
-
})
|
|
125
|
-
|
|
126
|
-
it('insert 3筆, 空id自動產生主鍵', async function() {
|
|
127
|
-
let msg = await w.insert(genRs())
|
|
128
|
-
assert.deepStrictEqual(msg, { n: 3, nInserted: 3, ok: 1 })
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
it('save({autoInsert:true}) 修改2筆並插入1筆', async function() {
|
|
132
|
-
let msg = await w.save(genRsm(), { autoInsert: true })
|
|
133
|
-
assert.deepStrictEqual(msg, [
|
|
134
|
-
{ n: 1, nModified: 1, ok: 1 },
|
|
135
|
-
{ n: 1, nModified: 1, ok: 1 },
|
|
136
|
-
{ n: 1, nInserted: 1, ok: 1 },
|
|
137
|
-
])
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
it('select() 查全部得4筆', async function() {
|
|
141
|
-
let ss = sortByName(await w.select())
|
|
142
|
-
assert.strictEqual(ss.length, 4)
|
|
143
|
-
let [kettle, kettleM, peter, rosemary] = ss
|
|
144
|
-
assert.ok(typeof kettle.id === 'string' && kettle.id.length > 0)
|
|
145
|
-
assert.strictEqual(kettle.name, 'kettle')
|
|
146
|
-
assert.strictEqual(kettle.value, 456)
|
|
147
|
-
assert.ok(typeof kettleM.id === 'string' && kettleM.id.length > 0)
|
|
148
|
-
assert.strictEqual(kettleM.name, 'kettle(modify)')
|
|
149
|
-
assert.strictEqual(kettleM.value, null)
|
|
150
|
-
assert.deepStrictEqual(peter, { id: 'id-peter', name: 'peter(modify)', value: 123 })
|
|
151
|
-
assert.deepStrictEqual(rosemary, { id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 })
|
|
152
|
-
})
|
|
153
|
-
|
|
154
|
-
it('select({id}) 依主鍵查詢', async function() {
|
|
155
|
-
let so = await w.select({ id: 'id-rosemary' })
|
|
156
|
-
assert.deepStrictEqual(so, [{ id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 }])
|
|
157
|
-
})
|
|
158
|
-
|
|
159
|
-
it('select $and+$gt+$lt', async function() {
|
|
160
|
-
let sp = await w.select({ '$and': [{ value: { '$gt': 123 } }, { value: { '$lt': 200 } }] })
|
|
161
|
-
assert.deepStrictEqual(sp, [{ id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 }])
|
|
162
|
-
})
|
|
163
|
-
|
|
164
|
-
it('select $or+$gte+$lte', async function() {
|
|
165
|
-
let sp = await w.select({ '$or': [{ value: { '$lte': -1 } }, { value: { '$gte': 200 } }] })
|
|
166
|
-
assert.strictEqual(sp.length, 1)
|
|
167
|
-
assert.strictEqual(sp[0].name, 'kettle')
|
|
168
|
-
assert.strictEqual(sp[0].value, 456)
|
|
169
|
-
})
|
|
170
|
-
|
|
171
|
-
it('select 巢狀$or+$and+$ne+$in+$nin', async function() {
|
|
172
|
-
let sp = sortByName(await w.select({ '$or': [{ '$and': [{ value: { '$ne': 123 } }, { value: { '$in': [123, 321, 123.456, 456] } }, { value: { '$nin': [456, 654] } }] }, { '$or': [{ value: { '$lte': -1 } }, { value: { '$gte': 400 } }] }] }))
|
|
173
|
-
assert.strictEqual(sp.length, 2)
|
|
174
|
-
assert.strictEqual(sp[0].name, 'kettle')
|
|
175
|
-
assert.strictEqual(sp[0].value, 456)
|
|
176
|
-
assert.deepStrictEqual(sp[1], { id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 })
|
|
177
|
-
})
|
|
178
|
-
|
|
179
|
-
it('select $regex不分大小寫', async function() {
|
|
180
|
-
let sr = await w.select({ name: { $regex: 'PeT', $options: '$i' } })
|
|
181
|
-
assert.deepStrictEqual(sr, [{ id: 'id-peter', name: 'peter(modify)', value: 123 }])
|
|
182
|
-
})
|
|
183
|
-
|
|
184
|
-
it('del 刪除3筆並保留kettle', async function() {
|
|
185
|
-
let ss = await w.select()
|
|
186
|
-
let d = ss.filter((v) => v.name !== 'kettle')
|
|
187
|
-
let msg = await w.del(d)
|
|
188
|
-
assert.deepStrictEqual(msg, [
|
|
189
|
-
{ n: 1, nDeleted: 1, ok: 1 },
|
|
190
|
-
{ n: 1, nDeleted: 1, ok: 1 },
|
|
191
|
-
{ n: 1, nDeleted: 1, ok: 1 },
|
|
192
|
-
])
|
|
193
|
-
let left = await w.select()
|
|
194
|
-
assert.strictEqual(left.length, 1)
|
|
195
|
-
assert.strictEqual(left[0].name, 'kettle')
|
|
196
|
-
})
|
|
197
|
-
|
|
198
|
-
it('delAll 清空後select回傳空陣列', async function() {
|
|
199
|
-
let msg = await w.delAll()
|
|
200
|
-
assert.deepStrictEqual(msg, { n: 1, nDeleted: 1, ok: 1 })
|
|
201
|
-
let ss = await w.select()
|
|
202
|
-
assert.deepStrictEqual(ss, [])
|
|
203
|
-
})
|
|
204
|
-
|
|
205
|
-
})
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
describe('mssql transaction commit', function() {
|
|
209
|
-
|
|
210
|
-
let w = null
|
|
211
|
-
let instance = null
|
|
212
|
-
|
|
213
|
-
before(async function() {
|
|
214
|
-
w = wo(genOpt())
|
|
215
|
-
await w.createStorage()
|
|
216
|
-
await w.delAll().catch(() => {})
|
|
217
|
-
})
|
|
218
|
-
|
|
219
|
-
after(async function() {
|
|
220
|
-
if (instance) {
|
|
221
|
-
await instance.close().catch(() => {})
|
|
222
|
-
}
|
|
223
|
-
})
|
|
224
|
-
|
|
225
|
-
it('交易內insert+save+del, commit後數據持久化', async function() {
|
|
226
|
-
instance = await w.init()
|
|
227
|
-
let transaction = await w.genTransaction()
|
|
228
|
-
let connState = { instance, transaction }
|
|
229
|
-
|
|
230
|
-
let mi = await w.insert(genRs(), connState)
|
|
231
|
-
assert.deepStrictEqual(mi, { n: 3, nInserted: 3, ok: 1 })
|
|
232
|
-
|
|
233
|
-
let msv = await w.save(genRsm(), { ...connState, autoInsert: false })
|
|
234
|
-
assert.deepStrictEqual(msv, [
|
|
235
|
-
{ n: 1, nModified: 1, ok: 1 },
|
|
236
|
-
{ n: 1, nModified: 1, ok: 1 },
|
|
237
|
-
{ n: 0, nModified: 0, ok: 1 },
|
|
238
|
-
])
|
|
239
|
-
|
|
240
|
-
let md = await w.del({ id: 'id-rosemary' }, connState)
|
|
241
|
-
assert.deepStrictEqual(md, [{ n: 1, nDeleted: 1, ok: 1 }])
|
|
242
|
-
|
|
243
|
-
//交易內select可查到暫時有效的數據
|
|
244
|
-
let ssIn = sortByName(await w.select(null, connState))
|
|
245
|
-
assert.strictEqual(ssIn.length, 2)
|
|
246
|
-
assert.strictEqual(ssIn[0].name, 'kettle')
|
|
247
|
-
assert.strictEqual(ssIn[1].name, 'peter(modify)')
|
|
248
|
-
|
|
249
|
-
await transaction.commit()
|
|
250
|
-
await instance.close()
|
|
251
|
-
instance = null
|
|
252
|
-
|
|
253
|
-
let ssFinal = sortByName(await w.select())
|
|
254
|
-
assert.strictEqual(ssFinal.length, 2)
|
|
255
|
-
assert.strictEqual(ssFinal[0].name, 'kettle')
|
|
256
|
-
assert.strictEqual(ssFinal[0].value, 456)
|
|
257
|
-
assert.deepStrictEqual(ssFinal[1], { id: 'id-peter', name: 'peter(modify)', value: 123 })
|
|
258
|
-
})
|
|
259
|
-
|
|
260
|
-
})
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
describe('mssql transaction rollback', function() {
|
|
264
|
-
|
|
265
|
-
let w = null
|
|
266
|
-
let instance = null
|
|
267
|
-
|
|
268
|
-
before(async function() {
|
|
269
|
-
w = wo(genOpt())
|
|
270
|
-
await w.createStorage()
|
|
271
|
-
await w.delAll().catch(() => {})
|
|
272
|
-
})
|
|
273
|
-
|
|
274
|
-
after(async function() {
|
|
275
|
-
if (instance) {
|
|
276
|
-
await instance.close().catch(() => {})
|
|
277
|
-
}
|
|
278
|
-
})
|
|
279
|
-
|
|
280
|
-
it('交易內insert+save+del, rollback後數據全數還原', async function() {
|
|
281
|
-
instance = await w.init()
|
|
282
|
-
let transaction = await w.genTransaction()
|
|
283
|
-
let connState = { instance, transaction }
|
|
284
|
-
|
|
285
|
-
let mi = await w.insert(genRs(), connState)
|
|
286
|
-
assert.deepStrictEqual(mi, { n: 3, nInserted: 3, ok: 1 })
|
|
287
|
-
|
|
288
|
-
let msv = await w.save(genRsm(), { ...connState, autoInsert: false })
|
|
289
|
-
assert.deepStrictEqual(msv, [
|
|
290
|
-
{ n: 1, nModified: 1, ok: 1 },
|
|
291
|
-
{ n: 1, nModified: 1, ok: 1 },
|
|
292
|
-
{ n: 0, nModified: 0, ok: 1 },
|
|
293
|
-
])
|
|
294
|
-
|
|
295
|
-
let md = await w.del({ id: 'id-rosemary' }, connState)
|
|
296
|
-
assert.deepStrictEqual(md, [{ n: 1, nDeleted: 1, ok: 1 }])
|
|
297
|
-
|
|
298
|
-
//交易內select可查到暫時有效的數據
|
|
299
|
-
let ssIn = sortByName(await w.select(null, connState))
|
|
300
|
-
assert.strictEqual(ssIn.length, 2)
|
|
301
|
-
assert.strictEqual(ssIn[0].name, 'kettle')
|
|
302
|
-
assert.strictEqual(ssIn[1].name, 'peter(modify)')
|
|
303
|
-
|
|
304
|
-
await transaction.rollback()
|
|
305
|
-
await instance.close()
|
|
306
|
-
instance = null
|
|
307
|
-
|
|
308
|
-
let ssFinal = await w.select()
|
|
309
|
-
assert.deepStrictEqual(ssFinal, [])
|
|
310
|
-
})
|
|
311
|
-
|
|
312
|
-
})
|
|
115
|
+
defineSuites('mssql', getOpt)
|
package/test/api-sqlite.test.mjs
CHANGED
|
@@ -1,30 +1,34 @@
|
|
|
1
1
|
import fs from 'fs'
|
|
2
|
-
import
|
|
3
|
-
import wo from '../src/WOrmReladb.mjs'
|
|
4
|
-
import { genRs, genRsm, sortByName } from './api-fixtures.mjs'
|
|
2
|
+
import { defineSuites } from './api-suite.mjs'
|
|
5
3
|
|
|
6
4
|
|
|
7
5
|
//sqlite使用獨立暫存storage檔測試, 不使用專案根目錄之worm.sqlite
|
|
8
6
|
|
|
9
7
|
|
|
10
|
-
let
|
|
8
|
+
let storage = './tmp/api-sqlite.sqlite'
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
let getOpt = (ex = {}) => {
|
|
11
12
|
return {
|
|
12
13
|
url: 'sqlite://:',
|
|
13
14
|
db: 'worm',
|
|
14
15
|
cl: 'users',
|
|
15
16
|
fdModels: './models',
|
|
16
17
|
storage,
|
|
18
|
+
...ex,
|
|
17
19
|
}
|
|
18
20
|
}
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
|
|
23
|
+
before(function() {
|
|
21
24
|
fs.mkdirSync('./tmp', { recursive: true })
|
|
22
25
|
if (fs.existsSync(storage)) {
|
|
23
26
|
fs.unlinkSync(storage)
|
|
24
27
|
}
|
|
25
|
-
}
|
|
28
|
+
})
|
|
29
|
+
|
|
26
30
|
|
|
27
|
-
|
|
31
|
+
after(function() {
|
|
28
32
|
if (fs.existsSync(storage)) {
|
|
29
33
|
fs.unlinkSync(storage)
|
|
30
34
|
}
|
|
@@ -32,205 +36,7 @@ let cleanStorage = (storage) => {
|
|
|
32
36
|
fs.rmdirSync('./tmp') //僅在空資料夾時移除
|
|
33
37
|
}
|
|
34
38
|
catch (err) {}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
describe('sqlite crud', function() {
|
|
39
|
-
|
|
40
|
-
let storage = './tmp/api-sqlite-crud.sqlite'
|
|
41
|
-
let w = wo(genOpt(storage))
|
|
42
|
-
|
|
43
|
-
before(async function() {
|
|
44
|
-
prepStorage(storage)
|
|
45
|
-
await w.createStorage()
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
after(function() {
|
|
49
|
-
cleanStorage(storage)
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
it('insert 3筆, 空id自動產生主鍵', async function() {
|
|
53
|
-
let msg = await w.insert(genRs())
|
|
54
|
-
assert.deepStrictEqual(msg, { n: 3, nInserted: 3, ok: 1 })
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
it('save({autoInsert:false}) 修改2筆且不插入空id項', async function() {
|
|
58
|
-
let msg = await w.save(genRsm(), { autoInsert: false })
|
|
59
|
-
assert.deepStrictEqual(msg, [
|
|
60
|
-
{ n: 1, nModified: 1, ok: 1 },
|
|
61
|
-
{ n: 1, nModified: 1, ok: 1 },
|
|
62
|
-
{ n: 0, nModified: 0, ok: 1 },
|
|
63
|
-
])
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
it('select() 查全部得3筆', async function() {
|
|
67
|
-
let ss = sortByName(await w.select())
|
|
68
|
-
assert.strictEqual(ss.length, 3)
|
|
69
|
-
let [kettle, peter, rosemary] = ss
|
|
70
|
-
assert.ok(typeof kettle.id === 'string' && kettle.id.length > 0)
|
|
71
|
-
assert.strictEqual(kettle.name, 'kettle')
|
|
72
|
-
assert.strictEqual(kettle.value, 456)
|
|
73
|
-
assert.deepStrictEqual(peter, { id: 'id-peter', name: 'peter(modify)', value: 123 })
|
|
74
|
-
assert.deepStrictEqual(rosemary, { id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 })
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
it('select({id}) 依主鍵查詢', async function() {
|
|
78
|
-
let so = await w.select({ id: 'id-rosemary' })
|
|
79
|
-
assert.deepStrictEqual(so, [{ id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 }])
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
it('select $and+$gt+$lt', async function() {
|
|
83
|
-
let sp = await w.select({ '$and': [{ value: { '$gt': 123 } }, { value: { '$lt': 200 } }] })
|
|
84
|
-
assert.deepStrictEqual(sp, [{ id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 }])
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
it('select $or+$gte+$lte', async function() {
|
|
88
|
-
let sp = await w.select({ '$or': [{ value: { '$lte': -1 } }, { value: { '$gte': 200 } }] })
|
|
89
|
-
assert.strictEqual(sp.length, 1)
|
|
90
|
-
assert.strictEqual(sp[0].name, 'kettle')
|
|
91
|
-
assert.strictEqual(sp[0].value, 456)
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
it('select 巢狀$or+$and+$ne+$in+$nin', async function() {
|
|
95
|
-
let sp = sortByName(await w.select({ '$or': [{ '$and': [{ value: { '$ne': 123 } }, { value: { '$in': [123, 321, 123.456, 456] } }, { value: { '$nin': [456, 654] } }] }, { '$or': [{ value: { '$lte': -1 } }, { value: { '$gte': 400 } }] }] }))
|
|
96
|
-
assert.strictEqual(sp.length, 2)
|
|
97
|
-
assert.strictEqual(sp[0].name, 'kettle')
|
|
98
|
-
assert.strictEqual(sp[0].value, 456)
|
|
99
|
-
assert.deepStrictEqual(sp[1], { id: 'id-rosemary', name: 'rosemary(modify)', value: 123.456 })
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
it('select $regex不分大小寫', async function() {
|
|
103
|
-
let sr = await w.select({ name: { $regex: 'PeT', $options: '$i' } })
|
|
104
|
-
assert.deepStrictEqual(sr, [{ id: 'id-peter', name: 'peter(modify)', value: 123 }])
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
it('del 刪除2筆並保留kettle', async function() {
|
|
108
|
-
let ss = await w.select()
|
|
109
|
-
let d = ss.filter((v) => v.name !== 'kettle')
|
|
110
|
-
let msg = await w.del(d)
|
|
111
|
-
assert.deepStrictEqual(msg, [
|
|
112
|
-
{ n: 1, nDeleted: 1, ok: 1 },
|
|
113
|
-
{ n: 1, nDeleted: 1, ok: 1 },
|
|
114
|
-
])
|
|
115
|
-
let left = await w.select()
|
|
116
|
-
assert.strictEqual(left.length, 1)
|
|
117
|
-
assert.strictEqual(left[0].name, 'kettle')
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
it('delAll 清空後select回傳空陣列', async function() {
|
|
121
|
-
let msg = await w.delAll()
|
|
122
|
-
assert.deepStrictEqual(msg, { n: 1, nDeleted: 1, ok: 1 })
|
|
123
|
-
let ss = await w.select()
|
|
124
|
-
assert.deepStrictEqual(ss, [])
|
|
125
|
-
})
|
|
126
|
-
|
|
127
39
|
})
|
|
128
40
|
|
|
129
41
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
let storage = './tmp/api-sqlite-commit.sqlite'
|
|
133
|
-
let w = wo(genOpt(storage))
|
|
134
|
-
let instance = null
|
|
135
|
-
|
|
136
|
-
before(async function() {
|
|
137
|
-
prepStorage(storage)
|
|
138
|
-
await w.createStorage()
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
after(async function() {
|
|
142
|
-
if (instance) {
|
|
143
|
-
await instance.close().catch(() => {})
|
|
144
|
-
}
|
|
145
|
-
cleanStorage(storage)
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
it('交易內insert+save+del, commit後數據持久化', async function() {
|
|
149
|
-
instance = await w.init()
|
|
150
|
-
let transaction = await w.genTransaction()
|
|
151
|
-
let connState = { instance, transaction }
|
|
152
|
-
|
|
153
|
-
let mi = await w.insert(genRs(), connState)
|
|
154
|
-
assert.deepStrictEqual(mi, { n: 3, nInserted: 3, ok: 1 })
|
|
155
|
-
|
|
156
|
-
let msv = await w.save(genRsm(), { ...connState, autoInsert: false })
|
|
157
|
-
assert.deepStrictEqual(msv, [
|
|
158
|
-
{ n: 1, nModified: 1, ok: 1 },
|
|
159
|
-
{ n: 1, nModified: 1, ok: 1 },
|
|
160
|
-
{ n: 0, nModified: 0, ok: 1 },
|
|
161
|
-
])
|
|
162
|
-
|
|
163
|
-
let md = await w.del({ id: 'id-rosemary' }, connState)
|
|
164
|
-
assert.deepStrictEqual(md, [{ n: 1, nDeleted: 1, ok: 1 }])
|
|
165
|
-
|
|
166
|
-
//交易內select可查到暫時有效的數據
|
|
167
|
-
let ssIn = sortByName(await w.select(null, connState))
|
|
168
|
-
assert.strictEqual(ssIn.length, 2)
|
|
169
|
-
assert.strictEqual(ssIn[0].name, 'kettle')
|
|
170
|
-
assert.strictEqual(ssIn[1].name, 'peter(modify)')
|
|
171
|
-
|
|
172
|
-
await transaction.commit()
|
|
173
|
-
await instance.close()
|
|
174
|
-
instance = null
|
|
175
|
-
|
|
176
|
-
let ssFinal = sortByName(await w.select())
|
|
177
|
-
assert.strictEqual(ssFinal.length, 2)
|
|
178
|
-
assert.strictEqual(ssFinal[0].name, 'kettle')
|
|
179
|
-
assert.strictEqual(ssFinal[0].value, 456)
|
|
180
|
-
assert.deepStrictEqual(ssFinal[1], { id: 'id-peter', name: 'peter(modify)', value: 123 })
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
describe('sqlite transaction rollback', function() {
|
|
187
|
-
|
|
188
|
-
let storage = './tmp/api-sqlite-rollback.sqlite'
|
|
189
|
-
let w = wo(genOpt(storage))
|
|
190
|
-
let instance = null
|
|
191
|
-
|
|
192
|
-
before(async function() {
|
|
193
|
-
prepStorage(storage)
|
|
194
|
-
await w.createStorage()
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
after(async function() {
|
|
198
|
-
if (instance) {
|
|
199
|
-
await instance.close().catch(() => {})
|
|
200
|
-
}
|
|
201
|
-
cleanStorage(storage)
|
|
202
|
-
})
|
|
203
|
-
|
|
204
|
-
it('交易內insert+save+del, rollback後數據全數還原', async function() {
|
|
205
|
-
instance = await w.init()
|
|
206
|
-
let transaction = await w.genTransaction()
|
|
207
|
-
let connState = { instance, transaction }
|
|
208
|
-
|
|
209
|
-
let mi = await w.insert(genRs(), connState)
|
|
210
|
-
assert.deepStrictEqual(mi, { n: 3, nInserted: 3, ok: 1 })
|
|
211
|
-
|
|
212
|
-
let msv = await w.save(genRsm(), { ...connState, autoInsert: false })
|
|
213
|
-
assert.deepStrictEqual(msv, [
|
|
214
|
-
{ n: 1, nModified: 1, ok: 1 },
|
|
215
|
-
{ n: 1, nModified: 1, ok: 1 },
|
|
216
|
-
{ n: 0, nModified: 0, ok: 1 },
|
|
217
|
-
])
|
|
218
|
-
|
|
219
|
-
let md = await w.del({ id: 'id-rosemary' }, connState)
|
|
220
|
-
assert.deepStrictEqual(md, [{ n: 1, nDeleted: 1, ok: 1 }])
|
|
221
|
-
|
|
222
|
-
//交易內select可查到暫時有效的數據
|
|
223
|
-
let ssIn = sortByName(await w.select(null, connState))
|
|
224
|
-
assert.strictEqual(ssIn.length, 2)
|
|
225
|
-
assert.strictEqual(ssIn[0].name, 'kettle')
|
|
226
|
-
assert.strictEqual(ssIn[1].name, 'peter(modify)')
|
|
227
|
-
|
|
228
|
-
await transaction.rollback()
|
|
229
|
-
await instance.close()
|
|
230
|
-
instance = null
|
|
231
|
-
|
|
232
|
-
let ssFinal = await w.select()
|
|
233
|
-
assert.deepStrictEqual(ssFinal, [])
|
|
234
|
-
})
|
|
235
|
-
|
|
236
|
-
})
|
|
42
|
+
defineSuites('sqlite', getOpt)
|