From 4b9dc1fdb0bee3953b37f2ee3b54d09f133eb35b Mon Sep 17 00:00:00 2001
From: Julien Malik <julien.malik@c-s.fr>
Date: Tue, 26 Jun 2012 08:17:10 +0200
Subject: [PATCH] BUG: fix Update_LayerCreateOnly mode

---
 .../OGRAdapters/otbOGRDataSourceWrapper.cxx   |  7 +-
 .../otbOGRDataSourceWrapperNew.cxx            | 66 +++++++++++++++++++
 2 files changed, 71 insertions(+), 2 deletions(-)

diff --git a/Code/UtilitiesAdapters/OGRAdapters/otbOGRDataSourceWrapper.cxx b/Code/UtilitiesAdapters/OGRAdapters/otbOGRDataSourceWrapper.cxx
index 5baf992c69..4114fb84e6 100644
--- a/Code/UtilitiesAdapters/OGRAdapters/otbOGRDataSourceWrapper.cxx
+++ b/Code/UtilitiesAdapters/OGRAdapters/otbOGRDataSourceWrapper.cxx
@@ -443,7 +443,10 @@ bool otb::ogr::DataSource::IsLayerModifiable(std::string const& layername) const
     case Modes::Read:
       return false;
     case Modes::Update_LayerCreateOnly:
-      return int(GetLayerID(layername)) >= m_FirstModifiableLayerID;
+      if (GetLayer(layername))
+        return int(GetLayerID(layername)) >= m_FirstModifiableLayerID;
+      else
+        return false;
     default:
       return true;
   }
@@ -495,7 +498,7 @@ otb::ogr::Layer otb::ogr::DataSource::GetLayer(std::string const& name)
 {
   assert(m_DataSource && "Datasource not initialized");
   OGRLayer * layer_ptr = m_DataSource->GetLayerByName(name.c_str());
-  return otb::ogr::Layer(layer_ptr, IsLayerModifiable(name));
+  return otb::ogr::Layer(layer_ptr, layer_ptr ? IsLayerModifiable(name) : false);
 }
 
 otb::ogr::Layer otb::ogr::DataSource::GetLayerChecked(std::string const& name)
diff --git a/Testing/Code/UtilitiesAdapters/OGRAdapters/otbOGRDataSourceWrapperNew.cxx b/Testing/Code/UtilitiesAdapters/OGRAdapters/otbOGRDataSourceWrapperNew.cxx
index 8723b19881..60492c0a2c 100644
--- a/Testing/Code/UtilitiesAdapters/OGRAdapters/otbOGRDataSourceWrapperNew.cxx
+++ b/Testing/Code/UtilitiesAdapters/OGRAdapters/otbOGRDataSourceWrapperNew.cxx
@@ -304,6 +304,72 @@ BOOST_AUTO_TEST_CASE(OGRDataSource_shp_overwrite)
 
   }
 
+
+  // Open in Update_LayerCreateOnly
+  {
+  ogr::DataSource::Pointer ds
+    = ogr::DataSource::New(filename, ogr::DataSource::Modes::Update_LayerCreateOnly);
+
+  // Check that we can read the file
+  BOOST_ASSERT(ds);
+  ogr::Layer l = ds -> GetLayerChecked(0);
+  BOOST_CHECK_EQUAL(l.GetFeatureCount(true), 2);
+
+  ogr::Feature f = l.GetFeature(0);
+  BOOST_CHECK_EQUAL(f[0].GetValue<int>(), 43);
+  BOOST_CHECK_EQUAL(f[1].GetValue<double>(), 43.0);
+  ogr::UniqueGeometryPtr p1 = f.StealGeometry();
+  const OGRPoint ref1(43, 43);
+  BOOST_CHECK(ogr::Equals(*p1, ref1));
+
+  f = l.GetFeature(1);
+  BOOST_CHECK_EQUAL(f[0].GetValue<int>(), 44);
+  BOOST_CHECK_EQUAL(f[1].GetValue<double>(), 44.0);
+  ogr::UniqueGeometryPtr p2 = f.StealGeometry();
+  const OGRPoint ref2(44, 44);
+  BOOST_CHECK(ogr::Equals(*p2, ref2));
+
+
+  // Cannot modify a layer which already exists
+  std::string name = l.GetName();
+  ogr::Layer createdlayer = ds->CreateLayer(name);
+
+  OGRFeatureDefn & defn = l.GetLayerDefn();
+  ogr::Feature f2(defn);
+  f2[0].SetValue(45);
+  f2[1].SetValue(45.0);
+  const OGRPoint p(45, 45);
+  f2.SetGeometry(&p);
+  BOOST_CHECK_THROW(l.CreateFeature(f2), itk::ExceptionObject);
+  BOOST_CHECK_EQUAL(l.GetFeatureCount(true), 2);
+
+  }
+
+
+  // Read the file we have written
+  {
+  ogr::DataSource::Pointer ds
+    = ogr::DataSource::New(filename, ogr::DataSource::Modes::Read);
+  BOOST_ASSERT(ds);
+  ogr::Layer l = ds -> GetLayerChecked(0);
+  BOOST_CHECK_EQUAL(l.GetFeatureCount(true), 2);
+
+  ogr::Feature f = l.GetFeature(0);
+  BOOST_CHECK_EQUAL(f[0].GetValue<int>(), 43);
+  BOOST_CHECK_EQUAL(f[1].GetValue<double>(), 43.0);
+  ogr::UniqueGeometryPtr p1 = f.StealGeometry();
+  const OGRPoint ref1(43, 43);
+  BOOST_CHECK(ogr::Equals(*p1, ref1));
+
+  f = l.GetFeature(1);
+  BOOST_CHECK_EQUAL(f[0].GetValue<int>(), 44);
+  BOOST_CHECK_EQUAL(f[1].GetValue<double>(), 44.0);
+  ogr::UniqueGeometryPtr p2 = f.StealGeometry();
+  const OGRPoint ref2(44, 44);
+  BOOST_CHECK(ogr::Equals(*p2, ref2));
+
+  }
+
 #if 0 // shp files do not support Update_LayerOverwrite
   // Open in Update_LayerOverwrite
   {
-- 
GitLab