move transaction to base db adapter

This commit is contained in:
welefen 2015-08-03 11:17:44 +08:00
parent d64b505654
commit 91e8aee7ba
5 changed files with 130 additions and 136 deletions

View File

@ -17,6 +17,7 @@ export default class extends Parse {
this.sql = '';
this.lastInsertId = 0;
this._socket = null;
this.transTimes = 0; //transaction times
}
/**
* get socket instance, override by sub class
@ -231,6 +232,40 @@ export default class extends Parse {
return data.affectedRows || 0;
});
}
/**
* start transaction
* @return {Promise} []
*/
startTrans(){
if (this.transTimes === 0) {
this.transTimes++;
return this.execute('START TRANSACTION');
}
this.transTimes++;
return Promise.resolve();
}
/**
* commit
* @return {Promise} []
*/
commit(){
if (this.transTimes > 0) {
this.transTimes = 0;
return this.execute('COMMIT');
}
return Promise.resolve();
}
/**
* rollback
* @return {Promise} []
*/
rollback(){
if (this.transTimes > 0) {
this.transTimes = 0;
return this.execute('ROLLBACK');
}
return Promise.resolve();
}
/**
* close connect
* @return {} []

View File

@ -6,15 +6,6 @@ let MysqlSocket = think.adapter('socket', 'mysql');
* @type {Class}
*/
export default class extends think.adapter.db {
/**
* init
* @param {Object} config []
* @return {} []
*/
init(config){
super.init(config);
this.transTimes = 0; //transaction times
}
/**
* get mysql socket instance
* @param {Object} config []
@ -48,40 +39,6 @@ export default class extends think.adapter.db {
});
return ret;
}
/**
* start transaction
* @return {Promise} []
*/
startTrans(){
if (this.transTimes === 0) {
this.transTimes++;
return this.execute('START TRANSACTION');
}
this.transTimes++;
return Promise.resolve();
}
/**
* commit
* @return {Promise} []
*/
commit(){
if (this.transTimes > 0) {
this.transTimes = 0;
return this.execute('COMMIT');
}
return Promise.resolve();
}
/**
* rollback
* @return {Promise} []
*/
rollback(){
if (this.transTimes > 0) {
this.transTimes = 0;
return this.execute('ROLLBACK');
}
return Promise.resolve();
}
/**
* parse key
* @param {String} key []

View File

@ -25,6 +25,7 @@ export default class extends think.adapter.db {
async getFields(table){
let data = await this.query(`PRAGMA table_info( ${table} )`);
let ret = {};
console.log(data);
data.forEach(item => {
ret[item.name] = {
name: item.name,
@ -35,10 +36,10 @@ export default class extends think.adapter.db {
auto_increment: false
};
});
if(data.length === 0){
let msg = new Error(think.local('TABLE_NO_COLUMNS', table));
return think.reject(msg);
}
// if(data.length === 0){
// let msg = new Error(think.local('TABLE_NO_COLUMNS', table));
// return think.reject(msg);
// }
return ret;
}
/**
@ -55,11 +56,11 @@ export default class extends think.adapter.db {
* @return {String} []
*/
parseLimit(limit){
if (!limit) {
if (think.isEmpty(limit)) {
return '';
}
if(think.isString(limit)){
limit = limit.split(',');
limit = limit.split(/\s*,\s*/);
}
if(limit[1]){
return ' LIMIT ' + (limit[1] | 0) + ' OFFSET ' + (limit[0] | 0);

View File

@ -20,6 +20,7 @@ describe('adapter/db/base.js', function(){
assert.equal(instance.sql, '');
assert.equal(instance.lastInsertId, 0);
assert.equal(instance._socket, null);
assert.equal(instance.transTimes, 0);
})
it('socket is function', function(){
var instance = new Base();
@ -394,4 +395,91 @@ describe('adapter/db/base.js', function(){
instance.close();
assert.equal(flag, false);
})
it('startTrans', function(done){
var instance = new Base();
var flag = false;
instance.execute = function(sql){
assert.equal(sql, 'START TRANSACTION');
flag = true;
return Promise.resolve();
}
instance.startTrans().then(function(data){
assert.equal(flag, true);
instance.transTimes = 1;
done();
})
})
it('startTrans, is started', function(done){
var instance = new Base();
instance.transTimes = 1;
var flag = false;
instance.execute = function(sql){
assert.equal(sql, 'START TRANSACTION');
flag = true;
return Promise.resolve();
}
instance.startTrans().then(function(data){
assert.equal(flag, false);
instance.transTimes = 1;
done();
})
})
it('commit, not start', function(done){
var instance = new Base();
var flag = false;
instance.execute = function(sql){
assert.equal(sql, 'ROLLBACK');
flag = true;
return Promise.resolve();
}
instance.commit().then(function(data){
assert.equal(flag, false);
instance.transTimes = 0;
done();
})
})
it('commit', function(done){
var instance = new Base();
instance.transTimes = 1;
var flag = false;
instance.execute = function(sql){
assert.equal(sql, 'COMMIT');
flag = true;
return Promise.resolve();
}
instance.commit().then(function(data){
assert.equal(flag, true);
instance.transTimes = 0;
done();
})
})
it('rollback, not start', function(done){
var instance = new Base();
var flag = false;
instance.execute = function(sql){
assert.equal(sql, 'ROLLBACK');
flag = true;
return Promise.resolve();
}
instance.rollback().then(function(data){
assert.equal(flag, false);
instance.transTimes = 0;
done();
})
})
it('rollback', function(done){
var instance = new Base();
instance.transTimes = 1;
var flag = false;
instance.execute = function(sql){
assert.equal(sql, 'ROLLBACK');
flag = true;
return Promise.resolve();
}
instance.rollback().then(function(data){
assert.equal(flag, true);
instance.transTimes = 0;
done();
})
})
})

View File

@ -43,93 +43,6 @@ describe('adapter/db/mysql.js', function(){
done();
})
})
it('startTrans', function(done){
var instance = new Mysql();
var flag = false;
instance.execute = function(sql){
assert.equal(sql, 'START TRANSACTION');
flag = true;
return Promise.resolve();
}
instance.startTrans().then(function(data){
assert.equal(flag, true);
instance.transTimes = 1;
done();
})
})
it('startTrans, is started', function(done){
var instance = new Mysql();
instance.transTimes = 1;
var flag = false;
instance.execute = function(sql){
assert.equal(sql, 'START TRANSACTION');
flag = true;
return Promise.resolve();
}
instance.startTrans().then(function(data){
assert.equal(flag, false);
instance.transTimes = 1;
done();
})
})
it('commit, not start', function(done){
var instance = new Mysql();
var flag = false;
instance.execute = function(sql){
assert.equal(sql, 'ROLLBACK');
flag = true;
return Promise.resolve();
}
instance.commit().then(function(data){
assert.equal(flag, false);
instance.transTimes = 0;
done();
})
})
it('commit', function(done){
var instance = new Mysql();
instance.transTimes = 1;
var flag = false;
instance.execute = function(sql){
assert.equal(sql, 'COMMIT');
flag = true;
return Promise.resolve();
}
instance.commit().then(function(data){
assert.equal(flag, true);
instance.transTimes = 0;
done();
})
})
it('rollback, not start', function(done){
var instance = new Mysql();
var flag = false;
instance.execute = function(sql){
assert.equal(sql, 'ROLLBACK');
flag = true;
return Promise.resolve();
}
instance.rollback().then(function(data){
assert.equal(flag, false);
instance.transTimes = 0;
done();
})
})
it('rollback', function(done){
var instance = new Mysql();
instance.transTimes = 1;
var flag = false;
instance.execute = function(sql){
assert.equal(sql, 'ROLLBACK');
flag = true;
return Promise.resolve();
}
instance.rollback().then(function(data){
assert.equal(flag, true);
instance.transTimes = 0;
done();
})
})
it('parseKey, empty', function(){
var instance = new Mysql();
var data = instance.parseKey();