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!"); } }
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!"); } }