示例#1
0
void dynamic_context::get_variable(
    ulong varid,
    const store::Item_t& varname,
    const QueryLoc& loc,
    store::Item_t& itemValue,
    store::TempSeq_t& seqValue) const
{
  itemValue = NULL;
  seqValue = NULL;

  if (varid >= theVarValues.size() ||
      theVarValues[varid].theState == VarValue::undeclared)
  {
    zstring varName = static_context::var_name(varname.getp());

    if (varid >= theVarValues.size() ||
        theVarValues[varid].theIsExternalOrLocal ||
        (varid > 0 && varid < MAX_IDVARS_RESERVED))
    {
      RAISE_ERROR(err::XPDY0002, loc,
      ERROR_PARAMS(ZED(XPDY0002_VariableUndeclared_2), varName));
    }
    else
    {
      RAISE_ERROR(err::XQDY0054, loc, ERROR_PARAMS(varName));
    }
  }

  const VarValue& var = theVarValues[varid];

  if (var.theState == VarValue::declared)
  {
    zstring varName = static_context::var_name(varname.getp());

    if (var.theIsExternalOrLocal)
    {
      RAISE_ERROR(err::XPDY0002, loc,
      ERROR_PARAMS(ZED(XPDY0002_VariableHasNoValue_2), varName));
    }
    else
    {
      RAISE_ERROR(err::XQDY0054, loc, ERROR_PARAMS(varName));
    }
  }

  if (var.theState == VarValue::item)
    itemValue = var.theValue.item;
  else
    seqValue = var.theValue.temp_seq;
}
void processOptions(store::Item_t item, store::LoadProperties& props, static_context* theSctx, const QueryLoc& loc)
{
  URI lValidatedBaseUri;
  store::Item_t child, tempItem;

  if (item.getp() == NULL)
    return;

#ifndef ZORBA_NO_XMLSCHEMA
  if (item->isValidated())
  {
    if (item->getNodeName() == NULL
        ||
        item->getNodeName()->getNamespace() != static_context::ZORBA_XML_FN_OPTIONS_NS)
    {
      throw XQUERY_EXCEPTION(zerr::ZXQD0003_INCONSISTENT_PARSE_FRAGMENT_OPTIONS,
                             ERROR_PARAMS(ZED(ParseFragmentInvalidOptions)), ERROR_LOC( loc ));
    }
  }
  else
  {
    tempItem = NULL; // used as the effectiveValidationValue()'s typeName
    Validator::effectiveValidationValue(
        item,
        item,
        tempItem,
        theSctx->get_typemanager(),
        ParseConstants::val_strict,
        theSctx,
        loc);
  }
#endif

  store::Iterator_t children = item->getChildren();
  children->open();

  while (children->next(child))
  {
    if (child->getNodeKind() != store::StoreConsts::elementNode)
      continue;

    if (child->getNodeName()->getLocalName() == "base-uri")
    {
      store::Item_t attr = getFirstAttribute(child);

      try {
        lValidatedBaseUri = URI(attr->getStringValue());
      } catch (ZorbaException const& /* e */) {
        throw XQUERY_EXCEPTION(
          err::FODC0007,
          ERROR_PARAMS( attr->getStringValue() ),
          ERROR_LOC( loc )
        );
      }

      if (!lValidatedBaseUri.is_absolute()) {
        throw XQUERY_EXCEPTION(
          err::FODC0007,
          ERROR_PARAMS( lValidatedBaseUri.toString() ),
          ERROR_LOC( loc )
        );
      }

      props.setBaseUri(attr->getStringValue());
    }
    else if (child->getNodeName()->getLocalName() == "no-error")
      props.setNoError(true);
    else if (child->getNodeName()->getLocalName() == "strip-boundary-space")
      props.setStripWhitespace(true);
    else if (child->getNodeName()->getLocalName() == "schema-validate")
    {
      store::Item_t attr = getFirstAttribute(child);
      if (attr->getStringValue() == "strict")
        props.setSchemaStrictValidate(true);
      else
        props.setSchemaLaxValidate(true);
    }
    else if (child->getNodeName()->getLocalName() == "DTD-validate")
      props.setDTDValidate(true);
    else if (child->getNodeName()->getLocalName() == "DTD-load")
      props.setDTDLoad(true);
    else if (child->getNodeName()->getLocalName() == "default-DTD-attributes")
      props.setDefaultDTDAttributes(true);
    else if (child->getNodeName()->getLocalName() == "parse-external-parsed-entity")
    {
      props.setParseExternalParsedEntity(true);
      store::Item_t attr;
      store::Iterator_t attribs = child->getAttributes();
      attribs->open();
      while (attribs->next(attr))
      {
        if (attr->getNodeName()->getLocalName() == "skip-root-nodes")
          props.setSkipRootNodes(ztd::aton<xs_int>(attr->getStringValue().c_str()));
        else if (attr->getNodeName()->getLocalName() == "skip-top-level-text-nodes")
          props.setSkipTopLevelTextNodes(true);
        else if (attr->getNodeName()->getLocalName() == "error-on-doctype")
          props.setErrorOnDoctype(true);
      }
      attribs->close();
    }
    else if (child->getNodeName()->getLocalName() == "substitute-entities")
      props.setSubstituteEntities(true);
    else if (child->getNodeName()->getLocalName() == "xinclude-substitutions")
      props.setXincludeSubstitutions(true);
    else if (child->getNodeName()->getLocalName() == "remove-redundant-ns")
      props.setRemoveRedundantNS(true);
    else if (child->getNodeName()->getLocalName() == "no-CDATA")
      props.setNoCDATA(true);
    else if (child->getNodeName()->getLocalName() == "no-xinclude-nodes")
      props.setNoXIncludeNodes(true);
    else if (child->getNodeName()->getLocalName() == "no-network-access")
      props.setNoNetworkAccess(true);
  }

  children->close();

  if (props.getSchemaLaxValidate() + props.getSchemaStrictValidate() +
      props.getDTDValidate() + props.getParseExternalParsedEntity() > 1)
  {
    throw XQUERY_EXCEPTION(zerr::ZXQD0003_INCONSISTENT_PARSE_FRAGMENT_OPTIONS,
                           ERROR_PARAMS(ZED(ParseFragmentOptionCombinationNotAllowed)), ERROR_LOC( loc ));
  }
}
bool FunctionLookupIterator::nextImpl(
    store::Item_t& result,
    PlanState& planState) const
{
  CompilerCB* ccb = planState.theCompilerCB;
  store::ItemFactory* factory = GENV_ITEMFACTORY;

  store::Item_t qname;
  store::Item_t arityItem;
  store::Item_t ctxItem;
  store::Item_t ctxPosItem;
  store::Item_t ctxSizeItem;
  csize arity;
  function* f;

  result = NULL;
  
  PlanIteratorState* state;
  DEFAULT_STACK_INIT(PlanIteratorState, state, planState);

  consumeNext(qname, theChildren[0], planState);
  consumeNext(arityItem, theChildren[1], planState);

  try
  {
    arity = static_cast<zorba::csize>(to_xs_unsignedLong(arityItem->getIntegerValue()));
  }
  catch ( std::range_error const& )
  {
    RAISE_ERROR(err::XPST0017, loc,
    ERROR_PARAMS(arityItem->getIntegerValue(), ZED(NoParseFnArity)));
  }

  f = theSctx->lookup_fn(qname, arity);

  if (f != NULL && f->isContextual())
  {
    try
    {
      consumeNext(ctxItem, theChildren[2], planState);
      consumeNext(ctxPosItem, theChildren[3], planState);
      consumeNext(ctxSizeItem, theChildren[4], planState);
    }
    catch (const ZorbaException& e)
    {
      if (e.diagnostic() != err::XPDY0002)
        throw;
    }
  }
  
  try
  {
    static_context_t impSctx = theSctx->create_child_context();
    ccb->theSctxMap[ccb->theSctxMap.size() + 1] = impSctx;

    std::unique_ptr<dynamic_context> fiDctx;
    fiDctx.reset(new dynamic_context(planState.theGlobalDynCtx));

    if (ctxItem)
    {
      store::Item_t ctxItemName;
      factory->createQName(ctxItemName, "", "", static_context::DOT_VAR_NAME);

      var_expr* ve = ccb->theEM->
      create_var_expr(impSctx, NULL, loc, var_expr::local_var, ctxItemName);

      ve->set_unique_id(dynamic_context::IDVAR_CONTEXT_ITEM);

      impSctx->bind_var(ve, loc);

      fiDctx->add_variable(dynamic_context::IDVAR_CONTEXT_ITEM, ctxItem);
    }

    if (ctxPosItem)
    {
      store::Item_t ctxPosName;
      factory->createQName(ctxPosName, "", "", static_context::DOT_POS_VAR_NAME);

      var_expr* ve = ccb->theEM->
      create_var_expr(impSctx, NULL, loc, var_expr::local_var, ctxPosName);

      ve->set_unique_id(dynamic_context::IDVAR_CONTEXT_ITEM_POSITION);

      impSctx->bind_var(ve, loc);

      fiDctx->add_variable(dynamic_context::IDVAR_CONTEXT_ITEM_POSITION, ctxPosItem);
    }

    if (ctxSizeItem)
    {
      store::Item_t ctxSizeName;
      factory->createQName(ctxSizeName, "", "", static_context::DOT_SIZE_VAR_NAME);

      var_expr* ve = ccb->theEM->
      create_var_expr(impSctx, NULL, loc, var_expr::local_var, ctxSizeName);

      ve->set_unique_id(dynamic_context::IDVAR_CONTEXT_ITEM_SIZE);

      impSctx->bind_var(ve, loc);

      fiDctx->add_variable(dynamic_context::IDVAR_CONTEXT_ITEM_SIZE, ctxSizeItem);
    }

    expr* fiExpr = 
    Translator::translate_literal_function(qname, arity, ccb, impSctx, loc);
    
    FunctionItemInfo_t fiInfo =
    static_cast<function_item_expr*>(fiExpr)->get_fi_info();

    fiInfo->theCCB = ccb;

    if (fiInfo->numInScopeVars() > 0)
    {
      result = new FunctionItem(fiInfo, fiDctx.get());
      fiDctx.release();
    }
    else
    {
      result = new FunctionItem(fiInfo, NULL);
    }
  }
  catch (const ZorbaException& e)
  {
    if (e.diagnostic() != err::XPST0017)
      throw;
  }
  
  if (result.getp() != NULL)
    STACK_PUSH(true, state); 
    
  STACK_END(state);
}