UNPKG

2.56 kBJavaScriptView Raw
1// Cassandra DB Configuration and init
2'use strict';
3
4const cassandra = require('cassandra-driver');
5const config = require('./config')();
6const chalk = require('chalk');
7const glob = require('glob');
8const winston = require('winston');
9const cluster = require('cluster');
10const fs = require('fs');
11const path = require('path');
12
13// Print Once
14function _printOnce(){
15 return cluster.isMaster || (cluster.worker && cluster.worker.id==1);
16}
17
18// Connect to DB
19function connect(options){
20 var Servers, Keyspace;
21 var cassandraOptions = {};
22 if(config.get().bigdata){
23 if(config.get().bigdata.servers){
24 Servers = config.get().bigdata.servers;
25 }
26
27 if(config.get().bigdata.keyspace){
28 Keyspace = config.get().bigdata.keyspace;
29 }
30 }
31
32 if(options && options.servers){
33 Servers = options.servers;
34 if(options.keyspace){
35 Keyspace = options.keyspace;
36 }
37 }
38
39 if(Servers){
40 cassandraOptions.contactPoints = Servers;
41 }
42 if(Keyspace){
43 Keyspace = Keyspace.replace(/-/g,'_');
44 cassandraOptions.keyspace = Keyspace;
45 }
46
47 var client=new cassandra.Client(cassandraOptions);
48 client.connect(function(err){
49 if(err){
50 winston.error('Error with BigData DataBase', Servers, 'and keyspace' , Keyspace, ':', err);
51 process.exit();
52 }else{
53 if(_printOnce()){
54 winston.info('-'.repeat(70));
55 winston.info('Using BigData DataBase:', chalk.blue(Servers, 'and keyspace' , Keyspace));
56 }
57 }
58 });
59 return client;
60}
61
62// Load Queries
63function loadQueries(options, client){
64 var queries = {};
65 var loadedQueries = [];
66
67 var files = glob.sync(global.mio.appPath+'/modules/*/queries/*.cql');
68 for (var i = 0; i < files.length; i++) {
69 var queryName = path.basename(files[i], '.cql');
70 try {
71 var _request = fs.readFileSync(files[i], {encoding: 'utf8'});
72 queries[queryName+'Src'] = _request;
73 if(client){
74 queries[queryName] = function(options, cb){
75 return client.execute(_request, options, cb);
76 };
77 }
78 if(loadedQueries.indexOf(queryName) == -1) loadedQueries.push(queryName);
79 } catch (err) {
80 winston.error('Can\'t load query:', queryName);
81 }
82 }
83
84 return queries;
85}
86
87// Magic Init
88function init(options){
89 var client = connect(options);
90 if(client){
91 var queries = loadQueries(options, client);
92 global.mio.cassandra = {client: client, queries: queries};
93 return {client: client, queries: queries};
94 }
95
96 return;
97}
98
99module.exports = {
100 init: init,
101 loadQueries: loadQueries,
102 connect: connect
103};