@@ -1013,8 +1013,68 @@ public Map<String, DBRole> getRoles() {
1013
1013
1014
1014
@ Override
1015
1015
public Map <String , DBUserDefinedType > getUDTs (String schema ) {
1016
- System .out .println ("getting UDT's" );
1017
- return Collections .emptyMap ();
1016
+ final Map <String , DBUserDefinedType > objects = new HashMap <>();
1017
+ final String query =
1018
+ "SELECT \n "
1019
+ + " n.nspname AS schema,\n "
1020
+ + " t.typname AS name, \n "
1021
+ + " r.rolname AS owner,\n "
1022
+ + " pg_catalog.obj_description ( t.oid, 'pg_type' ) AS description\n "
1023
+ + "FROM pg_type t \n "
1024
+ + "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace \n "
1025
+ + "LEFT JOIN pg_roles r ON r.oid = t.typowner\n "
1026
+ + "WHERE (t.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid)) \n "
1027
+ + "AND NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type el WHERE el.oid = t.typelem AND el.typarray = t.oid)\n "
1028
+ + "AND t.typtype = 'c'\n "
1029
+ + "AND n.nspname = '" +schema +"'" ;
1030
+
1031
+ try (Statement stmt = getConnection ().createStatement (); ResultSet rs = stmt .executeQuery (query );) {
1032
+ while (rs .next ()) {
1033
+ final String name = rs .getString ("name" );
1034
+ final String owner = rs .getString ("owner" );
1035
+ final List <String > attributesSqls = new ArrayList <>();
1036
+ final String attributesQuery =
1037
+ "SELECT \n "
1038
+ + " attribute_name AS \" name\" , \n "
1039
+ + " data_type AS \" type\" , \n "
1040
+ + " ordinal_position AS \" order\" \n "
1041
+ + "FROM information_schema.attributes a\n "
1042
+ + "WHERE udt_schema = '" +schema +"' AND udt_name = '" +name +"'\n "
1043
+ + "ORDER BY ordinal_position" ;
1044
+ try (Statement stmt2 = getConnection ().createStatement (); ResultSet attributeRs = stmt2 .executeQuery (
1045
+ attributesQuery )) {
1046
+ while (attributeRs .next ()) {
1047
+ final String attrName = attributeRs .getString ("name" );
1048
+ final String attrType = attributeRs .getString ("type" );
1049
+ final String udtAttrDefinition = MessageFormat .format (
1050
+ "{0} {1}" ,
1051
+ escapeNameIfNeeded (attrName ),
1052
+ attrType
1053
+ );
1054
+ attributesSqls .add (udtAttrDefinition );
1055
+ }
1056
+ }
1057
+ final StringProperties options = new StringProperties ();
1058
+ final String sql = MessageFormat .format (
1059
+ "CREATE TYPE {0}.{1} AS (\n {2}\n );\n "
1060
+ + "ALTER TYPE {0}.{1} OWNER TO {3};" ,
1061
+ escapeNameIfNeeded (schema ),
1062
+ escapeNameIfNeeded (name ),
1063
+ String .join (",\n " , attributesSqls ),
1064
+ owner
1065
+ );
1066
+
1067
+ DBUserDefinedType object = new DBUserDefinedType (name , options , schema , owner , Collections .emptySet (), sql );
1068
+ options .addChild ("attributes" , String .join ("," , attributesSqls ));
1069
+ options .addChild ("description" , rs .getString ("description" ));
1070
+ objects .put (name , object );
1071
+ }
1072
+
1073
+ } catch (Exception e ) {
1074
+ throw new ExceptionDBGitRunTime (e );
1075
+ }
1076
+
1077
+ return objects ;
1018
1078
}
1019
1079
1020
1080
@ Override
@@ -1024,7 +1084,7 @@ public Map<String, DBDomain> getDomains(String schema) {
1024
1084
final String query =
1025
1085
"SELECT \n "
1026
1086
+ " n.nspname,\n "
1027
- + " t.typname, \n "
1087
+ + " t.typname, \n "
1028
1088
+ " dom.data_type, \n "
1029
1089
+ " dom.domain_default,\n "
1030
1090
+ " r.rolname,\n "
@@ -1038,7 +1098,6 @@ public Map<String, DBDomain> getDomains(String schema) {
1038
1098
+ "AND n.nspname NOT IN ('pg_catalog', 'information_schema')\n "
1039
1099
+ "AND dom.domain_schema = '" +schema +"'" ;
1040
1100
1041
- System .out .println ("query = " + query );
1042
1101
try (Statement stmt = getConnection ().createStatement (); ResultSet rs = stmt .executeQuery (query );) {
1043
1102
1044
1103
while (rs .next ()) {
@@ -1059,16 +1118,14 @@ public Map<String, DBDomain> getDomains(String schema) {
1059
1118
final String conName = conRs .getString ("conname" );
1060
1119
final String conSrc = conRs .getString ("consrc" );
1061
1120
final Boolean conIsValidated = conRs .getBoolean ("convalidated" );
1062
- final String conSql = MessageFormat .format (
1121
+ constraintSqls . add ( MessageFormat .format (
1063
1122
"ALTER DOMAIN {0}.{1} ADD CONSTRAINT {2} CHECK {3} {4};" ,
1064
- escapeNameIfNeeded (schema ),
1065
- escapeNameIfNeeded (name ),
1066
- escapeNameIfNeeded (conName ),
1067
- conSrc ,
1123
+ escapeNameIfNeeded (schema ),
1124
+ escapeNameIfNeeded (name ),
1125
+ escapeNameIfNeeded (conName ),
1126
+ conSrc ,
1068
1127
conIsValidated ? "" : "NOT VALID"
1069
- );
1070
- constraintSqls .add (conSql );
1071
- System .out .println ("conSql = " + conSql );
1128
+ ));
1072
1129
}
1073
1130
}
1074
1131
@@ -1078,7 +1135,6 @@ public Map<String, DBDomain> getDomains(String schema) {
1078
1135
escapeNameIfNeeded (schema ), escapeNameIfNeeded (name ), type , defaultValue != null ? "DEFAULT " + defaultValue : "" , owner ,
1079
1136
String .join ("\n " , constraintSqls )
1080
1137
);
1081
- System .out .println ("sql = " + sql );
1082
1138
1083
1139
DBDomain object = new DBDomain (name , options , schema , owner , Collections .emptySet (), sql );
1084
1140
objects .put (name , object );
@@ -1112,23 +1168,23 @@ public Map<String, DBEnum> getEnums(String schema) {
1112
1168
+ "AND n.nspname = '" +schema +"'"
1113
1169
+ "AND t.typtype = 'e'" ;
1114
1170
1115
- System .out .println ("query = " + query );
1116
1171
try (Statement stmt = getConnection ().createStatement (); ResultSet rs = stmt .executeQuery (query );) {
1117
1172
1118
1173
while (rs .next ()) {
1119
1174
final String name = rs .getString ("typname" );
1120
1175
final String owner = rs .getString ("rolname" );
1121
- final StringProperties options = new StringProperties (rs );
1122
- final List <String > elements = Arrays .stream ((String []) rs .getArray ("elements" ).getArray ())
1123
- .map ( x ->"'" +x +"'" )
1124
- .collect (Collectors .toList ());
1176
+ final String elements = String .join (
1177
+ "," ,
1178
+ Arrays .stream ((String []) rs .getArray ("elements" ).getArray ()).map ( x ->"'" +x +"'" ).collect (Collectors .toList ())
1179
+ );
1180
+ final StringProperties options = new StringProperties ();
1125
1181
final String sql = MessageFormat .format (
1126
- "CREATE TYPE {0}.{1} AS ENUM ({2});\n ALTER TYPE {0}.{1} ONWER TO {3}" ,
1127
- schema , name , String . join ( "," , elements ) , owner
1182
+ "CREATE TYPE {0}.{1} AS ENUM ({2});\n ALTER TYPE {0}.{1} OWNER TO {3}" ,
1183
+ schema , name , elements , owner
1128
1184
);
1129
- System .out .println ("sql = " + sql );
1130
1185
1131
1186
DBEnum object = new DBEnum (name , options , schema , owner , Collections .emptySet (), sql );
1187
+ options .addChild ("elements" , elements );
1132
1188
objects .put (name , object );
1133
1189
}
1134
1190
@@ -1141,20 +1197,32 @@ public Map<String, DBEnum> getEnums(String schema) {
1141
1197
1142
1198
@ Override
1143
1199
public DBUserDefinedType getUDT (String schema , String name ) {
1144
- final String msg = lang .getValue ("errors" , "adapter" , "objectNotFoundInDb" ).toString ();
1145
- throw new ExceptionDBGitObjectNotFound (msg );
1200
+ final Map <String , DBUserDefinedType > udTs = getUDTs (schema );
1201
+ if (udTs .containsKey (name )) {
1202
+ return udTs .get (name );
1203
+ } else {
1204
+ throw new ExceptionDBGitObjectNotFound (lang .getValue ("errors" , "adapter" , "objectNotFoundInDb" ).toString ());
1205
+ }
1146
1206
}
1147
1207
1148
1208
@ Override
1149
1209
public DBDomain getDomain (String schema , String name ) {
1150
- final String msg = lang .getValue ("errors" , "adapter" , "objectNotFoundInDb" ).toString ();
1151
- throw new ExceptionDBGitObjectNotFound (msg );
1210
+ final Map <String , DBDomain > domains = getDomains (schema );
1211
+ if (domains .containsKey (name )) {
1212
+ return domains .get (name );
1213
+ } else {
1214
+ throw new ExceptionDBGitObjectNotFound (lang .getValue ("errors" , "adapter" , "objectNotFoundInDb" ).toString ());
1215
+ }
1152
1216
}
1153
1217
1154
1218
@ Override
1155
1219
public DBEnum getEnum (String schema , String name ) {
1156
- final String msg = lang .getValue ("errors" , "adapter" , "objectNotFoundInDb" ).toString ();
1157
- throw new ExceptionDBGitObjectNotFound (msg );
1220
+ final Map <String , DBEnum > enums = getEnums (schema );
1221
+ if (enums .containsKey (name )) {
1222
+ return enums .get (name );
1223
+ } else {
1224
+ throw new ExceptionDBGitObjectNotFound (lang .getValue ("errors" , "adapter" , "objectNotFoundInDb" ).toString ());
1225
+ }
1158
1226
}
1159
1227
1160
1228
@ Override
0 commit comments