X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=src%2Fbin%2Fmemcat.cc;h=3938bf134406b65384ca31d9157932dc55b6f74a;hb=92d18858b417309f6bdee6bce464a4f3d6a375fd;hp=56b5a46c9e9ee76bdc889beeb4a3a559d7b14cb4;hpb=2e9eb0803f1fc81bfe6c3e2dda0ed2cbe1aa6a76;p=awesomized%2Flibmemcached diff --git a/src/bin/memcat.cc b/src/bin/memcat.cc index 56b5a46c..3938bf13 100644 --- a/src/bin/memcat.cc +++ b/src/bin/memcat.cc @@ -1,6 +1,6 @@ /* +--------------------------------------------------------------------+ - | libmemcached - C/C++ Client Library for memcached | + | libmemcached-awesome - C/C++ Client Library for memcached | +--------------------------------------------------------------------+ | Redistribution and use in source and binary forms, with or without | | modification, are permitted under the terms of the BSD license. | @@ -9,7 +9,7 @@ | the terms online at: https://opensource.org/licenses/BSD-3-Clause | +--------------------------------------------------------------------+ | Copyright (c) 2006-2014 Brian Aker https://datadifferential.com/ | - | Copyright (c) 2020 Michael Wallner | + | Copyright (c) 2020-2021 Michael Wallner https://awesome.co/ | +--------------------------------------------------------------------+ */ @@ -20,28 +20,39 @@ #define PROGRAM_VERSION "1.1" #include "common/options.hpp" +#include "common/checks.hpp" #include #include -memcached_return_t memcat(const client_options &opt, memcached_st *memc, const char *key, std::ostream &ref) { +memcached_return_t memcat(const client_options &opt, memcached_st *memc, const char *key, std::ostream *ref) { memcached_return_t rc; uint32_t flags; size_t len; auto val = memcached_get(memc, key, strlen(key), &len, &flags, &rc); + auto verbose = opt.isset("verbose"); if (MEMCACHED_SUCCESS == rc) { - if (opt.isset("verbose")) { - ref << "key: " << key << "\n"; + if (verbose) { + *ref << "key: " << key << "\n"; } if (opt.isset("flags")) { - ref << "flags: " << flags << "\n"; + if (verbose) { + *ref << "flags: "; + } + *ref << flags << "\n"; + } + if (verbose) { + *ref << "value: "; } - if (opt.isset("verbose")) { - ref << "value: "; + + ref->write(val, len); + + if (verbose || !opt.isset("file")) { + *ref << std::endl; } - ref.write(val, len); - ref << std::endl; + + ref->flush(); } if (val) { @@ -51,16 +62,16 @@ memcached_return_t memcat(const client_options &opt, memcached_st *memc, const c } int main(int argc, char *argv[]) { - char **argp = nullptr; - memcached_st memc; - 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); } opt.add("flags", 'F', no_argument, "Display key flags, too."); - opt.add("file", 'f', required_argument, "Output to file instead of standard output."); + opt.add("file", 'f', optional_argument, "Output to file instead of standard output." + "\n\t\t# NOTE: defaults to if no argument was provided."); + char **argp = nullptr; if (!opt.parse(argc, argv, &argp)) { exit(EXIT_FAILURE); } @@ -70,10 +81,8 @@ int main(int argc, char *argv[]) { exit(EXIT_FAILURE); } - if (!memcached_create(&memc)) { - if (!opt.isset("quiet")) { - std::cerr << "Failed to initialize memcached client.\n"; - } + memcached_st memc; + if (!check_memcached(opt, memc)) { exit(EXIT_FAILURE); } @@ -82,40 +91,26 @@ int main(int argc, char *argv[]) { exit(EXIT_FAILURE); } - if (!*argp) { - if (!opt.isset("quiet")) { - std::cerr << "No key(s) provided.\n"; - } + if (!check_argp(opt, argp, "No key(s) provided.")) { memcached_free(&memc); exit(EXIT_FAILURE); } + auto file_flag = opt.isset("file"); + auto file = opt.argof("file"); auto exit_code = EXIT_SUCCESS; for (auto arg = argp; *arg; ++arg) { auto key = *arg; if (*key) { - memcached_return_t rc; - auto file = opt.argof("file"); - if (file && *file) { - std::ofstream stream{file, std::ios::binary}; - rc = memcat(opt, &memc, key, stream); - } else { - rc = memcat(opt, &memc, key, std::cout); + if (!file && file_flag) { + file = key; } - if (MEMCACHED_SUCCESS != rc) { - exit_code = EXIT_FAILURE; - if (MEMCACHED_NOTFOUND == rc) { - if (opt.isset("verbose")) { - std::cerr << "not found: " << key << "\n"; - } - // continue; - } else { - if (!opt.isset("quiet")) { - std::cerr << memcached_last_error_message(&memc) << "\n"; - } - break; - } + std::ofstream fstream{}; + std::ostream *ostream = check_ostream(opt, file, fstream); + + if (!check_return(opt, memc, key, memcat(opt, &memc, key, ostream))) { + exit_code = EXIT_FAILURE; } } }