初步实现mysql适配

This commit is contained in:
zhangyuheng 2024-06-19 21:01:20 +08:00
parent 7a6798bed1
commit cac0b91734
6 changed files with 292 additions and 198 deletions

View File

@ -6,7 +6,7 @@
<groupId>cn.lunadeer</groupId> <groupId>cn.lunadeer</groupId>
<artifactId>Dominion</artifactId> <artifactId>Dominion</artifactId>
<version>1.33.0-beta</version> <version>1.33.1-beta</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>Dominion</name> <name>Dominion</name>

View File

@ -4,14 +4,15 @@ import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.Field;
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import java.awt.*;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.*; import java.util.*;
import java.util.List;
public class DominionDTO { public class DominionDTO {
private static List<DominionDTO> query(String sql, Object... args) { private static List<DominionDTO> query(String sql, Object... args) {
@ -21,37 +22,43 @@ public class DominionDTO {
// 如果是更新操作重新加载缓存 // 如果是更新操作重新加载缓存
Cache.instance.loadDominions(); Cache.instance.loadDominions();
} }
if (rs == null) return dominions; return getDTOFromRS(rs);
while (rs.next()) {
Integer id = rs.getInt("id");
UUID owner = UUID.fromString(rs.getString("owner"));
String name = rs.getString("name");
String world = rs.getString("world");
Integer x1 = rs.getInt("x1");
Integer y1 = rs.getInt("y1");
Integer z1 = rs.getInt("z1");
Integer x2 = rs.getInt("x2");
Integer y2 = rs.getInt("y2");
Integer z2 = rs.getInt("z2");
Integer parentDomId = rs.getInt("parent_dom_id");
String tp_location = rs.getString("tp_location");
Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getDominionFlagsEnabled()) {
flags.put(f, rs.getBoolean(f.getFlagName()));
}
String color = rs.getString("color");
DominionDTO dominion = new DominionDTO(id, owner, name, world, x1, y1, z1, x2, y2, z2, parentDomId,
rs.getString("join_message"),
rs.getString("leave_message"),
flags,
tp_location,
color
);
dominions.add(dominion);
}
} catch (SQLException e) { } catch (SQLException e) {
Dominion.database.handleDatabaseError("数据库操作失败: ", e, sql); DatabaseManager.handleDatabaseError("数据库操作失败: ", e, sql);
}
return dominions;
}
private static List<DominionDTO> getDTOFromRS(ResultSet rs) throws SQLException {
List<DominionDTO> dominions = new ArrayList<>();
if (rs == null) return dominions;
while (rs.next()) {
Integer id = rs.getInt("id");
UUID owner = UUID.fromString(rs.getString("owner"));
String name = rs.getString("name");
String world = rs.getString("world");
Integer x1 = rs.getInt("x1");
Integer y1 = rs.getInt("y1");
Integer z1 = rs.getInt("z1");
Integer x2 = rs.getInt("x2");
Integer y2 = rs.getInt("y2");
Integer z2 = rs.getInt("z2");
Integer parentDomId = rs.getInt("parent_dom_id");
String tp_location = rs.getString("tp_location");
Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getDominionFlagsEnabled()) {
flags.put(f, rs.getBoolean(f.getFlagName()));
}
String color = rs.getString("color");
DominionDTO dominion = new DominionDTO(id, owner, name, world, x1, y1, z1, x2, y2, z2, parentDomId,
rs.getString("join_message"),
rs.getString("leave_message"),
flags,
tp_location,
color
);
dominions.add(dominion);
} }
return dominions; return dominions;
} }
@ -111,33 +118,34 @@ public class DominionDTO {
} }
public static DominionDTO insert(DominionDTO dominion) { public static DominionDTO insert(DominionDTO dominion) {
StringBuilder sql = new StringBuilder("INSERT INTO dominion (" + Field owner = new Field("owner", dominion.getOwner().toString());
"owner, name, world, x1, y1, z1, x2, y2, z2, "); Field name = new Field("name", dominion.getName());
for (Flag f : Flag.getAllDominionFlags()) { Field world = new Field("world", dominion.getWorld());
sql.append(f.getFlagName()).append(", "); Field x1 = new Field("x1", dominion.getX1());
Field y1 = new Field("y1", dominion.getY1());
Field z1 = new Field("z1", dominion.getZ1());
Field x2 = new Field("x2", dominion.getX2());
Field y2 = new Field("y2", dominion.getY2());
Field z2 = new Field("z2", dominion.getZ2());
Field parentDomId = new Field("parent_dom_id", dominion.getParentDomId());
Field joinMessage = new Field("join_message", "欢迎来到 ${DOM_NAME}");
Field leaveMessage = new Field("leave_message", "你正在离开 ${DOM_NAME},欢迎下次光临~");
Field tpLocation = new Field("tp_location", "default");
InsertRow insert = new InsertRow().returningAll().table("dominion").onConflictDoNothing(new Field("id", null));
insert.field(owner).field(name).field(world).field(x1).field(y1).field(z1).field(x2).field(y2).field(z2)
.field(parentDomId).field(joinMessage).field(leaveMessage).field(tpLocation);
for (Flag f : Flag.getDominionFlagsEnabled()) {
insert.field(new Field(f.getFlagName(), f.getDefaultValue()));
} }
sql.append("tp_location, join_message, leave_message"); try (ResultSet rs = insert.execute()) {
sql.append(") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, "); Cache.instance.loadDominions();
for (Flag f : Flag.getAllDominionFlags()) { List<DominionDTO> dominions = getDTOFromRS(rs);
sql.append(f.getDefaultValue()).append(", "); if (dominions.size() == 0) return null;
return dominions.get(0);
} catch (SQLException e) {
DatabaseManager.handleDatabaseError("数据库操作失败: ", e, insert.toString());
return null;
} }
sql.append("'default', ?, ?");
sql.append(") RETURNING *;");
List<DominionDTO> dominions = query(sql.toString(),
dominion.getOwner(),
dominion.getName(),
dominion.getWorld(),
dominion.getX1(),
dominion.getY1(),
dominion.getZ1(),
dominion.getX2(),
dominion.getY2(),
dominion.getZ2(),
"欢迎来到 ${DOM_NAME}",
"你正在离开 ${DOM_NAME},欢迎下次光临~"
);
if (dominions.size() == 0) return null;
return dominions.get(0);
} }
public static void delete(DominionDTO dominion) { public static void delete(DominionDTO dominion) {
@ -153,34 +161,36 @@ public class DominionDTO {
Location loc = dominion.getTpLocation(); Location loc = dominion.getTpLocation();
tp_location = loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ(); tp_location = loc.getBlockX() + ":" + loc.getBlockY() + ":" + loc.getBlockZ();
} }
StringBuilder sql = new StringBuilder("UPDATE dominion SET " + Field owner = new Field("owner", dominion.getOwner().toString());
"owner = ?," + Field name = new Field("name", dominion.getName());
"name = ?," + Field world = new Field("world", dominion.getWorld());
"world = ?," + Field x1 = new Field("x1", dominion.getX1());
"x1 = " + dominion.getX1() + ", " + Field y1 = new Field("y1", dominion.getY1());
"y1 = " + dominion.getY1() + ", " + Field z1 = new Field("z1", dominion.getZ1());
"z1 = " + dominion.getZ1() + ", " + Field x2 = new Field("x2", dominion.getX2());
"x2 = " + dominion.getX2() + ", " + Field y2 = new Field("y2", dominion.getY2());
"y2 = " + dominion.getY2() + ", " + Field z2 = new Field("z2", dominion.getZ2());
"z2 = " + dominion.getZ2() + ", " + Field parentDomId = new Field("parent_dom_id", dominion.getParentDomId());
"parent_dom_id = " + dominion.getParentDomId() + ", " + Field joinMessage = new Field("join_message", dominion.getJoinMessage());
"join_message = ?," + Field leaveMessage = new Field("leave_message", dominion.getLeaveMessage());
"leave_message = ?," + Field tpLocation = new Field("tp_location", tp_location);
"color = ?,"); Field color = new Field("color", dominion.getColor());
Field id = new Field("id", dominion.getId());
UpdateRow update = new UpdateRow().returningAll(id).table("dominion").where("id = ?", id.value);
for (Flag f : Flag.getDominionFlagsEnabled()) { for (Flag f : Flag.getDominionFlagsEnabled()) {
sql.append(f.getFlagName()).append(" = ").append(dominion.getFlagValue(f)).append(","); update.field(new Field(f.getFlagName(), dominion.getFlagValue(f)));
}
update.field(owner).field(name).field(world).field(x1).field(y1).field(z1).field(x2).field(y2).field(z2)
.field(parentDomId).field(joinMessage).field(leaveMessage).field(tpLocation).field(color);
try {
List<DominionDTO> dominions = getDTOFromRS(update.execute());
Cache.instance.loadDominions();
if (dominions.size() == 0) return null;
return dominions.get(0);
} catch (SQLException e) {
DatabaseManager.handleDatabaseError("数据库操作失败: ", e, update.toString());
return null;
} }
sql.append("tp_location = ?" + " WHERE id = ").append(dominion.getId()).append(" RETURNING *;");
List<DominionDTO> dominions = query(sql.toString(),
dominion.getOwner().toString(),
dominion.getName(),
dominion.getWorld(),
dominion.getJoinMessage(),
dominion.getLeaveMessage(),
dominion.getColor(),
tp_location);
if (dominions.size() == 0) return null;
return dominions.get(0);
} }
private DominionDTO(Integer id, UUID owner, String name, String world, private DominionDTO(Integer id, UUID owner, String name, String world,

View File

@ -1,10 +1,15 @@
package cn.lunadeer.dominion.dtos; package cn.lunadeer.dominion.dtos;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.Field;
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@ -30,18 +35,24 @@ public class PlayerDTO {
private static List<PlayerDTO> query(String sql, Object... params) { private static List<PlayerDTO> query(String sql, Object... params) {
List<PlayerDTO> players = new ArrayList<>(); List<PlayerDTO> players = new ArrayList<>();
try (ResultSet rs = Dominion.database.query(sql, params)) { try (ResultSet rs = DatabaseManager.instance.query(sql, params)) {
if (rs == null) return players; return getDTOFromRS(rs);
while (rs.next()) {
Integer id = rs.getInt("id");
UUID uuid = UUID.fromString(rs.getString("uuid"));
String lastKnownName = rs.getString("last_known_name");
Long lastJoinAt = rs.getTimestamp("last_join_at").getTime();
PlayerDTO player = new PlayerDTO(id, uuid, lastKnownName, lastJoinAt);
players.add(player);
}
} catch (SQLException e) { } catch (SQLException e) {
Dominion.database.handleDatabaseError("查询玩家信息失败: ", e, sql); DatabaseManager.handleDatabaseError("查询玩家信息失败: ", e, sql);
}
return players;
}
private static List<PlayerDTO> getDTOFromRS(ResultSet rs) throws SQLException {
List<PlayerDTO> players = new ArrayList<>();
if (rs == null) return players;
while (rs.next()) {
Integer id = rs.getInt("id");
UUID uuid = UUID.fromString(rs.getString("uuid"));
String lastKnownName = rs.getString("last_known_name");
Long lastJoinAt = rs.getTimestamp("last_join_at").getTime();
PlayerDTO player = new PlayerDTO(id, uuid, lastKnownName, lastJoinAt);
players.add(player);
} }
return players; return players;
} }
@ -72,24 +83,44 @@ public class PlayerDTO {
} }
private static PlayerDTO insert(PlayerDTO player) { private static PlayerDTO insert(PlayerDTO player) {
String sql = "INSERT INTO player_name (uuid, last_known_name, last_join_at) " + Field uuid = new Field("uuid", player.getUuid().toString());
"VALUES" + Field lastKnownName = new Field("last_known_name", player.getLastKnownName());
" (?, ?, CURRENT_TIMESTAMP) " + Field lastJoinAt = new Field("last_join_at", Timestamp.valueOf(LocalDateTime.now()));
"RETURNING *;"; InsertRow insertRow = new InsertRow()
List<PlayerDTO> players = query(sql, player.getUuid().toString(), player.getLastKnownName()); .table("player_name")
if (players.size() == 0) return null; .field(uuid)
return players.get(0); .field(lastKnownName)
.field(lastJoinAt)
.returningAll()
.onConflictOverwrite(new Field("id", null));
try (ResultSet rs = insertRow.execute()) {
List<PlayerDTO> players = getDTOFromRS(rs);
if (players.size() == 0) return null;
return players.get(0);
} catch (SQLException e) {
DatabaseManager.handleDatabaseError("插入玩家信息失败: ", e, insertRow.toString());
return null;
}
} }
private static PlayerDTO update(PlayerDTO player) { private static PlayerDTO update(PlayerDTO player) {
String sql = "UPDATE player_name SET " + Field lastKnownName = new Field("last_known_name", player.getLastKnownName());
"last_known_name = ?, " + Field uuid = new Field("uuid", player.getUuid().toString());
"last_join_at = CURRENT_TIMESTAMP " + Field lastJoinAt = new Field("last_join_at", Timestamp.valueOf(LocalDateTime.now()));
"WHERE uuid = ? " + UpdateRow updateRow = new UpdateRow()
"RETURNING *;"; .table("player_name")
List<PlayerDTO> players = query(sql, player.getLastKnownName(), player.getUuid().toString()); .field(lastKnownName)
if (players.size() == 0) return null; .field(lastJoinAt)
return players.get(0); .where("uuid = ?", uuid.value)
.returningAll(uuid);
try (ResultSet rs = updateRow.execute()) {
List<PlayerDTO> players = getDTOFromRS(rs);
if (players.size() == 0) return null;
return players.get(0);
} catch (SQLException e) {
DatabaseManager.handleDatabaseError("更新玩家信息失败: ", e, updateRow.toString());
return null;
}
} }
private PlayerDTO(Integer id, UUID uuid, String lastKnownName, Long lastJoinAt) { private PlayerDTO(Integer id, UUID uuid, String lastKnownName, Long lastJoinAt) {

View File

@ -1,35 +1,84 @@
package cn.lunadeer.dominion.dtos; package cn.lunadeer.dominion.dtos;
import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.Field;
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.*; import java.util.*;
public class PlayerPrivilegeDTO { public class PlayerPrivilegeDTO {
private static List<PlayerPrivilegeDTO> getDTOFromRS(ResultSet rs) {
List<PlayerPrivilegeDTO> players = new ArrayList<>();
if (rs == null) return players;
try {
while (rs.next()) {
Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
flags.put(f, rs.getBoolean(f.getFlagName()));
}
PlayerPrivilegeDTO player = new PlayerPrivilegeDTO(
rs.getInt("id"),
UUID.fromString(rs.getString("player_uuid")),
rs.getBoolean("admin"),
rs.getInt("dom_id"),
flags
);
players.add(player);
}
} catch (Exception e) {
DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, "");
}
return players;
}
private static PlayerPrivilegeDTO update(PlayerPrivilegeDTO player) {
Field admin = new Field("admin", player.getAdmin());
Field domID = new Field("dom_id", player.getDomID());
Field id = new Field("id", player.getId());
UpdateRow updateRow = new UpdateRow().returningAll(id)
.table("player_privilege")
.field(admin)
.field(domID)
.where("id = ?", id.value);
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
updateRow.field(new Field(f.getFlagName(), player.getFlagValue(f)));
}
try (ResultSet rs = updateRow.execute()) {
Cache.instance.loadPlayerPrivileges();
List<PlayerPrivilegeDTO> players = getDTOFromRS(rs);
if (players.size() == 0) return null;
return players.get(0);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("更新玩家权限失败: ", e, "");
return null;
}
}
public static PlayerPrivilegeDTO insert(PlayerPrivilegeDTO player) { public static PlayerPrivilegeDTO insert(PlayerPrivilegeDTO player) {
StringBuilder sql = new StringBuilder("INSERT INTO player_privilege (player_uuid, admin, dom_id, "); Field playerUUID = new Field("player_uuid", player.getPlayerUUID().toString());
Field admin = new Field("admin", player.getAdmin());
for (Flag f : Flag.getAllPrivilegeFlags()) { Field domID = new Field("dom_id", player.getDomID());
sql.append(f.getFlagName()).append(", "); InsertRow insertRow = new InsertRow().returningAll().onConflictDoNothing(new Field("id", null))
.table("player_privilege")
.field(playerUUID)
.field(admin)
.field(domID);
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
insertRow.field(new Field(f.getFlagName(), player.getFlagValue(f)));
} }
sql = new StringBuilder(sql.substring(0, sql.length() - 2)); try (ResultSet rs = insertRow.execute()) {
Cache.instance.loadPlayerPrivileges();
sql.append(") VALUES ('") List<PlayerPrivilegeDTO> players = getDTOFromRS(rs);
.append(player.getPlayerUUID()).append("', ") if (players.size() == 0) return null;
.append(player.getAdmin()).append(", ") return players.get(0);
.append(player.getDomID()).append(", "); } catch (Exception e) {
DatabaseManager.handleDatabaseError("插入玩家权限失败: ", e, "");
for (Flag f : Flag.getAllPrivilegeFlags()) { return null;
sql.append(player.getFlagValue(f)).append(", ");
} }
sql = new StringBuilder(sql.substring(0, sql.length() - 2));
sql.append(") RETURNING *;");
List<PlayerPrivilegeDTO> players = query(sql.toString());
if (players.size() == 0) return null;
return players.get(0);
} }
public static PlayerPrivilegeDTO select(UUID playerUUID, Integer dom_id) { public static PlayerPrivilegeDTO select(UUID playerUUID, Integer dom_id) {
@ -125,44 +174,16 @@ public class PlayerPrivilegeDTO {
private static List<PlayerPrivilegeDTO> query(String sql, Object... params) { private static List<PlayerPrivilegeDTO> query(String sql, Object... params) {
List<PlayerPrivilegeDTO> players = new ArrayList<>(); List<PlayerPrivilegeDTO> players = new ArrayList<>();
try (ResultSet rs = Dominion.database.query(sql, params)) { try (ResultSet rs = DatabaseManager.instance.query(sql, params)) {
if (sql.contains("UPDATE") || sql.contains("DELETE") || sql.contains("INSERT")) { if (sql.contains("UPDATE") || sql.contains("DELETE") || sql.contains("INSERT")) {
// 如果是更新操作重新加载缓存 // 如果是更新操作重新加载缓存
Cache.instance.loadPlayerPrivileges(); Cache.instance.loadPlayerPrivileges();
} }
if (rs == null) return players; return getDTOFromRS(rs);
while (rs.next()) {
Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
flags.put(f, rs.getBoolean(f.getFlagName()));
}
PlayerPrivilegeDTO player = new PlayerPrivilegeDTO(
rs.getInt("id"),
UUID.fromString(rs.getString("player_uuid")),
rs.getBoolean("admin"),
rs.getInt("dom_id"),
flags
);
players.add(player);
}
} catch (Exception e) { } catch (Exception e) {
Dominion.database.handleDatabaseError("查询玩家权限失败: ", e, sql); DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, sql);
} }
return players; return players;
} }
private static PlayerPrivilegeDTO update(PlayerPrivilegeDTO player) {
String sql = "UPDATE player_privilege SET " +
"admin = " + player.getAdmin() + ", " +
"dom_id = " + player.getDomID() + ", ";
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
sql += f.getFlagName() + " = " + player.getFlagValue(f) + ", ";
}
sql = sql.substring(0, sql.length() - 2);
sql += " WHERE id = " + player.getId() + " " +
"RETURNING *;";
List<PlayerPrivilegeDTO> players = query(sql);
if (players.size() == 0) return null;
return players.get(0);
}
} }

