# HG changeset patch # User Sebastien Jodogne # Date 1625143167 -7200 # Node ID 8f655f308de9d6ea822471f84e70e9b5a0d79ea5 # Parent 86265ef5f3e3c0c16cf72bcb45af9ab7e6a71282 added IResult::Print() diff -r 86265ef5f3e3 -r 8f655f308de9 Framework/Common/IResult.cpp --- /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 . + **/ + + +#include "IResult.h" + +#include "Utf8StringValue.h" + +#include +#include + +#include +#include +#include +#include + +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& 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 > Table; + + Table table; + + const size_t columns = result.GetFieldsCount(); + + std::vector maxWidth(columns); + + while (!result.IsDone()) + { + table.push_back(std::vector(columns)); + + for (size_t i = 0; i < columns; i++) + { + std::string value; + + try + { + std::unique_ptr converted( + result.GetField(i).Convert(ValueType_Utf8String)); + value = dynamic_cast(*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); + } +} diff -r 86265ef5f3e3 -r 8f655f308de9 Framework/Common/IResult.h --- 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); }; } diff -r 86265ef5f3e3 -r 8f655f308de9 Framework/Common/NullValue.cpp --- 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 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); } } } diff -r 86265ef5f3e3 -r 8f655f308de9 Framework/Common/Utf8StringValue.cpp --- 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); } diff -r 86265ef5f3e3 -r 8f655f308de9 Resources/CMake/DatabasesFrameworkConfiguration.cmake --- 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