13 #include "eckit/config/Resource.h"
15 # include "eckit/io/AIOHandle.h"
17 #include "eckit/io/FileHandle.h"
18 #include "eckit/thread/ThreadSingleton.h"
19 #include "eckit/utils/StringTools.h"
23 using namespace eckit;
26 template class eckit::ThreadSingleton<odc::ODBAPISettings>;
27 static ThreadSingleton<odc::ODBAPISettings>
instance_;
33 const char* env(getenv(
"odc_HOME"));
36 Log::info() <<
"odc_HOME set to " << home_ << endl;
39 if (argv0[0] ==
'/') {
42 if(0 == (absoluteArgv0 = ::realpath(argv0, 0)))
43 throw eckit::FailedSystemCall(
string(
"realpath ") + argv0);
44 full = string(absoluteArgv0);
45 ::free(absoluteArgv0);
46 }
else if (argv0[0] ==
'.' && argv0[1] ==
'/')
48 size_t bufferLen =1024*8;
49 char buffer[bufferLen];
50 full = string( ::getcwd(buffer, bufferLen) ) + string(argv0 + 1);
53 vector<string> ps(StringTools::split(
":", getenv(
"PATH")));
54 for (
size_t i(0);
i < ps.size(); ++
i)
57 if (PathName(ps[
i] +
"/" + argv0).exists())
59 full = ps[
i] +
"/" + argv0;
60 if (ps[
i][0] !=
'/') {
61 size_t bufferLen =1024*8;
62 char buffer[bufferLen];
63 full = string( ::getcwd(buffer, bufferLen) ) + full;
70 vector<string> ps(StringTools::split(
"/", full));
71 Log::debug() <<
"ODBAPISettings::setHome: argv0: " << ps << endl;
72 ASSERT(
"odb executable should be in a bin directory" && ps.size() >= 2 && ps[ps.size() - 2] ==
"bin");
75 home_ =
"/" + StringTools::join(
"/", ps);
76 Log::info() <<
"odc_HOME inferred as " << home_ << endl;
82 ASSERT(fileName[0] ==
'~');
83 ASSERT(fileName[1] ==
'/');
84 return home_ + fileName.substr(1);
88 integersAsDoubles_ = flag;
92 return integersAsDoubles_;
96 Log::info() <<
"Debug me now" << endl;
108 ODBAPISettings::ODBAPISettings()
109 : headerBufferSize_(Resource<
long>(
"$ODC_HEADER_BUFFER_SIZE;-headerBufferSize;headerBufferSize", 4 * 1024 * 1024)),
110 setvbufferSize_(Resource<
long>(
"$ODC_SETVBUFFER_SIZE;-setvbufferSize;setvbufferSize", 8 * 1024 * 1024)),
111 useAIO_(Resource<bool>(
"$ODC_USE_AIO", false)),
112 integersAsDoubles_(Resource<bool>(
"$ODC_INTEGERS_AS_DOUBLES", true))
123 vector<string> parts (StringTools::split(
"/", path));
124 if (parts.size() < 2)
128 PathName directory ((
string(path)[0] ==
'/' ?
"/" :
"") + StringTools::join(
"/", parts));
130 Log::debug() <<
"Making sure diretory " << directory <<
" exists" << endl;
142 ?
static_cast<DataHandle*
>(
new AIOHandle(fn))
143 :
static_cast<DataHandle*
>(
new FileHandle(fn)));
145 DataHandle* h (
static_cast<DataHandle*
>(
new FileHandle(fn)));
147 if (openDataHandle) h->openForWrite(length);
155 ?
static_cast<DataHandle*
>(
new AIOHandle(fn))
156 :
static_cast<DataHandle*
>(
new FileHandle(fn)));
158 DataHandle* h (
static_cast<DataHandle*
>(
new FileHandle(fn)));
160 if (openDataHandle) h->openForAppend(length);
static ThreadSingleton< odc::ODBAPISettings > instance_
void setHome(const char *argv0)
static void createDirectories(const eckit::PathName &path)
eckit::DataHandle * writeToFile(const eckit::PathName &, const eckit::Length &=eckit::Length(0), bool openDataHandle=true)
std::string fileInHome(const std::string &)
void treatIntegersAsDoubles(bool flag)
size_t headerBufferSize()
eckit::DataHandle * appendToFile(const eckit::PathName &, const eckit::Length &=eckit::Length(0), bool openDataHandle=true)
bool integersAsDoubles() const