diff --git a/cpp/src/arrow/flight/flight-sql/example/sqlite_server.cc b/cpp/src/arrow/flight/flight-sql/example/sqlite_server.cc index 844b1e805388e..a8d0c82369eab 100644 --- a/cpp/src/arrow/flight/flight-sql/example/sqlite_server.cc +++ b/cpp/src/arrow/flight/flight-sql/example/sqlite_server.cc @@ -57,31 +57,29 @@ std::shared_ptr GetArrowType(const char* sqlite_type) { } } -std::string PrepareQueryForGetTables(const pb::sql::CommandGetTables& command) { +std::string PrepareQueryForGetTables(const GetTables& command) { std::stringstream table_query; table_query << "SELECT null as catalog_name, null as schema_name, name as " "table_name, type as table_type FROM sqlite_master where 1=1"; - if (command.has_catalog()) { - table_query << " and catalog_name='" << command.catalog() << "'"; + if (command.has_catalog) { + table_query << " and catalog_name='" << command.catalog << "'"; } - if (command.has_schema_filter_pattern()) { - table_query << " and schema_name LIKE '" << command.schema_filter_pattern() << "'"; + if (command.has_schema_filter_pattern) { + table_query << " and schema_name LIKE '" << command.schema_filter_pattern << "'"; } - if (command.has_table_name_filter_pattern()) { - table_query << " and table_name LIKE '" << command.table_name_filter_pattern() << "'"; + if (command.has_table_name_filter_pattern) { + table_query << " and table_name LIKE '" << command.table_name_filter_pattern << "'"; } - if (!command.table_types().empty()) { - google::protobuf::RepeatedPtrField types = command.table_types(); - + if (!command.table_types.empty()) { table_query << " and table_type IN ("; - int size = types.size(); - for (int i = 0; i < size; i++) { - table_query << "'" << types.at(i) << "'"; + size_t size = command.table_types.size(); + for (size_t i = 0; i < size; i++) { + table_query << "'" << command.table_types[i] << "'"; if (size - 1 != i) { table_query << ","; } @@ -205,13 +203,8 @@ Status DoGetSQLiteQuery(sqlite3* db, const std::string& query, Status GetFlightInfoForCommand(const FlightDescriptor& descriptor, std::unique_ptr* info, - const google::protobuf::Message& command, const std::shared_ptr& schema) { - google::protobuf::Any ticketParsed; - ticketParsed.PackFrom(command); - - std::vector endpoints{ - FlightEndpoint{{ticketParsed.SerializeAsString()}, {}}}; + std::vector endpoints{FlightEndpoint{{descriptor.cmd}, {}}}; ARROW_ASSIGN_OR_RAISE(auto result, FlightInfo::Make(*schema, descriptor, endpoints, -1, -1)) @@ -220,10 +213,11 @@ Status GetFlightInfoForCommand(const FlightDescriptor& descriptor, return Status::OK(); } -Status SQLiteFlightSqlServer::GetFlightInfoStatement( - const pb::sql::CommandStatementQuery& command, const ServerCallContext& context, - const FlightDescriptor& descriptor, std::unique_ptr* info) { - const std::string& query = command.query(); +Status SQLiteFlightSqlServer::GetFlightInfoStatement(const StatementQuery& command, + const ServerCallContext& context, + const FlightDescriptor& descriptor, + std::unique_ptr* info) { + const std::string& query = command.query; std::shared_ptr statement; ARROW_RETURN_NOT_OK(SqliteStatement::Create(db_, query, &statement)); @@ -231,13 +225,7 @@ Status SQLiteFlightSqlServer::GetFlightInfoStatement( std::shared_ptr schema; ARROW_RETURN_NOT_OK(statement->GetSchema(&schema)); - pb::sql::TicketStatementQuery ticket_statement_query; - ticket_statement_query.set_statement_handle(query); - - google::protobuf::Any ticket; - ticket.PackFrom(ticket_statement_query); - - const std::string& ticket_string = ticket.SerializeAsString(); + std::string ticket_string = CreateStatementQueryTicket(query); std::vector endpoints{FlightEndpoint{{ticket_string}, {}}}; ARROW_ASSIGN_OR_RAISE(auto result, FlightInfo::Make(*schema, descriptor, endpoints, -1, -1)) @@ -247,10 +235,10 @@ Status SQLiteFlightSqlServer::GetFlightInfoStatement( return Status::OK(); } -Status SQLiteFlightSqlServer::DoGetStatement(const pb::sql::TicketStatementQuery& command, +Status SQLiteFlightSqlServer::DoGetStatement(const StatementQueryTicket& command, const ServerCallContext& context, std::unique_ptr* result) { - const std::string& sql = command.statement_handle(); + const std::string& sql = command.statement_handle; std::shared_ptr statement; ARROW_RETURN_NOT_OK(SqliteStatement::Create(db_, sql, &statement)); @@ -266,9 +254,7 @@ Status SQLiteFlightSqlServer::DoGetStatement(const pb::sql::TicketStatementQuery Status SQLiteFlightSqlServer::GetFlightInfoCatalogs(const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info) { - pb::sql::CommandGetCatalogs command; - return GetFlightInfoForCommand(descriptor, info, command, - SqlSchema::GetCatalogsSchema()); + return GetFlightInfoForCommand(descriptor, info, SqlSchema::GetCatalogsSchema()); } Status SQLiteFlightSqlServer::DoGetCatalogs(const ServerCallContext& context, @@ -288,14 +274,14 @@ Status SQLiteFlightSqlServer::DoGetCatalogs(const ServerCallContext& context, return Status::OK(); } -Status SQLiteFlightSqlServer::GetFlightInfoSchemas( - const pb::sql::CommandGetSchemas& command, const ServerCallContext& context, - const FlightDescriptor& descriptor, std::unique_ptr* info) { - return GetFlightInfoForCommand(descriptor, info, command, - SqlSchema::GetSchemasSchema()); +Status SQLiteFlightSqlServer::GetFlightInfoSchemas(const GetSchemas& command, + const ServerCallContext& context, + const FlightDescriptor& descriptor, + std::unique_ptr* info) { + return GetFlightInfoForCommand(descriptor, info, SqlSchema::GetSchemasSchema()); } -Status SQLiteFlightSqlServer::DoGetSchemas(const pb::sql::CommandGetSchemas& command, +Status SQLiteFlightSqlServer::DoGetSchemas(const GetSchemas& command, const ServerCallContext& context, std::unique_ptr* result) { // As SQLite doesn't support schemas, this will return an empty record batch. @@ -315,17 +301,13 @@ Status SQLiteFlightSqlServer::DoGetSchemas(const pb::sql::CommandGetSchemas& com return Status::OK(); } -Status SQLiteFlightSqlServer::GetFlightInfoTables( - const pb::sql::CommandGetTables& command, const ServerCallContext& context, - const FlightDescriptor& descriptor, std::unique_ptr* info) { - google::protobuf::Any ticketParsed; +Status SQLiteFlightSqlServer::GetFlightInfoTables(const GetTables& command, + const ServerCallContext& context, + const FlightDescriptor& descriptor, + std::unique_ptr* info) { + std::vector endpoints{FlightEndpoint{{descriptor.cmd}, {}}}; - ticketParsed.PackFrom(command); - - std::vector endpoints{ - FlightEndpoint{{ticketParsed.SerializeAsString()}, {}}}; - - bool include_schema = command.include_schema(); + bool include_schema = command.include_schema; ARROW_ASSIGN_OR_RAISE( auto result, @@ -337,7 +319,7 @@ Status SQLiteFlightSqlServer::GetFlightInfoTables( return Status::OK(); } -Status SQLiteFlightSqlServer::DoGetTables(const pb::sql::CommandGetTables& command, +Status SQLiteFlightSqlServer::DoGetTables(const GetTables& command, const ServerCallContext& context, std::unique_ptr* result) { std::string query = PrepareQueryForGetTables(command); @@ -349,7 +331,7 @@ Status SQLiteFlightSqlServer::DoGetTables(const pb::sql::CommandGetTables& comma ARROW_RETURN_NOT_OK(SqliteStatementBatchReader::Create( statement, SqlSchema::GetTablesSchema(), &reader)); - if (command.include_schema()) { + if (command.include_schema) { std::shared_ptr table_schema_reader = std::make_shared(reader, query, db_); *result = @@ -361,41 +343,32 @@ Status SQLiteFlightSqlServer::DoGetTables(const pb::sql::CommandGetTables& comma return Status::OK(); } -Status SQLiteFlightSqlServer::DoPutCommandStatementUpdate( - const pb::sql::CommandStatementUpdate& command, const ServerCallContext& context, - std::unique_ptr& reader, - std::unique_ptr& writer) { - const std::string& sql = command.query(); +arrow::Result SQLiteFlightSqlServer::DoPutCommandStatementUpdate( + const StatementUpdate& command, const ServerCallContext& context, + std::unique_ptr& reader) { + const std::string& sql = command.query; std::shared_ptr statement; ARROW_RETURN_NOT_OK(SqliteStatement::Create(db_, sql, &statement)); - pb::sql::DoPutUpdateResult result; - int64_t record_count; ARROW_RETURN_NOT_OK(statement->ExecuteUpdate(&record_count)); - result.set_record_count(record_count); - - const std::shared_ptr& buffer = Buffer::FromString(result.SerializeAsString()); - ARROW_RETURN_NOT_OK(writer->WriteMetadata(*buffer)); - - return Status::OK(); + return record_count; } -Status SQLiteFlightSqlServer::CreatePreparedStatement( - const pb::sql::ActionCreatePreparedStatementRequest& request, - const ServerCallContext& context, std::unique_ptr* result) { +arrow::Result +SQLiteFlightSqlServer::CreatePreparedStatement( + const ActionCreatePreparedStatementRequest& request, + const ServerCallContext& context) { std::shared_ptr statement; - ARROW_RETURN_NOT_OK(SqliteStatement::Create(db_, request.query(), &statement)); + ARROW_RETURN_NOT_OK(SqliteStatement::Create(db_, request.query, &statement)); boost::uuids::uuid uuid = uuid_generator_(); prepared_statements_[uuid] = statement; std::shared_ptr dataset_schema; ARROW_RETURN_NOT_OK(statement->GetSchema(&dataset_schema)); - ARROW_ASSIGN_OR_RAISE(auto serialized_dataset_schema, - ipc::SerializeSchema(*dataset_schema)); sqlite3_stmt* stmt = statement->GetSqlite3Stmt(); const int parameter_count = sqlite3_bind_parameter_count(stmt); @@ -419,27 +392,19 @@ Status SQLiteFlightSqlServer::CreatePreparedStatement( } const std::shared_ptr& parameter_schema = arrow::schema(parameter_fields); - ARROW_ASSIGN_OR_RAISE(auto serialized_parameter_schema, - ipc::SerializeSchema(*parameter_schema)); - - pb::sql::ActionCreatePreparedStatementResult action_result; - action_result.set_dataset_schema(serialized_dataset_schema->ToString()); - action_result.set_parameter_schema(serialized_parameter_schema->ToString()); - action_result.set_prepared_statement_handle(boost::uuids::to_string(uuid)); - google::protobuf::Any any; - any.PackFrom(action_result); + ActionCreatePreparedStatementResult result{ + .dataset_schema = dataset_schema, + .parameter_schema = parameter_schema, + .prepared_statement_handle = boost::uuids::to_string(uuid)}; - auto buf = Buffer::FromString(any.SerializeAsString()); - *result = std::unique_ptr(new SimpleResultStream({Result{buf}})); - - return Status::OK(); + return result; } Status SQLiteFlightSqlServer::ClosePreparedStatement( - const pb::sql::ActionClosePreparedStatementRequest& request, - const ServerCallContext& context, std::unique_ptr* result) { - const std::string& prepared_statement_handle = request.prepared_statement_handle(); + const ActionClosePreparedStatementRequest& request, const ServerCallContext& context, + std::unique_ptr* result) { + const std::string& prepared_statement_handle = request.prepared_statement_handle; const auto& uuid = boost::lexical_cast(prepared_statement_handle); auto search = prepared_statements_.find(uuid); @@ -455,10 +420,9 @@ Status SQLiteFlightSqlServer::ClosePreparedStatement( } Status SQLiteFlightSqlServer::GetFlightInfoPreparedStatement( - const pb::sql::CommandPreparedStatementQuery& command, - const ServerCallContext& context, const FlightDescriptor& descriptor, - std::unique_ptr* info) { - const std::string& prepared_statement_handle = command.prepared_statement_handle(); + const PreparedStatementQuery& command, const ServerCallContext& context, + const FlightDescriptor& descriptor, std::unique_ptr* info) { + const std::string& prepared_statement_handle = command.prepared_statement_handle; const auto& uuid = boost::lexical_cast(prepared_statement_handle); auto search = prepared_statements_.find(uuid); @@ -471,13 +435,13 @@ Status SQLiteFlightSqlServer::GetFlightInfoPreparedStatement( std::shared_ptr schema; ARROW_RETURN_NOT_OK(statement->GetSchema(&schema)); - return GetFlightInfoForCommand(descriptor, info, command, schema); + return GetFlightInfoForCommand(descriptor, info, schema); } Status SQLiteFlightSqlServer::DoGetPreparedStatement( - const pb::sql::CommandPreparedStatementQuery& command, - const ServerCallContext& context, std::unique_ptr* result) { - const std::string& prepared_statement_handle = command.prepared_statement_handle(); + const PreparedStatementQuery& command, const ServerCallContext& context, + std::unique_ptr* result) { + const std::string& prepared_statement_handle = command.prepared_statement_handle; const auto& uuid = boost::lexical_cast(prepared_statement_handle); auto search = prepared_statements_.find(uuid); @@ -510,10 +474,10 @@ Status SQLiteFlightSqlServer::GetStatementByHandle( } Status SQLiteFlightSqlServer::DoPutPreparedStatementQuery( - const pb::sql::CommandPreparedStatementQuery& command, - const ServerCallContext& context, std::unique_ptr& reader, + const PreparedStatementQuery& command, const ServerCallContext& context, + std::unique_ptr& reader, std::unique_ptr& writer) { - const std::string& prepared_statement_handle = command.prepared_statement_handle(); + const std::string& prepared_statement_handle = command.prepared_statement_handle; std::shared_ptr statement; ARROW_RETURN_NOT_OK(GetStatementByHandle(prepared_statement_handle, &statement)); @@ -523,11 +487,10 @@ Status SQLiteFlightSqlServer::DoPutPreparedStatementQuery( return Status::OK(); } -Status SQLiteFlightSqlServer::DoPutPreparedStatementUpdate( - const pb::sql::CommandPreparedStatementUpdate& command, - const ServerCallContext& context, std::unique_ptr& reader, - std::unique_ptr& writer) { - const std::string& prepared_statement_handle = command.prepared_statement_handle(); +arrow::Result SQLiteFlightSqlServer::DoPutPreparedStatementUpdate( + const PreparedStatementUpdate& command, const ServerCallContext& context, + std::unique_ptr& reader) { + const std::string& prepared_statement_handle = command.prepared_statement_handle; std::shared_ptr statement; ARROW_RETURN_NOT_OK(GetStatementByHandle(prepared_statement_handle, &statement)); @@ -538,21 +501,13 @@ Status SQLiteFlightSqlServer::DoPutPreparedStatementUpdate( int64_t record_count; ARROW_RETURN_NOT_OK(statement->ExecuteUpdate(&record_count)); - pb::sql::DoPutUpdateResult result; - result.set_record_count(record_count); - - const std::shared_ptr& buffer = Buffer::FromString(result.SerializeAsString()); - ARROW_RETURN_NOT_OK(writer->WriteMetadata(*buffer)); - - return Status::OK(); + return record_count; } Status SQLiteFlightSqlServer::GetFlightInfoTableTypes(const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info) { - pb::sql::CommandGetTableTypes command; - return GetFlightInfoForCommand(descriptor, info, command, - SqlSchema::GetTableTypesSchema()); + return GetFlightInfoForCommand(descriptor, info, SqlSchema::GetTableTypesSchema()); } Status SQLiteFlightSqlServer::DoGetTableTypes(const ServerCallContext& context, @@ -563,14 +518,13 @@ Status SQLiteFlightSqlServer::DoGetTableTypes(const ServerCallContext& context, } Status SQLiteFlightSqlServer::GetFlightInfoPrimaryKeys( - const pb::sql::CommandGetPrimaryKeys& command, const ServerCallContext& context, + const GetPrimaryKeys& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info) { - return GetFlightInfoForCommand(descriptor, info, command, - SqlSchema::GetPrimaryKeysSchema()); + return GetFlightInfoForCommand(descriptor, info, SqlSchema::GetPrimaryKeysSchema()); } Status SQLiteFlightSqlServer::DoGetPrimaryKeys( - const pb::sql::CommandGetPrimaryKeys& command, const ServerCallContext& context, + const GetPrimaryKeys& command, const ServerCallContext& context, std::unique_ptr* result) { std::stringstream table_query; @@ -583,15 +537,15 @@ Status SQLiteFlightSqlServer::DoGetPrimaryKeys( "table_name, type as table_type\n" "FROM sqlite_master) where 1=1 and pk != 0"; - if (command.has_catalog()) { - table_query << " and catalog_name LIKE '" << command.catalog() << "'"; + if (command.has_catalog) { + table_query << " and catalog_name LIKE '" << command.catalog << "'"; } - if (command.has_schema()) { - table_query << " and schema_name LIKE '" << command.schema() << "'"; + if (command.has_schema) { + table_query << " and schema_name LIKE '" << command.schema << "'"; } - table_query << " and table_name LIKE '" << command.table() << "'"; + table_query << " and table_name LIKE '" << command.table << "'"; return DoGetSQLiteQuery(db_, table_query.str(), SqlSchema::GetPrimaryKeysSchema(), result); @@ -631,21 +585,20 @@ std::string PrepareQueryForGetImportedOrExportedKeys(const std::string& filter) } Status SQLiteFlightSqlServer::GetFlightInfoImportedKeys( - const pb::sql::CommandGetImportedKeys& command, const ServerCallContext& context, + const GetImportedKeys& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info) { - return GetFlightInfoForCommand(descriptor, info, command, - SqlSchema::GetImportedKeysSchema()); + return GetFlightInfoForCommand(descriptor, info, SqlSchema::GetImportedKeysSchema()); } Status SQLiteFlightSqlServer::DoGetImportedKeys( - const pb::sql::CommandGetImportedKeys& command, const ServerCallContext& context, + const GetImportedKeys& command, const ServerCallContext& context, std::unique_ptr* result) { - std::string filter = "fk_table_name = '" + command.table() + "'"; - if (command.has_catalog()) { - filter += " AND fk_catalog_name = '" + command.catalog() + "'"; + std::string filter = "fk_table_name = '" + command.table + "'"; + if (command.has_catalog) { + filter += " AND fk_catalog_name = '" + command.catalog + "'"; } - if (command.has_schema()) { - filter += " AND fk_schema_name = '" + command.schema() + "'"; + if (command.has_schema) { + filter += " AND fk_schema_name = '" + command.schema + "'"; } std::string query = PrepareQueryForGetImportedOrExportedKeys(filter); @@ -653,21 +606,20 @@ Status SQLiteFlightSqlServer::DoGetImportedKeys( } Status SQLiteFlightSqlServer::GetFlightInfoExportedKeys( - const pb::sql::CommandGetExportedKeys& command, const ServerCallContext& context, + const GetExportedKeys& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info) { - return GetFlightInfoForCommand(descriptor, info, command, - SqlSchema::GetExportedKeysSchema()); + return GetFlightInfoForCommand(descriptor, info, SqlSchema::GetExportedKeysSchema()); } Status SQLiteFlightSqlServer::DoGetExportedKeys( - const pb::sql::CommandGetExportedKeys& command, const ServerCallContext& context, + const GetExportedKeys& command, const ServerCallContext& context, std::unique_ptr* result) { - std::string filter = "pk_table_name = '" + command.table() + "'"; - if (command.has_catalog()) { - filter += " AND pk_catalog_name = '" + command.catalog() + "'"; + std::string filter = "pk_table_name = '" + command.table + "'"; + if (command.has_catalog) { + filter += " AND pk_catalog_name = '" + command.catalog + "'"; } - if (command.has_schema()) { - filter += " AND pk_schema_name = '" + command.schema() + "'"; + if (command.has_schema) { + filter += " AND pk_schema_name = '" + command.schema + "'"; } std::string query = PrepareQueryForGetImportedOrExportedKeys(filter); @@ -675,29 +627,28 @@ Status SQLiteFlightSqlServer::DoGetExportedKeys( } Status SQLiteFlightSqlServer::GetFlightInfoCrossReference( - const pb::sql::CommandGetCrossReference& command, const ServerCallContext& context, + const GetCrossReference& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info) { - return GetFlightInfoForCommand(descriptor, info, command, - SqlSchema::GetCrossReferenceSchema()); + return GetFlightInfoForCommand(descriptor, info, SqlSchema::GetCrossReferenceSchema()); } Status SQLiteFlightSqlServer::DoGetCrossReference( - const pb::sql::CommandGetCrossReference& command, const ServerCallContext& context, + const GetCrossReference& command, const ServerCallContext& context, std::unique_ptr* result) { - std::string filter = "pk_table_name = '" + command.pk_table() + "'"; - if (command.has_pk_catalog()) { - filter += " AND pk_catalog_name = '" + command.pk_catalog() + "'"; + std::string filter = "pk_table_name = '" + command.pk_table + "'"; + if (command.has_pk_catalog) { + filter += " AND pk_catalog_name = '" + command.pk_catalog + "'"; } - if (command.has_pk_schema()) { - filter += " AND pk_schema_name = '" + command.pk_schema() + "'"; + if (command.has_pk_schema) { + filter += " AND pk_schema_name = '" + command.pk_schema + "'"; } - filter += " AND fk_table_name = '" + command.fk_table() + "'"; - if (command.has_fk_catalog()) { - filter += " AND fk_catalog_name = '" + command.fk_catalog() + "'"; + filter += " AND fk_table_name = '" + command.fk_table + "'"; + if (command.has_fk_catalog) { + filter += " AND fk_catalog_name = '" + command.fk_catalog + "'"; } - if (command.has_fk_schema()) { - filter += " AND fk_schema_name = '" + command.fk_schema() + "'"; + if (command.has_fk_schema) { + filter += " AND fk_schema_name = '" + command.fk_schema + "'"; } std::string query = PrepareQueryForGetImportedOrExportedKeys(filter); diff --git a/cpp/src/arrow/flight/flight-sql/example/sqlite_server.h b/cpp/src/arrow/flight/flight-sql/example/sqlite_server.h index d3890c6dba746..9b5bb0b5d0278 100644 --- a/cpp/src/arrow/flight/flight-sql/example/sqlite_server.h +++ b/cpp/src/arrow/flight/flight-sql/example/sqlite_server.h @@ -60,12 +60,12 @@ class SQLiteFlightSqlServer : public FlightSqlServerBase { /// SQLite database. void ExecuteSql(const std::string& sql); - Status GetFlightInfoStatement(const pb::sql::CommandStatementQuery& command, + Status GetFlightInfoStatement(const StatementQuery& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info) override; - Status DoGetStatement(const pb::sql::TicketStatementQuery& command, + Status DoGetStatement(const StatementQueryTicket& command, const ServerCallContext& context, std::unique_ptr* result) override; Status GetFlightInfoCatalogs(const ServerCallContext& context, @@ -73,81 +73,74 @@ class SQLiteFlightSqlServer : public FlightSqlServerBase { std::unique_ptr* info) override; Status DoGetCatalogs(const ServerCallContext& context, std::unique_ptr* result) override; - Status GetFlightInfoSchemas(const pb::sql::CommandGetSchemas& command, - const ServerCallContext& context, + Status GetFlightInfoSchemas(const GetSchemas& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info) override; - Status DoGetSchemas(const pb::sql::CommandGetSchemas& command, - const ServerCallContext& context, + Status DoGetSchemas(const GetSchemas& command, const ServerCallContext& context, std::unique_ptr* result) override; - Status DoPutCommandStatementUpdate( - const pb::sql::CommandStatementUpdate& update, const ServerCallContext& context, - std::unique_ptr& reader, - std::unique_ptr& writer) override; - Status CreatePreparedStatement( - const pb::sql::ActionCreatePreparedStatementRequest& request, - const ServerCallContext& context, std::unique_ptr* result) override; - Status ClosePreparedStatement( - const pb::sql::ActionClosePreparedStatementRequest& request, - const ServerCallContext& context, std::unique_ptr* result) override; - Status GetFlightInfoPreparedStatement( - const pb::sql::CommandPreparedStatementQuery& command, - const ServerCallContext& context, const FlightDescriptor& descriptor, - std::unique_ptr* info) override; - Status DoGetPreparedStatement(const pb::sql::CommandPreparedStatementQuery& command, + arrow::Result DoPutCommandStatementUpdate( + const StatementUpdate& update, const ServerCallContext& context, + std::unique_ptr& reader) override; + arrow::Result CreatePreparedStatement( + const ActionCreatePreparedStatementRequest& request, + const ServerCallContext& context) override; + Status ClosePreparedStatement(const ActionClosePreparedStatementRequest& request, + const ServerCallContext& context, + std::unique_ptr* result) override; + Status GetFlightInfoPreparedStatement(const PreparedStatementQuery& command, + const ServerCallContext& context, + const FlightDescriptor& descriptor, + std::unique_ptr* info) override; + Status DoGetPreparedStatement(const PreparedStatementQuery& command, const ServerCallContext& context, std::unique_ptr* result) override; Status DoPutPreparedStatementQuery( - const pb::sql::CommandPreparedStatementQuery& command, - const ServerCallContext& context, std::unique_ptr& reader, - std::unique_ptr& writer) override; - Status DoPutPreparedStatementUpdate( - const pb::sql::CommandPreparedStatementUpdate& command, - const ServerCallContext& context, std::unique_ptr& reader, + const PreparedStatementQuery& command, const ServerCallContext& context, + std::unique_ptr& reader, std::unique_ptr& writer) override; + arrow::Result DoPutPreparedStatementUpdate( + const PreparedStatementUpdate& command, const ServerCallContext& context, + std::unique_ptr& reader) override; - Status GetFlightInfoTables(const pb::sql::CommandGetTables& command, - const ServerCallContext& context, + Status GetFlightInfoTables(const GetTables& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info) override; - Status DoGetTables(const pb::sql::CommandGetTables& command, - const ServerCallContext& context, + Status DoGetTables(const GetTables& command, const ServerCallContext& context, std::unique_ptr* result) override; Status GetFlightInfoTableTypes(const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info) override; Status DoGetTableTypes(const ServerCallContext& context, std::unique_ptr* result) override; - Status GetFlightInfoImportedKeys(const pb::sql::CommandGetImportedKeys& command, + Status GetFlightInfoImportedKeys(const GetImportedKeys& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info) override; - Status DoGetImportedKeys(const pb::sql::CommandGetImportedKeys& command, + Status DoGetImportedKeys(const GetImportedKeys& command, const ServerCallContext& context, std::unique_ptr* result) override; - Status GetFlightInfoExportedKeys(const pb::sql::CommandGetExportedKeys& command, + Status GetFlightInfoExportedKeys(const GetExportedKeys& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info) override; - Status DoGetExportedKeys(const pb::sql::CommandGetExportedKeys& command, + Status DoGetExportedKeys(const GetExportedKeys& command, const ServerCallContext& context, std::unique_ptr* result) override; - Status GetFlightInfoCrossReference(const pb::sql::CommandGetCrossReference& command, + Status GetFlightInfoCrossReference(const GetCrossReference& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info) override; - Status DoGetCrossReference(const pb::sql::CommandGetCrossReference& command, + Status DoGetCrossReference(const GetCrossReference& command, const ServerCallContext& context, std::unique_ptr* result) override; - Status GetFlightInfoPrimaryKeys(const pb::sql::CommandGetPrimaryKeys& command, + Status GetFlightInfoPrimaryKeys(const GetPrimaryKeys& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info) override; - Status DoGetPrimaryKeys(const pb::sql::CommandGetPrimaryKeys& command, - const ServerCallContext& context, + Status DoGetPrimaryKeys(const GetPrimaryKeys& command, const ServerCallContext& context, std::unique_ptr* result) override; private: diff --git a/cpp/src/arrow/flight/flight-sql/server.cc b/cpp/src/arrow/flight/flight-sql/server.cc index 17b2ec902da2a..b8682e947d1c1 100644 --- a/cpp/src/arrow/flight/flight-sql/server.cc +++ b/cpp/src/arrow/flight/flight-sql/server.cc @@ -18,13 +18,177 @@ // Interfaces to use for defining Flight RPC servers. API should be considered // experimental for now -#include "arrow/flight/flight-sql/server.h" +#include "server.h" +#include +#include +#include + +#include "arrow/api.h" #include "arrow/buffer.h" +std::string arrow::flight::sql::FlightSqlServerBase::CreateStatementQueryTicket( + const std::string& statement_handle) { + protocol::sql::TicketStatementQuery ticket_statement_query; + ticket_statement_query.set_statement_handle(statement_handle); + + google::protobuf::Any ticket; + ticket.PackFrom(ticket_statement_query); + + const std::string& ticket_string = ticket.SerializeAsString(); + return ticket_string; +} + namespace arrow { namespace flight { namespace sql { + +namespace pb = arrow::flight::protocol; + +GetCrossReference ParseCommandGetCrossReference(const google::protobuf::Any& any) { + pb::sql::CommandGetCrossReference command; + any.UnpackTo(&command); + + return (GetCrossReference){.has_pk_catalog = command.has_pk_catalog(), + .pk_catalog = command.pk_catalog(), + .has_pk_schema = command.has_pk_schema(), + .pk_schema = command.pk_schema(), + .pk_table = command.pk_table(), + .has_fk_catalog = command.has_fk_catalog(), + .fk_catalog = command.fk_catalog(), + .has_fk_schema = command.has_fk_schema(), + .fk_schema = command.fk_schema(), + .fk_table = command.fk_table()}; +} + +GetImportedKeys ParseCommandGetImportedKeys(const google::protobuf::Any& any) { + pb::sql::CommandGetImportedKeys command; + any.UnpackTo(&command); + + return (GetImportedKeys){.has_catalog = command.has_catalog(), + .catalog = command.catalog(), + .has_schema = command.has_schema(), + .schema = command.schema(), + .table = command.table()}; +} + +GetExportedKeys ParseCommandGetExportedKeys(const google::protobuf::Any& any) { + pb::sql::CommandGetExportedKeys command; + any.UnpackTo(&command); + + return (GetExportedKeys){.has_catalog = command.has_catalog(), + .catalog = command.catalog(), + .has_schema = command.has_schema(), + .schema = command.schema(), + .table = command.table()}; +} + +GetPrimaryKeys ParseCommandGetPrimaryKeys(const google::protobuf::Any& any) { + pb::sql::CommandGetPrimaryKeys command; + any.UnpackTo(&command); + + return (GetPrimaryKeys){.has_catalog = command.has_catalog(), + .catalog = command.catalog(), + .has_schema = command.has_schema(), + .schema = command.schema(), + .table = command.table()}; +} + +GetSqlInfo ParseCommandGetSqlInfo(const google::protobuf::Any& any) { + pb::sql::CommandGetSqlInfo command; + any.UnpackTo(&command); + + return (GetSqlInfo){}; +} + +GetSchemas ParseCommandGetSchemas(const google::protobuf::Any& any) { + pb::sql::CommandGetSchemas command; + any.UnpackTo(&command); + + return (GetSchemas){ + .has_catalog = command.has_catalog(), + .catalog = command.catalog(), + .has_schema_filter_pattern = command.has_schema_filter_pattern(), + .schema_filter_pattern = command.schema_filter_pattern(), + }; +} + +PreparedStatementQuery ParseCommandPreparedStatementQuery( + const google::protobuf::Any& any) { + pb::sql::CommandPreparedStatementQuery command; + any.UnpackTo(&command); + + return (PreparedStatementQuery){.prepared_statement_handle = + command.prepared_statement_handle()}; +} + +StatementQuery ParseCommandStatementQuery(const google::protobuf::Any& any) { + pb::sql::CommandStatementQuery command; + any.UnpackTo(&command); + + return (StatementQuery){.query = command.query()}; +} + +GetTables ParseCommandGetTables(const google::protobuf::Any& anyCommand) { + pb::sql::CommandGetTables command; + anyCommand.UnpackTo(&command); + + std::vector table_types; + table_types.reserve(command.table_types_size()); + for (const auto& item : command.table_types()) { + table_types.push_back(item); + } + return (GetTables){ + .has_catalog = command.has_catalog(), + .catalog = command.catalog(), + .has_schema_filter_pattern = command.has_schema_filter_pattern(), + .schema_filter_pattern = command.schema_filter_pattern(), + .has_table_name_filter_pattern = command.has_table_name_filter_pattern(), + .table_name_filter_pattern = command.table_name_filter_pattern(), + .table_types = table_types, + .include_schema = command.include_schema()}; +} + +StatementQueryTicket ParseStatementQueryTicket(const google::protobuf::Any& anyCommand) { + pb::sql::TicketStatementQuery command; + anyCommand.UnpackTo(&command); + + return (StatementQueryTicket){.statement_handle = command.statement_handle()}; +} + +StatementUpdate ParseCommandStatementUpdate(const google::protobuf::Any& any) { + pb::sql::CommandStatementUpdate command; + any.UnpackTo(&command); + + return (StatementUpdate){.query = command.query()}; +} + +PreparedStatementUpdate ParseCommandPreparedStatementUpdate( + const google::protobuf::Any& any) { + pb::sql::CommandPreparedStatementUpdate command; + any.UnpackTo(&command); + + return (PreparedStatementUpdate){.prepared_statement_handle = + command.prepared_statement_handle()}; +} + +ActionCreatePreparedStatementRequest ParseActionCreatePreparedStatementRequest( + const google::protobuf::Any& anyCommand) { + pb::sql::ActionCreatePreparedStatementRequest command; + anyCommand.UnpackTo(&command); + + return (ActionCreatePreparedStatementRequest){.query = command.query()}; +} + +ActionClosePreparedStatementRequest ParseActionClosePreparedStatementRequest( + const google::protobuf::Any& anyCommand) { + pb::sql::ActionClosePreparedStatementRequest command; + anyCommand.UnpackTo(&command); + + return (ActionClosePreparedStatementRequest){.prepared_statement_handle = + command.prepared_statement_handle()}; +} + Status FlightSqlServerBase::GetFlightInfo(const ServerCallContext& context, const FlightDescriptor& request, std::unique_ptr* info) { @@ -32,49 +196,36 @@ Status FlightSqlServerBase::GetFlightInfo(const ServerCallContext& context, any.ParseFromArray(request.cmd.data(), static_cast(request.cmd.size())); if (any.Is()) { - pb::sql::CommandStatementQuery command; - any.UnpackTo(&command); - return GetFlightInfoStatement(command, context, request, info); + StatementQuery internal_command = ParseCommandStatementQuery(any); + return GetFlightInfoStatement(internal_command, context, request, info); } else if (any.Is()) { - pb::sql::CommandPreparedStatementQuery command; - any.UnpackTo(&command); - return GetFlightInfoPreparedStatement(command, context, request, info); + PreparedStatementQuery internal_command = ParseCommandPreparedStatementQuery(any); + return GetFlightInfoPreparedStatement(internal_command, context, request, info); } else if (any.Is()) { - pb::sql::CommandGetCatalogs command; - any.UnpackTo(&command); return GetFlightInfoCatalogs(context, request, info); } else if (any.Is()) { - pb::sql::CommandGetSchemas command; - any.UnpackTo(&command); - return GetFlightInfoSchemas(command, context, request, info); + GetSchemas internal_command = ParseCommandGetSchemas(any); + return GetFlightInfoSchemas(internal_command, context, request, info); } else if (any.Is()) { - pb::sql::CommandGetTables command; - any.UnpackTo(&command); + GetTables command = ParseCommandGetTables(any); return GetFlightInfoTables(command, context, request, info); } else if (any.Is()) { - pb::sql::CommandGetTableTypes command; - any.UnpackTo(&command); return GetFlightInfoTableTypes(context, request, info); } else if (any.Is()) { - pb::sql::CommandGetSqlInfo command; - any.UnpackTo(&command); - return GetFlightInfoSqlInfo(command, context, request, info); + GetSqlInfo internal_command = ParseCommandGetSqlInfo(any); + return GetFlightInfoSqlInfo(internal_command, context, request, info); } else if (any.Is()) { - pb::sql::CommandGetPrimaryKeys command; - any.UnpackTo(&command); - return GetFlightInfoPrimaryKeys(command, context, request, info); + GetPrimaryKeys internal_command = ParseCommandGetPrimaryKeys(any); + return GetFlightInfoPrimaryKeys(internal_command, context, request, info); } else if (any.Is()) { - pb::sql::CommandGetExportedKeys command; - any.UnpackTo(&command); - return GetFlightInfoExportedKeys(command, context, request, info); + GetExportedKeys internal_command = ParseCommandGetExportedKeys(any); + return GetFlightInfoExportedKeys(internal_command, context, request, info); } else if (any.Is()) { - pb::sql::CommandGetImportedKeys command; - any.UnpackTo(&command); - return GetFlightInfoImportedKeys(command, context, request, info); + GetImportedKeys internal_command = ParseCommandGetImportedKeys(any); + return GetFlightInfoImportedKeys(internal_command, context, request, info); } else if (any.Is()) { - pb::sql::CommandGetCrossReference command; - any.UnpackTo(&command); - return GetFlightInfoCrossReference(command, context, request, info); + GetCrossReference internal_command = ParseCommandGetCrossReference(any); + return GetFlightInfoCrossReference(internal_command, context, request, info); } return Status::Invalid("The defined request is invalid."); @@ -88,49 +239,37 @@ Status FlightSqlServerBase::DoGet(const ServerCallContext& context, const Ticket static_cast(request.ticket.size())); if (anyCommand.Is()) { - pb::sql::TicketStatementQuery command; - anyCommand.UnpackTo(&command); + StatementQueryTicket command = ParseStatementQueryTicket(anyCommand); return DoGetStatement(command, context, stream); } else if (anyCommand.Is()) { - pb::sql::CommandPreparedStatementQuery command; - anyCommand.UnpackTo(&command); - return DoGetPreparedStatement(command, context, stream); + PreparedStatementQuery internal_command = + ParseCommandPreparedStatementQuery(anyCommand); + return DoGetPreparedStatement(internal_command, context, stream); } else if (anyCommand.Is()) { - pb::sql::CommandGetCatalogs command; - anyCommand.UnpackTo(&command); return DoGetCatalogs(context, stream); } else if (anyCommand.Is()) { - pb::sql::CommandGetSchemas command; - anyCommand.UnpackTo(&command); - return DoGetSchemas(command, context, stream); + GetSchemas internal_command = ParseCommandGetSchemas(anyCommand); + return DoGetSchemas(internal_command, context, stream); } else if (anyCommand.Is()) { - pb::sql::CommandGetTables command; - anyCommand.UnpackTo(&command); + GetTables command = ParseCommandGetTables(anyCommand); return DoGetTables(command, context, stream); } else if (anyCommand.Is()) { - pb::sql::CommandGetTableTypes command; - anyCommand.UnpackTo(&command); return DoGetTableTypes(context, stream); } else if (anyCommand.Is()) { - pb::sql::CommandGetSqlInfo command; - anyCommand.UnpackTo(&command); - return DoGetSqlInfo(command, context, stream); + GetSqlInfo internal_command = ParseCommandGetSqlInfo(anyCommand); + return DoGetSqlInfo(internal_command, context, stream); } else if (anyCommand.Is()) { - pb::sql::CommandGetPrimaryKeys command; - anyCommand.UnpackTo(&command); - return DoGetPrimaryKeys(command, context, stream); + GetPrimaryKeys internal_command = ParseCommandGetPrimaryKeys(anyCommand); + return DoGetPrimaryKeys(internal_command, context, stream); } else if (anyCommand.Is()) { - pb::sql::CommandGetExportedKeys command; - anyCommand.UnpackTo(&command); - return DoGetExportedKeys(command, context, stream); + GetExportedKeys internal_command = ParseCommandGetExportedKeys(anyCommand); + return DoGetExportedKeys(internal_command, context, stream); } else if (anyCommand.Is()) { - pb::sql::CommandGetImportedKeys command; - anyCommand.UnpackTo(&command); - return DoGetImportedKeys(command, context, stream); + GetImportedKeys internal_command = ParseCommandGetImportedKeys(anyCommand); + return DoGetImportedKeys(internal_command, context, stream); } else if (anyCommand.Is()) { - pb::sql::CommandGetCrossReference command; - anyCommand.UnpackTo(&command); - return DoGetCrossReference(command, context, stream); + GetCrossReference internal_command = ParseCommandGetCrossReference(anyCommand); + return DoGetCrossReference(internal_command, context, stream); } return Status::Invalid("The defined request is invalid."); @@ -145,17 +284,34 @@ Status FlightSqlServerBase::DoPut(const ServerCallContext& context, any.ParseFromArray(request.cmd.data(), static_cast(request.cmd.size())); if (any.Is()) { - pb::sql::CommandStatementUpdate command; - any.UnpackTo(&command); - return DoPutCommandStatementUpdate(command, context, reader, writer); + StatementUpdate internal_command = ParseCommandStatementUpdate(any); + ARROW_ASSIGN_OR_RAISE(auto record_count, + DoPutCommandStatementUpdate(internal_command, context, reader)) + + pb::sql::DoPutUpdateResult result; + result.set_record_count(record_count); + + const std::shared_ptr& buffer = + Buffer::FromString(result.SerializeAsString()); + ARROW_RETURN_NOT_OK(writer->WriteMetadata(*buffer)); + + return Status::OK(); } else if (any.Is()) { - pb::sql::CommandPreparedStatementQuery command; - any.UnpackTo(&command); - return DoPutPreparedStatementQuery(command, context, reader, writer); + PreparedStatementQuery internal_command = ParseCommandPreparedStatementQuery(any); + return DoPutPreparedStatementQuery(internal_command, context, reader, writer); } else if (any.Is()) { - pb::sql::CommandPreparedStatementUpdate command; - any.UnpackTo(&command); - return DoPutPreparedStatementUpdate(command, context, reader, writer); + PreparedStatementUpdate internal_command = ParseCommandPreparedStatementUpdate(any); + ARROW_ASSIGN_OR_RAISE(auto record_count, + DoPutPreparedStatementUpdate(internal_command, context, reader)) + + pb::sql::DoPutUpdateResult result; + result.set_record_count(record_count); + + const std::shared_ptr& buffer = + Buffer::FromString(result.SerializeAsString()); + ARROW_RETURN_NOT_OK(writer->WriteMetadata(*buffer)); + + return Status::OK(); } return Status::Invalid("The defined request is invalid."); @@ -170,24 +326,44 @@ Status FlightSqlServerBase::ListActions(const ServerCallContext& context, Status FlightSqlServerBase::DoAction(const ServerCallContext& context, const Action& action, - std::unique_ptr* result) { + std::unique_ptr* result_stream) { if (action.type == FlightSqlServerBase::FLIGHT_SQL_CREATE_PREPARED_STATEMENT.type) { google::protobuf::Any anyCommand; anyCommand.ParseFromArray(action.body->data(), static_cast(action.body->size())); - pb::sql::ActionCreatePreparedStatementRequest command; - anyCommand.UnpackTo(&command); - - return CreatePreparedStatement(command, context, result); + ActionCreatePreparedStatementRequest internal_command = + ParseActionCreatePreparedStatementRequest(anyCommand); + ARROW_ASSIGN_OR_RAISE(auto result, CreatePreparedStatement(internal_command, context)) + + pb::sql::ActionCreatePreparedStatementResult action_result; + action_result.set_prepared_statement_handle(result.prepared_statement_handle); + if (result.dataset_schema != nullptr) { + ARROW_ASSIGN_OR_RAISE(auto serialized_dataset_schema, + ipc::SerializeSchema(*result.dataset_schema)) + action_result.set_dataset_schema(serialized_dataset_schema->ToString()); + } + if (result.parameter_schema != nullptr) { + ARROW_ASSIGN_OR_RAISE(auto serialized_parameter_schema, + ipc::SerializeSchema(*result.parameter_schema)) + action_result.set_parameter_schema(serialized_parameter_schema->ToString()); + } + + google::protobuf::Any any; + any.PackFrom(action_result); + + auto buf = Buffer::FromString(any.SerializeAsString()); + *result_stream = std::unique_ptr(new SimpleResultStream({Result{buf}})); + + return Status::OK(); } else if (action.type == FlightSqlServerBase::FLIGHT_SQL_CLOSE_PREPARED_STATEMENT.type) { google::protobuf::Any anyCommand; anyCommand.ParseFromArray(action.body->data(), static_cast(action.body->size())); - pb::sql::ActionClosePreparedStatementRequest command; - anyCommand.UnpackTo(&command); + ActionClosePreparedStatementRequest internal_command = + ParseActionClosePreparedStatementRequest(anyCommand); - return ClosePreparedStatement(command, context, result); + return ClosePreparedStatement(internal_command, context, result_stream); } return Status::Invalid("The defined request is invalid."); } @@ -203,63 +379,65 @@ Status FlightSqlServerBase::DoGetCatalogs(const ServerCallContext& context, return Status::NotImplemented("DoGetCatalogs not implemented"); } -Status FlightSqlServerBase::GetFlightInfoStatement( - const pb::sql::CommandStatementQuery& command, const ServerCallContext& context, - const FlightDescriptor& descriptor, std::unique_ptr* info) { +Status FlightSqlServerBase::GetFlightInfoStatement(const StatementQuery& command, + const ServerCallContext& context, + const FlightDescriptor& descriptor, + std::unique_ptr* info) { return Status::NotImplemented("GetFlightInfoStatement not implemented"); } -Status FlightSqlServerBase::DoGetStatement(const pb::sql::TicketStatementQuery& command, +Status FlightSqlServerBase::DoGetStatement(const StatementQueryTicket& command, const ServerCallContext& context, std::unique_ptr* result) { return Status::NotImplemented("DoGetStatement not implemented"); } Status FlightSqlServerBase::GetFlightInfoPreparedStatement( - const pb::sql::CommandPreparedStatementQuery& command, - const ServerCallContext& context, const FlightDescriptor& descriptor, - std::unique_ptr* info) { + const PreparedStatementQuery& command, const ServerCallContext& context, + const FlightDescriptor& descriptor, std::unique_ptr* info) { return Status::NotImplemented("GetFlightInfoPreparedStatement not implemented"); } Status FlightSqlServerBase::DoGetPreparedStatement( - const pb::sql::CommandPreparedStatementQuery& command, - const ServerCallContext& context, std::unique_ptr* result) { + const PreparedStatementQuery& command, const ServerCallContext& context, + std::unique_ptr* result) { return Status::NotImplemented("DoGetPreparedStatement not implemented"); } -Status FlightSqlServerBase::GetFlightInfoSqlInfo( - const pb::sql::CommandGetSqlInfo& command, const ServerCallContext& context, - const FlightDescriptor& descriptor, std::unique_ptr* info) { +Status FlightSqlServerBase::GetFlightInfoSqlInfo(const GetSqlInfo& command, + const ServerCallContext& context, + const FlightDescriptor& descriptor, + std::unique_ptr* info) { return Status::NotImplemented("GetFlightInfoSqlInfo not implemented"); } -Status FlightSqlServerBase::DoGetSqlInfo(const pb::sql::CommandGetSqlInfo& command, +Status FlightSqlServerBase::DoGetSqlInfo(const GetSqlInfo& command, const ServerCallContext& context, std::unique_ptr* result) { return Status::NotImplemented("DoGetSqlInfo not implemented"); } -Status FlightSqlServerBase::GetFlightInfoSchemas( - const pb::sql::CommandGetSchemas& command, const ServerCallContext& context, - const FlightDescriptor& descriptor, std::unique_ptr* info) { +Status FlightSqlServerBase::GetFlightInfoSchemas(const GetSchemas& command, + const ServerCallContext& context, + const FlightDescriptor& descriptor, + std::unique_ptr* info) { return Status::NotImplemented("GetFlightInfoSchemas not implemented"); } -Status FlightSqlServerBase::DoGetSchemas(const pb::sql::CommandGetSchemas& command, +Status FlightSqlServerBase::DoGetSchemas(const GetSchemas& command, const ServerCallContext& context, std::unique_ptr* result) { return Status::NotImplemented("DoGetSchemas not implemented"); } -Status FlightSqlServerBase::GetFlightInfoTables(const pb::sql::CommandGetTables& command, +Status FlightSqlServerBase::GetFlightInfoTables(const GetTables& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info) { return Status::NotImplemented("GetFlightInfoTables not implemented"); } -Status FlightSqlServerBase::DoGetTables(const pb::sql::CommandGetTables& command, +Status FlightSqlServerBase::DoGetTables(const GetTables& command, const ServerCallContext& context, std::unique_ptr* result) { return Status::NotImplemented("DoGetTables not implemented"); @@ -276,84 +454,86 @@ Status FlightSqlServerBase::DoGetTableTypes(const ServerCallContext& context, return Status::NotImplemented("DoGetTableTypes not implemented"); } -Status FlightSqlServerBase::GetFlightInfoPrimaryKeys( - const pb::sql::CommandGetPrimaryKeys& command, const ServerCallContext& context, - const FlightDescriptor& descriptor, std::unique_ptr* info) { +Status FlightSqlServerBase::GetFlightInfoPrimaryKeys(const GetPrimaryKeys& command, + const ServerCallContext& context, + const FlightDescriptor& descriptor, + std::unique_ptr* info) { return Status::NotImplemented("GetFlightInfoPrimaryKeys not implemented"); } -Status FlightSqlServerBase::DoGetPrimaryKeys( - const pb::sql::CommandGetPrimaryKeys& command, const ServerCallContext& context, - std::unique_ptr* result) { +Status FlightSqlServerBase::DoGetPrimaryKeys(const GetPrimaryKeys& command, + const ServerCallContext& context, + std::unique_ptr* result) { return Status::NotImplemented("DoGetPrimaryKeys not implemented"); } -Status FlightSqlServerBase::GetFlightInfoExportedKeys( - const pb::sql::CommandGetExportedKeys& command, const ServerCallContext& context, - const FlightDescriptor& descriptor, std::unique_ptr* info) { +Status FlightSqlServerBase::GetFlightInfoExportedKeys(const GetExportedKeys& command, + const ServerCallContext& context, + const FlightDescriptor& descriptor, + std::unique_ptr* info) { return Status::NotImplemented("GetFlightInfoExportedKeys not implemented"); } -Status FlightSqlServerBase::DoGetExportedKeys( - const pb::sql::CommandGetExportedKeys& command, const ServerCallContext& context, - std::unique_ptr* result) { +Status FlightSqlServerBase::DoGetExportedKeys(const GetExportedKeys& command, + const ServerCallContext& context, + std::unique_ptr* result) { return Status::NotImplemented("DoGetExportedKeys not implemented"); } -Status FlightSqlServerBase::GetFlightInfoImportedKeys( - const pb::sql::CommandGetImportedKeys& command, const ServerCallContext& context, - const FlightDescriptor& descriptor, std::unique_ptr* info) { +Status FlightSqlServerBase::GetFlightInfoImportedKeys(const GetImportedKeys& command, + const ServerCallContext& context, + const FlightDescriptor& descriptor, + std::unique_ptr* info) { return Status::NotImplemented("GetFlightInfoImportedKeys not implemented"); } -Status FlightSqlServerBase::DoGetImportedKeys( - const pb::sql::CommandGetImportedKeys& command, const ServerCallContext& context, - std::unique_ptr* result) { +Status FlightSqlServerBase::DoGetImportedKeys(const GetImportedKeys& command, + const ServerCallContext& context, + std::unique_ptr* result) { return Status::NotImplemented("DoGetImportedKeys not implemented"); } Status FlightSqlServerBase::GetFlightInfoCrossReference( - const pb::sql::CommandGetCrossReference& command, const ServerCallContext& context, + const GetCrossReference& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info) { return Status::NotImplemented("GetFlightInfoCrossReference not implemented"); } Status FlightSqlServerBase::DoGetCrossReference( - const pb::sql::CommandGetCrossReference& command, const ServerCallContext& context, + const GetCrossReference& command, const ServerCallContext& context, std::unique_ptr* result) { return Status::NotImplemented("DoGetCrossReference not implemented"); } -Status FlightSqlServerBase::CreatePreparedStatement( - const pb::sql::ActionCreatePreparedStatementRequest& request, - const ServerCallContext& context, std::unique_ptr* p_ptr) { +arrow::Result +FlightSqlServerBase::CreatePreparedStatement( + const ActionCreatePreparedStatementRequest& request, + const ServerCallContext& context) { return Status::NotImplemented("CreatePreparedStatement not implemented"); } Status FlightSqlServerBase::ClosePreparedStatement( - const pb::sql::ActionClosePreparedStatementRequest& request, - const ServerCallContext& context, std::unique_ptr* p_ptr) { + const ActionClosePreparedStatementRequest& request, const ServerCallContext& context, + std::unique_ptr* p_ptr) { return Status::NotImplemented("ClosePreparedStatement not implemented"); } Status FlightSqlServerBase::DoPutPreparedStatementQuery( - const pb::sql::CommandPreparedStatementQuery& command, - const ServerCallContext& context, std::unique_ptr& reader, + const PreparedStatementQuery& command, const ServerCallContext& context, + std::unique_ptr& reader, std::unique_ptr& writer) { return Status::NotImplemented("DoPutPreparedStatementQuery not implemented"); } -Status FlightSqlServerBase::DoPutPreparedStatementUpdate( - const pb::sql::CommandPreparedStatementUpdate& command, - const ServerCallContext& context, std::unique_ptr& reader, - std::unique_ptr& writer) { +arrow::Result FlightSqlServerBase::DoPutPreparedStatementUpdate( + const PreparedStatementUpdate& command, const ServerCallContext& context, + std::unique_ptr& reader) { return Status::NotImplemented("DoPutPreparedStatementUpdate not implemented"); } -Status FlightSqlServerBase::DoPutCommandStatementUpdate( - const pb::sql::CommandStatementUpdate& command, const ServerCallContext& context, - std::unique_ptr& reader, - std::unique_ptr& writer) { +arrow::Result FlightSqlServerBase::DoPutCommandStatementUpdate( + const StatementUpdate& command, const ServerCallContext& context, + std::unique_ptr& reader) { return Status::NotImplemented("DoPutCommandStatementUpdate not implemented"); } diff --git a/cpp/src/arrow/flight/flight-sql/server.h b/cpp/src/arrow/flight/flight-sql/server.h index f48fc7aae145e..2bcfc6b5591fe 100644 --- a/cpp/src/arrow/flight/flight-sql/server.h +++ b/cpp/src/arrow/flight/flight-sql/server.h @@ -23,13 +23,109 @@ #include #include #include +#include -namespace pb = arrow::flight::protocol; +#include +#include + +#include "arrow/api.h" +#include "arrow/flight/flight-sql/example/sqlite_statement.h" +#include "arrow/flight/flight-sql/example/sqlite_statement_batch_reader.h" +#include "arrow/flight/flight-sql/server.h" namespace arrow { namespace flight { namespace sql { +using StatementQuery = struct StatementQuery { std::string query; }; + +using StatementUpdate = struct StatementUpdate { std::string query; }; + +using StatementQueryTicket = struct StatementQueryTicket { + const std::string statement_handle; +}; + +using PreparedStatementQuery = struct PreparedStatementQuery { + const std::string prepared_statement_handle; +}; + +using PreparedStatementUpdate = struct PreparedStatementUpdate { + const std::string prepared_statement_handle; +}; + +using GetSqlInfo = struct GetSqlInfo { + // TODO: To be implemented. +}; + +using GetSchemas = struct GetSchemas { + const bool has_catalog; + const std::string catalog; + const bool has_schema_filter_pattern; + const std::string schema_filter_pattern; +}; + +using GetTables = struct GetTables { + const bool has_catalog; + const std::string catalog; + const bool has_schema_filter_pattern; + const std::string schema_filter_pattern; + const bool has_table_name_filter_pattern; + const std::string table_name_filter_pattern; + const std::vector table_types; + const bool include_schema; +}; + +using GetPrimaryKeys = struct GetPrimaryKeys { + const bool has_catalog; + const std::string catalog; + const bool has_schema; + const std::string schema; + const std::string table; +}; + +using GetExportedKeys = struct GetExportedKeys { + const bool has_catalog; + const std::string catalog; + const bool has_schema; + const std::string schema; + const std::string table; +}; + +using GetImportedKeys = struct GetImportedKeys { + const bool has_catalog; + const std::string catalog; + const bool has_schema; + const std::string schema; + const std::string table; +}; + +using GetCrossReference = struct GetCrossReference { + const bool has_pk_catalog; + const std::string pk_catalog; + const bool has_pk_schema; + const std::string pk_schema; + const std::string pk_table; + const bool has_fk_catalog; + const std::string fk_catalog; + const bool has_fk_schema; + const std::string fk_schema; + const std::string fk_table; +}; + +using ActionCreatePreparedStatementRequest = struct ActionCreatePreparedStatementRequest { + const std::string query; +}; + +using ActionClosePreparedStatementRequest = struct ActionClosePreparedStatementRequest { + const std::string prepared_statement_handle; +}; + +using ActionCreatePreparedStatementResult = struct ActionCreatePreparedStatementResult { + const std::shared_ptr dataset_schema; + const std::shared_ptr parameter_schema; + const std::string prepared_statement_handle; +}; + class FlightSqlServerBase : public FlightServerBase { public: Status GetFlightInfo(const ServerCallContext& context, const FlightDescriptor& request, @@ -62,50 +158,49 @@ class FlightSqlServerBase : public FlightServerBase { std::unique_ptr* result) override; /// \brief Gets a FlightInfo for executing a SQL query. - /// \param[in] command The CommandStatementQuery object containing the SQL - /// statement. + /// \param[in] command The StatementQuery object containing the SQL statement. /// \param[in] context Per-call context. /// \param[in] descriptor The descriptor identifying the data stream. /// \param[out] info The FlightInfo describing where to access the dataset. /// \return Status. - virtual Status GetFlightInfoStatement(const pb::sql::CommandStatementQuery& command, + virtual Status GetFlightInfoStatement(const StatementQuery& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info); /// \brief Gets a FlightDataStream containing the query results. - /// \param[in] command The TicketStatementQuery containing the statement handle. + /// \param[in] command The StatementQueryTicket containing the statement handle. /// \param[in] context Per-call context. /// \param[in] descriptor The descriptor identifying the data stream. /// \param[out] result The FlightDataStream containing the results. /// \return Status. - virtual Status DoGetStatement(const pb::sql::TicketStatementQuery& command, + virtual Status DoGetStatement(const StatementQueryTicket& command, const ServerCallContext& context, std::unique_ptr* result); /// \brief Gets a FlightInfo for executing an already created prepared statement. - /// \param[in] command The CommandPreparedStatementQuery object containing the + /// \param[in] command The PreparedStatementQuery object containing the /// prepared statement handle. /// \param[in] context Per-call context. /// \param[in] descriptor The descriptor identifying the data stream. /// \param[out] info The FlightInfo describing where to access the /// dataset. /// \return Status. - virtual Status GetFlightInfoPreparedStatement( - const pb::sql::CommandPreparedStatementQuery& command, - const ServerCallContext& context, const FlightDescriptor& descriptor, - std::unique_ptr* info); + virtual Status GetFlightInfoPreparedStatement(const PreparedStatementQuery& command, + const ServerCallContext& context, + const FlightDescriptor& descriptor, + std::unique_ptr* info); /// \brief Gets a FlightDataStream containing the prepared statement query results. - /// \param[in] command The CommandPreparedStatementQuery object containing the + /// \param[in] command The PreparedStatementQuery object containing the /// prepared statement handle. /// \param[in] context Per-call context. /// \param[in] descriptor The descriptor identifying the data stream. /// \param[out] result The FlightDataStream containing the results. /// \return Status. - virtual Status DoGetPreparedStatement( - const pb::sql::CommandPreparedStatementQuery& command, - const ServerCallContext& context, std::unique_ptr* result); + virtual Status DoGetPreparedStatement(const PreparedStatementQuery& command, + const ServerCallContext& context, + std::unique_ptr* result); /// \brief Gets a FlightInfo for listing catalogs. /// \param[in] context Per-call context. @@ -124,69 +219,66 @@ class FlightSqlServerBase : public FlightServerBase { std::unique_ptr* result); /// \brief Gets a FlightInfo for retrieving other information (See SqlInfo). - /// \param[in] command The CommandGetSqlInfo object containing the list of SqlInfo + /// \param[in] command The GetSqlInfo object containing the list of SqlInfo /// to be returned. /// \param[in] context Per-call context. /// \param[in] descriptor The descriptor identifying the data stream. /// \param[out] info The FlightInfo describing where to access the dataset. /// \return Status. - virtual Status GetFlightInfoSqlInfo(const pb::sql::CommandGetSqlInfo& command, + virtual Status GetFlightInfoSqlInfo(const GetSqlInfo& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info); /// \brief Gets a FlightDataStream containing the list of SqlInfo results. - /// \param[in] command The CommandGetSqlInfo object containing the list of SqlInfo + /// \param[in] command The GetSqlInfo object containing the list of SqlInfo /// to be returned. /// \param[in] context Per-call context. /// \param[out] result The FlightDataStream containing the results. /// \return Status. - virtual Status DoGetSqlInfo(const pb::sql::CommandGetSqlInfo& command, - const ServerCallContext& context, + virtual Status DoGetSqlInfo(const GetSqlInfo& command, const ServerCallContext& context, std::unique_ptr* result); /// \brief Gets a FlightInfo for listing schemas. - /// \param[in] command The CommandGetSchemas object which may contain filters for + /// \param[in] command The GetSchemas object which may contain filters for /// catalog and schema name. /// \param[in] context Per-call context. /// \param[in] descriptor The descriptor identifying the data stream. /// \param[out] info The FlightInfo describing where to access the dataset. /// \return Status. - virtual Status GetFlightInfoSchemas(const pb::sql::CommandGetSchemas& command, + virtual Status GetFlightInfoSchemas(const GetSchemas& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info); /// \brief Gets a FlightDataStream containing the list of schemas. - /// \param[in] command The CommandGetSchemas object which may contain filters for + /// \param[in] command The GetSchemas object which may contain filters for /// catalog and schema name. /// \param[in] context Per-call context. /// \param[out] result The FlightDataStream containing the results. /// \return Status. - virtual Status DoGetSchemas(const pb::sql::CommandGetSchemas& command, - const ServerCallContext& context, + virtual Status DoGetSchemas(const GetSchemas& command, const ServerCallContext& context, std::unique_ptr* result); ///\brief Gets a FlightInfo for listing tables. - /// \param[in] command The CommandGetTables object which may contain filters for + /// \param[in] command The GetTables object which may contain filters for /// catalog, schema and table names. /// \param[in] context Per-call context. /// \param[in] descriptor The descriptor identifying the data stream. /// \param[out] info The FlightInfo describing where to access the dataset. /// \return Status. - virtual Status GetFlightInfoTables(const pb::sql::CommandGetTables& command, + virtual Status GetFlightInfoTables(const GetTables& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info); /// \brief Gets a FlightDataStream containing the list of tables. - /// \param[in] command The CommandGetTables object which may contain filters for + /// \param[in] command The GetTables object which may contain filters for /// catalog, schema and table names. /// \param[in] context Per-call context. /// \param[out] result The FlightDataStream containing the results. /// \return Status. - virtual Status DoGetTables(const pb::sql::CommandGetTables& command, - const ServerCallContext& context, + virtual Status DoGetTables(const GetTables& command, const ServerCallContext& context, std::unique_ptr* result); /// \brief Gets a FlightInfo to extract information about the table types. @@ -207,14 +299,14 @@ class FlightSqlServerBase : public FlightServerBase { std::unique_ptr* result); /// \brief Gets a FlightInfo to extract information about primary and foreign keys. - /// \param[in] command The CommandGetPrimaryKeys object with necessary information + /// \param[in] command The GetPrimaryKeys object with necessary information /// to execute the request. /// \param[in] context Per-call context. /// \param[in] descriptor The descriptor identifying the data stream. /// \param[out] info The FlightInfo describing where to access the /// dataset. /// \return Status. - virtual Status GetFlightInfoPrimaryKeys(const pb::sql::CommandGetPrimaryKeys& command, + virtual Status GetFlightInfoPrimaryKeys(const GetPrimaryKeys& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info); @@ -222,24 +314,24 @@ class FlightSqlServerBase : public FlightServerBase { /// \brief Gets a FlightDataStream containing the data related to the primary and /// foreign /// keys. - /// \param[in] command The CommandGetPrimaryKeys object with necessary information + /// \param[in] command The GetPrimaryKeys object with necessary information /// to execute the request. /// \param[in] context Per-call context. /// \param[out] result The FlightDataStream containing the results. /// \return Status. - virtual Status DoGetPrimaryKeys(const pb::sql::CommandGetPrimaryKeys& command, + virtual Status DoGetPrimaryKeys(const GetPrimaryKeys& command, const ServerCallContext& context, std::unique_ptr* result); /// \brief Gets a FlightInfo to extract information about foreign and primary keys. - /// \param[in] command The CommandGetExportedKeys object with necessary information + /// \param[in] command The GetExportedKeys object with necessary information /// to execute the request. /// \param[in] context Per-call context. /// \param[in] descriptor The descriptor identifying the data stream. /// \param[out] info The FlightInfo describing where to access the /// dataset. /// \return Status. - virtual Status GetFlightInfoExportedKeys(const pb::sql::CommandGetExportedKeys& command, + virtual Status GetFlightInfoExportedKeys(const GetExportedKeys& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info); @@ -247,41 +339,41 @@ class FlightSqlServerBase : public FlightServerBase { /// \brief Gets a FlightDataStream containing the data related to the foreign and /// primary /// keys. - /// \param[in] command The CommandGetExportedKeys object with necessary information + /// \param[in] command The GetExportedKeys object with necessary information /// to execute the request. /// \param[in] context Per-call context. /// \param[out] result The FlightDataStream containing the results. /// \return Status. - virtual Status DoGetExportedKeys(const pb::sql::CommandGetExportedKeys& command, + virtual Status DoGetExportedKeys(const GetExportedKeys& command, const ServerCallContext& context, std::unique_ptr* result); /// \brief Gets a FlightInfo to extract information about foreign and primary keys. - /// \param[in] command The CommandGetImportedKeys object with necessary information + /// \param[in] command The GetImportedKeys object with necessary information /// to execute the request. /// \param[in] context Per-call context. /// \param[in] descriptor The descriptor identifying the data stream. /// \param[out] info The FlightInfo describing where to access the /// dataset. /// \return Status. - virtual Status GetFlightInfoImportedKeys(const pb::sql::CommandGetImportedKeys& command, + virtual Status GetFlightInfoImportedKeys(const GetImportedKeys& command, const ServerCallContext& context, const FlightDescriptor& descriptor, std::unique_ptr* info); /// \brief Gets a FlightDataStream containing the data related to the foreign and /// primary keys. - /// \param[in] command The CommandGetImportedKeys object with necessary information + /// \param[in] command The GetImportedKeys object with necessary information /// to execute the request. /// \param[in] context Per-call context. /// \param[out] result The FlightDataStream containing the results. /// \return Status. - virtual Status DoGetImportedKeys(const pb::sql::CommandGetImportedKeys& command, + virtual Status DoGetImportedKeys(const GetImportedKeys& command, const ServerCallContext& context, std::unique_ptr* result); /// \brief Gets a FlightInfo to extract information about foreign and primary keys. - /// \param[in] command The CommandGetCrossReference object with necessary + /// \param[in] command The GetCrossReference object with necessary /// information /// to execute the request. /// \param[in] context Per-call context. @@ -289,40 +381,40 @@ class FlightSqlServerBase : public FlightServerBase { /// \param[out] info The FlightInfo describing where to access the /// dataset. /// \return Status. - virtual Status GetFlightInfoCrossReference( - const pb::sql::CommandGetCrossReference& command, const ServerCallContext& context, - const FlightDescriptor& descriptor, std::unique_ptr* info); + virtual Status GetFlightInfoCrossReference(const GetCrossReference& command, + const ServerCallContext& context, + const FlightDescriptor& descriptor, + std::unique_ptr* info); /// \brief Gets a FlightDataStream containing the data related to the foreign and /// primary keys. - /// \param[in] command The CommandGetCrossReference object with necessary information + /// \param[in] command The GetCrossReference object with necessary information /// to execute the request. /// \param[in] context Per-call context. /// \param[out] result The FlightDataStream containing the results. /// \return Status. - virtual Status DoGetCrossReference(const pb::sql::CommandGetCrossReference& command, + virtual Status DoGetCrossReference(const GetCrossReference& command, const ServerCallContext& context, std::unique_ptr* result); /// \brief Executes an update SQL statement. - /// \param[in] command The CommandStatementUpdate object containing the SQL statement. + /// \param[in] command The StatementUpdate object containing the SQL statement. /// \param[in] context The call context. /// \param[in] reader a sequence of uploaded record batches. - /// \param[in] writer send metadata back to the client. - /// \return Status. - virtual Status DoPutCommandStatementUpdate( - const pb::sql::CommandStatementUpdate& command, const ServerCallContext& context, - std::unique_ptr& reader, - std::unique_ptr& writer); + /// \return The changed record count. + virtual arrow::Result DoPutCommandStatementUpdate( + const StatementUpdate& command, const ServerCallContext& context, + std::unique_ptr& reader); /// \brief Create a prepared statement from given SQL statement. /// \param[in] request The ActionCreatePreparedStatementRequest object containing the /// SQL statement. /// \param[in] context The call context. - /// \param[out] result ResultStream containing a ActionCreatePreparedStatementResult. - virtual Status CreatePreparedStatement( - const pb::sql::ActionCreatePreparedStatementRequest& request, - const ServerCallContext& context, std::unique_ptr* result); + /// \return A ActionCreatePreparedStatementResult containing the dataset + /// and parameter schemas and a handle for created statement. + virtual arrow::Result CreatePreparedStatement( + const ActionCreatePreparedStatementRequest& request, + const ServerCallContext& context); /// \brief Closes a prepared statement. /// \param[in] request The ActionClosePreparedStatementRequest object containing the @@ -330,72 +422,73 @@ class FlightSqlServerBase : public FlightServerBase { /// \param[in] context The call context. /// \param[out] result Empty ResultStream. virtual Status ClosePreparedStatement( - const pb::sql::ActionClosePreparedStatementRequest& request, + const ActionClosePreparedStatementRequest& request, const ServerCallContext& context, std::unique_ptr* result); /// \brief Binds parameters to given prepared statement. - /// \param[in] command The CommandPreparedStatementQuery object containing the + /// \param[in] command The PreparedStatementQuery object containing the /// prepared statement handle. /// \param[in] context The call context. /// \param[in] reader A sequence of uploaded record batches. /// \param[in] writer Send metadata back to the client. virtual Status DoPutPreparedStatementQuery( - const pb::sql::CommandPreparedStatementQuery& command, - const ServerCallContext& context, std::unique_ptr& reader, + const PreparedStatementQuery& command, const ServerCallContext& context, + std::unique_ptr& reader, std::unique_ptr& writer); /// \brief Executes an update SQL prepared statement. - /// \param[in] command The CommandPreparedStatementUpdate object containing the + /// \param[in] command The PreparedStatementUpdate object containing the /// prepared statement handle. /// \param[in] context The call context. /// \param[in] reader a sequence of uploaded record batches. - /// \param[in] writer send metadata back to the client. - /// \return Status. - virtual Status DoPutPreparedStatementUpdate( - const pb::sql::CommandPreparedStatementUpdate& command, - const ServerCallContext& context, std::unique_ptr& reader, - std::unique_ptr& writer); + /// \return The changed record count. + virtual arrow::Result DoPutPreparedStatementUpdate( + const PreparedStatementUpdate& command, const ServerCallContext& context, + std::unique_ptr& reader); + + protected: + static std::string CreateStatementQueryTicket(const std::string& statement_handle); }; /// \brief Auxiliary class containing all Schemas used on Flight SQL. class SqlSchema { public: - /// \brief Gets the Schema used on CommandGetCatalogs response. + /// \brief Gets the Schema used on GetCatalogs response. /// \return The default schema template. static std::shared_ptr GetCatalogsSchema(); - /// \brief Gets the Schema used on CommandGetSchemas response. + /// \brief Gets the Schema used on GetSchemas response. /// \return The default schema template. static std::shared_ptr GetSchemasSchema(); - /// \brief Gets the Schema used on CommandGetTables response when included schema + /// \brief Gets the Schema used on GetTables response when included schema /// flags is set to false. /// \return The default schema template. static std::shared_ptr GetTablesSchema(); - /// \brief Gets the Schema used on CommandGetTables response when included schema + /// \brief Gets the Schema used on GetTables response when included schema /// flags is set to true. /// \return The default schema template. static std::shared_ptr GetTablesSchemaWithIncludedSchema(); - /// \brief Gets the Schema used on CommandGetTableTypes response. + /// \brief Gets the Schema used on GetTableTypes response. /// \return The default schema template. static std::shared_ptr GetTableTypesSchema(); - /// \brief Gets the Schema used on CommandGetPrimaryKeys response when included schema + /// \brief Gets the Schema used on GetPrimaryKeys response when included schema /// flags is set to true. /// \return The default schema template. static std::shared_ptr GetPrimaryKeysSchema(); - /// \brief Gets the Schema used on CommandGetImportedKeys response. + /// \brief Gets the Schema used on GetImportedKeys response. /// \return The default schema template. static std::shared_ptr GetExportedKeysSchema(); - /// \brief Gets the Schema used on CommandGetImportedKeys response. + /// \brief Gets the Schema used on GetImportedKeys response. /// \return The default schema template. static std::shared_ptr GetImportedKeysSchema(); - /// \brief Gets the Schema used on CommandGetCrossReference response. + /// \brief Gets the Schema used on GetCrossReference response. /// \return The default schema template. static std::shared_ptr GetCrossReferenceSchema(); };