Forge
csharpdeeb25a2
1using CascadeIDE.Data;
2using CascadeIDE.Models;
3using Microsoft.EntityFrameworkCore;
4using OutWit.Database.EntityFramework.Extensions;
5
6namespace CascadeIDE.Services;
7
8/// <summary>Хранение данных приложения (недавние решения, кэш, настройки отправки и т.д.) в WitDatabase через EF Core.</summary>
9public sealed class AppDataService : IDisposable
10{
11 private AppDbContext _context;
12
13 public AppDataService()
14 {
15 var path = Path.Combine(SettingsService.GetSettingsDirectory(), "app.witdb");
16 var options = new DbContextOptionsBuilder<AppDbContext>()
17 .UseWitDb($"Data Source={path}")
18 .Options;
19 _context = new AppDbContext(options);
20 _context.Database.EnsureCreated();
21 // EnsureCreated при уже существующем файле не добавляет новые таблицы; старый app.witdb без AppData давал ошибку Wit «Table … not found».
22 EnsureAppDataTableReachable(path, options);
23 }
24
25 /// <summary>Если база уже была, но без таблицы AppData — пересоздаём файл (единоразово восстанавливает схему; локальное kv-хранилище).</summary>
26 private void EnsureAppDataTableReachable(string witPath, DbContextOptions<AppDbContext> options)
27 {
28 try
29 {
30 // Без Take(1)/Count: Wit SQL не переваривает LIMIT из такого запроса EF.
31 _ = _context.AppData.Find("__cascade_ide_schema_probe__");
32 }
33 catch (InvalidOperationException ex) when (
34 ex.Message.Contains("Table", StringComparison.Ordinal)
35 && ex.Message.Contains("not found", StringComparison.OrdinalIgnoreCase))
36 {
37 _context.Dispose();
38 if (File.Exists(witPath))
39 File.Delete(witPath);
40 _context = new AppDbContext(options);
41 _context.Database.EnsureCreated();
42 _ = _context.AppData.Find("__cascade_ide_schema_probe__");
43 }
44 }
45
46 public void Put(string key, string value)
47 {
48 var item = _context.AppData.Find(key);
49 if (item is null)
50 _context.AppData.Add(new AppDataItem { Key = key, Value = value });
51 else
52 item.Value = value;
53 _context.SaveChanges();
54 }
55
56 public string? Get(string key)
57 {
58 return _context.AppData.Find(key)?.Value;
59 }
60
61 public void Delete(string key)
62 {
63 var item = _context.AppData.Find(key);
64 if (item is not null)
65 {
66 _context.AppData.Remove(item);
67 _context.SaveChanges();
68 }
69 }
70
71 public void Flush() => _context.SaveChanges();
72
73 public void Dispose() => _context.Dispose();
74}
75
View only · write via MCP/CIDE