04f39c75261c76c6eea0390da4d9e8aebcd822b3
[ric-plt/sdl.git] / src / cli / listkeyscommand.cpp
1 #include <ostream>
2 #include <cstdlib>
3 #include "private/cli/commandmap.hpp"
4 #include "private/cli/common.hpp"
5 #include <sdl/syncstorage.hpp>
6 #include <sdl/asyncstorage.hpp>
7
8 using namespace shareddatalayer;
9 using namespace shareddatalayer::cli;
10
11 namespace
12 {
13     std::shared_ptr<shareddatalayer::SyncStorage> createSyncStorage(const SyncStorage::Namespace& ns,
14                                                                     std::ostream& out)
15     {
16         try
17         {
18             auto sdl(shareddatalayer::SyncStorage::create());
19             sdl->waitReady(ns, std::chrono::minutes(1));
20             return sdl;
21         }
22         catch (const shareddatalayer::Exception& error)
23         {
24             out << "SyncStorage create failed: " << error.what() << std::endl;
25         }
26
27         return nullptr;
28     }
29
30     void listkeys(shareddatalayer::SyncStorage& sdl,
31                   const SyncStorage::Namespace& ns,
32                   const std::string& pattern,
33                   std::ostream& out)
34     {
35         try
36         {
37             auto keys(sdl.listKeys(ns, pattern));
38             for (auto key: keys)
39                 out << key << std::endl;
40         }
41         catch (const shareddatalayer::Exception& error)
42         {
43             out << "listKeys(" << ns << ", " << pattern << ") failed: "
44                 << error.what() << std::endl;
45         }
46     }
47
48     int listKeysCommand(std::ostream& out, const boost::program_options::variables_map& map)
49     {
50         auto ns(map["ns"].as<std::string>());
51         auto pattern(map["pattern"].as<std::string>());
52
53         auto sdl(createSyncStorage(ns, out));
54         if (nullptr == sdl)
55             return EXIT_FAILURE;
56         sdl->setOperationTimeout(std::chrono::seconds(5));
57
58         listkeys(std::ref(*sdl), ns, pattern, out);
59
60         return EXIT_SUCCESS;
61     }
62 }
63
64 const char *longHelpListkeysCmd =
65     "Use listKeys SDL API to list keys matching search pattern under the namespace.\n\n"
66     "Example: sdltool listkeys --ns 'sdltool' --pattern 'foo*'";
67
68 AUTO_REGISTER_COMMAND(std::bind(listKeysCommand, std::placeholders::_1, std::placeholders::_3),
69                       "listkeys",
70                       "listKeys SDL API",
71                       longHelpListkeysCmd,
72                       CommandMap::Category::UTIL,
73                       30030,
74                       ("ns,n", boost::program_options::value<std::string>()->default_value("sdltoolns"), "namespace to use")
75                       ("pattern,p", boost::program_options::value<std::string>()->default_value("*"), "key search pattern")
76                      );
77