1#pragma once
2
3#include <vector>
4
5#include <mysqlxx/ResultBase.h>
6#include <mysqlxx/Row.h>
7
8
9namespace mysqlxx
10{
11
12class Connection;
13
14
15/** Результат выполнения запроса, загруженный полностью на клиента.
16 * Это требует оперативку, чтобы вместить весь результат,
17 * но зато реализует произвольный доступ к строкам по индексу.
18 * Если размер результата большой - используйте лучше UseQueryResult.
19 * Объект содержит ссылку на Connection.
20 * Если уничтожить Connection, то объект становится некорректным и все строки результата - тоже.
21 * Если задать следующий запрос в соединении, то объект и все строки тоже становятся некорректными.
22 * Использовать объект можно только для результата одного запроса!
23 * (При попытке присвоить объекту результат следующего запроса - UB.)
24 */
25class StoreQueryResult : public std::vector<Row>, public ResultBase
26{
27public:
28 StoreQueryResult(MYSQL_RES * res_, Connection * conn_, const Query * query_);
29
30 size_t num_rows() const { return size(); }
31
32private:
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