summaryrefslogtreecommitdiff
path: root/src/mongo/db/lasterror.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/lasterror.cpp')
-rw-r--r--src/mongo/db/lasterror.cpp156
1 files changed, 54 insertions, 102 deletions
diff --git a/src/mongo/db/lasterror.cpp b/src/mongo/db/lasterror.cpp
index d0a22d56b51..d242cdedc1a 100644
--- a/src/mongo/db/lasterror.cpp
+++ b/src/mongo/db/lasterror.cpp
@@ -27,139 +27,91 @@
* then also delete it in the license file.
*/
-#define MONGO_LOG_DEFAULT_COMPONENT ::mongo::logger::LogComponent::kDefault
-
#include "mongo/platform/basic.h"
#include "mongo/db/lasterror.h"
#include "mongo/db/jsobj.h"
-#include "mongo/util/debug_util.h"
-#include "mongo/util/log.h"
-#include "mongo/util/net/message.h"
+#include "mongo/util/assert_util.h"
namespace mongo {
- using std::endl;
-
LastError LastError::noError;
- LastErrorHolder lastError;
-
- bool isShell = false;
- void setLastError(int code , const char *msg) {
- LastError *le = lastError.get();
- if ( le == 0 ) {
- /* might be intentional (non-user thread) */
- DEV {
- static unsigned n;
- if( ++n < 4 && !isShell ) log() << "dev: lastError==0 won't report:" << msg << endl;
- }
- }
- else if ( le->disabled ) {
- log() << "lastError disabled, can't report: " << code << ":" << msg << endl;
- }
- else {
- le->raiseError(code, msg);
- }
- }
- bool LastError::appendSelf( BSONObjBuilder &b , bool blankErr ) {
+ const Client::Decoration<LastError> LastError::get = Client::declareDecoration<LastError>();
- if ( !valid ) {
- if ( blankErr )
- b.appendNull( "err" );
- b.append( "n", 0 );
- return false;
- }
-
- if ( msg.empty() ) {
- if ( blankErr ) {
- b.appendNull( "err" );
- }
- }
- else {
- b.append( "err", msg );
- }
+ void LastError::reset(bool valid) {
+ *this = LastError();
+ _valid = valid;
+ }
- if ( code )
- b.append( "code" , code );
- if ( updatedExisting != NotUpdate )
- b.appendBool( "updatedExisting", updatedExisting == True );
- if ( !upsertedId.isEmpty() ) {
- b.append( upsertedId[kUpsertedFieldName] );
+ void LastError::setLastError(int code, std::string msg) {
+ if (_disabled) {
+ return;
}
- b.appendNumber( "n", nObjects );
-
- return ! msg.empty();
+ reset(true);
+ _code = code;
+ _msg = std::move(msg);
}
- LastErrorHolder::~LastErrorHolder() {
+ void LastError::recordInsert(long long nObjects) {
+ reset(true);
+ _nObjects = nObjects;
}
-
- LastError * LastErrorHolder::disableForCommand() {
- LastError *le = _get();
- uassert(13649, "no operation yet", le);
- le->disabled = true;
- le->nPrev--; // caller is a command that shouldn't count as an operation
- return le;
+ void LastError::recordUpdate(bool updateObjects, long long nObjects, BSONObj upsertedId) {
+ reset(true);
+ _nObjects = nObjects;
+ _updatedExisting = updateObjects ? True : False;
+ if ( upsertedId.valid() && upsertedId.hasField(kUpsertedFieldName) )
+ _upsertedId = upsertedId;
}
- LastError * LastErrorHolder::get( bool create ) {
- LastError *ret = _get( create );
- if ( ret && !ret->disabled )
- return ret;
- return 0;
+ void LastError::recordDelete(long long nDeleted) {
+ reset(true);
+ _nObjects = nDeleted;
}
- LastError * LastErrorHolder::getSafe() {
- LastError * le = get(false);
- if ( ! le ) {
- error() << " no LastError!" << std::endl;
- verify( le );
+ bool LastError::appendSelf(BSONObjBuilder &b , bool blankErr) const {
+
+ if (!_valid) {
+ if (blankErr)
+ b.appendNull( "err" );
+ b.append( "n", 0 );
+ return false;
}
- return le;
- }
- LastError * LastErrorHolder::_get( bool create ) {
- LastError * le = _tl.get();
- if ( ! le && create ) {
- le = new LastError();
- _tl.reset( le );
+ if (_msg.empty()) {
+ if (blankErr) {
+ b.appendNull( "err" );
+ }
+ }
+ else {
+ b.append("err", _msg);
}
- return le;
- }
- void LastErrorHolder::release() {
- _tl.release();
- }
+ if (_code)
+ b.append("code" , _code);
+ if (_updatedExisting != NotUpdate)
+ b.appendBool("updatedExisting", _updatedExisting == True);
+ if (!_upsertedId.isEmpty()) {
+ b.append(_upsertedId[kUpsertedFieldName]);
+ }
+ b.appendNumber("n", _nObjects);
- /** ok to call more than once. */
- void LastErrorHolder::initThread() {
- if( ! _tl.get() )
- _tl.reset( new LastError() );
+ return !_msg.empty();
}
- void LastErrorHolder::reset( LastError * le ) {
- _tl.reset( le );
- }
- void prepareErrForNewRequest( Message &m, LastError * err ) {
- // a killCursors message shouldn't affect last error
- verify( err );
- if ( m.operation() == dbKillCursors ) {
- err->disabled = true;
- }
- else {
- err->disabled = false;
- err->nPrev++;
- }
+ void LastError::disable() {
+ invariant(!_disabled);
+ _disabled = true;
+ _nPrev--; // caller is a command that shouldn't count as an operation
}
- LastError * LastErrorHolder::startRequest( Message& m , LastError * le ) {
- verify( le );
- prepareErrForNewRequest( m, le );
- return le;
+ void LastError::startRequest() {
+ _disabled = false;
+ ++_nPrev;
}
} // namespace mongo