All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.firebirdsql.gds.impl.GDSHelper Maven / Gradle / Ivy

There is a newer version: 4.0.10.java7
Show newest version
/*
 * Public Firebird Java API.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 *    1. Redistributions of source code must retain the above copyright notice, 
 *       this list of conditions and the following disclaimer.
 *    2. 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. 
 *    3. The name of the author may not be used to endorse or promote products 
 *       derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 THE AUTHOR 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.firebirdsql.gds.impl;

import org.firebirdsql.gds.*;
import org.firebirdsql.gds.ng.*;
import org.firebirdsql.jdbc.Synchronizable;

import java.sql.SQLException;

/**
 * Helper class for all GDS-related operations.
 */
public final class GDSHelper implements Synchronizable {

    public static final int DEFAULT_BLOB_BUFFER_SIZE = 16 * 1024;

    private final FbDatabase database;
    private final Object syncObject;
    private FbTransaction transaction;

    private boolean registerResultSets;

    /**
     * Create instance of this class.
     */
    public GDSHelper(FbDatabase database) {
        // TODO Make explicit property
        this.registerResultSets = !database.getConnectionProperties().getExtraDatabaseParameters()
                .hasArgument(DatabaseParameterBufferExtension.NO_RESULT_SET_TRACKING);

        this.database = database;
        syncObject = database.getSynchronizationObject();
    }

    public FbTransaction getCurrentTransaction() {
        synchronized (database.getSynchronizationObject()) {
            return transaction;
        }
    }

    public void setCurrentTransaction(FbTransaction transaction) {
        synchronized (database.getSynchronizationObject()) {
            this.transaction = transaction;
        }
    }

    public FbDatabase getCurrentDatabase() {
        return database;
    }

    public IConnectionProperties getConnectionProperties() {
        return database.getConnectionProperties();
    }

    public DatabaseParameterBuffer getDatabaseParameterBuffer() {
        // TODO Calls to this method should be replaced with an explicit property check
        return database.getConnectionProperties().getExtraDatabaseParameters();
    }

    /**
     * @return Connection dialect
     */
    public int getDialect() {
        return database.getConnectionDialect();
    }

    /**
     * Retrieve a newly allocated statement handle with the current connection.
     *
     * @return The new statement handle
     * @throws java.sql.SQLException
     *         if a database access error occurs
     */
    public FbStatement allocateStatement() throws SQLException {
        return database.createStatement(getCurrentTransaction());
    }

    /**
     * Retrieve whether this connection is currently involved in a transaction
     *
     * @return true if this connection is currently in a
     * transaction, false otherwise.
     */
    public boolean inTransaction() {
        synchronized (getSynchronizationObject()) {
            return transaction != null && transaction.getState() == TransactionState.ACTIVE;
        }
    }

    /**
     * Execute a SQL statement directly with the current connection.
     *
     * @param statement
     *         The SQL statement to execute
     * @throws SQLException
     *         if a Firebird-specific error occurs
     */
    public void executeImmediate(String statement) throws SQLException {
        database.executeImmediate(statement, getCurrentTransaction());
    }

    /**
     * Open a handle to a new blob within the current transaction with the given
     * id.
     *
     * @param blob_id
     *         The identifier to be given to the blob
     * @param segmented
     *         If true, the blob will be segmented, otherwise
     *         is will be streamed
     * @throws SQLException
     *         if a Firebird-specific database error occurs
     */
    public FbBlob openBlob(long blob_id, boolean segmented) throws SQLException {
        BlobParameterBuffer blobParameterBuffer = database.createBlobParameterBuffer();

        blobParameterBuffer.addArgument(BlobParameterBuffer.TYPE,
                segmented ? BlobParameterBuffer.TYPE_SEGMENTED
                        : BlobParameterBuffer.TYPE_STREAM);

        FbBlob blob = database.createBlobForInput(getCurrentTransaction(), blobParameterBuffer, blob_id);
        blob.open();

        return blob;
    }

    /**
     * Create a new blob within the current transaction.
     *
     * @param segmented
     *         If true the blob will be segmented, otherwise it will be streamed
     * @throws SQLException
     *         if a Firebird-specific database error occurs
     */
    public FbBlob createBlob(boolean segmented) throws SQLException {
        BlobParameterBuffer blobParameterBuffer = database.createBlobParameterBuffer();

        blobParameterBuffer.addArgument(BlobParameterBuffer.TYPE,
                segmented ? BlobParameterBuffer.TYPE_SEGMENTED
                        : BlobParameterBuffer.TYPE_STREAM);

        FbBlob blob = database.createBlobForOutput(getCurrentTransaction(), blobParameterBuffer);
        blob.open();

        return blob;
    }