View File

@ -1,6 +1,9 @@
package cn.lunadeer.dominion.dtos; package cn.lunadeer.dominion.dtos;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.Field;
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.*; import java.util.*;
@ -9,8 +12,18 @@ public class PrivilegeTemplateDTO {
private static List<PrivilegeTemplateDTO> query(String sql, Object... params) { private static List<PrivilegeTemplateDTO> query(String sql, Object... params) {
List<PrivilegeTemplateDTO> templates = new ArrayList<>(); List<PrivilegeTemplateDTO> templates = new ArrayList<>();
try (ResultSet rs = Dominion.database.query(sql, params)) { try (ResultSet rs = DatabaseManager.instance.query(sql, params)) {
if (rs == null) return templates; return getDTOFromRS(rs);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("查询权限模版失败: ", e, sql);
}
return templates;
}
private static List<PrivilegeTemplateDTO> getDTOFromRS(ResultSet rs) {
List<PrivilegeTemplateDTO> templates = new ArrayList<>();
if (rs == null) return templates;
try {
while (rs.next()) { while (rs.next()) {
Map<Flag, Boolean> flags = new HashMap<>(); Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) { for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
@ -26,16 +39,26 @@ public class PrivilegeTemplateDTO {
templates.add(template); templates.add(template);
} }
} catch (Exception e) { } catch (Exception e) {
Dominion.database.handleDatabaseError("查询权限模版失败: ", e, sql); DatabaseManager.handleDatabaseError("查询权限模版失败: ", e, null);
} }
return templates; return templates;
} }
public static PrivilegeTemplateDTO create(UUID creator, String name) { public static PrivilegeTemplateDTO create(UUID creator, String name) {
String sql = "INSERT INTO privilege_template (creator, name) VALUES (?, ?) RETURNING *;"; Field creatorField = new Field("creator", creator.toString());
List<PrivilegeTemplateDTO> templates = query(sql, creator.toString(), name); Field nameField = new Field("name", name);
if (templates.size() == 0) return null; InsertRow insertRow = new InsertRow().table("privilege_template").onConflictDoNothing(new Field("id", null))
return templates.get(0); .field(creatorField)
.field(nameField)
.returningAll();
try (ResultSet rs = insertRow.execute()) {
List<PrivilegeTemplateDTO> templates = getDTOFromRS(rs);
if (templates.size() == 0) return null;
return templates.get(0);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("创建权限模版失败: ", e, null);
return null;
}
} }
public static PrivilegeTemplateDTO select(UUID creator, String name) { public static PrivilegeTemplateDTO select(UUID creator, String name) {
@ -102,16 +125,25 @@ public class PrivilegeTemplateDTO {
} }
private static PrivilegeTemplateDTO update(PrivilegeTemplateDTO template) { private static PrivilegeTemplateDTO update(PrivilegeTemplateDTO template) {
StringBuilder sql = new StringBuilder("UPDATE privilege_template SET " + Field name = new Field("name", template.getName());
"name = ?, " + Field admin = new Field("admin", template.getAdmin());
"admin = ?, "); Field id = new Field("id", template.getId());
UpdateRow updateRow = new UpdateRow().table("privilege_template")
.field(name)
.field(admin)
.returningAll(id)
.where("id = ?", id.value);
for (Flag f : Flag.getPrivilegeFlagsEnabled()) { for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
sql.append(f.getFlagName()).append(" = ").append(template.getFlagValue(f)).append(", "); updateRow.field(new Field(f.getFlagName(), template.getFlagValue(f)));
}
try (ResultSet rs = updateRow.execute()) {
List<PrivilegeTemplateDTO> templates = getDTOFromRS(rs);
if (templates.size() == 0) return null;
return templates.get(0);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("更新权限模版失败: ", e, updateRow.toString());
return null;
} }
sql = new StringBuilder(sql.substring(0, sql.length() - 2) + " WHERE id = ? RETURNING *;");
List<PrivilegeTemplateDTO> templates = query(sql.toString(), template.getName(), template.getAdmin(), template.getId());
if (templates.size() == 0) return null;
return templates.get(0);
} }
} }

