Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
FileHashDatabase.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* FileHashDatabase.cc (C) 2000-2023 */
9/* */
10/* Base de données de hash gérée par le système de fichier. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/std/internal/IHashDatabase.h"
15
16#include "arcane/utils/PlatformUtils.h"
17#include "arcane/utils/StringBuilder.h"
18#include "arcane/utils/String.h"
19#include "arcane/utils/FatalErrorException.h"
20#include "arcane/utils/TraceAccessor.h"
21
22#include <fstream>
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane
28{
29// TODO: ajouter information sur la version.
30// TODO: ajouter verrou pour la création des répertoires
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
51: public TraceAccessor
52, public IHashDatabase
53{
54 public:
55
58 {
59 String directory;
60 String filename;
61 String full_filename;
62 };
63
64 public:
65
66 FileHashDatabase(ITraceMng* tm, const String& directory)
68 , m_directory(directory)
69 {
70 }
72 {
73 info() << "FileHashDatabase: nb_write_cache=" << m_nb_write_cache
74 << " nb_write=" << m_nb_write << " nb_read=" << m_nb_read;
75 }
76
77 public:
78
79 void writeValues(const HashDatabaseWriteArgs& args, HashDatabaseWriteResult& xresult) override
80 {
81 Span<const std::byte> bytes = args.values();
82 String hash_value = args.hashValue();
83 xresult.setHashValueAsString(hash_value);
84 DirFileInfo dirfile_info = _getDirFileInfo(hash_value);
85 String base_name = dirfile_info.directory;
86 String full_filename = dirfile_info.full_filename;
87 // TODO: sauver les répertoires créés dans une base pour ne pas le refaire à chaque fois.
88 // TODO: utiliser des verrous lors de la création des sous-répertoires pour éviter
89 // que deux processus le fassent en même temps
90 platform::recursiveCreateDirectory(base_name);
91 // Si le hash est déjà sauvé, ne fait rien
92 {
93 // TODO: il faudrait relire la valeur pour vérifier que tout est OK dans la base
94 // et aussi récupérer la taille du fichier pour garantir la cohérence.
95 std::ifstream ifile(full_filename.localstr());
96 if (ifile.good()) {
97 ++m_nb_write_cache;
98 //std::cout << "FILE_FOUND hash=" << hash_value << " name=" << key << "\n";
99 return;
100 }
101 }
102 // TODO: Ajouter verrou pour l'écriture si plusieurs processus écrivent en même temps
103 {
104 String full_filename = dirfile_info.full_filename;
105 ofstream ofile(full_filename.localstr());
106 //std::cout << "WRITE_HASH hash=" << hash_value << " size=" << bytes.size() << "\n";
107 binaryWrite(ofile, bytes);
108 ++m_nb_write;
109 if (!ofile)
110 ARCANE_FATAL("Can not write hash for filename '{0}'", full_filename);
111 }
112 }
113
114 void readValues(const HashDatabaseReadArgs& args) override
115 {
116 const String& hash_value = args.hashValueAsString();
117 Span<std::byte> bytes = args.values();
118 //std::cout << "READ_VALUE hash_value" << hash_value << " name=" << args.key() << "\n";
119 DirFileInfo dirfile_info = _getDirFileInfo(hash_value);
120 {
121 String full_filename = dirfile_info.full_filename;
122 std::ifstream ifile(full_filename.localstr());
123 binaryRead(ifile, bytes);
124 ++m_nb_read;
125 if (!ifile.good())
126 ARCANE_FATAL("Can not read file '{0}'", full_filename);
127 }
128 }
129
130 private:
131
132 DirFileInfo _getDirFileInfo(const String& hash_value)
133 {
134 char name1 = hash_value.bytes()[0];
135 char name2 = hash_value.bytes()[1];
136 char name3 = hash_value.bytes()[2];
137 StringBuilder base_name_builder = m_directory;
138 base_name_builder += '/';
139 base_name_builder += name1;
140 base_name_builder += '/';
141 base_name_builder += name2;
142 base_name_builder += name3;
143 String base_name = base_name_builder.toString();
144 String full_filename = String::format("{0}/{1}", base_name, hash_value);
145 return DirFileInfo{ base_name, hash_value, full_filename };
146 }
147
148 private:
149
150 String m_directory;
151 Int64 m_nb_write_cache = 0;
152 Int64 m_nb_write = 0;
153 Int64 m_nb_read = 0;
154};
155
156/*---------------------------------------------------------------------------*/
157/*---------------------------------------------------------------------------*/
158
159extern "C++" Ref<IHashDatabase>
160createFileHashDatabase(ITraceMng* tm, const String& directory)
161{
162 return makeRef<IHashDatabase>(new FileHashDatabase(tm, directory));
163}
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
168} // namespace Arcane
169
170/*---------------------------------------------------------------------------*/
171/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Base de donnée de hashs sous la forme d'un système de fichier.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
void binaryRead(std::istream &istr, const Span< std::byte > &bytes)
Lit en binaire le contenu de bytes depuis le flot istr.
Definition ArrayView.cc:70
void binaryWrite(std::ostream &ostr, const Span< const std::byte > &bytes)
Ecrit en binaire le contenu de bytes sur le flot ostr.
Definition ArrayView.cc:60
Nom du répertoire et du fichier contenant le hash.