1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 | var db = module.exports = {};
|
23 |
|
24 | var mongodb = require('mongodb');
|
25 | var fs = require('fs');
|
26 | var zlib = require('zlib');
|
27 |
|
28 | var logger = require("./logger");
|
29 | var util = require('./util');
|
30 | var exec = require('child_process').exec;
|
31 |
|
32 |
|
33 |
|
34 | var ObjectID;
|
35 | if(mongodb.BSONPure)
|
36 | ObjectID = mongodb.BSONPure.ObjectID;
|
37 | else
|
38 | ObjectID = mongodb.ObjectID;
|
39 |
|
40 | var dbInstance;
|
41 |
|
42 | var DBPool = require('./wrapper/dbpool');
|
43 | var dbpool;
|
44 |
|
45 | var dbConfiguration;
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 | db.generateId = function(name) {
|
55 | return util.generateId(name);
|
56 | }
|
57 |
|
58 |
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 | db.getInstance = function(){
|
65 | return dbInstance;
|
66 | }
|
67 |
|
68 | db.registerDB = function(dbid, configuration){
|
69 | dbpool.registerDB(dbid, configuration);
|
70 | }
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 |
|
77 |
|
78 | db.checkDBConfig = function(options, callback){
|
79 | var mongoserver = new mongodb.Server(options.host, Number(options.port), options.params||{});
|
80 | var mongoinstance = new mongodb.Db(options.dbName, mongoserver, {});
|
81 |
|
82 | mongoinstance.open(function(error, client){
|
83 | callback(error, client);
|
84 | });
|
85 | }
|
86 |
|
87 |
|
88 |
|
89 |
|
90 |
|
91 |
|
92 |
|
93 |
|
94 |
|
95 | db.start = function(options, callback){
|
96 | callback = callback || function(){};
|
97 | var server = new mongodb.Server(options.host, Number(options.port), options.params||{});
|
98 |
|
99 | var dbInstance_ = new mongodb.Db(options.dbName, server, {});
|
100 |
|
101 | dbInstance_.open(function(error, client){
|
102 | if(error){
|
103 | logger.getInstance().error('Smple Portal -db', 'Error While initialiing' + error);
|
104 | dbInstance_ = null;
|
105 | callback(error);
|
106 | } else{
|
107 | callback(null, dbInstance_);
|
108 | }
|
109 | });
|
110 | }
|
111 |
|
112 |
|
113 |
|
114 |
|
115 |
|
116 |
|
117 |
|
118 | db.init = function(configuration, callback){
|
119 | logger.getInstance().info('Simple Portal -db', 'Initializing DB');
|
120 |
|
121 | db.dbpool=dbpool = new DBPool();
|
122 |
|
123 | if(configuration && configuration.db){
|
124 | dbConfiguration = configuration.db.mongodb;
|
125 |
|
126 | dbpool.registerDB('default', dbConfiguration);
|
127 |
|
128 | db.dbpool.getInstance('default', function(error, dbInstance_){
|
129 | dbInstance = dbInstance_;
|
130 | callback(error, dbInstance_);
|
131 | });
|
132 | } else {
|
133 | logger.getInstance().info('Simple Portal -db', 'DB configuration is not done properly!!!');
|
134 | callback('DB configuration is not done properly!!!')
|
135 | }
|
136 | }
|
137 |
|
138 |
|
139 |
|
140 |
|
141 |
|
142 |
|
143 |
|
144 |
|
145 |
|
146 |
|
147 |
|
148 | db.fileInfo = function(fileName, callback, dbInstance){
|
149 | dbInstance = dbInstance||db.getInstance();
|
150 | var gridStore = new mongodb.GridStore(dbInstance, fileName, "r");
|
151 |
|
152 | gridStore.open(callback);
|
153 | };
|
154 |
|
155 |
|
156 |
|
157 |
|
158 |
|
159 |
|
160 |
|
161 |
|
162 |
|
163 |
|
164 |
|
165 | db.existFile = function(fileName, callback, dbInstance){
|
166 | dbInstance = dbInstance||db.getInstance();
|
167 | mongodb.GridStore.exist(dbInstance, fileName, callback);
|
168 | };
|
169 |
|
170 |
|
171 |
|
172 |
|
173 |
|
174 |
|
175 |
|
176 |
|
177 |
|
178 |
|
179 |
|
180 |
|
181 |
|
182 | db.uploadFile = function(filePath, fileName, contentType, callback, dbInstance){
|
183 | dbInstance = dbInstance||db.getInstance();
|
184 | if(dbInstance){
|
185 |
|
186 | var gridStore = new mongodb.GridStore(dbInstance, fileName, "w", {
|
187 | "contentType": contentType |
188 |
|
189 | });
|
190 |
|
191 | gridStore.open(function(error, gridStore){
|
192 | if(error)
|
193 | callback(error);
|
194 | else
|
195 | gridStore.writeFile(filePath, function(err, object) {
|
196 | if(err)
|
197 | callback(err);
|
198 | else{
|
199 | callback(null, {fileId : object.fileId});
|
200 | }
|
201 | });
|
202 | });
|
203 | } else
|
204 | callback("No db instance found!!");
|
205 | }
|
206 |
|
207 |
|
208 |
|
209 |
|
210 |
|
211 |
|
212 |
|
213 |
|
214 |
|
215 |
|
216 | db.getFileContent = function(fileId, dbInstance, callback){
|
217 | dbInstance = dbInstance||db.getInstance();
|
218 | if(dbInstance){
|
219 | mongodb.GridStore.exist(dbInstance, fileId, function(){
|
220 |
|
221 | var gridStore = new mongodb.GridStore(dbInstance, fileId , "r");
|
222 | gridStore.open(function(error, data){
|
223 | if(data)
|
224 | mongodb.GridStore.read(dbInstance, fileId, function(err, fileData) {
|
225 | if(error){
|
226 | callback(error.toString());
|
227 | } else{
|
228 | callback(null, gridStore.currentChunk.data.buffer);
|
229 | }
|
230 | });
|
231 | else if(error)
|
232 | callback(error.toString());
|
233 | else
|
234 | callback('');
|
235 | });
|
236 | });
|
237 | } else{
|
238 | callback("No db instance found!!");
|
239 | }
|
240 | }
|
241 |
|
242 |
|
243 |
|
244 |
|
245 |
|
246 |
|
247 |
|
248 |
|
249 |
|
250 |
|
251 | db.sendFile = function(fileId, contentType, response, dbInstance){
|
252 | dbInstance = dbInstance||db.getInstance();
|
253 | if(dbInstance){
|
254 | mongodb.GridStore.exist(dbInstance, fileId, function(){
|
255 | var gridStore = new mongodb.GridStore(dbInstance, fileId , "r");
|
256 | gridStore.open(function(error, data){
|
257 | mongodb.GridStore.read(dbInstance, fileId, function(err, fileData) {
|
258 | if(error){
|
259 | response.writeHead(400);
|
260 | response.write(error.toString());
|
261 | response.end();
|
262 | } else{
|
263 | if(contentType == 'binary/octet-stream'){
|
264 | response.write(fileData, 'binary');
|
265 |
|
266 | response.end();
|
267 | }else{
|
268 | response.writeHead(200, { 'Content-Type': contentType});
|
269 | if(contentType ='image/png')
|
270 | response.write(fileData, 'base64');
|
271 | else
|
272 | response.write(fileData, 'binary');
|
273 | response.end();
|
274 | }
|
275 | }
|
276 | }); |
277 |
|
278 |
|
279 |
|
280 |
|
281 |
|
282 |
|
283 |
|
284 |
|
285 |
|
286 |
|
287 |
|
288 |
|
289 |
|
290 |
|
291 |
|
292 |
|
293 |
|
294 |
|
295 |
|
296 |
|
297 | });
|
298 | });
|
299 | } else{
|
300 | response.writeHead(400);
|
301 | response.write("No db instance found!!");
|
302 | response.end();
|
303 | }
|
304 | }
|
305 |
|
306 |
|
307 |
|
308 |
|
309 |
|
310 |
|
311 |
|
312 |
|
313 |
|
314 |
|
315 |
|
316 | db.writeFile = function(fileId, contentType, file, callback, dbInstance){
|
317 | dbInstance = dbInstance||db.getInstance();
|
318 | if(dbInstance){
|
319 | mongodb.GridStore.exist(dbInstance, fileId, function(){
|
320 | var gridStore = new mongodb.GridStore(db.getInstance(), fileId , "r");
|
321 | gridStore.open(function(error, data){
|
322 | gridStore.read(function(error, data){
|
323 | if(error){
|
324 | callback(error.toString());
|
325 | } else{
|
326 | var fs = require('fs');
|
327 | var stream = fs.createWriteStream(file);
|
328 | stream.once('open', function(fd) {
|
329 | stream.write(gridStore.currentChunk.data.buffer, 'binary');
|
330 | });
|
331 | callback(null, {});
|
332 | }
|
333 | });
|
334 | });
|
335 | });
|
336 | } else{
|
337 | callback("No db instance found!!");
|
338 | }
|
339 | }
|
340 |
|
341 |
|
342 |
|
343 |
|
344 |
|
345 |
|
346 |
|
347 |
|
348 |
|
349 | db.downloadBackup = function(options, response){
|
350 | var file = options.file;
|
351 | var dumpdir = options.dumpdir||dbConfiguration.dumpdir||'./dump';
|
352 |
|
353 | fs.lstat(dumpdir + '/' + file + '.gz', function(error, stats) {
|
354 | if (!error) {
|
355 | var raw = fs.createReadStream(dumpdir + '/' + file + '.gz');
|
356 | raw.pipe(zlib.createGzip()).pipe(response);
|
357 | } else{
|
358 | response.writeHead(400);
|
359 | response.write("No file found with the detail you provided!!");
|
360 | response.end();
|
361 | }
|
362 | });
|
363 | }
|
364 |
|
365 |
|
366 |
|
367 |
|
368 |
|
369 |
|
370 |
|
371 |
|
372 | db.backup = function(options, callback){
|
373 | options = options||{};
|
374 | var dumptool = options.dumptool||dbConfiguration.dumptool||'mongodump';
|
375 | var dbName = options.dbName||dbConfiguration.dbName;
|
376 | var dumpdir = options.dumpdir||dbConfiguration.dumpdir||'./dump';
|
377 |
|
378 | util.checkDir(dumpdir, function(error){
|
379 | if(error){
|
380 | callback(error);
|
381 | } else{
|
382 | var cmd = dumptool + " --db " + dbName;
|
383 | if(dumpdir)
|
384 | cmd += ' -o' + dumpdir;
|
385 |
|
386 |
|
387 | var date = new Date();
|
388 | var dumpfile = dbName + '-' + date.getDate() + '-' + date.getMonth() + '-' + date.getYear() + '-'+ date.getHours() + '-'+ date.getMinutes() + '-' + date.getSeconds();
|
389 |
|
390 | exec(cmd, function (error, stdout, stderr) {
|
391 | if(error){
|
392 | callback(error);
|
393 | } else{
|
394 | var stream = fs.createWriteStream(dumpdir + '/'+ dbName + '/README.txt');
|
395 | stream.once('open', function(fd) {
|
396 | stream.write('Copyrighted by EviMed online GmbH, Misusing of this file may invite legal actions!!');
|
397 | });
|
398 |
|
399 | var cmd_bckup = 'cd ' + dumpdir + '/' + dbName + ' && tar -zcvf ../' + dumpfile + '.gz *';
|
400 |
|
401 | var result = {mongodump:{stdout : stdout, stderr:stderr}};
|
402 |
|
403 | exec(cmd_bckup, function (error, stdout, stderr) {
|
404 | result.zip_archive = {stdout : stdout, stderr:stderr, file:dumpfile}
|
405 | callback(error, result);
|
406 | });
|
407 | }
|
408 | });
|
409 | }
|
410 | });
|
411 | }
|
412 |
|
413 |
|
414 |
|
415 |
|
416 |
|
417 |
|
418 |
|
419 |
|
420 |
|
421 | function restoreCollection(options, callback){
|
422 | options = options||{};
|
423 | var restoretool = options.restoretool||dbConfiguration.restoretool||'mongorestore';
|
424 | var dbName = options.dbName||dbConfiguration.dbName;
|
425 | var restoredir = options.restoredir||dbConfiguration.restoredir||'./dump_import';
|
426 |
|
427 | var collectionName = options.collectionName;
|
428 | var filePath = options.filePath;
|
429 |
|
430 | if(collectionName && filePath){
|
431 | db.backup(options, function(error){
|
432 | if(!error){
|
433 | var date = new Date();
|
434 | var restorefile = 'import-' + collectionName + '-' + date.getDate() + '-' + date.getMonth() + '-' + date.getYear() + '-'+ date.getHours() + '-'+ date.getMinutes() + '-' + date.getSeconds() + '.bson';
|
435 |
|
436 | util.moveFile(restoredir, restorefile, filePath, function(error){
|
437 | var cmd = restoretool + " -v -d " + dbName + ' -c ' + collectionName + ' ' + restoredir + '/' + restorefile;
|
438 |
|
439 | exec(cmd, function (error, stdout, stderr) {
|
440 | if(error){
|
441 | callback(error);
|
442 | } else{
|
443 | var result = {mongorestore:{stdout : stdout, stderr:stderr}};
|
444 | callback(error, result);
|
445 | }
|
446 | });
|
447 | });
|
448 | }else
|
449 | callback('Some problem while taking the back up the collection');
|
450 | });
|
451 | } else
|
452 | callback('Collection and file is missing!!!');
|
453 | }
|
454 |
|
455 |
|
456 |
|
457 |
|
458 |
|
459 |
|
460 |
|
461 |
|
462 |
|
463 | function restoreDatabase(options, callback){
|
464 | options = options||{};
|
465 | var restoretool = options.restoretool||dbConfiguration.restoretool||'mongorestore';
|
466 | var dbName = options.dbName||dbConfiguration.dbName;
|
467 | var restoredir = options.restoredir||dbConfiguration.restoredir||'./dump_import';
|
468 |
|
469 | var filePath = options.filePath;
|
470 | var filemapping = options.filemapping||{};
|
471 | if(filePath){
|
472 | db.backup(options, function(error){
|
473 | if(!error){
|
474 | var date = new Date();
|
475 | var inputFile = dbName + '-' + date.getDate() + '-' + date.getMonth() + '-' + date.getYear() + '-'+ date.getHours() + '-'+ date.getMinutes() + '-' + date.getSeconds();
|
476 |
|
477 | var response = fs.createWriteStream(restoredir +'/'+ inputFile + '.gz');
|
478 | var raw = fs.createReadStream(filePath);
|
479 | raw.pipe(zlib.createGunzip()).pipe(response);
|
480 |
|
481 | filePath = restoredir +'/'+ inputFile + '.gz';
|
482 |
|
483 | util.checkDir(restoredir +'/'+ inputFile, function(error){
|
484 | if(error)
|
485 | callback(error);
|
486 | else{
|
487 | var cmd_bckup = 'tar -xvzf ' + restoredir +'/' + inputFile + '.gz' + ' -C ' + restoredir +'/'+ inputFile;
|
488 |
|
489 | var result = {};
|
490 | logger.getInstance().info('Simpleportal -db', 'Exeuting the extracting tool command' + cmd_bckup);
|
491 |
|
492 | exec(cmd_bckup, function (error, stdout, stderr) {
|
493 | if(error)
|
494 | callback(error);
|
495 | else{
|
496 | fs.readdirSync(restoredir +'/'+ inputFile).forEach(function(filename){
|
497 | if (/\.bson$/.test(filename) && filemapping[filename]) {
|
498 | var newfilename = filemapping[filename];
|
499 | logger.getInstance().info('Simpleportal -db', 'Renaming file filename - '+ filename + ' -- to -- '+ newfilename);
|
500 | fs.renameSync(restoredir +'/'+ inputFile + '/' + filename, restoredir +'/'+ inputFile + '/' + newfilename);
|
501 | }
|
502 | });
|
503 |
|
504 | var cmd = restoretool + " -v -d " + dbName + ' ' + restoredir +'/'+ inputFile;
|
505 | logger.getInstance().info('Simpleportal -db', 'Executing the restore tool command' + cmd);
|
506 |
|
507 | exec(cmd, function (error, stdout, stderr) {
|
508 | if(error){
|
509 | callback(error);
|
510 | } else{
|
511 | var result = {mongorestore:{stdout : stdout, stderr:stderr}};
|
512 | callback(error, result);
|
513 | }
|
514 | });
|
515 | }
|
516 | });
|
517 | }
|
518 | });
|
519 | } else{
|
520 | callback('Some problem while taking the back up the collection -' + error);
|
521 | }
|
522 | });
|
523 | } else
|
524 | callback('DB and file is missing!!!');
|
525 | }
|
526 |
|
527 |
|
528 |
|
529 |
|
530 |
|
531 |
|
532 |
|
533 |
|
534 | db.importCollection = function(options, callback){
|
535 | restoreCollection(options, callback);
|
536 | }
|
537 |
|
538 |
|
539 |
|
540 |
|
541 |
|
542 |
|
543 |
|
544 |
|
545 | db.importDB = function(options, callback){
|
546 | restoreDatabase(options, callback);
|
547 | }
|
548 |
|
549 |
|
550 |
|
551 |
|
552 |
|
553 |
|
554 |
|
555 |
|
556 | db.getBSONObjectId = function(id) {
|
557 | try{
|
558 | return new ObjectID(id);
|
559 | } catch(error){
|
560 | console.log(error);
|
561 | return null;
|
562 | }
|
563 | }
|
564 |
|
565 |
|
566 |
|
567 |
|
568 |
|
569 |
|
570 |
|
571 |
|
572 | db.getObjectId = function(id) {
|
573 | return ObjectID.createFromHexString(id);
|
574 | }
|
575 |
|
576 | db.LocalCache = require('./wrapper/localcache').LocalCache; |
\ | No newline at end of file |