DCL 4.1
Loading...
Searching...
No Matches
PgParam.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 "PgConnection.h"
22#include "PgQuery.h"
23#include "PgParam.h"
24#include "PgTypes_.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 wchar_t __THIS_FILE__[] = __T("dcl/sql/PgParam.cpp");
43
44__DCL_BEGIN_NAMESPACE
45
47
48PgParam::PgParam() : Param(NULL)
49{
50 __sqlvar = NULL;
51}
52
56
57bool PgParam::init(SQL::Query* _queryHandle, sqlvar_t* _sqlvar)
58{
59 __DCL_ASSERT((Param::__queryHandle == NULL) && (__sqlvar == NULL));
60
61 Param::__queryHandle = _queryHandle;
62
63 //__DCL_TRACE4_N(L"type[%d] len[%d] data[%p] ind[%p]\n",
64 // _sqlvar->sqltype, _sqlvar->sqllen,
65 // _sqlvar->sqldata, _sqlvar->sqlind);
66
67 __sqlvar = _sqlvar;
68 //__sqlvar->sqltype = 0;
69 //__sqlvar->sqllen = 0;
70 //__sqlvar->sqldata = NULL;
71 __sqlvar->sqlind = &__indicator;
72 __indicator = -1; // set null
73
74 return true;
75}
76
77#if __DCL_DEBUG
78void PgParam::onBeforeExecute()
79{
80#if __TRACE_THIS && 1
82 __DCL_TRACE2_N(L"sqltype[%d] sqllen[%d]\n",
83 __sqlvar->sqltype, __sqlvar->sqllen);
84 __DCL_TRACE2_N(L"sqldata[%p] [%ls]\n", __sqlvar->sqldata,
85 String::tryString((const char*)__sqlvar->sqldata, __sqlvar->sqllen).data());
86 }
87#endif
88}
89#endif
90
92{
93 Param::__dataType = SQL::typeUnknown;
94 __sqlvar->sqltype = 0;
95 __sqlvar->sqllen = 0;
96 __sqlvar->sqldata = NULL;
97 __indicator = -1; // set null
98 __bytes.clear();
99
100 return true;
101}
102
103// in PgField.cpp
104const wchar_t* __dataTypeName(const sqlvar_t* _sqlvar);
105
106const wchar_t* PgParam::serverDataTypeName() const
107{
108 return __dataTypeName(__sqlvar);
109}
110
112{
113 Param::__dataType = SQL::typeUnknown;
114 __sqlvar->sqltype = 0;
115 __sqlvar->sqllen = 0;
116 __sqlvar->sqldata = NULL;
117 __indicator = -1; // set null
118}
119
121 _CONST void* _pv,
122 size_t _size,
123 SQL::DataType _dataType,
124 SQL::DataType _assignType
125 )
126{
127 switch(_dataType) {
128 case SQL::typeInteger: {
129 switch (_size) {
130 case sizeof(int8_t) : {
131 __data.i32 = (int32_t) * (int8_t*)_pv;
132 __sqlvar->sqltype = ECPGt_int;
133 __sqlvar->sqllen = sizeof(int32_t);
134 __sqlvar->sqldata = (char*)&__data;
135 break;
136 }
137 case sizeof(int16_t) : {
138 __data.i32 = (int32_t) * (int16_t*)_pv;
139 __sqlvar->sqltype = ECPGt_int;
140 __sqlvar->sqllen = sizeof(int32_t);
141 __sqlvar->sqldata = (char*)&__data;
142 break;
143 }
144 case sizeof(int32_t) : {
145 __data.i32 = *(int32_t*)_pv;
146 __sqlvar->sqltype = ECPGt_int;
147 __sqlvar->sqllen = sizeof(int32_t);
148 __sqlvar->sqldata = (char*)&__data;
149 break;
150 }
151 case sizeof(int64_t) : {
152 __data.i64 = *(int64_t*)_pv;
153#if ALIGNOF_LONG == 8
154 __sqlvar->sqltype = ECPGt_long;
155#else
156 __sqlvar->sqltype = ECPGt_long_long;
157#endif
158 __sqlvar->sqllen = sizeof(int64_t);
159 __sqlvar->sqldata = (char*)&__data;
160 break;
161 }
162 default: {
164 return false;
165 }
166 }
167 break;
168 }
169 case SQL::typeUInteger: {
170 switch (_size) {
171 case sizeof(uint8_t) : {
172 __data.i32 = (int32_t) * (uint8_t*)_pv;
173 __sqlvar->sqltype = ECPGt_int;
174 __sqlvar->sqllen = sizeof(uint32_t);
175 __sqlvar->sqldata = (char*)&__data;
176 break;
177 }
178 case sizeof(uint16_t) : {
179 __data.i32 = (int32_t) * (uint16_t*)_pv;
180 __sqlvar->sqltype = ECPGt_int;
181 __sqlvar->sqllen = sizeof(uint32_t);
182 __sqlvar->sqldata = (char*)&__data;
183 break;
184 }
185 case sizeof(uint32_t) : {
186 __data.i32 = (int32_t) * (uint32_t*)_pv;
187 __sqlvar->sqltype = ECPGt_int;
188 __sqlvar->sqllen = sizeof(uint32_t);
189 __sqlvar->sqldata = (char*)&__data;
190 break;
191 }
192 case sizeof(uint64_t) : {
193 __data.i64 = (int64_t) * (uint64_t*)_pv;
194#if ALIGNOF_LONG == 8
195 __sqlvar->sqltype = ECPGt_long;
196#else
197 __sqlvar->sqltype = ECPGt_long_long;
198#endif
199 __sqlvar->sqllen = sizeof(int64_t);
200 __sqlvar->sqldata = (char*)&__data;
201 break;
202 }
203 default: {
205 return false;
206 }
207 }
208 break;
209 }
210 case SQL::typeFloat: {
211 switch (_size) {
212 case sizeof(float) : {
213 __data.f32 = *(float*)_pv;
214 __sqlvar->sqltype = ECPGt_float;
215 __sqlvar->sqllen = sizeof(float);
216 __sqlvar->sqldata = (char*)&__data;
217 break;
218 }
219 case sizeof(double) : {
220 __data.f64 = *(double*)_pv;
221 __sqlvar->sqltype = ECPGt_double;
222 __sqlvar->sqllen = sizeof(double);
223 __sqlvar->sqldata = (char*)&__data;
224 break;
225 }
226 default: {
228 return false;
229 }
230 }
231 break;
232 }
233 case SQL::typeDate: {
234 if (_size == sizeof(SQL::Date)) {
235 __encode((const SQL::Date*)_pv, &__data.dt);
236 __sqlvar->sqltype = ECPGt_date;
237 __sqlvar->sqllen = sizeof(date);
238 __sqlvar->sqldata = (char*)&__data;
239 }
240 else {
242 return false;
243 }
244 break;
245 }
246 case SQL::typeTime: {
247 if (_size == sizeof(SQL::Time)) {
248 __bytes = __encode((const SQL::Time*)_pv);
249 __sqlvar->sqltype = ECPGt_char;
250 __sqlvar->sqllen = (short)__bytes.length();
251 __sqlvar->sqldata = (char*)__bytes.data();
252 }
253 else {
255 return false;
256 }
257 break;
258 }
259 case SQL::typeTimeStamp: {
260 if (_size == sizeof(SQL::TimeStamp)) {
261 const SQL::TimeStamp* p = (const SQL::TimeStamp*)_pv;
262#if 0
263 if (p->tzoff != INT16_MIN) {
265 return false;
266 }
267#endif
268 __encode(p, &__data.ts);
269 __sqlvar->sqltype = ECPGt_timestamp;
270 __sqlvar->sqllen = sizeof(timestamp);
271 __sqlvar->sqldata = (char*)&__data;
272 }
273 else {
275 return false;
276 }
277 break;
278 }
279 case SQL::typeInterval: {
280 if (_size == sizeof(SQL::Interval)) {
281 __encode((const SQL::Interval*)_pv, &__data.ival);
282 __sqlvar->sqltype = ECPGt_interval;
283 __sqlvar->sqllen = sizeof(interval);
284 __sqlvar->sqldata = (char*)&__data;
285 }
286 else {
288 return false;
289 }
290 break;
291 }
292 case SQL::typeText: {
293 if (_assignType == SQL::typeNumeric) {
294 if (_size > 0) {
295 numeric* p = PGTYPESnumeric_from_asc((char*)_pv, NULL);
296 if (!p) {
298 return false;
299 }
300 PGTYPESnumeric_copy(p, &__data.nu);
301 __sqlvar->sqltype = ECPGt_numeric;
302 __sqlvar->sqllen = sizeof(numeric);
303 __sqlvar->sqldata = (char*)&__data;
304 }
305 else {
307 return false;
308 }
309 break;
310 }
311#if __TRACE_THIS && 1
312 __DCL_TRACE2_N(L"_dataType[%d] _size[%zd]\n",
313 _dataType, _size);
314 __DCL_TRACE2_N(L"_pv[%p] [%ls]\n", _pv,
315 String::tryString((const char*)_pv, _size).data());
316#endif
317 }
318 case SQL::typeBinary: {
319 switch (_assignType) {
320 case SQL::typeText: // CHAR, VARCHAR
321 case SQL::typeLongText: {
322 __sqlvar->sqltype = ECPGt_char;
323 __sqlvar->sqllen = (short) _size;
324 __sqlvar->sqldata = (char*) _pv;
325 break;
326 }
327 case SQL::typeBinary: // ECPGt_bytea 동작하지 않는다!
328 case SQL::typeLongBinary: {
329 __bytes = ByteString::toHexString(
330 (const char*)_pv, _size, (size_t)-1, true);
331 if (__bytes.length() > INT16_MAX) {
333 return false;
334 }
335 __sqlvar->sqltype = ECPGt_char;
336 __sqlvar->sqllen = (short)__bytes.length();
337 __sqlvar->sqldata = (char*)__bytes.data();
338 break;
339 }
340 default: {
342 return false;
343 }
344 }
345 break;
346 }
348 try {
349 __bytes = Files::readBytes(*(InputStream*)_pv, _size);
350 }
351 catch (IOException* e) {
352 __SET_ERROR_MSG(UTF8Encoder::encode(e->toStringAll()));
353 e->destroy();
354 return false;
355 }
356 if (__bytes.length() > INT16_MAX) {
358 return false;
359 }
360 __bytes = ByteString::toHexString(__bytes, (size_t)-1, true);
361 if (__bytes.length() > INT16_MAX) {
363 return false;
364 }
365 __sqlvar->sqltype = ECPGt_char;
366 __sqlvar->sqllen = (short) __bytes.length();
367 __sqlvar->sqldata = (char*)__bytes.data();
368 break;
369 }
370 default: {
372 return false;
373 }
374 }
375
376 __indicator = 0;
377 Param::__dataType = _assignType;
378 return true;
379}
380
381__DCL_END_NAMESPACE
#define __THIS_FILE__
Definition _trace.h:14
#define NULL
Definition Config.h:340
#define _CONST
Definition Config.h:353
#define INT16_MAX
Definition Config.h:317
#define INT16_MIN
Definition Config.h:312
#define __DCL_TRACE2_N(fmt, arg1, arg2)
#define __SET_ERROR_MSG(_message)
const wchar_t * __dataTypeName(const ifx_sqlvar_t *_sqlvar)
Definition IFXField.cpp:290
#define __DCL_ASSERT(expr)
Definition Object.h:371
#define IMPLEMENT_CLASSINFO(class_name, base_class_name)
Definition Object.h:228
#define __T(str)
Definition Object.h:44
const wchar_t * __dataTypeName(const sqlvar_t *_sqlvar)
Definition PgField.cpp:183
void __encode(const SQL::Date *_s, date *_r)
Definition PgTypes.cpp:37
#define __SET_ERROR(_errorCode)
Definition SQLCore.cpp:153
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:398
virtual ~PgParam()
Definition PgParam.cpp:53
virtual const wchar_t * serverDataTypeName() const
Definition PgParam.cpp:106
bool onAfterExecute()
Definition PgParam.cpp:91
virtual bool __setData(_CONST void *_pv, size_t _size, SQL::DataType _dataType, SQL::DataType _assignType)
Definition PgParam.cpp:120
bool init(SQL::Query *_query, sqlvar_t *_sqlvar)
Definition PgParam.cpp:57
virtual void setNull()
Definition PgParam.cpp:111
DataType __dataType
Definition SQLCore.h:186
DataType
Definition SQLCore.h:62
@ typeBinary
Definition SQLCore.h:77
@ typeNumeric
Definition SQLCore.h:67
@ typeTime
Definition SQLCore.h:69
@ typeLongBinary
Definition SQLCore.h:79
@ typeUInteger
Definition SQLCore.h:65
@ typeUnknown
Definition SQLCore.h:63
@ typeTimeStamp
Definition SQLCore.h:71
@ typeInputStream
Definition SQLCore.h:84
@ typeInterval
Definition SQLCore.h:73
@ typeDate
Definition SQLCore.h:68
@ typeText
Definition SQLCore.h:76
@ typeFloat
Definition SQLCore.h:66
@ typeInteger
Definition SQLCore.h:64
@ typeLongText
Definition SQLCore.h:78
@ eInvalidData
Definition SQLCore.h:55
@ eNotSupportDataType
Definition SQLCore.h:48
@ eInvalidDataSize
Definition SQLCore.h:57
int16_t tzoff
Definition SQLCore.h:120