blob: 7916948814b3392ce821c809e0319f0a3ad90d0b [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _CONNECTIVITY_FILE_FCODE_HXX_
#define _CONNECTIVITY_FILE_FCODE_HXX_
#include "connectivity/sqliterator.hxx"
#include <com/sun/star/sdbc/DataType.hpp>
#include "connectivity/CommonTools.hxx"
#include <tools/rtti.hxx>
#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/container/XIndexAccess.hpp>
#include "connectivity/FValue.hxx"
#include "file/filedllapi.hxx"
namespace connectivity
{
class OSQLParseNode;
namespace dbase
{
class ODbaseIndex;
}
namespace file
{
class OOperand;
typedef ::std::stack<OOperand*> OCodeStack;
class OBoolOperator;
typedef ::std::map<sal_Int32,sal_Int32> OEvaluateSet;
typedef ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess> OFileColumns;
class OOO_DLLPUBLIC_FILE OCode
{
public:
OCode();
virtual ~OCode();
inline static void * SAL_CALL operator new( size_t nSize ) SAL_THROW( () )
{ return ::rtl_allocateMemory( nSize ); }
inline static void * SAL_CALL operator new( size_t /*nSize*/,void* _pHint ) SAL_THROW( () )
{ return _pHint; }
inline static void SAL_CALL operator delete( void * pMem ) SAL_THROW( () )
{ ::rtl_freeMemory( pMem ); }
inline static void SAL_CALL operator delete( void * /*pMem*/,void* /*_pHint*/ ) SAL_THROW( () )
{ }
TYPEINFO();
};
// operands that the parsetree generate
class OOO_DLLPUBLIC_FILE OOperand : public OCode
{
protected:
sal_Int32 m_eDBType;
OOperand(const sal_Int32& _rType) : m_eDBType(_rType){}
OOperand() : m_eDBType(::com::sun::star::sdbc::DataType::OTHER){}
public:
virtual const ORowSetValue& getValue() const = 0;
virtual void setValue(const ORowSetValue& _rVal) = 0;
virtual sal_Int32 getDBType() const {return m_eDBType;}
virtual OEvaluateSet* preProcess(OBoolOperator* pOp, OOperand* pRight = 0);
inline sal_Bool isValid() const;
TYPEINFO();
};
class OOO_DLLPUBLIC_FILE OOperandRow : public OOperand
{
sal_uInt16 m_nRowPos;
protected:
OValueRefRow m_pRow;
OOperandRow(sal_uInt16 _nPos, sal_Int32 _rType);
public:
sal_uInt16 getRowPos() const {return m_nRowPos;}
virtual const ORowSetValue& getValue() const;
virtual void setValue(const ORowSetValue& _rVal);
void bindValue(const OValueRefRow& _pRow); // Bindung an den Wert, den der Operand repraesentiert
TYPEINFO();
};
// Attribute aus einer Ergebniszeile
class OOO_DLLPUBLIC_FILE OOperandAttr : public OOperandRow
{
protected:
::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> m_xColumn;
public:
OOperandAttr(sal_uInt16 _nPos,
const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xColumn);
virtual sal_Bool isIndexed() const;
virtual OEvaluateSet* preProcess(OBoolOperator* pOp, OOperand* pRight = 0);
TYPEINFO();
};
// Parameter fuer ein Praedikat
class OOperandParam : public OOperandRow
{
public:
OOperandParam(connectivity::OSQLParseNode* pNode, sal_Int32 _nPos);
void describe(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xColumn, ::vos::ORef<connectivity::OSQLColumns> _xParamColumns);
TYPEINFO();
};
// WerteOperanden
class OOperandValue : public OOperand
{
protected:
ORowSetValue m_aValue;
protected:
OOperandValue(){}
OOperandValue(const ORowSetValue& _rVar, sal_Int32 eDbType)
: OOperand(eDbType)
, m_aValue(_rVar)
{}
OOperandValue(sal_Int32 eDbType) :OOperand(eDbType){}
public:
virtual const ORowSetValue& getValue() const;
virtual void setValue(const ORowSetValue& _rVal);
TYPEINFO();
};
// Konstanten
class OOperandConst : public OOperandValue
{
public:
OOperandConst(const connectivity::OSQLParseNode& rColumnRef, const rtl::OUString& aStrValue);
TYPEINFO();
};
// Ergebnis Operanden
class OOperandResult : public OOperandValue
{
protected:
OOperandResult(const ORowSetValue& _rVar, sal_Int32 eDbType)
:OOperandValue(_rVar, eDbType) {}
OOperandResult(sal_Int32 eDbType)
:OOperandValue(eDbType) {}
public:
OOperandResult(const ORowSetValue& _rVar)
:OOperandValue(_rVar, _rVar.getTypeKind()) {}
TYPEINFO();
};
class OOperandResultBOOL : public OOperandResult
{
public:
OOperandResultBOOL(sal_Bool bResult) : OOperandResult(::com::sun::star::sdbc::DataType::BIT)
{
m_aValue = bResult ? 1.0 : 0.0;
m_aValue.setBound(sal_True);
}
};
class OOperandResultNUM : public OOperandResult
{
public:
OOperandResultNUM(double fNum) : OOperandResult(::com::sun::star::sdbc::DataType::DOUBLE)
{
m_aValue = fNum;
m_aValue.setBound(sal_True);
}
};
/** special stop operand
is appended when a list of arguments ends
*/
class OStopOperand : public OOperandValue
{
public:
OStopOperand(){}
TYPEINFO();
};
// Operatoren
class OOO_DLLPUBLIC_FILE OOperator : public OCode
{
public:
virtual void Exec(OCodeStack&) = 0;
virtual sal_uInt16 getRequestedOperands() const; // Anzahl benoetigter Operanden
// Standard ist 2
TYPEINFO();
};
// boolsche Operatoren
class OOO_DLLPUBLIC_FILE OBoolOperator : public OOperator
{
public:
TYPEINFO();
virtual void Exec(OCodeStack&);
virtual sal_Bool operate(const OOperand*, const OOperand*) const;
};
class OOp_NOT : public OBoolOperator
{
public:
TYPEINFO();
protected:
virtual void Exec(OCodeStack&);
virtual sal_Bool operate(const OOperand*, const OOperand* = NULL) const;
virtual sal_uInt16 getRequestedOperands() const;
};
class OOp_AND : public OBoolOperator
{
public:
TYPEINFO();
protected:
virtual sal_Bool operate(const OOperand*, const OOperand*) const;
};
class OOp_OR : public OBoolOperator
{
public:
TYPEINFO();
protected:
virtual sal_Bool operate(const OOperand*, const OOperand*) const;
};
class OOO_DLLPUBLIC_FILE OOp_ISNULL : public OBoolOperator
{
public:
TYPEINFO();
public:
virtual void Exec(OCodeStack&);
virtual sal_uInt16 getRequestedOperands() const;
virtual sal_Bool operate(const OOperand*, const OOperand* = NULL) const;
};
class OOO_DLLPUBLIC_FILE OOp_ISNOTNULL : public OOp_ISNULL
{
public:
TYPEINFO();
virtual sal_Bool operate(const OOperand*, const OOperand* = NULL) const;
};
class OOO_DLLPUBLIC_FILE OOp_LIKE : public OBoolOperator
{
public:
TYPEINFO();
protected:
const sal_Unicode cEscape;
public:
OOp_LIKE(const sal_Unicode cEsc = L'\0'):cEscape(cEsc){};
virtual sal_Bool operate(const OOperand*, const OOperand*) const;
};
class OOp_NOTLIKE : public OOp_LIKE
{
public:
TYPEINFO();
public:
OOp_NOTLIKE(const sal_Unicode cEsc = L'\0'):OOp_LIKE(cEsc){};
virtual sal_Bool operate(const OOperand*, const OOperand*) const;
};
class OOO_DLLPUBLIC_FILE OOp_COMPARE : public OBoolOperator
{
sal_Int32 aPredicateType;
public:
TYPEINFO();
OOp_COMPARE(sal_Int32 aPType)
:aPredicateType(aPType) {}
inline sal_Int32 getPredicateType() const { return aPredicateType; }
virtual sal_Bool operate(const OOperand*, const OOperand*) const;
};
// numerische Operatoren
class ONumOperator : public OOperator
{
public:
virtual void Exec(OCodeStack&);
TYPEINFO();
protected:
virtual double operate(const double& fLeft,const double& fRight) const = 0;
};
class OOp_ADD : public ONumOperator
{
protected:
virtual double operate(const double& fLeft,const double& fRight) const;
};
class OOp_SUB : public ONumOperator
{
protected:
virtual double operate(const double& fLeft,const double& fRight) const;
};
class OOp_MUL : public ONumOperator
{
protected:
virtual double operate(const double& fLeft,const double& fRight) const;
};
class OOp_DIV : public ONumOperator
{
protected:
virtual double operate(const double& fLeft,const double& fRight) const;
};
inline sal_Bool OOperand::isValid() const
{
return getValue().getDouble() != double(0.0);
}
// operator
class ONthOperator : public OOperator
{
public:
virtual void Exec(OCodeStack&);
TYPEINFO();
protected:
virtual ORowSetValue operate(const ::std::vector<ORowSetValue>& lhs) const = 0;
};
class OBinaryOperator : public OOperator
{
public:
virtual void Exec(OCodeStack&);
TYPEINFO();
protected:
virtual ORowSetValue operate(const ORowSetValue& lhs,const ORowSetValue& rhs) const = 0;
};
class OUnaryOperator : public OOperator
{
public:
virtual void Exec(OCodeStack&);
virtual sal_uInt16 getRequestedOperands() const;
virtual ORowSetValue operate(const ORowSetValue& lhs) const = 0;
TYPEINFO();
};
}
}
#endif // _CONNECTIVITY_FILE_FCODE_HXX_