haiku/headers/os/storage/Query.h
ejakowatz 52a3801208 It is accomplished ...
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10 a95241bf-73f2-0310-859d-f6bbb57e9c96
2002-07-09 12:24:59 +00:00

124 lines
2.7 KiB
C++

//----------------------------------------------------------------------
// This software is part of the OpenBeOS distribution and is covered
// by the OpenBeOS license.
//---------------------------------------------------------------------
/*!
\file Query.h
BQuery interface declaration.
*/
#ifndef _sk_query_h_
#define _sk_query_h_
#include <EntryList.h>
#include <Messenger.h>
#include <OS.h>
#include <SupportDefs.h>
#include <StorageDefs.Private.h>
class BVolume;
struct entry_ref;
namespace StorageKit {
class QueryNode;
class QueryStack;
class QueryTree;
};
typedef enum {
B_INVALID_OP = 0,
B_EQ,
B_GT,
B_GE,
B_LT,
B_LE,
B_NE,
B_CONTAINS,
B_BEGINS_WITH,
B_ENDS_WITH,
B_AND = 0x101,
B_OR,
B_NOT,
_B_RESERVED_OP_ = 0x100000
} query_op;
/*!
\class BQuery
\brief Represents a live or non-live file system query
Provides an interface for creating file system queries. Implements
the BEntryList for iterating through the found entries.
\author <a href='mailto:bonefish@users.sf.net'>Ingo Weinhold</a>
\version 0.0.0
*/
class BQuery : public BEntryList {
public:
BQuery();
virtual ~BQuery();
status_t Clear();
status_t PushAttr(const char *attrName);
status_t PushOp(query_op op);
status_t PushUInt32(uint32 value);
status_t PushInt32(int32 value);
status_t PushUInt64(uint64 value);
status_t PushInt64(int64 value);
status_t PushFloat(float value);
status_t PushDouble(double value);
status_t PushString(const char *value, bool caseInsensitive = false);
status_t PushDate(const char *date);
status_t SetVolume(const BVolume *volume);
status_t SetPredicate(const char *expression);
status_t SetTarget(BMessenger messenger);
bool IsLive() const;
status_t GetPredicate(char *buffer, size_t length);
status_t GetPredicate(BString *predicate);
size_t PredicateLength();
dev_t TargetDevice() const;
status_t Fetch();
// BEntryList interface
virtual status_t GetNextEntry(BEntry *entry, bool traverse = false);
virtual status_t GetNextRef(entry_ref *ref);
virtual int32 GetNextDirents(struct dirent *buf, size_t length,
int32 count = INT_MAX);
virtual status_t Rewind();
virtual int32 CountEntries();
private:
bool _HasFetched() const;
status_t _PushNode(StorageKit::QueryNode *node, bool deleteOnError);
status_t _SetPredicate(const char *expression);
status_t _EvaluateStack();
// FBC
virtual void _ReservedQuery1();
virtual void _ReservedQuery2();
virtual void _ReservedQuery3();
virtual void _ReservedQuery4();
virtual void _ReservedQuery5();
virtual void _ReservedQuery6();
private:
int32 _reservedData[4]; // FBC
StorageKit::QueryStack *fStack;
char *fPredicate;
dev_t fDevice;
bool fLive;
port_id fPort;
long fToken;
StorageKit::FileDescriptor fQueryFd;
};
#endif // _sk_query_h_