internal_pool_params.hpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. //
  2. // Copyright (c) 2019-2024 Ruben Perez Hidalgo (rubenperez038 at gmail dot com)
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. #ifndef BOOST_MYSQL_IMPL_INTERNAL_CONNECTION_POOL_INTERNAL_POOL_PARAMS_HPP
  8. #define BOOST_MYSQL_IMPL_INTERNAL_CONNECTION_POOL_INTERNAL_POOL_PARAMS_HPP
  9. #include <boost/mysql/any_connection.hpp>
  10. #include <boost/mysql/connect_params.hpp>
  11. #include <boost/mysql/handshake_params.hpp>
  12. #include <boost/mysql/pool_params.hpp>
  13. #include <boost/mysql/ssl_mode.hpp>
  14. #include <boost/asio/ssl/context.hpp>
  15. #include <boost/optional/optional.hpp>
  16. #include <boost/throw_exception.hpp>
  17. #include <chrono>
  18. #include <cstddef>
  19. #include <stdexcept>
  20. #include <string>
  21. namespace boost {
  22. namespace mysql {
  23. namespace detail {
  24. // Same as pool_params, but structured in a way that is more helpful for the impl
  25. struct internal_pool_params
  26. {
  27. connect_params connect_config;
  28. optional<asio::ssl::context> ssl_ctx;
  29. std::size_t initial_buffer_size;
  30. std::size_t initial_size;
  31. std::size_t max_size;
  32. std::chrono::steady_clock::duration connect_timeout;
  33. std::chrono::steady_clock::duration ping_timeout;
  34. std::chrono::steady_clock::duration retry_interval;
  35. std::chrono::steady_clock::duration ping_interval;
  36. any_connection_params make_ctor_params() noexcept
  37. {
  38. any_connection_params res;
  39. res.ssl_context = ssl_ctx.get_ptr();
  40. res.initial_buffer_size = initial_buffer_size;
  41. return res;
  42. }
  43. };
  44. inline void check_validity(const pool_params& params)
  45. {
  46. const char* msg = nullptr;
  47. if (params.max_size == 0)
  48. msg = "pool_params::max_size must be greater than zero";
  49. else if (params.max_size < params.initial_size)
  50. msg = "pool_params::max_size must be greater than pool_params::initial_size";
  51. else if (params.connect_timeout.count() < 0)
  52. msg = "pool_params::connect_timeout must not be negative";
  53. else if (params.retry_interval.count() <= 0)
  54. msg = "pool_params::retry_interval must be greater than zero";
  55. else if (params.ping_interval.count() < 0)
  56. msg = "pool_params::ping_interval must not be negative";
  57. else if (params.ping_timeout.count() < 0)
  58. msg = "pool_params::ping_timeout must not be negative";
  59. if (msg != nullptr)
  60. {
  61. BOOST_THROW_EXCEPTION(std::invalid_argument(msg));
  62. }
  63. }
  64. inline internal_pool_params make_internal_pool_params(pool_params&& params)
  65. {
  66. check_validity(params);
  67. connect_params connect_prms;
  68. connect_prms.server_address = std::move(params.server_address);
  69. connect_prms.username = std::move(params.username);
  70. connect_prms.password = std::move(params.password);
  71. connect_prms.database = std::move(params.database);
  72. connect_prms.ssl = params.ssl;
  73. connect_prms.multi_queries = params.multi_queries;
  74. return {
  75. std::move(connect_prms),
  76. std::move(params.ssl_ctx),
  77. params.initial_buffer_size,
  78. params.initial_size,
  79. params.max_size,
  80. params.connect_timeout,
  81. params.ping_timeout,
  82. params.retry_interval,
  83. params.ping_interval,
  84. };
  85. }
  86. } // namespace detail
  87. } // namespace mysql
  88. } // namespace boost
  89. #endif