001: /* Copyright (c) 2001-2005, The HSQL Development Group
002: * All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * Redistributions of source code must retain the above copyright notice, this
008: * list of conditions and the following disclaimer.
009: *
010: * Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * Neither the name of the HSQL Development Group nor the names of its
015: * contributors may be used to endorse or promote products derived from this
016: * software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021: * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
022: * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
025: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
026: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
027: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
028: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: */
030:
031: package org.hsqldb.types;
032:
033: import org.hsqldb.lib.ArrayUtil;
034: import org.hsqldb.lib.StringConverter;
035:
036: /**
037: * Java representation of a BINARY field value. <p>
038: *
039: * A Binary object instance always wraps a non-null byte[] object; all
040: * NULL SQL field values are represented internally by HSQLDB as Java null.
041: *
042: * @author fredt@users
043: * @version 1.7.2
044: * @since 1.7.2
045: */
046: public class Binary {
047:
048: private byte[] data;
049: int hash;
050:
051: /**
052: * This constructor is used inside the engine when an already serialized
053: * byte[] is read from a file (.log, .script, .data or text table source).
054: * In this case clone is false.
055: *
056: * When a byte[] is submitted as a parameter of PreparedStatement then
057: * clone is true.
058: */
059: public Binary(byte[] data, boolean clone) {
060:
061: if (clone) {
062: data = (byte[]) ArrayUtil.duplicateArray(data);
063: }
064:
065: this .data = data;
066: }
067:
068: public byte[] getBytes() {
069: return data;
070: }
071:
072: public byte[] getClonedBytes() {
073: return (byte[]) data.clone();
074: }
075:
076: public int getBytesLength() {
077: return data.length;
078: }
079:
080: public boolean equals(Object other) {
081:
082: if (other == this ) {
083: return true;
084: }
085:
086: if (!(other instanceof Binary)) {
087: return false;
088: }
089:
090: if (data.length != ((Binary) other).data.length) {
091: return false;
092: }
093:
094: return ArrayUtil.containsAt(data, 0, ((Binary) other).data);
095: }
096:
097: public int hashCode() {
098:
099: int h = 0;
100:
101: if (hash == 0) {
102: for (int i = 0; i < data.length; i++) {
103: h = 31 * h + data[i];
104: }
105:
106: hash = h;
107: }
108:
109: return hash;
110: }
111:
112: public String toString() {
113: return StringConverter.byteToHex(data);
114: }
115: }
|