diff --git a/Cargo.lock b/Cargo.lock
index 226797f2b7dcc21cfa3dde0efef02ab890da7709..77fde66fd0ebccd87e4b7e4f64c212e02deec47c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2,12 +2,6 @@
 # It is not intended for manual editing.
 version = 3
 
-[[package]]
-name = "Inflector"
-version = "0.11.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3"
-
 [[package]]
 name = "actix-codec"
 version = "0.3.0"
@@ -105,7 +99,7 @@ dependencies = [
  "serde",
  "serde_json",
  "serde_urlencoded",
- "sha-1",
+ "sha-1 0.9.8",
  "slab",
  "time 0.2.27",
 ]
@@ -315,12 +309,6 @@ dependencies = [
  "memchr",
 ]
 
-[[package]]
-name = "aliasable"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd"
-
 [[package]]
 name = "ansi_term"
 version = "0.12.1"
@@ -470,27 +458,6 @@ dependencies = [
  "wasm-bindgen-futures",
 ]
 
-[[package]]
-name = "async-stream"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "171374e7e3b2504e0e5236e3b59260560f9fe94bfe9ac39ba5e4e929c5590625"
-dependencies = [
- "async-stream-impl",
- "futures-core",
-]
-
-[[package]]
-name = "async-stream-impl"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "648ed8c8d2ce5409ccd57453d9d1b214b342a0d69376a6feda1fd6cae3299308"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
 [[package]]
 name = "async-task"
 version = "4.0.3"
@@ -570,19 +537,6 @@ dependencies = [
  "serde_urlencoded",
 ]
 
-[[package]]
-name = "bae"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33b8de67cc41132507eeece2584804efcb15f85ba516e34c944b7667f480397a"
-dependencies = [
- "heck",
- "proc-macro-error",
- "proc-macro2",
- "quote",
- "syn",
-]
-
 [[package]]
 name = "base-x"
 version = "0.2.8"
@@ -595,19 +549,61 @@ version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
 
+[[package]]
+name = "bigdecimal"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d1e50562e37200edf7c6c43e54a08e64a5553bfb59d9c297d5572512aa517256"
+dependencies = [
+ "num-bigint 0.3.3",
+ "num-integer",
+ "num-traits",
+ "serde",
+]
+
+[[package]]
+name = "bit-vec"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
+dependencies = [
+ "serde",
+]
+
 [[package]]
 name = "bitflags"
 version = "1.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
+[[package]]
+name = "block-buffer"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
+dependencies = [
+ "block-padding",
+ "byte-tools",
+ "byteorder",
+ "generic-array 0.12.4",
+]
+
 [[package]]
 name = "block-buffer"
 version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
 dependencies = [
- "generic-array",
+ "generic-array 0.14.4",
+]
+
+[[package]]
+name = "block-padding"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5"
+dependencies = [
+ "byte-tools",
 ]
 
 [[package]]
@@ -659,6 +655,12 @@ version = "3.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c"
 
+[[package]]
+name = "byte-tools"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
+
 [[package]]
 name = "byteorder"
 version = "1.4.3"
@@ -846,7 +848,7 @@ version = "0.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714"
 dependencies = [
- "generic-array",
+ "generic-array 0.14.4",
  "subtle",
 ]
 
@@ -860,6 +862,16 @@ dependencies = [
  "syn",
 ]
 
+[[package]]
+name = "dashmap"
+version = "4.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c"
+dependencies = [
+ "cfg-if 1.0.0",
+ "num_cpus",
+]
+
 [[package]]
 name = "derive_more"
 version = "0.99.17"
@@ -873,13 +885,22 @@ dependencies = [
  "syn",
 ]
 
+[[package]]
+name = "digest"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
+dependencies = [
+ "generic-array 0.12.4",
+]
+
 [[package]]
 name = "digest"
 version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
 dependencies = [
- "generic-array",
+ "generic-array 0.14.4",
 ]
 
 [[package]]
@@ -908,17 +929,14 @@ version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0"
 
-[[package]]
-name = "dotenv"
-version = "0.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
-
 [[package]]
 name = "either"
 version = "1.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
+dependencies = [
+ "serde",
+]
 
 [[package]]
 name = "encoding_rs"
@@ -947,6 +965,12 @@ version = "2.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59"
 
+[[package]]
+name = "fake-simd"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
+
 [[package]]
 name = "fastrand"
 version = "1.5.0"
