translated comments for mysqlxx Connection adn Pool

This commit is contained in:
Nikolai Kochetov 2017-07-18 14:52:46 +03:00 committed by alexey-milovidov
parent cfdbcb7fde
commit 116c889b42
4 changed files with 85 additions and 82 deletions

View File

@ -18,9 +18,9 @@ namespace mysqlxx
{
/** Для корректной инициализации и деинициализации MySQL библиотеки.
* Обеспечивает единственный и thread-safe вызов mysql_library_init().
* Использование:
/** LibrarySingleton is used for appropriate initialisation and deinitialisation of MySQL library.
* Makes single thread-safe call of mysql_library_init().
* Usage:
* LibrarySingleton::instance();
*/
class LibrarySingleton : public ext::singleton<LibrarySingleton>
@ -32,25 +32,29 @@ private:
};
/** Соединение с MySQL.
* Использование:
* mysqlxx::Connection connection("Test", "127.0.0.1", "root", "qwerty", 3306);
/** MySQL connection.
* Usage:
* mysqlxx::Connection connection("Test", "127.0.0.1", "root", "qwerty", 3306);
* std::cout << connection.query("SELECT 'Hello, World!'").store().at(0).at(0).getString() << std::endl;
*
* Или так, если вы используете конфигурацию из библиотеки Poco:
* Or with Poco library configuration:
* mysqlxx::Connection connection("mysql_params");
*
* Внимание! Рекомендуется использовать соединение в том потоке, в котором оно создано.
* Если вы используете соединение, созданное в другом потоке, то вы должны перед использованием
* вызвать функцию MySQL C API mysql_thread_init(), а после использования - mysql_thread_end().
* Or using socket:
* mysqlxx::Connection connection("Test", "localhost", "root", "qwerty", 0, "/path/to/socket/file.sock");
*
* Attention! It's strictly recommended to use connection in thread where it was created.
* In order to use connection in other thread, you should call MySQL C API function mysql_thread_init() before and
* mysql_thread_end() after working with it.
*/
class Connection : private boost::noncopyable
{
public:
/// Для отложенной инициализации.
/// For delayed initialisation
Connection();
/// Создать соединение.
/// Creates connection. Either port either socket should be specified.
/// If server is localhost and socket is not empty, than socket is used. Otherwise, server and port is used.
Connection(
const char * db,
const char * server,
@ -61,14 +65,13 @@ public:
unsigned timeout = MYSQLXX_DEFAULT_TIMEOUT,
unsigned rw_timeout = MYSQLXX_DEFAULT_RW_TIMEOUT);
/** Конструктор-помошник. Создать соединение, считав все параметры из секции config_name конфигурации.
* Можно использовать, если вы используете Poco::Util::Application из библиотеки Poco.
*/
/// Creates connection. Can be used if Poco::Util::Application is using.
/// All settings will be got from config_name section of configuration.
Connection(const std::string & config_name);
virtual ~Connection();
/// Для отложенной инициализации или для того, чтобы подключиться с другими параметрами.
/// Provides delayed initialization or reconnection with other settings.
virtual void connect(const char * db,
const char * server,
const char * user,
@ -82,11 +85,11 @@ public:
{
Poco::Util::LayeredConfiguration & cfg = Poco::Util::Application::instance().config();
std::string db = cfg.getString(config_name + ".db", "");
std::string server = cfg.getString(config_name + ".host");
std::string user = cfg.getString(config_name + ".user");
std::string password = cfg.getString(config_name + ".password");
unsigned port = cfg.getInt(config_name + ".port", 0);
std::string db = cfg.getString(config_name + ".db", "");
std::string server = cfg.getString(config_name + ".host");
std::string user = cfg.getString(config_name + ".user");
std::string password = cfg.getString(config_name + ".password");
unsigned port = cfg.getInt(config_name + ".port", 0);
std::string socket = cfg.getString(config_name + ".socket", "");
unsigned timeout =
@ -102,19 +105,19 @@ public:
connect(db.c_str(), server.c_str(), user.c_str(), password.c_str(), port, socket.c_str(), timeout, rw_timeout);
}
/// Было ли произведено соединение с MySQL.
/// If MySQL connection was established.
bool connected() const;
/// Отсоединиться от MySQL.
/// Disconnect from MySQL.
void disconnect();
/// Если соединение утеряно - попытаться восстановить его. true - если после вызова соединение есть.
/// Tries to reconnect if connection was lost. Is true if connection is established after call.
bool ping();
/// Создать запрос. Вы можете сразу указать его, передав строку, или заполнить потом.
/// Creates query. It can be set with query string or later.
Query query(const std::string & str = "");
/// Получить объект MYSQL из C API.
/// Get MySQL C API MYSQL object.
MYSQL * getDriver();
private:

View File

@ -16,23 +16,22 @@
namespace mysqlxx
{
/** Пул соединений с MySQL.
* Этот класс имеет мало отношения к mysqlxx и сделан не в стиле библиотеки. (взят из старого кода)
* Использование:
* mysqlxx::Pool pool("mysql_params");
*
* void thread()
* {
* mysqlxx::Pool::Entry connection = pool.Get();
* std::string s = connection->query("SELECT 'Hello, world!' AS world").use().fetch()["world"].getString();
* }
*
* TODO: Упростить, используя PoolBase.
*/
/** MySQL connections pool.
* This class is poorly connected with mysqlxx and is made in different style (was taken from old code).
* Usage:
* mysqlxx::Pool pool("mysql_params");
*
* void thread()
* {
* mysqlxx::Pool::Entry connection = pool.Get();
* std::string s = connection->query("SELECT 'Hello, world!' AS world").use().fetch()["world"].getString();
* }
* TODO: simplify with PoolBase.
*/
class Pool final
{
protected:
/** Информация о соединении. */
/// Information about connection.
struct Connection
{
mysqlxx::Connection conn;
@ -40,7 +39,7 @@ protected:
};
public:
/** Соединение с базой данных. */
/// Connection with database.
class Entry
{
public:
@ -114,15 +113,15 @@ public:
friend class Pool;
private:
/** Указатель на соединение. */
/// Pointer to mysqlxx connection.
Connection * data = nullptr;
/** Указатель на пул, которому мы принадлежим. */
/// Pointer to pool we are belonging to.
Pool * pool = nullptr;
/** Переподключается к базе данных в случае необходимости. Если не удалось - подождать и попробовать снова. */
/// Connects to database. If connection is failed then waits and repeats again.
void forceConnected() const;
/** Переподключается к базе данных в случае необходимости. Если не удалось - вернуть false. */
/// Connects to database. If connection is failed then returns false.
bool tryForceConnected() const
{
return data->conn.ping();
@ -142,9 +141,9 @@ public:
{}
/**
* @param config_name Имя параметра в конфигурационном файле
* @param default_connections_ Количество подключений по-умолчанию
* @param max_connections_ Максимальное количество подключений
* @param config_name Setting name in configuration file
* @param default_connections_ Number of default connections
* @param max_connections_ Maximum number of connections
*/
Pool(const Poco::Util::AbstractConfiguration & cfg, const std::string & config_name,
unsigned default_connections_ = MYSQLXX_POOL_DEFAULT_START_CONNECTIONS,
@ -152,13 +151,17 @@ public:
const char * parent_config_name_ = nullptr);
/**
* @param db_ Имя БД
* @param server_ Хост для подключения
* @param user_ Имя пользователя
* @param password_ Пароль
* @param port_ Порт для подключения
* @param default_connections_ Количество подключений по-умолчанию
* @param max_connections_ Максимальное количество подключений
* @param db_ Database name
* @param server_ Hostname
* @param user_ User name
* @param password_ Password
* @param socket_ Socket
* @param port_ Port
* @param default_connections_ Number of default connections
* @param max_connections_ Maximum number of connections
*
* Like with mysqlxx::Connection, either port either socket should be specified.
* If server is localhost and socket is not empty, than socket is used. Otherwise, server and port is used.
*/
Pool(const std::string & db_,
const std::string & server_,
@ -187,40 +190,39 @@ public:
~Pool();
/** Выделяет соединение для работы. */
/// Allocates connection.
Entry Get();
/** Выделяет соединение для работы.
* Если база недоступна - возвращает пустой объект Entry.
* Если пул переполнен - кидает исключение.
*/
/// Allocates connection.
/// If database is not accessible, returns empty Entry object.
/// If pool is overflowed, throws exception.
Entry tryGet();
/// Получить описание БД
/// Get description of database.
std::string getDescription() const
{
return description;
}
protected:
/** Количество соединений с MySQL, создаваемых при запуске. */
/// Number of MySQL connections which are created at launch.
unsigned default_connections;
/** Максимально возможное количество соедиений. */
/// Maximum possible number of connections
unsigned max_connections;
private:
/** Признак того, что мы инициализированы. */
/// Initialization flag.
bool initialized{false};
/** Список соединений. */
/// List of connections.
using Connections = std::list<Connection *>;
/** Список соединений. */
/// List of connections.
Connections connections;
/** Замок для доступа к списку соединений. */
/// Lock for connections list access
std::mutex mutex;
/** Описание соединения. */
/// Description of connection.
std::string description;
/** Параметры подключения. **/
/// Connection settings.
std::string db;
std::string server;
std::string user;
@ -230,10 +232,10 @@ private:
unsigned connect_timeout;
unsigned rw_timeout;
/** Хотя бы один раз было успешное соединение. */
/// True if connection was established at least once.
bool was_successful{false};
/** Выполняет инициализацию класса, если мы еще не инициализированы. */
/// Initialises class if it wasn't.
void initialize();
/** Create new connection. */

View File

@ -24,7 +24,7 @@ Connection::Connection()
{
is_connected = false;
/// Инициализация библиотеки.
/// MySQL library initialization.
LibrarySingleton::instance();
}
@ -68,13 +68,13 @@ void Connection::connect(const char* db,
if (is_connected)
disconnect();
/// Инициализация библиотеки.
/// MySQL library initialization.
LibrarySingleton::instance();
if (!mysql_init(driver.get()))
throw ConnectionFailed(errorMessage(driver.get()), mysql_errno(driver.get()));
/// Установим таймауты
/// Set timeouts.
if (mysql_options(driver.get(), MYSQL_OPT_CONNECT_TIMEOUT, reinterpret_cast<const char *>(&timeout)))
throw ConnectionFailed(errorMessage(driver.get()), mysql_errno(driver.get()));
@ -84,20 +84,18 @@ void Connection::connect(const char* db,
if (mysql_options(driver.get(), MYSQL_OPT_WRITE_TIMEOUT, reinterpret_cast<const char *>(&rw_timeout)))
throw ConnectionFailed(errorMessage(driver.get()), mysql_errno(driver.get()));
/** Включаем возможность использовать запрос LOAD DATA LOCAL INFILE с серверами,
* которые были скомпилированы без опции --enable-local-infile.
*/
/// Enables ability to use query LOAD DATA LOCAL INFILE with servers were compiled without --enable-local-infile option.
if (mysql_options(driver.get(), MYSQL_OPT_LOCAL_INFILE, nullptr))
throw ConnectionFailed(errorMessage(driver.get()), mysql_errno(driver.get()));
if (!mysql_real_connect(driver.get(), server, user, password, db, port, *socket ? socket : nullptr, driver->client_flag))
throw ConnectionFailed(errorMessage(driver.get()), mysql_errno(driver.get()));
/// Установим кодировки по умолчанию - UTF-8.
/// Sets UTF-8 as default encoding.
if (mysql_set_character_set(driver.get(), "UTF8"))
throw ConnectionFailed(errorMessage(driver.get()), mysql_errno(driver.get()));
/// Установим автоматический реконнект
/// Enables auto-reconnect.
my_bool reconnect = true;
if (mysql_options(driver.get(), MYSQL_OPT_RECONNECT, reinterpret_cast<const char *>(&reconnect)))
throw ConnectionFailed(errorMessage(driver.get()), mysql_errno(driver.get()));

View File

@ -123,7 +123,7 @@ Pool::Entry Pool::tryGet()
initialize();
/// Поиск уже установленного, но не использующегося сейчас соединения.
/// Searching for connection which was established but wasn't used.
for (Connections::iterator it = connections.begin(); it != connections.end(); ++it)
{
if ((*it)->ref_count == 0)
@ -133,11 +133,11 @@ Pool::Entry Pool::tryGet()
}
}
/// Если пул переполнен.
/// Throws if pool is overflowed.
if (connections.size() >= max_connections)
throw Poco::Exception("mysqlxx::Pool is full");
/// Выделение нового соединения.
/// Allocates new connection.
Connection * conn = allocConnection(true);
if (conn)
return Entry(conn, this);