using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; namespace ChaosBot.Database { public class QueryBuilderRaw { private StringBuilder _query; private Dictionary _parameters; private int keyIndex = 0; public QueryBuilderRaw() { _query = new StringBuilder(); _parameters = new Dictionary(); } public QueryBuilderRaw Append(string text) { _query.Append(text); if (!text.EndsWith(" ")) _query.Append(" "); return this; } public DataTable Run() { return Controller.RawQuery(_query.ToString(), _parameters); } public QueryBuilderRaw Select() { return Append("SELECT"); } public QueryBuilderRaw Insert(string alternativeAction = null) { Append("INSERT"); if (alternativeAction != null) Append(alternativeAction); return this; } public QueryBuilderRaw Update(string alternativeAction = null) { Append("UPDATE"); if (alternativeAction != null) Append(alternativeAction); return this; } public QueryBuilderRaw Delete() { return Append("DELETE"); } public QueryBuilderRaw Distinct() { return Append("DISTINCT"); } public QueryBuilderRaw Table(string table) { return Append(table); } public QueryBuilderRaw FromTable(string table) { Append("FROM"); return Table(table); } public QueryBuilderRaw IntoTable(string table) { Append("INTO"); return Table(table); } public QueryBuilderRaw Columns(List columnList) { Append("("); Append(String.Join(", ", columnList)); Append(")"); return this; } public QueryBuilderRaw Values(Dictionary keyValueList) { Append("VALUES ("); List parameterKeys = new List(); foreach (KeyValuePair pair in keyValueList) { string parameterName = AddParameterAndReturnKey(pair.Key, pair.Value); parameterKeys.Add(parameterName); } Append(string.Join(", ", parameterKeys)); Append(")"); return this; } public QueryBuilderRaw Set(Dictionary keyValueList) { Append("SET"); List parameterKeys = new List(); foreach (KeyValuePair pair in keyValueList) { string parameterName = AddParameterAndReturnKey(pair.Key, pair.Value); parameterKeys.Add($"{pair.Key} = {parameterName}"); } Append(string.Join(", ", parameterKeys)); return this; } public QueryBuilderRaw Where(Dictionary whereCondition) { Append("WHERE"); foreach (string key in whereCondition.Keys) { FilterValue value = whereCondition.GetValueOrDefault(key); string parameterName = AddParameterAndReturnKey(key, value.Value); Append($"{key} {value.Comparison ?? "="} {parameterName}"); } return this; } public QueryBuilderRaw GroupBy(List groupByList) { Append("GROUP BY"); return Append(string.Join(", ", groupByList)); } public QueryBuilderRaw OrderBy(List orderKeys) { Append("ORDER BY"); return Append(string.Join(", ", orderKeys)); } public QueryBuilderRaw Limit(int limit) { return Append($"LIMIT {limit}"); } public QueryBuilderRaw Limit(int limit, int offset) { return Append($"LIMIT {limit} OFFSET {offset}"); } private void AddParameter(string parameterName, object value) { _parameters.Add(parameterName, value); } private string AddParameterAndReturnKey(string key, object value) { string parameterKey = GetUniqueParameterName(key); AddParameter(parameterKey, value); return parameterKey; } private string GetStaticParameterName(string key) { return $"@databasevalue{key}"; } private string GetUniqueParameterName(string key) { return $"{GetStaticParameterName(key)}_{keyIndex++}"; } } }