summaryrefslogtreecommitdiff
path: root/storage/ndb/src/old_files/rep/RepApiService.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/old_files/rep/RepApiService.cpp')
-rw-r--r--storage/ndb/src/old_files/rep/RepApiService.cpp318
1 files changed, 318 insertions, 0 deletions
diff --git a/storage/ndb/src/old_files/rep/RepApiService.cpp b/storage/ndb/src/old_files/rep/RepApiService.cpp
new file mode 100644
index 00000000000..d07f7a59375
--- /dev/null
+++ b/storage/ndb/src/old_files/rep/RepApiService.cpp
@@ -0,0 +1,318 @@
+/* Copyright (C) 2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+
+#include <Parser.hpp>
+#include <NdbOut.hpp>
+#include <Properties.hpp>
+#include <socket_io.h>
+#include "RepApiService.hpp"
+#include "RepApiInterpreter.hpp"
+#include "repapi/repapi.h"
+#include <NdbMutex.h>
+#include <OutputStream.hpp>
+
+/**
+ const char * name;
+ const char * realName;
+ const Type type;
+ const ArgType argType;
+ const ArgRequired argRequired;
+ const ArgMinMax argMinMax;
+ const int minVal;
+ const int maxVal;
+ void (T::* function)(const class Properties & args);
+ const char * description;
+*/
+
+#define REP_CMD(name, fun, desc) \
+ { name, \
+ 0, \
+ ParserRow<RepApiSession>::Cmd, \
+ ParserRow<RepApiSession>::String, \
+ ParserRow<RepApiSession>::Optional, \
+ ParserRow<RepApiSession>::IgnoreMinMax, \
+ 0, 0, \
+ fun, \
+ desc }
+
+#define REP_ARG(name, type, opt, desc) \
+ { name, \
+ 0, \
+ ParserRow<RepApiSession>::Arg, \
+ ParserRow<RepApiSession>::type, \
+ ParserRow<RepApiSession>::opt, \
+ ParserRow<RepApiSession>::IgnoreMinMax, \
+ 0, 0, \
+ 0, \
+ desc }
+
+#define REP_ARG2(name, type, opt, min, max, desc) \
+ { name, \
+ 0, \
+ ParserRow<RepApiSession>::Arg, \
+ ParserRow<RepApiSession>::type, \
+ ParserRow<RepApiSession>::opt, \
+ ParserRow<RepApiSession>::IgnoreMinMax, \
+ min, max, \
+ 0, \
+ desc }
+
+#define REP_END() \
+ { 0, \
+ 0, \
+ ParserRow<RepApiSession>::Arg, \
+ ParserRow<RepApiSession>::Int, \
+ ParserRow<RepApiSession>::Optional, \
+ ParserRow<RepApiSession>::IgnoreMinMax, \
+ 0, 0, \
+ 0, \
+ 0 }
+
+#define REP_CMD_ALIAS(name, realName, fun) \
+ { name, \
+ realName, \
+ ParserRow<RepApiSession>::CmdAlias, \
+ ParserRow<RepApiSession>::Int, \
+ ParserRow<RepApiSession>::Optional, \
+ ParserRow<RepApiSession>::IgnoreMinMax, \
+ 0, 0, \
+ 0, \
+ 0 }
+
+#define REP_ARG_ALIAS(name, realName, fun) \
+ { name, \
+ realName, \
+ ParserRow<RepApiSession>::ArgAlias, \
+ ParserRow<RepApiSession>::Int, \
+ ParserRow<RepApiSession>::Optional, \
+ ParserRow<RepApiSession>::IgnoreMinMax, \
+ 0, 0, \
+ 0, \
+ 0 }
+
+
+const
+ParserRow<RepApiSession> commands[] =
+{
+
+ REP_CMD("rep" , &RepApiSession::execCommand, ""),
+ REP_ARG("request", Int, Mandatory, "Grep::Request."),
+ REP_ARG("id", Int, Mandatory, "Replication id "),
+ REP_ARG("epoch", Int, Optional, "Epoch. Used by stop epoch ..."),
+
+ REP_CMD("rep status" , &RepApiSession::getStatus, ""),
+ REP_ARG("request", Int, Optional, "Grep::Request."),
+
+ REP_CMD("rep query" , &RepApiSession::query, ""),
+ REP_ARG("id", Int, Mandatory, "Replication Id"),
+ REP_ARG("counter", Int, Mandatory, "QueryCounter."),
+ REP_ARG("request", Int, Mandatory, "Grep::Request."),
+
+ REP_END()
+};
+RepApiSession::RepApiSession(NDB_SOCKET_TYPE sock,
+ class RepApiInterpreter & rep)
+ : SocketServer::Session(sock)
+ , m_rep(rep)
+{
+ m_input = new SocketInputStream(sock);
+ m_output = new SocketOutputStream(sock);
+ m_parser = new Parser<RepApiSession>(commands, *m_input, true, true, true);
+}
+
+RepApiSession::RepApiSession(FILE * f, class RepApiInterpreter & rep)
+ : SocketServer::Session(1)
+ , m_rep(rep)
+{
+ m_input = new FileInputStream(f);
+ m_parser = new Parser<RepApiSession>(commands, *m_input, true, true, true);
+}
+
+RepApiSession::~RepApiSession()
+{
+ delete m_input;
+ delete m_parser;
+}
+
+void
+RepApiSession::runSession()
+{
+ Parser_t::Context ctx;
+ while(!m_stop){
+ m_parser->run(ctx, * this);
+ if(ctx.m_currentToken == 0)
+ break;
+
+ switch(ctx.m_status){
+ case Parser_t::Ok:
+ for(size_t i = 0; i<ctx.m_aliasUsed.size(); i++)
+ ndbout_c("Used alias: %s -> %s",
+ ctx.m_aliasUsed[i]->name, ctx.m_aliasUsed[i]->realName);
+ break;
+ case Parser_t::NoLine:
+ case Parser_t::EmptyLine:
+ break;
+ default:
+ break;
+ }
+ }
+ NDB_CLOSE_SOCKET(m_socket);
+}
+
+void
+RepApiSession::execCommand(Parser_t::Context & /* unused */,
+ const class Properties & args)
+{
+ Uint32 err;
+ Uint32 replicationId;
+ args.get("id", &replicationId);
+ Properties * result = m_rep.execCommand(args);
+ if(result == NULL) {
+ m_output->println("global replication reply");
+ m_output->println("result: %d", -1);
+ m_output->println("id: %d",replicationId);
+ m_output->println("");
+ return;
+ }
+ result->get("err", &err);
+ m_output->println("global replication reply");
+ m_output->println("result: %d", err);
+ m_output->println("id: %d", 0);
+ m_output->println("");
+ delete result;
+}
+
+
+void
+RepApiSession::getStatus(Parser_t::Context & /* unused */,
+ const class Properties & args)
+{
+ Uint32 err;
+ Properties * result = m_rep.getStatus();
+ result->get("err", &err);
+ Uint32 subId;
+ result->get("subid", &subId);
+ Uint32 subKey;
+ result->get("subkey", &subKey);
+ Uint32 connected_rep;
+ result->get("connected_rep", &connected_rep);
+ Uint32 connected_db;
+ result->get("connected_db", &connected_db);
+ Uint32 state;
+ result->get("state", &state);
+ Uint32 state_sub;
+ result->get("state", &state_sub);
+
+ m_output->println("global replication status reply");
+ m_output->println("result: %d",0);
+ m_output->println("id: %d",0);
+ m_output->println("subid: %d", subId);
+ m_output->println("subkey: %d", subKey);
+ m_output->println("connected_rep: %d", connected_rep);
+ m_output->println("connected_db: %d", connected_db);
+ m_output->println("state_sub: %d", state_sub);
+ m_output->println("state: %d", state);
+ m_output->println("");
+ delete result;
+}
+
+
+void
+RepApiSession::query(Parser_t::Context & /* unused */,
+ const class Properties & args)
+{
+ Uint32 err;
+ Uint32 counter, replicationId;
+ args.get("counter", &counter);
+ args.get("id", &replicationId);
+ Properties * result = m_rep.query(counter, replicationId);
+ if(result == NULL) {
+ m_output->println("global replication query reply");
+ m_output->println("result: %s","Failed");
+ m_output->println("id: %d",replicationId);
+ m_output->println("");
+ return;
+ }
+
+ BaseString first;
+ BaseString last;
+ Uint32 subid = 0, subkey = 0, no_of_nodegroups = 0;
+ Uint32 connected_rep = 0, connected_db = 0;
+ Uint32 state = 0 , state_sub = 0;
+ result->get("err", &err);
+ result->get("no_of_nodegroups", &no_of_nodegroups);
+ result->get("subid", &subid);
+ result->get("subkey", &subkey);
+ result->get("connected_rep", &connected_rep);
+ result->get("connected_db", &connected_db);
+ result->get("first", first);
+ result->get("last", last);
+ result->get("state", &state);
+ result->get("state_sub", &state_sub);
+ m_output->println("global replication query reply");
+ m_output->println("result: %s","Ok");
+ m_output->println("id: %d",replicationId);
+ m_output->println("no_of_nodegroups: %d",no_of_nodegroups);
+ m_output->println("subid: %d", subid);
+ m_output->println("subkey: %d", subkey);
+ m_output->println("connected_rep: %d", connected_rep);
+ m_output->println("connected_db: %d", connected_db);
+ m_output->println("state_sub: %d", state_sub);
+ m_output->println("state: %d", state);
+ m_output->println("first: %s", first.c_str());
+ m_output->println("last: %s", last.c_str());
+ m_output->println("");
+ delete result;
+}
+
+
+
+static const char *
+propToString(Properties *prop, const char *key) {
+ static char buf[32];
+ const char *retval = NULL;
+ PropertiesType pt;
+
+ prop->getTypeOf(key, &pt);
+ switch(pt) {
+ case PropertiesType_Uint32:
+ Uint32 val;
+ prop->get(key, &val);
+ snprintf(buf, sizeof buf, "%d", val);
+ retval = buf;
+ break;
+ case PropertiesType_char:
+ const char *str;
+ prop->get(key, &str);
+ retval = str;
+ break;
+ default:
+ snprintf(buf, sizeof buf, "(unknown)");
+ retval = buf;
+ }
+ return retval;
+}
+
+void
+RepApiSession::printProperty(Properties *prop, const char *key) {
+ m_output->println("%s: %s", key, propToString(prop, key));
+}
+
+void
+RepApiSession::stopSession(){
+
+}