2017-10-17 94 views
1

我已经使用方解石帮助构建了我的自定义方案。现在我想通过servlet公开它并通过Avatica连接到它。我使用的是servlet,因为我的容器是JIRA。这里是一些servlet的相关代码通过自定义servlet公开基于方解石的数据库通过Avatica公开的方法

public class JDBCServlet extends HttpServlet { 

private final Service service; 
private final ProtobufHandler pbHandler; 
private final ProtobufTranslation protobufTranslation; 
private final MetricsSystem metrics; 

final ThreadLocal<UnsynchronizedBuffer> threadLocalBuffer; 

public JDBCServlet(LocalDBProvider provider) { 
    this.service = provider.service(); 
    this.metrics = provider.metrics(); 
    this.protobufTranslation = new ProtobufTranslationImpl(); 
    this.pbHandler = new ProtobufHandler(service, protobufTranslation, metrics); 
    this.threadLocalBuffer = new ThreadLocal<UnsynchronizedBuffer>() { 
     @Override 
     public UnsynchronizedBuffer initialValue() { 
      return new UnsynchronizedBuffer(); 
     } 
    }; 
} 

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    System.out.println("DO GET DO GET"); 
    doPost(req, resp); 
} 

@Override 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    System.out.println("DO POST DO POST"); 
    response.setContentType("application/octet-stream;charset=utf-8"); 
    response.setStatus(HttpServletResponse.SC_OK); 
    final byte[] requestBytes; 
    // Avoid a new buffer creation for every HTTP request 
    final UnsynchronizedBuffer buffer = threadLocalBuffer.get(); 
    try (ServletInputStream inputStream = request.getInputStream()) { 
     requestBytes = AvaticaUtils.readFullyToBytes(inputStream, buffer); 
    } finally { 
     buffer.reset(); 
    } 

    Handler.HandlerResponse<byte[]> handlerResponse; 
    try { 
     handlerResponse = pbHandler.apply(requestBytes); 
    } catch (Exception e) { 
     handlerResponse = pbHandler.convertToErrorResponse(e); 
    } 
    response.setStatus(handlerResponse.getStatusCode()); 
    response.getOutputStream().write(handlerResponse.getResponse()); 
    response.getOutputStream().close(); 
} 
} 

代码是基于AvaticaProtobufHandler withouth Jet相关的东西。

服务使用本地服务和CalciteConnection与我的自定义模式内置:

new LocalService(DRIVER.createMeta((AvaticaConnection) bootstrap.getConnection())); 

当松鼠连接(与avatica罐子:)网址为: JDBC:avatica:远程:URL = http://127.0.0.1:2990/jira/plugins/servlet/smartqljdbctest;serialization=PROTOBUF

几个HTTP POST请求与驱动程序握手,但Meta.toProto()方法中的所有内容都失败:

} else { 
     // Can a "row" be a primitive? A struct? Only an Array? 
     throw new RuntimeException("Only arrays are supported"); 
    } 

我假设我已经错误地引导了servlet,但不知道为什么?

回答

0

搞乱了方解石我已经设法处理这从Evatica服务器示例使用JDBCMeta。

从我以前的解决方案中,我认为基于CalciteConnection的驱动程序生成的Meta与avatica LocalService实现不兼容。