File: VirtuosoFuture.java

package info (click to toggle)
virtuoso-opensource 6.1.6%2Bdfsg2-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 260,060 kB
  • ctags: 123,765
  • sloc: ansic: 652,532; sql: 458,419; xml: 282,834; java: 61,031; sh: 40,031; cpp: 36,890; cs: 25,240; php: 12,692; yacc: 9,523; lex: 7,018; makefile: 6,157; jsp: 4,484; awk: 1,643; perl: 1,013; ruby: 1,003; python: 326
file content (240 lines) | stat: -rw-r--r-- 7,174 bytes parent folder | download | duplicates (2)
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;
      }
   }

}