core/source/logic/helpers/sqlite.ts

177 lines
3.1 KiB
TypeScript
Raw Normal View History

2023-06-19 13:05:17 +02:00
namespace _heimdall.helpers.sqlite
{
/**
*/
2023-06-19 15:04:15 +02:00
export type type_query_raw = {
template : string;
arguments : Record<string, any>;
};
/**
*/
type type_query_transformed = {
template : string;
arguments : Record<string, any>;
};
/**
*/
function query_transform(
query_raw : type_query_raw
) : type_query_transformed
{
2023-06-19 18:05:19 +02:00
return {
"template": query_raw.template,
"arguments": lib_plankton.call.convey(
query_raw.arguments,
[
x => Object.entries(x),
x => (
x.map(
([key, value]) => ([
(":" + key),
value
])
)
),
x => Object.fromEntries(x),
]
),
};
2023-06-19 15:04:15 +02:00
}
/**
*/
function execute(
2023-06-19 13:05:17 +02:00
database_path : string,
2023-06-19 15:04:15 +02:00
action : ((handle) => Promise<void>),
) : Promise<void>
2023-06-19 13:05:17 +02:00
{
2023-06-19 15:04:15 +02:00
return (
new Promise<void>(
async (resolve, reject) => {
const nm_sqlite3 = require("sqlite3");
const handle = new nm_sqlite3.Database(database_path);
try {
await action(handle);
handle.close();
resolve(undefined);
}
catch (error) {
handle.close();
reject(error);
}
}
)
);
2023-06-19 13:05:17 +02:00
}
/**
2023-06-19 15:04:15 +02:00
* for CREATE TABLE, DROP TABLE, etc.
2023-06-19 13:05:17 +02:00
*/
2023-06-19 15:04:15 +02:00
export async function query_set(
2023-06-19 13:05:17 +02:00
database_path : string,
2023-06-19 15:04:15 +02:00
query_raw : type_query_raw
2023-06-19 13:05:17 +02:00
) : Promise<any>
{
2023-06-19 15:04:15 +02:00
const query_transformed : type_query_transformed = query_transform(query_raw);
await execute(
database_path,
(handle) => new Promise<void>(
(resolve, reject) => {
handle.run(
query_transformed.template,
query_transformed.arguments,
(error) => {
if (error) {
reject(error);
}
else {
resolve(undefined);
}
}
);
}
)
);
return undefined;
}
/**
* for INSERT, UPDATE, DELETE
*/
export async function query_put(
database_path : string,
query_raw : type_query_raw
) : Promise<{id : (null | int); affected : (null | int);}>
{
let result : {id : (null | int); affected : (null | int);};
const query_transformed : type_query_transformed = query_transform(query_raw);
await execute(
database_path,
(handle) => new Promise<void>(
(resolve, reject) => {
handle.run(
query_transformed.template,
query_transformed.arguments,
function (error) {
if (error) {
reject(error);
}
else {
result = {
"id": this.lastID,
"affected": this.changes,
};
resolve(undefined);
}
}
);
}
)
);
return result;
}
/**
* for SELECT
*/
export async function query_get(
database_path : string,
query_raw : type_query_raw
) : Promise<Array<Array<any>>>
{
const query_transformed : type_query_transformed = query_transform(query_raw);
let rows : Array<Array<any>> = [];
await execute(
database_path,
(handle) => new Promise<void>(
(resolve, reject) => {
handle.all(
query_transformed.template,
query_transformed.arguments,
(error, row) => {
if (error) {
reject(error);
}
else {
rows.push(row);
resolve(undefined);
}
}
);
}
)
);
return rows;
2023-06-19 13:05:17 +02:00
}
}