xref: /trunk/main/connectivity/source/inc/file/fcode.hxx (revision caf5cd79edad04a48dcaf209068b3b89eae4622e)
1*caf5cd79SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*caf5cd79SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*caf5cd79SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*caf5cd79SAndrew Rist  * distributed with this work for additional information
6*caf5cd79SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*caf5cd79SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*caf5cd79SAndrew Rist  * "License"); you may not use this file except in compliance
9*caf5cd79SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*caf5cd79SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*caf5cd79SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*caf5cd79SAndrew Rist  * software distributed under the License is distributed on an
15*caf5cd79SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*caf5cd79SAndrew Rist  * KIND, either express or implied.  See the License for the
17*caf5cd79SAndrew Rist  * specific language governing permissions and limitations
18*caf5cd79SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*caf5cd79SAndrew Rist  *************************************************************/
21*caf5cd79SAndrew Rist 
22*caf5cd79SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef _CONNECTIVITY_FILE_FCODE_HXX_
25cdf0e10cSrcweir #define _CONNECTIVITY_FILE_FCODE_HXX_
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "connectivity/sqliterator.hxx"
28cdf0e10cSrcweir #include <com/sun/star/sdbc/DataType.hpp>
29cdf0e10cSrcweir #include "connectivity/CommonTools.hxx"
30cdf0e10cSrcweir #include <tools/rtti.hxx>
31cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp>
32cdf0e10cSrcweir #include <com/sun/star/container/XIndexAccess.hpp>
33cdf0e10cSrcweir #include "connectivity/FValue.hxx"
34cdf0e10cSrcweir #include "file/filedllapi.hxx"
35cdf0e10cSrcweir 
36cdf0e10cSrcweir namespace connectivity
37cdf0e10cSrcweir {
38cdf0e10cSrcweir     class OSQLParseNode;
39cdf0e10cSrcweir     namespace dbase
40cdf0e10cSrcweir     {
41cdf0e10cSrcweir         class ODbaseIndex;
42cdf0e10cSrcweir     }
43cdf0e10cSrcweir     namespace file
44cdf0e10cSrcweir     {
45cdf0e10cSrcweir 
46cdf0e10cSrcweir         class OOperand;
47cdf0e10cSrcweir         typedef ::std::stack<OOperand*> OCodeStack;
48cdf0e10cSrcweir         class OBoolOperator;
49cdf0e10cSrcweir         typedef ::std::map<sal_Int32,sal_Int32> OEvaluateSet;
50cdf0e10cSrcweir 
51cdf0e10cSrcweir         typedef ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess> OFileColumns;
52cdf0e10cSrcweir 
53cdf0e10cSrcweir 
54cdf0e10cSrcweir         class OOO_DLLPUBLIC_FILE OCode
55cdf0e10cSrcweir         {
56cdf0e10cSrcweir         public:
57cdf0e10cSrcweir             OCode();
58cdf0e10cSrcweir             virtual ~OCode();
59cdf0e10cSrcweir 
60cdf0e10cSrcweir             inline static void * SAL_CALL operator new( size_t nSize ) SAL_THROW( () )
61cdf0e10cSrcweir                 { return ::rtl_allocateMemory( nSize ); }
62cdf0e10cSrcweir             inline static void * SAL_CALL operator new( size_t /*nSize*/,void* _pHint ) SAL_THROW( () )
63cdf0e10cSrcweir                 { return _pHint; }
64cdf0e10cSrcweir             inline static void SAL_CALL operator delete( void * pMem ) SAL_THROW( () )
65cdf0e10cSrcweir                 { ::rtl_freeMemory( pMem ); }
66cdf0e10cSrcweir             inline static void SAL_CALL operator delete( void * /*pMem*/,void* /*_pHint*/ ) SAL_THROW( () )
67cdf0e10cSrcweir                 {  }
68cdf0e10cSrcweir 
69cdf0e10cSrcweir             TYPEINFO();
70cdf0e10cSrcweir         };
71cdf0e10cSrcweir 
72cdf0e10cSrcweir 
73cdf0e10cSrcweir         // operands that the parsetree generate
74cdf0e10cSrcweir         class OOO_DLLPUBLIC_FILE OOperand : public OCode
75cdf0e10cSrcweir         {
76cdf0e10cSrcweir         protected:
77cdf0e10cSrcweir             sal_Int32 m_eDBType;
78cdf0e10cSrcweir 
79cdf0e10cSrcweir             OOperand(const sal_Int32& _rType) : m_eDBType(_rType){}
80cdf0e10cSrcweir             OOperand() : m_eDBType(::com::sun::star::sdbc::DataType::OTHER){}
81cdf0e10cSrcweir 
82cdf0e10cSrcweir         public:
83cdf0e10cSrcweir             virtual const ORowSetValue& getValue() const = 0;
84cdf0e10cSrcweir             virtual void setValue(const ORowSetValue& _rVal) = 0;
85cdf0e10cSrcweir 
86cdf0e10cSrcweir             virtual sal_Int32 getDBType() const {return m_eDBType;}
87cdf0e10cSrcweir             virtual OEvaluateSet* preProcess(OBoolOperator* pOp, OOperand* pRight = 0);
88cdf0e10cSrcweir             inline sal_Bool isValid() const;
89cdf0e10cSrcweir 
90cdf0e10cSrcweir             TYPEINFO();
91cdf0e10cSrcweir         };
92cdf0e10cSrcweir 
93cdf0e10cSrcweir         class OOO_DLLPUBLIC_FILE OOperandRow : public OOperand
94cdf0e10cSrcweir         {
95cdf0e10cSrcweir             sal_uInt16  m_nRowPos;
96cdf0e10cSrcweir         protected:
97cdf0e10cSrcweir             OValueRefRow    m_pRow;
98cdf0e10cSrcweir 
99cdf0e10cSrcweir             OOperandRow(sal_uInt16 _nPos, sal_Int32 _rType);
100cdf0e10cSrcweir         public:
101cdf0e10cSrcweir             sal_uInt16 getRowPos() const {return m_nRowPos;}
102cdf0e10cSrcweir             virtual const ORowSetValue& getValue() const;
103cdf0e10cSrcweir             virtual void setValue(const ORowSetValue& _rVal);
104cdf0e10cSrcweir             void bindValue(const OValueRefRow& _pRow);                      // Bindung an den Wert, den der Operand repraesentiert
105cdf0e10cSrcweir 
106cdf0e10cSrcweir             TYPEINFO();
107cdf0e10cSrcweir         };
108cdf0e10cSrcweir 
109cdf0e10cSrcweir         // Attribute aus einer Ergebniszeile
110cdf0e10cSrcweir         class OOO_DLLPUBLIC_FILE OOperandAttr : public OOperandRow
111cdf0e10cSrcweir         {
112cdf0e10cSrcweir         protected:
113cdf0e10cSrcweir             ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> m_xColumn;
114cdf0e10cSrcweir 
115cdf0e10cSrcweir         public:
116cdf0e10cSrcweir             OOperandAttr(sal_uInt16 _nPos,
117cdf0e10cSrcweir                          const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xColumn);
118cdf0e10cSrcweir 
119cdf0e10cSrcweir             virtual sal_Bool isIndexed() const;
120cdf0e10cSrcweir             virtual OEvaluateSet* preProcess(OBoolOperator* pOp, OOperand* pRight = 0);
121cdf0e10cSrcweir             TYPEINFO();
122cdf0e10cSrcweir         };
123cdf0e10cSrcweir 
124cdf0e10cSrcweir         // Parameter fuer ein Praedikat
125cdf0e10cSrcweir         class OOperandParam : public OOperandRow
126cdf0e10cSrcweir         {
127cdf0e10cSrcweir         public:
128cdf0e10cSrcweir             OOperandParam(connectivity::OSQLParseNode* pNode, sal_Int32 _nPos);
129cdf0e10cSrcweir             void describe(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xColumn, ::vos::ORef<connectivity::OSQLColumns> _xParamColumns);
130cdf0e10cSrcweir 
131cdf0e10cSrcweir             TYPEINFO();
132cdf0e10cSrcweir         };
133cdf0e10cSrcweir 
134cdf0e10cSrcweir         // WerteOperanden
135cdf0e10cSrcweir         class OOperandValue : public OOperand
136cdf0e10cSrcweir         {
137cdf0e10cSrcweir         protected:
138cdf0e10cSrcweir             ORowSetValue m_aValue;
139cdf0e10cSrcweir 
140cdf0e10cSrcweir         protected:
141cdf0e10cSrcweir             OOperandValue(){}
142cdf0e10cSrcweir             OOperandValue(const ORowSetValue& _rVar, sal_Int32 eDbType)
143cdf0e10cSrcweir                 : OOperand(eDbType)
144cdf0e10cSrcweir                 , m_aValue(_rVar)
145cdf0e10cSrcweir             {}
146cdf0e10cSrcweir 
147cdf0e10cSrcweir             OOperandValue(sal_Int32 eDbType) :OOperand(eDbType){}
148cdf0e10cSrcweir         public:
149cdf0e10cSrcweir             virtual const ORowSetValue& getValue() const;
150cdf0e10cSrcweir             virtual void setValue(const ORowSetValue& _rVal);
151cdf0e10cSrcweir 
152cdf0e10cSrcweir             TYPEINFO();
153cdf0e10cSrcweir         };
154cdf0e10cSrcweir 
155cdf0e10cSrcweir 
156cdf0e10cSrcweir         // Konstanten
157cdf0e10cSrcweir         class OOperandConst : public OOperandValue
158cdf0e10cSrcweir         {
159cdf0e10cSrcweir         public:
160cdf0e10cSrcweir             OOperandConst(const connectivity::OSQLParseNode& rColumnRef, const rtl::OUString& aStrValue);
161cdf0e10cSrcweir 
162cdf0e10cSrcweir             TYPEINFO();
163cdf0e10cSrcweir         };
164cdf0e10cSrcweir 
165cdf0e10cSrcweir 
166cdf0e10cSrcweir         // Ergebnis Operanden
167cdf0e10cSrcweir         class OOperandResult : public OOperandValue
168cdf0e10cSrcweir         {
169cdf0e10cSrcweir         protected:
170cdf0e10cSrcweir             OOperandResult(const ORowSetValue& _rVar, sal_Int32 eDbType)
171cdf0e10cSrcweir                             :OOperandValue(_rVar, eDbType) {}
172cdf0e10cSrcweir             OOperandResult(sal_Int32 eDbType)
173cdf0e10cSrcweir                             :OOperandValue(eDbType) {}
174cdf0e10cSrcweir         public:
175cdf0e10cSrcweir             OOperandResult(const ORowSetValue& _rVar)
176cdf0e10cSrcweir                             :OOperandValue(_rVar, _rVar.getTypeKind()) {}
177cdf0e10cSrcweir             TYPEINFO();
178cdf0e10cSrcweir         };
179cdf0e10cSrcweir 
180cdf0e10cSrcweir 
181cdf0e10cSrcweir         class OOperandResultBOOL : public OOperandResult
182cdf0e10cSrcweir         {
183cdf0e10cSrcweir         public:
184cdf0e10cSrcweir             OOperandResultBOOL(sal_Bool bResult) : OOperandResult(::com::sun::star::sdbc::DataType::BIT)
185cdf0e10cSrcweir             {
186cdf0e10cSrcweir                 m_aValue = bResult ? 1.0 : 0.0;
187cdf0e10cSrcweir                 m_aValue.setBound(sal_True);
188cdf0e10cSrcweir             }
189cdf0e10cSrcweir         };
190cdf0e10cSrcweir 
191cdf0e10cSrcweir         class OOperandResultNUM : public OOperandResult
192cdf0e10cSrcweir         {
193cdf0e10cSrcweir         public:
194cdf0e10cSrcweir             OOperandResultNUM(double fNum) : OOperandResult(::com::sun::star::sdbc::DataType::DOUBLE)
195cdf0e10cSrcweir             {
196cdf0e10cSrcweir                 m_aValue = fNum;
197cdf0e10cSrcweir                 m_aValue.setBound(sal_True);
198cdf0e10cSrcweir             }
199cdf0e10cSrcweir         };
200cdf0e10cSrcweir 
201cdf0e10cSrcweir         /** special stop operand
202cdf0e10cSrcweir             is appended when a list of arguments ends
203cdf0e10cSrcweir         */
204cdf0e10cSrcweir         class OStopOperand : public OOperandValue
205cdf0e10cSrcweir         {
206cdf0e10cSrcweir         public:
207cdf0e10cSrcweir             OStopOperand(){}
208cdf0e10cSrcweir             TYPEINFO();
209cdf0e10cSrcweir         };
210cdf0e10cSrcweir 
211cdf0e10cSrcweir         // Operatoren
212cdf0e10cSrcweir         class OOO_DLLPUBLIC_FILE OOperator : public OCode
213cdf0e10cSrcweir         {
214cdf0e10cSrcweir         public:
215cdf0e10cSrcweir             virtual void Exec(OCodeStack&) = 0;
216cdf0e10cSrcweir             virtual sal_uInt16 getRequestedOperands() const;    // Anzahl benoetigter Operanden
217cdf0e10cSrcweir                                                                 // Standard ist 2
218cdf0e10cSrcweir             TYPEINFO();
219cdf0e10cSrcweir         };
220cdf0e10cSrcweir 
221cdf0e10cSrcweir 
222cdf0e10cSrcweir         // boolsche Operatoren
223cdf0e10cSrcweir 
224cdf0e10cSrcweir         class OOO_DLLPUBLIC_FILE OBoolOperator : public OOperator
225cdf0e10cSrcweir         {
226cdf0e10cSrcweir         public:
227cdf0e10cSrcweir             TYPEINFO();
228cdf0e10cSrcweir             virtual void Exec(OCodeStack&);
229cdf0e10cSrcweir             virtual sal_Bool operate(const OOperand*, const OOperand*) const;
230cdf0e10cSrcweir         };
231cdf0e10cSrcweir 
232cdf0e10cSrcweir         class OOp_NOT : public OBoolOperator
233cdf0e10cSrcweir         {
234cdf0e10cSrcweir         public:
235cdf0e10cSrcweir             TYPEINFO();
236cdf0e10cSrcweir 
237cdf0e10cSrcweir         protected:
238cdf0e10cSrcweir             virtual void Exec(OCodeStack&);
239cdf0e10cSrcweir             virtual sal_Bool operate(const OOperand*, const OOperand* = NULL) const;
240cdf0e10cSrcweir             virtual sal_uInt16 getRequestedOperands() const;
241cdf0e10cSrcweir         };
242cdf0e10cSrcweir 
243cdf0e10cSrcweir         class OOp_AND : public OBoolOperator
244cdf0e10cSrcweir         {
245cdf0e10cSrcweir         public:
246cdf0e10cSrcweir             TYPEINFO();
247cdf0e10cSrcweir 
248cdf0e10cSrcweir         protected:
249cdf0e10cSrcweir             virtual sal_Bool operate(const OOperand*, const OOperand*) const;
250cdf0e10cSrcweir         };
251cdf0e10cSrcweir 
252cdf0e10cSrcweir         class OOp_OR : public OBoolOperator
253cdf0e10cSrcweir         {
254cdf0e10cSrcweir         public:
255cdf0e10cSrcweir             TYPEINFO();
256cdf0e10cSrcweir         protected:
257cdf0e10cSrcweir             virtual sal_Bool operate(const OOperand*, const OOperand*) const;
258cdf0e10cSrcweir         };
259cdf0e10cSrcweir 
260cdf0e10cSrcweir         class OOO_DLLPUBLIC_FILE OOp_ISNULL : public OBoolOperator
261cdf0e10cSrcweir         {
262cdf0e10cSrcweir         public:
263cdf0e10cSrcweir             TYPEINFO();
264cdf0e10cSrcweir         public:
265cdf0e10cSrcweir             virtual void Exec(OCodeStack&);
266cdf0e10cSrcweir             virtual sal_uInt16 getRequestedOperands() const;
267cdf0e10cSrcweir             virtual sal_Bool operate(const OOperand*, const OOperand* = NULL) const;
268cdf0e10cSrcweir         };
269cdf0e10cSrcweir 
270cdf0e10cSrcweir         class OOO_DLLPUBLIC_FILE OOp_ISNOTNULL : public OOp_ISNULL
271cdf0e10cSrcweir         {
272cdf0e10cSrcweir         public:
273cdf0e10cSrcweir             TYPEINFO();
274cdf0e10cSrcweir             virtual sal_Bool operate(const OOperand*, const OOperand* = NULL) const;
275cdf0e10cSrcweir         };
276cdf0e10cSrcweir 
277cdf0e10cSrcweir         class OOO_DLLPUBLIC_FILE OOp_LIKE : public OBoolOperator
278cdf0e10cSrcweir         {
279cdf0e10cSrcweir         public:
280cdf0e10cSrcweir             TYPEINFO();
281cdf0e10cSrcweir         protected:
282cdf0e10cSrcweir             const sal_Unicode cEscape;
283cdf0e10cSrcweir 
284cdf0e10cSrcweir         public:
285cdf0e10cSrcweir             OOp_LIKE(const sal_Unicode cEsc = L'\0'):cEscape(cEsc){};
286cdf0e10cSrcweir 
287cdf0e10cSrcweir             virtual sal_Bool operate(const OOperand*, const OOperand*) const;
288cdf0e10cSrcweir         };
289cdf0e10cSrcweir 
290cdf0e10cSrcweir         class OOp_NOTLIKE : public OOp_LIKE
291cdf0e10cSrcweir         {
292cdf0e10cSrcweir         public:
293cdf0e10cSrcweir             TYPEINFO();
294cdf0e10cSrcweir         public:
295cdf0e10cSrcweir             OOp_NOTLIKE(const sal_Unicode cEsc = L'\0'):OOp_LIKE(cEsc){};
296cdf0e10cSrcweir 
297cdf0e10cSrcweir             virtual sal_Bool operate(const OOperand*, const OOperand*) const;
298cdf0e10cSrcweir         };
299cdf0e10cSrcweir 
300cdf0e10cSrcweir         class OOO_DLLPUBLIC_FILE OOp_COMPARE : public OBoolOperator
301cdf0e10cSrcweir         {
302cdf0e10cSrcweir             sal_Int32 aPredicateType;
303cdf0e10cSrcweir 
304cdf0e10cSrcweir         public:
305cdf0e10cSrcweir             TYPEINFO();
306cdf0e10cSrcweir             OOp_COMPARE(sal_Int32 aPType)
307cdf0e10cSrcweir                          :aPredicateType(aPType) {}
308cdf0e10cSrcweir 
309cdf0e10cSrcweir             inline sal_Int32 getPredicateType() const { return aPredicateType; }
310cdf0e10cSrcweir             virtual sal_Bool operate(const OOperand*, const OOperand*) const;
311cdf0e10cSrcweir         };
312cdf0e10cSrcweir 
313cdf0e10cSrcweir         // numerische Operatoren
314cdf0e10cSrcweir 
315cdf0e10cSrcweir         class ONumOperator : public OOperator
316cdf0e10cSrcweir         {
317cdf0e10cSrcweir         public:
318cdf0e10cSrcweir             virtual void Exec(OCodeStack&);
319cdf0e10cSrcweir 
320cdf0e10cSrcweir             TYPEINFO();
321cdf0e10cSrcweir 
322cdf0e10cSrcweir         protected:
323cdf0e10cSrcweir             virtual double operate(const double& fLeft,const double& fRight) const = 0;
324cdf0e10cSrcweir         };
325cdf0e10cSrcweir 
326cdf0e10cSrcweir         class OOp_ADD : public ONumOperator
327cdf0e10cSrcweir         {
328cdf0e10cSrcweir         protected:
329cdf0e10cSrcweir             virtual double operate(const double& fLeft,const double& fRight) const;
330cdf0e10cSrcweir         };
331cdf0e10cSrcweir 
332cdf0e10cSrcweir         class OOp_SUB : public ONumOperator
333cdf0e10cSrcweir         {
334cdf0e10cSrcweir         protected:
335cdf0e10cSrcweir             virtual double operate(const double& fLeft,const double& fRight) const;
336cdf0e10cSrcweir         };
337cdf0e10cSrcweir 
338cdf0e10cSrcweir         class OOp_MUL : public ONumOperator
339cdf0e10cSrcweir         {
340cdf0e10cSrcweir         protected:
341cdf0e10cSrcweir             virtual double operate(const double& fLeft,const double& fRight) const;
342cdf0e10cSrcweir         };
343cdf0e10cSrcweir 
344cdf0e10cSrcweir         class OOp_DIV : public ONumOperator
345cdf0e10cSrcweir         {
346cdf0e10cSrcweir         protected:
347cdf0e10cSrcweir             virtual double operate(const double& fLeft,const double& fRight) const;
348cdf0e10cSrcweir         };
349cdf0e10cSrcweir 
350cdf0e10cSrcweir         inline sal_Bool OOperand::isValid() const
351cdf0e10cSrcweir         {
352cdf0e10cSrcweir             return getValue().getDouble() != double(0.0);
353cdf0e10cSrcweir         }
354cdf0e10cSrcweir 
355cdf0e10cSrcweir         // operator
356cdf0e10cSrcweir         class ONthOperator : public OOperator
357cdf0e10cSrcweir         {
358cdf0e10cSrcweir         public:
359cdf0e10cSrcweir             virtual void Exec(OCodeStack&);
360cdf0e10cSrcweir 
361cdf0e10cSrcweir             TYPEINFO();
362cdf0e10cSrcweir 
363cdf0e10cSrcweir         protected:
364cdf0e10cSrcweir             virtual ORowSetValue operate(const ::std::vector<ORowSetValue>& lhs) const = 0;
365cdf0e10cSrcweir         };
366cdf0e10cSrcweir 
367cdf0e10cSrcweir         class OBinaryOperator : public OOperator
368cdf0e10cSrcweir         {
369cdf0e10cSrcweir         public:
370cdf0e10cSrcweir             virtual void Exec(OCodeStack&);
371cdf0e10cSrcweir 
372cdf0e10cSrcweir             TYPEINFO();
373cdf0e10cSrcweir 
374cdf0e10cSrcweir         protected:
375cdf0e10cSrcweir             virtual ORowSetValue operate(const ORowSetValue& lhs,const ORowSetValue& rhs) const = 0;
376cdf0e10cSrcweir         };
377cdf0e10cSrcweir 
378cdf0e10cSrcweir         class OUnaryOperator : public OOperator
379cdf0e10cSrcweir         {
380cdf0e10cSrcweir         public:
381cdf0e10cSrcweir             virtual void Exec(OCodeStack&);
382cdf0e10cSrcweir             virtual sal_uInt16 getRequestedOperands() const;
383cdf0e10cSrcweir             virtual ORowSetValue operate(const ORowSetValue& lhs) const = 0;
384cdf0e10cSrcweir 
385cdf0e10cSrcweir             TYPEINFO();
386cdf0e10cSrcweir 
387cdf0e10cSrcweir         };
388cdf0e10cSrcweir     }
389cdf0e10cSrcweir }
390cdf0e10cSrcweir 
391cdf0e10cSrcweir #endif // _CONNECTIVITY_FILE_FCODE_HXX_
392cdf0e10cSrcweir 
393