Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions src/node_sqlite.cc
Comment thread
mike-git374 marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,8 @@ void JSValueToSQLiteResult(Isolate* isolate,
} else if (value->IsString()) {
Utf8Value val(isolate, value.As<String>());
sqlite3_result_text(ctx, *val, val.length(), SQLITE_TRANSIENT);
} else if (value->IsArrayBufferView()) {
} else if (value->IsArrayBufferView() || value->IsArrayBuffer() ||
value->IsSharedArrayBuffer()) {
ArrayBufferViewContents<uint8_t> buf(value);
sqlite3_result_blob(ctx, buf.data(), buf.length(), SQLITE_TRANSIENT);
} else if (value->IsBigInt()) {
Expand Down Expand Up @@ -2160,7 +2161,8 @@ bool StatementSync::BindParams(const FunctionCallbackInfo<Value>& args) {
int anon_idx = 1;
int anon_start = 0;

if (args[0]->IsObject() && !args[0]->IsArrayBufferView()) {
if (args[0]->IsObject() && !args[0]->IsArrayBufferView() &&
!args[0]->IsArrayBuffer() && !args[0]->IsSharedArrayBuffer()) {
Local<Object> obj = args[0].As<Object>();
Local<Context> context = Isolate::GetCurrent()->GetCurrentContext();
Local<Array> keys;
Expand Down Expand Up @@ -2286,7 +2288,8 @@ bool StatementSync::BindValue(const Local<Value>& value, const int index) {
}
} else if (value->IsNull()) {
r = sqlite3_bind_null(statement_, index);
} else if (value->IsArrayBufferView()) {
} else if (value->IsArrayBufferView() || value->IsArrayBuffer() ||
value->IsSharedArrayBuffer()) {
ArrayBufferViewContents<uint8_t> buf(value);
r = sqlite3_bind_blob64(statement_,
index,
Expand Down
69 changes: 69 additions & 0 deletions test/parallel/test-sqlite-typed-array-and-data-view.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ function nextDb() {
}

const arrayBuffer = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]).buffer;
const sharedArrayBuffer = new SharedArrayBuffer(8);
const typedArrayOnSharedArrayBuffer = new Uint8Array(sharedArrayBuffer);
typedArrayOnSharedArrayBuffer.set([1, 2, 3, 4, 5, 6, 7, 8]);

const TypedArrays = [
['Int8Array', Int8Array],
['Uint8Array', Uint8Array],
Expand Down Expand Up @@ -60,3 +64,68 @@ suite('StatementSync with TypedArray/DataView', () => {
});
}
});

suite('StatementSync with ArrayBuffer and SharedArrayBuffer', () => {
const buffers = [
['ArrayBuffer', arrayBuffer],
['SharedArrayBuffer', sharedArrayBuffer],
];

for (const [displayName, buffer] of buffers) {
test(`${displayName} - anonymous binding`, (t) => {
const db = new DatabaseSync(nextDb());
t.after(() => { db.close(); });
db.exec('CREATE TABLE test (data BLOB)');
// insert
{
const stmt = db.prepare('INSERT INTO test VALUES (?)');
stmt.run(buffer);
}
// select all
{
const stmt = db.prepare('SELECT * FROM test');
const row = stmt.get();
t.assert.ok(row.data instanceof Uint8Array);
t.assert.strictEqual(row.data.length, 8);
t.assert.deepStrictEqual(row.data, new Uint8Array(arrayBuffer));
}
// query
{
const stmt = db.prepare('SELECT * FROM test WHERE data = ?');
const rows = stmt.all(buffer);
t.assert.strictEqual(rows.length, 1);
t.assert.ok(rows[0].data instanceof Uint8Array);
t.assert.strictEqual(rows[0].data.length, 8);
t.assert.deepStrictEqual(rows[0].data, new Uint8Array(arrayBuffer));
}
});

test(`${displayName} - named binding (object)`, (t) => {
const db = new DatabaseSync(nextDb());
t.after(() => { db.close(); });
db.exec('CREATE TABLE test (data BLOB)');
// insert
{
const stmt = db.prepare('INSERT INTO test VALUES ($data)');
stmt.run({ '$data': buffer });
}
// select all
{
const stmt = db.prepare('SELECT * FROM test');
const row = stmt.get();
t.assert.ok(row.data instanceof Uint8Array);
t.assert.strictEqual(row.data.length, 8);
t.assert.deepStrictEqual(row.data, new Uint8Array(arrayBuffer));
}
// query
{
const stmt = db.prepare('SELECT * FROM test WHERE data = $data');
const rows = stmt.all({ '$data': buffer });
t.assert.strictEqual(rows.length, 1);
t.assert.ok(rows[0].data instanceof Uint8Array);
t.assert.strictEqual(rows[0].data.length, 8);
t.assert.deepStrictEqual(rows[0].data, new Uint8Array(arrayBuffer));
}
});
}
});