Ejemplo n.º 1
0
 public static object Extract([Implict] Executive engine, object arg, string xpath)
 {
     QueryNode.LispProcessingContext owner = (QueryNode.LispProcessingContext)engine.Owner;
     XmlDataAccessor xmlacc = new XmlDataAccessor();
     if (arg == null)
         return null;
     else if (arg is Resultset)
     {
         Resultset rs = (Resultset)arg;
         Resultset dest = new Resultset(RowType.CreateContainerType(typeof(System.Object)), null);
         if (!dest.RowType.RowTypeEquals(rs.RowType))
             throw new InvalidOperationException();
         while (rs.Begin != null)
         {
             Row row = rs.Dequeue();
             XmlNode node = (XmlNode)row.GetObject(0);
             object name = row.GetValue(1);
             row = dest.NewRow();
             if (node != null)
             {
                 XmlNodeList nodes = node.SelectNodes(xpath,
                     owner.QueryContext.GetNsManager(node.OwnerDocument));
                 if (nodes.Count > 0)
                     row.SetObject(0, nodes);
             }
             row.SetValue(1, name);
             dest.Enqueue(row);
         }
         return dest;
     }
     else if (arg is XmlNode)
     {
         XmlNode node = (XmlNode)arg;
         XmlNodeList nodes = node.SelectNodes(xpath,
             owner.QueryContext.GetNsManager(node.OwnerDocument));
         if (nodes.Count == 0)
             return null;
         else
             return nodes;
     }
     else if (arg is XmlNodeList)
     {
         XmlDataAccessor.NodeList nodeList = new XmlDataAccessor.NodeList();
         foreach (XmlNode node in (XmlNodeList)arg)
         {
             XmlNodeList nodes = node.SelectNodes(xpath,
                 owner.QueryContext.GetNsManager(node.OwnerDocument));
             nodeList.AddRange(nodes);
         }
         if (nodeList.Count > 0)
             return nodeList;
         else
             return null;
     }
     else
         throw new InvalidOperationException();
 }
Ejemplo n.º 2
0
 public static Resultset Dyncast([Implict] Executive engine, object arg)
 {
     QueryNode.LispProcessingContext owner = (QueryNode.LispProcessingContext)engine.Owner;
     XmlDataAccessor accessor = new XmlDataAccessor();
     if (arg == null)
         return null;
     else if (arg is Resultset)
         return (Resultset)arg;
     else if (arg is XmlNode)
     {
         XmlNode node = ((XmlNode)arg);
         if (node is XmlDocument)
             node = ((XmlDocument)node).DocumentElement;
         XmlDataAccessor.NodeList nodeList = new XmlDataAccessor.NodeList();
         foreach (XmlAttribute attr in node.Attributes)
             if (!XmlDataAccessor.IsSpecialAttribute(attr))
                 nodeList.Add(attr);
         foreach (XmlNode child in node.ChildNodes)
             nodeList.Add(child);
         return accessor.ParseNodes(nodeList, null, owner.Node);
     }
     else if (arg is XmlNodeList)
         return accessor.ParseNodes(((XmlNodeList)arg), null, owner.Node);
     else if (arg is Array)
     {
         Array array = (Array)arg;
         DataTable dt = RowType.CreateSchemaTable();
         if (array.Rank > 1)
             throw new ESQLException("Can't cast multi-diminsion array to resultset");
         else
         {
             Type elemType = array.GetType().GetElementType();
             DataRow r = dt.NewRow();
             r["ColumnName"] = "node";
             r["ColumnOrdinal"] = 0;
             if (Type.GetTypeCode(elemType) == TypeCode.Object)
                 r["DataType"] = typeof(System.Object);
             else
                 r["DataType"] = elemType;
             dt.Rows.Add(r);
         }
         Resultset rs = new Resultset(new RowType(dt), null);
         foreach (object item in array)
         {
             Row row = rs.NewRow();
             row.SetValue(0, item);
             rs.Enqueue(row);
         }
         return rs;
     }
     else if (arg == DBNull.Value)
         return null;
     else
     {
         DataTable dt = RowType.CreateSchemaTable();
         DataRow r = dt.NewRow();
         r["ColumnName"] = "node";
         r["ColumnOrdinal"] = 0;
         r["DataType"] =
             TypeConverter.GetTypeByTypeCode(Type.GetTypeCode(arg.GetType()));
         dt.Rows.Add(r);
         Resultset rs = new Resultset(new RowType(dt), null);
         Row row = rs.NewRow();
         row.SetValue(0, arg);
         rs.Enqueue(row);
         return rs;
     }
 }
