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?