package com.sogou.qadev.service.cynthia.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.sql.Timestamp; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import com.sogou.qadev.service.cynthia.bean.Attachment; import com.sogou.qadev.service.cynthia.bean.UUID; import com.sogou.qadev.service.cynthia.bean.impl.AttachmentImpl; import com.sogou.qadev.service.cynthia.factory.DataAccessFactory; import com.sogou.qadev.service.cynthia.service.ConfigManager; import com.sogou.qadev.service.cynthia.service.DbPoolConnection; import com.sogou.qadev.service.cynthia.service.FileUpDownLoadHandler; import com.sogou.qadev.service.cynthia.service.ProjectInvolveManager; /** * @description:attachment db processor * @author:liming * @mail:liming@sogou-inc.com * @date:2014-5-6 下午5:11:55 * @version:v1.0 */ public class AttachmentAccessSessionMySQL { public AttachmentAccessSessionMySQL() { super(); } /** * @description:return attachment id and name map by ids * @date:2014-5-6 下午5:12:15 * @version:v1.0 * @param ids * @return */ public Map<String ,String> getAttachIdAndNameByIds(Set<String> ids){ if(ids == null || ids.size() == 0){ return new HashMap<String, String>(); } Map<String, String> attachIdNameMap = new HashMap<String, String>(); StringBuffer sqlBuffer = new StringBuffer(); sqlBuffer.append("select id , name from attachment where id in ("); for (String attachId : ids) { sqlBuffer.append(attachId).append(","); } sqlBuffer.deleteCharAt(sqlBuffer.length() -1 ); sqlBuffer.append(")"); Connection conn = null; Statement stat = null; ResultSet rs = null; try { conn = DbPoolConnection.getInstance().getReadConnection(); stat = conn.createStatement(); rs = stat.executeQuery(sqlBuffer.toString()); while (rs.next()) { attachIdNameMap.put(rs.getString("id"), rs.getString("name")); } }catch(Exception e){ e.printStackTrace(); }finally { DbPoolConnection.getInstance().closeAll(rs, stat, conn); } return attachIdNameMap; } /** * @description:create attachment * @date:2014-5-6 下午5:12:40 * @version:v1.0 * @param name * @param username * @param data * @return */ public Attachment createAttachment(String name, String username, byte[] data) { if(name == null || data == null){ return null; } int dataLength = data.length; byte[] returnData = data; Connection conn = null; PreparedStatement pstm = null; try{ conn = DbPoolConnection.getInstance().getConnection(); UUID id = DataAccessFactory.getInstance().newUUID("ATTA"); Timestamp createTime = new Timestamp(System.currentTimeMillis()); String fileId = ""; if (ConfigManager.getEnableFileSystem()) { //分布式上传 fileId = FileUpDownLoadHandler.postFile(name,data); if (fileId == null || fileId.length() == 0) { throw new Exception("上传文件出错"); } data = null; } pstm = conn.prepareStatement("insert into attachment set id = ?, size = ?, create_user = ?, name = ?, create_time = ?, file_id=? ,data=?"); pstm.setLong(1, Long.parseLong(id.getValue())); pstm.setLong(2, dataLength); pstm.setString(3, username); pstm.setString(4, name); pstm.setTimestamp(5, createTime); pstm.setString(6, fileId); pstm.setBytes(7, data); pstm.execute(); Attachment attachment = new AttachmentImpl(id); attachment.setName(name); attachment.setCreateUser(username); attachment.setCreateTime(createTime); attachment.setData(returnData); attachment.setSize(dataLength); attachment.setFileId(fileId); return attachment; } catch(Exception e){ e.printStackTrace(); } finally{ DbPoolConnection.getInstance().closeAll(pstm, conn); } return null; } /** * @description:query attachment by ids * @date:2014-5-6 下午5:12:56 * @version:v1.0 * @param ids * @param needData:need file data * @return */ public Attachment[] queryAttachments(UUID[] ids, boolean needData) { if(ids == null || ids.length == 0){ return new Attachment[0]; } PreparedStatement statement = null; List<Attachment> attachmentList = new LinkedList<Attachment>(); Connection conn = null; ResultSet rs = null; try{ conn = DbPoolConnection.getInstance().getReadConnection(); StringBuffer sql = new StringBuffer(); sql.append("select id, size, name, create_user, create_time, file_id,data from attachment"); for(int i = 0; i < ids.length; i++){ if (ids[i] == null) continue; sql.append(" " + (i == 0 ? "where" : "or") + " id = ?"); } statement = conn.prepareStatement(sql.toString()); for(int i = 0; i < ids.length; i++){ if (ids[i] == null) continue; statement.setLong(i + 1, Long.parseLong(ids[i].getValue())); } rs = statement.executeQuery(); while (rs.next()){ Attachment attachment = new AttachmentImpl(DataAccessFactory.getInstance().createUUID(Long.toString(rs.getLong(1)))); attachment.setSize(rs.getLong(2)); attachment.setName(rs.getString(3)); attachment.setCreateUser(rs.getString(4)); attachment.setCreateTime(rs.getTimestamp(5)); if (needData){ byte[] data = null; if(ConfigManager.getEnableFileSystem()){ //分布式文件系统 data = FileUpDownLoadHandler.downloadData(rs.getString("file_id")); } if(data == null) data = rs.getBytes("data"); attachment.setData(data); } attachmentList.add(attachment); } } catch (Exception e){ e.printStackTrace(); } finally{ DbPoolConnection.getInstance().closeResultSet(rs); DbPoolConnection.getInstance().closeStatment(statement); DbPoolConnection.getInstance().closeConn(conn); } return attachmentList.toArray(new Attachment[attachmentList.size()]); } /** * @description:get all attachment ids * @date:2014-5-6 下午5:13:28 * @version:v1.0 * @return */ public List<Long> getAllAttachmentIds() { PreparedStatement pstm = null; List<Long> ids = new ArrayList<Long>(); Connection conn = null; ResultSet rs = null; try{ StringBuffer sql = new StringBuffer(); sql.append("select id from attachment"); conn = DbPoolConnection.getInstance().getReadConnection(); pstm = conn.prepareStatement(sql.toString()); rs = pstm.executeQuery(); while (rs.next()){ long id = rs.getLong(1); ids.add(id); } } catch (Exception e){ e.printStackTrace(); } finally{ DbPoolConnection.getInstance().closeAll(rs, pstm, conn); } return ids; } /** * @description:update a attachment * @date:2014-5-6 下午5:13:41 * @version:v1.0 * @param attachment * @return */ public boolean updateAttachment(Attachment attachment) { PreparedStatement pstm = null; Connection conn = null; ResultSet rs = null; try{ conn = DbPoolConnection.getInstance().getReadConnection(); StringBuffer sql = new StringBuffer(); sql.append("update attachment set size=?,name=?,create_user=?,create_time=? ,file_id=? , data = ? where id = ?"); pstm = conn.prepareStatement(sql.toString()); pstm.setLong(1, attachment.getSize()); pstm.setString(2, attachment.getName()); pstm.setString(3, attachment.getCreateUser()); pstm.setTimestamp(4, attachment.getCreateTime()); pstm.setString(5, attachment.getFileId() == null ? "": attachment.getFileId()); pstm.setBytes(6, attachment.getData()); pstm.setString(7, attachment.getId().getValue()); return pstm.executeUpdate() > 0; } catch (Exception e){ e.printStackTrace(); return false; } finally{ DbPoolConnection.getInstance().closeAll(rs,pstm,conn); } } /** * @description:query attachments by ids * @date:2014-5-6 下午5:13:57 * @version:v1.0 * @param attachmentIdArray * @return */ public Map<String, String> queryAttachmentIdNames(UUID[] attachmentIdArray) { Map<String, String> attachMap = new HashMap<String, String>(); if(attachmentIdArray == null || attachmentIdArray.length == 0){ return attachMap; } PreparedStatement pstm = null; Connection conn = null; ResultSet rs = null; try{ conn = DbPoolConnection.getInstance().getReadConnection(); StringBuffer sql = new StringBuffer(); sql.append("select id ,name from attachment"); for(int i = 0; i < attachmentIdArray.length; i++){ sql.append(" " + (i == 0 ? "where" : "or") + " id = ?"); } pstm = conn.prepareStatement(sql.toString()); for(int i = 0; i < attachmentIdArray.length; i++){ pstm.setLong(i + 1, Long.parseLong(attachmentIdArray[i].getValue())); } rs = pstm.executeQuery(); while (rs.next()){ attachMap.put(rs.getString("id"), rs.getString("name")); } } catch (Exception e){ e.printStackTrace(); } finally{ DbPoolConnection.getInstance().closeAll(rs,pstm,conn); } return attachMap; } }