Skip to content

Accessing database stats

games647 edited this page May 7, 2015 · 10 revisions

Accessing database stats

TODO more documentation

Get the player stats

Using Bukkit's metadata API

I prefer this method as this probably won't change because it's in the Bukkit API.

    private PlayerStats getStats(Player player) {
        for (MetadataValue metadata : player.getMetadata("player_stats")) {
            if (metadata instanceof PlayerStats) {
                return (PlayerStats) metadata;
            }
        }

        //not found - pvp stats disabled or not loaded yet
        return null;
    }

Using ScoreboardStats API
    private PlayerStats getStatsWithInstance(Player player) {
        //returns null if the player isn't loaded yet
        return scoreboardstats.getStatsDatabase().getCachedStats(player);
        //getStatsDatabase() return null if pvpstats tracking is disabled
    }

Do something with it

    private void doSomething(Player player) {
        PlayerStats stats = getStats(player);
        stats.getKdr();
        stats.getKills();
        stats.getKillstreak();
        stats.getLastOnline();

        //set it to this value
        stats.setKills(5);
        //just increments it (+ 1)
        stats.incrementKills();
    }

Using Ebean

    private PlayerStats findByName(String playerName) {
        //this is blocking as it starts a sql connection
        return scoreboardstats.getDatabase()
                .find(PlayerStats.class).where()
                .eq("playername", playerName).findUnique();
    }

Using JDBC

    private void doWithJDBC() {
        EbeanServer database = scoreboardstats.getDatabase();
        database.createSqlQuery("SELECT * FROM `player_stats`").findList();
        database.createSqlUpdate("DELETE FROM `player_stats`").execute();

        //or
        String query = "SELECT * FROM `player_stats` WHERE `kills`=?";
        Transaction transaction = database.beginTransaction();
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try {
            Connection connection = transaction.getConnection();
            statement = connection.prepareStatement(query);
            statement.setInt(0, 1);
            statement.executeQuery();
            resultSet = statement.getResultSet();
            //...
            transaction.commit();
        } catch (SQLException ex) {
            yourPlugin.getLogger().log(Level.SEVERE, null, ex);
        } finally {
            transaction.end();
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException ex) {
                    yourPlugin.getLogger().log(Level.SEVERE, null, ex);
                }
            }

            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException ex) {
                    yourPlugin.getLogger().log(Level.SEVERE, null, ex);
                }
            }
        }
    }

Complete class

package yourdomain.yourplugin;

import com.avaje.ebean.EbeanServer;
import com.avaje.ebean.Transaction;
import com.github.games647.scoreboardstats.ScoreboardStats;
import com.github.games647.scoreboardstats.pvpstats.PlayerStats;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.bukkit.entity.Player;
import org.bukkit.metadata.MetadataValue;

public class DatabaseHook {

    private final ScoreboardStats scoreboardstats;
    private final YourPlugin yourPlugin;

    public DatabaseHook(YourPlugin yourPlugin, ScoreboardStats scoreboardstats) {
        this.yourPlugin = yourPlugin;
        this.scoreboardstats = scoreboardstats;
    }

    private PlayerStats getStats(Player player) {
        for (MetadataValue metadata : player.getMetadata("player_stats")) {
            if (metadata instanceof PlayerStats) {
                return (PlayerStats) metadata;
            }
        }

        //not found - pvp stats disabled or not loaded yet
        return null;
    }

    private PlayerStats getStatsWithInstance(Player player) {
        //returns null if the player isn't loaded yet
        return scoreboardstats.getStatsDatabase().getCachedStats(player);
        //getStatsDatabase() can return null if pvpstats tracking is disabled
    }

    private void doSomething(Player player) {
        PlayerStats stats = getStats(player);
        stats.getKdr();
        stats.getKills();
        stats.getKillstreak();
        stats.getLastOnline();

        //set it to this value
        stats.setKills(5);
        //just increments it (+ 1)
        stats.incrementKills();
    }

    private PlayerStats loadOfflineAccount(Object uniqueId) {
        return scoreboardstats.getStatsDatabase().loadAccount(uniqueId);
    }

    private Iterable<Map.Entry<String, Integer>> getTop() {
        return scoreboardstats.getStatsDatabase().getTop();
    }

    private PlayerStats findByName(String playerName) {
        return scoreboardstats.getDatabase()
                .find(PlayerStats.class).where()
                .eq("playername", playerName).findUnique();
    }

    private void doWithJDBC() {
        EbeanServer database = scoreboardstats.getDatabase();
        database.createSqlQuery("SELECT * FROM `player_stats`").findList();
        database.createSqlUpdate("DELETE FROM `player_stats`").execute();

        //or
        String query = "SELECT * FROM `player_stats` WHERE `kills`=?";
        Transaction transaction = database.beginTransaction();
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try {
            Connection connection = transaction.getConnection();
            statement = connection.prepareStatement(query);
            statement.setInt(1, 15);
            statement.executeQuery();
            resultSet = statement.getResultSet();
            //...
            transaction.commit();
        } catch (SQLException ex) {
            yourPlugin.getLogger().log(Level.SEVERE, null, ex);
        } finally {
            transaction.end();
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException ex) {
                    yourPlugin.getLogger().log(Level.SEVERE, null, ex);
                }
            }

            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException ex) {
                    yourPlugin.getLogger().log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}

Clone this wiki locally