centralize code for tmp storage file creation
This commit is contained in:
parent
ee948a8810
commit
67308d02e9
7 changed files with 87 additions and 76 deletions
|
@ -5,6 +5,8 @@
|
||||||
#ifndef PFAEDLE_DEF_H_
|
#ifndef PFAEDLE_DEF_H_
|
||||||
#define PFAEDLE_DEF_H_
|
#define PFAEDLE_DEF_H_
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "util/log/Log.h"
|
||||||
#include "util/geo/Geo.h"
|
#include "util/geo/Geo.h"
|
||||||
#include "util/geo/PolyLine.h"
|
#include "util/geo/PolyLine.h"
|
||||||
|
|
||||||
|
@ -27,4 +29,32 @@
|
||||||
|
|
||||||
#define BOX_PADDING 2500
|
#define BOX_PADDING 2500
|
||||||
|
|
||||||
|
namespace pfaedle {
|
||||||
|
|
||||||
|
// _____________________________________________________________________________
|
||||||
|
inline std::string getTmpFName(std::string dir, std::string postf) {
|
||||||
|
if (postf.size()) postf = "-" + postf;
|
||||||
|
if (dir.size() && dir.back() != '/') dir = dir + "/";
|
||||||
|
|
||||||
|
std::string f = dir + ".pfaedle-tmp" + postf;
|
||||||
|
|
||||||
|
size_t c = 0;
|
||||||
|
|
||||||
|
while (access(f.c_str(), F_OK) != -1) {
|
||||||
|
c++;
|
||||||
|
if (c > 10000) {
|
||||||
|
// giving up...
|
||||||
|
LOG(ERROR) << "Could not find temporary file name!";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << dir << ".pfaedle-tmp" << postf << "-" << std::rand();
|
||||||
|
f = ss.str().c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endif // PFAEDLE_DEF_H_
|
#endif // PFAEDLE_DEF_H_
|
||||||
|
|
|
@ -5,13 +5,16 @@
|
||||||
#ifndef PFAEDLE_GTFS_SHAPECONTAINER_H_
|
#ifndef PFAEDLE_GTFS_SHAPECONTAINER_H_
|
||||||
#define PFAEDLE_GTFS_SHAPECONTAINER_H_
|
#define PFAEDLE_GTFS_SHAPECONTAINER_H_
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <string>
|
||||||
#include "ad/cppgtfs/gtfs/Shape.h"
|
#include "ad/cppgtfs/gtfs/Shape.h"
|
||||||
#include "ad/cppgtfs/gtfs/flat/Shape.h"
|
#include "ad/cppgtfs/gtfs/flat/Shape.h"
|
||||||
|
#include "pfaedle/Def.h"
|
||||||
#include "util/Misc.h"
|
#include "util/Misc.h"
|
||||||
|
|
||||||
namespace pfaedle {
|
namespace pfaedle {
|
||||||
|
|
|
@ -2,28 +2,18 @@
|
||||||
// Chair of Algorithms and Data Structures.
|
// Chair of Algorithms and Data Structures.
|
||||||
// Authors: Patrick Brosi <brosi@informatik.uni-freiburg.de>
|
// Authors: Patrick Brosi <brosi@informatik.uni-freiburg.de>
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
// ____________________________________________________________________________
|
// ____________________________________________________________________________
|
||||||
template <typename T>
|
template <typename T>
|
||||||
ShapeContainer<T>::ShapeContainer() {
|
ShapeContainer<T>::ShapeContainer() {
|
||||||
std::string f = ".pfaedle-tmp";
|
std::string f = pfaedle::getTmpFName("", "");
|
||||||
|
|
||||||
while (access(f.c_str(), F_OK) != -1) {
|
|
||||||
std::stringstream ss;
|
|
||||||
ss << ".pfaedle-tmp-";
|
|
||||||
ss << std::rand();
|
|
||||||
f = ss.str().c_str();
|
|
||||||
}
|
|
||||||
|
|
||||||
_storage.open(f, std::fstream::in | std::fstream::out | std::fstream::trunc);
|
_storage.open(f, std::fstream::in | std::fstream::out | std::fstream::trunc);
|
||||||
|
|
||||||
// immediately unlink
|
// immediately unlink
|
||||||
unlink(f.c_str());
|
unlink(f.c_str());
|
||||||
|
|
||||||
if (!_storage.good()) {
|
if (!_storage.good()) {
|
||||||
std::cerr << "Could not open temporary file " << f << std::endl;
|
std::cerr << "Could not open temporary file " << f
|
||||||
|
<< std::endl;
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
using ad::util::CsvWriter;
|
using ad::util::CsvWriter;
|
||||||
using ad::cppgtfs::Parser;
|
using ad::cppgtfs::Parser;
|
||||||
using pfaedle::gtfs::Writer;
|
using pfaedle::gtfs::Writer;
|
||||||
|
using pfaedle::getTmpFName;
|
||||||
|
|
||||||
// ____________________________________________________________________________
|
// ____________________________________________________________________________
|
||||||
bool Writer::write(gtfs::Feed* sourceFeed, const std::string& path) const {
|
bool Writer::write(gtfs::Feed* sourceFeed, const std::string& path) const {
|
||||||
|
@ -25,138 +26,145 @@ bool Writer::write(gtfs::Feed* sourceFeed, const std::string& path) const {
|
||||||
std::string curFile;
|
std::string curFile;
|
||||||
std::string curFileTg;
|
std::string curFileTg;
|
||||||
|
|
||||||
curFile = getTmpFName("agency.txt");
|
curFile = getTmpFName(gtfsPath, "agency.txt");
|
||||||
curFileTg = gtfsPath + "/agency.txt";
|
curFileTg = gtfsPath + "/agency.txt";
|
||||||
fs.open(curFile.c_str());
|
fs.open(curFile.c_str());
|
||||||
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
||||||
writeAgency(sourceFeed, &fs);
|
writeAgency(sourceFeed, &fs);
|
||||||
fs.close();
|
fs.close();
|
||||||
std::rename(curFile.c_str(), curFileTg.c_str());
|
if (std::rename(curFile.c_str(), curFileTg.c_str())) cannotWrite(curFileTg);
|
||||||
|
|
||||||
curFile = getTmpFName("stops.txt");
|
curFile = getTmpFName(gtfsPath, "stops.txt");
|
||||||
curFileTg = gtfsPath + "/stops.txt";
|
curFileTg = gtfsPath + "/stops.txt";
|
||||||
fs.open(curFile.c_str());
|
fs.open(curFile.c_str());
|
||||||
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
||||||
writeStops(sourceFeed, &fs);
|
writeStops(sourceFeed, &fs);
|
||||||
fs.close();
|
fs.close();
|
||||||
std::rename(curFile.c_str(), curFileTg.c_str());
|
if (std::rename(curFile.c_str(), curFileTg.c_str())) cannotWrite(curFileTg);
|
||||||
|
|
||||||
curFile = getTmpFName("routes.txt");
|
curFile = getTmpFName(gtfsPath, "routes.txt");
|
||||||
curFileTg = gtfsPath + "/routes.txt";
|
curFileTg = gtfsPath + "/routes.txt";
|
||||||
fs.open(curFile.c_str());
|
fs.open(curFile.c_str());
|
||||||
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
||||||
writeRoutes(sourceFeed, &fs);
|
writeRoutes(sourceFeed, &fs);
|
||||||
fs.close();
|
fs.close();
|
||||||
std::rename(curFile.c_str(), curFileTg.c_str());
|
if (std::rename(curFile.c_str(), curFileTg.c_str())) cannotWrite(curFileTg);
|
||||||
|
|
||||||
is.open((sourceFeed->getPath() + "/calendar.txt").c_str());
|
is.open((sourceFeed->getPath() + "/calendar.txt").c_str());
|
||||||
if (is.good()) {
|
if (is.good()) {
|
||||||
is.close();
|
is.close();
|
||||||
curFile = getTmpFName("calendar.txt");
|
curFile = getTmpFName(gtfsPath, "calendar.txt");
|
||||||
curFileTg = gtfsPath + "/calendar.txt";
|
curFileTg = gtfsPath + "/calendar.txt";
|
||||||
fs.open(curFile.c_str());
|
fs.open(curFile.c_str());
|
||||||
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
||||||
writeCalendar(sourceFeed, &fs);
|
writeCalendar(sourceFeed, &fs);
|
||||||
fs.close();
|
fs.close();
|
||||||
std::rename(curFile.c_str(), curFileTg.c_str());
|
if (std::rename(curFile.c_str(), curFileTg.c_str()))
|
||||||
|
cannotWrite(curFileTg);
|
||||||
}
|
}
|
||||||
|
|
||||||
is.open((sourceFeed->getPath() + "/calendar_dates.txt").c_str());
|
is.open((sourceFeed->getPath() + "/calendar_dates.txt").c_str());
|
||||||
if (is.good()) {
|
if (is.good()) {
|
||||||
is.close();
|
is.close();
|
||||||
curFile = getTmpFName("calendar_dates.txt");
|
curFile = getTmpFName(gtfsPath, "calendar_dates.txt");
|
||||||
curFileTg = gtfsPath + "/calendar_dates.txt";
|
curFileTg = gtfsPath + "/calendar_dates.txt";
|
||||||
fs.open(curFile.c_str());
|
fs.open(curFile.c_str());
|
||||||
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
||||||
writeCalendarDates(sourceFeed, &fs);
|
writeCalendarDates(sourceFeed, &fs);
|
||||||
fs.close();
|
fs.close();
|
||||||
std::rename(curFile.c_str(), curFileTg.c_str());
|
if (std::rename(curFile.c_str(), curFileTg.c_str()))
|
||||||
|
cannotWrite(curFileTg);
|
||||||
}
|
}
|
||||||
|
|
||||||
is.open((sourceFeed->getPath() + "/transfers.txt").c_str());
|
is.open((sourceFeed->getPath() + "/transfers.txt").c_str());
|
||||||
if (is.good()) {
|
if (is.good()) {
|
||||||
is.close();
|
is.close();
|
||||||
curFile = getTmpFName("transfers.txt");
|
curFile = getTmpFName(gtfsPath, "transfers.txt");
|
||||||
curFileTg = gtfsPath + "/transfers.txt";
|
curFileTg = gtfsPath + "/transfers.txt";
|
||||||
fs.open(curFile.c_str());
|
fs.open(curFile.c_str());
|
||||||
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
||||||
writeTransfers(sourceFeed, &fs);
|
writeTransfers(sourceFeed, &fs);
|
||||||
fs.close();
|
fs.close();
|
||||||
std::rename(curFile.c_str(), curFileTg.c_str());
|
if (std::rename(curFile.c_str(), curFileTg.c_str()))
|
||||||
|
cannotWrite(curFileTg);
|
||||||
}
|
}
|
||||||
|
|
||||||
is.open((sourceFeed->getPath() + "/fare_attributes.txt").c_str());
|
is.open((sourceFeed->getPath() + "/fare_attributes.txt").c_str());
|
||||||
if (is.good()) {
|
if (is.good()) {
|
||||||
is.close();
|
is.close();
|
||||||
curFile = getTmpFName("fare_attributes.txt");
|
curFile = getTmpFName(gtfsPath, "fare_attributes.txt");
|
||||||
curFileTg = gtfsPath + "/fare_attributes.txt";
|
curFileTg = gtfsPath + "/fare_attributes.txt";
|
||||||
fs.open(curFile.c_str());
|
fs.open(curFile.c_str());
|
||||||
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
||||||
writeFares(sourceFeed, &fs);
|
writeFares(sourceFeed, &fs);
|
||||||
fs.close();
|
fs.close();
|
||||||
std::rename(curFile.c_str(), curFileTg.c_str());
|
if (std::rename(curFile.c_str(), curFileTg.c_str()))
|
||||||
|
cannotWrite(curFileTg);
|
||||||
}
|
}
|
||||||
|
|
||||||
is.open((sourceFeed->getPath() + "/fare_rules.txt").c_str());
|
is.open((sourceFeed->getPath() + "/fare_rules.txt").c_str());
|
||||||
if (is.good()) {
|
if (is.good()) {
|
||||||
is.close();
|
is.close();
|
||||||
curFile = getTmpFName("fare_rules.txt");
|
curFile = getTmpFName(gtfsPath, "fare_rules.txt");
|
||||||
curFileTg = gtfsPath + "/fare_rules.txt";
|
curFileTg = gtfsPath + "/fare_rules.txt";
|
||||||
fs.open(curFile.c_str());
|
fs.open(curFile.c_str());
|
||||||
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
||||||
writeFareRules(sourceFeed, &fs);
|
writeFareRules(sourceFeed, &fs);
|
||||||
fs.close();
|
fs.close();
|
||||||
std::rename(curFile.c_str(), curFileTg.c_str());
|
if (std::rename(curFile.c_str(), curFileTg.c_str()))
|
||||||
|
cannotWrite(curFileTg);
|
||||||
}
|
}
|
||||||
|
|
||||||
is.close();
|
is.close();
|
||||||
curFile = getTmpFName("shapes.txt");
|
curFile = getTmpFName(gtfsPath, "shapes.txt");
|
||||||
curFileTg = gtfsPath + "/shapes.txt";
|
curFileTg = gtfsPath + "/shapes.txt";
|
||||||
fs.open(curFile.c_str());
|
fs.open(curFile.c_str());
|
||||||
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
||||||
writeShapes(sourceFeed, &fs);
|
writeShapes(sourceFeed, &fs);
|
||||||
fs.close();
|
fs.close();
|
||||||
std::rename(curFile.c_str(), curFileTg.c_str());
|
if (std::rename(curFile.c_str(), curFileTg.c_str())) cannotWrite(curFileTg);
|
||||||
|
|
||||||
is.close();
|
is.close();
|
||||||
curFile = getTmpFName("trips.txt");
|
curFile = getTmpFName(gtfsPath, "trips.txt");
|
||||||
curFileTg = gtfsPath + "/trips.txt";
|
curFileTg = gtfsPath + "/trips.txt";
|
||||||
fs.open(curFile.c_str());
|
fs.open(curFile.c_str());
|
||||||
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
||||||
bool hasFreqs = writeTrips(sourceFeed, &fs);
|
bool hasFreqs = writeTrips(sourceFeed, &fs);
|
||||||
fs.close();
|
fs.close();
|
||||||
std::rename(curFile.c_str(), curFileTg.c_str());
|
if (std::rename(curFile.c_str(), curFileTg.c_str())) cannotWrite(curFileTg);
|
||||||
|
|
||||||
is.open((sourceFeed->getPath() + "/frequencies.txt").c_str());
|
is.open((sourceFeed->getPath() + "/frequencies.txt").c_str());
|
||||||
if (hasFreqs && is.good()) {
|
if (hasFreqs && is.good()) {
|
||||||
is.close();
|
is.close();
|
||||||
curFile = getTmpFName("frequencies.txt");
|
curFile = getTmpFName(gtfsPath, "frequencies.txt");
|
||||||
curFileTg = gtfsPath + "/frequencies.txt";
|
curFileTg = gtfsPath + "/frequencies.txt";
|
||||||
fs.open(curFile.c_str());
|
fs.open(curFile.c_str());
|
||||||
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
||||||
writeFrequencies(sourceFeed, &fs);
|
writeFrequencies(sourceFeed, &fs);
|
||||||
fs.close();
|
fs.close();
|
||||||
std::rename(curFile.c_str(), curFileTg.c_str());
|
if (std::rename(curFile.c_str(), curFileTg.c_str()))
|
||||||
|
cannotWrite(curFileTg);
|
||||||
}
|
}
|
||||||
|
|
||||||
is.close();
|
is.close();
|
||||||
curFile = getTmpFName("stop_times.txt");
|
curFile = getTmpFName(gtfsPath, "stop_times.txt");
|
||||||
curFileTg = gtfsPath + "/stop_times.txt";
|
curFileTg = gtfsPath + "/stop_times.txt";
|
||||||
fs.open(curFile.c_str());
|
fs.open(curFile.c_str());
|
||||||
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
||||||
writeStopTimes(sourceFeed, &fs);
|
writeStopTimes(sourceFeed, &fs);
|
||||||
fs.close();
|
fs.close();
|
||||||
std::rename(curFile.c_str(), curFileTg.c_str());
|
if (std::rename(curFile.c_str(), curFileTg.c_str())) cannotWrite(curFileTg);
|
||||||
|
|
||||||
if (!sourceFeed->getPublisherUrl().empty() &&
|
if (!sourceFeed->getPublisherUrl().empty() &&
|
||||||
!sourceFeed->getPublisherName().empty()) {
|
!sourceFeed->getPublisherName().empty()) {
|
||||||
curFile = getTmpFName("feed_info.txt");
|
curFile = getTmpFName(gtfsPath, "feed_info.txt");
|
||||||
curFileTg = gtfsPath + "/feed_info.txt";
|
curFileTg = gtfsPath + "/feed_info.txt";
|
||||||
fs.open(curFile.c_str());
|
fs.open(curFile.c_str());
|
||||||
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
if (!fs.good()) cannotWrite(curFile, curFileTg);
|
||||||
writeFeedInfo(sourceFeed, &fs);
|
writeFeedInfo(sourceFeed, &fs);
|
||||||
fs.close();
|
fs.close();
|
||||||
std::rename(curFile.c_str(), curFileTg.c_str());
|
if (std::rename(curFile.c_str(), curFileTg.c_str()))
|
||||||
|
cannotWrite(curFileTg);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -487,6 +495,13 @@ bool Writer::writeStopTimes(gtfs::Feed* sourceFeed, std::ostream* os) const {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ___________________________________________________________________________
|
||||||
|
void Writer::cannotWrite(const std::string& file) {
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << "Could not write to file";
|
||||||
|
throw ad::cppgtfs::WriterException(ss.str(), file);
|
||||||
|
}
|
||||||
|
|
||||||
// ___________________________________________________________________________
|
// ___________________________________________________________________________
|
||||||
void Writer::cannotWrite(const std::string& file, const std::string& file2) {
|
void Writer::cannotWrite(const std::string& file, const std::string& file2) {
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
|
@ -494,17 +509,3 @@ void Writer::cannotWrite(const std::string& file, const std::string& file2) {
|
||||||
throw ad::cppgtfs::WriterException(ss.str(), file);
|
throw ad::cppgtfs::WriterException(ss.str(), file);
|
||||||
}
|
}
|
||||||
|
|
||||||
// _____________________________________________________________________________
|
|
||||||
std::string Writer::getTmpFName(const std::string& postf) {
|
|
||||||
std::string f = ".pfaedle-tmp-" + postf;
|
|
||||||
|
|
||||||
while (access(f.c_str(), F_OK) != -1) {
|
|
||||||
std::stringstream ss;
|
|
||||||
ss << ".pfaedle-tmp-";
|
|
||||||
ss << postf << "-";
|
|
||||||
ss << std::rand();
|
|
||||||
f = ss.str().c_str();
|
|
||||||
}
|
|
||||||
|
|
||||||
return f;
|
|
||||||
}
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ class Writer {
|
||||||
bool writeStopTimes(Feed* f, std::ostream* os) const;
|
bool writeStopTimes(Feed* f, std::ostream* os) const;
|
||||||
|
|
||||||
static void cannotWrite(const std::string& file, const std::string& file2);
|
static void cannotWrite(const std::string& file, const std::string& file2);
|
||||||
static std::string getTmpFName(const std::string& postf);
|
static void cannotWrite(const std::string& file);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace gtfs
|
} // namespace gtfs
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <climits>
|
#include <climits>
|
||||||
|
@ -13,6 +12,8 @@
|
||||||
#include <exception>
|
#include <exception>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include "pfaedle/Def.h"
|
||||||
#include "pfaedle/osm/OsmIdSet.h"
|
#include "pfaedle/osm/OsmIdSet.h"
|
||||||
|
|
||||||
using pfaedle::osm::OsmIdSet;
|
using pfaedle::osm::OsmIdSet;
|
||||||
|
@ -48,7 +49,6 @@ OsmIdSet::~OsmIdSet() {
|
||||||
void OsmIdSet::add(osmid id) {
|
void OsmIdSet::add(osmid id) {
|
||||||
if (_closed) throw std::exception();
|
if (_closed) throw std::exception();
|
||||||
diskAdd(id);
|
diskAdd(id);
|
||||||
// _set.insert(id);
|
|
||||||
|
|
||||||
if (_last > id) _sorted = false;
|
if (_last > id) _sorted = false;
|
||||||
_last = id;
|
_last = id;
|
||||||
|
@ -134,7 +134,6 @@ bool OsmIdSet::has(osmid id) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool has = diskHas(id);
|
bool has = diskHas(id);
|
||||||
// assert(has == (bool)_set.count(id));
|
|
||||||
return has;
|
return has;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,7 +231,7 @@ void OsmIdSet::sort() const {
|
||||||
size_t OsmIdSet::cwrite(int f, const void* buf, size_t n) const {
|
size_t OsmIdSet::cwrite(int f, const void* buf, size_t n) const {
|
||||||
ssize_t w = write(f, buf, n);
|
ssize_t w = write(f, buf, n);
|
||||||
if (w < 0) {
|
if (w < 0) {
|
||||||
throw std::runtime_error("OSMIDSET: could not write to tmp file.\n");
|
throw std::runtime_error("Could not write to tmp file.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return w;
|
return w;
|
||||||
|
@ -242,7 +241,7 @@ size_t OsmIdSet::cwrite(int f, const void* buf, size_t n) const {
|
||||||
size_t OsmIdSet::cread(int f, void* buf, size_t n) const {
|
size_t OsmIdSet::cread(int f, void* buf, size_t n) const {
|
||||||
ssize_t w = read(f, buf, n);
|
ssize_t w = read(f, buf, n);
|
||||||
if (w < 0) {
|
if (w < 0) {
|
||||||
throw std::runtime_error("OSMIDSET: could not read from tmp file.\n");
|
throw std::runtime_error("Could not read from tmp file.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return w;
|
return w;
|
||||||
|
@ -272,14 +271,15 @@ uint32_t OsmIdSet::hash(uint32_t in, int i) const {
|
||||||
|
|
||||||
// _____________________________________________________________________________
|
// _____________________________________________________________________________
|
||||||
int OsmIdSet::openTmpFile() const {
|
int OsmIdSet::openTmpFile() const {
|
||||||
const std::string& fname = getFName();
|
const std::string& fname = getTmpFName(_tmpPath, "");
|
||||||
int file = open(fname.c_str(), O_RDWR | O_CREAT, 0666);
|
int file = open(fname.c_str(), O_RDWR | O_CREAT, 0666);
|
||||||
|
|
||||||
// immediately unlink
|
// immediately unlink
|
||||||
unlink(fname.c_str());
|
unlink(fname.c_str());
|
||||||
|
|
||||||
if (file < 0) {
|
if (file < 0) {
|
||||||
std::cerr << "Could not open temporary file " << fname << std::endl;
|
std::cerr << "Could not open temporary file " << fname
|
||||||
|
<< std::endl;
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -288,17 +288,3 @@ int OsmIdSet::openTmpFile() const {
|
||||||
#endif
|
#endif
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
// _____________________________________________________________________________
|
|
||||||
std::string OsmIdSet::getFName() const {
|
|
||||||
std::string f = ".pfaedle-tmp";
|
|
||||||
|
|
||||||
while (access(f.c_str(), F_OK) != -1) {
|
|
||||||
std::stringstream ss;
|
|
||||||
ss << ".pfaedle-tmp-";
|
|
||||||
ss << std::rand();
|
|
||||||
f = ss.str().c_str();
|
|
||||||
}
|
|
||||||
|
|
||||||
return f;
|
|
||||||
}
|
|
||||||
|
|
|
@ -34,6 +34,7 @@ static const size_t OBUFFER_S = 8 * 1024 * 1024;
|
||||||
class OsmIdSet {
|
class OsmIdSet {
|
||||||
public:
|
public:
|
||||||
OsmIdSet();
|
OsmIdSet();
|
||||||
|
OsmIdSet(const std::string& tmpPath) : _tmpPath(tmpPath) {};
|
||||||
~OsmIdSet();
|
~OsmIdSet();
|
||||||
|
|
||||||
// Add an OSM id
|
// Add an OSM id
|
||||||
|
@ -47,7 +48,7 @@ class OsmIdSet {
|
||||||
static size_t FLOOKUPS;
|
static size_t FLOOKUPS;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::set<osmid> _set;
|
std::string _tmpPath;
|
||||||
mutable bool _closed;
|
mutable bool _closed;
|
||||||
mutable int _file;
|
mutable int _file;
|
||||||
unsigned char* _buffer;
|
unsigned char* _buffer;
|
||||||
|
|
Loading…
Reference in a new issue