[TIC-Web] Apply generic resource pooling
[archive/20170607/tools/tic.git] / controller / dbpool.js
1 'use strict'
2
3 var generic_pool = require('generic-pool');
4 var mariasql = require('mariasql');
5 var JL = require('jsnlog').JL;
6 var logger = JL('dbpool.js');
7
8 var AppConfig = require('../config.json');
9
10
11 function dbPool () {
12     var self = this;
13     
14     self.configMariasql = {
15         host: AppConfig.DATABASE.HOST,
16         user: AppConfig.DATABASE.USERNAME,
17         password: AppConfig.DATABASE.PASSWORD,
18         db: AppConfig.DATABASE.DATABASE,
19         trace: AppConfig.DATABASE.TRACE,
20         pingInactive: 1000,
21         metadata: false
22     };
23
24     self.pool = generic_pool.createPool({
25         name: AppConfig.DATABASE.DIALECT,
26
27         create: function (callback) {
28             return new Promise(function (resolve, reject) {
29                 var mariasqlClient = new mariasql(self.configMariasql);
30                 mariasqlClient.connect(function (err) {
31                     if (err) {
32                         logger.error('DB Connection Error !');
33                         logger.error(err);
34                         reject(err);
35                     }
36
37                     logger.info('DB Connection Success !');
38                     resolve(mariasqlClient);
39                 });
40
41                 // mariasqlClient.on('connect', function () {
42                 //     logger.info('DB - connect');
43                 //     resolve(client);
44                 // })
45                 // .on('error', function (err) {
46                 //     logger.info('DB - error');
47                 //     reject(err);
48                 // }).on('close', function (hadError) {
49                 //     logger.info('DB - close');
50                 //     resolve();
51                 // }).on('ready', function () {
52                 //     logger.info('DB - ready');
53                 //     resolve(mariasqlClient);
54                 // });
55             });
56         },
57
58         destroy: function (client) {
59             return new Promise(function (resolve, reject) {
60                 client.on('end', function () {
61                     resolve();
62                 });
63                 client.disconnect();
64             });
65             // cliend.end();
66             // client._handle = null;
67         },
68
69         validate: function (client) {
70             return client.connected;
71         },
72
73         max: AppConfig.DATABASE.POOL.MAX,
74
75         min: AppConfig.DATABASE.POOL.MIN,
76
77         idleTimeoutMillis: AppConfig.DATABASE.POOL.IDLETIMEOUT,
78
79         reapIntervalMillis: AppConfig.DATABASE.POOL.REAPINTERVAL,
80
81         returnToHead: true
82     });
83
84     // self.pool.drain().then(function () {
85     //     self.pool.clear();
86     // });
87
88     
89 };
90
91 dbPool.prototype.query = function query (query, params) {
92     var mariaPool = this.pool;
93     return new Promise (function (resolve, reject) {
94         mariaPool.acquire().then(function (client) {
95             var meta = {
96                 result: []
97             };
98
99             client.query(query, params, {
100                 metadata: false
101             }, function (err, rows) {
102                 if (err) {
103                     mariaPool.destroy(client);
104                     meta.result = err;
105                     return reject(meta);
106                 }
107
108                 meta.result = rows;
109                 mariaPool.release(client);
110                 logger.info(JSON.stringify(meta));
111                 return resolve(meta);
112             });
113         }).catch(function (err) {
114             return reject(err);
115         });
116     });
117 };
118
119
120 // process.on('exit', function () {
121 //     dbPool.drain(function () {
122 //         dbpool.clear();
123 //     });
124 // });
125
126 module.exports = dbPool;