// lasterror.h /** * Copyright (C) 2009 10gen Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ #pragma once #include #undef assert #define assert xassert namespace mongo { class BSONObjBuilder; struct LastError { string msg; enum UpdatedExistingType { NotUpdate, True, False } updatedExisting; int nObjects; int nPrev; bool valid; void raiseError(const char *_msg) { reset( true ); msg = _msg; } void recordUpdate( bool _updatedExisting, int nChanged ) { reset( true ); nObjects = nChanged; updatedExisting = _updatedExisting ? True : False; } void recordDelete( int nDeleted ) { reset( true ); nObjects = nDeleted; } LastError() { reset(); } void reset( bool _valid = false ) { msg.clear(); updatedExisting = NotUpdate; nObjects = 0; nPrev = 1; valid = _valid; } void appendSelf( BSONObjBuilder &b ); static LastError noError; }; extern boost::thread_specific_ptr lastError; inline void raiseError(const char *msg) { LastError *le = lastError.get(); if ( le == 0 ) { DEV log() << "warning: lastError==0 can't report:" << msg << '\n'; return; } le->raiseError(msg); } inline void recordUpdate( bool updatedExisting, int nChanged ) { LastError *le = lastError.get(); if ( le ) le->recordUpdate( updatedExisting, nChanged ); } inline void recordDelete( int nDeleted ) { LastError *le = lastError.get(); if ( le ) le->recordDelete( nDeleted ); } } // namespace mongo