1
1
import { nanoid } from "nanoid" ;
2
- import { Cardinality , DB } from "../../data/constants" ;
2
+ import { Cardinality , Constraint , DB } from "../../data/constants" ;
3
3
import { dbToTypes } from "../../data/datatypes" ;
4
4
import { buildSQLFromAST } from "./shared" ;
5
5
@@ -13,6 +13,7 @@ const affinity = {
13
13
INTEGER : "INT" ,
14
14
MEDIUMINT : "INTEGER" ,
15
15
BIT : "BOOLEAN" ,
16
+ "CHATACTER VARYING" : "VARCHAR" ,
16
17
} ,
17
18
{ get : ( target , prop ) => ( prop in target ? target [ prop ] : "BLOB" ) } ,
18
19
) ,
@@ -50,8 +51,11 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) {
50
51
d . definition . dataType ,
51
52
) ,
52
53
) ?. name ;
53
- if ( ! type && ! dbToTypes [ diagramDb ] [ d . definition . dataType ] )
54
- type = affinity [ diagramDb ] [ d . definition . dataType . toUpperCase ( ) ] ;
54
+
55
+ type ??=
56
+ dbToTypes [ diagramDb ] [ d . definition . dataType . toUpperCase ( ) ] . type ;
57
+ type ??= affinity [ diagramDb ] [ d . definition . dataType . toUpperCase ( ) ] ;
58
+
55
59
field . type = type ;
56
60
57
61
if ( d . definition . expr && d . definition . expr . type === "expr_list" ) {
@@ -144,8 +148,8 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) {
144
148
relationship . endTableId = endTable . id ;
145
149
relationship . endFieldId = endField . id ;
146
150
relationship . startFieldId = startField . id ;
147
- let updateConstraint = "No action" ;
148
- let deleteConstraint = "No action" ;
151
+ let updateConstraint = Constraint . NONE ;
152
+ let deleteConstraint = Constraint . NONE ;
149
153
d . reference_definition . on_action . forEach ( ( c ) => {
150
154
if ( c . type === "on update" ) {
151
155
updateConstraint = c . value . value ;
@@ -178,8 +182,8 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) {
178
182
const endTableName = d . reference_definition . table [ 0 ] . table ;
179
183
const endFieldName =
180
184
d . reference_definition . definition [ 0 ] . column . expr . value ;
181
- let updateConstraint = "No action" ;
182
- let deleteConstraint = "No action" ;
185
+ let updateConstraint = Constraint . NONE ;
186
+ let deleteConstraint = Constraint . NONE ;
183
187
d . reference_definition . on_action . forEach ( ( c ) => {
184
188
if ( c . type === "on update" ) {
185
189
updateConstraint = c . value . value ;
@@ -281,73 +285,77 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) {
281
285
}
282
286
}
283
287
} else if ( e . type === "alter" ) {
284
- e . expr . forEach ( ( expr ) => {
285
- if (
286
- expr . action === "add" &&
287
- expr . create_definitions . constraint_type . toLowerCase ( ) ===
288
- "foreign key"
289
- ) {
290
- const relationship = { } ;
291
- const startTableName = e . table [ 0 ] . table ;
292
- const startFieldName =
293
- expr . create_definitions . definition [ 0 ] . column . expr . value ;
294
- const endTableName =
295
- expr . create_definitions . reference_definition . table [ 0 ] . table ;
296
- const endFieldName =
297
- expr . create_definitions . reference_definition . definition [ 0 ] . column
298
- . expr . value ;
299
- let updateConstraint = "No action" ;
300
- let deleteConstraint = "No action" ;
301
- expr . create_definitions . reference_definition . on_action . forEach (
302
- ( c ) => {
303
- if ( c . type === "on update" ) {
304
- updateConstraint = c . value . value ;
305
- updateConstraint =
306
- updateConstraint [ 0 ] . toUpperCase ( ) +
307
- updateConstraint . substring ( 1 ) ;
308
- } else if ( c . type === "on delete" ) {
309
- deleteConstraint = c . value . value ;
310
- deleteConstraint =
311
- deleteConstraint [ 0 ] . toUpperCase ( ) +
312
- deleteConstraint . substring ( 1 ) ;
313
- }
314
- } ,
315
- ) ;
316
-
317
- const startTable = tables . find ( ( t ) => t . name === startTableName ) ;
318
- if ( ! startTable ) return ;
288
+ if ( Array . isArray ( e . expr ) ) {
289
+ e . expr . forEach ( ( expr ) => {
290
+ if (
291
+ expr . action === "add" &&
292
+ expr . create_definitions . constraint_type . toLowerCase ( ) ===
293
+ "foreign key"
294
+ ) {
295
+ const relationship = { } ;
296
+ const startTableName = e . table [ 0 ] . table ;
297
+ const startFieldName =
298
+ expr . create_definitions . definition [ 0 ] . column . expr . value ;
299
+ const endTableName =
300
+ expr . create_definitions . reference_definition . table [ 0 ] . table ;
301
+ const endFieldName =
302
+ expr . create_definitions . reference_definition . definition [ 0 ] . column
303
+ . expr . value ;
304
+ let updateConstraint = Constraint . NONE ;
305
+ let deleteConstraint = Constraint . NONE ;
306
+ expr . create_definitions . reference_definition . on_action . forEach (
307
+ ( c ) => {
308
+ if ( c . type === "on update" ) {
309
+ updateConstraint = c . value . value ;
310
+ updateConstraint =
311
+ updateConstraint [ 0 ] . toUpperCase ( ) +
312
+ updateConstraint . substring ( 1 ) ;
313
+ } else if ( c . type === "on delete" ) {
314
+ deleteConstraint = c . value . value ;
315
+ deleteConstraint =
316
+ deleteConstraint [ 0 ] . toUpperCase ( ) +
317
+ deleteConstraint . substring ( 1 ) ;
318
+ }
319
+ } ,
320
+ ) ;
319
321
320
- const endTable = tables . find ( ( t ) => t . name === endTableName ) ;
321
- if ( ! endTable ) return ;
322
+ const startTable = tables . find ( ( t ) => t . name === startTableName ) ;
323
+ if ( ! startTable ) return ;
322
324
323
- const endField = endTable . fields . find ( ( f ) => f . name === endFieldName ) ;
324
- if ( ! endField ) return ;
325
+ const endTable = tables . find ( ( t ) => t . name === endTableName ) ;
326
+ if ( ! endTable ) return ;
325
327
326
- const startField = startTable . fields . find (
327
- ( f ) => f . name === startFieldName ,
328
- ) ;
329
- if ( ! startField ) return ;
328
+ const endField = endTable . fields . find (
329
+ ( f ) => f . name === endFieldName ,
330
+ ) ;
331
+ if ( ! endField ) return ;
330
332
331
- relationship . name = `fk_${ startTableName } _${ startFieldName } _${ endTableName } ` ;
332
- relationship . startTableId = startTable . id ;
333
- relationship . startFieldId = startField . id ;
334
- relationship . endTableId = endTable . id ;
335
- relationship . endFieldId = endField . id ;
336
- relationship . updateConstraint = updateConstraint ;
337
- relationship . deleteConstraint = deleteConstraint ;
338
- relationship . cardinality = Cardinality . ONE_TO_ONE ;
333
+ const startField = startTable . fields . find (
334
+ ( f ) => f . name === startFieldName ,
335
+ ) ;
336
+ if ( ! startField ) return ;
339
337
340
- if ( startField . unique ) {
338
+ relationship . name = `fk_${ startTableName } _${ startFieldName } _${ endTableName } ` ;
339
+ relationship . startTableId = startTable . id ;
340
+ relationship . startFieldId = startField . id ;
341
+ relationship . endTableId = endTable . id ;
342
+ relationship . endFieldId = endField . id ;
343
+ relationship . updateConstraint = updateConstraint ;
344
+ relationship . deleteConstraint = deleteConstraint ;
341
345
relationship . cardinality = Cardinality . ONE_TO_ONE ;
342
- } else {
343
- relationship . cardinality = Cardinality . MANY_TO_ONE ;
344
- }
345
346
346
- relationships . push ( relationship ) ;
347
+ if ( startField . unique ) {
348
+ relationship . cardinality = Cardinality . ONE_TO_ONE ;
349
+ } else {
350
+ relationship . cardinality = Cardinality . MANY_TO_ONE ;
351
+ }
347
352
348
- relationships . forEach ( ( r , i ) => ( r . id = i ) ) ;
349
- }
350
- } ) ;
353
+ relationships . push ( relationship ) ;
354
+
355
+ relationships . forEach ( ( r , i ) => ( r . id = i ) ) ;
356
+ }
357
+ } ) ;
358
+ }
351
359
}
352
360
} ;
353
361
0 commit comments