    public FbTransaction startTransaction(TransactionParameterBuffer tpb) throws SQLException {
        FbTransaction transaction = database.startTransaction(tpb);
        setCurrentTransaction(transaction);

        return transaction;
    }

    public void detachDatabase() throws SQLException {
        database.close();
    }

    /**
     * Cancel the currently running operation.
     */
    public void cancelOperation() throws SQLException {
        database.cancelOperation(ISCConstants.fb_cancel_raise);
    }

    /**
     * @deprecated Use {@link VaxEncoding#iscVaxInteger(byte[], int, int)}. This method will be removed in Jaybird 4
     */
    @Deprecated
    public int iscVaxInteger(byte[] buffer, int pos, int length) {
        return VaxEncoding.iscVaxInteger(buffer, pos, length);
    }

    /**
     * @deprecated Use {@link VaxEncoding#iscVaxLong(byte[], int, int)}. This method will be removed in Jaybird 4
     */
    @Deprecated
    public long iscVaxLong(byte[] buffer, int pos, int length) {
        return VaxEncoding.iscVaxLong(buffer, pos, length);
    }

    // for DatabaseMetaData.

    /**
     * Get the name of the database product that we're connected to.
     *
     * @return The database product name (i.e. Firebird or Interbase)
     */
    public String getDatabaseProductName() {
        return database.getServerVersion().getServerName();
    }

    /**
     * Get the version of the the database that we're connected to
     *
     * @return the database product version
     */
    public String getDatabaseProductVersion() {
        return database.getServerVersion().getFullVersion();
    }

    /**
     * Get the major version number of the database that we're connected to.
     *
     * @return The major version number of the database
     */
    public int getDatabaseProductMajorVersion() {
        return database.getServerVersion().getMajorVersion();
    }

    /**
     * Get the minor version number of the database that we're connected to.
     *
     * @return The minor version number of the database
     */
    public int getDatabaseProductMinorVersion() {
        return database.getServerVersion().getMinorVersion();
    }

    /**
     * Compares the version of this database to the specified major and
     * minor version.
     * 

* This method follows the semantics of {@link Comparable}: returns a * negative value if the version of this database connection is smaller than * the supplied arguments, 0 if they are equal or positive if its bigger. *

* * @param major * Major version to compare * @param minor * Minor version to compare * @return a negative integer, zero, or a positive integer as this database version is less than, equal to, * or greater than the specified major and minor version */ public int compareToVersion(int major, int minor) { int differenceMajor = getDatabaseProductMajorVersion() - major; if (differenceMajor == 0) { return getDatabaseProductMinorVersion() - minor; } return differenceMajor; } /** * Get the database login name of the user that we're connected as. * * @return The username of the current database user */ public String getUserName() { return database.getConnectionProperties().getUser(); } /** * Get the buffer length for blobs for this connection. * * @return The length of blob buffers */ public int getBlobBufferLength() { // TODO Add as explicit property on IConnectionProperties DatabaseParameterBuffer dpb = database.getConnectionProperties().getExtraDatabaseParameters(); if (dpb.hasArgument(DatabaseParameterBufferExtension.BLOB_BUFFER_SIZE)) return dpb.getArgumentAsInt(DatabaseParameterBufferExtension.BLOB_BUFFER_SIZE); else return DEFAULT_BLOB_BUFFER_SIZE; } /** * Get the encoding used for this connection. * * @return The name of the encoding used */ public String getIscEncoding() { return database.getEncodingFactory().getDefaultEncodingDefinition().getFirebirdEncodingName(); } public String getJavaEncoding() { return database.getEncodingFactory().getDefaultEncodingDefinition().getJavaEncodingName(); } public String getMappingPath() { // TODO Add as explicit property on IConnectionProperties DatabaseParameterBuffer dpb = database.getConnectionProperties().getExtraDatabaseParameters(); return dpb.getArgumentAsString(DatabaseParameterBufferExtension.MAPPING_PATH); } @Override public Object getSynchronizationObject() { return syncObject; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy