com.mongodb.DB Maven / Gradle / Ivy
/*
* Copyright 2008-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.
*/
package com.mongodb;
import com.mongodb.annotations.ThreadSafe;
import com.mongodb.client.internal.MongoIterableImpl;
import com.mongodb.client.internal.OperationExecutor;
import com.mongodb.client.model.Collation;
import com.mongodb.client.model.DBCreateViewOptions;
import com.mongodb.client.model.ValidationAction;
import com.mongodb.client.model.ValidationLevel;
import com.mongodb.connection.BufferProvider;
import com.mongodb.lang.Nullable;
import com.mongodb.operation.BatchCursor;
import com.mongodb.operation.CommandReadOperation;
import com.mongodb.operation.CommandWriteOperation;
import com.mongodb.operation.CreateCollectionOperation;
import com.mongodb.operation.CreateViewOperation;
import com.mongodb.operation.DropDatabaseOperation;
import com.mongodb.operation.ListCollectionsOperation;
import com.mongodb.operation.ReadOperation;
import org.bson.BsonDocument;
import org.bson.BsonDocumentWrapper;
import org.bson.BsonInt32;
import org.bson.codecs.BsonDocumentCodec;
import org.bson.codecs.Codec;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import static com.mongodb.DBCollection.createWriteConcernException;
import static com.mongodb.MongoCredential.createCredential;
import static com.mongodb.MongoNamespace.checkDatabaseNameValidity;
import static com.mongodb.ReadPreference.primary;
import static com.mongodb.assertions.Assertions.notNull;
import static java.util.Arrays.asList;
/**
* A thread-safe client view of a logical database in a MongoDB cluster. A DB instance can be achieved from a {@link MongoClient} instance
* using code like:
*
* {@code
* MongoClient mongoClient = new MongoClient();
* DB db = mongoClient.getDB("");
* }
*
*
* See {@link Mongo#getDB(String)} for further information about the effective deprecation of this class.
*
* @mongodb.driver.manual reference/glossary/#term-database Database
* @see MongoClient
*/
@ThreadSafe
@SuppressWarnings("deprecation")
public class DB {
private final Mongo mongo;
private final String name;
private final OperationExecutor executor;
private final ConcurrentHashMap collectionCache;
private final Bytes.OptionHolder optionHolder;
private final Codec commandCodec;
private volatile ReadPreference readPreference;
private volatile WriteConcern writeConcern;
private volatile ReadConcern readConcern;
DB(final Mongo mongo, final String name, final OperationExecutor executor) {
checkDatabaseNameValidity(name);
this.mongo = mongo;
this.name = name;
this.executor = executor;
this.collectionCache = new ConcurrentHashMap();
this.optionHolder = new Bytes.OptionHolder(mongo.getOptionHolder());
this.commandCodec = MongoClient.getCommandCodec();
}
/**
* Constructs a new instance of the {@code DB}.
*
* @param mongo the mongo instance
* @param name the database name - must not be empty and cannot contain spaces
* @deprecated Prefer {@link MongoClient#getDB(String)}
*/
@Deprecated
public DB(final Mongo mongo, final String name) {
this(mongo, name, mongo.createOperationExecutor());
}
/**
* Gets the Mongo instance
*
* @return the mongo instance that this database was created from
* @deprecated Use {@link #getMongoClient()} instead
*/
@Deprecated
public Mongo getMongo() {
return mongo;
}
/**
* Gets the MongoClient instance
*
* @return the MongoClient instance that this database was constructed from
* @throws IllegalStateException if this DB was not created from a MongoClient instance
* @since 3.9
*/
public MongoClient getMongoClient() {
if (mongo instanceof MongoClient) {
return (MongoClient) mongo;
} else {
throw new IllegalStateException("This DB was not created from a MongoClient. Use getMongo instead");
}
}
/**
* Sets the read preference for this database. Will be used as default for read operations from any collection in this database. See the
* documentation for {@link ReadPreference} for more information.
*
* @param readPreference {@code ReadPreference} to use
* @mongodb.driver.manual core/read-preference/ Read Preference
*/
public void setReadPreference(final ReadPreference readPreference) {
this.readPreference = readPreference;
}
/**
* Sets the write concern for this database. It will be used for write operations to any collection in this database. See the
* documentation for {@link WriteConcern} for more information.
*
* @param writeConcern {@code WriteConcern} to use
* @mongodb.driver.manual core/write-concern/ Write Concern
*/
public void setWriteConcern(final WriteConcern writeConcern) {
this.writeConcern = writeConcern;
}
/**
* Gets the read preference for this database.
*
* @return {@code ReadPreference} to be used for read operations, if not specified explicitly
* @mongodb.driver.manual core/read-preference/ Read Preference
*/
public ReadPreference getReadPreference() {
return readPreference != null ? readPreference : mongo.getReadPreference();
}
/**
* Gets the write concern for this database.
*
* @return {@code WriteConcern} to be used for write operations, if not specified explicitly
* @mongodb.driver.manual core/write-concern/ Write Concern
*/
public WriteConcern getWriteConcern() {
return writeConcern != null ? writeConcern : mongo.getWriteConcern();
}
/**
* Sets the read concern for this database.
*
* @param readConcern the read concern to use for this collection
* @since 3.3
* @mongodb.server.release 3.2
* @mongodb.driver.manual reference/readConcern/ Read Concern
*/
public void setReadConcern(final ReadConcern readConcern) {
this.readConcern = readConcern;
}
/**
* Get the read concern for this database.
*
* @return the {@link com.mongodb.ReadConcern}
* @since 3.3
* @mongodb.server.release 3.2
* @mongodb.driver.manual reference/readConcern/ Read Concern
*/
public ReadConcern getReadConcern() {
return readConcern != null ? readConcern : mongo.getReadConcern();
}
/**
* Gets a collection with a given name. If the collection does not exist, a new collection is created.
*
* This class is NOT part of the public API. Be prepared for non-binary compatible changes in minor releases.
*
* @param name the name of the collection
* @return the collection
* @throws IllegalArgumentException if the name is invalid
* @see MongoNamespace#checkCollectionNameValidity(String)
* @deprecated there is no replacement for this method
*/
@Deprecated
protected DBCollection doGetCollection(final String name) {
return getCollection(name);
}
/**
* Gets a collection with a given name.
*
* @param name the name of the collection to return
* @return the collection
* @throws IllegalArgumentException if the name is invalid
* @see MongoNamespace#checkCollectionNameValidity(String)
*/
public DBCollection getCollection(final String name) {
DBCollection collection = collectionCache.get(name);
if (collection != null) {
return collection;
}
collection = new DBCollection(name, this, executor);
if (mongo.getMongoClientOptions().getDbDecoderFactory() != DefaultDBDecoder.FACTORY) {
collection.setDBDecoderFactory(mongo.getMongoClientOptions().getDbDecoderFactory());
}
if (mongo.getMongoClientOptions().getDbEncoderFactory() != DefaultDBEncoder.FACTORY) {
collection.setDBEncoderFactory(mongo.getMongoClientOptions().getDbEncoderFactory());
}
DBCollection old = collectionCache.putIfAbsent(name, collection);
return old != null ? old : collection;
}
/**
* Drops this database. Removes all data on disk. Use with caution.
*
* @throws MongoException if the operation failed
* @mongodb.driver.manual reference/command/dropDatabase/ Drop Database
*/
public void dropDatabase() {
try {
getExecutor().execute(new DropDatabaseOperation(getName(), getWriteConcern()), getReadConcern());
} catch (MongoWriteConcernException e) {
throw createWriteConcernException(e);
}
}
/**
* Returns a collection matching a given string.
*
* @param collectionName the name of the collection
* @return the collection
* @deprecated Prefer {@link #getCollection(String)}
*/
@Deprecated
public DBCollection getCollectionFromString(final String collectionName) {
return getCollection(collectionName);
}
/**
* Returns the name of this database.
*
* @return the name
*/
public String getName() {
return name;
}
/**
* Returns a set containing the names of all collections in this database.
*
* @return the names of collections in this database
* @throws MongoException if the operation failed
* @mongodb.driver.manual reference/method/db.getCollectionNames/ getCollectionNames()
*/
public Set getCollectionNames() {
List collectionNames =
new MongoIterableImpl(null, executor, ReadConcern.DEFAULT, primary(),
mongo.getMongoClientOptions().getRetryReads()) {
@Override
public ReadOperation> asReadOperation() {
return new ListCollectionsOperation(name, commandCodec)
.nameOnly(true);
}
}.map(new Function() {
@Override
public String apply(final DBObject result) {
return (String) result.get("name");
}
}).into(new ArrayList());
Collections.sort(collectionNames);
return new LinkedHashSet(collectionNames);
}
/**
* Creates a collection with a given name and options. If the collection already exists,
* this throws a {@code CommandFailureException}.
*
* Possible options:
*
* - capped ({@code boolean}) - Enables a collection cap. False by default. If enabled,
* you must specify a size parameter.
* - size ({@code int}) - If capped is true, size specifies a maximum size in bytes for the capped collection. When
* capped is false, you may use size to preallocate space.
* - max ({@code int}) - Optional. Specifies a maximum "cap" in number of documents for capped collections. You must
* also specify size when specifying max.
*
* Note that if the {@code options} parameter is {@code null}, the creation will be deferred to when the collection is written
* to.
*
* @param collectionName the name of the collection to return
* @param options options
* @return the collection
* @throws MongoCommandException if the server is unable to create the collection
* @throws WriteConcernException if the {@code WriteConcern} specified on this {@code DB} could not be satisfied
* @throws MongoException for all other failures
* @mongodb.driver.manual reference/method/db.createCollection/ createCollection()
*/
public DBCollection createCollection(final String collectionName, @Nullable final DBObject options) {
if (options != null) {
try {
executor.execute(getCreateCollectionOperation(collectionName, options), getReadConcern());
} catch (MongoWriteConcernException e) {
throw createWriteConcernException(e);
}
}
return getCollection(collectionName);
}
/**
* Creates a view with the given name, backing collection/view name, and aggregation pipeline that defines the view.
*
* @param viewName the name of the view to create
* @param viewOn the backing collection/view for the view
* @param pipeline the pipeline that defines the view
* @return the view as a DBCollection
* @throws MongoCommandException if the server is unable to create the collection
* @throws WriteConcernException if the {@code WriteConcern} specified on this {@code DB} could not be satisfied
* @throws MongoException for all other failures
* @since 3.4
* @mongodb.server.release 3.4
* @mongodb.driver.manual reference/command/create Create Command
*/
public DBCollection createView(final String viewName, final String viewOn, final List pipeline) {
return createView(viewName, viewOn, pipeline, new DBCreateViewOptions());
}
/**
* Creates a view with the given name, backing collection/view name, aggregation pipeline, and options that defines the view.
*
* @param viewName the name of the view to create
* @param viewOn the backing collection/view for the view
* @param pipeline the pipeline that defines the view
* @param options the options for creating the view
* @return the view as a DBCollection
* @throws MongoCommandException if the server is unable to create the collection
* @throws WriteConcernException if the {@code WriteConcern} specified on this {@code DB} could not be satisfied
* @throws MongoException for all other failures
* @since 3.4
* @mongodb.server.release 3.4
* @mongodb.driver.manual reference/command/create Create Command
*/
public DBCollection createView(final String viewName, final String viewOn, final List pipeline,
final DBCreateViewOptions options) {
try {
notNull("options", options);
DBCollection view = getCollection(viewName);
executor.execute(new CreateViewOperation(name, viewName, viewOn, view.preparePipeline(pipeline), writeConcern)
.collation(options.getCollation()), getReadConcern());
return view;
} catch (MongoWriteConcernException e) {
throw createWriteConcernException(e);
}
}
private CreateCollectionOperation getCreateCollectionOperation(final String collectionName, final DBObject options) {
if (options.get("size") != null && !(options.get("size") instanceof Number)) {
throw new IllegalArgumentException("'size' should be Number");
}
if (options.get("max") != null && !(options.get("max") instanceof Number)) {
throw new IllegalArgumentException("'max' should be Number");
}
if (options.get("capped") != null && !(options.get("capped") instanceof Boolean)) {
throw new IllegalArgumentException("'capped' should be Boolean");
}
if (options.get("autoIndexId") != null && !(options.get("autoIndexId") instanceof Boolean)) {
throw new IllegalArgumentException("'autoIndexId' should be Boolean");
}
if (options.get("storageEngine") != null && !(options.get("storageEngine") instanceof DBObject)) {
throw new IllegalArgumentException("'storageEngine' should be DBObject");
}
if (options.get("indexOptionDefaults") != null && !(options.get("indexOptionDefaults") instanceof DBObject)) {
throw new IllegalArgumentException("'indexOptionDefaults' should be DBObject");
}
if (options.get("validator") != null && !(options.get("validator") instanceof DBObject)) {
throw new IllegalArgumentException("'validator' should be DBObject");
}
if (options.get("validationLevel") != null && !(options.get("validationLevel") instanceof String)) {
throw new IllegalArgumentException("'validationLevel' should be String");
}
if (options.get("validationAction") != null && !(options.get("validationAction") instanceof String)) {
throw new IllegalArgumentException("'validationAction' should be String");
}
boolean capped = false;
boolean autoIndex = true;
long sizeInBytes = 0;
long maxDocuments = 0;
Boolean usePowerOfTwoSizes = null;
BsonDocument storageEngineOptions = null;
BsonDocument indexOptionDefaults = null;
BsonDocument validator = null;
ValidationLevel validationLevel = null;
ValidationAction validationAction = null;
if (options.get("capped") != null) {
capped = (Boolean) options.get("capped");
}
if (options.get("size") != null) {
sizeInBytes = ((Number) options.get("size")).longValue();
}
if (options.get("autoIndexId") != null) {
autoIndex = (Boolean) options.get("autoIndexId");
}
if (options.get("max") != null) {
maxDocuments = ((Number) options.get("max")).longValue();
}
if (options.get("usePowerOfTwoSizes") != null) {
usePowerOfTwoSizes = (Boolean) options.get("usePowerOfTwoSizes");
}
if (options.get("storageEngine") != null) {
storageEngineOptions = wrap((DBObject) options.get("storageEngine"));
}
if (options.get("indexOptionDefaults") != null) {
indexOptionDefaults = wrap((DBObject) options.get("indexOptionDefaults"));
}
if (options.get("validator") != null) {
validator = wrap((DBObject) options.get("validator"));
}
if (options.get("validationLevel") != null) {
validationLevel = ValidationLevel.fromString((String) options.get("validationLevel"));
}
if (options.get("validationAction") != null) {
validationAction = ValidationAction.fromString((String) options.get("validationAction"));
}
Collation collation = DBObjectCollationHelper.createCollationFromOptions(options);
return new CreateCollectionOperation(getName(), collectionName, getWriteConcern())
.capped(capped)
.collation(collation)
.sizeInBytes(sizeInBytes)
.autoIndex(autoIndex)
.maxDocuments(maxDocuments)
.usePowerOf2Sizes(usePowerOfTwoSizes)
.storageEngineOptions(storageEngineOptions)
.indexOptionDefaults(indexOptionDefaults)
.validator(validator)
.validationLevel(validationLevel)
.validationAction(validationAction);
}
/**
* Executes a database command. This method constructs a simple DBObject using {@code command} as the field name and {@code true} as its
* value, and calls {@link DB#command(DBObject, ReadPreference) } with the default read preference for the database.
*
* @param command command to execute
* @return result of command from the database
* @throws MongoException if the command failed
* @mongodb.driver.manual tutorial/use-database-commands Commands
*/
public CommandResult command(final String command) {
return command(new BasicDBObject(command, Boolean.TRUE), getReadPreference());
}
/**
* Executes a database command. This method calls {@link DB#command(DBObject, ReadPreference) } with the default read preference for the
* database.
*
* @param command {@code DBObject} representation of the command to be executed
* @return result of the command execution
* @throws MongoException if the command failed
* @mongodb.driver.manual tutorial/use-database-commands Commands
*/
public CommandResult command(final DBObject command) {
return command(command, getReadPreference());
}
/**
* Executes a database command. This method calls {@link DB#command(DBObject, ReadPreference, DBEncoder) } with the default read
* preference for the database.
*
* @param command {@code DBObject} representation of the command to be executed
* @param encoder {@link DBEncoder} to be used for command encoding
* @return result of the command execution
* @throws MongoException if the command failed
* @mongodb.driver.manual tutorial/use-database-commands Commands
*/
public CommandResult command(final DBObject command, final DBEncoder encoder) {
return command(command, getReadPreference(), encoder);
}
/**
* Executes a database command with the selected readPreference, and encodes the command using the given encoder.
*
* @param command The {@code DBObject} representation the command to be executed
* @param readPreference Where to execute the command - this will only be applied for a subset of commands
* @param encoder The DBEncoder that knows how to serialise the command
* @return The result of executing the command, success or failure
* @mongodb.driver.manual tutorial/use-database-commands Commands
* @since 2.12
*/
public CommandResult command(final DBObject command, final ReadPreference readPreference, @Nullable final DBEncoder encoder) {
try {
return executeCommand(wrap(command, encoder), getCommandReadPreference(command, readPreference));
} catch (MongoCommandException ex) {
return new CommandResult(ex.getResponse(), ex.getServerAddress());
}
}
/**
* Executes the command against the database with the given read preference.
*
* @param command The {@code DBObject} representation the command to be executed
* @param readPreference Where to execute the command - this will only be applied for a subset of commands
* @return The result of executing the command, success or failure
* @mongodb.driver.manual tutorial/use-database-commands Commands
* @since 2.12
*/
public CommandResult command(final DBObject command, final ReadPreference readPreference) {
return command(command, readPreference, null);
}
/**
* Executes a database command. This method constructs a simple {@link DBObject} and calls {@link DB#command(DBObject, ReadPreference)
* }.
*
* @param command The name of the command to be executed
* @param readPreference Where to execute the command - this will only be applied for a subset of commands
* @return The result of the command execution
* @throws MongoException if the command failed
* @mongodb.driver.manual tutorial/use-database-commands Commands
* @since 2.12
*/
public CommandResult command(final String command, final ReadPreference readPreference) {
return command(new BasicDBObject(command, true), readPreference);
}
/**
* Gets another database on same server
*
* @param name name of the database
* @return the DB for the given name
*/
public DB getSisterDB(final String name) {
return mongo.getDB(name);
}
/**
* Checks to see if a collection with a given name exists on a server.
*
* @param collectionName a name of the collection to test for existence
* @return {@code false} if no collection by that name exists, {@code true} if a match to an existing collection was found
* @throws MongoException if the operation failed
*/
public boolean collectionExists(final String collectionName) {
Set collectionNames = getCollectionNames();
for (final String name : collectionNames) {
if (name.equalsIgnoreCase(collectionName)) {
return true;
}
}
return false;
}
/**
* Evaluates JavaScript functions on the database server. This is useful if you need to touch a lot of data lightly, in which case
* network transfer could be a bottleneck.
*
* @param code {@code String} representation of JavaScript function
* @param args arguments to pass to the JavaScript function
* @return result of the command execution
* @throws MongoException if the operation failed
* @mongodb.driver.manual reference/method/db.eval/ db.eval()
* @deprecated The eval command was deprecated in MongoDB 3.0
*/
@Deprecated
public CommandResult doEval(final String code, final Object... args) {
DBObject commandDocument = new BasicDBObject("$eval", code).append("args", asList(args));
return executeCommand(wrap(commandDocument));
}
/**
* Calls {@link DB#doEval(java.lang.String, java.lang.Object[]) }. If the command is successful, the "retval" field is extracted and
* returned. Otherwise an exception is thrown.
*
* @param code {@code String} representation of JavaScript function
* @param args arguments to pass to the JavaScript function
* @return result of the execution
* @throws MongoException if the operation failed
* @mongodb.driver.manual reference/method/db.eval/ db.eval()
* @deprecated The eval command was deprecated in MongoDB 3.0
*/
@Deprecated
public Object eval(final String code, final Object... args) {
CommandResult result = doEval(code, args);
result.throwOnError();
return result.get("retval");
}
/**
* Helper method for calling a 'dbStats' command. It returns storage statistics for a given database.
*
* @return result of the execution
* @throws MongoException if the operation failed
* @mongodb.driver.manual reference/command/dbStats/ Database Stats
* @deprecated Prefer {@link #command(DBObject)} to run the dbStats command
*/
@Deprecated
public CommandResult getStats() {
BsonDocument commandDocument = new BsonDocument("dbStats", new BsonInt32(1)).append("scale", new BsonInt32(1));
return executeCommand(commandDocument);
}
/**
* Adds or updates a user for this database
*
* Never create or modify users over an insecure network without the use of TLS.
* @param userName the user name
* @param password the password
* @return the result of executing this operation
* @throws MongoException if the operation failed
* @mongodb.driver.manual administration/security-access-control/ Access Control
* @mongodb.driver.manual reference/command/createUser createUser
* @mongodb.driver.manual reference/command/updateUser updateUser
* @deprecated Use {@code DB.command} to call either the createUser or updateUser command
*/
@Deprecated
public WriteResult addUser(final String userName, final char[] password) {
return addUser(userName, password, false);
}
/**
* Adds or updates a user for this database
*
* Never create or modify users over an insecure network without the use of TLS.
* @param userName the user name
* @param password the password
* @param readOnly if true, user will only be able to read
* @return the result of executing this operation
* @throws MongoException if the operation failed
* @mongodb.driver.manual administration/security-access-control/ Access Control
* @mongodb.driver.manual reference/command/createUser createUser
* @mongodb.driver.manual reference/command/updateUser updateUser
* @deprecated Use {@code DB.command} to call either the createUser or updateUser command
*/
@Deprecated
public WriteResult addUser(final String userName, final char[] password, final boolean readOnly) {
MongoCredential credential = createCredential(userName, getName(), password);
boolean userExists = false;
try {
userExists = executor.execute(new com.mongodb.operation.UserExistsOperation(getName(), userName), primary(), getReadConcern());
} catch (MongoCommandException e) {
if (e.getCode() != 13) {
throw e;
}
}
try {
if (userExists) {
executor.execute(new com.mongodb.operation.UpdateUserOperation(credential, readOnly, getWriteConcern()), getReadConcern());
return new WriteResult(1, true, null);
} else {
executor.execute(new com.mongodb.operation.CreateUserOperation(credential, readOnly, getWriteConcern()), getReadConcern());
return new WriteResult(1, false, null);
}
} catch (MongoWriteConcernException e) {
throw createWriteConcernException(e);
}
}
/**
* Removes the specified user from the database.
*
* @param userName user to be removed
* @return the result of executing this operation
* @throws MongoException if the operation failed
* @mongodb.driver.manual administration/security-access-control/ Access Control
* @deprecated Use {@code DB.command} to call the dropUser command
*/
@Deprecated
public WriteResult removeUser(final String userName) {
try {
executor.execute(new com.mongodb.operation.DropUserOperation(getName(), userName, getWriteConcern()), getReadConcern());
return new WriteResult(1, true, null);
} catch (MongoWriteConcernException e) {
throw createWriteConcernException(e);
}
}
/**
* Makes it possible to execute "read" queries on a slave node
*
* @see ReadPreference#secondaryPreferred()
* @deprecated Replaced with {@code ReadPreference.secondaryPreferred()}
*/
@Deprecated
public void slaveOk() {
addOption(Bytes.QUERYOPTION_SLAVEOK);
}
/**
* Adds the given flag to the default query options.
*
* @param option value to be added
* @mongodb.driver.manual ../meta-driver/latest/legacy/mongodb-wire-protocol/#op-query Query Flags
* @deprecated Replaced with {@link DBCursor#addOption(int)}
*/
@Deprecated
public void addOption(final int option) {
optionHolder.add(option);
}
/**
* Sets the query options, overwriting previous value.
*
* @param options bit vector of query options
* @mongodb.driver.manual ../meta-driver/latest/legacy/mongodb-wire-protocol/#op-query Query Flags
* @deprecated Replaced with {@link DBCursor#setOptions(int)}
*/
@Deprecated
public void setOptions(final int options) {
optionHolder.set(options);
}
/**
* Resets the query options.
* @mongodb.driver.manual ../meta-driver/latest/legacy/mongodb-wire-protocol/#op-query Query Flags
* @deprecated Replaced with {@link DBCursor#resetOptions()}
*/
@Deprecated
public void resetOptions() {
optionHolder.reset();
}
/**
* Gets the query options
*
* @return bit vector of query options
* @mongodb.driver.manual ../meta-driver/latest/legacy/mongodb-wire-protocol/#op-query Query Flags
* @deprecated Replaced with {@link DBCursor#getOptions()}
*/
@Deprecated
public int getOptions() {
return optionHolder.get();
}
@Override
public String toString() {
return "DB{name='" + name + '\'' + '}';
}
CommandResult executeCommand(final BsonDocument commandDocument) {
return new CommandResult(executor.execute(new CommandWriteOperation(getName(), commandDocument,
new BsonDocumentCodec()), getReadConcern()));
}
CommandResult executeCommand(final BsonDocument commandDocument, final ReadPreference readPreference) {
return new CommandResult(executor.execute(new CommandReadOperation(getName(), commandDocument,
new BsonDocumentCodec()),
readPreference, getReadConcern()));
}
OperationExecutor getExecutor() {
return executor;
}
Bytes.OptionHolder getOptionHolder() {
return optionHolder;
}
BufferProvider getBufferPool() {
return getMongo().getBufferProvider();
}
private BsonDocument wrap(final DBObject document) {
return new BsonDocumentWrapper(document, commandCodec);
}
private BsonDocument wrap(final DBObject document, @Nullable final DBEncoder encoder) {
if (encoder == null) {
return wrap(document);
} else {
return new BsonDocumentWrapper(document, new DBEncoderAdapter(encoder));
}
}
/**
* Determines the read preference that should be used for the given command.
*
* @param command the {@link DBObject} representing the command
* @param requestedPreference the preference requested by the client.
* @return the read preference to use for the given command. It will never return {@code null}.
* @see com.mongodb.ReadPreference
*/
ReadPreference getCommandReadPreference(final DBObject command, @Nullable final ReadPreference requestedPreference) {
String comString = command.keySet().iterator().next().toLowerCase();
boolean primaryRequired = !OBEDIENT_COMMANDS.contains(comString);
if (primaryRequired) {
return ReadPreference.primary();
} else if (requestedPreference == null) {
return ReadPreference.primary();
} else {
return requestedPreference;
}
}
private static final Set OBEDIENT_COMMANDS = new HashSet();
static {
OBEDIENT_COMMANDS.add("aggregate");
OBEDIENT_COMMANDS.add("collstats");
OBEDIENT_COMMANDS.add("count");
OBEDIENT_COMMANDS.add("dbstats");
OBEDIENT_COMMANDS.add("distinct");
OBEDIENT_COMMANDS.add("geonear");
OBEDIENT_COMMANDS.add("geosearch");
OBEDIENT_COMMANDS.add("geowalk");
OBEDIENT_COMMANDS.add("group");
OBEDIENT_COMMANDS.add("listcollections");
OBEDIENT_COMMANDS.add("listindexes");
OBEDIENT_COMMANDS.add("parallelcollectionscan");
OBEDIENT_COMMANDS.add("text");
}
}