Compare commits

...

5 Commits

Author SHA1 Message Date
f41453a412 Build PRs on JDK 17 and 21 2023-10-15 19:43:51 +02:00
b00a46b286 chore: remove poorly implemented /ps debug loadedchunks command (#4180)
- the same (but correctly implemented) functionality exists in other plugins
 - closes #4140
2023-10-10 11:06:22 +01:00
44b1127181 Back to snapshot for development 2023-10-09 17:14:17 +02:00
c7bfd48a21 Release 7.1.0 2023-10-09 17:03:09 +02:00
dc13783db8 chore: mitigate possible future sqlite driver problems (#4200)
* chore: mitigate possible future sqlite driver problems

* chore/feat: log driver version on error

---------

Co-authored-by: Alexander Brandes <mc.cache@web.de>
2023-10-09 16:55:09 +02:00
7 changed files with 50 additions and 38 deletions

View File

@ -7,15 +7,16 @@ jobs:
strategy:
matrix:
os: [ ubuntu-latest, windows-latest, macos-latest ]
jdk: [ 17, 21 ]
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1
- name: Setup Java
- name: Setup Java ${{ matrix.jdk }}
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17
java-version: ${{ matrix.jdk }}
- name: Clean Build
run: ./gradlew clean build

View File

@ -385,9 +385,9 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
/**
* @deprecated Use {@link #restoreBreedable(Breedable)} instead
* @since TODO
* @since 7.1.0
*/
@Deprecated(forRemoval = true, since = "TODO")
@Deprecated(forRemoval = true, since = "7.1.0")
private void restoreAgeable(Ageable entity) {
if (!this.aged.adult) {
entity.setBaby();
@ -400,9 +400,9 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
/**
* @deprecated Use {@link #storeBreedable(Breedable)} instead
* @since TODO
* @since 7.1.0
*/
@Deprecated(forRemoval = true, since = "TODO")
@Deprecated(forRemoval = true, since = "7.1.0")
public void storeAgeable(Ageable aged) {
this.aged = new AgeableStats();
this.aged.age = aged.getAge();
@ -411,7 +411,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
}
/**
* @since TODO
* @since 7.1.0
*/
private void restoreBreedable(Breedable entity) {
if (!this.aged.adult) {
@ -424,7 +424,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
}
/**
* @since TODO
* @since 7.1.0
*/
private void storeBreedable(Breedable breedable) {
this.aged = new AgeableStats();

View File

@ -29,7 +29,6 @@ import com.plotsquared.core.util.WorldUtil;
import com.plotsquared.core.util.entity.EntityCategories;
import com.plotsquared.core.util.entity.EntityCategory;
import com.plotsquared.core.util.query.PlotQuery;
import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.uuid.UUIDMapping;
import com.sk89q.worldedit.world.entity.EntityType;
import net.kyori.adventure.text.Component;
@ -71,7 +70,7 @@ public class Debug extends SubCommand {
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver(
"value",
Tag.inserting(Component.text("/plot debug <loadedchunks | player | debug-players | entitytypes | msg>"))
Tag.inserting(Component.text("/plot debug <player | debug-players | entitytypes | msg>"))
)
);
}
@ -85,16 +84,6 @@ public class Debug extends SubCommand {
return true;
}
}
if (args.length > 0 && "loadedchunks".equalsIgnoreCase(args[0])) {
final long start = System.currentTimeMillis();
player.sendMessage(TranslatableCaption.of("debug.fetching_loaded_chunks"));
TaskManager.runTaskAsync(() -> player.sendMessage(StaticCaption
.of("Loaded chunks: " + this.worldUtil
.getChunkChunks(player.getLocation().getWorldName())
.size() + " (" + (System.currentTimeMillis()
- start) + "ms) using thread: " + Thread.currentThread().getName())));
return true;
}
if (args.length > 0 && "uuids".equalsIgnoreCase(args[0])) {
final Collection<UUIDMapping> mappings = PlotSquared.get().getImpromptuUUIDPipeline().getAllImmediately();
player.sendMessage(
@ -196,7 +185,7 @@ public class Debug extends SubCommand {
@Override
public Collection<Command> tab(final PlotPlayer<?> player, String[] args, boolean space) {
return Stream.of("loadedchunks", "debug-players", "entitytypes")
return Stream.of("debug-players", "entitytypes")
.filter(value -> value.startsWith(args[0].toLowerCase(Locale.ENGLISH)))
.map(value -> new Command(null, false, value, "plots.admin", RequiredType.NONE, null) {
}).collect(Collectors.toList());

View File

@ -130,6 +130,7 @@ public class SQLManager implements AbstractDB {
public volatile ConcurrentHashMap<PlotCluster, Queue<UniqueStatement>> clusterTasks;
// Private
private Connection connection;
private boolean supportsGetGeneratedKeys;
private boolean closed = false;
/**
@ -154,6 +155,8 @@ public class SQLManager implements AbstractDB {
this.worldConfiguration = worldConfiguration;
this.database = database;
this.connection = database.openConnection();
final DatabaseMetaData databaseMetaData = this.connection.getMetaData();
this.supportsGetGeneratedKeys = databaseMetaData.supportsGetGeneratedKeys();
this.mySQL = database instanceof MySQL;
this.globalTasks = new ConcurrentLinkedQueue<>();
this.notifyTasks = new ConcurrentLinkedQueue<>();
@ -161,6 +164,14 @@ public class SQLManager implements AbstractDB {
this.playerTasks = new ConcurrentHashMap<>();
this.clusterTasks = new ConcurrentHashMap<>();
this.prefix = prefix;
if (mySQL && !supportsGetGeneratedKeys) {
String driver = databaseMetaData.getDriverName();
String driverVersion = databaseMetaData.getDriverVersion();
throw new SQLException("Database Driver for MySQL does not support Statement#getGeneratedKeys - which breaks " +
"PlotSquared functionality (Using " + driver + ":" + driverVersion + ")");
}
this.SET_OWNER = "UPDATE `" + this.prefix
+ "plot` SET `owner` = ? WHERE `plot_id_x` = ? AND `plot_id_z` = ? AND `world` = ?";
this.GET_ALL_PLOTS =
@ -171,20 +182,32 @@ public class SQLManager implements AbstractDB {
"INSERT INTO `" + this.prefix + "plot_settings` (`plot_plot_id`) values ";
this.CREATE_TIERS =
"INSERT INTO `" + this.prefix + "plot_%tier%` (`plot_plot_id`, `user_uuid`) values ";
this.CREATE_PLOT = "INSERT INTO `" + this.prefix
String tempCreatePlot = "INSERT INTO `" + this.prefix
+ "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) VALUES(?, ?, ?, ?, ?)";
if (!supportsGetGeneratedKeys) {
tempCreatePlot += " RETURNING `id`";
}
this.CREATE_PLOT = tempCreatePlot;
if (mySQL) {
this.CREATE_PLOT_SAFE = "INSERT IGNORE INTO `" + this.prefix
+ "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) SELECT ?, ?, ?, ?, ? FROM DUAL WHERE NOT EXISTS (SELECT null FROM `"
+ this.prefix + "plot` WHERE `world` = ? AND `plot_id_x` = ? AND `plot_id_z` = ?)";
} else {
this.CREATE_PLOT_SAFE = "INSERT INTO `" + this.prefix
String tempCreatePlotSafe = "INSERT INTO `" + this.prefix
+ "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) SELECT ?, ?, ?, ?, ? WHERE NOT EXISTS (SELECT null FROM `"
+ this.prefix + "plot` WHERE `world` = ? AND `plot_id_x` = ? AND `plot_id_z` = ?)";
if (!supportsGetGeneratedKeys) {
tempCreatePlotSafe += " RETURNING `id`";
}
this.CREATE_PLOT_SAFE = tempCreatePlotSafe;
}
this.CREATE_CLUSTER = "INSERT INTO `" + this.prefix
String tempCreateCluster = "INSERT INTO `" + this.prefix
+ "cluster`(`pos1_x`, `pos1_z`, `pos2_x`, `pos2_z`, `owner`, `world`) VALUES(?, ?, ?, ?, ?, ?)";
if (!supportsGetGeneratedKeys) {
tempCreateCluster += " RETURNING `id`";
}
this.CREATE_CLUSTER = tempCreateCluster;
try {
createTables();
} catch (SQLException e) {
@ -1073,9 +1096,8 @@ public class SQLManager implements AbstractDB {
@Override
public void addBatch(PreparedStatement statement) throws SQLException {
int inserted = statement.executeUpdate();
if (inserted > 0) {
try (ResultSet keys = statement.getGeneratedKeys()) {
if (statement.execute() || statement.getUpdateCount() > 0) {
try (ResultSet keys = supportsGetGeneratedKeys ? statement.getGeneratedKeys() : statement.getResultSet()) {
if (keys.next()) {
plot.temp = keys.getInt(1);
addPlotTask(plot, new UniqueStatement(
@ -1145,8 +1167,8 @@ public class SQLManager implements AbstractDB {
@Override
public void addBatch(PreparedStatement statement) throws SQLException {
statement.executeUpdate();
try (ResultSet keys = statement.getGeneratedKeys()) {
statement.execute();
try (ResultSet keys = supportsGetGeneratedKeys ? statement.getGeneratedKeys() : statement.getResultSet()) {
if (keys.next()) {
plot.temp = keys.getInt(1);
}
@ -3058,8 +3080,8 @@ public class SQLManager implements AbstractDB {
@Override
public void addBatch(PreparedStatement statement) throws SQLException {
statement.executeUpdate();
try (ResultSet keys = statement.getGeneratedKeys()) {
statement.execute();
try (ResultSet keys = supportsGetGeneratedKeys ? statement.getGeneratedKeys() : statement.getResultSet()) {
if (keys.next()) {
cluster.temp = keys.getInt(1);
}

View File

@ -960,7 +960,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
* @param caption Caption to send
* @param asyncReplacement Async variable replacement
* @return A Future to be resolved, after the message was sent
* @since TODO
* @since 7.1.0
*/
public final CompletableFuture<Void> sendMessage(
@NonNull Caption caption,
@ -976,7 +976,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
* @param asyncReplacements Async variable replacements
* @param replacements Sync variable replacements
* @return A Future to be resolved, after the message was sent
* @since TODO
* @since 7.1.0
*/
public final CompletableFuture<Void> sendMessage(
@NonNull Caption caption,

View File

@ -174,7 +174,7 @@ public abstract class PlayerManager<P extends PlotPlayer<? extends T>, T> {
* @since 6.4.0
* @deprecated Don't unnecessarily block threads and utilize playerMap - see {@link #getUsernameCaption(UUID)}
*/
@Deprecated(since = "TODO")
@Deprecated(since = "7.1.0")
public static @NonNull Caption resolveName(final @Nullable UUID owner) {
return resolveName(owner, true);
}
@ -188,7 +188,7 @@ public abstract class PlayerManager<P extends PlotPlayer<? extends T>, T> {
* @since 6.4.0
* @deprecated Don't unnecessarily block threads and utilize playerMap - see {@link #getUsernameCaption(UUID)}
*/
@Deprecated(since = "TODO")
@Deprecated(since = "7.1.0")
public static @NonNull Caption resolveName(final @Nullable UUID owner, final boolean blocking) {
if (owner == null) {
return TranslatableCaption.of("info.none");
@ -237,7 +237,7 @@ public abstract class PlayerManager<P extends PlotPlayer<? extends T>, T> {
*
* @param uuid The UUID of the player (for example provided by {@link Plot#getOwner()}
* @return A CompletableFuture resolving to a Caption representing the players name of the uuid
* @since TODO
* @since 7.1.0
*/
@Contract("_->!null")
public @NonNull CompletableFuture<Caption> getUsernameCaption(@Nullable UUID uuid) {

View File

@ -22,7 +22,7 @@ plugins {
}
group = "com.intellectualsites.plotsquared"
version = "7.0.1-SNAPSHOT"
version = "7.1.1-SNAPSHOT"
if (!File("$rootDir/.git").exists()) {
logger.lifecycle("""