(file) Return to CMPI_SelectExp.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / ProviderManager2 / CMPI

File: [Pegasus] / pegasus / src / Pegasus / ProviderManager2 / CMPI / CMPI_SelectExp.cpp (download)
Revision: 1.27, Wed Dec 13 22:04:57 2006 UTC (17 years, 6 months ago) by marek
Branch: MAIN
CVS Tags: 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, RELEASE_2_6_1-RC1, RELEASE_2_6_1, RELEASE_2_6_0-RC1, RELEASE_2_6_0, RELEASE_2_6-root, PEP286_PRIVILEGE_SEPARATION_ROOT, PEP286_PRIVILEGE_SEPARATION_CODE_FREEZE, PEP286_PRIVILEGE_SEPARATION_BRANCH, PEP286_PRIVILEGE_SEPARATION_1
Branch point for: RELEASE_2_6-branch
Changes since 1.26: +12 -6 lines
BUG#:5933
TITLE: CMPI has no backwards compatibility support for CIM:CQL

DESCRIPTION:

//%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 "CMPI_Version.h"

#include "CMPI_SelectExp.h"
#include "CMPI_Ftabs.h"
#include "CMPI_Value.h"
#include "CMPI_String.h"
#include "CMPI_SelectExpAccessor_WQL.h"

#ifndef PEGASUS_DISABLE_CQL
#include "CMPI_SelectExpAccessor_CQL.h"
#include <Pegasus/CQL/CQLSelectStatement.h>
#include <Pegasus/CQL/CQLParser.h>
#endif

#include <Pegasus/WQL/WQLInstancePropertySource.h>
#include <Pegasus/Provider/CIMOMHandleQueryContext.h>
#include <Pegasus/WQL/WQLParser.h>

PEGASUS_USING_STD;
PEGASUS_NAMESPACE_BEGIN

#define DDD(X)   if (_cmpi_trace) X;

extern int _cmpi_trace;

