BizHawk/BizHawk.Client.Common/Api/Classes/SqlApi.cs

104 lines
2.6 KiB
C#

using System.Collections.Generic;
using System.Data;
using System.Data.SQLite;
namespace BizHawk.Client.Common
{
public sealed class SqlApi : ISql
{
private SQLiteConnection _dbConnection;
public string CreateDatabase(string name)
{
try
{
SQLiteConnection.CreateFile(name);
}
catch (SQLiteException sqlEx)
{
return sqlEx.Message;
}
return "Database Created Successfully";
}
public string OpenDatabase(string name)
{
try
{
_dbConnection = new SQLiteConnection(
new SQLiteConnectionStringBuilder {
DataSource = name,
Version = 3,
JournalMode = SQLiteJournalModeEnum.Wal, // Allows for reads and writes to happen at the same time
DefaultIsolationLevel = IsolationLevel.ReadCommitted, // This only helps make the database lock left. May be pointless now
SyncMode = SynchronizationModes.Off // This shortens the delay for do synchronous calls.
}.ToString()
);
_dbConnection.Open();
}
catch (SQLiteException sqlEx)
{
return sqlEx.Message;
}
_dbConnection?.Close();
return "Database Opened Successfully";
}
public string WriteCommand(string query = null)
{
if (string.IsNullOrWhiteSpace(query)) return "query is empty";
if (_dbConnection == null) return "Database not open.";
string result;
try
{
_dbConnection.Open();
new SQLiteCommand(query, _dbConnection).ExecuteNonQuery();
result = "Command ran successfully";
}
catch (SQLiteException sqlEx)
{
result = sqlEx.Message;
}
_dbConnection.Close();
return result;
}
public object ReadCommand(string query = null)
{
if (string.IsNullOrWhiteSpace(query)) return "query is empty";
if (_dbConnection == null) return "Database not open.";
object result;
try
{
_dbConnection.Open();
using var command = new SQLiteCommand($"PRAGMA read_uncommitted =1;{query}", _dbConnection);
using var reader = command.ExecuteReader();
if (reader.HasRows)
{
var columns = new string[reader.FieldCount];
for (int i = 0, l = reader.FieldCount; i < l; i++) columns[i] = reader.GetName(i);
long rowCount = 0;
var table = new Dictionary<string, object>();
while (reader.Read())
{
for (int i = 0, l = reader.FieldCount; i < l; i++) table[$"{columns[i]} {rowCount}"] = reader.GetValue(i);
rowCount++;
}
reader.Close();
result = table;
}
else
{
result = "No rows found";
}
}
catch (SQLiteException sqlEx)
{
result = sqlEx.Message;
}
_dbConnection.Close();
return result;
}
}
}