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"
19 InsStatement::InsStatement()
29 InsStatement::~InsStatement()
31 if (table
) { table
->close(); table
= NULL
; }
40 DbRetVal
InsStatement::getParamFldInfo(int paramPos
, FieldInfo
*&info
)
42 if (paramPos
>totalParams
) return ErrBadCall
;
43 FieldValue
*value
= (FieldValue
*)params
[paramPos
-1];
46 printError(ErrSysFatal
, "param ptr is null: should never happen\n");
49 table
->getFieldNameAlone(value
->fldName
,info
->fldName
);
50 info
->type
= value
->type
;
51 info
->length
= value
->length
;
52 info
->isNull
= value
->isNullable
;
56 DbRetVal
InsStatement::execute(int &rowsAffected
)
59 //copy param values to binded buffer
61 for (int i
= 0; i
< totalParams
; i
++)
63 value
= (FieldValue
*) params
[i
];
64 if (paramValues
[i
] == NULL
)
66 //printError(ErrBadCall, "param values not set");
70 AllDataType::copyVal(value
->value
, paramValues
[i
], value
->type
, value
->length
);
72 rv
= table
->insertTuple();
73 if (rv
==OK
) rowsAffected
= 1;
74 table
-> resetNullinfo();
78 DbRetVal
InsStatement::setParam(int paramNo
, void *value
)
80 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
81 if (NULL
== value
) return ErrBadArg
;
82 paramValues
[paramNo
-1] = (char*) value
;
86 DbRetVal
InsStatement::setShortParam(int paramNo
, short value
)
88 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
89 FieldValue
*fValue
= (FieldValue
*) params
[paramNo
-1];
92 printError(ErrSysFatal
, "field value is null. Should never happen");
95 *(short*)fValue
->value
= value
;
99 DbRetVal
InsStatement::setIntParam(int paramNo
, int value
)
101 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
102 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
105 printError(ErrSysFatal
, "condition value is null. Should never happen");
109 *(int*)cValue
->value
= value
;
112 DbRetVal
InsStatement::setNull(int paramNo
)
114 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
115 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
118 printError(ErrSysFatal
, "FieldValue is null. Should never happen");
121 char name
[IDENTIFIER_LENGTH
];
122 table
->getFieldNameAlone(cValue
->fldName
,name
);
123 table
->markFldNull(name
);
126 DbRetVal
InsStatement::setLongParam(int paramNo
, long value
)
128 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
129 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
132 printError(ErrSysFatal
, "condition value is null. Should never happen");
135 *(long*)cValue
->value
= value
;
139 DbRetVal
InsStatement::setLongLongParam(int paramNo
, long long value
)
141 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
142 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
145 printError(ErrSysFatal
, "condition value is null. Should never happen");
148 *(long long*)cValue
->value
= value
;
151 DbRetVal
InsStatement::setByteIntParam(int paramNo
, ByteInt value
)
153 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
154 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
157 printError(ErrSysFatal
, "condition value is null. Should never happen");
160 *(ByteInt
*)cValue
->value
= value
;
163 DbRetVal
InsStatement::setFloatParam(int paramNo
, float value
)
165 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
166 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
169 printError(ErrSysFatal
, "condition value is null. Should never happen");
172 *(float*)cValue
->value
= value
;
175 DbRetVal
InsStatement::setDoubleParam(int paramNo
, double value
)
177 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
178 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
181 printError(ErrSysFatal
, "condition value is null. Should never happen");
184 *(double*)cValue
->value
= value
;
187 DbRetVal
InsStatement::setStringParam(int paramNo
, char *value
)
189 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
190 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
193 printError(ErrSysFatal
, "condition value is null. Should never happen");
196 //TODO::check if the strlen(value) is greater than field length
198 strcpy((char*)cValue
->value
, value
);
201 DbRetVal
InsStatement::setDateParam(int paramNo
, Date value
)
203 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
204 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
207 printError(ErrSysFatal
, "condition value is null. Should never happen");
210 *(Date
*)cValue
->value
= value
;
213 DbRetVal
InsStatement::setTimeParam(int paramNo
, Time value
)
215 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
216 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
219 printError(ErrSysFatal
, "condition value is null. Should never happen");
222 *(Time
*)cValue
->value
= value
;
225 void* InsStatement::getParamValuePtr( int pos
)
227 FieldValue
*p
= (FieldValue
*) params
[pos
-1];
228 return ( (void*) p
->value
);
231 DbRetVal
InsStatement::setTimeStampParam(int paramNo
, TimeStamp value
)
233 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
234 FieldValue
*cValue
= (FieldValue
*) params
[paramNo
-1];
237 printError(ErrSysFatal
, "condition value is null. Should never happen");
240 *(TimeStamp
*)cValue
->value
= value
;
244 DbRetVal
InsStatement::setBinaryParam(int paramNo
, void *value
)
246 if (paramNo
<=0 || paramNo
> totalParams
) return ErrBadArg
;
247 FieldValue
*fValue
= (FieldValue
*) params
[paramNo
-1];
250 printError(ErrSysFatal
, "field value is null. Should never happen");
253 memcpy(fValue
->value
, value
, 2 * fValue
->length
);
257 DbRetVal
InsStatement::resolve()
259 if (dbMgr
== NULL
) return ErrNoConnection
;
260 //check whether the table exists
261 table
= dbMgr
->openTable(parsedData
->getTableName());
264 printError(ErrNotExists
, "Unable to open the table:Table not exists");
269 //check whether filed list is specified
270 if( 0 == parsedData
->getFieldNameList().size() )
271 fieldNameList
= table
->getFieldNameList();
273 fieldNameList
= parsedData
->getFieldNameList();
275 //check whether the total number of field name in the list is same as the total
276 //number of values provided in the values list.
277 if ( fieldNameList
.size() !=
278 parsedData
->getFieldValueList().size())
280 dbMgr
->closeTable(table
);
282 printError(ErrSyntaxError
, "Field Name list and field values do not match");
283 return ErrSyntaxError
;
286 //get the fieldname list and validate field names
287 ListIterator iter
= fieldNameList
.getIterator();
288 ListIterator valIter
= parsedData
->getFieldValueList().getIterator();
289 FieldName
*name
; FieldValue
*value
;
290 FieldInfo
*fInfo
= new FieldInfo();
293 while (iter
.hasElement())
295 name
= (FieldName
*)iter
.nextElement();
296 value
= (FieldValue
*) valIter
.nextElement();
297 if (NULL
== name
|| NULL
== value
)
299 dbMgr
->closeTable(table
);
302 printError(ErrSyntaxError
, "Field Name list and field values do not match");
303 return ErrSyntaxError
;
305 rv
= table
->getFieldInfo(name
->fldName
, fInfo
);
306 if (ErrNotFound
== rv
)
308 dbMgr
->closeTable(table
);
311 printError(ErrSyntaxError
, "Field %s does not exist in table",
313 return ErrSyntaxError
;
315 strcpy(value
->fldName
,name
->fldName
);
316 value
->type
= fInfo
->type
;
317 value
->length
= fInfo
->length
;
318 value
->isNullable
= fInfo
->isNull
;
319 // for binary datatype input buffer size should be 2 times the length
320 if (fInfo
->type
== typeBinary
)
321 value
->value
= AllDataType::alloc(fInfo
->type
, 2 * fInfo
->length
);
322 else value
->value
= AllDataType::alloc(fInfo
->type
, fInfo
->length
);
323 value
->isAllocVal
= true;
324 if (value
->parsedString
== NULL
) continue;
325 table
->bindFld(name
->fldName
, value
->value
);
326 if (value
->parsedString
[0] == '?')
328 value
->paramNo
= paramPos
++;
330 if (!value
->paramNo
) {
331 // for binary datatype buffer is just strcpy'd. It will be converted into binary datatype in copyValuesToBindBuffer in DBAPI
332 if (value
->type
== typeBinary
)
333 strncpy((char *)value
->value
, value
->parsedString
, 2 * fInfo
->length
);
334 else AllDataType::strToValue(value
->value
, value
->parsedString
, fInfo
->type
, fInfo
->length
);
338 totalParams
= paramPos
-1;
339 if (0 == totalParams
) {
340 if( 0 == parsedData
->getFieldNameList().size() ) {
342 while(iter
.hasElement())
343 delete (Identifier
*) iter
.nextElement();
344 fieldNameList
.reset();
348 params
= (void**) malloc ( totalParams
* sizeof(FieldValue
*));
349 paramValues
= (char**) malloc( totalParams
* sizeof(char*));
350 memset(params
, 0, totalParams
* sizeof(FieldValue
*));
351 memset(paramValues
, 0, totalParams
* sizeof(char*));
353 while(valIter
.hasElement())
355 value
= (FieldValue
*) valIter
.nextElement();
358 dbMgr
->closeTable(table
);
360 free(params
); params
= NULL
;
361 free(paramValues
); paramValues
= NULL
;
362 printError(ErrSysFatal
, "Should never happen. value NULL after iteration");
365 if (value
->paramNo
== 0) continue;
366 params
[value
->paramNo
-1 ] = value
;
368 // memory to be deallocated created by table->getFieldNameList
369 if( 0 == parsedData
->getFieldNameList().size() ) {
371 while(iter
.hasElement())
372 delete (Identifier
*) iter
.nextElement();
373 fieldNameList
.reset();
377 int InsStatement::getFldPos(char *name
)
379 return table
->getFldPos(name
);