feat: add method for mode discovery

Signed-off-by: Muhammad Aaqil <aaqilcs102@gmail.com>
This commit is contained in:
Muhammad Aaqil 2024-03-03 21:27:53 +05:00
parent ae3cf25e77
commit 7c08a93930
1 changed files with 31 additions and 0 deletions

View File

@ -1162,6 +1162,24 @@ DataSource.prototype.autoupdate = function(models, cb) {
return cb.promise;
};
/**
* Discover if database in strict mode.
* This method returns 0 or 1
*
* @param {Function} Callback function. Optional.
*/
DataSource.prototype.discoverIsStrict = function(cb) {
this.freeze();
cb = cb || utils.createPromiseCallback();
if (this.connector.discoverIsStrict) {
this.connector.discoverIsStrict(cb);
} else if (cb) {
process.nextTick(cb);
}
return cb.promise;
};
/**
* Discover existing database tables.
* This method returns an array of model objects, including {type, name, onwer}
@ -1625,6 +1643,7 @@ DataSource.prototype.discoverSchemas = function(tableName, options, cb) {
if (followingRelations) {
tasks.push(this.discoverForeignKeys.bind(this, tableName, options));
}
tasks.push(this.discoverIsStrict.bind(this));
async.parallel(tasks, function(err, results) {
if (err) {
@ -1633,6 +1652,10 @@ DataSource.prototype.discoverSchemas = function(tableName, options, cb) {
}
const columns = results[0];
let isStrict = results[2];
if (isStrict && isStrict[0]) {
isStrict = isStrict[0]['globalStrictMode'] | isStrict[0]['sessionStrictMode'];
}
if (!columns || columns.length === 0) {
cb(new Error(g.f('Table \'%s\' does not exist.', tableName)));
return cb.promise;
@ -1664,11 +1687,19 @@ DataSource.prototype.discoverSchemas = function(tableName, options, cb) {
columns.forEach(function(item) {
const propName = nameMapper('column', item.columnName);
const jsonSchema = {
nullable: item.nullable === 'Y' || item.nullable === 'YES' ||
item.nullable === 1 || item.nullable === true,
};
if (isStrict && item.dataLength) {
jsonSchema.maxLength = item.dataLength;
}
schema.properties[propName] = {
type: item.type,
required: !item.generated && (item.nullable === 'N' || item.nullable === 'NO' ||
item.nullable === 0 || item.nullable === false),
length: item.dataLength,
jsonSchema,
precision: item.dataPrecision,
scale: item.dataScale,
generated: item.generated,