diff --git a/src/main/java/de/diddiz/LogBlock/Consumer.java b/src/main/java/de/diddiz/LogBlock/Consumer.java index 48d8ff2..e1fb205 100644 --- a/src/main/java/de/diddiz/LogBlock/Consumer.java +++ b/src/main/java/de/diddiz/LogBlock/Consumer.java @@ -336,7 +336,8 @@ public class Consumer extends TimerTask continue; for (final String player : r.getPlayers()) if (!playerIds.containsKey(player) && !insertedPlayers.contains(player)) { - writer.println("INSERT IGNORE INTO `lb-players` (playername) VALUES ('" + player + "');"); + // Odd query contruction is to work around innodb auto increment behaviour - bug #492 + writer.println("INSERT IGNORE INTO `lb-players` (playername) SELECT '" + player + "' FROM `lb-players` WHERE NOT EXISTS (SELECT NULL FROM `lb-players` WHERE playername = '" + player + "') LIMIT 1;"); insertedPlayers.add(player); } for (final String insert : r.getInserts()) @@ -365,7 +366,8 @@ public class Consumer extends TimerTask } private boolean addPlayer(Statement state, String playerName) throws SQLException { - state.execute("INSERT IGNORE INTO `lb-players` (playername) VALUES ('" + playerName + "')"); + // Odd query contruction is to work around innodb auto increment behaviour - bug #492 + state.execute("INSERT IGNORE INTO `lb-players` (playername) SELECT '" + playerName + "' FROM `lb-players` WHERE NOT EXISTS (SELECT NULL FROM `lb-players` WHERE playername = '" + playerName + "') LIMIT 1;"); final ResultSet rs = state.executeQuery("SELECT playerid FROM `lb-players` WHERE playername = '" + playerName + "'"); if (rs.next()) playerIds.put(playerName, rs.getInt(1)); diff --git a/src/main/java/de/diddiz/LogBlock/Updater.java b/src/main/java/de/diddiz/LogBlock/Updater.java index 8de1123..6d35c79 100644 --- a/src/main/java/de/diddiz/LogBlock/Updater.java +++ b/src/main/java/de/diddiz/LogBlock/Updater.java @@ -246,6 +246,10 @@ class Updater final DatabaseMetaData dbm = conn.getMetaData(); conn.setAutoCommit(true); createTable(dbm, state, "lb-players", "(playerid INT UNSIGNED NOT NULL AUTO_INCREMENT, playername varchar(32) NOT NULL, firstlogin DATETIME NOT NULL, lastlogin DATETIME NOT NULL, onlinetime INT UNSIGNED NOT NULL, ip varchar(255) NOT NULL, PRIMARY KEY (playerid), UNIQUE (playername))"); + // Players table must not be empty or inserts won't work - bug #492 + final ResultSet rs = state.executeQuery("SELECT NULL FROM `lb-players` LIMIT 1;"); + if (!rs.next()) + state.execute("INSERT IGNORE INTO `lb-players` (playername) VALUES ('dummy_record')"); if (isLogging(Logging.CHAT)) createTable(dbm, state, "lb-chat", "(id INT UNSIGNED NOT NULL AUTO_INCREMENT, date DATETIME NOT NULL, playerid INT UNSIGNED NOT NULL, message VARCHAR(255) NOT NULL, PRIMARY KEY (id), KEY playerid (playerid), FULLTEXT message (message)) ENGINE=MyISAM DEFAULT CHARSET utf8"); for (final WorldConfig wcfg : getLoggedWorlds()) {