// CommandResult.java
/**
* Copyright (C) 2008 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.
*/
package com.mongodb;
/**
* A simple wrapper for the result of getLastError() calls and other commands
*/
public class CommandResult extends BasicDBObject {
CommandResult(ServerAddress srv) {
this(null, srv);
}
CommandResult(DBObject cmd, ServerAddress srv) {
if (srv == null) {
throw new IllegalArgumentException("server address is null");
}
_cmd = cmd;
_host = srv;
//so it is shown in toString/debug
put("serverUsed", srv.toString());
}
/**
* gets the "ok" field which is the result of the command
* @return True if ok
*/
public boolean ok(){
Object o = get( "ok" );
if ( o == null )
throw new IllegalArgumentException( "'ok' should never be null..." );
if ( o instanceof Boolean )
return (Boolean) o;
if ( o instanceof Number )
return ((Number)o).intValue() == 1;
throw new IllegalArgumentException( "can't figure out what to do with: " + o.getClass().getName() );
}
/**
* gets the "errmsg" field which holds the error message
* @return The error message or null
*/
public String getErrorMessage(){
Object foo = get( "errmsg" );
if ( foo == null )
return null;
return foo.toString();
}
/**
* utility method to create an exception with the command name
* @return The mongo exception or null
*/
public MongoException getException(){
if ( !ok() ) {
StringBuilder buf = new StringBuilder();
String cmdName;
if (_cmd != null) {
cmdName = _cmd.keySet().iterator().next();
buf.append( "command failed [" ).append( cmdName ).append( "]: " );
} else {
buf.append( "operation failed: ");
}
buf.append( toString() );
return new CommandFailure( this , buf.toString() );
} else {
// GLE check
if ( hasErr() ) {
Object foo = get( "err" );
int code = getCode();
String s = foo.toString();
if ( code == 11000 || code == 11001 || s.startsWith( "E11000" ) || s.startsWith( "E11001" ) )
return new MongoException.DuplicateKey( code , s );
return new MongoException( code , s );
}
}
//all good, should never get here.
return null;
}
/**
* returns the "code" field, as an int
* @return -1 if there is no code
*/
private int getCode(){
int code = -1;
if ( get( "code" ) instanceof Number )
code = ((Number)get("code")).intValue();
return code;
}
/**
* check the "err" field
* @return if it has it, and isn't null
*/
boolean hasErr(){
Object o = get( "err" );
return (o != null && ( (String) o ).length() > 0 );
}
/**
* throws an exception containing the cmd name, in case the command failed, or the "err/code" information
* @throws MongoException
*/
public void throwOnError() throws MongoException {
if ( !ok() || hasErr() ){
throw getException();
}
}
public ServerAddress getServerUsed() {
return _host;
}
private final DBObject _cmd;
private final ServerAddress _host;
private static final long serialVersionUID = 1L;
static class CommandFailure extends MongoException {
private static final long serialVersionUID = 1L;
CommandFailure( CommandResult res , String msg ){
super( ServerError.getCode( res ) , msg );
}
}
}