| /* Copyright (c) 2001-2010, The HSQL Development Group |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * Redistributions of source code must retain the above copyright notice, this |
| * list of conditions and the following disclaimer. |
| * |
| * Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * Neither the name of the HSQL Development Group nor the names of its |
| * contributors may be used to endorse or promote products derived from this |
| * software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG, |
| * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| |
| package org.hsqldb.rowio; |
| |
| import org.hsqldb.Row; |
| import org.hsqldb.persist.Crypto; |
| import org.hsqldb.types.Type; |
| |
| /** |
| * @author Fred Toussi (fredt@users dot sourceforge.net) |
| * @version 1.9.0 |
| * @since 1.9.0 |
| */ |
| public class RowOutputBinaryEncode extends RowOutputBinary { |
| |
| final Crypto crypto; |
| |
| public RowOutputBinaryEncode(Crypto crypto, int initialSize, int scale) { |
| |
| super(initialSize, scale); |
| |
| this.crypto = crypto; |
| } |
| |
| public void writeData(Object[] data, Type[] types) { |
| |
| if (crypto == null) { |
| super.writeData(data, types); |
| } else { |
| int start = count; |
| |
| writeInt(0); |
| super.writeData(data, types); |
| |
| int origLength = count - start - INT_STORE_SIZE; |
| int newLength = crypto.encode(buffer, start + INT_STORE_SIZE, |
| origLength, buffer, |
| start + INT_STORE_SIZE); |
| |
| writeIntData(newLength, start); |
| |
| count = start + INT_STORE_SIZE + newLength; |
| } |
| } |
| |
| /** |
| * Calculate the size of byte array required to store a row. |
| * |
| * @param row - a database row |
| * @return size of byte array |
| * @exception HsqlException When data is inconsistent |
| */ |
| public int getSize(Row row) { |
| |
| int size = super.getSize(row); |
| |
| if (crypto != null) { |
| size = crypto.getEncodedSize(size - INT_STORE_SIZE) |
| + INT_STORE_SIZE * 2; |
| } |
| |
| return size; |
| } |
| |
| public RowOutputInterface duplicate() { |
| return new RowOutputBinaryEncode(crypto, 128, this.scale); |
| } |
| } |