private Type0CommandMessageSection <BsonDocument> CreateType0Section(ConnectionDescription connectionDescription) { var extraElements = new List <BsonElement>(); addIfNotAlreadyAdded("$db", _databaseNamespace.DatabaseName); if (connectionDescription.IsMasterResult.ServerType != ServerType.Standalone && _readPreference != null && _readPreference != ReadPreference.Primary) { var readPreferenceDocument = QueryHelper.CreateReadPreferenceDocument(_readPreference); addIfNotAlreadyAdded("$readPreference", readPreferenceDocument); } if (_session.Id != null) { addIfNotAlreadyAdded("lsid", _session.Id); } if (_session.ClusterTime != null) { addIfNotAlreadyAdded("$clusterTime", _session.ClusterTime); } Action <BsonWriterSettings> writerSettingsConfigurator = s => s.GuidRepresentation = GuidRepresentation.Unspecified; _session.AboutToSendCommand(); if (_session.IsInTransaction) { var transaction = _session.CurrentTransaction; addIfNotAlreadyAdded("txnNumber", transaction.TransactionNumber); if (transaction.State == CoreTransactionState.Starting) { addIfNotAlreadyAdded("startTransaction", true); var readConcern = ReadConcernHelper.GetReadConcernForFirstCommandInTransaction(_session, connectionDescription); if (readConcern != null) { addIfNotAlreadyAdded("readConcern", readConcern); } } addIfNotAlreadyAdded("autocommit", false); } var elementAppendingSerializer = new ElementAppendingSerializer <BsonDocument>(BsonDocumentSerializer.Instance, extraElements, writerSettingsConfigurator); return(new Type0CommandMessageSection <BsonDocument>(_command, elementAppendingSerializer)); void addIfNotAlreadyAdded(string key, BsonValue value) { if (!_command.Contains(key)) { extraElements.Add(new BsonElement(key, value)); } } }
private Type0CommandMessageSection <BsonDocument> CreateType0Section(ConnectionDescription connectionDescription) { var extraElements = new List <BsonElement>(); var dbElement = new BsonElement("$db", _databaseNamespace.DatabaseName); extraElements.Add(dbElement); if (_readPreference != null && _readPreference != ReadPreference.Primary) { var readPreferenceDocument = QueryHelper.CreateReadPreferenceDocument(_readPreference); var readPreferenceElement = new BsonElement("$readPreference", readPreferenceDocument); extraElements.Add(readPreferenceElement); } if (_session.Id != null) { var lsidElement = new BsonElement("lsid", _session.Id); extraElements.Add(lsidElement); } if (_session.ClusterTime != null) { var clusterTimeElement = new BsonElement("$clusterTime", _session.ClusterTime); extraElements.Add(clusterTimeElement); } Action <BsonWriterSettings> writerSettingsConfigurator = s => s.GuidRepresentation = GuidRepresentation.Unspecified; _session.AutoStartTransactionIfApplicable(); if (_session.IsInTransaction) { var transaction = _session.CurrentTransaction; extraElements.Add(new BsonElement("txnNumber", transaction.TransactionNumber)); extraElements.Add(new BsonElement("stmtId", transaction.StatementId)); if (transaction.StatementId == 0) { extraElements.Add(new BsonElement("startTransaction", true)); var readConcern = ReadConcernHelper.GetReadConcernForFirstCommandInTransaction(_session, connectionDescription); if (readConcern != null) { extraElements.Add(new BsonElement("readConcern", readConcern)); } } extraElements.Add(new BsonElement("autocommit", false)); } var elementAppendingSerializer = new ElementAppendingSerializer <BsonDocument>(BsonDocumentSerializer.Instance, extraElements, writerSettingsConfigurator); return(new Type0CommandMessageSection <BsonDocument>(_command, elementAppendingSerializer)); }
private Type0CommandMessageSection <BsonDocument> CreateType0Section(ConnectionDescription connectionDescription) { var extraElements = new List <BsonElement>(); AddIfNotAlreadyAdded("$db", _databaseNamespace.DatabaseName); if (connectionDescription.IsMasterResult.ServerType != ServerType.Standalone && _readPreference != null && _readPreference != ReadPreference.Primary) { var readPreferenceDocument = QueryHelper.CreateReadPreferenceDocument(_readPreference); AddIfNotAlreadyAdded("$readPreference", readPreferenceDocument); } if (_session.Id != null) { if (IsSessionAcknowledged()) { AddIfNotAlreadyAdded("lsid", _session.Id); } else { if (_session.IsImplicit) { // do not set sessionId if session is implicit and write is unacknowledged } else { throw new InvalidOperationException("Explicit session must not be used with unacknowledged writes."); } } } if (_session.ClusterTime != null) { AddIfNotAlreadyAdded("$clusterTime", _session.ClusterTime); } #pragma warning disable 618 Action <BsonWriterSettings> writerSettingsConfigurator = null; if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2) { writerSettingsConfigurator = s => s.GuidRepresentation = GuidRepresentation.Unspecified; } #pragma warning restore 618 _session.AboutToSendCommand(); if (_session.IsInTransaction) { var transaction = _session.CurrentTransaction; AddIfNotAlreadyAdded("txnNumber", transaction.TransactionNumber); if (transaction.State == CoreTransactionState.Starting) { AddIfNotAlreadyAdded("startTransaction", true); var readConcern = ReadConcernHelper.GetReadConcernForFirstCommandInTransaction(_session, connectionDescription); if (readConcern != null) { AddIfNotAlreadyAdded("readConcern", readConcern); } } AddIfNotAlreadyAdded("autocommit", false); } var elementAppendingSerializer = new ElementAppendingSerializer <BsonDocument>(BsonDocumentSerializer.Instance, extraElements, writerSettingsConfigurator); return(new Type0CommandMessageSection <BsonDocument>(_command, elementAppendingSerializer)); void AddIfNotAlreadyAdded(string key, BsonValue value) { if (!_command.Contains(key)) { extraElements.Add(new BsonElement(key, value)); } } bool IsSessionAcknowledged() { if (_command.TryGetValue("writeConcern", out var writeConcernDocument)) { var writeConcern = WriteConcern.FromBsonDocument(writeConcernDocument.AsBsonDocument); return(writeConcern.IsAcknowledged); } else { return(true); } } }