extern "C"
{

  PEGASUS_STATIC CMPIStatus selxRelease (CMPISelectExp * eSx)
  {
 	CMPI_SelectExp *se = (CMPI_SelectExp*)eSx;
        if (!se->persistent) {
		// Do not call unlinkAndDelete - b/c the CMPI_Object::unlinkAndDelete
		// casts the structure to a CMPI_Object and deletes it. But this is a
                // CMPI_SelectExp structure so not all of the variables get deleted. Hence
                // we delete them here.
         	//((CMPI_Object*)se)->unlinkAndDelete();
                (reinterpret_cast<CMPI_Object*>(se))->unlink();
        }
	delete se;

    CMReturn (CMPI_RC_OK);
  }

  // This will not clone all the CMPISelectExp objects. It clones only when
  // original object has either CQLSelectStatement or WQLSelectStatement.
  // Any other properties of original object may cause clone to retun error
  // CMPI_RC_ERR_NOT_SUPPORTED. Use this only when you have just created
  // CMPISelectExp object with CMNewselectExp (broker,query,lang,projection,rc)
  PEGASUS_STATIC CMPISelectExp *selxClone (const CMPISelectExp * eSx, CMPIStatus * rc)
  {
      CMPI_SelectExp *new_se;
      CMPI_SelectExp *se = (CMPI_SelectExp*) eSx;

      if (
#ifndef PEGASUS_DISABLE_CQL
          !se->cql_stmt &&
#endif
          !se->wql_stmt || se->_context || se->hdl)
      {
    if (rc)
      CMSetStatus (rc, CMPI_RC_ERR_NOT_SUPPORTED);
    return NULL;
  }

#ifndef PEGASUS_DISABLE_CQL
      CQLSelectStatement *cql_stmt;
#endif

      WQLSelectStatement *wql_stmt;
      Boolean  disable_cql = true;

#ifndef PEGASUS_DISABLE_CQL
      if (se->cql_stmt)
      {
          cql_stmt = new CQLSelectStatement (*se->cql_stmt);
          new_se = new CMPI_SelectExp (cql_stmt, true);
          disable_cql = false;
      }
#endif

      if (disable_cql)
      {
          wql_stmt = new WQLSelectStatement (*se->wql_stmt);
          new_se = new CMPI_SelectExp (wql_stmt, true);
      }

      return (CMPISelectExp*) new_se;
  }

  /* Helper functions */
  PEGASUS_STATIC CMPIBoolean _check_WQL (CMPI_SelectExp * sx, CMPIStatus * rc)
  {

    if (sx->wql_stmt == NULL)
      {
        WQLSelectStatement *stmt = new WQLSelectStatement ();
        try
        {
          WQLParser::parse (sx->cond, *stmt);
        }
        catch (const Exception &e) 
	{
	   DDD(cout<<"### exception: _check_WQL - msg: "<<e.getMessage()<<endl);
           if (rc) CMSetStatusWithString(rc,CMPI_RC_ERR_INVALID_QUERY,
            	(CMPIString*)string2CMPIString(e.getMessage()));
           delete stmt;
	   return false;
	}
        catch (...)
        {
	  DDD(cout<<"### exception: _check_WQL - ... " <<endl);
          delete stmt;
          if (rc) CMSetStatus (rc, CMPI_RC_ERR_INVALID_QUERY);
          return false;
        }
        /* Only set it for success */
        sx->wql_stmt = stmt;
      }                         /* sx->wql_stmt ... */
    return true;
  }
#ifndef PEGASUS_DISABLE_CQL
  PEGASUS_STATIC CMPIBoolean _check_CQL (CMPI_SelectExp * sx, CMPIStatus * rc)
  {
    Boolean fail = false;
    if (sx->cql_stmt == NULL)
      {
        /* The constructor should set this to a valid pointer. */
        if (sx->_context == NULL)
          {
            CMSetStatus (rc, CMPI_RC_ERROR_SYSTEM);
            return false;
          }
        CQLSelectStatement *selectStatement =
          new CQLSelectStatement (sx->lang, sx->cond, *sx->_context);
        try
        {
          CQLParser::parse (sx->cond, *selectStatement);

          selectStatement->validate ();
        }
        catch (const Exception &e) 
 	{
	    DDD(cout<<"### exception: _check_CQL - msg: "<<e.getMessage()<<endl);
            if (rc) CMSetStatusWithString(rc,CMPI_RC_ERR_INVALID_QUERY,
            		(CMPIString*)string2CMPIString(e.getMessage()));
            fail = true;
        }
        catch (...)
        {
	  DDD(cout<<"### exception: _check_CQL - ... " <<endl);
          if (rc) CMSetStatus (rc, CMPI_RC_ERR_INVALID_QUERY);
	  fail = true;
        }
	if (fail) 
	{
          delete selectStatement;
          return false;
        }
        sx->cql_stmt = selectStatement;
      }
    return true;
  }
#endif
  PEGASUS_STATIC CMPIBoolean selxEvaluate (const CMPISelectExp * eSx, const CMPIInstance * inst,
                                   CMPIStatus * rc)
  {
    CMPI_SelectExp *sx = (CMPI_SelectExp *) eSx;
    if (!inst)
      {
        if (rc)
          CMSetStatus (rc, CMPI_RC_ERR_INVALID_PARAMETER);
        return false;
      }
    if (!inst->hdl)
      {
        if (rc)
          CMSetStatus (rc, CMPI_RC_ERR_INVALID_PARAMETER);
        return false;
      }
    CIMInstance *instance = (CIMInstance *) inst->hdl;

    /* WQL */
    if (strncmp (sx->lang.getCString (), CALL_SIGN_WQL, CALL_SIGN_WQL_SIZE) ==
        0)
      {
        if (_check_WQL (sx, rc))
          {
            try
            {
              return sx->wql_stmt->evaluate (*(CIMInstance *) inst->hdl);
            } catch (const Exception &e)
	    {	
	        DDD(cout<<"### exception: selxEvaluate - msg: "<<e.getMessage()<<endl);
                if (rc) CMSetStatusWithString(rc,CMPI_RC_ERR_FAILED,
            		(CMPIString*)string2CMPIString(e.getMessage()));
                return false;
	    }
            catch (...)
            {
	      DDD(cout<<"### exception: selxEvaluate - ... " <<endl);
              if (rc) CMSetStatus (rc, CMPI_RC_ERR_FAILED);
              return false;
            }
          }
        else
          return false;
      }
    /* CIM:CQL */
#ifndef PEGASUS_DISABLE_CQL
    if ((strncmp (sx->lang.getCString(),
                  CALL_SIGN_CQL, CALL_SIGN_CQL_SIZE) == 0) ||
        (strncmp (sx->lang.getCString(),
                  "CIM:CQL", 7) == 0))
      {
        if (_check_CQL (sx, rc))
          {
            try
            {
              return sx->cql_stmt->evaluate (*instance);
            }
            catch (const Exception &e) 
            {
	        DDD(cout<<"### exception: selxEvaluate - msg: "<<e.getMessage()<<endl);
                if (rc) CMSetStatusWithString(rc,CMPI_RC_ERR_FAILED,
            		(CMPIString*)string2CMPIString(e.getMessage()));
		return false;
            }
            catch (...)
            {
	      DDD(cout<<"### exception: selxEvaluate - ... " <<endl);
              if (rc) CMSetStatus (rc, CMPI_RC_ERR_FAILED);
              return false;
            }
          }
        else
          return false;
      }
#endif
    /* Tried some other weird query language which we don't support */
    if (rc)
      CMSetStatus (rc, CMPI_RC_ERR_NOT_SUPPORTED);
    return false;
  }

  PEGASUS_STATIC CMPIBoolean selxEvaluateUsingAccessor (const CMPISelectExp * eSx,
                                                CMPIAccessor * accessor,
                                                void *parm, CMPIStatus * rc)
  {
    CMPI_SelectExp *sx = (CMPI_SelectExp *) eSx;
    if (!accessor)
      {
        if (rc)
          CMSetStatus (rc, CMPI_RC_ERR_INVALID_PARAMETER);
        return false;
      }

    if (strncmp (sx->lang.getCString (), CALL_SIGN_WQL, CALL_SIGN_WQL_SIZE) ==
        0)
      {
        if (_check_WQL (sx, rc))
          {
            CMPI_SelectExpAccessor_WQL ips (accessor, parm);
            try
            {
              if (rc)
                CMSetStatus (rc, CMPI_RC_OK);
              return sx->wql_stmt->evaluateWhereClause (&ips);
            }
	    catch (const Exception &e) 
            {
	        DDD(cout<<"### exception: selxEvaluateUsingAccessor - msg: "<<e.getMessage()<<endl);
                if (rc) CMSetStatusWithString(rc,CMPI_RC_ERR_FAILED,
            		(CMPIString*)string2CMPIString(e.getMessage()));
		return false;
            }
            catch (...)
            {
	      DDD(cout<<"### exception: selxEvaluateUsingAccessor - ..." << endl);
              if (rc)
                CMSetStatus (rc, CMPI_RC_ERR_FAILED);
              return false;
            }
          }
        else
          return false;
      }
#ifndef PEGASUS_DISABLE_CQL
    if ((strncmp (sx->lang.getCString(),
                  CALL_SIGN_CQL, CALL_SIGN_CQL_SIZE) == 0) ||
        (strncmp (sx->lang.getCString(),
                  "CIM:CQL", 7) == 0))
      {
        if (_check_CQL (sx, rc))
          {
            CMPI_SelectExpAccessor_CQL ips (accessor, parm, sx->cql_stmt,
                                            sx->classNames[0]);
            try
            {
              if (rc)
                CMSetStatus (rc, CMPI_RC_OK);
              return sx->cql_stmt->evaluate (ips.getInstance ());
            }
            catch (const Exception &e)
            {
	        DDD(cout<<"### exception: selxEvaluateUsingAccessor - msg: "<<e.getMessage()<<endl);
                if (rc) CMSetStatusWithString(rc,CMPI_RC_ERR_FAILED,
            		(CMPIString*)string2CMPIString(e.getMessage()));
		return false;
	    }
            catch (...)
            {
	      DDD(cout<<"### exception: selxEvaluateUsingAccessor - ..." << endl);
              if (rc)
                CMSetStatus (rc, CMPI_RC_ERR_FAILED);
              return false;
            }
          }
        else
          return false;
      }
#endif
    return false;
  }

  PEGASUS_STATIC CMPIString *selxGetString (const CMPISelectExp * eSx, CMPIStatus * rc)
  {
    CMPI_SelectExp *sx = (CMPI_SelectExp *) eSx;
    if (rc)
      CMSetStatus (rc, CMPI_RC_OK);
    return string2CMPIString (sx->cond);
  }

  PEGASUS_STATIC CMPISelectCond *selxGetDOC (const CMPISelectExp * eSx, CMPIStatus * rc)
  {

    CMPI_SelectExp *sx = (CMPI_SelectExp *) eSx;
    CMPISelectCond *sc = NULL;

    if (strncmp (sx->lang.getCString (), CALL_SIGN_WQL, CALL_SIGN_WQL_SIZE) ==
        0)
      {
        if (sx->wql_dnf == NULL)
          {
	   CMPI_Wql2Dnf *dnf = NULL;
	   try 
	   {
            dnf = new CMPI_Wql2Dnf (String (sx->cond), String::EMPTY);
            }
            catch (const Exception &e)
            {
		 DDD(cout<<"### exception: selxGetDOC - msg: "<<e.getMessage()<<endl);

         	if (rc) CMSetStatusWithString(rc,CMPI_RC_ERR_FAILED,
            		(CMPIString*)string2CMPIString(e.getMessage()));
                if (dnf)
                  delete dnf;
	       return NULL;
	    }
	    sx->wql_dnf = dnf;
            sx->tableau = sx->wql_dnf->getTableau ();
          }
        sc = (CMPISelectCond *) new CMPI_SelectCond (sx->tableau, 0);
      }
#ifndef PEGASUS_DISABLE_CQL
    if ((strncmp (sx->lang.getCString(),
                  CALL_SIGN_CQL, CALL_SIGN_CQL_SIZE) == 0) ||
        (strncmp (sx->lang.getCString(),
                  "CIM:CQL", 7) == 0))
      {
        if (sx->cql_dnf == NULL)
          {
            /* The constructor should set this to a valid pointer. */
            if (sx->_context == NULL)
              {
                CMSetStatus (rc, CMPI_RC_ERROR_SYSTEM);
                return NULL;
              }

            CQLSelectStatement selectStatement (sx->lang, sx->cond,
                                                *sx->_context);
            CMPI_Cql2Dnf *dnf = NULL;
            try
            {
              CQLParser::parse (sx->cond, selectStatement);
              dnf = new CMPI_Cql2Dnf (selectStatement);
            }
            catch (const Exception &e)
            {
		 DDD(cout<<"### exception: selxGetDOC - msg: "<<e.getMessage()<<endl);

         	if (rc) CMSetStatusWithString(rc,CMPI_RC_ERR_FAILED,
            		(CMPIString*)string2CMPIString(e.getMessage()));
                if (dnf)
                  delete dnf;
	       return NULL;
            }
            sx->cql_dnf = dnf;
            sx->tableau = sx->cql_dnf->getTableau ();
          }
        sc = (CMPISelectCond *) new CMPI_SelectCond (sx->tableau, 0);
      }
#endif
    if (sc)
      {
        if (rc)
          CMSetStatus (rc, CMPI_RC_OK);
        CMPI_Object *obj = new CMPI_Object (sc);
        obj->priv = ((CMPI_SelectCond *) sc)->priv;
        return reinterpret_cast < CMPISelectCond * >(obj);
      }

    /* If the sc was null, we just exit */
    if (rc)
      CMSetStatus (rc, CMPI_RC_ERR_FAILED);
    return NULL;
  }

  PEGASUS_STATIC CMPISelectCond *selxGetCOD (const CMPISelectExp * eSx, CMPIStatus * rc)
  {
    if (rc)
      CMSetStatus (rc, CMPI_RC_ERR_NOT_SUPPORTED);
    return NULL;
  }


}

