com.mongodb.Bytes Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of mongo-java-driver Show documentation
Show all versions of mongo-java-driver Show documentation
The MongoDB Java Driver uber-artifact, containing mongodb-driver, mongodb-driver-core, and bson
The newest version!
/*
* Copyright (c) 2008-2014 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.
*/
// Bytes.java
package com.mongodb;
import org.bson.BSON;
import org.bson.types.BSONTimestamp;
import org.bson.types.Code;
import org.bson.types.CodeWScope;
import org.bson.types.ObjectId;
import java.nio.ByteOrder;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
/**
* Class that hold definitions of the wire protocol
*/
public class Bytes extends BSON {
/**
* Little-endian
*/
public static final ByteOrder ORDER = ByteOrder.LITTLE_ENDIAN;
// --- network protocol options
/**
* Tailable means cursor is not closed when the last data is retrieved. Rather, the cursor marks the final object's position. You can
* resume using the cursor later, from where it was located, if more data were received. Like any "latent cursor", the cursor may become
* invalid at some point (CursorNotFound) - for example if the final object it references were deleted.
*/
public static final int QUERYOPTION_TAILABLE = 1 << 1;
/**
* When turned on, read queries will be directed to slave servers instead of the primary server.
*/
public static final int QUERYOPTION_SLAVEOK = 1 << 2;
/**
* Internal replication use only - driver should not set
*/
public static final int QUERYOPTION_OPLOGREPLAY = 1 << 3;
/**
* The server normally times out idle cursors after an inactivity period (10 minutes) to prevent excess memory use. Set this option to
* prevent that.
*/
public static final int QUERYOPTION_NOTIMEOUT = 1 << 4;
/**
* Use with TailableCursor. If we are at the end of the data, block for a while rather than returning no data. After a timeout period,
* we do return as normal.
*/
public static final int QUERYOPTION_AWAITDATA = 1 << 5;
/**
* Stream the data down full blast in multiple "more" packages, on the assumption that the client will fully read all data queried.
* Faster when you are pulling a lot of data and know you want to pull it all down. Note: the client is not allowed to not read all the
* data unless it closes the connection.
*/
public static final int QUERYOPTION_EXHAUST = 1 << 6;
/**
* Use with sharding (mongos). Allows partial results from a sharded system if any shards are down/missing from the cluster. If not used
* an error will be returned from the mongos server.
*/
public static final int QUERYOPTION_PARTIAL = 1 << 7;
/**
* Set when getMore is called but the cursor id is not valid at the server. Returned with zero results.
*/
public static final int RESULTFLAG_CURSORNOTFOUND = 1;
/**
* Set when query failed. Results consist of one document containing an "$err" field describing the failure.
*/
public static final int RESULTFLAG_ERRSET = 2;
/**
* Drivers should ignore this. Only mongos will ever see this set, in which case, it needs to update config from the server.
*/
public static final int RESULTFLAG_SHARDCONFIGSTALE = 4;
/**
* Set when the server supports the AwaitData Query option. If it doesn't, a client should sleep a little between getMore's of a
* Tailable cursor. Mongod version 1.6 supports AwaitData and thus always sets AwaitCapable.
*/
public static final int RESULTFLAG_AWAITCAPABLE = 8;
static class OptionHolder {
OptionHolder(final OptionHolder parent) {
_parent = parent;
}
void set(final int options) {
_options = options;
_hasOptions = true;
}
int get() {
if (_hasOptions) {
return _options;
}
if (_parent == null) {
return 0;
}
return _parent.get();
}
void add(final int option) {
set(get() | option);
}
void reset() {
_hasOptions = false;
}
final OptionHolder _parent;
int _options = 0;
boolean _hasOptions = false;
}
/**
* Gets the type byte for a given object.
*
* @param object the object
* @return the byte value associated with the type, or -1 if no type is matched
*/
@SuppressWarnings("deprecation")
public static byte getType(final Object object) {
if (object == null) {
return NULL;
}
if (object instanceof Integer
|| object instanceof Short
|| object instanceof Byte
|| object instanceof AtomicInteger) {
return NUMBER_INT;
}
if (object instanceof Long || object instanceof AtomicLong) {
return NUMBER_LONG;
}
if (object instanceof Number) {
return NUMBER;
}
if (object instanceof String) {
return STRING;
}
if (object instanceof java.util.List) {
return ARRAY;
}
if (object instanceof byte[]) {
return BINARY;
}
if (object instanceof ObjectId) {
return OID;
}
if (object instanceof Boolean) {
return BOOLEAN;
}
if (object instanceof java.util.Date) {
return DATE;
}
if (object instanceof BSONTimestamp) {
return TIMESTAMP;
}
if (object instanceof java.util.regex.Pattern) {
return REGEX;
}
if (object instanceof DBObject || object instanceof DBRef) {
return OBJECT;
}
if (object instanceof CodeWScope) {
return CODE_W_SCOPE;
}
if (object instanceof Code) {
return CODE;
}
return -1;
}
}