blob: 518b771732a0f1e7182ee8bb08361e6235d1fdee [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
#include <memory>
#include <arrow-glib/arrow-glib.hpp>
#include <arrow-flight-glib/common.hpp>
#include <arrow-flight-glib/server.hpp>
#include <arrow-flight-sql-glib/server.hpp>
G_BEGIN_DECLS
/**
* SECTION: server
* @section_id: server
* @title: Server related classes
* @include: arrow-flight-sql-glib/arrow-flight-sql-glib.h
*
* #GAFlightSQLPreparedStatementUpdate is a class for a request
* that executes an update SQL prepared statement.
*
* #GAFlightSQLCreatePreparedStatementRequest is a class for a request
* that creates a SQL prepared statement.
*
* #GAFlightSQLCreatePreparedStatementResult is a class for a result
* of the request that creates a SQL prepared statement.
*
* #GAFlightSQLClosePreparedStatementRequest is a class for a request
* that closes a SQL prepared statement.
*
* #GAFlightSQLServer is a class to develop an Apache Arrow Flight SQL
* server.
*
* Since: 9.0.0
*/
struct GAFlightSQLCommandPrivate {
void *command;
};
enum {
PROP_COMMAND = 1,
};
G_DEFINE_TYPE_WITH_PRIVATE(GAFlightSQLCommand,
gaflightsql_command,
G_TYPE_OBJECT)
#define GAFLIGHTSQL_COMMAND_GET_PRIVATE(object) \
static_cast<GAFlightSQLCommandPrivate *>( \
gaflightsql_command_get_instance_private( \
GAFLIGHTSQL_COMMAND(object)))
static void
gaflightsql_command_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GAFLIGHTSQL_COMMAND_GET_PRIVATE(object);
switch (prop_id) {
case PROP_COMMAND:
priv->command = g_value_get_pointer(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
gaflightsql_command_init(GAFlightSQLCommand *object)
{
}
static void
gaflightsql_command_class_init(GAFlightSQLCommandClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->set_property = gaflightsql_command_set_property;
GParamSpec *spec;
spec = g_param_spec_pointer("command",
"Command",
"The raw command struct",
static_cast<GParamFlags>(G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_COMMAND, spec);
}
G_DEFINE_TYPE(GAFlightSQLStatementQuery,
gaflightsql_statement_query,
GAFLIGHTSQL_TYPE_COMMAND)
static void
gaflightsql_statement_query_init(GAFlightSQLStatementQuery *object)
{
}
static void
gaflightsql_statement_query_class_init(GAFlightSQLStatementQueryClass *klass)
{
}
/**
* gaflightsql_statement_query_get_query:
* @command: A #GAFlightSQLStatementQuery.
*
* Returns: The query to be executed.
*
* Since: 9.0.0
*/
const gchar *
gaflightsql_statement_query_get_query(GAFlightSQLStatementQuery *command)
{
auto statement_query = gaflightsql_statement_query_get_raw(command);
return statement_query->query.c_str();
}
G_DEFINE_TYPE(GAFlightSQLStatementUpdate,
gaflightsql_statement_update,
GAFLIGHTSQL_TYPE_COMMAND)
static void
gaflightsql_statement_update_init(GAFlightSQLStatementUpdate *object)
{
}
static void
gaflightsql_statement_update_class_init(GAFlightSQLStatementUpdateClass *klass)
{
}
/**
* gaflightsql_statement_update_get_query:
* @command: A #GAFlightSQLStatementUpdate.
*
* Returns: The query to be executed.
*
* Since: 13.0.0
*/
const gchar *
gaflightsql_statement_update_get_query(GAFlightSQLStatementUpdate *command)
{
auto statement_update = gaflightsql_statement_update_get_raw(command);
return statement_update->query.c_str();
}
G_DEFINE_TYPE(GAFlightSQLPreparedStatementUpdate,
gaflightsql_prepared_statement_update,
GAFLIGHTSQL_TYPE_COMMAND)
static void
gaflightsql_prepared_statement_update_init(
GAFlightSQLPreparedStatementUpdate *object)
{
}
static void
gaflightsql_prepared_statement_update_class_init(
GAFlightSQLPreparedStatementUpdateClass *klass)
{
}
/**
* gaflightsql_prepared_statement_update_get_handle:
* @command: A #GAFlightSQLPreparedStatementUpdate.
*
* Returns: (transfer full): The server-generated opaque identifier
* for the statement.
*
* Since: 14.0.0
*/
GBytes *
gaflightsql_prepared_statement_update_get_handle(
GAFlightSQLPreparedStatementUpdate *command)
{
auto update = gaflightsql_prepared_statement_update_get_raw(command);
return g_bytes_new_static(update->prepared_statement_handle.data(),
update->prepared_statement_handle.size());
}
G_DEFINE_TYPE(GAFlightSQLStatementQueryTicket,
gaflightsql_statement_query_ticket,
GAFLIGHTSQL_TYPE_COMMAND)
#define GAFLIGHTSQL_STATEMENT_QUERY_TICKET_GET_PRIVATE(object) \
static_cast<GAFlightSQLStatementQueryTicketPrivate *>( \
gaflightsql_statement_query_ticket_get_instance_private( \
GAFLIGHTSQL_STATEMENT_QUERY_TICKET(object)))
static void
gaflightsql_statement_query_ticket_init(GAFlightSQLStatementQueryTicket *object)
{
}
static void
gaflightsql_statement_query_ticket_class_init(
GAFlightSQLStatementQueryTicketClass *klass)
{
}
/**
* gaflightsql_statement_query_ticket_generate_handle:
* @query: A query to be executed.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): A handle for the given @query
* as #GBytes, %NULL on error.
*
* Since: 9.0.0
*/
GBytes *
gaflightsql_statement_query_ticket_generate_handle(const gchar *query,
GError **error)
{
auto result = arrow::flight::sql::CreateStatementQueryTicket(query);
if (!garrow::check(error,
result,
"[flight-sql-statement-query-ticket][new]")) {
return nullptr;
}
auto flight_sql_handle = std::move(*result);
return g_bytes_new(flight_sql_handle.data(),
flight_sql_handle.size());
}
/**
* gaflightsql_statement_query_ticket_get_handle:
* @command: A #GAFlightSQLStatementQuery.
*
* Returns: (transfer full): The handle to identify the query to be
* executed.
*
* Since: 9.0.0
*/
GBytes *
gaflightsql_statement_query_ticket_get_handle(
GAFlightSQLStatementQueryTicket *command)
{
auto statement_query_ticket =
gaflightsql_statement_query_ticket_get_raw(command);
auto &handle = statement_query_ticket->statement_handle;
return g_bytes_new_static(handle.data(), handle.size());
}
struct GAFlightSQLCreatePreparedStatementRequestPrivate {
arrow::flight::sql::ActionCreatePreparedStatementRequest *request;
};
enum {
PROP_REQUEST = 1,
};
G_DEFINE_TYPE_WITH_PRIVATE(GAFlightSQLCreatePreparedStatementRequest,
gaflightsql_create_prepared_statement_request,
G_TYPE_OBJECT)
#define GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_REQUEST_GET_PRIVATE(object) \
static_cast<GAFlightSQLCreatePreparedStatementRequestPrivate *>( \
gaflightsql_create_prepared_statement_request_get_instance_private( \
GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_REQUEST(object)))
static void
gaflightsql_create_prepared_statement_request_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_REQUEST_GET_PRIVATE(object);
switch (prop_id) {
case PROP_REQUEST:
priv->request =
static_cast<arrow::flight::sql::ActionCreatePreparedStatementRequest *>(
g_value_get_pointer(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
gaflightsql_create_prepared_statement_request_init(
GAFlightSQLCreatePreparedStatementRequest *object)
{
}
static void
gaflightsql_create_prepared_statement_request_class_init(
GAFlightSQLCreatePreparedStatementRequestClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->set_property =
gaflightsql_create_prepared_statement_request_set_property;
GParamSpec *spec;
spec = g_param_spec_pointer("request",
nullptr,
nullptr,
static_cast<GParamFlags>(G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_REQUEST, spec);
}
/**
* gaflightsql_create_prepared_statement_request_get_query:
* @request: A #GAFlightSQLCreatePreparedStatementRequest.
*
* Returns: The SQL query to be prepared.
*
* Since: 14.0.0
*/
const gchar *
gaflightsql_create_prepared_statement_request_get_query(
GAFlightSQLCreatePreparedStatementRequest *request)
{
auto priv = GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_REQUEST_GET_PRIVATE(request);
return priv->request->query.c_str();
}
/**
* gaflightsql_create_prepared_statement_request_get_transaction_id:
* @request: A #GAFlightSQLCreatePreparedStatementRequest.
*
* Returns: The transaction ID, if specified (else a blank string).
*
* Since: 14.0.0
*/
const gchar *
gaflightsql_create_prepared_statement_request_get_transaction_id(
GAFlightSQLCreatePreparedStatementRequest *request)
{
auto priv = GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_REQUEST_GET_PRIVATE(request);
return priv->request->transaction_id.c_str();
}
struct GAFlightSQLCreatePreparedStatementResultPrivate {
arrow::flight::sql::ActionCreatePreparedStatementResult result;
};
G_DEFINE_TYPE_WITH_PRIVATE(GAFlightSQLCreatePreparedStatementResult,
gaflightsql_create_prepared_statement_result,
G_TYPE_OBJECT)
#define GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_RESULT_GET_PRIVATE(object) \
static_cast<GAFlightSQLCreatePreparedStatementResultPrivate *>( \
gaflightsql_create_prepared_statement_result_get_instance_private( \
GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_RESULT(object)))
static void
gaflightsql_create_prepared_statement_result_finalize(GObject *object)
{
auto priv = GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_RESULT_GET_PRIVATE(object);
priv->result.~ActionCreatePreparedStatementResult();
G_OBJECT_CLASS(gaflightsql_create_prepared_statement_result_parent_class)->finalize(object);
}
static void
gaflightsql_create_prepared_statement_result_init(
GAFlightSQLCreatePreparedStatementResult *object)
{
auto priv = GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_RESULT_GET_PRIVATE(object);
new(&(priv->result)) arrow::flight::sql::ActionCreatePreparedStatementResult();
}
static void
gaflightsql_create_prepared_statement_result_class_init(
GAFlightSQLCreatePreparedStatementResultClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->finalize =
gaflightsql_create_prepared_statement_result_finalize;
}
/**
* gaflightsql_create_prepared_statement_result_new:
*
* Returns:: The newly created #GAFlightSQLCreatePreparedStatementResult.
*
* Since: 14.0.0
*/
GAFlightSQLCreatePreparedStatementResult *
gaflightsql_create_prepared_statement_result_new(void)
{
return GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_RESULT(
g_object_new(GAFLIGHTSQL_TYPE_CREATE_PREPARED_STATEMENT_RESULT,
nullptr));
}
/**
* gaflightsql_create_prepared_statement_result_set_dataset_schema:
* @result: A #GAFlightSQLCreatePreparedStatementResult.
* @schema: A #GArrowSchema of dataset.
*
* Since: 14.0.0
*/
void
gaflightsql_create_prepared_statement_result_set_dataset_schema(
GAFlightSQLCreatePreparedStatementResult *result,
GArrowSchema *schema)
{
auto priv =
GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_RESULT_GET_PRIVATE(result);
priv->result.dataset_schema = garrow_schema_get_raw(schema);
}
/**
* gaflightsql_create_prepared_statement_result_get_dataset_schema:
* @result: A #GAFlightSQLCreatePreparedStatementResult.
*
* Returns: (nullable) (transfer full): The current dataset schema.
*
* Since: 14.0.0
*/
GArrowSchema *
gaflightsql_create_prepared_statement_result_get_dataset_schema(
GAFlightSQLCreatePreparedStatementResult *result)
{
auto priv =
GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_RESULT_GET_PRIVATE(result);
if (!priv->result.dataset_schema) {
return nullptr;
}
return garrow_schema_new_raw(&(priv->result.dataset_schema));
}
/**
* gaflightsql_create_prepared_statement_result_set_parameter_schema:
* @result: A #GAFlightSQLCreatePreparedStatementResult.
* @schema: A #GArrowSchema of parameter.
*
* Since: 14.0.0
*/
void
gaflightsql_create_prepared_statement_result_set_parameter_schema(
GAFlightSQLCreatePreparedStatementResult *result,
GArrowSchema *schema)
{
auto priv =
GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_RESULT_GET_PRIVATE(result);
priv->result.parameter_schema = garrow_schema_get_raw(schema);
}
/**
* gaflightsql_create_prepared_statement_result_get_parameter_schema:
* @result: A #GAFlightSQLCreatePreparedStatementResult.
*
* Returns: (nullable) (transfer full): The current parameter schema.
*
* Since: 14.0.0
*/
GArrowSchema *
gaflightsql_create_prepared_statement_result_get_parameter_schema(
GAFlightSQLCreatePreparedStatementResult *result)
{
auto priv =
GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_RESULT_GET_PRIVATE(result);
if (!priv->result.parameter_schema) {
return nullptr;
}
return garrow_schema_new_raw(&(priv->result.parameter_schema));
}
/**
* gaflightsql_create_prepared_statement_result_set_handle:
* @result: A #GAFlightSQLCreatePreparedStatementResult.
* @handle: A #GBytes for server-generated opaque identifier.
*
* Since: 14.0.0
*/
void
gaflightsql_create_prepared_statement_result_set_handle(
GAFlightSQLCreatePreparedStatementResult *result,
GBytes *handle)
{
auto priv =
GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_RESULT_GET_PRIVATE(result);
size_t handle_size;
auto handle_data = g_bytes_get_data(handle, &handle_size);
priv->result.prepared_statement_handle =
std::string(static_cast<const char *>(handle_data), handle_size);
}
/**
* gaflightsql_create_prepared_statement_result_get_handle:
* @result: A #GAFlightSQLCreatePreparedStatementResult.
*
* Returns: (transfer full): The current server-generated opaque
* identifier.
*
* Since: 14.0.0
*/
GBytes *
gaflightsql_create_prepared_statement_result_get_handle(
GAFlightSQLCreatePreparedStatementResult *result)
{
auto priv =
GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_RESULT_GET_PRIVATE(result);
return g_bytes_new_static(priv->result.prepared_statement_handle.data(),
priv->result.prepared_statement_handle.length());
}
struct GAFlightSQLClosePreparedStatementRequestPrivate {
arrow::flight::sql::ActionClosePreparedStatementRequest *request;
};
G_DEFINE_TYPE_WITH_PRIVATE(GAFlightSQLClosePreparedStatementRequest,
gaflightsql_close_prepared_statement_request,
G_TYPE_OBJECT)
#define GAFLIGHTSQL_CLOSE_PREPARED_STATEMENT_REQUEST_GET_PRIVATE(object) \
static_cast<GAFlightSQLClosePreparedStatementRequestPrivate *>( \
gaflightsql_close_prepared_statement_request_get_instance_private( \
GAFLIGHTSQL_CLOSE_PREPARED_STATEMENT_REQUEST(object)))
static void
gaflightsql_close_prepared_statement_request_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
auto priv = GAFLIGHTSQL_CLOSE_PREPARED_STATEMENT_REQUEST_GET_PRIVATE(object);
switch (prop_id) {
case PROP_REQUEST:
priv->request =
static_cast<arrow::flight::sql::ActionClosePreparedStatementRequest *>(
g_value_get_pointer(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
}
}
static void
gaflightsql_close_prepared_statement_request_init(
GAFlightSQLClosePreparedStatementRequest *object)
{
}
static void
gaflightsql_close_prepared_statement_request_class_init(
GAFlightSQLClosePreparedStatementRequestClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->set_property =
gaflightsql_close_prepared_statement_request_set_property;
GParamSpec *spec;
spec = g_param_spec_pointer("request",
nullptr,
nullptr,
static_cast<GParamFlags>(G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property(gobject_class, PROP_REQUEST, spec);
}
/**
* gaflightsql_close_prepared_statement_request_get_handle:
* @request: A #GAFlightSQLClosePreparedStatementRequest.
*
* Returns: (transfer full): The server-generated opaque identifier
* for the statement.
*
* Since: 14.0.0
*/
GBytes *
gaflightsql_close_prepared_statement_request_get_handle(
GAFlightSQLClosePreparedStatementRequest *request)
{
auto priv = GAFLIGHTSQL_CLOSE_PREPARED_STATEMENT_REQUEST_GET_PRIVATE(request);
return g_bytes_new_static(priv->request->prepared_statement_handle.data(),
priv->request->prepared_statement_handle.length());
}
G_END_DECLS
namespace gaflightsql {
class Server : public arrow::flight::sql::FlightSqlServerBase {
public:
explicit Server(GAFlightSQLServer *gaserver) :
FlightSqlServerBase(),
gaserver_(gaserver) {
}
~Server() override = default;
arrow::Result<std::unique_ptr<arrow::flight::FlightInfo>>
GetFlightInfoStatement(
const arrow::flight::ServerCallContext& context,
const arrow::flight::sql::StatementQuery& command,
const arrow::flight::FlightDescriptor& descriptor) override {
auto gacontext = gaflight_server_call_context_new_raw(&context);
auto gacommand = gaflightsql_statement_query_new_raw(&command);
auto gadescriptor = gaflight_descriptor_new_raw(&descriptor);
GError *gerror = nullptr;
auto gainfo = gaflightsql_server_get_flight_info_statement(gaserver_,
gacontext,
gacommand,
gadescriptor,
&gerror);
g_object_unref(gadescriptor);
g_object_unref(gacommand);
g_object_unref(gacontext);
if (gerror) {
auto context = "[flight-sql-server][get-flight-info-statement]";
return garrow_error_to_status(gerror,
arrow::StatusCode::UnknownError,
context);
}
return std::make_unique<arrow::flight::FlightInfo>(
*gaflight_info_get_raw(gainfo));
}
arrow::Result<std::unique_ptr<arrow::flight::FlightDataStream>>
DoGetStatement(
const arrow::flight::ServerCallContext &context,
const arrow::flight::sql::StatementQueryTicket& command) override {
auto gacontext = gaflight_server_call_context_new_raw(&context);
auto gacommand = gaflightsql_statement_query_ticket_new_raw(&command);
GError *gerror = nullptr;
auto gastream = gaflightsql_server_do_get_statement(gaserver_,
gacontext,
gacommand,
&gerror);
g_object_unref(gacommand);
g_object_unref(gacontext);
if (gerror) {
return garrow_error_to_status(gerror,
arrow::StatusCode::UnknownError,
"[flight-sql-server][do-get-statement]");
}
return std::make_unique<gaflight::DataStream>(gastream);
}
arrow::Result<int64_t>
DoPutCommandStatementUpdate(
const arrow::flight::ServerCallContext &context,
const arrow::flight::sql::StatementUpdate &command) override {
auto gacontext = gaflight_server_call_context_new_raw(&context);
auto gacommand = gaflightsql_statement_update_new_raw(&command);
GError *gerror = nullptr;
auto n_changed_records =
gaflightsql_server_do_put_command_statement_update(gaserver_,
gacontext,
gacommand,
&gerror);
g_object_unref(gacommand);
g_object_unref(gacontext);
if (gerror) {
return garrow_error_to_status(
gerror,
arrow::StatusCode::UnknownError,
"[flight-sql-server][do-put-command-statement-update]");
}
return n_changed_records;
}
arrow::Result<int64_t>
DoPutPreparedStatementUpdate(
const arrow::flight::ServerCallContext &context,
const arrow::flight::sql::PreparedStatementUpdate &command,
arrow::flight::FlightMessageReader *reader) override {
auto gacontext = gaflight_server_call_context_new_raw(&context);
auto gacommand = gaflightsql_prepared_statement_update_new_raw(&command);
auto gareader = gaflight_message_reader_new_raw(reader, FALSE);
GError *gerror = nullptr;
auto n_changed_records =
gaflightsql_server_do_put_prepared_statement_update(gaserver_,
gacontext,
gacommand,
gareader,
&gerror);
g_object_unref(gareader);
g_object_unref(gacommand);
g_object_unref(gacontext);
if (gerror) {
return garrow_error_to_status(
gerror,
arrow::StatusCode::UnknownError,
"[flight-sql-server][do-put-prepared-statement-update]");
}
return n_changed_records;
}
arrow::Result<arrow::flight::sql::ActionCreatePreparedStatementResult>
CreatePreparedStatement(
const arrow::flight::ServerCallContext &context,
const arrow::flight::sql::ActionCreatePreparedStatementRequest &request) override {
auto gacontext = gaflight_server_call_context_new_raw(&context);
auto garequest = gaflightsql_create_prepared_statement_request_new_raw(&request);
GError *gerror = nullptr;
auto garesult =
gaflightsql_server_create_prepared_statement(gaserver_,
gacontext,
garequest,
&gerror);
g_object_unref(garequest);
g_object_unref(gacontext);
if (gerror) {
return garrow_error_to_status(
gerror,
arrow::StatusCode::UnknownError,
"[flight-sql-server][create-prepared-statement]");
}
auto garesult_priv =
GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_RESULT_GET_PRIVATE(garesult);
auto flightsql_result = garesult_priv->result;
g_object_unref(garesult);
return flightsql_result;
}
arrow::Status
ClosePreparedStatement(
const arrow::flight::ServerCallContext &context,
const arrow::flight::sql::ActionClosePreparedStatementRequest &request) override {
auto gacontext = gaflight_server_call_context_new_raw(&context);
auto garequest = gaflightsql_close_prepared_statement_request_new_raw(&request);
GError *gerror = nullptr;
gaflightsql_server_close_prepared_statement(gaserver_,
gacontext,
garequest,
&gerror);
g_object_unref(garequest);
g_object_unref(gacontext);
if (gerror) {
return garrow_error_to_status(
gerror,
arrow::StatusCode::UnknownError,
"[flight-sql-server][close-prepared-statement]");
} else {
return arrow::Status::OK();
}
}
private:
GAFlightSQLServer *gaserver_;
};
};
G_BEGIN_DECLS
struct GAFlightSQLServerPrivate {
gaflightsql::Server server;
};
G_END_DECLS
static arrow::flight::FlightServerBase *
gaflightsql_server_servable_get_raw(GAFlightServable *servable);
G_BEGIN_DECLS
static void
gaflightsql_server_servable_interface_init(GAFlightServableInterface *iface)
{
iface->get_raw = gaflightsql_server_servable_get_raw;
}
G_DEFINE_ABSTRACT_TYPE_WITH_CODE(GAFlightSQLServer,
gaflightsql_server,
GAFLIGHT_TYPE_SERVER,
G_ADD_PRIVATE(GAFlightSQLServer);
G_IMPLEMENT_INTERFACE(
GAFLIGHT_TYPE_SERVABLE,
gaflightsql_server_servable_interface_init))
#define GAFLIGHTSQL_SERVER_GET_PRIVATE(object) \
static_cast<GAFlightSQLServerPrivate *>( \
gaflightsql_server_get_instance_private( \
GAFLIGHTSQL_SERVER(object)))
G_END_DECLS
static arrow::flight::FlightServerBase *
gaflightsql_server_servable_get_raw(GAFlightServable *servable)
{
auto priv = GAFLIGHTSQL_SERVER_GET_PRIVATE(servable);
return &(priv->server);
}
G_BEGIN_DECLS
static void
gaflightsql_server_finalize(GObject *object)
{
auto priv = GAFLIGHTSQL_SERVER_GET_PRIVATE(object);
priv->server.~Server();
G_OBJECT_CLASS(gaflightsql_server_parent_class)->finalize(object);
}
static void
gaflightsql_server_init(GAFlightSQLServer *object)
{
auto priv = GAFLIGHTSQL_SERVER_GET_PRIVATE(object);
new(&(priv->server)) gaflightsql::Server(object);
}
static void
gaflightsql_server_class_init(GAFlightSQLServerClass *klass)
{
auto gobject_class = G_OBJECT_CLASS(klass);
gobject_class->finalize = gaflightsql_server_finalize;
}
/**
* gaflightsql_server_get_flight_info_statement:
* @server: A #GAFlightSQLServer.
* @context: A #GAFlightServerCallContext.
* @command: A #GAFlightSQLStatementQuery to be executed.
* @descriptor: A #GAFlightDescriptor.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): A #GAFlightInfo for executing
* a SQL query on success, %NULL on error.
*
* Since: 9.0.0
*/
GAFlightInfo *
gaflightsql_server_get_flight_info_statement(
GAFlightSQLServer *server,
GAFlightServerCallContext *context,
GAFlightSQLStatementQuery *command,
GAFlightDescriptor *descriptor,
GError **error)
{
auto klass = GAFLIGHTSQL_SERVER_GET_CLASS(server);
if (!(klass && klass->get_flight_info_statement)) {
g_set_error(error,
GARROW_ERROR,
GARROW_ERROR_NOT_IMPLEMENTED,
"not implemented");
return NULL;
}
return (*(klass->get_flight_info_statement))(server,
context,
command,
descriptor,
error);
}
/**
* gaflightsql_server_do_get_statement:
* @server: A #GAFlightServer.
* @context: A #GAFlightServerCallContext.
* @ticket: A #GAFlightSQLStatementQueryTicket.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): A #GAFlightDataStream
* containing the query results on success, %NULL on error.
*
* Since: 9.0.0
*/
GAFlightDataStream *
gaflightsql_server_do_get_statement(GAFlightSQLServer *server,
GAFlightServerCallContext *context,
GAFlightSQLStatementQueryTicket *ticket,
GError **error)
{
auto klass = GAFLIGHTSQL_SERVER_GET_CLASS(server);
if (!(klass && klass->do_get_statement)) {
g_set_error(error,
GARROW_ERROR,
GARROW_ERROR_NOT_IMPLEMENTED,
"not implemented");
return nullptr;
}
return (*(klass->do_get_statement))(server, context, ticket, error);
}
/**
* gaflightsql_server_do_put_command_statement_update:
* @server: A #GAFlightServer.
* @context: A #GAFlightServerCallContext.
* @command: A #GAFlightSQLStatementUpdate.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: The number of changed records.
*
* Since: 13.0.0
*/
gint64
gaflightsql_server_do_put_command_statement_update(
GAFlightSQLServer *server,
GAFlightServerCallContext *context,
GAFlightSQLStatementUpdate *command,
GError **error)
{
auto klass = GAFLIGHTSQL_SERVER_GET_CLASS(server);
if (!(klass && klass->do_put_command_statement_update)) {
g_set_error(error,
GARROW_ERROR,
GARROW_ERROR_NOT_IMPLEMENTED,
"not implemented");
return 0;
}
return klass->do_put_command_statement_update(server, context, command, error);
}
/**
* gaflightsql_server_do_put_prepared_statement_update:
* @server: A #GAFlightServer.
* @context: A #GAFlightServerCallContext.
* @command: A #GAFlightSQLPreparedStatementUpdate.
* @reader: A #GAFlightMessageReader that reads uploaded record batches.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: The number of changed records.
*
* Since: 14.0.0
*/
gint64
gaflightsql_server_do_put_prepared_statement_update(
GAFlightSQLServer *server,
GAFlightServerCallContext *context,
GAFlightSQLPreparedStatementUpdate *command,
GAFlightMessageReader *reader,
GError **error)
{
auto klass = GAFLIGHTSQL_SERVER_GET_CLASS(server);
if (!(klass && klass->do_put_prepared_statement_update)) {
g_set_error(error,
GARROW_ERROR,
GARROW_ERROR_NOT_IMPLEMENTED,
"not implemented");
return 0;
}
return klass->do_put_prepared_statement_update(
server, context, command, reader, error);
}
/**
* gaflightsql_server_create_prepared_statement:
* @server: A #GAFlightServer.
* @context: A #GAFlightServerCallContext.
* @request: A #GAFlightSQLCreatePreparedStatementRequest.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Returns: (nullable) (transfer full): A
* #GAFlightSQLCreatePreparedStatementResult containing the dataset
* and parameter schemas and a handle for created statement on
* success, %NULL on error.
*
* Since: 14.0.0
*/
GAFlightSQLCreatePreparedStatementResult *
gaflightsql_server_create_prepared_statement(
GAFlightSQLServer *server,
GAFlightServerCallContext *context,
GAFlightSQLCreatePreparedStatementRequest *request,
GError **error)
{
auto klass = GAFLIGHTSQL_SERVER_GET_CLASS(server);
if (!(klass && klass->create_prepared_statement)) {
g_set_error(error,
GARROW_ERROR,
GARROW_ERROR_NOT_IMPLEMENTED,
"not implemented");
return nullptr;
}
return klass->create_prepared_statement(server, context, request, error);
}
/**
* gaflightsql_server_close_prepared_statement:
* @server: A #GAFlightServer.
* @context: A #GAFlightServerCallContext.
* @request: A #GAFlightSQLClosePreparedStatementRequest.
* @error: (nullable): Return location for a #GError or %NULL.
*
* Since: 14.0.0
*/
void
gaflightsql_server_close_prepared_statement(
GAFlightSQLServer *server,
GAFlightServerCallContext *context,
GAFlightSQLClosePreparedStatementRequest *request,
GError **error)
{
auto klass = GAFLIGHTSQL_SERVER_GET_CLASS(server);
if (!(klass && klass->close_prepared_statement)) {
g_set_error(error,
GARROW_ERROR,
GARROW_ERROR_NOT_IMPLEMENTED,
"not implemented");
return;
}
return klass->close_prepared_statement(server, context, request, error);
}
G_END_DECLS
GAFlightSQLStatementQuery *
gaflightsql_statement_query_new_raw(
const arrow::flight::sql::StatementQuery *flight_command)
{
return GAFLIGHTSQL_STATEMENT_QUERY(
g_object_new(GAFLIGHTSQL_TYPE_STATEMENT_QUERY,
"command", flight_command,
nullptr));
}
const arrow::flight::sql::StatementQuery *
gaflightsql_statement_query_get_raw(GAFlightSQLStatementQuery *command)
{
auto priv = GAFLIGHTSQL_COMMAND_GET_PRIVATE(command);
return static_cast<const arrow::flight::sql::StatementQuery *>(priv->command);
}
GAFlightSQLStatementUpdate *
gaflightsql_statement_update_new_raw(
const arrow::flight::sql::StatementUpdate *flight_command)
{
return GAFLIGHTSQL_STATEMENT_UPDATE(
g_object_new(GAFLIGHTSQL_TYPE_STATEMENT_UPDATE,
"command", flight_command,
nullptr));
}
const arrow::flight::sql::StatementUpdate *
gaflightsql_statement_update_get_raw(GAFlightSQLStatementUpdate *command)
{
auto priv = GAFLIGHTSQL_COMMAND_GET_PRIVATE(command);
return static_cast<const arrow::flight::sql::StatementUpdate *>(priv->command);
}
GAFlightSQLPreparedStatementUpdate *
gaflightsql_prepared_statement_update_new_raw(
const arrow::flight::sql::PreparedStatementUpdate *flight_command)
{
return GAFLIGHTSQL_PREPARED_STATEMENT_UPDATE(
g_object_new(GAFLIGHTSQL_TYPE_PREPARED_STATEMENT_UPDATE,
"command", flight_command,
nullptr));
}
const arrow::flight::sql::PreparedStatementUpdate *
gaflightsql_prepared_statement_update_get_raw(
GAFlightSQLPreparedStatementUpdate *command)
{
auto priv = GAFLIGHTSQL_COMMAND_GET_PRIVATE(command);
return static_cast<const arrow::flight::sql::PreparedStatementUpdate *>(
priv->command);
}
GAFlightSQLStatementQueryTicket *
gaflightsql_statement_query_ticket_new_raw(
const arrow::flight::sql::StatementQueryTicket *flight_command)
{
return GAFLIGHTSQL_STATEMENT_QUERY_TICKET(
g_object_new(GAFLIGHTSQL_TYPE_STATEMENT_QUERY_TICKET,
"command", flight_command,
nullptr));
}
const arrow::flight::sql::StatementQueryTicket *
gaflightsql_statement_query_ticket_get_raw(
GAFlightSQLStatementQueryTicket *command)
{
auto priv = GAFLIGHTSQL_COMMAND_GET_PRIVATE(command);
return static_cast<const arrow::flight::sql::StatementQueryTicket *>(
priv->command);
}
GAFlightSQLCreatePreparedStatementRequest *
gaflightsql_create_prepared_statement_request_new_raw(
const arrow::flight::sql::ActionCreatePreparedStatementRequest *flight_request)
{
return GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_REQUEST(
g_object_new(GAFLIGHTSQL_TYPE_CREATE_PREPARED_STATEMENT_REQUEST,
"request", flight_request,
nullptr));
}
const arrow::flight::sql::ActionCreatePreparedStatementRequest *
gaflightsql_create_prepared_statement_request_get_raw(
GAFlightSQLCreatePreparedStatementRequest *request)
{
auto priv = GAFLIGHTSQL_CREATE_PREPARED_STATEMENT_REQUEST_GET_PRIVATE(request);
return priv->request;
}
GAFlightSQLClosePreparedStatementRequest *
gaflightsql_close_prepared_statement_request_new_raw(
const arrow::flight::sql::ActionClosePreparedStatementRequest *flight_request)
{
return GAFLIGHTSQL_CLOSE_PREPARED_STATEMENT_REQUEST(
g_object_new(GAFLIGHTSQL_TYPE_CLOSE_PREPARED_STATEMENT_REQUEST,
"request", flight_request,
nullptr));
}
const arrow::flight::sql::ActionClosePreparedStatementRequest *
gaflightsql_close_prepared_statement_request_get_raw(
GAFlightSQLClosePreparedStatementRequest *request)
{
auto priv = GAFLIGHTSQL_CLOSE_PREPARED_STATEMENT_REQUEST_GET_PRIVATE(request);
return priv->request;
}