Return to QueryExpression.cpp CVS log | Up to [Pegasus] / pegasus / src / Pegasus / Query / QueryExpression |
File: [Pegasus] / pegasus / src / Pegasus / Query / QueryExpression / QueryExpression.cpp
(download)
Revision: 1.12, Wed Dec 13 21:29:57 2006 UTC (17 years, 6 months ago) by kumpf Branch: MAIN CVS Tags: TASK-PEP291_IPV6-root, TASK-PEP291_IPV6-branch, TASK-PEP286_PRIVILEGE_SEPARATION-root, TASK-PEP286_PRIVILEGE_SEPARATION-branch, TASK-PEP274_dacim-root, TASK-PEP274_dacim-merged_out_to_branch, TASK-PEP274_dacim-merged_out_from_trunk, TASK-PEP274_dacim-merged_in_to_trunk, TASK-PEP274_dacim-merged_in_from_branch, TASK-PEP274_dacim-branch, TASK-Bug2102_RCMPIWindows-root, TASK-Bug2102_RCMPIWindows-merged_out_to_branch, TASK-Bug2102_RCMPIWindows-merged_out_from_trunk, TASK-Bug2102_RCMPIWindows-merged_in_to_trunk, TASK-Bug2102_RCMPIWindows-merged_in_from_branch, TASK-Bug2102_RCMPIWindows-branch, TASK-Bug2102Final-root, TASK-Bug2102Final-merged_out_to_branch, TASK-Bug2102Final-merged_out_from_trunk, TASK-Bug2102Final-merged_in_to_trunk, TASK-Bug2102Final-merged_in_from_branch, TASK-Bug2102Final-branch, TASK-BUG7240-root, TASK-BUG7240-branch, RELEASE_2_6_3-RC2, RELEASE_2_6_3-RC1, RELEASE_2_6_3, RELEASE_2_6_2-RC1, RELEASE_2_6_2, RELEASE_2_6_1-RC1, RELEASE_2_6_1, RELEASE_2_6_0-RC1, RELEASE_2_6_0, RELEASE_2_6-root, RELEASE_2_6-branch-clean, RELEASE_2_6-branch, PEP286_PRIVILEGE_SEPARATION_ROOT, PEP286_PRIVILEGE_SEPARATION_CODE_FREEZE, PEP286_PRIVILEGE_SEPARATION_BRANCH, PEP286_PRIVILEGE_SEPARATION_1 Changes since 1.11: +9 -11 lines BUG#: 5944 TITLE: poststarttests memory leak - QueryExpression DESCRIPTION: Use an AutoPtr to prevent a memory leak in the case of an exception in QueryExpression object construction. |
//%2006//////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.; // IBM Corp.; EMC Corporation, The Open Group. // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.; // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.; // EMC Corporation; VERITAS Software Corporation; The Open Group. // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.; // EMC Corporation; Symantec Corporation; The Open Group. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //============================================================================== // //%///////////////////////////////////////////////////////////////////////////// #include <Pegasus/Query/QueryExpression/QueryExpression.h> #include <Pegasus/Common/Config.h> #include <Pegasus/Common/AutoPtr.h> #include <Pegasus/Common/PegasusVersion.h> #include <Pegasus/Query/QueryCommon/QueryException.h> #include <Pegasus/CQL/CQLSelectStatement.h> #include <Pegasus/CQL/CQLParser.h> #include <Pegasus/WQL/WQLSelectStatement.h> #include <Pegasus/WQL/WQLParser.h> #include <iostream> PEGASUS_NAMESPACE_BEGIN QueryExpression::QueryExpression(): _ss(NULL) { } QueryExpression::QueryExpression(String queryLang, String query, QueryContext& ctx): _queryLang(queryLang) { String cimCQL("CIM:CQL"); String dmtfCQL("DMTF:CQL"); String wql("WQL"); #ifndef PEGASUS_DISABLE_CQL if (queryLang == cimCQL || queryLang == dmtfCQL) { AutoPtr<CQLSelectStatement> cqlss( new CQLSelectStatement(queryLang, query, ctx)); // Compile the statement CQLParser::parse(query, *cqlss.get()); // Finish checking the statement for CQL by applying the class contexts to // the chained identifiers. cqlss->applyContext(); _ss = cqlss.release(); } else #endif if (queryLang == wql) { AutoPtr<WQLSelectStatement> wqlss( new WQLSelectStatement(queryLang, query, ctx)); // Compile the statement WQLParser::parse(query, *wqlss.get()); _ss = wqlss.release(); } else { throw QueryLanguageInvalidException( MessageLoaderParms(String("Query.QueryExpression.INVALID_QUERY_LANGUAGE"), String("The query language specified is invalid: $0."), queryLang)); } } QueryExpression::QueryExpression(String queryLang, String query): _queryLang(queryLang) { String cimCQL("CIM:CQL"); String dmtfCQL("DMTF:CQL"); String wql("WQL"); #ifndef PEGASUS_DISABLE_CQL if (queryLang == cimCQL || queryLang == dmtfCQL) { CQLSelectStatement* cqlss = new CQLSelectStatement(queryLang, query); // Note: cannot call parse the CQLSelectStatement // because there is no QueryContext. // The parse will happen when setQueryContext is called. _ss = cqlss; } else #endif if (queryLang == wql) { WQLSelectStatement* wqlss = new WQLSelectStatement(queryLang, query); // Compile the statement WQLParser::parse(query, *wqlss); _ss = wqlss; } else { throw QueryLanguageInvalidException( MessageLoaderParms(String("Query.QueryExpression.INVALID_QUERY_LANGUAGE"), String("The query language specified is invalid: $0."), queryLang)); } } QueryExpression::QueryExpression(const QueryExpression& expr): _queryLang(expr._queryLang) { if (expr._ss == NULL) { _ss = NULL; } else { _ss = NULL; String cimCQL("CIM:CQL"); String dmtfCQL("DMTF:CQL"); String wql("WQL"); #ifndef PEGASUS_DISABLE_CQL if (expr._queryLang == cimCQL || expr._queryLang == dmtfCQL) { CQLSelectStatement* tempSS = dynamic_cast<CQLSelectStatement*>(expr._ss); if (tempSS != NULL) _ss = new CQLSelectStatement(*tempSS); } else #endif if (expr._queryLang == wql) { WQLSelectStatement* tempSS = dynamic_cast<WQLSelectStatement*>(expr._ss); if (tempSS != NULL) _ss = new WQLSelectStatement(*tempSS); } } } QueryExpression::~QueryExpression() { delete _ss; } QueryExpression QueryExpression::operator=(const QueryExpression& rhs) { if (this == &rhs) return *this; delete _ss; _ss = NULL; if (rhs._ss != NULL) { String cimCQL("CIM:CQL"); String dmtfCQL("DMTF:CQL"); String wql("WQL"); #ifndef PEGASUS_DISABLE_CQL if (rhs._queryLang == cimCQL || rhs._queryLang == dmtfCQL) { CQLSelectStatement* tempSS = dynamic_cast<CQLSelectStatement*>(rhs._ss); if (tempSS != NULL) _ss = new CQLSelectStatement(*tempSS); } else #endif if (rhs._queryLang == wql) { WQLSelectStatement* tempSS = dynamic_cast<WQLSelectStatement*>(rhs._ss); if (tempSS != NULL) _ss = new WQLSelectStatement(*tempSS); } } _queryLang = rhs._queryLang; return *this; } String QueryExpression::getQueryLanguage() const { if(_ss == NULL){ MessageLoaderParms parms("Query.QueryExpression.SS_IS_NULL", "Trying to process a query with a NULL SelectStatement."); throw QueryException(parms); } return _ss->getQueryLanguage(); } String QueryExpression::getQuery() const { if(_ss == NULL){ MessageLoaderParms parms("Query.QueryExpression.SS_IS_NULL", "Trying to process a query with a NULL SelectStatement."); throw QueryException(parms); } return _ss->getQuery(); } Boolean QueryExpression::evaluate(const CIMInstance & inst) const { if(_ss == NULL){ MessageLoaderParms parms("Query.QueryExpression.SS_IS_NULL", "Trying to process a query with a NULL SelectStatement."); throw QueryException(parms); } try { return _ss->evaluate(inst); } catch (QueryException&) { throw; } catch (Exception& e) { throw PEGASUS_QUERY_EXCEPTION(e.getContentLanguages(), e.getMessage()); } } CIMPropertyList QueryExpression::getPropertyList(const CIMObjectPath& objectPath) const { if(_ss == NULL){ MessageLoaderParms parms("Query.QueryExpression.SS_IS_NULL", "Trying to process a query with a NULL SelectStatement."); throw QueryException(parms); } try { return _ss->getPropertyList(objectPath); } catch (QueryException&) { throw; } catch (Exception& e) { throw PEGASUS_QUERY_EXCEPTION(e.getContentLanguages(), e.getMessage()); } } CIMPropertyList QueryExpression::getSelectPropertyList (const CIMObjectPath& objectPath) const { if (_ss == NULL) { MessageLoaderParms parms ("Query.QueryExpression.SS_IS_NULL", "Trying to process a query with a NULL SelectStatement."); throw QueryException (parms); } try { return _ss->getSelectPropertyList (objectPath); } catch (QueryException&) { throw; } catch (Exception& e) { throw PEGASUS_QUERY_EXCEPTION (e.getContentLanguages (), e.getMessage ()); } } CIMPropertyList QueryExpression::getWherePropertyList (const CIMObjectPath& objectPath) const { if (_ss == NULL) { MessageLoaderParms parms ("Query.QueryExpression.SS_IS_NULL", "Trying to process a query with a NULL SelectStatement."); throw QueryException (parms); } try { return _ss->getWherePropertyList (objectPath); } catch (QueryException&) { throw; } catch (Exception& e) { throw PEGASUS_QUERY_EXCEPTION (e.getContentLanguages (), e.getMessage ()); } } void QueryExpression::applyProjection(CIMInstance instance, Boolean allowMissing) { if(_ss == NULL){ MessageLoaderParms parms("Query.QueryExpression.SS_IS_NULL", "Trying to process a query with a NULL SelectStatement."); throw QueryException(parms); } try { _ss->applyProjection(instance, allowMissing); } catch (QueryException&) { throw; } catch (Exception& e) { throw PEGASUS_QUERY_EXCEPTION(e.getContentLanguages(), e.getMessage()); } } void QueryExpression::validate(){ if(_ss == NULL){ MessageLoaderParms parms("Query.QueryExpression.SS_IS_NULL", "Trying to process a query with a NULL SelectStatement."); throw QueryException(parms); } try { _ss->validate(); } catch (QueryException&) { throw; } catch (Exception& e) { throw PEGASUS_QUERY_EXCEPTION(e.getContentLanguages(), e.getMessage()); } } Array<CIMObjectPath> QueryExpression::getClassPathList() const{ if(_ss == NULL){ MessageLoaderParms parms("Query.QueryExpression.SS_IS_NULL", "Trying to process a query with a NULL SelectStatement."); throw QueryException(parms); } try { return _ss->getClassPathList(); } catch (QueryException&) { throw; } catch (Exception& e) { throw PEGASUS_QUERY_EXCEPTION(e.getContentLanguages(), e.getMessage()); } } SelectStatement* QueryExpression::getSelectStatement(){ return _ss; } void QueryExpression::setQueryContext(QueryContext& inCtx) { if(_ss == NULL){ MessageLoaderParms parms("Query.QueryExpression.SS_IS_NULL", "Trying to process a query with a NULL SelectStatement."); throw QueryException(parms); } // SelectStatement only allows this to be called once. _ss->setQueryContext(inCtx); #ifndef PEGASUS_DISABLE_CQL String cimCQL("CIM:CQL"); String dmtfCQL("DMTF:CQL"); if (_queryLang == cimCQL || _queryLang == dmtfCQL) { // Now that we have a QueryContext, we can finish compiling // the CQL statement. CQLSelectStatement* tempSS = dynamic_cast<CQLSelectStatement*>(_ss); if (tempSS != NULL) { CQLParser::parse(getQuery(), *tempSS); tempSS->applyContext(); } } #endif } PEGASUS_NAMESPACE_END
No CVS admin address has been configured |
Powered by ViewCVS 0.9.2 |