@@ -14,6 +14,10 @@ function nextDb() { |
14 | 14 | } |
15 | 15 |
|
16 | 16 | const arrayBuffer = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]).buffer; |
| 17 | +const sharedArrayBuffer = new SharedArrayBuffer(8); |
| 18 | +const typedArrayOnSharedArrayBuffer = new Uint8Array(sharedArrayBuffer); |
| 19 | +typedArrayOnSharedArrayBuffer.set([1, 2, 3, 4, 5, 6, 7, 8]); |
| 20 | + |
17 | 21 | const TypedArrays = [ |
18 | 22 | ['Int8Array', Int8Array], |
19 | 23 | ['Uint8Array', Uint8Array], |
@@ -60,3 +64,68 @@ suite('StatementSync with TypedArray/DataView', () => { |
60 | 64 | }); |
61 | 65 | } |
62 | 66 | }); |
| 67 | + |
| 68 | +suite('StatementSync with ArrayBuffer and SharedArrayBuffer', () => { |
| 69 | + const buffers = [ |
| 70 | + ['ArrayBuffer', arrayBuffer], |
| 71 | + ['SharedArrayBuffer', sharedArrayBuffer], |
| 72 | + ]; |
| 73 | + |
| 74 | + for (const [displayName, buffer] of buffers) { |
| 75 | + test(`${displayName} - anonymous binding`, (t) => { |
| 76 | + const db = new DatabaseSync(':memory:'); |
| 77 | + t.after(() => { db.close(); }); |
| 78 | + db.exec('CREATE TABLE test (data BLOB)'); |
| 79 | + // insert |
| 80 | + { |
| 81 | + const stmt = db.prepare('INSERT INTO test VALUES (?)'); |
| 82 | + stmt.run(buffer); |
| 83 | + } |
| 84 | + // select all |
| 85 | + { |
| 86 | + const stmt = db.prepare('SELECT * FROM test'); |
| 87 | + const row = stmt.get(); |
| 88 | + t.assert.ok(row.data instanceof Uint8Array); |
| 89 | + t.assert.strictEqual(row.data.length, 8); |
| 90 | + t.assert.deepStrictEqual(row.data, new Uint8Array(arrayBuffer)); |
| 91 | + } |
| 92 | + // query |
| 93 | + { |
| 94 | + const stmt = db.prepare('SELECT * FROM test WHERE data = ?'); |
| 95 | + const rows = stmt.all(buffer); |
| 96 | + t.assert.strictEqual(rows.length, 1); |
| 97 | + t.assert.ok(rows[0].data instanceof Uint8Array); |
| 98 | + t.assert.strictEqual(rows[0].data.length, 8); |
| 99 | + t.assert.deepStrictEqual(rows[0].data, new Uint8Array(arrayBuffer)); |
| 100 | + } |
| 101 | + }); |
| 102 | + |
| 103 | + test(`${displayName} - named binding (object)`, (t) => { |
| 104 | + const db = new DatabaseSync(':memory:'); |
| 105 | + t.after(() => { db.close(); }); |
| 106 | + db.exec('CREATE TABLE test (data BLOB)'); |
| 107 | + // insert |
| 108 | + { |
| 109 | + const stmt = db.prepare('INSERT INTO test VALUES ($data)'); |
| 110 | + stmt.run({ '$data': buffer }); |
| 111 | + } |
| 112 | + // select all |
| 113 | + { |
| 114 | + const stmt = db.prepare('SELECT * FROM test'); |
| 115 | + const row = stmt.get(); |
| 116 | + t.assert.ok(row.data instanceof Uint8Array); |
| 117 | + t.assert.strictEqual(row.data.length, 8); |
| 118 | + t.assert.deepStrictEqual(row.data, new Uint8Array(arrayBuffer)); |
| 119 | + } |
| 120 | + // query |
| 121 | + { |
| 122 | + const stmt = db.prepare('SELECT * FROM test WHERE data = $data'); |
| 123 | + const rows = stmt.all({ '$data': buffer }); |
| 124 | + t.assert.strictEqual(rows.length, 1); |
| 125 | + t.assert.ok(rows[0].data instanceof Uint8Array); |
| 126 | + t.assert.strictEqual(rows[0].data.length, 8); |
| 127 | + t.assert.deepStrictEqual(rows[0].data, new Uint8Array(arrayBuffer)); |
| 128 | + } |
| 129 | + }); |
| 130 | + } |
| 131 | +}); |