コード例 #1
0
        public static DataSet LoadObjects(SiteImportSettings settings, string objectType, bool siteObjects, bool selectionOnly = false, bool forceXMLStructure = false)
        {
            DataSet ds;

            var e = new ImportGetDataEventArgs
            {
                Settings      = settings,
                ObjectType    = objectType,
                SiteObjects   = siteObjects,
                SelectionOnly = selectionOnly
            };

            // Get empty data set
            GeneralizedInfo infoObj;

            ds = GetEmptyDataSet(settings, objectType, siteObjects, selectionOnly, out infoObj, forceXMLStructure);

            // Turn off constrains check
            ds.EnforceConstraints = false;

            // Raise prepare data event
            var eData = new ImportGetDataEventArgs
            {
                Data          = ds,
                Settings      = settings,
                ObjectType    = objectType,
                SiteObjects   = siteObjects,
                SelectionOnly = selectionOnly
            };

            // Handle the event
            SpecialActionsEvents.PrepareDataStructure.StartEvent(eData);

            // Lowercase table names for compatibility
            DataHelper.LowerCaseTableNames(ds);


            Stream    reader = null;
            XmlReader xml    = null;

            string safeObjectType = ImportExportHelper.GetSafeObjectTypeName(objectType);

            // Prepare the path
            string filePath = DirectoryHelper.CombinePath(settings.TemporaryFilesPath, ImportExportHelper.DATA_FOLDER) + "\\";

            // Get object type subfolder
            filePath += ImportExportHelper.GetObjectTypeSubFolder(settings, objectType, siteObjects);
            filePath += safeObjectType + ".xml";
            string rootElement = safeObjectType;

            filePath = ImportExportHelper.GetExportFilePath(filePath);

            // Import only if file exists
            if (System.IO.File.Exists(filePath))
            {
                // Reader setting
                XmlReaderSettings rs = new XmlReaderSettings();
                rs.CloseInput      = true;
                rs.CheckCharacters = false;

                // Open reader
                reader = FileStream.New(filePath, CMS.IO.FileMode.Open, CMS.IO.FileAccess.Read, CMS.IO.FileShare.Read, 8192);
                xml    = XmlReader.Create(reader, rs);

                // Read main document element
                do
                {
                    xml.Read();
                } while ((xml.NodeType != XmlNodeType.Element) && !xml.EOF);

                if (xml.Name.ToLowerInvariant() != rootElement.ToLowerInvariant())
                {
                    throw new Exception("[ImportProvider.LoadObjects]: The required page element is '" + safeObjectType + "', element found is '" + xml.Name + "'.");
                }

                // Get version
                if (xml.HasAttributes)
                {
                    xml.MoveToAttribute("version");
                }

                if ((xml.NodeType != XmlNodeType.Attribute) || (xml.Name.ToLowerInvariant() != "version"))
                {
                    throw new Exception("[ImportProvider.LoadObjects]: Cannot find version attribute.");
                }


                // Get the dataset
                do
                {
                    xml.Read();
                } while (((xml.NodeType != XmlNodeType.Element) || (xml.Name != "NewDataSet")) && !xml.EOF);

                // Read data
                if (xml.Name == "NewDataSet")
                {
                    ds.ReadXml(xml);
                }

                // Filter data by object type condition for selection, some object types may overlap
                if (selectionOnly && !DataHelper.DataSourceIsEmpty(ds))
                {
                    // Remove unwanted rows from data collection with dependence on type condition
                    if (infoObj.TypeInfo.TypeCondition != null)
                    {
                        var dt = ObjectHelper.GetTable(ds, infoObj);
                        var where = infoObj.TypeInfo.WhereCondition;
                        where.Replace(" N'", " '").Replace("(N'", "('");
                        DataHelper.KeepOnlyRows(dt, where);

                        dt.AcceptChanges();
                    }
                }
            }


            // Safely close readers
            if (xml != null)
            {
                xml.Close();
            }

            if (reader != null)
            {
                reader.Close();
            }

            return(ds);
        }
コード例 #2
0
        private static DataSet GetEmptyDataSet(SiteImportSettings settings, string objectType, bool siteObjects, bool selectionOnly, out GeneralizedInfo infoObj, bool forceXMLStructure = false)
        {
            DataSet ds;

            // Raise prepare data event
            var eData = new ImportGetDataEventArgs
            {
                Settings      = settings,
                ObjectType    = objectType,
                SiteObjects   = siteObjects,
                SelectionOnly = selectionOnly
            };

            // Handle the event
            SpecialActionsEvents.GetEmptyObject.StartEvent(eData);

            // Ensure empty object
            infoObj = eData.Object ?? ModuleManager.GetReadOnlyObject(objectType);

            // Get data set
            if (forceXMLStructure || (infoObj == null) || (infoObj.MainObject is NotImplementedInfo))
            {
                // Create empty data set
                ds = new DataSet();

                // Ensure translation table
                if (objectType == ImportExportHelper.OBJECT_TYPE_TRANSLATION)
                {
                    ds.Tables.Add(TranslationHelper.GetEmptyTable());
                }
            }
            else
            {
                // Get objects DataSet
                if (selectionOnly)
                {
                    // Code name column
                    ds = DataHelper.GetSingleColumnDataSet(ObjectHelper.GetSerializationTableName(infoObj), infoObj.CodeNameColumn, typeof(string));

                    // Display name column
                    var dt = ds.Tables[0];
                    if (infoObj.CodeNameColumn != infoObj.DisplayNameColumn)
                    {
                        DataHelper.EnsureColumn(dt, infoObj.DisplayNameColumn, typeof(string));
                    }

                    // GUID column
                    var ti = infoObj.TypeInfo;
                    if ((ti.GUIDColumn != ObjectTypeInfo.COLUMN_NAME_UNKNOWN) && (infoObj.CodeNameColumn != ti.GUIDColumn))
                    {
                        DataHelper.EnsureColumn(dt, ti.GUIDColumn, typeof(Guid));
                    }

                    // Columns used by type condition
                    var tc = ti.TypeCondition;
                    if (tc != null)
                    {
                        foreach (var conditionColumn in tc.ConditionColumns)
                        {
                            DataHelper.EnsureColumn(dt, conditionColumn, ti.ClassStructureInfo.GetColumnType(conditionColumn));
                        }
                    }
                }
                else
                {
                    ds = ObjectHelper.GetObjectsDataSet(OperationTypeEnum.Export, infoObj, true);
                }

                // Add tasks table
                DataSet tasksDS;
                if (selectionOnly)
                {
                    tasksDS = DataHelper.GetSingleColumnDataSet("Export_Task", "TaskID", typeof(int));

                    DataTable dt = tasksDS.Tables[0];
                    dt.Columns.Add("TaskTitle", typeof(string));
                    dt.Columns.Add("TaskType", typeof(string));
                    dt.Columns.Add("TaskTime", typeof(DateTime));
                }
                else
                {
                    tasksDS = DataClassInfoProvider.GetDataSet("Export.Task");
                }

                DataHelper.TransferTable(ds, tasksDS, "Export_Task");
            }

            return(ds);
        }