@decaf-ts/for-postgres
Version:
template for ts projects
95 lines • 11 kB
JavaScript
import { InternalError, NotFoundError } from "@decaf-ts/db-decorators";
import { Sequence } from "@decaf-ts/core";
/**
* @summary Abstract implementation of a Sequence
* @description provides the basic functionality for {@link Sequence}s
*
* @param {SequenceOptions} options
*
* @class PostgresSequence
* @implements Sequence
*/
export class PostgresSequence extends Sequence {
constructor(options, adapter) {
super(options);
this.adapter = adapter;
}
/**
* @summary Retrieves the current value for the sequence
* @protected
*/
async current() {
const { name } = this.options;
try {
const seq = await this.adapter.raw({
query: `SELECT current_value FROM information_schema.sequences WHERE sequence_name = $1`,
values: [name],
}, true);
return this.parse(seq.current_value);
}
catch (e) {
throw this.adapter.parseError(e);
}
}
/**
* @summary Parses the {@link Sequence} value
*
* @protected
* @param value
*/
parse(value) {
return Sequence.parseValue(this.options.type, value);
}
/**
* @summary increments the sequence
* @description Sequence specific implementation
*
* @param {string | number | bigint} current
* @param count
* @protected
*/
async increment(current, count) {
const { type, incrementBy, name, startWith } = this.options;
if (type !== "Number" && type !== "BigInt")
throw new InternalError(`Cannot increment sequence of type ${type} with ${count}`);
let next;
try {
next = await this.adapter.raw({
query: `SELECT nextval($1);`,
values: [name],
}, true);
}
catch (e) {
if (!(e instanceof NotFoundError))
throw e;
next = await this.adapter.raw({
query: `CREATE SEQUENCE IF NOT EXISTS $1 START WITH $2 INCREMENT BY $3 NO CYCLE;`,
values: [name, startWith, incrementBy],
}, true);
}
return next;
}
/**
* @summary Generates the next value in th sequence
* @description calls {@link Sequence#parse} on the current value
* followed by {@link Sequence#increment}
*
*/
async next() {
const current = await this.current();
return this.increment(current);
}
async range(count) {
const current = (await this.current());
const incrementBy = this.parse(this.options.incrementBy);
const next = await this.increment(current, this.parse(count) * incrementBy);
const range = [];
for (let i = 1; i <= count; i++) {
range.push(current + incrementBy * this.parse(i));
}
if (range[range.length - 1] !== next)
throw new InternalError("Miscalculation of range");
return range;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VxdWVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VxdWVuY2VzL1NlcXVlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzFDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFFBQVE7SUFDNUMsWUFDRSxPQUF3QixFQUNkLE9BQXdCO1FBRWxDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUZMLFlBQU8sR0FBUCxPQUFPLENBQWlCO0lBR3BDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzlCLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxHQUFRLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQ3JDO2dCQUNFLEtBQUssRUFBRSxpRkFBaUY7Z0JBQ3hGLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQzthQUNmLEVBQ0QsSUFBSSxDQUNMLENBQUM7WUFDRixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGFBQWdDLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQUMsT0FBTyxDQUFVLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQVUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxLQUFLLENBQUMsS0FBK0I7UUFDM0MsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxDQUFDLFNBQVMsQ0FDckIsT0FBaUMsRUFDakMsS0FBYztRQUVkLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzVELElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssUUFBUTtZQUN4QyxNQUFNLElBQUksYUFBYSxDQUNyQixxQ0FBcUMsSUFBSSxTQUFTLEtBQUssRUFBRSxDQUMxRCxDQUFDO1FBQ0osSUFBSSxJQUE4QixDQUFDO1FBQ25DLElBQUksQ0FBQztZQUNILElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUMzQjtnQkFDRSxLQUFLLEVBQUUscUJBQXFCO2dCQUM1QixNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUM7YUFDZixFQUNELElBQUksQ0FDTCxDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sQ0FBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLGFBQWEsQ0FBQztnQkFBRSxNQUFNLENBQUMsQ0FBQztZQUMzQyxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDM0I7Z0JBQ0UsS0FBSyxFQUFFLDBFQUEwRTtnQkFDakYsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUM7YUFDdkMsRUFDRCxJQUFJLENBQ0wsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLElBQWdDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLElBQUk7UUFDUixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBYTtRQUN2QixNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFXLENBQUM7UUFDakQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBVyxDQUFDO1FBQ25FLE1BQU0sSUFBSSxHQUE2QixNQUFNLElBQUksQ0FBQyxTQUFTLENBQ3pELE9BQU8sRUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBWSxHQUFHLFdBQVcsQ0FDNUMsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFpQyxFQUFFLENBQUM7UUFDL0MsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsR0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBWSxDQUFDLENBQUM7UUFDaEUsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSTtZQUNsQyxNQUFNLElBQUksYUFBYSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDckQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBOb3RGb3VuZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBQb3N0Z3Jlc0FkYXB0ZXIgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgU2VxdWVuY2VcbiAqIEBkZXNjcmlwdGlvbiBwcm92aWRlcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBmb3Ige0BsaW5rIFNlcXVlbmNlfXNcbiAqXG4gKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9uc1xuICpcbiAqIEBjbGFzcyBQb3N0Z3Jlc1NlcXVlbmNlXG4gKiBAaW1wbGVtZW50cyBTZXF1ZW5jZVxuICovXG5leHBvcnQgY2xhc3MgUG9zdGdyZXNTZXF1ZW5jZSBleHRlbmRzIFNlcXVlbmNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgb3B0aW9uczogU2VxdWVuY2VPcHRpb25zLFxuICAgIHByb3RlY3RlZCBhZGFwdGVyOiBQb3N0Z3Jlc0FkYXB0ZXJcbiAgKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgYXN5bmMgY3VycmVudCgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gdGhpcy5vcHRpb25zO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXE6IGFueSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoXG4gICAgICAgIHtcbiAgICAgICAgICBxdWVyeTogYFNFTEVDVCBjdXJyZW50X3ZhbHVlIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnNlcXVlbmNlcyBXSEVSRSBzZXF1ZW5jZV9uYW1lID0gJDFgLFxuICAgICAgICAgIHZhbHVlczogW25hbWVdLFxuICAgICAgICB9LFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2Uoc2VxLmN1cnJlbnRfdmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLmFkYXB0ZXIucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUGFyc2VzIHRoZSB7QGxpbmsgU2VxdWVuY2V9IHZhbHVlXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIHBhcnNlKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQge1xuICAgIHJldHVybiBTZXF1ZW5jZS5wYXJzZVZhbHVlKHRoaXMub3B0aW9ucy50eXBlLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgaW5jcmVtZW50cyB0aGUgc2VxdWVuY2VcbiAgICogQGRlc2NyaXB0aW9uIFNlcXVlbmNlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50fSBjdXJyZW50XG4gICAqIEBwYXJhbSBjb3VudFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluY3JlbWVudChcbiAgICBjdXJyZW50OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgY291bnQ/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCB7IHR5cGUsIGluY3JlbWVudEJ5LCBuYW1lLCBzdGFydFdpdGggfSA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAodHlwZSAhPT0gXCJOdW1iZXJcIiAmJiB0eXBlICE9PSBcIkJpZ0ludFwiKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgaW5jcmVtZW50IHNlcXVlbmNlIG9mIHR5cGUgJHt0eXBlfSB3aXRoICR7Y291bnR9YFxuICAgICAgKTtcbiAgICBsZXQgbmV4dDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICAgIHRyeSB7XG4gICAgICBuZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyhcbiAgICAgICAge1xuICAgICAgICAgIHF1ZXJ5OiBgU0VMRUNUIG5leHR2YWwoJDEpO2AsXG4gICAgICAgICAgdmFsdWVzOiBbbmFtZV0sXG4gICAgICAgIH0sXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgbmV4dCA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoXG4gICAgICAgIHtcbiAgICAgICAgICBxdWVyeTogYENSRUFURSBTRVFVRU5DRSBJRiBOT1QgRVhJU1RTICQxIFNUQVJUIFdJVEggJDIgSU5DUkVNRU5UIEJZICQzIE5PIENZQ0xFO2AsXG4gICAgICAgICAgdmFsdWVzOiBbbmFtZSwgc3RhcnRXaXRoLCBpbmNyZW1lbnRCeV0sXG4gICAgICAgIH0sXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyB0aGUgbmV4dCB2YWx1ZSBpbiB0aCBzZXF1ZW5jZVxuICAgKiBAZGVzY3JpcHRpb24gY2FsbHMge0BsaW5rIFNlcXVlbmNlI3BhcnNlfSBvbiB0aGUgY3VycmVudCB2YWx1ZVxuICAgKiBmb2xsb3dlZCBieSB7QGxpbmsgU2VxdWVuY2UjaW5jcmVtZW50fVxuICAgKlxuICAgKi9cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPG51bWJlciB8IHN0cmluZyB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLmN1cnJlbnQoKTtcbiAgICByZXR1cm4gdGhpcy5pbmNyZW1lbnQoY3VycmVudCk7XG4gIH1cblxuICBhc3luYyByYW5nZShjb3VudDogbnVtYmVyKTogUHJvbWlzZTwobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdPiB7XG4gICAgY29uc3QgY3VycmVudCA9IChhd2FpdCB0aGlzLmN1cnJlbnQoKSkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IGluY3JlbWVudEJ5ID0gdGhpcy5wYXJzZSh0aGlzLm9wdGlvbnMuaW5jcmVtZW50QnkpIGFzIG51bWJlcjtcbiAgICBjb25zdCBuZXh0OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQgPSBhd2FpdCB0aGlzLmluY3JlbWVudChcbiAgICAgIGN1cnJlbnQsXG4gICAgICAodGhpcy5wYXJzZShjb3VudCkgYXMgbnVtYmVyKSAqIGluY3JlbWVudEJ5XG4gICAgKTtcbiAgICBjb25zdCByYW5nZTogKG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXSA9IFtdO1xuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gY291bnQ7IGkrKykge1xuICAgICAgcmFuZ2UucHVzaChjdXJyZW50ICsgaW5jcmVtZW50QnkgKiAodGhpcy5wYXJzZShpKSBhcyBudW1iZXIpKTtcbiAgICB9XG4gICAgaWYgKHJhbmdlW3JhbmdlLmxlbmd0aCAtIDFdICE9PSBuZXh0KVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNjYWxjdWxhdGlvbiBvZiByYW5nZVwiKTtcbiAgICByZXR1cm4gcmFuZ2U7XG4gIH1cbn1cbiJdfQ==