Search in sources :

Example 11 with RowSet

use of io.mycat.newquery.RowSet in project Mycat2 by MyCATApache.

the class BaseSavepointSuite method baseSavepointRollbackInSingleConnection.

@Test
@SneakyThrows
public void baseSavepointRollbackInSingleConnection(VertxTestContext testContext) {
    mySQLManager.getConnection("ds1").flatMap(connection -> {
        return connection.update("delete FROM `db1`.`travelrecord`").map(u -> connection);
    }).flatMap(c -> c.close()).toCompletionStage().toCompletableFuture().get();
    XaSqlConnection baseXaSqlConnection = factory.apply(mySQLManager, xaLog);
    Assert.assertTrue(baseXaSqlConnection instanceof SavepointSqlConnection);
    SavepointSqlConnection savepointSqlConnection = (SavepointSqlConnection) baseXaSqlConnection;
    baseXaSqlConnection.begin().onComplete(new Handler<AsyncResult<Void>>() {

        @Override
        @SneakyThrows
        public void handle(AsyncResult<Void> event) {
            savepointSqlConnection.createSavepoint("sss").toCompletionStage().toCompletableFuture().get();
            NewMycatConnection ds1 = savepointSqlConnection.getConnection("ds1").toCompletionStage().toCompletableFuture().get();
            ds1.insert("insert into `db1`.`travelrecord` (`id`) values ('2')").toCompletionStage().toCompletableFuture().get();
            RowSet objects = ds1.query("select * from `db1`.`travelrecord` where id = 2").toCompletionStage().toCompletableFuture().get();
            Assert.assertTrue(objects.size() > 0);
            Assert.assertEquals("[sss]", savepointSqlConnection.getExistedSavepoints().toString());
            savepointSqlConnection.rollback().toCompletionStage().toCompletableFuture().get();
            Assert.assertEquals("[]", savepointSqlConnection.getExistedSavepoints().toString());
            ds1 = savepointSqlConnection.getConnection("ds1").toCompletionStage().toCompletableFuture().get();
            objects = ds1.query("select * from `db1`.`travelrecord` where id = 2").toCompletionStage().toCompletableFuture().get();
            Assert.assertTrue(objects.size() == 0);
            savepointSqlConnection.close();
            testContext.completeNow();
        }
    });
}
Also used : VertxTestContext(io.vertx.junit5.VertxTestContext) NewMycatConnection(io.mycat.newquery.NewMycatConnection) SneakyThrows(lombok.SneakyThrows) RowSet(io.mycat.newquery.RowSet) BiFunction(java.util.function.BiFunction) XaLog(cn.mycat.vertx.xa.XaLog) Future(io.vertx.core.Future) Test(org.junit.jupiter.api.Test) XaSqlConnection(cn.mycat.vertx.xa.XaSqlConnection) AsyncResult(io.vertx.core.AsyncResult) MySQLManager(cn.mycat.vertx.xa.MySQLManager) SavepointSqlConnection(cn.mycat.vertx.xa.SavepointSqlConnection) Handler(io.vertx.core.Handler) Assert(org.junit.Assert) NewMycatConnection(io.mycat.newquery.NewMycatConnection) SavepointSqlConnection(cn.mycat.vertx.xa.SavepointSqlConnection) RowSet(io.mycat.newquery.RowSet) SneakyThrows(lombok.SneakyThrows) AsyncResult(io.vertx.core.AsyncResult) XaSqlConnection(cn.mycat.vertx.xa.XaSqlConnection) Test(org.junit.jupiter.api.Test) SneakyThrows(lombok.SneakyThrows)

Example 12 with RowSet

use of io.mycat.newquery.RowSet in project Mycat2 by MyCATApache.

the class XaTestSuite method beginDoubleTargetInsertButPrepareFail.

