-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathDbOperations.js
More file actions
208 lines (194 loc) · 6.71 KB
/
Copy pathDbOperations.js
File metadata and controls
208 lines (194 loc) · 6.71 KB
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
var JDBC = require('jdbc');
var impalaConfigurations = require('./config/configuration').impalaConfigurations;
var JVMInitializer = require('./config/JVMInitializer');
var stringHelpers = require('./utility/StringHelpers');
var logger = require('./Logs/Logger');
// Start JVM if not already running
JVMInitializer.startJvm();
// Initialize databaseInitialized flag and database
var databaseInitialized = null;
var database = new JDBC(impalaConfigurations);
exports.initializeDB = function (callback) {
database.initialize(function(err) {
if (err) {
databaseInitialized = false;
callback(err);
} else {
databaseInitialized = true;
callback(null, true);
}
});
};
exports.getDbInitStatus = function () {
return databaseInitialized;
};
exports.executeQuery = executeQuery;
exports.executeParameterizedQuery = executeParameterizedQuery;
exports.executeOneResultQuery = executeOneResultQuery;
exports.executeParameterizedOneResultQuery = executeParameterizedOneResultQuery;
exports.executeStatement = executeStatement;
exports.executeParameterizedStatement = executeParameterizedStatement;
// Sql is a string with placeholders for the values of parameters. (eg. ':foo:', ':bar:')
// Parameters should be an object with the placeholders in query as keys and the value to be replaced as the value.
// NOTE: all occurences of same parameter will be replaced with same value.
// NOTE: Parameters must start and end with a delimiter such as ':'. Replacement happens using regex and does not check for complete words. Thus, if :foo = val, 'this is :foo :foobar' => 'this is val valbar'.
// NOTE: Avoid this kind of Replacement using ':foo:' instead of ':foo' as parameter.
function executeParameterizedQuery(sql, parameters, callback) {
sql = stringHelpers.replaceAllParameters(sql, parameters);
executeQuery(sql, callback);
}
function executeParameterizedOneResultQuery(sql, parameters, callback) {
sql = stringHelpers.replaceAllParameters(sql, parameters);
executeOneResultQuery(sql, callback);
}
function executeParameterizedStatement(sql, parameters, callback) {
sql = stringHelpers.replaceAllParameters(sql, parameters);
executeStatement(sql, callback);
}
// Returns an array of objects, each object containing all the selected columns as keys and each row's corresponding value as a key's value.
// Sql is a simple Impala string.
function executeQuery(sql, callback) {
logger.debug('FETCHING');
logger.info('executing query: ' + sql);
getDatabase(function(err, db){
if (err) {
callback(err);
} else {
reserve(db, function(err, connobj, conn) {
if (err) {
callback(err);
} else {
conn.createStatement(function(err, statement) {
if (err) {
release(db, connobj, err, null, callback);
} else {
statement.executeQuery(sql, function(err, resultset) {
if (err) {
release(db, connobj, err, null, callback);
} else {
resultset.toObjArray(function(err, results) {
if (err) {
release(db, connobj, err, null, callback);
} else {
release(db, connobj, null, results, callback);
}
});
}
});
}
});
}
});
}
});
};
function executeOneResultQuery(sql, callback) {
logger.info('Executing query: ' + sql)
getDatabase(function(err, db){
if (err) {
callback(err);
} else {
reserve(db, function(err, connobj, conn) {
if (err) {
callback(err);
} else {
conn.createStatement(function(err, statement) {
if (err) {
release(db, connobj, err, null, callback);
} else {
statement.executeQuery(sql, function(err, resultset) {
if (err) {
release(db, connobj, err, null, callback);
} else {
resultset.toObjArray(function(err, results) {
if (err) {
release(db, connobj, err, null, callback);
} else {
if (results.length > 1) {
release(db, connobj, new Error('Expected 1 row from query, found many'), null, callback);
} else if (results.length === 0) {
release(db, connobj, null, null, callback);
} else {
release(db, connobj, null, results[0], callback);
}
}
});
}
});
}
});
}
});
}
});
}
function executeStatement(sql, callback) {
logger.info('executing query: ' + sql);
getDatabase(function(err, db){
if (err) {
callback(err);
} else {
reserve(db, function(err, connobj, conn) {
if (err) {
callback(err);
} else {
conn.createStatement(function(err, statement) {
if (err) {
release(db, connobj, err, null, callback);
} else {
statement.execute(sql, function(err, updateCount) {
if (err) {
release(db, connobj, err, null, callback);
} else {
release(db, connobj, null, updateCount, callback);
}
});
}
});
}
});
}
});
}
// Reserve a connection from the connection pool.
// This also Initializes DB if not already initialized. May create issue if reqeust is sent immediately after running server. Unless we wait for db to initialize, then start listening for requests.
function reserve(db, callback) {
db.reserve(function(err, connobj) {
if (err) {
return callback(err);
} else {
return callback(null, connobj, connobj.conn);
}
});
};
// Release connection back to connection pool. Send either err or results to callback.
function release(db, connobj, err, result, callback) {
if (err) {
db.release(connobj, function() {
callback(err);
})
} else {
db.release(connobj, function(err) {
if (err) {
return callback(err);
} else {
return callback(null, result);
}
});
}
};
// Initialize and return database instance with the configurations if not already initialized. Else, return already initialized DB.
function getDatabase(callback) {
if (!databaseInitialized) {
database.initialize(function(err) {
if (err) {
return callback(err);
} else {
databaseInitialized = true;
return callback(null, database);
}
});
} else {
return callback(null, database);
}
};