diff --git a/src/java/com/threerings/ezgame/server/persist/GameCookieRecord.java b/src/java/com/threerings/ezgame/server/persist/GameCookieRecord.java new file mode 100644 index 00000000..6fce7579 --- /dev/null +++ b/src/java/com/threerings/ezgame/server/persist/GameCookieRecord.java @@ -0,0 +1,100 @@ +// +// $Id: GameCookieRepository.java 209 2007-02-24 00:37:33Z mdb $ +// +// Vilya library - tools for developing networked games +// Copyright (C) 2002-2007 Three Rings Design, Inc., All Rights Reserved +// http://www.threerings.net/code/vilya/ +// +// This library is free software; you can redistribute it and/or modify it +// under the terms of the GNU Lesser General Public License as published +// by the Free Software Foundation; either version 2.1 of the License, or +// (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +package com.threerings.ezgame.server.persist; + +import com.samskivert.jdbc.depot.Key; +import com.samskivert.jdbc.depot.PersistentRecord; +import com.samskivert.jdbc.depot.annotation.Column; +import com.samskivert.jdbc.depot.annotation.Entity; +import com.samskivert.jdbc.depot.annotation.Id; +import com.samskivert.jdbc.depot.expression.ColumnExp; + +@Entity(name="GAME_COOKIES") +public class GameCookieRecord extends PersistentRecord +{ + // AUTO-GENERATED: FIELDS START + /** The column identifier for the {@link #gameId} field. */ + public static final String GAME_ID = "gameId"; + + /** The qualified column identifier for the {@link #gameId} field. */ + public static final ColumnExp GAME_ID_C = + new ColumnExp(GameCookieRecord.class, GAME_ID); + + /** The column identifier for the {@link #userId} field. */ + public static final String USER_ID = "userId"; + + /** The qualified column identifier for the {@link #userId} field. */ + public static final ColumnExp USER_ID_C = + new ColumnExp(GameCookieRecord.class, USER_ID); + + /** The column identifier for the {@link #cookie} field. */ + public static final String COOKIE = "cookie"; + + /** The qualified column identifier for the {@link #cookie} field. */ + public static final ColumnExp COOKIE_C = + new ColumnExp(GameCookieRecord.class, COOKIE); + // AUTO-GENERATED: FIELDS END + + public static final int SCHEMA_VERSION = 1; + + /** The id of the game for which this is a cookie. */ + @Id + @Column(name="GAME_ID") + public int gameId; + + /** The id of the user for which this is a cookie. */ + @Id + @Column(name="USER_ID") + public int userId; + + /** The actual cookie, as a byte array. */ + @Column(name="COOKIE") + public byte[] cookie; + + /** A no-argument constructor for deserialization. */ + public GameCookieRecord () + { + } + + /** A constructor for configuring all the fields of this record. */ + public GameCookieRecord (int gameId, int userId, byte[] cookie) + { + super(); + this.gameId = gameId; + this.userId = userId; + this.cookie = cookie; + } + + // AUTO-GENERATED: METHODS START + /** + * Create and return a primary {@link Key} to identify a {@link #GameCookieRecord} + * with the supplied key values. + */ + public static Key getKey (int gameId, int userId) + { + return new Key( + GameCookieRecord.class, + new String[] { GAME_ID, USER_ID }, + new Comparable[] { gameId, userId }); + } + // AUTO-GENERATED: METHODS END +} diff --git a/src/java/com/threerings/ezgame/server/persist/GameCookieRepository.java b/src/java/com/threerings/ezgame/server/persist/GameCookieRepository.java index eed4ce56..c8fa7a0b 100644 --- a/src/java/com/threerings/ezgame/server/persist/GameCookieRepository.java +++ b/src/java/com/threerings/ezgame/server/persist/GameCookieRepository.java @@ -21,26 +21,18 @@ package com.threerings.ezgame.server.persist; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; +import java.util.Set; import com.samskivert.io.PersistenceException; - import com.samskivert.jdbc.ConnectionProvider; -import com.samskivert.jdbc.DatabaseLiaison; -import com.samskivert.jdbc.JDBCUtil; -import com.samskivert.jdbc.JORARepository; -import com.samskivert.jdbc.SimpleRepository; -import com.samskivert.jdbc.TransitionRepository; - +import com.samskivert.jdbc.depot.DepotRepository; +import com.samskivert.jdbc.depot.PersistenceContext; +import com.samskivert.jdbc.depot.PersistentRecord; /** * Provides storage services for user cookies used in games. */ -public class GameCookieRepository extends SimpleRepository +public class GameCookieRepository extends DepotRepository { /** The database identifier used when establishing a connection. */ public static final String COOKIE_DB_IDENT = "gameCookiedb"; @@ -48,48 +40,18 @@ public class GameCookieRepository extends SimpleRepository public GameCookieRepository (ConnectionProvider conprov) throws PersistenceException { - super(conprov, COOKIE_DB_IDENT); - - maintenance("analyze", "GAME_COOKIES"); - } - - @Override - protected void migrateSchema (Connection conn, DatabaseLiaison liaison) - throws SQLException, PersistenceException - { - super.migrateSchema(conn, liaison); - - JDBCUtil.createTableIfMissing(conn, "GAME_COOKIES", new String[] { - "GAME_ID integer not null", - "USER_ID integer not null", - "COOKIE blob not null", - "primary key (GAME_ID, USER_ID)" }, ""); + super(new PersistenceContext(COOKIE_DB_IDENT, conprov)); } /** * Get the specified game cookie, or null if none. */ - public byte[] getCookie (final int gameId, final int userId) + public byte[] getCookie (int gameId, int userId) throws PersistenceException { - return execute(new Operation() { - public byte[] invoke (Connection conn, DatabaseLiaison liaison) - throws SQLException, PersistenceException - { - Statement stmt = conn.createStatement(); - try { - ResultSet rs = stmt.executeQuery("select COOKIE " + - "from GAME_COOKIES where GAME_ID=" + gameId + - " and USER_ID=" + userId); - if (rs.next()) { - return rs.getBytes(1); - } - return null; - } finally { - JDBCUtil.close(stmt); - } - } - }); + GameCookieRecord record = load( + GameCookieRecord.class, GameCookieRecord.getKey(gameId, userId)); + return record != null ? record.cookie : null; } /** @@ -99,35 +61,16 @@ public class GameCookieRepository extends SimpleRepository final int gameId, final int userId, final byte[] cookie) throws PersistenceException { - executeUpdate(new Operation() { - public Void invoke (Connection conn, DatabaseLiaison liaison) - throws SQLException, PersistenceException - { - if (cookie == null) { - Statement stmt = conn.createStatement(); - try { - stmt.executeUpdate("delete from GAME_COOKIES" + - " where GAME_ID=" + gameId + - " and USER_ID=" + userId); - return null; - } finally { - JDBCUtil.close(stmt); - } + if (cookie != null) { + store(new GameCookieRecord(gameId, userId, cookie)); + } else { + delete(GameCookieRecord.class, GameCookieRecord.getKey(gameId, userId)); + } + } - } else { - PreparedStatement stmt = conn.prepareStatement( - "insert into GAME_COOKIES (GAME_ID, USER_ID, COOKIE) " + - "values (" + gameId + "," + userId + ",?) " + - "on duplicate key update COOKIE=values(COOKIE)"); - try { - stmt.setBytes(1, cookie); - stmt.executeUpdate(); - return null; - } finally { - JDBCUtil.close(stmt); - } - } - } - }); + @Override // from DepotRepository + protected void getManagedRecords (Set> classes) + { + classes.add(GameCookieRecord.class); } }