diff options
Diffstat (limited to 'src/main/java/net/tylermurphy/hideAndSeek/database')
-rw-r--r-- | src/main/java/net/tylermurphy/hideAndSeek/database/Database.java | 32 | ||||
-rw-r--r-- | src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfoTable.java | 33 |
2 files changed, 45 insertions, 20 deletions
diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java b/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java index 2254ec2..9d3cc73 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/Database.java @@ -1,19 +1,25 @@ package net.tylermurphy.hideAndSeek.database; +import com.google.common.io.ByteStreams; import net.tylermurphy.hideAndSeek.Main; +import java.io.ByteArrayInputStream; import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; +import java.util.UUID; public class Database { - private final File databaseFile = new File(Main.data, "database.db"); + private static final File databaseFile = new File(Main.data, "database.db"); - public PlayerInfoTable playerInfo; + public static PlayerInfoTable playerInfo; - protected Connection connect() { + protected static Connection connect() { Connection conn = null; try { String url = "jdbc:sqlite:"+databaseFile; @@ -24,7 +30,25 @@ public class Database { return conn; } - public void init(){ + protected static InputStream convertUniqueId(UUID uuid) { + byte[] bytes = new byte[16]; + ByteBuffer.wrap(bytes) + .putLong(uuid.getMostSignificantBits()) + .putLong(uuid.getLeastSignificantBits()); + return new ByteArrayInputStream(bytes); + } + + protected static UUID convertBinaryStream(InputStream stream) { + ByteBuffer buffer = ByteBuffer.allocate(16); + try { + buffer.put(ByteStreams.toByteArray(stream)); + buffer.flip(); + return new UUID(buffer.getLong(), buffer.getLong()); + } catch (IOException ignored) {} + return null; + } + + public static void init(){ playerInfo = new PlayerInfoTable(); } } diff --git a/src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfoTable.java b/src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfoTable.java index 07fb2ee..0dba4b4 100644 --- a/src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfoTable.java +++ b/src/main/java/net/tylermurphy/hideAndSeek/database/PlayerInfoTable.java @@ -1,8 +1,7 @@ package net.tylermurphy.hideAndSeek.database; import net.tylermurphy.hideAndSeek.Main; -import net.tylermurphy.hideAndSeek.game.WinType; -import net.tylermurphy.hideAndSeek.util.Util; +import net.tylermurphy.hideAndSeek.util.WinType; import java.io.IOException; import java.io.InputStream; @@ -23,7 +22,7 @@ public class PlayerInfoTable { + " games_played int NOT NULL\n" + ");"; - try(Connection connection = Main.plugin.database.connect(); Statement statement = connection.createStatement()){ + try(Connection connection = Database.connect(); Statement statement = connection.createStatement()){ statement.execute(sql); } catch (SQLException e){ Main.plugin.getLogger().severe("SQL Error: " + e.getMessage()); @@ -32,21 +31,22 @@ public class PlayerInfoTable { public PlayerInfo getInfo(UUID uuid){ String sql = "SELECT * FROM player_info WHERE uuid = ?;"; - try(Connection connection = Main.plugin.database.connect(); PreparedStatement statement = connection.prepareStatement(sql)){ - InputStream is = Util.convertUniqueId(uuid); + try(Connection connection = Database.connect(); PreparedStatement statement = connection.prepareStatement(sql)){ + InputStream is = Database.convertUniqueId(uuid); byte[] bytes = new byte[is.available()]; - is.read(bytes); + if(is.read(bytes) == -1){ + throw new IOException("Failed to read bytes from input stream"); + } statement.setBytes(1, bytes); ResultSet rs = statement.executeQuery(); if(rs.next()){ - PlayerInfo info = new PlayerInfo( + return new PlayerInfo( uuid, rs.getInt("wins"), rs.getInt("seeker_wins"), rs.getInt("hider_wins"), rs.getInt("games_played") ); - return info; } } catch (SQLException e){ Main.plugin.getLogger().severe("SQL Error: " + e.getMessage()); @@ -59,13 +59,13 @@ public class PlayerInfoTable { public List<PlayerInfo> getInfoPage(int page){ String sql = "SELECT * FROM player_info ORDER BY wins DESC LIMIT 10 OFFSET ?;"; - try(Connection connection = Main.plugin.database.connect(); PreparedStatement statement = connection.prepareStatement(sql)){ + try(Connection connection = Database.connect(); PreparedStatement statement = connection.prepareStatement(sql)){ statement.setInt(1, (page-1)*10); ResultSet rs = statement.executeQuery(); List<PlayerInfo> infoList = new ArrayList<>(); while(rs.next()){ PlayerInfo info = new PlayerInfo( - Util.convertBinaryStream(rs.getBinaryStream("uuid")), + Database.convertBinaryStream(rs.getBinaryStream("uuid")), rs.getInt("wins"), rs.getInt("seeker_wins"), rs.getInt("hider_wins"), @@ -80,14 +80,16 @@ public class PlayerInfoTable { return null; } - public boolean addWins(List<UUID> uuids, List<UUID> winners, WinType type){ + public void addWins(List<UUID> uuids, List<UUID> winners, WinType type){ for(UUID uuid : uuids){ String sql = "INSERT OR REPLACE INTO player_info (uuid, wins, seeker_wins, hider_wins, games_played) VALUES (?,?,?,?,?)"; PlayerInfo info = getInfo(uuid); - try(Connection connection = Main.plugin.database.connect(); PreparedStatement statement = connection.prepareStatement(sql)){ - InputStream is = Util.convertUniqueId(uuid); + try(Connection connection = Database.connect(); PreparedStatement statement = connection.prepareStatement(sql)){ + InputStream is = Database.convertUniqueId(uuid); byte[] bytes = new byte[is.available()]; - is.read(bytes); + if(is.read(bytes) == -1){ + throw new IOException("Failed to read bytes from input stream"); + } statement.setBytes(1, bytes); statement.setInt(2, info.wins + (winners.contains(uuid) ? 1 : 0)); statement.setInt(3, info.seeker_wins + (winners.contains(uuid) && type == WinType.SEEKER_WIN ? 1 : 0)); @@ -97,13 +99,12 @@ public class PlayerInfoTable { } catch (SQLException e){ Main.plugin.getLogger().severe("SQL Error: " + e.getMessage()); e.printStackTrace(); - return false; + return; } catch (IOException e) { Main.plugin.getLogger().severe("IO Error: " + e.getMessage()); e.printStackTrace(); } } - return true; } } |