@Test
public void beginDoubleTargetInsertButPrepareFail(VertxTestContext testContext) throws Exception {
    clearData();
    XaSqlConnection baseXaSqlConnection = factory.apply(mySQLManager, xaLog);
    baseXaSqlConnection.begin().onComplete(event -> {
        Assertions.assertTrue(event.succeeded());
        Future<NewMycatConnection> ds1 = baseXaSqlConnection.getConnection("ds1");
        Future<NewMycatConnection> ds2 = baseXaSqlConnection.getConnection("ds2");
        CompositeFuture all = CompositeFuture.join(ds1.compose(connection -> {
            Future<SqlResult> future = connection.insert("INSERT INTO db1.travelrecord (id)\n" + "                       VALUES\n" + "                       (1);");
            return future.compose(rowSet -> {
                Assertions.assertEquals(1, rowSet.getAffectRows());
                return Future.succeededFuture(connection);
            });
        }), ds2.compose(connection -> {
            Future<SqlResult> future = connection.insert("INSERT INTO db1.travelrecord (id)\n" + "                       VALUES\n" + "                       (2);");
            return future.compose(rowSet -> {
                Assertions.assertEquals(1, rowSet.getAffectRows());
                return Future.succeededFuture(connection);
            });
        }));
        all.onComplete(event13 -> {
            Assertions.assertTrue(event13.succeeded());
            Future<Void> future = baseXaSqlConnection.commitXa((c) -> Future.failedFuture("prepare fail"));
            future.onComplete(new Handler<AsyncResult<Void>>() {

                @Override
                public void handle(AsyncResult<Void> event) {
                    Assertions.assertTrue(event.failed());
                    baseXaSqlConnection.rollback().onComplete(new Handler<AsyncResult<Void>>() {

                        @Override
                        public void handle(AsyncResult<Void> event) {
                            Assertions.assertTrue(event.succeeded());
                            Assertions.assertFalse(baseXaSqlConnection.isInTransaction());
                            Future<NewMycatConnection> connectionFuture = baseXaSqlConnection.getConnection("ds1");
                            connectionFuture.compose(sqlConnection -> sqlConnection.query("select id from db1.travelrecord")).onComplete(event1 -> {
                                Assertions.assertTrue(event1.succeeded());
                                Assertions.assertEquals(0, event1.result().size());
                                testContext.completeNow();
                            });
                        }
                    });
                }
            });
        });
    });
}
Also used : CompositeFuture(io.vertx.core.CompositeFuture) VertxTestContext(io.vertx.junit5.VertxTestContext) Connection(java.sql.Connection) RowSet(io.mycat.newquery.RowSet) BiFunction(java.util.function.BiFunction) XaLog(cn.mycat.vertx.xa.XaLog) Disabled(org.junit.jupiter.api.Disabled) Function(java.util.function.Function) CompositeFuture(io.vertx.core.CompositeFuture) SimpleConfig(cn.mycat.vertx.xa.SimpleConfig) SQLException(java.sql.SQLException) SqlConnection(io.vertx.sqlclient.SqlConnection) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) Map(java.util.Map) AsyncResult(io.vertx.core.AsyncResult) MySQLManager(cn.mycat.vertx.xa.MySQLManager) JsonUtil(io.mycat.util.JsonUtil) NewMycatConnection(io.mycat.newquery.NewMycatConnection) XaLogImpl(cn.mycat.vertx.xa.impl.XaLogImpl) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) VertxExtension(io.vertx.junit5.VertxExtension) SqlResult(io.mycat.newquery.SqlResult) Future(io.vertx.core.Future) Test(org.junit.jupiter.api.Test) TimeUnit(java.util.concurrent.TimeUnit) List(java.util.List) XaSqlConnection(cn.mycat.vertx.xa.XaSqlConnection) DruidDataSource(com.alibaba.druid.pool.DruidDataSource) JdbcUtils(com.alibaba.druid.util.JdbcUtils) Row(io.vertx.sqlclient.Row) Assertions(org.junit.jupiter.api.Assertions) Handler(io.vertx.core.Handler) Collections(java.util.Collections) NewMycatConnection(io.mycat.newquery.NewMycatConnection) Handler(io.vertx.core.Handler) XaSqlConnection(cn.mycat.vertx.xa.XaSqlConnection) CompositeFuture(io.vertx.core.CompositeFuture) Future(io.vertx.core.Future) AsyncResult(io.vertx.core.AsyncResult) Test(org.junit.jupiter.api.Test)

Example 13 with RowSet

use of io.mycat.newquery.RowSet in project Mycat2 by MyCATApache.

the class XaTestSuite method beginDoubleTargetInsertCommit.

