Skip to content

Commit

Permalink
Add sormula for easier SQLite access once I implement it
Browse files Browse the repository at this point in the history
  • Loading branch information
cjburkey01 committed Aug 25, 2024
1 parent b66efec commit e5e2f55
Show file tree
Hide file tree
Showing 22 changed files with 299 additions and 294 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,5 @@ source_visual.ppm
source_visual.mp4

# Leftover from tests
tmp/
*.tmp.sqlite3
7 changes: 6 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ object DepData {
const val SANS_ORM_VERSION = "3.17"
const val SLF4J_VERSION = "1.7.25"
const val BSTATS_VERSION = "3.0.2"
const val SORMULA_VERSION = "4.3"

// Directories
const val TEST_SERVER_DIR = "run"
Expand Down Expand Up @@ -106,6 +107,8 @@ tasks {

dependencies {
exclude(dependency("org.slf4j:slf4j-api"))
exclude(dependency("org.slf4j:slf4j-simple"))
exclude(dependency("org.apache:log4j"))
exclude(dependency("org.xerial:sqlite-jdbc"))
exclude(dependency("org.jetbrains:annotations"))
}
Expand All @@ -116,6 +119,7 @@ tasks {
relocate("org.eclipse", "claimchunk.dependency.org.eclipse")
relocate("org.osgi", "claimchunk.dependency.org.osgi")
relocate("org.bstats", "claimchunk.dependency.org.bstats")
relocate("org.sormula", "claimchunk.dependency.org.sormula")
}

register<Delete>("cleanTests") {
Expand All @@ -131,7 +135,7 @@ tasks {
"junit.jupiter.testinstance.lifecycle.default" to "per_class"
)

// finalizedBy("cleanTests")
finalizedBy("cleanTests")
}

clean {
Expand Down Expand Up @@ -313,6 +317,7 @@ dependencies {
implementation("javax.transaction:transaction-api:${DepData.JAVAX_TRANSACTION_VERSION}")
implementation("com.github.h-thurow:q2o:${DepData.SANS_ORM_VERSION}")
implementation("org.bstats:bstats-bukkit:${DepData.BSTATS_VERSION}")
implementation("org.sormula:sormula:${DepData.SORMULA_VERSION}")

testImplementation("org.slf4j:slf4j-simple:${DepData.SLF4J_VERSION}")
testImplementation("org.junit.jupiter:junit-jupiter:${DepData.JUNIT_VERSION}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import org.bukkit.command.TabExecutor;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.*;

Expand Down Expand Up @@ -131,7 +130,7 @@ public boolean onCommand(
*/
@Override
@ApiStatus.Internal
public @Nullable List<String> onTabComplete(
public @NotNull List<String> onTabComplete(
@NotNull CommandSender sender,
@NotNull Command command,
@NotNull String alias,
Expand Down
5 changes: 4 additions & 1 deletion src/main/java/com/cjburkey/claimchunk/ClaimChunk.java
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ boolean checkBStats(Metrics metrics) {

Field metricsEnabledField = MetricsBase.class.getDeclaredField("enabled");
metricsEnabledField.setAccessible(true);
return metricsBaseField.getBoolean(metricsBase);
return metricsEnabledField.getBoolean(metricsBase);
} catch (Exception e) {
Utils.warn(
"Failed to detect whether user has bStats enabled globally: " + e.getMessage());
Expand Down Expand Up @@ -427,7 +427,10 @@ private void initAnonymousData() {

// Only show this once, since it's not considered debug spam!
getConfig().set("log.showExtraInfoOnAnonymousMetrics", false);
saveConfig();
}
} else {
Utils.log("bStats is disabled, so it is NOT sending any data!");
}
} catch (Exception e) {
Utils.err("Failed to initialize anonymous metrics collection: %s", e.getMessage());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,6 @@ SELECT COUNT(*) FROM pragma_table_info(?) WHERE name=?
}

// Whenever a column is added or moved or transformed or whatever, add a
// method here to perform that transformation and call it in initialize_tables.
// method here to perform that transformation and call in the `go` method.

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -317,8 +316,6 @@ public void clearPermissionFlags(
+ " AND "
+ clauses;

System.out.println(where);

SqlClosure.sqlExecute(
connection -> {
try (PreparedStatement statement =
Expand Down Expand Up @@ -356,21 +353,23 @@ public List<FullPlayerData> getAllPlayers() {
try (PreparedStatement statement =
connection.prepareStatement(
"""
SELECT *
FROM permission_flags
WHERE chunk_id=-1
""")) {
SELECT *
FROM permission_flags
WHERE chunk_id=-1
""")) {
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {

UUID playerUuid = UUID.fromString(resultSet.getString("player_uuid"));
String otherPlyUuid = resultSet.getString("other_player_uuid");
String flagName = resultSet.getString("flag_name");
boolean allowDeny = resultSet.getBoolean("allow_deny");

FullPlayerData thisPly = playerData.get(playerUuid);
if (thisPly == null) {
throw new RuntimeException("Failed to load player " + playerUuid + " for permission " + flagName);
Utils.err(
"Failed to load player %s for permission %s",
playerUuid, flagName);
continue;
}

UUID otherPly = null;
Expand Down Expand Up @@ -421,11 +420,11 @@ public Collection<DataChunk> getAllChunks() {
try (PreparedStatement statement =
connection.prepareStatement(
"""
SELECT * FROM permission_flags
LEFT JOIN chunk_data
ON permission_flags.chunk_id=chunk_data.chunk_id
WHERE permission_flags.chunk_id!=-1
""")) {
SELECT * FROM permission_flags
LEFT JOIN chunk_data
ON permission_flags.chunk_id=chunk_data.chunk_id
WHERE permission_flags.chunk_id!=-1
""")) {
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
String playerUuid = resultSet.getString("player_uuid");
Expand All @@ -448,9 +447,10 @@ public Collection<DataChunk> getAllChunks() {

DataChunk chunk = chunks.get(Objects.requireNonNull(chunkPos));
if (chunk == null) {
throw new RuntimeException(
"Tried to load permissions for unclaimed chunk at "
+ chunkPos);
Utils.err(
"Tried to load permissions for unclaimed chunk at %s",
chunkPos);
continue;
}

UUID otherPlayer = null;
Expand Down Expand Up @@ -485,6 +485,7 @@ private int setChunkPosParams(
return worldParameterNum + 3;
}

@SuppressWarnings("SameParameterValue")
private String chunkIdQuery(String sql) {
return SELECT_CHUNK_ID_SQL_PATTERN.matcher(sql).replaceAll(SELECT_CHUNK_ID_SQL);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.cjburkey.claimchunk.data.sqlite;

import com.cjburkey.claimchunk.chunk.ChunkPos;

import org.sormula.annotation.Column;
import org.sormula.annotation.ImplicitType;
import org.sormula.annotation.Row;

import java.util.UUID;

@Row(tableName = "claimed_chunks")
public class SqlClaimedChunk {

@Column(primaryKey = true, name = "chunk_pos")
@ImplicitType(translator = Translators.ChunkPosTranslator.class)
public ChunkPos chunkPos;

@Column(name = "owner_uuid")
@ImplicitType(translator = Translators.UUIDTranslator.class)
public UUID chunkOwner;
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,37 @@
package com.cjburkey.claimchunk.data.sqlite;

import org.sormula.annotation.Row;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;

@Table(name = "player_data")
@Row(tableName = "player_data")
public class SqlDataPlayer {

@Id
@Column(name = "player_uuid")
@org.sormula.annotation.Column(primaryKey = true, name = "player_uuid")
public String uuid;

@Column(name = "last_ign")
@org.sormula.annotation.Column(name = "lastIgn")
public String lastIgn;

@Column(name = "chunk_name")
@org.sormula.annotation.Column(name = "chunk_name")
public String chunkName;

@Column(name = "last_online_time")
@org.sormula.annotation.Column(name = "last_online_time")
public long lastOnlineTime;

@Column(name = "alerts_enabled")
@org.sormula.annotation.Column(name = "alerts_enabled")
public boolean alert;

@Column(name = "extra_max_claims")
@org.sormula.annotation.Column(name = "extra_max_claims")
public int extraMaxClaims;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.cjburkey.claimchunk.data.sqlite;

import com.cjburkey.claimchunk.chunk.ChunkPos;

import org.jetbrains.annotations.Nullable;
import org.sormula.annotation.Column;
import org.sormula.annotation.ImplicitType;
import org.sormula.annotation.Row;

import java.util.UUID;

@Row(tableName = "flag_permissions")
public class SqlFlagEntry {

@Column(name = "player_uuid")
@ImplicitType(translator = Translators.UUIDTranslator.class)
public UUID playerUUID;

@Column(name = "other_player_uuid")
@ImplicitType(translator = Translators.UUIDTranslator.class)
public @Nullable UUID otherPlayerUUID;

@Column(name = "chunk_pos")
@ImplicitType(translator = Translators.ChunkPosTranslator.class)
public @Nullable ChunkPos chunkPos;

@Column(name = "flag_name")
public String flagName;

@Column(name = "allow_deny")
public boolean allowDeny;
}
59 changes: 59 additions & 0 deletions src/main/java/com/cjburkey/claimchunk/data/sqlite/Translators.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.cjburkey.claimchunk.data.sqlite;

import com.cjburkey.claimchunk.chunk.ChunkPos;

import org.sormula.translator.TypeTranslator;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.UUID;

public final class Translators {

public record UUIDTranslator() implements TypeTranslator<UUID> {
@Override
public UUID read(ResultSet resultSet, int columnIndex) throws Exception {
String str = resultSet.getString(columnIndex);
if (str.isEmpty()) {
return null;
}

return UUID.fromString(str);
}

@Override
public void write(PreparedStatement preparedStatement, int parameterIndex, UUID parameter)
throws Exception {
preparedStatement.setString(
parameterIndex, parameter != null ? parameter.toString() : "");
}
}

public record ChunkPosTranslator() implements TypeTranslator<ChunkPos> {
@Override
public ChunkPos read(ResultSet resultSet, int columnIndex) throws Exception {
String val = resultSet.getString(columnIndex);
if (val.isEmpty()) {
return null;
}

String[] str = val.split(",");
String world = str[0];
int x = Integer.parseInt(str[1]);
int z = Integer.parseInt(str[2]);
return new ChunkPos(world, x, z);
}

@Override
public void write(
PreparedStatement preparedStatement, int parameterIndex, ChunkPos parameter)
throws Exception {
preparedStatement.setString(
parameterIndex,
parameter != null
? String.format(
"%s,%s,%s", parameter.world(), parameter.x(), parameter.z())
: "");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,7 @@ &r&fpermissions in your chunk(s)
public String cmdClaim = "Claim the chunk you're standing in";
public String cmdHelp = "Display ClaimChunk help (for [command], if supplied)";
public String cmdInfo = "Display information about the current chunk";
public String cmdGui = "Open the ClaimChunk GUI";
public String cmdList = "Display a paginated list of all your claims in the world";
public String cmdName = "Change the name that appears when someone enters your land";
public String cmdReload = "Reload the config for ClaimChunk";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,7 @@ public void registerCommand() {
@Override
public @NotNull List<String> tabComplete(
@NotNull CommandSender sender, @NotNull String alias, String[] args) {
// Is this ok?
return Objects.requireNonNull(baseCommand.onTabComplete(sender, this, alias, args));
return baseCommand.onTabComplete(sender, this, alias, args);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ public int getMaxArguments() {
* /claimchunk}).
* @param executor The subcommand executor.
* @param args The raw string arguments passed by the executor.
* @return Whether this subcommand's usage should be displayed.
* @return Whether this subcommand was provided correctly. Return FALSE to display usage!
*/
public abstract boolean onCall(
@NotNull String cmdUsed, @NotNull CommandSender executor, @NotNull String[] args);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ public ClaimChunkBaseCommand(ClaimChunk claimChunk) {
new CommandStr(new HelpCmd(claimChunk, this), "help"),
// `/chunk info`
new CommandStr(new InfoCmd(claimChunk), "info"),
// `/chunk gui`
new CommandStr(new GuiCmd(claimChunk), "gui"),
// `/chunk list`
new CommandStr(new ListCmd(claimChunk), "list"),
// `/chunk name`
Expand Down
Loading

0 comments on commit e5e2f55

Please sign in to comment.