This repository was archived by the owner on Apr 17, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdb.js
126 lines (114 loc) · 2.86 KB
/
db.js
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
116
117
118
119
120
121
122
123
124
125
126
"use strict"
/// <reference path="mysql2" />
/// <reference path="fastify" />
/**
* Simple MySQL
*/
class Db {
/**
* @param {PromisePool} pool
* @param {FastifyInstance.log} logger
*/
constructor(pool, logger) {
/**
* @type {PromisePool}
* @private
*/
this._pool = pool
/**
* @type {FastifyInstance.log}
* @private
*/
this._logger = logger
this._logger.debug("MySQL:connect")
}
/**
* Format query
* @param {String} sql
* @param {{}} params
* @returns {Promise<string>} raw query
*/
async format(sql, params = {}) {
return this._pool.format(sql, params)
}
/**
* Run query
* @param {String} sql
* @param {{}} params
* @returns {Promise<*>}
*/
async query(sql, params = {}) {
this._logger.debug("MySQL:Query:", { sql, params })
return await this._pool.query(sql, params)
}
/**
* Fetch array of objects
* @param {String} sql
* @param {{}} params
* @returns {Promise<Array>} if no results, return empty array []
*/
async rows(sql, params = {}) {
const result = await this.query(sql, params)
if (!result) return []
const [rows] = result
return rows
}
/**
* Fetch row
* @param {String} sql
* @param {{}} params
* @returns {Promise<Object>} if no results, return empty object {}
*/
async row(sql, params = {}) {
const rows = await this.rows(sql, params)
if (!rows.length) return {}
const [row] = rows
return row
}
/**
* Fetch column (first column of query)
* @param {String} sql
* @param {{}} params
* @returns {Promise<Array>} if no results, return empty array []
*/
async column(sql, params = {}) {
const rows = await this.rows(sql, params)
if (!rows.length) return []
const [prop] = Object.keys(rows[0])
return rows.map(i => i[prop])
}
/**
* Fetch value
* @param {String} sql
* @param {{}} params
* @returns {Promise<string|number|null>}
*/
async value(sql, params = {}) {
const row = await this.row(sql, params)
if (!row) return null
const [prop] = Object.keys(row)
return row[prop]
}
/**
* Fetch total found results
* @returns {Promise<number>}
*/
async total() {
return +(await this.value("SELECT FOUND_ROWS()"))
}
/**
* Insert
* @param {String} sql
* @param {{}} params
* @returns {Promise<number>} insert id
*/
async insert(sql, params = {}) {
const [result] = await this.query(sql, params)
return result.insertId
}
end() {
this._pool.end()
this._logger.debug("MySQL:disconnect")
}
}
module.exports = Db