Disk ARchive  2.6.8
Full featured and portable backup and archiving tool
data_tree.hpp
Go to the documentation of this file.
1 /*********************************************************************/
2 // dar - disk archive - a backup/restoration program
3 // Copyright (C) 2002-2020 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 <deque>
35 #include <set>
36 #include "infinint.hpp"
37 #include "generic_file.hpp"
38 #include "user_interaction.hpp"
39 #include "path.hpp"
41 #include "database_aux.hpp"
42 
43 namespace libdar
44 {
45 
48 
50 
53  class data_tree
54  {
55  public:
56  data_tree(const std::string &name);
57  data_tree(generic_file & f, unsigned char db_version); //< constructor does not read signature
58  data_tree(const data_tree & ref) = default;
59  data_tree(data_tree && ref) noexcept = default;
60  data_tree & operator = (const data_tree & ref) = default;
61  data_tree & operator = (data_tree && ref) noexcept = default;
62  virtual ~data_tree() = default;
63 
64  virtual void dump(generic_file & f) const; //< dump signature followed by data constructor will read
65  std::string get_name() const { return filename; };
66  void set_name(const std::string & name) { filename = name; };
67 
74  db_lookup get_data(std::set<archive_num> & archive, const datetime & date, bool even_when_removed) const;
75 
77  db_lookup get_EA(archive_num & archive, const datetime & date, bool even_when_removed) const;
78 
80  bool read_data(archive_num num,
81  datetime & val,
82  db_etat & present) const;
83 
85  bool read_EA(archive_num num, datetime & val, db_etat & present) const;
86 
87  void set_data(const archive_num & archive,
88  const datetime & date,
89  db_etat present) { set_data(archive, date, present, nullptr, nullptr); };
90 
91  void set_data(const archive_num & archive,
92  const datetime & date,
93  db_etat present,
94  const crc *base,
95  const crc *result) { last_mod[archive] = status_plus(date, present, base, result); (void) check_delta_validity(); };
96 
97  void set_EA(const archive_num & archive, const datetime & date, db_etat present) { status sta(date, present); last_change[archive] = sta; };
98 
100  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); };
101 
103 
111  virtual void finalize(const archive_num & archive,
112  const datetime & deleted_date,
113  const archive_num & ignore_archive_greater_or_equal);
114 
116  virtual bool remove_all_from(const archive_num & archive_to_remove, const archive_num & last_archive);
117 
120  void *tag) const;
121  virtual void apply_permutation(archive_num src, archive_num dst);
122 
124  virtual void skip_out(archive_num num);
125  virtual void compute_most_recent_stats(std::deque<infinint> & data,
126  std::deque<infinint> & ea,
127  std::deque<infinint> & total_data,
128  std::deque<infinint> & total_ea) const;
129 
130  virtual char obj_signature() const { return signature(); };
131  static char signature() { return 't'; };
132 
133  // fix corruption case that was brought by bug in release 2.4.0 to 2.4.9
134  virtual bool fix_corruption(); // return true whether corruption could be fixed (meaning this entry can be safely removed from base)
135 
136  private:
137 
138  static constexpr const char * const ETAT_SAVED = "S";
139  static constexpr const char * const ETAT_PATCH = "O";
140  static constexpr const char * const ETAT_PATCH_UNUSABLE = "U";
141  static constexpr const char * const ETAT_PRESENT = "P";
142  static constexpr const char * const ETAT_REMOVED = "R";
143  static constexpr const char * const ETAT_ABSENT = "A";
144  static constexpr const char * const ETAT_INODE = "I";
145 
146  static constexpr unsigned char STATUS_PLUS_FLAG_ME = 0x01;
147  static constexpr unsigned char STATUS_PLUS_FLAG_REF = 0x02;
148 
149  class status
150  {
151  public:
152  status(): date(0) { present = db_etat::et_absent; };
153  status(const datetime & d, db_etat p) { date = d; present = p; };
154  status(const status & ref) = default;
155  status(status && ref) noexcept = default;
156  status & operator = (const status & ref) = default;
157  status & operator = (status && ref) noexcept = default;
158  virtual ~status() = default;
159 
160  datetime date; //< date of the event
161  db_etat present; //< file's status in the archive
162 
163  virtual void dump(generic_file & f) const; //< write the struct to file
164  virtual void read(generic_file &f, //< set the struct from file
165  unsigned char db_version);
166  };
167 
168 
169  class status_plus : public status
170  {
171  public:
172  status_plus() { base = result = nullptr; };
173  status_plus(const datetime & d, db_etat p, const crc *xbase, const crc *xresult);
174  status_plus(const status_plus & ref): status(ref) { copy_from(ref); };
175  status_plus(status_plus && ref) noexcept: status(std::move(ref)) { nullifyptr(); move_from(std::move(ref)); };
176  status_plus & operator = (const status_plus & ref) { detruit(); copy_from(ref); return *this; };
177  status_plus & operator = (status_plus && ref) noexcept { status::operator = (std::move(ref)); move_from(std::move(ref)); return *this; };
178  ~status_plus() { detruit(); };
179 
180  crc *base; //< only present for s_delta status, to have a link with the file to apply the patch to
181  crc *result; //< present for s_delta, s_saved, s_not_saved this is the crc of the data (or crc of the data resulting from the patch)
182 
183  void dump(generic_file & f) const; //< write the struct to file
184  void read(generic_file &f, //< set the struct from file
185  unsigned char db_version);
186 
187  private:
188  void nullifyptr() noexcept { base = result = nullptr; };
189  void copy_from(const status_plus & ref);
190  void move_from(status_plus && ref) noexcept;
191  void detruit();
192  };
193 
194 
195  std::string filename;
196  std::map<archive_num, status_plus> last_mod; //< key is archive number ; value is last_mod time
197  std::map<archive_num, status> last_change; //< key is archive number ; value is last_change time
198 
199 
200  // when false is returned, this means that the user wants to ignore subsequent error of the same type
201  // else either no error yet met or user want to continue receiving the same type of error for other files
202  // in that later case initial_warn is set to false (first warning has been shown).
203  template <class T> bool check_map_order(user_interaction & dialog,
204  const std::map<archive_num, T> the_map,
205  const path & current_path,
206  const std::string & field_nature,
207  bool & initial_warn) const;
208 
209  bool check_delta_validity(); // return true if no error has been met about delta patch (no delta is broken, missing its reference)
210 
212 
217  static archive_num data_tree_permutation(archive_num src, archive_num dst, archive_num x);
218 
221  void *tag,
222  archive_num num,
223  const datetime *data,
224  db_etat data_presence,
225  const datetime *ea,
226  db_etat ea_presence);
227 
228  };
229 
230 
231 
233 
234 } // end of namespace
235 
236 #endif
libdar::data_tree::listing
void listing(database_listing_get_version_callback callback, void *tag) const
list where is saved this file
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:100
libdar::db_etat::et_absent
file not even mentionned in the archive, This entry is equivalent to et_removed, but is required to b...
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:46
libdar::data_tree::get_data
db_lookup get_data(std::set< archive_num > &archive, const datetime &date, bool even_when_removed) const
user_interaction.hpp
defines the interaction interface between libdar and users.
infinint.hpp
switch module to limitint (32 ou 64 bits integers) or infinint
libdar::data_tree::get_EA
db_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::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 ...
libdar::data_tree::read_data
bool read_data(archive_num num, datetime &val, db_etat &present) const
return the date of file's last modification date within the give archive and whether the file has bee...
libdar::crc
pure virtual class defining interface of a CRC object
Definition: crc.hpp:46
generic_file.hpp
class generic_file is defined here as well as class fichier
libdar::data_tree::read_EA
bool read_EA(archive_num num, datetime &val, db_etat &present) const
return the date of last inode change and whether the EA has been saved or deleted
libdar::path
the class path is here to manipulate paths in the Unix notation: using'/'
Definition: path.hpp:50
libdar::database_listing_get_version_callback
void(*)(void *context, archive_num num, db_etat data_presence, bool has_data_date, datetime data, db_etat ea_presence, bool has_ea_date, datetime ea) database_listing_get_version_callback
called with the information of presence for an entry in archive number num
Definition: database_listing_callback.hpp:70
database_aux.hpp
set of datastructures used to interact with a database object
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::datetime
stores time information
Definition: datetime.hpp:58
libdar::data_tree::display_line
static void display_line(database_listing_get_version_callback callback, void *tag, archive_num num, const datetime *data, db_etat data_presence, const datetime *ea, db_etat ea_presence)
helper method to provide information to a database_listing_get_version_callback
libdar::db_etat
db_etat
the status for a founded entry
Definition: database_aux.hpp:54
libdar::db_lookup
db_lookup
the available status of a lookup
Definition: database_aux.hpp:40
libdar::generic_file
this is the interface class from which all other data transfer classes inherit
Definition: generic_file.hpp:76
libdar::data_tree
the data_tree class stores presence of a given file in a set of archives
Definition: data_tree.hpp:53
libdar::archive
the archive class realizes the most general operations on archives
Definition: archive.hpp:64
libdar::data_tree::skip_out
virtual void skip_out(archive_num num)
decrement archive numbers above num
libdar::archive_num
class archive_num stores the position of an archive inside a dar_manager database
Definition: archive_num.hpp:46
libdar::data_tree::data_tree_permutation
static archive_num data_tree_permutation(archive_num src, archive_num dst, archive_num x)
gives new archive number when an database has its archive reordered
path.hpp
here is the definition of the path class
database_listing_callback.hpp
definition of the user defined callback function used for database listing
libdar::compile_time::ea
bool ea() noexcept
returns whether EA support has been activated at compilation time
libdar
libdar namespace encapsulate all libdar symbols
Definition: archive.hpp:46