· 6 years ago · Mar 16, 2019, 07:22 PM
1import Advanced from '../advanced';
2import mysql = require('mysql');
3
4export default class Database {
5
6 private static mysql: mysql.Connection;
7
8 private static table: string | null = null;
9
10 public async createConnection(config: Object, callback: Function, reconnect: boolean = false) {
11 Database.mysql = await mysql.createConnection(config);
12
13 this.getMySQL().connect((error) => {
14 if (error && !reconnect) throw error; else if (error && reconnect) {
15 Advanced.getLogger().error(`An error occurred connecting to the database: ${error.message}.`);
16
17 this.getMySQL().end(() => this.createConnection(config, callback, true));
18
19 return;
20 }
21
22 if (!reconnect) {
23 callback();
24
25 Advanced.getLogger().notice(`Successfully connected to MySQL.`);
26 } else Advanced.getLogger().notice(`Successfully reconnected to MySQL.`);
27 });
28
29 this.getMySQL().on('error', (error: mysql.MysqlError) => {
30 if (error.code = 'PROTOCOL_CONNECTION_LOST') {
31 Advanced.getLogger().error(`MySQL connection lost, reconnecting.`);
32
33 this.getMySQL().end(() => this.createConnection(config, callback, true));
34 }
35 });
36 }
37
38 public getMySQL() : mysql.Connection {
39 return Database.mysql;
40 }
41
42 public setTable(table: string | null) : Database {
43 Database.table = table;
44
45 return this;
46 }
47
48 public getTable() : string | null {
49 return Database.table;
50 }
51
52 public async select(data: string[] = ['*'], options: string | null = null, execute: any[] | null = []) {
53 if (!Database.table) return;
54
55 let query = 'SELECT ';
56
57 if (data[0].toLowerCase() === 'distinct') {
58 delete data[0];
59
60 query += 'DISTINCT ';
61 }
62
63 let i = 0;
64
65 for (let key in data) {
66 if (key === 'length') continue;
67
68 if (i !== (Object.keys(data).length - 1)) query += `${data[key]}, `; else query += `${data[key]} `;
69
70 i++;
71 }
72
73 query += `FROM ${Database.table}`;
74
75 if (options) query += ` ${options}`;
76
77 return await new Promise(async (resolve, reject) => {
78 try {
79 await Database.mysql.query(query, execute, (error, results, fields) => {
80 resolve({ error: error, results: results, fields: fields });
81 });
82 } catch (e) {
83 reject(e);
84 }
85 });
86 }
87
88 public async insert(data: any) {
89 if (!Database.table) return;
90
91 let query = `INSERT INTO ${Database.table} (`;
92
93 let i = 0;
94
95 let execute: any[] = [];
96
97 for (let key in data) {
98 if (key === 'length') continue;
99
100 if (i !== (Object.keys(data).length - 1)) query += `${key}, `; else query += `${key}`;
101
102 i++;
103 }
104
105 query += ') VALUES (';
106
107 i = 0;
108
109 for (let key in data) {
110 if (key === 'length') continue;
111
112 if (i !== (Object.keys(data).length - 1)) query += "?, "; else query += "?";
113
114 execute.push(data[key]);
115
116 i++;
117 }
118
119 query += ")";
120
121 return await new Promise(async (resolve, reject) => {
122 try {
123 await Database.mysql.query(query, execute, (error, results, fields) => {
124 resolve({ error: error, results: results, fields: fields });
125 });
126 } catch (e) {
127 reject(e);
128 }
129 });
130 }
131
132 public async update(data: any, options: string | null = null, execute: any[] | null = []) {
133 if (!Database.table) return;
134
135 let query = `UPDATE ${Database.table} `;
136
137 let i = 0;
138
139 let exe : any[] = [];
140
141 for (let key in data) {
142 if (key === 'length') continue;
143
144 if (Object.keys(data).length === 1) query += `SET ${key} = ? `; else if (i === 0) query += `SET ${key} = ?, `; else if (i !== (Object.keys(data).length - 1)) query += `${key} = ?, `; else query += `${key} = ?`;
145
146 exe.push(data[key]);
147
148 i++;
149 }
150
151 if (typeof execute !== typeof undefined && execute !== null) exe = exe.concat(execute);
152
153 if (options) query += ` ${options}`;
154
155 return await new Promise(async (resolve, reject) => {
156 try {
157 await Database.mysql.query(query, exe, (error, results, fields) => {
158 resolve({ error: error, results: results, fields: fields });
159 });
160 } catch (e) {
161 reject(e);
162 }
163 });
164 }
165
166 public async delete(options: string | null = null, execute: any[] | null = []) {
167 if (!Database.table) return;
168
169 let query = `DELETE FROM ${Database.table}`;
170
171 if (options) query += ` ${options}`;
172
173 return await new Promise(async (resolve, reject) => {
174 try {
175 await Database.mysql.query(query, execute, (error, results, fields) => {
176 resolve({ error: error, results: results, fields: fields });
177 });
178 } catch (e) {
179 reject(e);
180 }
181 });
182 }
183
184 public async create(data: any) {
185 if (!Database.table) return;
186
187 let query = `CREATE TABLE IF NOT EXISTS ${Database.table} (`;
188
189 let i = 0;
190
191 let execute: any[] = [];
192
193 for (let key in data) {
194 if (key === 'length') continue;
195
196 if (i !== (Object.keys(data).length - 1)) query += `${key} ${data[key]}, `; else query += `${key} ${data[key]} `;
197
198 i++;
199 }
200
201 query += ")";
202
203 return await new Promise(async (resolve, reject) => {
204 try {
205 await Database.mysql.query(query, execute, (error, results, fields) => {
206 resolve({ error: error, results: results, fields: fields });
207 });
208 } catch (e) {
209 reject(e);
210 }
211 });
212 }
213
214 public async drop(options: string | null = null, execute: any[] | null = []) {
215 if (!Database.table) return;
216
217 let query = `DROP TABLE ${Database.table}`;
218
219 if (options) query += ` ${options}`;
220
221 return await new Promise(async (resolve, reject) => {
222 try {
223 await Database.mysql.query(query, execute, (error, results, fields) => {
224 resolve({ error: error, results: results, fields: fields });
225 });
226 } catch (e) {
227 reject(e);
228 }
229 });
230 }
231
232 public async truncate(options: string | null = null, execute: any[] | null = []) {
233 if (!Database.table) return;
234
235 let query = `TRUNCATE TABLE ${Database.table}`;
236
237 if (options) query += ` ${options}`;
238
239 return await new Promise(async (resolve, reject) => {
240 try {
241 await Database.mysql.query(query, execute, (error, results, fields) => {
242 resolve({ error: error, results: results, fields: fields });
243 });
244 } catch (e) {
245 reject(e);
246 }
247 });
248 }
249}