Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <rtabmap/core/Recovery.h>
00029 #include <rtabmap/core/ProgressState.h>
00030 #include <stdio.h>
00031 #include <string.h>
00032 #include <stdlib.h>
00033 #include <signal.h>
00034
00035 using namespace rtabmap;
00036
00037 void showUsage()
00038 {
00039 printf("\nUsage:\n"
00040 "rtabmap-recovery [-d] \"my_corrupted_map.db\""
00041 " Options:\n"
00042 " -d Delete database backup on success (\"*.backup.db\").\n"
00043 "\n");
00044 exit(1);
00045 }
00046
00047 class RecoveryProgressState: public ProgressState
00048 {
00049 virtual bool callback(const std::string & msg) const
00050 {
00051 if(!msg.empty())
00052 printf("%s\n", msg.c_str());
00053 return true;
00054 }
00055 };
00056 RecoveryProgressState state;
00057
00058
00059 void sighandler(int sig)
00060 {
00061 printf("\nSignal %d caught...\n", sig);
00062 state.setCanceled(true);
00063 }
00064
00065 int main(int argc, char * argv[])
00066 {
00067 signal(SIGABRT, &sighandler);
00068 signal(SIGTERM, &sighandler);
00069 signal(SIGINT, &sighandler);
00070
00071 ULogger::setType(ULogger::kTypeConsole);
00072 ULogger::setLevel(ULogger::kError);
00073
00074 if(argc < 2)
00075 {
00076 showUsage();
00077 }
00078
00079 bool keepBackup = true;
00080 for(int i=1; i<argc; ++i)
00081 {
00082 if(strcmp(argv[i], "-d") == 0)
00083 {
00084 keepBackup = false;
00085 }
00086 }
00087
00088 std::string databasePath = argv[argc-1];
00089
00090 std::string errorMsg;
00091 printf("Recovering \"%s\"\n", databasePath.c_str());
00092 if(!databaseRecovery(databasePath, keepBackup, &errorMsg, &state))
00093 {
00094 printf("Error: %s\n", errorMsg.c_str());
00095 return 1;
00096 }
00097
00098 return 0;
00099 }