Browse Source

Added SafeModeResult class. Changed return value of relevant methods in MongoCollection to SafeModeResult or CommandModeResult. Changed return value of InsertBatch to IEnumerable<SafeModeResult>.

pull/29/head
rstam 15 years ago
parent
commit
d4c2977c4d
  1. 1
      Driver/Core/CommandResults/GeoNearResult.cs
  2. 9
      Driver/Core/CommandResults/GetLastErrorResult.cs
  3. 32
      Driver/Core/CommandResults/SafeModeResult.cs
  4. 77
      Driver/Core/MongoCollection.cs
  5. 1
      Driver/Driver.csproj
  6. 24
      Driver/Internal/MongoConnection.cs
  7. 4
      DriverOnlineTests/Core/CommandResults/GetLastErrorResultTests.cs

1
Driver/Core/CommandResults/GeoNearResult.cs

@ -30,6 +30,7 @@ namespace MongoDB.Driver {
#endregion
#region public properties
// TODO: implement GeoNearResult
#endregion
}
}

9
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 {

32
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
}
}

77
Driver/Core/MongoCollection.cs

@ -87,7 +87,7 @@ namespace MongoDB.Driver {
return result["n"].ToInt32();
}
public BsonDocument CreateIndex<TIndexKeys, TIndexOptions>(
public SafeModeResult CreateIndex<TIndexKeys, TIndexOptions>(
TIndexKeys keys,
TIndexOptions options
) {
@ -105,13 +105,13 @@ namespace MongoDB.Driver {
return result;
}
public BsonDocument CreateIndex<TIndexKeys>(
public SafeModeResult CreateIndex<TIndexKeys>(
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<TIndexKeys>(
public CommandResult DropIndex<TIndexKeys>(
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<TDocument>(
public SafeModeResult Insert<TDocument>(
TDocument document
) {
return Insert(document, safeMode);
}
public BsonDocument Insert<TDocument>(
public SafeModeResult Insert<TDocument>(
TDocument document,
SafeMode safeMode
) {
return InsertBatch<TDocument>(new TDocument[] { document }, safeMode);
var results = InsertBatch<TDocument>(new TDocument[] { document }, safeMode);
return (results == null) ? null : results.Single();
}
public BsonDocument InsertBatch<TDocument>(
public IEnumerable<SafeModeResult> InsertBatch<TDocument>(
IEnumerable<TDocument> documents
) {
return InsertBatch<TDocument>(documents, safeMode);
}
public BsonDocument InsertBatch<TDocument>(
public IEnumerable<SafeModeResult> InsertBatch<TDocument>(
IEnumerable<TDocument> documents,
SafeMode safeMode
) {
BsonArray batches = null;
List<SafeModeResult> results = null;
if (safeMode.Enabled) {
batches = new BsonArray();
results = new List<SafeModeResult>();
}
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<TQuery>(
public SafeModeResult Remove<TQuery>(
TQuery query
) {
return Remove(query, RemoveFlags.None, safeMode);
}
public BsonDocument Remove<TQuery>(
public SafeModeResult Remove<TQuery>(
TQuery query,
SafeMode safeMode
) {
return Remove(query, RemoveFlags.None, safeMode);
}
public BsonDocument Remove<TQuery>(
public SafeModeResult Remove<TQuery>(
TQuery query,
RemoveFlags flags
) {
return Remove(query, flags, safeMode);
}
public BsonDocument Remove<TQuery>(
public SafeModeResult Remove<TQuery>(
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<TDocument>(
public SafeModeResult Save<TDocument>(
TDocument document
) {
return Save(document, safeMode);
}
public BsonDocument Save<TDocument>(
public SafeModeResult Save<TDocument>(
TDocument document,
SafeMode safeMode
) {
@ -622,14 +615,14 @@ namespace MongoDB.Driver {
return FullName;
}
public BsonDocument Update<TQuery, TUpdate>(
public SafeModeResult Update<TQuery, TUpdate>(
TQuery query,
TUpdate update
) {
return Update(query, update, UpdateFlags.None, safeMode);
}
public BsonDocument Update<TQuery, TUpdate>(
public SafeModeResult Update<TQuery, TUpdate>(
TQuery query,
TUpdate update,
SafeMode safeMode
@ -637,7 +630,7 @@ namespace MongoDB.Driver {
return Update(query, update, UpdateFlags.None, safeMode);
}
public BsonDocument Update<TQuery, TUpdate>(
public SafeModeResult Update<TQuery, TUpdate>(
TQuery query,
TUpdate update,
UpdateFlags flags
@ -645,7 +638,7 @@ namespace MongoDB.Driver {
return Update(query, update, flags, safeMode);
}
public BsonDocument Update<TQuery, TUpdate>(
public SafeModeResult Update<TQuery, TUpdate>(
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;
}
}

1
Driver/Driver.csproj

@ -83,6 +83,7 @@
<Compile Include="Core\CommandResults\DatabaseStatsResult.cs" />
<Compile Include="Core\CommandResults\GeoNearResult.cs" />
<Compile Include="Core\CommandResults\GetLastErrorResult.cs" />
<Compile Include="Core\CommandResults\SafeModeResult.cs" />
<Compile Include="Core\CommandResults\ValidateCollectionResult.cs" />
<Compile Include="Core\MongoDBRef.cs" />
<Compile Include="Core\MongoUrlBuilder.cs" />

24
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<BsonDocument>();
lastError = replyMessage.Documents[0];
var replyMessage = ReceiveMessage<SafeModeResult>();
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

4
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);
}

Loading…
Cancel
Save