//*************************************************************************** // // (c) 1999-2001 by Microsoft Corp. All Rights Reserved. // // wqltoese.h // // cvadai 19-Mar-99 Created as prototype for Quasar. // //*************************************************************************** #ifndef _WQLTOESE_H_ #define _WQLTOESE_H_ #include typedef __int64 SQL_ID; class CWmiDbHandle; class CWmiDbSession; class CSchemaCache; class CSQLConnection; #define QUERY_TYPE_CLASSDEFS_ONLY 0x1 #define QUERY_TYPE_GETREFS 0x2 #define QUERY_TYPE_GETASSOCS 0x4 #define QUERY_TYPE_SCHEMA_ONLY 0x8 // WQL - ESE token converter typedef enum { ESE_TEMPQL_TYPE_NONE = 0, ESE_TEMPQL_TYPE_REF = 1, ESE_TEMPQL_TYPE_ASSOC = 2 } TEMPQLTYPE; typedef enum { ESE_EXPR_INVALID = 0, ESE_EXPR_TYPE_AND = WQL_TOK_AND, ESE_EXPR_TYPE_OR = WQL_TOK_OR, ESE_EXPR_TYPE_EXPR = WQL_TOK_TYPED_EXPR, ESE_EXPR_TYPE_NOT = WQL_TOK_NOT } ESETOKENTYPE; typedef enum { ESE_VALUE_TYPE_INVALID= 0, ESE_VALUE_TYPE_SQL_ID = 1, ESE_VALUE_TYPE_STRING = 2, ESE_VALUE_TYPE_REAL = 3, ESE_VALUE_TYPE_REF = 4, ESE_VALUE_TYPE_SYSPROP= 5 } VALUETYPE; typedef enum { ESE_FUNCTION_NONE = 0, ESE_FUNCTION_UPPER = 1, ESE_FUNCTION_LOWER = 2, ESE_FUNCTION_DATEPART_MONTH = 3, ESE_FUNCTION_DATEPART_YEAR = 4, ESE_FUNCTION_DATEPART_DAY = 5, ESE_FUNCTION_DATEPART_HOUR = 6, ESE_FUNCTION_DATEPART_MINUTE = 7, ESE_FUNCTION_DATEPART_SECOND = 8, ESE_FUNCTION_DATEPART_MILLISECOND = 9 } ESEFUNCTION; struct ESEValue { VALUETYPE valuetype; SQL_ID dValue; BSTR sValue; double rValue; SQL_ID dRefValue; BSTR sPropName; ESEFUNCTION dwFunc; ESEValue() { valuetype = ESE_VALUE_TYPE_INVALID, dValue = 0, sValue = NULL, rValue = 0, dRefValue = 0, sPropName = NULL, dwFunc = ESE_FUNCTION_NONE; } ~ESEValue() { SysFreeString(sPropName); SysFreeString(sValue); } }; class ESEToken { public: ESETOKENTYPE tokentype; TEMPQLTYPE qltype; ESEToken(ESETOKENTYPE type) {tokentype = type; qltype = ESE_TEMPQL_TYPE_NONE;}; virtual ~ESEToken() {}; }; class ESEWQLToken : public ESEToken { public: int optype; SQL_ID dScopeId; SQL_ID dClassId; SQL_ID dPropertyId; SQL_ID dCompPropertyId; ESEValue Value; ESEValue CompValue; BOOL bSysProp; BOOL bIndexed; ESEWQLToken(ESETOKENTYPE type) : ESEToken(type) { qltype = ESE_TEMPQL_TYPE_NONE; optype = 0; dScopeId = 0; bSysProp = FALSE; dClassId = 0; dPropertyId = 0; dCompPropertyId = 0; } ~ESEWQLToken() {}; }; typedef enum { TEMPQL_TOKEN_INVALID = 0, TEMPQL_TOKEN_RESULTCLASS = 1, TEMPQL_TOKEN_ROLE = 2, TEMPQL_TOKEN_RESULTROLE = 3, TEMPQL_TOKEN_REQQUALIFIER = 4, TEMPQL_TOKEN_ASSOCQUALIFIER = 5, TEMPQL_TOKEN_ASSOCCLASS = 6, TEMPQL_TOKEN_TARGETID = 7 } TEMPQLTOKEN; class ESETempQLToken : public ESEToken { public: TEMPQLTOKEN token; SQL_ID dValue; BSTR sValue; ESETempQLToken(ESETOKENTYPE type, TEMPQLTYPE _ttype) : ESEToken (type) { qltype = _ttype; sValue = NULL; } ~ESETempQLToken() {SysFreeString(sValue);}; }; class CESETokens { public: HRESULT AddToken (ESEToken *pTok, ESETOKENTYPE type, int *iNumAdded=NULL, int iPos = -1); HRESULT AddNumericExpr (SQL_ID dClassId, SQL_ID dPropertyId, SQL_ID dValue, ESETOKENTYPE type=ESE_EXPR_TYPE_AND, int op=WQL_TOK_EQ, BOOL bIndexed=FALSE, SQL_ID dCompValue = 0, ESEFUNCTION func = ESE_FUNCTION_NONE, int *iNumAdded=NULL, BOOL bSysProp=FALSE); HRESULT AddReferenceExpr (SQL_ID dClassId, SQL_ID dPropertyId, SQL_ID dValue, ESETOKENTYPE type=ESE_EXPR_TYPE_AND, int op=WQL_TOK_EQ, BOOL bIndexed=FALSE, SQL_ID dCompValue = 0, ESEFUNCTION func = ESE_FUNCTION_NONE, int *iNumAdded=NULL); HRESULT AddStringExpr (SQL_ID dClassId, SQL_ID dPropertyId, LPWSTR dValue, ESETOKENTYPE type=ESE_EXPR_TYPE_AND, int op=WQL_TOK_EQ, BOOL bIndexed=FALSE, LPWSTR dCompValue = 0, ESEFUNCTION func = ESE_FUNCTION_NONE, int *iNumAdded=NULL, BOOL bSysProp = FALSE); HRESULT AddRealExpr (SQL_ID dClassId, SQL_ID dPropertyId, double dValue, ESETOKENTYPE type=ESE_EXPR_TYPE_AND, int op=WQL_TOK_EQ, BOOL bIndexed=FALSE, double dCompValue = 0, ESEFUNCTION func = ESE_FUNCTION_NONE, int *iNumAdded=NULL); HRESULT AddPropExpr (SQL_ID dClassId, SQL_ID dPropertyId, SQL_ID dPropertyId2, DWORD StorageType, ESETOKENTYPE type=ESE_EXPR_TYPE_AND, int op=WQL_TOK_EQ, BOOL bIndexed = FALSE, ESEFUNCTION func = ESE_FUNCTION_NONE, ESEFUNCTION func2 = ESE_FUNCTION_NONE, int *iNumAdded=NULL); HRESULT AddTempQlExpr (TEMPQLTYPE type, SQL_ID dTargetID, SQL_ID dResultClass, LPWSTR lpRole, LPWSTR lpResultRole, SQL_ID dQfr, SQL_ID dAssocQfr, SQL_ID dAssocClass, int *iNumAdded=NULL); HRESULT AddSysExpr (SQL_ID dScopeId, SQL_ID dClassId, int *iNumAdded=NULL); DWORD GetNumTokens() {return m_arrToks.Size();} ESEToken * GetToken(int iPos) {return (ESEToken *)m_arrToks.GetAt(iPos);}; HRESULT UnIndexTokens(int iNum); void SetIsMetaClass (BOOL b = TRUE) { m_bMetaClass = b;}; BOOL IsMetaClass () {return m_bMetaClass;}; SQL_ID GetScopeID() {return m_dScopeId;}; CESETokens() {m_bMetaClass = FALSE; m_dScopeId = 0;}; ~CESETokens() { for (int i=0; i < m_arrToks.Size(); i++) delete (ESEToken *)m_arrToks.GetAt(i); } private: CFlexArray m_arrToks; BOOL m_bMetaClass; SQL_ID m_dScopeId; }; class CESEBuilder { public: CESEBuilder(CSchemaCache *pSchema, CWmiDbSession *pSession, CSQLConnection *pConn) {m_pSchema = pSchema, m_pSession = pSession, m_pConn = pConn;}; ~CESEBuilder(){}; // Generic SQL HRESULT FormatSQL (SQL_ID dScopeId, SQL_ID dScopeClassId, SQL_ID dSuperScope, IWbemQuery *pQuery, CESETokens **pTokens, DWORD dwFlags, DWORD dwHandleType, SQL_ID *dClassId=0, BOOL *bHierarchyQuery=0, BOOL *IndexCols = 0, BOOL *bSuperSet = 0, BOOL *bDelete = 0); HRESULT FormatSQL (SQL_ID dScopeId, SQL_ID dScopeClassId, SQL_ID dSuperScope, SQL_ID dTargetObjID, LPWSTR pResultClass, LPWSTR pAssocClass, LPWSTR pRole, LPWSTR pResultRole, LPWSTR pRequiredQualifier, LPWSTR pRequiredAssocQualifier, DWORD dwQueryType, CESETokens **pTokens, DWORD dwFlags, DWORD dwHandleType, SQL_ID *dAssocClass=0, SQL_ID *dResultClass=0, BOOL *pSuperSet = 0); private: HRESULT FormatWhereClause (SWQLNode_RelExpr *pNode, CESETokens *pTokens, BOOL &IndexCols, BOOL *bOrCri=NULL, int *iNumToksAdded=NULL, BOOL *pSuperSet = NULL); HRESULT GetPropertyID (SQL_ID dClassID, SWQLQualifiedName *pQN, LPCWSTR pColRef, DWORD &PropID, DWORD &Storage, DWORD &Flags); HRESULT GetClassFromNode (SWQLNode *pNode); SQL_ID m_dClassID; DWORD m_dwTableCount; bool m_bClassSpecified; SQL_ID m_dNamespace; CSchemaCache *m_pSchema; CWmiDbSession *m_pSession; CSQLConnection *m_pConn; }; #endif