/// <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))); }
/// <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)); }
public void SimplePocoWithSchemaNameWorks() { // --- Act var meta = RecordMetadataManager.GetMetadata(typeof(SimplePoco3)); // --- Assert meta.ShouldNotBeNull(); meta.TableName.ShouldEqual("Poco3"); meta.SchemaName.ShouldEqual("Poco"); }
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); }
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(); }
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]); }
/// <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)); }
public void SourceConverterWithInvalidConverterTypeFails2() { // --- Act RecordMetadataManager.GetMetadata(typeof(Record6)); }
public void SourceConverterWithNullConverterTypeFails() { // --- Act RecordMetadataManager.GetMetadata(typeof(Record4)); }
public void Initialize() { RecordMetadataManager.Reset(); }
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(); }
public void RecordFailsWithNoTableName() { // --- Act RecordMetadataManager.GetMetadata(typeof(Record1)); }
public void GetMetadataFailsWithNull() { // --- Act RecordMetadataManager.GetMetadata(null); }
/// <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>; }