@Test
public void beginDoubleTargetInsertCommit(VertxTestContext testContext) throws Exception {
    clearData();
    XaSqlConnection baseXaSqlConnection = factory.apply(mySQLManager, xaLog);
    baseXaSqlConnection.begin().onComplete(event -> {
        Assertions.assertTrue(event.succeeded());
        Future<NewMycatConnection> ds1 = baseXaSqlConnection.getConnection("ds1");
        Future<NewMycatConnection> ds2 = baseXaSqlConnection.getConnection("ds2");
        CompositeFuture all = CompositeFuture.join(ds1.compose(connection -> {
            Future<SqlResult> future = connection.insert("INSERT INTO db1.travelrecord (id)\n" + "                       VALUES\n" + "                       (1);");
            return future.compose(rowSet -> {
                Assertions.assertEquals(1, rowSet.getAffectRows());
                return Future.succeededFuture(connection);
            });
        }), ds2.compose(connection -> {
            Future<SqlResult> future = connection.insert("INSERT INTO db1.travelrecord (id)\n" + "                       VALUES\n" + "                       (2);");
            return future.compose(rowSet -> {
                Assertions.assertEquals(1, rowSet.getAffectRows());
                return Future.succeededFuture(connection);
            });
        }));
        all.onComplete(event13 -> {
            Assertions.assertTrue(event13.succeeded());
            baseXaSqlConnection.commit().onComplete(event12 -> {
                Assertions.assertTrue(event12.succeeded());
                Assertions.assertFalse(baseXaSqlConnection.isInTransaction());
                Future<NewMycatConnection> connectionFuture = baseXaSqlConnection.getConnection("ds2");
                connectionFuture.compose(sqlConnection -> sqlConnection.query("select id from db1.travelrecord")).onComplete(event1 -> {
                    Assertions.assertTrue(event1.succeeded());
                    Assertions.assertEquals(1, event1.result().size());
                    testContext.completeNow();
                });
            });
        });
    });
}
Also used : CompositeFuture(io.vertx.core.CompositeFuture) VertxTestContext(io.vertx.junit5.VertxTestContext) Connection(java.sql.Connection) RowSet(io.mycat.newquery.RowSet) BiFunction(java.util.function.BiFunction) XaLog(cn.mycat.vertx.xa.XaLog) Disabled(org.junit.jupiter.api.Disabled) Function(java.util.function.Function) CompositeFuture(io.vertx.core.CompositeFuture) SimpleConfig(cn.mycat.vertx.xa.SimpleConfig) SQLException(java.sql.SQLException) SqlConnection(io.vertx.sqlclient.SqlConnection) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) Map(java.util.Map) AsyncResult(io.vertx.core.AsyncResult) MySQLManager(cn.mycat.vertx.xa.MySQLManager) JsonUtil(io.mycat.util.JsonUtil) NewMycatConnection(io.mycat.newquery.NewMycatConnection) XaLogImpl(cn.mycat.vertx.xa.impl.XaLogImpl) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) VertxExtension(io.vertx.junit5.VertxExtension) SqlResult(io.mycat.newquery.SqlResult) Future(io.vertx.core.Future) Test(org.junit.jupiter.api.Test) TimeUnit(java.util.concurrent.TimeUnit) List(java.util.List) XaSqlConnection(cn.mycat.vertx.xa.XaSqlConnection) DruidDataSource(com.alibaba.druid.pool.DruidDataSource) JdbcUtils(com.alibaba.druid.util.JdbcUtils) Row(io.vertx.sqlclient.Row) Assertions(org.junit.jupiter.api.Assertions) Handler(io.vertx.core.Handler) Collections(java.util.Collections) NewMycatConnection(io.mycat.newquery.NewMycatConnection) CompositeFuture(io.vertx.core.CompositeFuture) Future(io.vertx.core.Future) XaSqlConnection(cn.mycat.vertx.xa.XaSqlConnection) Test(org.junit.jupiter.api.Test)

Example 14 with RowSet

use of io.mycat.newquery.RowSet in project Mycat2 by MyCATApache.

the class VertxMycatConnectionPool method query.

