コード例 #1
0
 /// <summary>
 /// Appends a SELECT clause according to the properties of <typeparamref name="TData"/>
 /// </summary>
 /// <typeparam name="TData">Data record type</typeparam>
 /// <returns>SELECT clause</returns>
 public SqlExpression Select <TData>()
 {
     return(Select(RecordMetadataManager
                   .GetMetadata(typeof(TData))
                   .DataColumns
                   .Select(c => c.ColumnName)));
 }
コード例 #2
0
        /// <summary>
        /// Appends a FROM clause using the specified type argument
        /// </summary>
        /// <typeparam name="T1">Table name #1</typeparam>
        /// <typeparam name="T2">Table name #2</typeparam>
        /// <returns>FROM clause</returns>
        public SqlExpression From <T1, T2>()
            where T1 : IDataRecord
            where T2 : IDataRecord
        {
            var t1Name = RecordMetadataManager.GetMetadata <T1>().TableName;
            var t2Name = RecordMetadataManager.GetMetadata <T2>().TableName;

            return(From(t1Name, t2Name));
        }
コード例 #3
0
        public void SimplePocoWithSchemaNameWorks()
        {
            // --- Act
            var meta = RecordMetadataManager.GetMetadata(typeof(SimplePoco3));

            // --- Assert
            meta.ShouldNotBeNull();
            meta.TableName.ShouldEqual("Poco3");
            meta.SchemaName.ShouldEqual("Poco");
        }
コード例 #4
0
        public void SimplePocoMetadataWorksWithGenericMethod()
        {
            // --- Act
            var meta = RecordMetadataManager.GetMetadata <SimplePoco1>();

            // --- Assert
            meta.ShouldNotBeNull();
            meta.IsSimplePoco.ShouldBeTrue();
            meta.IsImmutable.ShouldBeFalse();
            meta.SchemaName.ShouldBeNull();
            meta.TableName.ShouldBeNull();
            meta.DataColumns.ShouldHaveCountOf(3);
        }
コード例 #5
0
        public void SimplePocoMetadataWorks()
        {
            // --- Act
            var meta = RecordMetadataManager.GetMetadata(typeof(SimplePoco1));

            // --- Assert
            meta.ShouldNotBeNull();
            meta.IsSimplePoco.ShouldBeTrue();
            meta.IsImmutable.ShouldBeFalse();
            meta.SchemaName.ShouldBeNull();
            meta.TableName.ShouldBeNull();
            meta.DataColumns.ShouldHaveCountOf(3);

            var col = meta["IntProp"];

            col.ShouldNotBeNull();
            col.Name.ShouldEqual("IntProp");
            col.ColumnName.ShouldEqual("IntProp");
            col.ClrType.ShouldEqual(typeof(int));
            col.IsAutoGenerated.ShouldBeFalse();
            col.IsCalculated.ShouldBeFalse();
            col.IsVersionColumn.ShouldBeFalse();
            col.PkOrder.ShouldBeNull();

            col = meta["StringProp"];
            col.ShouldNotBeNull();
            col.Name.ShouldEqual("StringProp");
            col.ColumnName.ShouldEqual("StringProp");
            col.ClrType.ShouldEqual(typeof(string));
            col.IsAutoGenerated.ShouldBeFalse();
            col.IsCalculated.ShouldBeFalse();
            col.IsVersionColumn.ShouldBeFalse();
            col.PkOrder.ShouldBeNull();

            col = meta["NewProp"];
            col.ShouldNotBeNull();
            col.Name.ShouldEqual("RenamedProp");
            col.ColumnName.ShouldEqual("NewProp");
            col.ClrType.ShouldEqual(typeof(int));
            col.IsAutoGenerated.ShouldBeFalse();
            col.IsCalculated.ShouldBeFalse();
            col.IsVersionColumn.ShouldBeFalse();
            col.PkOrder.ShouldBeNull();
        }
コード例 #6
0
        public void DataRecordDescriptorIndexerWorks()
        {
            // --- Act
            var meta = RecordMetadataManager.GetMetadata(typeof(Record2));

            // --- Assert
            meta.ShouldNotBeNull();
            meta.ContainsColumn("Id").ShouldBeTrue();
            meta.ContainsColumn("DisplayName").ShouldBeTrue();
            meta.ContainsColumn("Description").ShouldBeTrue();
            meta.ContainsColumn("RowVersion").ShouldBeTrue();
            meta.ContainsColumn("Counter").ShouldBeTrue();

            meta.ContainsColumn("Guid").ShouldBeFalse();
            meta.ContainsColumn("Ignored").ShouldBeFalse();

            meta.DataColumns.ShouldContain(meta[0]);
            meta.DataColumns.ShouldContain(meta[1]);
            meta.DataColumns.ShouldContain(meta[2]);
            meta.DataColumns.ShouldContain(meta[3]);
            meta.DataColumns.ShouldContain(meta[4]);
        }
コード例 #7
0
        /// <summary>
        /// Appends a FROM clause using the specified type argument
        /// </summary>
        /// <typeparam name="T1">Table name</typeparam>
        /// <returns>FROM clause</returns>
        public SqlExpression From <T1>()
        {
            var t1Name = RecordMetadataManager.GetMetadata <T1>().TableName;

            return(From(t1Name));
        }
コード例 #8
0
 public void SourceConverterWithInvalidConverterTypeFails2()
 {
     // --- Act
     RecordMetadataManager.GetMetadata(typeof(Record6));
 }
コード例 #9
0
 public void SourceConverterWithNullConverterTypeFails()
 {
     // --- Act
     RecordMetadataManager.GetMetadata(typeof(Record4));
 }
コード例 #10
0
 public void Initialize()
 {
     RecordMetadataManager.Reset();
 }
コード例 #11
0
        public void DataRecordWorks()
        {
            // --- Act
            // --- Must work for the second request as well
            RecordMetadataManager.GetMetadata(typeof(Record2));
            var meta = RecordMetadataManager.GetMetadata(typeof(Record2));

            // --- Assert
            meta.ShouldNotBeNull();
            meta.SchemaName.ShouldEqual("MySchema");
            meta.TableName.ShouldEqual("Record2");
            meta.IsImmutable.ShouldBeFalse();
            meta.IsSimplePoco.ShouldBeFalse();
            meta.DataColumns.ShouldHaveCountOf(5);
            meta.PrimaryKeyColumns.ShouldHaveCountOf(1);

            var col = meta["Id"];

            col.ShouldNotBeNull();
            col.Name.ShouldEqual("Id");
            col.ColumnName.ShouldEqual("Id");
            col.ClrType.ShouldEqual(typeof(int));
            col.IsAutoGenerated.ShouldBeTrue();
            col.IsCalculated.ShouldBeFalse();
            col.IsVersionColumn.ShouldBeFalse();
            col.PkOrder.ShouldEqual(0);

            col = meta["DisplayName"];
            col.ShouldNotBeNull();
            col.Name.ShouldEqual("Name");
            col.ColumnName.ShouldEqual("DisplayName");
            col.ClrType.ShouldEqual(typeof(string));
            col.IsAutoGenerated.ShouldBeFalse();
            col.IsCalculated.ShouldBeFalse();
            col.IsVersionColumn.ShouldBeFalse();
            col.PkOrder.ShouldBeNull();

            col = meta["Description"];
            col.ShouldNotBeNull();
            col.Name.ShouldEqual("Description");
            col.ColumnName.ShouldEqual("Description");
            col.ClrType.ShouldEqual(typeof(string));
            col.IsAutoGenerated.ShouldBeFalse();
            col.IsCalculated.ShouldBeFalse();
            col.IsVersionColumn.ShouldBeFalse();
            col.PkOrder.ShouldBeNull();

            col = meta["RowVersion"];
            col.ShouldNotBeNull();
            col.Name.ShouldEqual("RowVersion");
            col.ColumnName.ShouldEqual("RowVersion");
            col.ClrType.ShouldEqual(typeof(byte[]));
            col.IsAutoGenerated.ShouldBeFalse();
            col.IsCalculated.ShouldBeFalse();
            col.IsVersionColumn.ShouldBeTrue();
            col.PkOrder.ShouldBeNull();

            col = meta["Counter"];
            col.ShouldNotBeNull();
            col.Name.ShouldEqual("Counter");
            col.ColumnName.ShouldEqual("Counter");
            col.ClrType.ShouldEqual(typeof(decimal));
            col.IsAutoGenerated.ShouldBeFalse();
            col.IsCalculated.ShouldBeTrue();
            col.IsVersionColumn.ShouldBeFalse();
            col.PkOrder.ShouldBeNull();
        }
コード例 #12
0
 public void RecordFailsWithNoTableName()
 {
     // --- Act
     RecordMetadataManager.GetMetadata(typeof(Record1));
 }
コード例 #13
0
 public void GetMetadataFailsWithNull()
 {
     // --- Act
     RecordMetadataManager.GetMetadata(null);
 }
コード例 #14
0
        /// <summary>
        /// Creates a mapper for the specified type and data reader.
        /// </summary>
        /// <typeparam name="T">Data record type</typeparam>
        /// <param name="reader">IDataReader instance</param>
        /// <param name="instance">Optional instance to map the data reader into.</param>
        /// <returns>Mapper function</returns>
        public static Func <IDataReader, T, T> CreateMapper <T>(IDataReader reader, object instance = null)
        {
            // --- Create a dynamic method
            var mapperMethod = new DynamicMethod("FetchFactory" + s_Mappers.Count,
                                                 typeof(T),
                                                 new[] { typeof(IDataReader), typeof(T) },
                                                 true);
            var il         = mapperMethod.GetILGenerator();
            var metadata   = RecordMetadataManager.GetMetadata <T>();
            var dataObject = il.DeclareLocal(typeof(T));

            if (instance == null)
            {
                // --- Create a new instance of T
                il.Emit(OpCodes.Newobj, typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
                                                                 null, Type.EmptyTypes, null));
            }
            else
            {
                // --- Use the default instance
                il.Emit(OpCodes.Ldarg_1);
            }
            il.Emit(OpCodes.Stloc, dataObject);

            // --- Go through all data reader fields
            for (var i = 0; i < reader.FieldCount; i++)
            {
                // --- Skip columns not in the data record
                var columnInfo = metadata[reader.GetName(i)];
                if (columnInfo == null)
                {
                    continue;
                }

                // --- Check if the current field is a DBNull value
                il.Emit(OpCodes.Ldarg_0);                   // reader
                il.Emit(OpCodes.Ldc_I4, i);                 // reader, i
                il.Emit(OpCodes.Callvirt, s_FnIsDbNull);    // bool
                var lblNext = il.DefineLabel();
                il.Emit(OpCodes.Brtrue_S, lblNext);

                // --- Push the data object to the stack
                il.Emit(OpCodes.Ldloc, dataObject);         // dataobject

                // --- Check for custom source converter
                Func <object, object> converter = null;
                if (columnInfo.SourceConverters != null)
                {
                    foreach (var sourceConverter in columnInfo.SourceConverters)
                    {
                        if (sourceConverter.GetDataType() != reader.GetFieldType(i))
                        {
                            continue;
                        }
                        converter = sourceConverter.ConvertFromDataType;
                        break;
                    }
                }
                if (converter == null)
                {
                    converter = GetConverter(reader.GetFieldType(i), columnInfo.ClrType);
                }

                // --- If there is a converter, push it to the stack
                if (converter != null)
                {
                    var converterIndex = s_Converters.Count;
                    s_Converters.Add(converter);

                    // --- Push the converter onto the stack
                    il.Emit(OpCodes.Ldsfld, s_FldConverters);
                    il.Emit(OpCodes.Ldc_I4, converterIndex);
                    il.Emit(OpCodes.Callvirt, s_FnListGetItem);
                }

                // --- Get the field value
                il.Emit(OpCodes.Ldarg_0);                   // dataobject, (converter),  reader
                il.Emit(OpCodes.Ldc_I4, i);                 // dataobject, (converter),  reader, i
                il.Emit(OpCodes.Callvirt, s_FnGetValue);    // datobject, (converter),  fieldvalue

                // --- Use the converter
                if (converter != null)
                {
                    il.Emit(OpCodes.Callvirt, s_FnInvoke);  // dataobject, converted_fieldvalue
                }

                // --- Store the value to the appropriate field
                il.Emit(OpCodes.Unbox_Any, columnInfo.ClrType);
                il.Emit(OpCodes.Callvirt, columnInfo.PropertyInfo.GetSetMethod(true));

                // --- Continue with the next field
                il.MarkLabel(lblNext);
            }

            // --- Allow modification tracking
            if (!metadata.IsSimplePoco)
            {
                il.Emit(OpCodes.Ldloc, dataObject);
                il.Emit(OpCodes.Callvirt, s_FnSignLoaded);
            }

            // --- Return the data record object
            il.Emit(OpCodes.Ldloc, dataObject);
            il.Emit(OpCodes.Ret);

            // --- Create the delegate
            var mapperDelegate = mapperMethod.CreateDelegate(Expression.GetFuncType(typeof(IDataReader), typeof(T), typeof(T)));

            return((Func <IDataReader, T, T>)mapperDelegate);
            // return DoMapping<T>;
        }