UNPKG

godot-sqlite-kysely

Version:

Kysely dialect for godot-sqlite. Adds SQLite support to Godot/GodotJS.

62 lines (44 loc) 1.77 kB
import { GArray, GDictionary, SQLite, proxy } from 'godot.lib.api'; import { GodotSQLiteKyselyConnectionConfig } from './types'; export function createSQLiteConnection(config: GodotSQLiteKyselyConnectionConfig) { 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: SQLite) { // 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 as GArray<GDictionary<Record<string, unknown>>>); const count = results.size(); if (count === 0) { return []; } const rows = new Array<Record<string, unknown>>(count); const firstResult = results.get(0); const resultKeys = firstResult.keys(); const keyCount = resultKeys.size(); const keys = new Array<string>(keyCount); const firstRow: Record<string, unknown> = {}; 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: Record<string, unknown> = {}; const result = results.get(rowIndex); for (const key of keys) { row[key] = result.get(key); } rows[rowIndex] = row; } return rows; }