artdaq_node_server  v1_01_01
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 
103  throw { name: "DBOperationFailedException", message: output.second };
104  }
105  // console.log(retjson);
106  return JSON.parse(output.second);
107 };
108 
114 Connector.RunGetEntitiesQuery = function (dbConfig) {
115  console.log("Running findentities query");
116  SetupUri(dbConfig);
117  var query = {
118  operation: "findentities",
119  dataformat: "gui"
120  };
121 
122  var output = Conftool.find_configuration_entities_ui(JSON.stringify(query, null, 4));
123  console.log("Findentities output: " + JSON.stringify(JSON.parse(output.second), null, 4));
124  if (!output.first) {
125  throw { name: "DBOperationFailedException", message: output.second };
126  }
127  return JSON.parse(output.second);
128 };
129 
136 Connector.RunGetVersionsQuery = function (dbConfig, query) {
137  console.log("Running findversions query: " + JSON.stringify(query, null, 4));
138  SetupUri(dbConfig);
139 
140  var output = Conftool.find_configuration_versions_ui(JSON.stringify(query, null, 4));
141  console.log("findversions output: " + JSON.stringify(output, null, 4));
142  if (!output.first) {
143  throw { name: "DBOperationFailedException", message: output.second };
144  }
145  return JSON.parse(output.second);
146 };
147 
155 Connector.RunBuildFilterQuery = function (dbConfig, configName, queryIn) {
156  SetupUri(dbConfig);
157  var query = { filter: { "configurations.name": "" } };
158 
159  if (queryIn === undefined) {
160  console.log("Getting query for " + configName);
161  var configs = Connector.RunGetConfigsQuery(dbConfig).search;
162  for (var conf in configs) {
163  if (configs.hasOwnProperty(conf)) {
164  var config = configs[conf];
165  if (config.name === configName) {
166  query = config.query;
167  }
168  }
169  }
170  } else {
171  query = queryIn;
172  }
173 
174  console.log("Running buildfilter query: " + JSON.stringify(query, null, 4));
175  var output = Conftool.build_global_configuration_search_filter_ui(JSON.stringify(query, null, 4));
176 
177  for (var file in output.search) {
178  if (output.search.hasOwnProperty(file) && query !== null && query !== undefined) {
179  if (output.search[file].query.filter["configurations.name"] !== query.filter["configurations.name"]) {
180  output.search.splice(file, 1);
181  }
182  }
183  }
184 
185  //console.log("buildfilter output: " + JSON.stringify(output,null,4));
186  if (!output.first) {
187  throw { name: "DBOperationFailedException", message: output.second };
188  }
189  console.log("BuildfilterQuery return status " + output.first);
190  console.log("BuildFilterQuery data: " + JSON.stringify(JSON.parse(output.second), null, 4));
191  return JSON.parse(output.second);
192 };
193 
200 Connector.RunNewConfigQuery = function (dbConfig, query) {
201  console.log("Running newconfig query: " + JSON.stringify(query, null, 4));
202  SetupUri(dbConfig);
203 
204  var output = Conftool.create_new_global_configuration_ui(JSON.stringify(query, null, 4));
205  console.log("newconfig output: " + JSON.stringify(query, null, 4));
206 
207  console.log("RunNewConfigQuery return status " + output.first);
208  if (!output.first) {
209  throw { name: "DBOperationFailedException", message: output.second };
210  }
211 };
212 
222 Connector.RunAddConfigQuery = function (dbConfig, configName, version, collectionName, entity) {
223  console.log("RunAddConfigQuery: configName: " + configName + ", version: " + version + ", collectionName: " + collectionName + ", entity: " + JSON.stringify(entity, null, 4));
224  SetupUri(dbConfig);
225  var query = {
226  filter: {
227  "entities.name": entity.name,
228  "version": version
229  },
230  collection: collectionName,
231  configuration: configName,
232  operation: "addconfig",
233  dataformat: "gui"
234  };
235 
236  var output = Conftool.add_configuration_to_global_configuration_ui(JSON.stringify(query, null, 4));
237  //console.log("addconfig output: " + JSON.stringify(output,null,4));
238 
239  console.log("RunAddConfigQuery return status " + output.first);
240  if (!output.first) {
241  throw { name: "DBOperationFailedException", message: output.second };
242  }
243 };
244 
255 Connector.RunStoreQuery = function (dbConfig, data, collectionName, version, entity, dataType, configName) {
256 
257  console.log("RunStoreConfigQuery: configName: " + configName + ", collectionName: " + collectionName + ", version: " + version + ", entity: " + entity + ", dataType: " + dataType);
258  SetupUri(dbConfig);
259  var query = {
260  version: "" + version,
261  collection: "" + collectionName,
262  entity: entity,
263  operation: "store",
264  dataformat: "" + dataType
265  , configuration: "" + configName
266  };
267  if (configName === undefined) {
268  query.configuration = "unspecified";
269  }
270 
271  console.log("RunStoreQuery: Query: " + JSON.stringify(query,null,4) + ", Data: " + data);
272  var output = Conftool.store_configuration_ui(JSON.stringify(query, null, 4), data);
273 
274  console.log("RunStoreConfigQuery return status " + output.first);
275  if (!output.first) {
276  throw { name: "DBOperationFailedException", message: output.second };
277  }
278  console.log("RunStoreConfigQuery return value " + output.second);
279 };
280 
288 Connector.RunLoadQuery = function (dbConfig, query, noparse) {
289  console.log("Running load query");
290  SetupUri(dbConfig);
291 
292  var output = Conftool.load_configuration_ui(JSON.stringify(query, null, 4));
293  console.log("Conftool Load output: " + output.first);
294  if (!output.first) {
295  throw { name: "DBOperationFailedException", message: output.second };
296  }
297 
298  if (noparse) return output.second;
299 
300  return JSON.parse(output.second);
301 };
302 
303 Connector.RunListDatabasesQuery = function (dbconfig, filterobj) {
304  console.log("Running ListDatabases query");
305  SetupUri(dbconfig);
306 
307  if (!filterobj) {
308  filterobj = {};
309  }
310 
311  var query = {
312  filter: filterobj,
313  dataformat: "gui",
314  operation: "listdatabases"
315  };
316  var output = Conftool.list_databases(JSON.stringify(query, null, 4));
317  console.log("Conftool ListDatabases output: " + JSON.stringify(output, null, 4));
318  if (!output.first) {
319  throw { name: "DBOperationFailedException", message: output.second };
320  }
321 
322  return JSON.parse(output.second);
323 }
324 
325 module.exports = Connector;