Beispiel #1
0
        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);
                }
            }
        }