From 81058c43f5251fc9822098cdff78cf9ca8f4b65f Mon Sep 17 00:00:00 2001
From: Michael Davis <michael.davis@cern.ch>
Date: Thu, 6 Jun 2019 16:15:06 +0200
Subject: [PATCH] [cta-admin] Fixes #525 display JSON ] if no results

---
 cmdline/CtaAdminCmd.cpp | 10 +++++-----
 cmdline/CtaAdminCmd.hpp | 12 ++++++++----
 2 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/cmdline/CtaAdminCmd.cpp b/cmdline/CtaAdminCmd.cpp
index 47fe7a749a..223670e7ea 100644
--- a/cmdline/CtaAdminCmd.cpp
+++ b/cmdline/CtaAdminCmd.cpp
@@ -77,8 +77,8 @@ void IStreamBuffer<cta::xrd::Data>::DataCallback(cta::xrd::Data record) const
          case Data::kLprItem:       std::cout << Log::DumpProtobuf(&record.lpr_item());     break;
          case Data::kLprSummary:    std::cout << Log::DumpProtobuf(&record.lpr_summary());  break;
          case Data::kTplsItem:      std::cout << Log::DumpProtobuf(&record.tpls_item());    break;
-         case Data::kTalsItem:      std::cout << Log::DumpProtobuf(&record.tals_item()); break;
-         case Data::kRelsItem:       std::cout << Log::DumpProtobuf(&record.rels_item()); break;
+         case Data::kTalsItem:      std::cout << Log::DumpProtobuf(&record.tals_item());    break;
+         case Data::kRelsItem:       std::cout << Log::DumpProtobuf(&record.rels_item());   break;
          default:
             throw std::runtime_error("Received invalid stream data from CTA Frontend.");
       }
@@ -108,8 +108,8 @@ void IStreamBuffer<cta::xrd::Data>::DataCallback(cta::xrd::Data record) const
 namespace cta {
 namespace admin {
 
-bool CtaAdminCmd::is_json         = false;
-bool CtaAdminCmd::is_first_record = true;
+std::atomic<bool> CtaAdminCmd::is_json(false);
+std::atomic<bool> CtaAdminCmd::is_first_record(true);
 
 CtaAdminCmd::CtaAdminCmd(int argc, const char *const *const argv) :
    m_execname(argv[0])
@@ -256,7 +256,7 @@ void CtaAdminCmd::send() const
    stream_future.wait();
 
    // JSON output is an array of structs, close bracket
-   if(isJson()) { std::cout << ']'; }
+   if(isJson()) { std::cout << jsonCloseDelim(); }
 }
 
 
diff --git a/cmdline/CtaAdminCmd.hpp b/cmdline/CtaAdminCmd.hpp
index 56cbc901b6..5fbd554251 100644
--- a/cmdline/CtaAdminCmd.hpp
+++ b/cmdline/CtaAdminCmd.hpp
@@ -39,6 +39,10 @@ public:
       is_first_record = false;
       return c;
    }
+   static std::string jsonCloseDelim() {
+      return is_first_record ? "" : "]";
+   }
+
    // Static method to convert time to string
    static std::string timeToString(const time_t &time)
    {
@@ -70,8 +74,8 @@ public:
    static void print(const ListPendingRetrievesItem &lpr_item);
    static void print(const ListPendingRetrievesSummary &lpr_summary);
    static void print(const TapePoolLsItem &tpls_item);
-   static void print(const cta::admin::TapeLsItem &tals_item);
-   static void print(const cta::admin::RepackLsItem &rels_item);
+   static void print(const TapeLsItem &tals_item);
+   static void print(const RepackLsItem &rels_item);
 
 private:
    //! Parse the options for a specific command/subcommand
@@ -98,8 +102,8 @@ private:
    std::string       m_execname;                                      //!< Executable name of this program
    cta::xrd::Request m_request;                                       //!< Protocol Buffer for the command and parameters
 
-   static bool is_json;                                               //!< Display results in JSON format
-   static bool is_first_record;                                       //!< Delimiter for JSON records
+   static std::atomic<bool> is_json;                                  //!< Display results in JSON format
+   static std::atomic<bool> is_first_record;                          //!< Delimiter for JSON records
 
    static constexpr const char* const TEXT_RED    = "\x1b[31;1m";     //!< Terminal formatting code for red text
    static constexpr const char* const TEXT_NORMAL = "\x1b[0m";        //!< Terminal formatting code for normal text
-- 
GitLab