1 | #pragma once |
2 | |
3 | #include <sstream> |
4 | #include <ostream> |
5 | |
6 | #include <mysqlxx/UseQueryResult.h> |
7 | #include <mysqlxx/StoreQueryResult.h> |
8 | |
9 | |
10 | namespace 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 | */ |
31 | class Query : public std::ostream |
32 | { |
33 | public: |
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 | |
67 | private: |
68 | Connection * conn; |
69 | std::stringbuf query_buf; |
70 | |
71 | void executeImpl(); |
72 | }; |
73 | |
74 | |
75 | /// Вывести текст запроса в ostream. |
76 | inline std::ostream & operator<< (std::ostream & ostr, const Query & query) |
77 | { |
78 | return ostr << query.rdbuf(); |
79 | } |
80 | |
81 | |
82 | } |
83 | |