Aligned Query.h/cpp with the BFS (Haiku) versions r20186. Updated Stack.h

to <util/Stack.h>.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20187 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2007-02-20 21:30:27 +00:00
parent 301d9851fe
commit 72d71bc8dc
3 changed files with 84 additions and 73 deletions
@@ -1,27 +1,23 @@
/* Query - query parsing and evaluation
**
** Initial version by Axel Dörfler, [email protected]
** The pattern matching is roughly based on code originally written
** by J. Kercheval, and on code written by Kenneth Almquist, though
** it shares no code.
**
** This file may be used under the terms of the OpenBeOS License.
*/
*
* The pattern matching is roughly based on code originally written
* by J. Kercheval, and on code written by Kenneth Almquist, though
* it shares no code.
*
* Copyright 2001-2006, Axel Dörfler, [email protected].
* This file may be used under the terms of the MIT License.
*/
// Adjusted by Ingo Weinhold <[email protected]> for usage in RAM FS.
#include "Query.h"
//#include "bfs.h"
#include "Debug.h"
#include "Directory.h"
#include "Entry.h"
#include "Misc.h"
#include "Node.h"
#include "Stack.h"
#include "Volume.h"
//#include "Inode.h"
//#include "BPlusTree.h"
#include "Index.h"
#include <SupportDefs.h>
@@ -34,12 +30,6 @@
#include <string.h>
// IndexWrapper
// constructor
@@ -1196,15 +1186,7 @@ Equation::GetNextMatching(Volume *volume, IndexIterator *iterator,
// TODO: Check the buffer size.
strncpy(dirent->d_name, entry->GetName(), B_FILE_NAME_LENGTH);
dirent->d_name[B_FILE_NAME_LENGTH - 1] = '\0';
#ifdef KEEP_WRONG_DIRENT_RECLEN
// ToDo: The available file systems in BeOS apparently don't set the
// correct d_reclen - we are copying that behaviour if requested, but
// if it doesn't break compatibility, we will remove it.
dirent->d_reclen = strlen(dirent->d_name);
#else
dirent->d_reclen = sizeof(struct dirent) + strlen(dirent->d_name);
#endif
}
if (status == MATCH_OK)
@@ -1559,6 +1541,33 @@ Query::Query(Volume *volume, Expression *expression, uint32 flags)
fExpression->Root()->CalculateScore(fIndex);
fIndex.Unset();
Rewind();
if (fFlags & B_LIVE_QUERY)
volume->AddQuery(this);
}
Query::~Query()
{
if (fFlags & B_LIVE_QUERY)
fVolume->RemoveQuery(this);
}
status_t
Query::Rewind()
{
// free previous stuff
fStack.MakeEmpty();
delete fIterator;
fIterator = NULL;
fCurrent = NULL;
// put the whole expression on the stack
Stack<Term *> stack;
stack.Push(fExpression->Root());
@@ -1581,15 +1590,7 @@ Query::Query(Volume *volume, Expression *expression, uint32 flags)
FATAL(("Unknown term on stack or stack error"));
}
if (fFlags & B_LIVE_QUERY)
volume->AddQuery(this);
}
Query::~Query()
{
if (fFlags & B_LIVE_QUERY)
fVolume->RemoveQuery(this);
return B_OK;
}
@@ -1648,6 +1649,7 @@ Query::LiveUpdate(Entry *entry, const char *attribute, int32 type, const uint8 *
status_t oldStatus = fExpression->Root()->Match(entry, attribute, type, oldKey, oldLength);
status_t newStatus = fExpression->Root()->Match(entry, attribute, type, newKey, newLength);
int32 op;
if (oldStatus == MATCH_OK && newStatus == MATCH_OK) {
// only send out a notification if the name was changed
@@ -1,12 +1,12 @@
/* Query - query parsing and evaluation
*
* Copyright 2001-2004, Axel Dörfler, [email protected].
* This file may be used under the terms of the MIT License.
*
* Adjusted by Ingo Weinhold <[email protected]> for usage in RAM FS.
*/
#ifndef QUERY_H
#define QUERY_H
/* Query - query parsing and evaluation
**
** Initial version by Axel Dörfler, [email protected]
** This file may be used under the terms of the OpenBeOS License.
*/
// Adjusted by Ingo Weinhold <[email protected]> for usage in RAM FS.
#include <OS.h>
@@ -14,7 +14,6 @@
#include "Index.h"
#include "Stack.h"
//#include "Chain.h"
#include "ramfs.h"
class Entry;
@@ -25,9 +24,6 @@ class Term;
class Volume;
#define B_QUERY_NON_INDEXED 0x00000002
@@ -69,11 +65,6 @@ private:
};
class Expression {
public:
Expression(char *expr);
@@ -104,10 +95,12 @@ class Query {
Query(Volume *volume, Expression *expression, uint32 flags);
~Query();
status_t GetNextEntry(struct dirent *,size_t size);
status_t Rewind();
status_t GetNextEntry(struct dirent *, size_t size);
void SetLiveMode(port_id port,int32 token);
void LiveUpdate(Entry *entry,const char *attribute,int32 type,const uint8 *oldKey,size_t oldLength,const uint8 *newKey,size_t newLength);
void SetLiveMode(port_id port, int32 token);
void LiveUpdate(Entry *entry, const char *attribute, int32 type,
const uint8 *oldKey, size_t oldLength, const uint8 *newKey, size_t newLength);
Expression *GetExpression() const { return fExpression; }
@@ -122,10 +115,6 @@ class Query {
uint32 fFlags;
port_id fPort;
int32 fToken;
private:
// friend Chain<Query>;
// Query *fNext;
};
#endif /* QUERY_H */
@@ -1,10 +1,10 @@
#ifndef STACK_H
#define STACK_H
/* Stack - a template stack class
**
** Copyright 2001 pinc Software. All Rights Reserved.
** This file may be used under the terms of the OpenBeOS License.
*/
/* Stack - a template stack class (plus some handy methods)
*
* Copyright 2001-2005, Axel Dörfler, [email protected].
* This file may be used under the terms of the MIT License.
*/
#ifndef KERNEL_UTIL_STACK_H
#define KERNEL_UTIL_STACK_H
#include <SupportDefs.h>
@@ -19,18 +19,28 @@ template<class T> class Stack {
fMax(0)
{
}
~Stack()
{
if (fArray)
free(fArray);
free(fArray);
}
bool IsEmpty() const
{
return fUsed == 0;
}
void MakeEmpty()
{
// could also free the memory
fUsed = 0;
}
status_t Push(T value)
{
if (fUsed >= fMax) {
fMax += 16;
T *newArray = (T *)realloc(fArray,fMax * sizeof(T));
T *newArray = (T *)realloc(fArray, fMax * sizeof(T));
if (newArray == NULL)
return B_NO_MEMORY;
@@ -39,7 +49,7 @@ template<class T> class Stack {
fArray[fUsed++] = value;
return B_OK;
}
bool Pop(T *value)
{
if (fUsed == 0)
@@ -48,11 +58,21 @@ template<class T> class Stack {
*value = fArray[--fUsed];
return true;
}
T *Array()
{
return fArray;
}
int32 CountItems() const
{
return fUsed;
}
private:
T *fArray;
int32 fUsed;
int32 fMax;
};
#endif /* STACK_H */
#endif /* KERNEL_UTIL_STACK_H */