std::vector<std::pair<std::string, std::string> >* Object::getExistingMetaData() { SwiftResult<int*>* metadata = this->swiftShowMetadata(nullptr, false); if (metadata == nullptr){ delete metadata; metadata = nullptr; return nullptr; } if (metadata->getResponse() == nullptr){ delete metadata; metadata = nullptr; return nullptr; } std::vector<std::pair<std::string, std::string> >* result = new std::vector< std::pair<std::string, std::string> >(); NameValueCollection::ConstIterator it = metadata->getResponse()->begin(); while (it != metadata->getResponse()->end()) { string key = it->first; if (it->first.find("X-Object-Meta-") != string::npos) { key = it->first.substr(strlen("X-Object-Meta-")); result->push_back(make_pair(key, it->second)); } ++it; } delete metadata; metadata = nullptr; return result; }
inline SwiftResult<T>* returnNullError(const string &whatsNull) { SwiftResult<T> *result = new SwiftResult<T>(); SwiftError error(SwiftError::SWIFT_FAIL, whatsNull + " is NULL"); result->setError(error); result->setResponse(nullptr); result->setPayload(nullptr); return result; }
Completion *CompletionBuilder::finish() { SwiftResult base = current; llvm::SmallString<64> nameStorage; StringRef name = getOriginalName(); if (modified) { // We've modified the original result, so build a new one. auto opKind = CodeCompletionOperatorKind::None; if (current.isOperator()) opKind = current.getOperatorKind(); if (current.getKind() == SwiftResult::Declaration) { base = SwiftResult( semanticContext, current.getNumBytesToErase(), completionString, current.getAssociatedDeclKind(), current.getModuleName(), isNotRecommended, notRecommendedReason, current.getBriefDocComment(), current.getAssociatedUSRs(), current.getDeclKeywords(), opKind); } else { base = SwiftResult(current.getKind(), semanticContext, current.getNumBytesToErase(), completionString, current.getExpectedTypeRelation(), opKind); } llvm::raw_svector_ostream OSS(nameStorage); getFilterName(base.getCompletionString(), OSS); name = OSS.str(); } llvm::SmallString<64> description; { llvm::raw_svector_ostream OSS(description); getDescription(&base, OSS, /*leadingPunctuation*/ true); } auto *result = new (sink.allocator) Completion(std::move(base), copyString(sink.allocator, name), copyString(sink.allocator, description)); result->moduleImportDepth = moduleImportDepth; result->popularityFactor = popularityFactor; result->opaqueCustomKind = customKind; return result; }
SwiftResult<HTTPClientSession*>* Object::swiftCreateReplaceObject(std::ostream* &outputStream, std::vector<HTTPHeader>* _uriParams, std::vector<HTTPHeader>* _reqMap) { //Check Container if (container == nullptr) return returnNullError<HTTPClientSession*>("container"); if (container->getAccount() == nullptr) return returnNullError<HTTPClientSession*>("account"); Endpoint* swiftEndpoint = container->getAccount()->getSwiftService()->getFirstEndpoint(); if (swiftEndpoint == nullptr) return returnNullError<HTTPClientSession*>("SWIFT Endpoint"); //Create parameter map vector<HTTPHeader> reqParamMap; //Add authentication token string tokenID = container->getAccount()->getToken()->getId(); HTTPHeader authHeader("X-Auth-Token", tokenID); reqParamMap.push_back(authHeader); //Push Chuncked Encoding HTTPHeader encHeader("Transfer-Encoding", "chunked"); reqParamMap.push_back(encHeader); //Add rest of request Parameters if (_reqMap != nullptr && _reqMap->size() > 0) { for (uint i = 0; i < _reqMap->size(); i++) { reqParamMap.push_back(_reqMap->at(i)); } } //Path string path = container->getName() + "/" + name; URI uri(swiftEndpoint->getPublicUrl()); string encoded; URI::encode(path,"",encoded); path = encoded; uri.setPath(uri.getPath() + "/" + path); if (_uriParams != nullptr && _uriParams->size() > 0) { //Create appropriate URI ostringstream queryStream; for (uint i = 0; i < _uriParams->size(); i++) { if (i > 0) queryStream << ","; queryStream << _uriParams->at(i).getQueryValue(); } uri.setQuery(queryStream.str()); //cout << uri.toString() << endl; } //Creating HTTP Session HTTPClientSession *httpSession = nullptr; try { /** This operation does not accept a request body. **/ httpSession = doHTTPIO(uri, HTTPRequest::HTTP_PUT, &reqParamMap, outputStream); //Now we should increase number of calls to SWIFT API container->getAccount()->increaseCallCounter(); } catch (Exception &e) { SwiftResult<HTTPClientSession*> *result = new SwiftResult<HTTPClientSession*>(); SwiftError error(SwiftError::SWIFT_EXCEPTION, e.displayText()); result->setError(error); //Try to set HTTP Response as the payload result->setSession(httpSession); result->setResponse(nullptr); result->setPayload(nullptr); return result; } //Everything seems fine SwiftResult<HTTPClientSession*> *result = new SwiftResult<HTTPClientSession*>(); result->setError(SWIFT_OK); result->setSession(httpSession); result->setResponse(nullptr); result->setPayload(httpSession); return result; }
SwiftResult<vector<Object>*>* Container::swiftGetObjects(bool _newest) { SwiftResult<istream*> *objectList = this->swiftListObjects(HEADER_FORMAT_APPLICATION_JSON,nullptr,_newest); SwiftResult<vector<Object>*> *result = new SwiftResult<vector<Object>*>(); result->setError(objectList->getError()); result->setResponse(nullptr); result->setSession(nullptr); //Check error if(objectList->getError().code != SWIFT_OK.code) { result->setPayload(nullptr); delete objectList; return result; } //Parse JSON Json::Value root; // will contains the root value after parsing. Json::Reader reader; bool parsingSuccessful = reader.parse(*objectList->getPayload(), root, false); if (!parsingSuccessful) { SwiftError error(SwiftError::SWIFT_JSON_PARSE_ERROR, reader.getFormattedErrorMessages()); result->setError(error); result->setPayload(nullptr); delete objectList; return result; } //Allocate containers vector<Object>*objects = new vector<Object>(); //Successful parse for(unsigned int i=0;i<root.size();i++) { string name = root[i].get("name","").asString(); size_t length = root[i].get("bytes", -1).asInt64(); string content_type = root[i].get("content_type","").asString(); string hash = root[i].get("hash","").asString(); string last_modified = root[i].get("last_modified","").asString(); //Create new object Object object(this,name,length,content_type,hash,last_modified); objects->push_back(object); } //Set payload result->setPayload(objects); delete objectList; return result; }
SwiftResult<T>* doSwiftTransaction(Account *_account, std::string &_uriPath, const std::string &_method, std::vector<HTTPHeader>* _uriParams, std::vector<HTTPHeader>* _reqMap, std::vector<int> *_httpValidCodes, const char *bodyReqBuffer, ulong size, std::string *contentType) { //Start locking lock_guard<recursive_mutex> guard(transactionMutex); //Start of function if (_account == nullptr) return returnNullError<T>("account"); Endpoint* swiftEndpoint = _account->getSwiftService()->getFirstEndpoint(); if (swiftEndpoint == nullptr) return returnNullError<T>("SWIFT Endpoint"); //Create parameter map vector<HTTPHeader> reqParamMap; //Add authentication token string tokenID = _account->getToken()->getId(); HTTPHeader authHeader("X-Auth-Token", tokenID); reqParamMap.push_back(authHeader); //Add rest of request Parameters if (_reqMap != nullptr && _reqMap->size() > 0) { for (uint i = 0; i < _reqMap->size(); i++) { reqParamMap.push_back(_reqMap->at(i)); } } URI uri(swiftEndpoint->getPublicUrl()); string encoded; URI::encode(_uriPath,"",encoded); _uriPath = encoded; if (uri.getPath().size() > 0) uri.setPath(uri.getPath() + "/" + _uriPath); else uri.setPath(_uriPath); if (_uriParams != nullptr && _uriParams->size() > 0) { //Create appropriate URI ostringstream queryStream; //queryStream << "?"; for (uint i = 0; i < _uriParams->size(); i++) { if (i > 0) queryStream << ","; queryStream << _uriParams->at(i).getQueryValue(); } uri.setQuery(queryStream.str()); } //Creating HTTP Session HTTPResponse *httpResponse = new HTTPResponse(); HTTPClientSession *httpSession = nullptr; istream* resultStream = nullptr; try { /** This operation does not accept a request body. **/ if (bodyReqBuffer == nullptr) httpSession = doHTTPIO(uri, _method, &reqParamMap); else { if (contentType != nullptr) httpSession = doHTTPIO(uri, _method, &reqParamMap, bodyReqBuffer, size, *contentType); else httpSession = doHTTPIO(uri, _method, &reqParamMap, bodyReqBuffer, size,""); } //Now we should increase number of calls to SWIFT API _account->increaseCallCounter(); if (std::is_same<T, std::istream*>::value) resultStream = &httpSession->receiveResponse(*httpResponse); else httpSession->receiveResponse(*httpResponse); } catch (Exception &e) { SwiftResult<T> *result = new SwiftResult<T>(); SwiftError error(SwiftError::SWIFT_EXCEPTION, e.displayText()); result->setError(error); //Try to set HTTP Response as the payload result->setSession(httpSession); result->setResponse(httpResponse); result->setPayload(nullptr); return result; } /** * Check HTTP return code */ bool valid = false; for (uint i = 0; i < _httpValidCodes->size(); i++) if (_httpValidCodes->at(i) == httpResponse->getStatus()) { valid = true; break; } if (!valid) { cout<<"Invalid Return code:"; httpResponse->write(cout); if(httpResponse->getStatus() == 200) cerr<<"bullshit"<<endl; if(httpResponse->getStatus() == HTTPResponse::HTTP_UNAUTHORIZED) { if(_account->reAuthenticate()) { delete httpSession;httpSession = nullptr; delete httpResponse;httpResponse = nullptr; return doSwiftTransaction<T>(_account, _uriPath,_method, _uriParams, _reqMap, _httpValidCodes, bodyReqBuffer, size, contentType); } } SwiftResult<T> *result = new SwiftResult<T>(); string errorText = "Code:"; errorText+= httpResponse->getStatus()+"\tReason:"+httpResponse->getReason(); SwiftError error(SwiftError::SWIFT_HTTP_ERROR, errorText); result->setError(error); result->setSession(httpSession); result->setResponse(httpResponse); result->setPayload(nullptr); return result; } //Everything seems fine SwiftResult<T> *result = new SwiftResult<T>(); result->setError(SWIFT_OK); result->setSession(httpSession); result->setResponse(httpResponse); result->setPayload((T)resultStream); //Cleanup return result; }
int main(int argc, char** argv) { AuthenticationInfo info; info.username = "******"; info.password = "******"; info.authUrl = "http://10.42.0.83:5000/v2.0/tokens"; info.tenantName = "kos"; info.method = AuthenticationMethod::KEYSTONE; //Account Test cases SwiftResult<Account*>* authenticateResult = Account::authenticate(info); cout << "Account Test case:\n" << authenticateResult->getPayload()->toString() << endl << endl; //Get account details SwiftResult<istream*>* accountDetails = authenticateResult->getPayload()->swiftAccountDetails( HEADER_FORMAT_APPLICATION_JSON); StreamCopier::copyStream(*accountDetails->getPayload(), cout); cout << endl << endl; delete accountDetails; //Create account metadata vector<pair<string, string> > accountMetaData; accountMetaData.push_back(make_pair("Key1", "Value1")); //accountMetaData.push_back(make_pair("Key 2", "Value 2")); SwiftResult<int*>* accountMetaDataRes = authenticateResult->getPayload()->swiftCreateMetadata(accountMetaData); accountMetaDataRes->getResponse()->write(cout); cout << endl << endl; delete accountMetaDataRes; //Show account metadata accountMetaDataRes = authenticateResult->getPayload()->swiftShowMetadata(); accountMetaDataRes->getResponse()->write(cout); cout << endl << endl; delete accountMetaDataRes; //delete account metadata vector<string> accountMetaDataDeleteKeys; accountMetaDataDeleteKeys.push_back("Key 2"); accountMetaDataRes = authenticateResult->getPayload()->swiftDeleteMetadata( accountMetaDataDeleteKeys); accountMetaDataRes->getResponse()->write(cout); cout << endl << endl; delete accountMetaDataRes; //Update account metadata accountMetaData.clear(); accountMetaData.push_back(make_pair("Key 1", "Value 1 updated")); accountMetaDataRes = authenticateResult->getPayload()->swiftUpdateMetadata( accountMetaData); accountMetaDataRes->getResponse()->write(cout); cout << endl << endl; delete accountMetaDataRes; //Show account metadata accountMetaDataRes = authenticateResult->getPayload()->swiftShowMetadata(); accountMetaDataRes->getResponse()->write(cout); cout << endl << endl; delete accountMetaDataRes; //List containers SwiftResult<vector<Container>*>* containerListRes = authenticateResult->getPayload()->swiftGetContainers(); cout<<"Num of Container:"<<containerListRes->getPayload()->size()<<endl;; if(containerListRes->getError().code == SWIFT_OK.code) for(auto it=containerListRes->getPayload()->begin();it!=containerListRes->getPayload()->end();++it) cout<<"Container:"<<(*it).getName()<<endl; cout<<endl; delete containerListRes; //Container Test Cases Container container(authenticateResult->getPayload(), "Container2"); //Create container SwiftResult<int*>* containerRes = container.swiftCreateContainer(); containerRes->getResponse()->write(cout); cout << endl << endl; delete containerRes; //Container list objects test Container container2(authenticateResult->getPayload(), "Container2"); SwiftResult<vector<Object>*>* objects = container2.swiftGetObjects(true); if(objects->getError().code == SwiftError::SWIFT_OK) for (uint i = 0; i < objects->getPayload()->size(); i++) { cout << objects->getPayload()->at(i).getName() << "\tLength:" << objects->getPayload()->at(i).getLength() << "\tType:" << objects->getPayload()->at(i).getContentType() << "\tHash:" << objects->getPayload()->at(i).getHash() << "\tLastModiefied:" << objects->getPayload()->at(i).getLastModified() << endl; } delete objects; //Delete container containerRes = container.swiftDeleteContainer(); containerRes->getResponse()->write(cout); cout << endl << endl; delete containerRes; //Create Again SwiftResult<int*>*createRes = container.swiftCreateContainer(); delete createRes; //Get objects of an existing container container.setName("Container2"); SwiftResult<istream*>* containerResult = container.swiftListObjects(); if(containerResult->getError().code == SwiftError::SWIFT_OK) StreamCopier::copyStream(*containerResult->getPayload(), cout); cout << endl << endl; delete containerResult; //Create Container metadata vector<pair<string, string> > containerMetaData; containerMetaData.push_back(make_pair("Key 1", "Container Value 1")); containerMetaData.push_back(make_pair("Key 2", "container Value 2")); containerRes = container.swiftCreateMetadata(containerMetaData); containerRes->getResponse()->write(cout); cout << endl << endl; delete containerRes; //Delete Container metadata vector<string> containerMetaDataDeleteKeys; containerMetaDataDeleteKeys.push_back("Key 2"); containerRes = container.swiftDeleteMetadata(containerMetaDataDeleteKeys); containerRes->getResponse()->write(cout); cout << endl << endl; delete containerRes; //Update Container metadata containerMetaData.clear(); containerMetaData.push_back(make_pair("Key 1", "Container Value 1 updated")); containerRes = container.swiftUpdateMetadata(containerMetaData); containerRes->getResponse()->write(cout); cout << endl << endl; delete containerRes; //Show Container metadata containerRes = container.swiftShowMetadata(); containerRes->getResponse()->write(cout); cout << endl << endl; delete containerRes; //Object Test case Object object(&container, "Object2 with space"); string data = "Hello crappy World :)"; SwiftResult<int*> *objResult = object.swiftCreateReplaceObject(data.c_str(), data.length(), true); objResult->getResponse()->write(cout); cout << endl << endl; delete objResult; //Object get content SwiftResult<istream*>* objReadResult = object.swiftGetObjectContent(); if(objReadResult->getError().code == SwiftError::SWIFT_OK) StreamCopier::copyStream(*objReadResult->getPayload(), cout); cout << endl << endl; delete objReadResult; Object chucnkedObject(&container, "output-@#$%"); ostream *outStream = nullptr; SwiftResult<HTTPClientSession*> *chunkedResult = chucnkedObject.swiftCreateReplaceObject(outStream); ulong max = INT_MAX / 100000; for (ulong i = 0; i < max; i++) { *outStream << i << "\n"; if (i % 1000 == 0) { double id = i; cout << (id / (double) max) * 100 << " %" << endl; } } HTTPResponse response; chunkedResult->getPayload()->receiveResponse(response); response.write(cout); cout << endl << endl; delete chunkedResult; //Object get content SwiftResult<istream*> *readResult = chucnkedObject.swiftGetObjectContent(); //StreamCopier::copyStream(*readResult->getPayload(),cout);cout<<endl<<endl; int bufSize = 1000000; char buf[bufSize]; while (!readResult->getPayload()->eof()) readResult->getPayload()->read(buf, bufSize); delete readResult; //Copy Object SwiftResult<int*>* copyResult = chucnkedObject.swiftCopyObject( "CopyStreamObject", container); copyResult->getResponse()->write(cout); cout << endl << endl; delete copyResult; //Delete Object Object copyStreamObject(&container, "CopyStreamObject"); SwiftResult<istream*>* deleteResult = copyStreamObject.swiftDeleteObject(); if(deleteResult->getError().code == SWIFT_OK.code) StreamCopier::copyStream(*deleteResult->getPayload(), cout); cout << endl << endl; delete deleteResult; //Object create Metadata map<string, string> metaDataMap; metaDataMap.insert(make_pair("Key1", "metaData stream object Value 1")); SwiftResult<istream*>* createMetaResult = chucnkedObject.swiftCreateMetadata( metaDataMap); createMetaResult->getResponse()->write(cout); if (createMetaResult->getPayload() != nullptr) StreamCopier::copyStream(*createMetaResult->getPayload(), std::cout); cout << endl << endl; delete createMetaResult; //Object show Metadata cout << endl << endl << "MetaDataResult:" << endl; SwiftResult<int*>* metaDataShowResult = chucnkedObject.swiftShowMetadata(); metaDataShowResult->getResponse()->write(cout); cout << endl << endl; delete metaDataShowResult; //Add More Metadata metaDataMap.clear(); metaDataMap.insert(make_pair("Key2", "metaData Value 2")); metaDataMap.insert(make_pair("Key 3", "metaData Value 3")); SwiftResult<std::istream*>* objMetaRes = chucnkedObject.swiftCreateMetadata(metaDataMap); delete objMetaRes; //Update Metadata metaDataMap.clear(); metaDataMap.insert(make_pair("Key2", "Updated metaData Gholi Value 2")); objMetaRes = chucnkedObject.swiftUpdateMetadata(metaDataMap); delete objMetaRes; //Delete metadata vector<string> keysToDelete; keysToDelete.push_back("Key 3"); objMetaRes = chucnkedObject.swiftDeleteMetadata(keysToDelete); delete objMetaRes; //Object show Metadata cout << endl << endl << "MetaDataResult:" << endl; metaDataShowResult = chucnkedObject.swiftShowMetadata(); metaDataShowResult->getResponse()->write(cout); cout << endl << endl; delete metaDataShowResult; //Total number of calls to the api cout << "Total Number of Calls to the api:" << authenticateResult->getPayload()->getNumberOfCalls() << endl; delete authenticateResult; }