Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | import * as mysql from "mysql"
import * as typeorm from "typeorm"
import { Knex, knex } from "knex"
import {
DB_HOST,
DB_USER,
DB_PASS,
DB_NAME,
DB_PORT,
} from "../settings/serverSettings"
import { registerExitHandler } from "./cleanup"
let typeormConnection: typeorm.Connection
export const getConnection = async (): Promise<typeorm.Connection> => {
if (typeormConnection) return typeormConnection
try {
typeormConnection = typeorm.getConnection()
} catch (err) {
if (err instanceof Error && err.name === "ConnectionNotFoundError")
typeormConnection = await typeorm.createConnection()
else throw err
}
registerExitHandler(async () => {
if (typeormConnection) await typeormConnection.close()
})
return typeormConnection
}
export class TransactionContext {
manager: typeorm.EntityManager
constructor(manager: typeorm.EntityManager) {
this.manager = manager
}
execute(queryStr: string, params?: any[]): Promise<any> {
return this.manager.query(
params ? mysql.format(queryStr, params) : queryStr
)
}
query(queryStr: string, params?: any[]): Promise<any> {
return this.manager.query(
params ? mysql.format(queryStr, params) : queryStr
)
}
}
export const transaction = async <T>(
callback: (t: TransactionContext) => Promise<T>
): Promise<T> =>
(await getConnection()).transaction(async (manager) =>
callback(new TransactionContext(manager))
)
export const queryMysql = async (
queryStr: string,
params?: any[]
): Promise<any> => {
const conn = await getConnection()
return conn.query(params ? mysql.format(queryStr, params) : queryStr)
}
// For operations that modify data (TODO: handling to check query isn't used for this)
export const execute = queryMysql
// Return the first match from a mysql query
export const mysqlFirst = async (
queryStr: string,
params?: any[]
): Promise<any> => {
return (await queryMysql(queryStr, params))[0]
}
export const closeTypeOrmAndKnexConnections = async (): Promise<void> => {
if (typeormConnection) await typeormConnection.close()
if (_knexInstance) await _knexInstance.destroy()
}
let _knexInstance: Knex
export const knexInstance = (): Knex<any, any[]> => {
if (_knexInstance) return _knexInstance
_knexInstance = knex({
client: "mysql",
connection: {
host: DB_HOST,
user: DB_USER,
password: DB_PASS,
database: DB_NAME,
port: DB_PORT,
typeCast: (field: any, next: any) => {
if (field.type === "TINY" && field.length === 1) {
return field.string() === "1" // 1 = true, 0 = false
}
return next()
},
},
})
registerExitHandler(async () => {
if (_knexInstance) await _knexInstance.destroy()
})
return _knexInstance
}
export const knexTable = (table: string): Knex.QueryBuilder =>
knexInstance().table(table)
export const knexRaw = (str: string): Knex.Raw => knexInstance().raw(str)
|