Fixed the bug in the query code: B_MIME_STRING_TYPE was not correctly

translated into B_STRING_TYPE for the key comparison (it was translated
but not saved under the new type).
compareKeys() will now return -1 if it didn't know the type to compare.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2121 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2002-11-29 19:22:52 +00:00
parent edd97f84ad
commit 006928f81b
2 changed files with 30 additions and 22 deletions

View File

@ -1793,7 +1793,7 @@ TreeIterator::Traverse(int8 direction, void *key, uint16 *keyLength, uint16 maxL
{
fDuplicateNode = offset;
node = cached.SetTo(bplustree_node::FragmentOffset(fDuplicateNode),false);
node = cached.SetTo(bplustree_node::FragmentOffset(fDuplicateNode), false);
if (node == NULL)
RETURN_ERROR(B_ERROR);
@ -1903,14 +1903,14 @@ TreeIterator::Stop()
void
TreeIterator::Dump()
{
__out("TreeIterator at %p:\n",this);
__out("\tfTree = %p\n",fTree);
__out("\tfCurrentNodeOffset = %Ld\n",fCurrentNodeOffset);
__out("\tfCurrentKey = %ld\n",fCurrentKey);
__out("\tfDuplicateNode = %Ld (%Ld, 0x%Lx)\n",bplustree_node::FragmentOffset(fDuplicateNode),fDuplicateNode,fDuplicateNode);
__out("\tfDuplicate = %u\n",fDuplicate);
__out("\tfNumDuplicates = %u\n",fNumDuplicates);
__out("\tfIsFragment = %s\n",fIsFragment ? "true" : "false");
__out("TreeIterator at %p:\n", this);
__out("\tfTree = %p\n", fTree);
__out("\tfCurrentNodeOffset = %Ld\n", fCurrentNodeOffset);
__out("\tfCurrentKey = %ld\n", fCurrentKey);
__out("\tfDuplicateNode = %Ld (%Ld, 0x%Lx)\n", bplustree_node::FragmentOffset(fDuplicateNode), fDuplicateNode, fDuplicateNode);
__out("\tfDuplicate = %u\n", fDuplicate);
__out("\tfNumDuplicates = %u\n", fNumDuplicates);
__out("\tfIsFragment = %s\n", fIsFragment ? "true" : "false");
}
#endif
@ -2005,9 +2005,9 @@ compareKeys(type_code type,const void *key1, int keyLength1, const void *key2, i
{
case B_STRING_TYPE:
{
int len = min_c(keyLength1,keyLength2);
int result = strncmp((const char *)key1,(const char *)key2,len);
int len = min_c(keyLength1, keyLength2);
int result = strncmp((const char *)key1, (const char *)key2, len);
if (result == 0
&& !(((const char *)key1)[len] == '\0' && ((const char *)key2)[len] == '\0'))
result = keyLength1 - keyLength2;
@ -2066,7 +2066,9 @@ compareKeys(type_code type,const void *key1, int keyLength1, const void *key2, i
return (result < 0.0) ? -1 : 1;
}
}
return 0;
// if the type is unknown, the entries don't match...
return -1;
}

View File

@ -81,6 +81,12 @@ union value {
char String[INODE_FILE_NAME_LENGTH];
};
// B_MIME_STRING_TYPE is defined in storage/Mime.h, but we
// don't need the whole file here; the type can't change anyway
#ifndef _MIME_H
# define B_MIME_STRING_TYPE 'MIMS'
#endif
class Term {
public:
Term(int8 op) : fOp(op), fParent(NULL) {}
@ -651,12 +657,10 @@ Equation::ConvertValue(type_code type)
if (type == fType)
return B_OK;
fType = type;
char *string = fString;
switch (type) {
// B_MIME_STRING_TYPE is defined in Mime.h which I didn't want to include just for that
case 'MIMS':
case B_MIME_STRING_TYPE:
type = B_STRING_TYPE;
// supposed to fall through
case B_STRING_TYPE:
@ -694,6 +698,8 @@ Equation::ConvertValue(type_code type)
return B_ERROR;
}
fType = type;
// patterns are only allowed for string types
if (fType != B_STRING_TYPE && fIsPattern)
fIsPattern = false;
@ -716,14 +722,14 @@ Equation::CompareTo(const uint8 *value, uint16 size)
// we have already validated the pattern, so we don't check for failing
// here - if something is broken, and matchString() returns an error,
// we just don't match
compare = matchString(fValue.String,(char *)value) == MATCH_OK ? 0 : 1;
compare = matchString(fValue.String, (char *)value) == MATCH_OK ? 0 : 1;
} else if (fIsSpecialTime) {
// the index is a shifted int64 index, but we have to match
// against an unshifted value (i.e. the last_modified index)
int64 timeValue = *(int64 *)value >> INODE_TIME_SHIFT;
compare = compareKeys(fType,&timeValue,sizeof(int64),&fValue.Int64,sizeof(int64));
compare = compareKeys(fType, &timeValue, sizeof(int64), &fValue.Int64, sizeof(int64));
} else
compare = compareKeys(fType,value,size,Value(),fSize);
compare = compareKeys(fType, value, size, Value(), fSize);
switch (fOp) {
case OP_EQUAL:
@ -739,7 +745,7 @@ Equation::CompareTo(const uint8 *value, uint16 size)
case OP_GREATER_THAN_OR_EQUAL:
return compare >= 0;
}
FATAL(("Unknown/Unsupported operation: %d\n",fOp));
FATAL(("Unknown/Unsupported operation: %d\n", fOp));
return false;
}
@ -1018,7 +1024,7 @@ Equation::GetNextMatching(Volume *volume, TreeIterator *iterator,
continue;
}
// check user permissions here - but which one?!
// ToDo: check user permissions here - but which one?!
// we could filter out all those where we don't have
// read access... (we should check for every parent
// directory if the X_OK is allowed)
@ -1065,7 +1071,7 @@ Equation::GetNextMatching(Volume *volume, TreeIterator *iterator,
dirent->d_ino = offset;
dirent->d_pdev = volume->ID();
dirent->d_pino = volume->ToVnode(inode->Parent());
if (inode->GetName(dirent->d_name) < B_OK)
FATAL(("inode %Ld in query has no name!\n", inode->BlockNumber()));