/* Copyright 2010-present MongoDB 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
{
///
/// The result of an update operation.
///
public abstract class UpdateResult
{
// static
internal static UpdateResult FromCore(BulkWriteResult result)
{
if (result.IsAcknowledged)
{
var upsert = result.Upserts.Count == 1
? result.Upserts[0].Id
: null;
var modifiedCount = result.IsModifiedCountAvailable
? (long?)result.ModifiedCount
: null;
return new Acknowledged(result.MatchedCount, modifiedCount, upsert);
}
return Unacknowledged.Instance;
}
// properties
///
/// Gets a value indicating whether the result is acknowledged.
///
public abstract bool IsAcknowledged { get; }
///
/// Gets a value indicating whether the modified count is available.
///
///
/// The available modified count.
///
public abstract bool IsModifiedCountAvailable { get; }
///
/// Gets the matched count. If IsAcknowledged is false, this will throw an exception.
///
public abstract long MatchedCount { get; }
///
/// Gets the modified count. If IsAcknowledged is false, this will throw an exception.
///
public abstract long ModifiedCount { get; }
///
/// Gets the upserted id, if one exists. If IsAcknowledged is false, this will throw an exception.
///
public abstract BsonValue UpsertedId { get; }
// constructors
///
/// Initializes a new instance of the class.
///
protected UpdateResult()
{
}
// nested classes
///
/// The result of an acknowledged update operation.
///
public class Acknowledged : UpdateResult
{
private readonly long _matchedCount;
private readonly long? _modifiedCount;
private readonly BsonValue _upsertedId;
///
/// Initializes a new instance of the class.
///
/// The matched count.
/// The modified count.
/// The upserted id.
public Acknowledged(long matchedCount, long? modifiedCount, BsonValue upsertedId)
{
_matchedCount = matchedCount;
_modifiedCount = modifiedCount;
_upsertedId = upsertedId;
}
///
public override bool IsAcknowledged
{
get { return true; }
}
///
public override bool IsModifiedCountAvailable
{
get { return _modifiedCount.HasValue; }
}
///
public override long MatchedCount
{
get { return _matchedCount; }
}
///
public override long ModifiedCount
{
get
{
if (!_modifiedCount.HasValue)
{
throw new NotSupportedException("ModifiedCount is not available.");
}
return _modifiedCount.Value;
}
}
///
public override BsonValue UpsertedId
{
get { return _upsertedId; }
}
}
///
/// The result of an acknowledged update operation.
///
public class Unacknowledged : UpdateResult
{
private static Unacknowledged __instance = new Unacknowledged();
///
/// Gets the instance.
///
public static Unacknowledged Instance
{
get { return __instance; }
}
private Unacknowledged()
{
}
///
public override bool IsAcknowledged
{
get { return false; }
}
///
public override bool IsModifiedCountAvailable
{
get { return false; }
}
///
public override long MatchedCount
{
get { throw new NotSupportedException("Only acknowledged writes support the MatchedCount property."); }
}
///
public override long ModifiedCount
{
get { throw new NotSupportedException("Only acknowledged writes support the ModifiedCount property."); }
}
///
public override BsonValue UpsertedId
{
get { throw new NotSupportedException("Only acknowledged writes support the UpsertedId property."); }
}
}
}
}