diff options
author | Chris Wilson <chris+github@qwirx.com> | 2015-08-15 10:57:59 +0000 |
---|---|---|
committer | Chris Wilson <chris+github@qwirx.com> | 2015-08-15 10:57:59 +0000 |
commit | feade829d345bd6e34f39dfc32498696e6f588a1 (patch) | |
tree | 84faf18ef5e1cc9c9bd6eba36946db6a7dfff0f2 /lib/backupstore/BackupCommands.cpp | |
parent | 62c0689012de2786ed2fae3da84b5301d6b49a55 (diff) |
Improve exception handling on backup store side.
Add a new exception code to represent an object being completely missing (not
found on the store at all), separate from not being found in a particular
directory.
Improve mapping of server-side exceptions to protocol error messages returned
to the client.
Add handling for missing exceptions, such as
BackupStoreException::PatchChainInfoBadInDirectory, and the new
BackupStoreException::ObjectDoesNotExist.
Fix mapping for BackupStoreException::CouldNotFindEntryInDirectory to make it
distinguistable from BackupStoreException::ObjectDoesNotExist.
Diffstat (limited to 'lib/backupstore/BackupCommands.cpp')
-rw-r--r-- | lib/backupstore/BackupCommands.cpp | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/lib/backupstore/BackupCommands.cpp b/lib/backupstore/BackupCommands.cpp index ab0dc4b8..22ef0215 100644 --- a/lib/backupstore/BackupCommands.cpp +++ b/lib/backupstore/BackupCommands.cpp @@ -85,12 +85,20 @@ std::auto_ptr<BackupProtocolMessage> BackupProtocolReplyable::HandleException(Bo } else if(e.GetSubType() == BackupStoreException::CouldNotFindEntryInDirectory) { - return PROTOCOL_ERROR(Err_DoesNotExist); + return PROTOCOL_ERROR(Err_DoesNotExistInDirectory); } else if(e.GetSubType() == BackupStoreException::NameAlreadyExistsInDirectory) { return PROTOCOL_ERROR(Err_TargetNameExists); } + else if(e.GetSubType() == BackupStoreException::ObjectDoesNotExist) + { + return PROTOCOL_ERROR(Err_DoesNotExist); + } + else if(e.GetSubType() == BackupStoreException::PatchChainInfoBadInDirectory) + { + return PROTOCOL_ERROR(Err_PatchConsistencyError); + } } throw; @@ -779,7 +787,28 @@ std::auto_ptr<BackupProtocolMessage> BackupProtocolGetObjectName::DoCommand(Back } // Load up the directory - const BackupStoreDirectory &rdir(rContext.GetDirectory(dirID)); + const BackupStoreDirectory *pDir; + + try + { + pDir = &rContext.GetDirectory(dirID); + } + catch(BackupStoreException &e) + { + if(e.GetSubType() == BackupStoreException::ObjectDoesNotExist) + { + // If this can't be found, then there is a problem... + // tell the caller it can't be found. + return std::auto_ptr<BackupProtocolMessage>( + new BackupProtocolObjectName( + BackupProtocolObjectName::NumNameElements_ObjectDoesntExist, + 0, 0, 0)); + } + + throw; + } + + const BackupStoreDirectory& rdir(*pDir); // Find the element in this directory and store it's name if(objectID != ObjectID_DirectoryOnly) |