/// <summary> /// データベースアイテムのリストを作成する。 /// </summary> /// <param name="project">プロジェクト情報のインスタンス。</param> /// <param name="file">データベースファイル名。</param> /// <returns>データベースアイテムのリスト。</returns> public static List<ListItem> CreateDatabaseItemList( WarlockProject project, string file) { try { var itemDefinition = project.FindDatabaseDefinition(file); if (itemDefinition == null) { return new List<ListItem>(); } List<dynamic> items = project.LoadDatabase(itemDefinition); var ret = new List<ListItem>(); foreach (var i in items) { DatabaseClassData item = i; if (item == null) continue; ret.Add(new ListItem() { Text = String.Format( String.Format( "{{0:{0}}}:{{1}}", new String('0', (items.Count - 1).ToString().Length) ), item.Variables["id"], item.Variables["name"] ), Value = item.Variables["id"] }); } return ret; } catch { return new List<ListItem>(); } }
/// <summary> /// データベースで使用中のデータベースの一覧を取得する。 /// </summary> /// <param name="project">プロジェクト情報のインスタンス。</param> /// <returns>データベースで使用中のデータベースの一覧。</returns> private List<DatabaseDefinition> FindUsingDatabase(WarlockProject project) { var ret = new List<DatabaseDefinition>(); var dataClass = project.FindClassDefinition(this.DataClass); if (dataClass == null) return ret; var checkingStack = new List<ClassDefinition>(); Action<DatabaseDefinition> recursive = null; recursive = (database) => { if (!ret.Contains(database)) ret.Add(database); var clazz = project.FindClassDefinition(this.DataClass); if (clazz == null) return; if (checkingStack.Contains(clazz)) return; checkingStack.Add(clazz); foreach (var accessor in clazz.Accessors) { if (!accessor.IsBasicValueType) { var accessorData = project.FindDatabaseDefinition(accessor.ValueType); if (accessorData == null) continue; recursive(accessorData); } } checkingStack.Remove(clazz); }; foreach (var accessor in dataClass.Accessors) { if (!accessor.IsBasicValueType) { var accessorData = project.FindDatabaseDefinition(accessor.ValueType); if (accessorData == null) continue; recursive(accessorData); } } return ret; }
/// <summary> /// データベース定義を使用しているクラスの一覧を取得する。 /// </summary> ///// <param name="project">プロジェクト情報のインスタンス。</param> /// <returns></returns> public List<dynamic> FindUsingClass(WarlockProject project) { var ret = new List<dynamic>(); var dataClass = project.FindClassDefinition(this.DataClass); if (dataClass == null) return ret; List<dynamic> extendClasses = dataClass.GetExtendClasses(project); extendClasses.Reverse(); var checkingStack = new List<ClassDefinition>(); Action<ClassDefinition> recursive = null; recursive = (clazz) => { if (!ret.Contains(clazz)) ret.Add(clazz); if (checkingStack.Contains(clazz)) return; checkingStack.Add(clazz); foreach (var accessor in clazz.Accessors) { if (!accessor.IsBasicValueType) { var accessorData = project.FindDatabaseDefinition(accessor.ValueType); if (accessorData == null) continue; var accessorClass = project.FindClassDefinition(accessorData.DataClass); if (accessorClass == null) continue; recursive(accessorClass); } } checkingStack.Remove(clazz); }; foreach (var extendClass in extendClasses) { ret.Add(extendClass); if (extendClass is ClassDefinition) { var castedExtendClass = (ClassDefinition)extendClass; recursive(castedExtendClass); } } return ret; }