Esempio n. 1
0
        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"));
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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"));
        }
Esempio n. 5
0
        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();
                }
            }
        }
Esempio n. 6
0
 public void ReplayTo(IILDynamicType target)
 {
     _trueContent = target.DefineConstructor(_parameters);
     if (_expectedLength >= 0)
     {
         _trueContent.ExpectedLength(_expectedLength);
     }
 }
Esempio n. 7
0
            public void ReplayTo(IILDynamicType target)
            {
                var state = ShelveSourceDefinitionBegin(target);

                _trueContent = target.DefineConstructor(_parameters);
                if (_expectedLength >= 0)
                {
                    _trueContent.ExpectedLength(_expectedLength);
                }
                ShelveSourceDefinitionEnd(state);
            }
Esempio n. 8
0
        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);
        }
Esempio n. 9
0
 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);
 }
Esempio n. 10
0
        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);
            }
        }
Esempio n. 11
0
 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);
 }
Esempio n. 12
0
        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);
            }
        }
Esempio n. 13
0
        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);
            }
        }
Esempio n. 14
0
 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;
 }
Esempio n. 15
0
 public IILGen Ldftn(IILMethod method)
 {
     _ilGenerator.Emit(OpCodes.Ldftn, ((IILMethodPrivate)method).TrueMethodInfo);
     return this;
 }
Esempio n. 16
0
 public LdftnInst(IILMethod method)
 {
     _method = method;
 }
Esempio n. 17
0
 public IILGen Ldftn(IILMethod method)
 {
     _ilGenerator.Emit(OpCodes.Ldftn, ((ILMethodImpl)method).MethodInfo);
     return(this);
 }
Esempio n. 18
0
 public LdftnInst(IILMethod method)
 {
     _method = method;
 }
Esempio n. 19
0
 public void SetRemoveOnMethod(IILMethod method)
 {
     _eventBuilder.SetRemoveOnMethod(((ILMethodDebugImpl)method).MethodBuilder);
 }
Esempio n. 20
0
 public void DefineMethodOverride(IILMethod methodBuilder, MethodInfo baseMethod)
 {
     _typeBuilder.DefineMethodOverride(((ILMethodImpl)methodBuilder).MethodInfo, baseMethod);
 }
Esempio n. 21
0
 public void SetRemoveOnMethod(IILMethod method)
 {
     _removeOnMethod = (IReplay)method;
 }
Esempio n. 22
0
 public void SetAddOnMethod(IILMethod method)
 {
     _addOnMethod = (IReplay)method;
 }
Esempio n. 23
0
 public void DefineMethodOverride(IILMethod methodBuilder, MethodInfo baseMethod)
 {
     _typeBuilder.DefineMethodOverride(((ILMethodImpl)methodBuilder).MethodInfo, baseMethod);
 }
Esempio n. 24
0
 public void DefineMethodOverride(IILMethod methodBuilder, MethodInfo baseMethod)
 {
     _typeBuilder.DefineMethodOverride(((IILMethodPrivate)methodBuilder).TrueMethodInfo, baseMethod);
 }
Esempio n. 25
0
 public void SetAddOnMethod(IILMethod method)
 {
     _eventBuilder.SetAddOnMethod(((ILMethodImpl)method).MethodBuilder);
 }
Esempio n. 26
0
 public IILGen Ldftn(IILMethod method)
 {
     _ilGenerator.Emit(OpCodes.Ldftn, ((ILMethodImpl)method).MethodInfo);
     return this;
 }
Esempio n. 27
0
        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"));
        }
Esempio n. 28
0
 public void SetRemoveOnMethod(IILMethod method)
 {
     _eventBuilder.SetRemoveOnMethod(((ILMethodImpl)method).MethodBuilder);
 }
Esempio n. 29
0
 public void FreeTemps()
 {
     _trueContent = null;
     _ilGen.FreeTemps();
 }
Esempio n. 30
0
 public void DefineMethodOverride(IILMethod methodBuilder, MethodInfo baseMethod)
 {
     _insts.Add(new MethodOverride(_insts.Count, methodBuilder, baseMethod));
 }
Esempio n. 31
0
 public IILGen Ldftn(IILMethod method)
 {
     _ilGenerator.Emit(OpCodes.Ldftn, ((IILMethodPrivate)method).TrueMethodInfo);
     return(this);
 }
Esempio n. 32
0
 public MethodOverride(int id, IILMethod methodBuilder, MethodInfo baseMethod)
 {
     _id            = id;
     _methodBuilder = (IReplay)methodBuilder;
     _baseMethod    = baseMethod;
 }
Esempio n. 33
0
 public IILGen Ldftn(IILMethod method)
 {
     _instructions.Add(new LdftnInst(method));
     return this;
 }
Esempio n. 34
0
 public IILGen Ldftn(IILMethod method)
 {
     _instructions.Add(new LdftnInst(method));
     return(this);
 }
Esempio n. 35
0
 public void DefineMethodOverride(IILMethod methodBuilder, MethodInfo baseMethod)
 {
     _typeBuilder.DefineMethodOverride(((IILMethodPrivate)methodBuilder).TrueMethodInfo, baseMethod);
 }
Esempio n. 36
0
 public void SetAddOnMethod(IILMethod method)
 {
     _eventBuilder.SetAddOnMethod(((ILMethodDebugImpl)method).MethodBuilder);
 }