UNPKG

node-deadline

Version:

Module to interface with Deadline Compute Management System by Thinkbox Software

190 lines (155 loc) 4.55 kB
var Err = require( "./Error" ), settings = require( "../settings" ), mongo = require( "mongodb" ), test = require( "../test/test" ), util = require('util'); var mg = module.exports = { and: function( items ) { //make sure its an array if ( !Array.isArray( items ) ) { throw new Err( Err.PARAM, "mongo.and requires an array" ); } //wrap it in an and return { $and: items }; }, or: function( items ) { //make sure its an array if ( !Array.isArray( items ) ) { throw new Err( Err.PARAM, "mongo.or requires an array" ); } //wrap it in an and return { $or: items }; }, //returns Error|null, database|null, collection|null connectTo: function( dbName, collection, callback ) { var i, dbNameOK = false, mongoClient, url; //check that we are initialized and a host has been set if ( null === settings.host ) { callback( new Err( Err.INIT, "Deadline module has not been properly initialized with a host", "Call Deadline.init() first." ), null, null ); } var url_auth = (settings.username ? (encodeURIComponent(settings.username) + ":" + encodeURIComponent(settings.password)) : ""), url_host = ((url_auth ? "@" : "") + settings.host), url_port = settings.port, url_database = settings.database, url_authsource = (settings.authSource ? ("?authSource=" + settings.authSource) : ""), url_format = "mongodb://%s%s:%s/%s%s"; url = util.format(url_format, url_auth, url_host, url_port, url_database, url_authsource); mongoClient = mongo.MongoClient.connect(url, { uri_decode_auth: true }, function(err, db) { if ( err ) { callback( err, null, null ); return; } //we force the user to match an existing collection here db.collections( function( err, collections ) { if ( err ) { callback( err, null, null ); db.close(); return; } //look for a match for ( i in collections ) { if ( collections[ i ].collectionName == collection ) { callback( null, db, collections[ i ] ); return; } } //no collection found callback( new Err( Err.PARAM, "No collection found on " + dbName + " with the name " + collection ), null, null ); db.close(); } ); } ); } }; //returns Error|null, results|null mg.find = function( dbName, collection, query, callback ) { //redirect to test object if set if ( true === settings.test ) { test.connectTo( dbName, collection, function( err ) { if ( err ) { callback( err, null ); return; } test.find( dbName, collection, query, callback ); } ); return; } //otherwise do the actual connection mg.connectTo( dbName, collection, function( err, db, coll ) { if ( err ) { callback( err, null ); if(db && db.close){db.close();} return; } coll.find( query ).toArray( function( err, res ) { if ( err ) { callback( new Err( Err.EXTERN, err.mesage ), null ); db.close(); return; } //all is well, send it back callback( null, res ); db.close(); } ); } ); }; mg.findOne = function( dbName, collection, query, callback ) { mg.find( dbName, collection, query, function( err, res ) { if ( err || res.length === 0 || res === null ) { callback( err, null ); } callback( err, res[ 0 ] ); } ); }; mg.update = function( dbName, collection, query, props, callback ) { //redirect to test object if set if ( true === settings.test ) { test.connectTo( dbName, collection, function( err ) { if ( err ) { callback( err, null ); return; } test.update( dbName, collection, query, props, callback ); } ); return; } //otherwise do the actual connection mg.connectTo( dbName, collection, function( err, db, coll ) { if ( err ) { callback( err, null ); db.close(); return; } coll.update( query, props, function( err, res ) { if ( err ) { callback( new Err( Err.EXTERN, err.mesage ), null ); db.close(); return; } //all is well, send it back callback( null, res ); db.close(); } ); } ); };