Ejemplo n.º 3
0
 public override object Execute(object context, object[] args, XmlDocument xmlResult)
 {
     if (context != null)
     {
         XmlNode node = context as XmlNode;
         if (node == null)
         {
             if (context is Resultset)
             {
                 XmlReader reader = new ResultsetReader((Resultset)context,
                     "context", _command.Context.GetSettings());
                 XQueryDocument tmp = new XQueryDocument(reader);
                 _command.ContextItem = tmp.CreateNavigator();
             }
             else
                 throw new ESQLException(
                     String.Format(Properties.Resources.XmlQueryContextMustBeANode, context), null);
         }
         else
             _command.ContextItem = node.CreateNavigator();
     }
     if (args != null)
     {
         for (int k = 0; k < args.Length; k++)
         {
             XQueryParameter param = _command.Parameters[k];
             object val = args[k];
             if (val is Resultset)
             {
                 XmlReader reader = new ResultsetReader((Resultset)val,
                     XmlConvert.EncodeName(param.LocalName), _command.Context.GetSettings());
                 XQueryDocument tmp = new XQueryDocument(reader);
                 param.Value = tmp.CreateNavigator();
             }
             else if (val is XmlNode)
                 param.Value = ((XmlNode)val).CreateNavigator();
             else if (val is XmlNodeList)
                 param.Value = new  XmlNodeListIterator((XmlNodeList)val);
             else
                 param.Value = val;
         }
     }
     XQueryNodeIterator iter = _command.Execute();
     DOMConverter converter = new DOMConverter(xmlResult);
     XmlDataAccessor.NodeList res = new XmlDataAccessor.NodeList();
     while (iter.MoveNext())
         res.Add(converter.ToXmlNode(iter.Current));
     if (res.Count == 1)
         return res[0];
     return res;
 }
Ejemplo n.º 4
0
 public static XmlNodeList Dref(object arg, string name)
 {
     XmlDataAccessor.NodeList nodeList = new XmlDataAccessor.NodeList();
     if (arg != null)
     {
         name = Util.UnquoteName(name);
         if (arg is XmlNode)
             ProcessNode(nodeList, (XmlNode)arg, name);
         else if (arg is XmlNodeList)
         {
             XmlNodeList nodes = (XmlNodeList)arg;
             foreach (XmlNode node in nodes)
                 ProcessNode(nodeList, node, name);
         }
     }
     if (nodeList.Count == 0)
         return null;
     else
         return nodeList;
 }
Ejemplo n.º 5
0
 public static object XmlValueConcat([Implict] Executive engine, params object[] args)
 {
     QueryNode.LispProcessingContext owner = (QueryNode.LispProcessingContext)engine.Owner;
     XmlDataAccessor.NodeList nodes = new XmlDataAccessor.NodeList();
     for (int i = 0; i < args.Length; i++)
     {
         object val = args[i];
         if (val != null && val != Undefined.Value)
         {
             if (val is XmlNode)
                 nodes.Add((XmlNode)val);
             else if (val is XmlNodeList)
                 foreach (XmlNode n in (XmlNodeList)val)
                     nodes.Add(n);
             else
                 nodes.Add(XmlDataAccessor.Serialize(owner.QueryContext.XmlResult, val));
         }
     }
     return nodes;
 }