static CMPISelectExpFT selx_FT = {
  CMPICurrentVersion,
  selxRelease,
  selxClone,
  selxEvaluate,
  selxGetString,
  selxGetDOC,
  selxGetCOD,
  selxEvaluateUsingAccessor
};

CMPISelectExpFT *CMPI_SelectExp_Ftab = &selx_FT;

CMPI_SelectExp::~CMPI_SelectExp()
{
  delete wql_stmt;
  delete wql_dnf;
#ifndef PEGASUS_DISABLE_CQL
  delete cql_dnf;
  delete cql_stmt;
#endif
}
CMPI_SelectExp::CMPI_SelectExp (const OperationContext & ct,
                                QueryContext * context, String cond_,
                                String lang_):
ctx (ct),
cond (cond_),
lang (lang_),
_context (context),
persistent(true)
{
  // We do NOT add ourselves to the CMPI_Object as this is a persitent object.
  // Look at the other construtors.
  props = NULL;
  ft = CMPI_SelectExp_Ftab;
  wql_dnf = NULL;
  wql_stmt = NULL;
#ifndef PEGASUS_DISABLE_CQL
  cql_stmt = NULL;
  cql_dnf = NULL;
#endif
  tableau = NULL;
}

CMPI_SelectExp::CMPI_SelectExp (WQLSelectStatement * st, Boolean persistent_)
   :ctx (OperationContext ()), wql_stmt (st), persistent (persistent_)
{
  // Adding the object to the garbage collector.
  if (!persistent_)
  {
  CMPI_ThreadContext::addObject (reinterpret_cast<CMPI_Object *>(this));
  }
  hdl = NULL;
  ft = CMPI_SelectExp_Ftab;
  props = NULL;
  wql_dnf = NULL;
#ifndef PEGASUS_DISABLE_CQL
  cql_dnf = NULL;
  cql_stmt = NULL;
#endif
  tableau = NULL;
  _context = NULL;
  cond = st->getQuery ();
  lang = CALL_SIGN_WQL;
}

#ifndef PEGASUS_DISABLE_CQL
CMPI_SelectExp::CMPI_SelectExp (CQLSelectStatement * st, Boolean persistent_)
          :ctx (OperationContext ()),cql_stmt (st), persistent (persistent_)
{
  // Adding the object to the garbage collector.
  if (!persistent_)
  {
  CMPI_ThreadContext::addObject (reinterpret_cast<CMPI_Object *>(this));
  }
  hdl = NULL;
  ft = CMPI_SelectExp_Ftab;
  props = NULL;
  wql_dnf = NULL;
  cql_dnf = NULL;
  wql_stmt = NULL;
  tableau = NULL;
  _context = NULL;
  cond = st->getQuery ();
  lang = CALL_SIGN_CQL;
  classNames = st->getClassPathList ();
}
#endif
PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2