// This software is released into the Public Domain. See copying.txt for details. package org.openstreetmap.osmosis.pgsimple.v0_6.impl; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; import org.openstreetmap.osmosis.core.OsmosisRuntimeException; import org.openstreetmap.osmosis.core.domain.v0_6.OsmUser; import org.openstreetmap.osmosis.pgsimple.common.BaseDao; import org.openstreetmap.osmosis.pgsimple.common.DatabaseContext; import org.openstreetmap.osmosis.pgsimple.common.NoSuchRecordException; /** * Performs all user-specific db operations. * * @author Brett Henderson */ public class UserDao extends BaseDao { private static final Logger LOG = Logger.getLogger(UserDao.class.getName()); private static final String SELECT_USER = "SELECT id, name FROM users WHERE id = ?"; private static final String INSERT_USER = "INSERT INTO users(id, name) VALUES(?, ?)"; private static final String UPDATE_USER = "UPDATE users SET name = ? WHERE id = ?"; private PreparedStatement selectUserStatement; private PreparedStatement insertUserStatement; private PreparedStatement updateUserStatement; private ActionDao actionDao; /** * Creates a new instance. * * @param dbCtx * The database context to use for accessing the database. * @param actionDao * The dao to use for adding action records to the database. */ public UserDao(DatabaseContext dbCtx, ActionDao actionDao) { super(dbCtx); this.actionDao = actionDao; } /** * Builds a user from the current result set row. * * @param resultSet * The result set. * @return The newly loaded user. */ private OsmUser buildUser(ResultSet resultSet) { try { return new OsmUser( resultSet.getInt("id"), resultSet.getString("name") ); } catch (SQLException e) { throw new OsmosisRuntimeException("Unable to build a user from the current recordset row.", e); } } /** * Loads the specified way from the database. * * @param userId * The unique identifier of the user. * @return The loaded user. */ public OsmUser getUser(long userId) { ResultSet resultSet = null; OsmUser user; if (selectUserStatement == null) { selectUserStatement = prepareStatement(SELECT_USER); } try { selectUserStatement.setLong(1, userId); resultSet = selectUserStatement.executeQuery(); if (!resultSet.next()) { throw new NoSuchRecordException("User " + userId + " doesn't exist."); } user = buildUser(resultSet); resultSet.close(); resultSet = null; return user; } catch (SQLException e) { throw new OsmosisRuntimeException("Query failed for user " + userId + "."); } finally { if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { // We are already in an error condition so log and continue. LOG.log(Level.WARNING, "Unable to close the result set.", e); } } } } /** * Adds the specified user to the database. * * @param user * The user to add. */ public void addUser(OsmUser user) { int prmIndex; if (insertUserStatement == null) { insertUserStatement = prepareStatement(INSERT_USER); } prmIndex = 1; try { insertUserStatement.setInt(prmIndex++, user.getId()); insertUserStatement.setString(prmIndex++, user.getName()); insertUserStatement.executeUpdate(); } catch (SQLException e) { throw new OsmosisRuntimeException( "Unable to insert user " + user.getId() + ".", e); } actionDao.addAction(ActionDataType.USER, ChangesetAction.CREATE, user.getId()); } /** * Updates the specified user record in the database. * * @param user * The user to update. */ public void updateUser(OsmUser user) { int prmIndex; if (updateUserStatement == null) { updateUserStatement = prepareStatement(UPDATE_USER); } prmIndex = 1; try { updateUserStatement.setString(prmIndex++, user.getName()); updateUserStatement.setInt(prmIndex++, user.getId()); updateUserStatement.executeUpdate(); } catch (SQLException e) { throw new OsmosisRuntimeException( "Unable to update user " + user.getId() + ".", e); } actionDao.addAction(ActionDataType.USER, ChangesetAction.MODIFY, user.getId()); } }