102 lines
3.1 KiB
HTML
102 lines
3.1 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<title>MetonaSqlark E2E Harness</title>
|
||
</head>
|
||
<body>
|
||
<h1>MetonaSqlark E2E Harness</h1>
|
||
<div id="status">loading</div>
|
||
<script src="/dist/metona-sqlark.js"></script>
|
||
<script>
|
||
// E2E 驱动器:暴露全局 API,测试通过 page.evaluate 调用
|
||
// 使用高层 API(MetonaSqlark.create),保证 e2e 覆盖真实入口路径
|
||
window.__ms = {
|
||
version: () => (window.MetonaSqlark ? window.MetonaSqlark.VERSION : null),
|
||
|
||
/**
|
||
* 创建并打开 Aria 库。
|
||
* opts: {
|
||
* name, diskEngine ('opfs'|'memory'),
|
||
* walSyncMode, checkpointInterval,
|
||
* encryptionPassword, memtableSizeThreshold
|
||
* }
|
||
*/
|
||
open: async (opts) => {
|
||
// opts.mode: 'aria'(默认)| 'disk'(KVStoreEngine)
|
||
const config = {
|
||
name: opts.name,
|
||
mode: opts.mode || 'aria',
|
||
diskEngine: opts.diskEngine || 'opfs',
|
||
};
|
||
if (opts.mode !== 'disk') {
|
||
config.aria = {
|
||
walSyncMode: opts.walSyncMode || 'full',
|
||
checkpointInterval: opts.checkpointInterval || 100000,
|
||
memtableSizeThreshold: opts.memtableSizeThreshold || 64 * 1024 * 1024,
|
||
...(opts.encryptionPassword ? { encryption: { password: opts.encryptionPassword } } : {}),
|
||
};
|
||
}
|
||
const db = await window.MetonaSqlark.create(config);
|
||
window.__ms.__db = db;
|
||
return { ok: true, engineName: db.getEngine().name };
|
||
},
|
||
|
||
createTable: async (opts) => {
|
||
const db = window.__ms.__db;
|
||
const columns = {};
|
||
for (const col of opts.columns) {
|
||
columns[col.name] = { type: col.type, primaryKey: !!col.primaryKey, index: !!col.index };
|
||
}
|
||
await db.defineTable(opts.table, columns);
|
||
return { ok: true };
|
||
},
|
||
|
||
insert: async (opts) => {
|
||
const db = window.__ms.__db;
|
||
const pks = await db.table(opts.table).insertMany(opts.rows);
|
||
return { pks };
|
||
},
|
||
|
||
count: async (opts) => {
|
||
const db = window.__ms.__db;
|
||
return { count: await db.table(opts.table).count() };
|
||
},
|
||
|
||
find: async (opts) => {
|
||
const db = window.__ms.__db;
|
||
const rows = await db.table(opts.table).select().where(opts.where || {}).execute();
|
||
return { rows };
|
||
},
|
||
|
||
query: async (opts) => {
|
||
const db = window.__ms.__db;
|
||
return { rows: await db.query(opts.sql) };
|
||
},
|
||
|
||
repair: async () => {
|
||
const db = window.__ms.__db;
|
||
await db.repair();
|
||
return { ok: true };
|
||
},
|
||
|
||
clearAll: async () => {
|
||
const db = window.__ms.__db;
|
||
await db.clearAll();
|
||
return { ok: true };
|
||
},
|
||
|
||
close: async () => {
|
||
const db = window.__ms.__db;
|
||
await db.close();
|
||
window.__ms.__db = null;
|
||
return { ok: true };
|
||
},
|
||
|
||
getEngine: () => (window.__ms.__db ? window.__ms.__db.getEngine() : null),
|
||
};
|
||
document.getElementById('status').textContent = 'ready';
|
||
</script>
|
||
</body>
|
||
</html>
|