1 /***************************************************************************
2 * Copyright (C) 2007 by www.databasecache.com *
3 * Contact: praba_tuty@databasecache.com *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
16 * ***************************************************************************/
17 #include<Expression.h>
21 void Expression::setTable(Table
*tbl
)
28 table
=(TableImpl
*) tbl
;
31 void Expression::setTuple(void *tpl
)
41 void Expression::setExpr(void *cVal
,bool flag
)
48 void Expression::setExpr(char const *name
,ArithOperator op
,void *cVal
)
50 strcpy(fldName
, name
);
56 void Expression::setExpr(char const *name
)
58 strcpy(fldName
, name
);
64 void Expression::setExpr(Expression
*exp1
, ArithOperator op
, Expression
*exp2
)
71 void *Expression::evaluate(DataType type
,bool &result
)
73 calVal
=AllDataType::alloc(type
,IDENTIFIER_LENGTH
);
74 char *rhsResult
= NULL
, *lhsResult
= NULL
;
77 lhsResult
=(char *) lhs
->evaluate(type
,result
);
78 if (NULL
== lhsResult
) return lhsResult
;
82 rhsResult
= (char *)rhs
->evaluate(type
,result
);
83 if (NULL
== rhsResult
) return rhsResult
;
85 if(result
){return tuple
;}
88 if(NULL
==lhs
&& NULL
== rhs
)
90 if(strcmp(fldName
,"\0")!=0)
92 DataType srcType
= table
->getFieldType(fldName
);
93 if(srcType
> 12) return NULL
;
96 offset
=table
->getFieldOffset(fldName
);
97 val
= ((char*) tuple
) + offset
;
98 if(table
->isFldNull(fldName
))
106 if(constVal
!= NULL
&& strcmp(fldName
,"\0")!=0)
108 os::memcpy(calVal
,val
,table
->getFieldLength(fldName
));
109 solve(calVal
, constVal
, type
, arOp
);
111 else if(constVal
!= NULL
&& 0==strcmp(fldName
,"\0"))
113 AllDataType::copyVal(calVal
, constVal
, type
, IDENTIFIER_LENGTH
);
115 else if( NULL
==constVal
&& strcmp(fldName
,"\0")!=0)
117 os::memcpy(calVal
,val
,table
->getFieldLength(fldName
));
121 if(NULL
!=lhsResult
&& NULL
!=rhsResult
)
123 solve(lhsResult
, rhsResult
, type
, arOp
);
129 void Expression::solve(void *opand1
, void *opand2
, DataType type
, ArithOperator arOp
)
134 AllDataType::addVal(opand1
, opand2
, type
);
137 AllDataType::subVal(opand1
, opand2
, type
);
140 AllDataType::mulVal(opand1
, opand2
, type
);
143 AllDataType::divVal(opand1
, opand2
, type
);
146 AllDataType::mudVal(opand1
, opand2
, type
);
154 bool Expression::isSingleTerm()
156 if (NULL
==lhs
&& NULL
==rhs
) return true;
159 void Expression::memFree()
168 void Expression::convertStrToVal(DataType type
)
171 lhs
->convertStrToVal(type
);
173 rhs
->convertStrToVal(type
);
176 void *parseString
=constVal
;
177 constVal
=AllDataType::alloc(type
);
178 AllDataType::strToValue(constVal
,(char*)parseString
, type
);
183 void Expression::freeVal()