# XQilla Simple API Documentation

- Main Page
- Namespaces
- Classes
- Files
- Examples

- File List
- File Members

# XQQuery.hpp

Go to the documentation of this file.

    00001 /*
    00002  * Copyright (c) 2001, 2008,
    00003  *     DecisionSoft Limited. All rights reserved.
    00004  * Copyright (c) 2004, 2015 Oracle and/or its affiliates. All rights reserved.
    00005  *
    00006  *
    00007  * Licensed under the Apache License, Version 2.0 (the "License");
    00008  * you may not use this file except in compliance with the License.
    00009  * You may obtain a copy of the License at
    00010  *
    00011  *     http://www.apache.org/licenses/LICENSE-2.0
    00012  *
    00013  * Unless required by applicable law or agreed to in writing, software
    00014  * distributed under the License is distributed on an "AS IS" BASIS,
    00015  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    00016  * See the License for the specific language governing permissions and
    00017  * limitations under the License.
    00018  */
    00019
    00020 #ifndef XQQUERY_HPP
    00021 #define XQQUERY_HPP
    00022
    00023 #include <xqilla/framework/XQillaExport.hpp>
    00024 #include <vector>
    00025 #include <string>
    00026 #include <xercesc/util/XMemory.hpp>
    00027 #include <xercesc/sax/InputSource.hpp>
    00028 #include <xqilla/runtime/ResultImpl.hpp>
    00029 #include <xqilla/context/StaticContext.hpp>
    00030
    00031 #include <xercesc/util/RefHashTableOf.hpp>
    00032
    00033 class DynamicContext;
    00034 class XQUserFunction;
    00035 class XQGlobalVariable;
    00036 class XQQuery;
    00037 class DelayedModule;
    00038 class DelayedFuncFactory;
    00039 class StaticTyper;
    00040
    00041 typedef std::vector<XQGlobalVariable*, XQillaAllocator<XQGlobalVariable*> > GlobalVariables;
    00042 typedef std::vector<XQQuery*, XQillaAllocator<XQQuery*> > ImportedModules;
    00043 typedef std::vector<DelayedFuncFactory*, XQillaAllocator<DelayedFuncFactory*> > DelayedFunctions;
    00044
    00045 typedef XERCES_CPP_NAMESPACE_QUALIFIER RefHashTableOf<XQQuery> ModuleMap;
    00046
    00047 class XQILLA_API ModuleCache : public XERCES_CPP_NAMESPACE_QUALIFIER XMemory
    00048 {
    00049 public:
    00050   ModuleCache(XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager *mm);
    00051
    00052   void put(XQQuery *module);
    00053   XQQuery *getByURI(const XMLCh *uri) const;
    00054   XQQuery *getByNamespace(const XMLCh *ns) const;
    00055
    00056   ModuleMap byURI_;
    00057   ModuleMap byNamespace_;
    00058   ImportedModules ordered_;
    00059 };
    00060
    00075 class XQILLA_API XQQuery : public XERCES_CPP_NAMESPACE_QUALIFIER XMemory
    00076 {
    00077 public:
    00079   ~XQQuery();
    00080
    00082         // @{
    00083
    00092   DynamicContext *createDynamicContext(XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager *memMgr =
    00093                                        XERCES_CPP_NAMESPACE_QUALIFIER XMLPlatformUtils::fgMemoryManager) const;
    00094
    00108   Result execute(DynamicContext* context) const;
    00109
    00124   Result execute(const Item::Ptr &contextItem, DynamicContext *context) const;
    00125
    00141   Result execute(const XMLCh *templateQName, DynamicContext *context) const;
    00142
    00153   void execute(EventHandler *events, DynamicContext* context) const;
    00154
    00166   void execute(EventHandler *events, const Item::Ptr &contextItem, DynamicContext *context) const;
    00167
    00180   void execute(EventHandler *events, const XMLCh *templateQName, DynamicContext *context) const;
    00181
    00201   void staticResolution();
    00202
    00215   void staticTyping(StaticTyper *styper = 0);
    00216   bool staticTypingOnce(StaticTyper *styper = 0);
    00217
    00219
    00221   // @{
    00222
    00224   const XMLCh* getQueryText() const { return m_szQueryText; }
    00225   void setQueryText(const XMLCh *v);
    00226
    00228   std::string getQueryPlan() const;
    00229
    00231
    00233   // @{
    00234
    00236   ASTNode* getQueryBody() const;
    00238   void setQueryBody(ASTNode* query);
    00239
    00241   void addFunction(XQUserFunction* fnDef);
    00243   const UserFunctions &getFunctions() const { return m_userDefFns; }
    00244
    00247   void addDelayedFunction(const XMLCh *uri, const XMLCh *name, size_t numArgs,
    00248                           const XMLCh *functionDeclaration, bool isPrivate = false,
    00249                           int line = 1, int column = 1);
    00250   void addDelayedFunction(const XMLCh *uri, const XMLCh *name, size_t numArgs,
    00251                           const char *functionDeclaration, bool isPrivate = false,
    00252                           int line = 1, int column = 1);
    00254   const DelayedFunctions &getDelayedFunctions() const { return m_delayedFunctions; }
    00255
    00257   void addVariable(XQGlobalVariable* varDef);
    00259   const GlobalVariables &getVariables() const { return m_userDefVars; }
    00260
    00262   const ImportedModules &getImportedModules() const { return m_importedModules; }
    00263
    00264   ModuleCache *getModuleCache() const { return m_moduleCache; }
    00265   bool isModuleCacheOwned() const { return m_moduleCacheOwned; }
    00266
    00268   const XMLCh* getFile() const { return m_szCurrentFile; }
    00269
    00271   void setFile(const XMLCh* file);
    00272
    00273   bool getVersion3() const { return m_version3; }
    00274   void setVersion3(bool v) { m_version3 = v; }
    00275
    00276   const DynamicContext *getStaticContext() const { return m_context; }
    00277
    00278   XQQuery *getNext() const { return m_next; }
    00279   void setNext(XQQuery *n) { m_next = n; }
    00280
    00282
    00284   // @{
    00285
    00287   void setIsLibraryModule(bool bIsModule=true);
    00289   bool getIsLibraryModule() const;
    00291   void setModuleTargetNamespace(const XMLCh* uri);
    00293   const XMLCh* getModuleTargetNamespace() const;
    00295   void importModule(const XMLCh* szUri, VectorOfStrings* locations, const LocationInfo *location);
    00296   void importModule(XQQuery *module);
    00297
    00298   XQQuery *findModuleForVariable(const XMLCh *uri, const XMLCh *name);
    00299   XQQuery *findModuleForFunction(const XMLCh *uri, const XMLCh *name, int numArgs);
    00300
    00302
    00303 private:
    00305   XQQuery(DynamicContext *context, bool contextOwned, ModuleCache *moduleCache,
    00306           XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager *memMgr);
    00307
    00308   XQQuery(const XQQuery &);
    00309   XQQuery &operator=(const XQQuery &);
    00310
    00311   XQQuery *parseModule(const XMLCh *ns, const XMLCh *at, const LocationInfo *location) const;
    00312   void executeProlog(DynamicContext *context) const;
    00313
    00314 private:
    00316   XERCES_CPP_NAMESPACE_QUALIFIER MemoryManager* m_memMgr;
    00317
    00319   DynamicContext *m_context;
    00320   bool m_contextOwned;
    00321
    00322   ASTNode* m_query;
    00323
    00324   bool m_bIsLibraryModule;
    00325   const XMLCh* m_szTargetNamespace;
    00326   const XMLCh* m_szQueryText;
    00327   const XMLCh* m_szCurrentFile;
    00328
    00329   UserFunctions m_userDefFns;
    00330   DelayedFunctions m_delayedFunctions;
    00331   GlobalVariables m_userDefVars;
    00332   ImportedModules m_importedModules;
    00333
    00334   ModuleCache *m_moduleCache;
    00335   bool m_moduleCacheOwned;
    00336
    00337   bool m_version3;
    00338
    00339   enum { BEFORE, DURING, AFTER } m_staticTyped;
    00340
    00341   // The next module with the same target namespace
    00342   XQQuery *m_next;
    00343
    00344   friend class QueryResult;
    00345   friend class XQilla;
    00346   friend class DelayedModule;
    00347 };
    00348
    00349 #endif