| 'use strict'; |
| const { skipIfSQLiteMissing } = require('../common'); |
| skipIfSQLiteMissing(); |
| const tmpdir = require('../common/tmpdir'); |
| const { join } = require('node:path'); |
| const { DatabaseSync } = require('node:sqlite'); |
| const { suite, test } = require('node:test'); |
| let cnt = 0; |
| |
| tmpdir.refresh(); |
| |
| function nextDb() { |
| return join(tmpdir.path, `database-${cnt++}.db`); |
| } |
| |
| suite('manual transactions', () => { |
| test('a transaction is committed', (t) => { |
| const db = new DatabaseSync(nextDb()); |
| t.after(() => { db.close(); }); |
| const setup = db.exec(` |
| CREATE TABLE data( |
| key INTEGER PRIMARY KEY |
| ) STRICT; |
| `); |
| t.assert.strictEqual(setup, undefined); |
| t.assert.deepStrictEqual( |
| db.prepare('BEGIN').run(), |
| { changes: 0, lastInsertRowid: 0 }, |
| ); |
| t.assert.deepStrictEqual( |
| db.prepare('INSERT INTO data (key) VALUES (100)').run(), |
| { changes: 1, lastInsertRowid: 100 }, |
| ); |
| t.assert.deepStrictEqual( |
| db.prepare('COMMIT').run(), |
| { changes: 1, lastInsertRowid: 100 }, |
| ); |
| t.assert.deepStrictEqual( |
| db.prepare('SELECT * FROM data').all(), |
| [{ __proto__: null, key: 100 }], |
| ); |
| }); |
| |
| test('a transaction is rolled back', (t) => { |
| const db = new DatabaseSync(nextDb()); |
| t.after(() => { db.close(); }); |
| const setup = db.exec(` |
| CREATE TABLE data( |
| key INTEGER PRIMARY KEY |
| ) STRICT; |
| `); |
| t.assert.strictEqual(setup, undefined); |
| t.assert.deepStrictEqual( |
| db.prepare('BEGIN').run(), |
| { changes: 0, lastInsertRowid: 0 }, |
| ); |
| t.assert.deepStrictEqual( |
| db.prepare('INSERT INTO data (key) VALUES (100)').run(), |
| { changes: 1, lastInsertRowid: 100 }, |
| ); |
| t.assert.deepStrictEqual( |
| db.prepare('ROLLBACK').run(), |
| { changes: 1, lastInsertRowid: 100 }, |
| ); |
| t.assert.deepStrictEqual(db.prepare('SELECT * FROM data').all(), []); |
| }); |
| }); |