123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- module.exports = {
- friendlyName: 'Release connection',
- description: 'Release an active MySQL database connection back to the pool.',
- inputs: {
- connection: {
- friendlyName: 'Connection',
- description: 'An active database connection.',
- extendedDescription: 'The provided database connection instance must still be active. Only database connection instances created by the `getConnection()` machine in this driver are supported.',
- example: '===',
- required: true
- },
- meta: {
- friendlyName: 'Meta (custom)',
- description: 'Additional stuff to pass to the driver.',
- extendedDescription: 'This is reserved for custom driver-specific extensions. Please refer to the documentation for the driver you are using for more specific information.',
- example: '==='
- }
- },
- exits: {
- success: {
- description: 'The connection was released and is no longer active.',
- extendedDescription: 'The provided connection may no longer be used for any subsequent queries.',
- outputVariableName: 'report',
- outputDescription: 'The `meta` property is reserved for custom driver-specific extensions.',
- outputExample: '==='
- // outputExample: {
- // meta: '==='
- // }
- },
- badConnection: {
- friendlyName: 'Bad connection',
- description: 'The provided connection is not valid or no longer active. Are you sure it was obtained by calling this driver\'s `getConnection()` method?',
- extendedDescription: 'Usually, this means the connection to the database was lost due to a logic error or timing issue in userland code. In production, this can mean that the database became overwhelemed or was shut off while some business logic was in progress.',
- outputVariableName: 'report',
- outputDescription: 'The `meta` property is reserved for custom driver-specific extensions.',
- outputExample: '==='
- // outputExample: {
- // meta: '==='
- // }
- }
- },
- fn: function releaseConnection(inputs, exits) {
- var validateConnection = require('./private/validate-connection');
- // Validate provided connection.
- if (!validateConnection({ connection: inputs.connection }).execSync()) {
- return exits.badConnection({
- meta: inputs.meta
- });
- }
- // Release connection.
- try {
- // Note that if this driver is adapted to support managers which spawn
- // ad-hoc connections or manage multiple pools/replicas using PoolCluster,
- // then relevant settings would need to be included in the manager instance
- // so that connections can be appropriately released/destroyed here.
- //
- // For now, since we only support a single pool, we simply release the
- // connection back to the pool.
- inputs.connection.release();
- // If we made it here, releasing the connection gracefully must have worked.
- return exits.success();
- } catch (_releaseErr) {
- // If the connection cannot be released back to the pool gracefully,
- // try to force it to disconnect.
- try {
- inputs.connection.destroy();
- // If even THAT fails, exit via `error`.
- } catch (_destroyErr) {
- return exits.error(new Error('Could not release MySQL connection gracefully, and attempting to forcibly destroy the connection threw an error. Details:\n=== === ===\n' + _destroyErr.stack + '\n\nAnd error details from the original graceful attempt:\n=== === ===\n' + _releaseErr.stack));
- }
- // Otherwise if we're here, while we could not release the MySQL connection
- // gracefully, we were able to forcibly destroy it.
- return exits.success({
- meta: inputs.meta
- });
- }
- }
- };
|