Skip to content

Commit e1eadf4

Browse files
authored
Merge pull request #38 from ZorTik/development
Development
2 parents 2c86f75 + 5fae8ff commit e1eadf4

8 files changed

Lines changed: 82 additions & 7 deletions

File tree

api/src/main/java/me/zort/sqllib/api/data/QueryRowsResult.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,12 @@ public QueryRowsResult<T> rejectMessage(String message) {
2727
return this;
2828
}
2929

30+
@Override
31+
public String toString() {
32+
return "QueryRowsResult{" +
33+
"successful=" + successful +
34+
", rejectMessage='" + rejectMessage + '\'' +
35+
", data=" + super.toString() +
36+
'}';
37+
}
3038
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ public ColumnDefinition getDefinitionDetails(int index) {
1414
return definitions[index];
1515
}
1616

17+
public ColumnDefinition getDefinitionDetails(String name) {
18+
for (ColumnDefinition definition : definitions) {
19+
if (definition.getName().equals(name)) return definition;
20+
}
21+
return null;
22+
}
23+
1724
public String getDefinitionName(int index) {
1825
return getDefinitionDetails(index).getName();
1926
}

core/src/main/java/me/zort/sqllib/SQLDatabaseConnectionImpl.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ QueryRowsResult<Row> query(final @NotNull Query query, boolean isRetry) {
415415
}
416416

