فهرست منبع

[xitca-web] add sync bench. (#8661)

* [xitca-web] add sync bench.

* fix wasm build.

* add url encode deserialize impl.

* update axum.

* update dep. reduce loc.

* remove toolchain patch.

* fix wasm build.
fakeshadow 1 سال پیش
والد
کامیت
baa5842085

+ 365 - 113
frameworks/Rust/xitca-web/Cargo.lock

@@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
 
 [[package]]
 name = "async-trait"
-version = "0.1.74"
+version = "0.1.75"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9"
+checksum = "fdf6721fb0140e4f897002dd086c06f6c27775df19cfe1fccb21181a48fd2c98"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -45,18 +45,19 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
 
 [[package]]
 name = "axum"
-version = "0.6.20"
+version = "0.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf"
+checksum = "202651474fe73c62d9e0a56c6133f7a0ff1dc1c8cf7a5b03381af2a26553ac9d"
 dependencies = [
  "async-trait",
  "axum-core",
- "bitflags 1.3.2",
  "bytes",
  "futures-util",
  "http",
  "http-body",
+ "http-body-util",
  "hyper",
+ "hyper-util",
  "itoa",
  "matchit",
  "memchr",
@@ -77,17 +78,20 @@ dependencies = [
 
 [[package]]
 name = "axum-core"
-version = "0.3.4"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c"
+checksum = "77cb22c689c44d4c07b0ab44ebc25d69d8ae601a2f28fb8d672d344178fa17aa"
 dependencies = [
  "async-trait",
  "bytes",
  "futures-util",
  "http",
  "http-body",
+ "http-body-util",
  "mime",
+ "pin-project-lite",
  "rustversion",
+ "sync_wrapper",
  "tower-layer",
  "tower-service",
 ]
@@ -180,6 +184,41 @@ dependencies = [
  "typenum",
 ]
 
+[[package]]
+name = "diesel"
+version = "2.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62c6fcf842f17f8c78ecf7c81d75c5ce84436b41ee07e03f490fbb5f5a8731d8"
+dependencies = [
+ "bitflags 2.4.1",
+ "byteorder",
+ "diesel_derives",
+ "itoa",
+ "pq-sys",
+ "r2d2",
+]
+
+[[package]]
+name = "diesel_derives"
+version = "2.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef8337737574f55a468005a83499da720f20c65586241ffea339db9ecdfd2b44"
+dependencies = [
+ "diesel_table_macro_syntax",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "diesel_table_macro_syntax"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5"
+dependencies = [
+ "syn",
+]
+
 [[package]]
 name = "digest"
 version = "0.10.7"
@@ -191,6 +230,12 @@ dependencies = [
  "subtle",
 ]
 
+[[package]]
+name = "equivalent"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+
 [[package]]
 name = "fallible-iterator"
 version = "0.2.0"
@@ -199,14 +244,14 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
 
 [[package]]
 name = "filetime"
-version = "0.2.22"
+version = "0.2.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0"
+checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd"
 dependencies = [
  "cfg-if",
  "libc",
  "redox_syscall",
- "windows-sys",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -232,30 +277,36 @@ dependencies = [
 
 [[package]]
 name = "futures-channel"
-version = "0.3.29"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb"
+checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
 dependencies = [
  "futures-core",
 ]
 
 [[package]]
 name = "futures-core"
-version = "0.3.29"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c"
+checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
+
+[[package]]
+name = "futures-sink"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
 
 [[package]]
 name = "futures-task"
-version = "0.3.29"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2"
+checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
 
 [[package]]
 name = "futures-util"
-version = "0.3.29"
+version = "0.3.30"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104"
+checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
 dependencies = [
  "futures-core",
  "futures-task",
@@ -290,6 +341,31 @@ version = "0.28.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
 
+[[package]]
+name = "h2"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1d308f63daf4181410c242d34c11f928dcb3aa105852019e043c9d1f4e4368a"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.14.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
+
 [[package]]
 name = "hermit-abi"
 version = "0.3.3"
@@ -307,18 +383,18 @@ dependencies = [
 
 [[package]]
 name = "home"
-version = "0.5.5"
+version = "0.5.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"
+checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5"
 dependencies = [
- "windows-sys",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
 name = "http"
-version = "0.2.11"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb"
+checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea"
 dependencies = [
  "bytes",
  "fnv",
@@ -327,20 +403,26 @@ dependencies = [
 
 [[package]]
 name = "http-body"
-version = "0.4.5"
+version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643"
 dependencies = [
  "bytes",
  "http",
- "pin-project-lite",
 ]
 
 [[package]]
-name = "http-range-header"
-version = "0.3.1"
+name = "http-body-util"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f"
+checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840"
+dependencies = [
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "pin-project-lite",
+]
 
 [[package]]
 name = "httparse"
@@ -356,25 +438,49 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
 
 [[package]]
 name = "hyper"
-version = "0.14.27"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468"
+checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75"
 dependencies = [
  "bytes",
  "futures-channel",
- "futures-core",
  "futures-util",
+ "h2",
  "http",
  "http-body",
  "httparse",
  "httpdate",
  "itoa",
  "pin-project-lite",
- "socket2 0.4.10",
  "tokio",
- "tower-service",
+]
+
+[[package]]
+name = "hyper-util"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdea9aac0dbe5a9240d68cfd9501e2db94222c6dc06843e06640b9e07f0fdc67"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "http",
+ "http-body",
+ "hyper",
+ "pin-project-lite",
+ "socket2 0.5.5",
+ "tokio",
  "tracing",
- "want",
+]
+
+[[package]]
+name = "indexmap"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"
+dependencies = [
+ "equivalent",
+ "hashbrown",
 ]
 
 [[package]]
@@ -389,9 +495,9 @@ dependencies = [
 
 [[package]]
 name = "itoa"
-version = "1.0.9"
+version = "1.0.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
+checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
 
 [[package]]
 name = "itoap"
@@ -401,18 +507,18 @@ checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8"
 
 [[package]]
 name = "libc"
-version = "0.2.150"
+version = "0.2.151"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
+checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4"
 
 [[package]]
-name = "libmimalloc-sys"
-version = "0.1.35"
+name = "lock_api"
+version = "0.4.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3979b5c37ece694f1f5e51e7ecc871fdb0f517ed04ee45f88d15d6d553cb9664"
+checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
 dependencies = [
- "cc",
- "libc",
+ "autocfg",
+ "scopeguard",
 ]
 
 [[package]]
@@ -439,18 +545,9 @@ dependencies = [
 
 [[package]]
 name = "memchr"
-version = "2.6.4"
+version = "2.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
-
-[[package]]
-name = "mimalloc"
-version = "0.1.39"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa01922b5ea280a911e323e4d2fd24b7fe5cc4042e0d2cda3c40775cdc4bdc9c"
-dependencies = [
- "libmimalloc-sys",
-]
+checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
 
 [[package]]
 name = "mime"
@@ -474,7 +571,7 @@ source = "git+https://github.com/fakeshadow/mio.git?rev=52b72d372bfe5807755b7f5e
 dependencies = [
  "libc",
  "wasi",
- "windows-sys",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -504,18 +601,41 @@ dependencies = [
 
 [[package]]
 name = "object"
-version = "0.32.1"
+version = "0.32.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
+checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
 name = "once_cell"
-version = "1.18.0"
+version = "1.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-targets 0.48.5",
+]
 
 [[package]]
 name = "percent-encoding"
@@ -590,11 +710,20 @@ version = "0.2.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
 
+[[package]]
+name = "pq-sys"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31c0052426df997c0cbd30789eb44ca097e3541717a7b8fa36b1c464ee7edebd"
+dependencies = [
+ "vcpkg",
+]
+
 [[package]]
 name = "proc-macro2"
-version = "1.0.70"
+version = "1.0.71"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b"
+checksum = "75cb1540fadbd5b8fbccc4dddad2734eba435053f725621c070711a14bb5f4b8"
 dependencies = [
  "unicode-ident",
 ]
@@ -608,6 +737,17 @@ dependencies = [
  "proc-macro2",
 ]
 
+[[package]]
+name = "r2d2"
+version = "0.8.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93"
+dependencies = [
+ "log",
+ "parking_lot",
+ "scheduled-thread-pool",
+]
+
 [[package]]
 name = "rand"
 version = "0.8.5"
@@ -640,9 +780,9 @@ dependencies = [
 
 [[package]]
 name = "redox_syscall"
-version = "0.3.5"
+version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
 dependencies = [
  "bitflags 1.3.2",
 ]
@@ -661,9 +801,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
 
 [[package]]
 name = "ryu"
-version = "1.0.15"
+version = "1.0.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
 
 [[package]]
 name = "sailfish"
@@ -701,12 +841,27 @@ dependencies = [
  "sailfish-compiler",
 ]
 
+[[package]]
+name = "scheduled-thread-pool"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19"
+dependencies = [
+ "parking_lot",
+]
+
 [[package]]
 name = "scoped-tls"
 version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
 
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
 [[package]]
 name = "serde"
 version = "1.0.193"
@@ -789,6 +944,12 @@ dependencies = [
  "autocfg",
 ]
 
+[[package]]
+name = "smallvec"
+version = "1.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"
+
 [[package]]
 name = "socket2"
 version = "0.4.10"
@@ -806,7 +967,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
 dependencies = [
  "libc",
- "windows-sys",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -828,9 +989,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
 
 [[package]]
 name = "syn"
-version = "2.0.39"
+version = "2.0.43"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a"
+checksum = "ee659fb5f3d355364e1f3e5bc10fb82068efbf824a1e9d1c9504244a6469ad53"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -860,18 +1021,19 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
 
 [[package]]
 name = "tokio"
-version = "1.34.0"
+version = "1.35.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9"
+checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
 dependencies = [
  "backtrace",
+ "bytes",
  "libc",
  "mio",
  "num_cpus",
  "pin-project-lite",
  "signal-hook-registry",
  "socket2 0.5.5",
- "windows-sys",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -889,6 +1051,20 @@ dependencies = [
  "tokio",
 ]
 
+[[package]]
+name = "tokio-util"
+version = "0.7.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+]
+
 [[package]]
 name = "tower"
 version = "0.4.13"
@@ -907,17 +1083,15 @@ dependencies = [
 
 [[package]]
 name = "tower-http"
-version = "0.4.4"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140"
+checksum = "09e12e6351354851911bdf8c2b8f2ab15050c567d70a8b9a37ae7b8301a4080d"
 dependencies = [
  "bitflags 2.4.1",
  "bytes",
- "futures-core",
- "futures-util",
  "http",
  "http-body",
- "http-range-header",
+ "http-body-util",
  "pin-project-lite",
  "tower-layer",
  "tower-service",
@@ -955,12 +1129,6 @@ dependencies = [
  "once_cell",
 ]
 
-[[package]]
-name = "try-lock"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
-
 [[package]]
 name = "typenum"
 version = "1.17.0"
@@ -969,9 +1137,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
 
 [[package]]
 name = "unicode-bidi"
-version = "0.3.13"
+version = "0.3.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416"
 
 [[package]]
 name = "unicode-ident"
@@ -989,19 +1157,16 @@ dependencies = [
 ]
 
 [[package]]
-name = "version_check"
-version = "0.9.4"
+name = "vcpkg"
+version = "0.2.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
 
 [[package]]
-name = "want"
-version = "0.3.1"
+name = "version_check"
+version = "0.9.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
-dependencies = [
- "try-lock",
-]
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
 
 [[package]]
 name = "wasi"
@@ -1037,7 +1202,16 @@ version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
 dependencies = [
- "windows-targets",
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+dependencies = [
+ "windows-targets 0.52.0",
 ]
 
 [[package]]
@@ -1046,13 +1220,28 @@ version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
 dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.0",
+ "windows_aarch64_msvc 0.52.0",
+ "windows_i686_gnu 0.52.0",
+ "windows_i686_msvc 0.52.0",
+ "windows_x86_64_gnu 0.52.0",
+ "windows_x86_64_gnullvm 0.52.0",
+ "windows_x86_64_msvc 0.52.0",
 ]
 
 [[package]]
@@ -1061,46 +1250,99 @@ version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
 
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
+
 [[package]]
 name = "windows_aarch64_msvc"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
 
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
+
 [[package]]
 name = "windows_i686_gnu"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
 
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
+
 [[package]]
 name = "windows_i686_msvc"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
 
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
+
 [[package]]
 name = "windows_x86_64_gnu"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
 
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
+
 [[package]]
 name = "windows_x86_64_gnullvm"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
 
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
+
 [[package]]
 name = "windows_x86_64_msvc"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
 
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
+
+[[package]]
+name = "xitca-codegen"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "185ec568d3620ab5129371e5fbfbc8c7b2791f10ed4e0ff216f8784cd896127c"
+dependencies = [
+ "quote",
+ "syn",
+]
+
 [[package]]
 name = "xitca-http"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5667ed780b72789d84460bd5e13a44f009d24914bf3f7a670239d32b98bce29c"
 dependencies = [
  "futures-core",
  "http",
@@ -1121,7 +1363,8 @@ dependencies = [
 [[package]]
 name = "xitca-io"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e887cc8153538637515e0663704f3492803c5bb48eb7947c80689154d965b7e0"
 dependencies = [
  "bytes",
  "tokio",
@@ -1132,7 +1375,7 @@ dependencies = [
 [[package]]
 name = "xitca-postgres"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f"
+source = "git+https://github.com/HFQR/xitca-web.git?rev=d79f510197e0f36534fe22b7a467c55dbd683681#d79f510197e0f36534fe22b7a467c55dbd683681"
 dependencies = [
  "fallible-iterator",
  "percent-encoding",
@@ -1148,7 +1391,8 @@ dependencies = [
 [[package]]
 name = "xitca-router"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8696e96f1401baee0bc577bc4cfcdc5c6a90f0c183aa2cc011ecb60f1ae5b73e"
 dependencies = [
  "xitca-unsafe-collection",
 ]
@@ -1156,7 +1400,8 @@ dependencies = [
 [[package]]
 name = "xitca-server"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d07160d17cf458adf7f38a2f7bc37ecb15732909683e614bcfe5f6ac8202bda5"
 dependencies = [
  "socket2 0.5.5",
  "tokio",
@@ -1170,12 +1415,14 @@ dependencies = [
 [[package]]
 name = "xitca-service"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09a4a38548b14925111dd99560f0a10d1eb9e3e117fa5471c35387ed6f77b58c"
 
 [[package]]
 name = "xitca-unsafe-collection"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c38c5b92c72ba986bb2c2f4fc40ec56e841194773c02278f3c8d4c9733807270"
 dependencies = [
  "bytes",
 ]
@@ -1186,11 +1433,10 @@ version = "0.1.0"
 dependencies = [
  "atoi",
  "axum",
+ "diesel",
  "futures-core",
  "http-body",
- "mimalloc",
  "nanorand",
- "pin-project-lite",
  "sailfish",
  "serde",
  "serde_json",
@@ -1203,19 +1449,25 @@ dependencies = [
  "xitca-server",
  "xitca-service",
  "xitca-unsafe-collection",
- "xitca-web 0.1.0 (git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f)",
+ "xitca-web 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "xitca-web"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ed23e2be4e1d6aa730af2646a933cbb8048de5f5549a5040672a95553f6df04"
 dependencies = [
  "futures-core",
+ "http-body",
  "pin-project-lite",
  "serde",
  "serde_json",
+ "serde_urlencoded",
  "tokio",
+ "tower-layer",
+ "tower-service",
+ "xitca-codegen",
  "xitca-http",
  "xitca-server",
  "xitca-service",

+ 17 - 15
frameworks/Rust/xitca-web/Cargo.toml

@@ -23,6 +23,11 @@ name = "xitca-web-axum"
 path = "./src/main_axum.rs"
 required-features = ["axum", "io-uring", "pg-sync", "template"]
 
+[[bin]]
+name = "xitca-web-sync"
+path = "./src/main_sync.rs"
+required-features = ["pg-orm", "template", "web-codegen"]
+
 [features]
 # pg optional
 pg = ["xitca-postgres/single-thread"]
@@ -30,16 +35,20 @@ pg = ["xitca-postgres/single-thread"]
 pg-sync = ["xitca-postgres"]
 # pg io_uring optional
 pg-iou = ["pg", "xitca-postgres/io-uring"]
+# pg orm optional
+pg-orm = ["diesel"]
 # http router optional
 router = ["xitca-http/router"]
 # web optional
 web = ["xitca-web"]
+# web codegen optional
+web-codegen = ["xitca-web/codegen", "xitca-web/urlencoded"]
 # template optional
 template = ["sailfish"]
 # io-uring optional
 io-uring = ["xitca-http/io-uring", "xitca-server/io-uring"]
 # axum optional
-axum = ["dep:axum", "http-body", "pin-project-lite", "tower", "tower-http"]
+axum = ["dep:axum", "http-body", "tower", "tower-http", "xitca-web/tower-http-compat" ]
 
 [dependencies]
 xitca-http = "0.1"
@@ -58,20 +67,21 @@ xitca-web = { version = "0.1", features = ["json"], optional = true }
 # raw-pg optional
 xitca-postgres = { version = "0.1", optional = true }
 
+# orm optional
+diesel = { version = "2", features = ["postgres", "r2d2"], optional = true }
+
 # template optional
 sailfish = { version = "0.8", default-features = false, features = ["derive", "perf-inline"], optional = true }
 
 # axum optional
-axum = { version = "0.6", optional = true }
-http-body = { version = "0.4", optional = true }
-pin-project-lite = { version = "0.2", optional = true }
+axum = { version = "0.7", optional = true }
+http-body = { version = "1", optional = true }
 tower = { version = "0.4", optional = true }
-tower-http = { version = "0.4", features = ["set-header"], optional = true }
+tower-http = { version = "0.5", features = ["set-header"], optional = true }
 
 # stuff can not be used or not needed in wasi target
 [target.'cfg(not(target_family = "wasm"))'.dependencies]
 futures-core = { version = "0.3", default-features = false }
-mimalloc = { version = "0.1", default-features = false }
 nanorand = { version = "0.7", default-features = false, features = ["tls"] }
 tokio = "1"
 
@@ -82,13 +92,5 @@ codegen-units = 1
 panic = "abort"
 
 [patch.crates-io]
-xitca-http = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" }
-xitca-io = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" }
-xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" }
-xitca-router = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" }
-xitca-server = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" }
-xitca-service = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" }
-xitca-unsafe-collection = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" }
-xitca-web = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" }
-
+xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "d79f510197e0f36534fe22b7a467c55dbd683681" }
 mio = { git = "https://github.com/fakeshadow/mio.git", rev = "52b72d372bfe5807755b7f5e3e1edf282954d6ba" }

+ 22 - 0
frameworks/Rust/xitca-web/benchmark_config.json

@@ -85,6 +85,28 @@
         "display_name": "axum [xitca]",
         "notes": "",
         "versus": ""
+      },
+      "sync": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "db_url": "/db",
+        "fortune_url": "/fortunes",
+        "query_url": "/queries?q=",
+        "update_url": "/updates?q=",
+        "port": 8080,
+        "approach": "realistic",
+        "classification": "micro",
+        "database": "postgres",
+        "framework": "xitca-web [sync]",
+        "language": "rust",
+        "orm": "full",
+        "platform": "none",
+        "webserver": "xitca-server",
+        "os": "linux",
+        "database_os": "linux",
+        "display_name": "xitca-web [sync]",
+        "notes": "",
+        "versus": ""
       }
     }
   ]

+ 0 - 2
frameworks/Rust/xitca-web/rust-toolchain.toml

@@ -1,2 +0,0 @@
-[toolchain]
-channel = "nightly-2023-11-24"

+ 12 - 13
frameworks/Rust/xitca-web/src/db.rs

@@ -1,11 +1,11 @@
 use std::{collections::HashMap, fmt::Write, future::IntoFuture};
 
-use xitca_postgres::{statement::Statement, AsyncIterator, Postgres};
+use xitca_postgres::{statement::Statement, AsyncLendingIterator, Postgres};
 use xitca_unsafe_collection::no_hash::NoHashBuilder;
 
 use super::{
     ser::{Fortune, Fortunes, World},
-    util::{HandleResult, Rand},
+    util::{HandleResult, Rand, DB_URL},
 };
 
 pub struct Client {
@@ -29,8 +29,8 @@ impl Drop for Client {
     }
 }
 
-pub async fn create(config: &str) -> HandleResult<Client> {
-    let (client, driver) = Postgres::new(config.to_string()).connect().await?;
+pub async fn create() -> HandleResult<Client> {
+    let (client, driver) = Postgres::new(DB_URL.to_string()).connect().await?;
 
     tokio::spawn(tokio::task::unconstrained(driver.into_future()));
 
@@ -91,11 +91,10 @@ impl Client {
         self.client
             .query_raw(&self.world, [id])
             .await?
-            .next()
-            .await
-            .ok_or_else(|| format!("World {id} does not exist"))?
+            .try_next()
+            .await?
             .map(|row| World::new(row.get_raw(0), row.get_raw(1)))
-            .map_err(Into::into)
+            .ok_or_else(|| format!("World does not exist").into())
     }
 
     pub async fn get_worlds(&self, num: u16) -> HandleResult<Vec<World>> {
@@ -110,8 +109,8 @@ impl Client {
         worlds.reserve(num as usize);
 
         let mut res = pipe.run().await?;
-        while let Some(mut item) = res.next().await.transpose()? {
-            while let Some(row) = item.next().await.transpose()? {
+        while let Some(mut item) = res.try_next().await? {
+            while let Some(row) = item.try_next().await? {
                 worlds.push(World::new(row.get_raw(0), row.get_raw(1)))
             }
         }
@@ -146,8 +145,8 @@ impl Client {
         let mut r_ids = params.into_iter().skip(1).step_by(2);
 
         let mut res = pipe.run().await?;
-        while let Some(mut item) = res.next().await.transpose()? {
-            while let Some(row) = item.next().await.transpose()? {
+        while let Some(mut item) = res.try_next().await? {
+            while let Some(row) = item.try_next().await? {
                 let r_id = r_ids.next().unwrap();
                 worlds.push(World::new(row.get_raw(0), r_id))
             }
@@ -161,7 +160,7 @@ impl Client {
         items.push(Fortune::new(0, "Additional fortune added at request time."));
 
         let mut stream = self.client.query_raw::<[i32; 0]>(&self.fortune, []).await?;
-        while let Some(row) = stream.next().await.transpose()? {
+        while let Some(row) = stream.try_next().await? {
             items.push(Fortune::new(row.get_raw(0), row.get_raw::<String>(1)));
         }
         items.sort_by(|it, next| it.message.cmp(&next.message));

+ 121 - 0
frameworks/Rust/xitca-web/src/db_diesel.rs

@@ -0,0 +1,121 @@
+use std::sync::{Arc, Mutex};
+
+use diesel::{prelude::*, r2d2};
+
+use crate::{
+    ser::{Fortune, Fortunes, World},
+    util::{Error, HandleResult, Rand, DB_URL},
+};
+
+pub type Pool = Arc<_Pool>;
+
+pub struct _Pool {
+    pool: r2d2::Pool<r2d2::ConnectionManager<PgConnection>>,
+    rng: Mutex<Rand>,
+}
+
+pub fn create() -> std::io::Result<Arc<_Pool>> {
+    r2d2::Builder::new()
+        .max_size(256)
+        .min_idle(Some(256))
+        .test_on_check_out(false)
+        .idle_timeout(None)
+        .max_lifetime(None)
+        .build(r2d2::ConnectionManager::new(DB_URL))
+        .map_err(std::io::Error::other)
+        .map(|pool| {
+            Arc::new(_Pool {
+                pool,
+                rng: Mutex::new(Rand::default()),
+            })
+        })
+}
+
+#[cold]
+#[inline(never)]
+fn not_found() -> Error {
+    format!("world not found").into()
+}
+
+impl _Pool {
+    pub fn get_world(&self) -> HandleResult<World> {
+        use crate::schema::world::dsl::*;
+
+        let w_id = self.rng.lock().unwrap().gen_id();
+        let mut conn = self.pool.get()?;
+        world
+            .filter(id.eq(w_id))
+            .load(&mut conn)?
+            .pop()
+            .ok_or_else(not_found)
+    }
+
+    pub fn get_worlds(&self, num: u16) -> HandleResult<Vec<World>> {
+        use crate::schema::world::dsl::*;
+
+        let mut conn = self.pool.get()?;
+        (0..num)
+            .map(|_| {
+                let w_id = self.rng.lock().unwrap().gen_id();
+                world
+                    .filter(id.eq(w_id))
+                    .load::<World>(&mut conn)?
+                    .pop()
+                    .ok_or_else(not_found)
+            })
+            .collect()
+    }
+
+    pub fn update(&self, num: u16) -> HandleResult<Vec<World>> {
+        use crate::schema::world::dsl::*;
+
+        let mut worlds = {
+            let mut conn = self.pool.get()?;
+            let worlds = (0..num)
+                .map(|_| {
+                    let mut rng = self.rng.lock().unwrap();
+                    let w_id = rng.gen_id();
+                    let r_id = rng.gen_id();
+                    drop(rng);
+                    world
+                        .filter(id.eq(w_id))
+                        .load::<World>(&mut conn)?
+                        .pop()
+                        .map(|mut w| {
+                            w.randomnumber = r_id;
+                            w
+                        })
+                        .ok_or_else(not_found)
+                })
+                .collect::<HandleResult<Vec<_>>>()?;
+
+            worlds.iter().try_for_each(|w| {
+                diesel::update(world)
+                    .filter(id.eq(w.id))
+                    .set(randomnumber.eq(w.randomnumber))
+                    .execute(&mut conn)
+                    .map(|_| ())
+            })?;
+
+            worlds
+        };
+
+        worlds.sort_by_key(|w| w.id);
+
+        Ok(worlds)
+    }
+
+    pub fn tell_fortune(&self) -> HandleResult<Fortunes> {
+        use crate::schema::fortune::dsl::*;
+
+        let mut items = {
+            let mut conn = self.pool.get()?;
+            fortune.load::<Fortune>(&mut conn)?
+        };
+
+        items.push(Fortune::new(0, "Additional fortune added at request time."));
+        items.sort_by(|it, next| it.message.cmp(&next.message));
+
+        Ok(Fortunes::new(items))
+    }
+}

+ 4 - 10
frameworks/Rust/xitca-web/src/main.rs

@@ -1,6 +1,3 @@
-#[global_allocator]
-static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;
-
 mod db;
 mod ser;
 mod util;
@@ -20,14 +17,12 @@ use xitca_http::{
 };
 use xitca_service::{fn_service, Service, ServiceExt};
 
-use self::{
-    ser::{json_response, Message},
-    util::{context_mw, HandleResult, QueryParse, SERVER_HEADER_VALUE},
-};
+use ser::{json_response, Message};
+use util::{context_mw, HandleResult, QueryParse, SERVER_HEADER_VALUE};
 
-type Response = http::Response<Once<Bytes>>;
 type Request = http::Request<RequestExt<RequestBody>>;
-type Ctx<'a> = self::util::Ctx<'a, Request>;
+type Response = http::Response<Once<Bytes>>;
+type Ctx<'a> = util::Ctx<'a, Request>;
 
 fn main() -> std::io::Result<()> {
     let service = Router::new()
@@ -40,7 +35,6 @@ fn main() -> std::io::Result<()> {
         .enclosed_fn(middleware_fn)
         .enclosed(context_mw())
         .enclosed(HttpServiceBuilder::h1().io_uring());
-
     xitca_server::Builder::new()
         .bind("xitca-web", "0.0.0.0:8080", service)?
         .build()

+ 21 - 104
frameworks/Rust/xitca-web/src/main_axum.rs

@@ -1,8 +1,5 @@
 //! show case of axum running on proper thread per core server with io-uring enabled.
 
-#[global_allocator]
-static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;
-
 mod db;
 mod ser;
 mod util;
@@ -11,7 +8,7 @@ use std::sync::Arc;
 
 use axum::{
     body::Bytes,
-    extract::{Json, OriginalUri as Uri, State},
+    extract::{Json, Query, State},
     http::{
         header::{HeaderValue, SERVER},
         StatusCode,
@@ -21,15 +18,11 @@ use axum::{
 };
 use tower_http::set_header::SetResponseHeaderLayer;
 
-use crate::{
-    db::Client,
-    tower_compat::TowerHttp,
-    util::{QueryParse, DB_URL},
-};
+use crate::{db::Client, ser::Num, tower_compat::TowerHttp};
 
 fn main() -> std::io::Result<()> {
     let service = TowerHttp::service(|| async {
-        let cli = db::create(DB_URL).await?;
+        let cli = db::create().await?;
         let service = Router::new()
             .route("/plaintext", get(plain_text))
             .route("/json", get(json))
@@ -72,18 +65,12 @@ async fn fortunes(State(cli): State<Arc<Client>>) -> impl IntoResponse {
         .map_err(|e| Error(Box::new(e)))
 }
 
-async fn queries(State(cli): State<Arc<Client>>, Uri(uri): Uri) -> impl IntoResponse {
-    cli.get_worlds(uri.query().parse_query())
-        .await
-        .map(Json)
-        .map_err(Error)
+async fn queries(State(cli): State<Arc<Client>>, Query(Num(num)): Query<Num>) -> impl IntoResponse {
+    cli.get_worlds(num).await.map(Json).map_err(Error)
 }
 
-async fn updates(State(cli): State<Arc<Client>>, Uri(uri): Uri) -> impl IntoResponse {
-    cli.update(uri.query().parse_query())
-        .await
-        .map(Json)
-        .map_err(Error)
+async fn updates(State(cli): State<Arc<Client>>, Query(Num(num)): Query<Num>) -> impl IntoResponse {
+    cli.update(num).await.map(Json).map_err(Error)
 }
 
 struct Error(util::Error);
@@ -98,33 +85,21 @@ impl IntoResponse for Error {
 
 // compat module between xitca-http and axum.
 mod tower_compat {
-    use std::{
-        cell::RefCell,
-        error, fmt,
-        future::Future,
-        io,
-        marker::PhantomData,
-        net::SocketAddr,
-        pin::Pin,
-        task::{Context, Poll},
-    };
+    use std::{cell::RefCell, fmt, future::Future, marker::PhantomData, net::SocketAddr};
 
     use axum::extract::ConnectInfo;
-    use futures_core::stream::Stream;
     use http_body::Body;
-    use pin_project_lite::pin_project;
     use xitca_http::{
-        body::none_body_hint,
         bytes::Bytes,
         h1::RequestBody,
-        http::{HeaderMap, Request, RequestExt, Response},
-        BodyError, HttpServiceBuilder,
+        http::{Request, RequestExt, Response},
+        HttpServiceBuilder,
     };
     use xitca_io::net::io_uring::TcpStream;
     use xitca_service::{
         fn_build, middleware::UncheckedReady, ready::ReadyService, Service, ServiceExt,
     };
-    use xitca_unsafe_collection::fake_send_sync::FakeSend;
+    use xitca_web::service::tower_http_compat::{CompatReqBody, CompatResBody};
 
     pub struct TowerHttp<S, B> {
         service: RefCell<S>,
@@ -141,10 +116,12 @@ mod tower_compat {
         where
             F: Fn() -> Fut + Send + Sync + Clone,
             Fut: Future<Output = Result<S, crate::util::Error>>,
-            S: tower::Service<Request<_RequestBody>, Response = Response<B>>,
+            S: tower::Service<
+                Request<CompatReqBody<RequestExt<RequestBody>>>,
+                Response = Response<B>,
+            >,
             S::Error: fmt::Debug,
             B: Body<Data = Bytes> + Send + 'static,
-            B::Error: error::Error + Send + Sync,
         {
             fn_build(move |_| {
                 let func = func.clone();
@@ -162,11 +139,9 @@ mod tower_compat {
 
     impl<S, B> Service<Request<RequestExt<RequestBody>>> for TowerHttp<S, B>
     where
-        S: tower::Service<Request<_RequestBody>, Response = Response<B>>,
-        B: Body<Data = Bytes> + Send + 'static,
-        B::Error: error::Error + Send + Sync,
+        S: tower::Service<Request<CompatReqBody<RequestExt<RequestBody>>>, Response = Response<B>>,
     {
-        type Response = Response<ResponseBody<B>>;
+        type Response = Response<CompatResBody<B>>;
         type Error = S::Error;
 
         async fn call(
@@ -174,70 +149,12 @@ mod tower_compat {
             req: Request<RequestExt<RequestBody>>,
         ) -> Result<Self::Response, Self::Error> {
             let (parts, ext) = req.into_parts();
-            let (ext, body) = ext.replace_body(());
-            let body = _RequestBody {
-                body: FakeSend::new(body),
-            };
-            let mut req = Request::from_parts(parts, body);
-            let _ = req.extensions_mut().insert(ConnectInfo(*ext.socket_addr()));
+            let info = ConnectInfo(*ext.socket_addr());
+            let mut req = Request::from_parts(parts, CompatReqBody::new(ext));
+            req.extensions_mut().insert(info);
             let fut = self.service.borrow_mut().call(req);
             let (parts, body) = fut.await?.into_parts();
-            let body = ResponseBody { body };
-            let res = Response::from_parts(parts, body);
-            Ok(res)
-        }
-    }
-
-    pub struct _RequestBody {
-        body: FakeSend<RequestBody>,
-    }
-
-    impl Body for _RequestBody {
-        type Data = Bytes;
-        type Error = io::Error;
-
-        fn poll_data(
-            self: Pin<&mut Self>,
-            cx: &mut Context<'_>,
-        ) -> Poll<Option<Result<Self::Data, Self::Error>>> {
-            Pin::new(&mut *self.get_mut().body).poll_next(cx)
-        }
-
-        fn poll_trailers(
-            self: Pin<&mut Self>,
-            _: &mut Context<'_>,
-        ) -> Poll<Result<Option<HeaderMap>, Self::Error>> {
-            Poll::Ready(Ok(None))
-        }
-    }
-
-    pin_project! {
-        pub struct ResponseBody<B> {
-            #[pin]
-            body: B
-        }
-    }
-
-    impl<B> Stream for ResponseBody<B>
-    where
-        B: Body<Data = Bytes>,
-        B::Error: error::Error + Send + Sync + 'static,
-    {
-        type Item = Result<Bytes, BodyError>;
-
-        fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
-            self.project()
-                .body
-                .poll_data(cx)
-                .map_err(|e| BodyError::from(Box::new(e) as Box<dyn error::Error + Send + Sync>))
-        }
-
-        fn size_hint(&self) -> (usize, Option<usize>) {
-            if Body::is_end_stream(&self.body) {
-                return none_body_hint();
-            }
-            let hint = Body::size_hint(&self.body);
-            (hint.lower() as _, hint.upper().map(|u| u as _))
+            Ok(Response::from_parts(parts, CompatResBody::new(body)))
         }
     }
 }

+ 2 - 5
frameworks/Rust/xitca-web/src/main_iou.rs

@@ -1,9 +1,6 @@
 // used as reference of if/how moving from epoll to io-uring(or mixture of the two) make sense for
 // network io.
 
-#[global_allocator]
-static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;
-
 mod db;
 mod ser;
 mod util;
@@ -40,8 +37,8 @@ type Response = http::Response<Once<Bytes>>;
 fn main() -> io::Result<()> {
     let service = fn_service(handler)
         .enclosed(context_mw())
-        .enclosed(fn_build(|service| async {
-            Ok::<_, Infallible>(Http1IOU {
+        .enclosed(fn_build(|res: Result<_, _>| async {
+            res.map(|service| Http1IOU {
                 service,
                 date: DateTimeService::new(),
             })

+ 76 - 0
frameworks/Rust/xitca-web/src/main_sync.rs

@@ -0,0 +1,76 @@
+mod db_diesel;
+mod schema;
+mod ser;
+mod util;
+
+use serde::Serialize;
+use xitca_web::{
+    codegen::route,
+    handler::{html::Html, json::Json, query::Query, state::StateOwn},
+    http::{header::SERVER, WebResponse},
+    App,
+};
+
+use db_diesel::Pool;
+use ser::Num;
+use util::{HandleResult, SERVER_HEADER_VALUE};
+
+fn main() -> std::io::Result<()> {
+    App::with_state(db_diesel::create()?)
+        .at_typed(plaintext)
+        .at_typed(json)
+        .at_typed(db)
+        .at_typed(fortunes)
+        .at_typed(queries)
+        .at_typed(updates)
+        .map(header)
+        .serve()
+        .bind("0.0.0.0:8080")?
+        .run()
+        .wait()
+}
+
+fn header(mut res: WebResponse) -> WebResponse {
+    res.headers_mut().insert(SERVER, SERVER_HEADER_VALUE);
+    res
+}
+
+#[route("/plaintext", method = get)]
+fn plaintext() -> &'static str {
+    "Hello, World!"
+}
+
+#[route("/json", method = get)]
+fn json() -> Json<ser::Message> {
+    Json(ser::Message::new())
+}
+
+#[route("/db", method = get)]
+fn db(StateOwn(pool): StateOwn<Pool>) -> HandleResult<Json<impl Serialize>> {
+    pool.get_world().map(Json)
+}
+
+#[route("/fortunes", method = get)]
+fn fortunes(StateOwn(pool): StateOwn<Pool>) -> HandleResult<Html<String>> {
+    use sailfish::TemplateOnce;
+    pool.tell_fortune()?
+        .render_once()
+        .map(Html)
+        .map_err(Into::into)
+}
+
+#[route("/queries", method = get)]
+fn queries(
+    Query(Num(num)): Query<Num>,
+    StateOwn(pool): StateOwn<Pool>,
+) -> HandleResult<Json<impl Serialize>> {
+    pool.get_worlds(num).map(Json)
+}
+
+#[route("/updates", method = get)]
+fn updates(
+    Query(Num(num)): Query<Num>,
+    StateOwn(pool): StateOwn<Pool>,
+) -> HandleResult<Json<impl Serialize>> {
+    pool.update(num).map(Json)
+}

+ 5 - 7
frameworks/Rust/xitca-web/src/main_wasm.rs

@@ -4,13 +4,11 @@ mod util;
 use std::{env, io, net::TcpListener, os::wasi::io::FromRawFd};
 
 use xitca_web::{
-    dev::service::Service,
     handler::{handler_service, json::Json},
-    http::header::SERVER,
-    request::WebRequest,
-    response::WebResponse,
+    http::{header::SERVER, WebResponse},
     route::get,
-    App,
+    service::Service,
+    App, WebContext,
 };
 
 fn main() -> io::Result<()> {
@@ -37,9 +35,9 @@ fn main() -> io::Result<()> {
         .wait()
 }
 
-async fn middleware_fn<S, E>(service: &S, ctx: WebRequest<'_>) -> Result<WebResponse, E>
+async fn middleware_fn<S, E>(service: &S, ctx: WebContext<'_>) -> Result<WebResponse, E>
 where
-    S: for<'r> Service<WebRequest<'r>, Response = WebResponse, Error = E>,
+    S: for<'r> Service<WebContext<'r>, Response = WebResponse, Error = E>,
 {
     service.call(ctx).await.map(|mut res| {
         res.headers_mut().append(SERVER, util::SERVER_HEADER_VALUE);

+ 13 - 0
frameworks/Rust/xitca-web/src/schema.rs

@@ -0,0 +1,13 @@
+diesel::table! {
+    world (id) {
+        id -> Integer,
+        randomnumber -> Integer,
+    }
+}
+
+diesel::table! {
+    fortune (id) {
+        id -> Integer,
+        message -> Text,
+    }
+}

+ 72 - 1
frameworks/Rust/xitca-web/src/ser.rs

@@ -2,7 +2,7 @@
 
 use std::borrow::Cow;
 
-use serde::{ser::SerializeStruct, Serialize, Serializer};
+use serde::{ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer};
 use xitca_http::{
     body::Once,
     bytes::{BufMutWriter, Bytes, BytesMut},
@@ -24,6 +24,9 @@ impl Message {
     }
 }
 
+pub struct Num(pub u16);
+
+#[cfg_attr(feature = "pg-orm", derive(diesel::Queryable))]
 pub struct World {
     pub id: i32,
     pub randomnumber: i32,
@@ -36,6 +39,7 @@ impl World {
     }
 }
 
+#[cfg_attr(feature = "pg-orm", derive(diesel::Queryable))]
 pub struct Fortune {
     pub id: i32,
     pub message: Cow<'static, str>,
@@ -68,6 +72,73 @@ impl Fortunes {
     }
 }
 
+impl<'de> Deserialize<'de> for Num {
+    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+    where
+        D: Deserializer<'de>,
+    {
+        use core::{cmp, fmt};
+
+        use serde::de::{Error, MapAccess, Visitor};
+
+        const FIELDS: &'static [&'static str] = &["q"];
+
+        struct Field;
+
+        impl<'de> Deserialize<'de> for Field {
+            fn deserialize<D>(deserializer: D) -> Result<Field, D::Error>
+            where
+                D: Deserializer<'de>,
+            {
+                struct FieldVisitor;
+
+                impl<'de> Visitor<'de> for FieldVisitor {
+                    type Value = Field;
+
+                    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+                        formatter.write_str("`q`")
+                    }
+
+                    fn visit_str<E>(self, value: &str) -> Result<Field, E>
+                    where
+                        E: Error,
+                    {
+                        match value {
+                            "q" => Ok(Field),
+                            _ => Err(Error::unknown_field(value, FIELDS)),
+                        }
+                    }
+                }
+
+                deserializer.deserialize_identifier(FieldVisitor)
+            }
+        }
+
+        struct NumVisitor;
+
+        impl<'de> Visitor<'de> for NumVisitor {
+            type Value = Num;
+
+            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+                formatter.write_str("struct Num")
+            }
+
+            fn visit_map<V>(self, mut map: V) -> Result<Num, V::Error>
+            where
+                V: MapAccess<'de>,
+            {
+                map.next_key::<Field>()?
+                    .ok_or_else(|| Error::missing_field("q"))?;
+                let q = map.next_value::<u16>().unwrap_or(1);
+                let q = cmp::min(500, cmp::max(1, q));
+                Ok(Num(q))
+            }
+        }
+
+        deserializer.deserialize_struct("Num", FIELDS, NumVisitor)
+    }
+}
+
 impl Serialize for Message {
     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
     where

+ 39 - 31
frameworks/Rust/xitca-web/src/util.rs

@@ -1,8 +1,8 @@
 #![allow(dead_code)]
 
-use core::cmp;
+use core::{cell::RefCell, cmp};
 
-use xitca_http::http::header::HeaderValue;
+use xitca_http::{bytes::BytesMut, http::header::HeaderValue};
 
 pub trait QueryParse {
     fn parse_query(self) -> u16;
@@ -29,21 +29,15 @@ pub type Error = Box<dyn std::error::Error + Send + Sync + 'static>;
 
 pub type HandleResult<T> = Result<T, Error>;
 
-#[cfg(not(target_arch = "wasm32"))]
-mod non_wasm {
-    use core::{cell::RefCell, future::Future, pin::Pin};
-
-    use xitca_http::{
-        bytes::BytesMut,
-        util::middleware::context::{Context, ContextBuilder},
-    };
+pub const DB_URL: &str = "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world";
 
-    use super::*;
-
-    use crate::db::{self, Client};
-
-    pub const DB_URL: &str = "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world";
+pub struct State<DB> {
+    pub client: DB,
+    pub write_buf: RefCell<BytesMut>,
+}
 
+#[cfg(not(target_arch = "wasm32"))]
+mod non_wasm {
     #[derive(Default)]
     pub struct Rand(nanorand::WyRand);
 
@@ -55,24 +49,38 @@ mod non_wasm {
         }
     }
 
-    pub type Ctx<'a, Req> = Context<'a, Req, State>;
-
-    pub struct State {
-        pub client: Client,
-        pub write_buf: RefCell<BytesMut>,
+    #[cfg(any(feature = "pg", feature = "pg-iou"))]
+    mod pg_state {
+        use core::{cell::RefCell, future::Future, pin::Pin};
+
+        use xitca_http::{
+            bytes::BytesMut,
+            util::middleware::context::{Context, ContextBuilder},
+        };
+
+        use crate::{
+            db::{self, Client},
+            util::{HandleResult, State},
+        };
+
+        pub type Ctx<'a, Req> = Context<'a, Req, State<Client>>;
+
+        pub fn context_mw(
+        ) -> ContextBuilder<impl Fn() -> Pin<Box<dyn Future<Output = HandleResult<State<Client>>>>>>
+        {
+            ContextBuilder::new(|| {
+                Box::pin(async {
+                    db::create().await.map(|client| State {
+                        client,
+                        write_buf: RefCell::new(BytesMut::new()),
+                    })
+                }) as _
+            })
+        }
     }
 
-    pub fn context_mw(
-    ) -> ContextBuilder<impl Fn() -> Pin<Box<dyn Future<Output = HandleResult<State>>>>> {
-        ContextBuilder::new(|| {
-            Box::pin(async {
-                db::create(DB_URL).await.map(|client| State {
-                    client,
-                    write_buf: RefCell::new(BytesMut::new()),
-                })
-            }) as _
-        })
-    }
+    #[cfg(any(feature = "pg", feature = "pg-iou"))]
+    pub use pg_state::*;
 }
 
 #[cfg(not(target_arch = "wasm32"))]

+ 1 - 1
frameworks/Rust/xitca-web/xitca-web-axum.dockerfile

@@ -1,4 +1,4 @@
-FROM rust:1.74
+FROM rust:1.75
 
 ADD ./ /xitca-web
 WORKDIR /xitca-web

+ 1 - 1
frameworks/Rust/xitca-web/xitca-web-iou.dockerfile

@@ -1,4 +1,4 @@
-FROM rust:latest
+FROM rust:1.75
 
 ADD ./ /xitca-web
 WORKDIR /xitca-web

+ 10 - 0
frameworks/Rust/xitca-web/xitca-web-sync.dockerfile

@@ -0,0 +1,10 @@
+FROM rust:1.75
+
+ADD ./ /xitca-web
+WORKDIR /xitca-web
+
+RUN cargo build --release --bin xitca-web-sync --features pg-orm,template,web-codegen
+
+EXPOSE 8080
+
+CMD ./target/release/xitca-web-sync

+ 2 - 1
frameworks/Rust/xitca-web/xitca-web-wasm.dockerfile

@@ -1,7 +1,7 @@
 ARG WASMTIME_VERSION=15.0.0
 ARG WASM_TARGET=wasm32-wasi-preview1-threads
 
-FROM rust:1.74 AS compile
+FROM rust:1.75 AS compile
 
 ARG WASMTIME_VERSION
 ARG WASM_TARGET
@@ -10,6 +10,7 @@ WORKDIR /tmp
 COPY / ./
 RUN curl -LSs "https://github.com/bytecodealliance/wasmtime/releases/download/v${WASMTIME_VERSION}/wasmtime-v${WASMTIME_VERSION}-$(uname -m)-linux.tar.xz" | \
 tar --strip-components=1 -Jx && \
+rustup default nightly && \
 rustup target add ${WASM_TARGET} && \
 cargo build --bin xitca-web-wasm --features web --release --target ${WASM_TARGET}
 

+ 1 - 1
frameworks/Rust/xitca-web/xitca-web.dockerfile

@@ -1,4 +1,4 @@
-FROM rust:latest
+FROM rust:1.75
 
 ADD ./ /xitca-web
 WORKDIR /xitca-web