| Disk ARchive 2.5.10 Full featured and portable backup and archiving tool

- Main Page
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

data_tree.hpp
Go to the documentation of this file.
1 /*********************************************************************/
2 // dar - disk archive - a backup/restoration program
3 // Copyright (C) 2002-2052 Denis Corbin
4 //
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 //
19 // to contact the author : http://dar.linux.free.fr/email.html
20 /*********************************************************************/
21
25
26
27 #ifndef DATA_TREE_HPP
28 #define DATA_TREE_HPP
29
30 #include "../my_config.h"
31
32 #include <map>
33 #include <string>
34 #include <list>
35 #include "infinint.hpp"
36 #include "generic_file.hpp"
37 #include "infinint.hpp"
38 #include "user_interaction.hpp"
39 #include "path.hpp"
40 #include "on_pool.hpp"
41 #include "cat_directory.hpp"
42 #include "cat_inode.hpp"
43 #include "cat_detruit.hpp"
44
45 namespace libdar
46 {
47
50
51 typedef U_16 archive_num;
52 #define ARCHIVE_NUM_MAX 65534
53
55
59 class data_tree : public on_pool
60 {
61 public:
62 enum lookup { found_present, found_removed, not_found, not_restorable };
63 enum etat
64 {
65 et_saved, //< data/EA present in the archive
66 et_present, //< file/EA present in the archive but data not saved (differential backup)
67 et_removed, //< file/EA stored as deleted since archive of reference of file/EA not present in the archive
68 et_absent //< file not even mentionned in the archive, This entry is equivalent to et_removed, but is required to be able to properly re-order the archive when user asks to do so. The dates associated to this state are computed from neighbor archives in the database
69 };
70
71 data_tree(const std::string &name);
72 data_tree(generic_file &f, unsigned char db_version);
73 virtual ~data_tree() {};
74
75 virtual void dump(generic_file & f) const;
76 std::string get_name() const { return filename; };
77 void set_name(const std::string & name) { filename = name; };
78
80 lookup get_data(archive_num & archive, const datetime & date, bool even_when_removed) const;
81
83 lookup get_EA(archive_num & archive, const datetime & date, bool even_when_removed) const;
84
86 bool read_data(archive_num num, datetime & val, etat & present) const;
87
89 bool read_EA(archive_num num, datetime & val, etat & present) const;
90
91 void set_data(const archive_num & archive, const datetime & date, etat present) { status sta = { date, present }; last_mod[archive] = sta; };
92 void set_EA(const archive_num & archive, const datetime & date, etat present) { status sta = { date, present }; last_change[archive] = sta; };
93
95 virtual bool check_order(user_interaction & dialog, const path & current_path, bool & initial_warn) const { return check_map_order(dialog, last_mod, current_path, "data", initial_warn) && check_map_order(dialog, last_change, current_path, "EA", initial_warn); };
96
98
106 virtual void finalize(const archive_num & archive,
107 const datetime & deleted_date,
108 const archive_num & ignore_archive_greater_or_equal);
109
111 virtual bool remove_all_from(const archive_num & archive_to_remove, const archive_num & last_archive);
112
114 void listing(user_interaction & dialog) const;
115 virtual void apply_permutation(archive_num src, archive_num dst);
116
118 virtual void skip_out(archive_num num);
119 virtual void compute_most_recent_stats(std::vector<infinint> & data,
120 std::vector<infinint> & ea,
121 std::vector<infinint> & total_data,
122 std::vector<infinint> & total_ea) const;
123
124 virtual char obj_signature() const { return signature(); };
125 static char signature() { return 't'; };
126
127 // fix corruption case that was brought by bug in release 2.4.0 to 2.4.9
128 virtual bool fix_corruption(); // return true whether corruption could be fixed (meaning this entry can be safely removed from base)
129
130 private:
131 struct status
132 {
133 datetime date; //< date of the event
134 etat present; //< file's status in the archive
135 void dump(generic_file & f) const; //< write the struct to file
136 void read(generic_file &f, //< set the struct from file
137 unsigned char db_version);
138 };
139
140
141 std::string filename;
142 std::map<archive_num, status> last_mod; //< key is archive number ; value is last_mod time
143 std::map<archive_num, status> last_change; //< key is archive number ; value is last_change time
144
145
146 // when false is returned, this means that the user wants to ignore subsequent error of the same type
147 // else either no error yet met or user want to continue receiving the same type of error for other files
148 // in that later case initial_warn is set to false (first warning has been shown).
149 bool check_map_order(user_interaction & dialog,
150 const std::map<archive_num, status> the_map,
151 const path & current_path,
152 const std::string & field_nature,
153 bool & initial_warn) const;
154 };
155
157
159 class data_dir : public data_tree
160 {
161 public:
162 data_dir(const std::string &name);
163 data_dir(generic_file &f, unsigned char db_version);
164 data_dir(const data_dir & ref);
165 data_dir(const data_tree & ref);
166 ~data_dir();
167
168 void dump(generic_file & f) const;
169
170 void add(const cat_inode *entry, const archive_num & archive);
171 void add(const cat_detruit *entry, const archive_num & archive);
172 const data_tree *read_child(const std::string & name) const;
173 void read_all_children(std::vector<std::string> & fils) const;
174 virtual void finalize_except_self(const archive_num & archive,
175 const datetime & deleted_date,
176 const archive_num & ignore_archives_greater_or_equal);
177
178 // inherited methods
179 bool check_order(user_interaction & dialog, const path & current_path, bool & initial_warn) const;
180 void finalize(const archive_num & archive, const datetime & deleted_date, const archive_num & ignore_archives_greater_or_equal);
181 bool remove_all_from(const archive_num & archive_to_remove, const archive_num & last_archive);
182
184 void show(user_interaction & dialog, archive_num num, std::string marge = "") const;
185 void apply_permutation(archive_num src, archive_num dst);
186 void skip_out(archive_num num);
187 void compute_most_recent_stats(std::vector<infinint> & data, std::vector<infinint> & ea,
188 std::vector<infinint> & total_data, std::vector<infinint> & total_ea) const;
189
190 char obj_signature() const { return signature(); };
191 static char signature() { return 'd'; };
192
193 virtual bool fix_corruption(); // inherited from data_tree
194
195
196 private:
197 std::list<data_tree *> rejetons; //< subdir and subfiles of the current dir
198
199 void add_child(data_tree *fils); //< "this" is now responsible of "fils" disalocation
200 void remove_child(const std::string & name);
201 data_tree *find_or_addition(const std::string & name, bool is_dir, const archive_num & archive);
202 };
203
204 extern data_dir *data_tree_read(generic_file & f, unsigned char db_version, memory_pool *pool);
205
207
212 extern bool data_tree_find(path chemin, const data_dir & racine, const data_tree *& ptr);
213 extern void data_tree_update_with(const cat_directory *dir, archive_num archive, data_dir *racine);
214 extern archive_num data_tree_permutation(archive_num src, archive_num dst, archive_num x);
215
217
218 } // end of namespace
219
220 #endif
libdar::on_pool
Definition: on_pool.hpp:52
libdar::data_tree::read_EA
bool read_EA(archive_num num, datetime &val, etat &present) const
return the date of last inode change and whether the EA has been saved or deleted ...
libdar::data_tree::check_order
virtual bool check_order(user_interaction &dialog, const path &current_path, bool &initial_warn) const
check date order between archives withing the database ; throw Erange if problem found with date orde...
Definition: data_tree.hpp:95
libdar::data_dir::finalize
void finalize(const archive_num &archive, const datetime &deleted_date, const archive_num &ignore_archives_greater_or_equal)
add deleted entry if no object of the current archive exist and the entry of the previous archive is ...
libdar::cat_detruit
the deleted file entry
Definition: cat_detruit.hpp:47
cat_directory.hpp
class used to organize objects in tree in catalogue as like directories in a filesystem ...
libdar::data_dir
the data_dir class inherits from data_tree and holds the directory tree's parent relationship ...
Definition: data_tree.hpp:159
generic_file.hpp
class generic_file is defined here as well as class fichierthe generic_file interface is widely used ...
libdar::data_dir::check_order
bool check_order(user_interaction &dialog, const path &current_path, bool &initial_warn) const
check date order between archives withing the database ; throw Erange if problem found with date orde...
libdar::compile_time::ea
bool ea()
returns whether EA support has been activated at compilation time
libdar::data_tree
the data_tree class stores presence of a given file in a set of archives
Definition: data_tree.hpp:59
libdar::user_interaction
This is a pure virtual class that is used by libdar when interaction with the user is required...
Definition: user_interaction.hpp:98
libdar::data_dir::skip_out
void skip_out(archive_num num)
decrement archive numbers above num
cat_detruit.hpp
used to record information in a catalogue about a deleted file (differential backup context) ...
libdar::data_tree::listing
void listing(user_interaction &dialog) const
list where is saved this file
libdar::data_tree_find
bool data_tree_find(path chemin, const data_dir &racine, const data_tree *&ptr)
lookup routine to find a pointer to the dat_dir object corresponding to the given path ...
libdar::cat_directory
the cat_directory inode class
Definition: cat_directory.hpp:51
libdar::archive
the archive class realizes the most general operations on archives
Definition: archive.hpp:56
libdar::data_tree::read_data
bool read_data(archive_num num, datetime &val, etat &present) const
return the date of file's last modification date within the give archive and whether the file has bee...
user_interaction.hpp
defines the interaction between libdar and the user.Three classes are defined
path.hpp
here is the definition of the path classthe path class handle path and provide several operation on t...
libdar::data_tree::get_data
lookup get_data(archive_num &archive, const datetime &date, bool even_when_removed) const
return the archive where to find the data that was defined just before or at the given date ...
libdar::data_tree::skip_out
virtual void skip_out(archive_num num)
decrement archive numbers above num
libdar::data_tree::finalize
virtual void finalize(const archive_num &archive, const datetime &deleted_date, const archive_num &ignore_archive_greater_or_equal)
add deleted entry if no object of the current archive exist and the entry of the previous archive is ...
infinint.hpp
switch module to limitint (32 ou 64 bits integers) or infinint
libdar::data_dir::show
void show(user_interaction &dialog, archive_num num, std::string marge="") const
list the most recent files owned by that archive (or by any archive if num == 0)
libdar::data_dir::remove_all_from
bool remove_all_from(const archive_num &archive_to_remove, const archive_num &last_archive)
return true if the corresponding file is no more located in any archive (thus, the object is no more ...
libdar::generic_file
this is the interface class from which all other data transfer classes inherit
Definition: generic_file.hpp:100
on_pool.hpp
this is the base class of object that can be allocated on a memory pool
libdar::cat_inode
the root class for all cat_inode
Definition: cat_inode.hpp:54
cat_inode.hpp
base object for all inode types, managed EA and FSA, dates, permissions, ownership, ...
libdar::archive_num
U_16 archive_num
Definition: data_tree.hpp:51
libdar::data_tree::remove_all_from
virtual bool remove_all_from(const archive_num &archive_to_remove, const archive_num &last_archive)
return true if the corresponding file is no more located in any archive (thus, the object is no more ...
libdar::data_tree::get_EA
lookup get_EA(archive_num &archive, const datetime &date, bool even_when_removed) const
if EA has been saved alone later, returns in which version for the state of the file at the given dat...
libdar
libdar namespace encapsulate all libdar symbols
Definition: archive.hpp:47
libdar::path
the class path is here to manipulate paths in the Unix notation: using'/'
Definition: path.hpp:50