2017-10-17 1 views
1

Ich habe mein eigenes Schema mit Hilfe von Calcit gebaut. Jetzt möchte ich es über Servlet verfügbar machen und mit Avatica verbinden. Ich benutze Servlet, weil mein Container JIRA ist. Hier sind einige relevante Code von ServletExpose Calcit basierte db durch Avatica von benutzerdefinierten Servlet

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(); 
} 
} 

-Code auf AvaticaProtobufHandler withouth Jetty bezogenes basiert.

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

Wenn mit Eichhörnchen Anschluss (mit avatica Gläsern :) mit url:

Dienst wird mit LocalService- und CalciteConnection mit meinem benutzerdefinierten Schema gebaut jdbc: avatica: remote: url = http://127.0.0.1:2990/jira/plugins/servlet/smartqljdbctest;serialization=PROTOBUF

ein paar HTTP-POST-Anforderung wird mit dem Fahrer mit Handshake aber die ganzen Dinge nicht auf Meta.toProto() -Methode:

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

Ich nehme an, dass ich das Servlet falsch eingelesen habe, weiß aber nicht warum?

Antwort

0

Nach dem Durcheinander mit Calcit habe ich es geschafft, dies mit JDBCMeta von Evatica Server Beispiel zu behandeln.

Von meiner vorherigen Lösung denke ich, dass Meta von einem auf CalciteConnection basierenden Treiber nicht kompatibel mit Avatica LocalService-Implementierung ist.

Verwandte Themen