Fixes #97: SQLite is now async, optimized, tests
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
import { getStr } from "../src/wasm.ts";
|
||||
|
||||
const isWindows = Deno.build.os === "windows";
|
||||
|
||||
// Closure to return an environment that links
|
||||
// the current wasm context
|
||||
export default function env(inst) {
|
||||
// Exported environment
|
||||
const env = {
|
||||
// Print a string pointer to console
|
||||
js_print: (str_ptr) => {
|
||||
const text = getStr(inst.exports, str_ptr);
|
||||
console.log(text[text.length - 1] === "\n" ? text.slice(0, -1) : text);
|
||||
},
|
||||
// Open the file at path, mode = 0 is open RW, mode = 1 is open TEMP
|
||||
js_open: (path_ptr, mode, flags) => {
|
||||
let path;
|
||||
switch (mode) {
|
||||
case 0:
|
||||
path = getStr(inst.exports, path_ptr);
|
||||
break;
|
||||
case 1:
|
||||
path = Deno.makeTempFileSync({ prefix: "deno_sqlite" });
|
||||
break;
|
||||
}
|
||||
|
||||
const write = !!(flags & 0x00000002);
|
||||
const create = !!(flags & 0x00000004);
|
||||
const rid = Deno.openSync(path, { read: true, write, create }).rid;
|
||||
return rid;
|
||||
},
|
||||
// Close a file
|
||||
js_close: (rid) => {
|
||||
Deno.close(rid);
|
||||
},
|
||||
// Delete file at path
|
||||
js_delete: (path_ptr) => {
|
||||
const path = getStr(inst.exports, path_ptr);
|
||||
Deno.removeSync(path);
|
||||
},
|
||||
// Read from a file to a buffer in the module
|
||||
js_read: (rid, buffer_ptr, offset, amount) => {
|
||||
const buffer = new Uint8Array(
|
||||
inst.exports.memory.buffer,
|
||||
buffer_ptr,
|
||||
amount,
|
||||
);
|
||||
Deno.seekSync(rid, offset, Deno.SeekMode.Start);
|
||||
return Deno.readSync(rid, buffer);
|
||||
},
|
||||
// Write to a file from a buffer in the module
|
||||
js_write: (rid, buffer_ptr, offset, amount) => {
|
||||
const buffer = new Uint8Array(
|
||||
inst.exports.memory.buffer,
|
||||
buffer_ptr,
|
||||
amount,
|
||||
);
|
||||
Deno.seekSync(rid, offset, Deno.SeekMode.Start);
|
||||
return Deno.writeSync(rid, buffer);
|
||||
},
|
||||
// Truncate the given file
|
||||
js_truncate: (rid, size) => {
|
||||
Deno.ftruncateSync(rid, size);
|
||||
},
|
||||
// Sync file data to disk
|
||||
js_sync: (rid) => {
|
||||
Deno.fdatasyncSync(rid);
|
||||
},
|
||||
// Retrieve the size of the given file
|
||||
js_size: (rid) => {
|
||||
return Deno.fstatSync(rid).size;
|
||||
},
|
||||
// Acquire a SHARED or EXCLUSIVE file lock
|
||||
js_lock: (rid, exclusive) => {
|
||||
// this is unstable and has issues on Windows ...
|
||||
if (Deno.flockSync && !isWindows) Deno.flockSync(rid, exclusive !== 0);
|
||||
},
|
||||
// Release a file lock
|
||||
js_unlock: (rid) => {
|
||||
// this is unstable and has issues on Windows ...
|
||||
if (Deno.funlockSync && !isWindows) Deno.funlockSync(rid);
|
||||
},
|
||||
// Return current time in ms since UNIX epoch
|
||||
js_time: () => {
|
||||
return Date.now();
|
||||
},
|
||||
// Return the timezone offset in minutes for
|
||||
// the current locale.
|
||||
js_timezone: () => {
|
||||
return (new Date()).getTimezoneOffset();
|
||||
},
|
||||
// Determine if a path exists
|
||||
js_exists: (path_ptr) => {
|
||||
const path = getStr(inst.exports, path_ptr);
|
||||
try {
|
||||
Deno.statSync(path);
|
||||
} catch (e) {
|
||||
if (e instanceof Deno.errors.NotFound) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
},
|
||||
// Determine if a path is accessible i.e. if it has read/write permissions
|
||||
// TODO(dyedgreen): Properly determine if there are read permissions
|
||||
js_access: (path_ptr) => {
|
||||
const path = getStr(inst.exports, path_ptr);
|
||||
try {
|
||||
Deno.statSync(path);
|
||||
} catch (e) {
|
||||
if (e instanceof Deno.errors.PermissionDenied) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
},
|
||||
};
|
||||
|
||||
return { env };
|
||||
}
|
||||
Reference in New Issue
Block a user