sharp-chat/SharpChat.Database.MariaDB/MariaDBDatabaseBackend.cs

89 lines
3.5 KiB
C#

using MySql.Data.MySqlClient;
using SharpChat.Configuration;
using System.Collections.Generic;
using System.Text;
namespace SharpChat.Database.MariaDB {
[DatabaseBackend(@"mariadb")]
public class MariaDBDatabaseBackend : IDatabaseBackend {
private string DSN { get; }
private const string DEFAULT_CHARSET = @"utf8mb4";
public MariaDBDatabaseBackend(IConfig config) : this(
config.ReadValue(@"host", string.Empty),
config.ReadValue(@"user", string.Empty),
config.ReadValue(@"pass", string.Empty),
config.ReadValue(@"db", string.Empty),
config.ReadValue(@"charset", DEFAULT_CHARSET)
) {}
public MariaDBDatabaseBackend(string host, string username, string password, string database, string charset = DEFAULT_CHARSET) {
DSN = new MySqlConnectionStringBuilder {
Server = host,
UserID = username,
Password = password,
Database = database,
IgnorePrepare = false,
OldGuids = false,
TreatTinyAsBoolean = false,
CharacterSet = charset,
TreatBlobsAsUTF8 = false,
}.ToString();
}
public IDatabaseConnection CreateConnection()
=> new MariaDBDatabaseConnection(DSN);
public IDatabaseParameter CreateParameter(string name, object value)
=> new MariaDBDatabaseParameter(name, value);
public IDatabaseParameter CreateParameter(string name, DatabaseType type)
=> new MariaDBDatabaseParameter(name, type);
public string TimestampType
=> @"TIMESTAMP";
public string TextType
=> @"TEXT";
public string BlobType
=> @"BLOB";
public string VarCharType(int size)
=> string.Format(@"VARCHAR({0})", size);
public string VarBinaryType(int size)
=> string.Format(@"VARBINARY({0})", size);
public string BigIntType(int length)
=> string.Format(@"BIGINT({0})", length);
public string BigUIntType(int length)
=> string.Format(@"BIGINT({0}) UNSIGNED", length);
public string IntType(int length)
=> string.Format(@"INT({0})", length);
public string UIntType(int length)
=> string.Format(@"INT({0}) UNSIGNED", length);
public string TinyIntType(int length)
=> string.Format(@"TINYINT({0})", length);
public string TinyUIntType(int length)
=> string.Format(@"TINYINT({0}) UNSIGNED", length);
public string FromUnixTime(string param)
=> string.Format(@"FROM_UNIXTIME({0})", param);
public string ToUnixTime(string param)
=> string.Format(@"UNIX_TIMESTAMP({0})", param);
public string DateTimeNow()
=> @"NOW()";
public bool SupportsJson => true;
public string JsonValue(string field, string path) // yes this is fucked, no i don't care
=> string.Format(@"JSON_UNQUOTE(JSON_EXTRACT({0}, '{1}'))", field, path);
public string Concat(params string[] values)
=> string.Format(@"CONCAT({0})", string.Join(@", ", values));
public string ToLower(string param)
=> string.Format(@"LOWER({0})", param);
public bool SupportsAlterTableCollate => true;
public string AsciiCollation => @"'ascii_general_ci'";
public string UnicodeCollation => @"'utf8mb4_unicode_520_ci'";
}
}