00001
00002
00003
00004 var Emitter = require("events").EventEmitter;
00005 var Connector = new Emitter();
00006 var fs = require("fs");
00007 var path_module = require("path");
00008
00009
00010
00011
00012 var Conftool;
00013 try {
00014 var ConftoolPath = "";
00015 console.log("Environment Variables: " +
00016 process.env.ARTDAQ_DATABASE_LIB +
00017 ", " +
00018 process.env.ARTDAQ_DATABASE_DIR +
00019 ", " +
00020 process.env.MRB_BUILDDIR);
00021 if (!process.env.ARTDAQ_DATABASE_LIB && process.env.ARTDAQ_DATABASE_DIR && process.env.MRB_BUILDDIR) {
00022 ConftoolPath = path_module.join(process.env["MRB_BUILDDIR"], "artdaq_database", "lib", "conftoolg");
00023 } else {
00024 ConftoolPath = path_module.join(process.env["ARTDAQ_DATABASE_LIB"], "node_modules", "conftoolg");
00025 }
00026 console.log("Looking for conftoolg module in " + ConftoolPath);
00027 Conftool = require(ConftoolPath);
00028 console.log("Module loaded.");
00029
00030 } catch (E) {
00031 console.log("Error loading conftoolg module...have you setup the artdaq_database product?");
00032 console.log(E);
00033 }
00034
00046 function SetupUri(dbConfig) {
00047 console.log("Setting ARTDAQ_DATABASE_URI using configuration " + JSON.stringify(dbConfig, null, 4));
00048 if (dbConfig.dbprovider === "filesystem") {
00049 process.env["ARTDAQ_DATABASE_URI"] = "filesystemdb://" + dbConfig.baseDir + "/filesystemdb/" + dbConfig.instanceName;
00050 } else if (dbConfig.dbprovider === "mongo") {
00051 var passStr = "";
00052 if (fs.existsSync(".dbpasswd")) {
00053 passStr = ":" + fs.readFileSync(".dbpasswd");
00054 } else {
00055 console.log("No Password file (\".dbpasswd\") found. If auth fails, please place this file in the same directory as serverbase.js");
00056 }
00057 var userStr = "";
00058 if (dbConfig.mongoConfig.dbUser !== "") {
00059 userStr = "@";
00060 }
00061 process.env["ARTDAQ_DATABASE_URI"] = "mongodb://" + dbConfig.mongoConfig.dbUser + passStr + userStr + dbConfig.mongoConfig.dbHost + ":" + dbConfig.mongoConfig.dbPort + "/" + dbConfig.instanceName;
00062 } else {
00063 console.log("Connector.SetConfig: ERROR: Unrecognized database provider");
00064 }
00065 console.log("ARTDAQ_DATABASE_URI is " + process.env["ARTDAQ_DATABASE_URI"]);
00066 }
00067
00073 Connector.RunGetConfigsQuery = function (dbConfig) {
00074 console.log("Running findconfigs query");
00075 SetupUri(dbConfig);
00076 var query = {
00077 filter: {},
00078 operation: "findconfigs",
00079 dataformat: "gui"
00080 };
00081 if (dbConfig.configNameFilter.length === 0) {
00082 dbConfig.configNameFilter = "*";
00083 }
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 query.filter = {
00095 "configurations.name": dbConfig.configNameFilter
00096 };
00097
00098
00099 var output = Conftool.find_global_configurations_ui(JSON.stringify(query, null, 4));
00100 console.log("findconfigs output: " + JSON.stringify(output, null, 4));
00101 if (!output.first) {
00102
00103 throw { name: "DBOperationFailedException", message: output.second };
00104 }
00105
00106 return JSON.parse(output.second);
00107 };
00108
00114 Connector.RunGetEntitiesQuery = function (dbConfig) {
00115 console.log("Running findentities query");
00116 SetupUri(dbConfig);
00117 var query = {
00118 operation: "findentities",
00119 dataformat: "gui"
00120 };
00121
00122 var output = Conftool.find_configuration_entities_ui(JSON.stringify(query, null, 4));
00123 console.log("Findentities output: " + JSON.stringify(JSON.parse(output.second), null, 4));
00124 if (!output.first) {
00125 throw { name: "DBOperationFailedException", message: output.second };
00126 }
00127 return JSON.parse(output.second);
00128 };
00129
00136 Connector.RunGetVersionsQuery = function (dbConfig, query) {
00137 console.log("Running findversions query: " + JSON.stringify(query, null, 4));
00138 SetupUri(dbConfig);
00139
00140 var output = Conftool.find_configuration_versions_ui(JSON.stringify(query, null, 4));
00141 console.log("findversions output: " + JSON.stringify(output, null, 4));
00142 if (!output.first) {
00143 throw { name: "DBOperationFailedException", message: output.second };
00144 }
00145 return JSON.parse(output.second);
00146 };
00147
00155 Connector.RunBuildFilterQuery = function (dbConfig, configName, queryIn) {
00156 SetupUri(dbConfig);
00157 var query = { filter: { "configurations.name": "" } };
00158
00159 if (queryIn === undefined) {
00160 console.log("Getting query for " + configName);
00161 var configs = Connector.RunGetConfigsQuery(dbConfig).search;
00162 for (var conf in configs) {
00163 if (configs.hasOwnProperty(conf)) {
00164 var config = configs[conf];
00165 if (config.name === configName) {
00166 query = config.query;
00167 }
00168 }
00169 }
00170 } else {
00171 query = queryIn;
00172 }
00173
00174 console.log("Running buildfilter query: " + JSON.stringify(query, null, 4));
00175 var output = Conftool.build_global_configuration_search_filter_ui(JSON.stringify(query, null, 4));
00176
00177 for (var file in output.search) {
00178 if (output.search.hasOwnProperty(file) && query !== null && query !== undefined) {
00179 if (output.search[file].query.filter["configurations.name"] !== query.filter["configurations.name"]) {
00180 output.search.splice(file, 1);
00181 }
00182 }
00183 }
00184
00185
00186 if (!output.first) {
00187 throw { name: "DBOperationFailedException", message: output.second };
00188 }
00189 console.log("BuildfilterQuery return status " + output.first);
00190 console.log("BuildFilterQuery data: " + JSON.stringify(JSON.parse(output.second), null, 4));
00191 return JSON.parse(output.second);
00192 };
00193
00200 Connector.RunNewConfigQuery = function (dbConfig, query) {
00201 console.log("Running newconfig query: " + JSON.stringify(query, null, 4));
00202 SetupUri(dbConfig);
00203
00204 var output = Conftool.create_new_global_configuration_ui(JSON.stringify(query, null, 4));
00205 console.log("newconfig output: " + JSON.stringify(query, null, 4));
00206
00207 console.log("RunNewConfigQuery return status " + output.first);
00208 if (!output.first) {
00209 throw { name: "DBOperationFailedException", message: output.second };
00210 }
00211 };
00212
00222 Connector.RunAddConfigQuery = function (dbConfig, configName, version, collectionName, entity) {
00223 console.log("RunAddConfigQuery: configName: " + configName + ", version: " + version + ", collectionName: " + collectionName + ", entity: " + JSON.stringify(entity, null, 4));
00224 SetupUri(dbConfig);
00225 var query = {
00226 filter: {
00227 "entities.name": entity.name,
00228 "version": version
00229 },
00230 collection: collectionName,
00231 configuration: configName,
00232 operation: "addconfig",
00233 dataformat: "gui"
00234 };
00235
00236 var output = Conftool.add_configuration_to_global_configuration_ui(JSON.stringify(query, null, 4));
00237
00238
00239 console.log("RunAddConfigQuery return status " + output.first);
00240 if (!output.first) {
00241 throw { name: "DBOperationFailedException", message: output.second };
00242 }
00243 };
00244
00255 Connector.RunStoreQuery = function (dbConfig, data, collectionName, version, entity, dataType, configName) {
00256
00257 console.log("RunStoreConfigQuery: configName: " + configName + ", collectionName: " + collectionName + ", version: " + version + ", entity: " + entity + ", dataType: " + dataType);
00258 SetupUri(dbConfig);
00259 var query = {
00260 version: "" + version,
00261 collection: "" + collectionName,
00262 entity: entity,
00263 operation: "store",
00264 dataformat: "" + dataType
00265 , configuration: "" + configName
00266 };
00267 if (configName === undefined) {
00268 query.configuration = "unspecified";
00269 }
00270
00271 console.log("RunStoreQuery: Query: " + JSON.stringify(query,null,4) + ", Data: " + data);
00272 var output = Conftool.store_configuration_ui(JSON.stringify(query, null, 4), data);
00273
00274 console.log("RunStoreConfigQuery return status " + output.first);
00275 if (!output.first) {
00276 throw { name: "DBOperationFailedException", message: output.second };
00277 }
00278 console.log("RunStoreConfigQuery return value " + output.second);
00279 };
00280
00288 Connector.RunLoadQuery = function (dbConfig, query, noparse) {
00289 console.log("Running load query");
00290 SetupUri(dbConfig);
00291
00292 var output = Conftool.load_configuration_ui(JSON.stringify(query, null, 4));
00293 console.log("Conftool Load output: " + output.first);
00294 if (!output.first) {
00295 throw { name: "DBOperationFailedException", message: output.second };
00296 }
00297
00298 if (noparse) return output.second;
00299
00300 return JSON.parse(output.second);
00301 };
00302
00303 Connector.RunListDatabasesQuery = function (dbconfig, filterobj) {
00304 console.log("Running ListDatabases query");
00305 SetupUri(dbconfig);
00306
00307 if (!filterobj) {
00308 filterobj = {};
00309 }
00310
00311 var query = {
00312 filter: filterobj,
00313 dataformat: "gui",
00314 operation: "listdatabases"
00315 };
00316 var output = Conftool.list_databases(JSON.stringify(query, null, 4));
00317 console.log("Conftool ListDatabases output: " + JSON.stringify(output, null, 4));
00318 if (!output.first) {
00319 throw { name: "DBOperationFailedException", message: output.second };
00320 }
00321
00322 return JSON.parse(output.second);
00323 }
00324
00325 module.exports = Connector;