79 lines
1.6 KiB
C++
79 lines
1.6 KiB
C++
//
|
|
|
|
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
|
|
//
|
|
|
|
#ifndef QUERY_H
|
|
#define QUERY_H
|
|
|
|
|
|
struct StackElement
|
|
{
|
|
int m_iOperator;
|
|
int m_iNumOperandsLeft;
|
|
};
|
|
|
|
class Stack
|
|
{
|
|
StackElement m_stack[100];
|
|
int m_iTop;
|
|
static int s_iMax;
|
|
|
|
public:
|
|
Stack()
|
|
{
|
|
m_iTop = 0;
|
|
}
|
|
|
|
BOOLEAN Push(int iOperator, int iNumOperandsLeft)
|
|
{
|
|
if(m_iTop == s_iMax)
|
|
return FALSE;
|
|
m_stack[m_iTop].m_iOperator = iOperator;
|
|
m_stack[m_iTop].m_iNumOperandsLeft = iNumOperandsLeft;
|
|
m_iTop ++;
|
|
return TRUE;
|
|
}
|
|
|
|
BOOLEAN Pop(int *piOperator, int *piNumOperandsLeft)
|
|
{
|
|
if(m_iTop == 0)
|
|
return FALSE;
|
|
m_iTop --;
|
|
*piOperator = m_stack[m_iTop].m_iOperator;
|
|
*piNumOperandsLeft = m_stack[m_iTop].m_iNumOperandsLeft;
|
|
return TRUE;
|
|
}
|
|
|
|
};
|
|
|
|
class QueryConvertor
|
|
{
|
|
private:
|
|
static const WCHAR wchAND;
|
|
static const WCHAR wchOR;
|
|
static const WCHAR wchNOT;
|
|
static const WCHAR wchEQUAL;
|
|
static const WCHAR wchSTAR;
|
|
static const WCHAR wchLEFT_BRACKET;
|
|
static const WCHAR wchRIGHT_BRACKET;
|
|
static LPCWSTR pszGE;
|
|
static LPCWSTR pszLE;
|
|
|
|
// Special characters excluding ( and ) and *
|
|
static const WCHAR wchBACK_SLASH;
|
|
|
|
static BOOLEAN TranslateExpression(LPWSTR pszLDAPQuery, int *piOutputIndex,
|
|
int iOperator, LPCWSTR pszPropertyName, VARIANT *pValue);
|
|
static BOOLEAN TranslateValueToLDAP(LPWSTR pszLDAPQuery, int *piOutputIndex, VARIANT *pValue);
|
|
|
|
static LPWSTR EscapeStringValue(LPCWSTR pszValue);
|
|
|
|
public:
|
|
// This assumes that enough memory has been allocated to the resulting query
|
|
static BOOLEAN ConvertQueryToLDAP(SQL_LEVEL_1_RPN_EXPRESSION *pExp, LPWSTR pszLDAPQuery);
|
|
|
|
|
|
};
|
|
|
|
#endif /* QUERY_H */ |