Hi Ian.

Thanks for thinking to contribute.  It's pretty straight-forward to get
going with GIT if you use something like TortoiseGIT.  You can just clone a
repo you've forked on github, commit, then push.  It helps the team
significantly if your patch is easier to apply.

In any case, it would be better to use an enum to specify the generated
type.

       Patrick Earl

On Mon, Nov 29, 2010 at 6:16 AM, [email protected] <
[email protected]> wrote:

> Hi,
>
> I've subscribed to the Dev List for a while and have been encouraged
> to submit a new feature for Castle.ActiveRecord. nHibermnate has the
> ability (via mapping files) to specify if a field is generated or not
> (none|insert|always).
>
> I've added support to my local ActiveRecord source and have the
> following test to ensure it's implemented ok. As I'm not a committer I
> hoped I could post it up and hope that someone could commit it for me
> (with perhaps a mention). Anyway if I'm going about this all wrong
> please let me know, but I think it's a handy feature to add to
> ActiveRecord.....
>
> I've provided the test and detailed some of the code I used to get it
> working... but I'm sure there could be a better way,
>
>
> Cheers
> ian pender
>
> test :
> namespace Castle.ActiveRecord.Framework.Internal.Tests.Model
> {
>        using Castle.ActiveRecord;
>
>        [ActiveRecord]
>    public class ClassWithGeneratedProperties : ActiveRecordBase
>        {
>                [PrimaryKey]
>                public int Id { get; set; }
>
>        [Property(GeneratedType = "insert")]
>        public int ColumnGeneratedInsert { get; set; }
>
>        [Property(GeneratedType = "none")]
>        public int ColumnGeneratedNone { get; set; }
>
>        [Property(GeneratedType = "always")]
>        public int ColumnGeneratedAlways { get; set; }
>
>        [Property]
>        public int ColumnNoGenerated { get; set; }
>    }
> }
>
> namespace Castle.ActiveRecord.Framework.Internal.Tests :
>
>        XmlGenerationTestCase
>
>        [Test]
>        public void SimpleCaseGeneratedType()
>        {
>            ActiveRecordModelBuilder builder = new
> ActiveRecordModelBuilder();
>            ActiveRecordModel model =
> builder.Create(typeof(ClassWithGeneratedProperties));
>            Assert.IsNotNull(model);
>
>            SemanticVerifierVisitor semanticVisitor = new
> SemanticVerifierVisitor(builder.Models);
>            semanticVisitor.VisitNode(model);
>
>            XmlGenerationVisitor xmlVisitor = new
> XmlGenerationVisitor();
>            xmlVisitor.CreateXml(model);
>
>            String xml = xmlVisitor.Xml;
>
>            const string expected =
>                "<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n" +
>                "<hibernate-mapping  auto-import=\"true\" default-lazy=
> \"false\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"; xmlns:xsi=
> \"http://www.w3.org/2001/XMLSchema-instance\"; xmlns=\"urn:nhibernate-
> mapping-2.2\">\r\n" +
>                "  <class name=
>
> \"Castle.ActiveRecord.Framework.Internal.Tests.Model.ClassWithGeneratedProperties,
> Castle.ActiveRecord.Framework.Internal.Tests\" table=
> \"ClassWithGeneratedProperties\">\r\n" +
>                "    <id name=\"Id\" access=\"property\" column=\"Id\"
> type=\"Int32\" unsaved-value=\"0\">\r\n" +
>                "      <generator class=\"native\">\r\n" +
>                "      </generator>\r\n" +
>                "    </id>\r\n" +
>                "    <property name=\"ColumnGeneratedInsert\" access=
> \"property\" type=\"Int32\" generated=\"insert\">\r\n" +
>                "      <column name=\"ColumnGeneratedInsert\"/>\r\n" +
>                "    </property>\r\n" +
>                "    <property name=\"ColumnGeneratedNone\" access=
> \"property\" type=\"Int32\" generated=\"none\">\r\n" +
>                "      <column name=\"ColumnGeneratedNone\"/>\r\n" +
>                "    </property>\r\n" +
>                "    <property name=\"ColumnGeneratedAlways\" access=
> \"property\" type=\"Int32\" generated=\"always\">\r\n" +
>                "      <column name=\"ColumnGeneratedAlways\"/>\r\n" +
>                "    </property>\r\n" +
>                "    <property name=\"ColumnNoGenerated\" access=
> \"property\" type=\"Int32\">\r\n" +
>                "      <column name=\"ColumnNoGenerated\"/>\r\n" +
>                "    </property>\r\n" +
>                "  </class>\r\n" +
>                "</hibernate-mapping>\r\n";
>
>            Assert.AreEqual(expected, xml);
>        }
>
> I got this test working by adding to
>
> namespace Castle.ActiveRecord.PropertyAttribute
>
>        /// <summary>
>        /// Set to never|insert|always to specify how the property is
> generated. If blank not included in mapping
>        /// </summary>
>        public string GeneratedType
>        {
>            get { return generatedType; }
>            set { generatedType = value; }
>        }
>
> and amending
>
> namespace Castle.ActiveRecord.Framework.Internal
>
> public class XmlGenerationVisitor : AbstractDepthFirstVisitor
>
>
>            private void WriteProperty(String name, Type propType, String
> accessString, String columnType,
>                                           bool insert, bool update, String
> formula,
>                                           String column, int length, bool
> notNull,
> bool unique,
>                                           String uniqueKey, String sqlType,
> String
> index, String check, String @default)
>                {
>                        WriteProperty(name, propType, accessString,
> columnType, insert,
> update, formula, column,
>                length, notNull, unique, uniqueKey, sqlType, index,
> check, @default, null);
>                }
>
>                    private void WriteProperty(String name, Type propType,
> String accessString, String columnType,
>                                           bool insert, bool update, String
> formula,
>                                           String column, int length, bool
> notNull,
> bool unique,
>                                           String uniqueKey, String sqlType,
> String
> index, String check, String @default,
>                                           string generatedFlag)
>            {
>            BeginWriteProperty(accessString, columnType, formula,
> insert, name, propertyType, update, generatedFlag);
>
>            Ident();
>
>            WriteColumn(check, column, index, length, notNull,
> sqlType, unique, uniqueKey, @default);
>
>            Dedent();
>
>            EndWriteProperty();
>            }
>
> and finally
>
>            private void BeginWriteProperty(string accessString,
>                                            string columnType,
>                                            string formula,
>                                            bool insert,
>                                            string name,
>                                            Type propertyType,
>                                            bool update,
>                                        string generatedValue)
>            {
>            AppendF("<property{0}{1}{2}{3}{4}{5}{6}>",
>                     MakeAtt("name", name),
>                     WriteIfNonNull("access", accessString),
>                     MakeTypeAtt(propertyType, columnType),
>                     WriteIfFalse("insert", insert),
>                     WriteIfFalse("update", update),
>                     WriteIfNonNull("formula", formula),
>                     WriteIfNonNull("generated", generatedValue));
>            }
>
> --
> You received this message because you are subscribed to the Google Groups
> "Castle Project Development List" group.
> To post to this group, send email to [email protected]
> .
> To unsubscribe from this group, send email to
> [email protected]<castle-project-devel%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/castle-project-devel?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Castle Project Development List" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/castle-project-devel?hl=en.

Reply via email to