40 : value(
"this-hash-value-is-empty")
49 : value(container.getId())
57 return (value != other.
value);
62 return (value == other.
value);
67 return (value < other.
value);
71 : ibrcommon::File(file), _stream(NULL), _lock(mutex)
74 _stream =
new std::ifstream(getPath().c_str(), ios_base::in | ios_base::binary);
90 : _callback(callback), _path(path), _tasks(), _store_sem(write_buffer), _store_limited(write_buffer > 0), _faulty(false)
99 std::list<ibrcommon::File> files;
100 _path.getFiles(files);
102 for (std::list<ibrcommon::File>::iterator iter = files.begin(); iter != files.end(); ++iter)
104 (*iter).remove(
true);
110 ibrcommon::File::createDirectory(_path);
124 Task *t = _tasks.take();
127 }
catch (
const ibrcommon::QueueUnblockedException&) {
134 JoinableThread::reset();
144 std::list<ibrcommon::File> files;
145 _path.getFiles(files);
147 for (std::list<ibrcommon::File>::const_iterator iter = files.begin(); iter != files.end(); ++iter)
149 if (!(*iter).isSystem() && !(*iter).isDirectory())
162 if (_store_limited) _store_sem.wait();
165 _tasks.push(
new StoreDataTask(hash, data) );
178 ibrcommon::File file = _path.get(hash.value);
190 _tasks.push(
new RemoveDataTask(hash) );
195 _tasks.wait(ibrcommon::Queue< Task* >::QUEUE_EMPTY);
208 _tasks.wait(ibrcommon::Queue<Task*>::QUEUE_NOT_EMPTY);
209 Task *t = _tasks.front();
212 StoreDataTask &
store =
dynamic_cast<StoreDataTask&
>(*t);
215 ibrcommon::File destination = _path.get(store.hash.value);
218 ibrcommon::MutexLock l(_global_mutex);
219 std::ofstream stream(destination.getPath().c_str(), ios::out | ios::binary | ios::trunc);
222 if (!stream.good() || _faulty)
224 std::stringstream ss; ss <<
"unable to open filestream [" << std::strerror(errno) <<
"]";
225 throw ibrcommon::IOException(ss.str());
228 store._container->serialize(stream);
233 if (_store_limited) _store_sem.post();
237 }
catch (
const ibrcommon::Exception &ex) {
239 if (_store_limited) _store_sem.post();
244 }
catch (
const std::bad_cast&) {
248 RemoveDataTask &
remove =
dynamic_cast<RemoveDataTask&
>(*t);
251 ibrcommon::File destination = _path.get(
remove.hash.value);
253 ibrcommon::MutexLock l(_global_mutex);
254 if (!destination.exists())
258 destination.remove();
261 }
catch (
const ibrcommon::Exception &ex) {
264 }
catch (
const std::bad_cast&) {
271 }
catch (
const ibrcommon::QueueUnblockedException&) {
277 DataStorage::Task::~Task() {}
279 DataStorage::StoreDataTask::StoreDataTask(
const Hash &
h, Container *c)
280 : hash(h), _container(c)
283 DataStorage::StoreDataTask::~StoreDataTask()
287 DataStorage::RemoveDataTask::RemoveDataTask(
const Hash &
h) : hash(h)
290 DataStorage::RemoveDataTask::~RemoveDataTask()
virtual void eventDataStorageRemoveFailed(const Hash &hash, const ibrcommon::Exception &)=0
istream(ibrcommon::Mutex &mutex, const ibrcommon::File &file)
void setFaulty(bool mode)
std::istream & operator*()
DataStorage(Callback &callback, const ibrcommon::File &path, unsigned int write_buffer=0, bool initialize=false)
bool operator<(const Hash &other) const
virtual void eventDataStorageRemoved(const Hash &hash)=0
bool operator==(const Hash &other) const
bool operator!=(const Hash &other) const
DataStorage::istream retrieve(const Hash &hash)
virtual void iterateDataStorage(const Hash &hash, DataStorage::istream &stream)=0
const Hash store(Container *data)
virtual void eventDataStorageStored(const Hash &hash)=0
void remove(const Hash &hash)
virtual void eventDataStorageStoreFailed(const Hash &hash, const ibrcommon::Exception &)=0