View File

@ -11,9 +11,9 @@ import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
public class DatabaseTables { public class DatabaseTables {
public static void migrate() { public static void migrate() {
// player name // player name
TableColumn player_name_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); TableColumn player_name_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0);
TableColumn player_name_uuid = new TableColumn("uuid", FieldType.STRING, false, false, true, true, null); TableColumn player_name_uuid = new TableColumn("uuid", FieldType.STRING, false, false, true, true, "''");
TableColumn player_name_last_known_name = new TableColumn("last_known_name", FieldType.STRING, false, false, true, false, null); TableColumn player_name_last_known_name = new TableColumn("last_known_name", FieldType.STRING, false, false, true, false, "'unknown'");
TableColumn player_name_last_join_at = new TableColumn("last_join_at", FieldType.DATETIME, false, false, true, false, "CURRENT_TIMESTAMP"); TableColumn player_name_last_join_at = new TableColumn("last_join_at", FieldType.DATETIME, false, false, true, false, "CURRENT_TIMESTAMP");
CreateTable player_name = new CreateTable().ifNotExists(); CreateTable player_name = new CreateTable().ifNotExists();
player_name.table("player_name") player_name.table("player_name")
@ -24,16 +24,16 @@ public class DatabaseTables {
player_name.execute(); player_name.execute();
// dominion table // dominion table
TableColumn dominion_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); TableColumn dominion_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0);
TableColumn dominion_owner = new TableColumn("owner", FieldType.STRING, false, false, true, false, null); TableColumn dominion_owner = new TableColumn("owner", FieldType.STRING, false, false, true, false, "''");
TableColumn dominion_name = new TableColumn("name", FieldType.STRING, false, false, true, false, null); TableColumn dominion_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "'未命名'");
TableColumn dominion_world = new TableColumn("world", FieldType.STRING, false, false, true, false, null); TableColumn dominion_world = new TableColumn("world", FieldType.STRING, false, false, true, false, "'world'");
TableColumn dominion_x1 = new TableColumn("x1", FieldType.INT, false, false, true, false, null); TableColumn dominion_x1 = new TableColumn("x1", FieldType.INT, false, false, true, false, 0);
TableColumn dominion_y1 = new TableColumn("y1", FieldType.INT, false, false, true, false, null); TableColumn dominion_y1 = new TableColumn("y1", FieldType.INT, false, false, true, false, 0);
TableColumn dominion_z1 = new TableColumn("z1", FieldType.INT, false, false, true, false, null); TableColumn dominion_z1 = new TableColumn("z1", FieldType.INT, false, false, true, false, 0);
TableColumn dominion_x2 = new TableColumn("x2", FieldType.INT, false, false, true, false, null); TableColumn dominion_x2 = new TableColumn("x2", FieldType.INT, false, false, true, false, 0);
TableColumn dominion_y2 = new TableColumn("y2", FieldType.INT, false, false, true, false, null); TableColumn dominion_y2 = new TableColumn("y2", FieldType.INT, false, false, true, false, 0);
TableColumn dominion_z2 = new TableColumn("z2", FieldType.INT, false, false, true, false, null); TableColumn dominion_z2 = new TableColumn("z2", FieldType.INT, false, false, true, false, 0);
TableColumn dominion_parent_dom_id = new TableColumn("parent_dom_id", FieldType.INT, false, false, true, false, -1); TableColumn dominion_parent_dom_id = new TableColumn("parent_dom_id", FieldType.INT, false, false, true, false, -1);
TableColumn dominion_join_message = new TableColumn("join_message", FieldType.STRING, false, false, true, false, "'欢迎'"); TableColumn dominion_join_message = new TableColumn("join_message", FieldType.STRING, false, false, true, false, "'欢迎'");
TableColumn dominion_leave_message = new TableColumn("leave_message", FieldType.STRING, false, false, true, false, "'再见'"); TableColumn dominion_leave_message = new TableColumn("leave_message", FieldType.STRING, false, false, true, false, "'再见'");
@ -59,9 +59,9 @@ public class DatabaseTables {
dominion.execute(); dominion.execute();
// player privilege // player privilege
TableColumn player_privilege_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); TableColumn player_privilege_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0);
TableColumn player_privilege_player_uuid = new TableColumn("player_uuid", FieldType.STRING, false, false, true, false, null); TableColumn player_privilege_player_uuid = new TableColumn("player_uuid", FieldType.STRING, false, false, true, false, "''");
TableColumn player_privilege_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, null); TableColumn player_privilege_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, -1);
TableColumn player_privilege_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false); TableColumn player_privilege_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false);
CreateTable.ForeignKey player_privilege_player_uuid_fk = new CreateTable.ForeignKey(player_privilege_player_uuid, "player_name", player_name_uuid, true); CreateTable.ForeignKey player_privilege_player_uuid_fk = new CreateTable.ForeignKey(player_privilege_player_uuid, "player_name", player_name_uuid, true);
CreateTable.ForeignKey player_privilege_dom_id_fk = new CreateTable.ForeignKey(player_privilege_dom_id, "dominion", dominion_id, true); CreateTable.ForeignKey player_privilege_dom_id_fk = new CreateTable.ForeignKey(player_privilege_dom_id, "dominion", dominion_id, true);
@ -74,7 +74,7 @@ public class DatabaseTables {
.foreignKey(player_privilege_player_uuid_fk) .foreignKey(player_privilege_player_uuid_fk)
.foreignKey(player_privilege_dom_id_fk) .foreignKey(player_privilege_dom_id_fk)
.unique(player_privilege_player_uuid, player_privilege_dom_id); .unique(player_privilege_player_uuid, player_privilege_dom_id);
player_name.execute(); player_privilege.execute();
// server root player name // server root player name
Field server_player_name_id_field = new Field("id", -1); Field server_player_name_id_field = new Field("id", -1);
@ -131,9 +131,9 @@ public class DatabaseTables {
new AddColumn(dominion_tp_location).table("dominion").ifNotExists().execute(); new AddColumn(dominion_tp_location).table("dominion").ifNotExists().execute();
// 1.31.0 // 1.31.0
TableColumn privilege_template_id = new TableColumn("id", FieldType.INT, true, true, true, true, null); TableColumn privilege_template_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0);
TableColumn privilege_template_creator = new TableColumn("creator", FieldType.STRING, false, false, true, false, null); TableColumn privilege_template_creator = new TableColumn("creator", FieldType.STRING, false, false, true, false, "''");
TableColumn privilege_template_name = new TableColumn("name", FieldType.STRING, false, false, true, false, null); TableColumn privilege_template_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "'未命名'");
TableColumn privilege_template_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false); TableColumn privilege_template_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false);
CreateTable.ForeignKey privilege_template_creator_fk = new CreateTable.ForeignKey(privilege_template_creator, "player_name", player_name_uuid, true); CreateTable.ForeignKey privilege_template_creator_fk = new CreateTable.ForeignKey(privilege_template_creator, "player_name", player_name_uuid, true);
CreateTable privilege_template = new CreateTable().ifNotExists(); CreateTable privilege_template = new CreateTable().ifNotExists();