44import me .zort .sqllib .api .model .TableSchema ;
55import me .zort .sqllib .api .model .TableSchemaBuilder ;
66
7- import java .sql .PreparedStatement ;
8- import java .sql .ResultSet ;
9- import java .sql .ResultSetMetaData ;
10- import java .sql .SQLException ;
7+ import java .sql .*;
8+ import java .util .HashMap ;
119import java .util .HashSet ;
10+ import java .util .Map ;
1211import java .util .Set ;
1312import java .util .function .Function ;
1413
@@ -31,24 +30,37 @@ public DatabaseSchemaBuilder(Function<String, PreparedStatement> statementFactor
3130 public TableSchema buildTableSchema () {
3231 try (PreparedStatement statement = statementFactory .apply ("SELECT * FROM " + table + " LIMIT 0;" );
3332 ResultSet rs = statement .executeQuery ()) {
34- ResultSetMetaData meta = rs .getMetaData ();
35- ResultSet primaryKeysRS = statement .getConnection ().getMetaData ().getPrimaryKeys (null , null , table );
33+ ResultSetMetaData rsMeta = rs .getMetaData ();
34+ DatabaseMetaData connectionMeta = statement .getConnection ().getMetaData ();
35+ ResultSet primaryKeysRS = connectionMeta .getPrimaryKeys (null , null , table );
36+ ResultSet defaultValuesRS = connectionMeta .getColumns (null , null , table , null );
3637 Set <String > primaryKeys = new HashSet <>();
38+ Map <String , String > defaultValues = new HashMap <>();
3739 while (primaryKeysRS .next ()) {
3840 primaryKeys .add (primaryKeysRS .getString ("COLUMN_NAME" ).toUpperCase ());
3941 }
42+ while (defaultValuesRS .next ()) {
43+ String defaultValue = defaultValuesRS .getString ("COLUMN_DEF" );
44+ if (defaultValue != null ) {
45+ defaultValues .put (defaultValuesRS .getString ("COLUMN_NAME" ).toUpperCase (), defaultValue );
46+ }
47+ }
4048 primaryKeysRS .close ();
49+ defaultValuesRS .close ();
4150
42- ColumnDefinition [] definitions = new ColumnDefinition [meta .getColumnCount ()];
51+ ColumnDefinition [] definitions = new ColumnDefinition [rsMeta .getColumnCount ()];
4352 for (int i = 0 ; i < definitions .length ; i ++) {
44- String name = meta .getColumnName (i + 1 );
45- String type = prepareColumnType (meta .getColumnTypeName (i + 1 ));
46- if (meta .getColumnClassName (i + 1 ).equals (String .class .getName ()) && meta .getColumnDisplaySize (i + 1 ) > 0 ) {
47- type += "(" + meta .getColumnDisplaySize (i + 1 ) + ")" ;
53+ String name = rsMeta .getColumnName (i + 1 );
54+ String type = prepareColumnType (rsMeta .getColumnTypeName (i + 1 ));
55+ if (rsMeta .getColumnClassName (i + 1 ).equals (String .class .getName ()) && rsMeta .getColumnDisplaySize (i + 1 ) > 0 ) {
56+ type += "(" + rsMeta .getColumnDisplaySize (i + 1 ) + ")" ;
4857 }
49- if (primaryKeys .contains (meta . getColumnName ( i + 1 ) .toUpperCase ())) {
58+ if (primaryKeys .contains (name .toUpperCase ())) {
5059 type += " PRIMARY KEY" ;
5160 }
61+ if (defaultValues .containsKey (name .toUpperCase ())) {
62+ type += " DEFAULT " + defaultValues .get (name .toUpperCase ());
63+ }
5264 definitions [i ] = new ColumnDefinition (name , type );
5365 }
5466 return new TableSchema (table , definitions );
0 commit comments