Skip to content

Commit

Permalink
* return DroiError if callServer fails directly
Browse files Browse the repository at this point in the history
* Add Http error msg if network timeout
* Add some error-handling
  • Loading branch information
James committed May 24, 2017
1 parent 151cc12 commit 9cc2ebd
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 41 deletions.
79 changes: 42 additions & 37 deletions CloudStorageDBHelper.cpp
Expand Up @@ -97,7 +97,7 @@ RefVector* CloudStorageDBHelper::query( DroiMultimap<Ref*>* commands, DroiError*
int offset = getOffsetLimit(commands, DroiQuery::OFFSET);
int limit = getOffsetLimit(commands, DroiQuery::LIMIT);
string queryString = combineQuery(where, order, offset, limit);
if (queryString.size() <= 0) {
if ( queryString.size() <= 0 ) {
err = DroiError::createDroiError( DROICODE_ERROR, "make query fail.");
if ( error != nullptr )
*error = err;
Expand All @@ -107,6 +107,12 @@ RefVector* CloudStorageDBHelper::query( DroiMultimap<Ref*>* commands, DroiError*
std::string url = DroiRESTfulAPIDefinition::CRUD + "/" + className + "?" + queryString;
std::string res = DroiRemoteServiceHelper::callServer(string(url), cocos2d::network::HttpRequest::Type::GET, nullptr, &err);

if ( !err.isOk() ) {
if ( error != nullptr )
*error = err;
return nullptr;
}

if ( !res.empty() ) {
RefPtrAutoReleaser<RefMap> resultDict = cJSONHelper::fromJSON( res );
if ( resultDict != nullptr ) {
Expand Down Expand Up @@ -309,12 +315,12 @@ DroiError CloudStorageDBHelper::deleteInternal( DroiObject* obj, const std::stri
RefPtrAutoReleaser<DroiObject> obj = translateResponse(res);
int code = -1;
obj->getValue(DROI_KEY_JSON_CODE, code);
if (code != 0) {
if (code == DROITOKENINVALID)
if ( code != 0 ) {
if ( code == DROITOKENINVALID )
DroiUser::cleanUp();
std::string ticket;
bool existed = obj->getValue(DROI_KEY_JSON_TICKET, ticket);
if (!existed) ticket = "";
if ( !existed ) ticket = "";
err = DroiError::createDroiError( (DroiErrorCode) code, ticket, std::string("Delete fails, code: ").append(std::to_string(code)));
} else {
err = DroiError::createDroiError(DROICODE_OK, "", "");
Expand All @@ -333,23 +339,26 @@ DroiError CloudStorageDBHelper::save( DroiObject* obj, const std::string& tableN

DroiError err;
std::string objStr;
if(obj->toJson(objStr) == false) {
if ( obj->toJson(objStr) == false ) {
return DroiError::createDroiError(DROICODE_ERROR, "", "Cannot conver target to Json string");
}
RefPtrAutoReleaser<RefValue> target = new RefValue(Value(objStr));

std::string url = DroiRESTfulAPIDefinition::CRUD + "/" + tableName + "/" + obj->objectId();
std::string res = DroiRemoteServiceHelper::callServer(string(url), cocos2d::network::HttpRequest::Type::PUT, target.get(), &err);

if ( !err.isOk() ) return err;

if ( !res.empty() ) {
RefPtrAutoReleaser<DroiObject> obj = translateResponse(res);
int code = -1;
obj->getValue(DROI_KEY_JSON_CODE, code);
if (code != 0) {
if (code == DROITOKENINVALID)
if ( code != 0 ) {
if ( code == DROITOKENINVALID )
DroiUser::cleanUp();
std::string ticket;
bool existed = obj->getValue(DROI_KEY_JSON_TICKET, ticket);
if (!existed) ticket = "";
if ( !existed ) ticket = "";
err = DroiError::createDroiError( (DroiErrorCode) code, ticket, std::string("Save fails, code: ").append(std::to_string(code)));
} else {
err = DroiError::createDroiError(DROICODE_OK, "", "");
Expand All @@ -375,7 +384,7 @@ RefMap* CloudStorageDBHelper::travel(DroiCondition* cond)
for ( ; iter != conditions->end(); ++iter) {
if ( dynamic_cast<RefVector*>( *iter) != nullptr) {
values->pushBack(*iter);
} else if (dynamic_cast<DroiCondition*>(*iter) != nullptr) {
} else if ( dynamic_cast<DroiCondition*>(*iter) != nullptr ) {
RefPtrAutoReleaser<RefMap> input = travel(dynamic_cast<DroiCondition*>(*iter) );
values->pushBack( input );
}
Expand All @@ -391,51 +400,47 @@ DroiObject* CloudStorageDBHelper::translateResponse(std::string res)
{
DroiObject* object = DroiObject::createObject("DROIRESTful");
RefPtrAutoReleaser<RefMap> jsonMap = dynamic_cast<RefMap*>(cJSONHelper::fromJSON(res));
// if ( jsonMap == nullptr ) {
// CCLOG( "%s", res.c_str() );
// return nullptr;
// }
RefValue* refCode = nullptr;
RefValue* refTicket = nullptr;
RefMap::const_iterator it = jsonMap->find(DROI_KEY_JSON_CODE);
if ( it != jsonMap->end() ) {
if (dynamic_cast<RefValue*>(it->second) != nullptr) {
if ( dynamic_cast<RefValue*>(it->second) != nullptr ) {
refCode = dynamic_cast<RefValue*>(it->second);
}
}

it = jsonMap->find(DROI_KEY_JSON_TICKET);
if ( it != jsonMap->end() ) {
if (dynamic_cast<RefValue*>(it->second) != nullptr) {
if ( dynamic_cast<RefValue*>(it->second) != nullptr ) {
refTicket = dynamic_cast<RefValue*>(it->second);
}
}

//TODO
int code = -1;
if (refCode != nullptr)
if ( refCode != nullptr )
code = refCode->asInt();
object->setValue(DROI_KEY_JSON_CODE, code);
if (refTicket != nullptr)
if ( refTicket != nullptr )
object->setValue(DROI_KEY_JSON_TICKET, refTicket->asString());

return object;
}

std::string CloudStorageDBHelper::generateWhere(DroiMultimap<Ref*>* commands ) {
std::string data("");
if (!commands->containsKey(DroiQuery::WHERE))
if ( !commands->containsKey(DroiQuery::WHERE) )
return data;

Ref* element = getFirstElement(commands, DroiQuery::WHERE);
DroiCondition* cond = getSingleCondition(&element);

if (cond != nullptr) {
if ( cond != nullptr ) {
RefPtrAutoReleaser<RefMap> obj = new RefMap();
std::string type = cond->getType();
RefVector* conditions = cond->getValue();

if (type.compare(DroiQuery::COND) == 0) {
if ( type.compare(DroiQuery::COND) == 0 ) {
RefVector* oriArgs = dynamic_cast<RefVector*>(conditions->at(0));
RefPtrAutoReleaser<RefVector> args = convertArgumentsFormat( oriArgs );
RefPtrAutoReleaser<RefMap> cond = new RefMap();
Expand All @@ -455,25 +460,25 @@ std::string CloudStorageDBHelper::generateWhere(DroiMultimap<Ref*>* commands ) {

std::string CloudStorageDBHelper::generateOrder(DroiMultimap<Ref*>* commands ) {
std::string data("");
if (!commands->containsKey(DroiQuery::ORDERBY))
if ( !commands->containsKey(DroiQuery::ORDERBY) )
return data;

RefVector* list = commands->getValue(DroiQuery::ORDERBY);
if (list == nullptr || list->size() < 1)
if ( list == nullptr || list->size() < 1 )
return data;

RefVector::iterator it = list->begin();
for (; it != list->end(); ++it) {
for ( ; it != list->end(); ++it ) {
Ref* current = dynamic_cast<Ref*>(*it);
if (current == nullptr)
if ( current == nullptr )
continue;
DroiMapEntry<Ref*>* entry = nullptr;

if (dynamic_cast<DroiMapEntry<Ref*>*>(current) != nullptr)
if ( dynamic_cast<DroiMapEntry<Ref*>*>(current) != nullptr )
entry = dynamic_cast<DroiMapEntry<Ref*>*>(current);

RefValueVector* target = dynamic_cast<RefValueVector*>(entry->Value());
if (DroiQuery::DESC.compare(target->at(1).asString()) == 0)
if ( DroiQuery::DESC.compare(target->at(1).asString()) == 0 )
data.append("-");
data.append(target->at(0).asString());
data.append(",");
Expand All @@ -486,17 +491,17 @@ std::string CloudStorageDBHelper::generateOrder(DroiMultimap<Ref*>* commands ) {

int CloudStorageDBHelper::getOffsetLimit(DroiMultimap<Ref*>* commands, std::string keyName) {
int res = 0;
if (!commands->containsKey(keyName))
if ( !commands->containsKey(keyName) )
return res;

Ref* element = getFirstElement(commands, keyName);
RefValue* val = nullptr;
DroiMapEntry<Ref*>* entry = nullptr;

if (dynamic_cast<DroiMapEntry<Ref*>*>(element) != nullptr)
if ( dynamic_cast<DroiMapEntry<Ref*>*>(element) != nullptr )
entry = dynamic_cast<DroiMapEntry<Ref*>*>(element);

if (entry != nullptr && dynamic_cast<RefValue*>(entry->Value()) != nullptr)
if ( entry != nullptr && dynamic_cast<RefValue*>(entry->Value()) != nullptr )
val = dynamic_cast<RefValue*>(entry->Value());

res = val->asInt();
Expand All @@ -507,7 +512,7 @@ int CloudStorageDBHelper::getOffsetLimit(DroiMultimap<Ref*>* commands, std::stri

Ref* CloudStorageDBHelper::getFirstElement(DroiMultimap<Ref*>* commands, std::string keyName) {
RefVector* vec = commands->getValue(keyName);
if (vec->size() != 1)
if ( vec->size() != 1 )
return nullptr;

return vec->at(0);
Expand All @@ -517,10 +522,10 @@ DroiCondition* CloudStorageDBHelper::getSingleCondition(Ref** input) {
DroiCondition* cond = nullptr;
DroiMapEntry<Ref*>* entry = nullptr;

if (dynamic_cast<DroiMapEntry<Ref*>*>(*input) != nullptr)
if ( dynamic_cast<DroiMapEntry<Ref*>*>(*input) != nullptr )
entry = dynamic_cast<DroiMapEntry<Ref*>*>(*input);

if (entry != nullptr && dynamic_cast<DroiCondition*>(entry->Value()) != nullptr)
if ( entry != nullptr && dynamic_cast<DroiCondition*>(entry->Value()) != nullptr )
cond = dynamic_cast<DroiCondition*>(entry->Value());

return cond;
Expand All @@ -529,11 +534,11 @@ DroiCondition* CloudStorageDBHelper::getSingleCondition(Ref** input) {

RefVector* CloudStorageDBHelper::convertArgumentsFormat(RefVector* args ) {
RefVector* newArgs = new RefVector(*args);
if (args->size() <= 2)
if ( args->size() <= 2 )
return args;

Ref* arg = args->at(2);
if ( dynamic_cast<DroiDateTime*>(arg) != nullptr) {
if ( dynamic_cast<DroiDateTime*>(arg) != nullptr ) {
DroiDateTime* dt = dynamic_cast<DroiDateTime*>( args->at(2) );
RefValue* tm = new RefValue( Value(dt->toISO8601String()) );
newArgs->replace(2, tm);
Expand All @@ -544,16 +549,16 @@ RefVector* CloudStorageDBHelper::convertArgumentsFormat(RefVector* args ) {

std::string CloudStorageDBHelper::combineQuery(std::string where, std::string order, int offset, int limit) {
std::string sb("");
if (where.size() < 1 && order.size() < 1)
if ( where.size() < 1 && order.size() < 1 )
return sb;

if (where.size() >= 1) {
if ( where.size() >= 1 ) {
sb.append("where=");
sb.append(DroiHelper::url_encode(where));
sb.append(("&"));
}

if (order.size() >= 1) {
if ( order.size() >= 1 ) {
sb.append("order=");
sb.append(DroiHelper::url_encode(order));
sb.append("&");
Expand Down
8 changes: 8 additions & 0 deletions CloudUserStorageDBHelper.cpp
Expand Up @@ -77,6 +77,12 @@ RefVector* CloudUserStorageDBHelper::query( DroiMultimap<Ref*>* commands, DroiEr
std::string url = ((tableName.compare("_User") == 0) ? DroiRESTfulAPIDefinition::USERS : DroiRESTfulAPIDefinition::GROUPS) + "?" + queryString;
std::string res = DroiRemoteServiceHelper::callServer(string(url), cocos2d::network::HttpRequest::Type::GET, nullptr, &err);

if ( !err.isOk() ) {
if (error != nullptr)
*error = err;
return nullptr;
}

if ( !res.empty() ) {
RefPtrAutoReleaser<RefMap> resultDict = cJSONHelper::fromJSON( res );
if ( resultDict != nullptr ) {
Expand Down Expand Up @@ -290,6 +296,8 @@ DroiError CloudUserStorageDBHelper::save( DroiObject* obj, const std::string& ta
std::string url = ((tableName.compare("_User") == 0) ? DroiRESTfulAPIDefinition::USERS : DroiRESTfulAPIDefinition::GROUPS) + "/" + obj->objectId();
std::string res = DroiRemoteServiceHelper::callServer(string(url), cocos2d::network::HttpRequest::Type::PUT, jsonObject.get(), &err);

if ( !err.isOk() ) return err;

if ( !res.empty() ) {
RefPtrAutoReleaser<DroiObject> obj = CloudStorageDBHelper::translateResponse(res);
int code = -1;
Expand Down
1 change: 1 addition & 0 deletions DroiCallback.h
Expand Up @@ -6,6 +6,7 @@
#ifndef DroiCallback_hpp
#define DroiCallback_hpp
#include "base/CCRef.h"
#include "DroiError.h"
#include <functional>

template <typename T> struct DroiCallback {
Expand Down
15 changes: 13 additions & 2 deletions DroiHttp.cpp
Expand Up @@ -24,6 +24,11 @@ long DroiHttpResponse::getHttpCode()
return _httpcode;
}

std::string DroiHttpResponse::getHttpError()
{
return _http_error;
}

std::string DroiHttpResponse::getTicket()
{
return _ticket;
Expand Down Expand Up @@ -90,6 +95,7 @@ void DroiHttp::initResponseCallbacks() {
if (!response->isSucceed()) {
log("response failed");
log("error buffer: %s", response->getErrorBuffer());
res->_http_error = response->getErrorBuffer();
std::unique_lock<std::mutex> lock(*res->locker);
cond->notify_all();
return;
Expand Down Expand Up @@ -200,6 +206,8 @@ void DroiHttp::requestImpl(DroiHttpRequest* req, DroiError* err)

std::string deviceIdToString(long long high, long long low)
{
if ( high == 0 && low == 0 )
return "";
char tmp[36];
sprintf(tmp, "%016llX%016llX", high, low);
std::string res(tmp);
Expand All @@ -217,10 +225,13 @@ DeviceId DroiHttp::getDeviceId()
std::string tmp(DroiCore::DroiEntry);
tmp.append(DroiRESTfulAPIDefinition::REG_DEVICE);
RefPtrAutoReleaser<DroiHttpRequest> request = DroiHttpRequest::requestWithService(tmp, "", cocos2d::network::HttpRequest::Type::GET);

RefPtrAutoReleaser<DroiHttpResponse> resp = this->sendRequest(request, &err);
if ( request.get() == nullptr )
return "";

RefPtrAutoReleaser<DroiHttpResponse> resp = this->sendRequest(request, &err);
RefPtrAutoReleaser<RefVector> map = cJSONHelper::fromJSONToVector(resp->getData());
if ( map.get() == nullptr || map->size() < 2 )
return "";
long long high = atoll(dynamic_cast<RefValue*>(map->at(0))->asString().c_str());
long long low = atoll(dynamic_cast<RefValue*>(map->at(1))->asString().c_str());

Expand Down
2 changes: 2 additions & 0 deletions DroiHttp.h
Expand Up @@ -30,10 +30,12 @@ class DroiHttpResponse : public Ref
std::string getData();
long getHttpCode();
std::string getTicket();
std::string getHttpError();

private:
friend class DroiHttp;
long _httpcode;
std::string _http_error;
std::string _data;
std::string _ticket;
std::string tag;
Expand Down
7 changes: 5 additions & 2 deletions DroiRemoteServiceHelper.cpp
Expand Up @@ -232,6 +232,8 @@ RefValue* DroiLoginOutput::getExpire()

bool DroiLoginOutput::isSuccessful()
{
if ( expireIn.get() == nullptr )
return false;
std::chrono::milliseconds expire(0);
if (expireIn != nullptr)
DroiDateTime::isValidISO8601String(expireIn->asString().c_str(), expire);
Expand Down Expand Up @@ -396,7 +398,7 @@ DroiError DroiRemoteServiceHelper::translateResponseError(DroiHttpResponse* resp
errorCode = DroiErrorCode:: DROICODE_SERVICE_NOT_ALLOWED;
} else {
errorCode = DroiErrorCode::DROICODE_HTTP_SERVER_ERROR;
appendedMessage.append("HttpStatus ").append(std::to_string(httpCode));
appendedMessage.append("HttpStatus ").append(std::to_string(httpCode).append(", error buffer: ").append(response->getHttpError()));
}
}

Expand Down Expand Up @@ -430,8 +432,9 @@ DroiSignUpOutput* DroiRemoteServiceHelper::signUp(DroiSignUpBody* body, DroiErro
DroiLoginOutput* DroiRemoteServiceHelper::login(DroiLoginBody* body, DroiError* err)
{
RefPtrAutoReleaser<RefMap> ref = body->toJson();
if (ref.get() == NULL) {
if (ref.get() == nullptr ) {
if (err != nullptr) *err = DroiError::createDroiError(DROICODE_ERROR, "", "gen data fail.");
return nullptr;
}

return DroiLoginOutput::fromJson(DroiRemoteServiceHelper::callServer(DroiRESTfulAPIDefinition::USER_LOGIN, cocos2d::network::HttpRequest::Type::POST, ref, err));
Expand Down
1 change: 1 addition & 0 deletions DroiUser.cpp
Expand Up @@ -70,6 +70,7 @@ DroiUser* DroiUser::login( const std::string& userId, const std::string& passwor
RefPtrAutoReleaser<DroiLoginOutput> loginOut = DroiRemoteServiceHelper::login(loginBody, &e);
if (!e.isOk()) {
if (error != nullptr) *error = e;
return nullptr;
}

if (!loginOut->isSuccessful()) {
Expand Down

0 comments on commit 9cc2ebd

Please sign in to comment.