Skip to content

Commit 4bc5d04

Browse files
committed
Merge branch 'release/1.14'
2 parents bda4433 + 2b62604 commit 4bc5d04

File tree

9 files changed

+237
-3
lines changed

9 files changed

+237
-3
lines changed

dependency-reduced-pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<modelVersion>4.0.0</modelVersion>
44
<groupId>fr.maxlego08.sarah</groupId>
55
<artifactId>SarahORM</artifactId>
6-
<version>1.13</version>
6+
<version>1.14</version>
77
<build>
88
<plugins>
99
<plugin>

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>fr.maxlego08.sarah</groupId>
88
<artifactId>SarahORM</artifactId>
9-
<version>1.13</version>
9+
<version>1.14</version>
1010

1111
<properties>
1212
<maven.compiler.source>1.8</maven.compiler.source>

src/main/java/fr/maxlego08/sarah/SchemaBuilder.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import fr.maxlego08.sarah.requests.DeleteRequest;
1616
import fr.maxlego08.sarah.requests.DropTableRequest;
1717
import fr.maxlego08.sarah.requests.InsertRequest;
18+
import fr.maxlego08.sarah.requests.ModifyRequest;
19+
import fr.maxlego08.sarah.requests.RenameExecutor;
1820
import fr.maxlego08.sarah.requests.UpdateRequest;
1921
import fr.maxlego08.sarah.requests.UpsertRequest;
2022

