forked from Misaki/GhostEngine
Added a new static class `AssetsPath` for asset management. Added a new icon file (`icon-256.ico`) for UI representation. Added new package references to enhance functionality. Added internals visibility attributes for better testing. Added a new `EngineEditorViewModel` class for MVVM support. Added a new `GameObject` class for component management. Added a new `BitSet` class for efficient bit manipulation. Added various utility classes to support the new entity system. Changed the `ID` property in `ProjectInfo` to internal. Changed the `AddProjectAsync` method to return the created `ProjectInfo`. Changed the connection string retrieval method to use the new `Command` constant. Changed the `DataPath` class to use `readonly` fields for folder paths. Changed the `ActivationHandler` class to use new `DataPath` constants. Changed the `OpenProjectPage` layout and interaction for better UI. Updated the target framework to a newer version for compatibility. Updated the `ProjectService` to use new constants from `DataPath`. Updated the `World` class to improve entity management. Refactored the `ProjectRepository` class to encapsulate SQL commands. Refactored the `Transform` class to use properties for better encapsulation.
101 lines
4.0 KiB
C#
101 lines
4.0 KiB
C#
using Ghost.Data.Models;
|
|
using Ghost.Data.Resources;
|
|
using System.Data.SQLite;
|
|
|
|
namespace Ghost.Data.DataContext;
|
|
|
|
internal static class ProjectRepository
|
|
{
|
|
private static class Command
|
|
{
|
|
public const string CONNECTION_STRING = "Data Source={0}\\projects.db;Version=3;";
|
|
public const string CREATE_PROJECT_TABLE_STRING = "CREATE TABLE IF NOT EXISTS Projects (ID INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, Path TEXT, EngineVersion TEXT, LastOpened DATETIME);";
|
|
public const string SELECT_PROJECT_STRING = "SELECT * FROM Projects";
|
|
public const string INSERT_PROJECT_STRING = "INSERT INTO Projects (Name, Path, EngineVersion, LastOpened) VALUES (@Name, @Path, @EngineVersion, @LastOpened);";
|
|
public const string REMOVE_PROJECT_STRING = "DELETE FROM Projects WHERE ID = @ID;";
|
|
public const string UPDATE_PROJECT_STRING = "UPDATE Projects SET Name = @Name, Path = @Path, EngineVersion = @EngineVersion, LastOpened = @LastOpened WHERE ID = @ID;";
|
|
}
|
|
|
|
private static string GetConnectionString() => string.Format(Command.CONNECTION_STRING, DataPath.APPLICATION_DATA_FOLDER);
|
|
|
|
private static async Task EnsureTableCreatedAsync(SQLiteConnection connection)
|
|
{
|
|
using var createCommand = connection.CreateCommand();
|
|
createCommand.CommandText = Command.CREATE_PROJECT_TABLE_STRING;
|
|
await createCommand.ExecuteNonQueryAsync();
|
|
}
|
|
|
|
public static async IAsyncEnumerable<ProjectInfo> LoadProjectsAsync()
|
|
{
|
|
using var connection = new SQLiteConnection(GetConnectionString());
|
|
await connection.OpenAsync();
|
|
|
|
await EnsureTableCreatedAsync(connection);
|
|
|
|
using var command = connection.CreateCommand();
|
|
command.CommandText = Command.SELECT_PROJECT_STRING;
|
|
|
|
using var reader = command.ExecuteReader();
|
|
while (await reader.ReadAsync())
|
|
{
|
|
var project = new ProjectInfo
|
|
{
|
|
ID = reader.GetInt32(0),
|
|
Name = reader.GetString(1),
|
|
Path = reader.GetString(2),
|
|
EngineVersion = new Version(reader.GetString(3)),
|
|
LastOpened = reader.GetDateTime(4)
|
|
};
|
|
|
|
yield return project;
|
|
}
|
|
}
|
|
|
|
public static async Task AddProjectAsync(ProjectInfo project)
|
|
{
|
|
using var connection = new SQLiteConnection(GetConnectionString());
|
|
await connection.OpenAsync();
|
|
|
|
await EnsureTableCreatedAsync(connection);
|
|
|
|
using var command = connection.CreateCommand();
|
|
command.CommandText = Command.INSERT_PROJECT_STRING;
|
|
|
|
command.Parameters.AddWithValue("@Name", project.Name);
|
|
command.Parameters.AddWithValue("@Path", project.Path);
|
|
command.Parameters.AddWithValue("@EngineVersion", project.EngineVersion.ToString());
|
|
command.Parameters.AddWithValue("@LastOpened", project.LastOpened);
|
|
|
|
await command.ExecuteNonQueryAsync();
|
|
}
|
|
|
|
public static async Task RemoveProjectAsync(ProjectInfo project)
|
|
{
|
|
using var connection = new SQLiteConnection(GetConnectionString());
|
|
await connection.OpenAsync();
|
|
|
|
using var command = connection.CreateCommand();
|
|
command.CommandText = Command.REMOVE_PROJECT_STRING;
|
|
|
|
command.Parameters.AddWithValue("@ID", project.ID);
|
|
|
|
await command.ExecuteNonQueryAsync();
|
|
}
|
|
|
|
public static async Task UpdateProjectAsync(ProjectInfo project)
|
|
{
|
|
using var connection = new SQLiteConnection(GetConnectionString());
|
|
await connection.OpenAsync();
|
|
|
|
using var command = connection.CreateCommand();
|
|
command.CommandText = Command.UPDATE_PROJECT_STRING;
|
|
|
|
command.Parameters.AddWithValue("@Name", project.Name);
|
|
command.Parameters.AddWithValue("@Path", project.Path);
|
|
command.Parameters.AddWithValue("@EngineVersion", project.EngineVersion.ToString());
|
|
command.Parameters.AddWithValue("@LastOpened", project.LastOpened);
|
|
command.Parameters.AddWithValue("@ID", project.ID); // Ensure the ID parameter is added
|
|
|
|
await command.ExecuteNonQueryAsync();
|
|
}
|
|
} |