00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00035 #include "OW_WQLImpl.hpp"
00036 #include "OW_MutexLock.hpp"
00037 #include "OW_WQLProcessor.hpp"
00038 #include "OW_WQLAst.hpp"
00039 #include "OW_AutoPtr.hpp"
00040 #include "OW_CIMException.hpp"
00041 #include "OW_WQLSelectStatementGen.hpp"
00042 #include "OW_ResultHandlerIFC.hpp"
00043 #include "OW_ServiceIFCNames.hpp"
00044
00045 namespace OW_NAMESPACE
00046 {
00047
00048 Mutex WQLImpl::s_classLock;
00049 const char* WQLImpl::s_parserInput = 0;
00050 stmt* WQLImpl::s_statement = 0;
00051
00052 WQLImpl::~WQLImpl()
00053 {
00054 }
00055
00056 String
00057 WQLImpl::getName() const
00058 {
00059 return ServiceIFCNames::WQL;
00060 }
00061
00062 void WQLImpl::evaluate(const String& nameSpace,
00063 CIMInstanceResultHandlerIFC& result,
00064 const String& query, const String& queryLanguage,
00065 const CIMOMHandleIFCRef& hdl)
00066 {
00067 OW_WQL_LOG_DEBUG(Format("nameSpace %1, query %2, queryLanguage %3 .", nameSpace, query, queryLanguage));
00068 MutexLock lock(s_classLock);
00069
00070 s_parserInput = query.c_str();
00071 WQLscanner_init();
00072 #ifdef YYOW_DEBUG
00073 owwqldebug = 1;
00074 #endif
00075 OW_WQL_LOG_DEBUG("Parsing: ");
00076 int owwqlresult = owwqlparse();
00077 if (owwqlresult)
00078 {
00079 OW_THROWCIMMSG(CIMException::INVALID_QUERY, "Parse failed");
00080 }
00081 else
00082 {
00083 OW_WQL_LOG_DEBUG("Parse succeeded");
00084 }
00085 OW_WQL_LOG_DEBUG("Processing: ");
00086 WQLProcessor p(hdl, nameSpace);
00087 AutoPtr<stmt> pAST(WQLImpl::s_statement);
00088 lock.release();
00089 if (pAST.get())
00090 {
00091 pAST->acceptInterface(&p);
00092 }
00093 else
00094 {
00095 OW_WQL_LOG_DEBUG("pAST was NULL!");
00096 }
00097 CIMInstanceArray instances = p.getInstances();
00098 for (size_t i = 0; i < instances.size(); ++i)
00099 {
00100 result.handle(instances[i]);
00101 }
00102
00103 s_parserInput = 0;
00104 }
00105
00106 WQLSelectStatement
00107 WQLImpl::createSelectStatement(const String& query)
00108 {
00109 MutexLock lock(s_classLock);
00110
00111 s_parserInput = query.c_str();
00112 WQLscanner_init();
00113 #ifdef YYOW_DEBUG
00114 owwqldebug = 1;
00115 #endif
00116 int owwqlresult = owwqlparse();
00117 if (owwqlresult)
00118 {
00119 OW_THROWCIMMSG(CIMException::INVALID_QUERY, "Parse failed");
00120 }
00121 else
00122 {
00123 OW_WQL_LOG_DEBUG("Parse succeeded");
00124 }
00125 WQLSelectStatementGen p;
00126 AutoPtr<stmt> pAST(WQLImpl::s_statement);
00127 lock.release();
00128 if (pAST.get())
00129 {
00130 pAST->acceptInterface(&p);
00131 }
00132 else
00133 {
00134 OW_WQL_LOG_DEBUG("pAST was NULL!");
00135 }
00136
00137 s_parserInput = 0;
00138
00139 return p.getSelectStatement();
00140 }
00141 bool WQLImpl::supportsQueryLanguage(const String& lang)
00142 {
00143 if (lang.equalsIgnoreCase("wql1"))
00144 {
00145 return true;
00146 }
00147 else if (lang.equalsIgnoreCase("wql2"))
00148 {
00149 return true;
00150 }
00151 else if (lang.equalsIgnoreCase("wql"))
00152 {
00153 return true;
00154 }
00155 else
00156 {
00157 return false;
00158 }
00159 }
00160
00162 void
00163 WQLImpl::init(const ServiceEnvironmentIFCRef& env)
00164 {
00165 }
00166
00168 void
00169 WQLImpl::shutdown()
00170 {
00171 }
00172
00173 }
00174
00175 OW_WQLFACTORY(OpenWBEM::WQLImpl,wqlimpl);
00176