MySQL 8.0.40
Source Code Documentation
ddl0impl-file-reader.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 2020, 2024, Oracle and/or its affiliates.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License, version 2.0, as published by the
7Free Software Foundation.
8
9This program is designed to work with certain software (including
10but not limited to OpenSSL) that is licensed under separate terms,
11as designated in a particular file or component or in included license
12documentation. The authors of MySQL hereby grant you an additional
13permission to link the program and your derivative works with the
14separately licensed software that they have either included with
15the program or referenced in the documentation.
16
17This program is distributed in the hope that it will be useful, but WITHOUT
18ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0,
20for more details.
21
22You should have received a copy of the GNU General Public License along with
23this program; if not, write to the Free Software Foundation, Inc.,
2451 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
26*****************************************************************************/
27
28/** @file include/ddl0impl-file-reader.h
29 For scanning the temporary file.
30 Created 2020-11-01 by Sunny Bains. */
31
32#ifndef ddl0impl_file_reader_h
33#define ddl0impl_file_reader_h
34
35#include "ddl0impl-buffer.h"
36
37namespace ddl {
38
39// Forward declaration
40struct File_cursor;
41
42/** Represents the chunk in bytes : first element represents the beginning
43offset of the chunk and, second element represents the length of the chunk. */
44using Range = std::pair<os_offset_t, os_offset_t>;
45
46/** Read rows from the temporary file. Rows could be read in the from of chunks
47or ranges. */
48struct File_reader : private ut::Non_copyable {
49 /** Constructor.
50 @param[in] file Opened file.
51 @param[in,out] index Index that the rows belong to.
52 @param[in] buffer_size Size of file buffer for reading.
53 @param[in] range Offsets of the chunk to read */
55 size_t buffer_size, const Range &range) noexcept
56 : m_index(index),
57 m_file(file),
60 ut_a(range.first < range.second);
62 ut_a(m_index != nullptr);
64 }
65
66 /** Destructor. */
67 ~File_reader() noexcept {
68 if (m_aux_buf != nullptr) {
70 }
71 }
72
73 /** Prepare the file for reading.
74 @return DB_SUCCESS or error code. */
75 [[nodiscard]] dberr_t prepare() noexcept;
76
77 /** The current row as a tuple. Note: the tuple only does a shallow copy.
78 @param[in,out] builder Index builder instance.
79 @param[in,out] heap Heap to use for allocation.
80 @param[out] dtuple Row converted to a tuple.
81 @return DB_SUCCESS or error code. */
82 [[nodiscard]] dberr_t get_tuple(Builder *builder, mem_heap_t *heap,
83 dtuple_t *&dtuple) noexcept;
84
85 /** Set the start and end offsets to read from, to avoid the possibility of
86 overlapping reads from the other ranges in subsequent reads. Seek to the
87 start offset, read the page and, position to the first record on the page
88 @param[in] range Start and end offsets of the range to read from.
89 @return DB_SUCCESS or error code. */
90 dberr_t read(const Range &range) noexcept;
91
92 /** @return true if the range first == second. */
93 [[nodiscard]] bool end_of_range() const noexcept {
94 return m_range.first == m_range.second;
95 }
96
97 /** @return the number of rows read from the file. */
98 [[nodiscard]] uint64_t get_n_rows_read() const noexcept {
99 return m_n_rows_read;
100 }
101
102 private:
103 /** Read the page in the file buffer from the start offset, and reset the
104 cursor to the beginning of the file buffer
105 @return DB_SUCCESS or error code. */
106 [[nodiscard]] dberr_t seek() noexcept;
107
108 /** Advance page number to the next and read in.
109 @return DB_SUCCESS or error code. */
110 [[nodiscard]] dberr_t read_next() noexcept;
111
112 /** Advance the "cursor".
113 @return DB_SUCCESS or error code. */
114 [[nodiscard]] dberr_t next() noexcept;
115
116 public:
117 using Offsets = std::vector<ulint, ut::allocator<ulint>>;
118
119 /** Index that the records belong to. */
121
122 /** Pointer to current row. */
123 const mrec_t *m_mrec{};
124
125 /** Columns offsets. */
127
128 /** File handle to read from. */
130
131 private:
132 using Bounds = std::pair<const byte *, const byte *>;
133
134 /* Coordinates of the chunk that this file reader can read the rows from */
136
137 /** Pointer current offset within file buffer. */
138 const byte *m_ptr{};
139
140 /** File buffer bounds. */
142
143 /** Auxiliary buffer for records that span across pages. */
144 byte *m_aux_buf{};
145
146 /** IO buffer size in bytes. */
148
149 /** Aligned IO buffer. */
151
152 /** File buffer for reading. */
154
155 /** Number of rows read from the file. */
156 uint64_t m_n_rows_read{};
157
159};
160
161} // namespace ddl
162
163#endif /* ddl0impl_file_reader_h */
Captures ownership and manages lifetime of an already opened OS file descriptor.
Definition: ddl0ddl.h:161
bool is_open() const
Definition: ddl0ddl.h:179
A utility class which, if inherited from, prevents the descendant class from being copied,...
Definition: ut0class_life_cycle.h:41
dberr_t
Definition: db0err.h:39
DDL buffer infrastructure.
The general architecture is that the work is done in two phases, roughly the read and write phase.
Definition: btr0load.cc:42
std::pair< os_offset_t, os_offset_t > Range
Represents the chunk in bytes : first element represents the beginning offset of the chunk and,...
Definition: ddl0impl-file-reader.h:44
byte mrec_t
Merge record in Aligned_buffer.
Definition: ddl0ddl.h:78
std::pair< byte *, os_offset_t > IO_buffer
Block size for DDL I/O operations.
Definition: ddl0impl.h:47
Definition: os0file.h:86
size_t buffer_size(const ConstBufferSequence &buffers) noexcept
Definition: buffer.h:315
Definition: gcs_xcom_synode.h:64
This file contains a set of libraries providing overloads for regular dynamic allocation routines whi...
Definition: aligned_alloc.h:48
std::vector< T, ut::allocator< T > > vector
Specialization of vector which uses allocator.
Definition: ut0new.h:2875
void delete_arr(T *ptr) noexcept
Releases storage which has been dynamically allocated through any of the ut::new_arr*() variants.
Definition: ut0new.h:1110
std::conditional_t< !std::is_array< T >::value, std::unique_ptr< T, detail::Aligned_deleter< T > >, std::conditional_t< detail::is_unbounded_array_v< T >, std::unique_ptr< T, detail::Aligned_array_deleter< std::remove_extent_t< T > > >, void > > unique_ptr_aligned
The following is a common type that is returned by all the ut::make_unique_aligned (non-aligned) spec...
Definition: ut0new.h:2573
For loading indexes.
Definition: ddl0impl-builder.h:48
Read rows from the temporary file.
Definition: ddl0impl-file-reader.h:48
std::vector< ulint, ut::allocator< ulint > > Offsets
Definition: ddl0impl-file-reader.h:117
uint64_t m_n_rows_read
Number of rows read from the file.
Definition: ddl0impl-file-reader.h:156
Bounds m_bounds
File buffer bounds.
Definition: ddl0impl-file-reader.h:141
dberr_t seek() noexcept
Read the page in the file buffer from the start offset, and reset the cursor to the beginning of the ...
Definition: ddl0file-reader.cc:90
size_t m_buffer_size
IO buffer size in bytes.
Definition: ddl0impl-file-reader.h:147
File_reader(const Unique_os_file_descriptor &file, dict_index_t *index, size_t buffer_size, const Range &range) noexcept
Constructor.
Definition: ddl0impl-file-reader.h:54
uint64_t get_n_rows_read() const noexcept
Definition: ddl0impl-file-reader.h:98
const byte * m_ptr
Pointer current offset within file buffer.
Definition: ddl0impl-file-reader.h:138
const Unique_os_file_descriptor & m_file
File handle to read from.
Definition: ddl0impl-file-reader.h:129
dberr_t read(const Range &range) noexcept
Set the start and end offsets to read from, to avoid the possibility of overlapping reads from the ot...
Definition: ddl0file-reader.cc:105
byte * m_aux_buf
Auxiliary buffer for records that span across pages.
Definition: ddl0impl-file-reader.h:144
dict_index_t * m_index
Index that the records belong to.
Definition: ddl0impl-file-reader.h:120
friend File_cursor
Definition: ddl0impl-file-reader.h:158
const mrec_t * m_mrec
Pointer to current row.
Definition: ddl0impl-file-reader.h:123
dberr_t next() noexcept
Advance the "cursor".
Definition: ddl0file-reader.cc:125
dberr_t get_tuple(Builder *builder, mem_heap_t *heap, dtuple_t *&dtuple) noexcept
The current row as a tuple.
Definition: ddl0builder.cc:238
IO_buffer m_io_buffer
File buffer for reading.
Definition: ddl0impl-file-reader.h:153
Offsets m_field_offsets
Columns offsets.
Definition: ddl0impl-file-reader.h:126
~File_reader() noexcept
Destructor.
Definition: ddl0impl-file-reader.h:67
dberr_t read_next() noexcept
Advance page number to the next and read in.
Definition: ddl0file-reader.cc:120
Range m_range
Definition: ddl0impl-file-reader.h:135
ut::unique_ptr_aligned< byte[]> m_aligned_buffer
Aligned IO buffer.
Definition: ddl0impl-file-reader.h:150
bool end_of_range() const noexcept
Definition: ddl0impl-file-reader.h:93
std::pair< const byte *, const byte * > Bounds
Definition: ddl0impl-file-reader.h:132
dberr_t prepare() noexcept
Prepare the file for reading.
Definition: ddl0file-reader.cc:39
Data structure for an index.
Definition: dict0mem.h:1046
Structure for an SQL data tuple of fields (logical record)
Definition: data0data.h:694
The info structure stored at the beginning of a heap block.
Definition: mem0mem.h:302
Definition: gen_lex_token.cc:149
unsigned long int ulint
Definition: univ.i:406
#define ut_a(EXPR)
Abort execution if EXPR does not evaluate to nonzero.
Definition: ut0dbg.h:57