sails-postgresql
Version:
a PostgreSQL adapter for Waterline and Sails.js
125 lines (94 loc) • 5.06 kB
JavaScript
// ██████╗ ██████╗ ██████╗ ██████╗
// ██╔══██╗██╔══██╗██╔═══██╗██╔══██╗
// ██║ ██║██████╔╝██║ ██║██████╔╝
// ██║ ██║██╔══██╗██║ ██║██╔═══╝
// ██████╔╝██║ ██║╚██████╔╝██║
// ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝
//
module.exports = require('machine').build({
friendlyName: 'Drop',
description: 'Remove a table from the database.',
inputs: {
datastore: {
description: 'The datastore to use for connections.',
extendedDescription: 'Datastores represent the config and manager required to obtain an active database connection.',
required: true,
type: 'ref'
},
tableName: {
description: 'The name of the table to destroy.',
required: true,
example: 'users'
},
meta: {
friendlyName: 'Meta (custom)',
description: 'Additional stuff to pass to the driver.',
extendedDescription: 'This is reserved for custom driver-specific extensions.',
type: 'ref'
}
},
exits: {
success: {
description: 'The table was destroyed successfully.'
},
badConnection: {
friendlyName: 'Bad connection',
description: 'A connection either could not be obtained or there was an error using the connection.'
}
},
fn: function drop(inputs, exits) {
// Dependencies
var _ = require('@sailshq/lodash');
var Helpers = require('./private');
// Set a flag if a leased connection from outside the adapter was used or not.
var leased = _.has(inputs.meta, 'leasedConnection');
// ╔═╗╦ ╦╔═╗╔═╗╦╔═ ┌─┐┌─┐┬─┐ ┌─┐ ┌─┐┌─┐ ┌─┐┌─┐┬ ┬┌─┐┌┬┐┌─┐
// ║ ╠═╣║╣ ║ ╠╩╗ ├┤ │ │├┬┘ ├─┤ ├─┘│ ┬ └─┐│ ├─┤├┤ │││├─┤
// ╚═╝╩ ╩╚═╝╚═╝╩ ╩ └ └─┘┴└─ ┴ ┴ ┴ └─┘ └─┘└─┘┴ ┴└─┘┴ ┴┴ ┴
// This is a unique feature of Postgres. It may be passed in on a query
// by query basis using the meta input or configured on the datastore. Default
// to use the public schema.
var schemaName = 'public';
if (inputs.meta && inputs.meta.schemaName) {
schemaName = inputs.meta.schemaName;
} else if (inputs.datastore.config && inputs.datastore.config.schemaName) {
schemaName = inputs.datastore.config.schemaName;
}
// ╔═╗╔═╗╔═╗╦ ╦╔╗╔ ┌─┐┌─┐┌┐┌┌┐┌┌─┐┌─┐┌┬┐┬┌─┐┌┐┌
// ╚═╗╠═╝╠═╣║║║║║║ │ │ │││││││├┤ │ │ ││ ││││
// ╚═╝╩ ╩ ╩╚╩╝╝╚╝ └─┘└─┘┘└┘┘└┘└─┘└─┘ ┴ ┴└─┘┘└┘
// Spawn a new connection to run the queries on.
Helpers.connection.spawnOrLeaseConnection(inputs.datastore, inputs.meta, function spawnConnectionCb(err, connection) {
if (err) {
return exits.badConnection(err);
}
// ╔═╗╔═╗╔═╗╔═╗╔═╗╔═╗ ┌┬┐┌─┐┌┐ ┬ ┌─┐ ┌┐┌┌─┐┌┬┐┌─┐
// ║╣ ╚═╗║ ╠═╣╠═╝║╣ │ ├─┤├┴┐│ ├┤ │││├─┤│││├┤
// ╚═╝╚═╝╚═╝╩ ╩╩ ╚═╝ ┴ ┴ ┴└─┘┴─┘└─┘ ┘└┘┴ ┴┴ ┴└─┘
var tableName;
try {
tableName = Helpers.schema.escapeTableName(inputs.tableName, schemaName);
} catch (e) {
// Release the connection on error
Helpers.connection.releaseConnection(connection, leased, function releaseConnectionCb() {
return exits.error(e);
});
return;
}
// Build native query
var query = 'DROP TABLE IF EXISTS ' + tableName + ';';
// ╦═╗╦ ╦╔╗╔ ┌┬┐┬─┐┌─┐┌─┐ ┌─┐ ┬ ┬┌─┐┬─┐┬ ┬
// ╠╦╝║ ║║║║ ││├┬┘│ │├─┘ │─┼┐│ │├┤ ├┬┘└┬┘
// ╩╚═╚═╝╝╚╝ ─┴┘┴└─└─┘┴ └─┘└└─┘└─┘┴└─ ┴
Helpers.query.runNativeQuery(connection, query, [], function runNativeQueryCb(err) {
// Always release the connection back to the pool
Helpers.connection.releaseConnection(connection, leased, function releaseConnectionCb() {
if (err) {
return exits.error(err);
}
return exits.success();
}); // </ releaseConnection >
}); // </ runNativeQuery >
}); // </ spawnConnection >
}
});