public void Visit(InsertIntoStatement statement)
 {
     DoInsert(statement);
 }
        private void DoInsert(InsertIntoStatement statement)
        {
            var variableArgs = VisitChild(statement.Variable);
            var domArg = VisitChild(statement.Select);

            CodeMemberMethod method = new CodeMemberMethod();
            method.Name = "Insert_" + domArg.MethodIdentifier;
            method.Attributes = MemberAttributes.Private;
            GenerateCallStatement(method.Statements, statement.Line.Line);

            ((Action)domArg.Tag)(); //remove call to OnSelect

            method.Statements.Add(new CodeVariableDeclarationStatement(domArg.Scope.CodeDomReference,
                "resultRows",
                domArg.CodeExpression));

            method.Statements.Add(new CodeMethodInvokeExpression(
                new CodeMethodReferenceExpression(variableArgs.CodeExpression, "BeforeInsert"), new CodePrimitiveExpression(statement.Overwrite)));

            var identityArgs = VisitChild(new IdentityVariable() { Id = "@@identity" });

            method.Statements.Add(new CodeAssignStatement(identityArgs.CodeExpression,
                    new CodePropertyReferenceExpression(variableArgs.CodeExpression, "RowCount")
                   ));

            method.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference("IEnumerator", new CodeTypeReference("ResultRow")),
            "x",
            new CodeMethodInvokeExpression(
                    new CodeMethodReferenceExpression(new CodeTypeReferenceExpression("resultRows"), "GetEnumerator",
                    null))));

            var loop = new CodeIterationStatement();
            loop.InitStatement = new CodeSnippetStatement();
            loop.IncrementStatement = new CodeSnippetStatement();
            loop.TestExpression = new CodeMethodInvokeExpression(
                new CodeMethodReferenceExpression(new CodeTypeReferenceExpression("x"), "MoveNext",
                null));

            loop.Statements.Add(new CodeAssignStatement(identityArgs.CodeExpression,
                new CodeBinaryOperatorExpression(identityArgs.CodeExpression,
                    CodeBinaryOperatorType.Add,
                    new CodePrimitiveExpression(1))
                    ));

            loop.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference("ResultRow"),
                "row",
                new CodePropertyReferenceExpression(new CodeTypeReferenceExpression("x"), "Current")));

            loop.Statements.Add(new CodeVariableDeclarationStatement(
                new CodeTypeReference(statement.Variable.Id),
                "tableRow",
                new CodeObjectCreateExpression(new CodeTypeReference(statement.Variable.Id))));

            ScopeData<TableDescriptor> descriptor = Scope.EmptyTableDescriptor;
            if (Scope.Current.IsTableRegistered(statement.Variable.Id))
                descriptor = Scope.Current.GetTableDescriptor(statement.Variable.Id);

            int insertCount = descriptor.Type.Variables.Where(x => !x.Primitive.IsIdentity).Count();
            if (insertCount != statement.Select.Args.Length) //lengths don't match for insert. Need to remove identities
                Errors.Add(new InsertSelectArgsNotEqual(new Semantic.LineInfo(statement.Line.Line, statement.Line.CharacterPosition)));

            int indexer = 0;
            for (int x = 0; x < descriptor.Type.Variables.Count; x++)
            {
                var left = new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("tableRow"), descriptor.Type.Variables[x].Variable);
                CodeExpression right = null;
                if(descriptor.Type.Variables[x].Primitive.IsIdentity)
                {
                    right = identityArgs.CodeExpression;
                }
                else
                {
                    right = new CodeIndexerExpression(new CodeTypeReferenceExpression("row"), new CodeSnippetExpression(indexer.ToString()));
                    right = descriptor.Type.Variables[x].Primitive.ToNative(right);
                    indexer++;
                }

                loop.Statements.Add(new CodeAssignStatement(left, right));
            }

            loop.Statements.Add(new CodeMethodInvokeExpression(
                new CodeMethodReferenceExpression(variableArgs.CodeExpression, "Add"),
                new CodeVariableReferenceExpression("tableRow")));

            method.Statements.Add(loop);
            _mainType.Type.Members.Add(method);

            var methodcall = new CodeMethodInvokeExpression(
                new CodeMethodReferenceExpression(null, method.Name));

            method.Statements.Add(new CodeMethodInvokeExpression(
                new CodeMethodReferenceExpression(variableArgs.CodeExpression, "AfterInsert")));

            _codeStack.Peek().ParentStatements.Add(methodcall);
            _codeStack.Peek().CodeExpression = methodcall;
        }
Example #3
0
 public void Visit(InsertIntoStatement statement, CommonTree tree)
 {
     Parent(tree).Children.Add(statement);
     SetLine(statement, tree);
     Visit(tree.GetChild(0));
     Visit(tree.GetChild(1));
 }