diff options
Diffstat (limited to 'bin/bbackupquery/BackupQueries.h')
-rw-r--r-- | bin/bbackupquery/BackupQueries.h | 119 |
1 files changed, 105 insertions, 14 deletions
diff --git a/bin/bbackupquery/BackupQueries.h b/bin/bbackupquery/BackupQueries.h index 392aa428..62ff231d 100644 --- a/bin/bbackupquery/BackupQueries.h +++ b/bin/bbackupquery/BackupQueries.h @@ -10,16 +10,40 @@ #ifndef BACKUPQUERIES__H #define BACKUPQUERIES__H -#include <vector> +#include <iostream> #include <string> +#include <vector> #include "BoxTime.h" #include "BoxBackupCompareParams.h" +#include "BackupStoreDirectory.h" class BackupProtocolClient; class Configuration; class ExcludeList; +typedef enum +{ + Command_Unknown = 0, + Command_Quit, + Command_List, + Command_pwd, + Command_cd, + Command_lcd, + Command_sh, + Command_GetObject, + Command_Get, + Command_Compare, + Command_Restore, + Command_Help, + Command_Usage, + Command_Undelete, + Command_Delete, +} +CommandType; + +struct QueryCommandSpecification; + // -------------------------------------------------------------------------- // // Class @@ -38,8 +62,24 @@ public: private: BackupQueries(const BackupQueries &); public: + struct ParsedCommand + { + std::vector<std::string> mCmdElements; + std::string mOptions; + std::string mCompleteCommand; + bool mInOptions, mFailed; + QueryCommandSpecification* pSpec; + // mArgCount is the same as mCmdElements.size() for a complete + // command, but if the command line ends in a space, + // e.g. during readline parsing, it can be one greater, + // to indicate that we should complete the next item instead. + size_t mCompleteArgCount; + ParsedCommand(const std::string& Command, + bool isFromCommandLine); + bool IsEmpty() { return mCmdElements.empty(); } + }; - void DoCommand(const char *Command, bool isFromCommandLine); + void DoCommand(ParsedCommand& rCommand); // Ready to stop? bool Stop() {return mQuitNow;} @@ -47,9 +87,11 @@ public: // Return code? int GetReturnCode() {return mReturnCode;} -private: - // Commands + void List(int64_t DirID, const std::string &rListRoot, const bool *opts, + bool FirstLevel, std::ostream* pOut = NULL); void CommandList(const std::vector<std::string> &args, const bool *opts); + + // Commands void CommandChangeDir(const std::vector<std::string> &args, const bool *opts); void CommandChangeLocalDir(const std::vector<std::string> &args); void CommandGetObject(const std::vector<std::string> &args, const bool *opts); @@ -64,11 +106,6 @@ private: int64_t HardLimit, int32_t BlockSize, bool MachineReadable); void CommandHelp(const std::vector<std::string> &args); - // Implementations - void List(int64_t DirID, const std::string &rListRoot, const bool *opts, - bool FirstLevel); - -public: class CompareParams : public BoxBackupCompareParams { public: @@ -201,6 +238,24 @@ public: mUncheckedFiles ++; } + virtual void NotifyLocalFileReadFailed(const std::string& rLocalPath, + const std::string& rRemotePath, int64_t NumBytes, + std::exception& rException) + { + BOX_ERROR("Failed to read local file '" << + ConvertForConsole(rLocalPath) << "': " << + rException.what()); + mUncheckedFiles ++; + } + + virtual void NotifyLocalFileReadFailed(const std::string& rLocalPath, + const std::string& rRemotePath, int64_t NumBytes) + { + BOX_ERROR("Failed to read local file '" << + ConvertForConsole(rLocalPath)); + mUncheckedFiles ++; + } + virtual void NotifyExcludedFile(const std::string& rLocalPath, const std::string& rRemotePath) { @@ -302,13 +357,16 @@ public: const std::string &rLocalDir, BoxBackupCompareParams &rParams); void Compare(int64_t DirID, const std::string &rStoreDir, const std::string &rLocalDir, BoxBackupCompareParams &rParams); + void CompareOneFile(int64_t DirID, BackupStoreDirectory::Entry *pEntry, + const std::string& rLocalPath, const std::string& rStorePath, + BoxBackupCompareParams &rParams); public: class ReturnCode { public: - enum { + typedef enum { Command_OK = 0, Compare_Same = 1, Compare_Different, @@ -317,17 +375,19 @@ public: } Type; }; -private: - - // Utility functions + // Were private, but needed by completion functions: + int64_t GetCurrentDirectoryID(); int64_t FindDirectoryObjectID(const std::string &rDirName, bool AllowOldVersion = false, bool AllowDeletedDirs = false, std::vector<std::pair<std::string, int64_t> > *pStack = 0); + +private: + + // Utility functions int64_t FindFileID(const std::string& rNameOrIdString, const bool *opts, int64_t *pDirIdOut, std::string* pFileNameOut, int16_t flagsInclude, int16_t flagsExclude, int16_t* pFlagsOut); - int64_t GetCurrentDirectoryID(); std::string GetCurrentDirectoryName(); void SetReturnCode(int code) {mReturnCode = code;} @@ -342,5 +402,36 @@ private: int mReturnCode; }; +typedef std::vector<std::string> (*CompletionHandler) + (BackupQueries::ParsedCommand& rCommand, const std::string& prefix, + BackupProtocolClient& rProtocol, const Configuration& rConfig, + BackupQueries& rQueries); + +std::vector<std::string> CompleteCommand(BackupQueries::ParsedCommand& rCommand, + const std::string& prefix, BackupProtocolClient& rProtocol, + const Configuration& rConfig, BackupQueries& rQueries); +std::vector<std::string> CompleteOptions(BackupQueries::ParsedCommand& rCommand, + const std::string& prefix, BackupProtocolClient& rProtocol, + const Configuration& rConfig, BackupQueries& rQueries); + +#define MAX_COMPLETION_HANDLERS 4 + +struct QueryCommandSpecification +{ + const char* name; + const char* opts; + CommandType type; + CompletionHandler complete[MAX_COMPLETION_HANDLERS]; +}; + +// Data about commands +extern QueryCommandSpecification commands[]; + +extern const char *alias[]; +extern const int aliasIs[]; + +#define LIST_OPTION_ALLOWOLD 'o' +#define LIST_OPTION_ALLOWDELETED 'd' + #endif // BACKUPQUERIES__H |