SPB Git forge

spb/websensor

Public
33commits 1branches 0releases
3.4 MBsize
maindefault branch
10 days agolast push
TypeScript 55.4% Python 43.2% SQL 1.2%
1.7 KB · 51 lines typescript
Raw Blame History
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