ClickHouse/libs/libmysqlxx/include/mysqlxx/Query.h

83 lines
2.8 KiB
C++
Raw Normal View History

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-10 20:31:02 +00:00
#include <ostream>
2011-03-03 19:57:34 +00:00
#include <mysqlxx/UseQueryResult.h>
#include <mysqlxx/StoreQueryResult.h>
namespace mysqlxx
{
2011-03-18 20:26:54 +00:00
/** Запрос.
* Ссылается на Connection. Если уничтожить Connection, то Query станет некорректным и пользоваться им будет нельзя.
*
* Пример использования:
* mysqlxx::Query query = connection.query();
* query << "SELECT 1 AS x, 2 AS y, 3 AS z";
* query << " LIMIT 1";
* mysqlxx::UseQueryResult result = query.use();
*
* while (mysqlxx::Row row = result.fetch())
* std::cout << row["x"] << std::endl;
*
* В отличие от библиотеки mysql++, запрос можно копировать.
* (то есть, запрос можно класть в контейнеры STL и ничего с ним не будет)
*
* Внимание! Один объект запроса можно использовать только из одного потока.
2011-03-18 20:26:54 +00:00
*/
2011-03-10 20:31:02 +00:00
class Query : public std::ostream
2011-03-03 19:57:34 +00:00
{
public:
2011-03-18 20:26:54 +00:00
Query(Connection * conn_, const std::string & query_string = "");
2011-03-03 19:57:34 +00:00
Query(const Query & other);
2011-03-05 20:47:46 +00:00
Query & operator= (const Query & other);
~Query();
2011-03-03 19:57:34 +00:00
2011-03-18 20:26:54 +00:00
/** Сбросить текст запроса. Это используется, если нужно написать новый запрос в том же объекте. */
2011-03-03 19:57:34 +00:00
void reset();
2011-03-18 20:26:54 +00:00
/** Выполнить запрос, результат которого не имеет значения (почти всё кроме SELECT). */
2011-03-03 19:57:34 +00:00
void execute();
2011-03-18 20:26:54 +00:00
/** Выполнить запрос, с возможностью загружать на клиента строки одна за другой.
* То есть, оперативка расходуется только на одну строку.
*/
2011-03-03 19:57:34 +00:00
UseQueryResult use();
2011-03-18 20:26:54 +00:00
/** Выполнить запрос с загрузкой на клиента всех строк.
* Требуется оперативка, чтобы вместить весь результат, зато к строкам можно обращаться в произвольном порядке.
*/
2011-03-03 19:57:34 +00:00
StoreQueryResult store();
2011-03-18 20:26:54 +00:00
/// Значение auto increment после последнего INSERT-а.
2011-03-05 16:56:30 +00:00
UInt64 insertID();
2011-03-18 20:26:54 +00:00
/// Для совместимости, то же, что insertID().
2011-03-05 16:56:30 +00:00
UInt64 insert_id() { return insertID(); }
2011-03-18 20:26:54 +00:00
/// Получить текст запроса (например, для вывода его в лог). См. ещё operator<< ниже.
2011-03-16 20:33:39 +00:00
std::string str() const
2011-03-04 20:58:19 +00:00
{
2011-03-10 20:31:02 +00:00
return query_buf.str();
2011-03-03 19:57:34 +00:00
}
private:
2011-03-09 20:11:29 +00:00
Connection * conn;
2011-03-10 20:31:02 +00:00
std::stringbuf query_buf;
2011-03-15 20:56:42 +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)
{
return ostr << query.rdbuf();
}
2011-03-03 19:57:34 +00:00
}