1 2 12 package com.versant.core.jdbc.sql.conv; 13 14 import com.versant.core.jdbc.JdbcConverter; 15 import com.versant.core.jdbc.JdbcConverterFactory; 16 import com.versant.core.jdbc.JdbcTypeRegistry; 17 import com.versant.core.jdbc.metadata.JdbcColumn; 18 import com.versant.core.jdbc.metadata.JdbcTypes; 19 20 import java.sql.PreparedStatement ; 21 import java.sql.SQLException ; 22 import java.sql.ResultSet ; 23 import java.util.HashMap ; 24 25 import javax.jdo.JDOFatalDataStoreException; 27 import com.versant.core.common.BindingSupportImpl; 28 29 34 public abstract class TypeAsBytesConverterBase implements JdbcConverter { 35 36 40 public static abstract class Factory extends NoArgJdbcConverterFactory { 41 42 private HashMap instanceMap = new HashMap (17); 43 44 48 public JdbcConverter createJdbcConverter(JdbcColumn col, Object args, 49 JdbcTypeRegistry jdbcTypeRegistry) { 50 JdbcConverterFactory f = jdbcTypeRegistry.getJdbcConverterFactory(col.jdbcType); 51 JdbcConverter c = f.createJdbcConverter(col, args, jdbcTypeRegistry); 52 if (c.getValueType() != byte[].class) { 53 throw BindingSupportImpl.getInstance().illegalArgument("Invalid JDBC type: " + 54 JdbcTypes.toString(col.jdbcType)); 55 } 56 JdbcConverter ans = (JdbcConverter)instanceMap.get(c); 57 if (ans == null) { 58 instanceMap.put(c, ans = createConverter(c)); 59 } 60 return ans; 61 } 62 63 66 protected abstract JdbcConverter createConverter(JdbcConverter nested); 67 68 } 69 70 protected final JdbcConverter nested; 71 72 public TypeAsBytesConverterBase(JdbcConverter nested) { 73 this.nested = nested; 74 } 75 76 79 protected abstract Object fromByteArray(byte[] buf); 80 81 84 protected abstract byte[] toByteArray(Object value); 85 86 90 public abstract Class getValueType(); 91 92 98 public boolean isOracleStyleLOB() { 99 return nested.isOracleStyleLOB(); 100 } 101 102 107 public String getOracleStyleLOBNotNullString() { 108 return nested.getOracleStyleLOBNotNullString(); 109 } 110 111 116 public Object get(ResultSet rs, int index, JdbcColumn col) 117 throws SQLException , JDOFatalDataStoreException { 118 byte[] buf = (byte[])nested.get(rs, index, col); 119 if (buf == null) return null; 120 return fromByteArray(buf); 121 } 122 123 124 125 126 131 public void set(PreparedStatement ps, int index, JdbcColumn col, Object value) 132 throws SQLException , JDOFatalDataStoreException { 133 nested.set(ps, index, col, toByteArray(value)); 134 } 135 136 143 public void set(PreparedStatement ps, int index, JdbcColumn col, int value) 144 throws SQLException , JDOFatalDataStoreException { 145 throw BindingSupportImpl.getInstance().fatalDatastore("set(..int) called"); 146 } 147 148 155 public void set(ResultSet rs, int index, JdbcColumn col, Object value) 156 throws SQLException , JDOFatalDataStoreException { 157 nested.set(rs, index, col, toByteArray(value)); 158 } 159 160 } 161 162 | Popular Tags |