Skip to content

Commit ccd3b36

Browse files
committed
change SqlStorageSupplier to support multi statements on save
1 parent d477d0f commit ccd3b36

File tree

4 files changed

+31
-21
lines changed

4 files changed

+31
-21
lines changed

storage/simple/src/main/java/me/hsgamer/topper/storage/simple/supplier/MySqlStorageSupplier.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import java.sql.Connection;
99
import java.sql.SQLException;
10+
import java.util.Collections;
11+
import java.util.List;
1012
import java.util.function.Consumer;
1113

1214
public class MySqlStorageSupplier extends SqlStorageSupplier {
@@ -33,7 +35,7 @@ protected void flushConnection(Connection connection) {
3335
}
3436

3537
@Override
36-
protected String toSaveStatement(String name, String[] keyColumns, String[] valueColumns) {
38+
protected List<String> toSaveStatement(String name, String[] keyColumns, String[] valueColumns) {
3739
StringBuilder statement = new StringBuilder("INSERT INTO `")
3840
.append(name)
3941
.append("` (");
@@ -64,14 +66,14 @@ protected String toSaveStatement(String name, String[] keyColumns, String[] valu
6466
}
6567
}
6668
statement.append(";");
67-
return statement.toString();
69+
return Collections.singletonList(statement.toString());
6870
}
6971

7072
@Override
71-
protected Object[] toSaveValues(Object[] keys, Object[] values) {
73+
protected List<Object[]> toSaveValues(Object[] keys, Object[] values) {
7274
Object[] queryValues = new Object[keys.length + values.length];
7375
System.arraycopy(keys, 0, queryValues, 0, keys.length);
7476
System.arraycopy(values, 0, queryValues, keys.length, values.length);
75-
return queryValues;
77+
return Collections.singletonList(queryValues);
7678
}
7779
}

storage/simple/src/main/java/me/hsgamer/topper/storage/simple/supplier/NewSqliteStorageSupplier.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import me.hsgamer.hscore.database.Setting;
44

55
import java.io.File;
6+
import java.util.Collections;
7+
import java.util.List;
68
import java.util.function.Consumer;
79

810
public class NewSqliteStorageSupplier extends SqliteStorageSupplier {
@@ -11,7 +13,7 @@ public NewSqliteStorageSupplier(Consumer<Setting> databaseSettingConsumer, File
1113
}
1214

1315
@Override
14-
protected String toSaveStatement(String name, String[] keyColumns, String[] valueColumns) {
16+
protected List<String> toSaveStatement(String name, String[] keyColumns, String[] valueColumns) {
1517
StringBuilder statement = new StringBuilder("INSERT INTO `")
1618
.append(name)
1719
.append("` (");
@@ -52,6 +54,6 @@ protected String toSaveStatement(String name, String[] keyColumns, String[] valu
5254
}
5355
}
5456
statement.append(";");
55-
return statement.toString();
57+
return Collections.singletonList(statement.toString());
5658
}
5759
}

storage/simple/src/main/java/me/hsgamer/topper/storage/simple/supplier/SqlStorageSupplier.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import me.hsgamer.topper.storage.core.DataStorage;
99
import me.hsgamer.topper.storage.simple.converter.SqlEntryConverter;
1010
import me.hsgamer.topper.storage.simple.setting.DataStorageSetting;
11-
import org.intellij.lang.annotations.Language;
1211

1312
import java.sql.Connection;
1413
import java.sql.SQLException;
@@ -24,10 +23,9 @@ public abstract class SqlStorageSupplier implements DataStorageSupplier {
2423

2524
protected abstract void flushConnection(Connection connection);
2625

27-
@Language("SQL")
28-
protected abstract String toSaveStatement(String name, String[] keyColumns, String[] valueColumns);
26+
protected abstract List<String> toSaveStatement(String name, String[] keyColumns, String[] valueColumns);
2927

30-
protected abstract Object[] toSaveValues(Object[] keys, Object[] values);
28+
protected abstract List<Object[]> toSaveValues(Object[] keys, Object[] values);
3129

3230
@Override
3331
public <K, V> DataStorage<K, V> getStorage(String name, DataStorageSetting<K, V> setting) {
@@ -63,16 +61,22 @@ public CompletableFuture<Void> save(Map<K, V> map, boolean urgent) {
6361
String[] keyColumns = converter.getKeyColumns();
6462
String[] valueColumns = converter.getValueColumns();
6563

66-
@Language("SQL") String statement = toSaveStatement(name, keyColumns, valueColumns);
64+
List<String> statement = toSaveStatement(name, keyColumns, valueColumns);
65+
List<List<Object[]>> values = new ArrayList<>();
6766

68-
BatchBuilder batchBuilder = BatchBuilder.create(connection, statement);
6967
map.forEach((key, value) -> {
70-
Object[] keyQueryValues = converter.toKeyQueryValues(key);
71-
Object[] valueQueryValues = converter.toValueQueryValues(value);
72-
Object[] queryValues = toSaveValues(keyQueryValues, valueQueryValues);
73-
batchBuilder.addValues(queryValues);
68+
Object[] keyValues = converter.toKeyQueryValues(key);
69+
Object[] valueValues = converter.toValueQueryValues(value);
70+
values.add(toSaveValues(keyValues, valueValues));
7471
});
75-
batchBuilder.execute();
72+
73+
for (int i = 0; i < statement.size(); i++) {
74+
BatchBuilder batchBuilder = BatchBuilder.create(connection, statement.get(i));
75+
for (List<Object[]> value : values) {
76+
batchBuilder.addValues(value.get(i));
77+
}
78+
batchBuilder.execute();
79+
}
7680
} catch (SQLException e) {
7781
logger.log(LogLevel.ERROR, "Failed to save top holder", e);
7882
} finally {

storage/simple/src/main/java/me/hsgamer/topper/storage/simple/supplier/SqliteStorageSupplier.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import java.io.File;
99
import java.sql.Connection;
10+
import java.util.Collections;
11+
import java.util.List;
1012
import java.util.concurrent.atomic.AtomicReference;
1113
import java.util.function.Consumer;
1214

@@ -42,7 +44,7 @@ protected void flushConnection(Connection connection) {
4244
}
4345

4446
@Override
45-
protected String toSaveStatement(String name, String[] keyColumns, String[] valueColumns) {
47+
protected List<String> toSaveStatement(String name, String[] keyColumns, String[] valueColumns) {
4648
StringBuilder statement = new StringBuilder("INSERT OR REPLACE INTO `")
4749
.append(name)
4850
.append("` (");
@@ -62,15 +64,15 @@ protected String toSaveStatement(String name, String[] keyColumns, String[] valu
6264
}
6365
}
6466
statement.append(");");
65-
return statement.toString();
67+
return Collections.singletonList(statement.toString());
6668
}
6769

6870
@Override
69-
protected Object[] toSaveValues(Object[] keys, Object[] values) {
71+
protected List<Object[]> toSaveValues(Object[] keys, Object[] values) {
7072
Object[] queryValues = new Object[keys.length + values.length];
7173
System.arraycopy(keys, 0, queryValues, 0, keys.length);
7274
System.arraycopy(values, 0, queryValues, keys.length, values.length);
73-
return queryValues;
75+
return Collections.singletonList(queryValues);
7476
}
7577

7678
@Override

0 commit comments

Comments
 (0)