#include #include #include #include #include "ShellState.h" #include "ShellContext.h" #include "transport/TTransportException.h" using namespace std; using namespace apache::thrift::transport; const char * PMT = ">> "; void ShellStateStart::run(ShellContext * c) { if(!c->ParseInput()) { c->changeState(ShellStateStop::getInstance()); } else { c->changeState(ShellStateConnecting::getInstance()); } } void ShellStateStop::run(ShellContext * c) { c->stop(); } void ShellStateConnecting::run(ShellContext * c) { try { c->connect(); } catch (const TTransportException & e) { cout << e.what() << endl; c->changeState(ShellStateStop::getInstance()); return; } c->changeState(ShellStateConnected::getInstance()); } void ShellStateConnected::unknownCmd(void) { cout << "Unknown command!" << endl; cout << "Use help to list all available commands" << endl; } void ShellStateConnected::helpMsg(void) { cout << "Currently supported commands:" << endl; cout << "create db" << endl; cout << "get db key" << endl; cout << "scan db start_key end_key limit" << endl; cout << "put db key value" << endl; cout << "exit/quit" << endl; } void ShellStateConnected::handleConError(ShellContext * c) { cout << "Connection down" << endl; cout << "Reconnect ? (y/n) :" << endl; string s; while(getline(cin, s)) { if("y" == s) { c->changeState(ShellStateConnecting::getInstance()); break; } else if("n" == s) { c->changeState(ShellStateStop::getInstance()); break; } else { cout << "Reconnect ? (y/n) :" << endl; } } } void ShellStateConnected::run(ShellContext * c) { string line; cout << PMT; getline(cin, line); istringstream is(line); vector params; string param; while(is >> param) { params.push_back(param); } // empty input line if(params.empty()) return; if("quit" == params[0] || "exit" == params[0]) { c->changeState(ShellStateStop::getInstance()); } else if("get" == params[0]) { if(params.size() == 3) { try { c->get(params[1], params[2]); } catch (const TTransportException & e) { cout << e.what() << endl; handleConError(c); } } else { unknownCmd(); } } else if("create" == params[0]) { if(params.size() == 2) { try { c->create(params[1]); } catch (const TTransportException & e) { cout << e.what() << endl; handleConError(c); } } else { unknownCmd(); } }else if("put" == params[0]) { if(params.size() == 4) { try { c->put(params[1], params[2], params[3]); } catch (const TTransportException & e) { cout << e.what() << endl; handleConError(c); } } else { unknownCmd(); } } else if("scan" == params[0]) { if(params.size() == 5) { try { c->scan(params[1], params[2], params[3], params[4]); } catch (const TTransportException & e) { cout << e.what() << endl; handleConError(c); } } else { unknownCmd(); } } else if("help" == params[0]) { helpMsg(); } else { unknownCmd(); } }