1 /***************************************************************************
2 * Copyright (C) 2007 by Prabakaran Thirumalai *
3 * praba_tuty@yahoo.com *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 ***************************************************************************/
16 #include "Statement.h"
19 UpdStatement::UpdStatement()
30 UpdStatement::~UpdStatement() {
32 //TODO::below free cause memory corruption.
38 table
->setCondition(NULL
);
39 if (dbMgr
) dbMgr
->closeTable(table
);
43 void* UpdStatement::getParamValuePtr( int pos
)
45 ConditionValue
*cValue
;
46 UpdateFieldValue
*uValue
;
47 if (pos
<= totalAssignParams
) {
48 uValue
= (UpdateFieldValue
*) params
[pos
-1];
49 return( (void*) uValue
->value
);
51 cValue
= (ConditionValue
*) params
[pos
-1];
52 return( (void*) cValue
->value
);
56 DbRetVal
UpdStatement::getParamFldInfo(int paramPos
, FieldInfo
*&info
)
58 if (paramPos
<=0 || paramPos
> totalParams
) return ErrBadArg
;
59 if (NULL
== params
[paramPos
-1])
61 printError(ErrSysFatal
, "param not set. Should never happen");
65 ConditionValue
*cValue
;
66 UpdateFieldValue
*uValue
;
67 if (paramPos
<= totalAssignParams
) {
68 uValue
= (UpdateFieldValue
*) params
[paramPos
-1];
69 info
->type
= uValue
->type
;
70 info
->length
= uValue
->length
;
72 cValue
= (ConditionValue
*) params
[paramPos
-1];
73 info
->type
= cValue
->type
;
74 info
->length
= cValue
->length
;
79 DbRetVal
UpdStatement::execute(int &rowsAffected
)
82 //copy param values to binded buffer
83 ConditionValue
*cValue
;
84 UpdateFieldValue
*uValue
;
86 for (int i
= 0; i
< totalParams
; i
++)
88 if (i
< totalAssignParams
) {
89 uValue
= (UpdateFieldValue
*) params
[i
];
90 if (paramValues
[i
] == NULL
)
93 //printError(ErrBadCall, "param values not set");
96 AllDataType::copyVal(uValue
->value
, paramValues
[i
], uValue
->type
, uValue
->length
);
98 cValue
= (ConditionValue
*) params
[i
];
99 if (paramValues
[i
] == NULL
)
102 //printError(ErrBadCall, "param values not set");
105 AllDataType::copyVal(cValue
->value
, paramValues
[i
], cValue
->type
, cValue
->length
);
108 rv
= table
->execute();
109 if (rv
!= OK
) return rv
;
114 tuple
= (char*)table
->fetchNoBind(rv
);
116 if (tuple
== NULL
) {break;}
117 rv
= table
->updateTuple();
126 DbRetVal
UpdStatement::setParam(int paramNo
, void *value
)
128 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
129 if (NULL
== value
) return ErrBadArg
;
130 paramValues
[paramNo
-1] = (char*) value
;
134 DbRetVal
UpdStatement::setShortParam(int paramNo
, short value
)
136 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
137 if (NULL
== params
[paramNo
-1])
139 printError(ErrSysFatal
, "param not set. Should never happen");
143 ConditionValue
*cValue
;
144 UpdateFieldValue
*uValue
;
145 if (paramNo
<= totalAssignParams
) {
146 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
147 *(short*)uValue
->value
= value
;
149 cValue
= (ConditionValue
*) params
[paramNo
-1];
150 *(short*)cValue
->value
= value
;
156 DbRetVal
UpdStatement::setIntParam(int paramNo
, int value
)
158 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
159 if (NULL
== params
[paramNo
-1])
161 printError(ErrSysFatal
, "param not set. Should never happen");
164 ConditionValue
*cValue
;
165 UpdateFieldValue
*uValue
;
166 if (paramNo
<= totalAssignParams
) {
167 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
168 *(int*)uValue
->value
= value
;
170 cValue
= (ConditionValue
*) params
[paramNo
-1];
171 *(int*)cValue
->value
= value
;
176 DbRetVal
UpdStatement::setLongParam(int paramNo
, long value
)
178 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
179 if (NULL
== params
[paramNo
-1])
181 printError(ErrSysFatal
, "param not set. Should never happen");
185 ConditionValue
*cValue
;
186 UpdateFieldValue
*uValue
;
187 if (paramNo
<= totalAssignParams
) {
188 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
189 *(long*)uValue
->value
= value
;
191 cValue
= (ConditionValue
*) params
[paramNo
-1];
192 *(long*)cValue
->value
= value
;
197 DbRetVal
UpdStatement::setLongLongParam(int paramNo
, long long value
)
199 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
200 if (NULL
== params
[paramNo
-1])
202 printError(ErrSysFatal
, "param not set. Should never happen");
206 ConditionValue
*cValue
;
207 UpdateFieldValue
*uValue
;
208 if (paramNo
<= totalAssignParams
) {
209 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
210 *(long long*)uValue
->value
= value
;
212 cValue
= (ConditionValue
*) params
[paramNo
-1];
213 *(long long*)cValue
->value
= value
;
218 DbRetVal
UpdStatement::setByteIntParam(int paramNo
, ByteInt value
)
220 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
221 if (NULL
== params
[paramNo
-1])
223 printError(ErrSysFatal
, "param not set. Should never happen");
227 ConditionValue
*cValue
;
228 UpdateFieldValue
*uValue
;
229 if (paramNo
<= totalAssignParams
) {
230 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
231 *(ByteInt
*)uValue
->value
= value
;
233 cValue
= (ConditionValue
*) params
[paramNo
-1];
234 *(ByteInt
*)cValue
->value
= value
;
239 DbRetVal
UpdStatement::setFloatParam(int paramNo
, float value
)
241 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
242 if (NULL
== params
[paramNo
-1])
244 printError(ErrSysFatal
, "param not set. Should never happen");
248 ConditionValue
*cValue
;
249 UpdateFieldValue
*uValue
;
250 if (paramNo
<= totalAssignParams
) {
251 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
252 *(float*)uValue
->value
= value
;
254 cValue
= (ConditionValue
*) params
[paramNo
-1];
255 *(float*)cValue
->value
= value
;
261 DbRetVal
UpdStatement::setDoubleParam(int paramNo
, double value
)
263 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
264 if (NULL
== params
[paramNo
-1])
266 printError(ErrSysFatal
, "param not set. Should never happen");
270 ConditionValue
*cValue
;
271 UpdateFieldValue
*uValue
;
272 if (paramNo
<= totalAssignParams
) {
273 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
274 *(double*)uValue
->value
= value
;
276 cValue
= (ConditionValue
*) params
[paramNo
-1];
277 *(double*)cValue
->value
= value
;
282 DbRetVal
UpdStatement::setStringParam(int paramNo
, char *value
)
284 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
285 if (NULL
== params
[paramNo
-1])
287 printError(ErrSysFatal
, "param not set. Should never happen");
291 ConditionValue
*cValue
;
292 UpdateFieldValue
*uValue
;
293 if (paramNo
<= totalAssignParams
) {
294 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
295 strcpy((char*)uValue
->value
, value
);
297 cValue
= (ConditionValue
*) params
[paramNo
-1];
298 strcpy((char*)cValue
->value
, value
);
304 DbRetVal
UpdStatement::setDateParam(int paramNo
, Date value
)
306 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
307 if (NULL
== params
[paramNo
-1])
309 printError(ErrSysFatal
, "param not set. Should never happen");
313 ConditionValue
*cValue
;
314 UpdateFieldValue
*uValue
;
315 if (paramNo
<= totalAssignParams
) {
316 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
317 *(Date
*)uValue
->value
= value
;
319 cValue
= (ConditionValue
*) params
[paramNo
-1];
320 *(Date
*)cValue
->value
= value
;
325 DbRetVal
UpdStatement::setTimeParam(int paramNo
, Time value
)
327 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
328 if (NULL
== params
[paramNo
-1])
330 printError(ErrSysFatal
, "param not set. Should never happen");
334 ConditionValue
*cValue
;
335 UpdateFieldValue
*uValue
;
336 if (paramNo
<= totalAssignParams
) {
337 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
338 *(Time
*)uValue
->value
= value
;
340 cValue
= (ConditionValue
*) params
[paramNo
-1];
341 *(Time
*)cValue
->value
= value
;
347 DbRetVal
UpdStatement::setTimeStampParam(int paramNo
, TimeStamp value
)
349 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
350 if (NULL
== params
[paramNo
-1])
352 printError(ErrSysFatal
, "param not set. Should never happen");
356 ConditionValue
*cValue
;
357 UpdateFieldValue
*uValue
;
358 if (paramNo
<= totalAssignParams
) {
359 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
360 *(TimeStamp
*)uValue
->value
= value
;
362 cValue
= (ConditionValue
*) params
[paramNo
-1];
363 *(TimeStamp
*)cValue
->value
= value
;
368 DbRetVal
UpdStatement::resolve()
370 if (dbMgr
== NULL
) return ErrNoConnection
;
371 //check whether the table exists
372 table
= dbMgr
->openTable(parsedData
->getTableName());
375 printError(ErrNotExists
, "Unable to open the table:Table not exists");
379 table
->setCondition(parsedData
->getCondition());
381 DbRetVal rv
= resolveForAssignment();
384 //TODO::free memory allocated for params
385 table
->setCondition(NULL
);
386 dbMgr
->closeTable(table
);
392 DbRetVal
UpdStatement::resolveForAssignment()
394 //get the fieldname list and validate field names
395 ListIterator iter
= parsedData
->getUpdateFieldValueList().getIterator();
397 UpdateFieldValue
*value
;
398 FieldInfo
*fInfo
= new FieldInfo();
401 while (iter
.hasElement())
403 value
= (UpdateFieldValue
*) iter
.nextElement();
407 printError(ErrSysFatal
, "Should never happen.");
410 rv
= table
->getFieldInfo(value
->fldName
, fInfo
);
411 if (ErrNotFound
== rv
)
414 printError(ErrSyntaxError
, "Field %s does not exist in table",
416 return ErrSyntaxError
;
418 value
->type
= fInfo
->type
;
419 value
->length
= fInfo
->length
;
420 value
->value
= AllDataType::alloc(fInfo
->type
, fInfo
->length
);
421 table
->bindFld(value
->fldName
, value
->value
);
422 if (value
->parsedString
== NULL
)
424 if (fInfo
->isNull
) { delete fInfo
; return ErrNullViolation
; }
425 table
->markFldNull(value
->fldName
);
428 if (value
->parsedString
[0] == '?')
430 value
->paramNo
= paramPos
++;
433 AllDataType::strToValue(value
->value
, value
->parsedString
, fInfo
->type
, value
->length
);
435 totalAssignParams
= paramPos
-1;
438 //get the fieldname list and validate field names
439 ListIterator cIter
= parsedData
->getConditionValueList().getIterator();
440 ConditionValue
*cValue
= NULL
;
441 while (cIter
.hasElement())
443 cValue
= (ConditionValue
*) cIter
.nextElement();
447 printError(ErrSysFatal
, "Should never happen.");
450 rv
= table
->getFieldInfo(cValue
->fName
, fInfo
);
451 if (ErrNotFound
== rv
)
454 printError(ErrSyntaxError
, "Field %s does not exist in table",
456 return ErrSyntaxError
;
458 cValue
->type
= fInfo
->type
;
459 cValue
->length
= fInfo
->length
;
460 cValue
->value
= AllDataType::alloc(fInfo
->type
, fInfo
->length
);
461 if (cValue
->parsedString
== NULL
)
464 printError(ErrSyntaxError
, "Condition value should not be NULL");
465 return ErrSyntaxError
;
468 if (cValue
->parsedString
[0] == '?')
470 cValue
->paramNo
= paramPos
++;
472 if (!cValue
->paramNo
)
473 AllDataType::strToValue(cValue
->value
, cValue
->parsedString
, fInfo
->type
);
478 totalParams
= paramPos
-1;
479 if (0 == totalParams
) return OK
;
480 params
= (void**) malloc ( totalParams
* sizeof(FieldValue
*));
481 paramValues
= (char**) malloc( totalParams
* sizeof(char*));
483 memset(params
, 0, totalParams
* sizeof(FieldValue
*));
484 memset(paramValues
, 0, totalParams
* sizeof(char*));
487 while(iter
.hasElement())
489 value
= (UpdateFieldValue
*) iter
.nextElement();
492 free(params
); params
= NULL
;
493 free(paramValues
); paramValues
= NULL
;
494 printError(ErrSysFatal
, "Should never happen. value NULL after iteration");
497 if (0 == value
->paramNo
) continue;
498 params
[value
->paramNo
-1 ] = value
;
502 while(cIter
.hasElement())
504 cValue
= (ConditionValue
*) cIter
.nextElement();
507 free(params
); params
= NULL
;
508 free(paramValues
); paramValues
= NULL
;
509 printError(ErrSysFatal
, "Should never happen. value NULL after iteration");
512 if (0 == cValue
->paramNo
) continue;
513 params
[cValue
->paramNo
-1 ] = cValue
;