1#pragma once
2
3#include <sstream>
4#include <ostream>
5
6#include <mysqlxx/UseQueryResult.h>
7#include <mysqlxx/StoreQueryResult.h>
8
9
10namespace mysqlxx
11{
12
13
14/** Запрос.
15 * Ссылается на Connection. Если уничтожить Connection, то Query станет некорректным и пользоваться им будет нельзя.
16 *
17 * Пример использования:
18 * mysqlxx::Query query = connection.query();
19 * query << "SELECT 1 AS x, 2 AS y, 3 AS z";
20 * query << " LIMIT 1";
21 * mysqlxx::UseQueryResult result = query.use();
22 *
23 * while (mysqlxx::Row row = result.fetch())
24 * std::cout << row["x"] << std::endl;
25 *
26 * В отличие от библиотеки mysql++, запрос можно копировать.
27 * (то есть, запрос можно класть в контейнеры STL и ничего с ним не будет)
28 *
29 * Внимание! Один объект запроса можно использовать только из одного потока.
30 */
31class Query : public std::ostream
32{
33public:
34 Query(Connection * conn_, const std::string & query_string = "");
35 Query(const Query & other);
36 Query & operator= (const Query & other);
37 ~Query();
38
39 /** Сбросить текст запроса. Это используется, если нужно написать новый запрос в том же объекте. */
40 void reset();
41
42 /** Выполнить запрос, результат которого не имеет значения (почти всё кроме SELECT). */
43 void execute();
44
45 /** Выполнить запрос, с возможностью загружать на клиента строки одна за другой.
46 * То есть, оперативка расходуется только на одну строку.
47 */
48 UseQueryResult use();
49
50 /** Выполнить запрос с загрузкой на клиента всех строк.
51 * Требуется оперативка, чтобы вместить весь результат, зато к строкам можно обращаться в произвольном порядке.
52 */
53 StoreQueryResult store();
54
55 /// Значение auto increment после последнего INSERT-а.
56 UInt64 insertID();
57
58 /// Для совместимости, то же, что insertID().
59 UInt64 insert_id() { return insertID(); }
60
61 /// Получить текст запроса (например, для вывода его в лог). См. ещё operator<< ниже.
62 std::string str() const
63 {
64 return query_buf.str();
65 }
66
67private:
68 Connection * conn;
69 std::stringbuf query_buf;
70
71 void executeImpl();
72};
73
74
75/// Вывести текст запроса в ostream.
76inline std::ostream & operator<< (std::ostream & ostr, const Query & query)
77{
78 return ostr << query.rdbuf();
79}
80
81
82}
83