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 throw { name: "DBOperationFailedException", message: output.second };
00103 }
00104
00105 return JSON.parse(output.second);
00106 };
00107
00113 Connector.RunGetEntitiesQuery = function (dbConfig) {
00114 console.log("Running findentities query");
00115 SetupUri(dbConfig);
00116 var query = {
00117 operation: "findentities",
00118 dataformat: "gui"
00119 };
00120
00121 var output = Conftool.find_configuration_entities_ui(JSON.stringify(query, null, 4));
00122 console.log("Findentities output: " + JSON.stringify(JSON.parse(output.second), null, 4));
00123 if (!output.first) {
00124 throw { name: "DBOperationFailedException", message: output.second };
00125 }
00126 return JSON.parse(output.second);
00127 };
00128
00135 Connector.RunGetVersionsQuery = function (dbConfig, query) {
00136 console.log("Running findversions query: " + JSON.stringify(query, null, 4));
00137 SetupUri(dbConfig);
00138
00139 var output = Conftool.find_configuration_versions_ui(JSON.stringify(query, null, 4));
00140 console.log("findversions output: " + JSON.stringify(output, null, 4));
00141 if (!output.first) {
00142 throw { name: "DBOperationFailedException", message: output.second };
00143 }
00144 return JSON.parse(output.second);
00145 };
00146
00154 Connector.RunBuildFilterQuery = function (dbConfig, configName, queryIn) {
00155 SetupUri(dbConfig);
00156 var query = { filter: { "configurations.name": "" } };
00157
00158 if (queryIn === undefined) {
00159 console.log("Getting query for " + configName);
00160 var configs = Connector.RunGetConfigsQuery(dbConfig).search;
00161 for (var conf in configs) {
00162 if (configs.hasOwnProperty(conf)) {
00163 var config = configs[conf];
00164 if (config.name === configName) {
00165 query = config.query;
00166 }
00167 }
00168 }
00169 } else {
00170 query = queryIn;
00171 }
00172
00173 console.log("Running buildfilter query: " + JSON.stringify(query, null, 4));
00174 var output = Conftool.build_global_configuration_search_filter_ui(JSON.stringify(query, null, 4));
00175
00176 for (var file in output.search) {
00177 if (output.search.hasOwnProperty(file) && query !== null && query !== undefined) {
00178 if (output.search[file].query.filter["configurations.name"] !== query.filter["configurations.name"]) {
00179 output.search.splice(file, 1);
00180 }
00181 }
00182 }
00183
00184
00185 if (!output.first) {
00186 throw { name: "DBOperationFailedException", message: output.second };
00187 }
00188 console.log("BuildfilterQuery return status " + output.first);
00189 console.log("BuildFilterQuery data: " + JSON.stringify(JSON.parse(output.second), null, 4));
00190 return JSON.parse(output.second);
00191 };
00192
00199 Connector.RunNewConfigQuery = function (dbConfig, query) {
00200 console.log("Running newconfig query: " + JSON.stringify(query, null, 4));
00201 SetupUri(dbConfig);
00202
00203 var output = Conftool.create_new_global_configuration_ui(JSON.stringify(query, null, 4));
00204 console.log("newconfig output: " + JSON.stringify(query, null, 4));
00205
00206 console.log("RunNewConfigQuery return status " + output.first);
00207 if (!output.first) {
00208 throw { name: "DBOperationFailedException", message: output.second };
00209 }
00210 };
00211
00221 Connector.RunAddConfigQuery = function (dbConfig, configName, version, collectionName, entity) {
00222 console.log("RunAddConfigQuery: configName: " + configName + ", version: " + version + ", collectionName: " + collectionName + ", entity: " + JSON.stringify(entity, null, 4));
00223 SetupUri(dbConfig);
00224 var query = {
00225 filter: {
00226 "entities.name": entity.name,
00227 "version": version
00228 },
00229 collection: collectionName,
00230 configuration: configName,
00231 operation: "addconfig",
00232 dataformat: "gui"
00233 };
00234
00235 var output = Conftool.add_configuration_to_global_configuration_ui(JSON.stringify(query, null, 4));
00236
00237
00238 console.log("RunAddConfigQuery return status " + output.first);
00239 if (!output.first) {
00240 throw { name: "DBOperationFailedException", message: output.second };
00241 }
00242 };
00243
00254 Connector.RunStoreQuery = function (dbConfig, data, collectionName, version, entity, dataType, configName) {
00255
00256 console.log("RunStoreConfigQuery: configName: " + configName + ", collectionName: " + collectionName + ", version: " + version + ", entity: " + entity + ", dataType: " + dataType);
00257 SetupUri(dbConfig);
00258 var query = {
00259 version: "" + version,
00260 collection: "" + collectionName,
00261 entity: entity,
00262 operation: "store",
00263 dataformat: "" + dataType
00264 , configuration: "" + configName
00265 };
00266 if (configName === undefined) {
00267 query.configuration = "unspecified";
00268 }
00269
00270 console.log("RunStoreQuery: Query: " + JSON.stringify(query,null,4) + ", Data: " + data);
00271 var output = Conftool.store_configuration_ui(JSON.stringify(query, null, 4), data);
00272
00273 console.log("RunStoreConfigQuery return status " + output.first);
00274 if (!output.first) {
00275 throw { name: "DBOperationFailedException", message: output.second };
00276 }
00277 console.log("RunStoreConfigQuery return value " + output.second);
00278 };
00279
00287 Connector.RunLoadQuery = function (dbConfig, query, noparse) {
00288 console.log("Running load query");
00289 SetupUri(dbConfig);
00290
00291 var output = Conftool.load_configuration_ui(JSON.stringify(query, null, 4));
00292 console.log("Conftool Load output: " + output.first);
00293 if (!output.first) {
00294 throw { name: "DBOperationFailedException", message: output.second };
00295 }
00296
00297 if (noparse) return output.second;
00298
00299 return JSON.parse(output.second);
00300 };
00301
00302 Connector.RunListDatabasesQuery = function (dbconfig, filterobj) {
00303 console.log("Running ListDatabases query");
00304 SetupUri(dbconfig);
00305
00306 if (!filterobj) {
00307 filterobj = {};
00308 }
00309
00310 var query = {
00311 filter: filterobj,
00312 dataformat: "gui",
00313 operation: "listdatabases"
00314 };
00315 var output = Conftool.list_databases(JSON.stringify(query, null, 4));
00316 console.log("Conftool ListDatabases output: " + JSON.stringify(output, null, 4));
00317 if (!output.first) {
00318 throw { name: "DBOperationFailedException", message: output.second };
00319 }
00320
00321 return JSON.parse(output.second);
00322 }
00323
00324 module.exports = Connector;