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