You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
304 lines
11 KiB
304 lines
11 KiB
/* Copyright 2010-2011 10gen Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
using MongoDB.Bson;
|
|
|
|
namespace MongoDB.Driver {
|
|
/// <summary>
|
|
/// The settings used to access a collection (an abstract class, see MongoCollectionSettings{TDefaultDocument}).
|
|
/// </summary>
|
|
public abstract class MongoCollectionSettings {
|
|
#pragma warning disable 1591 // missing XML comment (it's warning about protected members also)
|
|
#region protected fields
|
|
protected string collectionName;
|
|
protected bool assignIdOnInsert;
|
|
protected Type defaultDocumentType;
|
|
protected GuidRepresentation guidRepresentation;
|
|
protected SafeMode safeMode;
|
|
protected bool slaveOk;
|
|
// the following fields are set when Freeze is called
|
|
protected bool isFrozen;
|
|
protected int frozenHashCode;
|
|
protected string frozenStringRepresentation;
|
|
#endregion
|
|
|
|
#region constructors
|
|
protected MongoCollectionSettings(
|
|
MongoDatabase database,
|
|
string collectionName,
|
|
Type defaultDocumentType
|
|
) {
|
|
var databaseSettings = database.Settings;
|
|
this.collectionName = collectionName;
|
|
this.assignIdOnInsert = MongoDefaults.AssignIdOnInsert;
|
|
this.defaultDocumentType = defaultDocumentType;
|
|
this.guidRepresentation = databaseSettings.GuidRepresentation;
|
|
this.safeMode = databaseSettings.SafeMode;
|
|
this.slaveOk = databaseSettings.SlaveOk;
|
|
}
|
|
|
|
protected MongoCollectionSettings(
|
|
string collectionName,
|
|
bool assignIdOnInsert,
|
|
Type defaultDocumentType,
|
|
GuidRepresentation guidRepresentation,
|
|
SafeMode safeMode,
|
|
bool slaveOk
|
|
) {
|
|
this.collectionName = collectionName;
|
|
this.assignIdOnInsert = assignIdOnInsert;
|
|
this.defaultDocumentType = defaultDocumentType;
|
|
this.guidRepresentation = guidRepresentation;
|
|
this.safeMode = safeMode;
|
|
this.slaveOk = slaveOk;
|
|
}
|
|
#endregion
|
|
#pragma warning restore
|
|
|
|
#region public properties
|
|
/// <summary>
|
|
/// Gets or sets whether the driver should assign Id values when missing.
|
|
/// </summary>
|
|
public bool AssignIdOnInsert {
|
|
get { return assignIdOnInsert; }
|
|
set {
|
|
if (isFrozen) { throw new InvalidOperationException("MongoCollectionSettings is frozen."); }
|
|
assignIdOnInsert = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the name of the collection.
|
|
/// </summary>
|
|
public string CollectionName {
|
|
get { return collectionName; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the default document type of the collection.
|
|
/// </summary>
|
|
public Type DefaultDocumentType {
|
|
get { return defaultDocumentType; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the representation used for Guids.
|
|
/// </summary>
|
|
public GuidRepresentation GuidRepresentation {
|
|
get { return guidRepresentation; }
|
|
set {
|
|
if (isFrozen) { throw new InvalidOperationException("MongoCollectionSettings is frozen."); }
|
|
guidRepresentation = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets whether the settings have been frozen to prevent further changes.
|
|
/// </summary>
|
|
public bool IsFrozen {
|
|
get { return isFrozen; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the SafeMode to use.
|
|
/// </summary>
|
|
public SafeMode SafeMode {
|
|
get { return safeMode; }
|
|
set {
|
|
if (isFrozen) { throw new InvalidOperationException("MongoCollectionSettings is frozen."); }
|
|
safeMode = value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets whether queries should be sent to secondary servers.
|
|
/// </summary>
|
|
public bool SlaveOk {
|
|
get { return slaveOk; }
|
|
set {
|
|
if (isFrozen) { throw new InvalidOperationException("MongoCollectionSettings is frozen."); }
|
|
slaveOk = value;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region public methods
|
|
/// <summary>
|
|
/// Creates a clone of the settings.
|
|
/// </summary>
|
|
/// <returns>A clone of the settings.</returns>
|
|
public abstract MongoCollectionSettings Clone();
|
|
|
|
/// <summary>
|
|
/// Compares two MongoCollectionSettings instances.
|
|
/// </summary>
|
|
/// <param name="obj">The other instance.</param>
|
|
/// <returns>True if the two instances are equal.</returns>
|
|
public override bool Equals(object obj) {
|
|
var rhs = obj as MongoCollectionSettings;
|
|
if (rhs == null) {
|
|
return false;
|
|
} else {
|
|
if (this.isFrozen && rhs.isFrozen) {
|
|
return this.frozenStringRepresentation == rhs.frozenStringRepresentation;
|
|
} else {
|
|
return
|
|
this.collectionName == rhs.collectionName &&
|
|
this.assignIdOnInsert == rhs.assignIdOnInsert &&
|
|
this.defaultDocumentType == rhs.defaultDocumentType &&
|
|
this.guidRepresentation == rhs.guidRepresentation &&
|
|
this.safeMode == rhs.safeMode &&
|
|
this.slaveOk == rhs.slaveOk;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Freezes the settings.
|
|
/// </summary>
|
|
/// <returns>The frozen settings.</returns>
|
|
public MongoCollectionSettings Freeze() {
|
|
if (!isFrozen) {
|
|
safeMode = safeMode.FrozenCopy();
|
|
frozenHashCode = GetHashCodeHelper();
|
|
frozenStringRepresentation = ToStringHelper();
|
|
isFrozen = true;
|
|
}
|
|
return this;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns a frozen copy of the settings.
|
|
/// </summary>
|
|
/// <returns>A frozen copy of the settings.</returns>
|
|
public MongoCollectionSettings FrozenCopy() {
|
|
if (isFrozen) {
|
|
return this;
|
|
} else {
|
|
return Clone().Freeze();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the hash code.
|
|
/// </summary>
|
|
/// <returns>The hash code.</returns>
|
|
public override int GetHashCode() {
|
|
if (isFrozen) {
|
|
return frozenHashCode;
|
|
} else {
|
|
return GetHashCodeHelper();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns a string representation of the settings.
|
|
/// </summary>
|
|
/// <returns>A string representation of the settings.</returns>
|
|
public override string ToString() {
|
|
if (isFrozen) {
|
|
return frozenStringRepresentation;
|
|
} else {
|
|
return ToStringHelper();
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region private methods
|
|
private int GetHashCodeHelper() {
|
|
// see Effective Java by Joshua Bloch
|
|
int hash = 17;
|
|
hash = 37 * hash + ((collectionName == null) ? 0 : collectionName.GetHashCode());
|
|
hash = 37 * hash + assignIdOnInsert.GetHashCode();
|
|
hash = 37 * hash + ((defaultDocumentType == null) ? 0 : defaultDocumentType.GetHashCode());
|
|
hash = 37 * hash + guidRepresentation.GetHashCode();
|
|
hash = 37 * hash + ((safeMode == null) ? 0 : safeMode.GetHashCode());
|
|
hash = 37 * hash + slaveOk.GetHashCode();
|
|
return hash;
|
|
}
|
|
|
|
private string ToStringHelper() {
|
|
return string.Format(
|
|
"CollectionName={0};AssignIdOnInsert={1};DefaultDocumentType={2};GuidRepresentation={3};SafeMode={4};SlaveOk={5}",
|
|
collectionName,
|
|
assignIdOnInsert,
|
|
defaultDocumentType,
|
|
guidRepresentation,
|
|
safeMode,
|
|
slaveOk
|
|
);
|
|
}
|
|
#endregion
|
|
}
|
|
|
|
/// <summary>
|
|
/// Settings used to access a collection.
|
|
/// </summary>
|
|
/// <typeparam name="TDefaultDocument">The default document type of the collection.</typeparam>
|
|
public class MongoCollectionSettings<TDefaultDocument> : MongoCollectionSettings {
|
|
#region constructors
|
|
/// <summary>
|
|
/// Creates a new instance of MongoCollectionSettings.
|
|
/// </summary>
|
|
/// <param name="database">The database to inherit settings from.</param>
|
|
/// <param name="collectionName">The name of the collection.</param>
|
|
public MongoCollectionSettings(
|
|
MongoDatabase database,
|
|
string collectionName
|
|
)
|
|
: base(database, collectionName, typeof(TDefaultDocument)) {
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a new instance of MongoCollectionSettings.
|
|
/// </summary>
|
|
/// <param name="collectionName">The name of the collection.</param>
|
|
/// <param name="assignIdOnInsert">Whether the driver should assign the Id values if necessary.</param>
|
|
/// <param name="guidRepresentation">The representation for Guids.</param>
|
|
/// <param name="safeMode">The safe mode to use.</param>
|
|
/// <param name="slaveOk">Whether queries should be sent to secondary servers.</param>
|
|
private MongoCollectionSettings(
|
|
string collectionName,
|
|
bool assignIdOnInsert,
|
|
GuidRepresentation guidRepresentation,
|
|
SafeMode safeMode,
|
|
bool slaveOk
|
|
)
|
|
: base(collectionName, assignIdOnInsert, typeof(TDefaultDocument), guidRepresentation, safeMode, slaveOk) {
|
|
}
|
|
#endregion
|
|
|
|
#region public methods
|
|
/// <summary>
|
|
/// Creates a clone of the settings.
|
|
/// </summary>
|
|
/// <returns>A clone of the settings.</returns>
|
|
public override MongoCollectionSettings Clone() {
|
|
return new MongoCollectionSettings<TDefaultDocument>(
|
|
collectionName,
|
|
assignIdOnInsert,
|
|
guidRepresentation,
|
|
safeMode,
|
|
slaveOk
|
|
);
|
|
}
|
|
#endregion
|
|
}
|
|
}
|