001package gu.sql2java;
002
003import static com.google.common.base.Preconditions.checkArgument;
004
005import java.io.IOException;
006import java.net.URL;
007
008import gu.sql2java.exception.RuntimeDaoException;
009
010/**
011 * URLStore implementation for Store table only<br>
012 * CHAR(32) required for primary key type 
013 * @author guyadong
014 *
015 */
016public class BinaryStoreTable extends BaseColumnStore {
017
018        /**
019         * 构造方法<br>
020         * @param tablename 表名
021         * @param storeColumn 存储数据的字段名
022         * @param extensionColumn 存储扩展名的字段名(可为{@code null})
023         * @param mimeColumn 存储MIME类型的字段名(可为{@code null})
024         * @throws IllegalArgumentException 参数错误
025         */
026        public BinaryStoreTable(String tablename, String storeColumn, String extensionColumn, String mimeColumn) throws IllegalArgumentException {
027                super(tablename, storeColumn, extensionColumn, mimeColumn);
028
029                checkArgument(metaData.primaryKeyCount == 1 && String.class.equals(metaData.primaryKeyTypes[0]),
030                                "String type required for primary key of %s",tablename);
031                checkArgument(metaData.columnSizes[metaData.primaryKeyIds[0]] == 32,
032                                "size 32 required for %s.%s",tablename,metaData.primaryKeyNames[0]);
033
034        }
035
036        @Override
037        protected URL doStore(byte[] binary, String md5, String extension, boolean overwrite) throws IOException {
038                try{
039                        BaseBean bean = manager.loadByPrimaryKey(md5);
040                        if(bean == null || overwrite){
041                                if(bean ==null){
042                                        bean = manager.createBean();
043                                        bean.setValue(metaData.primaryKeyIds[0], md5);
044                                }
045                                saveStoreBean(bean,binary,md5,extension);
046                        }
047                        return makeURL(getExtension(bean), bean.primaryValues());
048                }catch ( RuntimeDaoException e) {
049                        throw new IOException(e);
050                }
051
052        }
053        
054        @Override
055        protected URL doFind(String md5) {
056                BaseBean bean = manager.loadByPrimaryKey(md5);
057                return bean == null ? null : makeURL(getExtension(bean), bean.primaryValues());
058        }
059
060        @Override
061        public int hashCode() {
062                final int prime = 31;
063                int result = super.hashCode();
064                result = prime * result + extensionId;
065                result = prime * result + mimeId;
066                return result;
067        }
068
069        @Override
070        public boolean equals(Object obj) {
071                if (this == obj)
072                        return true;
073                if (!super.equals(obj))
074                        return false;
075                if (!(obj instanceof BinaryStoreTable))
076                        return false;
077                BaseColumnStore other = (BaseColumnStore) obj;
078                if (extensionId != other.extensionId)
079                        return false;
080                if (mimeId != other.mimeId)
081                        return false;
082                return true;
083        }
084
085        @Override
086        public String toString() {
087                StringBuilder builder = new StringBuilder();
088                builder.append("BinaryStoreTable [extension=");
089                builder.append(metaData.columnNameOf(extensionId));
090                builder.append(", mime=");
091                builder.append(metaData.columnNameOf(mimeId));
092                builder.append(", tablename=");
093                builder.append(tablename);
094                builder.append(", storeColumn=");
095                builder.append(storeColumn);
096                builder.append(", protocol=");
097                builder.append(protocol);
098                builder.append("]");
099                return builder.toString();
100        }
101}