コード例 #1
0
        public void TestTableMigrationChangingPrimaryKey()
        {
            // Destroy previous table
            Database.ExecuteNonQuery(string.Format("DROP TABLE IF EXISTS `{0}`", AttributesUtils.GetTableName(typeof(TestTableWithPrimaryChangingV1))));

            // Get a new Database Object to Trigger Migration
            var DatabaseV2 = GetDatabaseV2;

            Database.RegisterDataObject(typeof(TestTableWithPrimaryChangingV1));

            Database.DeleteObject(Database.SelectAllObjects <TestTableWithPrimaryChangingV1>());

            Assert.IsEmpty(Database.SelectAllObjects <TestTableWithPrimaryChangingV1>(), "Test Table TestTableWithPrimaryChangingV1 should be empty to begin this tests.");

            var objs = new [] { "TestObj1", "TestObj2", "TestObj3" }.Select((ent, i) => new TestTableWithPrimaryChangingV1 {
                PrimaryKey = i, Value = ent
            }).ToArray();

            Database.AddObject(objs);

            CollectionAssert.AreEquivalent(objs.Select(obj => obj.Value), Database.SelectAllObjects <TestTableWithPrimaryChangingV1>().Select(obj => obj.Value), "Test Table TestTableWithPrimaryChangingV1 Entries should be available for this test to run.");

            // Trigger False Migration
            DatabaseV2.RegisterDataObject(typeof(TestTableWithPrimaryChangingV2));

            var newObjs = DatabaseV2.SelectAllObjects <TestTableWithPrimaryChangingV2>().ToArray();

            CollectionAssert.AreEquivalent(objs.Select(obj => obj.Value), newObjs.Select(obj => obj.Value), "Test Table Migration to TestTableWithPrimaryChangingV2 should retrieve similar values that created ones...");
            CollectionAssert.AreEquivalent(objs.Select(obj => obj.PrimaryKey), newObjs.Select(obj => obj.PrimaryKey), "Test Table Migration to TestTableWithPrimaryChangingV2 should retrieve similar values that created ones...");
        }
コード例 #2
0
        public void TestTableWithBrokenPrimaryKey()
        {
            // Destroy previous table
            Database.ExecuteNonQuery(string.Format("DROP TABLE IF EXISTS `{0}`", AttributesUtils.GetTableName(typeof(TestTableWithBrokenPrimaryV1))));

            // Create Table
            Database.RegisterDataObject(typeof(TestTableWithBrokenPrimaryV1));

            // Break Primary Key
            Database.ExecuteNonQuery(string.Format("ALTER TABLE `{0}` DROP PRIMARY KEY", AttributesUtils.GetTableName(typeof(TestTableWithBrokenPrimaryV1))));

            // Get a new Database Object to Trigger Migration
            var DatabaseV2 = GetDatabaseV2;

            // Trigger False Migration
            DatabaseV2.RegisterDataObject(typeof(TestTableWithBrokenPrimaryV2));

            var adds = DatabaseV2.AddObject(new [] {
                new TestTableWithBrokenPrimaryV2 {
                    PrimaryKey = 1
                },
                new TestTableWithBrokenPrimaryV2 {
                    PrimaryKey = 1
                },
            });

            Assert.IsFalse(adds, "Primary Key was not restored and duplicate key were inserted !");
        }
