From 07fe9ed11a1443bef245723237a3013b2df266e9 Mon Sep 17 00:00:00 2001 From: rip-nsk Date: Wed, 2 May 2018 10:29:58 -0700 Subject: [PATCH] Use orc::InputStream in getTimezoneByFilename --- c++/src/Timezone.cc | 47 +++++++++------------------------------------ 1 file changed, 9 insertions(+), 38 deletions(-) diff --git a/c++/src/Timezone.cc b/c++/src/Timezone.cc index 9d56d7fb57..42e8121168 100644 --- a/c++/src/Timezone.cc +++ b/c++/src/Timezone.cc @@ -16,20 +16,16 @@ * limitations under the License. */ +#include "orc/OrcFile.hh" #include "Timezone.hh" #include -#include -#include #include #include #include -#include #include #include -#include #include -#include namespace orc { @@ -698,40 +694,15 @@ namespace orc { if (itr != timezoneCache.end()) { return *(itr->second).get(); } - int in = open(filename.c_str(), O_RDONLY); - if (in == -1) { - std::stringstream buffer; - buffer << "failed to open " << filename << " - " << strerror(errno); - throw TimezoneError(buffer.str()); - } - struct stat fileInfo; - if (fstat(in, &fileInfo) == -1) { - std::stringstream buffer; - buffer << "failed to stat " << filename << " - " << strerror(errno); - throw TimezoneError(buffer.str()); - } - if ((fileInfo.st_mode & S_IFMT) != S_IFREG) { - std::stringstream buffer; - buffer << "non-file in tzfile reader " << filename; - throw TimezoneError(buffer.str()); - } - size_t size = static_cast(fileInfo.st_size); - std::vector buffer(size); - size_t posn = 0; - while (posn < size) { - ssize_t ret = read(in, &buffer[posn], size - posn); - if (ret == -1) { - throw TimezoneError(std::string("Failure to read timezone file ") + - filename + " - " + strerror(errno)); - } - posn += static_cast(ret); - } - if (close(in) == -1) { - std::stringstream err; - err << "failed to close " << filename << " - " << strerror(errno); - throw TimezoneError(err.str()); + try { + ORC_UNIQUE_PTR file = readFile(filename); + size_t size = static_cast(file->getLength()); + std::vector buffer(size); + file->read(&buffer[0], size, 0); + timezoneCache[filename] = std::shared_ptr(new TimezoneImpl(filename, buffer)); + } catch(ParseError& err) { + throw TimezoneError(err.what()); } - timezoneCache[filename] = std::shared_ptr(new TimezoneImpl(filename, buffer)); return *timezoneCache[filename].get(); }