/* * Copyright (c) 2004, 2005, 2006 TADA AB - Taby Sweden * Distributed under the terms shown in the file COPYRIGHT * found in the root folder of this project or at * http://eng.tada.se/osprojects/COPYRIGHT.html */ package org.postgresql.pljava.internal; import java.sql.SQLException; /** * The <code>Portal</code> correspons to the internal PostgreSQL * <code>Portal</code> type. * * @author Thomas Hallgren */ public class Portal { private long m_pointer; Portal(long pointer) { m_pointer = pointer; } /** * Invalidates this structure and frees up memory using the * internal function <code>SPI_cursor_close</code> */ public void close() { synchronized(Backend.THREADLOCK) { _close(m_pointer); m_pointer = 0; } } /** * Returns the name of this Portal. * @throws SQLException if the handle to the native structur is stale. */ public String getName() throws SQLException { synchronized(Backend.THREADLOCK) { return _getName(m_pointer); } } /** * Returns the value of the <code>portalPos</code> attribute. * @throws SQLException if the handle to the native structur is stale. */ public int getPortalPos() throws SQLException { synchronized(Backend.THREADLOCK) { return _getPortalPos(m_pointer); } } /** * Returns the TupleDesc that describes the row Tuples for this * Portal. * @throws SQLException if the handle to the native structur is stale. */ public TupleDesc getTupleDesc() throws SQLException { synchronized(Backend.THREADLOCK) { return _getTupleDesc(m_pointer); } } /** * Performs an <code>SPI_cursor_fetch</code>. * @param forward Set to <code>true</code> for forward, <code>false</code> for backward. * @param count Maximum number of rows to fetch. * @return The actual number of fetched rows. * @throws SQLException if the handle to the native structur is stale. */ public int fetch(boolean forward, int count) throws SQLException { synchronized(Backend.THREADLOCK) { return _fetch(m_pointer, System.identityHashCode(Thread.currentThread()), forward, count); } } /** * Returns the value of the <code>atEnd</code> attribute. * @throws SQLException if the handle to the native structur is stale. */ public boolean isAtEnd() throws SQLException { synchronized(Backend.THREADLOCK) { return _isAtEnd(m_pointer); } } /** * Returns the value of the <code>atStart</code> attribute. * @throws SQLException if the handle to the native structur is stale. */ public boolean isAtStart() throws SQLException { synchronized(Backend.THREADLOCK) { return _isAtStart(m_pointer); } } /** * Returns the value of the <code>posOverflow</code> attribute. * @throws SQLException if the handle to the native structur is stale. */ public boolean isPosOverflow() throws SQLException { synchronized(Backend.THREADLOCK) { return _isPosOverflow(m_pointer); } } /** * Checks if the portal is still active. I can be closed either explicitly * using the {@link #close()} mehtod or implicitly due to a pop of invocation * context. */ public boolean isValid() { return m_pointer != 0; } /** * Performs an <code>SPI_cursor_move</code>. * @param forward Set to <code>true</code> for forward, <code>false</code> for backward. * @param count Maximum number of rows to fetch. * @return The value of the global variable <code>SPI_result</code>. * @throws SQLException if the handle to the native structur is stale. */ public int move(boolean forward, int count) throws SQLException { synchronized(Backend.THREADLOCK) { return _move(m_pointer, System.identityHashCode(Thread.currentThread()), forward, count); } } private static native String _getName(long pointer) throws SQLException; private static native int _getPortalPos(long pointer) throws SQLException; private static native TupleDesc _getTupleDesc(long pointer) throws SQLException; private static native int _fetch(long pointer, long threadId, boolean forward, int count) throws SQLException; private static native void _close(long pointer); private static native boolean _isAtEnd(long pointer) throws SQLException; private static native boolean _isAtStart(long pointer) throws SQLException; private static native boolean _isPosOverflow(long pointer) throws SQLException; private static native int _move(long pointer, long threadId, boolean forward, int count) throws SQLException; }