/// <summary>
        /// Creates a FunctionInfo object from the given XML. Because it
        /// has to resolve Type objects, this should only be done after
        /// all referenced assemblies are loaded into the current AppDomain.
        /// </summary>
        /// <param name="rootElement"></param>
        /// <returns></returns>
        public virtual FunctionInfo ReadFunction(XmlNode rootElement)
        {
            if (rootElement == null)
            {
                throw new DeserialisationException("Could not find Function node");
            }

            CheckVersion(rootElement);

            NodeProcessor proc = new NodeProcessor(rootElement);

            var  name               = proc.GetString("Name");
            bool isTemplateFunc     = proc.GetBool("IsTemplateFunction");
            bool isExtMethod        = proc.GetBool("IsExtensionMethod");
            var  extendedType       = proc.GetString("ExtendedType");
            var  scriptLang         = proc.GetEnum <SyntaxEditorHelper.ScriptLanguageTypes>("ScriptLanguage");
            var  description        = proc.GetString("Description");
            var  category           = proc.GetString("Category");
            var  bodyText           = proc.GetString("Body");
            var  returnType         = GetTypeNamed(proc.GetString("ReturnType"));
            var  templateReturnLang = proc.GetString("TemplateReturnLanguage");

            FunctionInfo fi = new FunctionInfo(name, returnType, bodyText, isTemplateFunc, scriptLang, description, templateReturnLang, category, isExtMethod, extendedType);

            ProcessFunctionParameters(fi, rootElement);

            return(fi);
        }
        public IKey ProcessKeyNode(XmlNode node, ITable parent, IDatabase db)
        {
            IKey key = new Key();

            key.Parent = parent;
            ProcessScriptBase(key, node);

            /*
             *      <Keytype>Primary</Keytype>
             *      <Columns>
             *        <ColumnName>ColumnT11</ColumnName>
             *      </Columns>
             *      <ReferencedKey>
             *              <KeyName>ForeignKey</KeyName>
             *              <TableName>Table2</TableName>
             *      </ReferencedKey>
             */
            NodeProcessor proc = new NodeProcessor(node);

            key.Keytype  = proc.GetEnum <DatabaseKeyType>("Keytype");
            key.IsUnique = proc.GetBool("IsUnique");

            var columnNodeList = node.SelectNodes("Columns/ColumnName");

            if (columnNodeList != null)
            {
                foreach (XmlNode columnRef in columnNodeList)
                {
                    key.AddColumn(columnRef.InnerText);
                }
            }

            return(key);
        }
        protected virtual void ProcessConfig(XmlNode node, IDesignerProject project, string projectFilename)
        {
            NodeProcessor proc = new NodeProcessor(node);

            string relativeCompilePath = proc.GetString("RelativeCompilePath");

            project.CompileFolderName = controller.ToAbsolutePath(relativeCompilePath, projectFilename);

            project.Version  = proc.GetString("Version");
            project.ProjType = proc.GetEnum <ProjectTypes>("ProjectType");

            string relativeDebugProjectFile = proc.GetString("DebugProjectFile");

            project.DebugProjectFile = controller.ToAbsolutePath(relativeDebugProjectFile, projectFilename);

            var relativeTestGenerateDirectory = proc.GetString("TestGenerateDirectory");

            project.TestGenerateDirectory = controller.ToAbsolutePath(relativeTestGenerateDirectory, projectFilename);

            var namespaceNodes = node.SelectNodes("IncludedNamespaces/Namespace");

            if (namespaceNodes != null)
            {
                foreach (XmlNode namespaceNode in namespaceNodes)
                {
                    project.AddNamespace(namespaceNode.InnerText);
                }
            }

            var refereceNodes = node.SelectNodes("References/Reference");

            ProcessProjectReferences(refereceNodes, project, projectFilename);
        }
        public IIndex ProcessIndexNode(XmlNode node, ITable parent, IDatabase db)
        {
            IIndex index = new Index();

            index.Parent = parent;
            ProcessScriptBase(index, node);

            /*
             *      <IsUnique>True</IsUnique>
             *      <IsClustered>False</IsClustered>
             *      <Datatype>Unique</Datatype>
             *      <Columns>
             *        <ColumnName>ColumnT13</ColumnName>
             *      </Columns>
             */
            NodeProcessor proc = new NodeProcessor(node);

            index.IsUnique    = proc.GetBool("IsUnique");
            index.IsClustered = proc.GetBool("IsClustered");
            index.IndexType   = proc.GetEnum <DatabaseIndexType>("Datatype");

            var columnNodeList = node.SelectNodes("Columns/ColumnName");

            if (columnNodeList != null)
            {
                foreach (XmlNode columnRef in columnNodeList)
                {
                    index.AddColumn(columnRef.InnerText);
                }
            }

            return(index);
        }
        public IKey ProcessKeyNode(XmlNode node, ITable parent, IDatabase db)
        {
            IKey key = new Key();
            key.Parent = parent;
            ProcessScriptBase(key, node);
            /*
                <Keytype>Primary</Keytype>
                <Columns>
                  <ColumnName>ColumnT11</ColumnName>
                </Columns>
                <ReferencedKey>
                    <KeyName>ForeignKey</KeyName>
                    <TableName>Table2</TableName>
                </ReferencedKey>
             */
            NodeProcessor proc = new NodeProcessor(node);

            key.Keytype = proc.GetEnum<DatabaseKeyType>("Keytype");
            key.IsUnique = proc.GetBool("IsUnique");

            var columnNodeList = node.SelectNodes("Columns/ColumnName");
            if (columnNodeList != null)
            {
                foreach (XmlNode columnRef in columnNodeList)
                {
                    key.AddColumn(columnRef.InnerText);
                }
            }

            return key;
        }
        public IIndex ProcessIndexNode(XmlNode node, ITable parent, IDatabase db)
        {
            IIndex index = new Index();
            index.Parent = parent;
            ProcessScriptBase(index, node);
            /*
                <IsUnique>True</IsUnique>
                <IsClustered>False</IsClustered>
                <Datatype>Unique</Datatype>
                <Columns>
                  <ColumnName>ColumnT13</ColumnName>
                </Columns>
             */
            NodeProcessor proc = new NodeProcessor(node);

            index.IsUnique = proc.GetBool("IsUnique");
            index.IsClustered = proc.GetBool("IsClustered");
            index.IndexType = proc.GetEnum<DatabaseIndexType>("Datatype");

            var columnNodeList = node.SelectNodes("Columns/ColumnName");

            if (columnNodeList != null)
                foreach (XmlNode columnRef in columnNodeList)
                    index.AddColumn(columnRef.InnerText);

            return index;
        }
        protected virtual void ProcessConfig(XmlNode node, IDesignerProject project, string projectFilename)
        {
            NodeProcessor proc = new NodeProcessor(node);

            string relativeCompilePath = proc.GetString("RelativeCompilePath");
            project.CompileFolderName = controller.ToAbsolutePath(relativeCompilePath, projectFilename);

            project.Version = proc.GetString("Version");
            project.ProjType = proc.GetEnum<ProjectTypes>("ProjectType");

            string relativeDebugProjectFile = proc.GetString("DebugProjectFile");
            project.DebugProjectFile = controller.ToAbsolutePath(relativeDebugProjectFile, projectFilename);

            var relativeTestGenerateDirectory = proc.GetString("TestGenerateDirectory");
            project.TestGenerateDirectory = controller.ToAbsolutePath(relativeTestGenerateDirectory, projectFilename);

            var namespaceNodes = node.SelectNodes("IncludedNamespaces/Namespace");
            if (namespaceNodes != null)
                foreach (XmlNode namespaceNode in namespaceNodes)
                    project.AddNamespace(namespaceNode.InnerText);

            var refereceNodes = node.SelectNodes("References/Reference");
            ProcessProjectReferences(refereceNodes, project, projectFilename);
        }
        /// <summary>
        /// Creates a FunctionInfo object from the given XML. Because it
        /// has to resolve Type objects, this should only be done after
        /// all referenced assemblies are loaded into the current AppDomain.
        /// </summary>
        /// <param name="rootElement"></param>
        /// <returns></returns>
        public virtual FunctionInfo ReadFunction(XmlNode rootElement)
        {
            if (rootElement == null) throw new DeserialisationException("Could not find Function node");

            CheckVersion(rootElement);

            NodeProcessor proc = new NodeProcessor(rootElement);

            var name = proc.GetString("Name");
            bool isTemplateFunc = proc.GetBool("IsTemplateFunction");
            bool isExtMethod = proc.GetBool("IsExtensionMethod");
            var extendedType = proc.GetString("ExtendedType");
            var scriptLang = proc.GetEnum<SyntaxEditorHelper.ScriptLanguageTypes>("ScriptLanguage");
            var description = proc.GetString("Description");
            var category = proc.GetString("Category");
            var bodyText = proc.GetString("Body");
            var returnType = GetTypeNamed(proc.GetString("ReturnType"));
            var templateReturnLang = proc.GetString("TemplateReturnLanguage");

            FunctionInfo fi = new FunctionInfo(name, returnType, bodyText, isTemplateFunc, scriptLang, description, templateReturnLang, category, isExtMethod, extendedType);

            ProcessFunctionParameters(fi, rootElement);

            return fi;
        }