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