mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-23 04:32:50 -04:00
Make DB backends a little more flexible with overriding
This commit is contained in:
parent
b875e2fab2
commit
1bf0f7ae36
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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()) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user