From e57938fbda9bff702004038f76d009422968bff5 Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期五, 06 十一月 2026 18:05:07 +0800
Subject: [PATCH] 提交代码
---
DeviceService/DriverManager/DriverDatabase.cs | 257 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 257 insertions(+), 0 deletions(-)
diff --git a/DeviceService/DriverManager/DriverDatabase.cs b/DeviceService/DriverManager/DriverDatabase.cs
new file mode 100644
index 0000000..8b67373
--- /dev/null
+++ b/DeviceService/DriverManager/DriverDatabase.cs
@@ -0,0 +1,257 @@
+using System;
+using System.Collections.Generic;
+using System.Data.SQLite;
+using System.IO;
+
+namespace DeviceService.Driver
+{
+ /// <summary>
+ /// 椹卞姩淇℃伅 SQLite 鎸佷箙鍖栵細鏁版嵁搴撴枃浠朵綅浜� 搴旂敤鏍圭洰褰昞Config\Drivers.db銆�
+ ///
+ /// 琛ㄧ粨鏋勶細
+ /// - DriverPackage锛氬凡鍔犺浇鐨勯┍鍔ㄥ寘锛圖river 鏍圭洰褰曚笅鐨勪竴涓瓙鏂囦欢澶癸級
+ /// - DriverType锛氶┍鍔ㄥ寘鍐呭甫 [DriverDesc] 娉ㄨВ鐨勯┍鍔ㄧ被鍨嬶紙(绫诲瀷, 鍝佺墝) 瀹氫綅锛�
+ ///
+ /// 鎵�鏈夋搷浣滃け璐ヤ粎閫氳繃 log 涓婃姤锛屼笉浼氫腑鏂┍鍔ㄥ姞杞芥祦绋嬨��
+ /// </summary>
+ public sealed class DriverDatabase
+ {
+ private static readonly object _staticSync = new object();
+ private static DriverDatabase _instance;
+
+ public static DriverDatabase Instance
+ {
+ get
+ {
+ lock (_staticSync)
+ {
+ return _instance ??= new DriverDatabase();
+ }
+ }
+ }
+
+ /// <summary>閰嶇疆鐩綍锛氬簲鐢ㄦ牴鐩綍\Config銆�</summary>
+ public static string ConfigDirectory =>
+ Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config");
+
+ /// <summary>鏁版嵁搴撴枃浠惰矾寰勩��</summary>
+ public static string DatabasePath =>
+ Path.Combine(ConfigDirectory, "Drivers.db");
+
+ private readonly object _sync = new object();
+ private bool _initialized;
+
+ private DriverDatabase()
+ {
+ }
+
+ /// <summary>纭繚 Config 鐩綍涓庡簱琛ㄧ粨鏋勫瓨鍦ㄣ�傚け璐ヨ繑鍥� false 骞堕�氳繃 log 涓婃姤銆�</summary>
+ private bool EnsureReady(Action<string> log)
+ {
+ if (_initialized)
+ {
+ return true;
+ }
+
+ try
+ {
+ if (!Directory.Exists(ConfigDirectory))
+ {
+ Directory.CreateDirectory(ConfigDirectory);
+ }
+
+ using (var conn = Open())
+ using (var cmd = conn.CreateCommand())
+ {
+ cmd.CommandText = @"
+CREATE TABLE IF NOT EXISTS DriverPackage (
+ Folder TEXT PRIMARY KEY,
+ Directory TEXT NOT NULL,
+ AssemblyCount INTEGER NOT NULL DEFAULT 0,
+ ScanTime TEXT NOT NULL
+);
+CREATE TABLE IF NOT EXISTS DriverType (
+ Id INTEGER PRIMARY KEY AUTOINCREMENT,
+ PackageFolder TEXT NOT NULL,
+ AssemblyFile TEXT NOT NULL,
+ FullName TEXT NOT NULL,
+ DriverType TEXT,
+ Brand TEXT,
+ UNIQUE(PackageFolder, FullName)
+);
+CREATE INDEX IF NOT EXISTS IX_DriverType_Type_Brand ON DriverType(DriverType, Brand);";
+ cmd.ExecuteNonQuery();
+ }
+
+ _initialized = true;
+ return true;
+ }
+ catch (Exception ex)
+ {
+ log?.Invoke($"[椹卞姩搴揮 鍒濆鍖栧け璐ワ紙{DatabasePath}锛�: {ex.Message}");
+ return false;
+ }
+ }
+
+ private SQLiteConnection Open()
+ {
+ var conn = new SQLiteConnection($"Data Source={DatabasePath};Version=3;");
+ conn.Open();
+ return conn;
+ }
+
+ /// <summary>鍐欏叆锛堣鐩栵級涓�涓┍鍔ㄥ寘鍙婂叾鍐呴儴鍏ㄩ儴椹卞姩绫诲瀷鐨勮褰曘��</summary>
+ public void SavePackage(DriverPackage package, Action<string> log = null)
+ {
+ if (package == null)
+ {
+ return;
+ }
+
+ if (!EnsureReady(log))
+ {
+ return;
+ }
+
+ try
+ {
+ lock (_sync)
+ {
+ using (var conn = Open())
+ using (var tx = conn.BeginTransaction())
+ {
+ ExecuteNonQuery(conn, "DELETE FROM DriverType WHERE PackageFolder = @f",
+ tx, ("@f", package.Folder));
+ ExecuteNonQuery(conn, "DELETE FROM DriverPackage WHERE Folder = @f",
+ tx, ("@f", package.Folder));
+
+ var assemblies = package.Assemblies ?? new DriverAssemblyInfo[0];
+ ExecuteNonQuery(conn,
+ "INSERT INTO DriverPackage(Folder, Directory, AssemblyCount, ScanTime) VALUES(@f, @d, @c, @t)",
+ tx,
+ ("@f", package.Folder),
+ ("@d", package.Directory ?? string.Empty),
+ ("@c", assemblies.Length.ToString()),
+ ("@t", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
+
+ int typeCount = 0;
+ foreach (var asm in assemblies)
+ {
+ foreach (var type in asm.Types ?? new DriverTypeInfo[0])
+ {
+ ExecuteNonQuery(conn,
+ @"INSERT OR REPLACE INTO DriverType(PackageFolder, AssemblyFile, FullName, DriverType, Brand)
+ VALUES(@p, @a, @n, @t, @b)",
+ tx,
+ ("@p", package.Folder),
+ ("@a", asm.FileName ?? string.Empty),
+ ("@n", type.FullName ?? string.Empty),
+ ("@t", type.DriverType ?? string.Empty),
+ ("@b", type.Brand ?? string.Empty));
+ typeCount++;
+ }
+ }
+
+ tx.Commit();
+ log?.Invoke($"[椹卞姩搴揮 宸蹭繚瀛� {package.Folder}锛坽assemblies.Length} 涓� dll锛寋typeCount} 涓┍鍔ㄧ被鍨嬶級");
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ log?.Invoke($"[椹卞姩搴揮 淇濆瓨 {package.Folder} 澶辫触: {ex.Message}");
+ }
+ }
+
+ /// <summary>鍒犻櫎涓�涓┍鍔ㄥ寘锛堝強鍏跺叏閮ㄩ┍鍔ㄧ被鍨嬶級鐨勮褰曘��</summary>
+ public void RemovePackage(string folder, Action<string> log = null)
+ {
+ if (string.IsNullOrEmpty(folder) || !EnsureReady(log))
+ {
+ return;
+ }
+
+ try
+ {
+ lock (_sync)
+ {
+ using (var conn = Open())
+ using (var tx = conn.BeginTransaction())
+ {
+ ExecuteNonQuery(conn, "DELETE FROM DriverType WHERE PackageFolder = @f", tx, ("@f", folder));
+ ExecuteNonQuery(conn, "DELETE FROM DriverPackage WHERE Folder = @f", tx, ("@f", folder));
+ tx.Commit();
+ }
+ }
+
+ log?.Invoke($"[椹卞姩搴揮 宸茬Щ闄� {folder} 鐨勮褰�");
+ }
+ catch (Exception ex)
+ {
+ log?.Invoke($"[椹卞姩搴揮 绉婚櫎 {folder} 澶辫触: {ex.Message}");
+ }
+ }
+
+ /// <summary>璇诲彇搴撲腑鍏ㄩ儴椹卞姩绫诲瀷璁板綍锛堜緵鐣岄潰/鏌ヨ浣跨敤锛夈��</summary>
+ public IReadOnlyList<DriverTypeInfo> LoadDriverTypes(Action<string> log = null)
+ {
+ var result = new List<DriverTypeInfo>();
+ if (!EnsureReady(log))
+ {
+ return result;
+ }
+
+ try
+ {
+ lock (_sync)
+ {
+ using (var conn = Open())
+ using (var cmd = conn.CreateCommand())
+ {
+ cmd.CommandText = "SELECT PackageFolder, AssemblyFile, FullName, DriverType, Brand FROM DriverType ORDER BY DriverType, Brand, FullName";
+ using (var reader = cmd.ExecuteReader())
+ {
+ while (reader.Read())
+ {
+ result.Add(new DriverTypeInfo
+ {
+ FullName = GetString(reader, "FullName"),
+ DriverType = GetString(reader, "DriverType"),
+ Brand = GetString(reader, "Brand")
+ });
+ }
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ log?.Invoke($"[椹卞姩搴揮 璇诲彇椹卞姩绫诲瀷澶辫触: {ex.Message}");
+ }
+
+ return result;
+ }
+
+ private static void ExecuteNonQuery(SQLiteConnection conn, string sql, SQLiteTransaction tx,
+ params (string Name, string Value)[] parameters)
+ {
+ using (var cmd = conn.CreateCommand())
+ {
+ cmd.Transaction = tx;
+ cmd.CommandText = sql;
+ foreach (var (name, value) in parameters)
+ {
+ cmd.Parameters.AddWithValue(name, value);
+ }
+
+ cmd.ExecuteNonQuery();
+ }
+ }
+
+ private static string GetString(SQLiteDataReader reader, string column)
+ {
+ var value = reader[column];
+ return value == DBNull.Value ? string.Empty : value.ToString();
+ }
+ }
+}
--
Gitblit v1.9.1