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 AllDataType::memoryset(calVal
, type
);
75 char *rhsResult
= NULL
, *lhsResult
= NULL
;
78 lhsResult
=(char *) lhs
->evaluate(type
,result
);
79 if (NULL
== lhsResult
) return lhsResult
;
83 rhsResult
= (char *)rhs
->evaluate(type
,result
);
84 if (NULL
== rhsResult
) return rhsResult
;
86 if(result
){return tuple
;}
87 if (0==strcmp(fldName
,"NULL")){
88 result
=true;return tuple
;
92 if(NULL
==lhs
&& NULL
== rhs
)
94 if(strcmp(fldName
,"\0")!=0)
96 DataType srcType
= table
->getFieldType(fldName
);
97 if(srcType
> 12) return NULL
;
100 offset
=table
->getFieldOffset(fldName
);
101 val
= ((char*) tuple
) + offset
;
102 if(table
->isFldNull(fldName
))
110 if(constVal
!= NULL
&& strcmp(fldName
,"\0")!=0)
112 os::memcpy(calVal
,val
,table
->getFieldLength(fldName
));
113 solve(calVal
, constVal
, type
, arOp
);
115 else if(constVal
!= NULL
&& 0==strcmp(fldName
,"\0"))
117 AllDataType::copyVal(calVal
, constVal
, type
, IDENTIFIER_LENGTH
);
119 else if( NULL
==constVal
&& strcmp(fldName
,"\0")!=0)
121 os::memcpy(calVal
,val
,table
->getFieldLength(fldName
));
125 if(NULL
!=lhsResult
&& NULL
!=rhsResult
)
127 solve(lhsResult
, rhsResult
, type
, arOp
);
133 void Expression::solve(void *opand1
, void *opand2
, DataType type
, ArithOperator arOp
)
138 AllDataType::addVal(opand1
, opand2
, type
);
141 AllDataType::subVal(opand1
, opand2
, type
);
144 AllDataType::mulVal(opand1
, opand2
, type
);
147 AllDataType::divVal(opand1
, opand2
, type
);
150 AllDataType::mudVal(opand1
, opand2
, type
);
158 bool Expression::isSingleTerm()
160 if (NULL
==lhs
&& NULL
==rhs
) return true;
163 void Expression::memFree()
172 void Expression::convertStrToVal(DataType type
)
175 lhs
->convertStrToVal(type
);
177 rhs
->convertStrToVal(type
);
180 void *parseString
=constVal
;
181 constVal
=AllDataType::alloc(type
);
182 AllDataType::strToValue(constVal
,(char*)parseString
, type
);
187 void Expression::freeVal()