Files
qt-migration-legatus/qt6-after/qt6-migrated-legatus/include/rti/routing/processor/Query.hpp
T

139 lines
4.1 KiB
C++

/* $Id$
(c) Copyright, Real-Time Innovations, 2015-2016.
All rights reserved.
No duplications, whole or partial, manual or electronic, may be made
without express written permission. Any such copies, or
revisions thereof, must display this notice unaltered.
This code contains trade secrets of Real-Time Innovations, Inc.
============================================================================= */
#ifndef RTI_ROUTING_PROCESSOR_QUERY_HPP_
#define RTI_ROUTING_PROCESSOR_QUERY_HPP_
#include "routingservice/routingservice_processor.h"
#include <dds/core/Reference.hpp>
#include <rti/core/detail/SelfReference.hpp>
namespace rti { namespace routing { namespace processor {
class Input;
class QueryHolder : public rti::core::detail::RetainableType<QueryHolder>{
public:
QueryHolder() : input_(NULL), query_data_(NULL)
{
}
QueryHolder(RTI_RoutingServiceInput *input, const dds::topic::Filter& the_filter)
: input_(input),
query_data_(NULL)
{
filter(the_filter);
}
~QueryHolder()
{
if (query_data_ != NULL) {
/*
* Ignore the error. We can't throw in the destructor and this
* layer does not log anything
*/
(void) RTI_RoutingServiceInput_delete_content_query(
input_,
query_data_);
}
}
void filter(const dds::topic::Filter& filter)
{
RTI_RoutingServiceSelectorContent content =
RTI_RoutingServiceSelectorContent_INITIALIZER;
content.expression = (char *) filter.expression().c_str();
rti::core::native_conversions::to_native(
content.expression_parameters,
filter->parameters());
query_data_ = RTI_RoutingServiceInput_create_content_query(
input_,
query_data_,
&content);
DDS_StringSeq_finalize(&content.expression_parameters);
if (query_data_ == NULL) {
throw dds::core::Error("error creating content query from native input");
}
}
RTI_RoutingServiceInput *input_;
void* query_data_;
};
/** @ingroup RTI_RoutingServiceProcessorModule
*
* @class rti::routing::processor::Query
*
* @brief Encapsulates a content query to select data from a
* rti::routing::adapter::StreamReader.
*
* Note that syntax for the query filter is StreamReader implementation
* dependent. For the DDS Adapter case, the syntax corresponds to that
* of the SQL filter.
*
* A Query object holds a custom query obtained by calling
* rti::routing::adapter::StreamReader::create_content_query. Likewise,
* the deletion of a Query object will call
* rti::routing::adapter::StreamReader::delete_content_query.
*/
class Query : public dds::core::Reference<rti::routing::processor::QueryHolder> {
public:
typedef dds::core::Reference<QueryHolder> Base;
OMG_DDS_REF_TYPE_NOTYPENAME(
Query,
dds::core::Reference,
rti::routing::processor::QueryHolder);
explicit Query(Base::DELEGATE_REF_T reference) : Base(reference)
{
if (this->delegate()) {
this->delegate()->remember_reference(this->delegate());
}
}
/**
* @brief Creates a Query described by a filter on an input.
*
* @param[in] input The native Input to query the data from.
* @param[in] filter Description of the content query based on an expression
* and parameters.
*
* @see dds::topic::Filter
*/
Query(RTI_RoutingServiceInput *input, const dds::topic::Filter& filter)
: Base(new QueryHolder(input, filter))
{
this->delegate()->remember_reference(this->delegate());
}
/**
* @brief Updates the current Query content filter.
*
* This operation will call
* rti::routing::adapter::StreamReader::create_content_query providing
* the current query content data this Query holds.
*/
void filter(const dds::topic::Filter& filter)
{
this->delegate()->filter(filter);
}
};
} } }
#endif // RTI_ROUTING_PROCESSOR_QUERY_HPP_