DCL 3.7.4
Loading...
Searching...
No Matches
PeParam.cpp
Go to the documentation of this file.
1#include <dcl/Config.h>
2
3#include <ecpgtype.h>
4#include <sqlda.h>
5#include <pgtypes_numeric.h>
6#include <pgtypes_date.h>
7#include <pgtypes_interval.h>
8#include <pgtypes_timestamp.h>
9
10#include <dcl/Object.h>
11#if __DCL_HAVE_ALLOC_DEBUG
12#undef __DCL_ALLOC_LEVEL
13#define __DCL_ALLOC_LEVEL __DCL_ALLOC_INTERNAL
14#endif
15
16#include <dcl/DateTime.h>
17#include <dcl/InputStream.h>
18#include <dcl/Files.h>
19#include <dcl/SQLCore.h>
20
21#include "PeConnection.h"
22#include "PeQuery.h"
23#include "PeParam.h"
24#include "PeTypes.h"
25
26#define __TRACE_THIS 0
27#if __TRACE_THIS
28#define __DCL_TRACE0_N __DCL_TRACE0
29#define __DCL_TRACE1_N __DCL_TRACE1
30#define __DCL_TRACE2_N __DCL_TRACE2
31#define __DCL_TRACE3_N __DCL_TRACE3
32#define __DCL_TRACE4_N __DCL_TRACE4
33#else
34#define __DCL_TRACE0_N(fmt)
35#define __DCL_TRACE1_N(fmt, arg)
36#define __DCL_TRACE2_N(fmt, arg1, arg2)
37#define __DCL_TRACE3_N(fmt, arg1, arg2, arg3)
38#define __DCL_TRACE4_N(fmt, arg1, arg2, arg3, arg4)
39#endif
40
41#undef __THIS_FILE__
42static const char_t __THIS_FILE__[] = __T("dcl/sql/PeParam.cpp");
43
44__DCL_BEGIN_NAMESPACE
45
46#define __SET_ERROR(_error) \
47 conn()->setErrorHandle(_error, 0L, __THIS_FILE__, __LINE__)
48#define __SET_ERROR_HANDLE(_SQLCODE) \
49 conn()->setErrorHandle(SQL::eServerError, _SQLCODE, __THIS_FILE__, __LINE__)
50#define __SET_ERROR_MSG(_message) \
51 conn()->setErrorMessage(_message, __THIS_FILE__, __LINE__)
52
54
55PeParam::PeParam() : Param(NULL)
56{
57 __sqlvar = NULL;
58}
59
63
64bool PeParam::init(SQL::Query* _queryHandle, sqlvar_t* _sqlvar)
65{
66 __DCL_ASSERT((Param::__queryHandle == NULL) && (__sqlvar == NULL));
67
68 Param::__queryHandle = _queryHandle;
69
70 //__DCL_TRACE4_N(L"type[%d] len[%d] data[%p] ind[%p]\n",
71 // _sqlvar->sqltype, _sqlvar->sqllen,
72 // _sqlvar->sqldata, _sqlvar->sqlind);
73
74 __sqlvar = _sqlvar;
75 //__sqlvar->sqltype = 0;
76 //__sqlvar->sqllen = 0;
77 //__sqlvar->sqldata = NULL;
78 __sqlvar->sqlind = &__indicator;
79 __indicator = -1; // set null
80
81 return true;
82}
83
84#ifdef __DCL_DEBUG
85void PeParam::onBeforeExecute()
86{
87#if __TRACE_THIS && 1
89 __DCL_TRACE2_N(L"sqltype[%d] sqllen[%d]\n",
90 __sqlvar->sqltype, __sqlvar->sqllen);
91 __DCL_TRACE2_N(L"sqldata[%p] [%ls]\n", __sqlvar->sqldata,
92 String::tryString((const char*)__sqlvar->sqldata, __sqlvar->sqllen).data());
93 }
94#endif
95}
96#endif
97
99{
100 Param::__dataType = SQL::typeUnknown;
101 __sqlvar->sqltype = 0;
102 __sqlvar->sqllen = 0;
103 __sqlvar->sqldata = NULL;
104 __indicator = -1; // set null
105 __bytes.clear();
106
107 return true;
108}
109
110// in PeField.cpp
111const wchar_t* __dataTypeName(const sqlvar_t* _sqlvar);
112
113const wchar_t* PeParam::serverDataTypeName() const
114{
115 return __dataTypeName(__sqlvar);
116}
117
119{
120 Param::__dataType = SQL::typeUnknown;
121 __sqlvar->sqltype = 0;
122 __sqlvar->sqllen = 0;
123 __sqlvar->sqldata = NULL;
124 __indicator = -1; // set null
125}
126
128 _CONST void* _val,
129 size_t _size,
130 SQL::DataType _valType,
131 SQL::DataType _sqlType
132)
133{
134 switch(_valType) {
135 case SQL::typeInteger: {
136 switch (_size) {
137 case sizeof(int8_t) : {
138 __data.i32 = (int32_t) * (int8_t*)_val;
139 __sqlvar->sqltype = ECPGt_int;
140 __sqlvar->sqllen = sizeof(int32_t);
141 __sqlvar->sqldata = (char*)&__data;
142 break;
143 }
144 case sizeof(int16_t) : {
145 __data.i32 = (int32_t) * (int16_t*)_val;
146 __sqlvar->sqltype = ECPGt_int;
147 __sqlvar->sqllen = sizeof(int32_t);
148 __sqlvar->sqldata = (char*)&__data;
149 break;
150 }
151 case sizeof(int32_t) : {
152 __data.i32 = *(int32_t*)_val;
153 __sqlvar->sqltype = ECPGt_int;
154 __sqlvar->sqllen = sizeof(int32_t);
155 __sqlvar->sqldata = (char*)&__data;
156 break;
157 }
158 case sizeof(int64_t) : {
159 __data.i64 = *(int64_t*)_val;
160#if ALIGNOF_LONG == 8
161 __sqlvar->sqltype = ECPGt_long;
162#else
163 __sqlvar->sqltype = ECPGt_long_long;
164#endif
165 __sqlvar->sqllen = sizeof(int64_t);
166 __sqlvar->sqldata = (char*)&__data;
167 break;
168 }
169 default: {
171 return false;
172 }
173 }
174 break;
175 }
176 case SQL::typeUInteger: {
177 switch (_size) {
178 case sizeof(uint8_t) : {
179 __data.i32 = (int32_t) * (uint8_t*)_val;
180 __sqlvar->sqltype = ECPGt_int;
181 __sqlvar->sqllen = sizeof(uint32_t);
182 __sqlvar->sqldata = (char*)&__data;
183 break;
184 }
185 case sizeof(uint16_t) : {
186 __data.i32 = (int32_t) * (uint16_t*)_val;
187 __sqlvar->sqltype = ECPGt_int;
188 __sqlvar->sqllen = sizeof(uint32_t);
189 __sqlvar->sqldata = (char*)&__data;
190 break;
191 }
192 case sizeof(uint32_t) : {
193 __data.i32 = (int32_t) * (uint32_t*)_val;
194 __sqlvar->sqltype = ECPGt_int;
195 __sqlvar->sqllen = sizeof(uint32_t);
196 __sqlvar->sqldata = (char*)&__data;
197 break;
198 }
199 case sizeof(uint64_t) : {
200 __data.i64 = (int64_t) * (uint64_t*)_val;
201#if ALIGNOF_LONG == 8
202 __sqlvar->sqltype = ECPGt_long;
203#else
204 __sqlvar->sqltype = ECPGt_long_long;
205#endif
206 __sqlvar->sqllen = sizeof(int64_t);
207 __sqlvar->sqldata = (char*)&__data;
208 break;
209 }
210 default: {
212 return false;
213 }
214 }
215 break;
216 }
217 case SQL::typeFloat: {
218 switch (_size) {
219 case sizeof(float) : {
220 __data.f32 = *(float*)_val;
221 __sqlvar->sqltype = ECPGt_float;
222 __sqlvar->sqllen = sizeof(float);
223 __sqlvar->sqldata = (char*)&__data;
224 break;
225 }
226 case sizeof(double) : {
227 __data.f64 = *(double*)_val;
228 __sqlvar->sqltype = ECPGt_double;
229 __sqlvar->sqllen = sizeof(double);
230 __sqlvar->sqldata = (char*)&__data;
231 break;
232 }
233 default: {
235 return false;
236 }
237 }
238 break;
239 }
240 case SQL::typeDate: {
241 if (_size == sizeof(SQL::Date)) {
242 __encode((const SQL::Date*)_val, &__data.dt);
243 __sqlvar->sqltype = ECPGt_date;
244 __sqlvar->sqllen = sizeof(date);
245 __sqlvar->sqldata = (char*)&__data;
246 }
247 else {
249 return false;
250 }
251 break;
252 }
253 case SQL::typeTime: {
254 if (_size == sizeof(SQL::Time)) {
255 __bytes = __encode((const SQL::Time*)_val);
256 __sqlvar->sqltype = ECPGt_char;
257 __sqlvar->sqllen = (short)__bytes.length();
258 __sqlvar->sqldata = (char*)__bytes.data();
259 }
260 else {
262 return false;
263 }
264 break;
265 }
266 case SQL::typeTimeStamp: {
267 if (_size == sizeof(SQL::TimeStamp)) {
268 const SQL::TimeStamp* p = (const SQL::TimeStamp*)_val;
269#if 0
270 if (p->tzoff != INT16_MIN) {
272 return false;
273 }
274#endif
275 __encode(p, &__data.ts);
276 __sqlvar->sqltype = ECPGt_timestamp;
277 __sqlvar->sqllen = sizeof(timestamp);
278 __sqlvar->sqldata = (char*)&__data;
279 }
280 else {
282 return false;
283 }
284 break;
285 }
286 case SQL::typeInterval: {
287 if (_size == sizeof(SQL::Interval)) {
288 __encode((const SQL::Interval*)_val, &__data.ival);
289 __sqlvar->sqltype = ECPGt_interval;
290 __sqlvar->sqllen = sizeof(interval);
291 __sqlvar->sqldata = (char*)&__data;
292 }
293 else {
295 return false;
296 }
297 break;
298 }
299 case SQL::typeText: {
300 if (_sqlType == SQL::typeNumeric) {
301 if (_size > 0) {
302 numeric* p = PGTYPESnumeric_from_asc((char*)_val, NULL);
303 if (!p) {
305 return false;
306 }
307 PGTYPESnumeric_copy(p, &__data.nu);
308 __sqlvar->sqltype = ECPGt_numeric;
309 __sqlvar->sqllen = sizeof(numeric);
310 __sqlvar->sqldata = (char*)&__data;
311 }
312 else {
314 return false;
315 }
316 break;
317 }
318#if __TRACE_THIS && 1
319 __DCL_TRACE2_N(L"_sqlType[%d] _size[%zd]\n",
320 _sqlType, _size);
321 __DCL_TRACE2_N(L"_val[%p] [%ls]\n", _val,
322 String::tryString((const char*)_val, _size).data());
323#endif
324 }
325 case SQL::typeBinary: {
326 switch (_sqlType) {
327 case SQL::typeText: // CHAR, VARCHAR
328 case SQL::typeLongText: {
329 __sqlvar->sqltype = ECPGt_char;
330 __sqlvar->sqllen = (short) _size;
331 __sqlvar->sqldata = (char*) _val;
332 break;
333 }
334 case SQL::typeBinary: // ECPGt_bytea 동작하지 않는다!
335 case SQL::typeLongBinary: {
336 __bytes = ByteString::toHexString(
337 (const char*)_val, _size, (size_t)-1, true);
338 if (__bytes.length() > INT16_MAX) {
340 return false;
341 }
342 __sqlvar->sqltype = ECPGt_char;
343 __sqlvar->sqllen = (short)__bytes.length();
344 __sqlvar->sqldata = (char*)__bytes.data();
345 break;
346 }
347 default: {
349 return false;
350 }
351 }
352 break;
353 }
355 try {
356 __bytes = Files::readBytes(*(InputStream*)_val, _size);
357 }
358 catch (IOException* e) {
359 __SET_ERROR_MSG(UTF8Encoder::encode(e->toStringAll()));
360 e->destroy();
361 return false;
362 }
363 if (__bytes.length() > INT16_MAX) {
365 return false;
366 }
367 __bytes = ByteString::toHexString(__bytes, (size_t)-1, true);
368 if (__bytes.length() > INT16_MAX) {
370 return false;
371 }
372 __sqlvar->sqltype = ECPGt_char;
373 __sqlvar->sqllen = (short) __bytes.length();
374 __sqlvar->sqldata = (char*)__bytes.data();
375 break;
376 }
377 default: {
379 return false;
380 }
381 }
382
383 __indicator = 0;
384 Param::__dataType = _sqlType;
385 return true;
386}
387
388__DCL_END_NAMESPACE
#define __THIS_FILE__
Definition _trace.h:14
#define NULL
Definition Config.h:312
wchar_t char_t
Definition Config.h:247
#define _CONST
Definition Config.h:325
#define INT16_MAX
Definition Config.h:289
#define INT16_MIN
Definition Config.h:284
#define __DCL_TRACE2_N(fmt, arg1, arg2)
#define __SET_ERROR_MSG(_message)
const wchar_t * __dataTypeName(const ifx_sqlvar_t *_sqlvar)
Definition IFXField.cpp:304
#define __DCL_ASSERT(expr)
Definition Object.h:394
#define IMPLEMENT_CLASSINFO(class_name, base_class_name)
Definition Object.h:245
#define __T(str)
Definition Object.h:60
const wchar_t * __dataTypeName(const sqlvar_t *_sqlvar)
Definition PeField.cpp:190
void __encode(const SQL::Date *_s, date *_r)
Definition PeTypes.cpp:37
#define __SET_ERROR(_errorCode)
Definition SQLCore.cpp:149
virtual void destroy()
Definition Exception.cpp:74
String toStringAll() const
Definition Exception.cpp:45
static ByteString readBytes(InputStream &_input, size_t _n=(size_t) -1) __DCL_THROWS1(IOException *)
Definition Files.cpp:397
virtual void setNull()
Definition PeParam.cpp:118
virtual const wchar_t * serverDataTypeName() const
Definition PeParam.cpp:113
virtual ~PeParam()
Definition PeParam.cpp:60
virtual bool __setData(_CONST void *_val, size_t _size, SQL::DataType _valType, SQL::DataType _sqlType)
Definition PeParam.cpp:127
bool onAfterExecute()
Definition PeParam.cpp:98
bool init(SQL::Query *_query, sqlvar_t *_sqlvar)
Definition PeParam.cpp:64
DataType __dataType
Definition SQLCore.h:188
DataType
Definition SQLCore.h:59
@ typeBinary
Definition SQLCore.h:74
@ typeNumeric
Definition SQLCore.h:64
@ typeTime
Definition SQLCore.h:66
@ typeLongBinary
Definition SQLCore.h:76
@ typeUInteger
Definition SQLCore.h:62
@ typeUnknown
Definition SQLCore.h:60
@ typeTimeStamp
Definition SQLCore.h:68
@ typeInputStream
Definition SQLCore.h:81
@ typeInterval
Definition SQLCore.h:70
@ typeDate
Definition SQLCore.h:65
@ typeText
Definition SQLCore.h:73
@ typeFloat
Definition SQLCore.h:63
@ typeInteger
Definition SQLCore.h:61
@ typeLongText
Definition SQLCore.h:75
@ eInvalidData
Definition SQLCore.h:54
@ eNotSupportDataType
Definition SQLCore.h:48
@ eInvalidDataSize
Definition SQLCore.h:55
int16_t tzoff
Definition SQLCore.h:119