node-deadline
Version:
Module to interface with Deadline Compute Management System by Thinkbox Software
190 lines (155 loc) • 4.55 kB
JavaScript
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();
} );
} );
};