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 | 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"
class TransactionContext {
conn: mysql.PoolConnection
constructor(conn: mysql.PoolConnection) {
this.conn = conn
}
execute(queryStr: string, params?: any[]): Promise<any> {
return new Promise((resolve, reject) => {
this.conn.query(queryStr, params, (err, rows) => {
if (err) return reject(err)
resolve(rows)
})
})
}
query(queryStr: string, params?: any[]): Promise<any> {
return new Promise((resolve, reject) => {
this.conn.query(queryStr, params, (err, rows) => {
if (err) return reject(err)
resolve(rows)
})
})
}
}
// Promise wrapper for node-mysql with transaction support and some shorthands
export class DatabaseConnection {
config: mysql.PoolConfig
pool!: mysql.Pool
constructor(config: mysql.PoolConfig) {
this.config = config
}
async connect(): Promise<void> {
this.pool = mysql.createPool(this.config)
await this.getConnection()
}
getConnection(): Promise<mysql.PoolConnection> {
return new Promise((resolve, reject) => {
this.pool.getConnection((poolerr, conn) => {
if (poolerr) {
reject(poolerr)
} else {
resolve(conn)
}
})
})
}
async transaction<T>(
callback: (t: TransactionContext) => Promise<T>
): Promise<T> {
const conn = await this.getConnection()
const transactionContext = new TransactionContext(conn)
try {
await transactionContext.execute("START TRANSACTION")
const result = await callback(transactionContext)
await transactionContext.execute("COMMIT")
return result
} catch (err) {
await transactionContext.execute("ROLLBACK")
throw err
} finally {
transactionContext.conn.release()
}
}
query(queryStr: string, params?: any[]): Promise<any> {
return new Promise((resolve, reject) => {
this.pool.query(queryStr, params, (err, rows) => {
if (err) {
console.log(`ERROR with query::\n${queryStr}\n::ERROR`)
return reject(err)
}
resolve(rows)
})
})
}
async get(queryStr: string, params?: any[]): Promise<any> {
return (await this.query(queryStr, params))[0]
}
end(): void {
this.pool.end()
}
}
|