@Override
public synchronized Future<RowSet> query(String sql, List<Object> params) {
    String psql = deparameterize(sql, params);
    Future<RowSet> rowSetFuture = queryCloseFuture.flatMap(unused -> {
        Promise<RowSet> promise = Promise.promise();
        ObjectArrayDecoder objectArrayDecoder = new ObjectArrayDecoder();
        Observable<Object[]> query = connection.query(psql, objectArrayDecoder);
        onSend();
        Single<RowSet> map = query.subscribeOn(Schedulers.computation()).toList().map(objects -> {
            MycatMySQLRowMetaData mycatMySQLRowMetaData = new MycatMySQLRowMetaData(Arrays.asList(objectArrayDecoder.getColumnDefPackets()));
            return new RowSet(mycatMySQLRowMetaData, objects);
        });
        map = map.doOnSuccess(objects -> promise.tryComplete(objects));
        map = map.doOnError(objects -> promise.tryFail(objects));
        map = map.doOnTerminate(() -> onRev());
        map.subscribe();
        return promise.future();
    });
    this.queryCloseFuture = rowSetFuture.mapEmpty();
    return rowSetFuture;
}
Also used : Single(io.reactivex.rxjava3.core.Single) Arrays(java.util.Arrays) RowSet(io.mycat.newquery.RowSet) PreparedStatement(io.mycat.PreparedStatement) Function(java.util.function.Function) Schedulers(io.reactivex.rxjava3.schedulers.Schedulers) MySqlASTVisitorAdapter(com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter) ImmutableList(com.google.common.collect.ImmutableList) MycatMySQLRowMetaData(io.mycat.beans.mycat.MycatMySQLRowMetaData) Observable(io.reactivex.rxjava3.core.Observable) JdbcDatasourcePoolImpl(io.mycat.commands.JdbcDatasourcePoolImpl) ObjectArrayDecoder(io.mycat.mysqlclient.decoder.ObjectArrayDecoder) AsyncResult(io.vertx.core.AsyncResult) MycatRelDataType(io.mycat.beans.mycat.MycatRelDataType) SQLVariantRefExpr(com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr) BufferAllocator(org.apache.arrow.memory.BufferAllocator) SQLUtils(com.alibaba.druid.sql.SQLUtils) NewMycatConnection(io.mycat.newquery.NewMycatConnection) ColumnDefPacket(io.mycat.beans.mysql.packet.ColumnDefPacket) VectorSchemaRoot(org.apache.arrow.vector.VectorSchemaRoot) SQLReplaceable(com.alibaba.druid.sql.ast.SQLReplaceable) Promise(io.vertx.core.Promise) MysqlCollector(io.mycat.newquery.MysqlCollector) SqlResult(io.mycat.newquery.SqlResult) Future(io.vertx.core.Future) List(java.util.List) Buffer(io.vertx.core.buffer.Buffer) SQLStatement(com.alibaba.druid.sql.ast.SQLStatement) Handler(io.vertx.core.Handler) MycatMySQLRowMetaData(io.mycat.beans.mycat.MycatMySQLRowMetaData) RowSet(io.mycat.newquery.RowSet) ObjectArrayDecoder(io.mycat.mysqlclient.decoder.ObjectArrayDecoder)

Example 15 with RowSet

use of io.mycat.newquery.RowSet in project Mycat2 by MyCATApache.

the class ReceiverImpl method proxyProcedure.

