package arcade.database;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* Creates and updates game table
* this clearly needs to be refactored because there is duplicate code.
* @author Natalia Carvalho
* @editor Joshua Waldman
*/
public class GameTable extends Table {
private Connection myConnection;
private PreparedStatement myPreparedStatement;
private ResultSet myResultSet;
/**
* GameTable constructor
*/
public GameTable() {
super();
myConnection = getDatabaseConnection().getConnection();
myPreparedStatement = getDatabaseConnection().getPreparedStatement();
myResultSet = getDatabaseConnection().getResultSet();
}
/**
* Returns true if gameName already exists, false otherwise
* @param gameName is the name of game
*/
public boolean gameNameExists(String gameName) {
String stm = "SELECT gamename FROM games WHERE gamename='" + gameName + "'";
try {
myPreparedStatement = myConnection.prepareStatement(stm);
myResultSet = myPreparedStatement.executeQuery();
if (myResultSet.next()) {
return true;
}
}
catch (SQLException e) {
writeErrorMessage("Error determining if game name exists in GameTable.java");
}
return false;
}
/**
* Given a gameName, retrieves a gameID
* @param gameName is the game's name
*/
public String retrieveGameId(String gameName) {
return retrieveEntryString(Keys.GAM_TABLE_NAME, Keys.GAM_GAMENAME_COLUMN_FIELD,
gameName, Keys.GAM_GAMENAME_COLUMN_INDEX);
}
/**
* Given the gameName, adds a game with needed information to database
* @param gameName of game
* @param author of game
* @param genre of game
* @param price of game
* @param extendsGame string
* @param extendsMultiplayerGame string
* @param ageRating permissions
* @param singlePlayer is true if game is for singleplayer
* @param multiplayer is true if game is a multiplayer game
* @param thumbnailPath is where game thumbnail resides
* @param adscreenPath is where adscreen resides
* @param description of game
*/
public boolean createGame(String gameName, String author, String genre, double price,
String extendsGame, String extendsMultiplayerGame, int ageRating,
boolean singlePlayer, boolean multiplayer, String thumbnailPath,
String adscreenPath, String description) {
if (gameNameExists(gameName)) {
return false;
}
String stm = "INSERT INTO " + Keys.GAM_TABLE_NAME + "(gamename, author, genre, thumbnail, " +
"adscreen, agepermission, price, extendsgame, " +
"extendsmultiplayergame, " + "singleplayer, multiplayer, description) " +
"VALUES(?,?,?,?,?,?,?,?,?,?,?,?)";
try {
myPreparedStatement = myConnection.prepareStatement(stm);
myPreparedStatement.setString(Keys.GAM_GAMENAME_COLUMN_INDEX, gameName);
myPreparedStatement.setString(Keys.GAM_AUTHOR_COLUMN_INDEX, author);
myPreparedStatement.setString(Keys.GAM_GENRE_COLUMN_INDEX, genre);
myPreparedStatement.setString(Keys.GAM_THUMBNAIL_COLUMN_INDEX, thumbnailPath);
myPreparedStatement.setString(Keys.GAM_ADSCREEN_COLUMN_INDEX, adscreenPath);
myPreparedStatement.setInt(Keys.GAM_AGEPERMISSION_COLUMN_INDEX, ageRating);
myPreparedStatement.setDouble(Keys.GAM_PRICE_COLUMN_INDEX, price);
myPreparedStatement.setString(Keys.GAM_EXTENDSGAME_COLUMN_INDEX, extendsGame);
myPreparedStatement.setString(Keys.GAM_EXTENDSMULTIPLAYER_COLUMN_INDEX,
extendsMultiplayerGame);
myPreparedStatement.setBoolean(Keys.GAM_SINGLEPLAYER_COLUMN_INDEX, singlePlayer);
myPreparedStatement.setBoolean(Keys.GAM_MULTIPLAYER_COLUMN_INDEX, multiplayer);
myPreparedStatement.setString(Keys.GAM_DESCRIPTION_COLUMN_INDEX, description);
myPreparedStatement.executeUpdate();
}
catch (SQLException e) {
writeErrorMessage("Error creating game in GameTable.java");
}
return true;
}
/**
* Returns a list of all the games
*/
public List<String> retrieveGameList() {
String stm = "SELECT " + Keys.GAM_GAMENAME_COLUMN_FIELD + " FROM " + Keys.GAM_TABLE_NAME;
List<String> myGameNames = new ArrayList<String>();
try {
myPreparedStatement = myConnection.prepareStatement(stm);
myResultSet = myPreparedStatement.executeQuery();
while (myResultSet.next()) {
myGameNames.add(myResultSet.getString(Keys.GAM_GAMENAME_COLUMN_INDEX));
}
}
catch (SQLException e) {
writeErrorMessage("Error retrieving game list in GameTable.java");
}
return myGameNames;
}
/**
* Given a game, deletes that game from gameTable
* @param gameName is gameName
*/
public void deleteGame(String gameName) {
String stm = "DELETE FROM " + Keys.GAM_TABLE_NAME + Keys.WHERE_KEYWORD +
Keys.GAM_GAMENAME_COLUMN_FIELD + Keys.EQUALS + gameName + Keys.APOSTROPHE;
try {
myPreparedStatement = myConnection.prepareStatement(stm);
myPreparedStatement.executeUpdate();
}
catch (SQLException e) {
writeErrorMessage("Error deleting game in GameTable.java");
}
}
/**
* Prints entire table
*/
public void printEntireTable () {
myResultSet = selectAllRecordsFromTable(Keys.GAM_TABLE_NAME);
try {
while (myResultSet.next()) {
System.out.print(myResultSet.getString(Keys.GAM_GAMENAME_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.print(myResultSet.getString(Keys.GAM_AUTHOR_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.print(myResultSet.getString(Keys.GAM_GENRE_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.print(myResultSet.getString(Keys.GAM_THUMBNAIL_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.print(myResultSet.getString(Keys.GAM_ADSCREEN_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.print(myResultSet.getInt(Keys.GAM_AGEPERMISSION_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.print(myResultSet.getDouble(Keys.GAM_PRICE_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.print(myResultSet.getString(Keys.GAM_EXTENDSGAME_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.print(myResultSet.getString(Keys.GAM_EXTENDSMULTIPLAYER_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.print(myResultSet.getBoolean(Keys.GAM_SINGLEPLAYER_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.print(myResultSet.getBoolean(Keys.GAM_MULTIPLAYER_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.print(myResultSet.getString(Keys.GAM_DESCRIPTION_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.println(myResultSet.getString(Keys.GAM_GAMEID_COLUMN_INDEX));
}
}
catch (SQLException e) {
writeErrorMessage("Error printing entire table in GameTable.java");
}
}
/**
* Given a gamename, retrieves genre
* @param gameName is the gamename
*/
public String getGenre(String gameName) {
return retrieveEntryString(Keys.GAM_TABLE_NAME, Keys.GAM_GAMENAME_COLUMN_FIELD,
gameName, Keys.GAM_GENRE_COLUMN_INDEX);
}
/**
* Given a gamename, retrieves author
* @param gameName is the gamename
*/
public String getAuthor(String gameName) {
return retrieveEntryString(Keys.GAM_TABLE_NAME, Keys.GAM_GAMENAME_COLUMN_FIELD,
gameName, Keys.GAM_AUTHOR_COLUMN_INDEX);
}
/**
* Given a gamename, retrieves thumbnail path
* @param gameName is the gamename
*/
public String getThumbnailPath(String gameName) {
return retrieveEntryString(Keys.GAM_TABLE_NAME, Keys.GAM_GAMENAME_COLUMN_FIELD, gameName,
Keys.GAM_THUMBNAIL_COLUMN_INDEX);
}
/**
* Given a gamename, retrieves adscreen path
* @param gameName is the gamename
*/
public String getAdScreenPath(String gameName) {
return retrieveEntryString(Keys.GAM_TABLE_NAME, Keys.GAM_GAMENAME_COLUMN_FIELD,
gameName, Keys.GAM_ADSCREEN_COLUMN_INDEX);
}
/**
* Given a gamename, retrieves age permission
* @param gameName is the gamename
*/
public int getAgePermission(String gameName) {
return retrieveEntryInt(Keys.GAM_TABLE_NAME, Keys.GAM_GAMENAME_COLUMN_FIELD,
gameName, Keys.GAM_AGEPERMISSION_COLUMN_INDEX);
}
/**
* Given a gamename, retrieves price
* @param gameName is the gamename
*/
public double getPrice(String gameName) {
return retrieveEntryDouble(gameName, Keys.GAM_PRICE_COLUMN_INDEX);
}
/**
* Given a gamename, retrieves extendsgame
* @param gameName is the gamename
*/
public String getExtendsGame(String gameName) {
return retrieveEntryString(Keys.GAM_TABLE_NAME, Keys.GAM_GAMENAME_COLUMN_FIELD,
gameName, Keys.GAM_EXTENDSGAME_COLUMN_INDEX);
}
/**
* Given a gamename, retrieves extendsgamemultiplayer
* @param gameName is the gamename
*/
public String getExtendsGameMultiplayer(String gameName) {
return retrieveEntryString(Keys.GAM_TABLE_NAME, Keys.GAM_GAMENAME_COLUMN_FIELD,
gameName, Keys.GAM_EXTENDSMULTIPLAYER_COLUMN_INDEX);
}
/**
* Given a gamename, retrieves extendsgamemultiplayer
* @param gameName is the gamename
*/
public boolean getIsSinglePlayer(String gameName) {
return retrieveEntryBoolean(Keys.GAM_TABLE_NAME, Keys.GAM_GAMENAME_COLUMN_FIELD,
gameName, Keys.GAM_SINGLEPLAYER_COLUMN_INDEX);
}
/**
* Given a gamename, retrieves extendsgamemultiplayer
* @param gameName is the gamename
*/
public boolean getIsMultiplayer(String gameName) {
return retrieveEntryBoolean(Keys.GAM_TABLE_NAME, Keys.GAM_GAMENAME_COLUMN_FIELD,
gameName, Keys.GAM_MULTIPLAYER_COLUMN_INDEX);
}
/**
* Given a gamename, retrieves description
* @param gameName is the gamename
*/
public String getDescription(String gameName) {
return retrieveEntryString(Keys.GAM_TABLE_NAME, Keys.GAM_GAMENAME_COLUMN_FIELD,
gameName, Keys.GAM_DESCRIPTION_COLUMN_INDEX);
}
/**
* Given a gamename and a column_index, returns that entire row entry
* @param gameName is the gamename
* @param columnIndex is the index that we want the information for
*/
public double retrieveEntryDouble(String gameName, int columnIndex) {
String stm = "SELECT * FROM " + Keys.GAM_TABLE_NAME + Keys.WHERE_KEYWORD +
Keys.GAM_GAMENAME_COLUMN_FIELD + Keys.EQUALS + gameName + Keys.APOSTROPHE;
double entry = 0;
try {
myPreparedStatement = myConnection.prepareStatement(stm);
myResultSet = myPreparedStatement.executeQuery();
if (myResultSet.next()) {
entry = myResultSet.getDouble(columnIndex);
}
}
catch (SQLException e) {
writeErrorMessage("Error retrieving entry double in GameTable.java");
}
return entry;
}
}