diff --git a/lib/waterline.js b/lib/waterline.js index 9882a24c0..4b704c32b 100644 --- a/lib/waterline.js +++ b/lib/waterline.js @@ -17,6 +17,9 @@ var buildDatastoreMap = require('./waterline/utils/system/datastore-builder'); var buildLiveWLModel = require('./waterline/utils/system/collection-builder'); var BaseMetaModel = require('./waterline/MetaModel'); var getModel = require('./waterline/utils/ontology/get-model'); +var validateDatastoreConnectivity = require('./waterline/utils/system/validate-datastore-connectivity'); + + /** @@ -711,7 +714,13 @@ function Waterline() { });// // Call the `registerDatastore` adapter method. - datastore.adapter.registerDatastore(datastore.config, usedSchemas, next); + datastore.adapter.registerDatastore(datastore.config, usedSchemas, function(err) { + if (err) { + return next(err); + } + + return validateDatastoreConnectivity(datastore, next); + }); } catch (err) { return next(err); } diff --git a/lib/waterline/utils/system/validate-datastore-connectivity.js b/lib/waterline/utils/system/validate-datastore-connectivity.js new file mode 100644 index 000000000..b7cfbed33 --- /dev/null +++ b/lib/waterline/utils/system/validate-datastore-connectivity.js @@ -0,0 +1,45 @@ +var _ = require('@sailshq/lodash'); + +/** + * validateDatastoreConnectivity() + * + * Validates connectivity to a datastore by trying to acquire and release + * connection. + * + * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + * @param {Ref} datastore + * + * @param {Function} done + * @param {Error?} err [if an error occured] + * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + */ + +module.exports = function validateDatastoreConnectivity(datastore, done) { + var adapterDSEntry = _.get(datastore.adapter.datastores, datastore.config.identity); + + // skip validation if `getConnection` and `releaseConnection` methods do not exist. + // aka pretend everything is OK + if (!_.has(adapterDSEntry.driver, 'getConnection') || !_.has(adapterDSEntry.driver, 'releaseConnection')) { + return done(); + } + + // try to acquire connection. + adapterDSEntry.driver.getConnection({ + manager: adapterDSEntry.manager + }, function(err, report) { + if (err) { + return done(err); + } + + // release connection. + adapterDSEntry.driver.releaseConnection({ + connection: report.connection + }, function(err) { + if (err) { + return done(err); + } + + return done(); + });// + });// +};