/// <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); }
/// <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); }