diff --git a/CMakeLists.txt b/CMakeLists.txt index 02d9c349d47d5bfc80ad6a927b95b7e807073e9f..e202807bc6dc656db84626e34d1c53b3bd72bbdd 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,7 +13,6 @@ option(REDISPROVIDER_BUILD_SHARED "Build redisprovider as a shared library." OFF # sources set(SOURCES src/Redis_Provider.cpp - src/Redis_Provider_Configurator.cpp ) # target diff --git a/deps/Base-DAQ b/deps/Base-DAQ index a2095e59d57271e3bef3422a67c6905fd237467c..2b4e8b039ec5da9ddd53720991c1b95f034e86fb 160000 --- a/deps/Base-DAQ +++ b/deps/Base-DAQ @@ -1 +1 @@ -Subproject commit a2095e59d57271e3bef3422a67c6905fd237467c +Subproject commit 2b4e8b039ec5da9ddd53720991c1b95f034e86fb diff --git a/include/Redis_Provider.h b/include/Redis_Provider.h index 0ed0f25773f50852f3537061018187dc613d19f4..fc32327a4b4af4d1000cb57e94f16ee60ba965e9 100755 --- a/include/Redis_Provider.h +++ b/include/Redis_Provider.h @@ -4,48 +4,67 @@ * Author: astrisw */ -#ifndef REDISPROVIDER_H_ -#define REDISPROVIDER_H_ +#pragma once #include #include #include +#include namespace inaf::oasbo::Providers { -class RedisProvider : public BaseProvider{ +class RedisProvider: public BaseProvider { protected: redisContext *context = nullptr; + + RedisProvider(); + RedisProvider(std::string ip, int port, std::string key); + +public: std::string ip; int port; - std::string & key = *(&this->dest); - void setDest(std::string dest){setKey(dest);} - std::string getDest(){return getKey();} + int write(PacketLib::BasePacket&) override; + int write(PacketLib::BasePacket&, std::string dest) override; + void setDest(std::string dest) override { + this->dest = dest; + } + std::string getDest() override { + return dest; + } + int close() override; + int open() override; + bool isOpen() override; + ~RedisProvider(); + friend class Builder; -public: - RedisProvider(); - RedisProvider(std::string ip, int port, std::string key); + class Builder { + protected: + RedisProvider *provider; - void setIp(std::string ip){this->ip=ip;} - void setPort(int port){this->port=port;} - void setKey(std::string key){this->key=key;} + public: + std::string ip_key { "ip" }; + std::string port_key { "port" }; + std::string redis_key_key { "key" }; - std::string getIp(){return this->ip;} - int getPort(){return this->port;} - std::string getKey(){return this->key;} + Builder(); + Builder(std::string ip, int port, std::string topic); + ~Builder(); + void reset(); - int write(PacketLib::BasePacket &); - int write(PacketLib::BasePacket &, std::string dest); + Builder* configFrom(Configurators::BaseConfigurator *conf); - int close(); - int open(); - bool isOpen() override; - ~RedisProvider(); + Builder* setIp(std::string ip); + + Builder* setPort(int port); + + Builder* setKey(std::string key); + + RedisProvider* getProvider(); + }; }; } -#endif /* REDISPROVIDER_H_ */ diff --git a/src/Redis_Provider.cpp b/src/Redis_Provider.cpp index 1b7341be1e81fbd56e04ff439906ca83fcb41f38..f4a83215356520ad365e251817507e3fea582d29 100755 --- a/src/Redis_Provider.cpp +++ b/src/Redis_Provider.cpp @@ -1,63 +1,69 @@ - #include +#include +#include using namespace inaf::oasbo::Providers; -RedisProvider::RedisProvider() { - RedisProvider("127.0.0.1",6379,"DAQ_key"); +RedisProvider::RedisProvider() : + RedisProvider("127.0.0.1", 6379, "DAQ_key") { } -RedisProvider::RedisProvider(std::string ip, int port, std::string key) { - setIp(ip); - setPort(port); - setKey(key); +RedisProvider::RedisProvider(std::string ip, int port, std::string key) : + ip(ip),port(port) { + setDest(key); } int RedisProvider::write(PacketLib::BasePacket &packet) { - return write(packet,this->key); + return write(packet, this->dest); } int RedisProvider::write(PacketLib::BasePacket &packet, std::string key) { - if (!isOpen()){ - if (context) { - std::cout << "Redis Provider Error: "<< context->errstr << std::endl; - } else { - std::cout << "Redis Provider Error: Can't allocate Redis context" << std::endl; - } - return -1; + if (!isOpen()) { + if (context) { + std::cout << "Redis Provider Error: " << context->errstr + << std::endl; + } else { + std::cout << "Redis Provider Error: Can't allocate Redis context" + << std::endl; + } + return -1; } - uint size = packet.getHeaderSize() + packet.getPayloadSize() + packet.getTailSize(); - redisReply *r = (redisReply *) redisCommand(context, "LPUSH %s %b", key.c_str(), (char*) packet.getBinaryPointer(), size); + uint size = packet.getHeaderSize() + packet.getPayloadSize() + + packet.getTailSize(); + redisReply *r = (redisReply*) redisCommand(context, "LPUSH %s %b", + key.c_str(), (char*) packet.getBinaryPointer(), size); if (r == NULL) { - // Error executing Redis command - return -1; + // Error executing Redis command + return -1; } // Check the type of the Redis reply if (r->type == REDIS_REPLY_ERROR) { - // Error executing Redis command + // Error executing Redis command std::cout << r->str << std::endl; - freeReplyObject(r); - return -1; + freeReplyObject(r); + return -1; } - freeReplyObject(r); + freeReplyObject(r); return size; } int RedisProvider::open() { if (isOpen()) close(); - context = redisConnect(getIp().c_str(), getPort()); + context = redisConnect(ip.c_str(), port); if (context == nullptr || context->err) { - if (context) { - std::cout << "Redis Provider Error: "<< context->errstr << std::endl; - } else { - std::cout << "Redis Provider Error: Can't allocate Redis context" << std::endl; - } - return -1; + if (context) { + std::cout << "Redis Provider Error: " << context->errstr + << std::endl; + } else { + std::cout << "Redis Provider Error: Can't allocate Redis context" + << std::endl; + } + return -1; } return 1; } int RedisProvider::close() { - if (context != nullptr && !context->err ){ + if (context != nullptr && !context->err) { redisFree(this->context); context = nullptr; } @@ -65,9 +71,65 @@ int RedisProvider::close() { } bool RedisProvider::isOpen() { - return (context != nullptr && !context->err ); + return (context != nullptr && !context->err); } -RedisProvider::~RedisProvider(){ +RedisProvider::~RedisProvider() { close(); } + +using R_B = RedisProvider::Builder; +R_B::Builder() { + this->reset(); +} +R_B::Builder(std::string ip, int port, std::string topic) { + this->provider = new RedisProvider(ip, port, topic); + +} +R_B::~Builder() { + delete provider; +} + +void R_B::reset() { + this->provider = new RedisProvider(); +} + +R_B* R_B::configFrom(Configurators::BaseConfigurator *conf) { + std::string target = std::string("redisprovider"); + conf->readConfigFromSource(target); + std::map params = conf->getConfig(); + + std::string key = target+"_"+ip_key; + if (params.count(key) > 0) + provider->ip = params[key]; + + key = target+"_"+port_key; + if (params.count(key) > 0) + provider->port = std::stoi(params[key]); + + key = target+"_"+redis_key_key; + if (params.count(key) > 0) + provider->setDest(params[key]); + return this; +} + +R_B* R_B::setIp(std::string ip) { + provider->ip = ip; + return this; +} + +R_B* R_B::setPort(int port) { + provider->port = port; + return this; +} + +R_B* R_B::setKey(std::string key) { + provider->setDest(key); + return this; +} + +RedisProvider* R_B::getProvider() { + RedisProvider *result = this->provider; + this->reset(); + return result; +}