2024-03-12 21:23:45 +01:00
|
|
|
import Database from "better-sqlite3";
|
2024-05-06 20:14:51 +02:00
|
|
|
import type { Logger } from "drizzle-orm";
|
2024-03-12 21:23:45 +01:00
|
|
|
import type { BetterSQLite3Database } from "drizzle-orm/better-sqlite3";
|
|
|
|
|
import { drizzle as drizzleSqlite } from "drizzle-orm/better-sqlite3";
|
|
|
|
|
import { drizzle as drizzleMysql } from "drizzle-orm/mysql2";
|
|
|
|
|
import mysql from "mysql2";
|
|
|
|
|
|
2024-05-06 20:14:51 +02:00
|
|
|
import { logger } from "@homarr/log";
|
|
|
|
|
|
2024-12-19 17:48:10 +01:00
|
|
|
import { env } from "./env.mjs";
|
2024-03-12 21:23:45 +01:00
|
|
|
import * as mysqlSchema from "./schema/mysql";
|
|
|
|
|
import * as sqliteSchema from "./schema/sqlite";
|
|
|
|
|
|
|
|
|
|
type HomarrDatabase = BetterSQLite3Database<typeof sqliteSchema>;
|
|
|
|
|
|
|
|
|
|
const init = () => {
|
2024-06-08 20:49:57 +02:00
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
2024-03-12 21:23:45 +01:00
|
|
|
if (!connection) {
|
2024-12-19 17:48:10 +01:00
|
|
|
switch (env.DB_DRIVER) {
|
2024-03-12 21:23:45 +01:00
|
|
|
case "mysql2":
|
|
|
|
|
initMySQL2();
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
initBetterSqlite();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export let connection: Database.Database | mysql.Connection;
|
|
|
|
|
export let database: HomarrDatabase;
|
|
|
|
|
|
2024-05-06 20:14:51 +02:00
|
|
|
class WinstonDrizzleLogger implements Logger {
|
|
|
|
|
logQuery(query: string, _: unknown[]): void {
|
|
|
|
|
logger.debug(`Executed SQL query: ${query}`);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-03-12 21:23:45 +01:00
|
|
|
const initBetterSqlite = () => {
|
2024-12-19 17:48:10 +01:00
|
|
|
connection = new Database(env.DB_URL);
|
2024-05-06 20:14:51 +02:00
|
|
|
database = drizzleSqlite(connection, {
|
|
|
|
|
schema: sqliteSchema,
|
|
|
|
|
logger: new WinstonDrizzleLogger(),
|
2024-11-23 17:17:00 +01:00
|
|
|
casing: "snake_case",
|
2024-05-19 19:55:44 +02:00
|
|
|
}) as unknown as never;
|
2024-03-12 21:23:45 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const initMySQL2 = () => {
|
2024-12-19 17:48:10 +01:00
|
|
|
if (!env.DB_HOST) {
|
|
|
|
|
connection = mysql.createConnection({ uri: env.DB_URL });
|
2024-03-12 21:23:45 +01:00
|
|
|
} else {
|
|
|
|
|
connection = mysql.createConnection({
|
2024-12-19 17:48:10 +01:00
|
|
|
host: env.DB_HOST,
|
|
|
|
|
database: env.DB_NAME,
|
|
|
|
|
port: env.DB_PORT,
|
|
|
|
|
user: env.DB_USER,
|
|
|
|
|
password: env.DB_PASSWORD,
|
2024-03-12 21:23:45 +01:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
database = drizzleMysql(connection, {
|
|
|
|
|
schema: mysqlSchema,
|
|
|
|
|
mode: "default",
|
2024-05-06 20:14:51 +02:00
|
|
|
logger: new WinstonDrizzleLogger(),
|
2024-11-23 17:17:00 +01:00
|
|
|
casing: "snake_case",
|
2024-03-12 21:23:45 +01:00
|
|
|
}) as unknown as HomarrDatabase;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
init();
|