Просмотр исходного кода

封装 sqlite,用于在前端调用

john 2 лет назад
Родитель
Сommit
2a9b227b70

+ 4 - 1
README.md

@@ -23,4 +23,7 @@ This template should help get you started developing with Tauri, React and Types
         "titleBarStyle": "Overlay"
       }
     ]
-```
+```
+
+### 设计
+1、所有的状态存放本地 sqlite

+ 242 - 89
src-tauri/Cargo.lock

@@ -8,6 +8,17 @@ version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
 
+[[package]]
+name = "ahash"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "version_check",
+]
+
 [[package]]
 name = "aho-corasick"
 version = "0.7.20"
@@ -32,12 +43,29 @@ dependencies = [
  "alloc-no-stdlib",
 ]
 
+[[package]]
+name = "allocator-api2"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56fc6cf8dc8c4158eed8649f9b8b0ea1518eb62b544fe9490d66fa0b349eafe9"
+
 [[package]]
 name = "anyhow"
 version = "1.0.66"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6"
 
+[[package]]
+name = "async-trait"
+version = "0.1.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.22",
+]
+
 [[package]]
 name = "atk"
 version = "0.15.1"
@@ -45,7 +73,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd"
 dependencies = [
  "atk-sys",
- "bitflags",
+ "bitflags 1.3.2",
  "glib",
  "libc",
 ]
@@ -96,6 +124,12 @@ version = "1.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
+[[package]]
+name = "bitflags"
+version = "2.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6dbe3c979c178231552ecba20214a8272df4e09f232a87aef4320cf06539aded"
+
 [[package]]
 name = "block"
 version = "0.1.6"
@@ -171,7 +205,7 @@ version = "0.15.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "cairo-sys-rs",
  "glib",
  "libc",
@@ -251,7 +285,7 @@ version = "0.24.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "block",
  "cocoa-foundation",
  "core-foundation",
@@ -267,7 +301,7 @@ version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "block",
  "core-foundation",
  "core-graphics-types",
@@ -320,7 +354,7 @@ version = "0.22.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "core-foundation",
  "core-graphics-types",
  "foreign-types",
@@ -333,7 +367,7 @@ version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "core-foundation",
  "foreign-types",
  "libc",
@@ -409,7 +443,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "smallvec",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -419,7 +453,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e"
 dependencies = [
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -429,7 +463,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096"
 dependencies = [
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -459,7 +493,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "strsim",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -470,7 +504,7 @@ checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835"
 dependencies = [
  "darling_core",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -500,7 +534,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "rustc_version 0.4.0",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -582,6 +616,18 @@ dependencies = [
  "cfg-if",
 ]
 
+[[package]]
+name = "fallible-iterator"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
+
+[[package]]
+name = "fallible-streaming-iterator"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
+
 [[package]]
 name = "fastrand"
 version = "1.8.0"
@@ -709,7 +755,7 @@ checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -747,7 +793,7 @@ version = "0.15.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "cairo-rs",
  "gdk-pixbuf",
  "gdk-sys",
@@ -763,7 +809,7 @@ version = "0.15.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "gdk-pixbuf-sys",
  "gio",
  "glib",
@@ -864,7 +910,7 @@ version = "0.15.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "futures-channel",
  "futures-core",
  "futures-io",
@@ -894,7 +940,7 @@ version = "0.15.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "futures-channel",
  "futures-core",
  "futures-executor",
@@ -920,7 +966,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -970,7 +1016,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0"
 dependencies = [
  "atk",
- "bitflags",
+ "bitflags 1.3.2",
  "cairo-rs",
  "field-offset",
  "futures-channel",
@@ -1015,7 +1061,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -1024,6 +1070,25 @@ version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
 
+[[package]]
+name = "hashbrown"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
+dependencies = [
+ "ahash",
+ "allocator-api2",
+]
+
+[[package]]
+name = "hashlink"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "312f66718a2d7789ffef4f4b7b213138ed9f1eb3aa1d0d82fc99f88fb3ffd26f"
+dependencies = [
+ "hashbrown 0.14.0",
+]
+
 [[package]]
 name = "heck"
 version = "0.3.3"
@@ -1054,6 +1119,15 @@ version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
 
+[[package]]
+name = "home"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"
+dependencies = [
+ "windows-sys 0.48.0",
+]
+
 [[package]]
 name = "html5ever"
 version = "0.25.2"
@@ -1065,7 +1139,7 @@ dependencies = [
  "markup5ever",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -1149,7 +1223,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
 dependencies = [
  "autocfg",
- "hashbrown",
+ "hashbrown 0.12.3",
 ]
 
 [[package]]
@@ -1188,7 +1262,7 @@ version = "0.16.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "glib",
  "javascriptcore-rs-sys",
 ]
@@ -1278,6 +1352,17 @@ dependencies = [
  "pkg-config",
 ]
 
+[[package]]
+name = "libsqlite3-sys"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326"
+dependencies = [
+ "cc",
+ "pkg-config",
+ "vcpkg",
+]
+
 [[package]]
 name = "line-wrap"
 version = "0.1.1"
@@ -1426,7 +1511,7 @@ version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "jni-sys",
  "ndk-sys",
  "num_enum",
@@ -1539,7 +1624,7 @@ dependencies = [
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -1603,7 +1688,7 @@ version = "0.10.43"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "020433887e44c27ff16365eaa2d380547a94544ad509aff6eb5b6e3e0b27b376"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "cfg-if",
  "foreign-types",
  "libc",
@@ -1620,7 +1705,7 @@ checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -1675,7 +1760,7 @@ version = "0.15.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "glib",
  "libc",
  "once_cell",
@@ -1808,7 +1893,7 @@ dependencies = [
  "proc-macro-hack",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -1822,7 +1907,7 @@ dependencies = [
  "proc-macro-hack",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -1881,7 +1966,7 @@ version = "0.17.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5d708eaf860a19b19ce538740d2b4bdeeb8337fa53f7738455e706623ad5c638"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "crc32fast",
  "flate2",
  "miniz_oxide",
@@ -1919,7 +2004,7 @@ dependencies = [
  "proc-macro-error-attr",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
  "version_check",
 ]
 
@@ -1942,9 +2027,9 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.47"
+version = "1.0.63"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
+checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb"
 dependencies = [
  "unicode-ident",
 ]
@@ -1960,9 +2045,9 @@ dependencies = [
 
 [[package]]
 name = "quote"
-version = "1.0.21"
+version = "1.0.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
+checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488"
 dependencies = [
  "proc-macro2",
 ]
@@ -2063,7 +2148,7 @@ version = "0.2.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
 ]
 
 [[package]]
@@ -2151,6 +2236,20 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "rusqlite"
+version = "0.29.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2"
+dependencies = [
+ "bitflags 2.3.2",
+ "fallible-iterator",
+ "fallible-streaming-iterator",
+ "hashlink",
+ "libsqlite3-sys",
+ "smallvec",
+]
+
 [[package]]
 name = "rustc_version"
 version = "0.3.3"
@@ -2224,7 +2323,7 @@ version = "2.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "core-foundation",
  "core-foundation-sys",
  "libc",
@@ -2247,7 +2346,7 @@ version = "0.22.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "cssparser",
  "derive_more",
  "fxhash",
@@ -2305,7 +2404,7 @@ checksum = "a55492425aa53521babf6137309e7d34c20bbfbbfcfe2c7f3a047fd1f6b92c0c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -2327,7 +2426,7 @@ checksum = "1fe39d9fbb0ebf5eb2c7cb7e2a47e4f462fad1379f1166b8ae49ad9eae89a7ca"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -2361,7 +2460,7 @@ dependencies = [
  "darling",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -2383,7 +2482,7 @@ checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -2453,7 +2552,7 @@ version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "gio",
  "glib",
  "libc",
@@ -2467,7 +2566,7 @@ version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "gio-sys",
  "glib-sys",
  "gobject-sys",
@@ -2481,36 +2580,6 @@ version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
 
-[[package]]
-name = "sqlite"
-version = "0.30.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd558ce5689e757e328478da05f6416e5ce566482662fcbe7ce5ee75bf9aa717"
-dependencies = [
- "libc",
- "sqlite3-sys",
-]
-
-[[package]]
-name = "sqlite3-src"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1815a7a02c996eb8e5c64f61fcb6fd9b12e593ce265c512c5853b2513635691"
-dependencies = [
- "cc",
- "pkg-config",
-]
-
-[[package]]
-name = "sqlite3-sys"
-version = "0.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d47c99824fc55360ba00caf28de0b8a0458369b832e016a64c13af0ad9fbb9ee"
-dependencies = [
- "libc",
- "sqlite3-src",
-]
-
 [[package]]
 name = "stable_deref_trait"
 version = "1.2.0"
@@ -2576,7 +2645,7 @@ dependencies = [
  "heck 0.3.3",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -2590,6 +2659,17 @@ dependencies = [
  "unicode-ident",
 ]
 
+[[package]]
+name = "syn"
+version = "2.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2efbeae7acf4eabd6bcdcbd11c92f45231ddda7539edc7806bd1a04a03b24616"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
 [[package]]
 name = "system-deps"
 version = "5.0.0"
@@ -2622,7 +2702,7 @@ version = "0.15.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8c8fab9f2ba9a6d7ad55b46f812984b6ab203d774c162163ac297edc9567404b"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "cairo-rs",
  "cc",
  "cocoa",
@@ -2730,21 +2810,28 @@ dependencies = [
 name = "tauri-app"
 version = "0.0.1"
 dependencies = [
+ "anyhow",
+ "async-trait",
  "crypto",
  "data-encoding",
  "diff",
  "digest",
  "file_diff",
  "hex",
+ "home",
+ "lazy_static",
  "regex",
  "ring",
+ "rusqlite",
  "serde",
  "serde_json",
  "sha2",
- "sqlite",
  "strsim",
  "tauri",
  "tauri-build",
+ "thiserror",
+ "tracing",
+ "tracing-subscriber",
  "uuid 1.2.2",
 ]
 
@@ -2799,7 +2886,7 @@ dependencies = [
  "heck 0.4.0",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
  "tauri-codegen",
  "tauri-utils",
 ]
@@ -2931,7 +3018,7 @@ checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -3027,7 +3114,7 @@ checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -3230,7 +3317,7 @@ dependencies = [
  "once_cell",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
  "wasm-bindgen-shared",
 ]
 
@@ -3264,7 +3351,7 @@ checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -3291,7 +3378,7 @@ version = "0.18.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "cairo-rs",
  "gdk",
  "gdk-sys",
@@ -3316,7 +3403,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3"
 dependencies = [
  "atk-sys",
- "bitflags",
+ "bitflags 1.3.2",
  "cairo-sys-rs",
  "gdk-pixbuf-sys",
  "gdk-sys",
@@ -3352,7 +3439,7 @@ checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.104",
 ]
 
 [[package]]
@@ -3457,7 +3544,7 @@ version = "0.39.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7"
 dependencies = [
- "syn",
+ "syn 1.0.104",
  "windows-tokens",
 ]
 
@@ -3486,15 +3573,39 @@ version = "0.42.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
 dependencies = [
- "windows_aarch64_gnullvm",
+ "windows_aarch64_gnullvm 0.42.0",
  "windows_aarch64_msvc 0.42.0",
  "windows_i686_gnu 0.42.0",
  "windows_i686_msvc 0.42.0",
  "windows_x86_64_gnu 0.42.0",
- "windows_x86_64_gnullvm",
+ "windows_x86_64_gnullvm 0.42.0",
  "windows_x86_64_msvc 0.42.0",
 ]
 
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.0",
+ "windows_aarch64_msvc 0.48.0",
+ "windows_i686_gnu 0.48.0",
+ "windows_i686_msvc 0.48.0",
+ "windows_x86_64_gnu 0.48.0",
+ "windows_x86_64_gnullvm 0.48.0",
+ "windows_x86_64_msvc 0.48.0",
+]
+
 [[package]]
 name = "windows-tokens"
 version = "0.39.0"
@@ -3507,6 +3618,12 @@ version = "0.42.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e"
 
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+
 [[package]]
 name = "windows_aarch64_msvc"
 version = "0.32.0"
@@ -3537,6 +3654,12 @@ version = "0.42.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4"
 
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+
 [[package]]
 name = "windows_i686_gnu"
 version = "0.32.0"
@@ -3567,6 +3690,12 @@ version = "0.42.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
 
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+
 [[package]]
 name = "windows_i686_msvc"
 version = "0.32.0"
@@ -3597,6 +3726,12 @@ version = "0.42.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
 
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+
 [[package]]
 name = "windows_x86_64_gnu"
 version = "0.32.0"
@@ -3627,12 +3762,24 @@ version = "0.42.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed"
 
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+
 [[package]]
 name = "windows_x86_64_gnullvm"
 version = "0.42.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028"
 
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+
 [[package]]
 name = "windows_x86_64_msvc"
 version = "0.32.0"
@@ -3663,6 +3810,12 @@ version = "0.42.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"
 
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
+
 [[package]]
 name = "winres"
 version = "0.1.12"

+ 8 - 1
src-tauri/Cargo.toml

@@ -17,7 +17,8 @@ tauri-build = {version = "1.2", features = [] }
 
 [dependencies]
 serde_json = "1.0"
-sqlite = "0.30.2"
+rusqlite = {version = "0.29.0", features = ["bundled"] }
+thiserror = "1.0"
 serde = { version = "1.0", features = ["derive"] }
 tauri = {version = "1.2", features = ["api-all"] }
 #tensorflow = { version = "0.19.1" }
@@ -35,6 +36,12 @@ hex = "0.4.3"
 file_diff = "1.0.0"
 strsim = "0.10.0"
 diff = "0.1"
+anyhow = "1"
+async-trait = "0.1.68"
+tracing = "0.1.15"
+tracing-subscriber = { version = "0.3", features = ["fmt"] }
+lazy_static = "1.4"
+home = "0.5.4"
 
 [workspace]
 #members = ["modules"]

+ 1 - 0
src-tauri/src/common/mod.rs

@@ -0,0 +1 @@
+pub mod sqlite;

+ 157 - 0
src-tauri/src/common/sqlite/migration/database_version.rs

@@ -0,0 +1,157 @@
+use crate::self_plugin::tauri_plugin_sqlite::sqlite::{execute, execute_batch, query_with_args};
+use anyhow::{anyhow, Result};
+use serde_json::{json, Value};
+
+#[async_trait::async_trait]
+pub trait DatabaseVersionSql {
+    async fn version(&self) -> u32;
+    async fn before(&self);
+    async fn ddl(&self) -> Vec<String>;
+    async fn after(&self);
+}
+
+pub async fn get_database_version(path: &String) -> Result<u32> {
+    if !check_version_table(path).await? {
+        Err(anyhow!("系统错误,没有数据库版本表!"))
+    } else {
+        //查询
+        let versions = query_with_args(
+        path.to_string(),
+            "SELECT version FROM databases_version WHERE name = :name".to_string(),
+            json!({
+                ":name":path.clone()
+            }),
+        )
+        .await?;
+        if versions.len() == 0 {
+            Ok(0)
+        } else {
+            //
+            let version = versions.get(0).map_or(0, |row| {
+                if let Some(Value::Number(v)) = row.get("version") {
+                    let v: u32 = v.as_u64().unwrap().try_into().unwrap();
+                    v
+                } else {
+                    0
+                }
+            });
+            Ok(version)
+        }
+    }
+}
+
+pub async fn set_database_version(path: &String, version: u32) -> Result<bool> {
+    if !check_version_table(path).await? {
+        Err(anyhow!("系统错误,没有数据库版本表!"))
+    } else {
+        //查询
+        execute(path.to_string(), "INSERT INTO databases_version (name, version)VALUES (:name, :version) ON CONFLICT(name) DO UPDATE SET version = :version".to_string(), json!({
+            ":name":path.clone(),
+            ":version":version
+        })).await?;
+        Ok(true)
+    }
+}
+
+pub async fn merge_database_version<T>(path: &String, list: Vec<T>) -> Result<bool>
+where
+    T: DatabaseVersionSql,
+{
+    //当前的版本
+    let version = get_database_version(path).await?;
+
+    tracing::debug!("当前数据库版本:{}", version);
+    //循环脚本
+    for item in list {
+        let item_version = item.version().await;
+
+        if item_version > version {
+            //before
+            item.before().await;
+            //ddl
+            let ddls = item.ddl().await;
+
+            for ddl_sql in ddls {
+                execute_batch(path.to_string(), ddl_sql).await?;
+            }
+            //after
+            item.after().await;
+
+            set_database_version(path, item_version).await?;
+        }
+    }
+    Ok(true)
+}
+
+#[derive(Debug)]
+pub struct NormalDdlDatabaseVersionSql {
+    version: u32,
+    ddl: Vec<String>,
+}
+impl NormalDdlDatabaseVersionSql {
+    pub fn new(version: u32, ddl: Vec<String>) -> Self {
+        Self { version, ddl }
+    }
+}
+
+#[async_trait::async_trait]
+impl DatabaseVersionSql for NormalDdlDatabaseVersionSql {
+    async fn version(&self) -> u32 {
+        self.version
+    }
+    async fn before(&self) {
+        tracing::debug!("nothing!");
+    }
+    async fn ddl(&self) -> Vec<String> {
+        self.ddl.clone()
+    }
+    async fn after(&self) {
+        tracing::debug!("nothing!");
+    }
+}
+
+async fn check_version_table(path: &String) -> Result<bool> {
+    let sql = String::from(
+        "SELECT count(1) count FROM sqlite_master WHERE type='table' and name = :name ",
+    );
+    //
+    let rows = query_with_args(
+        path.to_string(),
+        sql,
+        json!({
+            ":name":"databases_version"
+        }),
+    )
+    .await?;
+
+    if rows.len() == 0 {
+        //没有版本表
+        execute_batch(
+            path.to_string(),
+            "CREATE TABLE databases_version (name TEXT, version INTEGER, unique(name));"
+                .to_string(),
+        )
+        .await?;
+        //
+        Ok(true)
+    } else {
+        //
+        let count = rows.get(0).map_or(0, |row| {
+            if let Some(Value::Number(v)) = row.get("count") {
+                let v: u32 = v.as_u64().unwrap().try_into().unwrap();
+                v
+            } else {
+                0
+            }
+        });
+        if count == 0 {
+            execute_batch(
+                path.to_string(),
+                "CREATE TABLE databases_version (name TEXT, version INTEGER, unique(name));"
+                    .to_string(),
+            )
+            .await?;
+        }
+        Ok(true)
+    }
+}

+ 5 - 0
src-tauri/src/common/sqlite/migration/mod.rs

@@ -0,0 +1,5 @@
+mod database_version;
+
+pub use database_version::*;
+
+

+ 158 - 0
src-tauri/src/common/sqlite/mod.rs

@@ -0,0 +1,158 @@
+pub mod migration;
+mod rusqlite_utils;
+
+use anyhow::{anyhow, Result};
+use rusqlite::{types::Value as SqliteValue, Connection, OpenFlags, ToSql};
+use serde_json::Value as JsonValue;
+use std::collections::HashMap;
+use std::sync::{Arc, Mutex, RwLock};
+
+lazy_static::lazy_static! {
+    pub(crate) static ref CONNECTIONS: RwLock<HashMap<String, Arc<Mutex<Connection>>>> =
+        RwLock::new(HashMap::new());
+}
+
+pub async fn open(path: &String) -> Result<Arc<Mutex<Connection>>> {
+    open_with_flags(path, OpenFlags::default()).await
+}
+
+pub async fn open_with_flags(path: &String, flags: OpenFlags) -> Result<Arc<Mutex<Connection>>> {
+    //判断是否已经打开
+    let exist = CONNECTIONS.read().unwrap().contains_key(path);
+
+    if exist {
+        if let Some(arc_conn) = CONNECTIONS.read().unwrap().get(path) {
+            return Ok(arc_conn.clone());
+        } else {
+            Err(anyhow!("获取失败"))
+        }
+    } else {
+        //
+        let mut storage_path = crate::utils::rrai_home_path()?.join("sqlite");
+        storage_path.push(path.clone());
+
+        let prefix = storage_path.parent().unwrap_or(storage_path.as_path());
+        std::fs::create_dir_all(prefix).map_err(|err| anyhow::anyhow!(err))?;
+
+        let arc_conn = Arc::new(Mutex::new(Connection::open_with_flags(
+            &storage_path,
+            flags,
+        )?));
+
+        let mut cache = CONNECTIONS.write().unwrap();
+        cache.insert(path.clone(), arc_conn.clone());
+
+        Ok(arc_conn)
+    }
+}
+
+pub async fn execute_sql(path: &String, sql: &String) -> Result<usize> {
+    let arc_conn = open(path).await?;
+
+    let conn = arc_conn
+        .lock()
+        .map_err(|err| anyhow!("lock数据库连接失败:{}", err))?;
+
+    let res = conn.execute(sql.as_str(), [])?;
+    Ok(res)
+}
+
+pub async fn close(path: &String) -> Result<bool> {
+    let arc_conn = open(path).await?;
+
+    let conn = arc_conn
+        .lock()
+        .map_err(|err| anyhow!("lock数据库连接失败:{}", err))?;
+
+    drop(conn);
+    //移除
+    let mut cache = CONNECTIONS
+        .write()
+        .map_err(|err| anyhow!("获取锁失败:{}", err))?;
+
+    cache.remove(path);
+    Ok(true)
+}
+
+pub async fn execute_batch(path: &String, sql: &String) -> Result<bool> {
+    let arc_conn = open(path).await?;
+
+    let connection = arc_conn
+        .lock()
+        .map_err(|err| anyhow!("lock数据库连接失败:{}", err))?;
+
+    let res = connection.execute_batch(sql.as_str())?;
+    Ok(true)
+}
+
+pub async fn execute(path: &String, sql: &String, args: &JsonValue) -> Result<usize> {
+    let arc_conn = open(path).await?;
+
+    let conn = arc_conn
+        .lock()
+        .map_err(|err| anyhow!("lock数据库连接失败:{}", err))?;
+
+    let mut args_sqlite_values = HashMap::<String, SqliteValue>::new();
+    let mut named_args: Vec<(&str, &dyn ToSql)> = vec![];
+
+    if let JsonValue::Object(json_value) = args {
+        for (k, v) in json_value {
+            args_sqlite_values.insert(k.clone(), rusqlite_utils::value_to_rusqlite_value(v)?);
+            //
+        }
+    }
+
+    for (k, v) in &args_sqlite_values {
+        named_args.push((k, v as &dyn ToSql));
+    }
+
+    let res = conn.execute(sql.as_str(), &*named_args)?;
+    return Ok(res);
+}
+
+pub async fn query_with_args(
+    path: &String,
+    sql: &String,
+    args: &JsonValue,
+) -> Result<Vec<HashMap<String, JsonValue>>> {
+    let arc_conn = open(path).await?;
+
+    let conn = arc_conn
+        .lock()
+        .map_err(|err| anyhow!("lock数据库连接失败:{}", err))?;
+
+    let mut stmt = conn.prepare(sql.as_str())?;
+
+    let mut names: Vec<String> = Vec::new();
+    for name in stmt.column_names() {
+        names.push(name.to_string());
+    }
+
+    let mut args_sqlite_values = HashMap::<String, SqliteValue>::new();
+    let mut named_args: Vec<(&str, &dyn ToSql)> = vec![];
+
+    if let JsonValue::Object(json_value) = args {
+        for (k, v) in json_value {
+            args_sqlite_values.insert(k.clone(), rusqlite_utils::value_to_rusqlite_value(v)?);
+        }
+    }
+
+    for (k, v) in &args_sqlite_values {
+        named_args.push((k, v as &dyn ToSql));
+    }
+
+    let schema_iter = stmt.query_map(&*named_args, |row| {
+        rusqlite_utils::rusqlite_row_to_map(row, &names)
+            .map_err(|_e| rusqlite::Error::ExecuteReturnedResults)
+    })?;
+
+    let mut result = Vec::<HashMap<String, JsonValue>>::new();
+
+    for table_result in schema_iter {
+        if let Ok(row_value) = table_result {
+            //
+            result.push(row_value);
+        }
+    }
+    Ok(result)
+}

+ 79 - 0
src-tauri/src/common/sqlite/rusqlite_utils.rs

@@ -0,0 +1,79 @@
+use anyhow::{anyhow, Result};
+use rusqlite::{
+    types::FromSql,
+    types::Value as SqliteValue,
+    types::ValueRef::{Blob, Integer, Null, Real, Text},
+    Connection, Params, Row, ToSql,
+};
+use serde_json::{Number, Value};
+use std::{collections::HashMap, sync::Mutex};
+
+pub fn query_one_value<P, V>(connection: &Connection, sql: &str, p: P) -> Result<V>
+where
+    P: Params,
+    V: FromSql,
+{
+    let mut stmt = connection.prepare(sql)?;
+
+    let result_iter = stmt.query_map(p, |row| Ok(row.get(0)?))?;
+
+    for result in result_iter {
+        if let Ok(i32_temp) = result {
+            //table
+            return Ok(i32_temp);
+        }
+    }
+    Err(anyhow!(""))
+}
+
+pub fn rusqlite_row_to_value(row: &Row<'_>, cnt: usize) -> Result<Vec<Value>> {
+    let mut cols = Vec::<Value>::new();
+    for i in 0..cnt {
+        let rusqlite_value = row.get_ref_unwrap(i);
+        let idns_value = match rusqlite_value {
+            Null => Value::Null,
+            Integer(i64_v) => Value::Number(Number::from(i64_v)),
+            Real(f64_v) => Value::Number(Number::from_f64(f64_v).map_or(Number::from(0i64), |r| r)),
+            Text(str_v) => Value::String(String::from_utf8(str_v.to_vec()).unwrap()),
+            Blob(v) => Value::Null,
+        };
+        cols.push(idns_value);
+    }
+
+    return Ok(cols);
+}
+
+pub fn rusqlite_row_to_map(_row: &Row<'_>, names: &Vec<String>) -> Result<HashMap<String, Value>> {
+    let mut row = HashMap::default();
+    for (i, name) in names.iter().enumerate() {
+        let rusqlite_value = _row.get_ref_unwrap(i);
+        let v = match rusqlite_value {
+            Real(f64_v) => Value::Number(Number::from_f64(f64_v).map_or(Number::from(0i64), |r| r)),
+            Integer(i64_v) => Value::Number(Number::from(i64_v)),
+            Text(str_v) => Value::String(String::from_utf8(str_v.to_vec()).unwrap()),
+            Blob(v) => Value::Null,
+            _ => Value::Null,
+        };
+        row.insert(name.to_owned(), v);
+    }
+    Ok(row)
+}
+
+pub fn value_to_rusqlite_value(json_value: &Value) -> Result<SqliteValue> {
+    return Ok(match json_value {
+        Value::Null => SqliteValue::Null,
+        Value::Number(v) => {
+            if v.is_f64() {
+                SqliteValue::Real(v.as_f64().unwrap() as f64)
+            } else if v.is_i64() {
+                SqliteValue::Integer(v.as_i64().unwrap())
+            } else if v.is_u64() {
+                SqliteValue::Integer(v.as_u64().unwrap().try_into().unwrap())
+            } else {
+                SqliteValue::Integer(0)
+            }
+        }
+        Value::String(string_v) => SqliteValue::Text(string_v.clone()),
+        _ => SqliteValue::Null,
+    });
+}

+ 17 - 17
src-tauri/src/event_loop.rs

@@ -12,15 +12,15 @@ pub fn file_path(name: &str, parentid: &str) -> String {
     // #[macro_use]
     // extern crate lazy_static;
     extern crate regex;
-    use crate::files::file_sqlite3::file_sqlite3::{inset, is_create};
-    use crate::files::file_struct::File;
+    // use crate::files::file_sqlite3::file_sqlite3::{inset, is_create};
+    // use crate::files::file_struct::File;
     use std::path::Path;
     use std::time::SystemTime;
     // 生成 UUID
     let uuid = Uuid::new_v4();
 
-    let err = is_create("files");
-    println!("2424  {}", err);
+    // let err = is_create("files");
+    // println!("2424  {}", err);
     // let parent = "".to_string();
     // let mut parent_id: String = "".to_string();
     // if parentid.len() > 0 {
@@ -36,19 +36,19 @@ pub fn file_path(name: &str, parentid: &str) -> String {
     // 获取路径的最后一个部分(即用户名)
     let filename: String = filepath.file_name().unwrap().to_str().unwrap().to_string();
     println!("38383838383 {}, {}", filename, parentid);
-    let file = File {
-        name: filename.to_string(),
-        path: name.to_string(),
-        history_path: name.to_string(),
-        uuid: uuid.to_string(),
-        parent_id: parentid.to_string(),
-        create_time: timestamp,
-        update_time: timestamp,
-        file_type: name.to_string(),
-        user: name.to_string(),
-        rule: name.to_string(),
-    };
-    inset(file);
+    // let file = File {
+    //     name: filename.to_string(),
+    //     path: name.to_string(),
+    //     history_path: name.to_string(),
+    //     uuid: uuid.to_string(),
+    //     parent_id: parentid.to_string(),
+    //     create_time: timestamp,
+    //     update_time: timestamp,
+    //     file_type: name.to_string(),
+    //     user: name.to_string(),
+    //     rule: name.to_string(),
+    // };
+    // inset(file);
 
     // 获取当前目录中的文件和目录
     // let entries = fs::read_dir(name).unwrap();

+ 6 - 1
src-tauri/src/main.rs

@@ -1,17 +1,22 @@
 #![cfg_attr(all(not(debug_assertions), target_os = "windows"), windows_subsystem = "windows")]
 
-mod files;
+// mod files;
 // use crate::files::{file_struct, file_tools};
 mod menus;
 mod event_loop;
+mod self_plugin;
+mod common;
+mod utils;
 
 use crate::menus::default::use_memu;
 use crate::menus::event::m_event;
 use crate::event_loop::{greet, file_path, file_sort};
+use crate::self_plugin::tauri_plugin_sqlite;
 
 
 fn main() {
     tauri::Builder::default()
+        .plugin(tauri_plugin_sqlite::init())
         .menu(use_memu())
         .on_menu_event(|event| {
             // 处理菜单事件

+ 3 - 3
src-tauri/src/menus/event.rs

@@ -1,5 +1,5 @@
 use tauri::{WindowMenuEvent, Wry};
-use crate::files::{file_struct, file_tools};
+// use crate::files::{file_struct, file_tools};
 
 pub fn m_event(event: WindowMenuEvent<Wry>) {
     match event.menu_item_id() {
@@ -20,8 +20,8 @@ pub fn m_event(event: WindowMenuEvent<Wry>) {
             // println!("Message from Rust: {}", "close");
             // event.window().close().unwrap();
             // FileStruct::{Site};
-            let base: file_struct::Site = file_tools::file_tools::get_base_path();
-            println!("65:  {:?}", base);
+            // let base: file_struct::Site = file_tools::file_tools::get_base_path();
+            // println!("65:  {:?}", base);
 
             // 切换页面
             let window = event.window().clone();

+ 1 - 0
src-tauri/src/self_plugin/mod.rs

@@ -0,0 +1 @@
+pub mod tauri_plugin_sqlite;

+ 28 - 0
src-tauri/src/self_plugin/tauri_plugin_sqlite/mod.rs

@@ -0,0 +1,28 @@
+pub(crate) mod sqlite;
+//  as tauri_plugin_sqlite;
+
+use tauri::{
+    plugin::{Builder, TauriPlugin},
+    Manager, Runtime,
+};
+
+use self::sqlite::*;
+
+/// Initializes the plugin.
+pub fn init<R: Runtime>() -> TauriPlugin<R> {
+    Builder::new("rrai-sqlite")
+        .invoke_handler(tauri::generate_handler![
+            open,
+            open_with_flags,
+            query_with_args,
+            close,
+            execute_sql,
+            execute_batch,
+            execute
+        ])
+        .setup(|app| {
+            // app.manage(SqliteMap::default());
+            Ok(())
+        })
+        .build()
+}

+ 83 - 0
src-tauri/src/self_plugin/tauri_plugin_sqlite/sqlite.rs

@@ -0,0 +1,83 @@
+use rusqlite::OpenFlags;
+use std::collections::HashMap;
+use tauri::command;
+
+use serde::{Serialize, Serializer};
+use serde_json::Value as JsonValue;
+// use tauri_app::rrai_desktop_sdk_common;
+
+use crate::common as rrai_desktop_sdk_common;
+#[derive(Debug, thiserror::Error)]
+pub enum Error {
+    #[error(transparent)]
+    Anyhow(#[from] anyhow::Error),
+    #[error(transparent)]
+    Sqlite(#[from] rusqlite::Error),
+    #[error("database {0} not opened")]
+    DatabaseNotOpened(String),
+}
+
+impl Serialize for Error {
+    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
+    where
+        S: Serializer,
+    {
+        serializer.serialize_str(self.to_string().as_ref())
+    }
+}
+
+type Result<T> = std::result::Result<T, Error>;
+
+// #[derive(Default)]
+// pub struct SqliteMap(Mutex<HashMap<String, Connection>>);
+// #[command]
+// pub async fn open(state: State<'_, SqliteMap>, path: String) -> Result<bool> {
+// }
+
+#[command]
+pub async fn open(path: String) -> Result<bool> {
+    rrai_desktop_sdk_common::sqlite::open(&path).await?;
+    Ok(true)
+}
+
+#[command]
+pub async fn open_with_flags(path: String, iflags: i32) -> Result<bool> {
+    let flags = OpenFlags::default();
+
+    rrai_desktop_sdk_common::sqlite::open_with_flags(&path, flags).await?;
+    Ok(true)
+}
+
+#[command]
+pub async fn close(path: String) -> Result<bool> {
+    rrai_desktop_sdk_common::sqlite::close(&path).await?;
+    Ok(true)
+}
+
+#[command]
+pub async fn execute_sql(path: String, sql: String) -> Result<usize> {
+    let res = rrai_desktop_sdk_common::sqlite::execute_sql(&path, &sql).await?;
+    Ok(res)
+}
+
+#[command]
+pub async fn execute_batch(path: String, sql: String) -> Result<bool> {
+    let res = rrai_desktop_sdk_common::sqlite::execute_batch(&path, &sql).await?;
+    Ok(res)
+}
+
+#[command]
+pub async fn execute(path: String, sql: String, args: JsonValue) -> Result<usize> {
+    let res = rrai_desktop_sdk_common::sqlite::execute(&path, &sql, &args).await?;
+    Ok(res)
+}
+
+#[command]
+pub async fn query_with_args(
+    path: String,
+    sql: String,
+    args: JsonValue,
+) -> Result<Vec<HashMap<String, JsonValue>>> {
+    let res = rrai_desktop_sdk_common::sqlite::query_with_args(&path, &sql, &args).await?;
+    Ok(res)
+}

+ 32 - 0
src-tauri/src/utils/mod.rs

@@ -0,0 +1,32 @@
+// mod files;
+// mod rate_limiter;
+// mod stdout_channel;
+
+// pub mod zip;
+
+// pub use files::*;
+// pub use stdout_channel::*;
+
+use anyhow::{anyhow, Result};
+use std::path::PathBuf;
+
+pub fn rrai_home_path() -> Result<PathBuf> {
+    let home_path = std::env::var_os("IDNS_RRAI_PATH")
+        .map(PathBuf::from)
+        .or_else(|| {
+            home::home_dir().map(|tilde: PathBuf| {
+                let mut path = PathBuf::from(tilde);
+                path.push(".rrai");
+                path
+            })
+        });
+    //
+    //
+    if let Some(home_path) = home_path {
+        //
+        std::fs::create_dir_all(home_path.as_path())?;
+        Ok(home_path)
+    } else {
+        Err(anyhow!("没有设置IDNS_RRAI_PATH路径"))
+    }
+}

+ 2 - 1
src-tauri/tauri.conf.json

@@ -3,7 +3,8 @@
     "beforeDevCommand": "pnpm dev",
     "beforeBuildCommand": "pnpm build",
     "devPath": "http://localhost:1420",
-    "distDir": "../dist"
+    "distDir": "../dist",
+    "withGlobalTauri": true
   },
   "package": {
     "productName": "System Tools",

+ 2 - 0
src/Router.tsx

@@ -7,6 +7,7 @@ import Finder from "@/pages/Finder/Finder";
 import Setting from "@/pages/Setting/Setting";
 import FileSort from "@/pages/FileSort/FileSort";
 import FileClear from "@/pages/FileClear/FileClear";
+import DuplicateFile from "@/pages/DuplicateFile/DuplicateFile";
 export default function Router() {
   return (
     <Routes>
@@ -18,6 +19,7 @@ export default function Router() {
         <Route path={"home"} element={<Home />} />
         <Route path={"file-sort"} element={<FileSort />} />
         <Route path={"file-clear"} element={<FileClear />} />
+        <Route path={"duplicateFile"} element={<DuplicateFile />} />
         {/*<Route index element={<Home />} />*/}
       </Route>
     </Routes>

+ 1 - 0
src/components/Menu/Menu.tsx

@@ -30,6 +30,7 @@ export default function Menu() {
         },
         {
           label: "重复文件",
+          path: "/duplicateFile",
         },
       ],
     },

+ 2 - 0
src/pages/DuplicateFile/DuplicateFile.module.less

@@ -0,0 +1,2 @@
+.DuplicateFileBox {
+}

+ 9 - 0
src/pages/DuplicateFile/DuplicateFile.tsx

@@ -0,0 +1,9 @@
+import styles from "./DuplicateFile.module.less";
+export default function DuplicateFile() {
+  return (
+    <div className={styles.DuplicateFileBox}>
+      DuplicateFile DuplicateFile
+      <div style={{ backgroundColor: "green", height: "200vh" }}>DuplicateFile</div>
+    </div>
+  );
+}

+ 1 - 0
src/plugins/tauri-plugin-sqlite/index.ts

@@ -0,0 +1 @@
+export * from './sqlite';

+ 29 - 0
src/plugins/tauri-plugin-sqlite/sqlite.ts

@@ -0,0 +1,29 @@
+import { invoke } from '@tauri-apps/api/tauri'
+
+export class SQLite {
+    path: string
+
+    constructor(path: string) {
+        this.path = path
+    }
+
+    static async open(path: string): Promise<SQLite> {
+        let res = await invoke<string>('plugin:rrai-sqlite|open', { path });
+        console.log(res);
+        return new SQLite(path);
+    }
+
+    async close(): Promise<boolean> {
+        return await invoke('plugin:rrai-sqlite|close', { path: this.path })
+    }
+
+    async execute(sql: string, values?: Record<string, any>): Promise<boolean> {
+        return values ? await invoke('plugin:rrai-sqlite|execute', { path: this.path, sql, args: values }) : await invoke('plugin:rrai-sqlite|execute_sql', { path: this.path, sql })
+    }
+
+    async queryWithArgs<T>(sql: string, values?: Record<string, any>): Promise<T> {
+        return await invoke('plugin:rrai-sqlite|query_with_args', { path: this.path, sql, args: values ?? {} })
+    }
+}
+
+export default SQLite;