bin: consolidate clients
[awesomized/libmemcached] / src / bin / common / checks.hpp
index e46fffbea65107c9c2bb425755a334807b57a6ff..9c963522390e078c6a001d2406a513657cda84af 100644 (file)
@@ -18,6 +18,8 @@
 #include "options.hpp"
 #include "libmemcached/common.h"
 
+#include <cerrno>
+#include <cstring>
 #include <fstream>
 
 bool check_buffering(const client_options &opt, memcached_st &memc) {
@@ -52,13 +54,30 @@ bool check_memcached(const client_options &opt, memcached_st &memc) {
   return true;
 }
 
+bool check_return(const client_options &opt, memcached_st &memc, memcached_return_t rc) {
+  if (!memcached_success(rc)) {
+    if (!opt.isset("quiet")) {
+      if (!memcached_fatal(rc)) {
+        if (opt.isset("verbose")) {
+          std::cerr << "Failed: " << memcached_strerror(&memc, rc) << "\n";;
+        }
+      } else {
+        std::cerr << "Fatal error: " << memcached_last_error_message(&memc) << "\n";
+      }
+    }
+    return false;
+  }
+  return true;
+}
+
 bool check_return(const client_options &opt, memcached_st &memc, const char *key,
                   memcached_return_t rc) {
   if (!memcached_success(rc)) {
     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
@@ -75,12 +94,32 @@ std::ostream *check_ostream(const client_options &opt, const char *file, std::of
     if (opt.isset("debug")) {
       std::cerr << "Opening '" << file << "' for writing.\n";
     }
-    stream.open(file);
+    errno = 0;
+    stream.open(file, std::ios::binary | std::ios::out);
     if (stream.is_open()) {
       return &stream;
     } else if (!opt.isset("quiet")) {
-      std::cerr << "Failed to open '" << file << "' for writing.\n";
+      std::cerr << "Failed to open '" << file << "' for writing: " << strerror(errno) << ".\n";
     }
   }
   return &std::cout;
 }
+
+std::istream *check_istream(const client_options &opt, const char *file, std::ifstream &stream) {
+  if (file && *file) {
+    if (file[0] != '-' || file[1] != 0) {
+      if (opt.isset("debug")) {
+        std::cerr << "Opening '" << file << "' for reading.\n";
+      }
+      errno = 0;
+      stream.open(file, std::ios::binary | std::ios::in);
+      if (stream.is_open()) {
+        return &stream;
+      } else if (!opt.isset("quiet")) {
+        std::cerr << "Failed to open '" << file << "' for reading: " << strerror(errno) << ".\n";
+      }
+      return nullptr;
+    }
+  }
+  return &std::cin;
+}