void BuildRemoveByIdPartialMethod(MethodInfo method, IILMethod reqMethod, Type relationDbManipulatorType) { var methodParameters = method.GetParameters(); var isPrefixBased = method.ReturnType == typeof(int); //returns number of removed items if (!isPrefixBased || methodParameters.Length == 0 || methodParameters[methodParameters.Length - 1].ParameterType != typeof(int) || methodParameters[methodParameters.Length - 1].Name.IndexOf("max", StringComparison.InvariantCultureIgnoreCase) == -1) { throw new BTDBException("Invalid shape of RemoveByIdPartial."); } var il = reqMethod.Generator; var writerLoc = il.DeclareLocal(typeof(ByteBufferWriter)); il .Newobj(() => new ByteBufferWriter()) .Stloc(writerLoc); WriteShortPrefixIl(il, ilg => ilg.Ldloc(writerLoc), _relationInfo.Prefix); var primaryKeyFields = _relationInfo.ClientRelationVersionInfo.GetPrimaryKeyFields(); SaveMethodParameters(il, method.Name, methodParameters, methodParameters.Length - 1, _relationInfo.ApartFields, primaryKeyFields, writerLoc); var dataGetter = typeof(ByteBufferWriter).GetProperty("Data").GetGetMethod(true); il .Ldarg(0) //manipulator .Ldloc(writerLoc).Callvirt(dataGetter) //call byteBuffer.Data .Ldarg((ushort)methodParameters.Length) .Callvirt(relationDbManipulatorType.GetMethod("RemoveByPrimaryKeyPrefixPartial")); }
void BuildListByIdMethod(MethodInfo method, IILMethod reqMethod) { var parameters = method.GetParameters(); var advEnumParamOrder = (ushort)parameters.Length; var advEnumParam = parameters[advEnumParamOrder - 1].ParameterType; var advEnumParamType = advEnumParam.GenericTypeArguments[0]; var emptyBufferLoc = reqMethod.Generator.DeclareLocal(typeof(ByteBuffer)); var prefixParamCount = method.GetParameters().Length - 1; var field = _relationInfo.ClientRelationVersionInfo.GetPrimaryKeyFields() .Skip(_relationInfo.ApartFields.Count + prefixParamCount).First(); reqMethod.Generator .Ldarg(0); SavePKListPrefixBytes(reqMethod.Generator, method.Name, method.GetParameters(), _relationInfo.ApartFields); reqMethod.Generator .LdcI4(prefixParamCount + _relationInfo.ApartFields.Count) .Ldarg(advEnumParamOrder).Ldfld(advEnumParam.GetField("Order")) .Ldarg(advEnumParamOrder).Ldfld(advEnumParam.GetField("StartProposition")); FillBufferWhenNotIgnoredKeyPropositionIl(advEnumParamOrder, field, emptyBufferLoc, advEnumParam.GetField("Start"), reqMethod.Generator); reqMethod.Generator .Ldarg(advEnumParamOrder).Ldfld(advEnumParam.GetField("EndProposition")); FillBufferWhenNotIgnoredKeyPropositionIl(advEnumParamOrder, field, emptyBufferLoc, advEnumParam.GetField("End"), reqMethod.Generator); if (typeof(IEnumerator <>).MakeGenericType(_relationInfo.ClientType).IsAssignableFrom(method.ReturnType)) { //return new RelationAdvancedEnumerator<T>(relationManipulator, // prefixBytes, prefixFieldCount, // order, // startKeyProposition, startKeyBytes, // endKeyProposition, endKeyBytes, secondaryKeyIndex); var enumType = typeof(RelationAdvancedEnumerator <>).MakeGenericType(_relationInfo.ClientType); var advancedEnumeratorCtor = enumType.GetConstructors()[0]; reqMethod.Generator.Newobj(advancedEnumeratorCtor); } else if (typeof(IOrderedDictionaryEnumerator <,>).MakeGenericType(advEnumParamType, _relationInfo.ClientType) .IsAssignableFrom(method.ReturnType)) { reqMethod.Generator .LdcI4(1); //init key reader //return new RelationAdvancedOrderedEnumerator<T>(relationManipulator, // prefixBytes, prefixFieldCount, // order, // startKeyProposition, startKeyBytes, // endKeyProposition, endKeyBytes, secondaryKeyIndex, initKeyReader); var enumType = typeof(RelationAdvancedOrderedEnumerator <,>).MakeGenericType(advEnumParamType, _relationInfo.ClientType); var advancedEnumeratorCtor = enumType.GetConstructors()[0]; reqMethod.Generator.Newobj(advancedEnumeratorCtor); } else { throw new BTDBException("Invalid method " + method.Name); } }
static void BuildManipulatorCallWithSameParameters(MethodInfo method, IILMethod reqMethod, Type relationDBManipulatorType) { var methodParams = method.GetParameters(); int paramCount = methodParams.Length; var methodInfo = relationDBManipulatorType.GetMethod(method.Name); if (methodInfo == null) { throw new BTDBException($"Method {method} is not supported."); } CheckReturnType(method.Name, methodInfo.ReturnType, method.ReturnType); var calledMethodParams = methodInfo.GetParameters(); CheckParameterCount(method.Name, calledMethodParams.Length, methodParams.Length); for (int i = 0; i < methodParams.Length; i++) { CheckParameterType(method.Name, i, calledMethodParams[i].ParameterType, methodParams[i].ParameterType); } for (ushort i = 0; i <= paramCount; i++) { reqMethod.Generator.Ldarg(i); } reqMethod.Generator.Callvirt(methodInfo); }
void BuildContainsMethod(MethodInfo method, IILMethod reqMethod, Type relationDBManipulatorType) { var writerLoc = reqMethod.Generator.DeclareLocal(typeof(ByteBufferWriter)); reqMethod.Generator.Newobj(() => new ByteBufferWriter()); reqMethod.Generator.Stloc(writerLoc); //ByteBufferWriter.WriteVUInt32(RelationInfo.Id); WriteIdIl(reqMethod.Generator, il => il.Ldloc(writerLoc), (int)_relationInfo.Id); var primaryKeyFields = _relationInfo.ClientRelationVersionInfo.GetPrimaryKeyFields(); var count = SaveMethodParameters(reqMethod.Generator, "Contains", method.GetParameters(), method.GetParameters().Length, _relationInfo.ApartFields, primaryKeyFields, writerLoc); if (count != primaryKeyFields.Count) { throw new BTDBException($"Number of parameters in Contains does not match primary key count {primaryKeyFields.Count}."); } //call manipulator.Contains reqMethod.Generator .Ldarg(0); //manipulator //call byteBuffer.data var dataGetter = typeof(ByteBufferWriter).GetProperty("Data").GetGetMethod(true); reqMethod.Generator.Ldloc(writerLoc).Callvirt(dataGetter); reqMethod.Generator.Callvirt(relationDBManipulatorType.GetMethod("Contains")); }
void BuildRemoveByMethod(MethodInfo method, IILMethod reqMethod, Type relationDBManipulatorType) { var methodParameters = method.GetParameters(); var isPrefixBased = method.ReturnType == typeof(int); //returns number of removed items var writerLoc = reqMethod.Generator.DeclareLocal(typeof(ByteBufferWriter)); reqMethod.Generator.Newobj(() => new ByteBufferWriter()); reqMethod.Generator.Stloc(writerLoc); Action <IILGen> pushWriter = il => il.Ldloc(writerLoc); if (isPrefixBased) { WriteShortPrefixIl(reqMethod.Generator, pushWriter, _relationInfo.Prefix); } else { //ByteBufferWriter.WriteVUInt32(RelationInfo.Id); WriteIdIl(reqMethod.Generator, pushWriter, (int)_relationInfo.Id); } var primaryKeyFields = _relationInfo.ClientRelationVersionInfo.GetPrimaryKeyFields(); var count = SaveMethodParameters(reqMethod.Generator, method.Name, methodParameters, methodParameters.Length, _relationInfo.ApartFields, primaryKeyFields, writerLoc); if (!isPrefixBased && count != primaryKeyFields.Count) { throw new BTDBException($"Number of parameters in {method.Name} does not match primary key count {primaryKeyFields.Count}."); } //call manipulator.RemoveBy_ reqMethod.Generator .Ldarg(0); //manipulator //call byteBuffer.data var dataGetter = typeof(ByteBufferWriter).GetProperty("Data").GetGetMethod(true); reqMethod.Generator.Ldloc(writerLoc).Callvirt(dataGetter); if (isPrefixBased) { if (AllKeyPrefixesAreSame(_relationInfo.ClientRelationVersionInfo, count) && !_relationInfo.NeedImplementFreeContent()) { reqMethod.Generator.Callvirt(relationDBManipulatorType.GetMethod("RemoveByKeyPrefixWithoutIterate")); } else { reqMethod.Generator.Callvirt(relationDBManipulatorType.GetMethod("RemoveByPrimaryKeyPrefix")); } } else { reqMethod.Generator.LdcI4(ShouldThrowWhenKeyNotFound(method.Name, method.ReturnType) ? 1 : 0); reqMethod.Generator.Callvirt(relationDBManipulatorType.GetMethod("RemoveById")); if (method.ReturnType == typeof(void)) { reqMethod.Generator.Pop(); } } }
public void ReplayTo(IILDynamicType target) { _trueContent = target.DefineConstructor(_parameters); if (_expectedLength >= 0) { _trueContent.ExpectedLength(_expectedLength); } }
public void ReplayTo(IILDynamicType target) { var state = ShelveSourceDefinitionBegin(target); _trueContent = target.DefineConstructor(_parameters); if (_expectedLength >= 0) { _trueContent.ExpectedLength(_expectedLength); } ShelveSourceDefinitionEnd(state); }
public IILGen Ldftn(IILMethod method) { var meth = ((ILMethodDebugImpl)method); _sourceCodeWriter.MarkAndWriteLine(_ilGenerator, string.Format("{0} {2} {1}({3})", OpCodes.Ldftn, meth.Name, meth.ReturnType.ToSimpleName(), string.Join(", ", meth.Parameters.Select(p => p.ToSimpleName())))); _ilGenerator.Emit(OpCodes.Ldftn, meth.MethodInfo); return(this); }
public void InsertCallAtStart(IILMethod method) { var cecilMethod = method as CecilMethod; var cecilMethodDefinition = cecilMethod._methodDefinition; if (_methodDefinition.Body == null) return; var existingInstructions = _methodDefinition.Body.Instructions.ToArray(); _methodDefinition.Body.Instructions.Clear(); var importedJiggleMethod = _methodDefinition.Module.Import(cecilMethodDefinition); _methodDefinition.Body.Instructions.Add(Instruction.Create(OpCodes.Call, importedJiggleMethod)); foreach(var existingInstruction in existingInstructions) _methodDefinition.Body.Instructions.Add(existingInstruction); }
void BuildListByIdMethod(MethodInfo method, IILMethod reqMethod) { var parameters = method.GetParameters(); var advEnumParamOrder = (ushort)parameters.Length; var advEnumParam = parameters[advEnumParamOrder - 1].ParameterType; var advEnumParamType = advEnumParam.GenericTypeArguments[0]; var emptyBufferLoc = reqMethod.Generator.DeclareLocal(typeof(ByteBuffer)); var prefixParamCount = parameters.Length - 1; var primaryKeyFields = _relationInfo.ClientRelationVersionInfo.GetPrimaryKeyFields(); var field = primaryKeyFields.Skip(_relationInfo.ApartFields.Count + prefixParamCount).First(); ValidateAdvancedEnumParameter(field, advEnumParamType, method.Name); WritePrimaryKeyPrefixFinishedByAdvancedEnumerator(method, parameters, reqMethod, prefixParamCount, advEnumParamOrder, advEnumParam, field, emptyBufferLoc); if (typeof(IEnumerator <>).MakeGenericType(_relationInfo.ClientType).IsAssignableFrom(method.ReturnType)) { //return new RelationAdvancedEnumerator<T>(relationManipulator, // prefixBytes, prefixFieldCount, // order, // startKeyProposition, startKeyBytes, // endKeyProposition, endKeyBytes); var enumType = typeof(RelationAdvancedEnumerator <>).MakeGenericType(_relationInfo.ClientType); var advancedEnumeratorCtor = enumType.GetConstructors()[0]; reqMethod.Generator.Newobj(advancedEnumeratorCtor); } else if (typeof(IOrderedDictionaryEnumerator <,>).MakeGenericType(advEnumParamType, _relationInfo.ClientType) .IsAssignableFrom(method.ReturnType)) { reqMethod.Generator .LdcI4(1); //init key reader //return new RelationAdvancedOrderedEnumerator<T>(relationManipulator, // prefixBytes, prefixFieldCount, // order, // startKeyProposition, startKeyBytes, // endKeyProposition, endKeyBytes, initKeyReader); var enumType = typeof(RelationAdvancedOrderedEnumerator <,>).MakeGenericType(advEnumParamType, _relationInfo.ClientType); var advancedEnumeratorCtor = enumType.GetConstructors()[0]; reqMethod.Generator.Newobj(advancedEnumeratorCtor); } else { throw new BTDBException("Invalid method " + method.Name); } }
void WritePrimaryKeyPrefixFinishedByAdvancedEnumerator(MethodInfo method, ParameterInfo[] parameters, IILMethod reqMethod, int prefixParamCount, ushort advEnumParamOrder, Type advEnumParam, TableFieldInfo field, IILLocal emptyBufferLoc) { reqMethod.Generator.Ldarg(0); SavePKListPrefixBytes(reqMethod.Generator, method.Name, parameters, _relationInfo.ApartFields); reqMethod.Generator .LdcI4(prefixParamCount + _relationInfo.ApartFields.Count) .Ldarg(advEnumParamOrder).Ldfld(advEnumParam.GetField("Order")) .Ldarg(advEnumParamOrder).Ldfld(advEnumParam.GetField("StartProposition")); FillBufferWhenNotIgnoredKeyPropositionIl(advEnumParamOrder, field, emptyBufferLoc, advEnumParam.GetField("Start"), reqMethod.Generator); reqMethod.Generator .Ldarg(advEnumParamOrder).Ldfld(advEnumParam.GetField("EndProposition")); FillBufferWhenNotIgnoredKeyPropositionIl(advEnumParamOrder, field, emptyBufferLoc, advEnumParam.GetField("End"), reqMethod.Generator); }
void BuildFindByMethod(MethodInfo method, IILMethod reqMethod, Type relationDBManipulatorType) { var writerLoc = reqMethod.Generator.DeclareLocal(typeof(ByteBufferWriter)); reqMethod.Generator.Newobj(() => new ByteBufferWriter()); reqMethod.Generator.Stloc(writerLoc); Action <IILGen> pushWriter = il => il.Ldloc(writerLoc); if (method.Name == "FindById" || method.Name == "FindByIdOrDefault") { CreateMethodFindById(reqMethod.Generator, relationDBManipulatorType, method.Name, method.GetParameters(), method.ReturnType, _relationInfo.ApartFields, pushWriter, writerLoc); } else { CreateMethodFindBy(reqMethod.Generator, relationDBManipulatorType, method.Name, method.GetParameters(), method.ReturnType, _relationInfo.ApartFields, pushWriter, writerLoc); } }
static void BuildInsertMethod(MethodInfo method, IILMethod reqMethod, Type relationDBManipulatorType) { var methodInfo = relationDBManipulatorType.GetMethod(method.Name); bool returningBoolVariant; var returnType = method.ReturnType; if (returnType == typeof(void)) { returningBoolVariant = false; } else if (returnType == typeof(bool)) { returningBoolVariant = true; } else { throw new BTDBException("Method Insert should be defined with void or bool return type."); } var methodParams = method.GetParameters(); CheckParameterCount(method.Name, 1, methodParams.Length); CheckParameterType(method.Name, 0, methodInfo.GetParameters()[0].ParameterType, methodParams[0].ParameterType); reqMethod.Generator .Ldarg(0) //this .Ldarg(1) .Callvirt(methodInfo); if (!returningBoolVariant) { var returnedTrueLabel = reqMethod.Generator.DefineLabel("returnedTrueLabel"); reqMethod.Generator .Brtrue(returnedTrueLabel) .Ldstr("Trying to insert duplicate key.") .Newobj(() => new BTDBException(null)) .Throw() .Mark(returnedTrueLabel); } }
public IILGen Ldftn(IILMethod method) { var meth = ((ILMethodDebugImpl)method); _sourceCodeWriter.MarkAndWriteLine(_ilGenerator, string.Format("{0} {2} {1}({3})", OpCodes.Ldftn, meth.Name, meth.ReturnType.ToSimpleName(), string.Join(", ", meth.Parameters.Select(p => p.ToSimpleName())))); _ilGenerator.Emit(OpCodes.Ldftn, meth.MethodInfo); return this; }
public IILGen Ldftn(IILMethod method) { _ilGenerator.Emit(OpCodes.Ldftn, ((IILMethodPrivate)method).TrueMethodInfo); return this; }
public LdftnInst(IILMethod method) { _method = method; }
public IILGen Ldftn(IILMethod method) { _ilGenerator.Emit(OpCodes.Ldftn, ((ILMethodImpl)method).MethodInfo); return(this); }
public void SetRemoveOnMethod(IILMethod method) { _eventBuilder.SetRemoveOnMethod(((ILMethodDebugImpl)method).MethodBuilder); }
public void DefineMethodOverride(IILMethod methodBuilder, MethodInfo baseMethod) { _typeBuilder.DefineMethodOverride(((ILMethodImpl)methodBuilder).MethodInfo, baseMethod); }
public void SetRemoveOnMethod(IILMethod method) { _removeOnMethod = (IReplay)method; }
public void SetAddOnMethod(IILMethod method) { _addOnMethod = (IReplay)method; }
public void DefineMethodOverride(IILMethod methodBuilder, MethodInfo baseMethod) { _typeBuilder.DefineMethodOverride(((IILMethodPrivate)methodBuilder).TrueMethodInfo, baseMethod); }
public void SetAddOnMethod(IILMethod method) { _eventBuilder.SetAddOnMethod(((ILMethodImpl)method).MethodBuilder); }
public IILGen Ldftn(IILMethod method) { _ilGenerator.Emit(OpCodes.Ldftn, ((ILMethodImpl)method).MethodInfo); return this; }
void BuildRemoveByIdAdvancedParamMethod(MethodInfo method, ParameterInfo[] parameters, IILMethod reqMethod, Type relationDbManipulatorType) { if (method.ReturnType != typeof(int)) { throw new BTDBException($"Return value in {method.Name} must be int."); } var advEnumParamOrder = (ushort)parameters.Length; var advEnumParam = parameters[advEnumParamOrder - 1].ParameterType; var advEnumParamType = advEnumParam.GenericTypeArguments[0]; var emptyBufferLoc = reqMethod.Generator.DeclareLocal(typeof(ByteBuffer)); var prefixParamCount = parameters.Length - 1; var primaryKeyFields = _relationInfo.ClientRelationVersionInfo.GetPrimaryKeyFields(); var field = primaryKeyFields.Skip(_relationInfo.ApartFields.Count + prefixParamCount).First(); ValidateAdvancedEnumParameter(field, advEnumParamType, method.Name); reqMethod.Generator.Ldarg(0); //manipulator for call RemoveByIdAdvancedParam WritePrimaryKeyPrefixFinishedByAdvancedEnumerator(method, parameters, reqMethod, prefixParamCount, advEnumParamOrder, advEnumParam, field, emptyBufferLoc); reqMethod.Generator.Call(relationDbManipulatorType.GetMethod("RemoveByIdAdvancedParam")); }
public void SetRemoveOnMethod(IILMethod method) { _eventBuilder.SetRemoveOnMethod(((ILMethodImpl)method).MethodBuilder); }
public void FreeTemps() { _trueContent = null; _ilGen.FreeTemps(); }
public void DefineMethodOverride(IILMethod methodBuilder, MethodInfo baseMethod) { _insts.Add(new MethodOverride(_insts.Count, methodBuilder, baseMethod)); }
public IILGen Ldftn(IILMethod method) { _ilGenerator.Emit(OpCodes.Ldftn, ((IILMethodPrivate)method).TrueMethodInfo); return(this); }
public MethodOverride(int id, IILMethod methodBuilder, MethodInfo baseMethod) { _id = id; _methodBuilder = (IReplay)methodBuilder; _baseMethod = baseMethod; }
public IILGen Ldftn(IILMethod method) { _instructions.Add(new LdftnInst(method)); return this; }
public IILGen Ldftn(IILMethod method) { _instructions.Add(new LdftnInst(method)); return(this); }
public void SetAddOnMethod(IILMethod method) { _eventBuilder.SetAddOnMethod(((ILMethodDebugImpl)method).MethodBuilder); }