Skip to content

Instantly share code, notes, and snippets.

@daocren
Created January 6, 2013 03:54
Show Gist options
  • Save daocren/4465099 to your computer and use it in GitHub Desktop.
Save daocren/4465099 to your computer and use it in GitHub Desktop.
流水号工具
var db = require('../config.js').db;
db.bind('sequence');
var defaultName = 'common';
var defaultOffset = 1;
var sequenceMap = {};
var sequenceLockMap = {};
exports.next = function(callback){
exports.nextKey(defaultName, callback);
};
exports.nextKey = function(name,callback){
if(name == undefined){
name = defaultName;
}
if(sequenceLockMap[name]!=undefined) {
setTimeout(exports.next, 5,name,callback);
return;
}
if(sequenceMap[name] == undefined){
sequenceLockMap[name] = true;
db.sequence.findOne({_id:name}, function (err, result) {
if(!err ){
if(result!=undefined){
seq = result;
seq['current'] = seq['index'];
sequenceMap[name] = seq;
getKey(seq, callback);
}else{
seq = {_id: name, index: 0, offset: defaultOffset};
sequenceMap[name] = seq;
seq.current = 0;
db.sequence.save(seq,null,function(err,result){
getKey(seq, callback);
});
}
}
});
}else{
getKey(sequenceMap[name], callback);
}
};
function getKey(seq,callback){
if(seq['current']<seq['index']){
seq['current'] = seq['current']+1;
callback(null, seq['current']);
}else{
seq['index'] = seq['index'] + seq['offset'];
db.sequence.save(seq,function(err,result) {
seq['current'] = seq['current']+1;
callback(null, seq['current']);
sequenceLockMap[seq._id] = undefined;
});
}
}
if(!module.parent){
console.log('key.next()', exports.next(function (err,num){console.log(num)}));
console.log('key.next("test")', exports.nextKey('test',function (err,num){console.log(num)}));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment