v0.2.50..v0.2.51 changeset OsmApiDbSqlChangesetFileWriter.cpp
Garret Voltz edited this page Jan 15, 2020
·
1 revision
diff --git a/hoot-core/src/main/cpp/hoot/core/io/OsmApiDbSqlChangesetFileWriter.cpp b/hoot-core/src/main/cpp/hoot/core/io/OsmApiDbSqlChangesetFileWriter.cpp
index 4985baa..83254fa 100644
--- a/hoot-core/src/main/cpp/hoot/core/io/OsmApiDbSqlChangesetFileWriter.cpp
+++ b/hoot-core/src/main/cpp/hoot/core/io/OsmApiDbSqlChangesetFileWriter.cpp
@@ -31,6 +31,7 @@
#include <hoot/core/util/ConfigOptions.h>
#include <hoot/core/util/Log.h>
#include <hoot/core/elements/ElementType.h>
+#include <hoot/core/util/Factory.h>
// Qt
#include <QSqlError>
@@ -41,6 +42,16 @@ using namespace std;
namespace hoot
{
+HOOT_FACTORY_REGISTER(OsmChangesetFileWriter, OsmApiDbSqlChangesetFileWriter)
+
+OsmApiDbSqlChangesetFileWriter::OsmApiDbSqlChangesetFileWriter() :
+_changesetId(0),
+_changesetUserId(ConfigOptions().getChangesetUserId()),
+_includeDebugTags(ConfigOptions().getWriterIncludeDebugTags()),
+_includeCircularErrorTags(ConfigOptions().getWriterIncludeCircularErrorTags())
+{
+}
+
OsmApiDbSqlChangesetFileWriter::OsmApiDbSqlChangesetFileWriter(const QUrl& url) :
_changesetId(0),
_changesetUserId(ConfigOptions().getChangesetUserId()),
@@ -56,7 +67,7 @@ OsmApiDbSqlChangesetFileWriter::~OsmApiDbSqlChangesetFileWriter()
}
void OsmApiDbSqlChangesetFileWriter::write(const QString& path,
- ChangesetProviderPtr changesetProvider)
+ const ChangesetProviderPtr& changesetProvider)
{
QList<ChangesetProviderPtr> changesetProviders;
changesetProviders.append(changesetProvider);
@@ -70,6 +81,7 @@ void OsmApiDbSqlChangesetFileWriter::write(const QString& path,
_remappedIds.clear();
_changesetBounds.init();
+ _parsedChanges.clear();
_outputSql.setFileName(path);
if (_outputSql.open(QIODevice::WriteOnly | QIODevice::Text) == false)
@@ -83,7 +95,7 @@ void OsmApiDbSqlChangesetFileWriter::write(const QString& path,
for (int i = 0; i < changesetProviders.size(); i++)
{
LOG_DEBUG(
- "Derving changes with changeset provider: " << i + 1 << " / " << changesetProviders.size() <<
+ "Deriving changes with changeset provider: " << i + 1 << " / " << changesetProviders.size() <<
"...");
ChangesetProviderPtr changesetProvider = changesetProviders.at(i);
@@ -92,6 +104,14 @@ void OsmApiDbSqlChangesetFileWriter::write(const QString& path,
{
LOG_TRACE("Reading next SQL change...");
Change change = changesetProvider->readNextChange();
+
+ // See related note in OsmXmlChangesetFileWriter::write.
+ if (_parsedChanges.contains(change))
+ {
+ LOG_TRACE("Skipping adding duplicated change: " << change << "...");
+ continue;
+ }
+
switch (change.getType())
{
case Change::Create:
@@ -118,6 +138,7 @@ void OsmApiDbSqlChangesetFileWriter::write(const QString& path,
ConstNodePtr node = std::dynamic_pointer_cast<const Node>(change.getElement());
_changesetBounds.expandToInclude(node->getX(), node->getY());
}
+ _parsedChanges.append(change);
changes++;
}
}
@@ -194,10 +215,6 @@ ElementPtr OsmApiDbSqlChangesetFileWriter::_getChangeElement(ConstElementPtr ele
return changeElement;
}
-// These create methods assume you've already set the ID correctly in terms of preventing
-// conflicts with the OSM API target db for the element to be created. The one exception is
-// for new elements with negative ids.
-
void OsmApiDbSqlChangesetFileWriter::_createNewElement(ConstElementPtr element)
{
const QString elementTypeStr = element->getElementType().toString().toLower();