changeset 298:8f655f308de9

added IResult::Print()
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 01 Jul 2021 14:39:27 +0200
parents 86265ef5f3e3
children 70685295a373
files Framework/Common/IResult.cpp Framework/Common/IResult.h Framework/Common/NullValue.cpp Framework/Common/Utf8StringValue.cpp Resources/CMake/DatabasesFrameworkConfiguration.cmake
diffstat 5 files changed, 142 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Framework/Common/IResult.cpp	Thu Jul 01 14:39:27 2021 +0200
@@ -0,0 +1,124 @@
+/**
+ * Orthanc - A Lightweight, RESTful DICOM Store
+ * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
+ * Department, University Hospital of Liege, Belgium
+ * Copyright (C) 2017-2021 Osimis S.A., Belgium
+ *
+ * This program is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Affero General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+
+#include "IResult.h"
+
+#include "Utf8StringValue.h"
+
+#include <Compatibility.h>
+#include <OrthancException.h>
+
+#include <cassert>
+#include <list>
+#include <vector>
+#include <ostream>
+
+namespace OrthancDatabases
+{
+  static void PrintSeparators(std::ostream& stream,
+                              char c,
+                              size_t count)
+  {
+    for (size_t i = 0; i < count; i++)
+    {
+      stream << c;
+    }
+  }
+
+  
+  static void PrintHeader(std::ostream& stream,
+                          const std::vector<size_t>& maxWidth)
+  {
+    for (size_t i = 0; i < maxWidth.size(); i++)
+    {
+      stream << '+';
+      PrintSeparators(stream, '-', maxWidth[i] + 2);
+    }
+
+    stream << '+' << std::endl;
+  }
+    
+
+  void IResult::Print(std::ostream& stream,
+                      IResult& result)
+  {
+    typedef std::list< std::vector<std::string> > Table;
+
+    Table table;
+
+    const size_t columns = result.GetFieldsCount();
+
+    std::vector<size_t> maxWidth(columns);    
+    
+    while (!result.IsDone())
+    {
+      table.push_back(std::vector<std::string>(columns));
+      
+      for (size_t i = 0; i < columns; i++)
+      {
+        std::string value;
+
+        try
+        {
+          std::unique_ptr<IValue> converted(
+            result.GetField(i).Convert(ValueType_Utf8String));
+          value = dynamic_cast<Utf8StringValue&>(*converted).GetContent();
+        }
+        catch (Orthanc::OrthancException&)
+        {
+          value = "?";
+        }
+
+        if (value.size() > maxWidth[i])
+        {
+          maxWidth[i] = value.size();
+        }
+
+        table.back() [i] = value;
+      }
+            
+      result.Next();
+    }
+
+    PrintHeader(stream, maxWidth);
+
+    for (Table::const_iterator it = table.begin(); it != table.end(); ++it)
+    {
+      assert(it->size() == maxWidth.size());
+      
+      for (size_t i = 0; i < it->size(); i++)
+      {
+        const std::string& value = (*it) [i];
+        
+        stream << "| " << value << ' ';
+
+        for (size_t j = value.size(); j < maxWidth[i]; j++)
+        {
+          stream << ' ';
+        }
+      }
+
+      stream << '|' << std::endl;
+    }
+
+    PrintHeader(stream, maxWidth);
+  }
+}
--- a/Framework/Common/IResult.h	Thu Jul 01 11:31:16 2021 +0200
+++ b/Framework/Common/IResult.h	Thu Jul 01 14:39:27 2021 +0200
@@ -42,5 +42,8 @@
     virtual size_t GetFieldsCount() const = 0;
 
     virtual const IValue& GetField(size_t index) const = 0;
+
+    static void Print(std::ostream& stream,
+                      IResult& result);
   };
 }
--- a/Framework/Common/NullValue.cpp	Thu Jul 01 11:31:16 2021 +0200
+++ b/Framework/Common/NullValue.cpp	Thu Jul 01 14:39:27 2021 +0200
@@ -21,19 +21,24 @@
 
 #include "NullValue.h"
 
+#include "Utf8StringValue.h"
+
 #include <OrthancException.h>
 
 namespace OrthancDatabases
 {
   IValue* NullValue::Convert(ValueType target) const
   {
-    if (target == ValueType_Null)
+    switch (target)
     {
-      return new NullValue;
-    }
-    else
-    {
-      throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
+      case ValueType_Null:
+        return new NullValue;
+
+      case ValueType_Utf8String:
+        return new Utf8StringValue("(null)");
+
+      default:
+        throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
     }
   }
 }
--- a/Framework/Common/Utf8StringValue.cpp	Thu Jul 01 11:31:16 2021 +0200
+++ b/Framework/Common/Utf8StringValue.cpp	Thu Jul 01 14:39:27 2021 +0200
@@ -54,6 +54,9 @@
 
         break;
 
+      case ValueType_Utf8String:
+        return new Utf8StringValue(utf8_);
+
       default:
         throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
     }
--- a/Resources/CMake/DatabasesFrameworkConfiguration.cmake	Thu Jul 01 11:31:16 2021 +0200
+++ b/Resources/CMake/DatabasesFrameworkConfiguration.cmake	Thu Jul 01 14:39:27 2021 +0200
@@ -99,6 +99,7 @@
   ${ORTHANC_DATABASES_ROOT}/Framework/Common/DatabaseManager.cpp
   ${ORTHANC_DATABASES_ROOT}/Framework/Common/Dictionary.cpp
   ${ORTHANC_DATABASES_ROOT}/Framework/Common/GenericFormatter.cpp
+  ${ORTHANC_DATABASES_ROOT}/Framework/Common/IResult.cpp
   ${ORTHANC_DATABASES_ROOT}/Framework/Common/ImplicitTransaction.cpp
   ${ORTHANC_DATABASES_ROOT}/Framework/Common/InputFileValue.cpp
   ${ORTHANC_DATABASES_ROOT}/Framework/Common/Integer64Value.cpp