Disk ARchive  2.7.15
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-2024 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, see the AUTHOR file
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 
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 
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
class archive_num stores the position of an archive inside a dar_manager database
Definition: archive_num.hpp:47
the archive class realizes the most general operations on archives
Definition: archive.hpp:65
pure virtual class defining interface of a CRC object
Definition: crc.hpp:47
the data_tree class stores presence of a given file in a set of archives
Definition: data_tree.hpp:54
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 ...
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 ...
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
virtual void skip_out(archive_num num)
decrement archive numbers above num
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
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
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...
void listing(database_listing_get_version_callback callback, void *tag) const
list where is saved this file
db_lookup get_data(std::set< archive_num > &archive, const datetime &date, bool even_when_removed) const
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
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...
stores time information
Definition: datetime.hpp:59
this is the interface class from which all other data transfer classes inherit
the class path is here to manipulate paths in the Unix notation: using'/'
Definition: path.hpp:51
This is a pure virtual class that is used by libdar when interaction with the user is required.
set of datastructures used to interact with a database object
definition of the user defined callback function used for database listing
class generic_file is defined here as well as class fichier
db_lookup
the available status of a lookup
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
db_etat
the status for a founded entry
@ et_absent
file not even mentionned in the archive, This entry is equivalent to et_removed, but is required to b...
switch module to limitint (32 ou 64 bits integers) or infinint
bool ea() noexcept
returns whether EA support has been activated at compilation time
libdar namespace encapsulate all libdar symbols
Definition: archive.hpp:47
here is the definition of the path class
defines the interaction interface between libdar and users.