⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jdbcblob.java

📁 hsqldb是100%java实现的数据库,是一个开放源代码的JAVA数据库 l 具有标准的SQL语法和JAVA接口 l HSQLDB可以自由使用和分发 l 非常简洁和快速的
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* Copyright (c) 2001-2005, 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.jdbc;import java.io.ByteArrayInputStream;import java.io.InputStream;import java.io.OutputStream;import java.sql.Blob;import java.sql.SQLException;import org.hsqldb.Trace;// boucherb@users 2004-04-xx - patch 1.7.2 - position and truncate methods//                             implemented; minor changes for moderate thread//                             safety and optimal performance// boucherb@users 2004-04-xx - doc 1.7.2 - javadocs updated; methods put in//                             correct (historical, interface declared) order/** * The representation (mapping) in the Java<sup><font size=-2>TM</font></sup> * programming language of an SQL BLOB value. <p> * * Provides methods for getting the length of an SQL BLOB (Binary Large Object) * value, for materializing a BLOB value on the client, and for determining the * position of an octet sequence (byte pattern) within a BLOB value. <p> * * <!-- start Release-specific documentation --> * <div class="ReleaseSpecificDocumentation"> * <h3>HSQLDB-Specific Information:</h3> <p> * * Including 1.8.x, the HSQLDB driver does not implement Blob using an SQL * locator(BLOB).  That is, an HSQLDB Blob object does not contain a logical * pointer to SQL BLOB data; rather it directly contains a representation of * the data (a byte array). As a result, an HSQLDB Blob object is itself * valid beyond the duration of the transaction in which is was created, * although it does not necessarily represent a corresponding value * on the database. <p> * * Currently, the interface methods for updating a BLOB value are * unsupported. However, the truncate method is supported for local use. * </div> * <!-- start Release-specific documentation --> * * @author james house jhouse@part.net * @author boucherb@users * @version 1.7.2 * @since JDK 1.2, HSQLDB 1.7.2 */public class jdbcBlob implements Blob {    volatile byte[] data;    /**     * Constructs a new jdbcBlob instance wrapping the given octet sequence. <p>     *     * This constructor is used internally to retrieve result set values as     * Blob objects, yet it must be public to allow access from other packages.     * As such (in the interest of efficiency) this object maintains a reference     * to the given octet sequence rather than making a copy; special care     * should be taken by extenal clients never to use this constructor with a     * byte array object that may later be modified extenally.     *     * @param data the octet sequence representing the Blob value     * @throws SQLException if the argument is null     */    public jdbcBlob(final byte[] data) throws SQLException {        if (data == null) {            throw Util.sqlException(Trace.INVALID_JDBC_ARGUMENT, "null");        }        this.data = data;    // (byte[]) data.clone();    }    /**     * Returns the number of bytes in the <code>BLOB</code> value     * designated by this <code>Blob</code> object.     *     * @return length of the <code>BLOB</code> in bytes     * @exception SQLException if there is an error accessing the     *      length of the <code>BLOB</code>     *     * @since JDK 1.2, HSQLDB 1.7.2     */    public long length() throws SQLException {        final byte[] ldata = data;        return ldata.length;    }    /**     * Retrieves all or part of the <code>BLOB</code> value that this     * <code>Blob</code> object represents, as an array of bytes.  This     * <code>byte</code> array contains up to <code>length</code>     * consecutive bytes starting at position <code>pos</code>. <p>     *     * <!-- start release-specific documentation -->     * <div class="ReleaseSpecificDocumentation">     * <h3>HSQLDB-Specific Information:</h3> <p>     *     * The official specification above is ambiguous in that it does not     * precisely indicate the policy to be observed when     * pos > this.length() - length.  One policy would be to retrieve the     * octets from pos to this.length().  Another would be to throw an     * exception.  HSQLDB observes the later policy.     * </div>     *     * @param pos the ordinal position of the first byte in the     *        <code>BLOB</code> value to be extracted; the first byte is at     *        position 1     * @param length the number of consecutive bytes to be copied     * @return a byte array containing up to <code>length</code>     *         consecutive bytes from the <code>BLOB</code> value designated     *         by this <code>Blob</code> object, starting with the     *         byte at position <code>pos</code>     * @exception SQLException if there is an error accessing the     *            <code>BLOB</code> value     * @see #setBytes     *     * @since JDK 1.2, HSQLDB 1.7.2     */    public byte[] getBytes(long pos, final int length) throws SQLException {        final byte[] ldata = data;        final int    dlen  = ldata.length;        pos--;        if (pos < 0 || pos > dlen) {            throw Util.sqlException(Trace.INVALID_JDBC_ARGUMENT,                                    "pos: " + (pos + 1));        }        if (length < 0 || length > dlen - pos) {            throw Util.sqlException(Trace.INVALID_JDBC_ARGUMENT,                                    "length: " + length);        }        final byte[] out = new byte[length];        System.arraycopy(ldata, (int) pos, out, 0, length);        return out;    }    /**     * Retrieves the <code>BLOB</code> value designated by this     * <code>Blob</code> instance as a stream.     *     * @return a stream containing the <code>BLOB</code> data     * @exception SQLException if there is an error accessing the     *            <code>BLOB</code> value     * @see #setBinaryStream     *     * @since JDK 1.2, HSQLDB 1.7.2     */    public InputStream getBinaryStream() throws SQLException {        final byte[] ldata = data;        return new ByteArrayInputStream(ldata);    }    /**     * Retrieves the byte position at which the specified byte array     * <code>pattern</code> begins within the <code>BLOB</code>     * value that this <code>Blob</code> object represents.  The     * search for <code>pattern</code> begins at position     * <code>start</code>. <p>     *     * @param pattern the byte array for which to search     * @param start the position at which to begin searching; the     *        first position is 1     * @return the position at which the pattern appears, else -1     * @exception SQLException if there is an error accessing the     *        <code>BLOB</code>     *     * @since JDK 1.2, HSQLDB 1.7.2     */    public long position(final byte[] pattern,                         long start) throws SQLException {        final byte[] ldata = data;        final int    dlen  = ldata.length;        if (start > dlen || pattern == null) {            return -1;        } else if (start < 1) {            start = 0;        } else {            start--;        }        final int plen = pattern.length;        if (plen == 0 || start > dlen - plen) {            return -1;        }        final int  stop = dlen - plen;        final byte b0   = pattern[0];        outer_loop:        for (int i = (int) start; i <= stop; i++) {            if (ldata[i] != b0) {                continue;            }            int     len     = plen;            int     doffset = i;            int     poffset = 0;            boolean match   = true;            while (len-- > 0) {                if (ldata[doffset++] != pattern[poffset++]) {                    continue outer_loop;                }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -