From 984238db02a1e41288dd261b6129926d76895824 Mon Sep 17 00:00:00 2001 From: Kononnable Date: Tue, 30 Jan 2018 00:32:24 +0100 Subject: [PATCH] Adding type enum for mysql/mariadb; fixes #28 --- src/drivers/MysqlDriver.ts | 9 +++++++-- src/drivers/PostgresDriver.ts | 1 - src/entity.mst | 3 ++- src/models/ColumnInfo.ts | 1 + test/drivers/MssqlDriver.test.ts | 1 + test/integration/entityTypes/mariadb/entity/Post.ts | 4 ++-- test/integration/entityTypes/mysql/entity/Post.ts | 4 ++-- 7 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/drivers/MysqlDriver.ts b/src/drivers/MysqlDriver.ts index 9e370c5..023507d 100644 --- a/src/drivers/MysqlDriver.ts +++ b/src/drivers/MysqlDriver.ts @@ -44,10 +44,10 @@ export class MysqlDriver extends AbstractDriver { let response = await this.ExecQuery<{ TABLE_NAME: string, COLUMN_NAME: string, COLUMN_DEFAULT: string, IS_NULLABLE: string, DATA_TYPE: string, CHARACTER_MAXIMUM_LENGTH: number, - NUMERIC_PRECISION: number, NUMERIC_SCALE: number, IsIdentity: number + NUMERIC_PRECISION: number, NUMERIC_SCALE: number, IsIdentity: number, column_type:string }>(`SELECT TABLE_NAME,COLUMN_NAME,COLUMN_DEFAULT,IS_NULLABLE, DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_SCALE, - CASE WHEN EXTRA like '%auto_increment%' THEN 1 ELSE 0 END IsIdentity FROM INFORMATION_SCHEMA.COLUMNS + CASE WHEN EXTRA like '%auto_increment%' THEN 1 ELSE 0 END IsIdentity, column_type FROM INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA like DATABASE()`); entities.forEach((ent) => { response.filter((filterVal) => { @@ -196,6 +196,11 @@ export class MysqlDriver extends AbstractDriver { colInfo.ts_type = "Object" colInfo.sql_type = "json" break; + case "enum": + colInfo.ts_type = "string" + colInfo.sql_type = "enum" + colInfo.enumOptions = resp.column_type.substring(5, resp.column_type.length - 1).replace(/\'/gi,'"') + break; default: TomgUtils.LogFatalError("Unknown column type:" + resp.DATA_TYPE); break; diff --git a/src/drivers/PostgresDriver.ts b/src/drivers/PostgresDriver.ts index cfe4f33..d853016 100644 --- a/src/drivers/PostgresDriver.ts +++ b/src/drivers/PostgresDriver.ts @@ -208,7 +208,6 @@ export class PostgresDriver extends AbstractDriver { colInfo.ts_type = "string" colInfo.sql_type = "xml" break; - default: TomgUtils.LogFatalError("Unknown column type:" + resp.data_type); break; diff --git a/src/entity.mst b/src/entity.mst index a2d1f2c..393fb53 100644 --- a/src/entity.mst +++ b/src/entity.mst @@ -16,7 +16,8 @@ import {Index,Entity, PrimaryColumn, Column, OneToOne, OneToMany, ManyToOne, Joi default:"{{.}}",{{/default}}{{#numericPrecision}} precision:{{.}},{{/numericPrecision}}{{#numericScale}} scale:{{.}},{{/numericScale}}{{#isPrimary}} - primary:{{isPrimary}},{{/isPrimary}} + primary:{{isPrimary}},{{/isPrimary}}{{#enumOptions}} + enum:[{{.}}],{{/enumOptions}} name:"{{name}}" }) {{toPropertyName name}}:{{ts_type}}; diff --git a/src/models/ColumnInfo.ts b/src/models/ColumnInfo.ts index 97997e5..2449bc6 100644 --- a/src/models/ColumnInfo.ts +++ b/src/models/ColumnInfo.ts @@ -14,6 +14,7 @@ export class ColumnInfo { is_generated: boolean = false; numericPrecision: number | null = null; numericScale: number | null = null; + enumOptions: string | null = null; relations: RelationInfo[]; diff --git a/test/drivers/MssqlDriver.test.ts b/test/drivers/MssqlDriver.test.ts index 70a547f..e872335 100644 --- a/test/drivers/MssqlDriver.test.ts +++ b/test/drivers/MssqlDriver.test.ts @@ -103,6 +103,7 @@ describe('MssqlDriver', function () { numericScale: null, sql_type: 'int', ts_type: 'number', + enumOptions: null, relations: [] }) let result = await driver.GetCoulmnsFromEntity(entities, 'schema'); diff --git a/test/integration/entityTypes/mariadb/entity/Post.ts b/test/integration/entityTypes/mariadb/entity/Post.ts index 61d4028..278b302 100644 --- a/test/integration/entityTypes/mariadb/entity/Post.ts +++ b/test/integration/entityTypes/mariadb/entity/Post.ts @@ -78,8 +78,8 @@ export class Post { @Column("longtext") longtext: string; - // @Column("enum", { enum: ["A", "B", "C"] }) - // enum: string; + @Column("enum", { enum: ["A", "B", "C"] }) + enum: string; // @Column("enum", { enum: FruitEnum }) // classEnum1: FruitEnum; diff --git a/test/integration/entityTypes/mysql/entity/Post.ts b/test/integration/entityTypes/mysql/entity/Post.ts index 16a217e..fdf66b2 100644 --- a/test/integration/entityTypes/mysql/entity/Post.ts +++ b/test/integration/entityTypes/mysql/entity/Post.ts @@ -78,8 +78,8 @@ export class Post { @Column("longtext") longtext: string; - // @Column("enum", { enum: ["A", "B", "C"] }) - // enum: string; + @Column("enum", { enum: ["A", "B", "C"] }) + enum: string; // @Column("enum", { enum: FruitEnum }) // classEnum1: FruitEnum;