private void ParseSqlDeleteStatement(TSqlStatement sqlStatement)
        {
            if (sqlStatement.GetType() == typeof(DeleteStatement))
            {
                DeleteStatement aDeleteStatement = (DeleteStatement)sqlStatement;

                #region Handle Target Table
                NamedTableReferenceVisitor ntVisitor = new NamedTableReferenceVisitor(Context);
                aDeleteStatement.DeleteSpecification.Target.Accept(ntVisitor);
                TablesReferred = ntVisitor.Tables;

                if (TablesReferred.Count == 0)
                {
                    RbacException.Raise("No target table found in the delete query!");
                }
                else if (TablesReferred.Count != 1)
                {
                    RbacException.Raise("More than 1 target tables found in the delete query! Currently not supported.");
                }

                #endregion Handle Target Table

                //UpdateReferredTables(targetTable.Name, targetTable.Alias);
            }
            else
            {
                Errors.Add("Not a update statement!");
            }
        }
Beispiel #2
0
        private void ParseSqlInsertStatement(TSqlStatement sqlStatement)
        {
            if (sqlStatement.GetType() == typeof(InsertStatement))
            {
                InsertStatement aInsertStatement = (InsertStatement)sqlStatement;

                if (aInsertStatement.InsertSpecification.Target is NamedTableReference)
                {
                    //tables
                    NamedTableReferenceVisitor ntVisitor = new NamedTableReferenceVisitor(Context);
                    aInsertStatement.InsertSpecification.Accept(ntVisitor);
                    TablesReferred = ntVisitor.Tables;
                }

                if ((TablesReferred.Count == 1) &&
                    (aInsertStatement.InsertSpecification.Columns.Count == 0))
                {
                    //insert query does not specific columns
                    int howManyColumnValues = ((ValuesInsertSource)aInsertStatement.InsertSpecification.InsertSource).RowValues[0].ColumnValues.Count;
                    //add table column sequentially
                    for (int i = 0; i < howManyColumnValues; i++)
                    {
                        AddSelectColumn(TablesReferred[0].Name, TablesReferred[0].Columns[i].Name);
                    }
                }
                else if ((TablesReferred.Count == 1) &&
                         (aInsertStatement.InsertSpecification.Columns.Count > 0))
                {
                    //insert query has specific columns
                    foreach (ColumnReferenceExpression columnExp in aInsertStatement.InsertSpecification.Columns)
                    {
                        var columnName = columnExp.MultiPartIdentifier.Identifiers[0].Value;
                        AddSelectColumn(TablesReferred[0].Name, columnName);
                    }
                }
                else
                {
                    throw new NotImplementedException("This kind of insert statement not supported yet!");
                }
            }
            else
            {
                Errors.Add("Not a update statement!");
            }
        }
        private void ParseSqlUpdateStatement(TSqlStatement sqlStatement)
        {
            if (sqlStatement.GetType() == typeof(UpdateStatement))
            {
                UpdateStatement aUpdateStatement = (UpdateStatement)sqlStatement;

                #region Handle Target Table


                #endregion Handle Target Table

                RbacTable targetTable = new RbacTable();

                #region Handle From Clause - When Update with Join
                if (aUpdateStatement.UpdateSpecification.FromClause != null)
                {
                    //mostly update with join case
                    NamedTableReferenceVisitor fromClauseNtVisitor = new NamedTableReferenceVisitor(Context);
                    aUpdateStatement.UpdateSpecification.FromClause.AcceptChildren(fromClauseNtVisitor);
                    this.TablesReferred = fromClauseNtVisitor.Tables;
                    if (TablesReferred.Count > 0)
                    {
                        targetTable = TablesReferred[0];
                        //if alias is being updated, we need to fix table name
                        RbacTable tryTable = Context.User.Role.CrudPermissions.Find(targetTable.Name);
                        if (tryTable == null)
                        {
                            //alias is being updated, lets get the actual table name
                            var tt = fromClauseNtVisitor.Tables.Where(t => t.Alias == targetTable.Name).ToList()[0];
                            if (tt != null)
                            {
                                targetTable.Name = tt.Name;
                            }
                        }
                    }
                    else
                    {
                        RbacException.Raise("No target table found in the update query!");
                    }
                }
                else
                {
                    NamedTableReferenceVisitor ntVisitor = new NamedTableReferenceVisitor(Context);
                    aUpdateStatement.UpdateSpecification.Target.Accept(ntVisitor);

                    if (ntVisitor.Tables.Count == 0)
                    {
                        RbacException.Raise("No target table found in the update query!");
                    }
                    else if (ntVisitor.Tables.Count == 1)
                    {
                        targetTable = ntVisitor.Tables[0];
                    }
                    else
                    {
                        RbacException.Raise("More than 1 target tables found in the update query! Currently not supported.");
                    }

                    TablesReferred.Add(targetTable);
                }
                #endregion Handle From Clause - When Update with Join

                #region Handle Columns

                SetClauseVisitor scVisitor = new SetClauseVisitor(targetTable.Name);
                aUpdateStatement.UpdateSpecification.AcceptChildren(scVisitor);
                Columns = scVisitor.Columns;
                UpdateReferredTables(Columns);

                #endregion Handle Columns
            }
            else
            {
                Errors.Add("Not a update statement!");
            }
        }
        private void ParseSqlSelectStatement(TSqlStatement sqlStatement)
        {
            if (sqlStatement.GetType() == typeof(SelectStatement))
            {
                SelectStatement aSelectStatement = (SelectStatement)sqlStatement;
                QueryExpression aQueryExpression = aSelectStatement.QueryExpression;
                if (aQueryExpression.GetType() == typeof(QuerySpecification))
                {
                    QuerySpecification aQuerySpecification = (QuerySpecification)aQueryExpression;
                    if (aQuerySpecification.FromClause == null)
                    {
                        return; //'select *' is valid query, but not of our interest
                    }
                    //tables
                    NamedTableReferenceVisitor ntVisitor = new NamedTableReferenceVisitor(Context);
                    aQuerySpecification.FromClause.Accept(ntVisitor);
                    TablesReferred = ntVisitor.Tables;

                    //columns
                    ScalarExpressionVisitor seVisitor = null;
                    foreach (SelectElement selectStatement in aQuerySpecification.SelectElements)
                    {
                        seVisitor = new ScalarExpressionVisitor(Context, TablesReferred[0]);
                        selectStatement.Accept(seVisitor);
                        Columns.AddRange(seVisitor.Columns);
                    }

                    if (!string.IsNullOrEmpty(seVisitor.ParsedQuery))
                    {
                        ParsedQuery = seVisitor.ParsedQuery;    //todo
                    }
                    //else
                    //    ParsedQuery = Columns.GetParsedQuery(ParsedQuery);

                    UpdateReferredTables(Columns);

                    //ensure unique tables
                    TablesReferred = new List <RbacTable>(TablesReferred.DistinctBy(t => t.Name));

                    //joins
                    JoinClauseVisitor jcVisitor = new JoinClauseVisitor(Context);
                    aQueryExpression.AcceptChildren(jcVisitor);
                    JoinClauses = jcVisitor.JoinClauses;

                    //where clause
                    if (aQuerySpecification.WhereClause != null)
                    {
                        EqualVisitor       cidv = new EqualVisitor(ParsedQuery);
                        InPredicateVisitor inpv = new InPredicateVisitor(ParsedQuery);
                        aQuerySpecification.WhereClause.AcceptChildren(cidv);
                        aQuerySpecification.WhereClause.AcceptChildren(inpv);
                        WhereClauses.AddRange(cidv.WhereClauses);
                        WhereClauses.AddRange(inpv.WhereClauses);
                        WhereClauses.ParseReferenceTableNames(JoinClauses);
                    }
                }
            }
            else
            {
                Errors.Add("Not a select statement!");
            }
        }