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 user table
* @author Natalia Carvalho
* @editor Joshua Waldman
*/
public class UserTable extends Table {
private Connection myConnection;
private PreparedStatement myPreparedStatement;
private ResultSet myResultSet;
/**
* Constructor but eventually I want to make this part of the abstract class
*/
public UserTable() {
super();
myConnection = getDatabaseConnection().getConnection();
myPreparedStatement = getDatabaseConnection().getPreparedStatement();
myResultSet = getDatabaseConnection().getResultSet();
}
/**
* Authenticates entry when username and password are present in user table
* @param username is the username
* @param password is the password
* @return true if valid username/password; false otherwise
*/
public boolean authenticateUsernameAndPassword(String username, String password) {
String stm = "SELECT username, pw FROM users WHERE username = '" +
username + Keys.APOSTROPHE;
try {
myPreparedStatement = myConnection.prepareStatement(stm);
myResultSet = myPreparedStatement.executeQuery();
if (myResultSet.next()) {
if (myResultSet.getString(Keys.USER_PASSWORD_COLUMN_INDEX).equals(password)) {
return true;
}
}
}
catch (SQLException e) {
writeErrorMessage("Error authenticating in UserTable.java");
}
return false;
}
/**
* Returns true if usernameExists, false otherwise
* @param username is the username
*/
public boolean usernameExists(String username) {
String stm = "SELECT username FROM users WHERE username='" + username + Keys.APOSTROPHE;
try {
myPreparedStatement = myConnection.prepareStatement(stm);
myResultSet = myPreparedStatement.executeQuery();
if (myResultSet.next()) {
return true;
}
}
catch (SQLException e) {
writeErrorMessage("Error determining if username exists in UserTable.java");
}
return false;
}
/**
* Adds a user to user table based on information
* @param user is the username
* @param pw is the password
* @param firstname is firstname
* @param lastname is lastname
* @param dob is date of birth
*/
public boolean createUser(String user, String pw, String firstname,
String lastname, String dob) {
if (usernameExists(user)) {
return false;
}
String stm = "INSERT INTO users(username, pw, firstname, lastname, DOB) " +
"VALUES(?, ?, ?, ?, ?)";
try {
myPreparedStatement = myConnection.prepareStatement(stm);
myPreparedStatement.setString(Keys.USER_USERNAME_COLUMN_INDEX, user);
myPreparedStatement.setString(Keys.USER_PASSWORD_COLUMN_INDEX, pw);
myPreparedStatement.setString(Keys.USER_FIRSTNAME_COLUMN_INDEX, firstname);
myPreparedStatement.setString(Keys.USER_LASTNAME_COLUMN_INDEX, lastname);
myPreparedStatement.setString(Keys.USER_DOB_COLUMN_INDEX, dob);
myPreparedStatement.executeUpdate();
}
catch (SQLException e) {
writeErrorMessage("Error creating user in UserTable.java");
}
return true;
}
/**
* Adds a user to user table based on information when avatar is present
* @param user is the username
* @param pw is the password
* @param firstname is firstname
* @param lastname is lastname
* @param dob is date of birth
* @param filepath is the filepath
*/
public boolean createUser(String user, String pw, String firstname,
String lastname, String dob, String filepath) {
if (usernameExists(user)) {
return false;
}
createUser(user, pw, firstname, lastname, dob);
updateAvatar(user, filepath);
return true;
}
/**
* Returns the userid when given the username
* @param username is the username
*/
public String retrieveUserId(String username) {
return retrieveEntryString(Keys.USER_TABLE_NAME, Keys.USER_USERNAME_COLUMN_FIELD, username,
Keys.USER_USERNAME_COLUMN_INDEX);
}
/**
* Given a username, retrieves the date of birth
* @param username is the user
*/
public String retrieveDOB(String username) {
return retrieveEntryString(Keys.USER_TABLE_NAME, Keys.USER_USERNAME_COLUMN_FIELD,
username, Keys.USER_DOB_COLUMN_INDEX);
}
/**
* Given a username, retrieves avatar filepath
* @param username is the username
*/
public String retrieveAvatar(String username) {
return retrieveEntryString(Keys.USER_TABLE_NAME, Keys.USER_USERNAME_COLUMN_FIELD,
username, Keys.USER_AVATAR_COLUMN_INDEX);
}
/**
* Given a username, deletes that user from userTable
* @param username is user
*/
public void deleteUser(String username) {
String stm = "DELETE FROM " + Keys.USER_TABLE_NAME + " WHERE " +
Keys.USER_USERNAME_COLUMN_FIELD + Keys.EQUALS + username + Keys.APOSTROPHE;
executeStatement(stm);
}
/**
* Given a username and a filepath, updates avatar
* @param user is username
* @param filepath is the filepath of the avatar
*/
public void updateAvatar(String user, String filepath) {
String userid = retrieveUserId(user);
String stm = "UPDATE " + Keys.USER_TABLE_NAME + " SET " + Keys.USER_AVATAR_COLUMN_FIELD +
Keys.EQUALS + "filepath" + "' WHERE " + Keys.USER_USERID_COLUMN_FIELD +
Keys.EQUALS + userid + Keys.APOSTROPHE;
executeStatement(stm);
}
/**
* Returns a list of all the games
*/
public List<String> retrieveUsernames() {
myResultSet = selectAllRecordsFromTable(Keys.USER_TABLE_NAME);
List<String> myUsernames = new ArrayList<String>();
try {
while (myResultSet.next()) {
myUsernames.add(myResultSet.getString(Keys.USER_USERNAME_COLUMN_INDEX));
}
}
catch (SQLException e) {
writeErrorMessage("Error retrieving usernames in UserTable.java");
}
return myUsernames;
}
/**
* Prints entire table
*/
public void printEntireTable () {
myResultSet = selectAllRecordsFromTable(Keys.USER_TABLE_NAME);
try {
while (myResultSet.next()) {
System.out.print(myResultSet.getString(Keys.USER_USERNAME_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.print(myResultSet.getString(Keys.USER_PASSWORD_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.print(myResultSet.getString(Keys.USER_FIRSTNAME_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.print(myResultSet.getString(Keys.USER_LASTNAME_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.print(myResultSet.getString(Keys.USER_DOB_COLUMN_INDEX) + Keys.SEPARATOR);
System.out.print(myResultSet.getString(Keys.USER_AVATAR_COLUMN_INDEX) +
Keys.SEPARATOR);
System.out.println(myResultSet.getString(Keys.USER_USERID_COLUMN_INDEX));
}
}
catch (SQLException e) {
writeErrorMessage("Error printing entire table in UserTable.java");
}
}
}