break up library, move bots to their own repositories
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
import { Database } from 'bun:sqlite';
|
||||
|
||||
export function dynamicInsert<T extends {} = any>(db: Database, table: string, item: T) {
|
||||
const keys = Object.keys(item);
|
||||
const values = keys.map((k) => item[k]);
|
||||
|
||||
const stmt = db.prepare(`INSERT INTO ${table} (${keys.join(', ')}) VALUES (${keys.map((k) => '?').join(', ')})`);
|
||||
return stmt.run(...values).lastInsertRowid;
|
||||
}
|
||||
|
||||
export function dynamicUpdate<T extends {} = any>(db: Database, table: string, item: T, key: string, keyValue: any) {
|
||||
const keys = Object.keys(item);
|
||||
const values = keys.map((k) => item[k]);
|
||||
|
||||
const stmt = db.prepare(`UPDATE ${table} SET ${keys.map((k) => `${k} = ?`).join(', ')} WHERE ${key} = ?`);
|
||||
return stmt.run(...values, keyValue).changes;
|
||||
}
|
||||
|
||||
export interface QueryOptions<T extends {}> {
|
||||
skip?: number;
|
||||
limit?: number;
|
||||
orderBy?: Partial<Record<keyof T, 'ASC' | 'DESC'>>;
|
||||
}
|
||||
|
||||
type Where<T> = Partial<Record<keyof T, any>> & { or?: Partial<Record<keyof T, any>> };
|
||||
|
||||
export function select<T extends {}>(db: Database, table: string, options?: QueryOptions<T>, select: string = '*', where?: Where<T>): T[] {
|
||||
let query = `SELECT ${select} FROM ${table}\n`;
|
||||
const values = [];
|
||||
if (where) {
|
||||
query += `WHERE `;
|
||||
|
||||
if (where.or) {
|
||||
query += `${Object.keys(where.or)
|
||||
.map((k) => {
|
||||
values.push(where.or[k]);
|
||||
return `${k} = ?\n`;
|
||||
})
|
||||
.join('OR ')}`;
|
||||
delete where.or;
|
||||
}
|
||||
|
||||
if (Object.keys(where).length > 0) {
|
||||
query += `${Object.keys(where)
|
||||
.map((k) => {
|
||||
values.push(where[k]);
|
||||
return `${k} = ?\n`;
|
||||
})
|
||||
.join('AND ')}`;
|
||||
}
|
||||
}
|
||||
|
||||
if (options?.orderBy) {
|
||||
query += `ORDER BY\n${Object.keys(options.orderBy)
|
||||
.map((k) => {
|
||||
values.push(options.orderBy[k]);
|
||||
return `${k} ?`;
|
||||
})
|
||||
.join(',\n')}\n`;
|
||||
}
|
||||
|
||||
if (options?.skip) {
|
||||
values.push(options.limit || -1);
|
||||
values.push(options.skip);
|
||||
query += `LIMIT ? OFFSET ?`;
|
||||
}
|
||||
|
||||
return db.prepare(query).all(...values) as T[];
|
||||
}
|
||||
|
||||
export function remove<T>(db: Database, table: string, where?: Where<T>) {
|
||||
let query = `DELETE FROM ${table}`;
|
||||
|
||||
const values = [];
|
||||
if (where) {
|
||||
query += `WHERE `;
|
||||
|
||||
if (where.or) {
|
||||
query += `${Object.keys(where.or)
|
||||
.map((k) => {
|
||||
values.push(where.or[k]);
|
||||
return `${k} = ?\n`;
|
||||
})
|
||||
.join('OR ')}`;
|
||||
delete where.or;
|
||||
}
|
||||
|
||||
if (Object.keys(where).length > 0) {
|
||||
query += `${Object.keys(where)
|
||||
.map((k) => {
|
||||
values.push(where[k]);
|
||||
return `${k} = ?\n`;
|
||||
})
|
||||
.join('AND ')}`;
|
||||
}
|
||||
}
|
||||
|
||||
return db.prepare(query).run(...values).changes;
|
||||
}
|
||||
Reference in New Issue
Block a user