Loading...
Searching...
No Matches
catalogue.hpp
Go to the documentation of this file.
/*********************************************************************/
// dar - disk archive - a backup/restoration program
// Copyright (C) 2002-2026 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 CATALOGUE_HPP
#define CATALOGUE_HPP
#include "../my_config.h"
extern "C"
{
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
} // end extern "C"
#include "infinint.hpp"
#include "path.hpp"
#include "integers.hpp"
#include "mask.hpp"
#include "user_interaction.hpp"
#include "label.hpp"
#include "escape.hpp"
#include "datetime.hpp"
#include "cat_entree.hpp"
#include "cat_nomme.hpp"
#include "cat_directory.hpp"
#include "mem_ui.hpp"
#include "delta_sig_block_size.hpp"
namespace libdar
{
class catalogue: public mem_ui
{
public :
catalogue(const std::shared_ptr<user_interaction> & ui,
const datetime & root_last_modif,
const label & data_name);
catalogue(const std::shared_ptr<user_interaction> & ui,
const pile_descriptor & pdesc,
const archive_version & reading_ver,
compression default_algo,
bool lax,
const label & lax_layer1_data_name, // ignored unless in lax mode, in lax mode unless it is a cleared label, forces the catalogue label to be equal to the lax_layer1_data_name for it be considered a plain internal catalogue, even in case of corruption
bool only_detruit = false); // if set to true, only directories and detruit objects are read from the archive
catalogue(const catalogue & ref) : mem_ui(ref), out_compare(ref.out_compare), in_place(ref.in_place) { partial_copy_from(ref); };
catalogue(catalogue && ref) = delete;
catalogue & operator = (const catalogue &ref);
catalogue & operator = (catalogue && ref) = delete;
virtual ~catalogue() { detruire(); };
void set_early_memory_release() { early_mem_release = true; };
bool get_early_memory_release() const { return early_mem_release; };
bool get_memory_released() const { return mem_released; };
// reading methods. The reading is iterative and uses the current_read cat_directory pointer
virtual void reset_read() const; // set the reading cursor to the beginning of the catalogue
virtual void end_read() const; // set the reading cursor to the end of the catalogue
virtual void skip_read_to_parent_dir() const;
// skip all items of the current dir and of any subdir, the next call will return
// next item of the parent dir (no cat_eod to exit from the current dir !)
virtual bool read(const cat_entree * & ref) const;
// sequential read (generates cat_eod) and return false when all files have been read
virtual bool read_if_present(std::string *name, const cat_nomme * & ref) const;
// pseudo-sequential read (reading a directory still
// implies that following read are located in this subdirectory up to the next EOD) but
// it returns false if no entry of this name are present in the current directory
// a call with nullptr as first argument means to set the current dir the parent directory
void remove_read_entry(std::string & name);
// in the currently read directory, removes the entry which name is given in argument
virtual void remove_last_read();
const cat_directory & get_current_reading_dir() const { if(current_read == nullptr) throw SRC_BUG; return *current_read; };
// remove from the catalogue all the entries that have not yet been read
// by read().
virtual void tail_catalogue_to_current_read(bool including_last_read);
// return true if the last read entry has already been read
// and has not to be counted again. This is never the case for catalogue but may occur
// with escape_catalogue inherited class (where from the 'virtual').
// last this method gives a valid result only if the last read() entry is a directory as
// only directory may be read() twice.
virtual bool read_second_time_dir() const { return false; };
path get_current_read_path() const;
// Additions methods. The addition is also iterative but uses its specific current_add directory pointer
void reset_add();
// real implementation is only needed in escape_catalogue class, here there nothing to be done
virtual void pre_add(const cat_entree *ref, const pile_descriptor* dest = nullptr) const {};
virtual void pre_add_ea(const cat_entree *ref, const pile_descriptor* dest = nullptr) const {};
virtual void pre_add_crc(const cat_entree *ref, const pile_descriptor* dest = nullptr) const {};
virtual void pre_add_dirty( const pile_descriptor* dest = nullptr) const {};
virtual void pre_add_ea_crc(const cat_entree *ref, const pile_descriptor* dest = nullptr) const {};
virtual void pre_add_waste_mark(const pile_descriptor* dest = nullptr) const {};
virtual void pre_add_failed_mark(const pile_descriptor* dest = nullptr) const {};
virtual void pre_add_fsa(const cat_entree *ref, const pile_descriptor* dest = nullptr) const {};
virtual void pre_add_fsa_crc(const cat_entree *ref, const pile_descriptor* dest = nullptr) const {};
virtual void pre_add_delta_sig(const pile_descriptor* dest = nullptr) const {};
virtual escape *get_escape_layer() const { return faked_escape; };
virtual void drop_escape_layer() { faked_escape = nullptr; };
virtual void set_escape_layer(escape* ptr) { faked_escape = ptr; };
void add(cat_entree *ref, bool addtostats = true); // add at end of catalogue (sequential point of view)
void re_add_in(const std::string &subdirname); // return into an already existing subdirectory for further addition
void re_add_in_replace(const cat_directory &dir); // same as re_add_in but also set the properties of the existing directory to those of the given argument
void add_in_current_read(cat_nomme *ref); // add in currently read directory
const cat_directory & get_current_add_dir() const { if(current_add == nullptr) throw SRC_BUG; return *current_add; };
void remove_in_current_add(const std::string & name);
// Comparison methods. The comparision is here also iterative and uses its specific current_compare directory pointer
void reset_compare() const;
bool compare(const cat_entree * name, const cat_entree * & extracted) const;
// returns true if the ref exists, and gives it back in second argument as it is in the current catalogue.
// returns false is no entry of that nature exists in the catalogue (in the current directory)
// if ref is a directory, the operation is normaly relative to the directory itself, but
// such a call implies a chdir to that directory. thus, a call with an EOD is necessary to
// change to the parent directory.
// note :
// if a directory is not present, returns false, but records the inexistant subdirectory
// structure defined by the following calls to this routine, this to be able to know when
// the last available directory is back the current one when changing to parent directory,
// and then proceed with normal comparison of inode. In this laps of time, the call will
// always return false, while it temporarily stores the missing directory structure
// non-iterative methods:
infinint update_destroyed_with(const catalogue & ref,
const path & fs_root,
bool display_treated);
void update_absent_with(const catalogue & ref, infinint aborting_next_etoile);
void drop_all_non_detruits();
void drop_all_ea_and_fsa() { contenu->remove_all_ea_and_fsa(); };
bool is_subset_of(const catalogue & ref) const;
void reset_dump() const;
void dump(const pile_descriptor & pdesc) const;
entree_stats get_stats() const { return stats; };
bool is_empty() const { if(contenu == nullptr) throw SRC_BUG; return contenu->is_empty(); };
const cat_directory *get_contenu() const { return contenu; }; // used by data_tree
const label & get_data_name() const { return ref_data_name; };
void set_data_name(const label & val) { ref_data_name = val; };
datetime get_root_dir_last_modif() const { return contenu->get_last_modif(); };
void launch_recursive_has_changed_update() const { contenu->recursive_has_changed_update(); };
void set_all_mirage_s_inode_wrote_field_to(bool val) const { const_cast<cat_directory *>(contenu)->set_all_mirage_s_inode_wrote_field_to(val); };
datetime get_root_mtime() const { return contenu->get_last_modif(); };
void reset_all();
void set_to_unsaved_data_and_FSA() { if(contenu == nullptr) throw SRC_BUG; contenu->recursively_set_to_unsaved_data_and_FSA(); };
void change_location(const pile_descriptor & pdesc);
void transfer_delta_signatures(const pile_descriptor & destination,
bool sequential_read,
bool build,
const mask & delta_mask,
const infinint & delta_sig_min_size,
const delta_sig_block_size & signature_block_size);
void drop_delta_signatures();
bool has_in_place() const { return in_place.is_absolute(); };
bool get_in_place(path & arg) const;
virtual void set_in_place(const path & arg);
virtual void clear_in_place();
protected:
entree_stats & access_stats() { return stats; };
void copy_detruits_from(const catalogue & ref); // needed for escape_catalogue implementation only.
const cat_eod * get_r_eod_address() const { return & r_eod; }; // cat_eod are never stored in the catalogue
// however it is sometimes required to return such a reference to a valid object
// owned by the catalogue.
void swap_stuff(catalogue & ref);
bool is_mem_released() const { return mem_released; };
void set_mem_released() { mem_released = true; };
private :
cat_directory *contenu;
mutable path out_compare;
mutable cat_directory *current_compare;
mutable cat_directory *current_add;
mutable cat_directory *current_read;
path *sub_tree;
mutable signed int sub_count;
entree_stats stats;
label ref_data_name;
path in_place;
bool early_mem_release;
mutable bool mem_released;
escape* faked_escape;
void partial_copy_from(const catalogue &ref);
void detruire();
static const cat_eod r_eod;
static const U_I CAT_CRC_SIZE;
};
} // end of namespace
#endif
cat_directory.hpp
class used to organize objects in tree in catalogue as like directories in a filesystem
cat_entree.hpp
base class for all object contained in a catalogue
cat_nomme.hpp
base class of all objects contained in a catalogue and that can be named
libdar::archive_version
class archive_version manages the version of the archive format
Definition archive_version.hpp:47
libdar::cat_directory
the cat_directory inode class
Definition cat_directory.hpp:52
libdar::cat_entree
the root class from all other inherite for any entry in the catalogue
Definition cat_entree.hpp:60
libdar::cat_eod
the End of Directory entry class
Definition cat_eod.hpp:46
libdar::cat_nomme
the base class for all entry that have a name
Definition cat_nomme.hpp:45
libdar::catalogue
the catalogue class which gather all objects contained in a give archive
Definition catalogue.hpp:60
libdar::catalogue::change_location
void change_location(const pile_descriptor &pdesc)
change location where to find EA, FSA and DATA for all the objects of the catalogue
libdar::catalogue::set_all_mirage_s_inode_wrote_field_to
void set_all_mirage_s_inode_wrote_field_to(bool val) const
recursive setting of mirage inode_wrote flag
Definition catalogue.hpp:234
libdar::catalogue::update_destroyed_with
infinint update_destroyed_with(const catalogue &ref, const path &fs_root, bool display_treated)
add into "this" detruit object corresponding to object of ref absent in "this"
libdar::catalogue::in_place
path in_place
path of the directory used for root of the backup (at the time of the backup)
Definition catalogue.hpp:312
libdar::catalogue::current_read
cat_directory * current_read
points to the directory where the next item will be read
Definition catalogue.hpp:307
libdar::catalogue::remove_in_current_add
void remove_in_current_add(const std::string &name)
remove entry of given name that was added
libdar::catalogue::reset_all
void reset_all()
reset all pointers to the root (a bit better than reset_add() + reset_read() + reset_compare() + rese...
libdar::catalogue::faked_escape
escape * faked_escape
used when reading an archive with the help of an isolated catalog to keep trace of the sequential rea...
Definition catalogue.hpp:315
libdar::catalogue::is_subset_of
bool is_subset_of(const catalogue &ref) const
check whether all inode existing in the "this" and ref have the same attributes
libdar::catalogue::stats
entree_stats stats
statistics catalogue contents
Definition catalogue.hpp:310
libdar::catalogue::swap_stuff
void swap_stuff(catalogue &ref)
libdar::catalogue::set_early_memory_release
void set_early_memory_release()
reduce memory footprint releasing from memory catalogue parts
Definition catalogue.hpp:92
libdar::catalogue::drop_all_ea_and_fsa
void drop_all_ea_and_fsa()
remove all EA and FSA (they get flagged as "partial" if they had "full" status
Definition catalogue.hpp:204
libdar::catalogue::sub_tree
path * sub_tree
path to sub_tree
Definition catalogue.hpp:308
libdar::catalogue::pre_add
virtual void pre_add(const cat_entree *ref, const pile_descriptor *dest=nullptr) const
catalogue extension routines for escape sequence
Definition catalogue.hpp:142
libdar::catalogue::transfer_delta_signatures
void transfer_delta_signatures(const pile_descriptor &destination, bool sequential_read, bool build, const mask &delta_mask, const infinint &delta_sig_min_size, const delta_sig_block_size &signature_block_size)
copy delta signatures to the given stack and update the cat_file objects accordingly
libdar::catalogue::out_compare
path out_compare
stores the missing directory structure, when extracting
Definition catalogue.hpp:304
libdar::catalogue::is_empty
bool is_empty() const
whether the catalogue is empty or not
Definition catalogue.hpp:221
libdar::catalogue::mem_released
bool mem_released
wether the catalogue content has been released and the object is no more usable
Definition catalogue.hpp:314
libdar::catalogue::current_add
cat_directory * current_add
points to the directory where to add the next file with add_file;
Definition catalogue.hpp:306
libdar::catalogue::get_memory_released
bool get_memory_released() const
return true if the catalogue has been released from memory
Definition catalogue.hpp:98
libdar::catalogue::drop_delta_signatures
void drop_delta_signatures()
remove delta signature from the catalogue object as if they had never been calculated
libdar::catalogue::set_mem_released
void set_mem_released()
let inherited class tell when memory release has completed
Definition catalogue.hpp:300
libdar::catalogue::get_current_read_path
path get_current_read_path() const
return the <ROOT> based path of the current directory where reading is currently taking place
libdar::catalogue::get_early_memory_release
bool get_early_memory_release() const
get early memory release status
Definition catalogue.hpp:95
libdar::catalogue::drop_all_non_detruits
void drop_all_non_detruits()
remove/destroy from "this" all objects that are neither directory nor detruit objects
libdar::catalogue::ref_data_name
label ref_data_name
name of the archive where is located the data
Definition catalogue.hpp:311
libdar::catalogue::has_in_place
bool has_in_place() const
returns whether an in-place path is stored in the catalogue
Definition catalogue.hpp:267
libdar::catalogue::early_mem_release
bool early_mem_release
whether to release memory as soon as possible
Definition catalogue.hpp:313
libdar::catalogue::update_absent_with
void update_absent_with(const catalogue &ref, infinint aborting_next_etoile)
copy from ref missing files in "this" and mark then as "not_saved" (no change since reference)
libdar::catalogue::contenu
cat_directory * contenu
catalogue contents
Definition catalogue.hpp:303
libdar::catalogue::clear_in_place
virtual void clear_in_place()
clear the in_place path
libdar::catalogue::is_mem_released
bool is_mem_released() const
provide to inherited class the access to the early mem release mode and fields
Definition catalogue.hpp:297
libdar::catalogue::remove_last_read
virtual void remove_last_read()
remove last read entry
libdar::catalogue::get_in_place
bool get_in_place(path &arg) const
get the in_place path when available
libdar::catalogue::set_in_place
virtual void set_in_place(const path &arg)
set the in_place path for recording in the archive
libdar::catalogue::launch_recursive_has_changed_update
void launch_recursive_has_changed_update() const
recursive evaluation of directories that have changed (make the cat_directory::get_recurisve_has_chan...
Definition catalogue.hpp:231
libdar::catalogue::r_eod
static const cat_eod r_eod
needed to return eod reference, without taking risk of saturating memory
Definition catalogue.hpp:320
libdar::catalogue::sub_count
signed int sub_count
count the depth in of read routine in the sub_tree
Definition catalogue.hpp:309
libdar::catalogue::current_compare
cat_directory * current_compare
points to the current directory when comparing
Definition catalogue.hpp:305
libdar::catalogue::dump
void dump(const pile_descriptor &pdesc) const
write down the whole catalogue to file
libdar::catalogue::reset_dump
void reset_dump() const
before dumping the catalogue, need to set all hardlinked inode they have not been saved once
libdar::datetime
stores time information
Definition datetime.hpp:59
libdar::infinint
the arbitrary large positive integer class
Definition real_infinint.hpp:62
libdar::label
manage label data structure used in archive slice headers
Definition label.hpp:43
libdar::mask
the generic class, parent of all masks
Definition mask.hpp:62
libdar::mem_ui::mem_ui
mem_ui(const std::shared_ptr< user_interaction > &dialog)
constructor
libdar::path
the class path is here to manipulate paths in the Unix notation: using'/'
Definition path.hpp:51
datetime.hpp
this file contains the definition of class datetime that stores unix times in a portable way
delta_sig_block_size.hpp
structure used to define how to select block size for delta signature
escape.hpp
class escape definition, used for sequential reading of archives
libdar::compression
compression
the different compression algorithm available
Definition compression.hpp:46
infinint.hpp
switch module to limitint (32 ou 64 bits integers) or infinint
integers.hpp
are defined here basic integer types that tend to be portable
label.hpp
define the datastructure "label" used to identify slice membership to an archive
mask.hpp
here lies a collection of mask classes
mem_ui.hpp
class mem_ui definition. This class is to be used as parent class to handle user_interaction object m...
my_config.h
include macro defined by the configure script and some specific additional ones
libdar
libdar namespace encapsulate all libdar symbols
Definition archive.hpp:47
path.hpp
here is the definition of the path class
libdar::delta_sig_block_size
defines how to calculate delta signature block size based of file size to delta sign
Definition delta_sig_block_size.hpp:50
libdar::entree_stats
holds the statistics contents of a catalogue
Definition entree_stats.hpp:49
user_interaction.hpp
defines the interaction interface between libdar and users.