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 long long InsStatement::getLastInsertedVal(DbRetVal
&rv
)
261 return ((TableImpl
*)table
)->getLastInsertedVal(rv
);
268 DbRetVal
InsStatement::resolve()
270 if (dbMgr
== NULL
) return ErrNoConnection
;
271 //check whether the table exists
272 table
= dbMgr
->openTable(parsedData
->getTableName());
275 printError(ErrNotExists
, "Unable to open the table:Table not exists");
280 //check whether filed list is specified
281 if( 0 == parsedData
->getFieldNameList().size() )
282 fieldNameList
= table
->getFieldNameList();
284 fieldNameList
= parsedData
->getFieldNameList();
286 //check whether the total number of field name in the list is same as the total
287 //number of values provided in the values list.
288 if ( fieldNameList
.size() !=
289 parsedData
->getFieldValueList().size())
291 dbMgr
->closeTable(table
);
293 printError(ErrSyntaxError
, "Field Name list and field values do not match");
294 return ErrSyntaxError
;
297 //get the fieldname list and validate field names
298 ListIterator iter
= fieldNameList
.getIterator();
299 ListIterator valIter
= parsedData
->getFieldValueList().getIterator();
300 FieldName
*name
; FieldValue
*value
;
301 FieldInfo
*fInfo
= new FieldInfo();
304 while (iter
.hasElement())
306 name
= (FieldName
*)iter
.nextElement();
307 value
= (FieldValue
*) valIter
.nextElement();
308 if (NULL
== name
|| NULL
== value
)
310 dbMgr
->closeTable(table
);
313 printError(ErrSyntaxError
, "Field Name list and field values do not match");
314 return ErrSyntaxError
;
316 rv
= table
->getFieldInfo(name
->fldName
, fInfo
);
317 if (ErrNotFound
== rv
)
319 dbMgr
->closeTable(table
);
322 printError(ErrSyntaxError
, "Field %s does not exist in table",
324 return ErrSyntaxError
;
326 strcpy(value
->fldName
,name
->fldName
);
327 value
->type
= fInfo
->type
;
328 value
->length
= fInfo
->length
;
329 value
->isNullable
= fInfo
->isNull
;
330 // for binary datatype input buffer size should be 2 times the length
331 if (fInfo
->type
== typeBinary
)
332 value
->value
= AllDataType::alloc(fInfo
->type
, 2 * fInfo
->length
);
333 else value
->value
= AllDataType::alloc(fInfo
->type
, fInfo
->length
);
334 value
->isAllocVal
= true;
335 if (value
->parsedString
== NULL
) {
336 table
->bindFld(name
->fldName
, NULL
, true);
339 table
->bindFld(name
->fldName
, value
->value
);
340 if (value
->parsedString
[0] == '?')
342 value
->paramNo
= paramPos
++;
344 if (!value
->paramNo
) {
345 // Checking Integer value
346 if((value
->type
== typeInt
) || (value
->type
==typeShort
) || (value
->type
==typeByteInt
) || (value
->type
==typeLongLong
) || (value
->type
==typeLong
)){
347 int len
=strlen(value
->parsedString
);
348 for(int n
=0;n
<len
;n
++){
349 int p
=value
->parsedString
[n
];
350 if(!(p
>=48 && p
<=57 || p
==45) )
354 // for binary datatype buffer is just strcpy'd. It will be converted into binary datatype in copyValuesToBindBuffer in DBAPI
355 if (value
->type
== typeBinary
)
356 strncpy((char *)value
->value
, value
->parsedString
, 2 * fInfo
->length
);
357 else AllDataType::strToValue(value
->value
, value
->parsedString
, fInfo
->type
, fInfo
->length
);
358 /* Checking range for char data type 8kb(8000) */
359 if(value
->type
==typeString
){
360 int len
=strlen(value
->parsedString
);
362 printError(ErrBadRange
,"Char data type length should be less than 8kb(8000).");
370 totalParams
= paramPos
-1;
371 if (0 == totalParams
) {
372 if( 0 == parsedData
->getFieldNameList().size() ) {
374 while(iter
.hasElement())
375 delete (Identifier
*) iter
.nextElement();
376 fieldNameList
.reset();
380 params
= (void**) malloc ( totalParams
* sizeof(FieldValue
*));
381 paramValues
= (char**) malloc( totalParams
* sizeof(char*));
382 memset(params
, 0, totalParams
* sizeof(FieldValue
*));
383 memset(paramValues
, 0, totalParams
* sizeof(char*));
385 while(valIter
.hasElement())
387 value
= (FieldValue
*) valIter
.nextElement();
390 dbMgr
->closeTable(table
);
392 free(params
); params
= NULL
;
393 free(paramValues
); paramValues
= NULL
;
394 printError(ErrSysFatal
, "Should never happen. value NULL after iteration");
397 if (value
->paramNo
== 0) continue;
398 params
[value
->paramNo
-1 ] = value
;
400 // memory to be deallocated created by table->getFieldNameList
401 if( 0 == parsedData
->getFieldNameList().size() ) {
403 while(iter
.hasElement())
404 delete (Identifier
*) iter
.nextElement();
405 fieldNameList
.reset();
409 int InsStatement::getFldPos(char *name
)
411 return table
->getFldPos(name
);