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"
18 DelStatement::DelStatement()
28 DelStatement::~DelStatement() {
30 table
->setCondition(NULL
);
31 if (dbMgr
) dbMgr
->closeTable(table
);
42 DbRetVal
DelStatement::getParamFldInfo(int paramPos
, FieldInfo
*&info
)
44 if (paramPos
<=0 || paramPos
> totalParams
) return ErrBadArg
;
45 ConditionValue
*value
= (ConditionValue
*) params
[paramPos
-1];
46 if (value
== NULL
) { printError(ErrBadArg
, "Should never happen\n");
48 table
->getFieldNameAlone(value
->fName
,info
->fldName
);
49 info
->type
= value
->type
;
50 info
->length
= value
->length
;
51 info
->isNull
= value
->isNullable
;
54 DbRetVal
DelStatement::execute(int &rowsAffected
)
57 //copy param values to binded buffer
58 ConditionValue
*value
;
59 for (int i
= 0; i
< totalParams
; i
++)
61 value
= (ConditionValue
*) params
[i
];
62 if (paramValues
[i
] == NULL
)
65 //printError(ErrBadCall, "param values not set");
68 AllDataType::copyVal(value
->value
, paramValues
[i
], value
->type
, value
->length
);
70 rv
= table
->execute();
71 if (rv
!= OK
) return rv
;
76 tuple
= (char*)table
->fetchNoBind(rv
);
78 if (tuple
== NULL
) {break;}
79 rv
= table
->deleteTuple();
88 DbRetVal
DelStatement::setParam(int paramNo
, void *value
)
90 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
91 if (NULL
== value
) return ErrBadArg
;
92 paramValues
[paramNo
-1] = (char*) value
;
96 DbRetVal
DelStatement::setShortParam(int paramNo
, short value
)
98 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
99 ConditionValue
*cValue
= (ConditionValue
*) params
[paramNo
-1];
102 printError(ErrSysFatal
, "condition value is null. Should never happen");
105 *(short*)cValue
->value
= value
;
109 DbRetVal
DelStatement::setIntParam(int paramNo
, int value
)
111 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
112 ConditionValue
*cValue
= (ConditionValue
*) params
[paramNo
-1];
115 printError(ErrSysFatal
, "condition value is null. Should never happen");
118 *(int*)cValue
->value
= value
;
121 DbRetVal
DelStatement::setLongParam(int paramNo
, long value
)
123 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
124 ConditionValue
*cValue
= (ConditionValue
*) params
[paramNo
-1];
127 printError(ErrSysFatal
, "condition value is null. Should never happen");
130 *(long*)cValue
->value
= value
;
134 DbRetVal
DelStatement::setLongLongParam(int paramNo
, long long value
)
136 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
137 ConditionValue
*cValue
= (ConditionValue
*) params
[paramNo
-1];
140 printError(ErrSysFatal
, "condition value is null. Should never happen");
143 *(long long*)cValue
->value
= value
;
146 DbRetVal
DelStatement::setByteIntParam(int paramNo
, ByteInt value
)
148 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
149 ConditionValue
*cValue
= (ConditionValue
*) params
[paramNo
-1];
152 printError(ErrSysFatal
, "condition value is null. Should never happen");
155 *(ByteInt
*)cValue
->value
= value
;
158 DbRetVal
DelStatement::setFloatParam(int paramNo
, float value
)
160 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
161 ConditionValue
*cValue
= (ConditionValue
*) params
[paramNo
-1];
164 printError(ErrSysFatal
, "condition value is null. Should never happen");
167 *(float*)cValue
->value
= value
;
170 DbRetVal
DelStatement::setDoubleParam(int paramNo
, double value
)
172 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
173 ConditionValue
*cValue
= (ConditionValue
*) params
[paramNo
-1];
176 printError(ErrSysFatal
, "condition value is null. Should never happen");
179 *(double*)cValue
->value
= value
;
182 DbRetVal
DelStatement::setStringParam(int paramNo
, char *value
)
184 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
185 ConditionValue
*cValue
= (ConditionValue
*) params
[paramNo
-1];
188 printError(ErrSysFatal
, "condition value is null. Should never happen");
191 strcpy((char*)cValue
->value
, value
);
194 DbRetVal
DelStatement::setDateParam(int paramNo
, Date value
)
196 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
197 ConditionValue
*cValue
= (ConditionValue
*) params
[paramNo
-1];
200 printError(ErrSysFatal
, "condition value is null. Should never happen");
203 *(Date
*)cValue
->value
= value
;
206 DbRetVal
DelStatement::setTimeParam(int paramNo
, Time value
)
208 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
209 ConditionValue
*cValue
= (ConditionValue
*) params
[paramNo
-1];
212 printError(ErrSysFatal
, "condition value is null. Should never happen");
215 *(Time
*)cValue
->value
= value
;
218 void* DelStatement::getParamValuePtr( int pos
)
220 ConditionValue
*cValue
= (ConditionValue
*) params
[pos
-1];
221 return ( (void*) cValue
->value
);
224 DbRetVal
DelStatement::setTimeStampParam(int paramNo
, TimeStamp value
)
226 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
227 ConditionValue
*cValue
= (ConditionValue
*) params
[paramNo
-1];
230 printError(ErrSysFatal
, "condition value is null. Should never happen");
233 *(TimeStamp
*)cValue
->value
= value
;
237 DbRetVal
DelStatement::setBinaryParam(int paramNo
, void *value
)
239 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
240 ConditionValue
*cValue
= (ConditionValue
*) params
[paramNo
-1];
243 printError(ErrSysFatal
, "condition value is null. Should never happen");
246 AllDataType::convertToBinary(cValue
->value
,value
,typeString
,cValue
->length
);
250 DbRetVal
DelStatement::resolve()
252 if (dbMgr
== NULL
) return ErrNoConnection
;
253 //check whether the table exists
254 table
= dbMgr
->openTable(parsedData
->getTableName());
257 printError(ErrNotExists
, "Unable to open the table:Table not exists");
261 table
->setCondition(parsedData
->getCondition());
263 DbRetVal rv
= resolveForCondition();
266 //TODO::free memory allocated for params
267 table
->setCondition(NULL
);
268 dbMgr
->closeTable(table
);
275 DbRetVal
DelStatement::resolveForCondition()
277 //get the fieldname list and validate field names
278 ListIterator iter
= parsedData
->getConditionValueList().getIterator();
280 ConditionValue
*value
;
281 FieldInfo
*fInfo
= new FieldInfo();
284 while (iter
.hasElement())
286 value
= (ConditionValue
*) iter
.nextElement();
290 printError(ErrSysFatal
, "Should never happen.");
293 rv
= table
->getFieldInfo(value
->fName
, fInfo
);
294 if (ErrNotFound
== rv
)
297 printError(ErrSyntaxError
, "Field %s does not exist in table",
299 return ErrSyntaxError
;
301 value
->type
= fInfo
->type
;
302 value
->length
= fInfo
->length
;
303 value
->isNullable
= fInfo
->isNull
;
304 // for binary datatype input buffer size should be 2 times the length
305 value
->value
= AllDataType::alloc(fInfo
->type
, fInfo
->length
);
306 if (value
->parsedString
== NULL
)
309 printError(ErrSyntaxError
, "Condition value should not be NULL");
310 return ErrSyntaxError
;
313 if (value
->parsedString
[0] == '?')
315 if (! value
->opLike
) // checks if 'LIKE' operator is used
316 value
->paramNo
= paramPos
++;
318 if (!value
->paramNo
) {
319 // Here for binary dataType it is not strcpy'd bcos internally memcmp is done for predicates like f2 = 'abcd' where f2 is binary
320 AllDataType::strToValue(value
->value
, value
->parsedString
, fInfo
->type
, fInfo
->length
);
324 totalParams
= paramPos
-1;
325 if (0 == totalParams
) return OK
;
326 params
= (void**) malloc ( totalParams
* sizeof(FieldValue
*));
327 paramValues
= (char**) malloc( totalParams
* sizeof(char*));
328 memset(params
, 0, totalParams
* sizeof(FieldValue
*));
329 memset(paramValues
, 0, totalParams
* sizeof(char*));
331 while(iter
.hasElement())
333 value
= (ConditionValue
*) iter
.nextElement();
336 free(params
); params
= NULL
;
337 free(paramValues
); paramValues
= NULL
;
338 printError(ErrSysFatal
, "Should never happen. value NULL after iteration");
341 params
[value
->paramNo
-1 ] = value
;
346 int DelStatement::getFldPos(char *name
)
348 return table
->getFldPos(name
);