Use OSRM runtime error for tar reader as well
This commit is contained in:
parent
a542da3678
commit
993f5badf1
@ -19,6 +19,60 @@ namespace storage
|
|||||||
{
|
{
|
||||||
namespace tar
|
namespace tar
|
||||||
{
|
{
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
inline void
|
||||||
|
checkMTarError(int error_code, const boost::filesystem::path &filepath, const std::string &name)
|
||||||
|
{
|
||||||
|
switch (error_code)
|
||||||
|
{
|
||||||
|
case MTAR_ESUCCESS:
|
||||||
|
return;
|
||||||
|
case MTAR_EFAILURE:
|
||||||
|
throw util::RuntimeError(filepath.string() + " : " + name,
|
||||||
|
ErrorCode::FileIOError,
|
||||||
|
SOURCE_REF,
|
||||||
|
std::strerror(errno));
|
||||||
|
case MTAR_EOPENFAIL:
|
||||||
|
throw util::RuntimeError(filepath.string() + " : " + name,
|
||||||
|
ErrorCode::FileOpenError,
|
||||||
|
SOURCE_REF,
|
||||||
|
std::strerror(errno));
|
||||||
|
case MTAR_EREADFAIL:
|
||||||
|
throw util::RuntimeError(filepath.string() + " : " + name,
|
||||||
|
ErrorCode::FileReadError,
|
||||||
|
SOURCE_REF,
|
||||||
|
std::strerror(errno));
|
||||||
|
case MTAR_EWRITEFAIL:
|
||||||
|
throw util::RuntimeError(filepath.string() + " : " + name,
|
||||||
|
ErrorCode::FileWriteError,
|
||||||
|
SOURCE_REF,
|
||||||
|
std::strerror(errno));
|
||||||
|
case MTAR_ESEEKFAIL:
|
||||||
|
throw util::RuntimeError(filepath.string() + " : " + name,
|
||||||
|
ErrorCode::FileIOError,
|
||||||
|
SOURCE_REF,
|
||||||
|
std::strerror(errno));
|
||||||
|
case MTAR_EBADCHKSUM:
|
||||||
|
throw util::RuntimeError(filepath.string() + " : " + name,
|
||||||
|
ErrorCode::FileIOError,
|
||||||
|
SOURCE_REF,
|
||||||
|
std::strerror(errno));
|
||||||
|
case MTAR_ENULLRECORD:
|
||||||
|
throw util::RuntimeError(filepath.string() + " : " + name,
|
||||||
|
ErrorCode::UnexpectedEndOfFile,
|
||||||
|
SOURCE_REF,
|
||||||
|
std::strerror(errno));
|
||||||
|
case MTAR_ENOTFOUND:
|
||||||
|
throw util::RuntimeError(filepath.string() + " : " + name,
|
||||||
|
ErrorCode::FileIOError,
|
||||||
|
SOURCE_REF,
|
||||||
|
std::strerror(errno));
|
||||||
|
default:
|
||||||
|
throw util::exception(filepath.string() + " : " + name + ":" + mtar_strerror(error_code));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class FileReader
|
class FileReader
|
||||||
{
|
{
|
||||||
@ -32,10 +86,7 @@ class FileReader
|
|||||||
FileReader(const boost::filesystem::path &path, FingerprintFlag flag) : path(path)
|
FileReader(const boost::filesystem::path &path, FingerprintFlag flag) : path(path)
|
||||||
{
|
{
|
||||||
auto ret = mtar_open(&handle, path.c_str(), "r");
|
auto ret = mtar_open(&handle, path.c_str(), "r");
|
||||||
if (ret != MTAR_ESUCCESS)
|
detail::checkMTarError(ret, path, "");
|
||||||
{
|
|
||||||
throw util::exception(mtar_strerror(ret));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flag == VerifyFingerprint)
|
if (flag == VerifyFingerprint)
|
||||||
{
|
{
|
||||||
@ -52,7 +103,7 @@ class FileReader
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> void ReadInto(const std::string &name, T& tmp)
|
template <typename T> void ReadInto(const std::string &name, T &tmp)
|
||||||
{
|
{
|
||||||
ReadInto(name, &tmp, 1);
|
ReadInto(name, &tmp, 1);
|
||||||
}
|
}
|
||||||
@ -61,27 +112,23 @@ class FileReader
|
|||||||
{
|
{
|
||||||
mtar_header_t header;
|
mtar_header_t header;
|
||||||
auto ret = mtar_find(&handle, name.c_str(), &header);
|
auto ret = mtar_find(&handle, name.c_str(), &header);
|
||||||
if (ret != MTAR_ESUCCESS)
|
detail::checkMTarError(ret, path, name);
|
||||||
{
|
|
||||||
throw util::exception(name + ": " + mtar_strerror(ret));
|
|
||||||
}
|
|
||||||
|
|
||||||
auto number_of_elements = header.size / sizeof(T);
|
auto number_of_elements = header.size / sizeof(T);
|
||||||
auto expected_size = sizeof(T) * number_of_elements;
|
auto expected_size = sizeof(T) * number_of_elements;
|
||||||
if (header.size != expected_size)
|
if (header.size != expected_size)
|
||||||
{
|
{
|
||||||
throw util::exception(name + ": Datatype size does not match file size.");
|
throw util::RuntimeError(name + ": Datatype size does not match file size.",
|
||||||
|
ErrorCode::UnexpectedEndOfFile,
|
||||||
|
SOURCE_REF);
|
||||||
}
|
}
|
||||||
|
|
||||||
T tmp;
|
T tmp;
|
||||||
for (auto index : util::irange<std::size_t>(0, number_of_elements))
|
for (auto index : util::irange<std::size_t>(0, number_of_elements))
|
||||||
{
|
{
|
||||||
(void) index;
|
(void)index;
|
||||||
ret = mtar_read_data(&handle, reinterpret_cast<char *>(&tmp), sizeof(T));
|
ret = mtar_read_data(&handle, reinterpret_cast<char *>(&tmp), sizeof(T));
|
||||||
if (ret != MTAR_ESUCCESS)
|
detail::checkMTarError(ret, path, name);
|
||||||
{
|
|
||||||
throw util::exception(name + ": Failed reading data: " + mtar_strerror(ret));
|
|
||||||
}
|
|
||||||
|
|
||||||
*out++ = tmp;
|
*out++ = tmp;
|
||||||
}
|
}
|
||||||
@ -92,22 +139,18 @@ class FileReader
|
|||||||
{
|
{
|
||||||
mtar_header_t header;
|
mtar_header_t header;
|
||||||
auto ret = mtar_find(&handle, name.c_str(), &header);
|
auto ret = mtar_find(&handle, name.c_str(), &header);
|
||||||
if (ret != MTAR_ESUCCESS)
|
detail::checkMTarError(ret, path, name);
|
||||||
{
|
|
||||||
throw util::exception(name + ": " + mtar_strerror(ret));
|
|
||||||
}
|
|
||||||
|
|
||||||
auto expected_size = sizeof(T) * number_of_elements;
|
auto expected_size = sizeof(T) * number_of_elements;
|
||||||
if (header.size != expected_size)
|
if (header.size != expected_size)
|
||||||
{
|
{
|
||||||
throw util::exception(name + ": Datatype size does not match file size.");
|
throw util::RuntimeError(name + ": Datatype size does not match file size.",
|
||||||
|
ErrorCode::UnexpectedEndOfFile,
|
||||||
|
SOURCE_REF);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = mtar_read_data(&handle, reinterpret_cast<char *>(data), header.size);
|
ret = mtar_read_data(&handle, reinterpret_cast<char *>(data), header.size);
|
||||||
if (ret != MTAR_ESUCCESS)
|
detail::checkMTarError(ret, path, name);
|
||||||
{
|
|
||||||
throw util::exception(name + ": Failed reading data: " + mtar_strerror(ret));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct FileEntry
|
struct FileEntry
|
||||||
@ -124,11 +167,15 @@ class FileReader
|
|||||||
{
|
{
|
||||||
if (header.type == MTAR_TREG)
|
if (header.type == MTAR_TREG)
|
||||||
{
|
{
|
||||||
mtar_read_data(&handle, nullptr, 0);
|
int ret = mtar_read_data(&handle, nullptr, 0);
|
||||||
|
detail::checkMTarError(ret, path, header.name);
|
||||||
|
|
||||||
auto offset = handle.pos;
|
auto offset = handle.pos;
|
||||||
// seek back to the header
|
// seek back to the header
|
||||||
handle.remaining_data = 0;
|
handle.remaining_data = 0;
|
||||||
mtar_seek(&handle, handle.last_header);
|
ret = mtar_seek(&handle, handle.last_header);
|
||||||
|
detail::checkMTarError(ret, path, header.name);
|
||||||
|
|
||||||
*out++ = FileEntry{header.name, header.size, offset};
|
*out++ = FileEntry{header.name, header.size, offset};
|
||||||
}
|
}
|
||||||
mtar_next(&handle);
|
mtar_next(&handle);
|
||||||
@ -178,8 +225,7 @@ class FileWriter
|
|||||||
FileWriter(const boost::filesystem::path &path, FingerprintFlag flag) : path(path)
|
FileWriter(const boost::filesystem::path &path, FingerprintFlag flag) : path(path)
|
||||||
{
|
{
|
||||||
auto ret = mtar_open(&handle, path.c_str(), "w");
|
auto ret = mtar_open(&handle, path.c_str(), "w");
|
||||||
if (ret != MTAR_ESUCCESS)
|
detail::checkMTarError(ret, path, "");
|
||||||
throw util::exception(mtar_strerror(ret));
|
|
||||||
|
|
||||||
if (flag == GenerateFingerprint)
|
if (flag == GenerateFingerprint)
|
||||||
{
|
{
|
||||||
@ -209,20 +255,14 @@ class FileWriter
|
|||||||
auto number_of_bytes = number_of_elements * sizeof(T);
|
auto number_of_bytes = number_of_elements * sizeof(T);
|
||||||
|
|
||||||
auto ret = mtar_write_file_header(&handle, name.c_str(), number_of_bytes);
|
auto ret = mtar_write_file_header(&handle, name.c_str(), number_of_bytes);
|
||||||
if (ret != MTAR_ESUCCESS)
|
detail::checkMTarError(ret, path, name);
|
||||||
{
|
|
||||||
throw util::exception(name + ": Error writing header: " + mtar_strerror(ret));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto index : util::irange<std::size_t>(0, number_of_elements))
|
for (auto index : util::irange<std::size_t>(0, number_of_elements))
|
||||||
{
|
{
|
||||||
(void) index;
|
(void)index;
|
||||||
T tmp = *iter++;
|
T tmp = *iter++;
|
||||||
ret = mtar_write_data(&handle, &tmp, sizeof(T));
|
ret = mtar_write_data(&handle, &tmp, sizeof(T));
|
||||||
if (ret != MTAR_ESUCCESS)
|
detail::checkMTarError(ret, path, name);
|
||||||
{
|
|
||||||
throw util::exception(name + ": Error writing data : " + mtar_strerror(ret));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -234,10 +274,7 @@ class FileWriter
|
|||||||
|
|
||||||
mtar_header_t header;
|
mtar_header_t header;
|
||||||
auto ret = mtar_find(&handle, name.c_str(), &header);
|
auto ret = mtar_find(&handle, name.c_str(), &header);
|
||||||
if (ret != MTAR_ESUCCESS)
|
detail::checkMTarError(ret, path, name);
|
||||||
{
|
|
||||||
throw util::exception(name + ": Error reading header: " + mtar_strerror(ret));
|
|
||||||
}
|
|
||||||
|
|
||||||
// update header to reflect increased tar size
|
// update header to reflect increased tar size
|
||||||
auto old_size = header.size;
|
auto old_size = header.size;
|
||||||
@ -247,16 +284,10 @@ class FileWriter
|
|||||||
// now seek to the end of the old record
|
// now seek to the end of the old record
|
||||||
handle.remaining_data = number_of_bytes;
|
handle.remaining_data = number_of_bytes;
|
||||||
ret = mtar_seek(&handle, handle.pos + old_size);
|
ret = mtar_seek(&handle, handle.pos + old_size);
|
||||||
if (ret != MTAR_ESUCCESS)
|
detail::checkMTarError(ret, path, name);
|
||||||
{
|
|
||||||
throw util::exception(name + ": Error seeking to end of old data: " + mtar_strerror(ret));
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = mtar_write_data(&handle, data, number_of_bytes);
|
ret = mtar_write_data(&handle, data, number_of_bytes);
|
||||||
if (ret != MTAR_ESUCCESS)
|
detail::checkMTarError(ret, path, name);
|
||||||
{
|
|
||||||
throw util::exception(name + ": Error writing data : " + mtar_strerror(ret));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -265,16 +296,10 @@ class FileWriter
|
|||||||
auto number_of_bytes = number_of_elements * sizeof(T);
|
auto number_of_bytes = number_of_elements * sizeof(T);
|
||||||
|
|
||||||
auto ret = mtar_write_file_header(&handle, name.c_str(), number_of_bytes);
|
auto ret = mtar_write_file_header(&handle, name.c_str(), number_of_bytes);
|
||||||
if (ret != MTAR_ESUCCESS)
|
detail::checkMTarError(ret, path, name);
|
||||||
{
|
|
||||||
throw util::exception(name + ": Error writing header: " + mtar_strerror(ret));
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = mtar_write_data(&handle, reinterpret_cast<const char *>(data), number_of_bytes);
|
ret = mtar_write_data(&handle, reinterpret_cast<const char *>(data), number_of_bytes);
|
||||||
if (ret != MTAR_ESUCCESS)
|
detail::checkMTarError(ret, path, name);
|
||||||
{
|
|
||||||
throw util::exception(name + ": Error writing data : " + mtar_strerror(ret));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Loading…
Reference in New Issue
Block a user