/*
* Copyright (C) 2019-2020 HERE Europe B.V.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
* License-Filename: LICENSE
*/
#include "WriteExample.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace olp::dataservice::write;
using namespace olp::dataservice::write::model;
namespace {
const std::string kData("hello world"); // data to write
constexpr auto kLogTag = "write-example";
constexpr size_t kPublishRequestsSize = 5u;
} // namespace
int RunExampleWrite(const AccessKey& access_key, const std::string& catalog,
const std::string& layer_id) {
auto buffer = std::make_shared(std::begin(kData),
std::end(kData));
// Create a task scheduler instance
std::shared_ptr task_scheduler =
olp::client::OlpClientSettingsFactory::CreateDefaultTaskScheduler(1u);
// Create a network client
std::shared_ptr http_client = olp::client::
OlpClientSettingsFactory::CreateDefaultNetworkRequestHandler();
// Initialize authentication settings
olp::authentication::Settings settings({access_key.id, access_key.secret});
settings.task_scheduler = std::move(task_scheduler);
settings.network_request_handler = http_client;
// Setup AuthenticationSettings with a default token provider that will
// retrieve an OAuth 2.0 token from OLP.
olp::client::AuthenticationSettings auth_settings;
auth_settings.provider =
olp::authentication::TokenProviderDefault(std::move(settings));
// Setup OlpClientSettings and provide it to the StreamLayerClient.
olp::client::OlpClientSettings client_settings;
client_settings.authentication_settings = auth_settings;
client_settings.network_request_handler = std::move(http_client);
auto stream_client_settings = StreamLayerClientSettings{};
auto client = std::make_shared(
olp::client::HRN{catalog}, std::move(stream_client_settings),
std::move(client_settings));
// Create a publish data request
auto request = PublishDataRequest().WithData(buffer).WithLayerId(layer_id);
// Single publish to stream layer
{
// Write data to OLP Stream Layer using StreamLayerClient
auto future_response = client->PublishData(request);
// Wait for response
auto response = future_response.GetFuture().get();
// Check the response
if (!response.IsSuccessful()) {
OLP_SDK_LOG_ERROR_F(kLogTag,
"Error writing data - HTTP Status: %d Message: %s",
response.GetError().GetHttpStatusCode(),
response.GetError().GetMessage().c_str());
return -1;
}
OLP_SDK_LOG_INFO_F(kLogTag, "Publish Successful - TraceID: %s",
response.GetResult().GetTraceID().c_str());
}
// Multi-publish to stream layer
{
// Queue publish requests to be uploaded on Flush
for (size_t idx = 0; idx < kPublishRequestsSize; ++idx) {
auto status = client->Queue(request);
if (status) {
OLP_SDK_LOG_ERROR_F(kLogTag, "Queue failed - %s", status->c_str());
return -1;
}
}
// Flush and wait for uploading
auto flush_request = FlushRequest();
auto future_response = client->Flush(std::move(flush_request));
auto responses = future_response.GetFuture().get();
if (responses.empty()) {
OLP_SDK_LOG_ERROR_F(kLogTag, "Error on Flush()");
return -1;
}
// Check all publishes succeeded
for (auto response : responses) {
if (!response.IsSuccessful()) {
OLP_SDK_LOG_ERROR_F(kLogTag,
"Error flushing data - HTTP Status: %d Message: %s",
response.GetError().GetHttpStatusCode(),
response.GetError().GetMessage().c_str());
return -1;
}
OLP_SDK_LOG_INFO_F(kLogTag, "Flush Successful - TraceID: %s",
response.GetResult().GetTraceID().c_str());
}
}
return 0;
}