| 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 | |