1import * as _ from 'lodash-es'2import { decomposeForkedKubeQs } from '../../serverF/dbF/decompForkedKubeQsF.mts'3import { getDbBackupDir } from './backupDbConstantsF.mts'4import { doKnexConn } from '../../serverF/dbF/doKnexConnF.mts'5import { decomposeQsFromSec } from '../../serverF/secretsF/decomposeQsFromSecF.mts'6import { execAsyncR } from '../../serverF/childProcF/exec1AsyncRF.mts'7import { doBackupDb } from './doBackupDbF.mts'8import { runPgOnKlustCtx } from '../../serverF/dbF/runPgOnKlustCtxF.mts'9import { runPgOnKlust } from './backupDbConstantsF.mts'10import type { secretNameType } from '../../serverF/secretsF/getPlainSecAI.mts'12export const backupDb = async ({qsName, isQuiet=false}: {qsName: string, isQuiet?: boolean}) => {13 return runPgOnKlustCtx.run({runPgOnKlust} as Record<string, unknown>, async () => {14 const decomp = await decomposeForkedKubeQs({qsName})15 const {svcName: dbName, extQs, dbQs} = decomp17 const dirPath = getDbBackupDir({dbName})19 await execAsyncR(`mkdir -p ${dirPath}`)21 const dateI = (new Date).getTime()23 const file_path = [dirPath, `${dbName}_${dateI}.sql`].join('/')24 await doBackupDb({qsName, file_path, format: 'custom', isQuiet})25 })26}28export const isDbUp = async ({qsName}: {qsName: secretNameType}) => {29 const decomp = await decomposeQsFromSec(qsName)30 return testDbConn({decomp, qsName, timeoutMs: 5000})31}33export const testDbConn = async ({decomp, qsName, timeoutMs = 5000}: {decomp: Record<string, unknown>, qsName: string, timeoutMs?: number}) => {34 const db = doKnexConn({...decomp, qsName} as any)35 try {36 await db.raw('select 1+1 as result').timeout(timeoutMs)37 return true38 } catch (ee: any) {39 if (ee.name === 'KnexTimeoutError' || (typeof ee.code === 'string' && /^E[A-Z]/.test(ee.code))) {40 return false41 }42 throw ee43 } finally {44 await db.destroy()45 }46}