1 | #pragma once |
2 | |
3 | #include <vector> |
4 | |
5 | #include <mysqlxx/ResultBase.h> |
6 | #include <mysqlxx/Row.h> |
7 | |
8 | |
9 | namespace mysqlxx |
10 | { |
11 | |
12 | class Connection; |
13 | |
14 | |
15 | /** Результат выполнения запроса, загруженный полностью на клиента. |
16 | * Это требует оперативку, чтобы вместить весь результат, |
17 | * но зато реализует произвольный доступ к строкам по индексу. |
18 | * Если размер результата большой - используйте лучше UseQueryResult. |
19 | * Объект содержит ссылку на Connection. |
20 | * Если уничтожить Connection, то объект становится некорректным и все строки результата - тоже. |
21 | * Если задать следующий запрос в соединении, то объект и все строки тоже становятся некорректными. |
22 | * Использовать объект можно только для результата одного запроса! |
23 | * (При попытке присвоить объекту результат следующего запроса - UB.) |
24 | */ |
25 | class StoreQueryResult : public std::vector<Row>, public ResultBase |
26 | { |
27 | public: |
28 | StoreQueryResult(MYSQL_RES * res_, Connection * conn_, const Query * query_); |
29 | |
30 | size_t num_rows() const { return size(); } |
31 | |
32 | private: |
33 | |
34 | /** Не смотря на то, что весь результат выполнения запроса загружается на клиента, |
35 | * и все указатели MYSQL_ROW на отдельные строки различные, |
36 | * при этом функция mysql_fetch_lengths() возвращает длины |
37 | * для текущей строки по одному и тому же адресу. |
38 | * То есть, чтобы можно было пользоваться несколькими Row одновременно, |
39 | * необходимо заранее куда-то сложить все длины. |
40 | */ |
41 | using Lengths = std::vector<MYSQL_LENGTH>; |
42 | Lengths lengths; |
43 | }; |
44 | |
45 | } |
46 | |