package com.stacksync.syncservice.db.postgresql; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import com.stacksync.commons.models.Chunk; import com.stacksync.commons.models.ItemMetadata; import com.stacksync.commons.models.ItemVersion; import com.stacksync.syncservice.db.DAOError; import com.stacksync.syncservice.db.DAOUtil; import com.stacksync.syncservice.db.ItemVersionDAO; import com.stacksync.syncservice.exceptions.dao.DAOException; public class PostgresqlItemVersionDao extends PostgresqlDAO implements ItemVersionDAO { private static final Logger logger = Logger.getLogger(PostgresqlItemVersionDao.class.getName()); public PostgresqlItemVersionDao(Connection connection) { super(connection); } @Override public ItemMetadata findByItemIdAndVersion(Long id, Long version) throws DAOException { Object[] values = { id, version }; String query = "SELECT i.id AS item_id, i.parent_id, i.client_parent_file_version, i.filename, i.is_folder, i.mimetype, i.workspace_id, " + " iv.version, iv.device_id, iv.checksum, iv.status, iv.size, iv.modified_at, " + " get_chunks(iv.id) AS chunks " + " FROM item_version iv " + " INNER JOIN item i ON i.id = iv.item_id " + " WHERE iv.item_id = ? and iv.version = ?"; ResultSet result = null; ItemMetadata metadata = null; try { result = executeQuery(query, values); if (result.next()) { metadata = DAOUtil.getItemMetadataFromResultSet(result); } else { // TODO error, no ha encontrado nada el perroo // throw workspace not found?? } } catch (SQLException e) { logger.error(e); throw new DAOException(DAOError.INTERNAL_SERVER_ERROR); } return metadata; } @Override public void add(ItemVersion itemVersion) throws DAOException { if (!itemVersion.isValid()) { throw new IllegalArgumentException("Item version attributes not set"); } Object[] values = { itemVersion.getItem().getId(), itemVersion.getDevice().getId(), itemVersion.getVersion(), itemVersion.getChecksum(), itemVersion.getStatus(), itemVersion.getSize(), new java.sql.Timestamp(itemVersion.getModifiedAt().getTime()) }; String query = "INSERT INTO item_version( item_id, device_id, version, " + "checksum, status, size, modified_at, committed_at ) " + "VALUES ( ?, ?, ?, ?, ?, ?, ?, now() )"; Long id = (Long)executeUpdate(query, values); if (id != null) { itemVersion.setId(id); } } @Override public void update(ItemVersion itemVersion) throws DAOException { // TODO Auto-generated method stub } @Override public void delete(ItemVersion itemVersion) throws DAOException { // TODO Auto-generated method stub } @Override public void insertChunk(Long itemVersionId, Long chunkId, Integer order) throws DAOException { Object[] values = { itemVersionId, chunkId, order }; String query = "INSERT INTO item_version_chunk( item_version_id, chunk_id, chunk_order ) " + "VALUES ( ?, ?, ? )"; try { executeUpdate(query, values); } catch (DAOException e) { logger.error(e); throw new DAOException(DAOError.INTERNAL_SERVER_ERROR); } } @Override public void insertChunks(List<Chunk> chunks, long itemVersionId) throws DAOException { if (chunks.isEmpty()) { throw new IllegalArgumentException("No chunks received"); } List<Object> values = new ArrayList<Object>(); StringBuilder build = new StringBuilder("INSERT INTO item_version_chunk " + " (item_version_id, client_chunk_name, chunk_order) VALUES "); for (int i = 0; i < chunks.size(); i++) { build.append("(?, ?, ?)"); if (i < chunks.size() - 1) { build.append(", "); } else { build.append(";"); } values.add(itemVersionId); // item_version_id values.add(chunks.get(i).getClientChunkName()); // client_chunk_name values.add(i + 1); // chunk_order } try { executeUpdate(build.toString(), values.toArray()); } catch (DAOException ex) { throw new DAOException(ex); } } @Override public List<Chunk> findChunks(Long itemVersionId) throws DAOException { Object[] values = { itemVersionId }; String query = "SELECT ivc.* " + " FROM item_version_chunk ivc " + " WHERE ivc.item_version_id=? " + " ORDER BY ivc.chunk_order ASC"; ResultSet result = null; List<Chunk> chunks = new ArrayList<Chunk>(); try { result = executeQuery(query, values); while (result.next()) { Chunk chunk = DAOUtil.getChunkFromResultSet(result); chunks.add(chunk); } } catch (SQLException e) { logger.error(e); throw new DAOException(DAOError.INTERNAL_SERVER_ERROR); } return chunks; } }