use of com.mysql.cj.protocol.x.StatementExecuteOk in project aws-mysql-jdbc by awslabs.
the class XProtocolAsyncTest method simpleSuccessfulQuery.
@Test
public void simpleSuccessfulQuery() throws Exception {
assumeTrue(this.isSetForXTests, PropertyDefinitions.SYSP_testsuite_url_mysqlx + " must be set to run this test.");
try {
String collName = createTempTestCollection(this.protocol);
String json = "{'_id': '85983efc2a9a11e5b345feff819cdc9f', 'testVal': 1, 'insertedBy': 'Jess'}".replaceAll("'", "\"");
this.protocol.send(this.messageBuilder.buildDocInsert(getTestDatabase(), collName, Arrays.asList(new String[] { json }), false), 0);
this.protocol.readQueryResult(new StatementExecuteOkBuilder());
final ValueHolder<ColumnDefinition> metadataHolder = new ValueHolder<>();
final ValueHolder<ArrayList<Row>> rowHolder = new ValueHolder<>();
rowHolder.accept(new ArrayList<>());
final ValueHolder<StatementExecuteOk> okHolder = new ValueHolder<>();
final ValueHolder<Throwable> excHolder = new ValueHolder<>();
this.protocol.queryAsync(this.messageBuilder.buildFind(new DocFilterParams(getTestDatabase(), collName)), new ResultBuilder<RowResult>() {
private ArrayList<Field> fields = new ArrayList<>();
private ColumnDefinition metadata;
@Override
public boolean addProtocolEntity(ProtocolEntity entity) {
if (entity instanceof Field) {
this.fields.add((Field) entity);
} else if (entity instanceof ColumnDefinition) {
this.metadata = (ColumnDefinition) entity;
metadataHolder.accept(this.metadata);
} else if (entity instanceof Row) {
if (this.metadata == null) {
this.metadata = new DefaultColumnDefinition(this.fields.toArray(new Field[] {}));
metadataHolder.accept(this.metadata);
}
rowHolder.get().add((Row) entity);
} else if (entity instanceof StatementExecuteOk) {
okHolder.accept((StatementExecuteOk) entity);
synchronized (XProtocolAsyncTest.this) {
XProtocolAsyncTest.this.notify();
}
return true;
}
return false;
}
@Override
public RowResult build() {
return null;
}
});
synchronized (this) {
// timeout in case we get stuck
this.wait(5000);
}
assertEquals(1, metadataHolder.get().getFields().length);
assertEquals(1, rowHolder.get().size());
assertNotNull(okHolder.get());
assertNull(excHolder.get());
} finally {
dropTempTestCollection(this.protocol);
}
}
use of com.mysql.cj.protocol.x.StatementExecuteOk in project aws-mysql-jdbc by awslabs.
the class SqlResultBuilder method addProtocolEntity.
@Override
public boolean addProtocolEntity(ProtocolEntity entity) {
if (entity instanceof Field) {
this.fields.add((Field) entity);
if (!this.isRowResult) {
this.isRowResult = true;
}
this.prevEntity = entity;
return false;
} else if (entity instanceof Notice) {
this.statementExecuteOkBuilder.addProtocolEntity(entity);
return false;
}
if (this.isRowResult && this.metadata == null) {
this.metadata = new DefaultColumnDefinition(this.fields.toArray(new Field[] {}));
}
if (entity instanceof Row) {
this.rows.add(((Row) entity).setMetadata(this.metadata));
} else if (entity instanceof FetchDoneMoreResults) {
this.resultSets.add(new SqlSingleResult(this.metadata, this.defaultTimeZone, new BufferedRowList(this.rows), () -> this.statementExecuteOkBuilder.build(), this.pset));
// clear variables to accept next result set
this.fields = new ArrayList<>();
this.metadata = null;
this.rows = new ArrayList<>();
this.statementExecuteOkBuilder = new StatementExecuteOkBuilder();
} else if (entity instanceof FetchDoneEntity) {
if (this.prevEntity instanceof FetchDoneMoreResults) {
// no-op, possibly bug in xplugin sending FetchDone immediately following FetchDoneMoreResultsets
} else {
this.resultSets.add(new SqlSingleResult(this.metadata, this.defaultTimeZone, new BufferedRowList(this.rows), () -> this.statementExecuteOkBuilder.build(), this.pset));
}
} else if (entity instanceof StatementExecuteOk) {
return true;
}
this.prevEntity = entity;
return false;
}
use of com.mysql.cj.protocol.x.StatementExecuteOk in project aws-mysql-jdbc by awslabs.
the class StreamingSqlResultBuilder method addProtocolEntity.
@Override
public boolean addProtocolEntity(ProtocolEntity entity) {
if (entity instanceof Notice) {
this.statementExecuteOkBuilder.addProtocolEntity(entity);
} else {
this.lastEntity = entity;
}
AtomicBoolean readLastResult = new AtomicBoolean(false);
Supplier<ProtocolEntity> okReader = () -> {
if (readLastResult.get()) {
throw new CJCommunicationsException("Invalid state attempting to read ok packet");
}
if (this.protocol.hasMoreResults()) {
StatementExecuteOk res = this.statementExecuteOkBuilder.build();
this.statementExecuteOkBuilder = new StatementExecuteOkBuilder();
return res;
}
readLastResult.set(true);
return this.protocol.readQueryResult(this.statementExecuteOkBuilder);
};
Supplier<SqlResult> resultStream = () -> {
if (readLastResult.get()) {
return null;
} else if (this.lastEntity != null && this.lastEntity instanceof Field || this.protocol.isSqlResultPending()) {
ColumnDefinition cd;
if (this.lastEntity != null && this.lastEntity instanceof Field) {
cd = this.protocol.readMetadata((Field) this.lastEntity, (n) -> {
this.statementExecuteOkBuilder.addProtocolEntity(n);
});
this.lastEntity = null;
} else {
cd = this.protocol.readMetadata(this.statementExecuteOkBuilder::addProtocolEntity);
}
return new SqlSingleResult(cd, this.protocol.getServerSession().getDefaultTimeZone(), new XProtocolRowInputStream(cd, this.protocol, (n) -> {
this.statementExecuteOkBuilder.addProtocolEntity(n);
}), okReader, this.pset);
} else {
readLastResult.set(true);
SqlResultBuilder rb = new SqlResultBuilder(this.defaultTimeZone, this.pset);
rb.addProtocolEntity(entity);
return this.protocol.readQueryResult(rb);
}
};
this.result = new SqlMultiResult(resultStream);
return true;
}
Aggregations