@@ -1129,6 +1153,15 @@ dependencies = [
  "byteorder",
 ]
 
+[[package]]
+name = "generic-array"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd"
+dependencies = [
+ "typenum",
+]
+
 [[package]]
 name = "generic-array"
 version = "0.14.4"
@@ -1243,7 +1276,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b"
 dependencies = [
  "crypto-mac",
- "digest",
+ "digest 0.9.0",
 ]
 
 [[package]]
@@ -1257,6 +1290,21 @@ dependencies = [
  "winapi 0.3.9",
 ]
 
+[[package]]
+name = "html_parser"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58112d7b68ff61447bd22a489d7877a79ee688f6f34d57d3857842776d42dd0c"
+dependencies = [
+ "pest",
+ "pest_derive",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "structopt",
+ "thiserror",
+]
+
 [[package]]
 name = "http"
 version = "0.2.5"
@@ -1325,6 +1373,15 @@ dependencies = [
  "winreg",
 ]
 
+[[package]]
+name = "ipnetwork"
+version = "0.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02c3eaab3ac0ede60ffa41add21970a7df7d91772c03383aac6c2c3d53cc716b"
+dependencies = [
+ "serde",
+]
+
 [[package]]
 name = "itertools"
 version = "0.10.3"
@@ -1446,6 +1503,12 @@ dependencies = [
  "linked-hash-map",
 ]
 
+[[package]]
+name = "maplit"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
+
 [[package]]
 name = "match_cfg"
 version = "0.1.0"
@@ -1464,9 +1527,9 @@ version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7b5a279bb9607f9f53c22d496eade00d138d1bdcccd07d74650387cf94942a15"
 dependencies = [
- "block-buffer",
- "digest",
- "opaque-debug",
+ "block-buffer 0.9.0",
+ "digest 0.9.0",
+ "opaque-debug 0.3.0",
 ]
 
 [[package]]
@@ -1670,33 +1733,15 @@ checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5"
 
 [[package]]
 name = "opaque-debug"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
-
-[[package]]
-name = "ouroboros"
-version = "0.11.1"
+version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3518a68fc597f6a42f83a31e41c039c3cbaa10fa8bb239c936c235e81cce873f"
-dependencies = [
- "aliasable",
- "ouroboros_macro",
- "stable_deref_trait",
-]
+checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
 
 [[package]]
-name = "ouroboros_macro"
-version = "0.11.1"
+name = "opaque-debug"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4e23813b1bcb2d41a838849a2bbae40ae5c03c85ecabf04ba97086f438484714"
-dependencies = [
- "Inflector",
- "proc-macro-error",
- "proc-macro2",
- "quote",
- "syn",
-]
+checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
 
 [[package]]
 name = "parking"
@@ -1746,6 +1791,49 @@ version = "2.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
 
