1 package org.opendaylight.controller.md.sal.dom.xsql.jdbc;
3 import java.io.BufferedInputStream;
4 import java.io.BufferedOutputStream;
5 import java.io.ByteArrayInputStream;
6 import java.io.ByteArrayOutputStream;
7 import java.io.DataInputStream;
8 import java.io.DataOutputStream;
9 import java.io.ObjectInputStream;
10 import java.io.ObjectOutputStream;
11 import java.net.ServerSocket;
12 import java.net.Socket;
13 import java.sql.Array;
15 import java.sql.CallableStatement;
17 import java.sql.Connection;
18 import java.sql.DatabaseMetaData;
19 import java.sql.NClob;
20 import java.sql.PreparedStatement;
21 import java.sql.SQLClientInfoException;
22 import java.sql.SQLException;
23 import java.sql.SQLWarning;
24 import java.sql.SQLXML;
25 import java.sql.Savepoint;
26 import java.sql.Statement;
27 import java.sql.Struct;
28 import java.util.LinkedList;
30 import java.util.Properties;
31 import java.util.concurrent.Executor;
33 import org.opendaylight.controller.md.sal.dom.xsql.XSQLAdapter;
35 public class JDBCConnection extends Thread implements Connection {
36 private Socket socket = null;
37 private DataInputStream in = null;
38 private DataOutputStream out = null;
39 private LinkedList<byte[]> queue = new LinkedList<byte[]>();
40 private XSQLAdapter adapter = null;
42 public JDBCConnection(Socket s, XSQLAdapter _a) {
46 in = new DataInputStream(
47 new BufferedInputStream(s.getInputStream()));
48 out = new DataOutputStream(
49 new BufferedOutputStream(s.getOutputStream()));
50 new JDBCObjectReader();
52 } catch (Exception err) {
53 err.printStackTrace();
57 public JDBCConnection(String addr) throws Exception {
58 socket = new Socket(addr, 40004);
60 in = new DataInputStream(
61 new BufferedInputStream(socket.getInputStream()));
62 out = new DataOutputStream(
63 new BufferedOutputStream(socket.getOutputStream()));
64 new JDBCObjectReader();
66 } catch (Exception err) {
67 err.printStackTrace();
71 public JDBCConnection(boolean server) {
73 ServerSocket s = new ServerSocket(50003);
76 in = new DataInputStream(
77 new BufferedInputStream(socket.getInputStream()));
78 out = new DataOutputStream(
79 new BufferedOutputStream(socket.getOutputStream()));
80 new JDBCObjectReader();
82 } catch (Exception err) {
83 err.printStackTrace();
85 } catch (Exception err) {
86 err.printStackTrace();
91 private boolean isStopped() {
92 if (adapter != null && adapter.stopped) {
95 if (socket == null || socket.isClosed()) {
103 while (!isStopped()) {
105 int len = in.readInt();
106 data = new byte[len];
110 } catch (Exception err) {
111 System.out.println("Connection Lost or Closed.");
114 } catch (Exception err2) {
116 //err.printStackTrace();
121 private void addObject(byte[] data) {
122 synchronized (queue) {
128 private class JDBCObjectReader extends Thread {
130 public JDBCObjectReader() {
131 super("JDBCObjectReader");
136 while (!isStopped()) {
138 synchronized (queue) {
139 if (queue.size() == 0) {
142 } catch (Exception err) {
145 if (queue.size() > 0) {
146 data = queue.removeFirst();
150 JDBCCommand command = (JDBCCommand) deSerialize(data);
151 processCommand(command);
156 private Object deSerialize(byte data[]) {
158 ByteArrayInputStream in = new ByteArrayInputStream(data);
159 ObjectInputStream oin = new ObjectInputStream(in);
160 return oin.readObject();
161 } catch (Exception err) {
162 err.printStackTrace();
168 public void processCommand(JDBCCommand cmd) {
169 switch (cmd.getType()) {
170 case JDBCCommand.TYPE_EXECUTE_QUERY:
172 JDBCServer.execute(cmd.getRS(), adapter);
173 send(new JDBCCommand(cmd.getRS(),
174 JDBCCommand.TYPE_QUERY_REPLY));
175 QueryUpdater u = new QueryUpdater(cmd.getRS());
176 new Thread(u).start();
177 } catch (Exception err) {
178 send(new JDBCCommand(err, cmd.getRSID()));
181 case JDBCCommand.TYPE_QUERY_REPLY:
182 JDBCResultSet rs1 = JDBCStatement.getQuery(cmd.getRS().getID());
183 rs1.updateData(cmd.getRS());
185 case JDBCCommand.TYPE_QUERY_RECORD:
186 JDBCResultSet rs2 = JDBCStatement.getQuery(cmd.getRSID());
187 rs2.addRecord(cmd.getRecord());
189 case JDBCCommand.TYPE_QUERY_FINISH:
190 JDBCResultSet rs3 = JDBCStatement.removeQuery(cmd.getRSID());
191 rs3.setFinished(true);
193 case JDBCCommand.TYPE_QUERY_ERROR:
194 System.err.println("ERROR Executing Query\n");
195 cmd.getERROR().printStackTrace();
196 JDBCResultSet rs4 = JDBCStatement.removeQuery(cmd.getRSID());
197 rs4.setError(cmd.getERROR());
198 rs4.setFinished(true);
205 private class QueryUpdater implements Runnable {
207 private JDBCResultSet rs = null;
209 public QueryUpdater(JDBCResultSet _rs) {
215 JDBCCommand rec = new JDBCCommand(rs.getCurrent(), rs.getID());
218 JDBCCommand end = new JDBCCommand(rs.getID());
223 public void send(Object o) {
225 ByteArrayOutputStream bout = new ByteArrayOutputStream();
226 ObjectOutputStream oout = new ObjectOutputStream(bout);
228 byte data[] = bout.toByteArray();
229 synchronized (socket) {
230 out.writeInt(data.length);
234 } catch (Exception err) {
235 err.printStackTrace();
240 public boolean isWrapperFor(Class<?> arg0) throws SQLException {
241 // TODO Auto-generated method stub
246 public <T> T unwrap(Class<T> arg0) throws SQLException {
247 // TODO Auto-generated method stub
252 public void clearWarnings() throws SQLException {
253 // TODO Auto-generated method stub
258 public void close() throws SQLException {
261 } catch (Exception err) {
267 public void commit() throws SQLException {
268 // TODO Auto-generated method stub
273 public Array createArrayOf(String typeName, Object[] elements)
274 throws SQLException {
275 // TODO Auto-generated method stub
280 public Blob createBlob() throws SQLException {
281 // TODO Auto-generated method stub
286 public Clob createClob() throws SQLException {
287 // TODO Auto-generated method stub
292 public NClob createNClob() throws SQLException {
293 // TODO Auto-generated method stub
298 public SQLXML createSQLXML() throws SQLException {
299 // TODO Auto-generated method stub
304 public Statement createStatement() throws SQLException {
305 return new JDBCStatement(this);
309 public Statement createStatement(int resultSetType,
310 int resultSetConcurrency, int resultSetHoldability)
311 throws SQLException {
312 // TODO Auto-generated method stub
317 public Statement createStatement(int resultSetType,
318 int resultSetConcurrency)
319 throws SQLException {
320 // TODO Auto-generated method stub
325 public Struct createStruct(String typeName, Object[] attributes)
326 throws SQLException {
327 // TODO Auto-generated method stub
332 public boolean getAutoCommit() throws SQLException {
333 // TODO Auto-generated method stub
338 public String getCatalog() throws SQLException {
339 // TODO Auto-generated method stub
344 public Properties getClientInfo() throws SQLException {
345 // TODO Auto-generated method stub
350 public String getClientInfo(String name) throws SQLException {
351 // TODO Auto-generated method stub
356 public int getHoldability() throws SQLException {
357 // TODO Auto-generated method stub
362 public DatabaseMetaData getMetaData() throws SQLException {
363 // TODO Auto-generated method stub
368 public int getTransactionIsolation() throws SQLException {
369 // TODO Auto-generated method stub
374 public Map<String, Class<?>> getTypeMap() throws SQLException {
375 // TODO Auto-generated method stub
380 public SQLWarning getWarnings() throws SQLException {
381 // TODO Auto-generated method stub
386 public boolean isClosed() throws SQLException {
387 // TODO Auto-generated method stub
392 public boolean isReadOnly() throws SQLException {
393 // TODO Auto-generated method stub
398 public boolean isValid(int timeout) throws SQLException {
399 // TODO Auto-generated method stub
404 public String nativeSQL(String sql) throws SQLException {
405 // TODO Auto-generated method stub
410 public CallableStatement prepareCall(String sql, int resultSetType,
411 int resultSetConcurrency, int resultSetHoldability)
412 throws SQLException {
413 // TODO Auto-generated method stub
418 public CallableStatement prepareCall(String sql, int resultSetType,
419 int resultSetConcurrency) throws SQLException {
420 // TODO Auto-generated method stub
425 public CallableStatement prepareCall(String sql) throws SQLException {
426 // TODO Auto-generated method stub
431 public PreparedStatement prepareStatement(String sql, int resultSetType,
432 int resultSetConcurrency, int resultSetHoldability)
433 throws SQLException {
434 // TODO Auto-generated method stub
439 public PreparedStatement prepareStatement(String sql, int resultSetType,
440 int resultSetConcurrency) throws SQLException {
441 // TODO Auto-generated method stub
446 public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
447 throws SQLException {
448 // TODO Auto-generated method stub
453 public PreparedStatement prepareStatement(String sql, int[] columnIndexes)
454 throws SQLException {
455 // TODO Auto-generated method stub
460 public PreparedStatement prepareStatement(String sql, String[] columnNames)
461 throws SQLException {
462 // TODO Auto-generated method stub
467 public PreparedStatement prepareStatement(String sql) throws SQLException {
468 // TODO Auto-generated method stub
473 public void releaseSavepoint(Savepoint savepoint) throws SQLException {
474 // TODO Auto-generated method stub
479 public void rollback() throws SQLException {
480 // TODO Auto-generated method stub
485 public void rollback(Savepoint savepoint) throws SQLException {
486 // TODO Auto-generated method stub
491 public void setAutoCommit(boolean autoCommit) throws SQLException {
492 // TODO Auto-generated method stub
497 public void setCatalog(String catalog) throws SQLException {
498 // TODO Auto-generated method stub
503 public void setClientInfo(Properties properties)
504 throws SQLClientInfoException {
505 // TODO Auto-generated method stub
510 public void setClientInfo(String name, String value)
511 throws SQLClientInfoException {
512 // TODO Auto-generated method stub
517 public void setHoldability(int holdability) throws SQLException {
518 // TODO Auto-generated method stub
523 public void setReadOnly(boolean readOnly) throws SQLException {
524 // TODO Auto-generated method stub
529 public Savepoint setSavepoint() throws SQLException {
530 // TODO Auto-generated method stub
535 public Savepoint setSavepoint(String name) throws SQLException {
536 // TODO Auto-generated method stub
541 public void setTransactionIsolation(int level) throws SQLException {
542 // TODO Auto-generated method stub
547 public void setTypeMap(Map<String, Class<?>> map) throws SQLException {
548 // TODO Auto-generated method stub
553 public void setSchema(String schema) throws SQLException {
554 // TODO Auto-generated method stub
559 public String getSchema() throws SQLException {
560 // TODO Auto-generated method stub
565 public void abort(Executor executor) throws SQLException {
566 // TODO Auto-generated method stub
571 public void setNetworkTimeout(Executor executor, int milliseconds)
572 throws SQLException {
573 // TODO Auto-generated method stub
578 public int getNetworkTimeout() throws SQLException {
579 // TODO Auto-generated method stub