sqlpad
Version:
Web app for writing and running SQL queries and visualizing the results. Supports Postgres, MySQL, SQL Server, Crate and Vertica.
123 lines (113 loc) • 4.1 kB
JavaScript
var Joi = require('joi')
var db = require('../lib/db.js')
var _ = require('lodash')
var schema = {
_id: Joi.string().optional(), // will be auto-gen by nedb
name: Joi.string().required(),
driver: Joi.string().required(), // postgres, mysql, etc
host: Joi.string().optional(),
port: Joi.any().optional(),
database: Joi.string()
.optional()
.allow(''),
username: Joi.string().default('', 'Database Username'), // decrypt for presentation, encrypted for storage
password: Joi.string().default('', 'Database Password'), // decrypt for presentation, encrypted for storage
domain: Joi.string()
.optional()
.allow(''),
sqlserverEncrypt: Joi.boolean().default(false, 'SQL Server Encrypt'),
postgresSsl: Joi.boolean().default(false, 'Postgres SSL'),
postgresCert: Joi.string().optional(),
postgresKey: Joi.string().optional(),
postgresCA: Joi.string().optional(),
useSocks: Joi.boolean().default(
false,
'Connect to database through SOCKS proxy'
),
socksHost: Joi.string().optional(),
socksPort: Joi.string().optional(),
socksUsername: Joi.string().optional(),
socksPassword: Joi.string().optional(),
mysqlInsecureAuth: Joi.boolean().default(false, 'Mysql Insecure Auth'),
prestoCatalog: Joi.string()
.optional()
.allow(''),
prestoSchema: Joi.string()
.optional()
.allow(''),
createdDate: Joi.date().default(new Date(), 'time of creation'),
modifiedDate: Joi.date().default(new Date(), 'time of modifcation')
}
var Connection = function Connection(data) {
this._id = data._id
this.name = data.name
this.driver = data.driver
this.host = data.host
this.port = data.port
this.database = data.database
this.username = data.username
this.password = data.password
this.domain = data.domain // this is sql server only for now, but could apply to other dbs in future?
this.sqlserverEncrypt = data.sqlserverEncrypt
this.postgresSsl = data.postgresSsl
this.postgresCert = data.postgresCert
this.postgresKey = data.postgresKey
this.useSocks = data.useSocks
this.socksHost = data.socksHost
this.socksPort = data.socksPort
this.socksUsername = data.socksUsername
this.socksPassword = data.socksPassword
this.mysqlInsecureAuth = data.mysqlInsecureAuth
this.prestoCatalog = data.prestoCatalog
this.prestoSchema = data.prestoSchema
this.createdDate = data.createdDate
this.modifiedDate = data.modifiedDate
}
Connection.prototype.save = function ConnectionSave(callback) {
var self = this
this.modifiedDate = new Date()
// TODO - build in auto cypher if rawUsername and rawPassword set?
var joiResult = Joi.validate(self, schema)
if (joiResult.error) return callback(joiResult.error)
if (self._id) {
db.connections.update({ _id: self._id }, joiResult.value, {}, function(
err
) {
if (err) return callback(err)
Connection.findOneById(self._id, callback)
})
} else {
db.connections.insert(joiResult.value, function(err, newDoc) {
if (err) return callback(err)
return callback(null, new Connection(newDoc))
})
}
}
/* Query methods
============================================================================== */
Connection.findOneById = function ConnectionFindOneById(id, callback) {
db.connections.findOne({ _id: id }).exec(function(err, doc) {
if (err) return callback(err)
if (!doc) return callback()
return callback(err, new Connection(doc))
})
}
Connection.findAll = function ConnectionFindAll(callback) {
db.connections.find({}).exec(function(err, docs) {
if (err) return callback(err)
var connections = docs.map(function(doc) {
return new Connection(doc)
})
connections = _.sortBy(connections, function(c) {
return c.name.toLowerCase()
})
return callback(null, connections)
})
}
Connection.removeOneById = function ConnectionRemoveOneById(id, callback) {
db.connections.remove({ _id: id }, callback)
}
Connection._removeAll = function _removeAllConnections(callback) {
db.connections.remove({}, { multi: true }, callback)
}
module.exports = Connection