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