Files
secondo/Algebras/DBService2/Node.hpp
2026-01-23 17:03:45 +08:00

146 lines
3.9 KiB
C++

#ifndef DBS_NODE_H
#define DBS_NODE_H
#include <string>
#include <iostream>
#include "Algebras/DBService2/Record.hpp"
#include "Algebras/DBService2/Host.hpp"
#include "Algebras/DBService2/NodeConnection.hpp"
#include "Algebras/DBService2/SecondoNodeAdapter.hpp"
#include "Algebras/DBService2/Query.hpp"
namespace DBService {
// Forward declaration
class NodeConnection;
class SecondoNodeAdapter;
class Node : public Record<DBService::Node, SecondoNodeAdapter> {
//TODO Make private
protected:
Host host;
int port;
std::string config;
std::string diskPath;
int comPort;
int transferPort;
std::string type;
std::shared_ptr<NodeConnection> nodeConnection;
public:
Node();
/*
Constructor used during addNode assuming that node->connectAndConfigure
is used to determine attributes such as comPort, transferPort and
diskPath.
*/
Node(const std::string newHost,
const int newPort,
std::string newConfig);
Node(const std::string newHost,
const int newPort,
std::string newConfig, std::string diskPath, int comPort, int transferPort);
Node(const Host newHost,
const int newPort,
std::string newConfig, std::string diskPath, int comPort, int transferPort);
Node(const Node&);
Node(Node&&);
std::string getType() const;
void setType(std::string newType);
Host getHost() const;
std::string getConfig() const;
int getPort() const;
std::string getDiskPath() const;
int getComPort() const;
int getTransferPort() const;
std::shared_ptr<NodeConnection> getConnection();
void setHost(std::string newHost);
void setHost(Host newHost);
void setConfig(std::string newConfig);
void setPort(int newPort);
void setDiskPath(std::string newDiskPath);
void setComPort(int newComPort);
void setTransferPort(int newTransferPort);
void setConnection(std::shared_ptr<NodeConnection> newConnection);
/*
Returns host and port as a single line std::string.
Indents the output according to the provided ~indentationLevel~ using
an according number of tabs.
*/
std::string str(int indentationLevel = 0) const;
/**
* Connects to the node, creates & sets the corresponding nodeConnection and
* configures the node with remote config params such as comPort, transferPort
* and diskPath obtained from the remote node.
*/
void connectAndConfigure();
void startWorker();
// For comparing worker nodes
bool operator==(const Node &w2) const;
bool operator!=(const Node &w2) const;
bool empty() const;
/*
Checks if a nodeConnection is available.
Does not tell whether the connection is alive.
*/
bool isConnected();
static std::string getRelationName();
static std::string createRelationStatement();
std::string createStatement() const;
/*
At this point Node's cannot be updated.
The updateStatement returns a non-mutating query.
Note that ~beforeSave~ and ~afterSave~ callbacks
are being triggered.
TODO Implement updateStatement.
*/
std::string updateStatement() const;
//TODO Remove
// void createRelation() override;
//TODO Remove
// Deprecatated. use findAllQuery instead.
static std::string findAllStatement(std::string database);
// static std::string deleteAllStatement();
//TODO What is a better way to create those constants?
static std::string nodeTypeDBService();
static std::string nodeTypeOriginal();
// static Query query(std::string database);
// static std::vector<std::shared_ptr<Node> > findAll(std::string database);
// static std::shared_ptr<Node> findByTid(std::string database, int tid);
};
// Print node
std::ostream &operator<<(std::ostream &os, Node const &node);
}
#endif