/** * @file SpdbObsHandler.cc */ #include #include #include #include //------------------------------------------------------------------------ SpdbObsHandler::SpdbObsHandler(const std::string &spdb, const std::string &precipField, const TileInfo &tiling, const std::vector &thresh) : SpdbObsMetadata(precipField, tiling, thresh), _url(spdb), _chunkValidTime(0), _chunkTimeWritten(0) { } //------------------------------------------------------------------------ SpdbObsHandler::SpdbObsHandler(const std::string &spdb) : SpdbObsMetadata(), _url(spdb), _chunkValidTime(0), _chunkTimeWritten(0) { } //------------------------------------------------------------------------ SpdbObsHandler::~SpdbObsHandler(void) { } //------------------------------------------------------------------ bool SpdbObsHandler::write(const time_t &t) { return write(t, _url); } //------------------------------------------------------------------ bool SpdbObsHandler::write(const time_t &t, const std::string &url) { string xml = SpdbObsMetadata::toXml(); DsSpdb s; s.setPutMode(Spdb::putModeOver); s.clearPutChunks(); s.clearUrls(); s.addUrl(url); MemBuf mem; mem.free(); mem.add(xml.c_str(), xml.size() + 1); if (s.put(SPDB_XML_ID, SPDB_XML_LABEL, 1, t, t, mem.getLen(), (void *)mem.getPtr())) { LOG(ERROR) << "problems writing out SPDB"; return false; } return true; } //------------------------------------------------------------------ std::vector SpdbObsHandler::timesInRange(const time_t &t0, const time_t &t1) const { DsSpdb D; std::vector ret; if (D.compileTimeList(_url, t0, t1)) { LOG(WARNING) << "Compiling time list for time range " << DateTime::strn(t0) << " to " << DateTime::strn(t1); return ret; } ret = D.getTimeList(); return ret; } //------------------------------------------------------------------------ bool SpdbObsHandler::read(const time_t &obsTime) { DsSpdb D; if (D.getExact(_url, obsTime) != 0) { return false; } else { return _load(D); } } //------------------------------------------------------------------ bool SpdbObsHandler::_load(DsSpdb &s) { const vector &chunks = s.getChunks(); int nChunks = static_cast(chunks.size()); if (nChunks <= 0) { return false; } if (nChunks > 1) { LOG(WARNING) << "Too many chunks " << nChunks << " expected 1"; return false; } vector lchunks; for (int i=0; i