2014-04-08 06:51:53 +00:00
|
|
|
|
#pragma once
|
2011-03-03 19:57:34 +00:00
|
|
|
|
|
2011-06-14 17:17:41 +00:00
|
|
|
|
#include <sstream>
|
2011-03-03 19:57:34 +00:00
|
|
|
|
|
|
|
|
|
#include <mysqlxx/UseQueryResult.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace mysqlxx
|
|
|
|
|
{
|
|
|
|
|
|
2011-03-18 20:26:54 +00:00
|
|
|
|
|
|
|
|
|
/** Запрос.
|
|
|
|
|
* Ссылается на Connection. Если уничтожить Connection, то Query станет некорректным и пользоваться им будет нельзя.
|
|
|
|
|
*
|
|
|
|
|
* Пример использования:
|
2017-04-01 07:20:54 +00:00
|
|
|
|
* mysqlxx::Query query = connection.query();
|
|
|
|
|
* query << "SELECT 1 AS x, 2 AS y, 3 AS z";
|
|
|
|
|
* query << " LIMIT 1";
|
|
|
|
|
* mysqlxx::UseQueryResult result = query.use();
|
2011-03-18 20:26:54 +00:00
|
|
|
|
*
|
2017-04-01 07:20:54 +00:00
|
|
|
|
* while (mysqlxx::Row row = result.fetch())
|
|
|
|
|
* std::cout << row["x"] << std::endl;
|
2011-03-18 20:26:54 +00:00
|
|
|
|
*
|
|
|
|
|
* В отличие от библиотеки mysql++, запрос можно копировать.
|
|
|
|
|
* (то есть, запрос можно класть в контейнеры STL и ничего с ним не будет)
|
2011-11-30 19:14:06 +00:00
|
|
|
|
*
|
|
|
|
|
* Внимание! Один объект запроса можно использовать только из одного потока.
|
2011-03-18 20:26:54 +00:00
|
|
|
|
*/
|
2020-05-09 23:31:44 +00:00
|
|
|
|
class Query
|
2011-03-03 19:57:34 +00:00
|
|
|
|
{
|
|
|
|
|
public:
|
2017-04-01 07:20:54 +00:00
|
|
|
|
Query(Connection * conn_, const std::string & query_string = "");
|
|
|
|
|
Query(const Query & other);
|
|
|
|
|
Query & operator= (const Query & other);
|
|
|
|
|
~Query();
|
2011-03-03 19:57:34 +00:00
|
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
|
/** Сбросить текст запроса. Это используется, если нужно написать новый запрос в том же объекте. */
|
|
|
|
|
void reset();
|
2011-03-18 20:26:54 +00:00
|
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
|
/** Выполнить запрос, результат которого не имеет значения (почти всё кроме SELECT). */
|
|
|
|
|
void execute();
|
2011-03-18 20:26:54 +00:00
|
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
|
/** Выполнить запрос, с возможностью загружать на клиента строки одна за другой.
|
|
|
|
|
* То есть, оперативка расходуется только на одну строку.
|
|
|
|
|
*/
|
|
|
|
|
UseQueryResult use();
|
2011-03-18 20:26:54 +00:00
|
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
|
/// Значение auto increment после последнего INSERT-а.
|
|
|
|
|
UInt64 insertID();
|
2011-03-05 16:56:30 +00:00
|
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
|
/// Для совместимости, то же, что insertID().
|
|
|
|
|
UInt64 insert_id() { return insertID(); }
|
2011-03-05 16:56:30 +00:00
|
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
|
/// Получить текст запроса (например, для вывода его в лог). См. ещё operator<< ниже.
|
|
|
|
|
std::string str() const
|
|
|
|
|
{
|
|
|
|
|
return query_buf.str();
|
|
|
|
|
}
|
2011-03-03 19:57:34 +00:00
|
|
|
|
|
2020-05-09 23:31:44 +00:00
|
|
|
|
auto rdbuf() const
|
|
|
|
|
{
|
|
|
|
|
return query_buf.rdbuf();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
|
inline Query & operator<< (T && x)
|
|
|
|
|
{
|
|
|
|
|
query_buf << std::forward<T>(x);
|
|
|
|
|
return *this;
|
|
|
|
|
}
|
|
|
|
|
|
2011-03-03 19:57:34 +00:00
|
|
|
|
private:
|
2017-04-01 07:20:54 +00:00
|
|
|
|
Connection * conn;
|
2020-05-09 23:31:44 +00:00
|
|
|
|
std::ostringstream query_buf;
|
2011-03-15 20:56:42 +00:00
|
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
|
void executeImpl();
|
2011-03-03 19:57:34 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2011-03-18 20:26:54 +00:00
|
|
|
|
/// Вывести текст запроса в ostream.
|
|
|
|
|
inline std::ostream & operator<< (std::ostream & ostr, const Query & query)
|
|
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
|
return ostr << query.rdbuf();
|
2011-03-18 20:26:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2011-03-03 19:57:34 +00:00
|
|
|
|
}
|