📄 dbuser.java
字号:
}
public Iterator propertyNames() {
if (LAZY_PROP_LOADING) {
if (properties == null) {
loadPropertiesFromDb();
}
}
return Collections.unmodifiableSet(properties.keySet()).iterator();
}
public int getRewardPoints() {
return rewardPoints;
}
public void setRewardPoints(int rewardPoints)
throws SQLException
{
// Save old point value in case something goes wrong.
int oldPoints = this.rewardPoints;
this.rewardPoints = rewardPoints;
Connection con = null;
PreparedStatement pstmt = null;
try {
con = ConnectionManager.getConnection();
pstmt = con.prepareStatement(SAVE_REWARD_POINTS);
pstmt.setInt(1, rewardPoints);
pstmt.setLong(2, this.id);
pstmt.executeUpdate();
}
catch (SQLException sqle) {
// Switch back to old point value.
this.rewardPoints = oldPoints;
// Throw an exception so that the caller knows that the update
// operation failed.
throw sqle;
}
finally {
try { pstmt.close(); }
catch (Exception e) { e.printStackTrace(); }
try { con.close(); }
catch (Exception e) { e.printStackTrace(); }
}
}
public ForumPermissions getPermissions(Authorization authorization) {
if (authorization.getUserID() == id) {
return USER_ADMIN_PERMS;
}
else {
return ForumPermissions.none();
}
}
public boolean hasPermission(int type) {
return true;
}
//FROM THE CACHEABLE INTERFACE//
public int getSize() {
// Approximate the size of the object in bytes by calculating the size
// of each field.
int size = 0;
size += CacheSizes.sizeOfObject(); // overhead of object
size += CacheSizes.sizeOfLong(); // id
size += CacheSizes.sizeOfString(username); // username
size += CacheSizes.sizeOfString(passwordHash); // password
size += CacheSizes.sizeOfString(name); // name
size += CacheSizes.sizeOfString(email); // email
size += CacheSizes.sizeOfBoolean(); // nameVisible
size += CacheSizes.sizeOfBoolean(); // emailVisible
size += CacheSizes.sizeOfMap(properties); // properties
size += CacheSizes.sizeOfDate(); // creationDate
size += CacheSizes.sizeOfDate(); // modifiedDate
size += CacheSizes.sizeOfInt(); // reward points
size += CacheSizes.sizeOfObject(); // factory
return size;
}
//OTHER METHODS
/**
* Returns a String representation of the User object using the username.
*
* @return a String representation of the User object.
*/
public String toString() {
return username;
}
public int hashCode() {
return (int)id;
}
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (object != null && object instanceof DbUser) {
return id == ((DbUser)object).getID();
}
else {
return false;
}
}
/**
* Loads properties from the database.
*/
private synchronized void loadPropertiesFromDb() {
this.properties = new Hashtable();
Connection con = null;
PreparedStatement pstmt = null;
try {
con = ConnectionManager.getConnection();
pstmt = con.prepareStatement(LOAD_PROPERTIES);
pstmt.setLong(1, id);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
properties.put(rs.getString(1), rs.getString(2));
}
}
catch( SQLException sqle ) {
sqle.printStackTrace();
}
finally {
try { pstmt.close(); }
catch (Exception e) { e.printStackTrace(); }
try { con.close(); }
catch (Exception e) { e.printStackTrace(); }
}
}
/**
* Saves properties to the database.
*/
private synchronized void savePropertiesToDb() {
boolean abortTransaction = false;
Connection con = null;
PreparedStatement pstmt = null;
try {
con = ConnectionManager.getTransactionConnection();
// Delete all old values.
pstmt = con.prepareStatement(DELETE_PROPERTIES);
pstmt.setLong(1, id);
pstmt.execute();
pstmt.close();
// Now insert new values.
pstmt = con.prepareStatement(INSERT_PROPERTY);
Iterator iter = properties.keySet().iterator();
while (iter.hasNext()) {
String name = (String)iter.next();
String value = (String)properties.get(name);
pstmt.setLong(1, id);
pstmt.setString(2, name);
pstmt.setString(3, value);
pstmt.executeUpdate();
}
}
catch( SQLException sqle ) {
sqle.printStackTrace();
abortTransaction = true;
}
finally {
try { pstmt.close(); }
catch (Exception e) { e.printStackTrace(); }
ConnectionManager.closeTransactionConnection(con, abortTransaction);
}
}
/**
* Deletes a property from the db.
*/
private synchronized void deletePropertyFromDb(String name) {
Connection con = null;
PreparedStatement pstmt = null;
try {
con = ConnectionManager.getConnection();
pstmt = con.prepareStatement(DELETE_PROPERTY);
pstmt.setLong(1, id);
pstmt.setString(2, name);
pstmt.execute();
}
catch( SQLException sqle ) {
sqle.printStackTrace();
}
finally {
try { pstmt.close(); }
catch (Exception e) { e.printStackTrace(); }
try { con.close(); }
catch (Exception e) { e.printStackTrace(); }
}
}
/**
* Load the user data from the database.
*/
private void loadFromDb() throws UserNotFoundException {
Connection con = null;
PreparedStatement pstmt = null;
try {
con = ConnectionManager.getConnection();
if (username != null) {
pstmt = con.prepareStatement(LOAD_USER_BY_USERNAME);
pstmt.setString(1, username);
}
else {
pstmt = con.prepareStatement(LOAD_USER_BY_ID);
pstmt.setLong(1, id);
}
ResultSet rs = pstmt.executeQuery();
if (!rs.next()) {
if (username != null) {
throw new UserNotFoundException(
"Failed to read user " + username + " from database."
);
}
else {
throw new UserNotFoundException(
"Failed to read user with ID " + id + " from database."
);
}
}
this.id = rs.getLong(1);
this.username = rs.getString(2);
this.passwordHash = rs.getString(3);
this.name = rs.getString(4);
this.nameVisible = (rs.getInt(5) == 1);
this.email = rs.getString(6);
this.emailVisible = (rs.getInt(7) == 1);
this.rewardPoints = rs.getInt(8);
// We trim() the dates before trying to parse them because some
// databases pad with extra characters when returning the data.
this.creationDate =
new java.util.Date(Long.parseLong(rs.getString(9).trim()));
this.modifiedDate =
new java.util.Date(Long.parseLong(rs.getString(10).trim()));
// Now, load any extended message properties
if (!LAZY_PROP_LOADING) {
pstmt.close();
properties = new Hashtable();
pstmt = con.prepareStatement(LOAD_PROPERTIES);
pstmt.setLong(1, id);
rs = pstmt.executeQuery();
while(rs.next()) {
properties.put(rs.getString(1), rs.getString(2));
}
}
}
catch( SQLException sqle ) {
throw new UserNotFoundException(
"Failed to read user " + id + " from database.", sqle
);
}
catch (NumberFormatException nfe) {
System.err.println("WARNING: There was an error parsing the dates " +
"returned from the database. Ensure that they're being stored " +
"correctly.");
throw new UserNotFoundException("User with id "
+ id + " could not be loaded from the database."
);
}
finally {
try { pstmt.close(); }
catch (Exception e) { e.printStackTrace(); }
try { con.close(); }
catch (Exception e) { e.printStackTrace(); }
}
}
/**
* Inserts a new user record into the database.
*/
private void insertIntoDb() {
Connection con = null;
PreparedStatement pstmt = null;
try {
con = ConnectionManager.getConnection();
pstmt = con.prepareStatement(INSERT_USER);
pstmt.setLong(1, id);
pstmt.setString(2, username);
pstmt.setString(3, passwordHash);
pstmt.setString(4, name);
pstmt.setInt(5, nameVisible?1:0);
pstmt.setString(6, email);
pstmt.setInt(7, emailVisible?1:0);
pstmt.setInt(8, rewardPoints);
pstmt.setString(9, StringUtils.dateToMillis(creationDate));
pstmt.setString(10, StringUtils.dateToMillis(modifiedDate));
pstmt.executeUpdate();
// Now, insert properties if there are any.
if (properties.size() > 0) {
// Close the previously opened statement.
pstmt.close();
// Now insert new values.
pstmt = con.prepareStatement(INSERT_PROPERTY);
Iterator iter = properties.keySet().iterator();
while (iter.hasNext()) {
String name = (String)iter.next();
String value = (String)properties.get(name);
pstmt.setLong(1, id);
pstmt.setString(2, name);
pstmt.setString(3, value);
pstmt.executeUpdate();
}
}
}
catch( SQLException sqle ) {
sqle.printStackTrace();
}
finally {
try { pstmt.close(); }
catch (Exception e) { e.printStackTrace(); }
try { con.close(); }
catch (Exception e) { e.printStackTrace(); }
}
}
/**
* Save the user data to the database.
*/
private void saveToDb() {
Connection con = null;
try {
con = ConnectionManager.getConnection();
saveToDb(con);
}
catch( SQLException sqle ) {
sqle.printStackTrace();
}
finally {
try { con.close(); }
catch (Exception e) { e.printStackTrace(); }
}
}
/**
* Implementation of saveToDb that takes a Connection. This is useful for
* participating in transactions.
*/
private void saveToDb(Connection con) throws SQLException {
PreparedStatement pstmt = null;
try {
pstmt = con.prepareStatement(SAVE_USER);
pstmt.setString(1, passwordHash);
pstmt.setString(2, name);
pstmt.setInt(3, nameVisible?1:0);
pstmt.setString(4, email);
pstmt.setInt(5, emailVisible?1:0);
pstmt.setInt(6, rewardPoints);
pstmt.setString(7, StringUtils.dateToMillis(creationDate));
pstmt.setString(8, StringUtils.dateToMillis(modifiedDate));
pstmt.setLong(9, id);
pstmt.executeUpdate();
}
finally {
try { pstmt.close(); }
catch (Exception e) { e.printStackTrace(); }
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -