impl postgres pool conn
This commit is contained in:
		
							parent
							
								
									0163525773
								
							
						
					
					
						commit
						64d91f4cbf
					
				
							
								
								
									
										8
									
								
								.env
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.env
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| POSTGRES_HOSTNAME=postgresql | ||||
| POSTGRES_PORT=5432 | ||||
| POSTGRES_DB=dispatcher | ||||
| POSTGRES_USER=rust | ||||
| POSTGRES_PASSWORD=rust | ||||
| 
 | ||||
| MIGRATIONS_DIR=./migrations | ||||
| DATABASE_URL=postgres://rust:rust@localhost:5433/dispatcher | ||||
							
								
								
									
										930
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										930
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @ -2,15 +2,945 @@ | ||||
| # It is not intended for manual editing. | ||||
| version = 3 | ||||
| 
 | ||||
| [[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.15", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "autocfg" | ||||
| version = "1.1.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "base64" | ||||
| version = "0.21.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" | ||||
| 
 | ||||
| [[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.10.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" | ||||
| dependencies = [ | ||||
|  "generic-array", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "byteorder" | ||||
| version = "1.4.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "bytes" | ||||
| version = "1.4.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "cfg-if" | ||||
| version = "1.0.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "cpufeatures" | ||||
| version = "0.2.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" | ||||
| dependencies = [ | ||||
|  "libc", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "crypto-common" | ||||
| version = "0.1.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" | ||||
| dependencies = [ | ||||
|  "generic-array", | ||||
|  "typenum", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "diesel" | ||||
| version = "2.0.3" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "4391a22b19c916e50bec4d6140f29bdda3e3bb187223fe6e3ea0b6e4d1021c04" | ||||
| dependencies = [ | ||||
|  "bitflags", | ||||
|  "byteorder", | ||||
|  "diesel_derives", | ||||
|  "itoa", | ||||
|  "pq-sys", | ||||
|  "r2d2", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "diesel_derives" | ||||
| version = "2.0.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "0ad74fdcf086be3d4fdd142f67937678fe60ed431c3b2f08599e7687269410c4" | ||||
| dependencies = [ | ||||
|  "proc-macro-error", | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn 1.0.109", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "digest" | ||||
| version = "0.10.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" | ||||
| dependencies = [ | ||||
|  "block-buffer", | ||||
|  "crypto-common", | ||||
|  "subtle", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "dispatcher" | ||||
| version = "0.1.0" | ||||
| dependencies = [ | ||||
|  "diesel", | ||||
|  "lazy_static", | ||||
|  "postgres", | ||||
|  "r2d2", | ||||
|  "serde", | ||||
|  "serde_json", | ||||
|  "thiserror", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "fallible-iterator" | ||||
| version = "0.2.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "futures-channel" | ||||
| version = "0.3.28" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" | ||||
| dependencies = [ | ||||
|  "futures-core", | ||||
|  "futures-sink", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "futures-core" | ||||
| version = "0.3.28" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "futures-macro" | ||||
| version = "0.3.28" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn 2.0.15", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "futures-sink" | ||||
| version = "0.3.28" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "futures-task" | ||||
| version = "0.3.28" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "futures-util" | ||||
| version = "0.3.28" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" | ||||
| dependencies = [ | ||||
|  "futures-core", | ||||
|  "futures-macro", | ||||
|  "futures-sink", | ||||
|  "futures-task", | ||||
|  "pin-project-lite", | ||||
|  "pin-utils", | ||||
|  "slab", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "generic-array" | ||||
| version = "0.14.7" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" | ||||
| dependencies = [ | ||||
|  "typenum", | ||||
|  "version_check", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "getrandom" | ||||
| version = "0.2.9" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "libc", | ||||
|  "wasi", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "hmac" | ||||
| version = "0.12.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" | ||||
| dependencies = [ | ||||
|  "digest", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "itoa" | ||||
| version = "1.0.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "lazy_static" | ||||
| version = "1.4.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "libc" | ||||
| version = "0.2.141" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "lock_api" | ||||
| version = "0.4.9" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" | ||||
| dependencies = [ | ||||
|  "autocfg", | ||||
|  "scopeguard", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "log" | ||||
| version = "0.4.17" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "md-5" | ||||
| version = "0.10.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" | ||||
| dependencies = [ | ||||
|  "digest", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "memchr" | ||||
| version = "2.5.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "mio" | ||||
| version = "0.8.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" | ||||
| dependencies = [ | ||||
|  "libc", | ||||
|  "log", | ||||
|  "wasi", | ||||
|  "windows-sys 0.45.0", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "once_cell" | ||||
| version = "1.17.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" | ||||
| 
 | ||||
| [[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.7" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "libc", | ||||
|  "redox_syscall", | ||||
|  "smallvec", | ||||
|  "windows-sys 0.45.0", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "percent-encoding" | ||||
| version = "2.2.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "phf" | ||||
| version = "0.11.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" | ||||
| dependencies = [ | ||||
|  "phf_shared", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "phf_shared" | ||||
| version = "0.11.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676" | ||||
| dependencies = [ | ||||
|  "siphasher", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "pin-project-lite" | ||||
| version = "0.2.9" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "pin-utils" | ||||
| version = "0.1.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "postgres" | ||||
| version = "0.19.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "0bed5017bc2ff49649c0075d0d7a9d676933c1292480c1d137776fb205b5cd18" | ||||
| dependencies = [ | ||||
|  "bytes", | ||||
|  "fallible-iterator", | ||||
|  "futures-util", | ||||
|  "log", | ||||
|  "tokio", | ||||
|  "tokio-postgres", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "postgres-protocol" | ||||
| version = "0.6.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "78b7fa9f396f51dffd61546fd8573ee20592287996568e6175ceb0f8699ad75d" | ||||
| dependencies = [ | ||||
|  "base64", | ||||
|  "byteorder", | ||||
|  "bytes", | ||||
|  "fallible-iterator", | ||||
|  "hmac", | ||||
|  "md-5", | ||||
|  "memchr", | ||||
|  "rand", | ||||
|  "sha2", | ||||
|  "stringprep", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "postgres-types" | ||||
| version = "0.2.5" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "f028f05971fe20f512bcc679e2c10227e57809a3af86a7606304435bc8896cd6" | ||||
| dependencies = [ | ||||
|  "bytes", | ||||
|  "fallible-iterator", | ||||
|  "postgres-protocol", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ppv-lite86" | ||||
| version = "0.2.17" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "pq-sys" | ||||
| version = "0.4.7" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "3b845d6d8ec554f972a2c5298aad68953fd64e7441e846075450b44656a016d1" | ||||
| dependencies = [ | ||||
|  "vcpkg", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "proc-macro-error" | ||||
| version = "1.0.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" | ||||
| dependencies = [ | ||||
|  "proc-macro-error-attr", | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn 1.0.109", | ||||
|  "version_check", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "proc-macro-error-attr" | ||||
| version = "1.0.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "version_check", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "proc-macro2" | ||||
| version = "1.0.56" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" | ||||
| dependencies = [ | ||||
|  "unicode-ident", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "quote" | ||||
| version = "1.0.26" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" | ||||
| 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" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" | ||||
| dependencies = [ | ||||
|  "libc", | ||||
|  "rand_chacha", | ||||
|  "rand_core", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "rand_chacha" | ||||
| version = "0.3.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" | ||||
| dependencies = [ | ||||
|  "ppv-lite86", | ||||
|  "rand_core", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "rand_core" | ||||
| version = "0.6.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" | ||||
| dependencies = [ | ||||
|  "getrandom", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "redox_syscall" | ||||
| version = "0.2.16" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" | ||||
| dependencies = [ | ||||
|  "bitflags", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "ryu" | ||||
| version = "1.0.13" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" | ||||
| 
 | ||||
| [[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 = "scopeguard" | ||||
| version = "1.1.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "serde" | ||||
| version = "1.0.160" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" | ||||
| dependencies = [ | ||||
|  "serde_derive", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "serde_derive" | ||||
| version = "1.0.160" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn 2.0.15", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "serde_json" | ||||
| version = "1.0.96" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" | ||||
| dependencies = [ | ||||
|  "itoa", | ||||
|  "ryu", | ||||
|  "serde", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "sha2" | ||||
| version = "0.10.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "cpufeatures", | ||||
|  "digest", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "siphasher" | ||||
| version = "0.3.10" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "slab" | ||||
| version = "0.4.8" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" | ||||
| dependencies = [ | ||||
|  "autocfg", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "smallvec" | ||||
| version = "1.10.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "socket2" | ||||
| version = "0.4.9" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" | ||||
| dependencies = [ | ||||
|  "libc", | ||||
|  "winapi", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "socket2" | ||||
| version = "0.5.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "6d283f86695ae989d1e18440a943880967156325ba025f05049946bff47bcc2b" | ||||
| dependencies = [ | ||||
|  "libc", | ||||
|  "windows-sys 0.48.0", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "stringprep" | ||||
| version = "0.1.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" | ||||
| dependencies = [ | ||||
|  "unicode-bidi", | ||||
|  "unicode-normalization", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "subtle" | ||||
| version = "2.4.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "syn" | ||||
| version = "1.0.109" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "unicode-ident", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "syn" | ||||
| version = "2.0.15" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "unicode-ident", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "thiserror" | ||||
| version = "1.0.40" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" | ||||
| dependencies = [ | ||||
|  "thiserror-impl", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "thiserror-impl" | ||||
| version = "1.0.40" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  "syn 2.0.15", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "tinyvec" | ||||
| version = "1.6.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" | ||||
| dependencies = [ | ||||
|  "tinyvec_macros", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "tinyvec_macros" | ||||
| version = "0.1.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "tokio" | ||||
| version = "1.27.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" | ||||
| dependencies = [ | ||||
|  "autocfg", | ||||
|  "bytes", | ||||
|  "libc", | ||||
|  "mio", | ||||
|  "pin-project-lite", | ||||
|  "socket2 0.4.9", | ||||
|  "windows-sys 0.45.0", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "tokio-postgres" | ||||
| version = "0.7.8" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "6e89f6234aa8fd43779746012fcf53603cdb91fdd8399aa0de868c2d56b6dde1" | ||||
| dependencies = [ | ||||
|  "async-trait", | ||||
|  "byteorder", | ||||
|  "bytes", | ||||
|  "fallible-iterator", | ||||
|  "futures-channel", | ||||
|  "futures-util", | ||||
|  "log", | ||||
|  "parking_lot", | ||||
|  "percent-encoding", | ||||
|  "phf", | ||||
|  "pin-project-lite", | ||||
|  "postgres-protocol", | ||||
|  "postgres-types", | ||||
|  "socket2 0.5.2", | ||||
|  "tokio", | ||||
|  "tokio-util", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "tokio-util" | ||||
| version = "0.7.7" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" | ||||
| dependencies = [ | ||||
|  "bytes", | ||||
|  "futures-core", | ||||
|  "futures-sink", | ||||
|  "pin-project-lite", | ||||
|  "tokio", | ||||
|  "tracing", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "tracing" | ||||
| version = "0.1.37" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" | ||||
| dependencies = [ | ||||
|  "cfg-if", | ||||
|  "pin-project-lite", | ||||
|  "tracing-core", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "tracing-core" | ||||
| version = "0.1.30" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" | ||||
| dependencies = [ | ||||
|  "once_cell", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "typenum" | ||||
| version = "1.16.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "unicode-bidi" | ||||
| version = "0.3.13" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "unicode-ident" | ||||
| version = "1.0.8" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "unicode-normalization" | ||||
| version = "0.1.22" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" | ||||
| dependencies = [ | ||||
|  "tinyvec", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "vcpkg" | ||||
| version = "0.2.15" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "version_check" | ||||
| version = "0.9.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "wasi" | ||||
| version = "0.11.0+wasi-snapshot-preview1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "winapi" | ||||
| version = "0.3.9" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" | ||||
| dependencies = [ | ||||
|  "winapi-i686-pc-windows-gnu", | ||||
|  "winapi-x86_64-pc-windows-gnu", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "winapi-i686-pc-windows-gnu" | ||||
| version = "0.4.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "winapi-x86_64-pc-windows-gnu" | ||||
| version = "0.4.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "windows-sys" | ||||
| version = "0.45.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" | ||||
| dependencies = [ | ||||
|  "windows-targets 0.42.2", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "windows-sys" | ||||
| version = "0.48.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" | ||||
| dependencies = [ | ||||
|  "windows-targets 0.48.0", | ||||
| ] | ||||
| 
 | ||||
| [[package]] | ||||
| name = "windows-targets" | ||||
| version = "0.42.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" | ||||
| dependencies = [ | ||||
|  "windows_aarch64_gnullvm 0.42.2", | ||||
|  "windows_aarch64_msvc 0.42.2", | ||||
|  "windows_i686_gnu 0.42.2", | ||||
|  "windows_i686_msvc 0.42.2", | ||||
|  "windows_x86_64_gnu 0.42.2", | ||||
|  "windows_x86_64_gnullvm 0.42.2", | ||||
|  "windows_x86_64_msvc 0.42.2", | ||||
| ] | ||||
| 
 | ||||
| [[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_aarch64_gnullvm" | ||||
| version = "0.42.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" | ||||
| 
 | ||||
| [[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.42.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" | ||||
| 
 | ||||
| [[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.42.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" | ||||
| 
 | ||||
| [[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.42.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" | ||||
| 
 | ||||
| [[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.42.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" | ||||
| 
 | ||||
| [[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.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" | ||||
| 
 | ||||
| [[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.42.2" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" | ||||
| 
 | ||||
| [[package]] | ||||
| name = "windows_x86_64_msvc" | ||||
| version = "0.48.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" | ||||
|  | ||||
| @ -7,3 +7,9 @@ edition = "2021" | ||||
| 
 | ||||
| [dependencies] | ||||
| lazy_static = "1.4.0" | ||||
| postgres = "0.19.5" | ||||
| r2d2 = "0.8.10" | ||||
| diesel = { version = "2.0.0", features = ["postgres", "r2d2"] } | ||||
| serde = { version = "1.0", features = ["derive"] } | ||||
| serde_json = "1.0" | ||||
| thiserror = "1.0" | ||||
|  | ||||
							
								
								
									
										6
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								Makefile
									
									
									
									
									
								
							| @ -9,3 +9,9 @@ build: format | ||||
| 
 | ||||
| test: | ||||
| 	cargo test -r -- --nocapture | ||||
| 
 | ||||
| db-start: | ||||
| 	docker compose up postgresql -d | ||||
| 
 | ||||
| db-stop: | ||||
| 	docker compose down | ||||
							
								
								
									
										8
									
								
								diesel.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								diesel.toml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| # For documentation on how to configure this file, | ||||
| # see https://diesel.rs/guides/configuring-diesel-cli | ||||
| 
 | ||||
| [print_schema] | ||||
| file = "src/database/schema.rs" | ||||
| 
 | ||||
| [migrations_directory] | ||||
| dir = "migrations" | ||||
							
								
								
									
										21
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| version: "3.7" | ||||
| 
 | ||||
| services: | ||||
| 
 | ||||
|   postgresql: | ||||
|     image: postgres:13.2 | ||||
|     restart: unless-stopped | ||||
|     env_file: .env | ||||
|     ports: | ||||
|       - 5433:5432 | ||||
|     volumes: | ||||
|       - postgresql_data:/var/lib/postgresql/data/ | ||||
|     networks: | ||||
|       - dispatcher_network | ||||
| 
 | ||||
| networks: | ||||
|   dispatcher_network: | ||||
|     name: dispatcher_network | ||||
| 
 | ||||
| volumes: | ||||
|   postgresql_data: | ||||
							
								
								
									
										27
									
								
								src/database/client.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/database/client.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | ||||
| use r2d2; | ||||
| 
 | ||||
| use diesel::pg::PgConnection; | ||||
| use diesel::r2d2::ConnectionManager; | ||||
| use lazy_static::lazy_static; | ||||
| 
 | ||||
| type Pool = r2d2::Pool<ConnectionManager<PgConnection>>; | ||||
| pub type DbConnection = r2d2::PooledConnection<ConnectionManager<PgConnection>>; | ||||
| 
 | ||||
| lazy_static! { | ||||
|     static ref POOL: Pool = { | ||||
|         let database_url = "postgres://rust:rust@localhost:5433/dispatcher"; | ||||
|         let manager = ConnectionManager::<PgConnection>::new(database_url); | ||||
|         Pool::new(manager).expect("failed to create db pool") | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| pub fn init_database_pool() { | ||||
|     lazy_static::initialize(&POOL); | ||||
| } | ||||
| 
 | ||||
| pub fn get_connection() -> Result<DbConnection, String> { | ||||
|     match POOL.get() { | ||||
|         Ok(conn) => Ok(conn), | ||||
|         Err(e) => Err(format!("unable to get pool connection: {}", e)), | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								src/database/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/database/mod.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| mod client; | ||||
| 
 | ||||
| pub use client::{get_connection, init_database_pool}; | ||||
							
								
								
									
										3
									
								
								src/error/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/error/mod.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| mod storer; | ||||
| 
 | ||||
| pub use storer::StorerError; | ||||
							
								
								
									
										13
									
								
								src/error/storer.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/error/storer.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| use thiserror::Error; | ||||
| 
 | ||||
| #[derive(Error, Debug)] | ||||
| pub enum StorerError { | ||||
|     #[error("unable to insert `{0}`")] | ||||
|     InsertError(String), | ||||
|     #[error("unable to save `{0}`")] | ||||
|     SaveError(String), | ||||
|     #[error("unable to delete `{0}`")] | ||||
|     DeleteError(String), | ||||
|     #[error("unknown saver error")] | ||||
|     Unknown, | ||||
| } | ||||
| @ -1,4 +1,7 @@ | ||||
| mod database; | ||||
| mod error; | ||||
| mod message; | ||||
| mod model; | ||||
| mod queue; | ||||
| mod worker; | ||||
| 
 | ||||
| @ -6,6 +9,7 @@ use std::sync::mpsc::{channel, Sender}; | ||||
| use std::thread; | ||||
| use std::time; | ||||
| 
 | ||||
| use database::{get_connection, init_database_pool}; | ||||
| use message::Message; | ||||
| use queue::QueueController; | ||||
| 
 | ||||
| @ -41,6 +45,8 @@ impl<T: std::fmt::Debug + std::marker::Send + 'static> Dispatch<T> { | ||||
| } | ||||
| 
 | ||||
| fn main() { | ||||
|     init_database_pool(); | ||||
| 
 | ||||
|     let dispatch: Dispatch<Message> = Dispatch::new(); | ||||
| 
 | ||||
|     let wait = time::Duration::from_secs(2); | ||||
|  | ||||
							
								
								
									
										79
									
								
								src/model/job.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								src/model/job.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,79 @@ | ||||
| use crate::database::get_connection; | ||||
| use std::time::Duration; | ||||
| use std::{thread, time}; | ||||
| 
 | ||||
| use super::{Runner, RunnerStatus, Storer}; | ||||
| use crate::error::StorerError; | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub enum JobAction { | ||||
|     MegaportDeploy, | ||||
|     MegaportUndeploy, | ||||
|     MegaportCheckDeploy, | ||||
|     MegaportCheckUndeploy, | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub struct Job { | ||||
|     id: i32, | ||||
|     action: JobAction, | ||||
|     status: RunnerStatus, | ||||
| } | ||||
| 
 | ||||
| impl Job { | ||||
|     pub fn new(id: i32, action: JobAction) -> Self { | ||||
|         Self { | ||||
|             id: id, | ||||
|             action: action, | ||||
|             status: RunnerStatus::Pending, | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn set_status(&mut self, status: RunnerStatus) { | ||||
|         self.status = status; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl Runner for Job { | ||||
|     fn run(&mut self) { | ||||
|         self.set_status(RunnerStatus::Running); | ||||
| 
 | ||||
|         match self.action { | ||||
|             JobAction::MegaportDeploy => { | ||||
|                 println!("[job({:?})] deploying megaport...", self); | ||||
|             } | ||||
|             JobAction::MegaportUndeploy => { | ||||
|                 println!("[job({:?})] undeploying megaport...", self); | ||||
|             } | ||||
|             JobAction::MegaportCheckDeploy => { | ||||
|                 println!("[job({:?})] ckecking megaport deployment...", self); | ||||
|             } | ||||
|             JobAction::MegaportCheckUndeploy => { | ||||
|                 println!("[job({:?})] ckecking megaport undeployment...", self); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         let wait = time::Duration::from_millis(1); | ||||
|         thread::sleep(wait); | ||||
| 
 | ||||
|         self.set_status(RunnerStatus::Success); | ||||
|     } | ||||
| 
 | ||||
|     fn set_status(&mut self, status: RunnerStatus) { | ||||
|         self.status = status; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl Storer for Job { | ||||
|     fn insert(&self) -> Result<(), StorerError> { | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     fn save(&self) -> Result<(), StorerError> { | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     fn delete(&self) -> Result<(), StorerError> { | ||||
|         Ok(()) | ||||
|     } | ||||
| } | ||||
							
								
								
									
										5
									
								
								src/model/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/model/mod.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | ||||
| mod job; | ||||
| mod traits; | ||||
| 
 | ||||
| pub use job::{Job, JobAction}; | ||||
| pub use traits::{Runner, RunnerStatus, Storer}; | ||||
							
								
								
									
										20
									
								
								src/model/traits.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/model/traits.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | ||||
| use crate::error::StorerError; | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub enum RunnerStatus { | ||||
|     Pending, | ||||
|     Running, | ||||
|     Failed, | ||||
|     Success, | ||||
| } | ||||
| 
 | ||||
| pub trait Runner { | ||||
|     fn run(&mut self); | ||||
|     fn set_status(&mut self, status: RunnerStatus); | ||||
| } | ||||
| 
 | ||||
| pub trait Storer { | ||||
|     fn insert(&self) -> Result<(), StorerError>; | ||||
|     fn save(&self) -> Result<(), StorerError>; | ||||
|     fn delete(&self) -> Result<(), StorerError>; | ||||
| } | ||||
| @ -1,84 +1,34 @@ | ||||
| use std::collections::VecDeque; | ||||
| use std::sync::{Arc, Mutex, Condvar}; | ||||
| use std::sync::{Arc, Condvar, Mutex}; | ||||
| use std::thread; | ||||
| use std::time; | ||||
| use std::time::Duration; | ||||
| 
 | ||||
| use crate::message::Message; | ||||
| use crate::model::*; | ||||
| use crate::queue::QueueStatus; | ||||
| 
 | ||||
| struct Queue { | ||||
|     status: Mutex<QueueStatus>, | ||||
|     content: Mutex<VecDeque<Job>>, | ||||
| struct Queue<T: Runner> { | ||||
|     content: Mutex<VecDeque<T>>, | ||||
|     not_empty: Condvar, | ||||
| } | ||||
| 
 | ||||
| impl Queue { | ||||
| impl<T: Runner> Queue<T> { | ||||
|     fn new() -> Self { | ||||
|         Self { | ||||
|             status: Mutex::new(QueueStatus::Pending), | ||||
|             content: Mutex::new(VecDeque::new()), | ||||
|             not_empty: Condvar::new(), | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn set_status(&mut self, status: QueueStatus) { | ||||
|         let mut s = self.status.lock().unwrap(); | ||||
|         *s = status; | ||||
|     } | ||||
| 
 | ||||
|     pub fn add_job(&self, job: Job) { | ||||
|     pub fn add_runner(&self, runner: T) { | ||||
|         let mut c = self.content.lock().unwrap(); | ||||
|         c.push_back(job); | ||||
|         c.push_back(runner); | ||||
| 
 | ||||
|         self.not_empty.notify_one(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[derive(Copy, Clone)] | ||||
| pub enum JobAction { | ||||
|     MegaportDeploy, | ||||
|     MegaportUndeploy, | ||||
|     MegaportCheckDeploy, | ||||
|     MegaportCheckUndeploy | ||||
| } | ||||
| 
 | ||||
| pub struct Job { | ||||
|     id: u32, | ||||
|     action: JobAction, | ||||
|     data: String, | ||||
| } | ||||
| 
 | ||||
| impl Job { | ||||
|     fn new(id: u32, action: JobAction, data: &str) -> Self { | ||||
|         Self { | ||||
|             id: id, | ||||
|             action: action, | ||||
|             data: data.to_string() | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fn run(&self) { | ||||
|         let id = self.id.clone(); | ||||
|         match self.action { | ||||
|             JobAction::MegaportDeploy => { | ||||
|                 println!("[job({})] deploying megaport...", id); | ||||
|             }, | ||||
|             JobAction::MegaportUndeploy => { | ||||
|                 println!("[job({})] undeploying megaport...", id); | ||||
|             }, | ||||
|             JobAction::MegaportCheckDeploy => { | ||||
|                 println!("[job({})] ckecking megaport deployment...", id); | ||||
|             } | ||||
|             JobAction::MegaportCheckUndeploy => { | ||||
|                 println!("[job({})] ckecking megaport undeployment...", id); | ||||
|             } | ||||
|         } | ||||
|         let wait = time::Duration::from_millis(1); | ||||
|         thread::sleep(wait); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[derive(Copy, Clone, PartialEq)] | ||||
| pub enum WorkerStatus { | ||||
|     Pending, | ||||
| @ -113,10 +63,17 @@ pub struct Manager { | ||||
| 
 | ||||
| impl Manager { | ||||
|     fn new(name: &str) -> Self { | ||||
|         Self { name: name.to_string(), workers: vec![] } | ||||
|         Self { | ||||
|             name: name.to_string(), | ||||
|             workers: vec![], | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fn launch_workers(&mut self, nb_workers: u32, shared_queue: Arc<Queue>) { | ||||
|     fn launch_workers<T: Runner + std::marker::Send + 'static>( | ||||
|         &mut self, | ||||
|         nb_workers: u32, | ||||
|         shared_queue: Arc<Queue<T>>, | ||||
|     ) { | ||||
|         for i in 0..nb_workers { | ||||
|             let shared_worker = Arc::new(Mutex::new(Worker::new())); | ||||
| 
 | ||||
| @ -126,31 +83,29 @@ impl Manager { | ||||
|             let queue = shared_queue.clone(); | ||||
|             let name = self.name.clone(); | ||||
| 
 | ||||
|             thread::spawn(move || { | ||||
|                 loop { | ||||
|                     let mut c = queue.content.lock().unwrap(); | ||||
|             thread::spawn(move || loop { | ||||
|                 let mut guard = queue.content.lock().unwrap(); | ||||
| 
 | ||||
|                     let job = loop { | ||||
|                         if let Some(job) = c.pop_front() { | ||||
|                             break job; | ||||
|                 let mut runner = loop { | ||||
|                     if let Some(r) = guard.pop_front() { | ||||
|                         break r; | ||||
|                     } else { | ||||
|                             c = queue.not_empty.wait(c).unwrap(); | ||||
|                         guard = queue.not_empty.wait(guard).unwrap(); | ||||
|                     } | ||||
|                 }; | ||||
| 
 | ||||
|                     drop(c); | ||||
|                 drop(guard); | ||||
| 
 | ||||
|                 let mut guard = worker.lock().unwrap(); | ||||
|                 guard.set_status(WorkerStatus::Running); | ||||
|                 drop(guard); | ||||
| 
 | ||||
|                 println!("[worker({} - {})] launching job...", name, i); | ||||
|                     job.run(); | ||||
|                 runner.run(); | ||||
| 
 | ||||
|                 let mut guard = worker.lock().unwrap(); | ||||
|                 guard.set_status(WorkerStatus::Pending); | ||||
|                 drop(guard); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
| @ -158,7 +113,7 @@ impl Manager { | ||||
|     fn healthcheck(&self, target: WorkerStatus) -> bool { | ||||
|         for w in &self.workers { | ||||
|             if w.lock().unwrap().get_status() != target { | ||||
|                 return false | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|         true | ||||
| @ -171,8 +126,8 @@ fn test_manager() { | ||||
|     use std::time::Duration; | ||||
| 
 | ||||
|     let mut m = Manager::new("deploy"); | ||||
|     let queue_deploy = Arc::new(Queue::new()); | ||||
|     let queue_check = Arc::new(Queue::new()); | ||||
|     let queue_deploy = Arc::new(Queue::<Job>::new()); | ||||
|     let queue_check = Arc::new(Queue::<Job>::new()); | ||||
| 
 | ||||
|     m.launch_workers(5, queue_deploy.clone()); | ||||
| 
 | ||||
| @ -180,9 +135,9 @@ fn test_manager() { | ||||
|     assert!(!m.healthcheck(WorkerStatus::Failed)); | ||||
| 
 | ||||
|     for i in 0..500 { | ||||
|         let j = Job::new(i, JobAction::MegaportDeploy, ""); | ||||
|         let j = Job::new(i, JobAction::MegaportDeploy); | ||||
| 
 | ||||
|         queue_deploy.add_job(j); | ||||
|         queue_deploy.add_runner(j); | ||||
|     } | ||||
| 
 | ||||
|     let wait = time::Duration::from_millis(200); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 rmanach
						rmanach