コード例 #3
0
        /// <summary>
        /// Retrieve All DataTables Type
        /// </summary>
        public static IList <Type> GetAllDataTableTypes()
        {
            var result = new List <Type>();

            try
            {
                // Walk through each assembly in scripts
                foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
                {
                    // Walk through each type in the assembly
                    foreach (var type in asm.GetTypes())
                    {
                        if (!type.IsClass || type.IsAbstract || !typeof(DataObject).IsAssignableFrom(type))
                        {
                            continue;
                        }

                        // Don't Keep Views...
                        if (type.GetCustomAttributes <DataTable>(false).Any() && AttributesUtils.GetViewName(type) == null)
                        {
                            result.Add(type);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                if (log.IsErrorEnabled)
                {
                    log.Error("Error while Listing Data Tables", ex);
                }
            }

            return(result);
        }
コード例 #4
0
        /// <summary>
        /// Register Data Object Type if not already Registered
        /// </summary>
        /// <param name="dataObjectType">DataObject Type</param>
        public override void RegisterDataObject(Type dataObjectType)
        {
            var tableName = AttributesUtils.GetTableOrViewName(dataObjectType);
            var isView    = AttributesUtils.GetViewName(dataObjectType) != null;
            var viewAs    = AttributesUtils.GetViewAs(dataObjectType);

            DataTableHandler existingHandler;

            if (TableDatasets.TryGetValue(tableName, out existingHandler))
            {
                if (dataObjectType != existingHandler.ObjectType)
                {
                    throw new DatabaseException(string.Format("Table Handler Duplicate for Type: {2}, Table Name '{0}' Already Registered with Type : {1}", tableName, existingHandler.ObjectType, dataObjectType));
                }

                return;
            }

            var dataTableHandler = new DataTableHandler(dataObjectType);

            try
            {
                if (isView)
                {
                    if (!string.IsNullOrEmpty(viewAs))
                    {
                        ExecuteNonQueryImpl(string.Format("DROP VIEW IF EXISTS `{0}`", tableName));
                        ExecuteNonQueryImpl(string.Format("CREATE VIEW `{0}` AS {1}", tableName, string.Format(viewAs, string.Format("`{0}`", AttributesUtils.GetTableName(dataObjectType)))));
                    }
                }
                else
                {
                    CheckOrCreateTableImpl(dataTableHandler);
                }

                lock (Lock)
                {
                    TableDatasets.Add(tableName, dataTableHandler);
                }

                // Init PreCache
                if (dataTableHandler.UsesPreCaching)
                {
                    var primary = dataTableHandler.PrimaryKeys.Single();
                    var objects = MultipleSelectObjectsImpl(dataTableHandler, new [] { WhereClause.Empty }).First();

                    foreach (var obj in objects)
                    {
                        dataTableHandler.SetPreCachedObject(primary.GetValue(obj), obj);
                    }
                }
            }
            catch (Exception e)
            {
                if (log.IsErrorEnabled)
                {
                    log.ErrorFormat("RegisterDataObject: Error While Registering Table \"{0}\"\n{1}", tableName, e);
                }
            }
        }
コード例 #5
0
        /// <summary>
        /// Helper to Retrieve Table or View Handler from Object Type
        /// Return View or Table for Select Queries
        /// </summary>
        /// <param name="objectType">Object Type</param>
        /// <returns>DataTableHandler for this Object Type or null.</returns>
        protected DataTableHandler GetTableOrViewHandler(Type objectType)
        {
            var tableName = AttributesUtils.GetTableOrViewName(objectType);
            DataTableHandler handler;

            return(TableDatasets.TryGetValue(tableName, out handler) ? handler : null);
        }
コード例 #6
0
        /// <summary>
        /// Gets the number of objects in a given table in the database based on a given set of criteria. (where clause)
        /// </summary>
        /// <typeparam name="TObject">the type of objects to retrieve</typeparam>
        /// <param name="whereExpression">the where clause to filter object count on</param>
        /// <returns>a positive integer representing the number of objects that matched the given criteria; zero if no such objects existed</returns>
        protected override int GetObjectCountImpl <TObject>(string whereExpression)
        {
            string           tableName = AttributesUtils.GetTableOrViewName(typeof(TObject));
            DataTableHandler tableHandler;

            if (!TableDatasets.TryGetValue(tableName, out tableHandler))
            {
                throw new DatabaseException(string.Format("Table {0} is not registered for Database Connection...", tableName));
            }

            string command = null;

            if (string.IsNullOrEmpty(whereExpression))
            {
                command = string.Format("SELECT COUNT(*) FROM `{0}`", tableName);
            }
            else
            {
                command = string.Format("SELECT COUNT(*) FROM `{0}` WHERE {1}", tableName, whereExpression);
            }

            var count = ExecuteScalarImpl(command);

            return(count is long?(int)((long)count) : (int)count);
        }
コード例 #7
0
        public void TestTableMigrationToNonNullValue()
        {
            // Destroy previous table
            Database.ExecuteNonQuery(string.Format("DROP TABLE IF EXISTS `{0}`", AttributesUtils.GetTableName(typeof(TestTableMigrationNullToNonNull))));

            // Get a new Database Object to Trigger Migration
            var DatabaseV2 = GetDatabaseV2;

            Database.RegisterDataObject(typeof(TestTableMigrationNullToNonNull));

            Database.DeleteObject(Database.SelectAllObjects <TestTableMigrationNullToNonNull>());

            Assert.IsEmpty(Database.SelectAllObjects <TestTableMigrationNullToNonNull>(), "Test Table TestTableMigrationNullToNonNull should be empty to begin this tests.");

            var objs = new [] { "TestObj1", null, "TestObj3" }.Select((ent, i) => new TestTableMigrationNullToNonNull {
                StringValue = ent
            }).ToArray();

            Database.AddObject(objs);

            CollectionAssert.AreEquivalent(objs.Select(obj => obj.StringValue), Database.SelectAllObjects <TestTableMigrationNullToNonNull>().Select(obj => obj.StringValue), "Test Table TestTableMigrationNullToNonNull Entries should be available for this test to run.");

            // Trigger False Migration
            DatabaseV2.RegisterDataObject(typeof(TestTableMigrationNullFromNull));

            var newObjs = DatabaseV2.SelectAllObjects <TestTableMigrationNullFromNull>().ToArray();

            CollectionAssert.AreEquivalent(objs.Select(obj => obj.StringValue ?? string.Empty), newObjs.Select(obj => obj.StringValue), "Test Table Migration to TestTableMigrationNullFromNull should retrieve similar values that created ones...");
            CollectionAssert.AreEqual(Enumerable.Repeat(0, 3), newObjs.Select(obj => obj.IntValue), "Test Table Migration to TestTableMigrationNullFromNull should retrieve all default int value to 0...");
        }
コード例 #8
0
        /// <summary>
        /// Register Data Object Type if not already Registered
        /// </summary>
        /// <param name="dataObjectType">DataObject Type</param>
        public virtual void RegisterDataObject(Type dataObjectType)
        {
            var tableName = AttributesUtils.GetTableOrViewName(dataObjectType);

            if (TableDatasets.ContainsKey(tableName))
            {
                return;
            }

            var dataTableHandler = new DataTableHandler(dataObjectType);

            TableDatasets.Add(tableName, dataTableHandler);
        }
コード例 #9
0
        public void ToListShouldSortByKey()
        {
            var attributes = new Dictionary <string, string>
            {
                { "someInt", "123" },
                { "bizDate", "2010-08-06" }
            };
            var expected = new List <string> {
                "2010-08-06", "123"
            };

            Assert.AreEqual(expected, AttributesUtils.ToList(attributes));
        }
コード例 #10
0
ファイル: Edit.aspx.cs プロジェクト: qiuhaotc/ExcelImport
        private void InitData()
        {
            List <AttributesUtils.EnumItem> listFieldType = AttributesUtils.GetEnumList <Common.BaseEnum.Enumeration.FieldTypes>();

            ExcelFieldType.DataSource     = listFieldType;
            ExcelFieldType.DataTextField  = "Value";
            ExcelFieldType.DataValueField = "Key";
            ExcelFieldType.DataBind();

            SQLFieldType.DataSource     = listFieldType;
            SQLFieldType.DataTextField  = "Value";
            SQLFieldType.DataValueField = "Key";
            SQLFieldType.DataBind();
        }
コード例 #11
0
        public void TestTableMigrationWithDifferentTypes()
        {
            // Destroy previous table
            Database.ExecuteNonQuery(string.Format("DROP TABLE IF EXISTS `{0}`", AttributesUtils.GetTableName(typeof(TestTableDifferentTypesV1))));

            // Get a new Database Object to Trigger Migration
            var DatabaseV2 = GetDatabaseV2;

            Database.RegisterDataObject(typeof(TestTableDifferentTypesV1));

            Database.DeleteObject(Database.SelectAllObjects <TestTableDifferentTypesV1>());

            Assert.IsEmpty(Database.SelectAllObjects <TestTableDifferentTypesV1>(), "Test Table TestTableDifferentTypesV1 should be empty to begin this tests.");

            var datenow = DateTime.UtcNow;
            var now = new DateTime(datenow.Year, datenow.Month, datenow.Day, datenow.Hour, datenow.Minute, datenow.Second);
            var objs = new [] { "TestObj1", "TestObj2", "TestObj3" }.Select((ent, i) => new TestTableDifferentTypesV1 {
                StringValue = ent, IntValue = i, DateValue = now
            }).ToArray();

            Database.AddObject(objs);

            CollectionAssert.AreEquivalent(objs.Select(obj => obj.StringValue), Database.SelectAllObjects <TestTableDifferentTypesV1>().Select(obj => obj.StringValue), "Test Table TestTableDifferentTypesV1 Entries should be available for this test to run.");

            // Trigger False Migration
            DatabaseV2.RegisterDataObject(typeof(TestTableDifferentTypesV2));

            var newObjs = DatabaseV2.SelectAllObjects <TestTableDifferentTypesV2>().ToArray();

            CollectionAssert.AreEquivalent(objs.Select(obj => obj.StringValue), newObjs.Select(obj => obj.StringValue), "Test Table Migration to TestTableDifferentTypesV2 should retrieve similar values that created ones...");
            CollectionAssert.AreEquivalent(objs.Select(obj => obj.IntValue), newObjs.Select(obj => obj.IntValue), "Test Table Migration to TestTableDifferentTypesV2 should retrieve similar values that created ones...");
            CollectionAssert.AreEquivalent(objs.Select(obj => obj.DateValue), newObjs.Select(obj => Convert.ToDateTime(obj.DateValue)), "Test Table Migration to TestTableDifferentTypesV2 should retrieve similar values that created ones...");

            // Trigger another Migraiton
            DatabaseV2 = GetDatabaseV2;
            DatabaseV2.RegisterDataObject(typeof(TestTableDifferentTypesV1));

            var newerObjs = DatabaseV2.SelectAllObjects <TestTableDifferentTypesV1>().ToArray();

            CollectionAssert.AreEquivalent(objs.Select(obj => obj.StringValue), newerObjs.Select(obj => obj.StringValue), "Test Table Migration to TestTableDifferentTypesV1 should retrieve similar values that created ones...");
            CollectionAssert.AreEquivalent(objs.Select(obj => obj.IntValue), newerObjs.Select(obj => obj.IntValue), "Test Table Migration to TestTableDifferentTypesV1 should retrieve similar values that created ones...");
            CollectionAssert.AreEquivalent(objs.Select(obj => obj.DateValue), newerObjs.Select(obj => obj.DateValue), "Test Table Migration to TestTableDifferentTypesV1 should retrieve similar values that created ones...");
        }
コード例 #12
0
        public void TestTableMigrationFromNoPrimaryKeyToAutoInc()
        {
            // Destroy previous table
            Database.ExecuteNonQuery(string.Format("DROP TABLE IF EXISTS `{0}`", AttributesUtils.GetTableName(typeof(TestTableWithNoPrimaryV1))));

            // Get a new Database Object to Trigger Migration
            var DatabaseV2 = GetDatabaseV2;

            Database.RegisterDataObject(typeof(TestTableWithNoPrimaryV1));

            Database.DeleteObject(Database.SelectAllObjects <TestTableWithNoPrimaryV1>());

            Assert.IsEmpty(Database.SelectAllObjects <TestTableWithNoPrimaryV1>(), "Test Table TestTableWithNoPrimaryV1 should be empty to begin this tests.");

            var objs = new [] { "TestObj1", "TestObj2", "TestObj3" }.Select(ent => new TestTableWithNoPrimaryV1 {
                Value = ent
            }).ToArray();

            Database.AddObject(objs);

            CollectionAssert.AreEquivalent(objs.Select(obj => obj.Value), Database.SelectAllObjects <TestTableWithNoPrimaryV1>().Select(obj => obj.Value), "Test Table TestTableWithNoPrimaryV1 Entries should be available for this test to run.");

            // Trigger False Migration
            DatabaseV2.RegisterDataObject(typeof(TestTableWithNoPrimaryV2));

            var newObjs = DatabaseV2.SelectAllObjects <TestTableWithNoPrimaryV2>().ToArray();

            CollectionAssert.AreEquivalent(objs.Select(obj => obj.Value), newObjs.Select(obj => obj.Value), "Test Table Migration to TestTableWithNoPrimaryV2 should retrieve similar values that created ones...");

            Assert.IsTrue(newObjs.All(obj => obj.PrimaryKey != 0), "Test Table Migration to TestTableWithNoPrimaryV2 should have created and populated Primary Key Auto Increment.");

            // Trigger Another Migration
            DatabaseV2 = GetDatabaseV2;
            DatabaseV2.RegisterDataObject(typeof(TestTableWithNoPrimaryV3));

            var newerObjs = DatabaseV2.SelectAllObjects <TestTableWithNoPrimaryV3>().ToArray();

            CollectionAssert.AreEquivalent(objs.Select(obj => obj.Value), newerObjs.Select(obj => obj.Value), "Test Table Migration to TestTableWithNoPrimaryV3 should retrieve similar values that created ones...");

            Assert.IsTrue(newerObjs.All(obj => obj.PrimaryKey2 != 0), "Test Table Migration to TestTableWithNoPrimaryV3 should have created and populated Primary Key Auto Increment.");
        }
コード例 #13
0
        private static StringBuilder GetEntryQueryBuilder()
        {
            var queryBuilder = new StringBuilder();

            // generate insert query
            queryBuilder.Append("INSERT INTO ");

            // get proper table name
            string tableName = AttributesUtils.GetTableOrViewName(typeof(AuditEntry));

            if (string.IsNullOrEmpty(tableName))
            {
                // this should never, ever happen.
                throw new DatabaseException("Audit table does not exist!");
            }

            queryBuilder.Append(tableName);
            queryBuilder.Append(
                " (`AuditEntry_ID`,`AuditTime`,`AccountID`,`RemoteHost`,`AuditType`,`AuditSubtype`,`OldValue`,`NewValue`) VALUES");

            return(queryBuilder);
        }
コード例 #14
0
        /// <summary>
        /// Create new instance of <see cref="DataTableHandler"/>
        /// </summary>
        /// <param name="ObjectType">DataObject Type</param>
        public DataTableHandler(Type ObjectType)
        {
            if (!typeof(DataObject).IsAssignableFrom(ObjectType))
            {
                throw new ArgumentException("DataTableHandler can only register DataObject Types", "ObjectType");
            }

            this.ObjectType = ObjectType;
            // Init Cache and Table Params
            TableName = AttributesUtils.GetTableOrViewName(ObjectType);

            var isView = AttributesUtils.GetViewName(ObjectType) != null;

            HasRelations   = false;
            UsesPreCaching = AttributesUtils.GetPreCachedFlag(ObjectType);
            if (UsesPreCaching)
            {
                _precache = new ConcurrentDictionary <object, DataObject>();
            }

            // Parse Table Type
            ElementBindings = ObjectType.GetMembers().Select(member => new ElementBinding(member)).Where(bind => bind.IsDataElementBinding).ToArray();

            // Views Can't Handle Auto GUID Key
            if (!isView)
            {
                // If no Primary Key AutoIncrement add GUID
                if (FieldElementBindings.Any(bind => bind.PrimaryKey != null && !bind.PrimaryKey.AutoIncrement))
                {
                    ElementBindings = ElementBindings.Concat(new [] {
                        new ElementBinding(ObjectType.GetProperty("ObjectId"),
                                           new DataElement()
                        {
                            Unique = true
                        },
                                           string.Format("{0}_ID", TableName))
                    }).ToArray();
                }
                else if (FieldElementBindings.All(bind => bind.PrimaryKey == null))
                {
                    ElementBindings = ElementBindings.Concat(new [] {
                        new ElementBinding(ObjectType.GetProperty("ObjectId"),
                                           new PrimaryKey(),
                                           string.Format("{0}_ID", TableName))
                    }).ToArray();
                }
            }

            // Prepare Table
            Table = new DataTable(TableName);
            var multipleUnique = new List <ElementBinding>();
            var indexes        = new Dictionary <string, ElementBinding[]>();

            //Build Table for DataSet
            foreach (var bind in ElementBindings)
            {
                if (bind.Relation != null)
                {
                    HasRelations = true;
                    continue;
                }

                var column = Table.Columns.Add(bind.ColumnName, bind.ValueType);

                if (bind.PrimaryKey != null)
                {
                    column.AutoIncrement = bind.PrimaryKey.AutoIncrement;
                    Table.PrimaryKey     = new [] { column };
                }

                if (bind.DataElement != null)
                {
                    column.AllowDBNull = bind.DataElement.AllowDbNull;

                    // Store Multi Unique for definition after table
                    // Single Unique can be defined directly.
                    if (!string.IsNullOrEmpty(bind.DataElement.UniqueColumns))
                    {
                        multipleUnique.Add(bind);
                    }
                    else if (bind.DataElement.Unique)
                    {
                        Table.Constraints.Add(new UniqueConstraint(string.Format("U_{0}_{1}", TableName, bind.ColumnName), column));
                    }

                    // Store Indexes for definition after table
                    if (!string.IsNullOrEmpty(bind.DataElement.IndexColumns))
                    {
                        indexes.Add(string.Format("I_{0}_{1}", TableName, bind.ColumnName), bind.DataElement.IndexColumns.Split(',')
                                    .Select(col => FieldElementBindings.FirstOrDefault(ind => ind.ColumnName.Equals(col.Trim(), StringComparison.OrdinalIgnoreCase)))
                                    .Concat(new [] { bind }).ToArray());
                    }
                    else if (bind.DataElement.Index)
                    {
                        indexes.Add(string.Format("I_{0}_{1}", TableName, bind.ColumnName), new [] { bind });
                    }

                    if (bind.DataElement.Varchar > 0)
                    {
                        column.ExtendedProperties.Add("VARCHAR", bind.DataElement.Varchar);
                    }
                }
            }

            // Set Indexes when all columns are set
            Table.ExtendedProperties.Add("INDEXES", indexes.Select(kv => new KeyValuePair <string, DataColumn[]>(
                                                                       kv.Key,
                                                                       kv.Value.Select(bind => Table.Columns[bind.ColumnName]).ToArray()))
                                         .ToDictionary(kv => kv.Key, kv => kv.Value));

            // Set Unique Constraints when all columns are set.
            foreach (var bind in multipleUnique)
            {
                var columns = bind.DataElement.UniqueColumns.Split(',').Select(column => column.Trim()).Concat(new [] { bind.ColumnName });
                Table.Constraints.Add(new UniqueConstraint(string.Format("U_{0}_{1}", TableName, bind.ColumnName),
                                                           columns.Select(column => Table.Columns[column]).ToArray()));
            }
        }
コード例 #15
0
        /// <summary>
        /// Populate or Refresh Objects Relations
        /// </summary>
        /// <param name="dataObjects">Objects to Populate</param>
        /// <param name="force">Force Refresh even if Autoload is False</param>
        protected virtual void FillObjectRelations(IEnumerable <DataObject> dataObjects, bool force)
        {
            var groups = dataObjects.GroupBy(obj => obj.GetType());

            foreach (var grp in groups)
            {
                var dataType  = grp.Key;
                var tableName = AttributesUtils.GetTableOrViewName(dataType);
                try
                {
                    DataTableHandler tableHandler;
                    if (!TableDatasets.TryGetValue(tableName, out tableHandler))
                    {
                        throw new DatabaseException(string.Format("Table {0} is not registered for Database Connection...", tableName));
                    }

                    if (!tableHandler.HasRelations)
                    {
                        return;
                    }

                    var relations = tableHandler.ElementBindings.Where(bind => bind.Relation != null);
                    foreach (var relation in relations)
                    {
                        // Check if Loading is needed
                        if (!(relation.Relation.AutoLoad || force))
                        {
                            continue;
                        }

                        var remoteName = AttributesUtils.GetTableOrViewName(relation.ValueType);
                        try
                        {
                            DataTableHandler remoteHandler;
                            if (!TableDatasets.TryGetValue(remoteName, out remoteHandler))
                            {
                                throw new DatabaseException(string.Format("Table {0} is not registered for Database Connection...", remoteName));
                            }

                            // Select Object On Relation Constraint
                            var localBind  = tableHandler.FieldElementBindings.Single(bind => bind.ColumnName.Equals(relation.Relation.LocalField, StringComparison.OrdinalIgnoreCase));
                            var remoteBind = remoteHandler.FieldElementBindings.Single(bind => bind.ColumnName.Equals(relation.Relation.RemoteField, StringComparison.OrdinalIgnoreCase));

                            FillObjectRelationsImpl(relation, localBind, remoteBind, remoteHandler, grp);
                        }
                        catch (Exception re)
                        {
                            if (log.IsErrorEnabled)
                            {
                                log.ErrorFormat("Could not Retrieve Objects from Relation (Table {0}, Local {1}, Remote Table {2}, Remote {3})\n{4}", tableName,
                                                relation.Relation.LocalField, AttributesUtils.GetTableOrViewName(relation.ValueType), relation.Relation.RemoteField, re);
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    if (log.IsErrorEnabled)
                    {
                        log.ErrorFormat("Could not Resolve Relations for Table {0}\n{1}", tableName, e);
                    }
                }
            }
        }
コード例 #16
0
        /// <summary>
        /// Unload a DataObject Type to XML File
        /// </summary>
        /// <param name="t"></param>
        public static void UnloadXMLTable(Type t, string directory)
        {
            if (t == null || !typeof(DataObject).IsAssignableFrom(t))
            {
                if (log.IsInfoEnabled)
                {
                    log.InfoFormat("Null Type or Incompatible Type in UnloadXMLTable Call: {0}", Environment.StackTrace);
                }
            }

            try
            {
                // Get all object "Method" Through Reflection
                var classMethod   = GameServer.Database.GetType().GetMethod("SelectAllObjects", Type.EmptyTypes);
                var genericMethod = classMethod.MakeGenericMethod(t);

                // Get Table Name
                var attrib = t.GetCustomAttributes <DataTable>(false);
                if (attrib.Any())
                {
                    var tableName = AttributesUtils.GetTableName(t);

                    var path = string.Format("{0}{1}{2}.xml", directory, Path.DirectorySeparatorChar, tableName);

                    if (log.IsInfoEnabled)
                    {
                        log.InfoFormat("Unloading Table {0} - To file {1}", tableName, path);
                    }

                    var objects = (IEnumerable)genericMethod.Invoke(GameServer.Database, new object[] { });

                    try
                    {
                        // Try Sorting them !
                        var remarkables = DatabaseUtils.GetRemarkableMembers(t, true);

                        if (remarkables.Length > 0)
                        {
                            var firstOrder = objects.Cast <DataObject>().OrderBy(o => remarkables.First().GetValue(o));
                            foreach (var remarkable in remarkables.Skip(1))
                            {
                                var followingOrder = firstOrder.ThenBy(o => remarkable.GetValue(o));
                                firstOrder = followingOrder;
                            }

                            // Dynamic cast
                            var castMethods    = typeof(Enumerable).GetMethod("Cast");
                            var castGeneric    = castMethods.MakeGenericMethod(t);
                            var toArrayMethod  = typeof(Enumerable).GetMethod("ToArray");
                            var toArrayGeneric = toArrayMethod.MakeGenericMethod(t);

                            objects = (IEnumerable)toArrayGeneric.Invoke(null, new object[] { castGeneric.Invoke(null, new object[] { firstOrder }) });
                        }
                    }
                    catch (Exception oe)
                    {
                        if (log.IsWarnEnabled)
                        {
                            log.WarnFormat("Error while sorting Table {0} for XML Unload, Probably Unsorted... - {1}", tableName, oe);
                        }
                    }

                    // Delete Older Files
                    if (File.Exists(path))
                    {
                        File.Delete(path);
                    }

                    // Write XML DataTable
                    var serializer = GetXMLSerializer(t.MakeArrayType(), t);
                    using (var writer = new StreamWriter(path))
                    {
                        serializer.Serialize(writer, objects);
                    }
                }
            }
            catch (Exception ex)
            {
                if (log.IsWarnEnabled)
                {
                    log.WarnFormat("Could Not Unload Table {0}: {1}", t, ex);
                }
            }
        }
コード例 #17
0
        /// <summary>
        /// Check For UnloadXML Args
        /// </summary>
        /// <param name="client"></param>
        /// <param name="args"></param>
        public void OnCommand(GameClient client, string[] args)
        {
            if (args.Length < 2)
            {
                DisplaySyntax(client);
                return;
            }

            var types = LoaderUnloaderXML.GetAllDataTableTypes();

            var argTable = args[1];

            // Prepare Write Path
            var directory = Path.IsPathRooted(XML_UNLOAD_DB_DIRECTORY) ? XML_UNLOAD_DB_DIRECTORY : string.Format("{0}{1}scripts{1}{2}", GameServer.Instance.Configuration.RootDirectory, Path.DirectorySeparatorChar, XML_UNLOAD_DB_DIRECTORY);

            if (!Directory.Exists(directory))
            {
                Directory.CreateDirectory(directory);
            }


            switch (argTable)
            {
            case "full":
                foreach (Type table in types)
                {
                    var dir         = directory;
                    var workingType = table;
                    System.Threading.Tasks.Task.Factory.StartNew(() => LoaderUnloaderXML.UnloadXMLTable(workingType, dir));
                }
                break;

            default:
                var finddir  = directory;
                var findType = types.FirstOrDefault(t => t.Name.Equals(argTable, StringComparison.OrdinalIgnoreCase) || AttributesUtils.GetTableName(t).Equals(argTable, StringComparison.OrdinalIgnoreCase));
                if (findType == null)
                {
                    DisplaySyntax(client);
                    if (log.IsInfoEnabled)
                    {
                        log.InfoFormat("Could not find table to unload with search string : {0}", argTable);
                    }
                    return;
                }

                System.Threading.Tasks.Task.Factory.StartNew(() => LoaderUnloaderXML.UnloadXMLTable(findType, finddir));
                break;
            }
        }