1738556 Primitive ODBC Driver
[csql.git] / src / sql / UpdStatement.cxx
blob34dff4e66c24b16581de49a154674caf0acc4cc9
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;
37 if (table) {
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 );
50 } else {
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");
62 return ErrSysFatal;
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;
71 } else {
72 cValue = (ConditionValue*) params[paramPos-1];
73 info->type = cValue->type;
74 info->length = cValue->length;
76 return OK;
79 DbRetVal UpdStatement::execute(int &rowsAffected)
81 DbRetVal rv = OK;
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)
92 continue;
93 //printError(ErrBadCall, "param values not set");
94 //return ErrBadCall;
96 AllDataType::copyVal(uValue->value, paramValues[i], uValue->type, uValue->length);
97 } else {
98 cValue = (ConditionValue*) params[i];
99 if (paramValues[i] == NULL)
101 continue;
102 //printError(ErrBadCall, "param values not set");
103 //return ErrBadCall;
105 AllDataType::copyVal(cValue->value, paramValues[i], cValue->type, cValue->length);
108 rv = table->execute();
109 if (rv != OK) return rv;
110 rowsAffected = 0;
111 void *tuple;
112 while(true)
114 tuple = (char*)table->fetchNoBind(rv);
115 if (rv != OK) break;
116 if (tuple == NULL) {break;}
117 rv = table->updateTuple();
118 if (rv != OK) break;
119 rowsAffected++;
121 table->close();
122 return rv;
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;
131 return OK;
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");
140 return ErrSysFatal;
143 ConditionValue *cValue;
144 UpdateFieldValue *uValue;
145 if (paramNo <= totalAssignParams) {
146 uValue = (UpdateFieldValue*) params[paramNo-1];
147 *(short*)uValue->value = value;
148 } else {
149 cValue = (ConditionValue*) params[paramNo-1];
150 *(short*)cValue->value = value;
152 return OK;
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");
162 return ErrSysFatal;
164 ConditionValue *cValue;
165 UpdateFieldValue *uValue;
166 if (paramNo <= totalAssignParams) {
167 uValue = (UpdateFieldValue*) params[paramNo-1];
168 *(int*)uValue->value = value;
169 } else {
170 cValue = (ConditionValue*) params[paramNo-1];
171 *(int*)cValue->value = value;
173 return OK;
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");
182 return ErrSysFatal;
185 ConditionValue *cValue;
186 UpdateFieldValue *uValue;
187 if (paramNo <= totalAssignParams) {
188 uValue = (UpdateFieldValue*) params[paramNo-1];
189 *(long*)uValue->value = value;
190 } else {
191 cValue = (ConditionValue*) params[paramNo-1];
192 *(long*)cValue->value = value;
194 return OK;
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");
203 return ErrSysFatal;
206 ConditionValue *cValue;
207 UpdateFieldValue *uValue;
208 if (paramNo <= totalAssignParams) {
209 uValue = (UpdateFieldValue*) params[paramNo-1];
210 *(long long*)uValue->value = value;
211 } else {
212 cValue = (ConditionValue*) params[paramNo-1];
213 *(long long*)cValue->value = value;
215 return OK;
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");
224 return ErrSysFatal;
227 ConditionValue *cValue;
228 UpdateFieldValue *uValue;
229 if (paramNo <= totalAssignParams) {
230 uValue = (UpdateFieldValue*) params[paramNo-1];
231 *(ByteInt*)uValue->value = value;
232 } else {
233 cValue = (ConditionValue*) params[paramNo-1];
234 *(ByteInt*)cValue->value = value;
236 return OK;
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");
245 return ErrSysFatal;
248 ConditionValue *cValue;
249 UpdateFieldValue *uValue;
250 if (paramNo <= totalAssignParams) {
251 uValue = (UpdateFieldValue*) params[paramNo-1];
252 *(float*)uValue->value = value;
253 } else {
254 cValue = (ConditionValue*) params[paramNo-1];
255 *(float*)cValue->value = value;
257 return OK;
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");
267 return ErrSysFatal;
270 ConditionValue *cValue;
271 UpdateFieldValue *uValue;
272 if (paramNo <= totalAssignParams) {
273 uValue = (UpdateFieldValue*) params[paramNo-1];
274 *(double*)uValue->value = value;
275 } else {
276 cValue = (ConditionValue*) params[paramNo-1];
277 *(double*)cValue->value = value;
279 return OK;
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");
288 return ErrSysFatal;
291 ConditionValue *cValue;
292 UpdateFieldValue *uValue;
293 if (paramNo <= totalAssignParams) {
294 uValue = (UpdateFieldValue*) params[paramNo-1];
295 strcpy((char*)uValue->value, value);
296 } else {
297 cValue = (ConditionValue*) params[paramNo-1];
298 strcpy((char*)cValue->value, value);
300 return OK;
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");
310 return ErrSysFatal;
313 ConditionValue *cValue;
314 UpdateFieldValue *uValue;
315 if (paramNo <= totalAssignParams) {
316 uValue = (UpdateFieldValue*) params[paramNo-1];
317 *(Date*)uValue->value = value;
318 } else {
319 cValue = (ConditionValue*) params[paramNo-1];
320 *(Date*)cValue->value = value;
322 return OK;
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");
331 return ErrSysFatal;
334 ConditionValue *cValue;
335 UpdateFieldValue *uValue;
336 if (paramNo <= totalAssignParams) {
337 uValue = (UpdateFieldValue*) params[paramNo-1];
338 *(Time*)uValue->value = value;
339 } else {
340 cValue = (ConditionValue*) params[paramNo-1];
341 *(Time*)cValue->value = value;
343 return OK;
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");
353 return ErrSysFatal;
356 ConditionValue *cValue;
357 UpdateFieldValue *uValue;
358 if (paramNo <= totalAssignParams) {
359 uValue = (UpdateFieldValue*) params[paramNo-1];
360 *(TimeStamp*)uValue->value = value;
361 } else {
362 cValue = (ConditionValue*) params[paramNo-1];
363 *(TimeStamp*)cValue->value = value;
365 return OK;
368 DbRetVal UpdStatement::resolve()
370 if (dbMgr == NULL) return ErrNoConnection;
371 //check whether the table exists
372 table = dbMgr->openTable(parsedData->getTableName());
373 if (table == NULL)
375 printError(ErrNotExists, "Unable to open the table:Table not exists");
376 return ErrNotExists;
379 table->setCondition(parsedData->getCondition());
381 DbRetVal rv = resolveForAssignment();
382 if (rv != OK)
384 //TODO::free memory allocated for params
385 table->setCondition(NULL);
386 dbMgr->closeTable(table);
387 table = NULL;
389 return rv;
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();
399 int paramPos =1;
400 DbRetVal rv = OK;
401 while (iter.hasElement())
403 value = (UpdateFieldValue*) iter.nextElement();
404 if (NULL == value)
406 delete fInfo;
407 printError(ErrSysFatal, "Should never happen.");
408 return ErrSysFatal;
410 rv = table->getFieldInfo(value->fldName, fInfo);
411 if (ErrNotFound == rv)
413 delete fInfo;
414 printError(ErrSyntaxError, "Field %s does not exist in table",
415 value->fldName);
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);
426 continue;
428 if (value->parsedString[0] == '?')
430 value->paramNo = paramPos++;
432 if (!value->paramNo)
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();
444 if (NULL == cValue)
446 delete fInfo;
447 printError(ErrSysFatal, "Should never happen.");
448 return ErrSysFatal;
450 rv = table->getFieldInfo(cValue->fName, fInfo);
451 if (ErrNotFound == rv)
453 delete fInfo;
454 printError(ErrSyntaxError, "Field %s does not exist in table",
455 cValue->fName);
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)
463 delete fInfo;
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);
477 delete fInfo;
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*));
486 iter.reset();
487 while(iter.hasElement())
489 value = (UpdateFieldValue*) iter.nextElement();
490 if (value == NULL)
492 free(params); params = NULL;
493 free(paramValues); paramValues = NULL;
494 printError(ErrSysFatal, "Should never happen. value NULL after iteration");
495 return ErrSysFatal;
497 if (0 == value->paramNo) continue;
498 params[value->paramNo -1 ] = value;
501 cIter.reset();
502 while(cIter.hasElement())
504 cValue = (ConditionValue*) cIter.nextElement();
505 if (cValue == NULL)
507 free(params); params = NULL;
508 free(paramValues); paramValues = NULL;
509 printError(ErrSysFatal, "Should never happen. value NULL after iteration");
510 return ErrSysFatal;
512 if (0 == cValue->paramNo) continue;
513 params[cValue->paramNo -1 ] = cValue;
515 return OK;