bin: consolidate clients
authorMichael Wallner <mike@php.net>
Tue, 17 Nov 2020 16:16:29 +0000 (17:16 +0100)
committerMichael Wallner <mike@php.net>
Tue, 17 Nov 2020 16:16:29 +0000 (17:16 +0100)
src/bin/common/checks.hpp
src/bin/memcat.cc
src/bin/memcp.cc
src/bin/memping.cc
test/tests/bin/memcat.cpp

index e46fffbea65107c9c2bb425755a334807b57a6ff..470b4b4a9e1da73701e46abdc7d2da4adc7c2d87 100644 (file)
@@ -58,7 +58,8 @@ bool check_return(const client_options &opt, memcached_st &memc, const char *key
     if (!opt.isset("quiet")) {
       if (MEMCACHED_NOTFOUND == rc) {
         if (opt.isset("verbose")) {
-          std::cerr << "Could not find key '" << key << "'.\n";
+          std::cerr << "Could not find key '" << key
+                    << "': " << memcached_strerror(&memc, rc) << "\n";;
         }
       } else {
         std::cerr << "Fatal error for key '" << key
index 9e2704af5b0aef0fbe11e6abf943745218c4c18a..b8e49486f2812b044a77ec854639a3597bc8e457 100644 (file)
@@ -37,12 +37,22 @@ memcached_return_t memcat(const client_options &opt, memcached_st *memc, const c
       *ref << "key: " << key << "\n";
     }
     if (opt.isset("flags")) {
-      *ref << "flags: " << flags << "\n";
+      if (verbose) {
+      *ref << "flags: ";
+      }
+      *ref << flags << "\n";
     }
     if (verbose) {
       *ref << "value: ";
     }
-    ref->write(val, len) << std::endl;
+    
+    ref->write(val, len);
+
+    if (verbose || !opt.isset("file")) {
+      *ref << std::endl;
+    }
+
+    ref->flush();
   }
 
   if (val) {
@@ -52,7 +62,7 @@ memcached_return_t memcat(const client_options &opt, memcached_st *memc, const c
 }
 
 int main(int argc, char *argv[]) {
-  client_options opt{PROGRAM_NAME, PROGRAM_VERSION, PROGRAM_DESCRIPTION, "key [ key ... ]"};
+  client_options opt{PROGRAM_NAME, PROGRAM_VERSION, PROGRAM_DESCRIPTION, "key [key ...]"};
 
   for (const auto &def : opt.defaults) {
     opt.add(def);
@@ -89,23 +99,9 @@ int main(int argc, char *argv[]) {
   for (auto arg = argp; *arg; ++arg) {
     auto key = *arg;
     if (*key) {
-
       std::ofstream fstream{};
       std::ostream *ostream = check_ostream(opt, opt.argof("file"), fstream);
 
-      auto file = opt.argof("file");
-      if (file && *file) {
-        fstream.open(file, std::ios::binary | std::ios::out);
-        if (!fstream.is_open()) {
-          exit_code = EXIT_FAILURE;
-          if (!opt.isset("quiet")) {
-            std::cerr << "Failed to open " << file << " for writing.\n";
-          }
-          continue;
-        }
-        ostream = &fstream;
-      }
-
       if (!check_return(opt, memc, key, memcat(opt, &memc, key, ostream))) {
         exit_code = EXIT_FAILURE;
       }
index 713eb570e1eb75bc99b55f77cc1a620b6249a27d..e2dcccdc6a9bb3a60d9b8f6368aac1b33bd7e8b6 100644 (file)
@@ -111,9 +111,9 @@ int main(int argc, char *argv[]) {
   };
 
   opt.add("udp", 'U', no_argument, "Use UDP.")
-      .apply = [](const client_options &opt, const client_options::extended_option &ext, memcached_st *memc) {
+      .apply = [](const client_options &opt_, const client_options::extended_option &ext, memcached_st *memc) {
     if (MEMCACHED_SUCCESS != memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_USE_UDP, ext.set)) {
-      if (!opt.isset("quiet")) {
+      if (!opt_.isset("quiet")) {
         std::cerr << memcached_last_error_message(memc) << "\n";
       }
       return false;
index d875280ead6af5f4135fcbe80a93675fcca1879c..6058bc67df9cabeb2240081963233024a275b9bf 100644 (file)
@@ -90,172 +90,3 @@ int main(int argc, char *argv[]) {
   memcached_free(&memc);
   exit(exit_code);
 }
-
-#include <cerrno>
-#include <cstdio>
-#include <cstring>
-#include <getopt.h>
-#include <unistd.h>
-
-#include "libmemcached-1.0/memcached.h"
-#include "libmemcachedutil-1.0/util.h"
-#include "client_options.h"
-#include "utilities.h"
-
-#include <iostream>
-
-static bool opt_binary = false;
-static int opt_verbose = 0;
-static time_t opt_expire = 0;
-static char *opt_servers = NULL;
-static char *opt_username;
-static char *opt_passwd;
-
-#define PROGRAM_NAME        "memping"
-#define PROGRAM_DESCRIPTION "Ping a server to see if it is alive"
-
-/* Prototypes */
-void options_parse(int argc, char *argv[]);
-
-int main(int argc, char *argv[]) {
-  options_parse(argc, argv);
-
-  if (opt_servers == NULL) {
-    char *temp;
-
-    if ((temp = getenv("MEMCACHED_SERVERS"))) {
-      opt_servers = strdup(temp);
-    }
-
-    if (opt_servers == NULL) {
-      std::cerr << "No Servers provided" << std::endl;
-      exit(EXIT_FAILURE);
-    }
-  }
-
-  int exit_code = EXIT_SUCCESS;
-  memcached_server_st *servers = memcached_servers_parse(opt_servers);
-  if (servers == NULL or memcached_server_list_count(servers) == 0) {
-    std::cerr << "Invalid server list provided:" << opt_servers << std::endl;
-    exit_code = EXIT_FAILURE;
-  } else {
-    for (uint32_t x = 0; x < memcached_server_list_count(servers); x++) {
-      memcached_return_t instance_rc;
-      const char *hostname = servers[x].hostname;
-      in_port_t port = servers[x].port;
-
-      if (opt_verbose) {
-        std::cout << "Trying to ping " << hostname << ":" << port << std::endl;
-      }
-
-      if (libmemcached_util_ping2(hostname, port, opt_username, opt_passwd, &instance_rc) == false)
-      {
-        std::cerr << "Failed to ping " << hostname << ":" << port << " "
-                  << memcached_strerror(NULL, instance_rc) << std::endl;
-        exit_code = EXIT_FAILURE;
-      }
-    }
-  }
-  memcached_server_list_free(servers);
-
-  free(opt_servers);
-
-  return exit_code;
-}
-
-void options_parse(int argc, char *argv[]) {
-  memcached_programs_help_st help_options[] = {
-      {0},
-  };
-
-  static struct option long_options[] = {
-      {(OPTIONSTRING) "version", no_argument, NULL, OPT_VERSION},
-      {(OPTIONSTRING) "help", no_argument, NULL, OPT_HELP},
-      {(OPTIONSTRING) "quiet", no_argument, NULL, OPT_QUIET},
-      {(OPTIONSTRING) "verbose", no_argument, &opt_verbose, OPT_VERBOSE},
-      {(OPTIONSTRING) "debug", no_argument, &opt_verbose, OPT_DEBUG},
-      {(OPTIONSTRING) "servers", required_argument, NULL, OPT_SERVERS},
-      {(OPTIONSTRING) "expire", required_argument, NULL, OPT_EXPIRE},
-      {(OPTIONSTRING) "binary", no_argument, NULL, OPT_BINARY},
-      {(OPTIONSTRING) "username", required_argument, NULL, OPT_USERNAME},
-      {(OPTIONSTRING) "password", required_argument, NULL, OPT_PASSWD},
-      {0, 0, 0, 0},
-  };
-
-  bool opt_version = false;
-  bool opt_help = false;
-  int option_index = 0;
-  while (1) {
-    int option_rv = getopt_long(argc, argv, "Vhvds:", long_options, &option_index);
-
-    if (option_rv == -1)
-      break;
-
-    switch (option_rv) {
-    case 0:
-      break;
-
-    case OPT_BINARY:
-      opt_binary = true;
-      break;
-
-    case OPT_VERBOSE: /* --verbose or -v */
-      opt_verbose = OPT_VERBOSE;
-      break;
-
-    case OPT_DEBUG: /* --debug or -d */
-      opt_verbose = OPT_DEBUG;
-      break;
-
-    case OPT_VERSION: /* --version or -V */
-      version_command(PROGRAM_NAME);
-      break;
-
-    case OPT_HELP: /* --help or -h */
-      help_command(PROGRAM_NAME, PROGRAM_DESCRIPTION, long_options, help_options);
-      break;
-
-    case OPT_SERVERS: /* --servers or -s */
-      opt_servers = strdup(optarg);
-      break;
-
-    case OPT_EXPIRE: /* --expire */
-      errno = 0;
-      opt_expire = time_t(strtoll(optarg, (char **) NULL, 10));
-      if (errno) {
-        std::cerr << "Incorrect value passed to --expire: `" << optarg << "`" << std::endl;
-        exit(EXIT_FAILURE);
-      }
-      break;
-
-    case OPT_USERNAME:
-      opt_username = optarg;
-      opt_binary = true;
-      break;
-
-    case OPT_PASSWD:
-      opt_passwd = optarg;
-      break;
-
-    case OPT_QUIET:
-      close_stdio();
-      break;
-
-    case '?':
-      /* getopt_long already printed an error message. */
-      exit(1);
-    default:
-      abort();
-    }
-  }
-
-  if (opt_version) {
-    version_command(PROGRAM_NAME);
-    exit(EXIT_SUCCESS);
-  }
-
-  if (opt_help) {
-    help_command(PROGRAM_NAME, PROGRAM_DESCRIPTION, long_options, help_options);
-    exit(EXIT_SUCCESS);
-  }
-}
index b7390aeaf1226340c8f055e4d31e97a9606e1656..f5d63cc5991c6a4115f662caeae2b45307e27c8a 100644 (file)
@@ -12,7 +12,7 @@ TEST_CASE("bin/memcat") {
   SECTION("no servers provided") {
     string output;
     REQUIRE_FALSE(sh.run("memcat", output));
-    REQUIRE(output == "No servers provided\n");
+    REQUIRE(output == "No servers provided.\n");
   }
 
   SECTION("connection failure") {
@@ -24,13 +24,14 @@ TEST_CASE("bin/memcat") {
   SECTION("--help") {
     string output;
     REQUIRE(sh.run("memcat --help", output));
-    REQUIRE_THAT(output, Contains("memcat"));
-    REQUIRE_THAT(output, Contains("v1"));
-    REQUIRE_THAT(output, Contains("help"));
-    REQUIRE_THAT(output, Contains("version"));
-    REQUIRE_THAT(output, Contains("option"));
-    REQUIRE_THAT(output, Contains("--"));
-    REQUIRE_THAT(output, Contains("="));
+    REQUIRE_THAT(output, Contains("memcat v1"));
+    REQUIRE_THAT(output, Contains("Usage:"));
+    REQUIRE_THAT(output, Contains("key [key ...]"));
+    REQUIRE_THAT(output, Contains("Options:"));
+    REQUIRE_THAT(output, Contains("-h|--help"));
+    REQUIRE_THAT(output, Contains("-V|--version"));
+    REQUIRE_THAT(output, Contains("Environment:"));
+    REQUIRE_THAT(output, Contains("MEMCACHED_SERVERS"));
   }
 
   SECTION("with server") {
@@ -49,6 +50,13 @@ TEST_CASE("bin/memcat") {
 
       string output;
       REQUIRE_FALSE(sh.run(comm + "memcat", output));
+      REQUIRE(output.empty());
+    }
+    SECTION("not found --verbose") {
+      memcached_delete(*memc, S("memcat"), 0);
+
+      string output;
+      REQUIRE_FALSE(sh.run(comm + " -v memcat", output));
       REQUIRE_THAT(output, !Contains("MEMCAT-SET"));
       REQUIRE_THAT(output, Contains("NOT FOUND"));
     }
@@ -62,10 +70,10 @@ TEST_CASE("bin/memcat") {
       }
       SECTION("flags") {
         REQUIRE(sh.run(comm + "--flag memcat", output));
-        REQUIRE(output == "123\n");
+        REQUIRE(output == "123\nMEMCAT-SET\n");
         output.clear();
         REQUIRE(sh.run(comm + "--flag -v memcat", output));
-        REQUIRE(output == "key: memcat\nflags: 123\n");
+        REQUIRE(output == "key: memcat\nflags: 123\nvalue: MEMCAT-SET\n");
       }
       SECTION("file") {
         Tempfile temp;