1913584 update fails when using NULL values
[csql.git] / src / sql / UpdStatement.cxx
blob939c9f5e1aea1fcd6dbfe7110cba7e0afbe4710a
1 /***************************************************************************
2 * Copyright (C) 2007 by Prabakaran Thirumalai *
3 * praba_tuty@yahoo.com *
4 * *
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. *
9 * *
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. *
14 * *
15 ***************************************************************************/
16 #include "Statement.h"
17 #include <Info.h>
19 UpdStatement::UpdStatement()
21 parsedData = NULL;
22 dbMgr = NULL;
23 table = NULL;
24 params = NULL;
25 paramValues = NULL;
26 totalParams = 0;
27 totalAssignParams =0;
30 UpdStatement::~UpdStatement() {
31 if (totalParams) {
32 //TODO::below free cause memory corruption.
33 //free(params);
34 params = NULL;
35 //free(paramValues);
36 //paramValues = NULL;
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");
45 return ErrSysFatal;
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;
54 } else {
55 cValue = (ConditionValue*) params[paramPos-1];
56 info->type = cValue->type;
57 info->length = cValue->length;
59 return OK;
62 DbRetVal UpdStatement::execute(int &rowsAffected)
64 DbRetVal rv = OK;
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)
75 continue;
76 //printError(ErrBadCall, "param values not set");
77 //return ErrBadCall;
79 AllDataType::copyVal(uValue->value, paramValues[i], uValue->type, uValue->length);
80 } else {
81 cValue = (ConditionValue*) params[i];
82 if (paramValues[i] == NULL)
84 continue;
85 //printError(ErrBadCall, "param values not set");
86 //return ErrBadCall;
88 AllDataType::copyVal(cValue->value, paramValues[i], cValue->type, cValue->length);
91 rv = table->execute();
92 if (rv != OK) return rv;
93 rowsAffected = 0;
94 void *tuple;
95 while(true)
97 tuple = (char*)table->fetchNoBind(rv);
98 if (rv != OK) break;
99 if (tuple == NULL) {break;}
100 rv = table->updateTuple();
101 if (rv != OK) break;
102 rowsAffected++;
104 table->close();
105 return rv;
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;
114 return OK;
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");
123 return ErrSysFatal;
126 ConditionValue *cValue;
127 UpdateFieldValue *uValue;
128 if (paramNo <= totalAssignParams) {
129 uValue = (UpdateFieldValue*) params[paramNo-1];
130 *(short*)uValue->value = value;
131 } else {
132 cValue = (ConditionValue*) params[paramNo-1];
133 *(short*)cValue->value = value;
135 return OK;
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");
145 return ErrSysFatal;
147 ConditionValue *cValue;
148 UpdateFieldValue *uValue;
149 if (paramNo <= totalAssignParams) {
150 uValue = (UpdateFieldValue*) params[paramNo-1];
151 *(int*)uValue->value = value;
152 } else {
153 cValue = (ConditionValue*) params[paramNo-1];
154 *(int*)cValue->value = value;
156 return OK;
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");
165 return ErrSysFatal;
168 ConditionValue *cValue;
169 UpdateFieldValue *uValue;
170 if (paramNo <= totalAssignParams) {
171 uValue = (UpdateFieldValue*) params[paramNo-1];
172 *(long*)uValue->value = value;
173 } else {
174 cValue = (ConditionValue*) params[paramNo-1];
175 *(long*)cValue->value = value;
177 return OK;
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");
186 return ErrSysFatal;
189 ConditionValue *cValue;
190 UpdateFieldValue *uValue;
191 if (paramNo <= totalAssignParams) {
192 uValue = (UpdateFieldValue*) params[paramNo-1];
193 *(long long*)uValue->value = value;
194 } else {
195 cValue = (ConditionValue*) params[paramNo-1];
196 *(long long*)cValue->value = value;
198 return OK;
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");
207 return ErrSysFatal;
210 ConditionValue *cValue;
211 UpdateFieldValue *uValue;
212 if (paramNo <= totalAssignParams) {
213 uValue = (UpdateFieldValue*) params[paramNo-1];
214 *(ByteInt*)uValue->value = value;
215 } else {
216 cValue = (ConditionValue*) params[paramNo-1];
217 *(ByteInt*)cValue->value = value;
219 return OK;
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");
228 return ErrSysFatal;
231 ConditionValue *cValue;
232 UpdateFieldValue *uValue;
233 if (paramNo <= totalAssignParams) {
234 uValue = (UpdateFieldValue*) params[paramNo-1];
235 *(float*)uValue->value = value;
236 } else {
237 cValue = (ConditionValue*) params[paramNo-1];
238 *(float*)cValue->value = value;
240 return OK;
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");
250 return ErrSysFatal;
253 ConditionValue *cValue;
254 UpdateFieldValue *uValue;
255 if (paramNo <= totalAssignParams) {
256 uValue = (UpdateFieldValue*) params[paramNo-1];
257 *(double*)uValue->value = value;
258 } else {
259 cValue = (ConditionValue*) params[paramNo-1];
260 *(double*)cValue->value = value;
262 return OK;
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");
271 return ErrSysFatal;
274 ConditionValue *cValue;
275 UpdateFieldValue *uValue;
276 if (paramNo <= totalAssignParams) {
277 uValue = (UpdateFieldValue*) params[paramNo-1];
278 strcpy((char*)uValue->value, value);
279 } else {
280 cValue = (ConditionValue*) params[paramNo-1];
281 strcpy((char*)cValue->value, value);
283 return OK;
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");
293 return ErrSysFatal;
296 ConditionValue *cValue;
297 UpdateFieldValue *uValue;
298 if (paramNo <= totalAssignParams) {
299 uValue = (UpdateFieldValue*) params[paramNo-1];
300 *(Date*)uValue->value = value;
301 } else {
302 cValue = (ConditionValue*) params[paramNo-1];
303 *(Date*)cValue->value = value;
305 return OK;
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");
314 return ErrSysFatal;
317 ConditionValue *cValue;
318 UpdateFieldValue *uValue;
319 if (paramNo <= totalAssignParams) {
320 uValue = (UpdateFieldValue*) params[paramNo-1];
321 *(Time*)uValue->value = value;
322 } else {
323 cValue = (ConditionValue*) params[paramNo-1];
324 *(Time*)cValue->value = value;
326 return OK;
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");
336 return ErrSysFatal;
339 ConditionValue *cValue;
340 UpdateFieldValue *uValue;
341 if (paramNo <= totalAssignParams) {
342 uValue = (UpdateFieldValue*) params[paramNo-1];
343 *(TimeStamp*)uValue->value = value;
344 } else {
345 cValue = (ConditionValue*) params[paramNo-1];
346 *(TimeStamp*)cValue->value = value;
348 return OK;
351 DbRetVal UpdStatement::resolve()
353 if (dbMgr == NULL) return ErrNoConnection;
354 //check whether the table exists
355 table = dbMgr->openTable(parsedData->getTableName());
356 if (table == NULL)
358 printError(ErrNotExists, "Unable to open the table:Table not exists");
359 return ErrNotExists;
362 table->setCondition(parsedData->getCondition());
364 DbRetVal rv = resolveForAssignment();
365 if (rv != OK)
367 //TODO::free memory allocated for params
368 table->setCondition(NULL);
369 dbMgr->closeTable(table);
370 table = NULL;
372 return rv;
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();
382 int paramPos =1;
383 DbRetVal rv = OK;
384 while (iter.hasElement())
386 value = (UpdateFieldValue*) iter.nextElement();
387 if (NULL == value)
389 delete fInfo;
390 printError(ErrSysFatal, "Should never happen.");
391 return ErrSysFatal;
393 rv = table->getFieldInfo(value->fldName, fInfo);
394 if (ErrNotFound == rv)
396 delete fInfo;
397 printError(ErrSyntaxError, "Field %s does not exist in table",
398 value->fldName);
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);
409 continue;
411 if (value->parsedString[0] == '?')
413 value->paramNo = paramPos++;
415 if (!value->paramNo)
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();
427 if (NULL == cValue)
429 delete fInfo;
430 printError(ErrSysFatal, "Should never happen.");
431 return ErrSysFatal;
433 rv = table->getFieldInfo(cValue->fName, fInfo);
434 if (ErrNotFound == rv)
436 delete fInfo;
437 printError(ErrSyntaxError, "Field %s does not exist in table",
438 cValue->fName);
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)
446 delete fInfo;
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);
460 delete fInfo;
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*));
469 iter.reset();
470 while(iter.hasElement())
472 value = (UpdateFieldValue*) iter.nextElement();
473 if (value == NULL)
475 free(params); params = NULL;
476 free(paramValues); paramValues = NULL;
477 printError(ErrSysFatal, "Should never happen. value NULL after iteration");
478 return ErrSysFatal;
480 if (0 == value->paramNo) continue;
481 params[value->paramNo -1 ] = value;
484 cIter.reset();
485 while(cIter.hasElement())
487 cValue = (ConditionValue*) cIter.nextElement();
488 if (cValue == NULL)
490 free(params); params = NULL;
491 free(paramValues); paramValues = NULL;
492 printError(ErrSysFatal, "Should never happen. value NULL after iteration");
493 return ErrSysFatal;
495 if (0 == value->paramNo) continue;
496 params[cValue->paramNo -1 ] = cValue;
498 return OK;