Move bulk operation to collection and add docs
parent
283a94ce18
commit
13e0d1662f
@ -1,190 +0,0 @@
|
|||||||
use mongoc::bindings;
|
|
||||||
use bson::Document;
|
|
||||||
|
|
||||||
use super::BsoncError;
|
|
||||||
use super::bsonc::Bsonc;
|
|
||||||
use super::collection::Collection;
|
|
||||||
|
|
||||||
use super::Result;
|
|
||||||
|
|
||||||
/// `BulkOperation` provides an abstraction for submitting multiple write operations as a single batch.
|
|
||||||
///
|
|
||||||
/// Create a `BulkOperation` by calling `create_bulk_operation` on a `Collection`. After adding all of
|
|
||||||
/// the write operations using the functions on this struct, `execute` to execute the operation on
|
|
||||||
/// the server. After executing the bulk operation is consumed and cannot be used anymore.
|
|
||||||
|
|
||||||
pub struct BulkOperation<'a> {
|
|
||||||
_collection: &'a Collection<'a>,
|
|
||||||
inner: *mut bindings::mongoc_bulk_operation_t
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a>BulkOperation<'a> {
|
|
||||||
/// Create a new bulk operation, only for internal usage.
|
|
||||||
#[doc(hidden)]
|
|
||||||
pub unsafe fn new(
|
|
||||||
collection: &'a Collection<'a>,
|
|
||||||
inner: *mut bindings::mongoc_bulk_operation_t
|
|
||||||
) -> BulkOperation<'a> {
|
|
||||||
assert!(!inner.is_null());
|
|
||||||
BulkOperation {
|
|
||||||
_collection: collection,
|
|
||||||
inner: inner
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Queue an insert of a single document into a bulk operation.
|
|
||||||
/// The insert is not performed until `execute` is called.
|
|
||||||
pub fn insert(
|
|
||||||
&self,
|
|
||||||
document: &Document
|
|
||||||
) -> Result<()> {
|
|
||||||
assert!(!self.inner.is_null());
|
|
||||||
unsafe {
|
|
||||||
bindings::mongoc_bulk_operation_insert(
|
|
||||||
self.inner,
|
|
||||||
try!(Bsonc::from_document(&document)).inner()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Queue removal of all documents matching the provided selector into a bulk operation.
|
|
||||||
/// The removal is not performed until `execute` is called.
|
|
||||||
pub fn remove(
|
|
||||||
&self,
|
|
||||||
selector: &Document
|
|
||||||
) -> Result<()> {
|
|
||||||
assert!(!self.inner.is_null());
|
|
||||||
unsafe {
|
|
||||||
bindings::mongoc_bulk_operation_remove(
|
|
||||||
self.inner,
|
|
||||||
try!(Bsonc::from_document(&selector)).inner()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Queue removal of a single document into a bulk operation.
|
|
||||||
/// The removal is not performed until `execute` is called.
|
|
||||||
pub fn remove_one(
|
|
||||||
&self,
|
|
||||||
selector: &Document
|
|
||||||
) -> Result<()> {
|
|
||||||
assert!(!self.inner.is_null());
|
|
||||||
unsafe {
|
|
||||||
bindings::mongoc_bulk_operation_remove_one(
|
|
||||||
self.inner,
|
|
||||||
try!(Bsonc::from_document(&selector)).inner()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Queue replacement of a single document into a bulk operation.
|
|
||||||
/// The replacement is not performed until `execute` is called.
|
|
||||||
pub fn replace_one(
|
|
||||||
&self,
|
|
||||||
selector: &Document,
|
|
||||||
document: &Document,
|
|
||||||
upsert: bool
|
|
||||||
) -> Result<()> {
|
|
||||||
assert!(!self.inner.is_null());
|
|
||||||
unsafe {
|
|
||||||
bindings::mongoc_bulk_operation_replace_one(
|
|
||||||
self.inner,
|
|
||||||
try!(Bsonc::from_document(&selector)).inner(),
|
|
||||||
try!(Bsonc::from_document(&document)).inner(),
|
|
||||||
upsert as u8
|
|
||||||
)
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Queue update of a single documents into a bulk operation.
|
|
||||||
/// The update is not performed until `execute` is called.
|
|
||||||
///
|
|
||||||
/// TODO: document must only contain fields whose key starts
|
|
||||||
/// with $, these is no error handling for this.
|
|
||||||
pub fn update_one(
|
|
||||||
&self,
|
|
||||||
selector: &Document,
|
|
||||||
document: &Document,
|
|
||||||
upsert: bool
|
|
||||||
) -> Result<()> {
|
|
||||||
assert!(!self.inner.is_null());
|
|
||||||
unsafe {
|
|
||||||
bindings::mongoc_bulk_operation_update_one(
|
|
||||||
self.inner,
|
|
||||||
try!(Bsonc::from_document(&selector)).inner(),
|
|
||||||
try!(Bsonc::from_document(&document)).inner(),
|
|
||||||
upsert as u8
|
|
||||||
)
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Queue update of multiple documents into a bulk operation.
|
|
||||||
/// The update is not performed until `execute` is called.
|
|
||||||
///
|
|
||||||
/// TODO: document must only contain fields whose key starts
|
|
||||||
/// with $, these is no error handling for this.
|
|
||||||
pub fn update(
|
|
||||||
&self,
|
|
||||||
selector: &Document,
|
|
||||||
document: &Document,
|
|
||||||
upsert: bool
|
|
||||||
) -> Result<()> {
|
|
||||||
assert!(!self.inner.is_null());
|
|
||||||
unsafe {
|
|
||||||
bindings::mongoc_bulk_operation_update(
|
|
||||||
self.inner,
|
|
||||||
try!(Bsonc::from_document(&selector)).inner(),
|
|
||||||
try!(Bsonc::from_document(&document)).inner(),
|
|
||||||
upsert as u8
|
|
||||||
)
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// This function executes all operations queued into this bulk operation.
|
|
||||||
/// If ordered was set true, forward progress will be stopped upon the first error.
|
|
||||||
///
|
|
||||||
/// This function takes ownership because it is not possible to execute a bulk operation
|
|
||||||
/// multiple times.
|
|
||||||
///
|
|
||||||
/// Returns a document with an overview of the bulk operation if successfull.
|
|
||||||
pub fn execute(self) -> Result<Document> {
|
|
||||||
// Bsonc to store the reply
|
|
||||||
let mut reply = Bsonc::new();
|
|
||||||
// Empty error that might be filled
|
|
||||||
let mut error = BsoncError::empty();
|
|
||||||
|
|
||||||
// Execute the operation. This returns a non-zero hint of the peer node on
|
|
||||||
// success, otherwise 0 and error is set.
|
|
||||||
let return_value = unsafe {
|
|
||||||
bindings::mongoc_bulk_operation_execute(
|
|
||||||
self.inner,
|
|
||||||
reply.mut_inner(),
|
|
||||||
error.mut_inner()
|
|
||||||
)
|
|
||||||
};
|
|
||||||
|
|
||||||
if return_value != 0 {
|
|
||||||
match reply.as_document() {
|
|
||||||
Ok(document) => return Ok(document),
|
|
||||||
Err(error) => return Err(error.into())
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Err(error.into())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> Drop for BulkOperation<'a> {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
assert!(!self.inner.is_null());
|
|
||||||
unsafe {
|
|
||||||
bindings::mongoc_bulk_operation_destroy(self.inner);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue