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.
39 DbRetVal
UpdStatement::getParamFldInfo(int paramPos
, FieldInfo
*&info
)
41 if (paramPos
<=0 || paramPos
> totalParams
) return ErrBadArg
;
42 if (NULL
== params
[paramPos
-1])
44 printError(ErrSysFatal
, "param not set. Should never happen");
48 ConditionValue
*cValue
;
49 UpdateFieldValue
*uValue
;
50 if (paramPos
<= totalAssignParams
) {
51 uValue
= (UpdateFieldValue
*) params
[paramPos
-1];
52 info
->type
= uValue
->type
;
53 info
->length
= uValue
->length
;
55 cValue
= (ConditionValue
*) params
[paramPos
-1];
56 info
->type
= cValue
->type
;
57 info
->length
= cValue
->length
;
62 DbRetVal
UpdStatement::execute(int &rowsAffected
)
65 //copy param values to binded buffer
66 ConditionValue
*cValue
;
67 UpdateFieldValue
*uValue
;
69 for (int i
= 0; i
< totalParams
; i
++)
71 if (i
< totalAssignParams
) {
72 uValue
= (UpdateFieldValue
*) params
[i
];
73 if (paramValues
[i
] == NULL
)
76 //printError(ErrBadCall, "param values not set");
79 AllDataType::copyVal(uValue
->value
, paramValues
[i
], uValue
->type
, uValue
->length
);
81 cValue
= (ConditionValue
*) params
[i
];
82 if (paramValues
[i
] == NULL
)
85 //printError(ErrBadCall, "param values not set");
88 AllDataType::copyVal(cValue
->value
, paramValues
[i
], cValue
->type
, cValue
->length
);
91 rv
= table
->execute();
92 if (rv
!= OK
) return rv
;
97 tuple
= (char*)table
->fetchNoBind(rv
);
99 if (tuple
== NULL
) {break;}
100 rv
= table
->updateTuple();
109 DbRetVal
UpdStatement::setParam(int paramNo
, void *value
)
111 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
112 if (NULL
== value
) return ErrBadArg
;
113 paramValues
[paramNo
-1] = (char*) value
;
117 DbRetVal
UpdStatement::setShortParam(int paramNo
, short value
)
119 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
120 if (NULL
== params
[paramNo
-1])
122 printError(ErrSysFatal
, "param not set. Should never happen");
126 ConditionValue
*cValue
;
127 UpdateFieldValue
*uValue
;
128 if (paramNo
<= totalAssignParams
) {
129 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
130 *(short*)uValue
->value
= value
;
132 cValue
= (ConditionValue
*) params
[paramNo
-1];
133 *(short*)cValue
->value
= value
;
139 DbRetVal
UpdStatement::setIntParam(int paramNo
, int value
)
141 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
142 if (NULL
== params
[paramNo
-1])
144 printError(ErrSysFatal
, "param not set. Should never happen");
147 ConditionValue
*cValue
;
148 UpdateFieldValue
*uValue
;
149 if (paramNo
<= totalAssignParams
) {
150 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
151 *(int*)uValue
->value
= value
;
153 cValue
= (ConditionValue
*) params
[paramNo
-1];
154 *(int*)cValue
->value
= value
;
159 DbRetVal
UpdStatement::setLongParam(int paramNo
, long value
)
161 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
162 if (NULL
== params
[paramNo
-1])
164 printError(ErrSysFatal
, "param not set. Should never happen");
168 ConditionValue
*cValue
;
169 UpdateFieldValue
*uValue
;
170 if (paramNo
<= totalAssignParams
) {
171 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
172 *(long*)uValue
->value
= value
;
174 cValue
= (ConditionValue
*) params
[paramNo
-1];
175 *(long*)cValue
->value
= value
;
180 DbRetVal
UpdStatement::setLongLongParam(int paramNo
, long long value
)
182 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
183 if (NULL
== params
[paramNo
-1])
185 printError(ErrSysFatal
, "param not set. Should never happen");
189 ConditionValue
*cValue
;
190 UpdateFieldValue
*uValue
;
191 if (paramNo
<= totalAssignParams
) {
192 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
193 *(long long*)uValue
->value
= value
;
195 cValue
= (ConditionValue
*) params
[paramNo
-1];
196 *(long long*)cValue
->value
= value
;
201 DbRetVal
UpdStatement::setByteIntParam(int paramNo
, ByteInt value
)
203 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
204 if (NULL
== params
[paramNo
-1])
206 printError(ErrSysFatal
, "param not set. Should never happen");
210 ConditionValue
*cValue
;
211 UpdateFieldValue
*uValue
;
212 if (paramNo
<= totalAssignParams
) {
213 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
214 *(ByteInt
*)uValue
->value
= value
;
216 cValue
= (ConditionValue
*) params
[paramNo
-1];
217 *(ByteInt
*)cValue
->value
= value
;
222 DbRetVal
UpdStatement::setFloatParam(int paramNo
, float value
)
224 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
225 if (NULL
== params
[paramNo
-1])
227 printError(ErrSysFatal
, "param not set. Should never happen");
231 ConditionValue
*cValue
;
232 UpdateFieldValue
*uValue
;
233 if (paramNo
<= totalAssignParams
) {
234 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
235 *(float*)uValue
->value
= value
;
237 cValue
= (ConditionValue
*) params
[paramNo
-1];
238 *(float*)cValue
->value
= value
;
244 DbRetVal
UpdStatement::setDoubleParam(int paramNo
, double value
)
246 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
247 if (NULL
== params
[paramNo
-1])
249 printError(ErrSysFatal
, "param not set. Should never happen");
253 ConditionValue
*cValue
;
254 UpdateFieldValue
*uValue
;
255 if (paramNo
<= totalAssignParams
) {
256 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
257 *(double*)uValue
->value
= value
;
259 cValue
= (ConditionValue
*) params
[paramNo
-1];
260 *(double*)cValue
->value
= value
;
265 DbRetVal
UpdStatement::setStringParam(int paramNo
, char *value
)
267 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
268 if (NULL
== params
[paramNo
-1])
270 printError(ErrSysFatal
, "param not set. Should never happen");
274 ConditionValue
*cValue
;
275 UpdateFieldValue
*uValue
;
276 if (paramNo
<= totalAssignParams
) {
277 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
278 strcpy((char*)uValue
->value
, value
);
280 cValue
= (ConditionValue
*) params
[paramNo
-1];
281 strcpy((char*)cValue
->value
, value
);
287 DbRetVal
UpdStatement::setDateParam(int paramNo
, Date value
)
289 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
290 if (NULL
== params
[paramNo
-1])
292 printError(ErrSysFatal
, "param not set. Should never happen");
296 ConditionValue
*cValue
;
297 UpdateFieldValue
*uValue
;
298 if (paramNo
<= totalAssignParams
) {
299 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
300 *(Date
*)uValue
->value
= value
;
302 cValue
= (ConditionValue
*) params
[paramNo
-1];
303 *(Date
*)cValue
->value
= value
;
308 DbRetVal
UpdStatement::setTimeParam(int paramNo
, Time value
)
310 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
311 if (NULL
== params
[paramNo
-1])
313 printError(ErrSysFatal
, "param not set. Should never happen");
317 ConditionValue
*cValue
;
318 UpdateFieldValue
*uValue
;
319 if (paramNo
<= totalAssignParams
) {
320 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
321 *(Time
*)uValue
->value
= value
;
323 cValue
= (ConditionValue
*) params
[paramNo
-1];
324 *(Time
*)cValue
->value
= value
;
330 DbRetVal
UpdStatement::setTimeStampParam(int paramNo
, TimeStamp value
)
332 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
333 if (NULL
== params
[paramNo
-1])
335 printError(ErrSysFatal
, "param not set. Should never happen");
339 ConditionValue
*cValue
;
340 UpdateFieldValue
*uValue
;
341 if (paramNo
<= totalAssignParams
) {
342 uValue
= (UpdateFieldValue
*) params
[paramNo
-1];
343 *(TimeStamp
*)uValue
->value
= value
;
345 cValue
= (ConditionValue
*) params
[paramNo
-1];
346 *(TimeStamp
*)cValue
->value
= value
;
351 DbRetVal
UpdStatement::resolve()
353 if (dbMgr
== NULL
) return ErrNoConnection
;
354 //check whether the table exists
355 table
= dbMgr
->openTable(parsedData
->getTableName());
358 printError(ErrNotExists
, "Unable to open the table:Table not exists");
362 table
->setCondition(parsedData
->getCondition());
364 DbRetVal rv
= resolveForAssignment();
367 //TODO::free memory allocated for params
368 table
->setCondition(NULL
);
369 dbMgr
->closeTable(table
);
375 DbRetVal
UpdStatement::resolveForAssignment()
377 //get the fieldname list and validate field names
378 ListIterator iter
= parsedData
->getUpdateFieldValueList().getIterator();
380 UpdateFieldValue
*value
;
381 FieldInfo
*fInfo
= new FieldInfo();
384 while (iter
.hasElement())
386 value
= (UpdateFieldValue
*) iter
.nextElement();
390 printError(ErrSysFatal
, "Should never happen.");
393 rv
= table
->getFieldInfo(value
->fldName
, fInfo
);
394 if (ErrNotFound
== rv
)
397 printError(ErrSyntaxError
, "Field %s does not exist in table",
399 return ErrSyntaxError
;
401 value
->type
= fInfo
->type
;
402 value
->length
= fInfo
->length
;
403 value
->value
= AllDataType::alloc(fInfo
->type
, fInfo
->length
);
404 table
->bindFld(value
->fldName
, value
->value
);
405 if (value
->parsedString
== NULL
)
407 if (fInfo
->isNull
) { delete fInfo
; return ErrNullViolation
; }
408 table
->markFldNull(value
->fldName
);
411 if (value
->parsedString
[0] == '?')
413 value
->paramNo
= paramPos
++;
416 AllDataType::strToValue(value
->value
, value
->parsedString
, fInfo
->type
, value
->length
);
418 totalAssignParams
= paramPos
-1;
421 //get the fieldname list and validate field names
422 ListIterator cIter
= parsedData
->getConditionValueList().getIterator();
423 ConditionValue
*cValue
= NULL
;
424 while (cIter
.hasElement())
426 cValue
= (ConditionValue
*) cIter
.nextElement();
430 printError(ErrSysFatal
, "Should never happen.");
433 rv
= table
->getFieldInfo(cValue
->fName
, fInfo
);
434 if (ErrNotFound
== rv
)
437 printError(ErrSyntaxError
, "Field %s does not exist in table",
439 return ErrSyntaxError
;
441 cValue
->type
= fInfo
->type
;
442 cValue
->length
= fInfo
->length
;
443 cValue
->value
= AllDataType::alloc(fInfo
->type
, fInfo
->length
);
444 if (cValue
->parsedString
== NULL
)
447 printError(ErrSyntaxError
, "Condition value should not be NULL");
448 return ErrSyntaxError
;
451 if (cValue
->parsedString
[0] == '?')
453 cValue
->paramNo
= paramPos
++;
455 if (!cValue
->paramNo
)
456 AllDataType::strToValue(cValue
->value
, cValue
->parsedString
, fInfo
->type
);
461 totalParams
= paramPos
-1;
462 if (0 == totalParams
) return OK
;
463 params
= (void**) malloc ( totalParams
* sizeof(FieldValue
*));
464 paramValues
= (char**) malloc( totalParams
* sizeof(char*));
466 memset(params
, 0, totalParams
* sizeof(FieldValue
*));
467 memset(paramValues
, 0, totalParams
* sizeof(char*));
470 while(iter
.hasElement())
472 value
= (UpdateFieldValue
*) iter
.nextElement();
475 free(params
); params
= NULL
;
476 free(paramValues
); paramValues
= NULL
;
477 printError(ErrSysFatal
, "Should never happen. value NULL after iteration");
480 if (0 == value
->paramNo
) continue;
481 params
[value
->paramNo
-1 ] = value
;
485 while(cIter
.hasElement())
487 cValue
= (ConditionValue
*) cIter
.nextElement();
490 free(params
); params
= NULL
;
491 free(paramValues
); paramValues
= NULL
;
492 printError(ErrSysFatal
, "Should never happen. value NULL after iteration");
495 if (0 == value
->paramNo
) continue;
496 params
[cValue
->paramNo
-1 ] = cValue
;