跳到主要内容

github/tai

公开

Tai · Windows 软件与网站使用时长统计。上游 Planshit/Tai 的源码镜像,非灵栈原创;MIT 许可。来源:https://github.com/Planshit/Tai 。本次为手动同步,暂不提供安装包。

提交记录
修改Core/Librarys/SQLite/TaiDbContext.cs+2 −1看文件
@@ -48,7 +48,8 @@ namespace Core.Librarys.SQLite
4848 public TaiDbContext()
4949 : base(new SQLiteConnection()
5050 {
51删除: ConnectionString = $"Data Source={_dbFilePath}"
51新增: ConnectionString = $"Data Source={_dbFilePath}",
52新增: BusyTimeout = 60
5253 }, true)
5354 {
5455 DbConfiguration.SetConfiguration(new SQLiteConfiguration());
修改Core/Servicers/Instances/AppData.cs+56 −19看文件
@@ -1,4 +1,5 @@
1删除:using Core.Librarys.SQLite;
1新增:using Core.Librarys;
2新增:using Core.Librarys.SQLite;
23using Core.Models;
34using Core.Servicers.Interfaces;
45using System;
@@ -16,6 +17,7 @@ namespace Core.Servicers.Instances
1617 private List<AppModel> _apps;
1718
1819 private readonly IDatabase _databse;
20新增: private readonly object _locker = new object();
1921 public AppData(IDatabase databse)
2022 {
2123 _databse = databse;
@@ -56,46 +58,81 @@ namespace Core.Servicers.Instances
5658 /// 更新app数据,要先调用GetApp获得后更改并传回才有效
5759 /// </summary>
5860 /// <param name="app"></param>
59删除: public void UpdateApp(AppModel app)
61新增: public void UpdateApp(AppModel app_)
6062 {
61删除: using (var db = _databse.GetWriterContext())
63新增: try
6264 {
63删除: db.Entry(app).State = System.Data.Entity.EntityState.Modified;
64删除: db.SaveChanges();
65删除: _databse.CloseWriter();
65新增: using (var db = _databse.GetWriterContext())
66新增: {
67新增: var app = db.App.FirstOrDefault(c => c.ID.Equals(app_.ID));
68新增: if (app != null)
69新增: {
70新增: app.TotalTime = app_.TotalTime;
71新增: app.IconFile = app_.IconFile;
72新增: app.Name = app_.Name;
73新增: app.Description = app_.Description;
74新增: app.File = app_.File;
75新增: app.CategoryID = app_.CategoryID;
76新增: db.SaveChanges();
77新增: }
78新增: _databse.CloseWriter();
79新增: }
80新增: }
81新增: catch(Exception e)
82新增: {
83新增: Logger.Error(e.ToString());
6684 }
6785 }
6886 public AppModel GetApp(string name)
6987 {
70删除: return _apps.Where(m => m.Name == name).FirstOrDefault();
88新增: lock (_locker)
89新增: {
90新增: return _apps.Where(m => m.Name == name).FirstOrDefault();
91新增: }
7192 }
7293 public AppModel GetApp(int id)
7394 {
74删除: return _apps.Where(m => m.ID == id).FirstOrDefault();
95新增: lock (_locker)
96新增: {
97新增: return _apps.Where(m => m.ID == id).FirstOrDefault();
98新增: }
7599 }
76100 public void AddApp(AppModel app)
77101 {
78删除: if (_apps.Where(m => m.Name == app.Name).Any())
102新增: lock (_locker)
79103 {
80删除: return;
81删除: }
104新增: if (_apps.Where(m => m.Name == app.Name).Any())
105新增: {
106新增: return;
107新增: }
108新增: try
109新增: {
110新增: using (var db = _databse.GetWriterContext())
111新增: {
112新增: var r = db.App.Add(app);
113新增: int res = db.SaveChanges();
114新增: if (res > 0)
115新增: {
116新增: Debug.WriteLine("add done!" + r.ID);
82117
83删除: using (var db = _databse.GetWriterContext())
84删除: {
85删除: db.App.Add(app);
86删除: int res = db.SaveChanges();
87删除: if (res > 0)
118新增: _apps.Add(app);
119新增: }
120新增: _databse.CloseWriter();
121新增: }
122新增: }catch(Exception e)
88123 {
89删除: _apps.Add(app);
124新增: Logger.Error(e.ToString());
90125 }
91删除: _databse.CloseWriter();
92126 }
93127 }
94128
95129
96130 public List<AppModel> GetAppsByCategoryID(int categoryID)
97131 {
98删除: return _apps.Where(m => m.CategoryID == categoryID).ToList();
132新增: lock (_locker)
133新增: {
134新增: return _apps.Where(m => m.CategoryID == categoryID).ToList();
135新增: }
99136 }
100137 }
101138}
修改Core/Servicers/Instances/Data.cs+4 −6看文件
@@ -14,7 +14,6 @@ using System.IO;
1414using CsvHelper;
1515using System.Globalization;
1616using System.Threading.Tasks;
17删除:using NPOI.SS.Formula.Functions;
1817
1918namespace Core.Servicers.Instances
2019{
@@ -111,23 +110,22 @@ namespace Core.Servicers.Instances
111110 }
112111
113112 db.SaveChanges();
114删除: _database.CloseWriter();
115113 Logger.Info($"Save app time done.Process:{processName_},Duration:{duration_},StartDateTime:{startDateTime_},AppID:{app.ID}");
116114 }
117115 }
118116 catch (Exception e)
119117 {
120118 Logger.Error($"Save app time error!Process:{processName_},Duration:{duration_},StartDateTime:{startDateTime_}.\r\nError:\r\n{e.Message}");
121删除:
119新增: }
120新增: finally
121新增: {
122新增: _database.CloseWriter();
122123 }
123124 });
124125 }
125126
126127 public List<DailyLogModel> GetTodaylogList()
127128 {
128删除:
129删除: //return null;
130删除:
131129 using (var db = _database.GetReaderContext())
132130 {
133131 var today = DateTime.Now.Date;
修改Core/Servicers/Instances/Database.cs+43 −28看文件
@@ -2,8 +2,10 @@
22using Core.Servicers.Interfaces;
33using System;
44using System.Collections.Generic;
5新增:using System.Data.SQLite;
56using System.Diagnostics;
67using System.Linq;
8新增:using System.Runtime.CompilerServices;
79using System.Text;
810using System.Threading;
911using System.Threading.Tasks;
@@ -12,55 +14,65 @@ namespace Core.Servicers.Instances
1214{
1315 public class Database : IDatabase
1416 {
15删除: //private TaiDbContext _readerContext;
1617 private TaiDbContext _writerContext;
17删除: private readonly object _locker = new object();
18删除: private bool _locked = false;
19删除: private int _outTime = 10;
18新增: private readonly object _writeLocker = new object();
19新增: private readonly object _readLocker = new object();
20新增: private readonly object _closeLocker = new object();
21新增: private int _outTime = 60;
22新增: private int _readerNum = 0;
23新增: private bool _isWriting = false;
2024 private bool _isReading = false;
2125 public TaiDbContext GetReaderContext()
2226 {
23删除: lock (_locker)
27新增: lock (_readLocker)
2428 {
25删除: int lockTime = 0;
26删除: while (_locked)
29新增: _isReading = true;
30新增: int duration = 0;
31新增: while (_isWriting)
2732 {
28删除: Thread.Sleep(100);
29删除: lockTime += 100;
30删除: if (lockTime >= _outTime * 1000)
33新增: Thread.Sleep(1000);
34新增: duration++;
35新增: if (duration >= _outTime)
3136 {
32删除: _locked = false;
37新增: break;
3338 }
3439 }
35删除: //_locked = true;
36删除:
37删除: //_readerContext = new TaiDbContext();
38删除: //return _readerContext;
39删除: return new TaiDbContext();
40新增: _writerContext?.Dispose();
41新增: _readerNum++;
42新增: var db = new TaiDbContext();
43新增: db.Database.Connection.StateChange += Connection_StateChange;
44新增: return db;
4045 }
4146 }
4247
48新增: private void Connection_StateChange(object sender, System.Data.StateChangeEventArgs e)
49新增: {
50新增: if (e.CurrentState == System.Data.ConnectionState.Closed)
51新增: {
52新增: _readerNum--;
53新增: _isReading = _readerNum > 0;
54新增: }
55新增: }
56新增:
4357 public void CloseReader()
4458 {
45删除: //_readerContext?.Dispose();
4659 }
4760
4861 public TaiDbContext GetWriterContext()
4962 {
50删除: lock (_locker)
63新增: lock (_writeLocker)
5164 {
52删除: int lockTime = 0;
53删除: while (_locked)
65新增: int duration = 0;
66新增: while (_isWriting || _isReading)
5467 {
55删除: Thread.Sleep(100);
56删除: lockTime += 100;
57删除: if (lockTime >= _outTime * 1000)
68新增: Thread.Sleep(1000);
69新增: duration++;
70新增: if (duration >= _outTime)
5871 {
59删除: _locked = false;
72新增: break;
6073 }
6174 }
62删除: _locked = true;
63删除:
75新增: _isWriting = true;
6476 _writerContext = new TaiDbContext();
6577 return _writerContext;
6678 }
@@ -68,8 +80,11 @@ namespace Core.Servicers.Instances
6880
6981 public void CloseWriter()
7082 {
71删除: _writerContext?.Dispose();
72删除: _locked = false;
83新增: lock (_closeLocker)
84新增: {
85新增: _writerContext?.Dispose();
86新增: _isWriting = false;
87新增: }
7388 }
7489 }
7590}