TypeScript 55.4%
Python 43.2%
SQL 1.2%
1import { drizzle, type NodePgDatabase } from "drizzle-orm/node-postgres";2import pg from "pg";3import * as schema from "./schema";45export * from "./schema";6export { sql, eq, and, or, desc, asc, inArray, gte, lte, lt, gt, ilike, isNull, isNotNull, ne, count, max, min, avg, sum } from "drizzle-orm";7export { migrate } from "./migrate";89import { sql as _sql } from "drizzle-orm";10/** Postgres text[] literal (Drizzle spreads JS arrays into parameter lists, which breaks `= any(...)`). */11export function textArray(values: readonly string[]) {12 const lit = "{" + values.map((v) => '"' + String(v).replace(/\\/g, "\\\\").replace(/"/g, '\\"') + '"').join(",") + "}";13 return _sql.raw("'" + lit.replace(/'/g, "''") + "'::text[]");14}1516export type Db = NodePgDatabase<typeof schema>;1718let pool: pg.Pool | null = null;19let dbInstance: Db | null = null;2021export function getPool(): pg.Pool {22 if (!pool) {23 pool = new pg.Pool({24 connectionString: process.env.DATABASE_URL ?? "postgres://localhost:5432/websensor",25 max: Number(process.env.DB_POOL_MAX ?? 10),26 idleTimeoutMillis: 30_000,27 connectionTimeoutMillis: 10_000,28 application_name: process.env.WS_APP_NAME ?? "websensor",29 });30 pool.on("error", (e) => console.error("[db] pool error", e.message));31 }32 return pool;33}3435export function getDb(): Db {36 if (!dbInstance) dbInstance = drizzle(getPool(), { schema });37 return dbInstance;38}3940export const db: Db = new Proxy({} as Db, {41 get(_t, prop) {42 return (getDb() as unknown as Record<string | symbol, unknown>)[prop];43 },44});4546export async function closeDb(): Promise<void> {47 if (pool) await pool.end();48 pool = null;49 dbInstance = null;50}51