1 |
|
2 | 'use strict';
|
3 |
|
4 | const cassandra = require('cassandra-driver');
|
5 | const config = require('./config')();
|
6 | const chalk = require('chalk');
|
7 | const glob = require('glob');
|
8 | const winston = require('winston');
|
9 | const cluster = require('cluster');
|
10 | const fs = require('fs');
|
11 | const path = require('path');
|
12 |
|
13 |
|
14 | function _printOnce(){
|
15 | return cluster.isMaster || (cluster.worker && cluster.worker.id==1);
|
16 | }
|
17 |
|
18 |
|
19 | function 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 |
|
63 | function 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 |
|
88 | function 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 |
|
99 | module.exports = {
|
100 | init: init,
|
101 | loadQueries: loadQueries,
|
102 | connect: connect
|
103 | };
|