mirror of
https://github.com/BlueMap-Minecraft/BlueMap.git
synced 2024-11-28 21:48:34 +01:00
Fix some issues with the new sql-storage implementations
This commit is contained in:
parent
f18f7a9a16
commit
240ca6c00e
@ -54,7 +54,7 @@
|
|||||||
@Getter
|
@Getter
|
||||||
public class SQLConfig extends StorageConfig {
|
public class SQLConfig extends StorageConfig {
|
||||||
|
|
||||||
private static final Pattern URL_DIALECT_PATTERN = Pattern.compile("jdbc:([^:]*)://.*");
|
private static final Pattern URL_DIALECT_PATTERN = Pattern.compile("jdbc:([^:]*):.*");
|
||||||
|
|
||||||
private String connectionUrl = "jdbc:mysql://localhost/bluemap?permitMysqlScheme";
|
private String connectionUrl = "jdbc:mysql://localhost/bluemap?permitMysqlScheme";
|
||||||
private Map<String, String> connectionProperties = new HashMap<>();
|
private Map<String, String> connectionProperties = new HashMap<>();
|
||||||
@ -102,7 +102,12 @@ public Dialect getDialect() throws ConfigurationException {
|
|||||||
// default from connection-url
|
// default from connection-url
|
||||||
if (key == null) {
|
if (key == null) {
|
||||||
Matcher matcher = URL_DIALECT_PATTERN.matcher(connectionUrl);
|
Matcher matcher = URL_DIALECT_PATTERN.matcher(connectionUrl);
|
||||||
if (!matcher.find()) return Dialect.MYSQL;
|
if (!matcher.find()) {
|
||||||
|
throw new ConfigurationException("""
|
||||||
|
Failed to parse the provided connection-url!
|
||||||
|
Please check your 'connection-url' setting in your configuration and make sure it is in the correct format.
|
||||||
|
""".strip());
|
||||||
|
}
|
||||||
key = Key.bluemap(matcher.group(1)).getFormatted();
|
key = Key.bluemap(matcher.group(1)).getFormatted();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ public void delete(DoublePredicate onProgress) throws IOException {
|
|||||||
deleted = sql.purgeMapTiles(mapId, 1000);
|
deleted = sql.purgeMapTiles(mapId, 1000);
|
||||||
totalDeleted += deleted;
|
totalDeleted += deleted;
|
||||||
|
|
||||||
if (onProgress.test((double) totalDeleted / tileCount))
|
if (!onProgress.test((double) totalDeleted / tileCount))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
} while (deleted > 0 && totalDeleted < tileCount);
|
} while (deleted > 0 && totalDeleted < tileCount);
|
||||||
|
@ -36,7 +36,6 @@
|
|||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
@SuppressWarnings("SqlSourceToSinkFlow")
|
@SuppressWarnings("SqlSourceToSinkFlow")
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@ -45,9 +44,9 @@ public abstract class AbstractCommandSet implements CommandSet {
|
|||||||
private final Database db;
|
private final Database db;
|
||||||
|
|
||||||
final LoadingCache<String, Integer> mapKeys = Caffeine.newBuilder()
|
final LoadingCache<String, Integer> mapKeys = Caffeine.newBuilder()
|
||||||
.build(this::mapKey);
|
.build(this::findOrCreateMapKey);
|
||||||
final LoadingCache<Compression, Integer> compressionKeys = Caffeine.newBuilder()
|
final LoadingCache<Compression, Integer> compressionKeys = Caffeine.newBuilder()
|
||||||
.build(this::compressionKey);
|
.build(this::findOrCreateCompressionKey);
|
||||||
|
|
||||||
@Language("sql")
|
@Language("sql")
|
||||||
public abstract String createMapTableStatement();
|
public abstract String createMapTableStatement();
|
||||||
@ -83,8 +82,8 @@ public int writeMapTile(
|
|||||||
String mapId, int lod, int x, int z, Compression compression,
|
String mapId, int lod, int x, int z, Compression compression,
|
||||||
byte[] bytes
|
byte[] bytes
|
||||||
) throws IOException {
|
) throws IOException {
|
||||||
int mapKey = Objects.requireNonNull(mapKeys.get(mapId));
|
int mapKey = mapKey(mapId);
|
||||||
int compressionKey = Objects.requireNonNull(compressionKeys.get(compression));
|
int compressionKey = compressionKey(compression);
|
||||||
return db.run(connection -> {
|
return db.run(connection -> {
|
||||||
return executeUpdate(connection,
|
return executeUpdate(connection,
|
||||||
writeMapTileStatement(),
|
writeMapTileStatement(),
|
||||||
@ -201,7 +200,7 @@ public TilePosition[] listMapTiles(String mapId, int lod, Compression compressio
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int writeMapMeta(String mapId, String itemName, byte[] bytes) throws IOException {
|
public int writeMapMeta(String mapId, String itemName, byte[] bytes) throws IOException {
|
||||||
int mapKey = Objects.requireNonNull(mapKeys.get(mapId));
|
int mapKey = mapKey(mapId);
|
||||||
return db.run(connection -> {
|
return db.run(connection -> {
|
||||||
return executeUpdate(connection,
|
return executeUpdate(connection,
|
||||||
writeMapMetaStatement(),
|
writeMapMetaStatement(),
|
||||||
@ -265,24 +264,28 @@ public boolean hasMapMeta(String mapId, String itemName) throws IOException {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void purgeMap(String mapId) throws IOException {
|
public void purgeMap(String mapId) throws IOException {
|
||||||
db.run(connection -> {
|
synchronized (mapKeys) {
|
||||||
|
db.run(connection -> {
|
||||||
|
|
||||||
executeUpdate(connection,
|
executeUpdate(connection,
|
||||||
purgeMapTileTableStatement(),
|
purgeMapTileTableStatement(),
|
||||||
mapId
|
mapId
|
||||||
);
|
);
|
||||||
|
|
||||||
executeUpdate(connection,
|
executeUpdate(connection,
|
||||||
purgeMapMetaTableStatement(),
|
purgeMapMetaTableStatement(),
|
||||||
mapId
|
mapId
|
||||||
);
|
);
|
||||||
|
|
||||||
executeUpdate(connection,
|
executeUpdate(connection,
|
||||||
deleteMapStatement(),
|
deleteMapStatement(),
|
||||||
mapId
|
mapId
|
||||||
);
|
);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
mapKeys.invalidate(mapId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Language("sql")
|
@Language("sql")
|
||||||
@ -324,7 +327,14 @@ public String[] listMapIds(int start, int count) throws IOException {
|
|||||||
@Language("sql")
|
@Language("sql")
|
||||||
public abstract String createMapKeyStatement();
|
public abstract String createMapKeyStatement();
|
||||||
|
|
||||||
public int mapKey(String mapId) throws IOException {
|
public int mapKey(String mapId) {
|
||||||
|
synchronized (mapKeys) {
|
||||||
|
//noinspection DataFlowIssue
|
||||||
|
return mapKeys.get(mapId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int findOrCreateMapKey(String mapId) throws IOException {
|
||||||
return db.run(connection -> {
|
return db.run(connection -> {
|
||||||
ResultSet result = executeQuery(connection,
|
ResultSet result = executeQuery(connection,
|
||||||
findMapKeyStatement(),
|
findMapKeyStatement(),
|
||||||
@ -353,7 +363,14 @@ public int mapKey(String mapId) throws IOException {
|
|||||||
@Language("sql")
|
@Language("sql")
|
||||||
public abstract String createCompressionKeyStatement();
|
public abstract String createCompressionKeyStatement();
|
||||||
|
|
||||||
public int compressionKey(Compression compression) throws IOException {
|
public int compressionKey(Compression compression) {
|
||||||
|
synchronized (compressionKeys) {
|
||||||
|
//noinspection DataFlowIssue
|
||||||
|
return compressionKeys.get(compression);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int findOrCreateCompressionKey(Compression compression) throws IOException {
|
||||||
return db.run(connection -> {
|
return db.run(connection -> {
|
||||||
ResultSet result = executeQuery(connection,
|
ResultSet result = executeQuery(connection,
|
||||||
findCompressionKeyStatement(),
|
findCompressionKeyStatement(),
|
||||||
|
@ -38,7 +38,7 @@ public SqliteCommandSet(Database db) {
|
|||||||
public String createMapTableStatement() {
|
public String createMapTableStatement() {
|
||||||
return """
|
return """
|
||||||
CREATE TABLE IF NOT EXISTS `bluemap_map` (
|
CREATE TABLE IF NOT EXISTS `bluemap_map` (
|
||||||
`id` INTEGER UNSIGNED PRIMARY KEY AUTOINCREMENT,
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
`map_id` TEXT UNIQUE NOT NULL
|
`map_id` TEXT UNIQUE NOT NULL
|
||||||
) STRICT
|
) STRICT
|
||||||
""";
|
""";
|
||||||
@ -49,7 +49,7 @@ public String createMapTableStatement() {
|
|||||||
public String createCompressionTableStatement() {
|
public String createCompressionTableStatement() {
|
||||||
return """
|
return """
|
||||||
CREATE TABLE IF NOT EXISTS `bluemap_map_tile_compression` (
|
CREATE TABLE IF NOT EXISTS `bluemap_map_tile_compression` (
|
||||||
`id` INTEGER UNSIGNED PRIMARY KEY AUTOINCREMENT,
|
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
`compression` TEXT UNIQUE NOT NULL
|
`compression` TEXT UNIQUE NOT NULL
|
||||||
) STRICT
|
) STRICT
|
||||||
""";
|
""";
|
||||||
@ -60,7 +60,7 @@ public String createCompressionTableStatement() {
|
|||||||
public String createMapMetaTableStatement() {
|
public String createMapMetaTableStatement() {
|
||||||
return """
|
return """
|
||||||
CREATE TABLE IF NOT EXISTS `bluemap_map_meta` (
|
CREATE TABLE IF NOT EXISTS `bluemap_map_meta` (
|
||||||
`map` INTEGER UNSIGNED NOT NULL,
|
`map` INTEGER NOT NULL,
|
||||||
`key` TEXT NOT NULL,
|
`key` TEXT NOT NULL,
|
||||||
`value` BLOB NOT NULL,
|
`value` BLOB NOT NULL,
|
||||||
PRIMARY KEY (`map`, `key`),
|
PRIMARY KEY (`map`, `key`),
|
||||||
@ -78,11 +78,11 @@ FOREIGN KEY (`map`)
|
|||||||
public String createMapTileTableStatement() {
|
public String createMapTileTableStatement() {
|
||||||
return """
|
return """
|
||||||
CREATE TABLE IF NOT EXISTS `bluemap_map_tile` (
|
CREATE TABLE IF NOT EXISTS `bluemap_map_tile` (
|
||||||
`map` INTEGER UNSIGNED NOT NULL,
|
`map` INTEGER NOT NULL,
|
||||||
`lod` INTEGER UNSIGNED NOT NULL,
|
`lod` INTEGER NOT NULL,
|
||||||
`x` INTEGER NOT NULL,
|
`x` INTEGER NOT NULL,
|
||||||
`z` INTEGER NOT NULL,
|
`z` INTEGER NOT NULL,
|
||||||
`compression` INTEGER UNSIGNED NOT NULL,
|
`compression` INTEGER NOT NULL,
|
||||||
`data` BLOB NOT NULL,
|
`data` BLOB NOT NULL,
|
||||||
PRIMARY KEY (`map`, `lod`, `x`, `z`),
|
PRIMARY KEY (`map`, `lod`, `x`, `z`),
|
||||||
CONSTRAINT `fk_bluemap_map_tile_map`
|
CONSTRAINT `fk_bluemap_map_tile_map`
|
||||||
@ -104,7 +104,7 @@ FOREIGN KEY (`compression`)
|
|||||||
public String fixLegacyCompressionIdsStatement() {
|
public String fixLegacyCompressionIdsStatement() {
|
||||||
return """
|
return """
|
||||||
UPDATE `bluemap_map_tile_compression`
|
UPDATE `bluemap_map_tile_compression`
|
||||||
SET `compression` = CONCAT('bluemap:', `compression`)
|
SET `compression` = 'bluemap:' || `compression`
|
||||||
WHERE NOT `compression` LIKE '%:%'
|
WHERE NOT `compression` LIKE '%:%'
|
||||||
""";
|
""";
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user