HCE project C++ developers source code library  1.1.1
HCE project developer library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
ORMFunctionalObject.cpp
Go to the documentation of this file.
1 
15 
16 
17 
18 #include "ORMFunctionalObject.hpp"
19 #include "HCETimer.hpp"
20 #include "EncodeDecodeBase64.hpp"
21 
25 #include <Poco/SharedPtr.h>
26 #include <Poco/NumberFormatter.h>
27 #include <Poco/NumberParser.h>
28 
29 
30 namespace HCE
31 {
32 
38  _errorCode(int()),_errorMsg(),_status(),command(),_dbDriver(0),_dbConfig(dbConfig),_factory() {
39  this->init();
40  if(this->_status == ACTION_GENERAL_FAILURE) {
41  std::cerr << "ERROR: create ORMFunctionalObject failure" << std::endl;
42  }
43 }
44 
46 }
47 
48 void ORMFunctionalObject::init() {
49  this->_status = ACTION_SUCCESS;
50  #ifdef _USE_VOLDEMORT_DB_
51  if (!_factory.isClass(this->_dbConfig.getDriverName())) _factory.registerClass<HCE::VoldemortDB>(this->_dbConfig.getDriverName());
52  #elif _USE_LEVEL_DB_
53  if (!_factory.isClass(this->_dbConfig.getDriverName())) _factory.registerClass<HCE::LevelDB>(this->_dbConfig.getDriverName());
54  #elif _USE_AEROSPIKE_DB_
55  if (!_factory.isClass(this->_dbConfig.getDriverName())) _factory.registerClass<HCE::AerospikeDB>(this->_dbConfig.getDriverName());
56  #endif
57  this->createDriverByName();
58  this->setDriverUrl();
59  this->setDatabaseName();
60  init_command();
61 }
62 
66 Poco::SharedPtr<Response> ORMFunctionalObject::processObj(const Request& request) {
67  Poco::SharedPtr<Response> response;
68  HCETimer timer;
69  try {
70  response = (request.initialized) ?
71  (this->command.at(request.type))(this,request.data) : Poco::SharedPtr<Response>(new Response(INVALID_MESSAGE_BODY));
72  }
73  catch(std::exception& ex ) {
74  Poco::Message msg ("KVDBManager.cpp",ex.what(),Poco::Message::PRIO_ERROR,__FILE__,__LINE__);
76  response = Poco::SharedPtr<Response>(new Response);
77  }
78  response->setTime(Poco::NumberFormatter::format(timer.elapsed()));
79  return response;
80 }
81 
85 std::string ORMFunctionalObject::processJSON(const std::string& inputMessage) {
86  Request request(inputMessage);
87  return this->processObj(request)->json();
88 }
89 
93 Poco::SharedPtr<Response> ORMFunctionalObject::putData(const std::string& data) {
94  std::map<std::string, std::string> resources;
95  std::map<std::string, std::string> statuses;
96  STATUS status = loadResourcesFromJSON(data, resources);
97  //STATUS status = loadResourceFromJSON<std::map<std::string, std::string> >(data, resources);
98  for(auto resource : resources) {
99  std::string key = resource.first;
100  std::string value = resource.second;
101  put(key, value);
102  statuses[resource.first] = Poco::NumberFormatter::format(getLastError());
103  status |= getLastError();
104  }
105  Poco::SharedPtr<Response> response(new Response(statuses,status));
106  return response;
107 }
108 
112 Poco::SharedPtr<Response> ORMFunctionalObject::getData(const std::string& data) {
113  std::vector<std::string> document_ids;
114  std::map<std::string, std::string> documents;
115  STATUS status = loadDocIdsFromJSON(data, document_ids);
116  for(auto document_id : document_ids) {
117  std::string s = get(document_id);
118  documents[document_id] = s;
119  status |= getLastError();
120  }
121  Poco::SharedPtr<Response> response(new Response(documents,status));
122  return response;
123 }
124 
128 Poco::SharedPtr<Response> ORMFunctionalObject::delData(const std::string& data) {
129  std::vector<std::string> document_ids;
130  std::map<std::string, std::string> statuses;
131  STATUS status = loadDocIdsFromJSON(data, document_ids);
132  for(auto document_id : document_ids) {
133  del(document_id);
134  statuses[document_id] = Poco::NumberFormatter::format(getLastError());
138  //status |= getLastError();
139  status |= ACTION_SUCCESS;
140  }
141  Poco::SharedPtr<Response> response(new Response(statuses,status));
142  return response;
143 }
144 
145 
149 Poco::SharedPtr<Response> ORMFunctionalObject::checkData(const std::string& data) {
150  std::vector<std::string> document_ids;
151  std::map<std::string, std::string> statuses;
152  STATUS status = loadDocIdsFromJSON(data, document_ids);
153  for(auto document_id : document_ids) {
154  get(document_id);
155  statuses[document_id] = Poco::NumberFormatter::format(getLastError());
159  //status |= getLastError();
160  status |= DOCUMENT_PRESENT;
161  }
162  Poco::SharedPtr<Response> response(new Response(statuses,status));
163  return response;
164 }
165 
166 
170 Poco::SharedPtr<Response> ORMFunctionalObject::adminData(const std::string& data) {
171  std::vector<std::string> command_ids;
172  std::map<std::string, std::string> statuses;
173  STATUS status = loadDocIdsFromJSON(data, command_ids);
174  for(auto command_id : command_ids) {
175  try {
176  switch(static_cast<CommandId>(Poco::NumberParser::parse(command_id))) {
177  case CommandId::DB_ENGINE_NAME:
178  statuses[command_id] = getDBEngine();
179  status |= ACTION_SUCCESS;
180  break;
184  default: break;
185  }
186  }
187  catch (Poco::SyntaxException& ex) {
188  status |= INVALID_ADMIN_COMMAND;
189  }
190  }
191  Poco::SharedPtr<Response> response(new Response(statuses,status));
192  return response;
193 }
194 
198 STATUS ORMFunctionalObject::loadResourcesFromJSON(const std::string& json, std::map<std::string, std::string>& resources) {
199 #ifdef _DEBUG_
200  Poco::Message msg ("ORMFunctionalObject",json,Poco::Message::PRIO_INFORMATION,__FILE__,__LINE__);
202 #endif
203 
204  STATUS actionStatus = INVALID_MESSAGE_TYPE;
205  try {
206  Poco::JSON::Array::Ptr obj;
207  Poco::JSON::Parser parser;
208  Poco::Dynamic::Var result = parser.parse(json);
209  if (result.type()==typeid(Poco::JSON::Object::Ptr)) {
210  std::string documents = result.extract<Poco::JSON::Object::Ptr>()->getValue<std::string>("documents");
211  parser.reset();
212  Poco::Dynamic::Var docs = parser.parse(documents);
213  if (docs.type()==typeid(Poco::JSON::Object::Ptr)) {
214  std::vector<std::string> keys;
215  Poco::JSON::Object::Ptr pdocs = docs.extract<Poco::JSON::Object::Ptr>();
216  pdocs->getNames(keys);
217  for(auto key:keys) {
218  std::string base64_encode = pdocs->getValue<std::string>(key);
219  std::string value = HCE::decodeBase64(base64_encode);
220  resources[key] = value;
221  }
222  actionStatus = ACTION_SUCCESS;
223  }
224  }
225  }
226  catch(const Poco::JSON::JSONException& jsone) {
227  Poco::Message msg ("ORMFunctionalObject",jsone.displayText(),Poco::Message::PRIO_CRITICAL,__FILE__,__LINE__);
229  actionStatus = ACTION_PARSE_ERROR;
230  }
231  return actionStatus;
232 }
233 
234 
239 STATUS ORMFunctionalObject::loadDocIdsFromJSON(const std::string& json, std::vector<std::string>& resources) {
240 
241 #ifdef _DEBUG_
242  Poco::Message msg ("ORMFunctionalObject",json,Poco::Message::PRIO_INFORMATION,__FILE__,__LINE__);
244 #endif
245 
246  STATUS actionStatus = INVALID_MESSAGE_TYPE;
247  try {
248  Poco::JSON::Array::Ptr obj;
249  Poco::JSON::Parser parser;
250  Poco::Dynamic::Var result = parser.parse(json);
251  if (result.type()==typeid(Poco::JSON::Object::Ptr)) {
252  std::string documents = result.extract<Poco::JSON::Object::Ptr>()->getValue<std::string>("documents");
253  parser.reset();
254  Poco::Dynamic::Var docs = parser.parse(documents);
255  if (docs.type()==typeid(Poco::JSON::Array::Ptr)) {
256  Poco::JSON::Array::Ptr pdocs = docs.extract<Poco::JSON::Array::Ptr>();
257  resources.reserve(pdocs->size());
258  for(unsigned i=0; i<pdocs->size(); ++i) {
259  resources.push_back(pdocs->get(i).extract<std::string>());
260  }
261  actionStatus = ACTION_SUCCESS;
262  }
263  }
264  }
265  catch(Poco::JSON::JSONException& jsone) {
266  Poco::Message msg ("Application",jsone.displayText(),Poco::Message::PRIO_CRITICAL,__FILE__,__LINE__);
268  actionStatus = ACTION_PARSE_ERROR;
269  }
270  return actionStatus;
271 }
272 
276 void ORMFunctionalObject::init_command()
277 {
278  this->_status = ACTION_SUCCESS;
279  try {
280  command.push_back(&HCE::ORMFunctionalObject::putData);
281  command.push_back(&HCE::ORMFunctionalObject::getData);
282  command.push_back(&HCE::ORMFunctionalObject::delData);
283  command.push_back(&HCE::ORMFunctionalObject::checkData);
284  command.push_back(&HCE::ORMFunctionalObject::adminData);
285  }
286  catch (const std::exception& ex) {
287  Poco::Message msg_ex ("ORMFunctionalObject",ex.what(),Poco::Message::PRIO_CRITICAL,__FILE__,__LINE__);
288  HCE::Logger::writeLog(msg_ex);
289  this->_status = ACTION_GENERAL_FAILURE;
290  }
291 }
292 
293 }