sequelize
Advanced tools
Comparing version 1.5.0-beta to 1.5.0-beta-2
# v1.5.0 # | ||
- [REFACTORING] use underscore functions for Utils.isHash (thanks to Mick-Hansen) | ||
- [REFACTORING] use underscore functions for Utils.isHash (thanks to Mick-Hansen/innofluence) | ||
- [REFACTORING] removed the 'failure' event and replaced it with 'error' | ||
- [BUG] fixed booleans for sqlite (thanks to vlmonk) | ||
- [BUG] obsolete reference attribute for many-to-many associations are removed correctly | ||
- [BUG] associations can be cleared via passing null to the set method | ||
- [BUG] "fixed" quota handling (thanks to dgf) | ||
- [FEATURE] added possibility to set protocol and to remove port from postgresql connection uri (thanks to danielschwartz) | ||
- [FEATURE] added possibility to not use a junction table for many-to-many associations on the same table (thanks to innofluence) | ||
- [FEATURE] results of the `import` method is now cached (thanks to janmeier) | ||
- [FEATURE] added possibility to check if a specific object or a whole bunch of objects is currently associated with another object (thanks to janmeier) | ||
- [FEATURE] added possibility to globally disable adding of NULL values to sql queries (thanks to janmeier) | ||
- [FEATURE] Model.create can now also be used to specify values for mass assignment (thanks to janmeier) | ||
- [FEATURE] added possibility to not use a junction table for many-to-many associations on the same table (thanks to janmeier/innofluence) | ||
- [FEATURE] results of the `import` method is now cached (thanks to janmeier/innofluence) | ||
- [FEATURE] added possibility to check if a specific object or a whole bunch of objects is currently associated with another object (thanks to janmeier/innofluence) | ||
- [FEATURE] added possibility to globally disable adding of NULL values to sql queries (thanks to janmeier/innofluence) | ||
- [FEATURE] Model.create can now also be used to specify values for mass assignment (thanks to janmeier/innofluence) | ||
- [FEATURE] QueryChainer will now provide the results of the added emitters in the order the emitters have been added (thanks to LaurentZuijdwijk and me ;)) | ||
- [FEATURE] QueryChainer can now be initialized with serial items | ||
- [FEATURE] node 0.8 compatibility | ||
- [FEATURE] added options to hasMany getters (thanks to janmeier/innofluence) | ||
- [FEATURE] pooling option is now correctly passed to postgres (thanks to megshark) | ||
@@ -16,0 +20,0 @@ # v1.4.1 # |
@@ -9,7 +9,7 @@ var Utils = require('./../utils') | ||
HasManyDoubleLinked.prototype.injectGetter = function() { | ||
var self = this | ||
HasManyDoubleLinked.prototype.injectGetter = function(options) { | ||
var self = this, _options = options | ||
var customEventEmitter = new Utils.CustomEventEmitter(function() { | ||
var where = {} | ||
var where = {}, options = _options || {}; | ||
@@ -23,3 +23,15 @@ //fully qualify | ||
where[self.__factory.connectorDAO.tableName+"."+foreignKey] = {join: self.__factory.target.tableName+".id"} | ||
self.__factory.target.findAllJoin(self.__factory.connectorDAO.tableName, {where: where}) | ||
if (options.where) { | ||
Utils._.each(options.where, function(value, index) { | ||
delete options.where[index]; | ||
options.where[self.__factory.target.tableName+"."+index] = value; | ||
}); | ||
options.where = options.where ? Utils.merge(options.where, where) : where | ||
} else { | ||
options.where = where; | ||
} | ||
self.__factory.target.findAllJoin(self.__factory.connectorDAO.tableName, options) | ||
.on('success', function(objects) { customEventEmitter.emit('success', objects) }) | ||
@@ -26,0 +38,0 @@ .on('error', function(err){ customEventEmitter.emit('error', err) }) |
@@ -9,7 +9,9 @@ var Utils = require('./../utils') | ||
HasManySingleLinked.prototype.injectGetter = function() { | ||
var where = {} | ||
HasManySingleLinked.prototype.injectGetter = function(options) { | ||
var where = {}, options = options || {} | ||
where[this.__factory.identifier] = this.instance.id | ||
return this.__factory.target.findAll({where: where}) | ||
options.where = options.where ? Utils.merge(options.where, where) : where | ||
return this.__factory.target.findAll(options) | ||
} | ||
@@ -19,3 +21,3 @@ | ||
var self = this | ||
, options = this.options || {} | ||
, options = this.__factory.options | ||
@@ -22,0 +24,0 @@ // clear the old associations |
@@ -75,5 +75,5 @@ var Utils = require("./../utils") | ||
obj[this.accessors.get] = function() { | ||
obj[this.accessors.get] = function(options) { | ||
var Class = self.connectorDAO ? HasManyMultiLinked : HasManySingleLinked | ||
return new Class(self, this).injectGetter() | ||
return new Class(self, this).injectGetter(options) | ||
} | ||
@@ -80,0 +80,0 @@ |
var Query = require("./query") | ||
, Utils = require("../../utils") | ||
, pg = require("pg") | ||
, without = function(arr, elem) { return arr.filter(function(e) { return e != elem }) } | ||
@@ -10,2 +11,8 @@ | ||
this.config = config || {} | ||
this.pooling = (this.config.poolCfg != null && this.config.poolCfg.maxConnections > 0) | ||
// set pooling parameters if specified | ||
if (this.pooling) { | ||
pg.defaults.poolSize = this.config.poolCfg.maxConnections | ||
pg.defaults.poolIdleTimeout = this.config.poolCfg.maxIdleTime | ||
} | ||
this.disconnectTimeoutId = null | ||
@@ -48,8 +55,5 @@ this.pendingQueries = 0 | ||
var pg = require("pg") | ||
, uri = this.sequelize.getQueryInterface().QueryGenerator.databaseConnectionUri(this.config) | ||
var uri = this.sequelize.getQueryInterface().QueryGenerator.databaseConnectionUri(this.config) | ||
this.client = new pg.Client(uri) | ||
this.client.connect(function(err, client) { | ||
var connectCallback = function(err, client) { | ||
self.isConnecting = false | ||
@@ -65,3 +69,13 @@ if (!err && client) { | ||
} | ||
}) | ||
} | ||
if (this.pooling) { | ||
// acquire client from pool | ||
pg.connect(uri, connectCallback) | ||
} else { | ||
//create one-off client | ||
this.client = new pg.Client(uri) | ||
this.client.connect(connectCallback) | ||
} | ||
} | ||
@@ -68,0 +82,0 @@ |
@@ -241,6 +241,7 @@ var Utils = require('./utils') | ||
if(Array.isArray(sqlOrQueryParams)) | ||
if(Array.isArray(sqlOrQueryParams)) { | ||
query = self.sequelize.query.apply(self.sequelize, sqlOrQueryParams) | ||
else | ||
} else { | ||
query = self.sequelize.query(sqlOrQueryParams) | ||
} | ||
@@ -247,0 +248,0 @@ // append the query for better testing |
{ | ||
"name": "sequelize", | ||
"description": "Multi dialect ORM for Node.JS", | ||
"version": "1.5.0-beta", | ||
"version": "1.5.0-beta-2", | ||
"author": "Sascha Depold <sascha@depold.com>", | ||
@@ -18,2 +18,6 @@ "contributors": [ | ||
"email": "sky@skytrife.com" | ||
}, | ||
{ | ||
"name": "Jan Aagaard Meier (Innofluence)", | ||
"email": "jam@innofluence.com" | ||
} | ||
@@ -32,4 +36,4 @@ ], | ||
"devDependencies": { | ||
"jasmine-node": "1.0.22", | ||
"sqlite3": ">=2.0.0", | ||
"jasmine-node": "1.0.17", | ||
"sqlite3": "~2.1.5", | ||
"pg": "0.6.x", | ||
@@ -36,0 +40,0 @@ "buster": "~0.6.0" |
@@ -22,5 +22,6 @@ module.exports = { | ||
username: "postgres", | ||
port: 5432 | ||
port: 5432, | ||
pool: { maxConnections: 5, maxIdleTime: 30} | ||
} | ||
} | ||
if (typeof require === 'function') { | ||
const buster = require("buster") | ||
, Sequelize = require("../../index") | ||
, config = require("../config/config") | ||
, sequelize = new Sequelize(config.database, config.username, config.password, { | ||
logging: false | ||
}) | ||
, Helpers = require('../buster-helpers') | ||
, Sequelize = require('../../index') | ||
} | ||
@@ -14,10 +11,19 @@ | ||
describe('BelongsTo', function() { | ||
before(function(done) { | ||
var self = this | ||
Helpers.initTests({ | ||
beforeComplete: function(sequelize) { self.sequelize = sequelize }, | ||
onComplete: done | ||
}) | ||
}) | ||
describe('setAssociation', function() { | ||
it('clears the association if null is passed', function(done) { | ||
var User = sequelize.define('User', { username: Sequelize.STRING }) | ||
, Task = sequelize.define('Task', { title: Sequelize.STRING }) | ||
var User = this.sequelize.define('User', { username: Sequelize.STRING }) | ||
, Task = this.sequelize.define('Task', { title: Sequelize.STRING }) | ||
Task.belongsTo(User) | ||
sequelize.sync({ force: true }).success(function() { | ||
this.sequelize.sync({ force: true }).success(function() { | ||
User.create({ username: 'foo' }).success(function(user) { | ||
@@ -24,0 +30,0 @@ Task.create({ title: 'task' }).success(function(task) { |
if (typeof require === 'function') { | ||
const buster = require("buster") | ||
, Sequelize = require("../../index") | ||
, config = require("../config/config") | ||
, sequelize = new Sequelize(config.database, config.username, config.password, { | ||
logging: false | ||
}) | ||
, Helpers = require('../buster-helpers') | ||
, Sequelize = require('../../index') | ||
} | ||
@@ -17,9 +14,6 @@ | ||
sequelize.getQueryInterface() | ||
.dropAllTables() | ||
.success(function() { | ||
sequelize.daoFactoryManager.daos = [] | ||
done() | ||
}) | ||
.error(function(err) { console.log(err) }) | ||
Helpers.initTests({ | ||
beforeComplete: function(sequelize) { self.sequelize = sequelize }, | ||
onComplete: done | ||
}) | ||
}) | ||
@@ -30,10 +24,8 @@ | ||
before(function(done) { | ||
var self = this | ||
this.Article = this.sequelize.define('Article', { 'title': Sequelize.STRING }) | ||
this.Label = this.sequelize.define('Label', { 'text': Sequelize.STRING }) | ||
this.Article = sequelize.define('Article', { 'title': Sequelize.STRING }) | ||
this.Label = sequelize.define('Label', { 'text': Sequelize.STRING }) | ||
this.Article.hasMany(this.Label) | ||
sequelize.sync({ force: true }).success(done) | ||
this.sequelize.sync({ force: true }).success(done) | ||
}) | ||
@@ -91,10 +83,8 @@ | ||
before(function(done) { | ||
var self = this | ||
this.Article = this.sequelize.define('Article', { 'title': Sequelize.STRING }) | ||
this.Label = this.sequelize.define('Label', { 'text': Sequelize.STRING }) | ||
this.Article = sequelize.define('Article', { 'title': Sequelize.STRING }) | ||
this.Label = sequelize.define('Label', { 'text': Sequelize.STRING }) | ||
this.Article.hasMany(this.Label) | ||
sequelize.sync({ force: true }).success(done) | ||
this.sequelize.sync({ force: true }).success(done) | ||
}) | ||
@@ -143,8 +133,8 @@ | ||
it("clears associations when passing null to the set-method", function(done) { | ||
var User = sequelize.define('User', { username: Sequelize.STRING }) | ||
, Task = sequelize.define('Task', { title: Sequelize.STRING }) | ||
var User = this.sequelize.define('User', { username: Sequelize.STRING }) | ||
, Task = this.sequelize.define('Task', { title: Sequelize.STRING }) | ||
Task.hasMany(User) | ||
sequelize.sync({ force: true }).success(function() { | ||
this.sequelize.sync({ force: true }).success(function() { | ||
User.create({ username: 'foo' }).success(function(user) { | ||
@@ -169,8 +159,119 @@ Task.create({ title: 'task' }).success(function(task) { | ||
}) | ||
it("clears associations when passing null to the set-method with omitNull set to true", function(done) { | ||
this.sequelize.options.omitNull = true; | ||
var User = this.sequelize.define('User', { username: Sequelize.STRING }) | ||
, Task = this.sequelize.define('Task', { title: Sequelize.STRING }) | ||
Task.hasMany(User) | ||
this.sequelize.sync({ force: true }).success(function() { | ||
User.create({ username: 'foo' }).success(function(user) { | ||
Task.create({ title: 'task' }).success(function(task) { | ||
task.setUsers([ user ]).success(function() { | ||
task.getUsers().success(function(_users) { | ||
expect(_users.length).toEqual(1) | ||
task.setUsers(null).success(function() { | ||
task.getUsers().success(function(_users) { | ||
expect(_users.length).toEqual(0) | ||
done() | ||
}) | ||
}) | ||
}) | ||
}) | ||
}) | ||
}) | ||
}) | ||
}) | ||
describe("getting assocations with options", function() { | ||
before(function(done) { | ||
var self = this; | ||
this.User = this.sequelize.define('User', { username: Sequelize.STRING }) | ||
this.Task = this.sequelize.define('Task', { title: Sequelize.STRING, active: Sequelize.BOOLEAN }) | ||
this.User.hasMany(self.Task) | ||
this.sequelize.sync({ force: true }).done(function() { | ||
var chainer = new Sequelize.Utils.QueryChainer([ | ||
self.User.create({ username: 'John'}), | ||
self.Task.create({ title: 'Get rich', active: true}), | ||
self.Task.create({ title: 'Die trying', active: false}) | ||
]) | ||
chainer.run().success(function (results, john, task1, task2) { | ||
john.setTasks([task1, task2]).success(done) | ||
}) | ||
}) | ||
}) | ||
it("gets all associated objects when no options are passed", function(done) { | ||
this.User.find({where: {username: 'John'}}).success(function (john) { | ||
john.getTasks().success(function (tasks) { | ||
expect(tasks.length).toEqual(2) | ||
done(); | ||
}) | ||
}) | ||
}) | ||
it("only get objects that fullfil the options", function(done) { | ||
this.User.find({where: {username: 'John'}}).success(function (john) { | ||
john.getTasks({where: {active: true}, limit: 10, order: 'ID DESC'}).success(function (tasks) { | ||
expect(tasks.length).toEqual(1) | ||
done(); | ||
}) | ||
}) | ||
}) | ||
}) | ||
}) | ||
describe('(N:M)', function() { | ||
describe("getting assocations with options", function() { | ||
before(function(done) { | ||
var self = this; | ||
this.User = this.sequelize.define('User', { username: Sequelize.STRING }) | ||
this.Task = this.sequelize.define('Task', { title: Sequelize.STRING, active: Sequelize.BOOLEAN }) | ||
self.User.hasMany(self.Task) | ||
self.Task.hasMany(self.User) | ||
this.sequelize.sync({ force: true }).done(function() { | ||
var chainer = new Sequelize.Utils.QueryChainer([ | ||
self.User.create({ username: 'John'}), | ||
self.Task.create({ title: 'Get rich', active: true}), | ||
self.Task.create({ title: 'Die trying', active: false}) | ||
]) | ||
chainer.run().success(function (results, john, task1, task2) { | ||
john.setTasks([task1, task2]).success(done) | ||
}) | ||
}) | ||
}) | ||
it("gets all associated objects when no options are passed", function(done) { | ||
this.User.find({where: {username: 'John'}}).success(function (john) { | ||
john.getTasks().success(function (tasks) { | ||
expect(tasks.length).toEqual(2) | ||
done(); | ||
}) | ||
}) | ||
}) | ||
it("only get objects that fullfil the options", function(done) { | ||
this.User.find({where: {username: 'John'}}).success(function (john) { | ||
john.getTasks({where: {active: true}}).success(function (tasks) { | ||
expect(tasks.length).toEqual(1) | ||
done(); | ||
}) | ||
}) | ||
}) | ||
}) | ||
it("removes the reference id, which was added in the first place", function() { | ||
var User = sequelize.define('User', { username: Sequelize.STRING }) | ||
, Task = sequelize.define('Task', { title: Sequelize.STRING }) | ||
var User = this.sequelize.define('User', { username: Sequelize.STRING }) | ||
, Task = this.sequelize.define('Task', { title: Sequelize.STRING }) | ||
@@ -185,4 +286,4 @@ User.hasMany(Task) | ||
it("adds three items to the query chainer when calling sync", function() { | ||
var User = sequelize.define('User', { username: Sequelize.STRING }) | ||
, Task = sequelize.define('Task', { title: Sequelize.STRING }) | ||
var User = this.sequelize.define('User', { username: Sequelize.STRING }) | ||
, Task = this.sequelize.define('Task', { title: Sequelize.STRING }) | ||
@@ -196,3 +297,3 @@ User.hasMany(Task) | ||
sequelize.sync({ force: true }) | ||
this.sequelize.sync({ force: true }) | ||
expect(add).toHaveBeenCalledThrice() | ||
@@ -203,4 +304,4 @@ }) | ||
it("clears associations when passing null to the set-method", function(done) { | ||
var User = sequelize.define('User', { username: Sequelize.STRING }) | ||
, Task = sequelize.define('Task', { title: Sequelize.STRING }) | ||
var User = this.sequelize.define('User', { username: Sequelize.STRING }) | ||
, Task = this.sequelize.define('Task', { title: Sequelize.STRING }) | ||
@@ -210,3 +311,3 @@ User.hasMany(Task) | ||
sequelize.sync({ force: true }).success(function() { | ||
this.sequelize.sync({ force: true }).success(function() { | ||
User.create({ username: 'foo' }).success(function(user) { | ||
@@ -213,0 +314,0 @@ Task.create({ title: 'task' }).success(function(task) { |
if (typeof require === 'function') { | ||
const buster = require("buster") | ||
, Sequelize = require("../../index") | ||
, config = require("../config/config") | ||
, sequelize = new Sequelize(config.database, config.username, config.password, { | ||
logging: false | ||
}) | ||
, Helpers = require('../buster-helpers') | ||
} | ||
@@ -17,9 +14,6 @@ | ||
sequelize.getQueryInterface() | ||
.dropAllTables() | ||
.success(function() { | ||
sequelize.daoFactoryManager.daos = [] | ||
done() | ||
}) | ||
.error(function(err) { console.log(err) }) | ||
Helpers.initTests({ | ||
beforeComplete: function(sequelize) { self.sequelize = sequelize }, | ||
onComplete: done | ||
}) | ||
}) | ||
@@ -29,8 +23,8 @@ | ||
it('clears the association if null is passed', function(done) { | ||
var User = sequelize.define('User', { username: Sequelize.STRING }) | ||
, Task = sequelize.define('Task', { title: Sequelize.STRING }) | ||
var User = this.sequelize.define('User', { username: Sequelize.STRING }) | ||
, Task = this.sequelize.define('Task', { title: Sequelize.STRING }) | ||
User.hasOne(Task) | ||
sequelize.sync({ force: true }).success(function() { | ||
this.sequelize.sync({ force: true }).success(function() { | ||
User.create({ username: 'foo' }).success(function(user) { | ||
@@ -37,0 +31,0 @@ Task.create({ title: 'task' }).success(function(task) { |
@@ -6,3 +6,27 @@ module.exports = { | ||
host: '127.0.0.1', | ||
pool: { maxConnections: 5, maxIdleTime: 30000} | ||
pool: { maxConnections: 5, maxIdleTime: 30000}, | ||
rand: function() { | ||
return parseInt(Math.random() * 999) | ||
}, | ||
//make maxIdleTime small so that tests exit promptly | ||
mysql: { | ||
username: "root", | ||
password: null, | ||
database: 'sequelize_test', | ||
host: '127.0.0.1', | ||
port: 3306, | ||
pool: { maxConnections: 5, maxIdleTime: 30} | ||
}, | ||
sqlite: { | ||
}, | ||
postgres: { | ||
database: 'sequelize_test', | ||
username: "postgres", | ||
port: 5432, | ||
pool: { maxConnections: 5, maxIdleTime: 30} | ||
} | ||
} |
if(typeof require === 'function') { | ||
const buster = require("buster") | ||
, Sequelize = require("../index") | ||
, config = require("./config/config") | ||
, dialects = ['sqlite', 'mysql', 'postgres'] | ||
const buster = require("buster") | ||
, dialects = ['sqlite', 'mysql', 'postgres'] | ||
, Helpers = require('./buster-helpers') | ||
} | ||
@@ -15,23 +14,15 @@ | ||
this.sequelize = new Sequelize(config.database, config.username, config.password, { | ||
logging: false | ||
Helpers.initTests({ | ||
dialect: dialect, | ||
beforeComplete: function(sequelize, DataTypes) { | ||
self.sequelize = sequelize | ||
self.User = sequelize.define('User', { | ||
username: { type: DataTypes.STRING }, | ||
touchedAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW } | ||
}) | ||
}, | ||
onComplete: function(sequelize) { | ||
self.User.sync({ force: true }).success(done) | ||
} | ||
}) | ||
this.User = this.sequelize.define('User', { | ||
username: { type: Sequelize.STRING }, | ||
touchedAt: { type: Sequelize.DATE, defaultValue: Sequelize.NOW } | ||
}) | ||
self.sequelize | ||
.getQueryInterface() | ||
.dropAllTables() | ||
.success(function() { | ||
self.User | ||
.sync({ force: true }) | ||
.success(done) | ||
.error(function(err) { | ||
console.log(err) | ||
}) | ||
}) | ||
.error(function(err) { console.log(err) }) | ||
}) | ||
@@ -38,0 +29,0 @@ |
if(typeof require === 'function') { | ||
const buster = require("buster") | ||
, Sequelize = require("../../index") | ||
, config = require("../config/config") | ||
const buster = require("buster") | ||
, Helpers = require('../buster-helpers') | ||
} | ||
@@ -13,18 +12,15 @@ | ||
this.sequelize = new Sequelize(config.database, config.username, config.password, { | ||
logging: false, | ||
dialect: 'sqlite' | ||
}) | ||
Helpers.initTests({ | ||
dialect: 'sqlite', | ||
beforeComplete: function(sequelize, DataTypes) { | ||
self.sequelize = sequelize | ||
this.User = this.sequelize.define('User', { | ||
username: Sequelize.STRING | ||
self.User = sequelize.define('User', { | ||
username: DataTypes.STRING | ||
}) | ||
}, | ||
onComplete: function(sequelize) { | ||
self.User.sync({ force: true }).success(done) | ||
} | ||
}) | ||
self.sequelize | ||
.getQueryInterface() | ||
.dropAllTables() | ||
.success(function() { | ||
self.User.sync({ force: true }).success(done) | ||
}) | ||
.error(function(err) { console.log(err) }) | ||
}) | ||
@@ -31,0 +27,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
582616
142
7969
28