Skip to content

Commit 63b168d

Browse files
committed
Schema synchronization improvements
1 parent 8d20ac3 commit 63b168d

4 files changed

Lines changed: 44 additions & 14 deletions

File tree

api/src/main/java/me/zort/sqllib/api/model/TableSchema.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package me.zort.sqllib.api.model;
22

3-
import me.zort.sqllib.util.Pair;
4-
53
public class TableSchema {
64

75
private final String table;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package me.zort.sqllib.internal.annotation;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
@Retention(RetentionPolicy.RUNTIME)
9+
@Target(ElementType.FIELD)
10+
public @interface Default {
11+
String value();
12+
}

core/src/main/java/me/zort/sqllib/model/DatabaseSchemaBuilder.java

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@
44
import me.zort.sqllib.api.model.TableSchema;
55
import 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;
119
import java.util.HashSet;
10+
import java.util.Map;
1211
import java.util.Set;
1312
import 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);

core/src/main/java/me/zort/sqllib/model/EntitySchemaBuilder.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import me.zort.sqllib.api.model.TableSchema;
88
import me.zort.sqllib.api.model.TableSchemaBuilder;
99
import me.zort.sqllib.api.options.NamingStrategy;
10+
import me.zort.sqllib.internal.annotation.Default;
1011
import me.zort.sqllib.internal.annotation.JsonField;
1112
import me.zort.sqllib.internal.annotation.NullableField;
1213
import me.zort.sqllib.internal.annotation.PrimaryKey;
@@ -66,6 +67,13 @@ public TableSchema buildTableSchema() {
6667
colType += " NOT NULL";
6768
}
6869
}
70+
if (colType != null && field.isAnnotationPresent(Default.class)) {
71+
String defaultValue = field.getAnnotation(Default.class).value();
72+
if ((field.getType().equals(String.class) || field.isAnnotationPresent(JsonField.class))
73+
&& !(defaultValue.startsWith("'") && defaultValue.endsWith("'")))
74+
defaultValue = "'" + defaultValue + "'";
75+
colType += " DEFAULT " + defaultValue;
76+
}
6977

7078
defs = Arrays.add(defs, new ColumnDefinition(colName, colType));
7179

0 commit comments

Comments
 (0)