コード例 #1
0
        /// <summary>
        /// Check the XML Package Given for Replace or Insert Apply
        /// </summary>
        /// <param name="xml">FileInfo for XML Package</param>
        /// <param name="replace">Enforce Replace Mode</param>
        /// <returns>True if success, False if any errors</returns>
        private bool CheckXMLPackageAndApply(FileInfo xml, bool replace)
        {
            string packageName = string.Format("{0}{1}{2}", xml.Directory.Name, Path.DirectorySeparatorChar, xml.Name);

            if (log.IsInfoEnabled)
            {
                log.InfoFormat("Auto Loading XML File {0} into Database (Mode:{1})", packageName, replace ? "Replace" : "Insert");
            }

            bool result = true;

            try
            {
                //Load the XML File
                DataObject[] xmlTable = LoaderUnloaderXML.LoadXMLTableFromFile(xml);
                if (xmlTable.Length > 0)
                {
                    // Guess Object Type
                    Type xmlType = xmlTable.First().GetType();

                    // Find unique Fields
                    MemberInfo         primaryKey;
                    IList <MemberInfo> uniqueMember = LoaderUnloaderXML.GetUniqueMembers(xmlType, out primaryKey);

                    // Get all object "Method" Through Reflection
                    MethodInfo  classMethod     = GameServer.Database.GetType().GetMethod("SelectAllObjects", Type.EmptyTypes);
                    MethodInfo  genericMethod   = classMethod.MakeGenericMethod(xmlType);
                    IEnumerable existingObjects = (IEnumerable)genericMethod.Invoke(GameServer.Database, new object[] {});

                    // Check if an Object already exists
                    xmlTable.AsParallel().ForAll(obj =>
                    {
                        DataObject copy = existingObjects.Cast <DataObject>()
                                          // Check all Unique Fields !
                                          .Where(d => {
                            bool exists = false;

                            foreach (MemberInfo objProp in uniqueMember)
                            {
                                if (objProp is PropertyInfo)
                                {
                                    exists |= ((PropertyInfo)objProp).GetValue(obj, null).Equals(((PropertyInfo)objProp).GetValue(d, null));
                                }
                                else if (objProp is FieldInfo)
                                {
                                    exists |= ((FieldInfo)objProp).GetValue(obj).Equals(((FieldInfo)objProp).GetValue(d));
                                }
                            }

                            return(exists);
                        }).FirstOrDefault();

                        // Store previous Add Flag
                        bool previousAllow = obj.AllowAdd;
                        obj.AllowAdd       = true;
                        // Check if we have duplicate
                        if (copy != null)
                        {
                            if (replace)
                            {
                                // Replace
                                GameServer.Database.DeleteObject(copy);
                                GameServer.Database.AddObject(obj);
                            }

                            // Silently ignore inserts...
                        }
                        else
                        {
                            // Insert
                            GameServer.Database.AddObject(obj);
                        }
                        obj.AllowAdd = previousAllow;
                    });
                }
                else
                {
                    if (log.IsWarnEnabled)
                    {
                        log.WarnFormat("XML Package {0} Found Empty, may be a parsing Error...", packageName);
                    }
                    result = false;
                }
            }
            catch (Exception e)
            {
                if (log.IsErrorEnabled)
                {
                    log.ErrorFormat("Error While Loading XML Package {0} into Database (Mode:{1}) - {2}", packageName, replace ? "Replace" : "Insert", e);
                }
                result = false;
            }

            return(result);
        }
コード例 #2
0
        /// <summary>
        /// Check the XML Package Given for Replace or Insert Apply
        /// </summary>
        /// <param name="xml">FileInfo for XML Package</param>
        /// <param name="replace">Enforce Replace Mode</param>
        /// <returns>True if success, False if any errors</returns>
        private bool CheckXMLPackageAndApply(FileInfo xml, bool replace)
        {
            var packageName = string.Format("{0}{1}{2}", xml.Directory.Name, Path.DirectorySeparatorChar, xml.Name);

            if (log.IsInfoEnabled)
            {
                log.InfoFormat("Auto Loading XML File {0} into Database (Mode:{1})", packageName, replace ? "Replace" : "Insert");
            }

            var result = true;

            try
            {
                // Load the XML File
                var xmlTable = LoaderUnloaderXML.LoadXMLTableFromFile(xml);
                if (xmlTable.Length > 0)
                {
                    // Guess Object Type
                    var xmlType      = xmlTable.First().GetType();
                    var tableHandler = new DataTableHandler(xmlType);

                    // Find unique Fields
                    var uniqueMember = DatabaseUtils.GetUniqueMembers(xmlType);

                    // Get all object "Method" Through Reflection
                    var classMethod     = GameServer.Database.GetType().GetMethod("SelectAllObjects", Type.EmptyTypes);
                    var genericMethod   = classMethod.MakeGenericMethod(xmlType);
                    var existingObjects = ((IEnumerable)genericMethod.Invoke(GameServer.Database, new object[] { })).Cast <DataObject>().ToArray();

                    // Store Object to Alter
                    var toDelete = new ConcurrentBag <DataObject>();
                    var toAdd    = new ConcurrentBag <DataObject>();

                    // Check if an Object already exists
                    xmlTable.AsParallel().ForAll(obj => {
                        // Check if Exists Compare Unique and Non-Generated Primary Keys
                        var exists = existingObjects
                                     .FirstOrDefault(entry => uniqueMember
                                                     .Any(constraint => constraint
                                                          .All(bind => bind.ValueType == typeof(string)
                                                                                  ? bind.GetValue(entry).ToString().Equals(bind.GetValue(obj).ToString(), StringComparison.OrdinalIgnoreCase)
                                                                                  : bind.GetValue(entry) == bind.GetValue(obj))));

                        if (exists != null)
                        {
                            if (replace)
                            {
                                // Delete First
                                toDelete.Add(exists);
                                toAdd.Add(obj);
                            }

                            // Silently ignore duplicate inserts only...
                        }
                        else
                        {
                            toAdd.Add(obj);
                        }
                    });

                    // Delete First
                    foreach (var obj in toDelete)
                    {
                        obj.AllowDelete = true;
                    }

                    GameServer.Database.DeleteObject(toDelete);

                    // Then Insert
                    var previousAllowAdd = toAdd.Select(obj => obj.AllowAdd).ToArray();
                    foreach (var obj in toAdd)
                    {
                        obj.AllowAdd = true;
                    }

                    GameServer.Database.AddObject(toAdd);

                    // Reset Allow Add Flag
                    var current = 0;
                    foreach (var obj in toAdd)
                    {
                        obj.AllowAdd = previousAllowAdd[current];
                        current++;
                    }
                }
                else
                {
                    if (log.IsWarnEnabled)
                    {
                        log.WarnFormat("XML Package {0} Found Empty, may be a parsing Error...", packageName);
                    }

                    result = false;
                }
            }
            catch (Exception e)
            {
                if (log.IsErrorEnabled)
                {
                    log.ErrorFormat("Error While Loading XML Package {0} into Database (Mode:{1}) - {2}", packageName, replace ? "Replace" : "Insert", e);
                }

                result = false;
            }

            return(result);
        }