17 lines
1.2 KiB
TypeScript
17 lines
1.2 KiB
TypeScript
import { getTableColumns } from "drizzle-orm"
|
|
import { servers } from "../db/schema.js"
|
|
import { pool } from "../db/index.js"
|
|
import { readBoundedFlowSql } from "./traffic-flow-bounded-sql.js"
|
|
type ServerRow=typeof servers.$inferSelect
|
|
const columns=Object.entries(getTableColumns(servers))
|
|
const quote=(value:string)=>'"'+value.replaceAll('"','""')+'"'
|
|
export async function readBoundedFlowServerRows(ids:readonly number[]):Promise<ServerRow[]> {
|
|
if(ids.some(id=>!Number.isSafeInteger(id)||id<=0)||ids.length>1000)throw Error("Некорректная область серверов NetFlow")
|
|
if(!ids.length)return []
|
|
// Timestamp strings retain the normal Drizzle text parser behavior.
|
|
const projection=columns.map(([key,column])=>quote(column.name)+(column.columnType==="PgTimestampString"?"::text":"")+" AS "+quote(key)).join(",")
|
|
const rows=await readBoundedFlowSql(pool,"SELECT "+projection+" FROM servers WHERE id=ANY($1::bigint[]) ORDER BY id",[[...ids]],{maxRows:1000,maxEncodedBytes:4194304})
|
|
return rows.map(row=>Object.fromEntries(columns.map(([key,column])=>[key,row[key]===null?null:column.mapFromDriverValue(row[key])])) as ServerRow)
|
|
}
|
|
export async function getBoundedFlowServerRowById(id:number){return(await readBoundedFlowServerRows([id]))[0]}
|