Depot implementation of the Game Cookie persistence - hopefully schema compatible with the old version.
git-svn-id: svn+ssh://src.earth.threerings.net/vilya/trunk@381 c613c5cb-e716-0410-b11b-feb51c14d237
This commit is contained in:
@@ -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<GameCookieRecord> getKey (int gameId, int userId)
|
||||||
|
{
|
||||||
|
return new Key<GameCookieRecord>(
|
||||||
|
GameCookieRecord.class,
|
||||||
|
new String[] { GAME_ID, USER_ID },
|
||||||
|
new Comparable[] { gameId, userId });
|
||||||
|
}
|
||||||
|
// AUTO-GENERATED: METHODS END
|
||||||
|
}
|
||||||
@@ -21,26 +21,18 @@
|
|||||||
|
|
||||||
package com.threerings.ezgame.server.persist;
|
package com.threerings.ezgame.server.persist;
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.util.Set;
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.sql.Statement;
|
|
||||||
|
|
||||||
import com.samskivert.io.PersistenceException;
|
import com.samskivert.io.PersistenceException;
|
||||||
|
|
||||||
import com.samskivert.jdbc.ConnectionProvider;
|
import com.samskivert.jdbc.ConnectionProvider;
|
||||||
import com.samskivert.jdbc.DatabaseLiaison;
|
import com.samskivert.jdbc.depot.DepotRepository;
|
||||||
import com.samskivert.jdbc.JDBCUtil;
|
import com.samskivert.jdbc.depot.PersistenceContext;
|
||||||
import com.samskivert.jdbc.JORARepository;
|
import com.samskivert.jdbc.depot.PersistentRecord;
|
||||||
import com.samskivert.jdbc.SimpleRepository;
|
|
||||||
import com.samskivert.jdbc.TransitionRepository;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides storage services for user cookies used in games.
|
* 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. */
|
/** The database identifier used when establishing a connection. */
|
||||||
public static final String COOKIE_DB_IDENT = "gameCookiedb";
|
public static final String COOKIE_DB_IDENT = "gameCookiedb";
|
||||||
@@ -48,48 +40,18 @@ public class GameCookieRepository extends SimpleRepository
|
|||||||
public GameCookieRepository (ConnectionProvider conprov)
|
public GameCookieRepository (ConnectionProvider conprov)
|
||||||
throws PersistenceException
|
throws PersistenceException
|
||||||
{
|
{
|
||||||
super(conprov, COOKIE_DB_IDENT);
|
super(new PersistenceContext(COOKIE_DB_IDENT, conprov));
|
||||||
|
|
||||||
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)" }, "");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the specified game cookie, or null if none.
|
* 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
|
throws PersistenceException
|
||||||
{
|
{
|
||||||
return execute(new Operation<byte[]>() {
|
GameCookieRecord record = load(
|
||||||
public byte[] invoke (Connection conn, DatabaseLiaison liaison)
|
GameCookieRecord.class, GameCookieRecord.getKey(gameId, userId));
|
||||||
throws SQLException, PersistenceException
|
return record != null ? record.cookie : null;
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -99,35 +61,16 @@ public class GameCookieRepository extends SimpleRepository
|
|||||||
final int gameId, final int userId, final byte[] cookie)
|
final int gameId, final int userId, final byte[] cookie)
|
||||||
throws PersistenceException
|
throws PersistenceException
|
||||||
{
|
{
|
||||||
executeUpdate(new Operation<Void>() {
|
if (cookie != null) {
|
||||||
public Void invoke (Connection conn, DatabaseLiaison liaison)
|
store(new GameCookieRecord(gameId, userId, cookie));
|
||||||
throws SQLException, PersistenceException
|
} else {
|
||||||
{
|
delete(GameCookieRecord.class, GameCookieRecord.getKey(gameId, userId));
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
@Override // from DepotRepository
|
||||||
PreparedStatement stmt = conn.prepareStatement(
|
protected void getManagedRecords (Set<Class<? extends PersistentRecord>> classes)
|
||||||
"insert into GAME_COOKIES (GAME_ID, USER_ID, COOKIE) " +
|
{
|
||||||
"values (" + gameId + "," + userId + ",?) " +
|
classes.add(GameCookieRecord.class);
|
||||||
"on duplicate key update COOKIE=values(COOKIE)");
|
|
||||||
try {
|
|
||||||
stmt.setBytes(1, cookie);
|
|
||||||
stmt.executeUpdate();
|
|
||||||
return null;
|
|
||||||
} finally {
|
|
||||||
JDBCUtil.close(stmt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user