2004-05-15 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Sat, 15 May 2004 08:54:45 +0000 (08:54 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Sat, 15 May 2004 08:54:45 +0000 (08:54 -0000)
* CustomDataClassGenerator.cs :
  Added property parent "[foo]Row" and children "Get[foo]Row" support
  for custom DataRow classes.
  Fixed DataColumn property accessibility (public --> internal).

svn path=/trunk/mcs/; revision=27439

mcs/class/System.Data/System.Data/ChangeLog
mcs/class/System.Data/System.Data/CustomDataClassGenerator.cs

index 0d12699d37bfede3a43caf7ff1f8195c3c4e1152..d82983e02130c6c5a7cc5e69dea9a74fe741e6b6 100644 (file)
@@ -1,3 +1,10 @@
+2004-05-15  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * CustomDataClassGenerator.cs :
+         Added property parent "[foo]Row" and children "Get[foo]Row" support
+         for custom DataRow classes.
+         Fixed DataColumn property accessibility (public --> internal).
+
 2004-05-14  Atsushi Enomoto  <atsushi@ximian.com>
 
        * CustomDataClassGenerator.cs :
index d0b48df2b61e02e39bd956a0cb2ae0f2b27945dc..ab45983d93ce75195c0bffeb01dcbeae4b6c9f9f 100755 (executable)
@@ -330,6 +330,11 @@ namespace System.Data
                        return new CodeCastExpression (t, exp);
                }
 
+               private CodeCastExpression Cast (CodeTypeReference t, CodeExpression exp)
+               {
+                       return new CodeCastExpression (t, exp);
+               }
+
                private CodeExpression New (Type t, params CodeExpression [] parameters)
                {
                        return new CodeObjectCreateExpression (t, parameters);
@@ -991,7 +996,7 @@ namespace System.Data
                        string name = opts.ColumnName (col.ColumnName, gen);
                        CodeMemberProperty p = new CodeMemberProperty ();
                        p.Name = name + "Column";
-                       p.Attributes = MemberAttributes.Public;
+                       p.Attributes = MemberAttributes.Assembly;
                        p.Type = TypeRef (typeof (DataColumn));
                        p.HasSet = false;
                        p.GetStatements.Add (Return (FieldRef ("__column" + name)));
@@ -1160,12 +1165,6 @@ namespace System.Data
 
 
 #region Row class
-/*
-TODO:
-       if the table is parent of some relations
-
-               public [child]Row [] Get[child]Rows()
-*/
 
                public CodeTypeDeclaration GenerateDataRowType (DataTable dt)
                {
@@ -1185,10 +1184,10 @@ TODO:
                                }
                        }
 
-                       // TODO: for parent table, create [foo]Row [foo]Row
-
-                       // TODO: for each parent key column, create
-                       // GetXxxRows()
+                       foreach (DataRelation rel in dt.ParentRelations)
+                               t.Members.Add (CreateRowParentRowProperty (dt, rel));
+                       foreach (DataRelation rel in dt.ChildRelations)
+                               t.Members.Add (CreateRowGetChildRows (dt, rel));
 
                        return t;
                }
@@ -1274,6 +1273,53 @@ TODO:
                        return m;
                }
 
+               private CodeMemberProperty CreateRowParentRowProperty (DataTable dt, DataRelation rel)
+               {
+                       CodeMemberProperty p = new CodeMemberProperty ();
+                       p.Name = opts.TableMemberName (rel.ParentTable.TableName, gen) + "Row";
+                       p.Attributes = MemberAttributes.Public;
+                       p.Type = TypeRef (opts.RowName (rel.ParentTable.TableName, gen));
+                       p.GetStatements.Add (Return (Cast (p.Type, MethodInvoke (
+                               "GetParentRow",
+                               IndexerRef (
+                                       PropRef (
+                                               PropRef (
+                                                       PropRef ("Table"),
+                                                       "DataSet"),
+                                               "Relations"),
+                                       Const (rel.RelationName))))));
+                       p.SetStatements.Add (Eval (MethodInvoke (
+                               "SetParentRow",
+                               new CodePropertySetValueReferenceExpression (),
+                               IndexerRef (
+                                       PropRef (
+                                               PropRef (
+                                                       PropRef ("Table"),
+                                                       "DataSet"),
+                                               "Relations"),
+                                       Const (rel.RelationName)))));
+
+                       return p;
+               }
+
+               private CodeMemberMethod CreateRowGetChildRows (DataTable dt, DataRelation rel)
+               {
+                       CodeMemberMethod m = new CodeMemberMethod ();
+                       m.Name = "Get" + opts.TableMemberName (rel.ChildTable.TableName, gen) + "Rows";
+                       m.Attributes = MemberAttributes.Public;
+                       m.ReturnType = new CodeTypeReference (opts.RowName (rel.ChildTable.TableName, gen), 1);
+                       m.Statements.Add (Return (Cast (m.ReturnType, MethodInvoke (
+                               "GetChildRows",
+                               IndexerRef (
+                                       PropRef (
+                                               PropRef (
+                                                       PropRef ("Table"),
+                                                       "DataSet"),
+                                               "Relations"),
+                                       Const (rel.RelationName))))));
+                       return m;
+               }
+
 #endregion