Skip to content

Commit e086972

Browse files
authored
Expose SQLiteDatabaseClient (#232)
* expose SQLiteDatabaseClient * open(blob)
1 parent 8945d7b commit e086972

File tree

5 files changed

+27
-6
lines changed

5 files changed

+27
-6
lines changed

rollup.config.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,15 @@ export default [
1111
node(),
1212
terser({
1313
output: {preamble: copyright},
14-
mangle: {reserved: ["RequireError"]}
14+
mangle: {
15+
reserved: [
16+
"FileAttachment",
17+
"RequireError",
18+
"SQLiteDatabaseClient",
19+
"ZipArchive",
20+
"ZipArchiveEntry"
21+
]
22+
}
1523
})
1624
],
1725
output: {

src/fileAttachment.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {require as requireDefault} from "d3-require";
2-
import sqlite, {SQLiteDatabaseClient} from "./sqlite.js";
2+
import {SQLiteDatabaseClient} from "./sqlite.js";
33
import jszip from "./zip.js";
44

55
async function remote_fetch(file) {
@@ -53,9 +53,7 @@ class AbstractFile {
5353
});
5454
}
5555
async sqlite() {
56-
const [SQL, buffer] = await Promise.all([sqlite(requireDefault), this.arrayBuffer()]);
57-
const db = new SQL.Database(new Uint8Array(buffer));
58-
return new SQLiteDatabaseClient(db);
56+
return SQLiteDatabaseClient.open(remote_fetch(this));
5957
}
6058
async zip() {
6159
const [JSZip, buffer] = await Promise.all([jszip(requireDefault), this.arrayBuffer()]);

src/library.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import now from "./now.js";
1010
import Promises from "./promises/index.js";
1111
import resolve from "./resolve.js";
1212
import requirer from "./require.js";
13-
import SQLite from "./sqlite.js";
13+
import SQLite, {SQLiteDatabaseClient} from "./sqlite.js";
1414
import svg from "./svg.js";
1515
import tex from "./tex.js";
1616
import vegalite from "./vegalite.js";
@@ -24,6 +24,7 @@ export default Object.assign(function Library(resolver) {
2424
Mutable: () => Mutable,
2525
Plot: () => require("@observablehq/[email protected]/dist/plot.umd.min.js"),
2626
SQLite: () => SQLite(require),
27+
SQLiteDatabaseClient: () => SQLiteDatabaseClient,
2728
_: () => require("[email protected]/lodash.min.js"),
2829
d3: () => require("[email protected]/dist/d3.min.js"),
2930
dot: () => require("@observablehq/[email protected]/dist/graphviz.min.js"),

src/sqlite.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import {require as requireDefault} from "d3-require";
2+
13
export default async function sqlite(require) {
24
const sql = await require("[email protected]/dist/sql-wasm.js");
35
return sql({locateFile: file => `https://cdn.jsdelivr.net/npm/[email protected]/dist/${file}`});
@@ -9,6 +11,10 @@ export class SQLiteDatabaseClient {
911
_db: {value: db}
1012
});
1113
}
14+
static async open(source) {
15+
const [SQL, buffer] = await Promise.all([sqlite(requireDefault), Promise.resolve(source).then(load)]);
16+
return new SQLiteDatabaseClient(new SQL.Database(buffer));
17+
}
1218
async query(query, params) {
1319
return await exec(this._db, query, params);
1420
}
@@ -34,6 +40,13 @@ export class SQLiteDatabaseClient {
3440
}
3541
}
3642

43+
function load(source) {
44+
return typeof source === "string" ? fetch(source).then(load)
45+
: source instanceof Response || source instanceof Blob ? source.arrayBuffer().then(load)
46+
: source instanceof ArrayBuffer ? new Uint8Array(source)
47+
: source;
48+
}
49+
3750
async function exec(db, query, params) {
3851
const [result] = await db.exec(query, params);
3952
if (!result) return [];

test/index-test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ test("new Library returns a library with the expected keys", async t => {
1212
"Plot",
1313
"Promises",
1414
"SQLite",
15+
"SQLiteDatabaseClient",
1516
"_",
1617
"d3",
1718
"dot",

0 commit comments

Comments
 (0)