correct recognition of types with width, length,precision
This commit is contained in:
parent
9fafd61511
commit
4c6cfe58cf
@ -4,10 +4,59 @@ import * as TomgUtils from "./../Utils";
|
||||
import { RelationInfo } from "../models/RelationInfo";
|
||||
import { ColumnInfo } from "../models/ColumnInfo";
|
||||
import { ManyToMany } from "typeorm";
|
||||
import {
|
||||
WithWidthColumnType,
|
||||
WithPrecisionColumnType,
|
||||
WithLengthColumnType
|
||||
} from "./../../node_modules/typeorm/driver/types/ColumnTypes";
|
||||
|
||||
/**
|
||||
* AbstractDriver
|
||||
*/
|
||||
export abstract class AbstractDriver {
|
||||
ColumnTypesWithWidth: WithWidthColumnType[] = [
|
||||
"tinyint",
|
||||
"smallint",
|
||||
"mediumint",
|
||||
"int",
|
||||
"bigint"
|
||||
];
|
||||
ColumnTypesWithPrecision: WithPrecisionColumnType[] = [
|
||||
"float",
|
||||
"double",
|
||||
"dec",
|
||||
"decimal",
|
||||
"numeric",
|
||||
"real",
|
||||
"double precision",
|
||||
"number",
|
||||
"datetime",
|
||||
"datetime2",
|
||||
"datetimeoffset",
|
||||
"time",
|
||||
"time with time zone",
|
||||
"time without time zone",
|
||||
"timestamp",
|
||||
"timestamp without time zone",
|
||||
"timestamp with time zone",
|
||||
"timestamp with local time zone"
|
||||
];
|
||||
ColumnTypesWithLength: WithLengthColumnType[] = [
|
||||
"character varying",
|
||||
"varying character",
|
||||
"nvarchar",
|
||||
"character",
|
||||
"native character",
|
||||
"varchar",
|
||||
"char",
|
||||
"nchar",
|
||||
"varchar2",
|
||||
"nvarchar2",
|
||||
"raw",
|
||||
"binary",
|
||||
"varbinary"
|
||||
];
|
||||
|
||||
FindManyToManyRelations(dbModel: DatabaseModel) {
|
||||
let manyToManyEntities = dbModel.entities.filter(entity => {
|
||||
return (
|
||||
|
@ -64,87 +64,48 @@ export class MssqlDriver extends AbstractDriver {
|
||||
switch (resp.DATA_TYPE) {
|
||||
case "bigint":
|
||||
colInfo.ts_type = "string";
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "bit":
|
||||
colInfo.ts_type = "boolean";
|
||||
break;
|
||||
case "decimal":
|
||||
colInfo.ts_type = "number";
|
||||
colInfo.numericPrecision = resp.NUMERIC_PRECISION;
|
||||
colInfo.numericScale = resp.NUMERIC_SCALE;
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "int":
|
||||
colInfo.ts_type = "number";
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "money":
|
||||
colInfo.ts_type = "number";
|
||||
break;
|
||||
case "numeric":
|
||||
colInfo.ts_type = "number";
|
||||
colInfo.numericPrecision = resp.NUMERIC_PRECISION;
|
||||
colInfo.numericScale = resp.NUMERIC_SCALE;
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "smallint":
|
||||
colInfo.ts_type = "number";
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "smallmoney":
|
||||
colInfo.ts_type = "number";
|
||||
break;
|
||||
case "tinyint":
|
||||
colInfo.ts_type = "number";
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "float":
|
||||
colInfo.ts_type = "number";
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
colInfo.numericPrecision = resp.NUMERIC_PRECISION;
|
||||
break;
|
||||
case "real":
|
||||
colInfo.ts_type = "number";
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "date":
|
||||
colInfo.ts_type = "Date";
|
||||
break;
|
||||
case "datetime2":
|
||||
colInfo.ts_type = "Date";
|
||||
colInfo.numericPrecision = resp.NUMERIC_PRECISION;
|
||||
break;
|
||||
case "datetime":
|
||||
colInfo.ts_type = "Date";
|
||||
break;
|
||||
case "datetimeoffset":
|
||||
colInfo.ts_type = "Date";
|
||||
colInfo.numericPrecision = resp.NUMERIC_PRECISION;
|
||||
break;
|
||||
case "smalldatetime":
|
||||
colInfo.ts_type = "Date";
|
||||
@ -154,54 +115,30 @@ export class MssqlDriver extends AbstractDriver {
|
||||
break;
|
||||
case "char":
|
||||
colInfo.ts_type = "string";
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "text":
|
||||
colInfo.ts_type = "string";
|
||||
break;
|
||||
case "varchar":
|
||||
colInfo.ts_type = "string";
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "nchar":
|
||||
colInfo.ts_type = "string";
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "ntext":
|
||||
colInfo.ts_type = "string";
|
||||
break;
|
||||
case "nvarchar":
|
||||
colInfo.ts_type = "string";
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "binary":
|
||||
colInfo.ts_type = "Buffer";
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "image":
|
||||
colInfo.ts_type = "Buffer";
|
||||
break;
|
||||
case "varbinary":
|
||||
colInfo.ts_type = "Buffer";
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "hierarchyid":
|
||||
colInfo.ts_type = "string";
|
||||
@ -235,6 +172,25 @@ export class MssqlDriver extends AbstractDriver {
|
||||
break;
|
||||
}
|
||||
|
||||
if (
|
||||
this.ColumnTypesWithPrecision.some(
|
||||
v => v == colInfo.sql_type
|
||||
)
|
||||
) {
|
||||
colInfo.numericPrecision = resp.NUMERIC_PRECISION;
|
||||
colInfo.numericScale = resp.NUMERIC_SCALE;
|
||||
}
|
||||
if (
|
||||
this.ColumnTypesWithLength.some(
|
||||
v => v == colInfo.sql_type
|
||||
)
|
||||
) {
|
||||
colInfo.lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
}
|
||||
|
||||
if (colInfo.sql_type) ent.Columns.push(colInfo);
|
||||
});
|
||||
});
|
||||
|
@ -64,66 +64,32 @@ export class MysqlDriver extends AbstractDriver {
|
||||
switch (resp.DATA_TYPE) {
|
||||
case "int":
|
||||
colInfo.ts_type = "number";
|
||||
colInfo.width =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "tinyint":
|
||||
if (resp.column_type == "tinyint(1)") {
|
||||
colInfo.width = 1;
|
||||
colInfo.ts_type = "boolean";
|
||||
} else {
|
||||
colInfo.width =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
colInfo.ts_type = "number";
|
||||
}
|
||||
break;
|
||||
case "smallint":
|
||||
colInfo.ts_type = "number";
|
||||
colInfo.width =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "mediumint":
|
||||
colInfo.ts_type = "number";
|
||||
colInfo.width =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "bigint":
|
||||
colInfo.ts_type = "string";
|
||||
colInfo.width =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "float":
|
||||
colInfo.ts_type = "number";
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "double":
|
||||
colInfo.ts_type = "number";
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "decimal":
|
||||
colInfo.ts_type = "string";
|
||||
colInfo.numericPrecision = resp.NUMERIC_PRECISION;
|
||||
colInfo.numericScale = resp.NUMERIC_SCALE;
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "date":
|
||||
colInfo.ts_type = "string";
|
||||
@ -145,10 +111,6 @@ export class MysqlDriver extends AbstractDriver {
|
||||
break;
|
||||
case "varchar":
|
||||
colInfo.ts_type = "string";
|
||||
colInfo.char_max_lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
break;
|
||||
case "blob":
|
||||
colInfo.ts_type = "Buffer";
|
||||
@ -220,6 +182,37 @@ export class MysqlDriver extends AbstractDriver {
|
||||
);
|
||||
break;
|
||||
}
|
||||
if (
|
||||
this.ColumnTypesWithPrecision.some(
|
||||
v => v == colInfo.sql_type
|
||||
)
|
||||
) {
|
||||
colInfo.numericPrecision = resp.NUMERIC_PRECISION;
|
||||
colInfo.numericScale = resp.NUMERIC_SCALE;
|
||||
}
|
||||
if (
|
||||
this.ColumnTypesWithLength.some(
|
||||
v => v == colInfo.sql_type
|
||||
)
|
||||
) {
|
||||
colInfo.lenght =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
}
|
||||
if (
|
||||
this.ColumnTypesWithWidth.some(
|
||||
v =>
|
||||
v == colInfo.sql_type &&
|
||||
colInfo.ts_type != "boolean"
|
||||
)
|
||||
) {
|
||||
colInfo.width =
|
||||
resp.CHARACTER_MAXIMUM_LENGTH > 0
|
||||
? resp.CHARACTER_MAXIMUM_LENGTH
|
||||
: null;
|
||||
}
|
||||
|
||||
if (colInfo.sql_type) ent.Columns.push(colInfo);
|
||||
});
|
||||
});
|
||||
|
@ -60,14 +60,12 @@ export class OracleDriver extends AbstractDriver {
|
||||
case "number":
|
||||
colInfo.ts_type = "number";
|
||||
colInfo.sql_type = "int";
|
||||
colInfo.char_max_lenght =
|
||||
resp[5] > 0 ? resp[5] : null;
|
||||
colInfo.lenght = resp[5] > 0 ? resp[5] : null;
|
||||
break;
|
||||
case "varchar2":
|
||||
colInfo.ts_type = "number";
|
||||
colInfo.sql_type = "smallint";
|
||||
colInfo.char_max_lenght =
|
||||
resp[5] > 0 ? resp[5] : null;
|
||||
colInfo.lenght = resp[5] > 0 ? resp[5] : null;
|
||||
break;
|
||||
default:
|
||||
TomgUtils.LogError(
|
||||
|
@ -91,13 +91,9 @@ export class PostgresDriver extends AbstractDriver {
|
||||
break;
|
||||
case "numeric":
|
||||
colInfo.ts_type = "string";
|
||||
colInfo.numericPrecision = resp.numeric_precision;
|
||||
colInfo.numericScale = resp.numeric_scale;
|
||||
break;
|
||||
case "real":
|
||||
colInfo.ts_type = "number";
|
||||
colInfo.numericPrecision = resp.numeric_precision;
|
||||
colInfo.numericScale = resp.numeric_scale;
|
||||
break;
|
||||
case "float":
|
||||
colInfo.ts_type = "number";
|
||||
@ -110,35 +106,21 @@ export class PostgresDriver extends AbstractDriver {
|
||||
break;
|
||||
case "double precision":
|
||||
colInfo.ts_type = "number";
|
||||
colInfo.numericPrecision = resp.numeric_precision;
|
||||
colInfo.numericScale = resp.numeric_scale;
|
||||
break;
|
||||
case "money":
|
||||
colInfo.ts_type = "string";
|
||||
break;
|
||||
case "character varying":
|
||||
colInfo.ts_type = "string";
|
||||
colInfo.char_max_lenght =
|
||||
resp.character_maximum_length > 0
|
||||
? resp.character_maximum_length
|
||||
: null;
|
||||
break;
|
||||
case "varchar":
|
||||
colInfo.ts_type = "string";
|
||||
break;
|
||||
case "character":
|
||||
colInfo.ts_type = "string";
|
||||
colInfo.char_max_lenght =
|
||||
resp.character_maximum_length > 0
|
||||
? resp.character_maximum_length
|
||||
: null;
|
||||
break;
|
||||
case "char":
|
||||
colInfo.ts_type = "string";
|
||||
colInfo.char_max_lenght =
|
||||
resp.character_maximum_length > 0
|
||||
? resp.character_maximum_length
|
||||
: null;
|
||||
break;
|
||||
case "text":
|
||||
colInfo.ts_type = "string";
|
||||
@ -279,6 +261,34 @@ export class PostgresDriver extends AbstractDriver {
|
||||
);
|
||||
break;
|
||||
}
|
||||
if (
|
||||
this.ColumnTypesWithPrecision.some(
|
||||
v => v == colInfo.sql_type
|
||||
)
|
||||
) {
|
||||
colInfo.numericPrecision = resp.numeric_precision;
|
||||
colInfo.numericScale = resp.numeric_scale;
|
||||
}
|
||||
if (
|
||||
this.ColumnTypesWithLength.some(
|
||||
v => v == colInfo.sql_type
|
||||
)
|
||||
) {
|
||||
colInfo.lenght =
|
||||
resp.character_maximum_length > 0
|
||||
? resp.character_maximum_length
|
||||
: null;
|
||||
}
|
||||
if (
|
||||
this.ColumnTypesWithWidth.some(
|
||||
v => v == colInfo.sql_type
|
||||
)
|
||||
) {
|
||||
colInfo.width =
|
||||
resp.character_maximum_length > 0
|
||||
? resp.character_maximum_length
|
||||
: null;
|
||||
}
|
||||
|
||||
if (colInfo.sql_type) ent.Columns.push(colInfo);
|
||||
});
|
||||
|
@ -11,8 +11,8 @@ import {Index,Entity, PrimaryColumn, Column, OneToOne, OneToMany, ManyToOne, Man
|
||||
{{^relations}} @Column("{{sql_type}}",{ {{#is_generated}}
|
||||
generated:true,{{/is_generated}}{{#is_nullable}}
|
||||
nullable:true,{{/is_nullable}}{{^is_nullable}}
|
||||
nullable:false,{{/is_nullable}}{{#char_max_lenght}}
|
||||
length:{{.}},{{/char_max_lenght}}{{#width}}
|
||||
nullable:false,{{/is_nullable}}{{#lenght}}
|
||||
length:{{.}},{{/lenght}}{{#width}}
|
||||
width:{{.}},{{/width}}{{#default}}
|
||||
default:"{{.}}",{{/default}}{{#numericPrecision}}
|
||||
precision:{{.}},{{/numericPrecision}}{{#numericScale}}
|
||||
|
@ -18,7 +18,7 @@ export class ColumnInfo {
|
||||
| "string | string[]"
|
||||
| "any";
|
||||
sql_type: string;
|
||||
char_max_lenght: number | null = null;
|
||||
lenght: number | null = null;
|
||||
width: number | null = null;
|
||||
isPrimary: boolean = false;
|
||||
is_generated: boolean = false;
|
||||
|
@ -94,7 +94,7 @@ describe('MssqlDriver', function () {
|
||||
entities.push(y)
|
||||
var expected: EntityInfo[] = JSON.parse(JSON.stringify(entities));
|
||||
expected[0].Columns.push({
|
||||
char_max_lenght: null,
|
||||
lenght: null,
|
||||
default: 'a',
|
||||
is_nullable: true,
|
||||
isPrimary: false,
|
||||
|
Loading…
Reference in New Issue
Block a user