예제 #1
0
        private bool ApplyParameters()
        {
            if ((Context.User == null) ||
                (Context.User.Parameters == null))
            {
                return(true);
            }

            var regex      = new Regex("{.*?}");
            var parameters = regex.Matches(ParsedQuery);

            ParamErrors = new List <string>();
            foreach (var parameter in parameters)
            {
                string key = parameter.ToString().Replace(" ", "");
                if (Context.User.Parameters.ContainsKey(key))
                {
                    ParsedQuery = ParsedQuery.Replace(parameter.ToString(), Context.User.Parameters[key]);
                }
                else
                {
                    ParamErrors.Add(string.Format("User '{0}' does not have parameter '{1}'", Context.User.UserName, key));
                }
            }

            return(ParamErrors.Count == 0 ? true : false);
        }
예제 #2
0
        private void IfSameColumnConditionExistsRemoveCondition(string tableOrAliasName, RbacCondition condition)
        {
            bool somethingReplaced = false;

            foreach (string column in condition.Columns)
            {
                RbacWhereClause aWhereClause = WhereClauses.Find(tableOrAliasName, column);
                if (aWhereClause != null)
                {
                    //this column is referred as condition in original query
                    ParsedQuery       = ParsedQuery.Replace(aWhereClause.WhereClauseString, string.Empty);
                    somethingReplaced = true;
                }
            }
            if (somethingReplaced)
            {
                ParsedQuery = ParsedQuery.TrimEnd();
                string[] words = new string[] { "and", "where" };

                foreach (string word in words)
                {
                    if ((ParsedQuery.Length > word.Length) &&
                        (ParsedQuery.Substring(ParsedQuery.Length - word.Length, word.Length).Equals(word, StringComparison.OrdinalIgnoreCase)))
                    {
                        ParsedQuery = ParsedQuery.Remove(ParsedQuery.Length - word.Length, word.Length);
                    }
                }
            }
        }
예제 #3
0
        public bool ParseUsingSqlCommand()
        {
            if (TablesReferred == null)
            {
                TablesReferred = new List <RbacTable>();
            }
            else
            {
                TablesReferred.Clear();
            }

            try
            {
                using (SqlConnection connection = new SqlConnection(Context.ConnectionString))
                {
                    connection.Open();

                    SqlCommand    command     = new SqlCommand(OriginalQuery, connection);
                    SqlDataReader reader      = command.ExecuteReader(CommandBehavior.KeyInfo);
                    DataTable     schemaTable = reader.GetSchemaTable();
                    foreach (DataRow row in schemaTable.Rows)
                    {
                        //if (row["BaseTableName"].ToString() == "City")
                        //    Debugger.Break();

                        RbacSelectColumn column = new RbacSelectColumn();
                        column.Alias      = row["ColumnName"].ToString();
                        column.Name       = row["BaseColumnName"].ToString();
                        column.Table.Name = row["BaseTableName"].ToString();
                        Columns.Add(column);
                        RbacTable table = Context.User.Role.CrudPermissions.Find(column.Table.Name);
                        if (table != null)
                        {
                            TablesReferred.Add(table);
                        }
                        else
                        {
                            throw new Exception(string.Format("The referred table {0} was not found in meta data!", row["BaseTableName"].ToString()));
                        }
                    }

                    TablesReferred = new List <RbacTable>(TablesReferred.DistinctBy(t => t.Name));
                    connection.Close();
                }
                ParsedMethod = RbacSelectQueryParsedMethods.CommandBehavior;
                ParsedQuery  = ParsedQuery.Replace("*", Columns.ToCommaSeparatedString());
                IsParsed     = true;
                return(true);
            }
            catch (Exception ex)
            {
                Errors.Add(ex.Message);
            }
            return(false);
        }