1 //
2 // AbstractBinder.h
3 //
4 // Library: Data
5 // Package: DataCore
6 // Module: AbstractBinder
7 //
8 // Definition of the AbstractBinder class.
9 //
10 // Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
11 // and Contributors.
12 //
13 // SPDX-License-Identifier: BSL-1.0
14 //
15
16
17 #ifndef Data_AbstractBinder_INCLUDED
18 #define Data_AbstractBinder_INCLUDED
19
20
21 #include "Poco/Data/Data.h"
22 #include "Poco/Data/Date.h"
23 #include "Poco/Data/Time.h"
24 #include "Poco/Data/LOB.h"
25 #include "Poco/DateTime.h"
26 #include "Poco/Nullable.h"
27 #include "Poco/Any.h"
28 #include "Poco/Dynamic/Var.h"
29 #include "Poco/UTFString.h"
30 #include <vector>
31 #include <deque>
32 #include <list>
33 #include <cstddef>
34
35
36 namespace Poco {
37 namespace Data {
38
39
40 using NullData = NullType;
41
42
43 namespace Keywords {
44
45
46 static const NullData null = NULL_GENERIC;
47
48
49 } // namespace Keywords
50
51
52 class Data_API AbstractBinder
53 /// Interface for Binding data types to placeholders.
54 {
55 public:
56 using Ptr = SharedPtr<AbstractBinder>;
57
58 enum Direction
59 /// Binding direction for a parameter.
60 {
61 PD_IN,
62 PD_OUT,
63 PD_IN_OUT
64 };
65
66 AbstractBinder();
67 /// Creates the AbstractBinder.
68
69 virtual ~AbstractBinder();
70 /// Destroys the AbstractBinder.
71
72 virtual void bind(std::size_t pos, const Poco::Int8& val, Direction dir = PD_IN) = 0;
73 /// Binds an Int8.
74
75 virtual void bind(std::size_t pos, const std::vector<Poco::Int8>& val, Direction dir = PD_IN);
76 /// Binds an Int8 vector.
77
78 virtual void bind(std::size_t pos, const std::deque<Poco::Int8>& val, Direction dir = PD_IN);
79 /// Binds an Int8 deque.
80
81 virtual void bind(std::size_t pos, const std::list<Poco::Int8>& val, Direction dir = PD_IN);
82 /// Binds an Int8 list.
83
84 virtual void bind(std::size_t pos, const Poco::UInt8& val, Direction dir = PD_IN) = 0;
85 /// Binds an UInt8.
86
87 virtual void bind(std::size_t pos, const std::vector<Poco::UInt8>& val, Direction dir = PD_IN);
88 /// Binds an UInt8 vector.
89
90 virtual void bind(std::size_t pos, const std::deque<Poco::UInt8>& val, Direction dir = PD_IN);
91 /// Binds an UInt8 deque.
92
93 virtual void bind(std::size_t pos, const std::list<Poco::UInt8>& val, Direction dir = PD_IN);
94 /// Binds an UInt8 list.
95
96 virtual void bind(std::size_t pos, const Poco::Int16& val, Direction dir = PD_IN) = 0;
97 /// Binds an Int16.
98
99 virtual void bind(std::size_t pos, const std::vector<Poco::Int16>& val, Direction dir = PD_IN);
100 /// Binds an Int16 vector.
101
102 virtual void bind(std::size_t pos, const std::deque<Poco::Int16>& val, Direction dir = PD_IN);
103 /// Binds an Int16 deque.
104
105 virtual void bind(std::size_t pos, const std::list<Poco::Int16>& val, Direction dir = PD_IN);
106 /// Binds an Int16 list.
107
108 virtual void bind(std::size_t pos, const Poco::UInt16& val, Direction dir = PD_IN) = 0;
109 /// Binds an UInt16.
110
111 virtual void bind(std::size_t pos, const std::vector<Poco::UInt16>& val, Direction dir = PD_IN);
112 /// Binds an UInt16 vector.
113
114 virtual void bind(std::size_t pos, const std::deque<Poco::UInt16>& val, Direction dir = PD_IN);
115 /// Binds an UInt16 deque.
116
117 virtual void bind(std::size_t pos, const std::list<Poco::UInt16>& val, Direction dir = PD_IN);
118 /// Binds an UInt16 list.
119
120 virtual void bind(std::size_t pos, const Poco::Int32& val, Direction dir = PD_IN) = 0;
121 /// Binds an Int32.
122
123 virtual void bind(std::size_t pos, const std::vector<Poco::Int32>& val, Direction dir = PD_IN);
124 /// Binds an Int32 vector.
125
126 virtual void bind(std::size_t pos, const std::deque<Poco::Int32>& val, Direction dir = PD_IN);
127 /// Binds an Int32 deque.
128
129 virtual void bind(std::size_t pos, const std::list<Poco::Int32>& val, Direction dir = PD_IN);
130 /// Binds an Int32 list.
131
132 virtual void bind(std::size_t pos, const Poco::UInt32& val, Direction dir = PD_IN) = 0;
133 /// Binds an UInt32.
134
135 virtual void bind(std::size_t pos, const std::vector<Poco::UInt32>& val, Direction dir = PD_IN);
136 /// Binds an UInt32 vector.
137
138 virtual void bind(std::size_t pos, const std::deque<Poco::UInt32>& val, Direction dir = PD_IN);
139 /// Binds an UInt32 deque.
140
141 virtual void bind(std::size_t pos, const std::list<Poco::UInt32>& val, Direction dir = PD_IN);
142 /// Binds an UInt32 list.
143
144 virtual void bind(std::size_t pos, const Poco::Int64& val, Direction dir = PD_IN) = 0;
145 /// Binds an Int64.
146
147 virtual void bind(std::size_t pos, const std::vector<Poco::Int64>& val, Direction dir = PD_IN);
148 /// Binds an Int64 vector.
149
150 virtual void bind(std::size_t pos, const std::deque<Poco::Int64>& val, Direction dir = PD_IN);
151 /// Binds an Int64 deque.
152
153 virtual void bind(std::size_t pos, const std::list<Poco::Int64>& val, Direction dir = PD_IN);
154 /// Binds an Int64 list.
155
156 virtual void bind(std::size_t pos, const Poco::UInt64& val, Direction dir = PD_IN) = 0;
157 /// Binds an UInt64.
158
159 virtual void bind(std::size_t pos, const std::vector<Poco::UInt64>& val, Direction dir = PD_IN);
160 /// Binds an UInt64 vector.
161
162 virtual void bind(std::size_t pos, const std::deque<Poco::UInt64>& val, Direction dir = PD_IN);
163 /// Binds an UInt64 deque.
164
165 virtual void bind(std::size_t pos, const std::list<Poco::UInt64>& val, Direction dir = PD_IN);
166 /// Binds an UInt64 list.
167
168 #ifndef POCO_INT64_IS_LONG
169 virtual void bind(std::size_t pos, const long& val, Direction dir = PD_IN) = 0;
170 /// Binds a long.
171
172 virtual void bind(std::size_t pos, const unsigned long& val, Direction dir = PD_IN) = 0;
173 /// Binds an unsiged long.
174
175 virtual void bind(std::size_t pos, const std::vector<long>& val, Direction dir = PD_IN);
176 /// Binds a long vector.
177
178 virtual void bind(std::size_t pos, const std::deque<long>& val, Direction dir = PD_IN);
179 /// Binds a long deque.
180
181 virtual void bind(std::size_t pos, const std::list<long>& val, Direction dir = PD_IN);
182 /// Binds a long list.
183 #endif
184
185 virtual void bind(std::size_t pos, const bool& val, Direction dir = PD_IN) = 0;
186 /// Binds a boolean.
187
188 virtual void bind(std::size_t pos, const std::vector<bool>& val, Direction dir = PD_IN);
189 /// Binds a boolean vector.
190
191 virtual void bind(std::size_t pos, const std::deque<bool>& val, Direction dir = PD_IN);
192 /// Binds a boolean deque.
193
194 virtual void bind(std::size_t pos, const std::list<bool>& val, Direction dir = PD_IN);
195 /// Binds a boolean list.
196
197 virtual void bind(std::size_t pos, const float& val, Direction dir = PD_IN) = 0;
198 /// Binds a float.
199
200 virtual void bind(std::size_t pos, const std::vector<float>& val, Direction dir = PD_IN);
201 /// Binds a float vector.
202
203 virtual void bind(std::size_t pos, const std::deque<float>& val, Direction dir = PD_IN);
204 /// Binds a float deque.
205
206 virtual void bind(std::size_t pos, const std::list<float>& val, Direction dir = PD_IN);
207 /// Binds a float list.
208
209 virtual void bind(std::size_t pos, const double& val, Direction dir = PD_IN) = 0;
210 /// Binds a double.
211
212 virtual void bind(std::size_t pos, const std::vector<double>& val, Direction dir = PD_IN);
213 /// Binds a double vector.
214
215 virtual void bind(std::size_t pos, const std::deque<double>& val, Direction dir = PD_IN);
216 /// Binds a double deque.
217
218 virtual void bind(std::size_t pos, const std::list<double>& val, Direction dir = PD_IN);
219 /// Binds a double list.
220
221 virtual void bind(std::size_t pos, const char& val, Direction dir = PD_IN) = 0;
222 /// Binds a single character.
223
224 virtual void bind(std::size_t pos, const std::vector<char>& val, Direction dir = PD_IN);
225 /// Binds a character vector.
226
227 virtual void bind(std::size_t pos, const std::deque<char>& val, Direction dir = PD_IN);
228 /// Binds a character deque.
229
230 virtual void bind(std::size_t pos, const std::list<char>& val, Direction dir = PD_IN);
231 /// Binds a character list.
232
233 virtual void bind(std::size_t pos, const char* const& pVal, Direction dir = PD_IN) = 0;
234 /// Binds a const char ptr.
235
236 virtual void bind(std::size_t pos, const std::string& val, Direction dir = PD_IN) = 0;
237 /// Binds a string.
238
239 virtual void bind(std::size_t pos, const std::vector<std::string>& val, Direction dir = PD_IN);
240 /// Binds a string vector.
241
242 virtual void bind(std::size_t pos, const std::deque<std::string>& val, Direction dir = PD_IN);
243 /// Binds a string deque.
244
245 virtual void bind(std::size_t pos, const std::list<std::string>& val, Direction dir = PD_IN);
246 /// Binds a string list.
247
248 virtual void bind(std::size_t pos, const UTF16String& val, Direction dir = PD_IN);
249 /// Binds a UTF-16 Unicode string.
250
251 virtual void bind(std::size_t pos, const std::vector<UTF16String>& val, Direction dir = PD_IN);
252 /// Binds a UTF-16 Unicode string vector.
253
254 virtual void bind(std::size_t pos, const std::deque<UTF16String>& val, Direction dir = PD_IN);
255 /// Binds a UTF-16 Unicode string deque.
256
257 virtual void bind(std::size_t pos, const std::list<UTF16String>& val, Direction dir = PD_IN);
258 /// Binds a UTF-16 Unicode string list.
259
260 virtual void bind(std::size_t pos, const BLOB& val, Direction dir = PD_IN) = 0;
261 /// Binds a BLOB.
262
263 virtual void bind(std::size_t pos, const CLOB& val, Direction dir = PD_IN) = 0;
264 /// Binds a CLOB.
265
266 virtual void bind(std::size_t pos, const std::vector<BLOB>& val, Direction dir = PD_IN);
267 /// Binds a BLOB vector.
268
269 virtual void bind(std::size_t pos, const std::deque<BLOB>& val, Direction dir = PD_IN);
270 /// Binds a BLOB deque.
271
272 virtual void bind(std::size_t pos, const std::list<BLOB>& val, Direction dir = PD_IN);
273 /// Binds a BLOB list.
274
275 virtual void bind(std::size_t pos, const std::vector<CLOB>& val, Direction dir = PD_IN);
276 /// Binds a CLOB vector.
277
278 virtual void bind(std::size_t pos, const std::deque<CLOB>& val, Direction dir = PD_IN);
279 /// Binds a CLOB deque.
280
281 virtual void bind(std::size_t pos, const std::list<CLOB>& val, Direction dir = PD_IN);
282 /// Binds a CLOB list.
283
284 virtual void bind(std::size_t pos, const DateTime& val, Direction dir = PD_IN) = 0;
285 /// Binds a DateTime.
286
287 virtual void bind(std::size_t pos, const std::vector<DateTime>& val, Direction dir = PD_IN);
288 /// Binds a DateTime vector.
289
290 virtual void bind(std::size_t pos, const std::deque<DateTime>& val, Direction dir = PD_IN);
291 /// Binds a DateTime deque.
292
293 virtual void bind(std::size_t pos, const std::list<DateTime>& val, Direction dir = PD_IN);
294 /// Binds a DateTime list.
295
296 virtual void bind(std::size_t pos, const Date& val, Direction dir = PD_IN) = 0;
297 /// Binds a Date.
298
299 virtual void bind(std::size_t pos, const std::vector<Date>& val, Direction dir = PD_IN);
300 /// Binds a Date vector.
301
302 virtual void bind(std::size_t pos, const std::deque<Date>& val, Direction dir = PD_IN);
303 /// Binds a Date deque.
304
305 virtual void bind(std::size_t pos, const std::list<Date>& val, Direction dir = PD_IN);
306 /// Binds a Date list.
307
308 virtual void bind(std::size_t pos, const Time& val, Direction dir = PD_IN) = 0;
309 /// Binds a Time.
310
311 virtual void bind(std::size_t pos, const std::vector<Time>& val, Direction dir = PD_IN);
312 /// Binds a Time vector.
313
314 virtual void bind(std::size_t pos, const std::deque<Time>& val, Direction dir = PD_IN);
315 /// Binds a Time deque.
316
317 virtual void bind(std::size_t pos, const std::list<Time>& val, Direction dir = PD_IN);
318 /// Binds a Time list.
319
320 virtual void bind(std::size_t pos, const NullData& val, Direction dir = PD_IN) = 0;
321 /// Binds a null.
322
323 virtual void bind(std::size_t pos, const std::vector<NullData>& val, Direction dir = PD_IN);
324 /// Binds a null vector.
325
326 virtual void bind(std::size_t pos, const std::deque<NullData>& val, Direction dir = PD_IN);
327 /// Binds a null deque.
328
329 virtual void bind(std::size_t pos, const std::list<NullData>& val, Direction dir = PD_IN);
330 /// Binds a null list.
331
332 void bind(std::size_t pos, const Any& val, Direction dir = PD_IN);
333 /// Binds an Any.
334
335 void bind(std::size_t pos, const Poco::Dynamic::Var& val, Direction dir = PD_IN);
336 /// Binds a Var.
337
338 virtual void reset();
339 /// Resets a binder. No-op by default. Implement for binders that cache data.
340
341 static bool isOutBound(Direction dir);
342 /// Returns true if direction is out bound;
343
344 static bool isInBound(Direction dir);
345 /// Returns true if direction is in bound;
346 };
347
348
349 //
350 // inlines
351 //
reset()352 inline void AbstractBinder::reset()
353 {
354 //no-op
355 }
356
357
isOutBound(Direction dir)358 inline bool AbstractBinder::isOutBound(Direction dir)
359 {
360 return PD_OUT == dir || PD_IN_OUT == dir;
361 }
362
363
isInBound(Direction dir)364 inline bool AbstractBinder::isInBound(Direction dir)
365 {
366 return PD_IN == dir || PD_IN_OUT == dir;
367 }
368
369
370 } } // namespace Poco::Data
371
372
373 #endif // Data_AbstractBinder_INCLUDED
374