2011-03-03 19:57:34 +00:00
|
|
|
|
#ifndef MYSQLXX_CONNECTION_H
|
|
|
|
|
#define MYSQLXX_CONNECTION_H
|
|
|
|
|
|
|
|
|
|
#include <boost/noncopyable.hpp>
|
|
|
|
|
|
2011-03-09 19:18:01 +00:00
|
|
|
|
#include <Poco/Util/Application.h>
|
|
|
|
|
|
2011-03-15 20:56:42 +00:00
|
|
|
|
#include <Yandex/singleton.h>
|
|
|
|
|
|
2011-03-03 19:57:34 +00:00
|
|
|
|
#include <mysqlxx/Query.h>
|
|
|
|
|
|
2011-10-05 20:21:18 +00:00
|
|
|
|
#define MYSQLXX_DEFAULT_TIMEOUT 60
|
2011-05-13 16:58:53 +00:00
|
|
|
|
|
2011-03-03 19:57:34 +00:00
|
|
|
|
|
|
|
|
|
namespace mysqlxx
|
|
|
|
|
{
|
|
|
|
|
|
2011-10-10 20:32:42 +00:00
|
|
|
|
/** Считаем количество соединений в потоке, чтобы после уничтожения последнего вызвать my_thread_end(),
|
|
|
|
|
* как требует библиотека libmysqlclient_r или новая библиотека libmysqlclient (MySQL 5.5+).
|
|
|
|
|
*/
|
2011-10-13 23:43:14 +00:00
|
|
|
|
extern __thread unsigned connections;
|
2011-10-10 20:32:42 +00:00
|
|
|
|
|
2011-03-15 20:56:42 +00:00
|
|
|
|
|
2011-03-18 20:26:54 +00:00
|
|
|
|
/** Для корректной инициализации и деинициализации MySQL библиотеки.
|
|
|
|
|
* Обеспечивает единственный и thread-safe вызов mysql_library_init().
|
|
|
|
|
* Использование:
|
|
|
|
|
* LibrarySingleton::instance();
|
|
|
|
|
*/
|
2011-03-15 20:56:42 +00:00
|
|
|
|
class LibrarySingleton : public Singleton<LibrarySingleton>
|
|
|
|
|
{
|
|
|
|
|
friend class Singleton<LibrarySingleton>;
|
|
|
|
|
private:
|
|
|
|
|
LibrarySingleton()
|
|
|
|
|
{
|
|
|
|
|
if (mysql_library_init(0, NULL, NULL))
|
|
|
|
|
throw Exception("Cannot initialize MySQL library.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
~LibrarySingleton()
|
|
|
|
|
{
|
|
|
|
|
mysql_library_end();
|
|
|
|
|
}
|
|
|
|
|
};
|
2011-10-05 20:21:18 +00:00
|
|
|
|
|
2011-03-15 20:56:42 +00:00
|
|
|
|
|
2011-03-18 20:26:54 +00:00
|
|
|
|
/** Соединение с MySQL.
|
|
|
|
|
* Использование:
|
|
|
|
|
* 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:
|
|
|
|
|
* mysqlxx::Connection connection("mysql_params");
|
2011-10-05 20:21:18 +00:00
|
|
|
|
*
|
|
|
|
|
* Внимание! Рекомендуется использовать соединение в том потоке, в котором оно создано.
|
|
|
|
|
* Если вы используете соединение, созданное в другом потоке, то вы должны перед использованием
|
|
|
|
|
* вызвать функцию MySQL C API my_thread_init(), а после использования - my_thread_end().
|
2011-03-18 20:26:54 +00:00
|
|
|
|
*/
|
2011-03-03 19:57:34 +00:00
|
|
|
|
class Connection : private boost::noncopyable
|
|
|
|
|
{
|
|
|
|
|
public:
|
2011-03-18 20:26:54 +00:00
|
|
|
|
/// Для отложенной инициализации.
|
2011-03-03 19:57:34 +00:00
|
|
|
|
Connection();
|
|
|
|
|
|
2011-03-18 20:26:54 +00:00
|
|
|
|
/// Создать соединение.
|
2011-03-03 19:57:34 +00:00
|
|
|
|
Connection(
|
|
|
|
|
const char* db,
|
2011-09-01 18:14:01 +00:00
|
|
|
|
const char* server,
|
2011-03-03 19:57:34 +00:00
|
|
|
|
const char* user = 0,
|
|
|
|
|
const char* password = 0,
|
2011-10-05 20:21:18 +00:00
|
|
|
|
unsigned port = 0,
|
|
|
|
|
unsigned timeout = MYSQLXX_DEFAULT_TIMEOUT);
|
2011-03-03 19:57:34 +00:00
|
|
|
|
|
2011-03-18 20:26:54 +00:00
|
|
|
|
/** Конструктор-помошник. Создать соединение, считав все параметры из секции config_name конфигурации.
|
|
|
|
|
* Можно использовать, если вы используете Poco::Util::Application из библиотеки Poco.
|
|
|
|
|
*/
|
2011-03-09 19:18:01 +00:00
|
|
|
|
Connection(const std::string & config_name)
|
|
|
|
|
{
|
|
|
|
|
is_connected = false;
|
2011-10-05 20:21:18 +00:00
|
|
|
|
connect(config_name);
|
2011-03-09 19:18:01 +00:00
|
|
|
|
}
|
2011-03-04 20:58:19 +00:00
|
|
|
|
|
2011-03-03 19:57:34 +00:00
|
|
|
|
virtual ~Connection();
|
|
|
|
|
|
2011-03-18 20:26:54 +00:00
|
|
|
|
/// Для отложенной инициализации или для того, чтобы подключиться с другими параметрами.
|
2011-06-03 17:55:26 +00:00
|
|
|
|
virtual void connect(const char * db,
|
|
|
|
|
const char * server,
|
|
|
|
|
const char * user,
|
|
|
|
|
const char * password,
|
2011-10-05 20:21:18 +00:00
|
|
|
|
unsigned port,
|
|
|
|
|
unsigned timeout = MYSQLXX_DEFAULT_TIMEOUT);
|
|
|
|
|
|
|
|
|
|
void connect(const std::string & config_name)
|
|
|
|
|
{
|
|
|
|
|
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");
|
|
|
|
|
|
|
|
|
|
unsigned timeout =
|
|
|
|
|
cfg.getInt(config_name + ".connect_timeout",
|
|
|
|
|
cfg.getInt("mysql_connect_timeout",
|
|
|
|
|
MYSQLXX_DEFAULT_TIMEOUT));
|
|
|
|
|
|
|
|
|
|
connect(db.c_str(), server.c_str(), user.c_str(), password.c_str(), port, timeout);
|
|
|
|
|
}
|
2011-03-03 19:57:34 +00:00
|
|
|
|
|
2011-03-18 20:26:54 +00:00
|
|
|
|
/// Было ли произведено соединение с MySQL.
|
2011-03-03 19:57:34 +00:00
|
|
|
|
bool connected() const;
|
2011-03-18 20:26:54 +00:00
|
|
|
|
|
|
|
|
|
/// Отсоединиться от MySQL.
|
2011-03-03 19:57:34 +00:00
|
|
|
|
void disconnect();
|
2011-03-18 20:26:54 +00:00
|
|
|
|
|
|
|
|
|
/// Если соединение утеряно - попытаться восстановить его. true - если после вызова соединение есть.
|
2011-03-03 19:57:34 +00:00
|
|
|
|
bool ping();
|
2011-03-18 20:26:54 +00:00
|
|
|
|
|
|
|
|
|
/// Создать запрос. Вы можете сразу указать его, передав строку, или заполнить потом.
|
2011-03-03 19:57:34 +00:00
|
|
|
|
Query query(const std::string & str = "");
|
2011-03-18 20:26:54 +00:00
|
|
|
|
|
|
|
|
|
/// Получить объект MYSQL из C API.
|
2011-03-09 20:11:29 +00:00
|
|
|
|
MYSQL * getDriver();
|
2011-03-03 19:57:34 +00:00
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
MYSQL driver;
|
|
|
|
|
bool is_connected;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif
|