1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import { InStatement, ResultSet } from "https://esm.sh/@libsql/client";
import {
convertSqliteType,
DatabaseHeader,
DatabaseResultSet,
DatabaseRow,
SqliteLikeBaseDriver,
} from "https://esm.sh/@libsqlstudio/gui/driver";
export function transformRawResult(raw: ResultSet): DatabaseResultSet {
const headerSet = new Set();
const headers: DatabaseHeader[] = raw.columns.map((colName, colIdx) => {
const colType = raw.columnTypes[colIdx];
let renameColName = colName;
for (let i = 0; i < 20; i++) {
if (!headerSet.has(renameColName)) break;
renameColName = `__${colName}_${i}`;
}
headerSet.add(renameColName);
return {
name: renameColName,
displayName: colName,
originalType: colType,
type: convertSqliteType(colType),
};
});
const rows = raw.rows.map((r) =>
headers.reduce((a, b, idx) => {
a[b.name] = r[idx];
return a;
}, {} as DatabaseRow)
);
return {
rows,
stat: {
rowsAffected: raw.rowsAffected,
// This is unique for stateless driver
rowsRead: (raw as any).rowsRead ?? null,
rowsWritten: (raw as any).rowsWritten ?? null,
queryDurationMs: (raw as any).queryDurationMS ?? null,
},
headers,
lastInsertRowid: raw.lastInsertRowid === undefined
? undefined
: Number(raw.lastInsertRowid),
};
}
export default class ValtownDriver extends SqliteLikeBaseDriver {
constructor() {
super();
}
async transaction(stmts: InStatement[]): Promise<DatabaseResultSet[]> {
const r = await fetch(`/api/batch`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
statements: stmts,
mode: "write",
}),
});
const json = await r.json();
return json.map(transformRawResult);
}
supportBigInt(): boolean {
return false;
}
async query(stmt: InStatement): Promise<DatabaseResultSet> {
const r = await fetch(`/api/execute`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ statement: stmt }),
});
const json = await r.json();
return transformRawResult(json as ResultSet);
}
close(): void {
// do nothing
}
}