1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
|
/*
* $Id$
*
* This file is part of the OpenLink Software Virtuoso Open-Source (VOS)
* project.
*
* Copyright (C) 1998-2012 OpenLink Software
*
* This project is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; only version 2 of the License, dated June 1991.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
package virtuoso.jdbc2;
import java.io.*;
import openlink.util.*;
/**
* The VirtuosoFuture class is an implementation of the RPC mechanism.
*
* @version 1.0 (JDBC API 2.0 implementation)
*/
class VirtuosoFuture
{
// RPC name :
protected static final String callerid = "caller_identification";
protected static final String scon = "SCON";
protected static final String exec = "EXEC";
protected static final String close = "FRST";
protected static final String fetch = "FTCH";
protected static final String prepare = "PREP";
protected static final String transaction = "TRXC";
protected static final String getdata = "GETDA";
protected static final String extendedfetch = "EXTF";
protected static final String cancel = "CANCEL";
protected static final String tp_transaction = "TPTRX";
// The future request id
private int req_no;
// Its corresponding VirtuosoConnection
private VirtuosoConnection connection;
// Queue of results
//private openlink.util.Vector results=new openlink.util.Vector(5,10);
private openlink.util.Vector results = new openlink.util.Vector(5);
// Set if there has been a DA_FUTURE_ANSWER message to this future
private boolean is_complete = false;
protected static PrintStream rpc_log = null;
// Mutex used to access to the queue of results
//private Semaphore mutex;
/**
* Constructs a new VirtuosoFuture request corresponding to a
* VirtuosoConnection, a RPC name and an array of arguments (8 max.).
*
* @param connection Its corresponding connection.
* @param rpcname The name of the RPC function.
* @param args The array of arguments.
* @param req_no The request serial number.
* @exception java.io.IOException An error occurred.
* @exception virtuoso.jdbc2.VirtuosoException An internal error occurred;
*/
VirtuosoFuture(VirtuosoConnection connection, String rpcname, Object[] args, int req_no, int timeout)
throws IOException, VirtuosoException
{
// Reference the corresponding connection
this.connection = connection;
this.req_no = req_no;
// Create the mutex
/*try { mutex = new Semaphore(Semaphore.MUTEX); }
catch(SemaphoreException e) {}*/
connection.setSocketTimeout(timeout);
send_message(rpcname,args);
}
/**
* Send an RPC call to a function with its name and parameters.
*
* @param rpcname The name of the RPC function.
* @param args The array of arguments.
* @exception java.io.IOException An error occurred.
* @exception virtuoso.jdbc2.VirtuosoException An internal error occurred;
*/
protected void send_message(String rpcname, Object[] args) throws IOException, VirtuosoException
{
Object[] vector = new Object[5];
if(args != null)
{
openlink.util.Vector v = new openlink.util.Vector(args);
vector[4] = v;
}
else
vector[4] = null;
vector[3] = rpcname;
vector[2] = null;
vector[1] = new Integer(req_no);
vector[0] = new Integer(VirtuosoTypes.DA_FUTURE_REQUEST);
// Serialize data and flush the stream
connection.write_object(new openlink.util.Vector(vector));
}
/**
* Put a result in the queue.
*
* @param obj The result to put in the queue.
*/
protected void putResult(Object res)
{
results.addElement(res);
/*try { mutex.getSem(); results.addElement(res); }
catch(InterruptedException e) { }
finally { mutex.freeSem(); }*/
}
/**
* Returns the next result of the answer queue messages.
*
* @return Object A Vector object or a base class.
* @exception virtuoso.jdbc2.VirtuosoException An internal error occurred.
*/
protected openlink.util.Vector nextResult() throws VirtuosoException
{
try
{
// Try to read an answer
while(results.isEmpty())
connection.read_request();
// Get the next result of the queue
//mutex.getSem();
// Get the next result of the queue
openlink.util.Vector vect = (openlink.util.Vector)results.firstElement();
results.removeElementAt(0);
return vect;
}
catch(IOException e)
{
sendCancelFuture();
throw new VirtuosoException("Virtuoso Communications Link Failure (timeout) : " + e.getMessage(),
VirtuosoException.IOERROR);
}
/*catch(InterruptedException e) { }
finally { mutex.freeSem(); }
return null;*/
}
protected void sendCancelFuture () throws VirtuosoException
{
int ver = connection.getVersionNum();
//System.err.println ("sendCancelFuture: Version is " + ver);
try
{
//System.err.println ("sendCancelFuture: sending cancel");
Object[] args = new Object[0];
connection.removeFuture (connection.getFuture (VirtuosoFuture.cancel, args, 0));
}
catch (IOException e)
{
//System.err.println ("sendCancelFuture: IOException ocurred : " + e.getMessage());
}
catch (VirtuosoException e2)
{
//System.err.println ("sendCancelFuture: VirtuosoException ocurred : " + e2.getMessage());
throw e2;
}
}
/**
* Function uses to set the is_complete flag.
*
* @param isComplete The boolean status to set.
*/
protected void complete(boolean isComplete)
{
is_complete = isComplete;
}
// --------------------------- Object ------------------------------
/**
* Returns a hash code value for the object.
*
* @return int The hash code value.
*/
public int hashCode()
{
return req_no;
}
/**
* Compares two Objects for equality.
*
* @return boolean True if two objects are equal, else false.
*/
public boolean equals(Object obj)
{
// First check if the object is not null or the same object type
if(obj != null && (obj instanceof VirtuosoFuture))
return ((VirtuosoFuture)obj).req_no == req_no;
return false;
}
/**
* Method runs when the garbage collector want to erase the object
*/
public void finalize() throws Throwable
{
connection = null;
if(results != null)
{
results.removeAllElements();
results = null;
}
}
}
|