enumerating all relations(one to many)

This commit is contained in:
Kononnable 2017-04-02 00:53:19 +02:00
parent 29ab0e18cd
commit 38b254548e
6 changed files with 79 additions and 18 deletions

View File

@ -8,19 +8,19 @@ export class Engine {
}
public async createModelFromDatabase(): Promise<boolean> {
let entities = await this.getEntitiesInfo(this.Options.databaseName, this.Options.host, this.Options.port, this.Options.user, this.Options.password);
if (entities.length > 0) {
this.createModelFromMetadata(entities);
let dbModel = await this.getEntitiesInfo(this.Options.databaseName, this.Options.host, this.Options.port, this.Options.user, this.Options.password);
if (dbModel.entities.length > 0) {
this.createModelFromMetadata(dbModel);
} else {
console.error('Tables not found in selected database. Skipping creation of typeorm model.');
}
return true;
}
private async getEntitiesInfo(database: string, server: string, port: number, user: string, password: string): Promise<EntityInfo[]> {
await this.driver.GetDataFromServer(database, server, port, user, password)
return [];
private async getEntitiesInfo(database: string, server: string, port: number, user: string, password: string): Promise<DatabaseModel> {
return await this.driver.GetDataFromServer(database, server, port, user, password)
}
private createModelFromMetadata(entities: EntityInfo[]) {
private createModelFromMetadata(databaseModel: DatabaseModel) {
}
}

View File

@ -2,19 +2,20 @@
* AbstractDriver
*/
export abstract class AbstractDriver {
async GetDataFromServer(database:string,server:string,port:number,user:string,password:string): Promise<EntityInfo[]> {
async GetDataFromServer(database:string,server:string,port:number,user:string,password:string): Promise<DatabaseModel> {
let dbModel=<DatabaseModel>{};
await this.ConnectToServer(database,server,port,user,password);
let entities = await this.GetAllTables();
await this.GetCoulmnsFromEntity(entities);
await this.GetIndexesFromEntity(entities);
await this.GetForeignKeysFromEntity(entities);
dbModel.entities = await this.GetAllTables();
await this.GetCoulmnsFromEntity(dbModel.entities);
await this.GetIndexesFromEntity(dbModel.entities);
dbModel.relations = await this.GetRelations();
await this.DisconnectFromServer();
return entities;
return dbModel;
}
abstract async ConnectToServer(database:string,server:string,port:number,user:string,password:string);
abstract async GetAllTables(): Promise<EntityInfo[]>
abstract async GetCoulmnsFromEntity(entity: EntityInfo[]);
abstract async GetIndexesFromEntity(entity: EntityInfo[]);
abstract async GetForeignKeysFromEntity(entity: EntityInfo[]);
abstract async GetRelations():Promise<RelationInfo[]>;
abstract async DisconnectFromServer();
}

View File

@ -90,8 +90,56 @@ ORDER BY
})
return entities;
}
GetForeignKeysFromEntity(entities: EntityInfo[]) {
throw new Error('Method not implemented.');
async GetRelations(): Promise<RelationInfo[]> {
let request = new MSSQL.Request(this.Connection)
let response: {
TableWithForeignKey: string, FK_PartNo: number, ForeignKeyColumn: string,
TableReferenced: string, ForeignKeyColumnReferenced: string,
onDelete: "RESTRICT" | "CASCADE" | "SET NULL", object_id: number
}[]
= await request.query(`select
parentTable.name as TableWithForeignKey,
fkc.constraint_column_id as FK_PartNo,
parentColumn.name as ForeignKeyColumn,
referencedTable.name as TableReferenced,
referencedColumn.name as ForeignKeyColumnReferenced,
fk.delete_referential_action_desc as onDelete,
fk.object_id
from
sys.foreign_keys fk
inner join
sys.foreign_key_columns as fkc on fkc.constraint_object_id=fk.object_id
inner join
sys.tables as parentTable on fkc.parent_object_id = parentTable.object_id
inner join
sys.columns as parentColumn on fkc.parent_object_id = parentColumn.object_id and fkc.parent_column_id = parentColumn.column_id
inner join
sys.tables as referencedTable on fkc.referenced_object_id = referencedTable.object_id
inner join
sys.columns as referencedColumn on fkc.referenced_object_id = referencedColumn.object_id and fkc.referenced_column_id = referencedColumn.column_id
where
fk.is_disabled=0 and fk.is_ms_shipped=0
order by
TableWithForeignKey, FK_PartNo`);
let relations: RelationInfo[] = <RelationInfo[]>[];
response.forEach((resp) => {
let rels = relations.find((val) => {
return val.object_id == resp.object_id;
})
if (rels == undefined) {
rels = <RelationInfo>{};
rels.ownerColumnsNames = [];
rels.referencedColumnsNames = [];
rels.actionOnDelete = resp.onDelete;
rels.object_id = resp.object_id;
rels.ownerTable = resp.TableWithForeignKey;
rels.referencedTableName = resp.TableReferenced;
relations.push(rels);
}
rels.ownerColumnsNames.push(resp.ForeignKeyColumn);
rels.referencedColumnsNames.push(resp.ForeignKeyColumnReferenced);
})
return relations;
}
async DisconnectFromServer() {
if (this.Connection)

View File

@ -6,5 +6,5 @@ interface ColumnInfo {
default:string,
is_nullable:boolean,
data_type:string,
char_max_lenght:number
}
char_max_lenght:number,
}

View File

@ -0,0 +1,4 @@
interface DatabaseModel{
entities: EntityInfo[],
relations: RelationInfo[]
}

View File

@ -0,0 +1,8 @@
interface RelationInfo{
ownerTable:string,
ownerColumnsNames:string[],
referencedTableName:string,
referencedColumnsNames:string[],
actionOnDelete:"RESTRICT"|"CASCADE"|"SET NULL",
object_id:number
}