Merge pull request #88 from krinsdeath/master

Fixed Database handler being ridiculously inefficient
This commit is contained in:
nossr50 2011-09-11 23:49:13 -07:00
commit 49b1e4ac45

View File

@ -8,192 +8,127 @@ import java.util.HashMap;
import java.util.ArrayList; import java.util.ArrayList;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import org.bukkit.entity.Player;
import com.avaje.ebeaninternal.server.lib.sql.DataSourceException;
import com.gmail.nossr50.config.LoadProperties; import com.gmail.nossr50.config.LoadProperties;
public class Database { public class Database {
private Connection conn;
private mcMMO plugin; private mcMMO plugin;
private String connectionString;
public Database(mcMMO instance) public Database(mcMMO instance) {
{ this.plugin = instance;
plugin = instance; this.connectionString = "jdbc:mysql://" + LoadProperties.MySQLserverName + ":" + LoadProperties.MySQLport + "/" + LoadProperties.MySQLdbName + "?user=" + LoadProperties.MySQLuserName + "&password=" + LoadProperties.MySQLdbPass;
// Load the driver instance // Load the driver instance
try { try {
Class.forName("com.mysql.jdbc.Driver").newInstance(); Class.forName("com.mysql.jdbc.Driver");
} catch (Exception ex) { DriverManager.getConnection(connectionString);
throw new DataSourceException("Failed to initialize JDBC driver"); } catch (ClassNotFoundException e) {
} plugin.getServer().getLogger().warning(e.getLocalizedMessage());
} catch (SQLException e) {
// make the connection plugin.getServer().getLogger().warning(e.getLocalizedMessage());
try { System.out.println("SQLException: " + e.getMessage());
conn = DriverManager.getConnection("jdbc:mysql://" + LoadProperties.MySQLserverName + ":" + LoadProperties.MySQLport + "/" + LoadProperties.MySQLdbName + "?user=" + LoadProperties.MySQLuserName + "&password=" + LoadProperties.MySQLdbPass); System.out.println("SQLState: " + e.getSQLState());
} catch (SQLException ex) { System.out.println("VendorError: " + e.getErrorCode());
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
} }
} }
//Create the DB structure //Create the DB structure
public void createStructure(){
Write("CREATE TABLE IF NOT EXISTS `"+LoadProperties.MySQLtablePrefix+"huds` (`user_id` int(10) unsigned NOT NULL," + public void createStructure() {
"`hudtype` varchar(50) NOT NULL DEFAULT ''," + Write("CREATE TABLE IF NOT EXISTS `" + LoadProperties.MySQLtablePrefix + "huds` (`user_id` int(10) unsigned NOT NULL,"
"PRIMARY KEY (`user_id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;"); + "`hudtype` varchar(50) NOT NULL DEFAULT '',"
Write("CREATE TABLE IF NOT EXISTS `"+LoadProperties.MySQLtablePrefix+"users` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT," + + "PRIMARY KEY (`user_id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;");
"`user` varchar(40) NOT NULL," + Write("CREATE TABLE IF NOT EXISTS `" + LoadProperties.MySQLtablePrefix + "users` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,"
"`lastlogin` int(32) unsigned NOT NULL," + + "`user` varchar(40) NOT NULL,"
"`party` varchar(100) NOT NULL DEFAULT ''," + + "`lastlogin` int(32) unsigned NOT NULL,"
"PRIMARY KEY (`id`)," + + "`party` varchar(100) NOT NULL DEFAULT '',"
"UNIQUE KEY `user` (`user`)) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;"); + "PRIMARY KEY (`id`),"
Write("CREATE TABLE IF NOT EXISTS `"+LoadProperties.MySQLtablePrefix+"cooldowns` (`user_id` int(10) unsigned NOT NULL," + + "UNIQUE KEY `user` (`user`)) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;");
"`taming` int(32) unsigned NOT NULL DEFAULT '0'," + Write("CREATE TABLE IF NOT EXISTS `" + LoadProperties.MySQLtablePrefix + "cooldowns` (`user_id` int(10) unsigned NOT NULL,"
"`mining` int(32) unsigned NOT NULL DEFAULT '0'," + + "`taming` int(32) unsigned NOT NULL DEFAULT '0',"
"`woodcutting` int(32) unsigned NOT NULL DEFAULT '0'," + + "`mining` int(32) unsigned NOT NULL DEFAULT '0',"
"`repair` int(32) unsigned NOT NULL DEFAULT '0'," + + "`woodcutting` int(32) unsigned NOT NULL DEFAULT '0',"
"`unarmed` int(32) unsigned NOT NULL DEFAULT '0'," + + "`repair` int(32) unsigned NOT NULL DEFAULT '0',"
"`herbalism` int(32) unsigned NOT NULL DEFAULT '0'," + + "`unarmed` int(32) unsigned NOT NULL DEFAULT '0',"
"`excavation` int(32) unsigned NOT NULL DEFAULT '0'," + + "`herbalism` int(32) unsigned NOT NULL DEFAULT '0',"
"`archery` int(32) unsigned NOT NULL DEFAULT '0'," + + "`excavation` int(32) unsigned NOT NULL DEFAULT '0',"
"`swords` int(32) unsigned NOT NULL DEFAULT '0'," + + "`archery` int(32) unsigned NOT NULL DEFAULT '0',"
"`axes` int(32) unsigned NOT NULL DEFAULT '0'," + + "`swords` int(32) unsigned NOT NULL DEFAULT '0',"
"`acrobatics` int(32) unsigned NOT NULL DEFAULT '0'," + + "`axes` int(32) unsigned NOT NULL DEFAULT '0',"
"PRIMARY KEY (`user_id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;"); + "`acrobatics` int(32) unsigned NOT NULL DEFAULT '0',"
Write("CREATE TABLE IF NOT EXISTS `"+LoadProperties.MySQLtablePrefix+"skills` (`user_id` int(10) unsigned NOT NULL," + + "PRIMARY KEY (`user_id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;");
"`taming` int(10) unsigned NOT NULL DEFAULT '0'," + Write("CREATE TABLE IF NOT EXISTS `" + LoadProperties.MySQLtablePrefix + "skills` (`user_id` int(10) unsigned NOT NULL,"
"`mining` int(10) unsigned NOT NULL DEFAULT '0'," + + "`taming` int(10) unsigned NOT NULL DEFAULT '0',"
"`woodcutting` int(10) unsigned NOT NULL DEFAULT '0'," + + "`mining` int(10) unsigned NOT NULL DEFAULT '0',"
"`repair` int(10) unsigned NOT NULL DEFAULT '0'," + + "`woodcutting` int(10) unsigned NOT NULL DEFAULT '0',"
"`unarmed` int(10) unsigned NOT NULL DEFAULT '0'," + + "`repair` int(10) unsigned NOT NULL DEFAULT '0',"
"`herbalism` int(10) unsigned NOT NULL DEFAULT '0'," + + "`unarmed` int(10) unsigned NOT NULL DEFAULT '0',"
"`excavation` int(10) unsigned NOT NULL DEFAULT '0'," + + "`herbalism` int(10) unsigned NOT NULL DEFAULT '0',"
"`archery` int(10) unsigned NOT NULL DEFAULT '0'," + + "`excavation` int(10) unsigned NOT NULL DEFAULT '0',"
"`swords` int(10) unsigned NOT NULL DEFAULT '0'," + + "`archery` int(10) unsigned NOT NULL DEFAULT '0',"
"`axes` int(10) unsigned NOT NULL DEFAULT '0'," + + "`swords` int(10) unsigned NOT NULL DEFAULT '0',"
"`acrobatics` int(10) unsigned NOT NULL DEFAULT '0'," + + "`axes` int(10) unsigned NOT NULL DEFAULT '0',"
"PRIMARY KEY (`user_id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;"); + "`acrobatics` int(10) unsigned NOT NULL DEFAULT '0',"
Write("CREATE TABLE IF NOT EXISTS `"+LoadProperties.MySQLtablePrefix+"experience` (`user_id` int(10) unsigned NOT NULL," + + "PRIMARY KEY (`user_id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;");
"`taming` int(10) unsigned NOT NULL DEFAULT '0'," + Write("CREATE TABLE IF NOT EXISTS `" + LoadProperties.MySQLtablePrefix + "experience` (`user_id` int(10) unsigned NOT NULL,"
"`mining` int(10) unsigned NOT NULL DEFAULT '0'," + + "`taming` int(10) unsigned NOT NULL DEFAULT '0',"
"`woodcutting` int(10) unsigned NOT NULL DEFAULT '0'," + + "`mining` int(10) unsigned NOT NULL DEFAULT '0',"
"`repair` int(10) unsigned NOT NULL DEFAULT '0'," + + "`woodcutting` int(10) unsigned NOT NULL DEFAULT '0',"
"`unarmed` int(10) unsigned NOT NULL DEFAULT '0'," + + "`repair` int(10) unsigned NOT NULL DEFAULT '0',"
"`herbalism` int(10) unsigned NOT NULL DEFAULT '0'," + + "`unarmed` int(10) unsigned NOT NULL DEFAULT '0',"
"`excavation` int(10) unsigned NOT NULL DEFAULT '0'," + + "`herbalism` int(10) unsigned NOT NULL DEFAULT '0',"
"`archery` int(10) unsigned NOT NULL DEFAULT '0'," + + "`excavation` int(10) unsigned NOT NULL DEFAULT '0',"
"`swords` int(10) unsigned NOT NULL DEFAULT '0'," + + "`archery` int(10) unsigned NOT NULL DEFAULT '0',"
"`axes` int(10) unsigned NOT NULL DEFAULT '0'," + + "`swords` int(10) unsigned NOT NULL DEFAULT '0',"
"`acrobatics` int(10) unsigned NOT NULL DEFAULT '0'," + + "`axes` int(10) unsigned NOT NULL DEFAULT '0',"
"PRIMARY KEY (`user_id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;"); + "`acrobatics` int(10) unsigned NOT NULL DEFAULT '0',"
Write("CREATE TABLE IF NOT EXISTS `"+LoadProperties.MySQLtablePrefix+"spawn` (`user_id` int(10) NOT NULL," + + "PRIMARY KEY (`user_id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;");
"`x` int(64) NOT NULL DEFAULT '0'," + Write("CREATE TABLE IF NOT EXISTS `" + LoadProperties.MySQLtablePrefix + "spawn` (`user_id` int(10) NOT NULL,"
"`y` int(64) NOT NULL DEFAULT '0'," + + "`x` int(64) NOT NULL DEFAULT '0',"
"`z` int(64) NOT NULL DEFAULT '0'," + + "`y` int(64) NOT NULL DEFAULT '0',"
"`world` varchar(50) NOT NULL DEFAULT ''," + + "`z` int(64) NOT NULL DEFAULT '0',"
"PRIMARY KEY (`user_id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;"); + "`world` varchar(50) NOT NULL DEFAULT '',"
+ "PRIMARY KEY (`user_id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;");
} }
// check if its closed
private void reconnect()
{
System.out.println("[mcMMO] Reconnecting to MySQL...");
try
{
conn = DriverManager.getConnection("jdbc:mysql://" + LoadProperties.MySQLserverName + ":" + LoadProperties.MySQLport + "/" + LoadProperties.MySQLdbName + "?user=" + LoadProperties.MySQLuserName + "&password=" + LoadProperties.MySQLdbPass);
System.out.println("[mcMMO] Connection success!");
} catch (SQLException ex)
{
System.out.println("[mcMMO] Connection to MySQL failed! Check status of MySQL server!");
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
try {
if(conn.isValid(5)){
Users.clearUsers();
for(Player x : plugin.getServer().getOnlinePlayers())
{
Users.addUser(x);
}
}
} catch (SQLException e) {
//Herp
}
}
// write query // write query
public boolean Write(String sql) public boolean Write(String sql) {
{ try {
/* Connection conn = DriverManager.getConnection(connectionString);
* Double check connection to MySQL PreparedStatement stmt = conn.prepareStatement(sql);
*/ stmt.executeUpdate();
try conn.close();
{ return true;
if(!conn.isValid(5)) } catch (SQLException ex) {
{ System.out.println("SQLException: " + ex.getMessage());
reconnect(); System.out.println("SQLState: " + ex.getSQLState());
} System.out.println("VendorError: " + ex.getErrorCode());
} catch (SQLException e) return false;
{
e.printStackTrace();
} }
}
try
{
PreparedStatement stmt = null;
stmt = this.conn.prepareStatement(sql);
stmt.executeUpdate();
return true;
} catch(SQLException ex) {
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
return false;
}
}
// Get Int // Get Int
// only return first row / first field // only return first row / first field
public Integer GetInt(String sql) { public Integer GetInt(String sql) {
PreparedStatement stmt = null;
ResultSet rs = null; ResultSet rs = null;
Integer result = 0; Integer result = 0;
/*
* Double check connection to MySQL
*/
try
{
if(!conn.isValid(5))
{
reconnect();
}
} catch (SQLException e)
{
e.printStackTrace();
}
try { try {
stmt = this.conn.prepareStatement(sql); Connection conn = DriverManager.getConnection(connectionString);
if (stmt.executeQuery() != null) { PreparedStatement stmt = conn.prepareStatement(sql);
stmt.executeQuery(); stmt = conn.prepareStatement(sql);
rs = stmt.getResultSet(); if (stmt.executeQuery() != null) {
if(rs.next()){ stmt.executeQuery();
result = rs.getInt(1); rs = stmt.getResultSet();
} if (rs.next()) {
else { result = 0; } result = rs.getInt(1);
} } else {
} result = 0;
catch (SQLException ex) { }
System.out.println("SQLException: " + ex.getMessage()); }
System.out.println("SQLState: " + ex.getSQLState()); conn.close();
System.out.println("VendorError: " + ex.getErrorCode()); } catch (SQLException ex) {
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
} }
return result; return result;
@ -201,59 +136,28 @@ public class Database {
// read query // read query
public HashMap<Integer, ArrayList<String>> Read(String sql) { public HashMap<Integer, ArrayList<String>> Read(String sql) {
/*
* Double check connection to MySQL
*/
try
{
if(!conn.isValid(5))
{
reconnect();
}
} catch (SQLException e)
{
e.printStackTrace();
}
PreparedStatement stmt = null;
ResultSet rs = null; ResultSet rs = null;
HashMap<Integer, ArrayList<String>> Rows = new HashMap<Integer, ArrayList<String>>(); HashMap<Integer, ArrayList<String>> Rows = new HashMap<Integer, ArrayList<String>>();
try { try {
stmt = this.conn.prepareStatement(sql); Connection conn = DriverManager.getConnection(connectionString);
if (stmt.executeQuery() != null) { PreparedStatement stmt = conn.prepareStatement(sql);
stmt.executeQuery(); if (stmt.executeQuery() != null) {
rs = stmt.getResultSet(); stmt.executeQuery();
rs = stmt.getResultSet();
while (rs.next()) { while (rs.next()) {
ArrayList<String> Col = new ArrayList<String>(); ArrayList<String> Col = new ArrayList<String>();
for(int i=1;i<=rs.getMetaData().getColumnCount();i++) { for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
Col.add(rs.getString(i)); Col.add(rs.getString(i));
} }
Rows.put(rs.getRow(),Col); Rows.put(rs.getRow(), Col);
} }
} }
conn.close();
} catch (SQLException ex) {
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
} }
catch (SQLException ex) {
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
// release dataset
if (rs != null) {
try {
rs.close();
} catch (SQLException sqlEx) { } // ignore
rs = null;
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException sqlEx) { } // ignore
stmt = null;
}
return Rows; return Rows;
} }
} }