417417
cacheManager.set(query, result);
418-
418+
debug(result);
419419
return result;
420420
} catch (SQLException e) {
421421
if (!isRetry && e.getMessage().contains("database connection closed")) {
@@ -460,6 +460,7 @@ public QueryResult exec(final @NotNull String query) {
460460
stmt.execute();
461461
QueryResultImpl result = new QueryResultImpl(true);
462462
cacheManager.set(query, result);
463+
debug(result);
463464
return result;
464465
} catch (SQLException e) {
465466
if (!isRetry && e.getMessage().contains("database connection closed")) {
@@ -565,6 +566,13 @@ public void debug(String message) {
565566
if(options.isDebug()) logger.info(message);
566567
}
567568

569+
private void debug(QueryResult result) {
570+
debug("Query result: " + result);
571+
if (result instanceof QueryRowsResult) {
572+
debug("Rows: " + ((QueryRowsResult<?>) result).size());
573+
}
574+
}
575+
568576
@Override
569577
public void close() {
570578
if (errorCount > 0 && getAssignedPool() != null) {

core/src/main/java/me/zort/sqllib/internal/impl/QueryResultImpl.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,11 @@ public QueryResultImpl rejectMessage(String message) {
2525
return this;
2626
}
2727

28+
@Override
29+
public String toString() {
30+
return "QueryResultImpl{" +
31+
"successful=" + successful +
32+
", rejectMessage='" + rejectMessage + '\'' +
33+
'}';
34+
}
2835
}

core/src/main/java/me/zort/sqllib/mapping/DefaultResultAdapter.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public Object adaptResult(Method method, QueryResult result) {
1717
if(returnType.equals(QueryResult.class)) {
1818
return result;
1919
} else if (isVoid(returnType) || !(result instanceof QueryRowsResult)) {
20-
return null;
20+
return noResult(returnType, result.isSuccessful());
2121
}
2222
QueryRowsResult<?> rows = (QueryRowsResult<?>) result;
2323
if (List.class.isAssignableFrom(returnType)) return rows;
@@ -38,6 +38,12 @@ public Class<?> retrieveResultType(Method method) {
3838
}
3939
}
4040

41+
private static <T> Object noResult(Class<T> returnType, boolean successful) {
42+
if (Optional.class.isAssignableFrom(returnType)) return Optional.empty();
43+
if (List.class.isAssignableFrom(returnType)) return new QueryRowsResult<T>(successful);
44+
return null;
45+
}
46+
4147
// List<T>
4248
private static Class<?> getGenericArgument(Class<?> clazz, Type genericType, boolean throwNotFound) {
4349
Type[] typeParameters = ((ParameterizedType) genericType).getActualTypeArguments();

core/src/main/java/me/zort/sqllib/model/column/SQLColumnQueryBuilder.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,25 @@
44

55
import java.util.List;
66

7+
/**
8+
* This interface is used to build queries for column actions that are
9+
* used while synchronizing models.
10+
*
11+
* @author ZorTik
12+
*/
713
public interface SQLColumnQueryBuilder {
814

15+
/**
16+
* This method should return queries that result in modifying the 'to' column
17+
* to the 'from'. In simple terms, 'to' should be changed to 'from' definition
18+
* using the returned queries.
19+
*
20+
* @param action The column action
21+
* @param table Table name
22+
* @param from The new column definition
23+
* @param to The old column definition
24+
* @return List of SQL queries
25+
*/
926
List<String> buildActionQuery(ColumnAction action, String table, ColumnDefinition from, ColumnDefinition to);
1027

1128
enum ColumnAction {

core/src/main/java/me/zort/sqllib/model/column/SQLiteColumnQueryBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ public class SQLiteColumnQueryBuilder extends InnoColumnQueryBuilder {
1313
private final SQLiteDatabaseConnection connection;
1414
@Override
1515
public List<String> buildActionQuery(ColumnAction action, String table, ColumnDefinition from, ColumnDefinition to) {
16-
if (action.equals(ColumnAction.MODIFY)) {
16+
if (action.equals(ColumnAction.MODIFY) || action.equals(ColumnAction.RENAME)) {
1717
TableSchema schema = connection.getSchemaBuilder(table).buildTableSchema();
1818
String[] newDefinitions = new String[schema.size()];
1919
for (int i = 0; i < schema.size(); i++) {
20-
if (schema.getDefinitionName(i).equals(from.getName())) {
20+
if (schema.getDefinitionName(i).equals(to.getName())) {
2121
newDefinitions[i] = from.getName() + " " + from.getType();
2222
} else {
2323
newDefinitions[i] = schema.getDefinition(i);

core/src/main/java/me/zort/sqllib/model/schema/SQLSchemaSynchronizer.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ public class SQLSchemaSynchronizer implements SchemaSynchronizer<SQLDatabaseConn
2626
@Override
2727
public QueryResult synchronize(SQLDatabaseConnection source, TableSchema from, TableSchema to) {
2828
List<String> columnQueries = new ArrayList<>();
29-
for (int i = 0; i < Math.max(from.size(), to.size()); i++) {
30-
ColumnDefinition fromDefinition = from.size() > i ? from.getDefinitionDetails(i) : null;
31-
ColumnDefinition toDefinition = to.size() > i ? to.getDefinitionDetails(i) : null;
29+
ColumnDefinition[][] definitions = orderDefinitions(from, to);
30+
for (int i = 0; i < Math.max(definitions[0].length, definitions[1].length); i++) {
31+
final ColumnDefinition fromDefinition = definitions[0][i];
32+
final ColumnDefinition toDefinition = definitions[1][i];
3233

3334
if (fromDefinition == null && toDefinition != null) {
3435
columnQueries.addAll(columnQueryBuilder.buildActionQuery(SQLColumnQueryBuilder.ColumnAction.DROP, from.getTable(), fromDefinition, toDefinition));
@@ -55,4 +56,25 @@ public QueryResult synchronize(SQLDatabaseConnection source, TableSchema from, T
5556
}
5657
return results.stream().allMatch(QueryResult::isSuccessful) ? QueryResult.successful() : new QueryResultImpl(false);
5758
}
59+
60+
private static ColumnDefinition[][] orderDefinitions(TableSchema one, TableSchema two) {
61+
int maxSize = Math.max(one.size(), two.size());
62+
ColumnDefinition[][] definitions = new ColumnDefinition[2][maxSize];
63+
for (int i = 0; i < maxSize; i++) {
64+
if (one.size() > i && two.size() > i && two.getDefinitionDetails(one.getDefinitionName(i)) != null) {
65+
definitions[0][i] = one.getDefinitionDetails(i);
66+
definitions[1][i] = two.getDefinitionDetails(one.getDefinitionName(i));
67+
} else if (one.size() > i && two.size() > i) {
68+
definitions[0][i] = one.getDefinitionDetails(i);
69+
definitions[1][i] = two.getDefinitionDetails(i);
70+
} else if (one.size() > i) {
71+
definitions[0][i] = one.getDefinitionDetails(i);
72+
definitions[1][i] = null;
73+
} else if (two.size() > i) {
74+
definitions[1][i] = two.getDefinitionDetails(i);
75+
definitions[0][i] = null;
76+
}
77+
}
78+
return definitions;
79+
}
5880
}

0 commit comments

Comments
 (0)