diff --git a/Cargo.lock b/Cargo.lock index f784e41..a598ac3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -167,9 +167,9 @@ dependencies = [ [[package]] name = "atoi" -version = "0.4.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616896e05fc0e2649463a93a15183c6a16bf03413a7af88ef1285ddedfa9cda5" +checksum = "d7c57d12312ff59c811c0643f4d80830505833c9ffaebd193d819392b265be8e" dependencies = [ "num-traits", ] @@ -377,6 +377,17 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dabbe35f96fb9507f7330793dc490461b2962659ac5d427181e451a623751d1" +[[package]] +name = "bigdecimal" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aaf33151a6429fe9211d1b276eafdf70cdff28b071e76c0b0e1503221ea3744" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "bincode" version = "1.3.3" @@ -755,18 +766,18 @@ dependencies = [ [[package]] name = "crc" -version = "2.1.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" +checksum = "53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3" dependencies = [ "crc-catalog", ] [[package]] name = "crc-catalog" -version = "1.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" +checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" [[package]] name = "crossbeam-queue" @@ -959,10 +970,10 @@ dependencies = [ ] [[package]] -name = "dotenv" -version = "0.15.0" +name = "dotenvy" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +checksum = "03d8c417d7a8cb362e0c37e5d815f5eb7c37f79ff93707329d5a194e42e54ca0" [[package]] name = "dunce" @@ -1597,19 +1608,13 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hashers" version = "1.0.1" @@ -1621,11 +1626,11 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.7.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" +checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa" dependencies = [ - "hashbrown 0.11.2", + "hashbrown", ] [[package]] @@ -1777,9 +1782,9 @@ checksum = "59df7c4e19c950e6e0e868dcc0a300b09a9b88e9ec55bd879ca819087a77355d" dependencies = [ "http", "hyper", - "rustls 0.20.7", + "rustls", "tokio", - "tokio-rustls 0.23.4", + "tokio-rustls", ] [[package]] @@ -1890,7 +1895,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" dependencies = [ "autocfg", - "hashbrown 0.12.3", + "hashbrown", ] [[package]] @@ -2132,6 +2137,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -2785,19 +2801,19 @@ dependencies = [ "percent-encoding", "pin-project-lite", "proc-macro-hack", - "rustls 0.20.7", + "rustls", "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", "tokio", - "tokio-rustls 0.23.4", + "tokio-rustls", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 0.22.5", + "webpki-roots", "winreg", ] @@ -2872,19 +2888,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustls" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" -dependencies = [ - "base64 0.13.1", - "log", - "ring", - "sct 0.6.1", - "webpki 0.21.4", -] - [[package]] name = "rustls" version = "0.20.7" @@ -2893,8 +2896,8 @@ checksum = "539a2bfe908f471bfa933876bd1eb6a19cf2176d375f82ef7f99530a40e48c2c" dependencies = [ "log", "ring", - "sct 0.7.0", - "webpki 0.22.0", + "sct", + "webpki", ] [[package]] @@ -2984,16 +2987,6 @@ dependencies = [ "sha2 0.10.6", ] -[[package]] -name = "sct" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "sct" version = "0.7.0" @@ -3106,17 +3099,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha-1" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.10.6", -] - [[package]] name = "sha1" version = "0.10.5" @@ -3259,9 +3241,9 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.1.8" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b7922be017ee70900be125523f38bdd644f4f06a1b16e8fa5a8ee8c34bffd4" +checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" dependencies = [ "itertools", "nom 7.1.1", @@ -3270,9 +3252,8 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551873805652ba0d912fec5bbb0f8b4cdd96baf8e2ebf5970e5671092966019b" +version = "0.6.2" +source = "git+https://github.com/KodexLabs/sqlx.git?branch=main#776eab8854f3060fac33a2920459b9fc03472f2b" dependencies = [ "sqlx-core", "sqlx-macros", @@ -3280,13 +3261,13 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48c61941ccf5ddcada342cd59e3e5173b007c509e1e8e990dafc830294d9dc5" +version = "0.6.2" +source = "git+https://github.com/KodexLabs/sqlx.git?branch=main#776eab8854f3060fac33a2920459b9fc03472f2b" dependencies = [ "ahash", "atoi", "base64 0.13.1", + "bigdecimal", "bitflags", "byteorder", "bytes", @@ -3294,7 +3275,9 @@ dependencies = [ "crc", "crossbeam-queue", "dirs", + "dotenvy", "either", + "ethereum-types", "event-listener", "futures-channel", "futures-core", @@ -3310,14 +3293,16 @@ dependencies = [ "log", "md-5", "memchr", + "num-bigint", "once_cell", "paste", "percent-encoding", "rand", - "rustls 0.19.1", + "rustls", + "rustls-pemfile", "serde", "serde_json", - "sha-1", + "sha1", "sha2 0.10.6", "smallvec", "sqlformat", @@ -3326,19 +3311,17 @@ dependencies = [ "thiserror", "tokio-stream", "url", - "uuid 0.8.2", - "webpki 0.21.4", - "webpki-roots 0.21.1", + "uuid 1.2.2", + "webpki-roots", "whoami", ] [[package]] name = "sqlx-macros" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0fba2b0cae21fc00fe6046f8baa4c7fcb49e379f0f592b04696607f69ed2e1" +version = "0.6.2" +source = "git+https://github.com/KodexLabs/sqlx.git?branch=main#776eab8854f3060fac33a2920459b9fc03472f2b" dependencies = [ - "dotenv", + "dotenvy", "either", "heck", "hex", @@ -3356,13 +3339,12 @@ dependencies = [ [[package]] name = "sqlx-rt" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4db708cd3e459078f85f39f96a00960bd841f66ee2a669e90bf36907f5a79aae" +version = "0.6.2" +source = "git+https://github.com/KodexLabs/sqlx.git?branch=main#776eab8854f3060fac33a2920459b9fc03472f2b" dependencies = [ "once_cell", "tokio", - "tokio-rustls 0.22.0", + "tokio-rustls", ] [[package]] @@ -3586,26 +3568,15 @@ dependencies = [ "syn", ] -[[package]] -name = "tokio-rustls" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" -dependencies = [ - "rustls 0.19.1", - "tokio", - "webpki 0.21.4", -] - [[package]] name = "tokio-rustls" version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "rustls 0.20.7", + "rustls", "tokio", - "webpki 0.22.0", + "webpki", ] [[package]] @@ -4086,16 +4057,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "webpki" version = "0.22.0" @@ -4106,22 +4067,13 @@ dependencies = [ "untrusted", ] -[[package]] -name = "webpki-roots" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" -dependencies = [ - "webpki 0.21.4", -] - [[package]] name = "webpki-roots" version = "0.22.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "368bfe657969fb01238bb756d351dcade285e0f6fcbd36dcb23359a5169975be" dependencies = [ - "webpki 0.22.0", + "webpki", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index aed5074..c16c625 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,9 +53,9 @@ tracing-subscriber = { version = "0.3.16", features = ["registry", "env-filter"] ulid = "1.0.0" uuid = { version = "1.2.2", features = ["v4", "serde"] } -# TODO(sqlx breaks connect_timeout on minor version upgrade, violating semantic versioning) [dependencies.sqlx] -version = "0.5.7" +git = "https://github.com/KodexLabs/sqlx.git" +branch = "main" default-features = false features = [ "runtime-tokio-rustls", @@ -64,7 +64,8 @@ features = [ "uuid", "chrono", "migrate", - "offline" + "offline", + "u256" ] [dev-dependencies] diff --git a/migrations/20220609205943_create_initial_tables.sql b/migrations/20220609205943_create_initial_tables.sql index ec35064..2402bcc 100644 --- a/migrations/20220609205943_create_initial_tables.sql +++ b/migrations/20220609205943_create_initial_tables.sql @@ -47,10 +47,15 @@ CREATE TABLE offers token citext REFERENCES addresses(address) NOT NULL, identifier_or_criteria TEXT NOT NULL, - start_amount TEXT NOT NULL, - end_amount TEXT NOT NULL, + start_amount NUMERIC NOT NULL, + end_amount NUMERIC NOT NULL, - PRIMARY KEY("order", position) + PRIMARY KEY("order", position), + + CONSTRAINT offers_start_amount_within_range CHECK (start_amount >= 0 AND start_amount < 2^256), + CONSTRAINT offers_start_amount_no_decimals CHECK (SCALE(start_amount) = 0), + CONSTRAINT offers_end_amount_within_range CHECK (end_amount >= 0 AND end_amount < 2^256), + CONSTRAINT offers_end_amount_no_decimals CHECK (SCALE(end_amount) = 0) ); CREATE TABLE considerations @@ -62,12 +67,17 @@ CREATE TABLE considerations token citext REFERENCES addresses(address) NOT NULL, identifier_or_criteria TEXT NOT NULL, - start_amount TEXT NOT NULL, - end_amount TEXT NOT NULL, + start_amount NUMERIC NOT NULL, + end_amount NUMERIC NOT NULL, recipient citext REFERENCES addresses(address) NOT NULL, - PRIMARY KEY("order", position) + PRIMARY KEY("order", position), + + CONSTRAINT considerations_start_amount_within_range CHECK (start_amount >= 0 AND start_amount < 2^256), + CONSTRAINT considerations_start_amount_no_decimals CHECK (SCALE(start_amount) = 0), + CONSTRAINT considerations_end_amount_within_range CHECK (end_amount >= 0 AND end_amount < 2^256), + CONSTRAINT considerations_end_amount_no_decimals CHECK (SCALE(end_amount) = 0) ); CREATE INDEX IF NOT EXISTS orders_offerer_idx on orders(offerer); diff --git a/migrations/20230102165620_add_uber_orders.sql b/migrations/20230102165620_add_uber_orders.sql new file mode 100644 index 0000000..c8e5c51 --- /dev/null +++ b/migrations/20230102165620_add_uber_orders.sql @@ -0,0 +1,255 @@ +DROP FUNCTION IF EXISTS order_considerations_amount(TEXT,order_start_end_amount_sum_selector,TEXT); +DROP FUNCTION IF EXISTS order_offers_amount(TEXT,order_start_end_amount_sum_selector,TEXT); +DROP FUNCTION IF EXISTS get_orders_lite(TEXT,TEXT,TEXT[],TEXT[],BOOLEAN,order_lite_ordering_value_selector,order_lite_ordering_order_selector,INT,INT); + +DROP TYPE IF EXISTS order_lite_ordering_value_selector; +DROP TYPE IF EXISTS order_lite_ordering_order_selector; +DROP TYPE IF EXISTS order_start_end_amount_sum_selector; +DROP TYPE IF EXISTS order_lite_item; +DROP TYPE IF EXISTS order_lite; + +CREATE TYPE order_lite_ordering_value_selector AS ENUM ( + 'OFFERS_AMOUNT', + 'CONSIDERATIONS_AMOUNT', + 'START_TIME', + 'END_TIME', + 'OFFERER', + 'HASH' +); +CREATE TYPE order_lite_ordering_order_selector AS ENUM ('ASC', 'DESC'); +CREATE TYPE order_start_end_amount_sum_selector AS ENUM ('START', 'END'); + +CREATE OR REPLACE FUNCTION order_considerations_amount(order_hash TEXT, type order_start_end_amount_sum_selector, target_token TEXT) + RETURNS NUMERIC AS +$$ + SELECT + CASE WHEN type = 'START'::order_start_end_amount_sum_selector + THEN SUM(C.start_amount) + ELSE SUM(C.end_amount) + END + FROM considerations C + WHERE ((C."order" = order_hash) OR order_hash = '') AND (C."token" = target_token) +$$ LANGUAGE sql STABLE; + +CREATE OR REPLACE FUNCTION order_offers_amount(order_hash TEXT, type order_start_end_amount_sum_selector, target_token TEXT) + RETURNS NUMERIC AS +$$ + SELECT + CASE WHEN type = 'START'::order_start_end_amount_sum_selector + THEN SUM(OF.start_amount) + ELSE SUM(OF.end_amount) + END + FROM offers OF + WHERE ((OF."order" = order_hash) OR order_hash = '') AND (OF."token" = target_token) +$$ LANGUAGE sql STABLE; + +CREATE TYPE order_lite_item AS +( + "position!" INT, + "item_type!" INT, + "token!" TEXT, + "identifier_or_criteria!" TEXT, + "start_amount!" NUMERIC, + "end_amount!" NUMERIC +); +CREATE TYPE order_lite AS +( + "signature!" TEXT, + "hash!" TEXT, + "start_time!" BIGINT, + "end_time!" BIGINT, + "order_type!" INT, + "offerer!" TEXT, + "considerations_total" NUMERIC, + "offers_total" NUMERIC, + + "offers!: Vec" order_lite_item[], + "considerations!: Vec" order_lite_item[], + + "cancelled!" BOOLEAN, + "finalized!" BOOLEAN, + "marked_invalid!" BOOLEAN +); + +CREATE OR REPLACE FUNCTION get_orders_lite( + asset_contract_address TEXT, + currency_token_address TEXT, + token_ids TEXT[], + offerers TEXT[], + active BOOLEAN, + ordering order_lite_ordering_value_selector DEFAULT 'HASH'::order_lite_ordering_value_selector, + ordering_order order_lite_ordering_order_selector DEFAULT 'ASC'::order_lite_ordering_order_selector, + "limit" INT DEFAULT 10, + "offset" INT DEFAULT 0 +) + RETURNS SETOF order_lite AS +$$ + WITH + -- UOFIOC -> Unique OFfers Identifier Or Criteria + -- UCIOC -> Unique Considerations Identifier Or Criteria + -- UUIOC -> Unique Union Identifier Or Criteria + -- GUIOCO -> Grouped Unique Identifier Or Consideration Orders + -- LTOO -> Listing Time Ordered Orders + -- LLO -> Limited Last Orders + -- SO -> Switchable Orders + UOFIOC AS ( + SELECT DISTINCT OF."identifier_or_criteria" + FROM offers OF + WHERE OF.token = asset_contract_address + ), + UCIOC AS ( + SELECT DISTINCT C."identifier_or_criteria" + FROM considerations C + WHERE C.token = asset_contract_address + ), + UUIOC AS (SELECT DISTINCT * FROM ((SELECT * FROM UOFIOC) UNION (SELECT * FROM UCIOC)) u), + GUIOCO AS ( + SELECT + UUIOC.identifier_or_criteria, + array( + SELECT DISTINCT O.hash + FROM orders O + INNER JOIN considerations OC ON O.hash = OC.order + INNER JOIN offers OOF ON O.hash = OOF.order + WHERE + OC.identifier_or_criteria = UUIOC.identifier_or_criteria + OR + OOF.identifier_or_criteria = UUIOC.identifier_or_criteria + ) as container_orders + FROM UUIOC + GROUP BY UUIOC.identifier_or_criteria + ), + LTOO AS ( + SELECT * + FROM orders O + INNER JOIN GUIOCO ON O.hash = ANY(GUIOCO.container_orders) + ), + LLO AS ( + SELECT + O."hash", + O."offerer", + O."zone", + O."zone_hash", + O."start_time", + O."end_time", + O."order_type", + O."total_original_consideration_items", + O."salt", + O."counter", + O."conduit_key", + O."signature", + O."cancelled", + O."finalized", + O."marked_invalid" + FROM GUIOCO G + INNER JOIN ( + SELECT DISTINCT ON (identifier_or_criteria) * + FROM LTOO + ORDER BY identifier_or_criteria DESC + ) O ON O.hash = ANY(G.container_orders) + ), + SO AS ( + SELECT * + FROM LLO + WHERE active IS TRUE + UNION ALL + SELECT * + FROM orders + WHERE active IS FALSE + ), + -- To be able to correctly do the dynamic ordering we need the actual data as a sub-query + OSQ AS ( + SELECT + O.signature AS "signature!", + O.hash AS "hash!", + O.start_time AS "start_time!", + O.end_time AS "end_time!", + O.order_type AS "order_type!", + O.offerer AS "offerer!", + + -- We sum all of the values in considerations and offers + -- This is a nice and simple way to get the price of a listing for example + order_considerations_amount(O.hash, 'START'::order_start_end_amount_sum_selector, currency_token_address) AS "considerations_total", + order_offers_amount(O.hash, 'START'::order_start_end_amount_sum_selector, currency_token_address) AS "offers_total", + + array_agg(DISTINCT ( + OOF.position, + OOF.item_type, + OOF.token, + OOF.identifier_or_criteria, + OOF.start_amount, + OOF.end_amount + )::order_lite_item) AS "offers!: Vec", + array_agg(DISTINCT ( + OC.position, + OC.item_type, + OC.token, + OC.identifier_or_criteria, + OC.start_amount, + OC.end_amount + )::order_lite_item) AS "considerations!: Vec", + + O.cancelled AS "cancelled!", + O.finalized AS "finalized!", + O.marked_invalid AS "marked_invalid!" + FROM SO O + INNER JOIN considerations OC ON O.hash = OC.order + INNER JOIN offers OOF ON O.hash = OOF.order + -- Filtering works as follows (equal indents should be as AND) + -- 1) The offer OR consideration needs to have a token matching the passed "asset_contract_address" AND + -- 1.1) The "token id" (property "identifier_or_criteria") is present in the passed token_ids array OR the token_ids array is empty + -- 2) The order offerer is present in the passed offerers array OR the offerers array is empty + -- 3) If we decide to exclude invalid orders then we need to compare the 3 states (cancelled, finalized, and marked_invalid) as well as the start and end times + WHERE + ( + O.hash IN ( + SELECT OF.order FROM offers OF + WHERE + OF.token = asset_contract_address + AND + -- We check if the passed "token_ids" array contains the identifier or if the array is empty + -- If it's empty then we never actually intended to filter using it + (OF.identifier_or_criteria = ANY(token_ids) OR cardinality(token_ids) = 0) + ) + OR + O.hash IN ( + SELECT C.order FROM considerations C + WHERE + C.token = asset_contract_address + AND + -- We check if the passed "token_ids" array contains the identifier or if the array is empty + -- If it's empty then we never actually intended to filter using it + (C.identifier_or_criteria = ANY(token_ids) OR cardinality(token_ids) = 0) + ) + ) + -- We check if the passed "offerers" array contains the offerer set in the order or if the array is empty + -- If it's empty then we never actually intended to filter using it + AND (O.offerer = ANY(offerers) OR cardinality(offerers) = 0) + AND + -- We invert "exclude_invalid" so that if's true then we trigger the 2nd part of the check and compare order validity + ((NOT active) OR ( + NOT O.cancelled + AND NOT O.finalized + AND NOT O.marked_invalid + AND O.start_time <= extract(epoch from now()) + AND O.end_time >= extract(epoch from now()) + )) + GROUP BY O.signature, O.hash, O.start_time, O.end_time, O.order_type, O.offerer, O.cancelled, O.finalized, O.marked_invalid + ) + SELECT * + FROM OSQ + ORDER BY + ((CASE + WHEN ordering = 'OFFERS_AMOUNT'::order_lite_ordering_value_selector THEN 7 -- "offers_total" + WHEN ordering = 'CONSIDERATIONS_AMOUNT'::order_lite_ordering_value_selector THEN 6 -- "considerations_total" + WHEN ordering = 'START_TIME'::order_lite_ordering_value_selector THEN 2 -- "start_time!" + WHEN ordering = 'END_TIME'::order_lite_ordering_value_selector THEN 3 -- "end_time!" + WHEN ordering = 'OFFERER'::order_lite_ordering_value_selector THEN 5 -- "offerer!" + WHEN ordering = 'HASH'::order_lite_ordering_value_selector THEN 1 -- "hash!" + ELSE 1 -- "hash!" + -- By default we're always in ASC (represented by 1) so then to switch to DESC (-1) or ASC (1, technically changes nothing) + -- we switch multiple to switch over to DESC by representing the SELECTed column sequence as a negative number + END) * (CASE WHEN ordering_order = 'ASC'::order_lite_ordering_order_selector THEN 1 ELSE -1 END)) ASC + LIMIT "limit" + OFFSET "offset"; +$$ LANGUAGE SQL STABLE; diff --git a/src/startup.rs b/src/startup.rs index dcbbf3a..89fd2ae 100644 --- a/src/startup.rs +++ b/src/startup.rs @@ -39,7 +39,7 @@ use crate::{ pub fn get_connection_pool(configuration: &DatabaseSettings) -> PgPool { PgPoolOptions::new() - .connect_timeout(std::time::Duration::from_secs(2)) + .acquire_timeout(std::time::Duration::from_secs(2)) .connect_lazy_with(configuration.with_db()) }