Skip to content

Instantly share code, notes, and snippets.

@james-world
Created August 21, 2020 23:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save james-world/30e3fd920ad020a8e5006e114c2f8bdd to your computer and use it in GitHub Desktop.
Save james-world/30e3fd920ad020a8e5006e114c2f8bdd to your computer and use it in GitHub Desktop.
CosmosDb stored procedure to generate the next number in a 7-digit non-repeating pseudo random sequence.
function getNext(name) {
var response = getContext().getResponse();
var result = __.chain()
.filter(function(doc) { return doc.id === name; })
.value({}, updateCounter);
if(!result.isAccepted) throw new Error("The call was not accepted");
var next;
var etag;
function updateCounter(err, docs) {
if (err) throw err;
var settings = docs[0];
if(settings.current === 0) {
next = settings.offset;
}
else {
next = (settings.a * (settings.current - settings.offset) + settings.c) % settings.m + settings.offset;
if (next === settings.offset)
throw new Error(name + " counter values exhausted");
}
var doc = {
id: settings.id,
m: settings.m,
a: settings.a,
c: settings.c,
offset: settings.offset,
current: next,
issue: settings.issue + 1
};
var result =__.replaceDocument(
settings._self,
doc,
{
indexAction: 'default',
etag: settings._etag
},
setResponse);
if(!result) throw new Error("The call was not accepted");
}
function setResponse(err, doc) {
if (err) throw err;
response.setBody("" + next);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment