Make DB backends a little more flexible with overriding

This commit is contained in:
UnknownShadow200 2024-04-02 19:05:07 +11:00
parent b875e2fab2
commit 1bf0f7ae36
5 changed files with 54 additions and 57 deletions

View File

@ -20,36 +20,33 @@ using System;
namespace MCGalaxy.SQL
{
/// <summary> Abstracts a connection to a SQL database </summary>
public abstract class ISqlConnection : IDisposable
public interface ISqlConnection : IDisposable
{
public abstract ISqlTransaction BeginTransaction();
public abstract ISqlCommand CreateCommand(string sql);
ISqlTransaction BeginTransaction();
ISqlCommand CreateCommand(string sql);
public abstract void Open();
public abstract void ChangeDatabase(string name);
public abstract void Close();
public abstract void Dispose();
void Open();
void ChangeDatabase(string name);
void Close();
}
/// <summary> Abstracts a SQL command/statement </summary>
public abstract class ISqlCommand : IDisposable
public interface ISqlCommand : IDisposable
{
public abstract void ClearParameters();
public abstract void AddParameter(string name, object value);
void ClearParameters();
void AddParameter(string name, object value);
public abstract void Prepare();
void Prepare();
/// <summary> Executes this command and returns the number of rows affected </summary>
public abstract int ExecuteNonQuery();
int ExecuteNonQuery();
/// <summary> Executes this command and returns an ISqlReader for reading the results </summary>
public abstract ISqlReader ExecuteReader();
public abstract void Dispose();
ISqlReader ExecuteReader();
}
public abstract class ISqlTransaction : IDisposable
public interface ISqlTransaction : IDisposable
{
public abstract void Commit();
public abstract void Rollback();
public abstract void Dispose();
void Commit();
void Rollback();
}
/// <summary> Abstracts iterating over the results from executing a SQL command </summary>

View File

@ -24,7 +24,7 @@ using MySql.Data.MySqlClient;
namespace MCGalaxy.SQL
{
public sealed class MySQLBackend : IDatabaseBackend
public class MySQLBackend : IDatabaseBackend
{
public static IDatabaseBackend Instance = new MySQLBackend();
public MySQLBackend() {
@ -33,10 +33,10 @@ namespace MCGalaxy.SQL
CaselessLikeSuffix = "";
}
public override bool EnforcesTextLength { get { return true; } }
public override bool EnforcesTextLength { get { return true; } }
public override bool EnforcesIntegerLimits { get { return true; } }
public override bool MultipleSchema { get { return true; } }
public override string EngineName { get { return "MySQL"; } }
public override string EngineName { get { return "MySQL"; } }
public override ISqlConnection CreateConnection() {
const string format = "Data Source={0};Port={1};User ID={2};Password={3};Pooling={4};Treat Tiny As Boolean=false;";
@ -164,20 +164,20 @@ namespace MCGalaxy.SQL
public readonly MySqlConnection conn;
public MySQLConnection(MySqlConnection conn) { this.conn = conn; }
public override ISqlTransaction BeginTransaction() {
public ISqlTransaction BeginTransaction() {
MySqlTransaction trn = conn.BeginTransaction();
return new MySQLTransaction(trn);
}
public override ISqlCommand CreateCommand(string sql) {
public ISqlCommand CreateCommand(string sql) {
MySqlCommand cmd = new MySqlCommand(sql, conn);
return new MySQLCommand(cmd);
}
public override void Open() { conn.Open(); }
public override void ChangeDatabase(string name) { conn.ChangeDatabase(name); }
public override void Close() { conn.Close(); }
public override void Dispose() { conn.Dispose(); }
public void Open() { conn.Open(); }
public void ChangeDatabase(string name) { conn.ChangeDatabase(name); }
public void Close() { conn.Close(); }
public void Dispose() { conn.Dispose(); }
}
sealed class MySQLCommand : ISqlCommand
@ -185,18 +185,18 @@ namespace MCGalaxy.SQL
readonly MySqlCommand cmd;
public MySQLCommand(MySqlCommand cmd) { this.cmd = cmd; }
public override void ClearParameters() {
public void ClearParameters() {
cmd.Parameters.Clear();
}
public override void AddParameter(string name, object value) {
public void AddParameter(string name, object value) {
cmd.Parameters.AddWithValue(name, value);
}
public override void Dispose() { cmd.Dispose(); }
public override void Prepare() { cmd.Prepare(); }
public override int ExecuteNonQuery() { return cmd.ExecuteNonQuery(); }
public void Dispose() { cmd.Dispose(); }
public void Prepare() { cmd.Prepare(); }
public int ExecuteNonQuery() { return cmd.ExecuteNonQuery(); }
public override ISqlReader ExecuteReader() {
public ISqlReader ExecuteReader() {
MySqlDataReader rdr = cmd.ExecuteReader();
return new MySQLReader(rdr);
}
@ -207,9 +207,9 @@ namespace MCGalaxy.SQL
readonly MySqlTransaction trn;
public MySQLTransaction(MySqlTransaction trn) { this.trn = trn; }
public override void Commit() { trn.Commit(); }
public override void Rollback() { trn.Rollback(); }
public override void Dispose() { trn.Dispose(); }
public void Commit() { trn.Commit(); }
public void Rollback() { trn.Rollback(); }
public void Dispose() { trn.Dispose(); }
}
sealed class MySQLReader : ISqlReader

View File

@ -23,7 +23,7 @@ using MCGalaxy.Platform;
namespace MCGalaxy.SQL
{
public sealed class SQLiteBackend : IDatabaseBackend
public class SQLiteBackend : IDatabaseBackend
{
public static IDatabaseBackend Instance = new SQLiteBackend();
public SQLiteBackend() {
@ -31,10 +31,10 @@ namespace MCGalaxy.SQL
CaselessLikeSuffix = " COLLATE NOCASE";
}
public override bool EnforcesTextLength { get { return false; } }
public override bool EnforcesTextLength { get { return false; } }
public override bool EnforcesIntegerLimits { get { return false; } }
public override bool MultipleSchema { get { return false; } }
public override string EngineName { get { return "SQLite"; } }
public override string EngineName { get { return "SQLite"; } }
public override ISqlConnection CreateConnection() {
return new MCGSQLiteConnection();

View File

@ -105,13 +105,13 @@ namespace MCGalaxy.SQL
protected abstract bool ConnectionPooling { get; }
protected abstract string DBPath { get; }
public override ISqlTransaction BeginTransaction() {
public ISqlTransaction BeginTransaction() {
return new SQLiteTransaction(this);
}
public override void ChangeDatabase(string databaseName) { }
public void ChangeDatabase(string databaseName) { }
public override ISqlCommand CreateCommand(string sql) { return new SQLiteCommand(sql, this); }
public ISqlCommand CreateCommand(string sql) { return new SQLiteCommand(sql, this); }
public long LastInsertRowId {
get {
@ -170,7 +170,7 @@ namespace MCGalaxy.SQL
}
}
public override void Open() {
public void Open() {
if (handle != IntPtr.Zero) throw new InvalidOperationException();
try {
@ -226,8 +226,8 @@ namespace MCGalaxy.SQL
return false;
}
public override void Dispose() { Close(false); }
public override void Close() { Close(true); }
public void Dispose() { Close(false); }
public void Close() { Close(true); }
void Close(bool canThrow) {
if (handle == IntPtr.Zero) return;
@ -291,7 +291,7 @@ namespace MCGalaxy.SQL
stmt = null;
}
public override void Dispose() {
public void Dispose() {
conn = null;
param_names.Clear();
param_values.Clear();
@ -316,19 +316,19 @@ namespace MCGalaxy.SQL
return stmt;
}
public override void Prepare() { }
public void Prepare() { }
public override void ClearParameters() {
public void ClearParameters() {
param_names.Clear();
param_values.Clear();
}
public override void AddParameter(string name, object value) {
public void AddParameter(string name, object value) {
param_names.Add(name);
param_values.Add(value);
}
public override ISqlReader ExecuteReader() {
public ISqlReader ExecuteReader() {
SQLiteConnection.Check(conn);
SQLiteDataReader reader = new SQLiteDataReader(this);
@ -336,7 +336,7 @@ namespace MCGalaxy.SQL
return reader;
}
public override int ExecuteNonQuery() {
public int ExecuteNonQuery() {
using (ISqlReader reader = ExecuteReader()) {
while (reader.Read()) { }
return reader.RowsAffected;
@ -835,7 +835,7 @@ namespace MCGalaxy.SQL
}
}
public sealed class SQLiteTransaction : ISqlTransaction
public class SQLiteTransaction : ISqlTransaction
{
SQLiteConnection conn;
@ -855,13 +855,13 @@ namespace MCGalaxy.SQL
}
bool disposed;
public override void Dispose() {
public void Dispose() {
if (disposed) return;
if (IsValid(false)) IssueRollback(false);
disposed = true;
}
public override void Commit() {
public void Commit() {
SQLiteConnection.Check(conn);
IsValid(true);
@ -873,7 +873,7 @@ namespace MCGalaxy.SQL
conn = null;
}
public override void Rollback() {
public void Rollback() {
SQLiteConnection.Check(conn);
IsValid(true);
IssueRollback(true);

View File

@ -152,7 +152,7 @@ namespace MCGalaxy.SQL
#region Raw SQL functions
/// <summary> Executes an SQL command and returns the number of affected rows. </summary>
public int Execute(string sql, object[] parameters, bool createDB) {
public virtual int Execute(string sql, object[] parameters, bool createDB) {
int rows = 0;
using (ISqlConnection conn = CreateConnection()) {
@ -170,7 +170,7 @@ namespace MCGalaxy.SQL
}
/// <summary> Excecutes an SQL query, invoking a callback on the returned rows one by one. </summary>
public int Iterate(string sql, object[] parameters, ReaderCallback callback) {
public virtual int Iterate(string sql, object[] parameters, ReaderCallback callback) {
int rows = 0;
using (ISqlConnection conn = CreateConnection()) {