Skip to content

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();
Clone this wiki locally