// Copyright 2019 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_SPANNER_INTERNAL_CONNECTION_IMPL_H #define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_SPANNER_INTERNAL_CONNECTION_IMPL_H #include "google/cloud/spanner/connection.h" #include "google/cloud/spanner/database.h" #include "google/cloud/spanner/internal/session.h" #include "google/cloud/spanner/internal/session_pool.h" #include "google/cloud/spanner/internal/spanner_stub.h" #include "google/cloud/spanner/retry_policy.h" #include "google/cloud/spanner/tracing_options.h" #include "google/cloud/spanner/version.h" #include "google/cloud/background_threads.h" #include "google/cloud/backoff_policy.h" #include "google/cloud/status.h" #include "google/cloud/status_or.h" #include #include #include #include #include #include namespace google { namespace cloud { namespace spanner { inline namespace SPANNER_CLIENT_NS { namespace internal { /// Return the default retry policy for `ConnectionImpl` std::unique_ptr DefaultConnectionRetryPolicy(); /// Return the default backoff policy for `ConnectionImpl` std::unique_ptr DefaultConnectionBackoffPolicy(); /** * Factory method to construct a `ConnectionImpl`. * * @note In tests we can use mock stubs and custom (or mock) policies. */ class ConnectionImpl; std::shared_ptr MakeConnection( Database db, std::vector> stubs, ConnectionOptions const& options = ConnectionOptions{}, SessionPoolOptions session_pool_options = SessionPoolOptions{}, std::unique_ptr retry_policy = DefaultConnectionRetryPolicy(), std::unique_ptr backoff_policy = DefaultConnectionBackoffPolicy()); /** * A concrete `Connection` subclass that uses gRPC to actually talk to a real * Spanner instance. See `MakeConnection()` for a factory function that creates * and returns instances of this class. */ class ConnectionImpl : public Connection { public: RowStream Read(ReadParams) override; StatusOr> PartitionRead( PartitionReadParams) override; RowStream ExecuteQuery(SqlParams) override; StatusOr ExecuteDml(SqlParams) override; ProfileQueryResult ProfileQuery(SqlParams) override; StatusOr ProfileDml(SqlParams) override; StatusOr AnalyzeSql(SqlParams) override; StatusOr ExecutePartitionedDml( ExecutePartitionedDmlParams) override; StatusOr> PartitionQuery( PartitionQueryParams) override; StatusOr ExecuteBatchDml(ExecuteBatchDmlParams) override; StatusOr Commit(CommitParams) override; Status Rollback(RollbackParams) override; private: // Only the factory method can construct instances of this class. friend std::shared_ptr MakeConnection( Database, std::vector>, ConnectionOptions const&, SessionPoolOptions, std::unique_ptr, std::unique_ptr); ConnectionImpl(Database db, std::vector> stubs, ConnectionOptions const& options, SessionPoolOptions session_pool_options, std::unique_ptr retry_policy, std::unique_ptr backoff_policy); Status PrepareSession(SessionHolder& session, bool dissociate_from_pool = false); StatusOr BeginTransaction( SessionHolder& session, google::spanner::v1::TransactionOptions options, char const* func); RowStream ReadImpl(SessionHolder& session, StatusOr& s, ReadParams params); StatusOr> PartitionReadImpl( SessionHolder& session, StatusOr& s, ReadParams const& params, PartitionOptions const& partition_options); RowStream ExecuteQueryImpl( SessionHolder& session, StatusOr& s, std::int64_t seqno, SqlParams params); StatusOr ExecuteDmlImpl( SessionHolder& session, StatusOr& s, std::int64_t seqno, SqlParams params); ProfileQueryResult ProfileQueryImpl( SessionHolder& session, StatusOr& s, std::int64_t seqno, SqlParams params); StatusOr ProfileDmlImpl( SessionHolder& session, StatusOr& s, std::int64_t seqno, SqlParams params); StatusOr AnalyzeSqlImpl( SessionHolder& session, StatusOr& s, std::int64_t seqno, SqlParams params); StatusOr ExecutePartitionedDmlImpl( SessionHolder& session, StatusOr& s, std::int64_t seqno, ExecutePartitionedDmlParams params); StatusOr> PartitionQueryImpl( SessionHolder& session, StatusOr& s, PartitionQueryParams const& params); StatusOr ExecuteBatchDmlImpl( SessionHolder& session, StatusOr& s, std::int64_t seqno, ExecuteBatchDmlParams params); StatusOr CommitImpl( SessionHolder& session, StatusOr& s, CommitParams params); Status RollbackImpl(SessionHolder& session, StatusOr& s); template StatusOr ExecuteSqlImpl( SessionHolder& session, StatusOr& s, std::int64_t seqno, SqlParams params, google::spanner::v1::ExecuteSqlRequest::QueryMode query_mode, std::function>( google::spanner::v1::ExecuteSqlRequest& request)> const& retry_resume_fn); template ResultType CommonQueryImpl( SessionHolder& session, StatusOr& s, std::int64_t seqno, SqlParams params, google::spanner::v1::ExecuteSqlRequest::QueryMode query_mode); template StatusOr CommonDmlImpl( SessionHolder& session, StatusOr& s, std::int64_t seqno, SqlParams params, google::spanner::v1::ExecuteSqlRequest::QueryMode query_mode); Database db_; std::shared_ptr retry_policy_prototype_; std::shared_ptr backoff_policy_prototype_; std::unique_ptr background_threads_; std::shared_ptr session_pool_; bool rpc_stream_tracing_enabled_ = false; TracingOptions tracing_options_; }; } // namespace internal } // namespace SPANNER_CLIENT_NS } // namespace spanner } // namespace cloud } // namespace google #endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_SPANNER_INTERNAL_CONNECTION_IMPL_H