From 88af240a0c41593d256851de30eba5cb7f6eacf2 Mon Sep 17 00:00:00 2001 From: Aravinth Manivannan Date: Wed, 27 Sep 2023 21:39:51 +0530 Subject: [PATCH] feat: update sqlx and add methods to work with jobs table --- ...757943787cc5698f1f78942150eea869abcc3.json | 16 + ...7542415b79ed6cbc2e7468e60b078dad5b53d.json | 17 + ...cc5c07915bff6276bd5005fd7221a76741e8b.json | 52 ++ ...dc90dd7c999a585e6b7b79459545bb583daa0.json | 52 ++ ...a1360c49cf7d0f1eb4eeea73117cda7eefe91.json | 16 + ...49f86699411f7a0c1bc2db5ab6125cd5c2828.json | 14 + ...aa8107433f6593077ee4197ff80cf2dc1f643.json | 14 + ...d93e22354dfe90d461c4a8e7469887cef63d6.json | 22 + Cargo.lock | 582 +++++++++++++++++- Cargo.toml | 12 +- src/db.rs | 206 ++++++- 11 files changed, 983 insertions(+), 20 deletions(-) create mode 100644 .sqlx/query-1a317e97df24ca0cd8e9e70e400757943787cc5698f1f78942150eea869abcc3.json create mode 100644 .sqlx/query-1b8b3e3dac6353829abcd3c49617542415b79ed6cbc2e7468e60b078dad5b53d.json create mode 100644 .sqlx/query-74bacf397f38e738e9d8dcc9ad5cc5c07915bff6276bd5005fd7221a76741e8b.json create mode 100644 .sqlx/query-8f43686f9512d4e3f75e000515bdc90dd7c999a585e6b7b79459545bb583daa0.json create mode 100644 .sqlx/query-985c4f76d8ccef02d4c1c47628fa1360c49cf7d0f1eb4eeea73117cda7eefe91.json create mode 100644 .sqlx/query-c43b464586d8b356ef09ebff65649f86699411f7a0c1bc2db5ab6125cd5c2828.json create mode 100644 .sqlx/query-f41b0fa86f004be0f412517ae43aa8107433f6593077ee4197ff80cf2dc1f643.json create mode 100644 .sqlx/query-f93894995de10d5eb0dc6fd249fd93e22354dfe90d461c4a8e7469887cef63d6.json diff --git a/.sqlx/query-1a317e97df24ca0cd8e9e70e400757943787cc5698f1f78942150eea869abcc3.json b/.sqlx/query-1a317e97df24ca0cd8e9e70e400757943787cc5698f1f78942150eea869abcc3.json new file mode 100644 index 0000000..eb54c4b --- /dev/null +++ b/.sqlx/query-1a317e97df24ca0cd8e9e70e400757943787cc5698f1f78942150eea869abcc3.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE\n ftest_jobs\n SET\n job_state = (SELECT ID FROM ftest_job_states WHERE name = $1),\n scheduled_at = $2\n WHERE auth = $3;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Timestamptz", + "Text" + ] + }, + "nullable": [] + }, + "hash": "1a317e97df24ca0cd8e9e70e400757943787cc5698f1f78942150eea869abcc3" +} diff --git a/.sqlx/query-1b8b3e3dac6353829abcd3c49617542415b79ed6cbc2e7468e60b078dad5b53d.json b/.sqlx/query-1b8b3e3dac6353829abcd3c49617542415b79ed6cbc2e7468e60b078dad5b53d.json new file mode 100644 index 0000000..82eb85a --- /dev/null +++ b/.sqlx/query-1b8b3e3dac6353829abcd3c49617542415b79ed6cbc2e7468e60b078dad5b53d.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO ftest_jobs\n (commit_hash, job_state, auth, created_at)\n VALUES ($1, (SELECT ID FROM ftest_job_states WHERE name = $2), $3, $4)", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar", + "Text", + "Varchar", + "Timestamptz" + ] + }, + "nullable": [] + }, + "hash": "1b8b3e3dac6353829abcd3c49617542415b79ed6cbc2e7468e60b078dad5b53d" +} diff --git a/.sqlx/query-74bacf397f38e738e9d8dcc9ad5cc5c07915bff6276bd5005fd7221a76741e8b.json b/.sqlx/query-74bacf397f38e738e9d8dcc9ad5cc5c07915bff6276bd5005fd7221a76741e8b.json new file mode 100644 index 0000000..269ea82 --- /dev/null +++ b/.sqlx/query-74bacf397f38e738e9d8dcc9ad5cc5c07915bff6276bd5005fd7221a76741e8b.json @@ -0,0 +1,52 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n ftest_jobs.ID,\n ftest_jobs.commit_hash,\n ftest_job_states.name,\n ftest_jobs.created_at,\n ftest_jobs.scheduled_at,\n ftest_jobs.finished_at\n\n FROM ftest_jobs\n INNER JOIN\n ftest_job_states\n ON\n ftest_job_states.ID = ftest_jobs.job_state\n WHERE\n ftest_job_states.name = $1;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "commit_hash", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "name", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "created_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "scheduled_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "finished_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + false, + false, + false, + true, + true + ] + }, + "hash": "74bacf397f38e738e9d8dcc9ad5cc5c07915bff6276bd5005fd7221a76741e8b" +} diff --git a/.sqlx/query-8f43686f9512d4e3f75e000515bdc90dd7c999a585e6b7b79459545bb583daa0.json b/.sqlx/query-8f43686f9512d4e3f75e000515bdc90dd7c999a585e6b7b79459545bb583daa0.json new file mode 100644 index 0000000..75f0903 --- /dev/null +++ b/.sqlx/query-8f43686f9512d4e3f75e000515bdc90dd7c999a585e6b7b79459545bb583daa0.json @@ -0,0 +1,52 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n ftest_jobs.ID,\n ftest_jobs.commit_hash,\n ftest_job_states.name,\n ftest_jobs.created_at,\n ftest_jobs.scheduled_at,\n ftest_jobs.finished_at\n\n FROM ftest_jobs\n INNER JOIN\n ftest_job_states\n ON\n ftest_job_states.ID = ftest_jobs.job_state\n WHERE\n ftest_jobs.commit_hash = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "commit_hash", + "type_info": "Varchar" + }, + { + "ordinal": 2, + "name": "name", + "type_info": "Varchar" + }, + { + "ordinal": 3, + "name": "created_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "scheduled_at", + "type_info": "Timestamptz" + }, + { + "ordinal": 5, + "name": "finished_at", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + false, + false, + false, + true, + true + ] + }, + "hash": "8f43686f9512d4e3f75e000515bdc90dd7c999a585e6b7b79459545bb583daa0" +} diff --git a/.sqlx/query-985c4f76d8ccef02d4c1c47628fa1360c49cf7d0f1eb4eeea73117cda7eefe91.json b/.sqlx/query-985c4f76d8ccef02d4c1c47628fa1360c49cf7d0f1eb4eeea73117cda7eefe91.json new file mode 100644 index 0000000..ccccfa8 --- /dev/null +++ b/.sqlx/query-985c4f76d8ccef02d4c1c47628fa1360c49cf7d0f1eb4eeea73117cda7eefe91.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE\n ftest_jobs\n SET\n job_state = (SELECT ID FROM ftest_job_states WHERE name = $1),\n finished_at = $2\n WHERE auth = $3;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Timestamptz", + "Text" + ] + }, + "nullable": [] + }, + "hash": "985c4f76d8ccef02d4c1c47628fa1360c49cf7d0f1eb4eeea73117cda7eefe91" +} diff --git a/.sqlx/query-c43b464586d8b356ef09ebff65649f86699411f7a0c1bc2db5ab6125cd5c2828.json b/.sqlx/query-c43b464586d8b356ef09ebff65649f86699411f7a0c1bc2db5ab6125cd5c2828.json new file mode 100644 index 0000000..fb2eccc --- /dev/null +++ b/.sqlx/query-c43b464586d8b356ef09ebff65649f86699411f7a0c1bc2db5ab6125cd5c2828.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO ftest_job_states\n (name) VALUES ($1) ON CONFLICT (name) DO NOTHING;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Varchar" + ] + }, + "nullable": [] + }, + "hash": "c43b464586d8b356ef09ebff65649f86699411f7a0c1bc2db5ab6125cd5c2828" +} diff --git a/.sqlx/query-f41b0fa86f004be0f412517ae43aa8107433f6593077ee4197ff80cf2dc1f643.json b/.sqlx/query-f41b0fa86f004be0f412517ae43aa8107433f6593077ee4197ff80cf2dc1f643.json new file mode 100644 index 0000000..cd50734 --- /dev/null +++ b/.sqlx/query-f41b0fa86f004be0f412517ae43aa8107433f6593077ee4197ff80cf2dc1f643.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "\n DELETE FROM\n ftest_jobs\n WHERE commit_hash = $1;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [] + }, + "hash": "f41b0fa86f004be0f412517ae43aa8107433f6593077ee4197ff80cf2dc1f643" +} diff --git a/.sqlx/query-f93894995de10d5eb0dc6fd249fd93e22354dfe90d461c4a8e7469887cef63d6.json b/.sqlx/query-f93894995de10d5eb0dc6fd249fd93e22354dfe90d461c4a8e7469887cef63d6.json new file mode 100644 index 0000000..33afca3 --- /dev/null +++ b/.sqlx/query-f93894995de10d5eb0dc6fd249fd93e22354dfe90d461c4a8e7469887cef63d6.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT EXISTS (SELECT 1 from ftest_job_states WHERE name = $1)", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "exists", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + null + ] + }, + "hash": "f93894995de10d5eb0dc6fd249fd93e22354dfe90d461c4a8e7469887cef63d6" +} diff --git a/Cargo.lock b/Cargo.lock index 0d0b82f..0e964e2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -321,6 +321,15 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + [[package]] name = "atty" version = "0.2.14" @@ -365,6 +374,12 @@ version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "bitflags" version = "1.3.2" @@ -376,6 +391,9 @@ name = "bitflags" version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +dependencies = [ + "serde", +] [[package]] name = "block-buffer" @@ -465,10 +483,16 @@ dependencies = [ "rust-ini", "serde", "serde_json", - "toml", + "toml 0.5.11", "yaml-rust", ] +[[package]] +name = "const-oid" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" + [[package]] name = "convert_case" version = "0.4.0" @@ -599,6 +623,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "deranged" version = "0.3.8" @@ -656,6 +691,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] @@ -723,6 +759,12 @@ dependencies = [ "termcolor", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "errno" version = "0.3.3" @@ -744,6 +786,17 @@ dependencies = [ "libc", ] +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys", +] + [[package]] name = "event-listener" version = "2.5.3" @@ -766,6 +819,17 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "futures-core", + "futures-sink", + "spin 0.9.8", +] + [[package]] name = "fnv" version = "1.0.7" @@ -813,6 +877,7 @@ dependencies = [ "lazy_static", "log", "mime_guess", + "mktemp", "num_cpus", "pretty_env_logger", "rand", @@ -821,7 +886,10 @@ dependencies = [ "semver", "serde", "serde_json", - "sqlx", + "sqlx 0.6.3", + "sqlx 0.7.2", + "tokio", + "toml 0.7.6", "tracing", "tracing-actix-web", "tracing-subscriber", @@ -845,6 +913,17 @@ version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + [[package]] name = "futures-intrusive" version = "0.4.2" @@ -856,6 +935,23 @@ dependencies = [ "parking_lot 0.11.2", ] +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot 0.12.1", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + [[package]] name = "futures-sink" version = "0.3.28" @@ -875,8 +971,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ "futures-core", + "futures-io", "futures-sink", "futures-task", + "memchr", "pin-project-lite", "pin-utils", "slab", @@ -921,7 +1019,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 1.9.3", "slab", "tokio", "tokio-util", @@ -1004,6 +1102,15 @@ dependencies = [ "digest", ] +[[package]] +name = "home" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +dependencies = [ + "windows-sys", +] + [[package]] name = "http" version = "0.2.9" @@ -1110,6 +1217,16 @@ dependencies = [ "hashbrown 0.12.3", ] +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", +] + [[package]] name = "instant" version = "0.1.12" @@ -1180,6 +1297,9 @@ name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin 0.5.2", +] [[package]] name = "libc" @@ -1187,6 +1307,23 @@ version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +[[package]] +name = "libm" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" + +[[package]] +name = "libsqlite3-sys" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -1291,6 +1428,15 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "mktemp" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69fed8fbcd01affec44ac226784c6476a6006d98d13e33bc0ca7977aaf046bd8" +dependencies = [ + "uuid", +] + [[package]] name = "native-tls" version = "0.2.11" @@ -1329,6 +1475,44 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.16" @@ -1336,6 +1520,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -1483,6 +1668,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -1566,6 +1760,27 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.27" @@ -1762,7 +1977,7 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", + "spin 0.5.2", "untrusted", "web-sys", "winapi", @@ -1779,6 +1994,28 @@ dependencies = [ "serde", ] +[[package]] +name = "rsa" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab43bb47d23c1a631b4b680199a45255dce26fa9ab2fa902581f624ff13e6a8" +dependencies = [ + "byteorder", + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-iter", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rust-embed" version = "6.8.1" @@ -1863,6 +2100,17 @@ dependencies = [ "webpki", ] +[[package]] +name = "rustls" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" +dependencies = [ + "ring", + "rustls-webpki", + "sct", +] + [[package]] name = "rustls-pemfile" version = "1.0.3" @@ -1872,6 +2120,16 @@ dependencies = [ "base64 0.21.3", ] +[[package]] +name = "rustls-webpki" +version = "0.101.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "ryu" version = "1.0.15" @@ -1975,6 +2233,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2027,6 +2294,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +dependencies = [ + "digest", + "rand_core", +] + [[package]] name = "slab" version = "0.4.9" @@ -2068,6 +2345,25 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "sqlformat" version = "0.2.2" @@ -2085,8 +2381,21 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8de3b03a925878ed54a954f621e64bf55a3c1bd29652d0d1a17830405350188" dependencies = [ - "sqlx-core", - "sqlx-macros", + "sqlx-core 0.6.3", + "sqlx-macros 0.6.3", +] + +[[package]] +name = "sqlx" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e50c216e3624ec8e7ecd14c6a6a6370aad6ee5d8cfc3ab30b5162eeeef2ed33" +dependencies = [ + "sqlx-core 0.7.2", + "sqlx-macros 0.7.2", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", ] [[package]] @@ -2096,7 +2405,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa8241483a83a3f33aa5fff7e7d9def398ff9990b2752b6c6112b83c6d246029" dependencies = [ "ahash 0.7.6", - "atoi", + "atoi 1.0.0", "base64 0.13.1", "bitflags 1.3.2", "byteorder", @@ -2109,13 +2418,13 @@ dependencies = [ "event-listener", "futures-channel", "futures-core", - "futures-intrusive", + "futures-intrusive 0.4.2", "futures-util", "hashlink", "hex", "hkdf", "hmac", - "indexmap", + "indexmap 1.9.3", "itoa", "libc", "log", @@ -2125,7 +2434,7 @@ dependencies = [ "paste", "percent-encoding", "rand", - "rustls", + "rustls 0.20.9", "rustls-pemfile", "serde", "serde_json", @@ -2139,10 +2448,54 @@ dependencies = [ "time", "tokio-stream", "url", - "webpki-roots", + "webpki-roots 0.22.6", "whoami", ] +[[package]] +name = "sqlx-core" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d6753e460c998bbd4cd8c6f0ed9a64346fcca0723d6e75e52fdc351c5d2169d" +dependencies = [ + "ahash 0.8.3", + "atoi 2.0.0", + "byteorder", + "bytes", + "crc", + "crossbeam-queue", + "dotenvy", + "either", + "event-listener", + "futures-channel", + "futures-core", + "futures-intrusive 0.5.0", + "futures-io", + "futures-util", + "hashlink", + "hex", + "indexmap 2.0.0", + "log", + "memchr", + "once_cell", + "paste", + "percent-encoding", + "rustls 0.21.7", + "rustls-pemfile", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlformat", + "thiserror", + "time", + "tokio", + "tokio-stream", + "tracing", + "url", + "webpki-roots 0.24.0", +] + [[package]] name = "sqlx-macros" version = "0.6.3" @@ -2159,12 +2512,134 @@ dependencies = [ "serde", "serde_json", "sha2", - "sqlx-core", + "sqlx-core 0.6.3", "sqlx-rt", "syn 1.0.109", "url", ] +[[package]] +name = "sqlx-macros" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a793bb3ba331ec8359c1853bd39eed32cdd7baaf22c35ccf5c92a7e8d1189ec" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core 0.7.2", + "sqlx-macros-core", + "syn 1.0.109", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a4ee1e104e00dedb6aa5ffdd1343107b0a4702e862a84320ee7cc74782d96fc" +dependencies = [ + "dotenvy", + "either", + "heck", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core 0.7.2", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 1.0.109", + "tempfile", + "tokio", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864b869fdf56263f4c95c45483191ea0af340f9f3e3e7b4d57a61c7c87a970db" +dependencies = [ + "atoi 2.0.0", + "base64 0.21.3", + "bitflags 2.4.0", + "byteorder", + "bytes", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core 0.7.2", + "stringprep", + "thiserror", + "time", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb7ae0e6a97fb3ba33b23ac2671a5ce6e3cabe003f451abd5a56e7951d975624" +dependencies = [ + "atoi 2.0.0", + "base64 0.21.3", + "bitflags 2.4.0", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand", + "serde", + "serde_json", + "sha1", + "sha2", + "smallvec", + "sqlx-core 0.7.2", + "stringprep", + "thiserror", + "time", + "tracing", + "whoami", +] + [[package]] name = "sqlx-rt" version = "0.6.3" @@ -2176,6 +2651,29 @@ dependencies = [ "tokio-rustls", ] +[[package]] +name = "sqlx-sqlite" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59dc83cf45d89c555a577694534fcd1b55c545a816c816ce51f20bbe56a4f3f" +dependencies = [ + "atoi 2.0.0", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive 0.5.0", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "sqlx-core 0.7.2", + "time", + "tracing", + "url", +] + [[package]] name = "stringprep" version = "0.1.3" @@ -2349,7 +2847,7 @@ version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "rustls", + "rustls 0.20.9", "tokio", "webpki", ] @@ -2388,6 +2886,40 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +dependencies = [ + "indexmap 2.0.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "tower-service" version = "0.3.2" @@ -2691,6 +3223,15 @@ dependencies = [ "webpki", ] +[[package]] +name = "webpki-roots" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" +dependencies = [ + "rustls-webpki", +] + [[package]] name = "whoami" version = "1.4.1" @@ -2798,6 +3339,15 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "winnow" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.50.0" @@ -2817,6 +3367,12 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "zeroize" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" + [[package]] name = "zstd" version = "0.12.4" diff --git a/Cargo.toml b/Cargo.toml index 6a4c873..95f309c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,11 @@ name = "ftest" version = "0.1.0" edition = "2021" build = "build.rs" +defalt-run ="./src/main.rs" + +[[bin]] +name ="config_validator" +path = "./src/complaince/validator.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -14,7 +19,7 @@ futures-util = { version = "0.3.17", default-features = false, features = ["std" lazy_static = "1.4.0" log = "0.4.17" pretty_env_logger = "0.4.0" -serde = { version = "1", features=["derive"]} +serde = { version = "1", features = ["derive"] } actix-web-codegen-const-routes = { version = "0.1.0", tag = "0.1.0", git = "https://github.com/realaravinth/actix-web-codegen-const-routes" } derive_builder = "0.11.2" config = "0.13" @@ -24,7 +29,7 @@ serde_json = { version ="1", features = ["raw_value"]} actix-web-httpauth = "0.8.0" mime_guess = "2.0.4" rust-embed = "6.4.2" -sqlx = { version = "0.6.1", features = [ "runtime-actix-rustls", "postgres", "time", "offline"] } +sqlx = { version = "0.7", features = [ "runtime-tokio-rustls", "postgres", "time"] } tracing = { version = "0.1.37", features = ["log"] } tracing-actix-web = "0.7.6" tracing-subscriber = "0.3.17" @@ -32,6 +37,8 @@ num_cpus = "1.16.0" uuid = { version = "1.4.1", features = ["v4", "serde"] } rand = "0.8.5" semver = { version = "1.0.18", features = ["serde"] } +toml = "0.7.6" +tokio = { version = "1.32.0", features = ["sync"] } [build-dependencies] serde_json = "1" @@ -40,3 +47,4 @@ sqlx = { version = "0.6.1", features = [ "runtime-actix-rustls", "postgres", "ti [dev-dependencies] actix-rt = "2.7.0" base64 = "0.13.0" +mktemp = "0.5.1" diff --git a/src/db.rs b/src/db.rs index 26f2535..81edf9f 100644 --- a/src/db.rs +++ b/src/db.rs @@ -38,7 +38,7 @@ impl ConnectionOptions { let mut connect_options = sqlx::postgres::PgConnectOptions::from_str(&fresh.url).unwrap(); if fresh.disable_logging { - connect_options.disable_statement_logging(); + connect_options = connect_options.disable_statement_logging(); } sqlx::postgres::PgConnectOptions::from_str(&fresh.url) .unwrap() @@ -133,6 +133,140 @@ impl Database { false } } + + pub async fn add_job(&self, commit_hash: &str) -> ServiceResult { + let auth = crate::utils::get_random(32); + let now = now_unix_time_stamp(); + + sqlx::query!( + "INSERT INTO ftest_jobs + (commit_hash, job_state, auth, created_at) + VALUES ($1, (SELECT ID FROM ftest_job_states WHERE name = $2), $3, $4)", + commit_hash, + &JOB_STATE_CREATE.name, + &auth, + now + ) + .execute(&self.pool) + .await + .map_err(map_register_err)?; + Ok(auth) + } + + pub async fn mark_job_scheduled(&self, auth: &str) -> ServiceResult<()> { + let now = now_unix_time_stamp(); + sqlx::query!( + " + UPDATE + ftest_jobs + SET + job_state = (SELECT ID FROM ftest_job_states WHERE name = $1), + scheduled_at = $2 + WHERE auth = $3;", + &JOB_STATE_RUNNING.name, + now, + auth, + ) + .execute(&self.pool) + .await + .map_err(map_register_err)?; + + Ok(()) + } + + pub async fn mark_job_finished(&self, auth: &str) -> ServiceResult<()> { + let now = now_unix_time_stamp(); + sqlx::query!( + " + UPDATE + ftest_jobs + SET + job_state = (SELECT ID FROM ftest_job_states WHERE name = $1), + finished_at = $2 + WHERE auth = $3;", + &JOB_STATE_FINISH.name, + now, + auth, + ) + .execute(&self.pool) + .await + .map_err(map_register_err)?; + + Ok(()) + } + + pub async fn get_job(&self, commit_hash: &str) -> ServiceResult { + let res = sqlx::query_as!( + InnerJob, + " + SELECT + ftest_jobs.ID, + ftest_jobs.commit_hash, + ftest_job_states.name, + ftest_jobs.created_at, + ftest_jobs.scheduled_at, + ftest_jobs.finished_at + + FROM ftest_jobs + INNER JOIN + ftest_job_states + ON + ftest_job_states.ID = ftest_jobs.job_state + WHERE + ftest_jobs.commit_hash = $1", + commit_hash + ) + .fetch_one(&self.pool) + .await + .map_err(map_register_err)?; + + Ok(res.into()) + } + + pub async fn get_all_jobs_of_state(&self, state: &JobState) -> ServiceResult> { + let mut res = sqlx::query_as!( + InnerJob, + " + SELECT + ftest_jobs.ID, + ftest_jobs.commit_hash, + ftest_job_states.name, + ftest_jobs.created_at, + ftest_jobs.scheduled_at, + ftest_jobs.finished_at + + FROM ftest_jobs + INNER JOIN + ftest_job_states + ON + ftest_job_states.ID = ftest_jobs.job_state + WHERE + ftest_job_states.name = $1;", + &state.name + ) + .fetch_all(&self.pool) + .await + .map_err(map_register_err)?; + + let res = res.drain(0..).map(|r| r.into()).collect(); + + Ok(res) + } + + pub async fn delete_job(&self, commit_hash: &str) -> ServiceResult<()> { + sqlx::query!( + " + DELETE FROM + ftest_jobs + WHERE commit_hash = $1;", + commit_hash, + ) + .execute(&self.pool) + .await + .map_err(map_register_err)?; + + Ok(()) + } } fn now_unix_time_stamp() -> OffsetDateTime { @@ -160,6 +294,43 @@ pub fn map_row_not_found_err(e: sqlx::Error, row_not_found: ServiceError) -> Ser } } +#[derive(Debug, PartialEq, Eq)] +pub struct Job { + pub state: JobState, + pub commit_hash: String, + pub id: u32, + pub created_at: OffsetDateTime, + pub scheduled_at: Option, + pub finished_at: Option, +} + +struct InnerJob { + name: String, + commit_hash: String, + id: i32, + created_at: OffsetDateTime, + scheduled_at: Option, + finished_at: Option, +} + +impl From for Job { + fn from(j: InnerJob) -> Self { + Job { + state: (JOB_STATES) + .iter() + .find(|d| d.name == j.name) + .unwrap() + .to_owned() + .to_owned(), + commit_hash: j.commit_hash, + id: j.id as u32, + created_at: j.created_at, + scheduled_at: j.scheduled_at, + finished_at: j.finished_at, + } + } +} + /// map postgres errors to [ServiceError](ServiceError) types fn map_register_err(e: sqlx::Error) -> ServiceError { use sqlx::Error; @@ -202,10 +373,7 @@ mod tests { .unwrap(); assert!(db.ping().await); - const EMAIL: &str = "postgresuser@foo.com"; - const EMAIL2: &str = "postgresuser2@foo.com"; - const NAME: &str = "postgresuser"; - const PASSWORD: &str = "pasdfasdfasdfadf"; + const COMMIT_HASH: &str = "pasdfasdfasdfadf"; db.migrate().await.unwrap(); @@ -213,5 +381,33 @@ mod tests { println!("checking job state {}", e.name); assert!(db.job_state_exists(e).await.unwrap()); } + + let _ = db.delete_job(COMMIT_HASH).await; + + let auth = db.add_job(COMMIT_HASH).await.unwrap(); + let job = db.get_job(COMMIT_HASH).await.unwrap(); + assert!(job.created_at < now_unix_time_stamp()); + assert!(job.scheduled_at.is_none()); + assert!(job.finished_at.is_none()); + assert_eq!( + db.get_all_jobs_of_state(&*JOB_STATE_CREATE).await.unwrap(), + vec![job] + ); + + db.mark_job_scheduled(&auth).await.unwrap(); + let job = db.get_job(COMMIT_HASH).await.unwrap(); + assert!(job.scheduled_at.is_some()); + assert_eq!( + db.get_all_jobs_of_state(&*JOB_STATE_RUNNING).await.unwrap(), + vec![job] + ); + + db.mark_job_finished(&auth).await.unwrap(); + let job = db.get_job(COMMIT_HASH).await.unwrap(); + assert!(job.finished_at.is_some()); + assert_eq!( + db.get_all_jobs_of_state(&*JOB_STATE_FINISH).await.unwrap(), + vec![job] + ); } }