001    /**
002     * 
003     * Copyright 2004 Hiram Chirino
004     * 
005     * Licensed under the Apache License, Version 2.0 (the "License"); 
006     * you may not use this file except in compliance with the License. 
007     * You may obtain a copy of the License at 
008     * 
009     * http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS, 
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
014     * See the License for the specific language governing permissions and 
015     * limitations under the License. 
016     * 
017     **/
018    package org.activemq.store.jdbc.adapter;
019    
020    import java.io.ByteArrayInputStream;
021    import java.io.ByteArrayOutputStream;
022    import java.io.IOException;
023    import java.io.InputStream;
024    import java.sql.PreparedStatement;
025    import java.sql.ResultSet;
026    import java.sql.SQLException;
027    
028    import org.activemq.store.jdbc.StatementProvider;
029    
030    /**
031     * This JDBCAdapter inserts and extracts BLOB data using the 
032     * setBinaryStream()/getBinaryStream() operations.
033     * 
034     * The databases/JDBC drivers that use this adapter are:
035     * <ul>
036     * <li>Axion</li> 
037     * </ul>
038     * 
039     * @version $Revision: 1.1 $
040     */
041    public class StreamJDBCAdapter extends DefaultJDBCAdapter {
042        
043        public StreamJDBCAdapter() {
044            super();
045        }
046    
047        public StreamJDBCAdapter(StatementProvider provider) {
048            super(provider);
049        }
050        
051        /**
052         * @see org.activemq.store.jdbc.adapter.DefaultJDBCAdapter#getBinaryData(java.sql.ResultSet, int)
053         */
054        protected byte[] getBinaryData(ResultSet rs, int index) throws SQLException {
055            
056            try {
057                InputStream is = rs.getBinaryStream(index);
058                ByteArrayOutputStream os = new ByteArrayOutputStream(1024 * 4);
059    
060                int ch;
061                while ((ch = is.read()) >= 0) {
062                    os.write(ch);
063                }
064                is.close();
065                os.close();
066    
067                return os.toByteArray();
068            } catch (IOException e) {
069                throw (SQLException)new SQLException("Error reading binary parameter: "+index).initCause(e);
070            }
071        }
072        
073        /**
074         * @see org.activemq.store.jdbc.adapter.DefaultJDBCAdapter#setBinaryData(java.sql.PreparedStatement, int, byte[])
075         */
076        protected void setBinaryData(PreparedStatement s, int index, byte[] data) throws SQLException {
077            s.setBinaryStream(index, new ByteArrayInputStream(data), data.length);
078        }
079        
080    }