use of org.apache.calcite.avatica.HandlerImpl in project calcite by apache.
the class Driver method createHandler.
@Override
protected Handler createHandler() {
return new HandlerImpl() {
@Override
public void onConnectionInit(AvaticaConnection connection_) throws SQLException {
final CalciteConnectionImpl connection = (CalciteConnectionImpl) connection_;
super.onConnectionInit(connection);
final String model = model(connection);
if (model != null) {
try {
new ModelHandler(connection, model);
} catch (IOException e) {
throw new SQLException(e);
}
}
connection.init();
}
String model(CalciteConnectionImpl connection) {
String model = connection.config().model();
if (model != null) {
return model;
}
SchemaFactory schemaFactory = connection.config().schemaFactory(SchemaFactory.class, null);
final Properties info = connection.getProperties();
final String schemaName = Util.first(connection.config().schema(), "adhoc");
if (schemaFactory == null) {
final JsonSchema.Type schemaType = connection.config().schemaType();
if (schemaType != null) {
switch(schemaType) {
case JDBC:
schemaFactory = JdbcSchema.Factory.INSTANCE;
break;
case MAP:
schemaFactory = AbstractSchema.Factory.INSTANCE;
break;
}
}
}
if (schemaFactory != null) {
final JsonBuilder json = new JsonBuilder();
final Map<String, Object> root = json.map();
root.put("version", "1.0");
root.put("defaultSchema", schemaName);
final List<Object> schemaList = json.list();
root.put("schemas", schemaList);
final Map<String, Object> schema = json.map();
schemaList.add(schema);
schema.put("type", "custom");
schema.put("name", schemaName);
schema.put("factory", schemaFactory.getClass().getName());
final Map<String, Object> operandMap = json.map();
schema.put("operand", operandMap);
for (Map.Entry<String, String> entry : Util.toMap(info).entrySet()) {
if (entry.getKey().startsWith("schema.")) {
operandMap.put(entry.getKey().substring("schema.".length()), entry.getValue());
}
}
return "inline:" + json.toJsonString(root);
}
return null;
}
};
}
use of org.apache.calcite.avatica.HandlerImpl in project calcite by apache.
the class JdbcTest method testOnConnectionClose.
/**
* Tests {@link org.apache.calcite.avatica.Handler#onConnectionClose}
* and {@link org.apache.calcite.avatica.Handler#onStatementClose}.
*/
@Test
public void testOnConnectionClose() throws Exception {
final int[] closeCount = { 0 };
final int[] statementCloseCount = { 0 };
final HandlerImpl h = new HandlerImpl() {
@Override
public void onConnectionClose(AvaticaConnection connection) {
++closeCount[0];
throw new RuntimeException();
}
@Override
public void onStatementClose(AvaticaStatement statement) {
++statementCloseCount[0];
throw new RuntimeException();
}
};
try (final TryThreadLocal.Memo ignore = HandlerDriver.HANDLERS.push(h)) {
final HandlerDriver driver = new HandlerDriver();
CalciteConnection connection = (CalciteConnection) driver.connect("jdbc:calcite:", new Properties());
SchemaPlus rootSchema = connection.getRootSchema();
rootSchema.add("hr", new ReflectiveSchema(new HrSchema()));
connection.setSchema("hr");
final Statement statement = connection.createStatement();
final ResultSet resultSet = statement.executeQuery("select * from \"emps\"");
assertEquals(0, closeCount[0]);
assertEquals(0, statementCloseCount[0]);
resultSet.close();
try {
resultSet.next();
fail("resultSet.next() should throw SQLException when closed");
} catch (SQLException e) {
assertThat(e.getMessage(), containsString("next() called on closed cursor"));
}
assertEquals(0, closeCount[0]);
assertEquals(0, statementCloseCount[0]);
// Close statement. It throws SQLException, but statement is still closed.
try {
statement.close();
fail("expecting error");
} catch (SQLException e) {
// ok
}
assertEquals(0, closeCount[0]);
assertEquals(1, statementCloseCount[0]);
// Close connection. It throws SQLException, but connection is still closed.
try {
connection.close();
fail("expecting error");
} catch (SQLException e) {
// ok
}
assertEquals(1, closeCount[0]);
assertEquals(1, statementCloseCount[0]);
// Close a closed connection. Handler is not called again.
connection.close();
assertEquals(1, closeCount[0]);
assertEquals(1, statementCloseCount[0]);
}
}
Aggregations