MongoClient.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /* Copyright 2010-2016 MongoDB Inc.
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. using System.Threading;
  16. using System.Threading.Tasks;
  17. using MongoDB.Bson;
  18. using MongoDB.Bson.IO;
  19. using MongoDB.Driver.Core.Bindings;
  20. using MongoDB.Driver.Core.Clusters;
  21. using MongoDB.Driver.Core.Misc;
  22. using MongoDB.Driver.Core.Operations;
  23. using MongoDB.Driver.Core.WireProtocol.Messages.Encoders;
  24. namespace MongoDB.Driver
  25. {
  26. /// <inheritdoc/>
  27. public class MongoClient : MongoClientBase
  28. {
  29. // private fields
  30. private readonly ICluster _cluster;
  31. private readonly IOperationExecutor _operationExecutor;
  32. private readonly MongoClientSettings _settings;
  33. // constructors
  34. /// <summary>
  35. /// Initializes a new instance of the MongoClient class.
  36. /// </summary>
  37. public MongoClient()
  38. : this(new MongoClientSettings())
  39. {
  40. }
  41. /// <summary>
  42. /// Initializes a new instance of the MongoClient class.
  43. /// </summary>
  44. /// <param name="settings">The settings.</param>
  45. public MongoClient(MongoClientSettings settings)
  46. {
  47. _settings = Ensure.IsNotNull(settings, nameof(settings)).FrozenCopy();
  48. _cluster = ClusterRegistry.Instance.GetOrCreateCluster(_settings.ToClusterKey());
  49. _operationExecutor = new OperationExecutor();
  50. }
  51. /// <summary>
  52. /// Initializes a new instance of the MongoClient class.
  53. /// </summary>
  54. /// <param name="url">The URL.</param>
  55. public MongoClient(MongoUrl url)
  56. : this(MongoClientSettings.FromUrl(url))
  57. {
  58. }
  59. /// <summary>
  60. /// Initializes a new instance of the MongoClient class.
  61. /// </summary>
  62. /// <param name="connectionString">The connection string.</param>
  63. public MongoClient(string connectionString)
  64. : this(ParseConnectionString(connectionString))
  65. {
  66. }
  67. internal MongoClient(IOperationExecutor operationExecutor, MongoClientSettings settings)
  68. : this(settings)
  69. {
  70. _operationExecutor = operationExecutor;
  71. }
  72. // public properties
  73. /// <summary>
  74. /// Gets the cluster.
  75. /// </summary>
  76. public override ICluster Cluster
  77. {
  78. get { return _cluster; }
  79. }
  80. /// <inheritdoc/>
  81. public sealed override MongoClientSettings Settings
  82. {
  83. get { return _settings; }
  84. }
  85. // private static methods
  86. private static MongoClientSettings ParseConnectionString(string connectionString)
  87. {
  88. var url = new MongoUrl(connectionString);
  89. return MongoClientSettings.FromUrl(url);
  90. }
  91. // public methods
  92. /// <inheritdoc/>
  93. public sealed override void DropDatabase(string name, CancellationToken cancellationToken = default(CancellationToken))
  94. {
  95. var messageEncoderSettings = GetMessageEncoderSettings();
  96. var operation = new DropDatabaseOperation(new DatabaseNamespace(name), messageEncoderSettings)
  97. {
  98. WriteConcern = _settings.WriteConcern
  99. };
  100. using (var binding = new WritableServerBinding(_cluster))
  101. {
  102. _operationExecutor.ExecuteWriteOperation(binding, operation, cancellationToken);
  103. }
  104. }
  105. /// <inheritdoc/>
  106. public sealed override async Task DropDatabaseAsync(string name, CancellationToken cancellationToken = default(CancellationToken))
  107. {
  108. var messageEncoderSettings = GetMessageEncoderSettings();
  109. var operation = new DropDatabaseOperation(new DatabaseNamespace(name), messageEncoderSettings)
  110. {
  111. WriteConcern = _settings.WriteConcern
  112. };
  113. using (var binding = new WritableServerBinding(_cluster))
  114. {
  115. await _operationExecutor.ExecuteWriteOperationAsync(binding, operation, cancellationToken).ConfigureAwait(false);
  116. }
  117. }
  118. /// <inheritdoc/>
  119. public sealed override IMongoDatabase GetDatabase(string name, MongoDatabaseSettings settings = null)
  120. {
  121. settings = settings == null ?
  122. new MongoDatabaseSettings() :
  123. settings.Clone();
  124. settings.ApplyDefaultValues(_settings);
  125. return new MongoDatabaseImpl(this, new DatabaseNamespace(name), settings, _cluster, _operationExecutor);
  126. }
  127. /// <inheritdoc/>
  128. public sealed override IAsyncCursor<BsonDocument> ListDatabases(CancellationToken cancellationToken = default(CancellationToken))
  129. {
  130. var messageEncoderSettings = GetMessageEncoderSettings();
  131. var operation = new ListDatabasesOperation(messageEncoderSettings);
  132. using (var binding = new ReadPreferenceBinding(_cluster, _settings.ReadPreference))
  133. {
  134. return _operationExecutor.ExecuteReadOperation(binding, operation, cancellationToken);
  135. }
  136. }
  137. /// <inheritdoc/>
  138. public sealed override async Task<IAsyncCursor<BsonDocument>> ListDatabasesAsync(CancellationToken cancellationToken = default(CancellationToken))
  139. {
  140. var messageEncoderSettings = GetMessageEncoderSettings();
  141. var operation = new ListDatabasesOperation(messageEncoderSettings);
  142. using (var binding = new ReadPreferenceBinding(_cluster, _settings.ReadPreference))
  143. {
  144. return await _operationExecutor.ExecuteReadOperationAsync(binding, operation, cancellationToken).ConfigureAwait(false);
  145. }
  146. }
  147. /// <inheritdoc/>
  148. public override IMongoClient WithReadConcern(ReadConcern readConcern)
  149. {
  150. Ensure.IsNotNull(readConcern, nameof(readConcern));
  151. var newSettings = Settings.Clone();
  152. newSettings.ReadConcern = readConcern;
  153. return new MongoClient(_operationExecutor, newSettings);
  154. }
  155. /// <inheritdoc/>
  156. public override IMongoClient WithReadPreference(ReadPreference readPreference)
  157. {
  158. Ensure.IsNotNull(readPreference, nameof(readPreference));
  159. var newSettings = Settings.Clone();
  160. newSettings.ReadPreference = readPreference;
  161. return new MongoClient(_operationExecutor, newSettings);
  162. }
  163. /// <inheritdoc/>
  164. public override IMongoClient WithWriteConcern(WriteConcern writeConcern)
  165. {
  166. Ensure.IsNotNull(writeConcern, nameof(writeConcern));
  167. var newSettings = Settings.Clone();
  168. newSettings.WriteConcern = writeConcern;
  169. return new MongoClient(_operationExecutor, newSettings);
  170. }
  171. // private methods
  172. private MessageEncoderSettings GetMessageEncoderSettings()
  173. {
  174. return new MessageEncoderSettings
  175. {
  176. { MessageEncoderSettingsName.GuidRepresentation, _settings.GuidRepresentation },
  177. { MessageEncoderSettingsName.ReadEncoding, _settings.ReadEncoding ?? Utf8Encodings.Strict },
  178. { MessageEncoderSettingsName.WriteEncoding, _settings.WriteEncoding ?? Utf8Encodings.Strict }
  179. };
  180. }
  181. }
  182. }