@Override
public Future<Void> proxyProcedure(String sql, String targetName) {
    targetName = dataContext.resolveDatasourceTargetName(targetName, true);
    XaSqlConnection transactionSession = (XaSqlConnection) dataContext.getTransactionSession();
    Future<NewMycatConnection> mySQLManagerConnection = transactionSession.getConnection(targetName);
    Future<List<Object>> objectFuture = mySQLManagerConnection.flatMap(newMycatConnection -> {
        Future<List<Object>> call = newMycatConnection.call(sql);
        return (Future) call;
    });
    Future<List<Object>> rowBaseIteratorFuture = objectFuture.map(objects -> objects.stream().map(o -> {
        if (o instanceof long[])
            return o;
        if (o instanceof SqlResult)
            return ((SqlResult) o).toLongs();
        if (o instanceof RowSet)
            return ((RowSet) o).toRowBaseIterator();
        throw new UnsupportedOperationException();
    }).collect(Collectors.toList()));
    return rowBaseIteratorFuture.flatMap(objectList -> {
        if (objectList instanceof List) {
            List list = (List) objectList;
            int thisStmtResultSetSize = list.size();
            int resultSetCounter = getResultSetCounter();
            resetResultSetCounter(resultSetCounter + thisStmtResultSetSize - 1);
            Future<Void> future = Future.succeededFuture();
            for (Object o : list) {
                if (o instanceof long[]) {
                    long[] r = (long[]) o;
                    future = future.flatMap(unused -> sendOk(r[0], r[1]));
                } else if (o instanceof RowBaseIterator) {
                    RowBaseIterator rs = (RowBaseIterator) o;
                    future = future.flatMap(unused -> sendResultSet(rs));
                }
                return future;
            }
        }
        throw new UnsupportedOperationException();
    });
}
Also used : VertxExecuter(io.mycat.vertx.VertxExecuter) java.util(java.util) io.mycat(io.mycat) MycatRowMetaData(io.mycat.beans.mycat.MycatRowMetaData) ResultSetWriter(io.mycat.beans.resultset.ResultSetWriter) io.vertx.core(io.vertx.core) RowSet(io.mycat.newquery.RowSet) LoggerFactory(org.slf4j.LoggerFactory) NonNull(io.reactivex.rxjava3.annotations.NonNull) SimpleBinaryWriterImpl(io.mycat.beans.resultset.SimpleBinaryWriterImpl) Function(java.util.function.Function) ExecuteType(io.mycat.ExecuteType) Observable(io.reactivex.rxjava3.core.Observable) SimpleTextWriterImpl(io.mycat.beans.resultset.SimpleTextWriterImpl) ResultSetMapping(io.mycat.vertx.ResultSetMapping) ObservableSource(io.reactivex.rxjava3.core.ObservableSource) SchemaBuilder(io.ordinate.engine.builder.SchemaBuilder) InnerType(io.ordinate.engine.schema.InnerType) Observer(io.reactivex.rxjava3.core.Observer) Logger(org.slf4j.Logger) NewMycatConnection(io.mycat.newquery.NewMycatConnection) MySQLServerSession(io.mycat.proxy.session.MySQLServerSession) VectorSchemaRoot(org.apache.arrow.vector.VectorSchemaRoot) SqlResult(io.mycat.newquery.SqlResult) VertxUtil(io.mycat.util.VertxUtil) ResultWriterUtil(io.ordinate.engine.util.ResultWriterUtil) Collectors(java.util.stream.Collectors) io.mycat.api.collector(io.mycat.api.collector) AtomicLong(java.util.concurrent.atomic.AtomicLong) Buffer(io.vertx.core.buffer.Buffer) XaSqlConnection(cn.mycat.vertx.xa.XaSqlConnection) Disposable(io.reactivex.rxjava3.disposables.Disposable) NewMycatConnection(io.mycat.newquery.NewMycatConnection) SqlResult(io.mycat.newquery.SqlResult) RowSet(io.mycat.newquery.RowSet) XaSqlConnection(cn.mycat.vertx.xa.XaSqlConnection)

Aggregations

NewMycatConnection (io.mycat.newquery.NewMycatConnection)17 RowSet (io.mycat.newquery.RowSet)17 XaSqlConnection (cn.mycat.vertx.xa.XaSqlConnection)15 AsyncResult (io.vertx.core.AsyncResult)15 Future (io.vertx.core.Future)15 Handler (io.vertx.core.Handler)15 MySQLManager (cn.mycat.vertx.xa.MySQLManager)14 XaLog (cn.mycat.vertx.xa.XaLog)14 VertxTestContext (io.vertx.junit5.VertxTestContext)14 BiFunction (java.util.function.BiFunction)14 Test (org.junit.jupiter.api.Test)14 SavepointSqlConnection (cn.mycat.vertx.xa.SavepointSqlConnection)9 SneakyThrows (lombok.SneakyThrows)9 Assert (org.junit.Assert)9 SqlResult (io.mycat.newquery.SqlResult)7 Function (java.util.function.Function)7 List (java.util.List)6 SimpleConfig (cn.mycat.vertx.xa.SimpleConfig)5 XaLogImpl (cn.mycat.vertx.xa.impl.XaLogImpl)5 DruidDataSource (com.alibaba.druid.pool.DruidDataSource)5