@rcronin/sequelize-ibmi-mapepire
Version:
IBM i (via Mapepire) Sequelize V7 Dialect
244 lines • 8.57 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.UUID = exports.ENUM = exports.DECIMAL = exports.DOUBLE = exports.FLOAT = exports.BIGINT = exports.INTEGER = exports.MEDIUMINT = exports.SMALLINT = exports.TINYINT = exports.DATE = exports.TEXT = exports.CHAR = exports.STRING = exports.BLOB = void 0;
const BaseTypes = __importStar(require("@sequelize/core/_non-semver-use-at-your-own-risk_/abstract-dialect/data-types.js"));
const dayjs_1 = __importDefault(require("dayjs"));
const utc_1 = __importDefault(require("dayjs/plugin/utc"));
const maxBy_js_1 = __importDefault(require("lodash/maxBy.js"));
dayjs_1.default.extend(utc_1.default);
function removeUnsupportedIntegerOptions(dataType, dialect) {
if (dataType.options.length != null) {
// this option only makes sense for zerofill
dialect.warnDataTypeIssue(`${dialect.name} does not support ${dataType.getDataTypeId()} with length specified. This options is ignored.`);
delete dataType.options.length;
}
}
class BLOB extends BaseTypes.BLOB {
toSql() {
if (this.options.length != null) {
if (this.options.length.toLowerCase() === 'tiny') {
// tiny = 255 bytes
return 'BLOB(255)';
}
if (this.options.length.toLowerCase() === 'medium') {
// medium = 16M
return 'BLOB(16M)';
}
if (this.options.length.toLowerCase() === 'long') {
// long = 2GB
return 'BLOB(2G)';
}
return `BLOB(${this.options.length})`;
}
return 'BLOB(1M)';
}
}
exports.BLOB = BLOB;
class STRING extends BaseTypes.STRING {
toSql() {
const length = this.options.length ?? 255;
if (this.options.binary) {
if (length <= 4000) {
return `VARCHAR(${length}) FOR BIT DATA`;
}
throw new Error(`${this._getDialect().name} does not support the BINARY option for data types with a length greater than 4000.`);
}
if (length <= 4000) {
return `VARCHAR(${length})`;
}
return `CLOB(${length})`;
}
}
exports.STRING = STRING;
class CHAR extends BaseTypes.CHAR {
toSql() {
if (this.options.binary) {
return `CHAR(${this.options.length ?? 255}) FOR BIT DATA`;
}
return super.toSql();
}
}
exports.CHAR = CHAR;
class TEXT extends BaseTypes.TEXT {
toSql() {
// default value for CLOB
let len = 2_147_483_647;
if (typeof this.options.length === 'string') {
switch (this.options.length.toLowerCase()) {
// 'tiny', 'medium' and 'long' are MySQL values.
// 'max' is dialect-dependant.
case 'tiny':
len = 2 ** 8;
break;
case 'medium':
len = 2 ** 24;
break;
case 'long':
// long would normally be 2 ** 32, but that's above the limit for db2
len = 2_147_483_647;
break;
default:
throw new Error(`LENGTH value ${this.options.length} is not supported. Expected a number of one of the following strings: tiny, medium, long.`);
}
}
if (len > 32_672) {
return `CLOB(${len})`;
}
return `VARCHAR(${len})`;
}
}
exports.TEXT = TEXT;
class DATE extends BaseTypes.DATE {
_checkOptionSupport(dialect) {
super._checkOptionSupport(dialect);
if (this.options.precision != null && this.options.precision > 6) {
this.options.precision = 6;
}
}
toSql() {
return `TIMESTAMP${this.options.precision != null ? `(${this.options.precision})` : ''}`;
}
toBindableValue(date) {
date = (0, dayjs_1.default)(date).utc(false);
return date.format('YYYY-MM-DD HH:mm:ss.SSS');
}
}
exports.DATE = DATE;
class TINYINT extends BaseTypes.TINYINT {
_checkOptionSupport(dialect) {
super._checkOptionSupport(dialect);
removeUnsupportedIntegerOptions(this, dialect);
}
// TODO: add >= 0 =< 2^8-1 check when the unsigned option is true
// TODO: add >= -2^7 =< 2^7-1 check when the unsigned option is false
toSql() {
return 'SMALLINT';
}
}
exports.TINYINT = TINYINT;
class SMALLINT extends BaseTypes.SMALLINT {
_checkOptionSupport(dialect) {
super._checkOptionSupport(dialect);
removeUnsupportedIntegerOptions(this, dialect);
}
// TODO: add >= 0 =< 2^16-1 check when the unsigned option is true
toSql() {
if (this.options.unsigned) {
return 'INTEGER';
}
return 'SMALLINT';
}
}
exports.SMALLINT = SMALLINT;
class MEDIUMINT extends BaseTypes.MEDIUMINT {
_checkOptionSupport(dialect) {
super._checkOptionSupport(dialect);
removeUnsupportedIntegerOptions(this, dialect);
}
// TODO: add >= 0 =< 2^24-1 check when the unsigned option is true
// TODO: add >= -2^23 =< 2^23-1 check when the unsigned option is false
toSql() {
return 'INTEGER';
}
}
exports.MEDIUMINT = MEDIUMINT;
class INTEGER extends BaseTypes.INTEGER {
_checkOptionSupport(dialect) {
super._checkOptionSupport(dialect);
removeUnsupportedIntegerOptions(this, dialect);
}
// TODO: add >= 0 =< 2^32-1 check when the unsigned option is true
toSql() {
if (this.options.unsigned) {
return 'BIGINT';
}
return 'INTEGER';
}
}
exports.INTEGER = INTEGER;
class BIGINT extends BaseTypes.BIGINT {
_checkOptionSupport(dialect) {
super._checkOptionSupport(dialect);
removeUnsupportedIntegerOptions(this, dialect);
}
}
exports.BIGINT = BIGINT;
class FLOAT extends BaseTypes.FLOAT {
// TODO: add check constraint >= 0 if unsigned is true
getNumberSqlTypeName() {
return 'REAL';
}
}
exports.FLOAT = FLOAT;
class DOUBLE extends BaseTypes.DOUBLE {
// TODO: add check constraint >= 0 if unsigned is true
getNumberSqlTypeName() {
return 'DOUBLE';
}
}
exports.DOUBLE = DOUBLE;
class DECIMAL extends BaseTypes.DECIMAL {
}
exports.DECIMAL = DECIMAL;
class ENUM extends BaseTypes.ENUM {
toSql() {
const minLength = (0, maxBy_js_1.default)(this.options.values, value => value.length)?.length ?? 0;
// db2 does not have an ENUM type, we use VARCHAR instead.
return `VARCHAR(${Math.max(minLength, 255)})`;
}
}
exports.ENUM = ENUM;
class UUID extends BaseTypes.UUID {
toSql() {
return 'CHAR(36)';
}
}
exports.UUID = UUID;
// export class BOOLEAN extends BaseTypes.BOOLEAN {
// escape(value: boolean | unknown): string {
// return value ? '1' : '0';
// }
// toBindableValue(value: boolean | unknown): unknown {
// return value ? 1 : 0;
// }
// toSql() {
// return 'SMALLINT';
// }
// }
//# sourceMappingURL=data-types-overrides.js.map