From d4c2977c4db315085234710bc8316d30dba49e88 Mon Sep 17 00:00:00 2001 From: rstam Date: Mon, 22 Nov 2010 19:44:28 -0500 Subject: [PATCH] Added SafeModeResult class. Changed return value of relevant methods in MongoCollection to SafeModeResult or CommandModeResult. Changed return value of InsertBatch to IEnumerable. --- Driver/Core/CommandResults/GeoNearResult.cs | 1 + .../Core/CommandResults/GetLastErrorResult.cs | 9 ++- Driver/Core/CommandResults/SafeModeResult.cs | 32 ++++++++ Driver/Core/MongoCollection.cs | 77 +++++++++---------- Driver/Driver.csproj | 1 + Driver/Internal/MongoConnection.cs | 24 +++--- .../CommandResults/GetLastErrorResultTests.cs | 4 +- 7 files changed, 85 insertions(+), 63 deletions(-) create mode 100644 Driver/Core/CommandResults/SafeModeResult.cs diff --git a/Driver/Core/CommandResults/GeoNearResult.cs b/Driver/Core/CommandResults/GeoNearResult.cs index 44398cd5cc..083a0b877f 100644 --- a/Driver/Core/CommandResults/GeoNearResult.cs +++ b/Driver/Core/CommandResults/GeoNearResult.cs @@ -30,6 +30,7 @@ namespace MongoDB.Driver { #endregion #region public properties + // TODO: implement GeoNearResult #endregion } } diff --git a/Driver/Core/CommandResults/GetLastErrorResult.cs b/Driver/Core/CommandResults/GetLastErrorResult.cs index 27c49d8694..d418a4e2a0 100644 --- a/Driver/Core/CommandResults/GetLastErrorResult.cs +++ b/Driver/Core/CommandResults/GetLastErrorResult.cs @@ -34,11 +34,12 @@ namespace MongoDB.Driver { get { return this["n"].ToInt32(); } } + public bool HasLastErrorMessage { + get { return this["err", false].ToBoolean(); } + } + public string LastErrorMessage { - get { - var err = this["err", null]; - return (err == null || err.IsBsonNull) ? null : err.ToString(); - } + get { return this["err"].ToString(); } } public bool UpdatedExisting { diff --git a/Driver/Core/CommandResults/SafeModeResult.cs b/Driver/Core/CommandResults/SafeModeResult.cs new file mode 100644 index 0000000000..9c9342485d --- /dev/null +++ b/Driver/Core/CommandResults/SafeModeResult.cs @@ -0,0 +1,32 @@ +/* Copyright 2010 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 System.Text.RegularExpressions; + +using MongoDB.Bson; + +namespace MongoDB.Driver { + [Serializable] + public class SafeModeResult : GetLastErrorResult { + #region constructors + public SafeModeResult() { + } + #endregion + } +} diff --git a/Driver/Core/MongoCollection.cs b/Driver/Core/MongoCollection.cs index b6cd305a29..b08afeb245 100644 --- a/Driver/Core/MongoCollection.cs +++ b/Driver/Core/MongoCollection.cs @@ -87,7 +87,7 @@ namespace MongoDB.Driver { return result["n"].ToInt32(); } - public BsonDocument CreateIndex( + public SafeModeResult CreateIndex( TIndexKeys keys, TIndexOptions options ) { @@ -105,13 +105,13 @@ namespace MongoDB.Driver { return result; } - public BsonDocument CreateIndex( + public SafeModeResult CreateIndex( TIndexKeys keys ) { return CreateIndex(keys, IndexOptions.None); } - public BsonDocument CreateIndex( + public SafeModeResult CreateIndex( params string[] keyNames ) { return CreateIndex(IndexKeys.Ascending(keyNames)); @@ -137,11 +137,11 @@ namespace MongoDB.Driver { return result["values"].AsBsonArray; } - public BsonDocument DropAllIndexes() { + public CommandResult DropAllIndexes() { return DropIndexByName("*"); } - public BsonDocument DropIndex( + public CommandResult DropIndex( TIndexKeys keys ) { var keysDocument = keys.ToBsonDocument(); @@ -149,7 +149,7 @@ namespace MongoDB.Driver { return DropIndexByName(indexName); } - public BsonDocument DropIndex( + public CommandResult DropIndex( params string[] keyNames ) { string indexName = GetIndexName(keyNames); @@ -407,32 +407,33 @@ namespace MongoDB.Driver { // it's very easy for the compiler to end up inferring the wrong type for TDocument! // that's also why Insert and InsertBatch have to have different names - public BsonDocument Insert( + public SafeModeResult Insert( TDocument document ) { return Insert(document, safeMode); } - public BsonDocument Insert( + public SafeModeResult Insert( TDocument document, SafeMode safeMode ) { - return InsertBatch(new TDocument[] { document }, safeMode); + var results = InsertBatch(new TDocument[] { document }, safeMode); + return (results == null) ? null : results.Single(); } - public BsonDocument InsertBatch( + public IEnumerable InsertBatch( IEnumerable documents ) { return InsertBatch(documents, safeMode); } - public BsonDocument InsertBatch( + public IEnumerable InsertBatch( IEnumerable documents, SafeMode safeMode ) { - BsonArray batches = null; + List results = null; if (safeMode.Enabled) { - batches = new BsonArray(); + results = new List(); } MongoConnection connection = database.GetConnection(false); // not slaveOk @@ -456,27 +457,19 @@ namespace MongoDB.Driver { if (message.MessageLength > MongoDefaults.MaxMessageLength) { byte[] lastDocument = message.RemoveLastDocument(); - var intermediateError = connection.SendMessage(message, safeMode); - if (safeMode.Enabled) { batches.Add(intermediateError); } + var intermediateResult = connection.SendMessage(message, safeMode); + if (safeMode.Enabled) { results.Add(intermediateResult); } message.ResetBatch(lastDocument); } } - var lastError = connection.SendMessage(message, safeMode); - if (safeMode.Enabled) { batches.Add(lastError); } + var finalResult = connection.SendMessage(message, safeMode); + if (safeMode.Enabled) { results.Add(finalResult); } } database.ReleaseConnection(connection); - if (safeMode.Enabled) { - if (batches.Count() == 1) { - return batches[0].AsBsonDocument; - } else { - return new BsonDocument("batches", batches); - } - } else { - return null; - } + return results; } public bool IsCapped() { @@ -527,27 +520,27 @@ namespace MongoDB.Driver { throw new NotImplementedException(); } - public BsonDocument Remove( + public SafeModeResult Remove( TQuery query ) { return Remove(query, RemoveFlags.None, safeMode); } - public BsonDocument Remove( + public SafeModeResult Remove( TQuery query, SafeMode safeMode ) { return Remove(query, RemoveFlags.None, safeMode); } - public BsonDocument Remove( + public SafeModeResult Remove( TQuery query, RemoveFlags flags ) { return Remove(query, flags, safeMode); } - public BsonDocument Remove( + public SafeModeResult Remove( TQuery query, RemoveFlags flags, SafeMode safeMode @@ -569,18 +562,18 @@ namespace MongoDB.Driver { using (var message = new MongoDeleteMessage(FullName, flags, query)) { var connection = database.GetConnection(false); // not slaveOk - var lastError = connection.SendMessage(message, safeMode); + var result = connection.SendMessage(message, safeMode); database.ReleaseConnection(connection); - return lastError; + return result; } } - public BsonDocument RemoveAll() { + public SafeModeResult RemoveAll() { BsonDocument query = null; return Remove(query, RemoveFlags.None, safeMode); } - public BsonDocument RemoveAll( + public SafeModeResult RemoveAll( SafeMode safeMode ) { BsonDocument query = null; @@ -593,13 +586,13 @@ namespace MongoDB.Driver { } } - public BsonDocument Save( + public SafeModeResult Save( TDocument document ) { return Save(document, safeMode); } - public BsonDocument Save( + public SafeModeResult Save( TDocument document, SafeMode safeMode ) { @@ -622,14 +615,14 @@ namespace MongoDB.Driver { return FullName; } - public BsonDocument Update( + public SafeModeResult Update( TQuery query, TUpdate update ) { return Update(query, update, UpdateFlags.None, safeMode); } - public BsonDocument Update( + public SafeModeResult Update( TQuery query, TUpdate update, SafeMode safeMode @@ -637,7 +630,7 @@ namespace MongoDB.Driver { return Update(query, update, UpdateFlags.None, safeMode); } - public BsonDocument Update( + public SafeModeResult Update( TQuery query, TUpdate update, UpdateFlags flags @@ -645,7 +638,7 @@ namespace MongoDB.Driver { return Update(query, update, flags, safeMode); } - public BsonDocument Update( + public SafeModeResult Update( TQuery query, TUpdate update, UpdateFlags flags, @@ -661,9 +654,9 @@ namespace MongoDB.Driver { using (var message = new MongoUpdateMessage(FullName, flags, query, update)) { var connection = database.GetConnection(false); // not slaveOk - var lastError = connection.SendMessage(message, safeMode); + var result = connection.SendMessage(message, safeMode); database.ReleaseConnection(connection); - return lastError; + return result; } } diff --git a/Driver/Driver.csproj b/Driver/Driver.csproj index f1b0225e0f..4034d6aa8c 100644 --- a/Driver/Driver.csproj +++ b/Driver/Driver.csproj @@ -83,6 +83,7 @@ + diff --git a/Driver/Internal/MongoConnection.cs b/Driver/Internal/MongoConnection.cs index afa8fd554e..82950d174d 100644 --- a/Driver/Internal/MongoConnection.cs +++ b/Driver/Internal/MongoConnection.cs @@ -315,7 +315,7 @@ namespace MongoDB.Driver.Internal { } } - internal BsonDocument SendMessage( + internal SafeModeResult SendMessage( MongoRequestMessage message, SafeMode safeMode ) { @@ -353,28 +353,22 @@ namespace MongoDB.Driver.Internal { throw; } - BsonDocument lastError = null; + SafeModeResult result = null; if (safeMode.Enabled) { - var replyMessage = ReceiveMessage(); - lastError = replyMessage.Documents[0]; + var replyMessage = ReceiveMessage(); + result = replyMessage.Documents[0]; - if (!lastError.Contains("ok")) { - throw new MongoSafeModeException("ok element is missing"); - } - if (!lastError["ok"].ToBoolean()) { - string errmsg = lastError["errmsg"].AsString; - string errorMessage = string.Format("Safemode detected an error ({0})", errmsg); + if (!result.Ok) { + var errorMessage = string.Format("Safemode detected an error: {0}", result.ErrorMessage); throw new MongoSafeModeException(errorMessage); } - - if (lastError["err", false].ToBoolean()) { - var err = lastError["err"].AsString; - string errorMessage = string.Format("Safemode detected an error ({0})", err); + if (result.HasLastErrorMessage) { + var errorMessage = string.Format("Safemode detected an error: {0}", result.LastErrorMessage); throw new MongoSafeModeException(errorMessage); } } - return lastError; + return result; } } #endregion diff --git a/DriverOnlineTests/Core/CommandResults/GetLastErrorResultTests.cs b/DriverOnlineTests/Core/CommandResults/GetLastErrorResultTests.cs index cd7828d9a2..b9b6e41119 100644 --- a/DriverOnlineTests/Core/CommandResults/GetLastErrorResultTests.cs +++ b/DriverOnlineTests/Core/CommandResults/GetLastErrorResultTests.cs @@ -43,7 +43,7 @@ namespace MongoDB.DriverOnlineTests.CommandResults { using (database.RequestStart()) { collection.Insert(new BsonDocument()); var result = server.GetLastError(); - Assert.IsNull(result.LastErrorMessage); + Assert.IsFalse(result.HasLastErrorMessage); Assert.IsFalse(result.UpdatedExisting); Assert.AreEqual(0, result.DocumentsAffected); // note: DocumentsAffected is only set after an Update? } @@ -63,7 +63,7 @@ namespace MongoDB.DriverOnlineTests.CommandResults { var update = Update.Inc("x", 1); collection.Update(query, update); var result = server.GetLastError(); - Assert.IsNull(result.LastErrorMessage); + Assert.IsFalse(result.HasLastErrorMessage); Assert.IsTrue(result.UpdatedExisting); Assert.AreEqual(1, result.DocumentsAffected); }