Mercurial > hg > orthanc-databases
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