3 /// Builder class for restoring from Barry Backup files
7 Copyright (C) 2010-2011, Net Direct Inc. (http://www.netdirect.ca/)
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU General Public License in the COPYING file at the
19 root directory of this project for more details.
22 #ifndef __BARRYBACKUP_RESTORE_H__
23 #define __BARRYBACKUP_RESTORE_H__
27 #include "configfile.h"
32 // forward declarations
42 /// Barry Backup Restore builder class. This class is suitable
43 /// to be used as a builder object anywhere a builder object is
44 /// accepted. It reads from a Barry Backup tar.gz backup file,
45 /// and builds records in a staged manner.
47 /// If a backup file contains more than one database (for example
48 /// both Address Book and Calendar), then it will build one database
49 /// first, return false on Retrieve(), and then build the next.
50 /// If Retrieve() returns false, but EndOfFile() also returns false,
51 /// then more databases are available.
53 /// The idea is that you can call Desktop::SaveDatabase() multiple
54 /// times with this same Restore object, for all the databases in
57 /// It is safe to call Retrieve() multiple times, so when first
58 /// starting a restore:
59 /// - call the constructor
60 /// - call AddDB() with any filters
61 /// - then call Retrieve(), which will grab the first record,
62 /// and make GetDBName() valid.
64 class BXEXPORT Restore
: public Barry::Builder
67 typedef Barry::ConfigFile::DBListType DBListType
;
72 RS_EMPTY
, // no record loaded
73 RS_UNKNOWN
, // record data loaded, but not yet checked
74 // whether this is part of current database
75 RS_NEXT
, // record loaded, part of current database
76 RS_DBEND
, // next record loaded, but end-of-database
77 // not yet processed by Builder API
78 RS_EOF
// no recrd loaded, end of tar file
83 std::string m_tarpath
;
84 std::auto_ptr
<reuse::TarFile
> m_tar
;
86 bool m_default_all_db
;
87 RetrievalState m_tar_record_state
;
90 std::string m_current_dbname
;
91 Barry::Data m_record_data
;
92 std::string m_tar_id_text
;
95 static bool SplitTarPath(const std::string
&tarpath
,
96 std::string
&dbname
, std::string
&dbid_text
,
97 uint8_t &dbrectype
, uint32_t &dbid
);
99 bool IsSelected(const std::string
&dbName
) const;
100 RetrievalState
Retrieve(Data
&record_data
);
104 /// If default_all_db is true, and none of the Add*() functions
105 /// are called (meaning that Restore has an empty database list),
106 /// then all records are restored. If false in this situation,
107 /// nothing is restored.
109 /// If any of the Add*() functions are called, then the database
110 /// list takes precedence, and default_all_db has no effect.
112 explicit Restore(const std::string
&tarpath
,
113 bool default_all_db
= true);
116 /// Add database name to the read filter.
117 void AddDB(const std::string
&dbName
);
119 /// Add all database names in dblist to the read filter
120 /// This function is additive.
121 void Add(const DBListType
&dbList
);
123 // Skip the current DB, in case of error, or preference
124 void SkipCurrentDB();
126 /// Loads the given file, and counts all records according
127 /// to the current read filter. Does not use the main
128 /// Restore file, but opens the file separately.
129 /// It is safe to call this function as often as needed.
130 unsigned int GetRecordTotal() const;
132 /// Static version of above call
133 static unsigned int GetRecordTotal(const std::string
&tarpath
,
134 const DBListType
&dbList
, bool default_all_db
);
136 /// If this function returns true, it fills data with the
137 /// meta data that the next call to BuildRecord() will retrieve.
138 /// This is useful for applications that need to setup a manual
139 /// call to Desktop::SaveDatabase().
140 bool GetNextMeta(DBData
&data
);
142 // Barry::Builder overrides
143 bool BuildRecord(Barry::DBData
&data
, size_t &offset
,
144 const Barry::IConverter
*ic
);
145 bool FetchRecord(Barry::DBData
&data
, const Barry::IConverter
*ic
);
146 bool EndOfFile() const;