From: Hendrik B. <nh...@us...> - 2010-06-07 20:54:34
|
Update of /cvsroot/arianne/stendhal/src/games/stendhal/server/core/engine/db In directory sfp-cvsdas-4.v30.ch3.sourceforge.com:/tmp/cvs-serv7623/src/games/stendhal/server/core/engine/db Modified Files: StendhalCharacterDAO.java StendhalBuddyDAO.java Log Message: store buddies to dedicated table Index: StendhalCharacterDAO.java =================================================================== RCS file: /cvsroot/arianne/stendhal/src/games/stendhal/server/core/engine/db/StendhalCharacterDAO.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** StendhalCharacterDAO.java 19 Sep 2009 12:57:28 -0000 1.4 --- StendhalCharacterDAO.java 7 Jun 2010 20:54:25 -0000 1.5 *************** *** 12,19 **** --- 12,22 ---- package games.stendhal.server.core.engine.db; + import games.stendhal.common.KeyedSlotUtil; import games.stendhal.server.entity.player.Player; import java.io.IOException; import java.sql.SQLException; + import java.util.Set; + import java.util.TreeSet; import marauroa.common.game.RPObject; *************** *** 42,45 **** --- 45,49 ---- final Player instance = (Player) player; DAORegister.get().get(StendhalWebsiteDAO.class).insertIntoCharStats(transaction, instance); + DAORegister.get().get(StendhalBuddyDAO.class).saveBuddyList(character, getBuddies(instance)); } } catch (final SQLException sqle) { *************** *** 64,67 **** --- 68,72 ---- DAORegister.get().get(StendhalWebsiteDAO.class).insertIntoCharStats(transaction, instance); } + DAORegister.get().get(StendhalBuddyDAO.class).saveBuddyList(character, getBuddies(instance)); } catch (final SQLException sqle) { logger.warn("error storing character", sqle); *************** *** 69,71 **** --- 74,96 ---- } } + + /** + * gets a list of buddies + * + * @param player Player to get the buddies for + * @return list of buddies + */ + private Set<String> getBuddies(Player player) { + Set<String> res = new TreeSet<String>(); + final RPObject object = KeyedSlotUtil.getKeyedSlotObject(player, "!buddy"); + if (object == null) { + return res; + } + for (String key : object) { + if (key.startsWith("_")) { + res.add(key.substring(1)); + } + } + return res; + } } Index: StendhalBuddyDAO.java =================================================================== RCS file: /cvsroot/arianne/stendhal/src/games/stendhal/server/core/engine/db/StendhalBuddyDAO.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** StendhalBuddyDAO.java 7 Jun 2010 20:16:00 -0000 1.1 --- StendhalBuddyDAO.java 7 Jun 2010 20:54:25 -0000 1.2 *************** *** 36,40 **** */ public Set<String> loadBuddyList(DBTransaction transaction, String charname) throws SQLException { ! String query = "SELECT buddyname FROM buddy WHERE charname='[charname]'"; Map<String, Object> params = new HashMap<String, Object>(); params.put("charname", charname); --- 36,40 ---- */ public Set<String> loadBuddyList(DBTransaction transaction, String charname) throws SQLException { ! String query = "SELECT buddy FROM buddy WHERE charname='[charname]'"; Map<String, Object> params = new HashMap<String, Object>(); params.put("charname", charname); *************** *** 47,50 **** --- 47,99 ---- } + + /** + * saves the buddy list for the specified charname + * + * @param charname name of char + * @param buddies buddy list + * @throws SQLException + * @throws SQLException in case of an database error + */ + private void saveBuddyList(DBTransaction transaction, String charname, Set<String> buddies) throws SQLException { + Set<String> oldList = loadBuddyList(transaction, charname); + syncBuddyListToDB(transaction, charname, oldList, buddies); + } + + + /** + * writes the current buddy list to the database, minimizing the write operatings. + * + * @param transaction DBTransaction + * @param charname name of character + * @param oldList old buddy list from db + * @param newList current buddy list + * @throws SQLException + * @throws SQLException in case of an database error + */ + private void syncBuddyListToDB(DBTransaction transaction, String charname, Set<String> oldList, Set<String> newList) throws SQLException { + Map<String, Object> params = new HashMap<String, Object>(); + params.put("charname", charname); + + // add + Set<String> toAdd = new TreeSet<String>(newList); + toAdd.removeAll(oldList); + String query = "INSERT INTO buddy (charname, buddy) VALUES ('[charname]', '[buddy]')"; + for (String buddy : toAdd) { + params.put("buddy", buddy); + transaction.execute(query, params); + } + + // delete + Set<String> toDel = new TreeSet<String>(oldList); + toDel.removeAll(newList); + query = "DELETE FROM buddy WHERE charname='[charname]' AND buddy='[buddy]'"; + for (String buddy : toDel) { + params.put("buddy", buddy); + transaction.execute(query, params); + } + } + + /** * loads the buddy list for the specified charname *************** *** 62,64 **** --- 111,131 ---- } } + + + /** + * saves the buddy list for the specified charname + * + * @param charname name of char + * @param buddies buddy list + * @throws SQLException in case of an database error + */ + public void saveBuddyList(String charname, Set<String> buddies) throws SQLException { + DBTransaction transaction = TransactionPool.get().beginWork(); + try { + saveBuddyList(transaction, charname, buddies); + } finally { + TransactionPool.get().commit(transaction); + } + } + } |