yichen
2 years ago
commit
7c8ab12d61
54 changed files with 7743 additions and 0 deletions
@ -0,0 +1,88 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
<parent> |
||||
<artifactId>intranet</artifactId> |
||||
<groupId>org.example</groupId> |
||||
<version>1.0-SNAPSHOT</version> |
||||
</parent> |
||||
<modelVersion>4.0.0</modelVersion> |
||||
|
||||
<artifactId>agent</artifactId> |
||||
|
||||
<properties> |
||||
<maven.compiler.source>8</maven.compiler.source> |
||||
<maven.compiler.target>8</maven.compiler.target> |
||||
</properties> |
||||
|
||||
<dependencies> |
||||
<dependency> |
||||
<groupId>io.socket</groupId> |
||||
<artifactId>socket.io-client</artifactId> |
||||
<version>1.0.2</version> |
||||
</dependency> |
||||
|
||||
<dependency> |
||||
<groupId>org.projectlombok</groupId> |
||||
<artifactId>lombok</artifactId> |
||||
<version>1.18.22</version> |
||||
</dependency> |
||||
|
||||
<dependency> |
||||
<groupId>com.esotericsoftware</groupId> |
||||
<artifactId>kryo</artifactId> |
||||
<version>5.3.0</version> |
||||
</dependency> |
||||
|
||||
<dependency> |
||||
<groupId>org.postgresql</groupId> |
||||
<artifactId>postgresql</artifactId> |
||||
<version>42.4.0</version> |
||||
</dependency> |
||||
|
||||
|
||||
<dependency> |
||||
<groupId>org.apache.logging.log4j</groupId> |
||||
<artifactId>log4j-api</artifactId> |
||||
<version>2.17.2</version> |
||||
</dependency> |
||||
|
||||
<dependency> |
||||
<groupId>org.apache.logging.log4j</groupId> |
||||
<artifactId>log4j-core</artifactId> |
||||
<version>2.17.2</version> |
||||
</dependency> |
||||
|
||||
<dependency> |
||||
<groupId>mysql</groupId> |
||||
<artifactId>mysql-connector-java</artifactId> |
||||
<version>8.0.29</version> |
||||
</dependency> |
||||
|
||||
<dependency> |
||||
<groupId>org.apache.logging.log4j</groupId> |
||||
<artifactId>log4j-slf4j-impl</artifactId> |
||||
<version>2.17.2</version> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
|
||||
<!-- https://mvnrepository.com/artifact/org.hsqldb/hsqldb --> |
||||
<dependency> |
||||
<groupId>org.hsqldb</groupId> |
||||
<artifactId>hsqldb</artifactId> |
||||
<classifier>debug</classifier> |
||||
<version>2.5.2</version> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
|
||||
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --> |
||||
<dependency> |
||||
<groupId>org.junit.jupiter</groupId> |
||||
<artifactId>junit-jupiter-engine</artifactId> |
||||
<version>5.4.0</version> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
</dependencies> |
||||
|
||||
</project> |
@ -0,0 +1,135 @@
|
||||
package com.fanruan; |
||||
|
||||
import com.fanruan.handler.MyDispatcherImpl; |
||||
import com.fanruan.pojo.message.RpcRequest; |
||||
import com.fanruan.serializer.KryoSerializer; |
||||
import com.fanruan.serializer.Serializer; |
||||
import io.socket.client.IO; |
||||
import io.socket.client.Socket; |
||||
import io.socket.engineio.client.transports.WebSocket; |
||||
import okhttp3.Dispatcher; |
||||
import okhttp3.OkHttpClient; |
||||
import org.apache.logging.log4j.LogManager; |
||||
import org.apache.logging.log4j.Logger; |
||||
|
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.InputStreamReader; |
||||
import java.net.URI; |
||||
import java.util.Properties; |
||||
import java.util.concurrent.TimeUnit; |
||||
|
||||
|
||||
/** |
||||
* @author YiChen Dai |
||||
*/ |
||||
public class AgentStarter { |
||||
|
||||
protected static final Logger logger = LogManager.getLogger(); |
||||
|
||||
public final static Serializer SERIALIZER = new KryoSerializer(); |
||||
|
||||
public static MyDispatcherImpl myDispatcherImpl; |
||||
|
||||
public static String AgentID; |
||||
|
||||
public AgentStarter(String[] DBs) { |
||||
myDispatcherImpl = new MyDispatcherImpl(); |
||||
try { |
||||
createSocket(DBs); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
|
||||
private void createSocket(String[] DBs) throws IOException { |
||||
logger.debug("加载配置"); |
||||
IO.Options options = new IO.Options(); |
||||
try{ |
||||
InputStream in = this.getClass().getResourceAsStream("/socket.properties"); |
||||
Properties props = new Properties(); |
||||
|
||||
InputStreamReader inputStreamReader = new InputStreamReader(in, "UTF-8"); |
||||
props.load(inputStreamReader); |
||||
|
||||
options.transports = new String[]{WebSocket.NAME}; |
||||
options.reconnectionAttempts = Integer.parseInt(props.getProperty("reconnectionAttempts")); |
||||
options.query = "agentID=" + props.getProperty("agentID"); |
||||
AgentID = props.getProperty("agentID"); |
||||
options.reconnectionDelay = Integer.parseInt(props.getProperty("reconnectionDelay")); |
||||
options.timeout = Integer.parseInt(props.getProperty("timeout")); |
||||
String uri = props.getProperty("uri"); |
||||
in.close(); |
||||
|
||||
// config the max number of socket
|
||||
int MAX_CLIENTS = 10; |
||||
Dispatcher dispatcher = new Dispatcher(); |
||||
dispatcher.setMaxRequests(MAX_CLIENTS * 2); |
||||
dispatcher.setMaxRequestsPerHost(MAX_CLIENTS * 2); |
||||
|
||||
OkHttpClient okHttpClient = new OkHttpClient.Builder() |
||||
.dispatcher(dispatcher) |
||||
// important for HTTP long-polling
|
||||
.readTimeout(1, TimeUnit.MINUTES) |
||||
.build(); |
||||
|
||||
options.callFactory = okHttpClient; |
||||
options.webSocketFactory = okHttpClient; |
||||
|
||||
Socket defaultSocket = IO.socket(URI.create(uri), options); |
||||
MyDispatcherImpl.CACHE.registerSocket("/", defaultSocket); |
||||
configDefaultSocket(defaultSocket); |
||||
|
||||
for(String dbName : DBs){ |
||||
Socket socket = IO.socket(URI.create(uri + "/" + dbName), options); |
||||
MyDispatcherImpl.CACHE.registerSocket(dbName, socket); |
||||
configSocket(socket, dbName); |
||||
} |
||||
|
||||
}catch (Exception e){ |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
|
||||
private void configDefaultSocket(Socket socket) throws IOException { |
||||
socket.on(Socket.EVENT_CONNECT, objects -> { |
||||
logger.info("default-socket connected!"); |
||||
}); |
||||
|
||||
socket.on(Socket.EVENT_CONNECT_ERROR, objects -> { |
||||
logger.info("default-socket error: " + objects[0].toString()); |
||||
}); |
||||
|
||||
socket.on(Socket.EVENT_DISCONNECT, objects -> { |
||||
for(Object obj : objects){ |
||||
logger.info("default-socket closed: " + obj.toString()); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
private void configSocket(Socket socket, String dbName) throws IOException { |
||||
socket.on(Socket.EVENT_CONNECT, objects -> { |
||||
logger.info(dbName + "-socket connected!"); |
||||
}); |
||||
|
||||
socket.on(Socket.EVENT_DISCONNECT, objects -> { |
||||
for(Object obj : objects){ |
||||
logger.info(dbName + "-socket closed: " + obj.toString()); |
||||
} |
||||
}); |
||||
|
||||
socket.on(Socket.EVENT_CONNECT_ERROR, objects -> { |
||||
logger.info(dbName + "-socket error: " + objects[0].toString()); |
||||
}); |
||||
|
||||
socket.on("RPCRequest", objects -> { |
||||
RpcRequest rpcRequest = SERIALIZER.deserialize((byte[]) objects[0], RpcRequest.class); |
||||
logger.debug(dbName + "-RPCRequest: " + rpcRequest.toString()); |
||||
try { |
||||
myDispatcherImpl.doDispatch(rpcRequest, dbName); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} |
||||
}); |
||||
} |
||||
} |
@ -0,0 +1,34 @@
|
||||
package com.fanruan.cache; |
||||
|
||||
/** |
||||
* Define the operation of the Map where cached instances like Driver, Connection |
||||
* @author Yichen Dai |
||||
* @date 2022/8/16 16:41 |
||||
*/ |
||||
public interface BeanCache { |
||||
|
||||
/** |
||||
* Get cached instances like Driver, Connection |
||||
* @param ID The unique num of a cache instance, It comes from the RPC request ID, |
||||
* which asked to create the instance. |
||||
* @param clazz The class of the cached instance. |
||||
* @return cached instance of the given type. |
||||
*/ |
||||
<T> T getCachedInstances(String ID, Class<T> clazz); |
||||
|
||||
/** |
||||
* Remove a cached instance of given ID. |
||||
* @param ID The unique num of a cache instance, It comes from the RPC request ID, |
||||
* which asked to create the instance. |
||||
*/ |
||||
void removeInstances(String ID); |
||||
|
||||
/** |
||||
* Save the given object |
||||
* @param ID The unique num of a cache instance, It comes from the RPC request ID, |
||||
* which asked to create the instance. |
||||
* @param o Instance to be cached |
||||
*/ |
||||
void cacheInstance(String ID, Object o); |
||||
|
||||
} |
@ -0,0 +1,41 @@
|
||||
package com.fanruan.cache; |
||||
|
||||
import java.util.Map; |
||||
import java.util.concurrent.ConcurrentHashMap; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class BeanCacheImpl implements BeanCache{ |
||||
|
||||
public String dbName; |
||||
|
||||
/** |
||||
* cache those instances asked to be established by RPC request |
||||
*/ |
||||
final private static Map<String, Object> CACHE = new ConcurrentHashMap<>(); |
||||
|
||||
public BeanCacheImpl(String dbName){ |
||||
this.dbName = dbName; |
||||
} |
||||
|
||||
@Override |
||||
public <T> T getCachedInstances(String ID, Class<T> clazz){ |
||||
try { |
||||
return clazz.cast(CACHE.get(ID)); |
||||
}catch (Exception e){ |
||||
e.printStackTrace(); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void removeInstances(String ID){ |
||||
CACHE.remove(ID); |
||||
} |
||||
|
||||
@Override |
||||
public void cacheInstance(String ID, Object o){ |
||||
CACHE.put(ID, o); |
||||
} |
||||
} |
@ -0,0 +1,54 @@
|
||||
package com.fanruan.cache; |
||||
|
||||
import io.socket.client.Socket; |
||||
|
||||
import java.util.Map; |
||||
import java.util.concurrent.ConcurrentHashMap; |
||||
|
||||
/** |
||||
* Global cache which has the same life cycle with Dispatcher |
||||
* @author Yichen Dai |
||||
* @date 2022/8/16 16:13 |
||||
*/ |
||||
public interface Cache { |
||||
/** |
||||
* stored socket instance by dataBase name |
||||
*/ |
||||
Map<String, Socket> SOCKET_MAP = new ConcurrentHashMap<>(); |
||||
|
||||
|
||||
/** |
||||
* Bunch of Map where cached instances like Driver, Connection |
||||
*/ |
||||
Map<String, BeanCacheImpl> BEAN_CACHE = new ConcurrentHashMap<>(); |
||||
|
||||
/** |
||||
* register the socket of specific nameSpace, |
||||
* the nameSpace is named as "/" + DB name. |
||||
* @param dbName the key of cache entry |
||||
* @param socket the value of cache entry |
||||
*/ |
||||
void registerSocket(String dbName, Socket socket); |
||||
|
||||
/** |
||||
* get socket by DB name |
||||
* @param dbName the key of cache entry |
||||
* @return socket of the nameSpace |
||||
*/ |
||||
Socket getSocket(String dbName); |
||||
|
||||
/** |
||||
* register the socket of specific nameSpace/db |
||||
* @param dbName the key of cache |
||||
* @param beanCache Map where cached instances like Driver, Connection |
||||
*/ |
||||
void registerBeanCache(String dbName, BeanCacheImpl beanCache); |
||||
|
||||
/** |
||||
* get the beanCache of specific nameSpace/db |
||||
* @param dbName the key of cache |
||||
* @return beanCache: Map where cached instances like Driver, Connection |
||||
*/ |
||||
BeanCacheImpl getBeanCache(String dbName); |
||||
|
||||
} |
@ -0,0 +1,39 @@
|
||||
package com.fanruan.cache; |
||||
|
||||
import io.socket.client.Socket; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
* @date 2022/8/16 16:13 |
||||
*/ |
||||
public class CacheImpl implements Cache{ |
||||
|
||||
@Override |
||||
public void registerSocket(String dbName, Socket socket){ |
||||
SOCKET_MAP.put(dbName, socket); |
||||
} |
||||
|
||||
@Override |
||||
public Socket getSocket(String dbName){ |
||||
Socket socket = SOCKET_MAP.get(dbName); |
||||
if (socket == null){ |
||||
throw new RuntimeException("no such DataBase Name"); |
||||
} |
||||
return socket; |
||||
} |
||||
|
||||
@Override |
||||
public void registerBeanCache(String dbName, BeanCacheImpl beanCache) { |
||||
BEAN_CACHE.put(dbName, beanCache); |
||||
} |
||||
|
||||
@Override |
||||
public BeanCacheImpl getBeanCache(String dbName) { |
||||
BeanCacheImpl beanCache = BEAN_CACHE.get(dbName); |
||||
if(beanCache == null){ |
||||
beanCache = new BeanCacheImpl(dbName); |
||||
registerBeanCache(dbName, beanCache); |
||||
} |
||||
return beanCache; |
||||
} |
||||
} |
@ -0,0 +1,34 @@
|
||||
package com.fanruan.handler; |
||||
|
||||
import com.fanruan.cache.BeanCacheImpl; |
||||
import com.fanruan.cache.CacheImpl; |
||||
import com.fanruan.pojo.message.RpcRequest; |
||||
|
||||
/** |
||||
* Dispatch and process received requests |
||||
* @author Yichen Dai |
||||
* @date 2022/8/16 14:56 |
||||
*/ |
||||
public interface Dispatcher { |
||||
CacheImpl CACHE = new CacheImpl(); |
||||
|
||||
ResponseEmitterImpl RESPONSE_EMITTER_IMPL = new ResponseEmitterImpl(); |
||||
/** |
||||
* |
||||
* @param rpcRequest |
||||
* @param dbName |
||||
*/ |
||||
void doDispatch(RpcRequest rpcRequest, String dbName); |
||||
|
||||
/** |
||||
* |
||||
* @param rpcRequest |
||||
* @param beanCache |
||||
* @return |
||||
* @throws Throwable |
||||
*/ |
||||
Object invokeAsRequest(RpcRequest rpcRequest, BeanCacheImpl beanCache) throws Throwable; |
||||
|
||||
|
||||
|
||||
} |
@ -0,0 +1,60 @@
|
||||
package com.fanruan.handler; |
||||
|
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* Some utils for MyDispatcher |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class DispatcherHelper { |
||||
|
||||
private static final Map<String, Class<?>> WRAPPER_CLASS_MAP = new HashMap<String, Class<?>>(){ |
||||
{ |
||||
put("Integer", Integer.TYPE); |
||||
put("Short", Short.TYPE); |
||||
put("Long", Long.TYPE); |
||||
put("Double", Double.TYPE); |
||||
put("Float", Float.TYPE); |
||||
put("Byte", Byte.TYPE); |
||||
put("Character", Character.TYPE); |
||||
put("Boolean", Boolean.TYPE); |
||||
} |
||||
}; |
||||
|
||||
public final static String[] CACHE_LIST = new String[]{ |
||||
"com.fanruan.jdbc.driver.MyDriver", |
||||
"com.fanruan.jdbc.connection.MyConnection", |
||||
"com.fanruan.jdbc.statement.MyStatement", |
||||
"com.fanruan.jdbc.statement.MyPreparedStatement", |
||||
"com.fanruan.jdbc.resultset.MyResultSet", |
||||
|
||||
}; |
||||
|
||||
public static boolean isInCacheList(String className){ |
||||
for(String s : CACHE_LIST){ |
||||
if(s.equals(className)){ |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public static boolean isWraps(Class<?> clz){ |
||||
return WRAPPER_CLASS_MAP.containsKey(getClassName(clz.getName())); |
||||
} |
||||
|
||||
public static Class<?> castToPrimitiveClass(Class<?> clz){ |
||||
return WRAPPER_CLASS_MAP.get(getClassName(clz.getName())); |
||||
} |
||||
|
||||
public static String getClassName(String fullyQualifiedClassName){ |
||||
String[] arr = fullyQualifiedClassName.split("\\."); |
||||
int n = arr.length; |
||||
if(n == 0) { |
||||
throw new RuntimeException("the class name invoked is wrong"); |
||||
} |
||||
return arr[n-1]; |
||||
} |
||||
} |
@ -0,0 +1,109 @@
|
||||
package com.fanruan.handler; |
||||
|
||||
|
||||
import com.fanruan.cache.BeanCacheImpl; |
||||
import com.fanruan.pojo.message.RpcRequest; |
||||
import org.apache.logging.log4j.LogManager; |
||||
import org.apache.logging.log4j.Logger; |
||||
|
||||
import java.lang.reflect.Method; |
||||
|
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class MyDispatcherImpl implements Dispatcher{ |
||||
protected static final Logger logger = LogManager.getLogger(); |
||||
|
||||
public final static String CLOSE_NAME = "close"; |
||||
|
||||
public MyDispatcherImpl(){} |
||||
|
||||
@Override |
||||
public void doDispatch(RpcRequest rpcRequest, String dbName) { |
||||
logger.debug("do dispatcher"); |
||||
BeanCacheImpl beanCache = CACHE.getBeanCache(dbName); |
||||
|
||||
Object res = null; |
||||
try { |
||||
res = invokeAsRequest(rpcRequest, beanCache); |
||||
}catch (Exception e){ |
||||
RESPONSE_EMITTER_IMPL.sendError(CACHE.getSocket(dbName), rpcRequest, e); |
||||
} |
||||
|
||||
if(rpcRequest.isReply()){ |
||||
RESPONSE_EMITTER_IMPL.replyWithData(CACHE.getSocket(dbName), rpcRequest, res); |
||||
}else { |
||||
RESPONSE_EMITTER_IMPL.sendOk(CACHE.getSocket(dbName), rpcRequest); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public Object invokeAsRequest(RpcRequest rpcRequest, BeanCacheImpl beanCache) throws Exception{ |
||||
Class<?> clazz = rpcRequest.getServiceClass(); |
||||
String methodName = rpcRequest.getMethodName(); |
||||
Object[] args = rpcRequest.getArgs(); |
||||
Class<?>[] argTypes = rpcRequest.getArgTypes(); |
||||
Object calledClassInstance = null; |
||||
// The ID of the rpcRequest could be save as the ID of an instance
|
||||
// Because one instance can only been create just once for an unique rpcRequest
|
||||
String IDToCache = rpcRequest.getID(); |
||||
String IDToInvoke = rpcRequest.getIDToInvoke(); |
||||
|
||||
String fullName = clazz.getName(); |
||||
String className = DispatcherHelper.getClassName(fullName); |
||||
|
||||
// If BeanCache contains instance, get it; if not, create it.
|
||||
if(IDToInvoke == null){ |
||||
try{ |
||||
// create
|
||||
calledClassInstance = Class.forName(fullName).newInstance(); |
||||
}catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} |
||||
beanCache.cacheInstance(IDToCache, calledClassInstance); |
||||
}else{ |
||||
calledClassInstance = beanCache.getCachedInstances(IDToInvoke, clazz); |
||||
} |
||||
|
||||
Method method; |
||||
|
||||
try { |
||||
// The primitive variable's type will be automatically packaged when passed as a class object,
|
||||
// And an error will be reported when the method with the primitive variable as the parameter is called
|
||||
method = clazz.getDeclaredMethod(methodName, argTypes); |
||||
}catch (Exception e){ |
||||
for(int i=0; i<argTypes.length; i++){ |
||||
Class<?> clz = argTypes[i]; |
||||
if(DispatcherHelper.isWraps(clz)){ |
||||
argTypes[i] = DispatcherHelper.castToPrimitiveClass(clz); |
||||
} |
||||
} |
||||
method = clazz.getDeclaredMethod(methodName, argTypes); |
||||
|
||||
|
||||
} |
||||
|
||||
|
||||
Object res = method.invoke(calledClassInstance, args); |
||||
|
||||
if(CLOSE_NAME.equals(methodName)){ |
||||
beanCache.removeInstances(IDToInvoke); |
||||
} |
||||
|
||||
// Cached some instances need to be invoke later.
|
||||
// Some method return null, so determine the value of `res` before referencing it.
|
||||
if(res != null){ |
||||
String resClassName = res.getClass().getName(); |
||||
if(DispatcherHelper.isInCacheList(resClassName)) { |
||||
beanCache.cacheInstance(rpcRequest.getID(), res); |
||||
} |
||||
logger.info("invoke" + className + "-" + methodName + " and return a instance of" + res.getClass().getName()); |
||||
}else{ |
||||
logger.info("invoke" + className + "-" + methodName + " and no return value"); |
||||
} |
||||
return res; |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,34 @@
|
||||
package com.fanruan.handler; |
||||
|
||||
import com.fanruan.pojo.message.RpcRequest; |
||||
import io.socket.client.Socket; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
* @date 2022/8/16 16:57 |
||||
*/ |
||||
public interface ResponseEmitter { |
||||
|
||||
/** |
||||
* Send success response for the request which not require reply. |
||||
* @param socket socket to send event |
||||
* @param rpcRequest corresponding request |
||||
*/ |
||||
void sendOk(Socket socket, RpcRequest rpcRequest); |
||||
|
||||
/** |
||||
* Send failure response when error occur while handle request. |
||||
* @param socket |
||||
* @param rpcRequest |
||||
* @param e Exception happened while handle request. |
||||
*/ |
||||
void sendError(Socket socket, RpcRequest rpcRequest, Exception e); |
||||
|
||||
/** |
||||
* Send success response with data asked by request. |
||||
* @param socket |
||||
* @param rpcRequest |
||||
* @param res data required. |
||||
*/ |
||||
void replyWithData(Socket socket, RpcRequest rpcRequest, Object res); |
||||
} |
@ -0,0 +1,48 @@
|
||||
package com.fanruan.handler; |
||||
|
||||
import com.fanruan.AgentStarter; |
||||
import com.fanruan.pojo.message.RpcRequest; |
||||
import com.fanruan.pojo.message.RpcResponse; |
||||
import io.socket.client.Socket; |
||||
|
||||
/** |
||||
* Utils for dispatcher to send response; |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class ResponseEmitterImpl implements ResponseEmitter{ |
||||
|
||||
@Override |
||||
public void sendOk(Socket socket, RpcRequest rpcRequest){ |
||||
RpcResponse rpcResponse = new RpcResponse(); |
||||
rpcResponse.setResult(null) |
||||
.setID(rpcRequest.getID()) |
||||
.setBinding(rpcRequest.isBinding()) |
||||
.setStatus(true); |
||||
byte[] bytes = AgentStarter.SERIALIZER.serialize(rpcResponse); |
||||
socket.emit("RPCResponse", bytes); |
||||
} |
||||
|
||||
@Override |
||||
public void sendError(Socket socket, RpcRequest rpcRequest, Exception e){ |
||||
RpcResponse rpcResponse = new RpcResponse(); |
||||
rpcResponse.setResult("Some errors happened when AgentID: " + AgentStarter.AgentID + " " |
||||
+ rpcRequest.getMethodName() + " is being invoked!" + "\n" |
||||
+ "Error Message: " + e.getMessage() |
||||
+ " and check your code") |
||||
.setID(rpcRequest.getID()) |
||||
.setBinding(rpcRequest.isBinding()) |
||||
.setStatus(false); |
||||
byte[] bytes = AgentStarter.SERIALIZER.serialize(rpcResponse); |
||||
socket.emit("RPCResponse", bytes); |
||||
} |
||||
|
||||
@Override |
||||
public void replyWithData(Socket socket, RpcRequest rpcRequest, Object res){ |
||||
RpcResponse rpcResponse = new RpcResponse(); |
||||
rpcResponse.setID(rpcRequest.getID()) |
||||
.setStatus(true) |
||||
.setResult(res); |
||||
byte[] bytes = AgentStarter.SERIALIZER.serialize(rpcResponse); |
||||
socket.emit("RPCResponse", bytes); |
||||
} |
||||
} |
@ -0,0 +1,292 @@
|
||||
package com.fanruan.jdbc.connection; |
||||
|
||||
import com.fanruan.jdbc.statement.MyPreparedStatement; |
||||
import com.fanruan.jdbc.statement.MyStatement; |
||||
|
||||
import java.sql.*; |
||||
import java.util.Map; |
||||
import java.util.Properties; |
||||
import java.util.concurrent.Executor; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class MyConnection implements Connection { |
||||
final private Connection conn; |
||||
|
||||
public MyConnection(Connection conn){ |
||||
this.conn = conn; |
||||
} |
||||
|
||||
@Override |
||||
public Statement createStatement() throws SQLException { |
||||
Statement st = this.conn.createStatement(); |
||||
return new MyStatement(st); |
||||
} |
||||
|
||||
@Override |
||||
public PreparedStatement prepareStatement(String sql) throws SQLException { |
||||
PreparedStatement pst = this.conn.prepareStatement(sql); |
||||
return new MyPreparedStatement(pst); |
||||
} |
||||
|
||||
@Override |
||||
public CallableStatement prepareCall(String sql) throws SQLException { |
||||
return conn.prepareCall(sql); |
||||
} |
||||
|
||||
@Override |
||||
public String nativeSQL(String sql) throws SQLException { |
||||
return conn.nativeSQL(sql); |
||||
} |
||||
|
||||
@Override |
||||
public void setAutoCommit(boolean autoCommit) throws SQLException { |
||||
conn.setAutoCommit(autoCommit); |
||||
} |
||||
|
||||
@Override |
||||
public boolean getAutoCommit() throws SQLException { |
||||
return conn.getAutoCommit(); |
||||
} |
||||
|
||||
@Override |
||||
public void commit() throws SQLException { |
||||
conn.commit(); |
||||
} |
||||
|
||||
@Override |
||||
public void rollback() throws SQLException { |
||||
conn.rollback(); |
||||
} |
||||
|
||||
@Override |
||||
public void close() throws SQLException { |
||||
conn.close(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isClosed() throws SQLException { |
||||
return conn.isClosed(); |
||||
} |
||||
|
||||
@Override |
||||
public DatabaseMetaData getMetaData() throws SQLException { |
||||
return conn.getMetaData(); |
||||
} |
||||
|
||||
@Override |
||||
public void setReadOnly(boolean readOnly) throws SQLException { |
||||
conn.setReadOnly(readOnly); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isReadOnly() throws SQLException { |
||||
return conn.isReadOnly(); |
||||
} |
||||
|
||||
@Override |
||||
public void setCatalog(String catalog) throws SQLException { |
||||
conn.setCatalog(catalog); |
||||
} |
||||
|
||||
@Override |
||||
public String getCatalog() throws SQLException { |
||||
return conn.getCatalog(); |
||||
} |
||||
|
||||
@Override |
||||
public void setTransactionIsolation(int level) throws SQLException { |
||||
conn.setTransactionIsolation(level); |
||||
} |
||||
|
||||
@Override |
||||
public int getTransactionIsolation() throws SQLException { |
||||
return conn.getTransactionIsolation(); |
||||
} |
||||
|
||||
@Override |
||||
public SQLWarning getWarnings() throws SQLException { |
||||
return conn.getWarnings(); |
||||
} |
||||
|
||||
@Override |
||||
public void clearWarnings() throws SQLException { |
||||
conn.clearWarnings(); |
||||
} |
||||
|
||||
@Override |
||||
public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { |
||||
return conn.createStatement(resultSetType, resultSetConcurrency); |
||||
} |
||||
|
||||
@Override |
||||
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { |
||||
return conn.prepareStatement(sql, resultSetType, resultSetConcurrency); |
||||
} |
||||
|
||||
@Override |
||||
public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { |
||||
return conn.prepareCall(sql, resultSetType, resultSetConcurrency); |
||||
} |
||||
|
||||
@Override |
||||
public Map<String, Class<?>> getTypeMap() throws SQLException { |
||||
return conn.getTypeMap(); |
||||
} |
||||
|
||||
@Override |
||||
public void setTypeMap(Map<String, Class<?>> map) throws SQLException { |
||||
conn.setTypeMap(map); |
||||
} |
||||
|
||||
@Override |
||||
public void setHoldability(int holdability) throws SQLException { |
||||
conn.setHoldability(holdability); |
||||
} |
||||
|
||||
@Override |
||||
public int getHoldability() throws SQLException { |
||||
return conn.getHoldability(); |
||||
} |
||||
|
||||
@Override |
||||
public Savepoint setSavepoint() throws SQLException { |
||||
return conn.setSavepoint(); |
||||
} |
||||
|
||||
@Override |
||||
public Savepoint setSavepoint(String name) throws SQLException { |
||||
return conn.setSavepoint(name); |
||||
} |
||||
|
||||
@Override |
||||
public void rollback(Savepoint savepoint) throws SQLException { |
||||
conn.rollback(savepoint); |
||||
} |
||||
|
||||
@Override |
||||
public void releaseSavepoint(Savepoint savepoint) throws SQLException { |
||||
conn.releaseSavepoint(savepoint); |
||||
} |
||||
|
||||
@Override |
||||
public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { |
||||
return conn.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability); |
||||
} |
||||
|
||||
@Override |
||||
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { |
||||
return conn.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability); |
||||
} |
||||
|
||||
@Override |
||||
public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { |
||||
return conn.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability); |
||||
} |
||||
|
||||
@Override |
||||
public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { |
||||
return conn.prepareStatement(sql, autoGeneratedKeys); |
||||
} |
||||
|
||||
@Override |
||||
public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { |
||||
return conn.prepareStatement(sql, columnIndexes); |
||||
} |
||||
|
||||
@Override |
||||
public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { |
||||
return conn.prepareStatement(sql, columnNames); |
||||
} |
||||
|
||||
@Override |
||||
public Clob createClob() throws SQLException { |
||||
return conn.createClob(); |
||||
} |
||||
|
||||
@Override |
||||
public Blob createBlob() throws SQLException { |
||||
return conn.createBlob(); |
||||
} |
||||
|
||||
@Override |
||||
public NClob createNClob() throws SQLException { |
||||
return conn.createNClob(); |
||||
} |
||||
|
||||
@Override |
||||
public SQLXML createSQLXML() throws SQLException { |
||||
return conn.createSQLXML(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isValid(int timeout) throws SQLException { |
||||
return conn.isValid(timeout); |
||||
} |
||||
|
||||
@Override |
||||
public void setClientInfo(String name, String value) throws SQLClientInfoException { |
||||
conn.setClientInfo(name, value); |
||||
} |
||||
|
||||
@Override |
||||
public void setClientInfo(Properties properties) throws SQLClientInfoException { |
||||
conn.setClientInfo(properties); |
||||
} |
||||
|
||||
@Override |
||||
public String getClientInfo(String name) throws SQLException { |
||||
return conn.getClientInfo(name); |
||||
} |
||||
|
||||
@Override |
||||
public Properties getClientInfo() throws SQLException { |
||||
return conn.getClientInfo(); |
||||
} |
||||
|
||||
@Override |
||||
public Array createArrayOf(String typeName, Object[] elements) throws SQLException { |
||||
return conn.createArrayOf(typeName, elements); |
||||
} |
||||
|
||||
@Override |
||||
public Struct createStruct(String typeName, Object[] attributes) throws SQLException { |
||||
return conn.createStruct(typeName, attributes); |
||||
} |
||||
|
||||
@Override |
||||
public void setSchema(String schema) throws SQLException { |
||||
conn.setSchema(schema); |
||||
} |
||||
|
||||
@Override |
||||
public String getSchema() throws SQLException { |
||||
return conn.getSchema(); |
||||
} |
||||
|
||||
@Override |
||||
public void abort(Executor executor) throws SQLException { |
||||
conn.abort(executor); |
||||
} |
||||
|
||||
@Override |
||||
public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { |
||||
conn.setNetworkTimeout(executor, milliseconds); |
||||
} |
||||
|
||||
@Override |
||||
public int getNetworkTimeout() throws SQLException { |
||||
return conn.getNetworkTimeout(); |
||||
} |
||||
|
||||
@Override |
||||
public <T> T unwrap(Class<T> iface) throws SQLException { |
||||
return conn.unwrap(iface); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isWrapperFor(Class<?> iface) throws SQLException { |
||||
return conn.isWrapperFor(iface); |
||||
} |
||||
} |
@ -0,0 +1,74 @@
|
||||
package com.fanruan.jdbc.driver; |
||||
|
||||
import com.fanruan.jdbc.connection.MyConnection; |
||||
|
||||
import java.sql.*; |
||||
import java.util.Enumeration; |
||||
import java.util.Properties; |
||||
import java.util.logging.Logger; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class MyDriver implements Driver { |
||||
|
||||
|
||||
static public final int DRIVER_VERSION_MAJOR = 1; |
||||
static public final int DRIVER_VERSION_MINOR = 1; |
||||
|
||||
//依靠静态函数块注册驱动
|
||||
static{ |
||||
try { |
||||
DriverManager.registerDriver(new MyDriver()); |
||||
} catch (Exception e) { |
||||
throw new RuntimeException("Can't register driver"); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public Connection connect(String url, Properties info) throws SQLException { |
||||
return new MyConnection(DriverManager.getConnection(url, info)); |
||||
} |
||||
|
||||
@Override |
||||
public boolean acceptsURL(String url) throws SQLException { |
||||
Enumeration<Driver> registeredDrivers = DriverManager.getDrivers(); |
||||
while (registeredDrivers.hasMoreElements()) { |
||||
Driver driver = registeredDrivers.nextElement(); |
||||
if(driver instanceof MyDriver){ |
||||
continue; |
||||
} |
||||
if(driver.acceptsURL(url)){ |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public DriverPropertyInfo[] getPropertyInfo(String url, Properties info){ |
||||
return new DriverPropertyInfo[0]; |
||||
} |
||||
|
||||
@Override |
||||
public int getMajorVersion() { |
||||
return DRIVER_VERSION_MAJOR; |
||||
} |
||||
|
||||
@Override |
||||
public int getMinorVersion() { |
||||
return DRIVER_VERSION_MINOR; |
||||
} |
||||
|
||||
@Override |
||||
public boolean jdbcCompliant() { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public Logger getParentLogger(){ |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
|
@ -0,0 +1,973 @@
|
||||
package com.fanruan.jdbc.resultset; |
||||
|
||||
import java.io.InputStream; |
||||
import java.io.Reader; |
||||
import java.math.BigDecimal; |
||||
import java.net.URL; |
||||
import java.sql.*; |
||||
import java.util.Calendar; |
||||
import java.util.Map; |
||||
|
||||
public class MyResultSet implements ResultSet { |
||||
|
||||
final private ResultSet resultSet; |
||||
|
||||
public MyResultSet(ResultSet resultSet){ |
||||
this.resultSet = resultSet; |
||||
} |
||||
|
||||
@Override |
||||
public boolean next() throws SQLException { |
||||
return resultSet.next(); |
||||
} |
||||
|
||||
@Override |
||||
public void close() throws SQLException { |
||||
resultSet.close(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean wasNull() throws SQLException { |
||||
return resultSet.wasNull(); |
||||
} |
||||
|
||||
@Override |
||||
public String getString(int columnIndex) throws SQLException { |
||||
return resultSet.getString(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public boolean getBoolean(int columnIndex) throws SQLException { |
||||
return resultSet.getBoolean(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public byte getByte(int columnIndex) throws SQLException { |
||||
return resultSet.getByte(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public short getShort(int columnIndex) throws SQLException { |
||||
return resultSet.getShort(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public int getInt(int columnIndex) throws SQLException { |
||||
return resultSet.getInt(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public long getLong(int columnIndex) throws SQLException { |
||||
return resultSet.getLong(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public float getFloat(int columnIndex) throws SQLException { |
||||
return resultSet.getFloat(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public double getDouble(int columnIndex) throws SQLException { |
||||
return resultSet.getDouble(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException { |
||||
return resultSet.getBigDecimal(columnIndex, scale); |
||||
} |
||||
|
||||
@Override |
||||
public byte[] getBytes(int columnIndex) throws SQLException { |
||||
return resultSet.getBytes(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public Date getDate(int columnIndex) throws SQLException { |
||||
return resultSet.getDate(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public Time getTime(int columnIndex) throws SQLException { |
||||
return resultSet.getTime(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public Timestamp getTimestamp(int columnIndex) throws SQLException { |
||||
return resultSet.getTimestamp(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public InputStream getAsciiStream(int columnIndex) throws SQLException { |
||||
return resultSet.getAsciiStream(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public InputStream getUnicodeStream(int columnIndex) throws SQLException { |
||||
return resultSet.getUnicodeStream(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public InputStream getBinaryStream(int columnIndex) throws SQLException { |
||||
return resultSet.getBinaryStream(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public String getString(String columnLabel) throws SQLException { |
||||
return resultSet.getString(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public boolean getBoolean(String columnLabel) throws SQLException { |
||||
return resultSet.getBoolean(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public byte getByte(String columnLabel) throws SQLException { |
||||
return resultSet.getByte(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public short getShort(String columnLabel) throws SQLException { |
||||
return resultSet.getShort(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public int getInt(String columnLabel) throws SQLException { |
||||
return resultSet.getInt(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public long getLong(String columnLabel) throws SQLException { |
||||
return resultSet.getLong(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public float getFloat(String columnLabel) throws SQLException { |
||||
return resultSet.getFloat(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public double getDouble(String columnLabel) throws SQLException { |
||||
return resultSet.getDouble(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public BigDecimal getBigDecimal(String columnLabel, int scale) throws SQLException { |
||||
return resultSet.getBigDecimal(columnLabel, scale); |
||||
} |
||||
|
||||
@Override |
||||
public byte[] getBytes(String columnLabel) throws SQLException { |
||||
return resultSet.getBytes(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public Date getDate(String columnLabel) throws SQLException { |
||||
return resultSet.getDate(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public Time getTime(String columnLabel) throws SQLException { |
||||
return resultSet.getTime(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public Timestamp getTimestamp(String columnLabel) throws SQLException { |
||||
return resultSet.getTimestamp(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public InputStream getAsciiStream(String columnLabel) throws SQLException { |
||||
return resultSet.getAsciiStream(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public InputStream getUnicodeStream(String columnLabel) throws SQLException { |
||||
return resultSet.getUnicodeStream(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public InputStream getBinaryStream(String columnLabel) throws SQLException { |
||||
return resultSet.getBinaryStream(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public SQLWarning getWarnings() throws SQLException { |
||||
return resultSet.getWarnings(); |
||||
} |
||||
|
||||
@Override |
||||
public void clearWarnings() throws SQLException { |
||||
resultSet.clearWarnings(); |
||||
} |
||||
|
||||
@Override |
||||
public String getCursorName() throws SQLException { |
||||
return resultSet.getCursorName(); |
||||
} |
||||
|
||||
@Override |
||||
public ResultSetMetaData getMetaData() throws SQLException { |
||||
return resultSet.getMetaData(); |
||||
} |
||||
|
||||
@Override |
||||
public Object getObject(int columnIndex) throws SQLException { |
||||
return resultSet.getObject(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public Object getObject(String columnLabel) throws SQLException { |
||||
return resultSet.getObject(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public int findColumn(String columnLabel) throws SQLException { |
||||
return resultSet.findColumn(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public Reader getCharacterStream(int columnIndex) throws SQLException { |
||||
return resultSet.getCharacterStream(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public Reader getCharacterStream(String columnLabel) throws SQLException { |
||||
return resultSet.getCharacterStream(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public BigDecimal getBigDecimal(int columnIndex) throws SQLException { |
||||
return resultSet.getBigDecimal(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public BigDecimal getBigDecimal(String columnLabel) throws SQLException { |
||||
return resultSet.getBigDecimal(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isBeforeFirst() throws SQLException { |
||||
return resultSet.isBeforeFirst(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isAfterLast() throws SQLException { |
||||
return resultSet.isAfterLast(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isFirst() throws SQLException { |
||||
return resultSet.isFirst(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isLast() throws SQLException { |
||||
return resultSet.isLast(); |
||||
} |
||||
|
||||
@Override |
||||
public void beforeFirst() throws SQLException { |
||||
resultSet.beforeFirst(); |
||||
} |
||||
|
||||
@Override |
||||
public void afterLast() throws SQLException { |
||||
resultSet.afterLast(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean first() throws SQLException { |
||||
return resultSet.first(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean last() throws SQLException { |
||||
return resultSet.last(); |
||||
} |
||||
|
||||
@Override |
||||
public int getRow() throws SQLException { |
||||
return resultSet.getRow(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean absolute(int row) throws SQLException { |
||||
return resultSet.absolute(row); |
||||
} |
||||
|
||||
@Override |
||||
public boolean relative(int rows) throws SQLException { |
||||
return resultSet.relative(rows); |
||||
} |
||||
|
||||
@Override |
||||
public boolean previous() throws SQLException { |
||||
return resultSet.previous(); |
||||
} |
||||
|
||||
@Override |
||||
public void setFetchDirection(int direction) throws SQLException { |
||||
resultSet.setFetchDirection(direction); |
||||
} |
||||
|
||||
@Override |
||||
public int getFetchDirection() throws SQLException { |
||||
return resultSet.getFetchDirection(); |
||||
} |
||||
|
||||
@Override |
||||
public void setFetchSize(int rows) throws SQLException { |
||||
resultSet.setFetchSize(rows); |
||||
} |
||||
|
||||
@Override |
||||
public int getFetchSize() throws SQLException { |
||||
return resultSet.getFetchSize(); |
||||
} |
||||
|
||||
@Override |
||||
public int getType() throws SQLException { |
||||
return resultSet.getType(); |
||||
} |
||||
|
||||
@Override |
||||
public int getConcurrency() throws SQLException { |
||||
return resultSet.getConcurrency(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean rowUpdated() throws SQLException { |
||||
return resultSet.rowUpdated(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean rowInserted() throws SQLException { |
||||
return resultSet.rowInserted(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean rowDeleted() throws SQLException { |
||||
return resultSet.rowDeleted(); |
||||
} |
||||
|
||||
@Override |
||||
public void updateNull(int columnIndex) throws SQLException { |
||||
resultSet.updateNull(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBoolean(int columnIndex, boolean x) throws SQLException { |
||||
resultSet.updateBoolean(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateByte(int columnIndex, byte x) throws SQLException { |
||||
resultSet.updateByte(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateShort(int columnIndex, short x) throws SQLException { |
||||
resultSet.updateShort(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateInt(int columnIndex, int x) throws SQLException { |
||||
resultSet.updateInt(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateLong(int columnIndex, long x) throws SQLException { |
||||
resultSet.updateLong(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateFloat(int columnIndex, float x) throws SQLException { |
||||
resultSet.updateFloat(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateDouble(int columnIndex, double x) throws SQLException { |
||||
resultSet.updateDouble(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException { |
||||
resultSet.updateBigDecimal(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateString(int columnIndex, String x) throws SQLException { |
||||
resultSet.updateString(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBytes(int columnIndex, byte[] x) throws SQLException { |
||||
resultSet.updateBytes(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateDate(int columnIndex, Date x) throws SQLException { |
||||
resultSet.updateDate(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateTime(int columnIndex, Time x) throws SQLException { |
||||
resultSet.updateTime(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateTimestamp(int columnIndex, Timestamp x) throws SQLException { |
||||
resultSet.updateTimestamp(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateAsciiStream(int columnIndex, InputStream x, int length) throws SQLException { |
||||
resultSet.updateAsciiStream(columnIndex, x, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBinaryStream(int columnIndex, InputStream x, int length) throws SQLException { |
||||
resultSet.updateBinaryStream(columnIndex, x, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateCharacterStream(int columnIndex, Reader x, int length) throws SQLException { |
||||
resultSet.updateCharacterStream(columnIndex, x, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateObject(int columnIndex, Object x, int scaleOrLength) throws SQLException { |
||||
resultSet.updateObject(columnIndex, x, scaleOrLength); |
||||
} |
||||
|
||||
@Override |
||||
public void updateObject(int columnIndex, Object x) throws SQLException { |
||||
resultSet.updateObject(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateNull(String columnLabel) throws SQLException { |
||||
resultSet.updateNull(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBoolean(String columnLabel, boolean x) throws SQLException { |
||||
resultSet.updateBoolean(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateByte(String columnLabel, byte x) throws SQLException { |
||||
resultSet.updateByte(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateShort(String columnLabel, short x) throws SQLException { |
||||
resultSet.updateShort(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateInt(String columnLabel, int x) throws SQLException { |
||||
resultSet.updateInt(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateLong(String columnLabel, long x) throws SQLException { |
||||
resultSet.updateLong(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateFloat(String columnLabel, float x) throws SQLException { |
||||
resultSet.updateFloat(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateDouble(String columnLabel, double x) throws SQLException { |
||||
resultSet.updateDouble(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBigDecimal(String columnLabel, BigDecimal x) throws SQLException { |
||||
resultSet.updateBigDecimal(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateString(String columnLabel, String x) throws SQLException { |
||||
resultSet.updateString(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBytes(String columnLabel, byte[] x) throws SQLException { |
||||
resultSet.updateBytes(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateDate(String columnLabel, Date x) throws SQLException { |
||||
resultSet.updateDate(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateTime(String columnLabel, Time x) throws SQLException { |
||||
resultSet.updateTime(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateTimestamp(String columnLabel, Timestamp x) throws SQLException { |
||||
resultSet.updateTimestamp(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateAsciiStream(String columnLabel, InputStream x, int length) throws SQLException { |
||||
resultSet.updateAsciiStream(columnLabel, x, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBinaryStream(String columnLabel, InputStream x, int length) throws SQLException { |
||||
resultSet.updateBinaryStream(columnLabel, x, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateCharacterStream(String columnLabel, Reader reader, int length) throws SQLException { |
||||
resultSet.updateCharacterStream(columnLabel, reader, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateObject(String columnLabel, Object x, int scaleOrLength) throws SQLException { |
||||
resultSet.updateObject(columnLabel, x, scaleOrLength); |
||||
} |
||||
|
||||
@Override |
||||
public void updateObject(String columnLabel, Object x) throws SQLException { |
||||
resultSet.updateObject(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void insertRow() throws SQLException { |
||||
resultSet.insertRow(); |
||||
} |
||||
|
||||
@Override |
||||
public void updateRow() throws SQLException { |
||||
resultSet.updateRow(); |
||||
} |
||||
|
||||
@Override |
||||
public void deleteRow() throws SQLException { |
||||
resultSet.deleteRow(); |
||||
} |
||||
|
||||
@Override |
||||
public void refreshRow() throws SQLException { |
||||
resultSet.refreshRow(); |
||||
} |
||||
|
||||
@Override |
||||
public void cancelRowUpdates() throws SQLException { |
||||
resultSet.cancelRowUpdates(); |
||||
} |
||||
|
||||
@Override |
||||
public void moveToInsertRow() throws SQLException { |
||||
resultSet.moveToInsertRow(); |
||||
} |
||||
|
||||
@Override |
||||
public void moveToCurrentRow() throws SQLException { |
||||
resultSet.moveToCurrentRow(); |
||||
} |
||||
|
||||
@Override |
||||
public Statement getStatement() throws SQLException { |
||||
return resultSet.getStatement(); |
||||
} |
||||
|
||||
@Override |
||||
public Object getObject(int columnIndex, Map<String, Class<?>> map) throws SQLException { |
||||
return resultSet.getObject(columnIndex, map); |
||||
} |
||||
|
||||
@Override |
||||
public Ref getRef(int columnIndex) throws SQLException { |
||||
return resultSet.getRef(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public Blob getBlob(int columnIndex) throws SQLException { |
||||
return resultSet.getBlob(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public Clob getClob(int columnIndex) throws SQLException { |
||||
return resultSet.getClob(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public Array getArray(int columnIndex) throws SQLException { |
||||
return resultSet.getArray(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public Object getObject(String columnLabel, Map<String, Class<?>> map) throws SQLException { |
||||
return resultSet.getObject(columnLabel, map); |
||||
} |
||||
|
||||
@Override |
||||
public Ref getRef(String columnLabel) throws SQLException { |
||||
return resultSet.getRef(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public Blob getBlob(String columnLabel) throws SQLException { |
||||
return resultSet.getBlob(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public Clob getClob(String columnLabel) throws SQLException { |
||||
return resultSet.getClob(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public Array getArray(String columnLabel) throws SQLException { |
||||
return resultSet.getArray(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public Date getDate(int columnIndex, Calendar cal) throws SQLException { |
||||
return resultSet.getDate(columnIndex, cal); |
||||
} |
||||
|
||||
@Override |
||||
public Date getDate(String columnLabel, Calendar cal) throws SQLException { |
||||
return resultSet.getDate(columnLabel, cal); |
||||
} |
||||
|
||||
@Override |
||||
public Time getTime(int columnIndex, Calendar cal) throws SQLException { |
||||
return resultSet.getTime(columnIndex, cal); |
||||
} |
||||
|
||||
@Override |
||||
public Time getTime(String columnLabel, Calendar cal) throws SQLException { |
||||
return resultSet.getTime(columnLabel, cal); |
||||
} |
||||
|
||||
@Override |
||||
public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException { |
||||
return resultSet.getTimestamp(columnIndex, cal); |
||||
} |
||||
|
||||
@Override |
||||
public Timestamp getTimestamp(String columnLabel, Calendar cal) throws SQLException { |
||||
return resultSet.getTimestamp(columnLabel, cal); |
||||
} |
||||
|
||||
@Override |
||||
public URL getURL(int columnIndex) throws SQLException { |
||||
return resultSet.getURL(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public URL getURL(String columnLabel) throws SQLException { |
||||
return resultSet.getURL(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public void updateRef(int columnIndex, Ref x) throws SQLException { |
||||
resultSet.updateRef(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateRef(String columnLabel, Ref x) throws SQLException { |
||||
resultSet.updateRef(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBlob(int columnIndex, Blob x) throws SQLException { |
||||
resultSet.updateBlob(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBlob(String columnLabel, Blob x) throws SQLException { |
||||
resultSet.updateBlob(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateClob(int columnIndex, Clob x) throws SQLException { |
||||
resultSet.updateClob(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateClob(String columnLabel, Clob x) throws SQLException { |
||||
resultSet.updateClob(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateArray(int columnIndex, Array x) throws SQLException { |
||||
resultSet.updateArray(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateArray(String columnLabel, Array x) throws SQLException { |
||||
resultSet.updateArray(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public RowId getRowId(int columnIndex) throws SQLException { |
||||
return resultSet.getRowId(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public RowId getRowId(String columnLabel) throws SQLException { |
||||
return resultSet.getRowId(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public void updateRowId(int columnIndex, RowId x) throws SQLException { |
||||
resultSet.updateRowId(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateRowId(String columnLabel, RowId x) throws SQLException { |
||||
resultSet.updateRowId(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public int getHoldability() throws SQLException { |
||||
return resultSet.getHoldability(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isClosed() throws SQLException { |
||||
return resultSet.isClosed(); |
||||
} |
||||
|
||||
@Override |
||||
public void updateNString(int columnIndex, String nString) throws SQLException { |
||||
resultSet.updateNString(columnIndex, nString); |
||||
} |
||||
|
||||
@Override |
||||
public void updateNString(String columnLabel, String nString) throws SQLException { |
||||
resultSet.updateNString(columnLabel, nString); |
||||
} |
||||
|
||||
@Override |
||||
public void updateNClob(int columnIndex, NClob nClob) throws SQLException { |
||||
resultSet.updateNClob(columnIndex, nClob); |
||||
} |
||||
|
||||
@Override |
||||
public void updateNClob(String columnLabel, NClob nClob) throws SQLException { |
||||
resultSet.updateNClob(columnLabel, nClob); |
||||
} |
||||
|
||||
@Override |
||||
public NClob getNClob(int columnIndex) throws SQLException { |
||||
return resultSet.getNClob(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public NClob getNClob(String columnLabel) throws SQLException { |
||||
return resultSet.getNClob(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public SQLXML getSQLXML(int columnIndex) throws SQLException { |
||||
return resultSet.getSQLXML(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public SQLXML getSQLXML(String columnLabel) throws SQLException { |
||||
return resultSet.getSQLXML(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public void updateSQLXML(int columnIndex, SQLXML xmlObject) throws SQLException { |
||||
resultSet.updateSQLXML(columnIndex, xmlObject); |
||||
} |
||||
|
||||
@Override |
||||
public void updateSQLXML(String columnLabel, SQLXML xmlObject) throws SQLException { |
||||
resultSet.updateSQLXML(columnLabel, xmlObject); |
||||
} |
||||
|
||||
@Override |
||||
public String getNString(int columnIndex) throws SQLException { |
||||
return resultSet.getNString(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public String getNString(String columnLabel) throws SQLException { |
||||
return resultSet.getNString(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public Reader getNCharacterStream(int columnIndex) throws SQLException { |
||||
return resultSet.getNCharacterStream(columnIndex); |
||||
} |
||||
|
||||
@Override |
||||
public Reader getNCharacterStream(String columnLabel) throws SQLException { |
||||
return resultSet.getNCharacterStream(columnLabel); |
||||
} |
||||
|
||||
@Override |
||||
public void updateNCharacterStream(int columnIndex, Reader x, long length) throws SQLException { |
||||
resultSet.updateNCharacterStream(columnIndex, x, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateNCharacterStream(String columnLabel, Reader reader, long length) throws SQLException { |
||||
resultSet.updateNCharacterStream(columnLabel, reader, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateAsciiStream(int columnIndex, InputStream x, long length) throws SQLException { |
||||
resultSet.updateAsciiStream(columnIndex, x, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBinaryStream(int columnIndex, InputStream x, long length) throws SQLException { |
||||
resultSet.updateBinaryStream(columnIndex, x, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateCharacterStream(int columnIndex, Reader x, long length) throws SQLException { |
||||
resultSet.updateCharacterStream(columnIndex, x, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateAsciiStream(String columnLabel, InputStream x, long length) throws SQLException { |
||||
resultSet.updateAsciiStream(columnLabel, x, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBinaryStream(String columnLabel, InputStream x, long length) throws SQLException { |
||||
resultSet.updateBinaryStream(columnLabel, x, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateCharacterStream(String columnLabel, Reader reader, long length) throws SQLException { |
||||
resultSet.updateCharacterStream(columnLabel, reader, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBlob(int columnIndex, InputStream inputStream, long length) throws SQLException { |
||||
resultSet.updateBlob(columnIndex, inputStream, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBlob(String columnLabel, InputStream inputStream, long length) throws SQLException { |
||||
resultSet.updateBlob(columnLabel, inputStream, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateClob(int columnIndex, Reader reader, long length) throws SQLException { |
||||
resultSet.updateClob(columnIndex, reader, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateClob(String columnLabel, Reader reader, long length) throws SQLException { |
||||
resultSet.updateClob(columnLabel, reader, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateNClob(int columnIndex, Reader reader, long length) throws SQLException { |
||||
resultSet.updateNClob(columnIndex, reader, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateNClob(String columnLabel, Reader reader, long length) throws SQLException { |
||||
resultSet.updateNClob(columnLabel, reader, length); |
||||
} |
||||
|
||||
@Override |
||||
public void updateNCharacterStream(int columnIndex, Reader x) throws SQLException { |
||||
resultSet.updateNCharacterStream(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateNCharacterStream(String columnLabel, Reader reader) throws SQLException { |
||||
resultSet.updateNCharacterStream(columnLabel, reader); |
||||
} |
||||
|
||||
@Override |
||||
public void updateAsciiStream(int columnIndex, InputStream x) throws SQLException { |
||||
resultSet.updateAsciiStream(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBinaryStream(int columnIndex, InputStream x) throws SQLException { |
||||
resultSet.updateBinaryStream(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateCharacterStream(int columnIndex, Reader x) throws SQLException { |
||||
resultSet.updateCharacterStream(columnIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateAsciiStream(String columnLabel, InputStream x) throws SQLException { |
||||
resultSet.updateAsciiStream(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBinaryStream(String columnLabel, InputStream x) throws SQLException { |
||||
resultSet.updateBinaryStream(columnLabel, x); |
||||
} |
||||
|
||||
@Override |
||||
public void updateCharacterStream(String columnLabel, Reader reader) throws SQLException { |
||||
resultSet.updateCharacterStream(columnLabel, reader); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBlob(int columnIndex, InputStream inputStream) throws SQLException { |
||||
resultSet.updateBlob(columnIndex, inputStream); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBlob(String columnLabel, InputStream inputStream) throws SQLException { |
||||
resultSet.updateBlob(columnLabel, inputStream); |
||||
} |
||||
|
||||
@Override |
||||
public void updateClob(int columnIndex, Reader reader) throws SQLException { |
||||
resultSet.updateClob(columnIndex, reader); |
||||
} |
||||
|
||||
@Override |
||||
public void updateClob(String columnLabel, Reader reader) throws SQLException { |
||||
resultSet.updateClob(columnLabel, reader); |
||||
} |
||||
|
||||
@Override |
||||
public void updateNClob(int columnIndex, Reader reader) throws SQLException { |
||||
resultSet.updateNClob(columnIndex, reader); |
||||
} |
||||
|
||||
@Override |
||||
public void updateNClob(String columnLabel, Reader reader) throws SQLException { |
||||
resultSet.updateNClob(columnLabel, reader); |
||||
} |
||||
|
||||
@Override |
||||
public <T> T getObject(int columnIndex, Class<T> type) throws SQLException { |
||||
return resultSet.getObject(columnIndex, type); |
||||
} |
||||
|
||||
@Override |
||||
public <T> T getObject(String columnLabel, Class<T> type) throws SQLException { |
||||
return resultSet.getObject(columnLabel, type); |
||||
} |
||||
|
||||
@Override |
||||
public <T> T unwrap(Class<T> iface) throws SQLException { |
||||
return resultSet.unwrap(iface); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isWrapperFor(Class<?> iface) throws SQLException { |
||||
return resultSet.isWrapperFor(iface); |
||||
} |
||||
} |
@ -0,0 +1,517 @@
|
||||
package com.fanruan.jdbc.statement; |
||||
|
||||
|
||||
import com.fanruan.jdbc.resultset.MyResultSet; |
||||
|
||||
import java.io.InputStream; |
||||
import java.io.Reader; |
||||
import java.math.BigDecimal; |
||||
import java.net.URL; |
||||
import java.sql.*; |
||||
import java.util.Calendar; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class MyPreparedStatement implements PreparedStatement { |
||||
|
||||
final PreparedStatement pst; |
||||
|
||||
public MyPreparedStatement(PreparedStatement pst) { |
||||
this.pst = pst; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet executeQuery() throws SQLException { |
||||
return new MyResultSet(pst.executeQuery()); |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate() throws SQLException { |
||||
return pst.executeUpdate(); |
||||
} |
||||
|
||||
@Override |
||||
public void setNull(int parameterIndex, int sqlType) throws SQLException { |
||||
pst.setNull(parameterIndex, sqlType); |
||||
} |
||||
|
||||
@Override |
||||
public void setBoolean(int parameterIndex, boolean x) throws SQLException { |
||||
pst.setBoolean(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setByte(int parameterIndex, byte x) throws SQLException { |
||||
pst.setByte(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setShort(int parameterIndex, short x) throws SQLException { |
||||
pst.setShort(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setInt(int parameterIndex, int x) throws SQLException { |
||||
pst.setInt(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setLong(int parameterIndex, long x) throws SQLException { |
||||
pst.setLong(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setFloat(int parameterIndex, float x) throws SQLException { |
||||
pst.setFloat(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setDouble(int parameterIndex, double x) throws SQLException { |
||||
pst.setDouble(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException { |
||||
pst.setBigDecimal(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setString(int parameterIndex, String x) throws SQLException { |
||||
pst.setString(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setBytes(int parameterIndex, byte[] x) throws SQLException { |
||||
pst.setBytes(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setDate(int parameterIndex, Date x) throws SQLException { |
||||
pst.setDate(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setTime(int parameterIndex, Time x) throws SQLException { |
||||
pst.setTime(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException { |
||||
pst.setTimestamp(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException { |
||||
pst.setAsciiStream(parameterIndex, x, length); |
||||
} |
||||
|
||||
@Override |
||||
public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException { |
||||
} |
||||
|
||||
@Override |
||||
public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException { |
||||
pst.setBinaryStream(parameterIndex, x, length); |
||||
} |
||||
|
||||
@Override |
||||
public void clearParameters() throws SQLException { |
||||
pst.clearParameters(); |
||||
} |
||||
|
||||
@Override |
||||
public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException { |
||||
pst.setObject(parameterIndex, x, targetSqlType); |
||||
} |
||||
|
||||
@Override |
||||
public void setObject(int parameterIndex, Object x) throws SQLException { |
||||
pst.setObject(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public boolean execute() throws SQLException { |
||||
return pst.execute(); |
||||
} |
||||
|
||||
@Override |
||||
public void addBatch() throws SQLException { |
||||
pst.addBatch(); |
||||
} |
||||
|
||||
@Override |
||||
public void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException { |
||||
pst.setCharacterStream(parameterIndex, reader, length); |
||||
} |
||||
|
||||
@Override |
||||
public void setRef(int parameterIndex, Ref x) throws SQLException { |
||||
pst.setRef(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setBlob(int parameterIndex, Blob x) throws SQLException { |
||||
pst.setBlob(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setClob(int parameterIndex, Clob x) throws SQLException { |
||||
pst.setClob(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setArray(int parameterIndex, Array x) throws SQLException { |
||||
pst.setArray(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public ResultSetMetaData getMetaData() throws SQLException { |
||||
return pst.getMetaData(); |
||||
} |
||||
|
||||
@Override |
||||
public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException { |
||||
pst.setDate(parameterIndex, x, cal); |
||||
} |
||||
|
||||
@Override |
||||
public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException { |
||||
pst.setTime(parameterIndex, x, cal); |
||||
} |
||||
|
||||
@Override |
||||
public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException { |
||||
pst.setTimestamp(parameterIndex, x, cal); |
||||
} |
||||
|
||||
@Override |
||||
public void setNull(int parameterIndex, int sqlType, String typeName) throws SQLException { |
||||
pst.setNull(parameterIndex, sqlType, typeName); |
||||
} |
||||
|
||||
@Override |
||||
public void setURL(int parameterIndex, URL x) throws SQLException { |
||||
pst.setURL(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public ParameterMetaData getParameterMetaData() throws SQLException { |
||||
return pst.getParameterMetaData(); |
||||
} |
||||
|
||||
@Override |
||||
public void setRowId(int parameterIndex, RowId x) throws SQLException { |
||||
pst.setRowId(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setNString(int parameterIndex, String value) throws SQLException { |
||||
pst.setNString(parameterIndex, value); |
||||
} |
||||
|
||||
@Override |
||||
public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException { |
||||
pst.setNCharacterStream(parameterIndex, value, length); |
||||
} |
||||
|
||||
@Override |
||||
public void setNClob(int parameterIndex, NClob value) throws SQLException { |
||||
pst.setNClob(parameterIndex, value); |
||||
} |
||||
|
||||
@Override |
||||
public void setClob(int parameterIndex, Reader reader, long length) throws SQLException { |
||||
pst.setClob(parameterIndex, reader, length); |
||||
} |
||||
|
||||
@Override |
||||
public void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException { |
||||
pst.setBlob(parameterIndex, inputStream, length); |
||||
} |
||||
|
||||
@Override |
||||
public void setNClob(int parameterIndex, Reader reader, long length) throws SQLException { |
||||
pst.setNClob(parameterIndex, reader, length); |
||||
} |
||||
|
||||
@Override |
||||
public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException { |
||||
pst.setSQLXML(parameterIndex, xmlObject); |
||||
} |
||||
|
||||
@Override |
||||
public void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) throws SQLException { |
||||
pst.setObject(parameterIndex, x, targetSqlType, scaleOrLength); |
||||
} |
||||
|
||||
@Override |
||||
public void setAsciiStream(int parameterIndex, InputStream x, long length) throws SQLException { |
||||
pst.setAsciiStream(parameterIndex, x, length); |
||||
} |
||||
|
||||
@Override |
||||
public void setBinaryStream(int parameterIndex, InputStream x, long length) throws SQLException { |
||||
pst.setBinaryStream(parameterIndex, x, length); |
||||
} |
||||
|
||||
@Override |
||||
public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException { |
||||
pst.setCharacterStream(parameterIndex, reader, length); |
||||
} |
||||
|
||||
@Override |
||||
public void setAsciiStream(int parameterIndex, InputStream x) throws SQLException { |
||||
pst.setAsciiStream(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setBinaryStream(int parameterIndex, InputStream x) throws SQLException { |
||||
pst.setBinaryStream(parameterIndex, x); |
||||
} |
||||
|
||||
@Override |
||||
public void setCharacterStream(int parameterIndex, Reader reader) throws SQLException { |
||||
pst.setCharacterStream(parameterIndex, reader); |
||||
} |
||||
|
||||
@Override |
||||
public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException { |
||||
pst.setNCharacterStream(parameterIndex, value); |
||||
} |
||||
|
||||
@Override |
||||
public void setClob(int parameterIndex, Reader reader) throws SQLException { |
||||
pst.setClob(parameterIndex, reader); |
||||
} |
||||
|
||||
@Override |
||||
public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException { |
||||
pst.setBlob(parameterIndex, inputStream); |
||||
} |
||||
|
||||
@Override |
||||
public void setNClob(int parameterIndex, Reader reader) throws SQLException { |
||||
pst.setNClob(parameterIndex, reader); |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet executeQuery(String sql) throws SQLException { |
||||
return pst.executeQuery(sql); |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate(String sql) throws SQLException { |
||||
return pst.executeUpdate(sql); |
||||
} |
||||
|
||||
@Override |
||||
public void close() throws SQLException { |
||||
pst.close(); |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxFieldSize() throws SQLException { |
||||
return pst.getMaxFieldSize(); |
||||
} |
||||
|
||||
@Override |
||||
public void setMaxFieldSize(int max) throws SQLException { |
||||
pst.setMaxFieldSize(max); |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxRows() throws SQLException { |
||||
return pst.getMaxRows(); |
||||
} |
||||
|
||||
@Override |
||||
public void setMaxRows(int max) throws SQLException { |
||||
pst.setMaxRows(max); |
||||
} |
||||
|
||||
@Override |
||||
public void setEscapeProcessing(boolean enable) throws SQLException { |
||||
pst.setEscapeProcessing(enable); |
||||
} |
||||
|
||||
@Override |
||||
public int getQueryTimeout() throws SQLException { |
||||
return pst.getQueryTimeout(); |
||||
} |
||||
|
||||
@Override |
||||
public void setQueryTimeout(int seconds) throws SQLException { |
||||
pst.setQueryTimeout(seconds); |
||||
} |
||||
|
||||
@Override |
||||
public void cancel() throws SQLException { |
||||
pst.cancel(); |
||||
} |
||||
|
||||
@Override |
||||
public SQLWarning getWarnings() throws SQLException { |
||||
return pst.getWarnings(); |
||||
} |
||||
|
||||
@Override |
||||
public void clearWarnings() throws SQLException { |
||||
pst.clearWarnings(); |
||||
} |
||||
|
||||
@Override |
||||
public void setCursorName(String name) throws SQLException { |
||||
pst.setCursorName(name); |
||||
} |
||||
|
||||
@Override |
||||
public boolean execute(String sql) throws SQLException { |
||||
return pst.execute(sql); |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getResultSet() throws SQLException { |
||||
return pst.getResultSet(); |
||||
} |
||||
|
||||
@Override |
||||
public int getUpdateCount() throws SQLException { |
||||
return pst.getUpdateCount(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean getMoreResults() throws SQLException { |
||||
return pst.getMoreResults(); |
||||
} |
||||
|
||||
@Override |
||||
public void setFetchDirection(int direction) throws SQLException { |
||||
pst.setFetchDirection(direction); |
||||
} |
||||
|
||||
@Override |
||||
public int getFetchDirection() throws SQLException { |
||||
return pst.getFetchDirection(); |
||||
} |
||||
|
||||
@Override |
||||
public void setFetchSize(int rows) throws SQLException { |
||||
pst.setFetchSize(rows); |
||||
} |
||||
|
||||
@Override |
||||
public int getFetchSize() throws SQLException { |
||||
return pst.getFetchSize(); |
||||
} |
||||
|
||||
@Override |
||||
public int getResultSetConcurrency() throws SQLException { |
||||
return pst.getResultSetConcurrency(); |
||||
} |
||||
|
||||
@Override |
||||
public int getResultSetType() throws SQLException { |
||||
return pst.getResultSetType(); |
||||
} |
||||
|
||||
@Override |
||||
public void addBatch(String sql) throws SQLException { |
||||
pst.addBatch(sql); |
||||
} |
||||
|
||||
@Override |
||||
public void clearBatch() throws SQLException { |
||||
pst.clearBatch(); |
||||
} |
||||
|
||||
@Override |
||||
public int[] executeBatch() throws SQLException { |
||||
return pst.executeBatch(); |
||||
} |
||||
|
||||
@Override |
||||
public Connection getConnection() throws SQLException { |
||||
return pst.getConnection(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean getMoreResults(int current) throws SQLException { |
||||
return pst.getMoreResults(current); |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getGeneratedKeys() throws SQLException { |
||||
return pst.getGeneratedKeys(); |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { |
||||
return pst.executeUpdate(sql, autoGeneratedKeys); |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate(String sql, int[] columnIndexes) throws SQLException { |
||||
return pst.executeUpdate(sql, columnIndexes); |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate(String sql, String[] columnNames) throws SQLException { |
||||
return pst.executeUpdate(sql, columnNames); |
||||
} |
||||
|
||||
@Override |
||||
public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { |
||||
return pst.execute(sql, autoGeneratedKeys); |
||||
} |
||||
|
||||
@Override |
||||
public boolean execute(String sql, int[] columnIndexes) throws SQLException { |
||||
return pst.execute(sql, columnIndexes); |
||||
} |
||||
|
||||
@Override |
||||
public boolean execute(String sql, String[] columnNames) throws SQLException { |
||||
return pst.execute(sql, columnNames); |
||||
} |
||||
|
||||
@Override |
||||
public int getResultSetHoldability() throws SQLException { |
||||
return pst.getResultSetHoldability(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isClosed() throws SQLException { |
||||
return pst.isClosed(); |
||||
} |
||||
|
||||
@Override |
||||
public void setPoolable(boolean poolable) throws SQLException { |
||||
pst.setPoolable(poolable); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPoolable() throws SQLException { |
||||
return pst.isPoolable(); |
||||
} |
||||
|
||||
@Override |
||||
public void closeOnCompletion() throws SQLException { |
||||
pst.closeOnCompletion(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isCloseOnCompletion() throws SQLException { |
||||
return pst.isCloseOnCompletion(); |
||||
} |
||||
|
||||
@Override |
||||
public <T> T unwrap(Class<T> iface) throws SQLException { |
||||
return pst.unwrap(iface); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isWrapperFor(Class<?> iface) throws SQLException { |
||||
return pst.isWrapperFor(iface); |
||||
} |
||||
} |
@ -0,0 +1,237 @@
|
||||
package com.fanruan.jdbc.statement; |
||||
|
||||
import com.fanruan.jdbc.resultset.MyResultSet; |
||||
|
||||
import java.sql.*; |
||||
|
||||
public class MyStatement implements Statement { |
||||
|
||||
final private Statement st; |
||||
|
||||
|
||||
public MyStatement(Statement statement) { |
||||
this.st = statement; |
||||
} |
||||
|
||||
|
||||
//使用与 Service 同名的类保证数据库对应的 JDBC
|
||||
@Override |
||||
public ResultSet executeQuery(String sql) throws SQLException { |
||||
return new MyResultSet(st.executeQuery(sql)); |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate(String sql) throws SQLException { |
||||
return st.executeUpdate(sql); |
||||
} |
||||
|
||||
@Override |
||||
public void close() throws SQLException { |
||||
st.close(); |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxFieldSize() throws SQLException { |
||||
return st.getMaxFieldSize(); |
||||
} |
||||
|
||||
@Override |
||||
public void setMaxFieldSize(int max) throws SQLException { |
||||
st.setMaxFieldSize(max); |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxRows() throws SQLException { |
||||
return st.getMaxRows(); |
||||
} |
||||
|
||||
@Override |
||||
public void setMaxRows(int max) throws SQLException { |
||||
st.setMaxRows(max); |
||||
} |
||||
|
||||
@Override |
||||
public void setEscapeProcessing(boolean enable) throws SQLException { |
||||
st.setEscapeProcessing(enable); |
||||
} |
||||
|
||||
@Override |
||||
public int getQueryTimeout() throws SQLException { |
||||
return st.getQueryTimeout(); |
||||
} |
||||
|
||||
@Override |
||||
public void setQueryTimeout(int seconds) throws SQLException { |
||||
st.setQueryTimeout(seconds); |
||||
} |
||||
|
||||
@Override |
||||
public void cancel() throws SQLException { |
||||
st.cancel(); |
||||
} |
||||
|
||||
@Override |
||||
public SQLWarning getWarnings() throws SQLException { |
||||
return st.getWarnings(); |
||||
} |
||||
|
||||
@Override |
||||
public void clearWarnings() throws SQLException { |
||||
st.clearWarnings(); |
||||
} |
||||
|
||||
@Override |
||||
public void setCursorName(String name) throws SQLException { |
||||
st.setCursorName(name); |
||||
} |
||||
|
||||
@Override |
||||
public boolean execute(String sql) throws SQLException { |
||||
return st.execute(sql); |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getResultSet() throws SQLException { |
||||
return st.getResultSet(); |
||||
} |
||||
|
||||
@Override |
||||
public int getUpdateCount() throws SQLException { |
||||
return st.getUpdateCount(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean getMoreResults() throws SQLException { |
||||
return st.getMoreResults(); |
||||
} |
||||
|
||||
@Override |
||||
public void setFetchDirection(int direction) throws SQLException { |
||||
st.setFetchDirection(direction); |
||||
} |
||||
|
||||
@Override |
||||
public int getFetchDirection() throws SQLException { |
||||
return st.getFetchDirection(); |
||||
} |
||||
|
||||
@Override |
||||
public void setFetchSize(int rows) throws SQLException { |
||||
st.setFetchSize(rows); |
||||
} |
||||
|
||||
@Override |
||||
public int getFetchSize() throws SQLException { |
||||
return st.getFetchSize(); |
||||
} |
||||
|
||||
@Override |
||||
public int getResultSetConcurrency() throws SQLException { |
||||
return st.getResultSetConcurrency(); |
||||
} |
||||
|
||||
@Override |
||||
public int getResultSetType() throws SQLException { |
||||
return st.getResultSetType(); |
||||
} |
||||
|
||||
@Override |
||||
public void addBatch(String sql) throws SQLException { |
||||
st.addBatch(sql); |
||||
} |
||||
|
||||
@Override |
||||
public void clearBatch() throws SQLException { |
||||
st.clearBatch(); |
||||
} |
||||
|
||||
@Override |
||||
public int[] executeBatch() throws SQLException { |
||||
return st.executeBatch(); |
||||
} |
||||
|
||||
@Override |
||||
public Connection getConnection() throws SQLException { |
||||
return st.getConnection(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean getMoreResults(int current) throws SQLException { |
||||
return st.getMoreResults(current); |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getGeneratedKeys() throws SQLException { |
||||
return st.getGeneratedKeys(); |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { |
||||
return st.executeUpdate(sql, autoGeneratedKeys); |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate(String sql, int[] columnIndexes) throws SQLException { |
||||
return st.executeUpdate(sql, columnIndexes); |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate(String sql, String[] columnNames) throws SQLException { |
||||
return st.executeUpdate(sql, columnNames); |
||||
} |
||||
|
||||
@Override |
||||
public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { |
||||
return st.execute(sql, autoGeneratedKeys); |
||||
} |
||||
|
||||
@Override |
||||
public boolean execute(String sql, int[] columnIndexes) throws SQLException { |
||||
return st.execute(sql, columnIndexes); |
||||
} |
||||
|
||||
@Override |
||||
public boolean execute(String sql, String[] columnNames) throws SQLException { |
||||
return st.execute(sql, columnNames); |
||||
} |
||||
|
||||
@Override |
||||
public int getResultSetHoldability() throws SQLException { |
||||
return st.getResultSetHoldability(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isClosed() throws SQLException { |
||||
return st.isClosed(); |
||||
} |
||||
|
||||
@Override |
||||
public void setPoolable(boolean poolable) throws SQLException { |
||||
st.setPoolable(poolable); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isPoolable() throws SQLException { |
||||
return st.isPoolable(); |
||||
} |
||||
|
||||
@Override |
||||
public void closeOnCompletion() throws SQLException { |
||||
st.closeOnCompletion(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isCloseOnCompletion() throws SQLException { |
||||
return st.isCloseOnCompletion(); |
||||
} |
||||
|
||||
@Override |
||||
public <T> T unwrap(Class<T> iface) throws SQLException { |
||||
return st.unwrap(iface); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isWrapperFor(Class<?> iface) throws SQLException { |
||||
return st.isWrapperFor(iface); |
||||
} |
||||
} |
@ -0,0 +1,20 @@
|
||||
package com.fanruan.pojo.message; |
||||
|
||||
import lombok.Data; |
||||
import lombok.experimental.Accessors; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
@Data |
||||
@Accessors(chain = true) |
||||
public class RpcRequest { |
||||
private boolean reply; |
||||
private String ID; |
||||
private boolean binding; |
||||
private String IDToInvoke; |
||||
private Class<?> serviceClass; |
||||
private String methodName; |
||||
private Object[] args; |
||||
private Class<?>[] argTypes; |
||||
} |
@ -0,0 +1,19 @@
|
||||
package com.fanruan.pojo.message; |
||||
|
||||
import lombok.Data; |
||||
import lombok.experimental.Accessors; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
@Data |
||||
@Accessors(chain = true) |
||||
public class RpcResponse { |
||||
private String ID; |
||||
|
||||
private Object result; |
||||
|
||||
private boolean binding; |
||||
|
||||
private Boolean status; |
||||
} |
@ -0,0 +1,54 @@
|
||||
package com.fanruan.serializer; |
||||
|
||||
import com.esotericsoftware.kryo.Kryo; |
||||
import com.esotericsoftware.kryo.io.Input; |
||||
import com.esotericsoftware.kryo.io.Output; |
||||
import com.fanruan.pojo.message.RpcRequest; |
||||
import com.fanruan.pojo.message.RpcResponse; |
||||
|
||||
import java.io.ByteArrayInputStream; |
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.IOException; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class KryoSerializer implements Serializer { |
||||
|
||||
private static final ThreadLocal<Kryo> kryoThreadLocal = ThreadLocal.withInitial(() -> { |
||||
final Kryo kryo = new Kryo(); |
||||
kryo.register(RpcRequest.class); |
||||
kryo.register(RpcResponse.class); |
||||
kryo.setReferences(true); |
||||
kryo.setRegistrationRequired(false); |
||||
return kryo; |
||||
}); |
||||
|
||||
@Override |
||||
public byte[] serialize(Object object) { |
||||
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); |
||||
Output output = new Output(byteArrayOutputStream)) { |
||||
final Kryo kryo = kryoThreadLocal.get(); |
||||
kryo.writeObject(output, object); |
||||
kryoThreadLocal.remove(); |
||||
return output.toBytes(); |
||||
} catch (IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
return new byte[0]; |
||||
} |
||||
|
||||
@Override |
||||
public <T> T deserialize(byte[] bytes, Class<T> clazz) { |
||||
try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); |
||||
Input input = new Input(byteArrayInputStream)) { |
||||
final Kryo kryo = kryoThreadLocal.get(); |
||||
final Object o = kryo.readObject(input, clazz); |
||||
kryoThreadLocal.remove(); |
||||
return clazz.cast(o); |
||||
} catch (IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
return null; |
||||
} |
||||
} |
@ -0,0 +1,22 @@
|
||||
package com.fanruan.serializer; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public interface Serializer { |
||||
|
||||
/** |
||||
* Use to serialize a object to a byte array |
||||
* @param object to be serialized |
||||
* @return byte[] serialized data with the format of byte array |
||||
*/ |
||||
byte[] serialize(Object object); |
||||
|
||||
/** |
||||
* Use to deserialize a byte array to a class with designate class
|
||||
* @param bytes Serialized data with the format of byte array |
||||
* @param clazz The class of the object to be deserialized |
||||
* @return object as designate class
|
||||
*/ |
||||
<T> T deserialize(byte[] bytes, Class<T> clazz); |
||||
} |
@ -0,0 +1,20 @@
|
||||
package com.fanruan.utils; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class DBProperties { |
||||
public static final String MYSQL = "mysql"; |
||||
public static final String POSTGRESQL = "postgresql"; |
||||
public static final String ORACLE = "oracle"; |
||||
public static final String SQLSERVER = "sqlserver"; |
||||
public static final String DB2 = "db2"; |
||||
public static final String HSQL = "hsql"; |
||||
|
||||
public static final String MYSQL_DRIVER_NAME = "com.mysql.cj.jdbc.Driver"; |
||||
public static final String POSTGRESQL_DRIVER_NAME = "org.postgresql.Driver"; |
||||
public static final String ORACLE_DRIVER_NAME = "oracle.jdbc.driver.OracleDriver"; |
||||
public static final String SQLSERVER_DRIVER_NAME = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; |
||||
public static final String DB2_DRIVER_NAME = "com.ibm.db2.jdbc.app.DB2Driver"; |
||||
public static final String HSQL_DRIVER_NAME = "org.hsqldb.jdbcDriver"; |
||||
} |
@ -0,0 +1,10 @@
|
||||
# Console appender configuration |
||||
appender.console.type = Console |
||||
appender.console.name = STDOUT |
||||
appender.console.layout.type = PatternLayout |
||||
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n |
||||
|
||||
|
||||
rootLogger.level = debug |
||||
rootLogger.appenderRefs = stdout |
||||
rootLogger.appenderRef.stdout.ref = STDOUT |
@ -0,0 +1,14 @@
|
||||
# 服务器地址 |
||||
uri = http://127.0.0.1:10246 |
||||
|
||||
# 代理编号 |
||||
agentID = 1001 |
||||
|
||||
# 重连尝试次数 |
||||
reconnectionAttempts = 1 |
||||
|
||||
# 重连间隔事件 |
||||
reconnectionDelay = 1000 |
||||
|
||||
# 连接超时时间 |
||||
timeout = 500 |
@ -0,0 +1,100 @@
|
||||
import com.fanruan.utils.DBProperties; |
||||
import org.junit.jupiter.api.Assertions; |
||||
import org.junit.jupiter.api.BeforeEach; |
||||
import org.junit.jupiter.api.Test; |
||||
|
||||
import java.sql.*; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
* @date 2022/8/17 11:25 |
||||
*/ |
||||
public class HSQLTest { |
||||
|
||||
@BeforeEach |
||||
void startHSQL(){ |
||||
try { |
||||
Class.forName(DBProperties.HSQL_DRIVER_NAME); |
||||
Thread.sleep(1000); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
|
||||
@Test |
||||
void getConnection() throws SQLException { |
||||
Connection conn = null; |
||||
try { |
||||
conn = DriverManager.getConnection("jdbc:hsqldb:mem:test", "sa", ""); |
||||
Assertions.assertNotNull(conn, "can't get connection"); |
||||
} catch (SQLException e) { |
||||
e.printStackTrace(); |
||||
}finally { |
||||
conn.close(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* test to create statement instance and prepareStatement, create table, select form table, delete from table |
||||
*/ |
||||
@Test |
||||
void testCURD(){ |
||||
Connection conn = null; |
||||
Statement st = null; |
||||
PreparedStatement pst = null; |
||||
ResultSet rs = null; |
||||
try { |
||||
conn = DriverManager.getConnection("jdbc:hsqldb:mem:test", "sa", ""); |
||||
st = conn.createStatement(); |
||||
st.executeUpdate("DROP TABLE student IF EXISTS;"); |
||||
|
||||
st.executeUpdate("CREATE TABLE student (" + |
||||
"student_id INTEGER GENERATED BY DEFAULT AS IDENTITY " + |
||||
"(START WITH 1, INCREMENT BY 1) NOT NULL," + |
||||
"student_name VARCHAR(100) NOT NULL," + |
||||
"student_address VARCHAR(100) NOT NULL," + |
||||
"PRIMARY KEY (student_id)" + |
||||
");"); |
||||
|
||||
st.executeUpdate("INSERT INTO student VALUES" + |
||||
"(1, '张三', '上海')," + |
||||
"(2, '李四', '北京')," + |
||||
"(3, '王五', '成都');"); |
||||
|
||||
|
||||
|
||||
|
||||
pst = conn.prepareStatement("delete from student where student_id = ?"); |
||||
|
||||
pst.setInt(1, 1); |
||||
|
||||
pst.executeUpdate(); |
||||
|
||||
rs = st.executeQuery("select * from student"); |
||||
|
||||
String[] nameStrings = new String[]{"张三", "李四", "王五"}; |
||||
String[] addressStrings = new String[]{"上海", "北京", "成都"}; |
||||
|
||||
int num = 2; |
||||
while(rs.next()) { |
||||
Assertions.assertEquals(rs.getInt("student_id"), num); |
||||
Assertions.assertEquals(rs.getString("student_name"), nameStrings[num-1]); |
||||
Assertions.assertEquals(rs.getString("student_address"), addressStrings[num-1]); |
||||
num++; |
||||
} |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} finally { |
||||
try{ |
||||
rs.close(); |
||||
st.close(); |
||||
pst.close(); |
||||
conn.close(); |
||||
}catch (Exception e){ |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,37 @@
|
||||
import com.fanruan.AgentStarter; |
||||
import com.fanruan.utils.DBProperties; |
||||
import io.socket.client.Socket; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
|
||||
|
||||
public class Test { |
||||
|
||||
public static void main(String[] args){ |
||||
try{ |
||||
testStart(); |
||||
}catch(Exception e){ |
||||
e.printStackTrace(); |
||||
} |
||||
|
||||
} |
||||
|
||||
static void testStart() throws IOException, ClassNotFoundException { |
||||
Class.forName(DBProperties.HSQL_DRIVER_NAME); |
||||
String[] DBs = new String[]{ |
||||
DBProperties.HSQL, |
||||
}; |
||||
|
||||
new AgentStarter(DBs); |
||||
|
||||
Socket mainSocket = AgentStarter.myDispatcherImpl.CACHE.getSocket("/"); |
||||
mainSocket.connect(); |
||||
|
||||
Socket socket = AgentStarter.myDispatcherImpl.CACHE.getSocket(DBProperties.HSQL); |
||||
socket.connect(); |
||||
|
||||
|
||||
} |
||||
|
||||
} |
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
<modelVersion>4.0.0</modelVersion> |
||||
|
||||
<groupId>org.example</groupId> |
||||
<artifactId>intranet</artifactId> |
||||
<version>1.0-SNAPSHOT</version> |
||||
<modules> |
||||
<module>agent</module> |
||||
<module>service</module> |
||||
</modules> |
||||
<packaging>pom</packaging> |
||||
|
||||
<properties> |
||||
<maven.compiler.source>8</maven.compiler.source> |
||||
<maven.compiler.target>8</maven.compiler.target> |
||||
</properties> |
||||
|
||||
</project> |
@ -0,0 +1,82 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
<parent> |
||||
<artifactId>intranet</artifactId> |
||||
<groupId>org.example</groupId> |
||||
<version>1.0-SNAPSHOT</version> |
||||
</parent> |
||||
<modelVersion>4.0.0</modelVersion> |
||||
|
||||
<artifactId>service</artifactId> |
||||
|
||||
<properties> |
||||
<maven.compiler.source>8</maven.compiler.source> |
||||
<maven.compiler.target>8</maven.compiler.target> |
||||
</properties> |
||||
|
||||
<dependencies> |
||||
<dependency> |
||||
<groupId>com.corundumstudio.socketio</groupId> |
||||
<artifactId>netty-socketio</artifactId> |
||||
<version>1.7.19</version> |
||||
</dependency> |
||||
|
||||
<dependency> |
||||
<groupId>org.apache.logging.log4j</groupId> |
||||
<artifactId>log4j-api</artifactId> |
||||
<version>2.17.2</version> |
||||
</dependency> |
||||
|
||||
<dependency> |
||||
<groupId>org.apache.logging.log4j</groupId> |
||||
<artifactId>log4j-core</artifactId> |
||||
<version>2.17.2</version> |
||||
</dependency> |
||||
|
||||
|
||||
<dependency> |
||||
<groupId>org.apache.logging.log4j</groupId> |
||||
<artifactId>log4j-slf4j-impl</artifactId> |
||||
<version>2.17.2</version> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
|
||||
<dependency> |
||||
<groupId>com.google.guava</groupId> |
||||
<artifactId>guava</artifactId> |
||||
<version>31.1-jre</version> |
||||
</dependency> |
||||
|
||||
<!-- https://mvnrepository.com/artifact/cglib/cglib --> |
||||
<dependency> |
||||
<groupId>cglib</groupId> |
||||
<artifactId>cglib</artifactId> |
||||
<version>3.3.0</version> |
||||
</dependency> |
||||
|
||||
<!-- https://mvnrepository.com/artifact/com.esotericsoftware/kryo --> |
||||
<dependency> |
||||
<groupId>com.esotericsoftware</groupId> |
||||
<artifactId>kryo</artifactId> |
||||
<version>5.3.0</version> |
||||
</dependency> |
||||
|
||||
<dependency> |
||||
<groupId>org.projectlombok</groupId> |
||||
<artifactId>lombok</artifactId> |
||||
<version>1.18.22</version> |
||||
</dependency> |
||||
|
||||
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --> |
||||
<dependency> |
||||
<groupId>org.junit.jupiter</groupId> |
||||
<artifactId>junit-jupiter-engine</artifactId> |
||||
<version>5.4.0</version> |
||||
<scope>test</scope> |
||||
</dependency> |
||||
|
||||
|
||||
</dependencies> |
||||
</project> |
@ -0,0 +1,193 @@
|
||||
package com.fanruan; |
||||
|
||||
import com.corundumstudio.socketio.SocketConfig; |
||||
import com.corundumstudio.socketio.SocketIONamespace; |
||||
import com.corundumstudio.socketio.SocketIOServer; |
||||
import com.corundumstudio.socketio.Transport; |
||||
import com.fanruan.cache.ClientCache; |
||||
import com.fanruan.cache.ClientWrapper; |
||||
import com.fanruan.cache.LockAndCondition; |
||||
import com.fanruan.pojo.message.RpcResponse; |
||||
import com.fanruan.serializer.KryoSerializer; |
||||
import com.fanruan.serializer.Serializer; |
||||
import com.fanruan.utils.Commons; |
||||
import com.google.common.util.concurrent.ThreadFactoryBuilder; |
||||
import org.apache.logging.log4j.LogManager; |
||||
import org.apache.logging.log4j.Logger; |
||||
|
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.InputStreamReader; |
||||
import java.nio.charset.StandardCharsets; |
||||
import java.util.Properties; |
||||
import java.util.concurrent.ExecutorService; |
||||
import java.util.concurrent.LinkedBlockingQueue; |
||||
import java.util.concurrent.ThreadPoolExecutor; |
||||
import java.util.concurrent.TimeUnit; |
||||
import java.util.concurrent.locks.Condition; |
||||
import java.util.concurrent.locks.ReentrantLock; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class ServerStater{ |
||||
protected static final Logger logger = LogManager.getLogger(); |
||||
|
||||
public static final Serializer SERIALIZER = new KryoSerializer(); |
||||
|
||||
public static ExecutorService threadPool; |
||||
|
||||
public static SocketIOServer server; |
||||
|
||||
public static int workCount; |
||||
|
||||
|
||||
|
||||
public ServerStater(String[] dbs){ |
||||
try{ |
||||
loadConfig(); |
||||
for(String dbName : dbs){ |
||||
SocketIONamespace namespace = server.addNamespace("/" + dbName); |
||||
addEvent(namespace); |
||||
} |
||||
server.start(); |
||||
}catch (Exception e){ |
||||
e.printStackTrace(); |
||||
} |
||||
|
||||
} |
||||
|
||||
private void addEvent(SocketIONamespace nameSpace){ |
||||
logger.debug("配置事件监听"); |
||||
nameSpace.addConnectListener(client -> { |
||||
logger.info(nameSpace.getName() + "- socket connected!"); |
||||
String agentID = Commons.getAgentID(client); |
||||
|
||||
if(agentID == null){ |
||||
// 如果连接信息错误,发送异常信息,关闭socket
|
||||
logger.info("连接信息错误:agentID, 连接关闭"); |
||||
client.disconnect(); |
||||
} |
||||
|
||||
String dbName = Commons.getDBName(client); |
||||
// 缓存连接
|
||||
ClientCache.saveClient(agentID, dbName, client); |
||||
|
||||
}); |
||||
|
||||
// rpcResponse
|
||||
nameSpace.addEventListener("RPCResponse", byte[].class, ((client, data, ackRequest) -> { |
||||
RpcResponse rpcResponse = SERIALIZER.deserialize(data, RpcResponse.class); |
||||
logger.debug("RPCResponse: " + (rpcResponse.getStatus() ? "success" : "fail")); |
||||
|
||||
String agentID = Commons.getAgentID(client); |
||||
String dbName = Commons.getDBName(client); |
||||
ClientWrapper wrapper = ClientCache.getClientWrapper(agentID, dbName); |
||||
LockAndCondition lac = wrapper.getLockAndCondition(rpcResponse.getID()); |
||||
|
||||
ReentrantLock lock = lac.getLock(); |
||||
Condition condition = lac.getCondition(); |
||||
// When a response is received, it notifies that the FutureTask thread blocking on the LockAndCondition
|
||||
// If the response contains data, take it out.
|
||||
lock.lock(); |
||||
try { |
||||
Object resultData = rpcResponse.getResult(); |
||||
if(!rpcResponse.getStatus()){ |
||||
logger.error(resultData); |
||||
resultData = null; |
||||
} |
||||
if(resultData != null) { |
||||
lac.setResult(resultData); |
||||
} |
||||
condition.signal(); |
||||
}catch (Exception e){ |
||||
e.printStackTrace(); |
||||
}finally { |
||||
lock.unlock(); |
||||
} |
||||
wrapper.removeLockAndCondition(rpcResponse.getID()); |
||||
logger.debug("received response message, signaled condition"); |
||||
})); |
||||
|
||||
// 处理错误事件
|
||||
nameSpace.addEventListener("ErrorMessage", String.class, |
||||
((client, data, ackRequest) -> logger.info("Error: " + data) |
||||
)); |
||||
} |
||||
|
||||
private void loadConfig() throws IOException { |
||||
logger.debug("加载配置"); |
||||
SocketConfig socketConfig = new SocketConfig(); |
||||
|
||||
com.corundumstudio.socketio.Configuration config = |
||||
new com.corundumstudio.socketio.Configuration(); |
||||
|
||||
InputStream in = this.getClass().getResourceAsStream("/socketIO.properties"); |
||||
Properties props = new Properties(); |
||||
InputStreamReader inputStreamReader = new InputStreamReader(in, StandardCharsets.UTF_8); |
||||
props.load(inputStreamReader); |
||||
|
||||
int bossCount = Integer.parseInt(props.getProperty("bossCount")); |
||||
String host = props.getProperty("host"); |
||||
int port = Integer.parseInt(props.getProperty("port")); |
||||
workCount = Integer.parseInt(props.getProperty("workCount")); |
||||
boolean allowCustomRequests = Boolean.parseBoolean(props.getProperty("allowCustomRequests")); |
||||
int upgradeTimeout = Integer.parseInt(props.getProperty("upgradeTimeout")); |
||||
int pingTimeout = Integer.parseInt(props.getProperty("pingTimeout")); |
||||
int pingInterval = Integer.parseInt(props.getProperty("pingInterval")); |
||||
|
||||
config.setSocketConfig(socketConfig); |
||||
config.setHostname(host); |
||||
config.setPort(port); |
||||
config.setBossThreads(bossCount); |
||||
config.setWorkerThreads(workCount); |
||||
config.setAllowCustomRequests(allowCustomRequests); |
||||
config.setUpgradeTimeout(upgradeTimeout); |
||||
config.setPingTimeout(pingTimeout); |
||||
config.setPingInterval(pingInterval); |
||||
config.setTransports(Transport.WEBSOCKET); |
||||
in.close(); |
||||
|
||||
threadPool = new ThreadPoolExecutor( |
||||
0, workCount, |
||||
60L, TimeUnit.SECONDS, |
||||
new LinkedBlockingQueue<>(), |
||||
new ThreadFactoryBuilder().setNameFormat("Thread-for-FutureTask-%d").build() |
||||
); |
||||
server = new SocketIOServer(config); |
||||
|
||||
server.addConnectListener(client -> { |
||||
String agentID = Commons.getAgentID(client); |
||||
String dbName = Commons.getDBName(client); |
||||
if(agentID == null){ |
||||
// 如果连接信息错误,发送异常信息,关闭socket
|
||||
logger.info("连接信息错误:agentID, 连接关闭"); |
||||
client.disconnect(); |
||||
} |
||||
// 缓存连接
|
||||
ClientCache.saveClient(agentID, dbName, client); |
||||
}); |
||||
|
||||
// 添加客户端连接监听器
|
||||
server.addDisconnectListener(client -> { |
||||
String agentID = Commons.getAgentID(client); |
||||
String dbName = Commons.getDBName(client); |
||||
|
||||
if(agentID == null){ |
||||
// 如果连接信息错误,发送异常信息,关闭socket
|
||||
logger.info("agentID: 连接关闭"); |
||||
client.disconnect(); |
||||
} |
||||
|
||||
// 缓存连接
|
||||
ClientCache.deleteClient(agentID, dbName); |
||||
logger.info("agentID: " + agentID + "连接关闭"); |
||||
logger.info("agentID: " + agentID + "连接已删除"); |
||||
}); |
||||
|
||||
server.addEventListener("message", String.class, |
||||
((client, data, ackRequest) -> logger.info("message: " + data) |
||||
)); |
||||
} |
||||
} |
||||
|
@ -0,0 +1,69 @@
|
||||
package com.fanruan.cache; |
||||
|
||||
import com.corundumstudio.socketio.SocketIOClient; |
||||
import com.fanruan.ServerStater; |
||||
|
||||
import java.util.Map; |
||||
import java.util.concurrent.ConcurrentHashMap; |
||||
|
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class ClientCache { |
||||
|
||||
private static final Map<String, Map<String, ClientWrapper>> AGENT_MAP = new ConcurrentHashMap<>(); |
||||
|
||||
/** |
||||
* 缓存代理通道 |
||||
* @param agentID 代理名称 |
||||
* @param client 代理通道 |
||||
*/ |
||||
public static void saveClient(String agentID, String dbName, SocketIOClient client){ |
||||
Map<String, ClientWrapper> nameSpaceMap = AGENT_MAP.get(agentID); |
||||
if(nameSpaceMap == null){ |
||||
nameSpaceMap = new ConcurrentHashMap<>(ServerStater.workCount * 10); |
||||
AGENT_MAP.put(agentID, nameSpaceMap); |
||||
} |
||||
ClientWrapper wrapper = nameSpaceMap.get(dbName); |
||||
if(wrapper == null){ |
||||
wrapper = new ClientWrapper(); |
||||
nameSpaceMap.put(dbName, wrapper); |
||||
} |
||||
wrapper.setClient(client); |
||||
} |
||||
|
||||
public static SocketIOClient getClient(String agentID, String dbName){ |
||||
Map<String, ClientWrapper> map = AGENT_MAP.get(agentID); |
||||
if(map == null) { |
||||
return null; |
||||
} |
||||
ClientWrapper wrapper = map.get(dbName); |
||||
if(wrapper == null) { |
||||
return null; |
||||
} |
||||
return wrapper.getClient(); |
||||
} |
||||
|
||||
public static void deleteClient(String agentID, String dbName){ |
||||
Map<String, ClientWrapper> map = AGENT_MAP.get(agentID); |
||||
if(map == null) { |
||||
return; |
||||
} |
||||
map.remove(dbName); |
||||
|
||||
} |
||||
|
||||
|
||||
public static ClientWrapper getClientWrapper(String agentID, String dbName){ |
||||
Map<String, ClientWrapper> map = AGENT_MAP.get(agentID); |
||||
if(map == null) { |
||||
throw new RuntimeException("wrong agent ID"); |
||||
} |
||||
ClientWrapper wrapper = map.get(dbName); |
||||
if(wrapper == null) { |
||||
throw new RuntimeException("wrong dbName"); |
||||
} |
||||
return wrapper; |
||||
} |
||||
} |
@ -0,0 +1,45 @@
|
||||
package com.fanruan.cache; |
||||
|
||||
import com.corundumstudio.socketio.SocketIOClient; |
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Data; |
||||
import lombok.NoArgsConstructor; |
||||
|
||||
import java.util.Map; |
||||
import java.util.concurrent.ConcurrentHashMap; |
||||
import java.util.concurrent.locks.Condition; |
||||
import java.util.concurrent.locks.ReentrantLock; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
@Data |
||||
@AllArgsConstructor |
||||
@NoArgsConstructor |
||||
public class ClientWrapper { |
||||
private SocketIOClient client; |
||||
private static Map<String, LockAndCondition> lockMap = new ConcurrentHashMap<>(); |
||||
|
||||
|
||||
public SocketIOClient getClient(){ |
||||
if(client == null) { |
||||
throw new RuntimeException("no such client"); |
||||
} |
||||
return client; |
||||
} |
||||
|
||||
public LockAndCondition getLockAndCondition(String messageID){ |
||||
LockAndCondition lac = lockMap.get(messageID); |
||||
if(lac == null){ |
||||
ReentrantLock lock = new ReentrantLock(); |
||||
Condition condition = lock.newCondition(); |
||||
lac = new LockAndCondition(lock, condition); |
||||
lockMap.put(messageID, lac); |
||||
} |
||||
return lac; |
||||
} |
||||
|
||||
public void removeLockAndCondition(String messageID){ |
||||
lockMap.remove(messageID); |
||||
} |
||||
} |
@ -0,0 +1,26 @@
|
||||
package com.fanruan.cache; |
||||
|
||||
import lombok.AllArgsConstructor; |
||||
import lombok.Data; |
||||
import lombok.NoArgsConstructor; |
||||
|
||||
import java.util.concurrent.locks.Condition; |
||||
import java.util.concurrent.locks.ReentrantLock; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
@Data |
||||
@NoArgsConstructor |
||||
@AllArgsConstructor |
||||
public class LockAndCondition{ |
||||
private ReentrantLock lock; |
||||
private Condition condition; |
||||
private Object result; |
||||
private String BindingID; |
||||
|
||||
LockAndCondition(ReentrantLock lock, Condition condition){ |
||||
this.lock = lock; |
||||
this.condition = condition; |
||||
} |
||||
} |
@ -0,0 +1,891 @@
|
||||
package com.fanruan.jdbc; |
||||
|
||||
|
||||
import com.fanruan.jdbc.driver.MyDriver; |
||||
|
||||
import java.sql.Connection; |
||||
import java.sql.ResultSet; |
||||
import java.sql.RowIdLifetime; |
||||
import java.sql.SQLException; |
||||
|
||||
public class MyDataBaseMetaData implements java.sql.DatabaseMetaData{ |
||||
@Override |
||||
public boolean allProceduresAreCallable() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean allTablesAreSelectable() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public String getURL() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public String getUserName() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isReadOnly() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean nullsAreSortedHigh() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean nullsAreSortedLow() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean nullsAreSortedAtStart() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean nullsAreSortedAtEnd() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public String getDatabaseProductName() throws SQLException { |
||||
return "agent server 1.0.0"; |
||||
} |
||||
|
||||
@Override |
||||
public String getDatabaseProductVersion() throws SQLException { |
||||
return "1.0.0"; |
||||
} |
||||
|
||||
@Override |
||||
public String getDriverName() throws SQLException { |
||||
return "myDriver for Agent"; |
||||
} |
||||
|
||||
@Override |
||||
public String getDriverVersion() throws SQLException { |
||||
return "1.0.0"; |
||||
} |
||||
|
||||
@Override |
||||
public int getDriverMajorVersion() { |
||||
return MyDriver.DRIVER_VERSION_MAJOR; |
||||
} |
||||
|
||||
@Override |
||||
public int getDriverMinorVersion() { |
||||
return MyDriver.DRIVER_VERSION_MINOR; |
||||
} |
||||
|
||||
@Override |
||||
public boolean usesLocalFiles() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean usesLocalFilePerTable() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsMixedCaseIdentifiers() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean storesUpperCaseIdentifiers() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean storesLowerCaseIdentifiers() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean storesMixedCaseIdentifiers() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean storesUpperCaseQuotedIdentifiers() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean storesLowerCaseQuotedIdentifiers() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean storesMixedCaseQuotedIdentifiers() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public String getIdentifierQuoteString() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public String getSQLKeywords() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public String getNumericFunctions() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public String getStringFunctions() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public String getSystemFunctions() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public String getTimeDateFunctions() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public String getSearchStringEscape() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public String getExtraNameCharacters() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsAlterTableWithAddColumn() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsAlterTableWithDropColumn() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsColumnAliasing() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean nullPlusNonNullIsNull() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsConvert() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsConvert(int fromType, int toType) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsTableCorrelationNames() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsDifferentTableCorrelationNames() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsExpressionsInOrderBy() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsOrderByUnrelated() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsGroupBy() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsGroupByUnrelated() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsGroupByBeyondSelect() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsLikeEscapeClause() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsMultipleResultSets() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsMultipleTransactions() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsNonNullableColumns() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsMinimumSQLGrammar() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsCoreSQLGrammar() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsExtendedSQLGrammar() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsANSI92EntryLevelSQL() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsANSI92IntermediateSQL() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsANSI92FullSQL() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsIntegrityEnhancementFacility() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsOuterJoins() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsFullOuterJoins() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsLimitedOuterJoins() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public String getSchemaTerm() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public String getProcedureTerm() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public String getCatalogTerm() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isCatalogAtStart() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public String getCatalogSeparator() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsSchemasInDataManipulation() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsSchemasInProcedureCalls() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsSchemasInTableDefinitions() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsSchemasInIndexDefinitions() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsSchemasInPrivilegeDefinitions() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsCatalogsInDataManipulation() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsCatalogsInProcedureCalls() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsCatalogsInTableDefinitions() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsCatalogsInIndexDefinitions() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsCatalogsInPrivilegeDefinitions() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsPositionedDelete() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsPositionedUpdate() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsSelectForUpdate() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsStoredProcedures() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsSubqueriesInComparisons() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsSubqueriesInExists() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsSubqueriesInIns() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsSubqueriesInQuantifieds() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsCorrelatedSubqueries() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsUnion() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsUnionAll() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsOpenCursorsAcrossCommit() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsOpenCursorsAcrossRollback() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsOpenStatementsAcrossCommit() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsOpenStatementsAcrossRollback() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxBinaryLiteralLength() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxCharLiteralLength() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxColumnNameLength() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxColumnsInGroupBy() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxColumnsInIndex() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxColumnsInOrderBy() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxColumnsInSelect() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxColumnsInTable() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxConnections() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxCursorNameLength() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxIndexLength() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxSchemaNameLength() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxProcedureNameLength() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxCatalogNameLength() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxRowSize() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public boolean doesMaxRowSizeIncludeBlobs() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxStatementLength() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxStatements() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxTableNameLength() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxTablesInSelect() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getMaxUserNameLength() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getDefaultTransactionIsolation() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsTransactions() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsTransactionIsolationLevel(int level) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsDataDefinitionAndDataManipulationTransactions() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsDataManipulationTransactionsOnly() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean dataDefinitionCausesTransactionCommit() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean dataDefinitionIgnoredInTransactions() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getProcedureColumns(String catalog, String schemaPattern, String procedureNamePattern, String columnNamePattern) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getSchemas() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getCatalogs() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getTableTypes() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getColumnPrivileges(String catalog, String schema, String table, String columnNamePattern) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getTablePrivileges(String catalog, String schemaPattern, String tableNamePattern) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getBestRowIdentifier(String catalog, String schema, String table, int scope, boolean nullable) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getVersionColumns(String catalog, String schema, String table) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getImportedKeys(String catalog, String schema, String table) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getCrossReference(String parentCatalog, String parentSchema, String parentTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getTypeInfo() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getIndexInfo(String catalog, String schema, String table, boolean unique, boolean approximate) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsResultSetType(int type) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsResultSetConcurrency(int type, int concurrency) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean ownUpdatesAreVisible(int type) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean ownDeletesAreVisible(int type) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean ownInsertsAreVisible(int type) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean othersUpdatesAreVisible(int type) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean othersDeletesAreVisible(int type) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean othersInsertsAreVisible(int type) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean updatesAreDetected(int type) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean deletesAreDetected(int type) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean insertsAreDetected(int type) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsBatchUpdates() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getUDTs(String catalog, String schemaPattern, String typeNamePattern, int[] types) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Connection getConnection() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsSavepoints() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsNamedParameters() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsMultipleOpenResults() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsGetGeneratedKeys() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getSuperTypes(String catalog, String schemaPattern, String typeNamePattern) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getSuperTables(String catalog, String schemaPattern, String tableNamePattern) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getAttributes(String catalog, String schemaPattern, String typeNamePattern, String attributeNamePattern) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsResultSetHoldability(int holdability) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public int getResultSetHoldability() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getDatabaseMajorVersion() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getDatabaseMinorVersion() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getJDBCMajorVersion() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getJDBCMinorVersion() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getSQLStateType() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public boolean locatorsUpdateCopy() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsStatementPooling() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public RowIdLifetime getRowIdLifetime() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getSchemas(String catalog, String schemaPattern) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean supportsStoredFunctionsUsingCallSyntax() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean autoCommitFailureClosesAllResultSets() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getClientInfoProperties() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getFunctions(String catalog, String schemaPattern, String functionNamePattern) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getFunctionColumns(String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getPseudoColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean generatedKeyAlwaysReturned() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public <T> T unwrap(Class<T> iface) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isWrapperFor(Class<?> iface) throws SQLException { |
||||
return false; |
||||
} |
||||
} |
@ -0,0 +1,318 @@
|
||||
package com.fanruan.jdbc.connection; |
||||
|
||||
|
||||
import com.corundumstudio.socketio.SocketIOClient; |
||||
import com.fanruan.cache.ClientCache; |
||||
import com.fanruan.jdbc.MyDataBaseMetaData; |
||||
import com.fanruan.jdbc.statement.MyPreparedStatement; |
||||
import com.fanruan.jdbc.statement.MyStatement; |
||||
import com.fanruan.proxy.ProxyFactory; |
||||
|
||||
import java.sql.*; |
||||
import java.util.Map; |
||||
import java.util.Properties; |
||||
import java.util.concurrent.Executor; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class MyConnection implements Connection { |
||||
private String ID; |
||||
|
||||
private Properties info; |
||||
private boolean autoCommit = true; |
||||
SocketIOClient client; |
||||
|
||||
public MyConnection(){ |
||||
} |
||||
|
||||
public void setID(String ID){ |
||||
this.ID = ID; |
||||
} |
||||
|
||||
public String getID(){ |
||||
return this.ID; |
||||
} |
||||
|
||||
public void setInfo(Properties info){ |
||||
this.info = info; |
||||
client = ClientCache.getClient(info.getProperty("agentID"), info.getProperty("agentDBName")); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Statement createStatement(){ |
||||
MyStatement st = (MyStatement) ProxyFactory.getProxy(MyStatement.class, info); |
||||
st.setInfo(info); |
||||
return st; |
||||
} |
||||
|
||||
@Override |
||||
public PreparedStatement prepareStatement(String sql) throws SQLException { |
||||
MyPreparedStatement pst = (MyPreparedStatement) ProxyFactory.getProxy(MyPreparedStatement.class, info); |
||||
// 将需要准备的sql 加入 properties 中, 将用以标识生成的 ResultSet
|
||||
info.setProperty("PreparedSQL", sql); |
||||
pst.setInfo(info); |
||||
return pst; |
||||
} |
||||
|
||||
@Override |
||||
public CallableStatement prepareCall(String sql) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public String nativeSQL(String sql) throws SQLException { |
||||
return sql; |
||||
} |
||||
|
||||
@Override |
||||
public void setAutoCommit(boolean autoCommit) throws SQLException { |
||||
this.autoCommit = autoCommit; |
||||
} |
||||
|
||||
@Override |
||||
public boolean getAutoCommit() throws SQLException { |
||||
return autoCommit; |
||||
} |
||||
|
||||
@Override |
||||
public void commit() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void rollback() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void close() throws SQLException { |
||||
client.disconnect(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean isClosed() throws SQLException { |
||||
return client.isChannelOpen(); |
||||
} |
||||
|
||||
@Override |
||||
public DatabaseMetaData getMetaData() throws SQLException { |
||||
return new MyDataBaseMetaData(); |
||||
} |
||||
|
||||
@Override |
||||
public void setReadOnly(boolean readOnly) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public boolean isReadOnly() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void setCatalog(String catalog) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public String getCatalog() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void setTransactionIsolation(int level) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int getTransactionIsolation() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public SQLWarning getWarnings() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void clearWarnings() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Map<String, Class<?>> getTypeMap() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void setTypeMap(Map<String, Class<?>> map) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setHoldability(int holdability) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int getHoldability() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public Savepoint setSavepoint() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Savepoint setSavepoint(String name) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void rollback(Savepoint savepoint) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void releaseSavepoint(Savepoint savepoint) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Clob createClob() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Blob createBlob() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public NClob createNClob() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public SQLXML createSQLXML() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isValid(int timeout) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void setClientInfo(String name, String value) throws SQLClientInfoException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setClientInfo(Properties properties) throws SQLClientInfoException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public String getClientInfo(String name) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Properties getClientInfo() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Array createArrayOf(String typeName, Object[] elements) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Struct createStruct(String typeName, Object[] attributes) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void setSchema(String schema) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public String getSchema() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void abort(Executor executor) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int getNetworkTimeout() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public <T> T unwrap(Class<T> iface) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isWrapperFor(Class<?> iface) throws SQLException { |
||||
return false; |
||||
} |
||||
} |
@ -0,0 +1,84 @@
|
||||
package com.fanruan.jdbc.driver; |
||||
|
||||
import com.fanruan.jdbc.connection.MyConnection; |
||||
import com.fanruan.proxy.ProxyFactory; |
||||
|
||||
import java.sql.*; |
||||
import java.util.Properties; |
||||
import java.util.logging.Logger; |
||||
|
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class MyDriver implements Driver { |
||||
|
||||
static public final int DRIVER_VERSION_MAJOR = 1; |
||||
static public final int DRIVER_VERSION_MINOR = 1; |
||||
private String ID; |
||||
|
||||
//依靠静态函数块注册驱动
|
||||
static{ |
||||
try { |
||||
DriverManager.registerDriver((MyDriver) ProxyFactory.getProxy(MyDriver.class, null)); |
||||
} catch (Exception e) { |
||||
throw new RuntimeException("Can't register driver"); |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* These corresponding code is to make the format correct, because the getID() |
||||
* will be called, even if the filed is never not null. |
||||
* @return ID |
||||
*/ |
||||
public String getID(){ |
||||
return this.ID; |
||||
} |
||||
|
||||
public void setID(String ID){ |
||||
this.ID = ID; |
||||
} |
||||
|
||||
@Override |
||||
public Connection connect(String url, Properties info){ |
||||
String dbName = info.getProperty("agentDBName"); |
||||
if(dbName == null){ |
||||
dbName = url.split(":")[1]; |
||||
info.setProperty("agentDBName", dbName); |
||||
} |
||||
MyConnection myConn = (MyConnection) ProxyFactory.getProxy(MyConnection.class, info); |
||||
myConn.setInfo(info); |
||||
return myConn; |
||||
} |
||||
|
||||
@Override |
||||
public boolean acceptsURL(String url){ |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public DriverPropertyInfo[] getPropertyInfo(String url, Properties info){ |
||||
return new DriverPropertyInfo[0]; |
||||
} |
||||
|
||||
@Override |
||||
public int getMajorVersion() { |
||||
return DRIVER_VERSION_MAJOR; |
||||
} |
||||
|
||||
@Override |
||||
public int getMinorVersion() { |
||||
return DRIVER_VERSION_MINOR; |
||||
} |
||||
|
||||
@Override |
||||
public boolean jdbcCompliant() { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public Logger getParentLogger() throws SQLFeatureNotSupportedException { |
||||
return null; |
||||
} |
||||
} |
@ -0,0 +1,990 @@
|
||||
package com.fanruan.jdbc.resultset; |
||||
|
||||
|
||||
import java.io.InputStream; |
||||
import java.io.Reader; |
||||
import java.math.BigDecimal; |
||||
import java.net.URL; |
||||
import java.sql.*; |
||||
import java.util.Calendar; |
||||
import java.util.Map; |
||||
|
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class MyResultSet implements ResultSet { |
||||
|
||||
private String sql; |
||||
private String ID; |
||||
|
||||
public String getID(){ |
||||
return this.ID; |
||||
} |
||||
|
||||
public void setID(String ID){ |
||||
this.ID = ID; |
||||
} |
||||
|
||||
public void setSql(String sql){ |
||||
this.sql = sql; |
||||
} |
||||
|
||||
public String getSql(){ |
||||
return this.sql; |
||||
} |
||||
|
||||
@Override |
||||
public boolean next() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void close() throws SQLException { |
||||
} |
||||
|
||||
@Override |
||||
public boolean wasNull() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public String getString(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean getBoolean(int columnIndex) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public byte getByte(int columnIndex) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public short getShort(int columnIndex) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getInt(int columnIndex) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public long getLong(int columnIndex) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public float getFloat(int columnIndex) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public double getDouble(int columnIndex) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public byte[] getBytes(int columnIndex) throws SQLException { |
||||
return new byte[0]; |
||||
} |
||||
|
||||
@Override |
||||
public Date getDate(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Time getTime(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Timestamp getTimestamp(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public InputStream getAsciiStream(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public InputStream getUnicodeStream(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public InputStream getBinaryStream(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public String getString(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean getBoolean(String columnLabel) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public byte getByte(String columnLabel) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public short getShort(String columnLabel) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getInt(String columnLabel) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public long getLong(String columnLabel) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public float getFloat(String columnLabel) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public double getDouble(String columnLabel) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public BigDecimal getBigDecimal(String columnLabel, int scale) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public byte[] getBytes(String columnLabel) throws SQLException { |
||||
return new byte[0]; |
||||
} |
||||
|
||||
@Override |
||||
public Date getDate(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Time getTime(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Timestamp getTimestamp(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public InputStream getAsciiStream(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public InputStream getUnicodeStream(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public InputStream getBinaryStream(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public SQLWarning getWarnings() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void clearWarnings() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public String getCursorName() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSetMetaData getMetaData() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Object getObject(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Object getObject(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public int findColumn(String columnLabel) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public Reader getCharacterStream(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Reader getCharacterStream(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public BigDecimal getBigDecimal(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public BigDecimal getBigDecimal(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isBeforeFirst() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isAfterLast() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isFirst() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isLast() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void beforeFirst() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void afterLast() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public boolean first() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean last() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public int getRow() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public boolean absolute(int row) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean relative(int rows) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean previous() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void setFetchDirection(int direction) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int getFetchDirection() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public void setFetchSize(int rows) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int getFetchSize() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getType() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getConcurrency() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public boolean rowUpdated() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean rowInserted() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean rowDeleted() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void updateNull(int columnIndex) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBoolean(int columnIndex, boolean x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateByte(int columnIndex, byte x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateShort(int columnIndex, short x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateInt(int columnIndex, int x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateLong(int columnIndex, long x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateFloat(int columnIndex, float x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateDouble(int columnIndex, double x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateString(int columnIndex, String x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBytes(int columnIndex, byte[] x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateDate(int columnIndex, Date x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateTime(int columnIndex, Time x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateTimestamp(int columnIndex, Timestamp x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateAsciiStream(int columnIndex, InputStream x, int length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBinaryStream(int columnIndex, InputStream x, int length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateCharacterStream(int columnIndex, Reader x, int length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateObject(int columnIndex, Object x, int scaleOrLength) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateObject(int columnIndex, Object x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateNull(String columnLabel) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBoolean(String columnLabel, boolean x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateByte(String columnLabel, byte x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateShort(String columnLabel, short x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateInt(String columnLabel, int x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateLong(String columnLabel, long x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateFloat(String columnLabel, float x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateDouble(String columnLabel, double x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBigDecimal(String columnLabel, BigDecimal x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateString(String columnLabel, String x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBytes(String columnLabel, byte[] x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateDate(String columnLabel, Date x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateTime(String columnLabel, Time x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateTimestamp(String columnLabel, Timestamp x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateAsciiStream(String columnLabel, InputStream x, int length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBinaryStream(String columnLabel, InputStream x, int length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateCharacterStream(String columnLabel, Reader reader, int length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateObject(String columnLabel, Object x, int scaleOrLength) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateObject(String columnLabel, Object x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void insertRow() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateRow() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void deleteRow() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void refreshRow() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void cancelRowUpdates() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void moveToInsertRow() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void moveToCurrentRow() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public Statement getStatement() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Object getObject(int columnIndex, Map<String, Class<?>> map) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Ref getRef(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Blob getBlob(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Clob getClob(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Array getArray(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Object getObject(String columnLabel, Map<String, Class<?>> map) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Ref getRef(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Blob getBlob(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Clob getClob(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Array getArray(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Date getDate(int columnIndex, Calendar cal) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Date getDate(String columnLabel, Calendar cal) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Time getTime(int columnIndex, Calendar cal) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Time getTime(String columnLabel, Calendar cal) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Timestamp getTimestamp(String columnLabel, Calendar cal) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public URL getURL(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public URL getURL(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void updateRef(int columnIndex, Ref x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateRef(String columnLabel, Ref x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBlob(int columnIndex, Blob x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBlob(String columnLabel, Blob x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateClob(int columnIndex, Clob x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateClob(String columnLabel, Clob x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateArray(int columnIndex, Array x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateArray(String columnLabel, Array x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public RowId getRowId(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public RowId getRowId(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void updateRowId(int columnIndex, RowId x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateRowId(String columnLabel, RowId x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int getHoldability() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isClosed() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void updateNString(int columnIndex, String nString) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateNString(String columnLabel, String nString) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateNClob(int columnIndex, NClob nClob) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateNClob(String columnLabel, NClob nClob) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public NClob getNClob(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public NClob getNClob(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public SQLXML getSQLXML(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public SQLXML getSQLXML(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void updateSQLXML(int columnIndex, SQLXML xmlObject) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateSQLXML(String columnLabel, SQLXML xmlObject) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public String getNString(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public String getNString(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Reader getNCharacterStream(int columnIndex) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public Reader getNCharacterStream(String columnLabel) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void updateNCharacterStream(int columnIndex, Reader x, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateNCharacterStream(String columnLabel, Reader reader, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateAsciiStream(int columnIndex, InputStream x, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBinaryStream(int columnIndex, InputStream x, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateCharacterStream(int columnIndex, Reader x, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateAsciiStream(String columnLabel, InputStream x, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBinaryStream(String columnLabel, InputStream x, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateCharacterStream(String columnLabel, Reader reader, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBlob(int columnIndex, InputStream inputStream, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBlob(String columnLabel, InputStream inputStream, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateClob(int columnIndex, Reader reader, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateClob(String columnLabel, Reader reader, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateNClob(int columnIndex, Reader reader, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateNClob(String columnLabel, Reader reader, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateNCharacterStream(int columnIndex, Reader x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateNCharacterStream(String columnLabel, Reader reader) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateAsciiStream(int columnIndex, InputStream x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBinaryStream(int columnIndex, InputStream x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateCharacterStream(int columnIndex, Reader x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateAsciiStream(String columnLabel, InputStream x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBinaryStream(String columnLabel, InputStream x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateCharacterStream(String columnLabel, Reader reader) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBlob(int columnIndex, InputStream inputStream) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateBlob(String columnLabel, InputStream inputStream) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateClob(int columnIndex, Reader reader) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateClob(String columnLabel, Reader reader) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateNClob(int columnIndex, Reader reader) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void updateNClob(String columnLabel, Reader reader) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public <T> T getObject(int columnIndex, Class<T> type) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public <T> T getObject(String columnLabel, Class<T> type) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public <T> T unwrap(Class<T> iface) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isWrapperFor(Class<?> iface) throws SQLException { |
||||
return false; |
||||
} |
||||
} |
@ -0,0 +1,535 @@
|
||||
package com.fanruan.jdbc.statement; |
||||
|
||||
import com.fanruan.jdbc.resultset.MyResultSet; |
||||
import com.fanruan.proxy.ProxyFactory; |
||||
|
||||
import java.io.InputStream; |
||||
import java.io.Reader; |
||||
import java.math.BigDecimal; |
||||
import java.net.URL; |
||||
import java.sql.*; |
||||
import java.util.Calendar; |
||||
import java.util.Properties; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class MyPreparedStatement implements PreparedStatement { |
||||
|
||||
private Properties info; |
||||
|
||||
private String ID; |
||||
|
||||
public MyPreparedStatement() {} |
||||
|
||||
public String getID(){ |
||||
return this.ID; |
||||
} |
||||
|
||||
public void setID(String ID){ |
||||
this.ID = ID; |
||||
} |
||||
|
||||
public void setInfo(Properties info) {this.info = info;} |
||||
|
||||
|
||||
@Override |
||||
public ResultSet executeQuery() throws SQLException { |
||||
if(isClosed()) { |
||||
throw new SQLException("This Statement is closed."); |
||||
} |
||||
MyResultSet rs = (MyResultSet) ProxyFactory.getProxy(MyResultSet.class, info); |
||||
rs.setSql(info.getProperty("PreparedSQL")); |
||||
return rs; |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public void setNull(int parameterIndex, int sqlType) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setBoolean(int parameterIndex, boolean x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setByte(int parameterIndex, byte x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setShort(int parameterIndex, short x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setInt(int parameterIndex, int x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setLong(int parameterIndex, long x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setFloat(int parameterIndex, float x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setDouble(int parameterIndex, double x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setBigDecimal(int parameterIndex, BigDecimal x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setString(int parameterIndex, String x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setBytes(int parameterIndex, byte[] x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setDate(int parameterIndex, Date x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setTime(int parameterIndex, Time x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setAsciiStream(int parameterIndex, InputStream x, int length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setUnicodeStream(int parameterIndex, InputStream x, int length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setBinaryStream(int parameterIndex, InputStream x, int length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void clearParameters() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setObject(int parameterIndex, Object x, int targetSqlType) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setObject(int parameterIndex, Object x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public boolean execute() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void addBatch() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setCharacterStream(int parameterIndex, Reader reader, int length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setRef(int parameterIndex, Ref x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setBlob(int parameterIndex, Blob x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setClob(int parameterIndex, Clob x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setArray(int parameterIndex, Array x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public ResultSetMetaData getMetaData() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void setDate(int parameterIndex, Date x, Calendar cal) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setTimestamp(int parameterIndex, Timestamp x, Calendar cal) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setNull(int parameterIndex, int sqlType, String typeName) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setURL(int parameterIndex, URL x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public ParameterMetaData getParameterMetaData() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void setRowId(int parameterIndex, RowId x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setNString(int parameterIndex, String value) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setNClob(int parameterIndex, NClob value) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setClob(int parameterIndex, Reader reader, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setBlob(int parameterIndex, InputStream inputStream, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setNClob(int parameterIndex, Reader reader, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setSQLXML(int parameterIndex, SQLXML xmlObject) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setAsciiStream(int parameterIndex, InputStream x, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setBinaryStream(int parameterIndex, InputStream x, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setCharacterStream(int parameterIndex, Reader reader, long length) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setAsciiStream(int parameterIndex, InputStream x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setBinaryStream(int parameterIndex, InputStream x) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setCharacterStream(int parameterIndex, Reader reader) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setNCharacterStream(int parameterIndex, Reader value) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setClob(int parameterIndex, Reader reader) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setBlob(int parameterIndex, InputStream inputStream) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setNClob(int parameterIndex, Reader reader) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public ResultSet executeQuery(String sql) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate(String sql) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public void close() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int getMaxFieldSize() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public void setMaxFieldSize(int max) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int getMaxRows() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public void setMaxRows(int max) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setEscapeProcessing(boolean enable) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int getQueryTimeout() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public void setQueryTimeout(int seconds) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void cancel() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public SQLWarning getWarnings() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void clearWarnings() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setCursorName(String name) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public boolean execute(String sql) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getResultSet() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public int getUpdateCount() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public boolean getMoreResults() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void setFetchDirection(int direction) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int getFetchDirection() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public void setFetchSize(int rows) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int getFetchSize() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getResultSetConcurrency() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getResultSetType() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public void addBatch(String sql) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void clearBatch() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int[] executeBatch() throws SQLException { |
||||
return new int[0]; |
||||
} |
||||
|
||||
@Override |
||||
public Connection getConnection() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean getMoreResults(int current) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getGeneratedKeys() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate(String sql, int[] columnIndexes) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate(String sql, String[] columnNames) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean execute(String sql, int[] columnIndexes) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean execute(String sql, String[] columnNames) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public int getResultSetHoldability() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isClosed() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void setPoolable(boolean poolable) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public boolean isPoolable() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void closeOnCompletion() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public boolean isCloseOnCompletion() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public <T> T unwrap(Class<T> iface) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isWrapperFor(Class<?> iface) throws SQLException { |
||||
return false; |
||||
} |
||||
} |
@ -0,0 +1,252 @@
|
||||
package com.fanruan.jdbc.statement; |
||||
|
||||
import com.fanruan.jdbc.resultset.MyResultSet; |
||||
import com.fanruan.proxy.ProxyFactory; |
||||
|
||||
import java.sql.*; |
||||
import java.util.Properties; |
||||
|
||||
public class MyStatement implements Statement { |
||||
private Properties info; |
||||
|
||||
private String ID; |
||||
|
||||
public MyStatement() {} |
||||
|
||||
public String getID(){ |
||||
return this.ID; |
||||
} |
||||
|
||||
public void setID(String ID){ |
||||
this.ID = ID; |
||||
} |
||||
|
||||
public void setInfo(Properties info){ |
||||
this.info = info; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet executeQuery(String sql) throws SQLException { |
||||
if(isClosed()) { |
||||
throw new SQLException("This Statement is closed."); |
||||
} |
||||
MyResultSet rs = (MyResultSet) ProxyFactory.getProxy(MyResultSet.class, info); |
||||
rs.setSql(sql); |
||||
return rs; |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate(String sql) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public void close() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int getMaxFieldSize() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public void setMaxFieldSize(int max) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int getMaxRows() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public void setMaxRows(int max) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setEscapeProcessing(boolean enable) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int getQueryTimeout() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public void setQueryTimeout(int seconds) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void cancel() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public SQLWarning getWarnings() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void clearWarnings() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setCursorName(String name) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public boolean execute(String sql) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getResultSet() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public int getUpdateCount() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public boolean getMoreResults() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void setFetchDirection(int direction) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int getFetchDirection() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public void setFetchSize(int rows) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int getFetchSize() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getResultSetConcurrency() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int getResultSetType() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public void addBatch(String sql) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void clearBatch() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public int[] executeBatch() throws SQLException { |
||||
return new int[0]; |
||||
} |
||||
|
||||
@Override |
||||
public Connection getConnection() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean getMoreResults(int current) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public ResultSet getGeneratedKeys() throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate(String sql, int[] columnIndexes) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public int executeUpdate(String sql, String[] columnNames) throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean execute(String sql, int[] columnIndexes) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public boolean execute(String sql, String[] columnNames) throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public int getResultSetHoldability() throws SQLException { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isClosed() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void setPoolable(boolean poolable) throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public boolean isPoolable() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void closeOnCompletion() throws SQLException { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public boolean isCloseOnCompletion() throws SQLException { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public <T> T unwrap(Class<T> iface) throws SQLException { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isWrapperFor(Class<?> iface) throws SQLException { |
||||
return false; |
||||
} |
||||
} |
@ -0,0 +1,29 @@
|
||||
package com.fanruan.pojo.message; |
||||
|
||||
import lombok.Data; |
||||
import lombok.experimental.Accessors; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
@Data |
||||
@Accessors(chain = true) |
||||
public class RpcRequest { |
||||
/** |
||||
* Marks whether the method delivered need loopback data |
||||
*/ |
||||
private boolean reply; |
||||
|
||||
/** |
||||
* Marks whether the method will create an instance requeired to be cached. |
||||
* In the project, they are Drive( MyDriver ), Connection( MyConnection ), Statement( MyStatement ), |
||||
* PreparedStatement( MyPreparedStatement ), ResultSet( MyResult ). |
||||
*/ |
||||
private boolean binding; |
||||
private String ID; |
||||
private String IDToInvoke; |
||||
private Class serviceClass; |
||||
private String methodName; |
||||
private Object[] args; |
||||
private Class[] argTypes; |
||||
} |
@ -0,0 +1,21 @@
|
||||
package com.fanruan.pojo.message; |
||||
|
||||
import lombok.Data; |
||||
import lombok.experimental.Accessors; |
||||
|
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
@Data |
||||
@Accessors(chain = true) |
||||
public class RpcResponse { |
||||
|
||||
private String ID; |
||||
|
||||
private Object result; |
||||
|
||||
private boolean binding; |
||||
|
||||
private Boolean status; |
||||
} |
@ -0,0 +1,21 @@
|
||||
package com.fanruan.proxy; |
||||
|
||||
|
||||
import com.fanruan.proxy.interceptor.Interceptor; |
||||
import net.sf.cglib.proxy.Enhancer; |
||||
|
||||
import java.util.Properties; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class ProxyFactory { |
||||
|
||||
public static Object getProxy(Class<?> clazz, Properties info){ |
||||
final Enhancer enhancer = new Enhancer(); |
||||
enhancer.setClassLoader(clazz.getClassLoader()); |
||||
enhancer.setSuperclass(clazz); |
||||
enhancer.setCallback(new Interceptor(clazz, info)); |
||||
return enhancer.create(); |
||||
} |
||||
} |
@ -0,0 +1,146 @@
|
||||
package com.fanruan.proxy.interceptor; |
||||
|
||||
|
||||
import com.corundumstudio.socketio.SocketIOClient; |
||||
import com.fanruan.ServerStater; |
||||
import com.fanruan.cache.ClientCache; |
||||
import com.fanruan.cache.ClientWrapper; |
||||
import com.fanruan.cache.LockAndCondition; |
||||
import com.fanruan.pojo.message.RpcRequest; |
||||
import com.fanruan.utils.Commons; |
||||
import net.sf.cglib.proxy.MethodInterceptor; |
||||
import net.sf.cglib.proxy.MethodProxy; |
||||
import org.apache.logging.log4j.LogManager; |
||||
import org.apache.logging.log4j.Logger; |
||||
|
||||
import java.lang.reflect.Method; |
||||
import java.util.Properties; |
||||
import java.util.concurrent.FutureTask; |
||||
import java.util.concurrent.locks.Condition; |
||||
import java.util.concurrent.locks.ReentrantLock; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
* cglib enhenced method to relize RPC |
||||
* For example, when service execute query operation, |
||||
* the RPC request will send to notify agent to do the same things, |
||||
* like create connection and statement |
||||
*/ |
||||
public class Interceptor implements MethodInterceptor { |
||||
protected static final Logger logger = LogManager.getLogger(); |
||||
|
||||
private Class<?> clazz; |
||||
private SocketIOClient client; |
||||
private Properties info; |
||||
|
||||
public Interceptor(Class<?> clazz, Properties info){ |
||||
this.clazz = clazz; |
||||
this.info = info; |
||||
} |
||||
|
||||
@Override |
||||
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { |
||||
if(InterceptorUtils.isInExcludedList(method.getName())){ |
||||
return methodProxy.invokeSuper(o, objects); |
||||
} |
||||
// Parameters injection of class MyDriver's construction method will be delayed util the first "connect" method was intercepted
|
||||
// Because Driver Instance is registered on the DriverManager in the static code block,
|
||||
// in which, the parameters used to fetch socket in cache is hard to pass in.
|
||||
if(info == null){ |
||||
info = (Properties) objects[1]; |
||||
} |
||||
String agentId = info.getProperty("agentID"); |
||||
String dbName = info.getProperty("agentDBName"); |
||||
if(client == null){ |
||||
client = ClientCache.getClient(agentId, dbName); |
||||
} |
||||
|
||||
logger.debug("start invoke " + method.getName()); |
||||
|
||||
RpcRequest rpcRequest = new RpcRequest(); |
||||
rpcRequest.setReply(false) |
||||
.setBinding(false) |
||||
.setID(Commons.getID()) |
||||
.setServiceClass(clazz) |
||||
.setMethodName(method.getName()) |
||||
.setArgs(objects) |
||||
.setArgTypes(getArgTypes(objects)); |
||||
|
||||
// Set whether the rpcResponses of this rpcRequest need to carry return value
|
||||
if(o instanceof com.fanruan.jdbc.resultset.MyResultSet){ |
||||
boolean flag = InterceptorUtils.isInReplyList(method.getName()); |
||||
if(flag) { |
||||
rpcRequest.setReply(true); |
||||
} |
||||
} |
||||
|
||||
// Some instance need to be bound one-to-one, to make sure the operator happen in service
|
||||
// will be deliver to this specific corresponding instance.
|
||||
if(InterceptorUtils.isInBindList(o)){ |
||||
rpcRequest.setBinding(true); |
||||
} |
||||
|
||||
// IDtoInvoke is an unique ID to identify an one-to-one binding relation.
|
||||
// It comes from rpcRequest in which the instance in the agent is created.
|
||||
String idToInvoke = InterceptorUtils.getInvokeHelper(o, "getID", String.class); |
||||
if(idToInvoke != null){ |
||||
rpcRequest.setIDToInvoke(idToInvoke); |
||||
} |
||||
|
||||
FutureTask<Object> futureTask = new FutureTask<>( |
||||
() -> { |
||||
Object res = null; |
||||
ClientWrapper wrapper = ClientCache.getClientWrapper(agentId, dbName); |
||||
LockAndCondition lac = wrapper.getLockAndCondition(rpcRequest.getID()); |
||||
ReentrantLock lock = lac.getLock(); |
||||
Condition condition = lac.getCondition(); |
||||
lock.lock(); |
||||
try{ |
||||
byte[] bytes = ServerStater.SERIALIZER.serialize(rpcRequest); |
||||
client.sendEvent("RPCRequest", bytes); |
||||
condition.await(); |
||||
// get res from RPC response data
|
||||
res = lac.getResult(); |
||||
}catch (Exception e){ |
||||
e.printStackTrace(); |
||||
}finally { |
||||
lock.unlock(); |
||||
} |
||||
return res; |
||||
} |
||||
); |
||||
ServerStater.threadPool.submit(futureTask); |
||||
Object res = futureTask.get(); |
||||
|
||||
// res is not null, it indicates the response carries data.
|
||||
// if the type of res is primitive type, An error will occur when using cast(), just return them directly.
|
||||
// And the data carried by response will never be the instance need to be bound.
|
||||
if(res != null){ |
||||
if(InterceptorUtils.isWraps(res)){ |
||||
return res; |
||||
} |
||||
return res; |
||||
} |
||||
|
||||
|
||||
Object returnObj = methodProxy.invokeSuper(o, objects); |
||||
|
||||
// If the return instance is corresponding with another instance in agent, set the binding ID.
|
||||
if (InterceptorUtils.isInBindList(returnObj)){ |
||||
InterceptorUtils.setInvokeHelper(returnObj, "setID", rpcRequest.getID()); |
||||
} |
||||
|
||||
return returnObj; |
||||
} |
||||
|
||||
|
||||
|
||||
public Class<?>[] getArgTypes(Object[] objects){ |
||||
int n = objects.length; |
||||
Class<?>[] argTypes = new Class[n]; |
||||
for(int i=0; i<n; i++){ |
||||
argTypes[i] = objects[i].getClass(); |
||||
} |
||||
return argTypes; |
||||
} |
||||
} |
@ -0,0 +1,118 @@
|
||||
package com.fanruan.proxy.interceptor; |
||||
|
||||
import java.lang.reflect.Method; |
||||
import java.util.regex.Pattern; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class InterceptorUtils { |
||||
private static final String[] EXCLUDED_METHOD_LIST = new String[]{ |
||||
"toString", |
||||
"hashCode", |
||||
"setInfo", |
||||
"setSql", |
||||
"getSql", |
||||
"setID", |
||||
"getID" |
||||
}; |
||||
|
||||
private static final String[] NEED_REPLY_LIST = new String[]{ |
||||
"next", |
||||
}; |
||||
|
||||
private static final String[] WRAPPER_CLASS_LIST = new String[]{ |
||||
"Boolean", |
||||
"Integer", |
||||
"Double", |
||||
"Long", |
||||
"Character", |
||||
"Byte", |
||||
"Short", |
||||
"Float" |
||||
}; |
||||
|
||||
private final static String[] BIND_LIST = new String[]{ |
||||
".*MyDriver.*", |
||||
".*MyConnection.*", |
||||
".*MyStatement.*", |
||||
".*MyPreparedStatement.*", |
||||
".*MyResultSet.*", |
||||
}; |
||||
|
||||
public static boolean isInExcludedList(String methodName){ |
||||
for(String ex : EXCLUDED_METHOD_LIST){ |
||||
if(ex.equals(methodName)){ |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public static boolean isInReplyList(String methodName){ |
||||
String pattern = "get.*"; |
||||
boolean isMatch = Pattern.matches(pattern, methodName); |
||||
|
||||
for(String ex : NEED_REPLY_LIST){ |
||||
if(ex.equals(methodName)){ |
||||
return true; |
||||
} |
||||
} |
||||
return isMatch; |
||||
} |
||||
|
||||
public static boolean isWraps(Object o){ |
||||
for(String ex : WRAPPER_CLASS_LIST){ |
||||
if(ex.equals(getClassName(o.getClass().getName()))){ |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public static String getClassName(String fullyQualifiedClassName){ |
||||
String[] arr = fullyQualifiedClassName.split("\\."); |
||||
int n = arr.length; |
||||
if(n == 0) { |
||||
throw new RuntimeException("the class name invoked is wrong"); |
||||
} |
||||
return arr[n-1]; |
||||
} |
||||
|
||||
public static boolean isInBindList(Object o){ |
||||
if (o == null) { |
||||
return false; |
||||
} |
||||
return isInBindList(o.getClass().getName()); |
||||
} |
||||
|
||||
public static boolean isInBindList(String className){ |
||||
for(String pattern : BIND_LIST){ |
||||
if(Pattern.matches(pattern, className)){ |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public static void setInvokeHelper(Object o, String methodName, String ID){ |
||||
try { |
||||
Method method = o.getClass().getDeclaredMethod(methodName, String.class); |
||||
method.invoke(o, ID); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
|
||||
public static <T> T getInvokeHelper(Object o, String methodName, Class<?> T){ |
||||
try { |
||||
Method method = o.getClass().getDeclaredMethod(methodName); |
||||
T res = (T) method.invoke(o); |
||||
return res; |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,54 @@
|
||||
package com.fanruan.serializer; |
||||
|
||||
import com.esotericsoftware.kryo.Kryo; |
||||
import com.esotericsoftware.kryo.io.Input; |
||||
import com.esotericsoftware.kryo.io.Output; |
||||
import com.fanruan.pojo.message.RpcRequest; |
||||
import com.fanruan.pojo.message.RpcResponse; |
||||
|
||||
import java.io.ByteArrayInputStream; |
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.IOException; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class KryoSerializer implements Serializer { |
||||
|
||||
private static final ThreadLocal<Kryo> kryoThreadLocal = ThreadLocal.withInitial(() -> { |
||||
final Kryo kryo = new Kryo(); |
||||
kryo.register(RpcRequest.class); |
||||
kryo.register(RpcResponse.class); |
||||
kryo.setReferences(true); |
||||
kryo.setRegistrationRequired(false); |
||||
return kryo; |
||||
}); |
||||
|
||||
@Override |
||||
public byte[] serialize(Object object) { |
||||
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); |
||||
Output output = new Output(byteArrayOutputStream)) { |
||||
final Kryo kryo = kryoThreadLocal.get(); |
||||
kryo.writeObject(output, object); |
||||
kryoThreadLocal.remove(); |
||||
return output.toBytes(); |
||||
} catch (IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
return new byte[0]; |
||||
} |
||||
|
||||
@Override |
||||
public <T> T deserialize(byte[] bytes, Class<T> clazz) { |
||||
try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); |
||||
Input input = new Input(byteArrayInputStream)) { |
||||
final Kryo kryo = kryoThreadLocal.get(); |
||||
final Object o = kryo.readObject(input, clazz); |
||||
kryoThreadLocal.remove(); |
||||
return clazz.cast(o); |
||||
} catch (IOException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
return null; |
||||
} |
||||
} |
@ -0,0 +1,21 @@
|
||||
package com.fanruan.serializer; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public interface Serializer { |
||||
/** |
||||
* Use to serialize a object to a byte array |
||||
* @param object to be serialized |
||||
* @return byte[] serialized data with the format of byte array |
||||
*/ |
||||
byte[] serialize(Object object); |
||||
|
||||
/** |
||||
* Use to deserialize a byte array to a class with designate class
|
||||
* @param bytes Serialized data with the format of byte array |
||||
* @param clazz The class of the object to be deserialized |
||||
* @return object as designate class
|
||||
*/ |
||||
<T> T deserialize(byte[] bytes, Class<T> clazz); |
||||
} |
@ -0,0 +1,47 @@
|
||||
package com.fanruan.utils; |
||||
|
||||
import com.corundumstudio.socketio.SocketIOClient; |
||||
|
||||
import java.util.Calendar; |
||||
import java.util.Random; |
||||
|
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class Commons { |
||||
|
||||
static public String getAgentID(SocketIOClient client){ |
||||
return client.getHandshakeData().getSingleUrlParam("agentID"); |
||||
} |
||||
|
||||
static public String getDBName(SocketIOClient client){ |
||||
// the format of spaceNamed "/" + "dbName"
|
||||
// default name space named as "/"
|
||||
String spaceName = client.getNamespace().getName(); |
||||
String dbName; |
||||
if(spaceName.length() > 1) { |
||||
dbName = spaceName.substring(1); |
||||
}else{ |
||||
dbName = spaceName; |
||||
} |
||||
return dbName; |
||||
} |
||||
|
||||
public static String getID(){ |
||||
return getTimeInMillis() + getRandom(); |
||||
} |
||||
|
||||
public static String getTimeInMillis() { |
||||
long timeInMillis = Calendar.getInstance().getTimeInMillis(); |
||||
return timeInMillis+""; |
||||
} |
||||
|
||||
public static String getRandom() { |
||||
Random random = new Random(); |
||||
int nextInt = random.nextInt(9000000); |
||||
nextInt = nextInt + 1000000; |
||||
return nextInt+""; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,21 @@
|
||||
package com.fanruan.utils; |
||||
|
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
*/ |
||||
public class DBProperties { |
||||
public static final String MYSQL = "mysql"; |
||||
public static final String POSTGRESQL = "postgresql"; |
||||
public static final String ORACLE = "oracle"; |
||||
public static final String SQLSERVER = "sqlserver"; |
||||
public static final String DB2 = "db2"; |
||||
public static final String HSQL = "hsql"; |
||||
|
||||
public static final String MYSQL_DRIVER_NAME = "com.mysql.cj.jdbc.Driver"; |
||||
public static final String POSTGRESQL_DRIVER_NAME = "org.postgresql.Driver"; |
||||
public static final String ORACLE_DRIVER_NAME = "oracle.jdbc.driver.OracleDriver"; |
||||
public static final String SQLSERVER_DRIVER_NAME = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; |
||||
public static final String DB2_DRIVER_NAME = "com.ibm.db2.jdbc.app.DB2Driver"; |
||||
public static final String HSQL_DRIVER_NAME = "org.hsqldb.jdbcDriver"; |
||||
} |
@ -0,0 +1,11 @@
|
||||
|
||||
# Console appender configuration |
||||
appender.console.type = Console |
||||
appender.console.name = STDOUT |
||||
appender.console.layout.type = PatternLayout |
||||
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n |
||||
|
||||
|
||||
rootLogger.level = info |
||||
rootLogger.appenderRefs = stdout |
||||
rootLogger.appenderRef.stdout.ref = STDOUT |
@ -0,0 +1,23 @@
|
||||
#============================================================================ |
||||
# netty socket io setting |
||||
#============================================================================ |
||||
# host在本地测试可以设置为localhost或者本机IP,在Linux服务器跑可换成服务器IP |
||||
#监听的ip |
||||
host = 127.0.0.1 |
||||
#监听端口 |
||||
port = 10246 |
||||
# 设置最大每帧处理数据的长度,防止他人利用大数据来攻击服务器 |
||||
maxFramePayloadLength = 1048576 |
||||
# 设置http交互最大内容长度 |
||||
maxHttpContentLength = 1048576 |
||||
# socket连接数大小(如只监听一个端口boss线程组为1即可) |
||||
bossCount = 1 |
||||
workCount = 10 |
||||
allowCustomRequests = true |
||||
# 协议升级超时时间(毫秒),默认10秒。HTTP握手升级为ws协议超时时间 |
||||
upgradeTimeout = 1000000 |
||||
# Ping消息超时时间(毫秒),默认60秒,这个时间间隔内没有接收到心跳消息就会发送超时事件 |
||||
pingTimeout = 6000000 |
||||
# Ping消息间隔(毫秒),默认25秒。客户端向服务器发送一条心跳消息间隔 |
||||
pingInterval = 25000 |
||||
|
@ -0,0 +1,22 @@
|
||||
import com.fanruan.ServerStater; |
||||
import com.fanruan.utils.DBProperties; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
* @date 2022/8/18 9:54 |
||||
*/ |
||||
public class AutoStarter { |
||||
|
||||
static { |
||||
String[] DBs = new String[]{ |
||||
DBProperties.HSQL, |
||||
}; |
||||
new ServerStater(DBs); |
||||
|
||||
try { |
||||
Class.forName("com.fanruan.jdbc.driver.MyDriver"); |
||||
} catch (ClassNotFoundException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,105 @@
|
||||
import com.corundumstudio.socketio.SocketIOClient; |
||||
import com.corundumstudio.socketio.SocketIOServer; |
||||
import com.fanruan.cache.ClientCache; |
||||
import com.fanruan.utils.DBProperties; |
||||
import org.junit.jupiter.api.Assertions; |
||||
import org.junit.jupiter.api.BeforeEach; |
||||
import org.junit.jupiter.api.Test; |
||||
|
||||
import java.net.Socket; |
||||
import java.sql.*; |
||||
import java.util.Properties; |
||||
import java.util.concurrent.ExecutionException; |
||||
import java.util.concurrent.FutureTask; |
||||
|
||||
/** |
||||
* @author Yichen Dai |
||||
* @date 2022/8/18 9:49 |
||||
*/ |
||||
public class ServiceTest extends AutoStarter{ |
||||
|
||||
@BeforeEach |
||||
void listen() throws ExecutionException, InterruptedException { |
||||
FutureTask<SocketIOClient> ft = new FutureTask<>( |
||||
() -> { |
||||
while(ClientCache.getClient("1001", DBProperties.HSQL) == null){ |
||||
try { |
||||
Thread.sleep(100); |
||||
}catch (Exception e){ |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
return ClientCache.getClient("1001", DBProperties.HSQL); |
||||
} |
||||
); |
||||
ft.run(); |
||||
ft.get(); |
||||
|
||||
|
||||
} |
||||
|
||||
@Test |
||||
void testCURD(){ |
||||
Properties info = new Properties(); |
||||
info.setProperty("user", "sa"); |
||||
info.setProperty("password", ""); |
||||
info.setProperty("agentID", "1001"); |
||||
info.setProperty("agentDBName", DBProperties.HSQL); |
||||
|
||||
Connection conn = null; |
||||
Statement st = null; |
||||
PreparedStatement pst = null; |
||||
ResultSet rs = null; |
||||
try { |
||||
conn = DriverManager.getConnection("jdbc:hsqldb:mem:test", info); |
||||
st = conn.createStatement(); |
||||
st.executeUpdate("DROP TABLE student IF EXISTS;"); |
||||
|
||||
st.executeUpdate("CREATE TABLE student (" + |
||||
"student_id INTEGER GENERATED BY DEFAULT AS IDENTITY " + |
||||
"(START WITH 1, INCREMENT BY 1) NOT NULL," + |
||||
"student_name VARCHAR(100) NOT NULL," + |
||||
"student_address VARCHAR(100) NOT NULL," + |
||||
"PRIMARY KEY (student_id)" + |
||||
");"); |
||||
|
||||
st.executeUpdate("INSERT INTO student VALUES" + |
||||
"(1, '张三', '上海')," + |
||||
"(2, '李四', '北京')," + |
||||
"(3, '王五', '成都');"); |
||||
|
||||
|
||||
|
||||
|
||||
pst = conn.prepareStatement("delete from student where student_id = ?"); |
||||
|
||||
pst.setInt(1, 1); |
||||
|
||||
pst.executeUpdate(); |
||||
|
||||
rs = st.executeQuery("select * from student"); |
||||
|
||||
String[] nameStrings = new String[]{"张三", "李四", "王五"}; |
||||
String[] addressStrings = new String[]{"上海", "北京", "成都"}; |
||||
|
||||
int num = 2; |
||||
while(rs.next()) { |
||||
Assertions.assertEquals(rs.getInt("student_id"), num); |
||||
Assertions.assertEquals(rs.getString("student_name"), nameStrings[num-1]); |
||||
Assertions.assertEquals(rs.getString("student_address"), addressStrings[num-1]); |
||||
num++; |
||||
} |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} finally { |
||||
try{ |
||||
rs.close(); |
||||
st.close(); |
||||
pst.close(); |
||||
conn.close(); |
||||
}catch (Exception e){ |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,244 @@
|
||||
import com.fanruan.ServerStater; |
||||
import com.fanruan.cache.ClientCache; |
||||
import com.fanruan.utils.DBProperties; |
||||
|
||||
import java.sql.*; |
||||
import java.util.Properties; |
||||
import java.util.concurrent.ExecutorService; |
||||
import java.util.concurrent.Executors; |
||||
|
||||
|
||||
public class Test { |
||||
public static void main(String[] args) { |
||||
|
||||
Test test = new Test(); |
||||
|
||||
String[] DBs = new String[]{ |
||||
DBProperties.MYSQL, |
||||
DBProperties.POSTGRESQL, |
||||
// DBProperties.SQLSERVER,
|
||||
// DBProperties.DB2,
|
||||
// DBProperties.ORACLE
|
||||
}; |
||||
new ServerStater(DBs); |
||||
|
||||
ExecutorService threadPool = Executors.newSingleThreadExecutor(); |
||||
test.testPostSQL(threadPool); |
||||
test.testMySQL(threadPool); |
||||
|
||||
} |
||||
|
||||
public void testMySQL(ExecutorService threadPool){ |
||||
Thread thread = new Thread(() -> { |
||||
while(ClientCache.getClient("1001", "mysql") == null){ |
||||
try { |
||||
Thread.sleep(1000); |
||||
}catch (Exception e){ |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
Properties info = new Properties(); |
||||
info.setProperty("user", "root"); |
||||
info.setProperty("password", "850656"); |
||||
info.setProperty("agentID", "1001"); |
||||
info.setProperty("agentDBName", "mysql"); |
||||
|
||||
Connection conn = null; |
||||
Statement st = null; |
||||
PreparedStatement pst = null; |
||||
PreparedStatement pst2 = null; |
||||
ResultSet rs1 = null; |
||||
ResultSet rs2 = null; |
||||
ResultSet rs3 = null; |
||||
try { |
||||
Class.forName("com.fanruan.jdbc.driver.MyDriver"); |
||||
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", info); |
||||
st = conn.createStatement(); |
||||
rs1 = st.executeQuery("select * from `student`"); |
||||
|
||||
System.out.println("-----------"); |
||||
System.out.println("执行查询语句"); |
||||
while(rs1.next()) { |
||||
System.out.print(rs1.getInt("student_id") + " "); |
||||
System.out.print(rs1.getString("student_name")+ " "); |
||||
System.out.println(rs1.getString("student_address")+ " "); |
||||
} |
||||
|
||||
String sql = "select * from `student` where `student_name`= ?"; |
||||
pst = conn.prepareStatement(sql); |
||||
pst.setString(1, "张三"); |
||||
rs2 = pst.executeQuery(); |
||||
|
||||
System.out.println("-----------"); |
||||
System.out.println("执行预查询语句1"); |
||||
while(rs2.next()) { |
||||
System.out.print(rs2.getInt("student_id") + " "); |
||||
System.out.print(rs2.getString("student_name")+ " "); |
||||
System.out.println(rs2.getString("student_address")+ " "); |
||||
} |
||||
|
||||
sql = "select * from `student` where `student_address`= ?"; |
||||
pst2 = conn.prepareStatement(sql); |
||||
pst2.setString(1, "上海"); |
||||
rs3 = pst2.executeQuery(); |
||||
|
||||
System.out.println("-----------"); |
||||
System.out.println("执行预查询语句2"); |
||||
while(rs3.next()) { |
||||
System.out.print(rs3.getInt("student_id") + " "); |
||||
System.out.print(rs3.getString("student_name")+ " "); |
||||
System.out.println(rs3.getString("student_address")+ " "); |
||||
} |
||||
}catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} finally { |
||||
// 7、关闭对象,回收数据库资源
|
||||
if (rs1 != null) { //关闭结果集对象
|
||||
try { |
||||
rs1.close(); |
||||
} catch (SQLException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
if (rs2 != null) { //关闭结果集对象
|
||||
try { |
||||
rs2.close(); |
||||
} catch (SQLException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
if (st != null) { // 关闭数据库操作对象
|
||||
try { |
||||
st.close(); |
||||
} catch (SQLException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
if (pst != null) { // 关闭数据库操作对象
|
||||
try { |
||||
pst.close(); |
||||
} catch (SQLException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
if (conn != null) { // 关闭数据库连接对象
|
||||
try { |
||||
if (!conn.isClosed()) { |
||||
conn.close(); |
||||
} |
||||
} catch (SQLException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
} |
||||
}); |
||||
threadPool.execute(thread); |
||||
} |
||||
|
||||
public void testPostSQL(ExecutorService threadPool){ |
||||
Thread thread = new Thread(() -> { |
||||
while(ClientCache.getClient("1001", "postgresql") == null){ |
||||
try { |
||||
Thread.sleep(1000); |
||||
}catch (Exception e){ |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
Properties info = new Properties(); |
||||
info.setProperty("user", "postgres"); |
||||
info.setProperty("password", "850656"); |
||||
info.setProperty("agentID", "1001"); |
||||
info.setProperty("agentDBName", "postgresql"); |
||||
|
||||
Connection conn = null; |
||||
Statement st = null; |
||||
PreparedStatement pst = null; |
||||
PreparedStatement pst2 = null; |
||||
ResultSet rs1 = null; |
||||
ResultSet rs2 = null; |
||||
ResultSet rs3 = null; |
||||
try { |
||||
Class.forName("com.fanruan.jdbc.driver.MyDriver"); |
||||
conn = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/test", info); |
||||
st = conn.createStatement(); |
||||
rs1 = st.executeQuery("select * from student"); |
||||
|
||||
System.out.println("-----------"); |
||||
System.out.println("执行查询语句"); |
||||
while(rs1.next()) { |
||||
System.out.print(rs1.getInt("student_id") + " "); |
||||
System.out.print(rs1.getString("student_name")+ " "); |
||||
System.out.println(rs1.getString("student_address")+ " "); |
||||
} |
||||
|
||||
String sql = "select * from student where student_name= ?"; |
||||
pst = conn.prepareStatement(sql); |
||||
pst.setString(1, "张三"); |
||||
rs2 = pst.executeQuery(); |
||||
|
||||
System.out.println("-----------"); |
||||
System.out.println("执行预查询语句1"); |
||||
while(rs2.next()) { |
||||
System.out.print(rs2.getInt("student_id") + " "); |
||||
System.out.print(rs2.getString("student_name")+ " "); |
||||
System.out.println(rs2.getString("student_address")+ " "); |
||||
} |
||||
|
||||
sql = "select * from student where student_address = ?"; |
||||
pst2 = conn.prepareStatement(sql); |
||||
pst2.setString(1, "上海"); |
||||
rs3 = pst2.executeQuery(); |
||||
|
||||
System.out.println("-----------"); |
||||
System.out.println("执行预查询语句2"); |
||||
while(rs3.next()) { |
||||
System.out.print(rs3.getInt("student_id") + " "); |
||||
System.out.print(rs3.getString("student_name")+ " "); |
||||
System.out.println(rs3.getString("student_address")+ " "); |
||||
} |
||||
}catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} finally { |
||||
// 7、关闭对象,回收数据库资源
|
||||
if (rs1 != null) { //关闭结果集对象
|
||||
try { |
||||
rs1.close(); |
||||
} catch (SQLException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
if (rs2 != null) { //关闭结果集对象
|
||||
try { |
||||
rs2.close(); |
||||
} catch (SQLException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
if (st != null) { // 关闭数据库操作对象
|
||||
try { |
||||
st.close(); |
||||
} catch (SQLException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
if (pst != null) { // 关闭数据库操作对象
|
||||
try { |
||||
pst.close(); |
||||
} catch (SQLException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
if (conn != null) { // 关闭数据库连接对象
|
||||
try { |
||||
if (!conn.isClosed()) { |
||||
conn.close(); |
||||
} |
||||
} catch (SQLException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
} |
||||
}); |
||||
threadPool.execute(thread); |
||||
} |
||||
} |
Loading…
Reference in new issue