intkeygenerator
Version:
int secuential primarykey generator for SQL Server
67 lines (58 loc) • 1.48 kB
JavaScript
var callbackRange;
var blockSize = 20;
var nextValue;
var startValue;
var queue = [];
function setRangeReservationCallback (callback)
{
if (callbackRange && callbackRange != null) throw new Error('la funcion callback ya esta asignada.');
callbackRange = callback;
}
function getBlock (size, callback){
blockSize = size;
callbackRange(size, function(err, value){
if (err) {
callback(err, null);
} else {
nextValue = value;
startValue = value;
callback(err, value);
}
});
}
function next (callback){
queue.push(callback);
if (queue.length != 1) {
return;
}
nextBody();
}
function nextBody(){
if (isNaN(nextValue) || nextValue == null || startValue + blockSize == nextValue) {
//console.log('start: ' + startValue + ', blockSize: ' + blockSize + ', nextValue: ' + nextValue);
getBlock(blockSize, function(err, value){
if (err) {
endNext(err, null);
} else {
nextValue++;
endNext(null, nextValue);
}
});
} else {
nextValue++;
endNext(null, nextValue);
}
}
function endNext(err, nextValue){
var cb = queue[0];
queue.splice(0, 1);
cb(err, nextValue);
if (queue.length != 0) nextBody();
}
function reset(){
callbackRange = undefined;
rangeSize = null;
nextValue = null;
rangeStart = null;
}
module.exports = {setRangeReservationCallback : setRangeReservationCallback, getBlock : getBlock, next : next, reset : reset, size : blockSize };