+[[package]]
+name = "pest"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53"
+dependencies = [
+ "ucd-trie",
+]
+
+[[package]]
+name = "pest_derive"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0"
+dependencies = [
+ "pest",
+ "pest_generator",
+]
+
+[[package]]
+name = "pest_generator"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55"
+dependencies = [
+ "pest",
+ "pest_meta",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pest_meta"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d"
+dependencies = [
+ "maplit",
+ "pest",
+ "sha-1 0.8.2",
+]
+
 [[package]]
 name = "pin-project"
 version = "0.4.28"
@@ -1874,6 +1962,18 @@ dependencies = [
  "unicode-xid",
 ]
 
+[[package]]
+name = "py_sql"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "406b706c360fcde6e93391e83ef16aed0798a96f08e8f0e174de0681ec0a6060"
+dependencies = [
+ "dashmap",
+ "rexpr",
+ "serde",
+ "serde_json",
+]
+
 [[package]]
 name = "quick-error"
 version = "1.2.3"
@@ -1970,6 +2070,114 @@ dependencies = [
  "rand_core 0.6.3",
 ]
 
+[[package]]
+name = "rbatis"
+version = "3.0.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce45febe5f43f2495d3d55c1342ebadc49444b77a830bcad7599a6481c8686a6"
+dependencies = [
+ "async-trait",
+ "chrono",
+ "futures",
+ "futures-core",
+ "hex",
+ "lazy_static",
+ "log",
+ "once_cell",
+ "rand 0.8.4",
+ "rbatis-core",
+ "rbatis-macro-driver",
+ "rbatis_sql",
+ "rbson",
+ "serde",
+ "uuid 0.8.2",
+]
+
+[[package]]
+name = "rbatis-core"
+version = "3.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9baa1d636ad53d589680dcc9674fb58829abb42e0b9e694b50ff3da6e2d26395"
+dependencies = [
+ "base64",
+ "bigdecimal",
+ "bit-vec",
+ "chrono",
+ "hex",
+ "ipnetwork",
+ "lazy_static",
+ "log",
+ "py_sql",
+ "rbson",
+ "rexpr",
+ "serde",
+ "serde_json",
+ "sqlx-core",
+ "time 0.2.27",
+ "uuid 0.8.2",
+]
+
+[[package]]
+name = "rbatis-macro-driver"
+version = "3.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82273c716eca70f4945cd0485dbc3a525726242ea7fee713ca490f081ca47f86"
+dependencies = [
+ "html_parser",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "rbatis_sql"
+version = "3.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3852b627d81d1e2d8313b024d899190baaf8e75429f5d49e842a0bdac77474c4"
+dependencies = [
+ "async-trait",
+ "base64",
+ "dashmap",
+ "rbatis_sql_macro",
+ "rbson",
+ "serde",
+]
+
+[[package]]
+name = "rbatis_sql_macro"
+version = "3.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5050d3450a18cb42f377c8881df476fd33e6a65df28309bf8be08995ac8e4935"
+dependencies = [
+ "async-trait",
+ "base64",
+ "html_parser",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "url",
+ "xml-rs",
+]
+
+[[package]]
+name = "rbson"
+version = "2.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88f7c79c3b796113c856d3f1b7ca27c453e1efea1096e9d4fac6dba84d641dbc"
+dependencies = [
+ "ahash",
+ "base64",
+ "chrono",
+ "hex",
+ "indexmap",
+ "lazy_static",
+ "rand 0.8.4",
+ "serde",
+ "serde_bytes",
+ "serde_json",
+ "uuid 0.8.2",
+]
+
 [[package]]
 name = "redox_syscall"
 version = "0.1.57"
@@ -2022,6 +2230,17 @@ dependencies = [
  "quick-error",
 ]
 
+[[package]]
+name = "rexpr"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4753cc5e42400348f62002a279dd25e135fa46b95d0cac6935c6380deb31feda"
+dependencies = [
+ "dashmap",
+ "serde",
+ "serde_json",
+]
+
 [[package]]
 name = "ring"
 version = "0.16.20"
@@ -2044,7 +2263,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7b0aeddcca1082112a6eeb43bf25fd7820b066aaf6eaef776e19d0a1febe38fe"
 dependencies = [
  "byteorder",
- "digest",
+ "digest 0.9.0",
  "lazy_static",
  "num-bigint-dig",
  "num-integer",
@@ -2111,7 +2330,8 @@ dependencies = [
  "chrono",
  "derive_more",
  "log",
- "sea-orm",
+ "rbatis",
+ "rbson",
  "serde",
  "serde_json",
  "simple-logging",
@@ -2144,89 +2364,6 @@ dependencies = [
  "untrusted",
 ]
 
-[[package]]
-name = "sea-orm"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f594c2a48a3f2c7c911187c67a39d08f63af932801073737358bef0b5f06576"
-dependencies = [
- "async-stream",
- "async-trait",
- "chrono",
- "futures",
- "futures-util",
- "ouroboros",
- "rust_decimal",
- "sea-orm-macros",
- "sea-query",
- "sea-strum",
- "serde",
- "serde_json",
- "sqlx",
- "url",
- "uuid 0.8.2",
-]
-
-[[package]]
-name = "sea-orm-macros"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73786f2ccb8f697d83e80a1ddd3c580ead76dddd068ebb4349b5ab648e625cd2"
-dependencies = [
- "bae",
- "heck",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "sea-query"
-version = "0.19.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57c6353d854a61e47b2691feded408c6ffd07ba9913311f0ff17c889ef2f102f"
-dependencies = [
- "chrono",
- "rust_decimal",
- "sea-query-derive",
- "serde_json",
- "uuid 0.8.2",
-]
-
-[[package]]
-name = "sea-query-derive"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34cdc022b4f606353fe5dc85b09713a04e433323b70163e81513b141c6ae6eb5"
-dependencies = [
- "heck",
- "proc-macro2",
- "quote",
- "syn",
- "thiserror",
-]
-
-[[package]]
-name = "sea-strum"
-version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c77c6c6c8b3950fccb65edd5d04985b5377f4c8f669cb9a215553f0369ec001"
-dependencies = [
- "sea-strum_macros",
-]
-
-[[package]]
-name = "sea-strum_macros"
-version = "0.21.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51c247af6c2c4ffd372fe97e9afa579b4438e4c306c9aa3f11cbf72f1e845180"
-dependencies = [
- "heck",
- "proc-macro2",
- "quote",
- "syn",
-]
-
 [[package]]
 name = "semver"
 version = "0.9.0"
@@ -2257,6 +2394,15 @@ dependencies = [
  "serde_derive",
 ]
 
+[[package]]
+name = "serde_bytes"
+version = "0.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9"
+dependencies = [
+ "serde",
+]
+
 [[package]]
 name = "serde_derive"
 version = "1.0.132"
@@ -2292,17 +2438,29 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "sha-1"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df"
+dependencies = [
+ "block-buffer 0.7.3",
+ "digest 0.8.1",
+ "fake-simd",
+ "opaque-debug 0.2.3",
+]
+
 [[package]]
 name = "sha-1"
 version = "0.9.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6"
 dependencies = [
- "block-buffer",
+ "block-buffer 0.9.0",
  "cfg-if 1.0.0",
  "cpufeatures",
- "digest",
- "opaque-debug",
+ "digest 0.9.0",
+ "opaque-debug 0.3.0",
 ]
 
 [[package]]
@@ -2317,18 +2475,18 @@ version = "0.9.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa"
 dependencies = [
- "block-buffer",
+ "block-buffer 0.9.0",
  "cfg-if 1.0.0",
  "cpufeatures",
- "digest",
- "opaque-debug",
+ "digest 0.9.0",
+ "opaque-debug 0.3.0",
 ]
 
 [[package]]
 name = "signal-hook"
-version = "0.3.12"
+version = "0.3.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c35dfd12afb7828318348b8c408383cf5071a086c1d4ab1c0f9840ec92dbb922"
+checksum = "647c97df271007dcea485bb74ffdb57f2e683f1306c854f468a0c244badabf2d"
 dependencies = [
  "libc",
  "signal-hook-registry",
@@ -2416,16 +2574,6 @@ dependencies = [
  "unicode_categories",
 ]
 
-[[package]]
-name = "sqlx"
-version = "0.5.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7911b0031a0247af40095838002999c7a52fba29d9739e93326e71a5a1bc9d43"
-dependencies = [
- "sqlx-core",
- "sqlx-macros",
-]
-
 [[package]]
 name = "sqlx-core"
 version = "0.5.9"
@@ -2435,6 +2583,8 @@ dependencies = [
  "ahash",
  "atoi",
  "base64",
+ "bigdecimal",
+ "bit-vec",
  "bitflags",
  "byteorder",
  "bytes 1.1.0",
@@ -2443,14 +2593,15 @@ dependencies = [
  "crossbeam-channel",
  "crossbeam-queue",
  "crossbeam-utils",
- "digest",
+ "digest 0.9.0",
  "dirs",
  "either",
+ "encoding_rs",
  "futures-channel",
  "futures-core",
  "futures-intrusive",
  "futures-util",
- "generic-array",
+ "generic-array 0.14.4",
  "hashlink",
  "hex",
  "hmac",
@@ -2466,18 +2617,20 @@ dependencies = [
  "parking_lot",
  "percent-encoding",
  "rand 0.8.4",
+ "regex",
  "rsa",
  "rust_decimal",
  "rustls",
  "serde",
  "serde_json",
- "sha-1",
+ "sha-1 0.9.8",
  "sha2",
  "smallvec",
  "sqlformat",
  "sqlx-rt",
  "stringprep",
  "thiserror",
+ "time 0.2.27",
  "url",
  "uuid 0.8.2",
  "webpki",
@@ -2485,26 +2638,6 @@ dependencies = [
  "whoami",
 ]
 
-[[package]]
-name = "sqlx-macros"
-version = "0.5.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "584866c833511b1a152e87a7ee20dee2739746f60c858b3c5209150bc4b466f5"
-dependencies = [
- "dotenv",
- "either",
- "heck",
- "once_cell",
- "proc-macro2",
- "quote",
- "serde_json",
- "sha2",
- "sqlx-core",
- "sqlx-rt",
- "syn",
- "url",
-]
-
 [[package]]
 name = "sqlx-rt"
 version = "0.5.9"
@@ -2515,12 +2648,6 @@ dependencies = [
  "async-std",
 ]
 
-[[package]]
-name = "stable_deref_trait"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
-
 [[package]]
 name = "standback"
 version = "0.2.17"
@@ -2722,6 +2849,7 @@ checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242"
 dependencies = [
  "const_fn",
  "libc",
+ "serde",
  "standback",
  "stdweb",
  "time-macros",
@@ -2877,6 +3005,12 @@ version = "1.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec"
 
+[[package]]
+name = "ucd-trie"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c"
+
 [[package]]
 name = "unicase"
 version = "2.6.0"
@@ -3219,6 +3353,12 @@ dependencies = [
  "winapi-build",
 ]
 
+[[package]]
+name = "xml-rs"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3"
+
 [[package]]
 name = "zeroize"
 version = "1.3.0"
diff --git a/Cargo.toml b/Cargo.toml
index 03374cf717e03eb26a9b2b78388898f7e95a93bb..2a4bec116dbeb798d0c3dd7386b05852cd0806a8 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -25,4 +25,5 @@ url = "2.2.2"
 base64 = "^0.13.0"
 simple-logging = { version = "^2.0.2" }
 strfmt = "^0.1.6"
-sea-orm = { version = "^0.4.2", features = ["runtime-async-std-rustls", "sqlx-all", "sqlx-chrono"] }
\ No newline at end of file
+rbson = "2.0"
+rbatis = { version = "^3.0", default-features = false, features = ["runtime-async-std-rustls", "all-database"] }
\ No newline at end of file
diff --git a/src/errors.rs b/src/errors.rs
index b6f635f35c16b172748ddc60db9fa642527e42cd..398176f11de180c4f73296b88463f73701103762 100644
--- a/src/errors.rs
+++ b/src/errors.rs
@@ -19,7 +19,7 @@ pub enum RustusError {
     #[error("Unable to serialize object")]
     UnableToSerialize(#[from] serde_json::Error),
     #[error("Database error: {0}")]
-    DatabaseError(#[from] sea_orm::error::DbErr),
+    DatabaseError(#[from] rbatis::error::Error),
     #[error("Unable to get file information")]
     UnableToReadInfo,
     #[error("Unable to write file {0}")]
diff --git a/src/info_storages/db_info_storage.rs b/src/info_storages/db_info_storage.rs
index c3c2730eaa62f1ed1b2a4ca55be0a3580689ff6e..58a86371c5f252b1a6141b5247acb3868d504e49 100644
--- a/src/info_storages/db_info_storage.rs
+++ b/src/info_storages/db_info_storage.rs
@@ -1,24 +1,49 @@
+use std::time::Duration;
+
 use async_trait::async_trait;
-use sea_orm::ActiveModelTrait;
-use sea_orm::EntityTrait;
-use sea_orm::{ConnectOptions, ConnectionTrait, Database, DatabaseConnection, Schema, Set};
+use rbatis::{crud_table, impl_field_name_method};
+use rbatis::crud::CRUD;
+use rbatis::db::DBPoolOptions;
+use rbatis::executor::Executor;
+use rbatis::rbatis::Rbatis;
 
 use crate::errors::{RustusError, RustusResult};
-use crate::info_storages::db_model;
 use crate::info_storages::{FileInfo, InfoStorage};
 use crate::RustusConf;
 
+#[crud_table]
+struct DbModel {
+    pub id: String,
+    pub info: String,
+}
+
+impl TryFrom<&FileInfo> for DbModel {
+    type Error = RustusError;
+
+    fn try_from(value: &FileInfo) -> Result<Self, Self::Error> {
+        Ok(DbModel {
+            id: value.id.clone(),
+            info: serde_json::to_string(value)?,
+        })
+    }
+}
+
+impl_field_name_method!(DbModel { id, info });
+
 pub struct DBInfoStorage {
-    db: DatabaseConnection,
+    db: Rbatis,
 }
 
 impl DBInfoStorage {
     pub async fn new(app_conf: RustusConf) -> RustusResult<Self> {
-        let db = Database::connect(ConnectOptions::new(
-            app_conf.info_storage_opts.info_db_dsn.unwrap().clone(),
-        ))
-        .await
-        .map_err(RustusError::from)?;
+        let db = Rbatis::new();
+        let mut opts = DBPoolOptions::new();
+        opts.connect_timeout = Duration::new(2, 0);
+        db.link_opt(
+            app_conf.info_storage_opts.info_db_dsn.unwrap().as_str(),
+            opts,
+        )
+            .await?;
         Ok(Self { db })
     }
 }
@@ -26,72 +51,51 @@ impl DBInfoStorage {
 #[async_trait]
 impl InfoStorage for DBInfoStorage {
     async fn prepare(&mut self) -> RustusResult<()> {
-        let builder = self.db.get_database_backend();
-        let schema = Schema::new(builder);
-        let create_statement = builder.build(
-            schema
-                .create_table_from_entity(db_model::Entity)
-                .if_not_exists(),
-        );
+        // let builder = self.db();
         self.db
-            .execute(create_statement)
-            .await
-            .map_err(RustusError::from)?;
+            .exec(
+                "CREATE TABLE IF NOT EXISTS db_model (id VARCHAR(40) PRIMARY KEY, info TEXT);",
+                Vec::new(),
+            )
+            .await?;
         Ok(())
     }
 
-    async fn set_info(&self, file_info: &FileInfo) -> RustusResult<()> {
-        let db_model: Option<db_model::Model> = db_model::Entity::find_by_id(file_info.id.clone())
-            .one(&self.db)
-            .await
-            .map_err(RustusError::from)?;
-
-        let model = db_model::Model::try_from(file_info.clone())?;
-
-        if let Some(db_model) = db_model {
-            let mut active_model: db_model::ActiveModel = db_model.into();
-            active_model.file_info = Set(model.file_info.clone());
-            active_model.update(&self.db).await?;
+    async fn set_info(&self, file_info: &FileInfo, create: bool) -> RustusResult<()> {
+        let model = DbModel::try_from(file_info)?;
+        if create {
+            self.db.save(&model, &[]).await?;
         } else {
-            db_model::ActiveModel {
-                id: Set(model.id.clone()),
-                file_info: Set(model.file_info.clone()),
-            }
-            .insert(&self.db)
-            .await?;
+            self.db.update_by_column(DbModel::id(), &model).await?;
         }
-
         Ok(())
     }
 
     async fn get_info(&self, file_id: &str) -> RustusResult<FileInfo> {
-        let model_opt: Option<db_model::Model> =
-            db_model::Entity::find_by_id(String::from(file_id))
-                .one(&self.db)
-                .await
-                .map_err(RustusError::from)?;
-        if let Some(model) = model_opt {
-            serde_json::from_str(model.file_info.as_str()).map_err(RustusError::from)
+        let model: Option<DbModel> = self.db.fetch_by_column(DbModel::id(), file_id).await?;
+        if let Some(info) = model {
+            serde_json::from_str(info.info.as_str()).map_err(RustusError::from)
         } else {
             Err(RustusError::FileNotFound)
         }
     }
 
     async fn remove_info(&self, file_id: &str) -> RustusResult<()> {
-        let model_opt: Option<db_model::Model> =
-            db_model::Entity::find_by_id(String::from(file_id))
-                .one(&self.db)
-                .await
-                .map_err(RustusError::from)?;
-        if let Some(model) = model_opt {
-            let active_model: db_model::ActiveModel = model.into();
-            active_model
-                .delete(&self.db)
-                .await
-                .map_err(RustusError::from)?;
-            Ok(())
-        } else {
-            Err(RustusError::FileNotFound)
-        }
+        // let model_opt: Option<db_model::Model> =
+        //     db_model::Entity::find_by_id(String::from(file_id))
+        //         .one(&self.db)
+        //         .await
+        //         .map_err(RustusError::from)?;
+        // if let Some(model) = model_opt {
+        //     let active_model: db_model::ActiveModel = model.into();
+        //     active_model
+        //         .delete(&self.db)
+        //         .await
+        //         .map_err(RustusError::from)?;
+        //     Ok(())
+        // } else {
+        //     Err(RustusError::FileNotFound)
+        // }
+        todo!()
     }
 }
diff --git a/src/info_storages/db_model.rs b/src/info_storages/db_model.rs
deleted file mode 100644
index 1bcd876ec18d5630862bb43b07e675d2a3589f30..0000000000000000000000000000000000000000
--- a/src/info_storages/db_model.rs
+++ /dev/null
@@ -1,29 +0,0 @@
-use sea_orm::entity::prelude::*;
-
-use crate::errors::RustusError;
-use crate::info_storages::FileInfo;
-
-#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
-#[sea_orm(table_name = "file_info")]
-pub struct Model {
-    #[sea_orm(primary_key, auto_increment = false)]
-    pub id: String,
-    pub file_info: String,
-}
-
-#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
-pub enum Relation {}
-
-impl ActiveModelBehavior for ActiveModel {}
-
-impl TryFrom<FileInfo> for Model {
-    type Error = RustusError;
-
-    fn try_from(value: FileInfo) -> Result<Self, Self::Error> {
-        let info_str = serde_json::to_string(&value).map_err(RustusError::from)?;
-        Ok(Self {
-            id: value.id,
-            file_info: info_str,
-        })
-    }
-}
diff --git a/src/info_storages/file_info_storage.rs b/src/info_storages/file_info_storage.rs
index 2d0de946dfde961d2cb8059aa98b7cfff930826f..fe8ccf14ea9368f6187e1cadf9ab1a2fa0f60c44 100644
--- a/src/info_storages/file_info_storage.rs
+++ b/src/info_storages/file_info_storage.rs
@@ -38,10 +38,10 @@ impl InfoStorage for FileInfoStorage {
         Ok(())
     }
 
-    async fn set_info(&self, file_info: &FileInfo) -> RustusResult<()> {
+    async fn set_info(&self, file_info: &FileInfo, create: bool) -> RustusResult<()> {
         let mut file = OpenOptions::new()
             .write(true)
-            .create(true)
+            .create(create)
             .open(self.info_file_path(file_info.id.as_str()).as_path())
             .await
             .map_err(|err| {
diff --git a/src/info_storages/mod.rs b/src/info_storages/mod.rs
index c13dbfd6bc1d7e399d5d2cabd800bfb3ac63e2c9..6e706640e35d61cf5ab8523c763e059863354850 100644
--- a/src/info_storages/mod.rs
+++ b/src/info_storages/mod.rs
@@ -11,7 +11,6 @@ use crate::RustusConf;
 mod file_info;
 
 pub mod db_info_storage;
-pub mod db_model;
 pub mod file_info_storage;
 
 #[derive(PartialEq, From, Display, Clone, Debug)]
@@ -58,7 +57,7 @@ impl AvailableInfoStores {
 #[async_trait]
 pub trait InfoStorage {
     async fn prepare(&mut self) -> RustusResult<()>;
-    async fn set_info(&self, file_info: &FileInfo) -> RustusResult<()>;
+    async fn set_info(&self, file_info: &FileInfo, create: bool) -> RustusResult<()>;
     async fn get_info(&self, file_id: &str) -> RustusResult<FileInfo>;
     async fn remove_info(&self, file_id: &str) -> RustusResult<()>;
 }
diff --git a/src/storages/file_storage.rs b/src/storages/file_storage.rs
index c2434aedd4e41c3e6b44ebb7f337ef2946dc3296..b7fb659fcd01e580b7f5458a33b5e720d9dd0e50 100644
--- a/src/storages/file_storage.rs
+++ b/src/storages/file_storage.rs
@@ -2,8 +2,8 @@ use std::collections::HashMap;
 use std::path::PathBuf;
 
 use actix_files::NamedFile;
+use async_std::fs::{DirBuilder, OpenOptions, remove_file};
 use async_std::fs::create_dir_all;
-use async_std::fs::{remove_file, DirBuilder, OpenOptions};
 use async_std::prelude::*;
 use async_trait::async_trait;
 use log::error;
@@ -11,8 +11,8 @@ use uuid::Uuid;
 
 use crate::errors::{RustusError, RustusResult};
 use crate::info_storages::{FileInfo, InfoStorage};
-use crate::storages::Storage;
 use crate::RustusConf;
+use crate::storages::Storage;
 
 pub struct FileStorage {
     app_conf: RustusConf,
@@ -93,7 +93,7 @@ impl Storage for FileStorage {
             RustusError::UnableToWrite(info.path.clone())
         })?;
         info.offset += bytes.len();
-        self.info_storage.set_info(&info).await?;
+        self.info_storage.set_info(&info, false).await?;
         Ok(info.offset)
     }
 
@@ -128,7 +128,7 @@ impl Storage for FileStorage {
             metadata,
         );
 
-        self.info_storage.set_info(&file_info).await?;
+        self.info_storage.set_info(&file_info, true).await?;
 
         Ok(file_id)
     }