1#ifndef QUERY_H
2#define QUERY_H
3/* Query - query parsing and evaluation
4**
5** Initial version by Axel D��rfler, axeld@pinc-software.de
6** This file may be used under the terms of the OpenBeOS License.
7*/
8
9
10#include <SupportDefs.h>
11
12#include "Index.h"
13#include "Stack.h"
14#include "Chain.h"
15
16class Volume;
17class Term;
18class Equation;
19class TreeIterator;
20class Query;
21
22
23class Expression {
24	public:
25		Expression(char *expr);
26		~Expression();
27
28		status_t InitCheck();
29		const char *Position() const { return fPosition; }
30		Term *Root() const { return fTerm; }
31
32	protected:
33		Term *ParseOr(char **expr);
34		Term *ParseAnd(char **expr);
35		Term *ParseEquation(char **expr);
36
37		bool IsOperator(char **expr,char op);
38
39	private:
40		Expression(const Expression &);
41		Expression &operator=(const Expression &);
42			// no implementation
43
44		char *fPosition;
45		Term *fTerm;
46};
47
48class Query {
49	public:
50		Query(Volume *volume, Expression *expression, uint32 flags);
51		~Query();
52
53		status_t GetNextEntry(struct dirent *,size_t size);
54
55		void SetLiveMode(port_id port,int32 token);
56		void LiveUpdate(Inode *inode,const char *attribute,int32 type,const uint8 *oldKey,size_t oldLength,const uint8 *newKey,size_t newLength);
57
58		Expression *GetExpression() const { return fExpression; }
59
60	private:
61		Volume			*fVolume;
62		Expression		*fExpression;
63		Equation		*fCurrent;
64		TreeIterator	*fIterator;
65		Index			fIndex;
66		Stack<Equation *> fStack;
67
68		uint32			fFlags;
69		port_id			fPort;
70		int32			fToken;
71
72	private:
73		friend class Chain<Query>;
74		Query			*fNext;
75};
76
77#endif	/* QUERY_H */
78