libpqxx
The C++ client library for PostgreSQL
types.hxx
1 /* Basic type aliases and forward declarations.
2  *
3  * Copyright (c) 2000-2025, Jeroen T. Vermeulen
4  *
5  * See COPYING for copyright license. If you did not receive a file called
6  * COPYING with this source code, please notify the distributor of this
7  * mistake, or contact the author.
8  */
9 #ifndef PQXX_H_TYPES
10 #define PQXX_H_TYPES
11 
12 #if !defined(PQXX_HEADER_PRE)
13 # error "Include libpqxx headers as <pqxx/header>, not <pqxx/header.hxx>."
14 #endif
15 
16 #include <cstddef>
17 #include <cstdint>
18 #include <iterator>
19 
20 #if defined(PQXX_HAVE_CONCEPTS) && defined(PQXX_HAVE_RANGES)
21 # include <ranges>
22 #endif
23 
24 
25 namespace pqxx
26 {
28 using result_size_type = int;
29 
32 
34 using row_size_type = int;
35 
37 using row_difference_type = int;
38 
40 using field_size_type = std::size_t;
41 
43 using large_object_size_type = int64_t;
44 
45 
46 // Forward declarations, to help break compilation dependencies.
47 // These won't necessarily include all classes in libpqxx.
48 class binarystring;
49 class connection;
53 class const_row_iterator;
54 class dbtransaction;
55 // 9.0: Remove this.
56 class errorhandler;
57 class field;
58 class largeobjectaccess;
60 struct range_error;
61 class result;
62 class row;
63 class stream_from;
64 class transaction_base;
65 
67 
69 enum class format : int
70 {
71  text = 0,
72  binary = 1,
73 };
74 
75 
77 
79 template<typename TYPE>
80 using strip_t = std::remove_cv_t<std::remove_reference_t<TYPE>>;
81 
82 
83 #if defined(PQXX_HAVE_CONCEPTS) && defined(PQXX_HAVE_RANGES)
84 
88 template<std::ranges::range CONTAINER>
90 #else // PQXX_HAVE_CONCEPTS
91 
95 template<typename CONTAINER>
97 #endif // PQXX_HAVE_CONCEPTS
98 
99 
100 #if defined(PQXX_HAVE_CONCEPTS) && defined(PQXX_HAVE_RANGES)
101 template<typename STRING>
103 concept char_string = std::ranges::contiguous_range<STRING> and
104  std::same_as<strip_t<value_type<STRING>>, char>;
105 
107 template<typename RANGE>
108 concept char_strings =
109  std::ranges::range<RANGE> and char_string<strip_t<value_type<RANGE>>>;
110 
112 template<typename DATA>
113 concept potential_binary =
114  std::ranges::contiguous_range<DATA> and (sizeof(value_type<DATA>) == 1);
115 #endif // PQXX_HAVE_CONCEPTS
116 
117 
118 // C++20: Retire these compatibility definitions.
119 #if defined(PQXX_HAVE_CONCEPTS) && defined(PQXX_HAVE_RANGES)
120 
122 
125 # define PQXX_RANGE_ARG std::ranges::range
126 
128 
131 # define PQXX_CHAR_STRING_ARG pqxx::char_string
132 
134 
137 # define PQXX_CHAR_STRINGS_ARG pqxx::char_strings
138 
139 #else // PQXX_HAVE_CONCEPTS
140 
142 
145 # define PQXX_RANGE_ARG typename
146 
148 
151 # define PQXX_CHAR_STRING_ARG typename
152 
154 
157 # define PQXX_CHAR_STRINGS_ARG typename
158 
159 #endif // PQXX_HAVE_CONCEPTS
160 
162 
165 {};
166 
168 
171 {};
172 
173 } // namespace pqxx
174 #endif
Accessor for large object's contents.
Definition: largeobject.hxx:153
Marker for stream_from constructors: "stream from query.".
Definition: types.hxx:170
Reference to one row in a result.
Definition: row.hxx:46
Something is out of range, similar to std::out_of_range.
Definition: except.hxx:325
int row_size_type
Number of fields in a row of database data.
Definition: types.hxx:34
Result set containing data returned by a query or command.
Definition: result.hxx:91
format
Format code: is data text or binary?
Definition: types.hxx:69
int result_size_type
Number of rows in a result set.
Definition: types.hxx:28
Abstract transaction base class: bracket transactions on the database.
Definition: dbtransaction.hxx:53
Definition: notification.hxx:56
int result_difference_type
Difference between result sizes.
Definition: types.hxx:31
Stream data from the database.
Definition: stream_from.hxx:78
Marker for stream_from constructors: "stream from table.".
Definition: types.hxx:164
Binary data corresponding to PostgreSQL's "BYTEA" binary-string type.
Definition: binarystring.hxx:57
Definition: errorhandler.hxx:45
int64_t large_object_size_type
Number of bytes in a large object.
Definition: types.hxx:43
The home of all libpqxx classes, functions, templates, etc.
Definition: array.cxx:26
Reference to a field in a result set.
Definition: field.hxx:34
int row_difference_type
Difference between row sizes.
Definition: types.hxx:37
Reverse iterator for a row. Use as row::const_reverse_iterator.
Definition: row.hxx:414
Iterator for rows in a result. Use as result::const_iterator.
Definition: result_iterator.hxx:32
Iterator for fields in a row. Use as row::const_iterator.
Definition: row.hxx:294
strip_t< decltype(*std::begin(std::declval< CONTAINER >()))> value_type
The type of a container's elements.
Definition: types.hxx:96
std::size_t field_size_type
Number of bytes in a field of database data.
Definition: types.hxx:40
Connection to a database.
Definition: connection.hxx:278
Reverse iterator for result. Use as result::const_reverse_iterator.
Definition: result_iterator.hxx:194
std::remove_cv_t< std::remove_reference_t< TYPE >> strip_t
Remove any constness, volatile, and reference-ness from a type.
Definition: types.hxx:80
Interface definition (and common code) for "transaction" classes.
Definition: transaction_base.hxx:150