haiku/headers/os/storage/Query.h
Axel Dörfler b8e5a675e5 * Implemented missing date parsing; queries like "last_modified > %-5 minutes%"
are now working as they should.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31711 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-07-23 10:05:20 +00:00

124 lines
2.7 KiB
C++

/*
* Copyright 2002-2009, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _QUERY_H
#define _QUERY_H
#include <EntryList.h>
#include <Messenger.h>
#include <OS.h>
class BVolume;
struct entry_ref;
namespace BPrivate {
namespace Storage {
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* buffer, size_t length,
int32 count = INT_MAX);
virtual status_t Rewind();
virtual int32 CountEntries();
private:
bool _HasFetched() const;
status_t _PushNode(BPrivate::Storage::QueryNode* node,
bool deleteOnError);
status_t _SetPredicate(const char* expression);
status_t _EvaluateStack();
void _ParseDates(BString& parsedPredicate);
// FBC
virtual void _QwertyQuery1();
virtual void _QwertyQuery2();
virtual void _QwertyQuery3();
virtual void _QwertyQuery4();
virtual void _QwertyQuery5();
virtual void _QwertyQuery6();
private:
BPrivate::Storage::QueryStack* fStack;
char* fPredicate;
dev_t fDevice;
bool fLive;
port_id fPort;
long fToken;
int fQueryFd;
int32 _reservedData[4];
};
#endif // _QUERY_H