commit
5c877d9f44
|
@ -0,0 +1,28 @@
|
||||||
|
version: "3.8"
|
||||||
|
services:
|
||||||
|
db:
|
||||||
|
container_name: postgres-vehicle
|
||||||
|
image: postgres
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: root
|
||||||
|
POSTGRES_PASSWORD: root
|
||||||
|
POSTGRES_DB: main
|
||||||
|
ports:
|
||||||
|
- "5432:5432"
|
||||||
|
volumes:
|
||||||
|
#- pg_data:/var/lib/postgresql/data/
|
||||||
|
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
|
||||||
|
|
||||||
|
pgadmin:
|
||||||
|
container_name: pgadmin
|
||||||
|
image: dpage/pgadmin4
|
||||||
|
restart: always
|
||||||
|
environment:
|
||||||
|
PGADMIN_DEFAULT_EMAIL: root@root.com
|
||||||
|
PGADMIN_DEFAULT_PASSWORD: root
|
||||||
|
ports:
|
||||||
|
- "5050:80"
|
||||||
|
|
||||||
|
#volumes:
|
||||||
|
# pg_data:
|
|
@ -0,0 +1,52 @@
|
||||||
|
SELECT 'CREATE DATABASE main'
|
||||||
|
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'main')\gexec
|
||||||
|
CREATE TABLE Vehicles (
|
||||||
|
id bigint NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ),
|
||||||
|
Registration text COLLATE pg_catalog."default",
|
||||||
|
Make text COLLATE pg_catalog."default",
|
||||||
|
Model text COLLATE pg_catalog."default",
|
||||||
|
Colour text COLLATE pg_catalog."default",
|
||||||
|
Year smallint,
|
||||||
|
CONSTRAINT Vehicles_pkey PRIMARY KEY (id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE ServiceLog (
|
||||||
|
id bigint NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ),
|
||||||
|
Description text COLLATE pg_catalog."default",
|
||||||
|
VehicleId bigint,
|
||||||
|
ServiceDate timestamp without time zone,
|
||||||
|
Category text COLLATE pg_catalog."default",
|
||||||
|
Mileage bigint,
|
||||||
|
CONSTRAINT ServiceLog_pkey PRIMARY KEY (id),
|
||||||
|
CONSTRAINT vehicle_foreign_key FOREIGN KEY (VehicleId)
|
||||||
|
REFERENCES Vehicles (id) MATCH SIMPLE
|
||||||
|
ON UPDATE NO ACTION
|
||||||
|
ON DELETE NO ACTION
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO Vehicles (Registration, Make, Model, Colour, Year)
|
||||||
|
VALUES ('FAZ 9837','Volkswagen','Polo','White',2002);
|
||||||
|
INSERT INTO Vehicles (Registration, Make, Model, Colour, Year)
|
||||||
|
VALUES ('JHI 8827','BMW','M3','Black',2013);
|
||||||
|
INSERT INTO Vehicles (Registration, Make, Model, Colour, Year)
|
||||||
|
VALUES ('D903PI','Volvo','XC40','Grey',2014);
|
||||||
|
INSERT INTO Vehicles (Registration, Make, Model, Colour, Year)
|
||||||
|
VALUES ('YFI002','Volkswagen','Golf','Dark Blue',2018);
|
||||||
|
INSERT INTO Vehicles (Registration, Make, Model, Colour, Year)
|
||||||
|
VALUES ('HGT5677','Skoda','Octavia','Graphite',2009);
|
||||||
|
INSERT INTO Vehicles (Registration, Make, Model, Colour, Year)
|
||||||
|
VALUES ('PPF9276','Skoda','Octavia','Graphite',2021);
|
||||||
|
INSERT INTO Vehicles (Registration, Make, Model, Colour, Year)
|
||||||
|
VALUES ('J893FT','Toyota','Corolla','Red',2015);
|
||||||
|
INSERT INTO Vehicles (Registration, Make, Model, Colour, Year)
|
||||||
|
VALUES ('MJK776','Honda','HR-V','Silver',2015);
|
||||||
|
|
||||||
|
|
||||||
|
INSERT INTO ServiceLog (Description, VehicleId, ServiceDate, Category, Mileage)
|
||||||
|
VALUES ('Change front brakes', 1, '2021-05-04', 'Brakes', 20667);
|
||||||
|
INSERT INTO ServiceLog (Description, VehicleId, ServiceDate, Category, Mileage)
|
||||||
|
VALUES ('Tyres - full set', 1, '2021-05-04', 'Brakes', 20667);
|
||||||
|
INSERT INTO ServiceLog (Description, VehicleId, ServiceDate, Category, Mileage)
|
||||||
|
VALUES ('Engine tune up', 2, '2021-07-14', 'Brakes', 50889);
|
||||||
|
INSERT INTO ServiceLog (Description, VehicleId, ServiceDate, Category, Mileage)
|
||||||
|
VALUES ('Replace transmission', 3, '2021-09-26', 'Transmission', 98002);
|
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/bash
|
||||||
|
docker-compose down
|
||||||
|
docker volume prune -f
|
|
@ -437,7 +437,11 @@ module External {
|
||||||
for (let [colName, { isMany, rows, tableId }] of Object.entries(
|
for (let [colName, { isMany, rows, tableId }] of Object.entries(
|
||||||
related
|
related
|
||||||
)) {
|
)) {
|
||||||
const table = this.getTable(tableId)
|
const table: Table = this.getTable(tableId)
|
||||||
|
// if its not the foreign key skip it, nothing to do
|
||||||
|
if (table.primary && table.primary.indexOf(colName) !== -1) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
for (let row of rows) {
|
for (let row of rows) {
|
||||||
const filters = buildFilters(generateIdForRow(row, table), {}, table)
|
const filters = buildFilters(generateIdForRow(row, table), {}, table)
|
||||||
// safety check, if there are no filters on deletion bad things happen
|
// safety check, if there are no filters on deletion bad things happen
|
||||||
|
|
|
@ -12,7 +12,7 @@ import { getSqlQuery } from "./utils"
|
||||||
module MySQLModule {
|
module MySQLModule {
|
||||||
const mysql = require("mysql")
|
const mysql = require("mysql")
|
||||||
const Sql = require("./base/sql")
|
const Sql = require("./base/sql")
|
||||||
const { buildExternalTableId, convertType } = require("./utils")
|
const { buildExternalTableId, convertType, copyExistingPropsOver } = require("./utils")
|
||||||
const { FieldTypes } = require("../constants")
|
const { FieldTypes } = require("../constants")
|
||||||
|
|
||||||
interface MySQLConfig {
|
interface MySQLConfig {
|
||||||
|
@ -194,18 +194,7 @@ module MySQLModule {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// add the existing relationships from the entities if they exist, to prevent them from being overridden
|
copyExistingPropsOver(tableName, tables, entities)
|
||||||
if (entities && entities[tableName]) {
|
|
||||||
const existingTableSchema = entities[tableName].schema
|
|
||||||
for (let key in existingTableSchema) {
|
|
||||||
if (!existingTableSchema.hasOwnProperty(key)) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if (existingTableSchema[key].type === "link") {
|
|
||||||
tables[tableName].schema[key] = existingTableSchema[key]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.client.end()
|
this.client.end()
|
||||||
|
|
|
@ -12,7 +12,7 @@ module PostgresModule {
|
||||||
const { Pool } = require("pg")
|
const { Pool } = require("pg")
|
||||||
const Sql = require("./base/sql")
|
const Sql = require("./base/sql")
|
||||||
const { FieldTypes } = require("../constants")
|
const { FieldTypes } = require("../constants")
|
||||||
const { buildExternalTableId, convertType } = require("./utils")
|
const { buildExternalTableId, convertType, copyExistingPropsOver } = require("./utils")
|
||||||
|
|
||||||
interface PostgresConfig {
|
interface PostgresConfig {
|
||||||
host: string
|
host: string
|
||||||
|
@ -173,31 +173,24 @@ module PostgresModule {
|
||||||
name: tableName,
|
name: tableName,
|
||||||
schema: {},
|
schema: {},
|
||||||
}
|
}
|
||||||
|
|
||||||
// add the existing relationships from the entities if they exist, to prevent them from being overridden
|
|
||||||
if (entities && entities[tableName]) {
|
|
||||||
const existingTableSchema = entities[tableName].schema
|
|
||||||
for (let key in existingTableSchema) {
|
|
||||||
if (!existingTableSchema.hasOwnProperty(key)) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if (existingTableSchema[key].type === "link") {
|
|
||||||
tables[tableName].schema[key] = existingTableSchema[key]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const type: string = convertType(column.data_type, TYPE_MAP)
|
const type: string = convertType(column.data_type, TYPE_MAP)
|
||||||
const isAuto: boolean =
|
const identity = !!(column.identity_generation || column.identity_start || column.identity_increment)
|
||||||
typeof column.column_default === "string" &&
|
const hasDefault = typeof column.column_default === "string" &&
|
||||||
column.column_default.startsWith("nextval")
|
column.column_default.startsWith("nextval")
|
||||||
|
const isGenerated = column.is_generated && column.is_generated !== "NEVER"
|
||||||
|
const isAuto: boolean = hasDefault || identity || isGenerated
|
||||||
tables[tableName].schema[columnName] = {
|
tables[tableName].schema[columnName] = {
|
||||||
autocolumn: isAuto,
|
autocolumn: isAuto,
|
||||||
name: columnName,
|
name: columnName,
|
||||||
type,
|
type,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (let tableName of Object.keys(tables)) {
|
||||||
|
copyExistingPropsOver(tableName, tables, entities)
|
||||||
|
}
|
||||||
this.tables = tables
|
this.tables = tables
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -82,3 +82,21 @@ export function isIsoDateString(str: string) {
|
||||||
let d = new Date(str)
|
let d = new Date(str)
|
||||||
return d.toISOString() === str
|
return d.toISOString() === str
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add the existing relationships from the entities if they exist, to prevent them from being overridden
|
||||||
|
export function copyExistingPropsOver(tableName: string, tables: { [key: string]: any }, entities: { [key: string]: any }) {
|
||||||
|
if (entities && entities[tableName]) {
|
||||||
|
if (entities[tableName].primaryDisplay) {
|
||||||
|
tables[tableName].primaryDisplay = entities[tableName].primaryDisplay
|
||||||
|
}
|
||||||
|
const existingTableSchema = entities[tableName].schema
|
||||||
|
for (let key in existingTableSchema) {
|
||||||
|
if (!existingTableSchema.hasOwnProperty(key)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (existingTableSchema[key].type === "link") {
|
||||||
|
tables[tableName].schema[key] = existingTableSchema[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue