artdaq_node_server  v1_00_08
 All Classes Namespaces Files Variables Pages
DBConnector.js
1 
2 // ReSharper disable PossiblyUnassignedProperty
3 // ReSharper disable InconsistentNaming
4 var Emitter = require("events").EventEmitter;
5 var Connector = new Emitter();
6 var fs = require("fs");
7 var path_module = require("path");
8 
9 // ReSharper restore InconsistentNaming
10 // ReSharper restore PossiblyUnassignedProperty
11 
12 var Conftool;
13 try {
14  var ConftoolPath = "";
15  console.log("Environment Variables: " +
16  process.env.ARTDAQ_DATABASE_LIB +
17  ", " +
18  process.env.ARTDAQ_DATABASE_DIR +
19  ", " +
20  process.env.MRB_BUILDDIR);
21  if (!process.env.ARTDAQ_DATABASE_LIB && process.env.ARTDAQ_DATABASE_DIR && process.env.MRB_BUILDDIR) {
22  ConftoolPath = path_module.join(process.env["MRB_BUILDDIR"], "artdaq_database", "lib", "conftoolg");
23  } else {
24  ConftoolPath = path_module.join(process.env["ARTDAQ_DATABASE_LIB"], "node_modules", "conftoolg");
25  }
26  console.log("Looking for conftoolg module in " + ConftoolPath);
27  Conftool = require(ConftoolPath);
28  console.log("Module loaded.");
29 // Conftool.enable_trace();
30 } catch (E) {
31  console.log("Error loading conftoolg module...have you setup the artdaq_database product?");
32  console.log(E);
33 }
34 
46 function SetupUri(dbConfig) {
47  console.log("Setting ARTDAQ_DATABASE_URI using configuration " + JSON.stringify(dbConfig, null, 4));
48  if (dbConfig.dbprovider === "filesystem") {
49  process.env["ARTDAQ_DATABASE_URI"] = "filesystemdb://" + dbConfig.baseDir + "/filesystemdb/" + dbConfig.instanceName;
50  } else if (dbConfig.dbprovider === "mongo") {
51  var passStr = "";
52  if (fs.existsSync(".dbpasswd")) {
53  passStr = ":" + fs.readFileSync(".dbpasswd");
54  } else {
55  console.log("No Password file (\".dbpasswd\") found. If auth fails, please place this file in the same directory as serverbase.js");
56  }
57  var userStr = "";
58  if (dbConfig.mongoConfig.dbUser !== "") {
59  userStr = "@";
60  }
61  process.env["ARTDAQ_DATABASE_URI"] = "mongodb://" + dbConfig.mongoConfig.dbUser + passStr + userStr + dbConfig.mongoConfig.dbHost + ":" + dbConfig.mongoConfig.dbPort + "/" + dbConfig.instanceName;
62  } else {
63  console.log("Connector.SetConfig: ERROR: Unrecognized database provider");
64  }
65  console.log("ARTDAQ_DATABASE_URI is " + process.env["ARTDAQ_DATABASE_URI"]);
66 }
67 
73 Connector.RunGetConfigsQuery = function (dbConfig) {
74  console.log("Running findconfigs query");
75  SetupUri(dbConfig);
76  var query = {
77  filter: {},
78  operation: "findconfigs",
79  dataformat: "gui"
80  };
81  if (dbConfig.configNameFilter.length === 0) {
82  dbConfig.configNameFilter = "*";
83  }
84 
85 // if (dbConfig.dbprovider === "mongo") {
86 // if (dbConfig.configNameFilter === "*") { dbConfig.configNameFilter = ".*"; }
87 
88 // query.filter = {
89 // "configurations.name": {
90 // "$regex": dbConfig.configNameFilter
91 // }
92 // };
93 // } else {
94  query.filter = {
95  "configurations.name": dbConfig.configNameFilter
96  };
97 // }
98 
99  var output = Conftool.find_global_configurations_ui(JSON.stringify(query, null, 4));
100  console.log("findconfigs output: " + JSON.stringify(output, null, 4));
101  if (!output.first) {
102  throw { name: "DBOperationFailedException", message: output.second };
103  }
104  // console.log(retjson);
105  return JSON.parse(output.second);
106 };
107 
113 Connector.RunGetEntitiesQuery = function (dbConfig) {
114  console.log("Running findentities query");
115  SetupUri(dbConfig);
116  var query = {
117  operation: "findentities",
118  dataformat: "gui"
119  };
120 
121  var output = Conftool.find_configuration_entities_ui(JSON.stringify(query, null, 4));
122  console.log("Findentities output: " + JSON.stringify(JSON.parse(output.second), null, 4));
123  if (!output.first) {
124  throw { name: "DBOperationFailedException", message: output.second };
125  }
126  return JSON.parse(output.second);
127 };
128 
135 Connector.RunGetVersionsQuery = function (dbConfig, query) {
136  console.log("Running findversions query: " + JSON.stringify(query, null, 4));
137  SetupUri(dbConfig);
138 
139  var output = Conftool.find_configuration_versions_ui(JSON.stringify(query, null, 4));
140  console.log("findversions output: " + JSON.stringify(output, null, 4));
141  if (!output.first) {
142  throw { name: "DBOperationFailedException", message: output.second };
143  }
144  return JSON.parse(output.second);
145 };
146 
154 Connector.RunBuildFilterQuery = function (dbConfig, configName, queryIn) {
155  SetupUri(dbConfig);
156  var query = { filter: { "configurations.name": "" } };
157 
158  if (queryIn === undefined) {
159  console.log("Getting query for " + configName);
160  var configs = Connector.RunGetConfigsQuery(dbConfig).search;
161  for (var conf in configs) {
162  if (configs.hasOwnProperty(conf)) {
163  var config = configs[conf];
164  if (config.name === configName) {
165  query = config.query;
166  }
167  }
168  }
169  } else {
170  query = queryIn;
171  }
172 
173  console.log("Running buildfilter query: " + JSON.stringify(query, null, 4));
174  var output = Conftool.build_global_configuration_search_filter_ui(JSON.stringify(query, null, 4));
175 
176  for (var file in output.search) {
177  if (output.search.hasOwnProperty(file) && query !== null && query !== undefined) {
178  if (output.search[file].query.filter["configurations.name"] !== query.filter["configurations.name"]) {
179  output.search.splice(file, 1);
180  }
181  }
182  }
183 
184  //console.log("buildfilter output: " + JSON.stringify(output,null,4));
185  if (!output.first) {
186  throw { name: "DBOperationFailedException", message: output.second };
187  }
188  console.log("BuildfilterQuery return status " + output.first);
189  console.log("BuildFilterQuery data: " + JSON.stringify(JSON.parse(output.second), null, 4));
190  return JSON.parse(output.second);
191 };
192 
199 Connector.RunNewConfigQuery = function (dbConfig, query) {
200  console.log("Running newconfig query: " + JSON.stringify(query, null, 4));
201  SetupUri(dbConfig);
202 
203  var output = Conftool.create_new_global_configuration_ui(JSON.stringify(query, null, 4));
204  console.log("newconfig output: " + JSON.stringify(query, null, 4));
205 
206  console.log("RunNewConfigQuery return status " + output.first);
207  if (!output.first) {
208  throw { name: "DBOperationFailedException", message: output.second };
209  }
210 };
211 
221 Connector.RunAddConfigQuery = function (dbConfig, configName, version, collectionName, entity) {
222  console.log("RunAddConfigQuery: configName: " + configName + ", version: " + version + ", collectionName: " + collectionName + ", entity: " + JSON.stringify(entity, null, 4));
223  SetupUri(dbConfig);
224  var query = {
225  filter: {
226  "entities.name": entity.name,
227  "version": version
228  },
229  collection: collectionName,
230  configuration: configName,
231  operation: "addconfig",
232  dataformat: "gui"
233  };
234 
235  var output = Conftool.add_configuration_to_global_configuration_ui(JSON.stringify(query, null, 4));
236  //console.log("addconfig output: " + JSON.stringify(output,null,4));
237 
238  console.log("RunAddConfigQuery return status " + output.first);
239  if (!output.first) {
240  throw { name: "DBOperationFailedException", message: output.second };
241  }
242 };
243 
254 Connector.RunStoreQuery = function (dbConfig, data, collectionName, version, entity, dataType, configName) {
255 
256  console.log("RunStoreConfigQuery: configName: " + configName + ", collectionName: " + collectionName + ", version: " + version + ", entity: " + entity + ", dataType: " + dataType);
257  SetupUri(dbConfig);
258  var query = {
259  version: "" + version,
260  collection: "" + collectionName,
261  entity: entity,
262  operation: "store",
263  dataformat: "" + dataType
264  , configuration: "" + configName
265  };
266  if (configName === undefined) {
267  query.configuration = "unspecified";
268  }
269 
270  console.log("RunStoreQuery: Query: " + JSON.stringify(query,null,4) + ", Data: " + data);
271  var output = Conftool.store_configuration_ui(JSON.stringify(query, null, 4), data);
272 
273  console.log("RunStoreConfigQuery return status " + output.first);
274  if (!output.first) {
275  throw { name: "DBOperationFailedException", message: output.second };
276  }
277  console.log("RunStoreConfigQuery return value " + output.second);
278 };
279 
287 Connector.RunLoadQuery = function (dbConfig, query, noparse) {
288  console.log("Running load query");
289  SetupUri(dbConfig);
290 
291  var output = Conftool.load_configuration_ui(JSON.stringify(query, null, 4));
292  console.log("Conftool Load output: " + output.first);
293  if (!output.first) {
294  throw { name: "DBOperationFailedException", message: output.second };
295  }
296 
297  if (noparse) return output.second;
298 
299  return JSON.parse(output.second);
300 };
301 
302 Connector.RunListDatabasesQuery = function (dbconfig, filterobj) {
303  console.log("Running ListDatabases query");
304  SetupUri(dbconfig);
305 
306  if (!filterobj) {
307  filterobj = {};
308  }
309 
310  var query = {
311  filter: filterobj,
312  dataformat: "gui",
313  operation: "listdatabases"
314  };
315  var output = Conftool.list_databases(JSON.stringify(query, null, 4));
316  console.log("Conftool ListDatabases output: " + JSON.stringify(output, null, 4));
317  if (!output.first) {
318  throw { name: "DBOperationFailedException", message: output.second };
319  }
320 
321  return JSON.parse(output.second);
322 }
323 
324 module.exports = Connector;