Disk ARchive 2.7.15
Full featured and portable backup and archiving tool
Loading...
Searching...
No Matches
cat_directory.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#ifndef CAT_DIRECTORY_HPP
27#define CAT_DIRECTORY_HPP
28
29#include "../my_config.h"
30
31extern "C"
32{
33} // end extern "C"
34
35#include "cat_inode.hpp"
36
37#ifdef LIBDAR_FAST_DIR
38#include <map>
39#endif
40#include <list>
41
42namespace libdar
43{
44 class cat_eod;
45
48
50
51 class cat_directory : public cat_inode
52 {
53 public :
54 cat_directory(const infinint & xuid,
55 const infinint & xgid,
56 U_16 xperm,
57 const datetime & last_access,
58 const datetime & last_modif,
59 const datetime & last_change,
60 const std::string & xname,
61 const infinint & device);
62 cat_directory(const std::shared_ptr<user_interaction> & dialog,
64 const archive_version & reading_ver,
66 entree_stats & stats,
67 std::map <infinint, cat_etoile *> & corres,
68 compression default_algo,
69 bool lax,
70 bool only_detruit, // objects of other class than detruit and cat_directory are not built in memory
71 bool small);
72 cat_directory(const cat_directory &ref); // only the inode part is build, no children is duplicated (empty dir)
73 cat_directory(cat_directory && ref) noexcept;
74 cat_directory & operator = (const cat_directory & ref); // set the inode part *only* no subdirectories/subfiles are copies or removed.
75 cat_directory & operator = (cat_directory && ref);
76 ~cat_directory() noexcept(false); // detruit aussi tous les fils et se supprime de son 'parent'
77
79 virtual bool operator == (const cat_entree & ref) const override;
80
81 void add_children(cat_nomme *r); // when r is a cat_directory, 'parent' is set to 'this'
82 bool has_children() const { return !ordered_fils.empty(); };
83 void reset_read_children() const;
84 void end_read() const;
85 bool read_children(const cat_nomme * &r) const; // read the direct children of the cat_directory, returns false if no more is available
86 // remove all entry not yet read by read_children
87 void tail_to_read_children();
88
89
91
96 void remove(const std::string & name);
97
98 cat_directory * get_parent() const { return parent; };
99 bool search_children(const std::string &name, const cat_nomme *&ref) const;
100
101 // using is_more_recent_than() from cat_inode class
102 // using method has_changed_since() from cat_inode class
103 virtual unsigned char signature() const override { return 'd'; };
104
105 virtual std::string get_description() const override { return "folder"; };
106
107
109 bool get_recursive_has_changed() const { return recursive_has_changed; };
110
113
115 infinint get_dir_size() const { return ordered_fils.size(); };
116
119
122
125
126 // for each mirage found (hard link implementation) in the cat_directory tree, add its etiquette to the returned
127 // list with the number of reference that has been found in the tree. (map[etiquette] = number of occurence)
128 // from outside of class cat_directory, the given argument is expected to be an empty map.
129 void get_etiquettes_found_in_tree(std::map<infinint, infinint> & already_found) const;
130
132 bool is_empty() const { return ordered_fils.empty(); };
133
136
139
142
143 virtual cat_entree *clone() const override { return new (std::nothrow) cat_directory(*this); };
144
145 const infinint & get_size() const { recursive_update_sizes(); return x_size; };
146 const infinint & get_storage_size() const { recursive_update_sizes(); return x_storage_size; };
147
148 void recursively_set_to_unsaved_data_and_FSA();
149
151 virtual void change_location(const smart_pointer<pile_descriptor> & pdesc) override;
152
153 protected:
154 virtual void inherited_dump(const pile_descriptor & pdesc, bool small) const override;
155
156 private:
157 static const cat_eod fin;
158
159 mutable infinint x_size;
160 mutable infinint x_storage_size;
161 mutable bool updated_sizes;
162 cat_directory *parent;
163#ifdef LIBDAR_FAST_DIR
164 std::map<std::string, cat_nomme *> fils; // used for fast lookup
165#endif
166 std::deque<cat_nomme *> ordered_fils;
167 mutable std::deque<cat_nomme *>::const_iterator it;
168 mutable bool recursive_has_changed;
169
170 void init() noexcept;
171 void clear();
172 void recursive_update_sizes() const;
173 void recursive_flag_size_to_update() const;
174 void erase_ordered_fils(std::deque<cat_nomme *>::const_iterator debut,
175 std::deque<cat_nomme *>::const_iterator fin);
176 };
177
179
180} // end of namespace
181
182#endif
base object for all inode types, managed EA and FSA, dates, permissions, ownership,...
class archive_version manages the version of the archive format
the cat_directory inode class
void set_all_mirage_s_inode_wrote_field_to(bool val) const
recursively set all mirage inode_wrote flag
infinint get_tree_ea_num() const
get the number of entry having some EA set in the cat_directory tree (recursive call)
std::deque< cat_nomme * >::const_iterator it
next entry to be returned by read_children
void recursive_has_changed_update() const
ask recursive update for the recursive_has_changed field
void set_all_mirage_s_inode_dumped_field_to(bool val) const
set the value of inode_dumped for all mirage (recusively)
void remove_all_mirages_and_reduce_dirs()
recursively remove all mirage entries
infinint get_dir_size() const
get the number of "cat_nomme" entry directly containted in this cat_directory (no recursive call)
virtual std::string get_description() const override
inherited class designation
virtual void inherited_dump(const pile_descriptor &pdesc, bool small) const override
true if object has been created by sequential reading of an archive
virtual unsigned char signature() const override
inherited class signature
infinint get_tree_mirage_num() const
get the number of entry that are hard linked inode (aka mirage in dar implementation) (recursive call...
virtual cat_entree * clone() const override
a way to copy the exact type of an object even if pointed to by a parent class pointer
void remove(const std::string &name)
remove the given entry from the catalogue
virtual void change_location(const smart_pointer< pile_descriptor > &pdesc) override
overwrite virtual method of cat_entree to propagate the action to all entries of the directory tree
bool get_recursive_has_changed() const
detemine whether some data has changed since archive of reference in this cat_directory or subdirecto...
infinint get_tree_size() const
get then number of "cat_nomme" entry contained in this cat_directory and subdirectories (recursive ca...
bool is_empty() const
whether this cat_directory is empty or not
virtual bool operator==(const cat_entree &ref) const override
attention this compares only the directories themselves, not the list of their children
the root class from all other inherite for any entry in the catalogue
the End of Directory entry class
Definition cat_eod.hpp:46
the root class for all cat_inode
Definition cat_inode.hpp:53
the base class for all entry that have a name
Definition cat_nomme.hpp:45
stores time information
Definition datetime.hpp:59
the arbitrary large positive integer class
smart pointer class to be used to automagically manage multiple time pointed to address
compression
the different compression algorithm available
saved_status
data saved status for an entry
@ saved
inode is saved in the archive
libdar namespace encapsulate all libdar symbols
Definition archive.hpp:47
holds the statistics contents of a catalogue