Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #ifndef INCLUDED_CONNECTIVITY_SOURCE_INC_FILE_FCODE_HXX
21 : #define INCLUDED_CONNECTIVITY_SOURCE_INC_FILE_FCODE_HXX
22 :
23 : #include <connectivity/sqliterator.hxx>
24 : #include <com/sun/star/sdbc/DataType.hpp>
25 : #include <connectivity/CommonTools.hxx>
26 : #include <tools/rtti.hxx>
27 : #include <com/sun/star/container/XNameAccess.hpp>
28 : #include <com/sun/star/container/XIndexAccess.hpp>
29 : #include <connectivity/FValue.hxx>
30 : #include "file/filedllapi.hxx"
31 :
32 : namespace connectivity
33 : {
34 : class OSQLParseNode;
35 : namespace file
36 : {
37 :
38 : class OOperand;
39 : typedef ::std::stack<OOperand*> OCodeStack;
40 : class OBoolOperator;
41 : typedef ::std::map<sal_Int32,sal_Int32> OEvaluateSet;
42 :
43 : typedef ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess> OFileColumns;
44 :
45 :
46 : class OOO_DLLPUBLIC_FILE OCode
47 : {
48 : public:
49 : OCode();
50 : virtual ~OCode();
51 :
52 135 : inline static void * SAL_CALL operator new( size_t nSize )
53 135 : { return ::rtl_allocateMemory( nSize ); }
54 : inline static void * SAL_CALL operator new( size_t /*nSize*/,void* _pHint )
55 : { return _pHint; }
56 135 : inline static void SAL_CALL operator delete( void * pMem )
57 135 : { ::rtl_freeMemory( pMem ); }
58 : inline static void SAL_CALL operator delete( void * /*pMem*/,void* /*_pHint*/ )
59 : { }
60 :
61 : TYPEINFO();
62 : };
63 :
64 :
65 : // operands that the parsetree generate
66 94 : class OOO_DLLPUBLIC_FILE OOperand : public OCode
67 : {
68 : protected:
69 : sal_Int32 m_eDBType;
70 :
71 34 : OOperand(const sal_Int32& _rType) : m_eDBType(_rType){}
72 60 : OOperand() : m_eDBType(::com::sun::star::sdbc::DataType::OTHER){}
73 :
74 : public:
75 : virtual const ORowSetValue& getValue() const = 0;
76 : virtual void setValue(const ORowSetValue& _rVal) = 0;
77 :
78 12 : sal_Int32 getDBType() const {return m_eDBType;}
79 : virtual OEvaluateSet* preProcess(OBoolOperator* pOp, OOperand* pRight = 0);
80 : inline bool isValid() const;
81 :
82 : TYPEINFO_OVERRIDE();
83 : };
84 :
85 16 : class OOO_DLLPUBLIC_FILE OOperandRow : public OOperand
86 : {
87 : sal_uInt16 m_nRowPos;
88 : protected:
89 : OValueRefRow m_pRow;
90 :
91 : OOperandRow(sal_uInt16 _nPos, sal_Int32 _rType);
92 : public:
93 : sal_uInt16 getRowPos() const {return m_nRowPos;}
94 : virtual const ORowSetValue& getValue() const SAL_OVERRIDE;
95 : virtual void setValue(const ORowSetValue& _rVal) SAL_OVERRIDE;
96 : void bindValue(const OValueRefRow& _pRow); // Bind to the value that the operand represents
97 :
98 : TYPEINFO_OVERRIDE();
99 : };
100 :
101 : // Attributes from a result row
102 16 : class OOO_DLLPUBLIC_FILE OOperandAttr : public OOperandRow
103 : {
104 : protected:
105 : ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> m_xColumn;
106 :
107 : public:
108 : OOperandAttr(sal_uInt16 _nPos,
109 : const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xColumn);
110 :
111 : virtual OEvaluateSet* preProcess(OBoolOperator* pOp, OOperand* pRight = 0) SAL_OVERRIDE;
112 : TYPEINFO_OVERRIDE();
113 : };
114 :
115 : // Parameter for a predicate
116 16 : class OOperandParam : public OOperandRow
117 : {
118 : public:
119 : OOperandParam(connectivity::OSQLParseNode* pNode, sal_Int32 _nPos);
120 : TYPEINFO_OVERRIDE();
121 : };
122 :
123 : // Value operands
124 78 : class OOperandValue : public OOperand
125 : {
126 : protected:
127 : ORowSetValue m_aValue;
128 :
129 : protected:
130 60 : OOperandValue(){}
131 0 : OOperandValue(const ORowSetValue& _rVar, sal_Int32 eDbType)
132 : : OOperand(eDbType)
133 0 : , m_aValue(_rVar)
134 0 : {}
135 :
136 18 : OOperandValue(sal_Int32 eDbType) :OOperand(eDbType){}
137 : public:
138 : virtual const ORowSetValue& getValue() const SAL_OVERRIDE;
139 : virtual void setValue(const ORowSetValue& _rVal) SAL_OVERRIDE;
140 :
141 : TYPEINFO_OVERRIDE();
142 : };
143 :
144 :
145 : // Constants
146 120 : class OOperandConst : public OOperandValue
147 : {
148 : public:
149 : OOperandConst(const connectivity::OSQLParseNode& rColumnRef, const OUString& aStrValue);
150 :
151 : TYPEINFO_OVERRIDE();
152 : };
153 :
154 :
155 : // Result operands
156 18 : class OOperandResult : public OOperandValue
157 : {
158 : protected:
159 : OOperandResult(const ORowSetValue& _rVar, sal_Int32 eDbType)
160 : :OOperandValue(_rVar, eDbType) {}
161 18 : OOperandResult(sal_Int32 eDbType)
162 18 : :OOperandValue(eDbType) {}
163 : public:
164 0 : OOperandResult(const ORowSetValue& _rVar)
165 0 : :OOperandValue(_rVar, _rVar.getTypeKind()) {}
166 : TYPEINFO_OVERRIDE();
167 : };
168 :
169 :
170 36 : class OOperandResultBOOL : public OOperandResult
171 : {
172 : public:
173 18 : OOperandResultBOOL(bool bResult) : OOperandResult(::com::sun::star::sdbc::DataType::BIT)
174 : {
175 18 : m_aValue = bResult ? 1.0 : 0.0;
176 18 : m_aValue.setBound(true);
177 18 : }
178 : };
179 :
180 0 : class OOperandResultNUM : public OOperandResult
181 : {
182 : public:
183 0 : OOperandResultNUM(double fNum) : OOperandResult(::com::sun::star::sdbc::DataType::DOUBLE)
184 : {
185 0 : m_aValue = fNum;
186 0 : m_aValue.setBound(true);
187 0 : }
188 : };
189 :
190 : /** special stop operand
191 : is appended when a list of arguments ends
192 : */
193 0 : class OStopOperand : public OOperandValue
194 : {
195 : public:
196 0 : OStopOperand(){}
197 : TYPEINFO_OVERRIDE();
198 : };
199 :
200 : // Operators
201 82 : class OOO_DLLPUBLIC_FILE OOperator : public OCode
202 : {
203 : public:
204 : virtual void Exec(OCodeStack&) = 0;
205 : virtual sal_uInt16 getRequestedOperands() const; // Count of requested operands
206 : // Defaults to 2
207 : TYPEINFO_OVERRIDE();
208 : };
209 :
210 :
211 : // Boolean operators
212 82 : class OOO_DLLPUBLIC_FILE OBoolOperator : public OOperator
213 : {
214 : public:
215 : TYPEINFO_OVERRIDE();
216 : virtual void Exec(OCodeStack&) SAL_OVERRIDE;
217 : virtual bool operate(const OOperand*, const OOperand*) const;
218 : };
219 :
220 0 : class OOp_NOT : public OBoolOperator
221 : {
222 : public:
223 : TYPEINFO_OVERRIDE();
224 :
225 : protected:
226 : virtual void Exec(OCodeStack&) SAL_OVERRIDE;
227 : virtual bool operate(const OOperand*, const OOperand* = NULL) const SAL_OVERRIDE;
228 : virtual sal_uInt16 getRequestedOperands() const SAL_OVERRIDE;
229 : };
230 :
231 9 : class OOp_AND : public OBoolOperator
232 : {
233 : public:
234 : TYPEINFO_OVERRIDE();
235 :
236 : protected:
237 : virtual bool operate(const OOperand*, const OOperand*) const SAL_OVERRIDE;
238 : };
239 :
240 0 : class OOp_OR : public OBoolOperator
241 : {
242 : public:
243 : TYPEINFO_OVERRIDE();
244 : protected:
245 : virtual bool operate(const OOperand*, const OOperand*) const SAL_OVERRIDE;
246 : };
247 :
248 0 : class OOO_DLLPUBLIC_FILE OOp_ISNULL : public OBoolOperator
249 : {
250 : public:
251 : TYPEINFO_OVERRIDE();
252 : public:
253 : virtual void Exec(OCodeStack&) SAL_OVERRIDE;
254 : virtual sal_uInt16 getRequestedOperands() const SAL_OVERRIDE;
255 : virtual bool operate(const OOperand*, const OOperand* = NULL) const SAL_OVERRIDE;
256 : };
257 :
258 0 : class OOO_DLLPUBLIC_FILE OOp_ISNOTNULL : public OOp_ISNULL
259 : {
260 : public:
261 : TYPEINFO_OVERRIDE();
262 : virtual bool operate(const OOperand*, const OOperand* = NULL) const SAL_OVERRIDE;
263 : };
264 :
265 0 : class OOO_DLLPUBLIC_FILE OOp_LIKE : public OBoolOperator
266 : {
267 : public:
268 : TYPEINFO_OVERRIDE();
269 : protected:
270 : const sal_Unicode cEscape;
271 :
272 : public:
273 0 : OOp_LIKE(const sal_Unicode cEsc = L'\0'):cEscape(cEsc){};
274 :
275 : virtual bool operate(const OOperand*, const OOperand*) const SAL_OVERRIDE;
276 : };
277 :
278 0 : class OOp_NOTLIKE : public OOp_LIKE
279 : {
280 : public:
281 : TYPEINFO_OVERRIDE();
282 : public:
283 0 : OOp_NOTLIKE(const sal_Unicode cEsc = L'\0'):OOp_LIKE(cEsc){};
284 :
285 : virtual bool operate(const OOperand*, const OOperand*) const SAL_OVERRIDE;
286 : };
287 :
288 76 : class OOO_DLLPUBLIC_FILE OOp_COMPARE : public OBoolOperator
289 : {
290 : sal_Int32 aPredicateType;
291 :
292 : public:
293 : TYPEINFO_OVERRIDE();
294 38 : OOp_COMPARE(sal_Int32 aPType)
295 38 : :aPredicateType(aPType) {}
296 :
297 0 : inline sal_Int32 getPredicateType() const { return aPredicateType; }
298 : virtual bool operate(const OOperand*, const OOperand*) const SAL_OVERRIDE;
299 : };
300 :
301 : // Numerical operators
302 0 : class ONumOperator : public OOperator
303 : {
304 : public:
305 : virtual void Exec(OCodeStack&) SAL_OVERRIDE;
306 :
307 : TYPEINFO_OVERRIDE();
308 :
309 : protected:
310 : virtual double operate(const double& fLeft,const double& fRight) const = 0;
311 : };
312 :
313 0 : class OOp_ADD : public ONumOperator
314 : {
315 : protected:
316 : virtual double operate(const double& fLeft,const double& fRight) const SAL_OVERRIDE;
317 : };
318 :
319 0 : class OOp_SUB : public ONumOperator
320 : {
321 : protected:
322 : virtual double operate(const double& fLeft,const double& fRight) const SAL_OVERRIDE;
323 : };
324 :
325 0 : class OOp_MUL : public ONumOperator
326 : {
327 : protected:
328 : virtual double operate(const double& fLeft,const double& fRight) const SAL_OVERRIDE;
329 : };
330 :
331 0 : class OOp_DIV : public ONumOperator
332 : {
333 : protected:
334 : virtual double operate(const double& fLeft,const double& fRight) const SAL_OVERRIDE;
335 : };
336 :
337 18 : inline bool OOperand::isValid() const
338 : {
339 18 : return getValue().getDouble() != double(0.0);
340 : }
341 :
342 : // Operator
343 0 : class ONthOperator : public OOperator
344 : {
345 : public:
346 : virtual void Exec(OCodeStack&) SAL_OVERRIDE;
347 :
348 : TYPEINFO_OVERRIDE();
349 :
350 : protected:
351 : virtual ORowSetValue operate(const ::std::vector<ORowSetValue>& lhs) const = 0;
352 : };
353 :
354 0 : class OBinaryOperator : public OOperator
355 : {
356 : public:
357 : virtual void Exec(OCodeStack&) SAL_OVERRIDE;
358 :
359 : TYPEINFO_OVERRIDE();
360 :
361 : protected:
362 : virtual ORowSetValue operate(const ORowSetValue& lhs,const ORowSetValue& rhs) const = 0;
363 : };
364 :
365 0 : class OUnaryOperator : public OOperator
366 : {
367 : public:
368 : virtual void Exec(OCodeStack&) SAL_OVERRIDE;
369 : virtual sal_uInt16 getRequestedOperands() const SAL_OVERRIDE;
370 : virtual ORowSetValue operate(const ORowSetValue& lhs) const = 0;
371 :
372 : TYPEINFO_OVERRIDE();
373 :
374 : };
375 : }
376 : }
377 :
378 : #endif // INCLUDED_CONNECTIVITY_SOURCE_INC_FILE_FCODE_HXX
379 :
380 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|