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 ***************************************************************************/
17 #include <Statement.h>
20 InsStatement::InsStatement()
30 InsStatement::~InsStatement()
32 if (table
) { table
->close(); table
= NULL
; }
41 DbRetVal
InsStatement::getParamFldInfo(int paramPos
, FieldInfo
*&info
)
43 if (paramPos
>totalParams
) return ErrBadCall
;
44 FieldValue
*value
= (FieldValue
*)params
[paramPos
-1];
47 printError(ErrSysFatal
, "param ptr is null: should never happen\n");
50 table
->getFieldNameAlone(value
->fldName
,info
->fldName
);
51 info
->type
= value
->type
;
52 info
->length
= value
->length
;
53 info
->isNull
= value
->isNullable
;
57 DbRetVal
InsStatement::execute(int &rowsAffected
)
60 //copy param values to binded buffer
62 for (int i
= 0; i
< totalParams
; i
++)
64 value
= (FieldValue
*) params
[i
];
65 if (paramValues
[i
] == NULL
)
67 //printError(ErrBadCall, "param values not set");
71 AllDataType::copyVal(value
->value
, paramValues
[i
], value
->type
, value
->length
);
73 rv
= table
->insertTuple();
74 if (rv
==OK
) rowsAffected
= 1;
75 table
-> resetNullinfo();
79 DbRetVal
InsStatement::setParam(int paramNo
, void *value
)
81 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
82 if (NULL
== value
) return ErrBadArg
;
83 paramValues
[paramNo
-1] = (char*) value
;
87 DbRetVal
InsStatement::setShortParam(int paramNo
, short value
)
89 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
90 FieldValue
*fValue
= (FieldValue
*) params
[paramNo
-1];
93 printError(ErrSysFatal
, "field value is null. Should never happen");
96 *(short*)fValue
->value
= value
;
100 DbRetVal
InsStatement::setIntParam(int paramNo
, int value
)
102 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
103 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
106 printError(ErrSysFatal
, "condition value is null. Should never happen");
110 *(int*)cValue
->value
= value
;
113 DbRetVal
InsStatement::setNull(int paramNo
)
115 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
116 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
119 printError(ErrSysFatal
, "FieldValue is null. Should never happen");
122 char name
[IDENTIFIER_LENGTH
];
123 table
->getFieldNameAlone(cValue
->fldName
,name
);
124 table
->markFldNull(name
);
127 DbRetVal
InsStatement::setLongParam(int paramNo
, long value
)
129 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
130 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
133 printError(ErrSysFatal
, "condition value is null. Should never happen");
136 *(long*)cValue
->value
= value
;
140 DbRetVal
InsStatement::setLongLongParam(int paramNo
, long long value
)
142 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
143 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
146 printError(ErrSysFatal
, "condition value is null. Should never happen");
149 *(long long*)cValue
->value
= value
;
152 DbRetVal
InsStatement::setByteIntParam(int paramNo
, ByteInt value
)
154 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
155 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
158 printError(ErrSysFatal
, "condition value is null. Should never happen");
161 *(ByteInt
*)cValue
->value
= value
;
164 DbRetVal
InsStatement::setFloatParam(int paramNo
, float value
)
166 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
167 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
170 printError(ErrSysFatal
, "condition value is null. Should never happen");
173 *(float*)cValue
->value
= value
;
176 DbRetVal
InsStatement::setDoubleParam(int paramNo
, double value
)
178 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
179 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
182 printError(ErrSysFatal
, "condition value is null. Should never happen");
185 *(double*)cValue
->value
= value
;
188 DbRetVal
InsStatement::setStringParam(int paramNo
, char *value
)
190 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
191 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
194 printError(ErrSysFatal
, "condition value is null. Should never happen");
197 //TODO::check if the strlen(value) is greater than field length
199 strcpy((char*)cValue
->value
, value
);
202 DbRetVal
InsStatement::setDateParam(int paramNo
, Date value
)
204 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
205 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
208 printError(ErrSysFatal
, "condition value is null. Should never happen");
211 *(Date
*)cValue
->value
= value
;
214 DbRetVal
InsStatement::setTimeParam(int paramNo
, Time value
)
216 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
217 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
220 printError(ErrSysFatal
, "condition value is null. Should never happen");
223 *(Time
*)cValue
->value
= value
;
226 void* InsStatement::getParamValuePtr( int pos
)
228 FieldValue
*p
= (FieldValue
*) params
[pos
-1];
229 return ( (void*) p
->value
);
232 DbRetVal
InsStatement::setTimeStampParam(int paramNo
, TimeStamp value
)
234 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
235 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
238 printError(ErrSysFatal
, "condition value is null. Should never happen");
241 *(TimeStamp
*)cValue
->value
= value
;
245 DbRetVal
InsStatement::setBinaryParam(int paramNo
, void *value
, int length
)
247 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
248 FieldValue
*fValue
= (FieldValue
*) params
[paramNo
-1];
251 printError(ErrSysFatal
, "field value is null. Should never happen");
254 memcpy(fValue
->value
, value
, 2 * fValue
->length
);
258 DbRetVal
InsStatement::resolve()
260 if (dbMgr
== NULL
) return ErrNoConnection
;
261 //check whether the table exists
262 table
= dbMgr
->openTable(parsedData
->getTableName());
265 printError(ErrNotExists
, "Unable to open the table:Table not exists");
270 //check whether filed list is specified
271 if( 0 == parsedData
->getFieldNameList().size() )
272 fieldNameList
= table
->getFieldNameList();
274 fieldNameList
= parsedData
->getFieldNameList();
276 //check whether the total number of field name in the list is same as the total
277 //number of values provided in the values list.
278 if ( fieldNameList
.size() !=
279 parsedData
->getFieldValueList().size())
281 dbMgr
->closeTable(table
);
283 printError(ErrSyntaxError
, "Field Name list and field values do not match");
284 return ErrSyntaxError
;
287 //get the fieldname list and validate field names
288 ListIterator iter
= fieldNameList
.getIterator();
289 ListIterator valIter
= parsedData
->getFieldValueList().getIterator();
290 FieldName
*name
; FieldValue
*value
;
291 FieldInfo
*fInfo
= new FieldInfo();
294 while (iter
.hasElement())
296 name
= (FieldName
*)iter
.nextElement();
297 value
= (FieldValue
*) valIter
.nextElement();
298 if (NULL
== name
|| NULL
== value
)
300 dbMgr
->closeTable(table
);
303 printError(ErrSyntaxError
, "Field Name list and field values do not match");
304 return ErrSyntaxError
;
306 rv
= table
->getFieldInfo(name
->fldName
, fInfo
);
307 if (ErrNotFound
== rv
)
309 dbMgr
->closeTable(table
);
312 printError(ErrSyntaxError
, "Field %s does not exist in table",
314 return ErrSyntaxError
;
316 strcpy(value
->fldName
,name
->fldName
);
317 value
->type
= fInfo
->type
;
318 value
->length
= fInfo
->length
;
319 value
->isNullable
= fInfo
->isNull
;
320 // for binary datatype input buffer size should be 2 times the length
321 if (fInfo
->type
== typeBinary
)
322 value
->value
= AllDataType::alloc(fInfo
->type
, 2 * fInfo
->length
);
323 else value
->value
= AllDataType::alloc(fInfo
->type
, fInfo
->length
);
324 value
->isAllocVal
= true;
325 if (value
->parsedString
== NULL
) continue;
326 table
->bindFld(name
->fldName
, value
->value
);
327 if (value
->parsedString
[0] == '?')
329 value
->paramNo
= paramPos
++;
331 if (!value
->paramNo
) {
332 // Checking Integer value
333 if((value
->type
== typeInt
) || (value
->type
==typeShort
) || (value
->type
==typeByteInt
) || (value
->type
==typeLongLong
) || (value
->type
==typeLong
)){
334 int len
=strlen(value
->parsedString
);
335 for(int n
=0;n
<len
;n
++){
336 int p
=value
->parsedString
[n
];
337 if(!(p
>=48 && p
<=57 || p
==45) )
341 // for binary datatype buffer is just strcpy'd. It will be converted into binary datatype in copyValuesToBindBuffer in DBAPI
342 if (value
->type
== typeBinary
)
343 strncpy((char *)value
->value
, value
->parsedString
, 2 * fInfo
->length
);
344 else AllDataType::strToValue(value
->value
, value
->parsedString
, fInfo
->type
, fInfo
->length
);
348 totalParams
= paramPos
-1;
349 if (0 == totalParams
) {
350 if( 0 == parsedData
->getFieldNameList().size() ) {
352 while(iter
.hasElement())
353 delete (Identifier
*) iter
.nextElement();
354 fieldNameList
.reset();
358 params
= (void**) malloc ( totalParams
* sizeof(FieldValue
*));
359 paramValues
= (char**) malloc( totalParams
* sizeof(char*));
360 memset(params
, 0, totalParams
* sizeof(FieldValue
*));
361 memset(paramValues
, 0, totalParams
* sizeof(char*));
363 while(valIter
.hasElement())
365 value
= (FieldValue
*) valIter
.nextElement();
368 dbMgr
->closeTable(table
);
370 free(params
); params
= NULL
;
371 free(paramValues
); paramValues
= NULL
;
372 printError(ErrSysFatal
, "Should never happen. value NULL after iteration");
375 if (value
->paramNo
== 0) continue;
376 params
[value
->paramNo
-1 ] = value
;
378 // memory to be deallocated created by table->getFieldNameList
379 if( 0 == parsedData
->getFieldNameList().size() ) {
381 while(iter
.hasElement())
382 delete (Identifier
*) iter
.nextElement();
383 fieldNameList
.reset();
387 int InsStatement::getFldPos(char *name
)
389 return table
->getFldPos(name
);