Skip to content

Commit ded116d

Browse files
committed
improve(storage-database): change implementation of saving default item to driver-independent
1 parent 75a080c commit ded116d

File tree

1 file changed

+23
-7
lines changed
  • storage/database/src/main/java/net/okocraft/box/storage/implementation/database/table

1 file changed

+23
-7
lines changed

storage/database/src/main/java/net/okocraft/box/storage/implementation/database/table/ItemTable.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,25 @@
33
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
44
import net.okocraft.box.api.model.item.BoxCustomItem;
55
import net.okocraft.box.api.model.item.BoxDefaultItem;
6+
import net.okocraft.box.api.model.item.ItemVersion;
67
import net.okocraft.box.api.util.ItemNameGenerator;
78
import net.okocraft.box.storage.api.factory.item.BoxItemFactory;
89
import net.okocraft.box.storage.api.model.item.ItemData;
910
import net.okocraft.box.storage.api.model.item.ItemStorage;
1011
import net.okocraft.box.storage.api.util.item.DefaultItem;
11-
import net.okocraft.box.api.model.item.ItemVersion;
1212
import net.okocraft.box.storage.implementation.database.database.Database;
1313
import org.bukkit.inventory.ItemStack;
1414
import org.jetbrains.annotations.NotNull;
1515
import org.jetbrains.annotations.Nullable;
1616

1717
import java.sql.ResultSet;
1818
import java.sql.SQLException;
19-
import java.sql.Statement;
2019
import java.util.ArrayList;
2120
import java.util.Collection;
2221
import java.util.List;
2322
import java.util.Optional;
2423
import java.util.function.Function;
24+
import java.util.stream.Collectors;
2525

2626
// | id | name | item_data | is_default_item
2727
public class ItemTable extends AbstractTable implements ItemStorage {
@@ -88,6 +88,17 @@ public void saveItemVersion(@NotNull ItemVersion itemVersion) throws Exception {
8888
statement.executeBatch();
8989
}
9090

91+
int maxId;
92+
93+
try (var statement = prepareStatement(connection, "SELECT MAX(`id`) FROM `%table%`");
94+
var resultSet = statement.executeQuery()) {
95+
if (resultSet.next()) {
96+
maxId = resultSet.getInt(1);
97+
} else {
98+
throw new IllegalStateException("Could not get maximum item id.");
99+
}
100+
}
101+
91102
try (var statement = prepareStatement(connection, "INSERT INTO `%table%` (`name`, `item_data`, `is_default_item`) VALUES(?,?,?)")) {
92103
for (var item : newItems) {
93104
statement.setString(1, item.plainName());
@@ -96,13 +107,18 @@ public void saveItemVersion(@NotNull ItemVersion itemVersion) throws Exception {
96107

97108
statement.addBatch();
98109
}
110+
statement.executeBatch();
111+
}
99112

100-
int[] updateCounts = statement.executeBatch();
113+
var nameToItemMap = newItems.stream().collect(Collectors.toMap(DefaultItem::plainName, Function.identity()));
101114

102-
try (var generatedKeys = statement.getGeneratedKeys()) {
103-
for (int i = 0; i < updateCounts.length; i++) {
104-
if (updateCounts[i] == Statement.RETURN_GENERATED_KEYS) {
105-
result.add(BoxItemFactory.createDefaultItem(generatedKeys.getInt(1), newItems.get(i)));
115+
try (var statement = prepareStatement(connection, "SELECT `id`, `name` FROM `%table%` WHERE `id` > ?")) {
116+
statement.setInt(1, maxId);
117+
try(var resultSet = statement.executeQuery()) {
118+
while (resultSet.next()) {
119+
var item = nameToItemMap.get(resultSet.getString("name"));
120+
if (item != null) {
121+
result.add(BoxItemFactory.createDefaultItem(resultSet.getInt("id"), item));
106122
}
107123
}
108124
}

0 commit comments

Comments
 (0)