xref: /haiku/headers/os/storage/Query.h (revision 922e7ba1f3228e6f28db69b0ded8f86eb32dea17)
1 /*
2  * Copyright 2002-2009, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _QUERY_H
6 #define _QUERY_H
7 
8 
9 #include <EntryList.h>
10 #include <Messenger.h>
11 #include <OS.h>
12 
13 class BVolume;
14 struct entry_ref;
15 
16 
17 namespace BPrivate {
18 	namespace Storage {
19 		class QueryNode;
20 		class QueryStack;
21 		class QueryTree;
22 	};
23 };
24 
25 typedef enum {
26 	B_INVALID_OP	= 0,
27 	B_EQ,
28 	B_GT,
29 	B_GE,
30 	B_LT,
31 	B_LE,
32 	B_NE,
33 	B_CONTAINS,
34 	B_BEGINS_WITH,
35 	B_ENDS_WITH,
36 	B_AND			= 0x101,
37 	B_OR,
38 	B_NOT,
39 	_B_RESERVED_OP_	= 0x100000
40 } query_op;
41 
42 
43 /*!
44 	\class BQuery
45 	\brief Represents a live or non-live file system query
46 
47 	Provides an interface for creating file system queries. Implements
48 	the BEntryList for iterating through the found entries.
49 
50 	\author <a href='mailto:bonefish@users.sf.net'>Ingo Weinhold</a>
51 
52 	\version 0.0.0
53 */
54 class BQuery : public BEntryList {
55 public:
56 							BQuery();
57 	virtual					~BQuery();
58 
59 			status_t		Clear();
60 
61 			status_t		PushAttr(const char* attrName);
62 			status_t		PushOp(query_op op);
63 
64 			status_t		PushUInt32(uint32 value);
65 			status_t		PushInt32(int32 value);
66 			status_t		PushUInt64(uint64 value);
67 			status_t		PushInt64(int64 value);
68 			status_t		PushFloat(float value);
69 			status_t		PushDouble(double value);
70 			status_t		PushString(const char* value,
71 								bool caseInsensitive = false);
72 			status_t		PushDate(const char* date);
73 
74 			status_t		SetVolume(const BVolume* volume);
75 			status_t		SetPredicate(const char* expression);
76 			status_t		SetTarget(BMessenger messenger);
77 
78 			bool			IsLive() const;
79 
80 			status_t		GetPredicate(char* buffer, size_t length);
81 			status_t		GetPredicate(BString* predicate);
82 			size_t			PredicateLength();
83 
84 			dev_t			TargetDevice() const;
85 
86 			status_t		Fetch();
87 
88 	// BEntryList interface
89 	virtual	status_t		GetNextEntry(BEntry* entry, bool traverse = false);
90 	virtual	status_t		GetNextRef(entry_ref* ref);
91 	virtual	int32			GetNextDirents(struct dirent* buffer, size_t length,
92 								 int32 count = INT_MAX);
93 	virtual	status_t		Rewind();
94 	virtual	int32			CountEntries();
95 
96 private:
97 			bool			_HasFetched() const;
98 			status_t		_PushNode(BPrivate::Storage::QueryNode* node,
99 								bool deleteOnError);
100 			status_t		_SetPredicate(const char* expression);
101 			status_t		_EvaluateStack();
102 			void			_ParseDates(BString& parsedPredicate);
103 
104 	// FBC
105 	virtual	void			_QwertyQuery1();
106 	virtual	void			_QwertyQuery2();
107 	virtual	void			_QwertyQuery3();
108 	virtual	void			_QwertyQuery4();
109 	virtual	void			_QwertyQuery5();
110 	virtual	void			_QwertyQuery6();
111 
112 private:
113 			BPrivate::Storage::QueryStack* fStack;
114 			char*			fPredicate;
115 			dev_t			fDevice;
116 			bool			fLive;
117 			port_id			fPort;
118 			long			fToken;
119 			int				fQueryFd;
120 			int32			_reservedData[4];
121 };
122 
123 #endif	// _QUERY_H
124