Advertisement
Genral

MySqlCommand

Jun 20th, 2024
572
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.30 KB | None | 0 0
  1. using System;
  2. using System.Data;
  3. using System.Text;
  4. using Sinaa_Project;
  5. using MySql.Data.MySqlClient;
  6. using System.Collections.Generic;
  7. using System.Text.RegularExpressions;
  8.  
  9. namespace AmirSQL.MySQL
  10. {
  11.     public class MySqlCommand : IDisposable
  12.     {
  13.         //private MySqlCommandType _type;
  14.         public MySqlCommandType Type { get; set; }
  15.         private StringBuilder _command;
  16.         private List<MySqlParameter> _parameters = new List<MySqlParameter>();
  17.         public List<MySqlParameter> Parameters => _parameters;
  18.         public string Command
  19.         {
  20.             get => _command.ToString();
  21.             private set => _command = new StringBuilder(value);
  22.         }
  23.  
  24.         private bool firstPart = true;
  25.         private Dictionary<byte, string> insertFields;
  26.         private Dictionary<byte, string> insertValues;
  27.         private byte lastpair;
  28.  
  29.         public MySqlCommand(MySqlCommandType type)
  30.         {
  31.             Type = type;
  32.             _command = new StringBuilder();
  33.  
  34.             switch (type)
  35.             {
  36.                 case MySqlCommandType.SELECT:
  37.                     _command = new StringBuilder("SELECT * FROM <R>");
  38.                     break;
  39.                 case MySqlCommandType.UPDATE:
  40.                     _command = new StringBuilder("UPDATE <R> SET ");
  41.                     break;
  42.                 case MySqlCommandType.INSERT:
  43.                     insertFields = new Dictionary<byte, string>();
  44.                     insertValues = new Dictionary<byte, string>();
  45.                     lastpair = 0;
  46.                     _command = new StringBuilder("INSERT INTO <R> (<F>) VALUES (<V>)");
  47.                     break;
  48.                 case MySqlCommandType.DELETE:
  49.                     _command = new StringBuilder("DELETE FROM <R> WHERE <C> = <V>");
  50.                     break;
  51.                 case MySqlCommandType.COUNT:
  52.                     _command = new StringBuilder("SELECT count(<V>) FROM <R>");
  53.                     break;
  54.             }
  55.         }
  56.         private bool Comma()
  57.         {
  58.             if (firstPart)
  59.             {
  60.                 firstPart = false;
  61.                 return false;
  62.             }
  63.             return _command[_command.Length - 1] != ',';
  64.         }
  65.  
  66.         public MySqlCommand Select(string table)
  67.         {
  68.             _command = _command.Replace("<R>", $"`{table}`");
  69.             return this;
  70.         }
  71.  
  72.         public MySqlCommand Count(string table)
  73.         {
  74.             _command = _command.Replace("<R>", $"`{table}`");
  75.             return this;
  76.         }
  77.  
  78.         public MySqlCommand Delete(string table, string column, object value)
  79.         {
  80.             _command = _command.Replace("<R>", $"`{table}`")
  81.                                .Replace("<C>", $"`{column}`")
  82.                                .Replace("<V>", value is string str ? $"'{str.MySqlEscape()}'" : value.ToString());
  83.             return this;
  84.         }
  85.  
  86.         public MySqlCommand Update(string table)
  87.         {
  88.             _command = _command.Replace("<R>", $"`{table}`");
  89.             return this;
  90.         }
  91.  
  92.         //public MySqlCommand Set(string column, object value)
  93.         //{
  94.         //    if (Type == MySqlCommandType.UPDATE)
  95.         //    {
  96.         //        if (Comma())
  97.         //            _command.Append($", `{column}` = {(value is byte[]? $"@{column}" : (value is string str ? $"'{str.MySqlEscape()}'" : value.ToString()))} ");
  98.         //        else
  99.         //            _command.Append($"`{column}` = {(value is byte[]? $"@{column}" : (value is string str ? $"'{str.MySqlEscape()}'" : value.ToString()))} ");
  100.  
  101.         //        if (value is byte[])
  102.         //        {
  103.         //            AddParameter($"@{column}", value);
  104.         //        }
  105.         //    }
  106.         //    return this;
  107.         //}
  108.         //public MySqlCommand Set(string column, object value)
  109.         //{
  110.         //    if (Type == MySqlCommandType.UPDATE)
  111.         //    {
  112.         //        string parameterPlaceholder = $"@{column}";
  113.  
  114.         //        if (Comma())
  115.         //        {
  116.         //            _command.Append($", `{column}` = {parameterPlaceholder} ");
  117.         //        }
  118.         //        else
  119.         //        {
  120.         //            _command.Append($"`{column}` = {parameterPlaceholder} ");
  121.         //        }
  122.  
  123.         //        AddParameter(parameterPlaceholder, value);
  124.         //    }
  125.         //    return this;
  126.         //}
  127.         public MySqlCommand Set(string column, object value)
  128.         {
  129.             if (Type == MySqlCommandType.UPDATE)
  130.             {
  131.                 bool isByteArray = value is byte[];
  132.                 string parameterPlaceholder = $"@{column}";
  133.  
  134.                 if (Comma())
  135.                 {
  136.                     _command.Append($", `{column}` = {parameterPlaceholder} ");
  137.                 }
  138.                 else
  139.                 {
  140.                     _command.Append($"`{column}` = {parameterPlaceholder} ");
  141.                 }
  142.  
  143.                 // Add the parameter to the list
  144.                 AddParameter(parameterPlaceholder, value);
  145.  
  146.                
  147.                 Program.AddError($"Set column: {column}, value: {(isByteArray ? "byte[]" : value.ToString())}");
  148.             }
  149.             return this;
  150.         }
  151.  
  152.  
  153.  
  154.  
  155.  
  156.         public MySqlCommand Insert(string table)
  157.         {
  158.             _command = _command.Replace("<R>", $"`{table}`");
  159.             return this;
  160.         }
  161.  
  162.         public MySqlCommand Insert(string field, object value)
  163.         {
  164.             insertFields.Add(lastpair, $"`{field}`");
  165.             insertValues.Add(lastpair, value is byte[]? $"@{field}" : (value is string str ? $"'{str.MySqlEscape()}'" : value.ToString()));
  166.             if (value is byte[])
  167.             {
  168.                 AddParameter($"@{field}", value);
  169.             }
  170.             lastpair++;
  171.             return this;
  172.         }
  173.  
  174.         //public MySqlCommand AddParameter(string name, object value)
  175.         //{
  176.         //    _parameters.Add(new MySqlParameter(name, value));
  177.         //    return this;
  178.         //}
  179.         public MySqlCommand AddParameter(string name, object value)
  180.         {
  181.             if (value == DBNull.Value)
  182.             {
  183.                 _parameters.Add(new MySqlParameter(name, value));
  184.             }
  185.             else if (value is byte[])
  186.             {
  187.                 _parameters.Add(new MySqlParameter(name, MySqlDbType.Blob) { Value = value });
  188.             }
  189.             else
  190.             {
  191.                 _parameters.Add(new MySqlParameter(name, value));
  192.             }
  193.             return this;
  194.         }
  195.  
  196.  
  197.         public MySqlCommand Where(string column, object value, bool greater = false, bool like = false)
  198.         {
  199.             if (like)
  200.             {
  201.                 if (value is string stringValue)
  202.                 {
  203.                     _command.Append($"WHERE `{column}` LIKE '{stringValue.MySqlEscape()}'");
  204.                 }
  205.                 else
  206.                 {
  207.                     _command.Append($"WHERE `{column}` LIKE {value}");
  208.                 }
  209.             }
  210.             else
  211.             {
  212.                 if (value is string stringValue)
  213.                 {
  214.                     _command.Append(greater ? $"WHERE `{column}` > '{stringValue.MySqlEscape()}'" : $"WHERE `{column}` = '{stringValue.MySqlEscape()}'");
  215.                 }
  216.                 else
  217.                 {
  218.                     _command.Append(greater ? $"WHERE `{column}` > {value}" : $"WHERE `{column}` = {value}");
  219.                 }
  220.             }
  221.             return this;
  222.         }
  223.  
  224.         public MySqlCommand And(string column, object value)
  225.         {
  226.             _command.Append($" AND `{column}` = {value}");
  227.             return this;
  228.         }
  229.  
  230.         public MySqlCommand Or(string column, object value)
  231.         {
  232.             _command.Append($" OR `{column}` = {value}");
  233.             return this;
  234.         }
  235.  
  236.         public MySqlCommand Order(string column)
  237.         {
  238.             _command.Append($" ORDER BY {column}");
  239.             return this;
  240.         }
  241.         public int Execute()
  242.         {
  243.             using (var conn = DataHolder.MySqlConnection)
  244.             {
  245.                 conn.Open();
  246.                 return Execute(conn);
  247.             }
  248.         }
  249.         public int Execute(MySqlConnection conn)
  250.         {
  251.            
  252.             if (Type == MySqlCommandType.INSERT)
  253.             {
  254.                 var fields = string.Join(",", insertFields.Values);
  255.                 var values = string.Join(",", insertValues.Values);
  256.                 _command.Replace("<F>", fields).Replace("<V>", values);
  257.             }
  258.             Program.AddError("Executing Command: " + Command); // Log the command
  259.             using (var cmd = new MySql.Data.MySqlClient.MySqlCommand(Command, conn))
  260.             {
  261.                 foreach (var parameter in _parameters)
  262.                 {
  263.                     Program.AddError($"Parameter: {parameter.ParameterName}, Value: {parameter.Value}"); // Log parameters
  264.                     cmd.Parameters.Add(parameter);
  265.                 }
  266.                 return cmd.ExecuteNonQuery();
  267.             }
  268.         }
  269.  
  270.         public MySqlReader CreateReader()
  271.         {
  272.             return new MySqlReader(this);
  273.         }
  274.  
  275.         public void Dispose()
  276.         {
  277.             insertValues?.Clear();
  278.             insertFields?.Clear();
  279.             _command = null;
  280.         }
  281.     }
  282.  
  283.     public enum MySqlCommandType
  284.     {
  285.         DELETE, INSERT, SELECT, UPDATE, COUNT
  286.     }
  287.  
  288.     public class MySqlReader : IDisposable
  289.     {
  290.         private readonly DataSet _dataset;
  291.         private DataRow _datarow;
  292.         private int _row;
  293.         private const string Table = "table";
  294.  
  295.         public MySqlReader(MySqlCommand command)
  296.         {
  297.             if (command.Type == MySqlCommandType.SELECT)
  298.             {
  299.                 _dataset = new DataSet();
  300.                 _row = 0;
  301.                 using (var conn = DataHolder.MySqlConnection)
  302.                 {
  303.                     conn.Open();
  304.                     using (var adapter = new MySqlDataAdapter(command.Command, conn))
  305.                         adapter.Fill(_dataset, Table);
  306.                 }
  307.                 command.Dispose();
  308.             }
  309.         }
  310.  
  311.         public void Dispose()
  312.         {
  313.             _dataset?.Dispose();
  314.         }
  315.  
  316.         public bool Read()
  317.         {
  318.             if (_dataset == null || _dataset.Tables.Count == 0 || _dataset.Tables[Table].Rows.Count <= _row)
  319.                 return false;
  320.  
  321.             _datarow = _dataset.Tables[Table].Rows[_row];
  322.             _row++;
  323.             return true;
  324.         }
  325.  
  326.         public int NumberOfRows => _dataset?.Tables.Count > 0 ? _dataset.Tables[Table].Rows.Count : 0;
  327.  
  328.         public T Read<T>(string columnName)
  329.         {
  330.             if (_datarow.IsNull(columnName)) return default;
  331.  
  332.             var value = _datarow[columnName];
  333.             return (T)Convert.ChangeType(value, typeof(T));
  334.         }
  335.     }
  336.  
  337.     public static class MySqlExtensions
  338.     {
  339.         public static string MySqlEscape(this string usString)
  340.         {
  341.             if (usString == null) return null;
  342.             return Regex.Replace(usString, @"[\r\n\x00\x1a\\'""]", @"\$0");
  343.         }
  344.     }
  345.  
  346.     public static class DataHolder
  347.     {
  348.         public static MySqlConnection MySqlConnection => new MySqlConnection(Program.connection("db_sql", ""));
  349.     }
  350. }
  351.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement