use of io.vertx.mysqlclient.impl.codec.StreamMysqlCollector in project Mycat2 by MyCATApache.
the class RowSetQuery method runTextQuery.
public static PromiseInternal<SqlResult<Void>> runTextQuery(String curSql, MySQLClientSession mySQLClientSession, StreamMysqlCollector collectorArg) {
if (mySQLClientSession.getCurNIOHandler() != null) {
throw new IllegalArgumentException();
}
PromiseInternal<SqlResult<Void>> promise = VertxUtil.newPromise();
if (mySQLClientSession.getIOThread() == Thread.currentThread()) {
VertxMycatTextCollector<Object, Object> resultSetHandler = new VertxMycatTextCollector<Object, Object>((Collector) collectorArg);
if (LOGGER.isDebugEnabled()) {
if (curSql.startsWith("XA ROLLBACK")) {
LOGGER.debug("session id:{} sql:{}", mySQLClientSession.sessionId(), curSql, new Throwable());
}
LOGGER.debug("session id:{} sql:{}", mySQLClientSession.sessionId(), curSql);
}
resultSetHandler.request(mySQLClientSession, MySQLCommandType.COM_QUERY, curSql.getBytes(), new ResultSetCallBack<MySQLClientSession>() {
@Override
public void onFinishedSendException(Exception exception, Object sender, Object attr) {
MycatException mycatException = new MycatException(MySQLErrorCode.ER_UNKNOWN_ERROR, exception.getMessage());
LOGGER.error("session id:{} sql:{}", mySQLClientSession.sessionId(), curSql, mycatException);
promise.tryFail(mycatException);
}
@Override
public void onFinishedException(Exception exception, Object sender, Object attr) {
MycatException mycatException = new MycatException(MySQLErrorCode.ER_UNKNOWN_ERROR, exception.getMessage());
LOGGER.error("session id:{} sql:{}", mySQLClientSession.sessionId(), curSql, mycatException);
promise.tryFail(mycatException);
}
@Override
public void onFinished(boolean monopolize, MySQLClientSession mysql, Object sender, Object attr) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("onFinished session id:{} sql:{}", mySQLClientSession.sessionId(), curSql);
}
MySqlResult<Void> mySqlResult = new MySqlResult<>(resultSetHandler.getRowCount(), resultSetHandler.getAffectedRows(), resultSetHandler.getLastInsertId(), null, Optional.ofNullable(resultSetHandler.getRowResultDecoder()).map(i -> i.rowDesc).map(i -> i.columnDescriptor()).orElse(Collections.emptyList()));
promise.complete(mySqlResult);
}
@Override
public void onErrorPacket(ErrorPacketImpl errorPacket, boolean monopolize, MySQLClientSession mysql, Object sender, Object attr) {
MycatException mycatException = new MycatException(errorPacket.getErrorCode(), errorPacket.getErrorMessageString());
LOGGER.error("onErrorPacket session id:{} sql:{}", mySQLClientSession.sessionId(), curSql, mycatException);
promise.tryFail(mycatException);
}
});
} else {
mySQLClientSession.getIOThread().addNIOJob(new NIOJob() {
@Override
public void run(ReactorEnvThread reactor) throws Exception {
if (LOGGER.isDebugEnabled()) {
LOGGER.error("nio job session id:{} sql:{}", mySQLClientSession.sessionId(), curSql, new Throwable());
}
runTextQuery(curSql, mySQLClientSession, collectorArg).onComplete(promise);
}
@Override
public void stop(ReactorEnvThread reactor, Exception reason) {
promise.tryFail(reason);
}
@Override
public String message() {
return "proxy query text result set";
}
});
}
return promise;
}
use of io.vertx.mysqlclient.impl.codec.StreamMysqlCollector in project Mycat2 by MyCATApache.
the class RowSetJdbcPreparedJdbcQuery method extracted.
public static <R> void extracted(Promise<SqlResult<R>> promise, Statement statement, ResultSet resultSet, Collector<Row, ?, R> collector) throws SQLException {
try {
if (resultSet == null) {
Object o = collector.supplier().get();
Function<Object, Object> finisher = (Function) collector.finisher();
promise.complete(new MySqlResult<>(0, 0, 0, (R) finisher.apply(o), Collections.emptyList()));
return;
}
JdbcRowMetaData metaData = new JdbcRowMetaData(resultSet.getMetaData());
int columnCount = metaData.getColumnCount();
List<ColumnDescriptor> columnDescriptors = new ArrayList<>();
for (int i = 0; i < columnCount; i++) {
int index = i;
columnDescriptors.add(new ColumnDescriptor() {
@Override
public String name() {
return metaData.getColumnName(index);
}
@Override
public boolean isArray() {
return false;
}
@Override
public String typeName() {
return null;
}
@Override
public JDBCType jdbcType() {
return JDBCType.valueOf(metaData.getColumnType(index));
}
});
}
RowDesc rowDesc = new RowDesc(metaData.getColumnList(), columnDescriptors);
ColumnDefPacket[] columnDefPackets = new ColumnDefPacket[columnCount];
for (int i = 0; i < columnCount; i++) {
columnDefPackets[i] = new ColumnDefPacketImpl(metaData, i);
}
if (collector instanceof StreamMysqlCollector) {
MySQLRowDesc mySQLRowDesc = new MySQLRowDesc(Arrays.asList(columnDefPackets).stream().map(packet -> {
String catalog = new String(packet.getColumnCatalog());
String schema = new String(packet.getColumnSchema());
String table = new String(packet.getColumnTable());
String orgTable = new String(packet.getColumnOrgTable());
String name = new String(packet.getColumnName());
String orgName = new String(packet.getColumnOrgName());
int characterSet = packet.getColumnCharsetSet();
long columnLength = packet.getColumnLength();
DataType type = DataType.valueOf(packet.getColumnType() == 15 ? 253 : packet.getColumnType());
int flags = packet.getColumnFlags();
byte decimals = packet.getColumnDecimals();
ColumnDefinition columnDefinition = new ColumnDefinition(catalog, schema, table, orgTable, name, orgName, characterSet, columnLength, type, flags, decimals);
return columnDefinition;
}).toArray(n -> new ColumnDefinition[n]), DataFormat.TEXT);
((StreamMysqlCollector) collector).onColumnDefinitions(mySQLRowDesc);
}
{
Object supplier = collector.supplier().get();
BiConsumer<Object, Row> accumulator = (BiConsumer) collector.accumulator();
Function<Object, Object> finisher = (Function) collector.finisher();
int count = 0;
while (resultSet.next()) {
JDBCRow jdbcRow = new MycatRow(rowDesc);
for (int i = 0; i < columnCount; i++) {
jdbcRow.addValue(resultSet.getObject(i + 1));
}
count++;
accumulator.accept(supplier, jdbcRow);
}
finisher.apply(supplier);
resultSet.close();
statement.close();
promise.complete(new MySqlResult<>(count, 0, 0, (R) supplier, columnDescriptors));
}
} catch (Throwable throwable) {
promise.tryFail(throwable);
}
}
use of io.vertx.mysqlclient.impl.codec.StreamMysqlCollector in project Mycat2 by MyCATApache.
the class RowSetQuery method execute.
@Override
public Future<RowSet<Row>> execute() {
VertxRowSetImpl vertxRowSet = new VertxRowSetImpl();
StreamMysqlCollector streamMysqlCollector = new StreamMysqlCollector() {
@Override
public void onColumnDefinitions(MySQLRowDesc columnDefinitions) {
vertxRowSet.setColumnDescriptor(columnDefinitions.columnDescriptor());
}
@Override
public void onRow(Row row) {
vertxRowSet.list.add(row);
}
};
return runTextQuery(sql, mySQLClientSession.mySQLClientSession, streamMysqlCollector).map(voidSqlResult -> {
vertxRowSet.setAffectRow(voidSqlResult.rowCount());
vertxRowSet.setLastInsertId(voidSqlResult.property(MySQLClient.LAST_INSERTED_ID));
return vertxRowSet;
});
}
use of io.vertx.mysqlclient.impl.codec.StreamMysqlCollector in project Mycat2 by MyCATApache.
the class VertxMycatTextCollector method onColumnDefEof.
@Override
public void onColumnDefEof(MySQLPacket mySQLPacket, int startPos, int endPos) {
rowResultDecoder = new MycatVertxRowResultDecoder(collector, new MySQLRowDesc(currentColumnDefList, DataFormat.TEXT));
this.c = collector.supplier().get();
this.accumulator = collector.accumulator();
if (collector instanceof StreamMysqlCollector) {
MySQLRowDesc mySQLRowDesc = new MySQLRowDesc(this.currentColumnDefList, DataFormat.TEXT);
((StreamMysqlCollector) collector).onColumnDefinitions(mySQLRowDesc);
}
}
Aggregations