Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Copyright (c) 2015, 2022, Oracle and/or its affiliates.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 2.0, as published by the
* Free Software Foundation.
*
* This program is also distributed with certain software (including but not
* limited to OpenSSL) that is licensed under separate terms, as designated in a
* particular file or component or in included license documentation. The
* authors of MySQL hereby grant you an additional permission to link the
* program and your derivative works with the separately licensed software that
* they have included with MySQL.
*
* Without limiting anything contained in the foregoing, this file, which is
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
* version 1.0, a copy of which can be found at
* http://oss.oracle.com/licenses/universal-foss-exception.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0,
* for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package com.mysql.cj.protocol.x;
import java.security.DigestException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.sasl.Sasl;
import javax.security.sasl.SaslClient;
import javax.security.sasl.SaslException;
import com.google.protobuf.ByteString;
import com.mysql.cj.MessageBuilder;
import com.mysql.cj.Messages;
import com.mysql.cj.PreparedQuery;
import com.mysql.cj.QueryBindings;
import com.mysql.cj.Session;
import com.mysql.cj.exceptions.CJOperationNotSupportedException;
import com.mysql.cj.exceptions.ExceptionFactory;
import com.mysql.cj.protocol.Security;
import com.mysql.cj.util.StringUtils;
import com.mysql.cj.x.protobuf.MysqlxConnection.Capabilities;
import com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesGet;
import com.mysql.cj.x.protobuf.MysqlxConnection.CapabilitiesSet;
import com.mysql.cj.x.protobuf.MysqlxConnection.Capability;
import com.mysql.cj.x.protobuf.MysqlxCrud.Collection;
import com.mysql.cj.x.protobuf.MysqlxCrud.Column;
import com.mysql.cj.x.protobuf.MysqlxCrud.DataModel;
import com.mysql.cj.x.protobuf.MysqlxCrud.Delete;
import com.mysql.cj.x.protobuf.MysqlxCrud.Find;
import com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLock;
import com.mysql.cj.x.protobuf.MysqlxCrud.Find.RowLockOptions;
import com.mysql.cj.x.protobuf.MysqlxCrud.Insert;
import com.mysql.cj.x.protobuf.MysqlxCrud.Insert.TypedRow;
import com.mysql.cj.x.protobuf.MysqlxCrud.Limit;
import com.mysql.cj.x.protobuf.MysqlxCrud.LimitExpr;
import com.mysql.cj.x.protobuf.MysqlxCrud.Order;
import com.mysql.cj.x.protobuf.MysqlxCrud.Projection;
import com.mysql.cj.x.protobuf.MysqlxCrud.Update;
import com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation;
import com.mysql.cj.x.protobuf.MysqlxCrud.UpdateOperation.UpdateType;
import com.mysql.cj.x.protobuf.MysqlxDatatypes;
import com.mysql.cj.x.protobuf.MysqlxDatatypes.Any;
import com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.Builder;
import com.mysql.cj.x.protobuf.MysqlxDatatypes.Object.ObjectField;
import com.mysql.cj.x.protobuf.MysqlxDatatypes.Scalar;
import com.mysql.cj.x.protobuf.MysqlxExpect;
import com.mysql.cj.x.protobuf.MysqlxExpr.ColumnIdentifier;
import com.mysql.cj.x.protobuf.MysqlxExpr.Expr;
import com.mysql.cj.x.protobuf.MysqlxPrepare.Deallocate;
import com.mysql.cj.x.protobuf.MysqlxPrepare.Execute;
import com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare;
import com.mysql.cj.x.protobuf.MysqlxPrepare.Prepare.OneOfMessage;
import com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateContinue;
import com.mysql.cj.x.protobuf.MysqlxSession.AuthenticateStart;
import com.mysql.cj.x.protobuf.MysqlxSession.Close;
import com.mysql.cj.x.protobuf.MysqlxSession.Reset;
import com.mysql.cj.x.protobuf.MysqlxSql.StmtExecute;
import com.mysql.cj.xdevapi.CreateIndexParams;
import com.mysql.cj.xdevapi.CreateIndexParams.IndexField;
import com.mysql.cj.xdevapi.ExprUtil;
import com.mysql.cj.xdevapi.FilterParams;
import com.mysql.cj.xdevapi.InsertParams;
import com.mysql.cj.xdevapi.Schema.CreateCollectionOptions;
import com.mysql.cj.xdevapi.Schema.ModifyCollectionOptions;
import com.mysql.cj.xdevapi.UpdateParams;
import com.mysql.cj.xdevapi.UpdateSpec;
public class XMessageBuilder implements MessageBuilder {
private static final String XPLUGIN_NAMESPACE = "mysqlx";
public XMessage buildCapabilitiesGet() {
return new XMessage(CapabilitiesGet.getDefaultInstance());
}
@SuppressWarnings("unchecked")
public XMessage buildCapabilitiesSet(Map keyValuePair) {
Capabilities.Builder capsB = Capabilities.newBuilder();
keyValuePair.forEach((k, v) -> {
Any val;
if (XServerCapabilities.KEY_SESSION_CONNECT_ATTRS.equals(k) || XServerCapabilities.KEY_COMPRESSION.equals(k)) {
MysqlxDatatypes.Object.Builder attrB = MysqlxDatatypes.Object.newBuilder();
((Map) v)
.forEach((name, value) -> attrB.addFld(ObjectField.newBuilder().setKey(name).setValue(ExprUtil.argObjectToScalarAny(value)).build()));
val = Any.newBuilder().setType(Any.Type.OBJECT).setObj(attrB).build();
} else {
val = ExprUtil.argObjectToScalarAny(v);
}
Capability cap = Capability.newBuilder().setName(k).setValue(val).build();
capsB.addCapabilities(cap);
});
return new XMessage(CapabilitiesSet.newBuilder().setCapabilities(capsB).build());
}
/**
* Build an {@link XMessage} for a non-prepared doc insert operation.
*
* @param schemaName
* the schema name
* @param collectionName
* the collection name
* @param json
* the documents to insert
* @param upsert
* Whether this is an upsert operation or not
* @return
* an {@link XMessage} instance
*/
public XMessage buildDocInsert(String schemaName, String collectionName, List json, boolean upsert) {
Insert.Builder builder = Insert.newBuilder().setCollection(ExprUtil.buildCollection(schemaName, collectionName));
if (upsert != builder.getUpsert()) {
builder.setUpsert(upsert);
}
json.stream().map(str -> TypedRow.newBuilder().addField(ExprUtil.argObjectToExpr(str, false)).build()).forEach(builder::addRow);
return new XMessage(builder.build());
}
/**
* Initialize a {@link Insert.Builder} for table data model with common data for prepared and non-prepared executions.
*
* @param schemaName
* the schema name
* @param tableName
* the table name
* @param insertParams
* the parameters to insert
* @return
* an initialized {@link Insert.Builder} instance
*/
@SuppressWarnings("unchecked")
private Insert.Builder commonRowInsertBuilder(String schemaName, String tableName, InsertParams insertParams) {
Insert.Builder builder = Insert.newBuilder().setDataModel(DataModel.TABLE).setCollection(ExprUtil.buildCollection(schemaName, tableName));
if (insertParams.getProjection() != null) {
builder.addAllProjection((List) insertParams.getProjection());
}
return builder;
}
/**
* Build an {@link XMessage} for a non-prepared row insert operation.
*
* @param schemaName
* the schema name
* @param tableName
* the table name
* @param insertParams
* the parameters to insert
* @return
* an {@link XMessage} instance
*/
@SuppressWarnings("unchecked")
public XMessage buildRowInsert(String schemaName, String tableName, InsertParams insertParams) {
Insert.Builder builder = commonRowInsertBuilder(schemaName, tableName, insertParams);
builder.addAllRow((List) insertParams.getRows());
return new XMessage(builder.build());
}
/**
* Initialize an {@link Update.Builder} for collection data model with common data for prepared and non-prepared executions.
*
* @param filterParams
* the filter parameters
* @param updates
* the updates specifications to perform
* @return
* an initialized {@link Update.Builder} instance
*/
private Update.Builder commonDocUpdateBuilder(FilterParams filterParams, List updates) {
Update.Builder builder = Update.newBuilder().setCollection((Collection) filterParams.getCollection());
updates.forEach(u -> {
UpdateOperation.Builder opBuilder = UpdateOperation.newBuilder();
opBuilder.setOperation((UpdateType) u.getUpdateType());
opBuilder.setSource((ColumnIdentifier) u.getSource());
if (u.getValue() != null) {
opBuilder.setValue((Expr) u.getValue());
}
builder.addOperation(opBuilder.build());
});
return builder;
}
/**
* Build an {@link XMessage} for a non-prepared doc update operation.
*
* @param filterParams
* the filter parameters
* @param updates
* the updates specifications to perform
* @return
* an {@link XMessage} instance
*/
public XMessage buildDocUpdate(FilterParams filterParams, List updates) {
Update.Builder builder = commonDocUpdateBuilder(filterParams, updates);
applyFilterParams(filterParams, builder::addAllOrder, builder::setLimit, builder::setCriteria, builder::addAllArgs);
return new XMessage(builder.build());
}
/**
* Build an {@link XMessage} for a prepared doc update operation.
*
* @param preparedStatementId
* the prepared statement id
* @param filterParams
* the filter parameters
* @param updates
* the updates specifications to perform
* @return
* an {@link XMessage} instance
*/
public XMessage buildPrepareDocUpdate(int preparedStatementId, FilterParams filterParams, List updates) {
Update.Builder updateBuilder = commonDocUpdateBuilder(filterParams, updates);
applyFilterParams(filterParams, updateBuilder::addAllOrder, updateBuilder::setLimitExpr, updateBuilder::setCriteria);
Prepare.Builder builder = Prepare.newBuilder().setStmtId(preparedStatementId);
builder.setStmt(OneOfMessage.newBuilder().setType(OneOfMessage.Type.UPDATE).setUpdate(updateBuilder.build()).build());
return new XMessage(builder.build());
}
/**
* Initialize an {@link Update.Builder} for table data model with common data for prepared and non-prepared executions.
*
* @param filterParams
* the filter parameters
* @param updateParams
* the update parameters
* @return
* an initialized {@link Update.Builder} instance
*/
@SuppressWarnings("unchecked")
private Update.Builder commonRowUpdateBuilder(FilterParams filterParams, UpdateParams updateParams) {
Update.Builder builder = Update.newBuilder().setDataModel(DataModel.TABLE).setCollection((Collection) filterParams.getCollection());
((Map) updateParams.getUpdates()).entrySet().stream()
.map(e -> UpdateOperation.newBuilder().setOperation(UpdateType.SET).setSource(e.getKey()).setValue(e.getValue()).build())
.forEach(builder::addOperation);
return builder;
}
/**
* Build an {@link XMessage} for a non-prepared row update operation.
*
* @param filterParams
* the filter parameters
* @param updateParams
* the update parameters
* @return
* an {@link XMessage} instance
*/
public XMessage buildRowUpdate(FilterParams filterParams, UpdateParams updateParams) {
Update.Builder builder = commonRowUpdateBuilder(filterParams, updateParams);
applyFilterParams(filterParams, builder::addAllOrder, builder::setLimit, builder::setCriteria, builder::addAllArgs);
return new XMessage(builder.build());
}
/**
* Build an {@link XMessage} for a prepared row update operation.
*
* @param preparedStatementId
* the prepared statement id
* @param filterParams
* the filter parameters
* @param updateParams
* the update parameters
* @return
* an {@link XMessage} instance
*/
public XMessage buildPrepareRowUpdate(int preparedStatementId, FilterParams filterParams, UpdateParams updateParams) {
Update.Builder updateBuilder = commonRowUpdateBuilder(filterParams, updateParams);
applyFilterParams(filterParams, updateBuilder::addAllOrder, updateBuilder::setLimitExpr, updateBuilder::setCriteria);
Prepare.Builder builder = Prepare.newBuilder().setStmtId(preparedStatementId);
builder.setStmt(OneOfMessage.newBuilder().setType(OneOfMessage.Type.UPDATE).setUpdate(updateBuilder.build()).build());
return new XMessage(builder.build());
}
/**
* Initialize a {@link Find.Builder} for collection data model with common data for prepared and non-prepared executions.
*
* @param filterParams
* the filter parameters
* @return
* an initialized {@link Find.Builder} instance
*/
@SuppressWarnings("unchecked")
private Find.Builder commonFindBuilder(FilterParams filterParams) {
Find.Builder builder = Find.newBuilder().setCollection((Collection) filterParams.getCollection());
builder.setDataModel(filterParams.isRelational() ? DataModel.TABLE : DataModel.DOCUMENT);
if (filterParams.getFields() != null) {
builder.addAllProjection((List) filterParams.getFields());
}
if (filterParams.getGrouping() != null) {
builder.addAllGrouping((List) filterParams.getGrouping());
}
if (filterParams.getGroupingCriteria() != null) {
builder.setGroupingCriteria((Expr) filterParams.getGroupingCriteria());
}
if (filterParams.getLock() != null) {
builder.setLocking(RowLock.forNumber(filterParams.getLock().asNumber()));
}
if (filterParams.getLockOption() != null) {
builder.setLockingOptions(RowLockOptions.forNumber(filterParams.getLockOption().asNumber()));
}
return builder;
}
/**
* Build an {@link XMessage} for a non-prepared find operation.
*
* @param filterParams
* the filter parameters
* @return
* an {@link XMessage} instance
*/
public XMessage buildFind(FilterParams filterParams) {
Find.Builder builder = commonFindBuilder(filterParams);
applyFilterParams(filterParams, builder::addAllOrder, builder::setLimit, builder::setCriteria, builder::addAllArgs);
return new XMessage(builder.build());
}
/**
* Build an {@link XMessage} for a prepared find operation.
*
* @param preparedStatementId
* the prepared statement id
* @param filterParams
* the filter parameters
* @return
* an {@link XMessage} instance
*/
public XMessage buildPrepareFind(int preparedStatementId, FilterParams filterParams) {
Find.Builder findBuilder = commonFindBuilder(filterParams);
applyFilterParams(filterParams, findBuilder::addAllOrder, findBuilder::setLimitExpr, findBuilder::setCriteria);
Prepare.Builder builder = Prepare.newBuilder().setStmtId(preparedStatementId);
builder.setStmt(OneOfMessage.newBuilder().setType(OneOfMessage.Type.FIND).setFind(findBuilder.build()).build());
return new XMessage(builder.build());
}
/**
* Initialize a {@link Delete.Builder} with common data for prepared and non-prepared executions.
*
* @param filterParams
* the filter parameters
* @return
* an initialized {@link Delete.Builder} instance
*/
private Delete.Builder commonDeleteBuilder(FilterParams filterParams) {
Delete.Builder builder = Delete.newBuilder().setCollection((Collection) filterParams.getCollection());
return builder;
}
/**
* Build an {@link XMessage} for a non-prepared delete operation.
*
* @param filterParams
* the filter parameters
* @return
* an {@link XMessage} instance
*/
public XMessage buildDelete(FilterParams filterParams) {
Delete.Builder builder = commonDeleteBuilder(filterParams);
applyFilterParams(filterParams, builder::addAllOrder, builder::setLimit, builder::setCriteria, builder::addAllArgs);
return new XMessage(builder.build());
}
/**
* Build an {@link XMessage} for a prepared delete operation.
*
* @param preparedStatementId
* the prepared statement id
* @param filterParams
* the filter parameters
* @return
* an {@link XMessage} instance
*/
public XMessage buildPrepareDelete(int preparedStatementId, FilterParams filterParams) {
Delete.Builder deleteBuilder = commonDeleteBuilder(filterParams);
applyFilterParams(filterParams, deleteBuilder::addAllOrder, deleteBuilder::setLimitExpr, deleteBuilder::setCriteria);
Prepare.Builder builder = Prepare.newBuilder().setStmtId(preparedStatementId);
builder.setStmt(OneOfMessage.newBuilder().setType(OneOfMessage.Type.DELETE).setDelete(deleteBuilder.build()).build());
return new XMessage(builder.build());
}
/**
* Initialize a {@link StmtExecute.Builder} with common data for prepared and non-prepared executions.
*
* @param statement
* the SQL statement
* @return
* an initialized {@link StmtExecute.Builder} instance
*/
private StmtExecute.Builder commonSqlStatementBuilder(String statement) {
StmtExecute.Builder builder = StmtExecute.newBuilder();
// TODO: encoding (character_set_client?)
builder.setStmt(ByteString.copyFromUtf8(statement));
return builder;
}
/**
* Build a StmtExecute message for a SQL statement.
*
* @param statement
* SQL statement string
* @return {@link XMessage} wrapping {@link StmtExecute}
*/
public XMessage buildSqlStatement(String statement) {
return buildSqlStatement(statement, null);
}
/**
* Build a StmtExecute message for a SQL statement.
*
* @param statement
* SQL statement string
* @param args
* list of {@link Object} arguments
* @return {@link XMessage} wrapping {@link StmtExecute}
*/
public XMessage buildSqlStatement(String statement, List