Loading...
Searching...
No Matches
data_tree.hpp
Go to the documentation of this file.
/*********************************************************************/
// dar - disk archive - a backup/restoration program
// Copyright (C) 2002-2024 Denis Corbin
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// to contact the author, see the AUTHOR file
/*********************************************************************/
#ifndef DATA_TREE_HPP
#define DATA_TREE_HPP
#include "../my_config.h"
#include <map>
#include <string>
#include <deque>
#include <set>
#include "infinint.hpp"
#include "generic_file.hpp"
#include "user_interaction.hpp"
#include "path.hpp"
#include "database_listing_callback.hpp"
#include "database_aux.hpp"
namespace libdar
{
class data_tree
{
public:
data_tree(const std::string &name);
data_tree(generic_file & f, unsigned char db_version); //< constructor does not read signature
data_tree(const data_tree & ref) = default;
data_tree(data_tree && ref) noexcept = default;
data_tree & operator = (const data_tree & ref) = default;
data_tree & operator = (data_tree && ref) noexcept = default;
virtual ~data_tree() = default;
virtual void dump(generic_file & f) const; //< dump signature followed by data constructor will read
std::string get_name() const { return filename; };
void set_name(const std::string & name) { filename = name; };
db_lookup get_data(std::set<archive_num> & archive, const datetime & date, bool even_when_removed) const;
db_lookup get_EA(archive_num & archive, const datetime & date, bool even_when_removed) const;
bool read_data(archive_num num,
datetime & val,
db_etat & present) const;
bool read_EA(archive_num num, datetime & val, db_etat & present) const;
void set_data(const archive_num & archive,
const datetime & date,
db_etat present) { set_data(archive, date, present, nullptr, nullptr); };
void set_data(const archive_num & archive,
const datetime & date,
db_etat present,
const crc *base,
const crc *result) { last_mod[archive] = status_plus(date, present, base, result); (void) check_delta_validity(); };
void set_EA(const archive_num & archive, const datetime & date, db_etat present) { status sta(date, present); last_change[archive] = sta; };
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); };
virtual void finalize(const archive_num & archive,
const datetime & deleted_date,
const archive_num & ignore_archive_greater_or_equal);
virtual bool remove_all_from(const archive_num & archive_to_remove, const archive_num & last_archive);
void listing(database_listing_get_version_callback callback,
void *tag) const;
virtual void apply_permutation(archive_num src, archive_num dst);
virtual void skip_out(archive_num num);
virtual void compute_most_recent_stats(std::deque<infinint> & data,
std::deque<infinint> & ea,
std::deque<infinint> & total_data,
std::deque<infinint> & total_ea) const;
virtual char obj_signature() const { return signature(); };
static char signature() { return 't'; };
// fix corruption case that was brought by bug in release 2.4.0 to 2.4.9
virtual bool fix_corruption(); // return true whether corruption could be fixed (meaning this entry can be safely removed from base)
private:
static constexpr const char * const ETAT_SAVED = "S";
static constexpr const char * const ETAT_PATCH = "O";
static constexpr const char * const ETAT_PATCH_UNUSABLE = "U";
static constexpr const char * const ETAT_PRESENT = "P";
static constexpr const char * const ETAT_REMOVED = "R";
static constexpr const char * const ETAT_ABSENT = "A";
static constexpr const char * const ETAT_INODE = "I";
static constexpr unsigned char STATUS_PLUS_FLAG_ME = 0x01;
static constexpr unsigned char STATUS_PLUS_FLAG_REF = 0x02;
class status
{
public:
status(): date(0) { present = db_etat::et_absent; };
status(const datetime & d, db_etat p) { date = d; present = p; };
status(const status & ref) = default;
status(status && ref) noexcept = default;
status & operator = (const status & ref) = default;
status & operator = (status && ref) noexcept = default;
virtual ~status() = default;
datetime date; //< date of the event
db_etat present; //< file's status in the archive
virtual void dump(generic_file & f) const; //< write the struct to file
virtual void read(generic_file &f, //< set the struct from file
unsigned char db_version);
};
class status_plus : public status
{
public:
status_plus() { base = result = nullptr; };
status_plus(const datetime & d, db_etat p, const crc *xbase, const crc *xresult);
status_plus(const status_plus & ref): status(ref) { copy_from(ref); };
status_plus(status_plus && ref) noexcept: status(std::move(ref)) { nullifyptr(); move_from(std::move(ref)); };
status_plus & operator = (const status_plus & ref) { detruit(); copy_from(ref); return *this; };
status_plus & operator = (status_plus && ref) noexcept { status::operator = (std::move(ref)); move_from(std::move(ref)); return *this; };
~status_plus() { detruit(); };
crc *base; //< only present for s_delta status, to have a link with the file to apply the patch to
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)
void dump(generic_file & f) const; //< write the struct to file
void read(generic_file &f, //< set the struct from file
unsigned char db_version);
private:
void nullifyptr() noexcept { base = result = nullptr; };
void copy_from(const status_plus & ref);
void move_from(status_plus && ref) noexcept;
void detruit();
};
std::string filename;
std::map<archive_num, status_plus> last_mod; //< key is archive number ; value is last_mod time
std::map<archive_num, status> last_change; //< key is archive number ; value is last_change time
// when false is returned, this means that the user wants to ignore subsequent error of the same type
// else either no error yet met or user want to continue receiving the same type of error for other files
// in that later case initial_warn is set to false (first warning has been shown).
template <class T> bool check_map_order(user_interaction & dialog,
const std::map<archive_num, T> the_map,
const path & current_path,
const std::string & field_nature,
bool & initial_warn) const;
bool check_delta_validity(); // return true if no error has been met about delta patch (no delta is broken, missing its reference)
static archive_num data_tree_permutation(archive_num src, archive_num dst, archive_num x);
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);
};
} // end of namespace
#endif
libdar::archive_num
class archive_num stores the position of an archive inside a dar_manager database
Definition archive_num.hpp:47
libdar::archive
the archive class realizes the most general operations on archives
Definition archive.hpp:65
libdar::crc
pure virtual class defining interface of a CRC object
Definition crc.hpp:47
libdar::data_tree
the data_tree class stores presence of a given file in a set of archives
Definition data_tree.hpp:54
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::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::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
libdar::data_tree::skip_out
virtual void skip_out(archive_num num)
decrement archive numbers above num
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::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::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::listing
void listing(database_listing_get_version_callback callback, void *tag) const
list where is saved this file
libdar::data_tree::get_data
db_lookup get_data(std::set< archive_num > &archive, const datetime &date, bool even_when_removed) const
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::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::datetime
stores time information
Definition datetime.hpp:59
libdar::generic_file
this is the interface class from which all other data transfer classes inherit
Definition generic_file.hpp:77
libdar::path
the class path is here to manipulate paths in the Unix notation: using'/'
Definition path.hpp:51
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:47
database_aux.hpp
set of datastructures used to interact with a database object
database_listing_callback.hpp
definition of the user defined callback function used for database listing
generic_file.hpp
class generic_file is defined here as well as class fichier
libdar::db_lookup
db_lookup
the available status of a lookup
Definition database_aux.hpp:41
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
libdar::db_etat
db_etat
the status for a founded entry
Definition database_aux.hpp:55
libdar::db_etat::et_absent
@ et_absent
file not even mentionned in the archive, This entry is equivalent to et_removed, but is required to b...
infinint.hpp
switch module to limitint (32 ou 64 bits integers) or infinint
libdar
libdar namespace encapsulate all libdar symbols
Definition archive.hpp:47
path.hpp
here is the definition of the path class
user_interaction.hpp
defines the interaction interface between libdar and users.