clients/server/mysql.js

MySQL

Other dependencies, including the mysql library, which needs to be added as a dependency to the project using this database.

var _ = require('lodash'); var mysql = require('mysql');

All other local project modules needed in this scope.

var ServerBase = require('./base').ServerBase; var Helpers = require('../../lib/helpers').Helpers; var Promise = require('../../lib/promise').Promise; var grammar = require('./mysql/grammar').grammar; var schemaGrammar = require('./mysql/schemagrammar').schemaGrammar;

Constructor for the MySQLClient.

exports.Client = ServerBase.extend({ dialect: 'mysql',

Attach the appropriate grammar definitions onto the current client.

attachGrammars: function() { this.grammar = grammar; this.schemaGrammar = schemaGrammar; },

Runs the query on the specified connection, providing the bindings and any other necessary prep work.

runQuery: function(connection, sql, bindings, builder) { return Promise.bind(this).then(function() { if (!connection) throw new Error('No database connection exists for the query'); if (builder.flags.options) sql = _.extend({sql: sql}, builder.flags.options); if (builder._source === 'SchemaBuilder') { return this.advancedQuery(connection, sql, builder); } return sql; }).then(function(sql) { return Promise.promisify(connection.query, connection)(sql, bindings); }).bind(); },

Get a raw connection, called by the pool whenever a new connection needs to be added to the pool.

getRawConnection: function() { var connection = mysql.createConnection(this.connectionSettings); return Promise.promisify(connection.connect, connection)().yield(connection); },

Used to explicitly close a connection, called internally by the pool when a connection times out or the pool is shutdown.

destroyRawConnection: function(connection) { connection.end(); },

Used to check if there is a conditional query needed to complete the next one.

advancedQuery: function(connection, sql, builder) { if (sql.indexOf('alter table') === 0 && sql.indexOf('__datatype__') === (sql.length - 12)) { var newSql = sql.replace('alter table', 'show fields from').split('change')[0] + ' where field = ?'; return Promise.promisify(connection.query, connection)(newSql, [builder.commands[builder.currentIndex].from]).then(function(resp) { var column = resp[0];

Set to the datatype we're looking to change it to...

return sql.replace('__datatype__', column[0].Type); }); } return sql; } });