knex/lib/schema/builder.js
2014-02-14 12:46:13 -05:00

93 lines
2.7 KiB
JavaScript

module.exports = function(client) {
var push = Array.prototype.push;
var _ = require('lodash');
var TableInterface = require('./table');
var Formatters = require('../formatters');
var SqlString = require('../sqlstring');
// Constructor for the builder instance, typically called from
// `knex.builder`, accepting the current `knex` instance,
// and pulling out the `client` and `grammar` from the current
// knex instance.
var SchemaBuilder = function() {
this.sequence = [];
this.flags = {};
};
_.extend(SchemaBuilder.prototype, Formatters, {
// Set a debug flag for the current schema query stack.
debug: function(val) {
this.flags.debug = (val == null ? true : val);
return this;
},
// Turn the current schema builder into a string...
toString: function() {
return _.reduce(this.toSql(), function(memo, statement) {
memo.push(SqlString.format(statement.sql, statement.bindings));
return memo;
}, [], this).join(';\n') + ';';
},
// Compiles the current stack to an array of arrays
// of statements to conduct in sequence.
toSql: function() {
return this.sequence;
},
// Alias for `schema.table` for clarity.
alterTable: function(tableName) {
return this.table.apply(this, arguments);
},
// Modify a table on the schema.
table: function(tableName, fn) {
push.apply(this.sequence, new client.SchemaTableCompiler(new TableInterface('alter', tableName, fn)).toSql());
return this;
},
// Create a new table on the schema.
createTable: function(tableName, fn) {
push.apply(this.sequence, new client.SchemaTableCompiler(new TableInterface('create', tableName, fn)).toSql());
return this;
},
// Drop a table from the schema.
dropTable: function(tableName) {
this.sequence.push({
sql: 'drop table ' + this._wrap(tableName)
});
return this;
},
// Drop a table from the schema if it exists.
dropTableIfExists: function(tableName) {
this.sequence.push({
sql: 'drop table if exists ' + this._wrap(tableName)
});
return this;
},
// Set the "transacting" flag for the current sequence.
transacting: function(t) {
this.flags.transacting = t;
return this;
},
_wrapValue: function tablecompiler$wrapValue() {
return client.wrapValue.apply(this, arguments);
}
});
SchemaBuilder.prototype.then = function SchemaBuilder$then(onFulfilled, onRejected) {
return client.runThen(this).then(onFulfilled, onRejected);
};
require('../coerceable')(SchemaBuilder);
SchemaBuilder.extend = require('simple-extend');
return SchemaBuilder;
};