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 DbRetVal
DmlStatement::getFieldInfo(const char *tname
, const char *fname
, FieldInfo
*& info
)
23 if (strcmp(tname
, table
->getName())==0)
24 return table
->getFieldInfo(fname
, info
);
29 List
DmlStatement::getFieldNameList(const char *tname
, DbRetVal
&rv
)
32 if (strcmp(tname
, table
->getName())==0)
33 return table
->getFieldNameList();
38 InsStatement::InsStatement()
48 InsStatement::~InsStatement()
50 if (table
) { table
->close(); table
= NULL
; }
59 DbRetVal
InsStatement::getParamFldInfo(int paramPos
, FieldInfo
*&info
)
61 if (paramPos
>totalParams
) return ErrBadCall
;
62 FieldValue
*value
= (FieldValue
*)params
[paramPos
-1];
65 printError(ErrSysFatal
, "param ptr is null: should never happen\n");
68 table
->getFieldNameAlone(value
->fldName
,info
->fldName
);
69 info
->type
= value
->type
;
70 info
->length
= value
->length
;
71 info
->isNull
= value
->isNullable
;
75 DbRetVal
InsStatement::execute(int &rowsAffected
)
78 //copy param values to binded buffer
80 for (int i
= 0; i
< totalParams
; i
++)
82 value
= (FieldValue
*) params
[i
];
83 if (paramValues
[i
] == NULL
)
85 //printError(ErrBadCall, "param values not set");
89 AllDataType::copyVal(value
->value
, paramValues
[i
], value
->type
, value
->length
);
91 rv
= table
->insertTuple();
92 if (rv
==OK
) rowsAffected
= 1;
93 table
-> resetNullinfo();
97 DbRetVal
InsStatement::setParam(int paramNo
, void *value
)
99 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
100 if (NULL
== value
) return ErrBadArg
;
101 paramValues
[paramNo
-1] = (char*) value
;
105 DbRetVal
InsStatement::setShortParam(int paramNo
, short value
)
107 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
108 FieldValue
*fValue
= (FieldValue
*) params
[paramNo
-1];
111 printError(ErrSysFatal
, "field value is null. Should never happen");
114 *(short*)fValue
->value
= value
;
118 DbRetVal
InsStatement::setIntParam(int paramNo
, int value
)
120 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
121 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
124 printError(ErrSysFatal
, "condition value is null. Should never happen");
128 *(int*)cValue
->value
= value
;
131 DbRetVal
InsStatement::setNull(int paramNo
)
133 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
134 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
137 printError(ErrSysFatal
, "FieldValue is null. Should never happen");
140 char name
[IDENTIFIER_LENGTH
];
141 table
->getFieldNameAlone(cValue
->fldName
,name
);
142 table
->markFldNull(name
);
145 DbRetVal
InsStatement::setLongParam(int paramNo
, long value
)
147 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
148 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
151 printError(ErrSysFatal
, "condition value is null. Should never happen");
154 *(long*)cValue
->value
= value
;
158 DbRetVal
InsStatement::setLongLongParam(int paramNo
, long long value
)
160 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
161 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
164 printError(ErrSysFatal
, "condition value is null. Should never happen");
167 *(long long*)cValue
->value
= value
;
170 DbRetVal
InsStatement::setByteIntParam(int paramNo
, ByteInt value
)
172 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
173 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
176 printError(ErrSysFatal
, "condition value is null. Should never happen");
179 *(ByteInt
*)cValue
->value
= value
;
182 DbRetVal
InsStatement::setFloatParam(int paramNo
, float value
)
184 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
185 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
188 printError(ErrSysFatal
, "condition value is null. Should never happen");
191 *(float*)cValue
->value
= value
;
194 DbRetVal
InsStatement::setDoubleParam(int paramNo
, double value
)
196 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
197 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
200 printError(ErrSysFatal
, "condition value is null. Should never happen");
203 *(double*)cValue
->value
= value
;
206 DbRetVal
InsStatement::setStringParam(int paramNo
, char *value
)
208 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
209 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
212 printError(ErrSysFatal
, "condition value is null. Should never happen");
215 //TODO::check if the strlen(value) is greater than field length
217 strcpy((char*)cValue
->value
, value
);
220 DbRetVal
InsStatement::setDateParam(int paramNo
, Date value
)
222 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
223 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
226 printError(ErrSysFatal
, "condition value is null. Should never happen");
229 *(Date
*)cValue
->value
= value
;
232 DbRetVal
InsStatement::setTimeParam(int paramNo
, Time 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 *(Time
*)cValue
->value
= value
;
244 void* InsStatement::getParamValuePtr( int pos
)
246 FieldValue
*p
= (FieldValue
*) params
[pos
-1];
247 return ( (void*) p
->value
);
250 DbRetVal
InsStatement::setTimeStampParam(int paramNo
, TimeStamp value
)
252 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
253 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
256 printError(ErrSysFatal
, "condition value is null. Should never happen");
259 *(TimeStamp
*)cValue
->value
= value
;
263 DbRetVal
InsStatement::setBinaryParam(int paramNo
, void *value
, int length
)
265 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
266 FieldValue
*fValue
= (FieldValue
*) params
[paramNo
-1];
269 printError(ErrSysFatal
, "field value is null. Should never happen");
272 memcpy(fValue
->value
, value
, 2 * fValue
->length
);
276 long long InsStatement::getLastInsertedVal(DbRetVal
&rv
)
279 return ((TableImpl
*)table
)->getLastInsertedVal(rv
);
286 DbRetVal
InsStatement::resolve()
288 if (dbMgr
== NULL
) return ErrNoConnection
;
289 //check whether the table exists
290 table
= dbMgr
->openTable(parsedData
->getTableName());
293 printError(ErrNotExists
, "Unable to open the table:Table not exists");
298 //check whether filed list is specified
299 if( 0 == parsedData
->getFieldNameList().size() )
300 fieldNameList
= table
->getFieldNameList();
302 fieldNameList
= parsedData
->getFieldNameList();
304 //check whether the total number of field name in the list is same as the total
305 //number of values provided in the values list.
306 if ( fieldNameList
.size() !=
307 parsedData
->getFieldValueList().size())
309 dbMgr
->closeTable(table
);
311 printError(ErrSyntaxError
, "Field Name list and field values do not match");
312 return ErrSyntaxError
;
315 //get the fieldname list and validate field names
316 ListIterator iter
= fieldNameList
.getIterator();
317 ListIterator valIter
= parsedData
->getFieldValueList().getIterator();
318 FieldName
*name
; FieldValue
*value
;
319 FieldInfo
*fInfo
= new FieldInfo();
322 while (iter
.hasElement())
324 name
= (FieldName
*)iter
.nextElement();
325 value
= (FieldValue
*) valIter
.nextElement();
326 if (NULL
== name
|| NULL
== value
)
328 dbMgr
->closeTable(table
);
331 printError(ErrSyntaxError
, "Field Name list and field values do not match");
332 return ErrSyntaxError
;
334 rv
= table
->getFieldInfo(name
->fldName
, fInfo
);
335 if (ErrNotFound
== rv
)
337 dbMgr
->closeTable(table
);
340 printError(ErrSyntaxError
, "Field %s does not exist in table",
342 return ErrSyntaxError
;
344 strcpy(value
->fldName
,name
->fldName
);
345 value
->type
= fInfo
->type
;
346 value
->length
= fInfo
->length
;
347 value
->isNullable
= fInfo
->isNull
;
348 // for binary datatype input buffer size should be 2 times the length
349 if (fInfo
->type
== typeBinary
)
350 value
->value
= AllDataType::alloc(fInfo
->type
, 2 * fInfo
->length
);
351 else value
->value
= AllDataType::alloc(fInfo
->type
, fInfo
->length
);
352 value
->isAllocVal
= true;
353 if (value
->parsedString
== NULL
) {
354 table
->bindFld(name
->fldName
, NULL
, true);
357 table
->bindFld(name
->fldName
, value
->value
);
358 if (value
->parsedString
[0] == '?')
360 value
->paramNo
= paramPos
++;
362 if (!value
->paramNo
) {
363 // Checking Integer value
364 if((value
->type
== typeInt
) || (value
->type
==typeShort
) || (value
->type
==typeByteInt
) || (value
->type
==typeLongLong
) || (value
->type
==typeLong
)){
365 int len
=strlen(value
->parsedString
);
366 for(int n
=0;n
<len
;n
++){
367 int p
=value
->parsedString
[n
];
368 if(!(p
>=48 && p
<=57 || p
==45) ) {
374 // for binary datatype buffer is just strcpy'd.
375 //It will be converted into binary datatype in copyValuesToBindBuffer in DBAPI
376 if (value
->type
== typeBinary
)
377 strncpy((char *)value
->value
, value
->parsedString
, 2 * fInfo
->length
);
379 rv
= AllDataType::strToValue(value
->value
, value
->parsedString
, fInfo
->type
, fInfo
->length
);
386 /* Checking range for char data type 8kb(8000) */
387 if(value
->type
==typeString
){
388 int len
=strlen(value
->parsedString
);
390 printError(ErrBadRange
,"Char data type length should be less than 8kb(8000).");
399 totalParams
= paramPos
-1;
400 if (0 == totalParams
) {
401 if( 0 == parsedData
->getFieldNameList().size() ) {
403 while(iter
.hasElement())
404 delete (Identifier
*) iter
.nextElement();
405 fieldNameList
.reset();
409 params
= (void**) malloc ( totalParams
* sizeof(FieldValue
*));
410 paramValues
= (char**) malloc( totalParams
* sizeof(char*));
411 memset(params
, 0, totalParams
* sizeof(FieldValue
*));
412 memset(paramValues
, 0, totalParams
* sizeof(char*));
414 while(valIter
.hasElement())
416 value
= (FieldValue
*) valIter
.nextElement();
419 dbMgr
->closeTable(table
);
421 free(params
); params
= NULL
;
422 free(paramValues
); paramValues
= NULL
;
423 printError(ErrSysFatal
, "Should never happen. value NULL after iteration");
426 if (value
->paramNo
== 0) continue;
427 params
[value
->paramNo
-1 ] = value
;
429 // memory to be deallocated created by table->getFieldNameList
430 if( 0 == parsedData
->getFieldNameList().size() ) {
432 while(iter
.hasElement())
433 delete (Identifier
*) iter
.nextElement();
434 fieldNameList
.reset();
438 int InsStatement::getFldPos(char *name
)
440 return table
->getFldPos(name
);