104 lines
2.6 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|