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
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|