You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
5.4 KiB
191 lines
5.4 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1998.
|
|
//
|
|
// File: PARSER.HXX
|
|
//
|
|
// Contents: Query Parsers
|
|
//
|
|
// Classes: CQueryParser
|
|
// CPropertyValueParser
|
|
// CParserException
|
|
//
|
|
// History: 30-Apr-92 AmyA Created.
|
|
// 15-Jun-94 t-jeffc Added exception classes.
|
|
// 02-Mar-95 t-colinb Added CPropertyValueParser class and
|
|
// some more exceptions to handle
|
|
// the parsing of vector properties
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
typedef XPtr<CDbRestriction> XDbRestriction;
|
|
typedef XPtr<CDbNodeRestriction> XDbNodeRestriction;
|
|
typedef XPtr<CDbNotRestriction> XDbNotRestriction;
|
|
typedef XPtr<CDbVectorRestriction> XDbVectorRestriction;
|
|
typedef XPtr<CDbPropertyRestriction> XDbPropertyRestriction;
|
|
typedef XPtr<CDbContentRestriction> XDbContentRestriction;
|
|
typedef XPtr<CDbNatLangRestriction> XDbNatLangRestriction;
|
|
typedef XPtr<CDbBooleanNodeRestriction> XDbBooleanNodeRestriction;
|
|
typedef XPtr<CDbProximityNodeRestriction> XDbProximityNodeRestriction;
|
|
|
|
|
|
// forward decls
|
|
class CQueryScanner;
|
|
|
|
|
|
// types of properties - content, regular expression and natural language
|
|
enum PropertyType
|
|
{
|
|
CONTENTS,
|
|
REGEX,
|
|
NATLANGUAGE
|
|
};
|
|
|
|
const ULONG CI_PARSER_MAX_RECURSION_DEPTH = 1000;
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CQueryParser
|
|
//
|
|
// Purpose: Changes a query string into a CRestriction for the
|
|
// content index.
|
|
//
|
|
// History: 30-Apr-92 AmyA Created.
|
|
// 31-May-94 t-jeffc Extended query grammar.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CQueryParser
|
|
{
|
|
public:
|
|
|
|
CQueryParser( CQueryScanner & scanner,
|
|
ULONG rankMethod,
|
|
LCID locale,
|
|
WCHAR const * wcsProperty,
|
|
PropertyType propType,
|
|
IColumnMapper *pList )
|
|
:_scan( scanner ),
|
|
_rankMethod( rankMethod ),
|
|
_locale( locale ),
|
|
_xList( pList ),
|
|
_wcsProperty( 0 ),
|
|
_propType( propType ),
|
|
_cRecursionDepth( 0 )
|
|
{
|
|
_xList->AddRef();
|
|
SetCurrentProperty( wcsProperty, propType );
|
|
}
|
|
|
|
~CQueryParser() { delete [] _wcsProperty; }
|
|
|
|
CDbRestriction * ParseQueryPhrase();
|
|
|
|
WCHAR const * GetCurrentProperty() { return _wcsProperty; }
|
|
|
|
PropertyType GetPropertyType() const { return _propType; }
|
|
|
|
BOOL IsRegEx() { return ( REGEX == _propType ); }
|
|
|
|
void IncrementRecursionDepth()
|
|
{
|
|
_cRecursionDepth++;
|
|
|
|
if ( _cRecursionDepth > CI_PARSER_MAX_RECURSION_DEPTH )
|
|
THROW( CException( QUERY_E_TOOCOMPLEX ) );
|
|
}
|
|
|
|
void DecrementRecursionDepth()
|
|
{
|
|
Win4Assert( 0 != _cRecursionDepth );
|
|
_cRecursionDepth--;
|
|
}
|
|
|
|
private:
|
|
|
|
CDbRestriction * Query( CDbNodeRestriction * pExpr );
|
|
CDbRestriction * QExpr( CDbBooleanNodeRestriction * pExpr );
|
|
CDbRestriction * QTerm( CDbBooleanNodeRestriction * pExpr );
|
|
CDbRestriction * QProp();
|
|
CDbRestriction * QFactor();
|
|
CDbRestriction * QGroup( CDbProximityNodeRestriction * pExpr );
|
|
CDbRestriction * QPhrase();
|
|
|
|
CDbRestriction * ParsePropertyRst();
|
|
|
|
void SetCurrentProperty( WCHAR const * wcsProperty, PropertyType propType );
|
|
|
|
CQueryScanner & _scan;
|
|
|
|
ULONG _rankMethod;
|
|
LCID _locale;
|
|
ULONG _cRecursionDepth;
|
|
|
|
WCHAR * _wcsProperty;
|
|
PropertyType _propType;
|
|
XInterface<IColumnMapper> _xList;
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CPropertyValueParser
|
|
//
|
|
// Purpose: To intepret a sequence of tokens from a scanner
|
|
// and place the results in a CStorageVariant
|
|
//
|
|
// Notes: This class throws CParserException when errors occur.
|
|
//
|
|
// History: 02-Mar-95 t-colinb Created.
|
|
// 02-Sep-98 KLam Added locale
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CPropertyValueParser
|
|
{
|
|
public :
|
|
|
|
CPropertyValueParser( CQueryScanner &scanner, DBTYPE PropertyType, LCID locale );
|
|
|
|
CStorageVariant *AcquireStgVariant( void )
|
|
{
|
|
return _pStgVariant.Acquire();
|
|
}
|
|
|
|
static BOOL CheckForRelativeDate( WCHAR const * phrase, FILETIME & ft );
|
|
|
|
private :
|
|
|
|
void ParseDateTime( WCHAR const * phrase, FILETIME & ft );
|
|
|
|
LCID _locale;
|
|
XPtr<CStorageVariant> _pStgVariant;
|
|
};
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CParserException
|
|
//
|
|
// Purpose: Exception class for parse errors
|
|
//
|
|
// History: 17-May-94 t-jeffc Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CParserException : public CException
|
|
{
|
|
public:
|
|
CParserException( SCODE pe )
|
|
: CException( pe )
|
|
{
|
|
}
|
|
|
|
SCODE GetParseError()
|
|
{
|
|
return GetErrorCode();
|
|
}
|
|
};
|
|
|