godot-sqlite-kysely
Version:
Kysely dialect for godot-sqlite. Adds SQLite support to Godot/GodotJS.
44 lines (43 loc) • 1.6 kB
JavaScript
import { SQLite, proxy } from 'godot.lib.api';
export function createSQLiteConnection(config) {
const { defaultExtension = 'db', foreignKeys = true, path, readOnly = false, verbosityLevel = SQLite.VerbosityLevel.NORMAL } = config;
const sqlite = new SQLite();
sqlite.default_extension = defaultExtension;
sqlite.foreign_keys = foreignKeys;
sqlite.path = path;
sqlite.read_only = readOnly;
sqlite.verbosity_level = verbosityLevel;
if (!sqlite.open_db()) {
throw new Error(`Failed to open godot-sqlite connection: ${sqlite.error_message}`);
}
return sqlite;
}
export function getResultRows(client) {
// WARNING: It's quicker to unwrap the array, than individual values. DO NOT use multi-word APIs on results!
const results = proxy.proxy_unwrap_value(client.query_result_by_reference);
const count = results.size();
if (count === 0) {
return [];
}
const rows = new Array(count);
const firstResult = results.get(0);
const resultKeys = firstResult.keys();
const keyCount = resultKeys.size();
const keys = new Array(keyCount);
const firstRow = {};
for (let i = 0; i < keyCount; i++) {
const key = resultKeys.get(i);
keys[i] = key;
firstRow[key] = firstResult.get(key);
}
rows[0] = firstRow;
for (let rowIndex = 1; rowIndex < results.size(); rowIndex++) {
const row = {};
const result = results.get(rowIndex);
for (const key of keys) {
row[key] = result.get(key);
}
rows[rowIndex] = row;
}
return rows;
}