package io.vertx.mysqlclient.impl.codec;
import io.vertx.mysqlclient.impl.MySQLParamDesc;
import io.vertx.mysqlclient.impl.MySQLRowDesc;
import io.vertx.mysqlclient.impl.datatype.DataType;
import io.vertx.mysqlclient.impl.datatype.DataTypeCodec;
import io.vertx.sqlclient.Tuple;
import io.vertx.sqlclient.impl.*;
import java.util.Arrays;
class MySQLPreparedStatement implements PreparedStatement {
final long statementId;
final String sql;
final MySQLParamDesc paramDesc;
final MySQLRowDesc rowDesc;
final boolean closeAfterUsage;
private boolean sendTypesToServer;
private final DataType[] bindingTypes;
boolean isCursorOpen;
MySQLPreparedStatement(String sql, long statementId, MySQLParamDesc paramDesc, MySQLRowDesc rowDesc, boolean closeAfterUsage) {
this.statementId = statementId;
this.paramDesc = paramDesc;
this.rowDesc = rowDesc;
this.sql = sql;
this.closeAfterUsage = closeAfterUsage;
this.bindingTypes = new DataType[paramDesc.paramDefinitions().length];
cleanBindings();
}
@Override
public ParamDesc paramDesc() {
return paramDesc;
}
@Override
public RowDesc rowDesc() {
return rowDesc;
}
@Override
public String sql() {
return sql;
}
@Override
public String prepare(TupleInternal values) {
int numberOfParameters = values.size();
int paramDescLength = paramDesc.paramDefinitions().length;
if (numberOfParameters != paramDescLength) {
return ErrorMessageFactory.buildWhenArgumentsLengthNotMatched(paramDescLength, numberOfParameters);
} else {
return null;
}
}
boolean sendTypesToServer() {
return sendTypesToServer;
}
DataType[] bindingTypes() {
return bindingTypes;
}
void cleanBindings() {
this.sendTypesToServer = true;
Arrays.fill(bindingTypes, DataType.UNBIND);
}
public String bindParameters(Tuple params) {
int numberOfParameters = params.size();
int paramDescLength = paramDesc.paramDefinitions().length;
if (numberOfParameters != paramDescLength) {
return ErrorMessageFactory.buildWhenArgumentsLengthNotMatched(paramDescLength, numberOfParameters);
}
boolean reboundParameters = false;
for (int i = 0; i < params.size(); i++) {
Object value = params.getValue(i);
DataType dataType = DataTypeCodec.inferDataTypeByEncodingValue(value);
DataType paramDataType = bindingTypes[i];
if (paramDataType != dataType) {
bindingTypes[i] = dataType;
reboundParameters = true;
}
}
sendTypesToServer = reboundParameters;
return null;
}
}