不要怂,就是干,撸起袖子干!

Commit d4e2cd22 by Sascha Depold

transactions for find / findAll

1 parent 9248772e
......@@ -352,7 +352,7 @@ module.exports = (function() {
return this.QueryInterface.select(this, this.tableName, options, Utils._.defaults({
type: 'SELECT',
hasJoin: hasJoin
}, queryOptions))
}, queryOptions, { transaction: options.transaction }))
}
//right now, the caller (has-many-double-linked) is in charge of the where clause
......@@ -589,6 +589,8 @@ module.exports = (function() {
return new Utils.CustomEventEmitter(function (emitter) {
self.find({
where: params
}, {
transaction: options.transaction
}).success(function (instance) {
if (instance === null) {
for (var attrname in defaults) {
......
......@@ -406,7 +406,7 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () {
})
describe('findOrCreate', function () {
it("Returns instance if already existent. Single find field.", function(done) {
it("returns instance if already existent. Single find field.", function(done) {
var self = this,
data = {
username: 'Username'
......@@ -461,14 +461,20 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () {
it("supports transactions", function(done) {
var self = this
this.sequelize.transaction(function(t) {
self.User.findOrCreate({ username: 'Username' }, { data: 'some data' }, { transaction: t }).complete(function(err) {
Support.prepareTransactionTest(dialect, this.sequelize, function(sequelize) {
var User = sequelize.define('user_with_transaction', { username: Sequelize.STRING, data: Sequelize.STRING })
User
.sync({ force: true })
.success(function() {
sequelize.transaction(function(t) {
User.findOrCreate({ username: 'Username' }, { data: 'some data' }, { transaction: t }).complete(function(err) {
expect(err).to.be.null
self.User.count().success(function(count) {
User.count().success(function(count) {
expect(count).to.equal(0)
t.commit().success(function() {
self.User.count().success(function(count) {
User.count().success(function(count) {
expect(count).to.equal(1)
done()
})
......@@ -478,17 +484,23 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () {
})
})
})
})
})
describe('create', function() {
it('supports transactions', function(done) {
var self = this
this.sequelize.transaction(function(t) {
self.User.create({ username: 'user' }, { transaction: t}).success(function() {
self.User.count().success(function(count) {
Support.prepareTransactionTest(dialect, this.sequelize, function(sequelize) {
var User = sequelize.define('user_with_transaction', { username: Sequelize.STRING })
User.sync({ force: true }).success(function() {
sequelize.transaction(function(t) {
User.create({ username: 'user' }, { transaction: t}).success(function() {
User.count().success(function(count) {
expect(count).to.equal(0)
t.commit().success(function() {
self.User.count().success(function(count) {
User.count().success(function(count) {
expect(count).to.equal(1)
done()
})
......@@ -497,6 +509,8 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () {
})
})
})
})
})
it('is possible to use casting when creating an instance', function (done) {
var self = this
......@@ -1842,6 +1856,29 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () {
})
describe('find', function() {
it('supports transactions', function(done) {
Support.prepareTransactionTest(dialect, this.sequelize, function(sequelize) {
var User = sequelize.define('User', { username: Sequelize.STRING })
User.sync({ force: true }).success(function() {
sequelize.transaction(function(t) {
User.create({ username: 'foo' }, { transaction: t }).success(function() {
User.find({ username: 'foo' }).success(function(user1) {
User.find({ username: 'foo' }, { transaction: t }).success(function(user2) {
expect(user1).to.be.null
expect(user2).to.not.be.null
t.rollback().success(function() {
done()
})
})
})
})
})
})
})
})
describe('general / basic function', function() {
beforeEach(function(done) {
var self = this
......@@ -2658,6 +2695,32 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () {
})
describe('findAll', function() {
it('supports transactions', function(done) {
Support.prepareTransactionTest(dialect, this.sequelize, function(sequelize) {
var User = sequelize.define('User', { username: Sequelize.STRING })
User.sync({ force: true }).success(function() {
sequelize.transaction(function(t) {
User.create({ username: 'foo' }, { transaction: t }).success(function() {
User.findAll({ username: 'foo' }).success(function(users1) {
User.findAll({ transaction: t }).success(function(users2) {
User.findAll({ username: 'foo' }, { transaction: t }).success(function(users3) {
expect(users1.length).to.equal(0)
expect(users2.length).to.equal(1)
expect(users3.length).to.equal(1)
t.rollback().success(function() {
done()
})
})
})
})
})
})
})
})
})
describe('eager loading', function() {
describe('belongsTo', function() {
beforeEach(function(done) {
......
......@@ -498,37 +498,39 @@ describe(Support.getTestDialectTeaser("Sequelize"), function () {
})
describe('transaction', function() {
if (dialect === 'sqlite') {
beforeEach(function() {
this.sequelize.options.storage = path.join(__dirname, 'tmp', 'db.sqlite')
this.sequelize = new Sequelize(this.sequelize.config.datase, null, null, this.sequelize.options)
beforeEach(function(done) {
var self = this
Support.prepareTransactionTest(dialect, this.sequelize, function(sequelize) {
self.sequelizeWithTransaction = sequelize
done()
})
})
}
it('is a transaction method available', function() {
expect(Support.Sequelize).to.respondTo('transaction')
})
it('passes a transaction object to the callback', function(done) {
this.sequelize.transaction(function(t) {
this.sequelizeWithTransaction.transaction(function(t) {
expect(t).to.be.instanceOf(Transaction)
done()
})
})
it('returns a transaction object', function() {
expect(this.sequelize.transaction(function(){})).to.be.instanceOf(Transaction)
expect(this.sequelizeWithTransaction.transaction(function(){})).to.be.instanceOf(Transaction)
})
it('allows me to define a callback on the result', function(done) {
this
.sequelize
.sequelizeWithTransaction
.transaction(function(t) { t.commit() })
.done(done)
})
it('allows me to define a callback on the transaction object', function(done) {
this.sequelize.transaction(function(t) {
this.sequelizeWithTransaction.transaction(function(t) {
t.done(done)
t.commit()
})
......@@ -536,21 +538,21 @@ describe(Support.getTestDialectTeaser("Sequelize"), function () {
if (dialect === 'sqlite') {
it("correctly scopes transaction from other connections", function(done) {
var TransactionTest = this.sequelize.define('TransactionTest', { name: DataTypes.STRING }, { timestamps: false })
var TransactionTest = this.sequelizeWithTransaction.define('TransactionTest', { name: DataTypes.STRING }, { timestamps: false })
, self = this
var count = function(transaction, callback) {
var sql = self.sequelize.getQueryInterface().QueryGenerator.selectQuery('TransactionTests', { attributes: [['count(*)', 'cnt']] })
var sql = self.sequelizeWithTransaction.getQueryInterface().QueryGenerator.selectQuery('TransactionTests', { attributes: [['count(*)', 'cnt']] })
self
.sequelize
.sequelizeWithTransaction
.query(sql, null, { plain: true, raw: true, transaction: transaction })
.success(function(result) { callback(result.cnt) })
}
TransactionTest.sync({ force: true }).success(function() {
self.sequelize.transaction(function(t1) {
self.sequelize.query('INSERT INTO ' + qq('TransactionTests') + ' (' + qq('name') + ') VALUES (\'foo\');', null, { plain: true, raw: true, transaction: t1 }).success(function() {
self.sequelizeWithTransaction.transaction(function(t1) {
self.sequelizeWithTransaction.query('INSERT INTO ' + qq('TransactionTests') + ' (' + qq('name') + ') VALUES (\'foo\');', null, { plain: true, raw: true, transaction: t1 }).success(function() {
count(null, function(cnt) {
expect(cnt).to.equal(0)
......@@ -571,23 +573,23 @@ describe(Support.getTestDialectTeaser("Sequelize"), function () {
})
} else {
it("correctly handles multiple transactions", function(done) {
var TransactionTest = this.sequelize.define('TransactionTest', { name: DataTypes.STRING }, { timestamps: false })
var TransactionTest = this.sequelizeWithTransaction.define('TransactionTest', { name: DataTypes.STRING }, { timestamps: false })
, self = this
var count = function(transaction, callback) {
var sql = self.sequelize.getQueryInterface().QueryGenerator.selectQuery('TransactionTests', { attributes: [['count(*)', 'cnt']] })
var sql = self.sequelizeWithTransaction.getQueryInterface().QueryGenerator.selectQuery('TransactionTests', { attributes: [['count(*)', 'cnt']] })
self
.sequelize
.sequelizeWithTransaction
.query(sql, null, { plain: true, raw: true, transaction: transaction })
.success(function(result) { callback(parseInt(result.cnt, 10)) })
}
TransactionTest.sync({ force: true }).success(function() {
self.sequelize.transaction(function(t1) {
self.sequelize.query('INSERT INTO ' + qq('TransactionTests') + ' (' + qq('name') + ') VALUES (\'foo\');', null, { plain: true, raw: true, transaction: t1 }).success(function() {
self.sequelize.transaction(function(t2) {
self.sequelize.query('INSERT INTO ' + qq('TransactionTests') + ' (' + qq('name') + ') VALUES (\'bar\');', null, { plain: true, raw: true, transaction: t2 }).success(function() {
self.sequelizeWithTransaction.transaction(function(t1) {
self.sequelizeWithTransaction.query('INSERT INTO ' + qq('TransactionTests') + ' (' + qq('name') + ') VALUES (\'foo\');', null, { plain: true, raw: true, transaction: t1 }).success(function() {
self.sequelizeWithTransaction.transaction(function(t2) {
self.sequelizeWithTransaction.query('INSERT INTO ' + qq('TransactionTests') + ' (' + qq('name') + ') VALUES (\'bar\');', null, { plain: true, raw: true, transaction: t2 }).success(function() {
count(null, function(cnt) {
expect(cnt).to.equal(0)
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!