Also, how does this is related to the Insert=True|False and
Update=True|False mapping attributes?

Cheers,
Henry Conceição



On Mon, Nov 29, 2010 at 2:14 PM, Patrick Earl <[email protected]> wrote:
> 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].
>> 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.
>

-- 
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