@@ -53,6 +55,7 @@ public class SchemaBuilder implements Schema {
5355
private final List<WhereCondition> whereConditions = new ArrayList<>();
5456
private final List<JoinCondition> joinConditions = new ArrayList<>();
5557
private final List<SelectCondition> selectColumns = new ArrayList<>();
58+
private String newTableName;
5659
private String orderBy;
5760
private Migration migration;
5861
private boolean isDistinct;
@@ -62,6 +65,37 @@ private SchemaBuilder(String tableName, SchemaType schemaType) {
6265
this.schemaType = schemaType;
6366
}
6467

68+
public static Schema copy(String tableName, SchemaType newSchemaType, Schema oldSchema) {
69+
SchemaBuilder schema = new SchemaBuilder(tableName, newSchemaType);
70+
71+
schema.columns.addAll(oldSchema.getColumns());
72+
schema.primaryKeys.addAll(oldSchema.getPrimaryKeys());
73+
schema.foreignKeys.addAll(oldSchema.getForeignKeys());
74+
schema.whereConditions.addAll(oldSchema.getWhereConditions());
75+
schema.joinConditions.addAll(oldSchema.getJoinConditions());
76+
schema.selectColumns.addAll(oldSchema.getSelectColumns());
77+
schema.orderBy = oldSchema.getOrderBy();
78+
schema.migration = oldSchema.getMigration();
79+
schema.isDistinct = oldSchema.isDistinct();
80+
schema.newTableName = oldSchema.getNewTableName();
81+
82+
return schema;
83+
}
84+
85+
public static Schema rename(String tableName, String newTableName) {
86+
return rename(null, tableName, newTableName);
87+
}
88+
89+
public static Schema rename(Migration migration, String tableName, String newTableName) {
90+
SchemaBuilder schema = new SchemaBuilder(tableName, SchemaType.RENAME);
91+
schema.newTableName = newTableName;
92+
if (migration != null) {
93+
schema.migration = migration;
94+
MigrationManager.registerSchema(schema);
95+
}
96+
return schema;
97+
}
98+
6599
public static Schema create(Migration migration, String tableName, Class<?> template) {
66100
return create(migration, tableName, ConsumerConstructor.createConsumerFromTemplate(template, null));
67101
}
@@ -76,6 +110,16 @@ public static Schema create(Migration migration, String tableName, Consumer<Sche
76110
return schema;
77111
}
78112

113+
public static Schema modify(Migration migration, String tableName, Consumer<Schema> consumer) {
114+
SchemaBuilder schema = new SchemaBuilder(tableName, SchemaType.MODIFY);
115+
if (migration != null) {
116+
schema.migration = migration;
117+
MigrationManager.registerSchema(schema);
118+
}
119+
consumer.accept(schema);
120+
return schema;
121+
}
122+
79123
public static Schema drop(Migration migration, String tableName) {
80124
SchemaBuilder schema = new SchemaBuilder(tableName, SchemaType.DROP);
81125
if (migration != null) {
@@ -651,6 +695,12 @@ public boolean isDistinct() {
651695
public int execute(DatabaseConnection databaseConnection, Logger logger) throws SQLException {
652696
Executor executor;
653697
switch (this.schemaType) {
698+
case RENAME:
699+
executor = new RenameExecutor(this);
700+
break;
701+
case MODIFY:
702+
executor = new ModifyRequest(this);
703+
break;
654704
case CREATE:
655705
executor = new CreateRequest(this);
656706
break;
@@ -706,4 +756,19 @@ public void addSelect(String prefix, String selectedColumn, String aliases, Obje
706756
public SchemaType getSchemaType() {
707757
return this.schemaType;
708758
}
759+
760+
@Override
761+
public List<WhereCondition> getWhereConditions() {
762+
return whereConditions;
763+
}
764+
765+
@Override
766+
public List<SelectCondition> getSelectColumns() {
767+
return selectColumns;
768+
}
769+
770+
@Override
771+
public String getNewTableName() {
772+
return newTableName;
773+
}
709774
}

src/main/java/fr/maxlego08/sarah/database/Migration.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ protected void create(String table, Class<?> template) {
2424
SchemaBuilder.create(this, table, template);
2525
}
2626

27+
protected void drop(String table) {
28+
SchemaBuilder.drop(this, table);
29+
}
30+
31+
protected void modify(String table, Consumer<Schema> consumer) {
32+
SchemaBuilder.modify(this, table, consumer);
33+
}
34+
2735
protected void createOrAlter(String table, Consumer<Schema> consumer) {
2836
this.create(table, consumer);
2937
this.alter = true;

src/main/java/fr/maxlego08/sarah/database/Schema.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import fr.maxlego08.sarah.DatabaseConnection;
44
import fr.maxlego08.sarah.conditions.ColumnDefinition;
55
import fr.maxlego08.sarah.conditions.JoinCondition;
6+
import fr.maxlego08.sarah.conditions.SelectCondition;
7+
import fr.maxlego08.sarah.conditions.WhereCondition;
68
import fr.maxlego08.sarah.logger.Logger;
79

810
import java.sql.PreparedStatement;
@@ -151,5 +153,11 @@ public interface Schema {
151153
Schema addColumn(ColumnDefinition column);
152154

153155
void setMigration(Migration migration);
156+
157+
List<WhereCondition> getWhereConditions();
158+
159+
List<SelectCondition> getSelectColumns();
160+
161+
String getNewTableName();
154162
}
155163

src/main/java/fr/maxlego08/sarah/database/SchemaType.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
public enum SchemaType {
44

55
CREATE,
6+
MODIFY,
67
DROP,
78
UPSERT,
89
UPDATE,
910
INSERT,
1011
SELECT,
1112
SELECT_COUNT,
1213
DELETE,
13-
ALTER
14+
ALTER,
15+
RENAME,
1416

1517
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package fr.maxlego08.sarah.requests;
2+
3+
import fr.maxlego08.sarah.DatabaseConfiguration;
4+
import fr.maxlego08.sarah.DatabaseConnection;
5+
import fr.maxlego08.sarah.conditions.ColumnDefinition;
6+
import fr.maxlego08.sarah.database.Executor;
7+
import fr.maxlego08.sarah.database.Schema;
8+
import fr.maxlego08.sarah.logger.Logger;
9+
10+
import java.sql.Connection;
11+
import java.sql.PreparedStatement;
12+
import java.sql.SQLException;
13+
14+
public class InsertAllRequest implements Executor {
15+
16+
private final Schema schema;
17+
private final String toTableName;
18+
19+
public InsertAllRequest(Schema schema, String toTableName) {
20+
this.schema = schema;
21+
this.toTableName = toTableName;
22+
}
23+
24+
@Override
25+
public int execute(DatabaseConnection databaseConnection, DatabaseConfiguration databaseConfiguration, Logger logger) {
26+
27+
StringBuilder insertBuilder = new StringBuilder("INSERT INTO " + this.toTableName + " (");
28+
StringBuilder columns = new StringBuilder();
29+
30+
int size = this.schema.getColumns().size();
31+
for (int i = 0; i < size; i++) {
32+
33+
ColumnDefinition columnDefinition = this.schema.getColumns().get(i);
34+
35+
columns.append(columnDefinition.getSafeName());
36+
if (i < (size - 1)) {
37+
columns.append(",");
38+
}
39+
}
40+
41+
insertBuilder.append(columns).append(") ");
42+
43+
insertBuilder.append("SELECT ").append(columns);
44+
insertBuilder.append(" FROM ");
45+
insertBuilder.append(this.schema.getTableName());
46+
47+
String insertQuery = databaseConfiguration.replacePrefix(insertBuilder.toString());
48+
49+
if (databaseConfiguration.isDebug()) {
50+
logger.info("Executing SQL: " + insertQuery);
51+
}
52+
53+
try (Connection connection = databaseConnection.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement(insertQuery)) {
54+
preparedStatement.executeUpdate();
55+
} catch (SQLException exception) {
56+
exception.printStackTrace();
57+
return -1;
58+
}
59+
60+
return 0;
61+
}
62+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package fr.maxlego08.sarah.requests;
2+
3+
import fr.maxlego08.sarah.DatabaseConfiguration;
4+
import fr.maxlego08.sarah.DatabaseConnection;
5+
import fr.maxlego08.sarah.SchemaBuilder;
6+
import fr.maxlego08.sarah.database.Executor;
7+
import fr.maxlego08.sarah.database.Schema;
8+
import fr.maxlego08.sarah.database.SchemaType;
9+
import fr.maxlego08.sarah.logger.Logger;
10+
11+
import java.sql.SQLException;
12+
13+
public class ModifyRequest implements Executor {
14+
15+
private final Schema schema;
16+
17+
public ModifyRequest(Schema schema) {
18+
this.schema = schema;
19+
}
20+
21+
@Override
22+
public int execute(DatabaseConnection databaseConnection, DatabaseConfiguration databaseConfiguration, Logger logger) {
23+
24+
String tmpTableName = schema.getTableName() + "_tmp";
25+
Schema tmpSchema = SchemaBuilder.copy(tmpTableName, SchemaType.CREATE, schema);
26+
27+
try {
28+
tmpSchema.execute(databaseConnection, logger);
29+
} catch (SQLException exception) {
30+
exception.printStackTrace();
31+
return -1;
32+
}
33+
34+
Executor executor = new InsertAllRequest(schema, tmpTableName);
35+
executor.execute(databaseConnection, databaseConfiguration, logger);
36+
37+
executor = new DropTableRequest(schema);
38+
executor.execute(databaseConnection, databaseConfiguration, logger);
39+
40+
executor = new RenameExecutor(SchemaBuilder.rename(tmpTableName, schema.getTableName()));
41+
executor.execute(databaseConnection, databaseConfiguration, logger);
42+
43+
return 0;
44+
}
45+
46+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package fr.maxlego08.sarah.requests;
2+
3+
import fr.maxlego08.sarah.DatabaseConfiguration;
4+
import fr.maxlego08.sarah.DatabaseConnection;
5+
import fr.maxlego08.sarah.database.Executor;
6+
import fr.maxlego08.sarah.database.Schema;
7+
import fr.maxlego08.sarah.logger.Logger;
8+
9+
import java.sql.Connection;
10+
import java.sql.PreparedStatement;
11+
import java.sql.SQLException;
12+
13+
public class RenameExecutor implements Executor {
14+
15+
private final Schema schema;
16+
17+
public RenameExecutor(Schema schema) {
18+
this.schema = schema;
19+
}
20+
21+
@Override
22+
public int execute(DatabaseConnection databaseConnection, DatabaseConfiguration databaseConfiguration, Logger logger) {
23+
24+
StringBuilder alterTableSQL = new StringBuilder("ALTER TABLE ");
25+
alterTableSQL.append(this.schema.getTableName());
26+
alterTableSQL.append(" RENAME TO ");
27+
alterTableSQL.append(this.schema.getNewTableName());
28+
29+
String finalQuery = databaseConfiguration.replacePrefix(alterTableSQL.toString());
30+
if (databaseConfiguration.isDebug()) {
31+
logger.info("Executing SQL: " + finalQuery);
32+
}
33+
34+
try (Connection connection = databaseConnection.getConnection();
35+
PreparedStatement preparedStatement = connection.prepareStatement(finalQuery)) {
36+
preparedStatement.execute();
37+
return preparedStatement.getUpdateCount();
38+
} catch (SQLException exception) {
39+
exception.printStackTrace();
40+
return -1;
41+
}
42+
}
43+
}

0 commit comments

Comments
 (0)