sequelize
Advanced tools
Comparing version 1.6.0 to 1.7.0-alpha1
@@ -0,1 +1,5 @@ | ||
# v1.7.0 # | ||
- [FEATURE] Schematics. [#564](https://github.com/sequelize/sequelize/pull/564). thanks to durango | ||
- [BUG] Null dates don't break SQLite anymore. [#572](https://github.com/sequelize/sequelize/pull/572). thanks to mweibel | ||
# v1.6.0 # | ||
@@ -2,0 +6,0 @@ - [DEPENDENCIES] upgrade mysql to alpha7. You *MUST* use this version or newer for DATETIMEs to work |
@@ -19,3 +19,5 @@ var Utils = require("./utils") | ||
paranoid: false, | ||
whereCollection: null | ||
whereCollection: null, | ||
schema: null, | ||
schemaDelimiter: '' | ||
}, options || {}) | ||
@@ -58,7 +60,2 @@ | ||
Utils._.each(this.attributes, function(dataTypeString, attributeName) { | ||
// If you don't specify a valid data type lets help you debug it | ||
if (dataTypeString === undefined) { | ||
throw new Error("Unrecognized data type for field " + attributeName ); | ||
} | ||
if ((attributeName !== 'id') && (dataTypeString.indexOf('PRIMARY KEY') !== -1)) { | ||
@@ -121,3 +118,3 @@ self.primaryKeys[attributeName] = dataTypeString | ||
self.QueryInterface | ||
.createTable(self.tableName, self.attributes, options) | ||
.createTable(self.getTableName(), self.attributes, options) | ||
.success(function() { emitter.emit('success', self) }) | ||
@@ -140,2 +137,26 @@ .error(function(err) { emitter.emit('error', err) }) | ||
DAOFactory.prototype.dropSchema = function(schema) { | ||
return this.QueryInterface.dropSchema(schema) | ||
} | ||
DAOFactory.prototype.schema = function(schema, options) { | ||
this.options.schema = schema | ||
if (!!options) { | ||
if (typeof options === "string") { | ||
this.options.schemaDelimiter = options | ||
} else { | ||
if (!!options.schemaDelimiter) { | ||
this.options.schemaDelimiter = options.schemaDelimiter | ||
} | ||
} | ||
} | ||
return this | ||
} | ||
DAOFactory.prototype.getTableName = function() { | ||
return this.QueryGenerator.addSchema(this) | ||
} | ||
// alias for findAll | ||
@@ -151,4 +172,2 @@ DAOFactory.prototype.all = function(options) { | ||
if (typeof options === 'object') { | ||
hasJoin = true | ||
if (options.hasOwnProperty('include')) { | ||
@@ -180,3 +199,3 @@ hasJoin = true | ||
return this.QueryInterface.select(this, [this.tableName, joinTableName], optcpy, { type: 'SELECT' }) | ||
return this.QueryInterface.select(this, [this.getTableName(), joinTableName], optcpy, { type: 'SELECT' }) | ||
} | ||
@@ -243,3 +262,3 @@ | ||
return this.QueryInterface.select(this, this.tableName, options, { | ||
return this.QueryInterface.select(this, this.getTableName(), options, { | ||
plain: true, | ||
@@ -256,3 +275,3 @@ type: 'SELECT', | ||
return this.QueryInterface.rawSelect(this.tableName, options, 'count') | ||
return this.QueryInterface.rawSelect(this.getTableName(), options, 'count') | ||
} | ||
@@ -265,3 +284,3 @@ | ||
return this.QueryInterface.rawSelect(this.tableName, options, 'max') | ||
return this.QueryInterface.rawSelect(this.getTableName(), options, 'max') | ||
} | ||
@@ -273,3 +292,3 @@ DAOFactory.prototype.min = function(field, options) { | ||
return this.QueryInterface.rawSelect(this.tableName, options, 'min') | ||
return this.QueryInterface.rawSelect(this.getTableName(), options, 'min') | ||
} | ||
@@ -276,0 +295,0 @@ |
@@ -125,2 +125,3 @@ var Utils = require("./utils") | ||
, isEnum = (definition.type && (definition.type.toString() === DataTypes.ENUM.toString())) | ||
, isHstore = (!!definition.type && !!definition.type.type && definition.type.type === DataTypes.HSTORE.type) | ||
, hasValue = (typeof values[attrName] !== 'undefined') | ||
@@ -132,2 +133,16 @@ , valueOutOfScope = ((definition.values || []).indexOf(values[attrName]) === -1) | ||
} | ||
if (isHstore) { | ||
if (typeof values[attrName] === "object") { | ||
var text = [] | ||
Utils._.each(values[attrName], function(value, key){ | ||
if (typeof value !== "string" && typeof value !== "number") { | ||
throw new Error('Value for HSTORE must be a string or number.') | ||
} | ||
text.push(this.QueryInterface.QueryGenerator.addQuotes(key) + '=>' + (typeof value === "string" ? this.QueryInterface.QueryGenerator.addQuotes(value) : value)) | ||
}.bind(this)) | ||
values[attrName] = text.join(',') | ||
} | ||
} | ||
} | ||
@@ -141,3 +156,3 @@ } | ||
if (this.isNewRecord) { | ||
return this.QueryInterface.insert(this, this.__factory.tableName, values) | ||
return this.QueryInterface.insert(this, this.QueryInterface.QueryGenerator.addSchema(this.__factory), values) | ||
} else { | ||
@@ -150,3 +165,3 @@ var identifier = this.__options.hasPrimaryKeys ? this.primaryKeyValues : this.id; | ||
var tableName = this.__factory.tableName | ||
var tableName = this.QueryInterface.QueryGenerator.addSchema(this.__factory) | ||
, query = this.QueryInterface.update(this, tableName, values, identifier) | ||
@@ -288,3 +303,3 @@ | ||
var identifier = this.__options.hasPrimaryKeys ? this.primaryKeyValues : this.id | ||
return this.QueryInterface.delete(this, this.__factory.tableName, identifier) | ||
return this.QueryInterface.delete(this, this.QueryInterface.QueryGenerator.addSchema(this.__factory.tableName, this.__factory.options.schema), identifier) | ||
} | ||
@@ -309,3 +324,3 @@ } | ||
return this.QueryInterface.increment(this, this.__factory.tableName, values, identifier) | ||
return this.QueryInterface.increment(this, this.QueryInterface.QueryGenerator.addSchema(this.__factory.tableName, this.__factory.options.schema), values, identifier) | ||
} | ||
@@ -364,2 +379,6 @@ | ||
if (values.hasOwnProperty(key)) { | ||
if (typeof values[key] === "string" && !!this.__factory && !!this.__factory.rawAttributes[key] && !!this.__factory.rawAttributes[key].type && !!this.__factory.rawAttributes[key].type.type && this.__factory.rawAttributes[key].type.type === DataTypes.HSTORE.type) { | ||
values[key] = this.QueryInterface.QueryGenerator.toHstore(values[key]) | ||
} | ||
this.addAttribute(key, values[key]) | ||
@@ -366,0 +385,0 @@ } |
@@ -35,3 +35,17 @@ module.exports = { | ||
}, | ||
ARRAY: function(type) { return type + '[]' } | ||
ARRAY: function(type) { return type + '[]' }, | ||
get HSTORE() { | ||
var result = function() { | ||
return { | ||
type: 'HSTORE' | ||
} | ||
} | ||
result.type = 'HSTORE' | ||
result.toString = result.valueOf = function() { return 'TEXT' } | ||
return result | ||
} | ||
} |
@@ -7,2 +7,35 @@ var Utils = require("../../utils") | ||
var QueryGenerator = { | ||
addSchema: function(opts) { | ||
var tableName = undefined | ||
var schema = (!!opts && !!opts.options && !!opts.options.schema ? opts.options.schema : undefined) | ||
var schemaDelimiter = (!!opts && !!opts.options && !!opts.options.schemaDelimiter ? opts.options.schemaDelimiter : undefined) | ||
if (!!opts && !!opts.tableName) { | ||
tableName = opts.tableName | ||
} | ||
else if (typeof opts === "string") { | ||
tableName = opts | ||
} | ||
if (!schema || schema.toString().trim() === "") { | ||
return tableName | ||
} | ||
return QueryGenerator.addQuotes(schema + (!schemaDelimiter ? '.' : schemaDelimiter) + tableName) | ||
}, | ||
createSchema: function() { | ||
var query = "SHOW TABLES" | ||
return Utils._.template(query)({}) | ||
}, | ||
dropSchema: function() { | ||
var query = "SHOW TABLES" | ||
return Utils._.template(query)({}) | ||
}, | ||
showSchemasQuery: function() { | ||
return "SHOW TABLES" | ||
}, | ||
createTableQuery: function(tableName, attributes, options) { | ||
@@ -159,3 +192,3 @@ options = Utils._.extend({ | ||
if (options.where) { | ||
if (options.hasOwnProperty('where')) { | ||
options.where = this.getWhereConditions(options.where, tableName) | ||
@@ -162,0 +195,0 @@ query += " WHERE <%= where %>" |
@@ -11,2 +11,35 @@ var Utils = require("../../utils") | ||
addSchema: function(opts) { | ||
var tableName = undefined | ||
var schema = (!!opts.options && !!opts.options.schema ? opts.options.schema : undefined) | ||
var schemaDelimiter = (!!opts.options && !!opts.options.schemaDelimiter ? opts.options.schemaDelimiter : undefined) | ||
if (!!opts.tableName) { | ||
tableName = opts.tableName | ||
} | ||
else if (typeof opts === "string") { | ||
tableName = opts | ||
} | ||
if (!schema || schema.toString().trim() === "") { | ||
return tableName | ||
} | ||
return QueryGenerator.addQuotes(schema) + '.' + QueryGenerator.addQuotes(tableName) | ||
}, | ||
createSchema: function(schema) { | ||
var query = "CREATE SCHEMA <%= schema%>;" | ||
return Utils._.template(query)({schema: schema}) | ||
}, | ||
dropSchema: function(schema) { | ||
var query = "DROP SCHEMA <%= schema%> CASCADE;" | ||
return Utils._.template(query)({schema: schema}) | ||
}, | ||
showSchemasQuery: function() { | ||
return "SELECT schema_name FROM information_schema.schemata WHERE schema_name <> 'information_schema' AND schema_name != 'public' AND schema_name !~ E'^pg_';" | ||
}, | ||
createTableQuery: function(tableName, attributes, options) { | ||
@@ -228,3 +261,3 @@ options = Utils._.extend({ | ||
if(options.where) { | ||
if(options.hasOwnProperty('where')) { | ||
options.where = QueryGenerator.getWhereConditions(options.where) | ||
@@ -609,2 +642,17 @@ query += " WHERE <%= where %>" | ||
toHstore: function(text) { | ||
var obj = {} | ||
, pattern = '("\\\\.|[^"\\\\]*"\s*=|[^=]*)\s*=\s*>\s*("(?:\\.|[^"\\\\])*"|[^,]*)(?:\s*,\s*|$)' | ||
, rex = new RegExp(pattern,'g') | ||
, r = null | ||
while ((r = rex.exec(text)) !== null) { | ||
if (!!r[1] && !!r[2]) { | ||
obj[r[1].replace(/^"/, '').replace(/"$/, '')] = r[2].replace(/^"/, '').replace(/"$/, '') | ||
} | ||
} | ||
return obj | ||
}, | ||
padInt: function (i) { | ||
@@ -611,0 +659,0 @@ return (i < 10) ? '0' + i.toString() : i.toString() |
var Utils = require("../../utils") | ||
, AbstractQuery = require('../abstract/query') | ||
, DataTypes = require('../../data-types') | ||
@@ -112,3 +113,8 @@ module.exports = (function() { | ||
if (rows[0].hasOwnProperty(key)) { | ||
this.callee[key] = rows[0][key] | ||
var record = rows[0][key] | ||
if (!!this.callee.daoFactory.rawAttributes[key].type && !!this.callee.daoFactory.rawAttributes[key].type.type && this.callee.daoFactory.rawAttributes[key].type.type === DataTypes.HSTORE.type) { | ||
record = this.callee.daoFactory.daoFactoryManager.sequelize.queryInterface.QueryGenerator.toHstore(record) | ||
} | ||
this.callee[key] = record | ||
} | ||
@@ -121,3 +127,8 @@ } | ||
if (rows[0].hasOwnProperty(key)) { | ||
this.callee[key] = rows[0][key] | ||
var record = rows[0][key] | ||
if (!!this.callee.daoFactory.rawAttributes[key].type && !!this.callee.daoFactory.rawAttributes[key].type.type && this.callee.daoFactory.rawAttributes[key].type.type === DataTypes.HSTORE.type) { | ||
record = this.callee.daoFactory.daoFactoryManager.sequelize.queryInterface.QueryGenerator.toHstore(record) | ||
} | ||
this.callee[key] = record | ||
} | ||
@@ -124,0 +135,0 @@ } |
module.exports = (function() { | ||
var QueryGenerator = { | ||
addSchema: function(opts) { | ||
throwMethodUndefined('addSchema') | ||
}, | ||
/* | ||
@@ -4,0 +8,0 @@ Returns a query for creating a table. |
@@ -27,2 +27,39 @@ var Utils = require("../../utils") | ||
addQuotes: function(s, quoteChar) { | ||
return Utils.addTicks(s, quoteChar) | ||
}, | ||
addSchema: function(opts) { | ||
var tableName = undefined | ||
var schema = (!!opts && !!opts.options && !!opts.options.schema ? opts.options.schema : undefined) | ||
var schemaPrefix = (!!opts && !!opts.options && !!opts.options.schemaPrefix ? opts.options.schemaPrefix : undefined) | ||
if (!!opts && !!opts.tableName) { | ||
tableName = opts.tableName | ||
} | ||
else if (typeof opts === "string") { | ||
tableName = opts | ||
} | ||
if (!schema || schema.toString().trim() === "") { | ||
return tableName | ||
} | ||
return QueryGenerator.addQuotes(schema + (!schemaPrefix ? '.' : schemaPrefix) + tableName) | ||
}, | ||
createSchema: function() { | ||
var query = "SELECT name FROM sqlite_master WHERE type='table' and name!='sqlite_sequence';" | ||
return Utils._.template(query)({}) | ||
}, | ||
dropSchema: function() { | ||
var query = "SELECT name FROM sqlite_master WHERE type='table' and name!='sqlite_sequence';" | ||
return Utils._.template(query)({}) | ||
}, | ||
showSchemasQuery: function() { | ||
return "SELECT name FROM sqlite_master WHERE type='table' and name!='sqlite_sequence';" | ||
}, | ||
createTableQuery: function(tableName, attributes, options) { | ||
@@ -29,0 +66,0 @@ options = options || {} |
@@ -94,3 +94,6 @@ var Utils = require("../../utils") | ||
if (result.hasOwnProperty(name) && (metaData.columnTypes[name] === 'DATETIME')) { | ||
result[name] = new Date(result[name]+'Z'); // Z means UTC | ||
var val = result[name]; | ||
if(val !== null) { | ||
result[name] = new Date(val+'Z'); // Z means UTC | ||
} | ||
} | ||
@@ -97,0 +100,0 @@ } |
@@ -1,3 +0,4 @@ | ||
var util = require("util") | ||
, EventEmitter = require("events").EventEmitter | ||
var util = require("util") | ||
, EventEmitter = require("events").EventEmitter | ||
, proxyEventKeys = ['success', 'error', 'sql'] | ||
@@ -11,9 +12,8 @@ module.exports = (function() { | ||
CustomEventEmitter.prototype.run = function() { | ||
var self = this | ||
// delay the function call and return the emitter | ||
setTimeout(function(){ | ||
self.fct.call(self, self) | ||
}, 1) | ||
process.nextTick(function() { | ||
if (this.fct) { | ||
this.fct.call(this, this) | ||
} | ||
}.bind(this)) | ||
return this | ||
@@ -34,3 +34,3 @@ } | ||
this.on('error', fct) | ||
return this | ||
return this; | ||
} | ||
@@ -46,4 +46,12 @@ | ||
CustomEventEmitter.prototype.proxy = function(emitter) { | ||
proxyEventKeys.forEach(function (eventKey) { | ||
this.on(eventKey, function (result) { | ||
emitter.emit(eventKey, result) | ||
}) | ||
}.bind(this)) | ||
} | ||
return CustomEventEmitter | ||
return CustomEventEmitter; | ||
})() |
@@ -15,3 +15,4 @@ const fs = require("fs") | ||
to: null, | ||
logging: console.log | ||
logging: console.log, | ||
filesFilter: /\.js$/ | ||
}, options || {}) | ||
@@ -100,3 +101,3 @@ | ||
var migrationFiles = fs.readdirSync(this.options.path).filter(function(file) { | ||
return /\.js$/.test(file) | ||
return self.options.filesFilter.test(file) | ||
}) | ||
@@ -103,0 +104,0 @@ |
@@ -13,2 +13,54 @@ var Utils = require('./utils') | ||
QueryInterface.prototype.createSchema = function(schema) { | ||
var sql = this.QueryGenerator.createSchema(schema) | ||
return queryAndEmit.call(this, sql, 'createSchema') | ||
} | ||
QueryInterface.prototype.dropSchema = function(schema) { | ||
var sql = this.QueryGenerator.dropSchema(schema) | ||
return queryAndEmit.call(this, sql, 'dropSchema') | ||
} | ||
QueryInterface.prototype.dropAllSchemas = function() { | ||
var self = this | ||
return new Utils.CustomEventEmitter(function(emitter) { | ||
var chainer = new Utils.QueryChainer() | ||
self.showAllSchemas().success(function(schemaNames) { | ||
schemaNames.forEach(function(schemaName) { | ||
chainer.add(self.dropSchema(schemaName)) | ||
}) | ||
chainer | ||
.run() | ||
.success(function() { | ||
self.emit('dropAllSchemas', null) | ||
emitter.emit('success', null) | ||
}) | ||
.error(function(err) { | ||
self.emit('dropAllSchemas', err) | ||
emitter.emit('error', err) | ||
}) | ||
}).error(function(err) { | ||
self.emit('dropAllSchemas', err) | ||
emitter.emit('error', err) | ||
}) | ||
}).run() | ||
} | ||
QueryInterface.prototype.showAllSchemas = function() { | ||
var self = this | ||
return new Utils.CustomEventEmitter(function(emitter) { | ||
var showSchemasSql = self.QueryGenerator.showSchemasQuery() | ||
self.sequelize.query(showSchemasSql, null, { raw: true }).success(function(schemaNames) { | ||
self.emit('showAllSchemas', null) | ||
emitter.emit('success', Utils._.flatten(Utils._.map(schemaNames, function(value){ return value.schema_name }))) | ||
}).error(function(err) { | ||
self.emit('showAllSchemas', err) | ||
emitter.emit('error', err) | ||
}) | ||
}).run() | ||
} | ||
QueryInterface.prototype.createTable = function(tableName, attributes, options) { | ||
@@ -15,0 +67,0 @@ var attributeHashes = {} |
@@ -1,2 +0,3 @@ | ||
var Utils = require("./utils") | ||
var url = require("url") | ||
, Utils = require("./utils") | ||
, DAOFactory = require("./dao-factory") | ||
@@ -46,2 +47,22 @@ , DataTypes = require('./data-types') | ||
var Sequelize = function(database, username, password, options) { | ||
var urlParts | ||
options = options || {} | ||
if (arguments.length === 1) { | ||
urlParts = url.parse(arguments[0]) | ||
database = urlParts.path.replace(/^\//, '') | ||
dialect = urlParts.protocol | ||
options.dialect = urlParts.protocol.replace(/:$/, '') | ||
options.host = urlParts.hostname | ||
if (urlParts.port) { | ||
options.port = urlParts.port | ||
} | ||
if (urlParts.auth) { | ||
username = urlParts.auth.split(':')[0] | ||
password = urlParts.auth.split(':')[1] | ||
} | ||
} | ||
this.options = Utils._.extend({ | ||
@@ -134,2 +155,12 @@ dialect: 'mysql', | ||
// If you don't specify a valid data type lets help you debug it | ||
Utils._.each(attributes, function(dataType, name){ | ||
if (Utils.isHash(dataType)) { | ||
dataType = dataType.type | ||
} | ||
if (dataType === undefined) { | ||
throw new Error('Unrecognized data type for field '+ name) | ||
} | ||
}) | ||
if (globalOptions.define) { | ||
@@ -194,2 +225,34 @@ options = Utils._.extend({}, globalOptions.define, options) | ||
Sequelize.prototype.createSchema = function(schema) { | ||
var chainer = new Utils.QueryChainer() | ||
chainer.add(this.getQueryInterface().createSchema(schema)) | ||
return chainer.run() | ||
} | ||
Sequelize.prototype.showAllSchemas = function() { | ||
var chainer = new Utils.QueryChainer() | ||
chainer.add(this.getQueryInterface().showAllSchemas()) | ||
return chainer.run() | ||
} | ||
Sequelize.prototype.dropSchema = function(schema) { | ||
var chainer = new Utils.QueryChainer() | ||
chainer.add(this.getQueryInterface().dropSchema(schema)) | ||
return chainer.run() | ||
} | ||
Sequelize.prototype.dropAllSchemas = function() { | ||
var self = this | ||
var chainer = new Utils.QueryChainer() | ||
chainer.add(self.getQueryInterface().dropAllSchemas()) | ||
return chainer.run() | ||
} | ||
Sequelize.prototype.sync = function(options) { | ||
@@ -196,0 +259,0 @@ options = options || {} |
{ | ||
"name": "sequelize", | ||
"description": "Multi dialect ORM for Node.JS", | ||
"version": "1.6.0", | ||
"version": "1.7.0-alpha1", | ||
"author": "Sascha Depold <sascha@depold.com>", | ||
@@ -42,3 +42,3 @@ "contributors": [ | ||
"devDependencies": { | ||
"jasmine-node": "1.0.17", | ||
"jasmine-node": "1.5.0", | ||
"sqlite3": "~2.1.5", | ||
@@ -60,9 +60,9 @@ "mysql": "~2.0.0-alpha7", | ||
"test": "npm run test-jasmine && npm run test-buster", | ||
"test-jasmine": "./node_modules/.bin/jasmine-node spec-jasmine/", | ||
"test-jasmine": "jasmine-node spec-jasmine/", | ||
"test-buster": "npm run test-buster-mysql && npm run test-buster-postgres && npm run test-buster-postgres-native && npm run test-buster-sqlite", | ||
"test-buster-travis": "./node_modules/.bin/buster-test", | ||
"test-buster-mysql": "DIALECT=mysql ./node_modules/.bin/buster-test", | ||
"test-buster-postgres": "DIALECT=postgres ./node_modules/.bin/buster-test", | ||
"test-buster-postgres-native": "DIALECT=postgres-native ./node_modules/.bin/buster-test", | ||
"test-buster-sqlite": "DIALECT=sqlite ./node_modules/.bin/buster-test", | ||
"test-buster-travis": "buster-test", | ||
"test-buster-mysql": "DIALECT=mysql buster-test", | ||
"test-buster-postgres": "DIALECT=postgres buster-test", | ||
"test-buster-postgres-native": "DIALECT=postgres-native buster-test", | ||
"test-buster-sqlite": "DIALECT=sqlite buster-test", | ||
"docs": "node_modules/.bin/yuidoc . -o docs" | ||
@@ -69,0 +69,0 @@ }, |
@@ -5,2 +5,5 @@ # Sequelize # | ||
<a href="http://flattr.com/thing/1259407/Sequelize" target="_blank"> | ||
<img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a> | ||
## Important Notes ## | ||
@@ -14,2 +17,3 @@ | ||
## Blogposts/Changes ## | ||
- [v1.6.0](http://blog.sequelizejs.com/post/46949108134/v1-6-0-eager-loading-support-for-enums-decimals-and) Eager loading, support for enums, decimals and bigint, performance improvements … | ||
- [v1.4.1](http://blog.sequelizejs.com/post/24403298792/changes-in-sequelize-1-4-1): deprecation of node < 0.6, logging customization, ... | ||
@@ -76,2 +80,3 @@ - [v1.4.0](http://blog.sequelizejs.com/post/24345409723/changes-in-sequelize-1-4-0): postgresql, connection pooling, ... | ||
## Collaboration 2.0 ## | ||
@@ -239,2 +244,2 @@ | ||
[![Build Status](https://secure.travis-ci.org/sdepold/sequelize.png)](http://travis-ci.org/sdepold/sequelize) | ||
[![Build Status](https://secure.travis-ci.org/sequelize/sequelize.png)](http://travis-ci.org/sequelize/sequelize) |
var config = require("../config/config") | ||
, Sequelize = require("../../index") | ||
, sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { logging: false }) | ||
, sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { pool: config.mysql.pool, logging: false, host: config.mysql.host, port: config.mysql.port }) | ||
, Helpers = new (require("../config/helpers"))(sequelize) | ||
@@ -5,0 +5,0 @@ |
var config = require("../config/config") | ||
, Sequelize = require("../../index") | ||
, sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { logging: false }) | ||
, sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { pool: config.mysql.pool, logging: false, host: config.mysql.host, port: config.mysql.port }) | ||
, Helpers = new (require("../config/helpers"))(sequelize) | ||
@@ -13,3 +13,3 @@ | ||
var setup = function() { | ||
sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { logging: false }) | ||
sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { pool: config.mysql.pool, logging: false, host: config.mysql.host, port: config.mysql.port }) | ||
Helpers = new (require("../config/helpers"))(sequelize) | ||
@@ -16,0 +16,0 @@ |
var config = require("../config/config") | ||
, Sequelize = require("../../index") | ||
, sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { logging: false }) | ||
, sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { pool: config.mysql.pool, logging: false, host: config.mysql.host, port: config.mysql.port }) | ||
, Helpers = new (require("../config/helpers"))(sequelize) | ||
@@ -5,0 +5,0 @@ |
@@ -16,3 +16,4 @@ var config = require("./config/config") | ||
dialect: dialect, | ||
port: config[dialect].port | ||
port: config[dialect].port, | ||
host: config[dialect].host | ||
} | ||
@@ -19,0 +20,0 @@ ) |
var config = require("../config/config") | ||
, Sequelize = require("../../index") | ||
, sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { pool: config.mysql.pool, logging: false }) | ||
, sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { pool: config.mysql.pool, logging: false, host: config.mysql.host, port: config.mysql.port }) | ||
, Helpers = new (require("../config/helpers"))(sequelize) | ||
@@ -5,0 +5,0 @@ |
var config = require("../config/config") | ||
, Sequelize = require("../../index") | ||
, sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { pool: config.mysql.pool, logging: false }) | ||
, sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { pool: config.mysql.pool, logging: false, host: config.mysql.host, port: config.mysql.port }) | ||
, Helpers = new (require("../config/helpers"))(sequelize) | ||
@@ -5,0 +5,0 @@ |
var config = require("../config/config") | ||
, Sequelize = require("../../index") | ||
, sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { pool: config.mysql.pool, logging: false }) | ||
, sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { pool: config.mysql.pool, logging: false, host: config.mysql.host, port: config.mysql.port }) | ||
, Helpers = new (require("../config/helpers"))(sequelize) | ||
@@ -5,0 +5,0 @@ |
var config = require("../config/config") | ||
, Sequelize = require("../../index") | ||
, sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { pool: config.mysql.pool, logging: false }) | ||
, sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { pool: config.mysql.pool, logging: false, host: config.mysql.host, port: config.mysql.port }) | ||
, Helpers = new (require("../config/helpers"))(sequelize) | ||
@@ -5,0 +5,0 @@ |
var config = require("../config/config") | ||
, Sequelize = require("../../index") | ||
, sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { pool: config.mysql.pool, logging: false }) | ||
, sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, { pool: config.mysql.pool, logging: false, host: config.mysql.host, port: config.mysql.port }) | ||
, Helpers = new (require("../config/helpers"))(sequelize) | ||
@@ -5,0 +5,0 @@ , QueryGenerator = require("../../lib/dialects/mysql/query-generator") |
@@ -11,3 +11,13 @@ var config = require("./config/config") | ||
var setup = function(options) { | ||
options = options || {logging: false} | ||
options = options || {} | ||
if (!options.hasOwnProperty('pool')) | ||
options.pool = config.mysql.pool | ||
if (!options.hasOwnProperty('logging')) | ||
options.logging = false | ||
if (!options.hasOwnProperty('host')) | ||
options.host = config.mysql.host | ||
if (!options.hasOwnProperty('port')) | ||
options.port = config.mysql.port | ||
sequelize = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, options) | ||
@@ -14,0 +24,0 @@ Helpers = new (require("./config/helpers"))(sequelize) |
@@ -5,2 +5,3 @@ if(typeof require === 'function') { | ||
, Helpers = require('./buster-helpers') | ||
, _ = require('underscore') | ||
, dialect = Helpers.getTestDialect() | ||
@@ -44,3 +45,3 @@ } | ||
var User2 = this.sequelize.define('SuperUser', {}, { freezeTableName: false }) | ||
var User2 = this.sequelize.define('SuperUser', {}, { freezeTableName: false }) | ||
var factorySize2 = this.sequelize.daoFactoryManager.all.length | ||
@@ -220,2 +221,8 @@ | ||
}.bind(this), 'Unrecognized data type for field activity_date') | ||
Helpers.assertException(function() { | ||
this.sequelize.define('UserBadDataType', { | ||
activity_date: {type: Sequelize.DATe} | ||
}) | ||
}.bind(this), 'Unrecognized data type for field activity_date') | ||
}) | ||
@@ -492,2 +499,27 @@ | ||
it('always honors ZERO as primary key', function(_done) { | ||
var permutations = [ | ||
0, | ||
'0', | ||
{where: {id: 0}}, | ||
{where: {id: '0'}} | ||
] | ||
, done = _.after(2 * permutations.length, _done); | ||
this.User.create({name: 'jack'}).success(function (jack) { | ||
this.User.create({name: 'jill'}).success(function (jill) { | ||
permutations.forEach(function(perm) { | ||
this.User.find(perm).done(function(err, user) { | ||
expect(err).toBeNull(); | ||
expect(user).toBeNull(); | ||
done(); | ||
}).on('sql', function(s) { | ||
expect(s.indexOf(0)).not.toEqual(-1); | ||
done(); | ||
}) | ||
}.bind(this)) | ||
}.bind(this)) | ||
}.bind(this)) | ||
}) | ||
describe('eager loading', function() { | ||
@@ -1057,2 +1089,91 @@ before(function() { | ||
}) //- describe: max | ||
describe('schematic support', function() { | ||
before(function(done){ | ||
var self = this; | ||
this.UserPublic = this.sequelize.define('UserPublic', { | ||
age: Sequelize.INTEGER | ||
}) | ||
this.UserSpecial = this.sequelize.define('UserSpecial', { | ||
age: Sequelize.INTEGER | ||
}) | ||
self.sequelize.dropAllSchemas().success(function(){ | ||
self.sequelize.createSchema('schema_test').success(function(){ | ||
self.sequelize.createSchema('special').success(function(){ | ||
self.UserSpecial.schema('special').sync({force: true}).success(function(UserSpecialSync){ | ||
self.UserSpecialSync = UserSpecialSync; | ||
done() | ||
}) | ||
}) | ||
}) | ||
}) | ||
}) | ||
it("should be able to list schemas", function(done){ | ||
this.sequelize.showAllSchemas().success(function(schemas){ | ||
expect(schemas).toBeDefined() | ||
expect(schemas[0]).toBeArray() | ||
expect(schemas[0].length).toEqual(2) | ||
done() | ||
}) | ||
}) | ||
if (dialect === "mysql") { | ||
it("should take schemaDelimiter into account if applicable", function(done){ | ||
var UserSpecialUnderscore = this.sequelize.define('UserSpecialUnderscore', {age: Sequelize.INTEGER}, {schema: 'hello', schemaDelimiter: '_'}) | ||
var UserSpecialDblUnderscore = this.sequelize.define('UserSpecialDblUnderscore', {age: Sequelize.INTEGER}) | ||
UserSpecialUnderscore.sync({force: true}).success(function(User){ | ||
UserSpecialDblUnderscore.schema('hello', '__').sync({force: true}).success(function(DblUser){ | ||
DblUser.create({age: 3}).on('sql', function(dblSql){ | ||
User.create({age: 3}).on('sql', function(sql){ | ||
expect(dblSql).toBeDefined() | ||
expect(dblSql.indexOf('INSERT INTO `hello__UserSpecialDblUnderscores`')).toBeGreaterThan(-1) | ||
expect(sql).toBeDefined() | ||
expect(sql.indexOf('INSERT INTO `hello_UserSpecialUnderscores`')).toBeGreaterThan(-1) | ||
done() | ||
}) | ||
}) | ||
}) | ||
}) | ||
}) | ||
} | ||
it("should be able to create and update records under any valid schematic", function(done){ | ||
var self = this | ||
self.UserPublic.sync({ force: true }).success(function(UserPublicSync){ | ||
UserPublicSync.create({age: 3}).on('sql', function(UserPublic){ | ||
self.UserSpecialSync.schema('special').create({age: 3}) | ||
.on('sql', function(UserSpecial){ | ||
expect(UserSpecial).toBeDefined() | ||
expect(UserPublic).toBeDefined() | ||
if (dialect === "postgres") { | ||
expect(self.UserSpecialSync.getTableName()).toEqual('"special"."UserSpecials"'); | ||
expect(UserSpecial.indexOf('INSERT INTO "special"."UserSpecials"')).toBeGreaterThan(-1) | ||
expect(UserPublic.indexOf('INSERT INTO "UserPublics"')).toBeGreaterThan(-1) | ||
} else { | ||
expect(self.UserSpecialSync.getTableName()).toEqual('`special.UserSpecials`'); | ||
expect(UserSpecial.indexOf('INSERT INTO `special.UserSpecials`')).toBeGreaterThan(-1) | ||
expect(UserPublic.indexOf('INSERT INTO `UserPublics`')).toBeGreaterThan(-1) | ||
} | ||
}) | ||
.success(function(UserSpecial){ | ||
UserSpecial.updateAttributes({age: 5}) | ||
.on('sql', function(user){ | ||
expect(user).toBeDefined() | ||
if (dialect === "postgres") { | ||
expect(user.indexOf('UPDATE "special"."UserSpecials"')).toBeGreaterThan(-1) | ||
} else { | ||
expect(user.indexOf('UPDATE `special.UserSpecials`')).toBeGreaterThan(-1) | ||
} | ||
done() | ||
}) | ||
}.bind(this)) | ||
}.bind(this)) | ||
}.bind(this)) | ||
}) | ||
}) | ||
}) |
@@ -22,3 +22,7 @@ if (typeof require === 'function') { | ||
aNumber: { type: DataTypes.INTEGER }, | ||
bNumber: { type: DataTypes.INTEGER } | ||
bNumber: { type: DataTypes.INTEGER }, | ||
dateAllowNullTrue: { | ||
type: DataTypes.DATE, | ||
allowNull: true | ||
} | ||
}) | ||
@@ -324,2 +328,25 @@ | ||
}) | ||
describe('allowNull date', function() { | ||
it('should be just "null" and not Date with Invalid Date', function(done) { | ||
var self = this; | ||
this.User.build({ username: 'a user'}).save().success(function() { | ||
self.User.find({where: {username: 'a user'}}).success(function(user) { | ||
expect(user.dateAllowNullTrue).toBe(null) | ||
done() | ||
}) | ||
}) | ||
}) | ||
it('should be the same valid date when saving the date', function(done) { | ||
var self = this; | ||
var date = new Date(); | ||
this.User.build({ username: 'a user', dateAllowNullTrue: date}).save().success(function() { | ||
self.User.find({where: {username: 'a user'}}).success(function(user) { | ||
expect(user.dateAllowNullTrue.toString()).toEqual(date.toString()) | ||
done() | ||
}) | ||
}) | ||
}) | ||
}) | ||
}) | ||
@@ -326,0 +353,0 @@ |
@@ -21,3 +21,4 @@ if(typeof require === 'function') { | ||
username: DataTypes.STRING, | ||
email: {type: DataTypes.ARRAY(DataTypes.TEXT)} | ||
email: {type: DataTypes.ARRAY(DataTypes.TEXT)}, | ||
document: {type: DataTypes.HSTORE, defaultValue: 'default=>value'} | ||
}) | ||
@@ -38,4 +39,4 @@ }, | ||
.success(function(oldUser) { | ||
expect(oldUser.email).toEqual(['foo@bar.com', 'bar@baz.com']); | ||
done(); | ||
expect(oldUser.email).toEqual(['foo@bar.com', 'bar@baz.com']) | ||
done() | ||
}) | ||
@@ -46,4 +47,25 @@ .error(function(err) { | ||
}) | ||
it("should handle hstore correctly", function(done) { | ||
var self = this | ||
this.User | ||
.create({ username: 'user', email: ['foo@bar.com'], document: {hello: 'world'}}) | ||
.success(function(newUser) { | ||
expect(newUser.document).toEqual({hello: 'world'}) | ||
// Check to see if updating an hstore field works | ||
newUser.updateAttributes({document: {should: 'update', to: 'this', first: 'place'}}).success(function(oldUser){ | ||
// Postgres always returns keys in alphabetical order (ascending) | ||
expect(oldUser.document).toEqual({first: 'place', should: 'update', to: 'this'}) | ||
// Check to see if the default value for an hstore field works | ||
self.User.create({ username: 'user2', email: ['bar@baz.com']}).success(function(defaultUser){ | ||
expect(defaultUser.document).toEqual({default: 'value'}) | ||
done() | ||
}) | ||
}) | ||
}) | ||
.error(console.log) | ||
}) | ||
}) | ||
}) | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
924503
142
13196
242
2
30