mirror of
https://github.com/mCaptcha/mCaptcha.git
synced 2026-02-11 18:15:39 +00:00
Deploying to gh-pages from @ 7eda0defc233e850ec179bc95878b5403c3af855 🚀
This commit is contained in:
@@ -433,6 +433,14 @@
|
||||
<a href="#433" id="433">433</a>
|
||||
<a href="#434" id="434">434</a>
|
||||
<a href="#435" id="435">435</a>
|
||||
<a href="#436" id="436">436</a>
|
||||
<a href="#437" id="437">437</a>
|
||||
<a href="#438" id="438">438</a>
|
||||
<a href="#439" id="439">439</a>
|
||||
<a href="#440" id="440">440</a>
|
||||
<a href="#441" id="441">441</a>
|
||||
<a href="#442" id="442">442</a>
|
||||
<a href="#443" id="443">443</a>
|
||||
</pre></div><pre class="rust"><code><span class="comment">// Copyright (C) 2022 Aravinth Manivannan <realaravinth@batsense.net>
|
||||
// SPDX-FileCopyrightText: 2023 Aravinth Manivannan <realaravinth@batsense.net>
|
||||
//
|
||||
@@ -742,6 +750,14 @@
|
||||
captcha_key: <span class="kw-2">&</span>str,
|
||||
difficulty_factor: u32,
|
||||
) -> DBResult<u32>;
|
||||
|
||||
<span class="doccomment">/// Get number of analytics entries that are under a certain duration
|
||||
</span><span class="kw">async fn </span>stats_get_num_logs_under_time(<span class="kw-2">&</span><span class="self">self</span>, duration: u32) -> DBResult<usize>;
|
||||
|
||||
<span class="doccomment">/// Get the entry at a location in the list of analytics entires under a certain time limit
|
||||
/// and sorted in ascending order
|
||||
</span><span class="kw">async fn </span>stats_get_entry_at_location_for_time_limit_asc(<span class="kw-2">&</span><span class="self">self</span>, duration: u32, location: u32) -> DBResult<<span class="prelude-ty">Option</span><usize>>;
|
||||
|
||||
}
|
||||
|
||||
<span class="attr">#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq)]
|
||||
|
||||
@@ -373,6 +373,67 @@
|
||||
<a href="#373" id="373">373</a>
|
||||
<a href="#374" id="374">374</a>
|
||||
<a href="#375" id="375">375</a>
|
||||
<a href="#376" id="376">376</a>
|
||||
<a href="#377" id="377">377</a>
|
||||
<a href="#378" id="378">378</a>
|
||||
<a href="#379" id="379">379</a>
|
||||
<a href="#380" id="380">380</a>
|
||||
<a href="#381" id="381">381</a>
|
||||
<a href="#382" id="382">382</a>
|
||||
<a href="#383" id="383">383</a>
|
||||
<a href="#384" id="384">384</a>
|
||||
<a href="#385" id="385">385</a>
|
||||
<a href="#386" id="386">386</a>
|
||||
<a href="#387" id="387">387</a>
|
||||
<a href="#388" id="388">388</a>
|
||||
<a href="#389" id="389">389</a>
|
||||
<a href="#390" id="390">390</a>
|
||||
<a href="#391" id="391">391</a>
|
||||
<a href="#392" id="392">392</a>
|
||||
<a href="#393" id="393">393</a>
|
||||
<a href="#394" id="394">394</a>
|
||||
<a href="#395" id="395">395</a>
|
||||
<a href="#396" id="396">396</a>
|
||||
<a href="#397" id="397">397</a>
|
||||
<a href="#398" id="398">398</a>
|
||||
<a href="#399" id="399">399</a>
|
||||
<a href="#400" id="400">400</a>
|
||||
<a href="#401" id="401">401</a>
|
||||
<a href="#402" id="402">402</a>
|
||||
<a href="#403" id="403">403</a>
|
||||
<a href="#404" id="404">404</a>
|
||||
<a href="#405" id="405">405</a>
|
||||
<a href="#406" id="406">406</a>
|
||||
<a href="#407" id="407">407</a>
|
||||
<a href="#408" id="408">408</a>
|
||||
<a href="#409" id="409">409</a>
|
||||
<a href="#410" id="410">410</a>
|
||||
<a href="#411" id="411">411</a>
|
||||
<a href="#412" id="412">412</a>
|
||||
<a href="#413" id="413">413</a>
|
||||
<a href="#414" id="414">414</a>
|
||||
<a href="#415" id="415">415</a>
|
||||
<a href="#416" id="416">416</a>
|
||||
<a href="#417" id="417">417</a>
|
||||
<a href="#418" id="418">418</a>
|
||||
<a href="#419" id="419">419</a>
|
||||
<a href="#420" id="420">420</a>
|
||||
<a href="#421" id="421">421</a>
|
||||
<a href="#422" id="422">422</a>
|
||||
<a href="#423" id="423">423</a>
|
||||
<a href="#424" id="424">424</a>
|
||||
<a href="#425" id="425">425</a>
|
||||
<a href="#426" id="426">426</a>
|
||||
<a href="#427" id="427">427</a>
|
||||
<a href="#428" id="428">428</a>
|
||||
<a href="#429" id="429">429</a>
|
||||
<a href="#430" id="430">430</a>
|
||||
<a href="#431" id="431">431</a>
|
||||
<a href="#432" id="432">432</a>
|
||||
<a href="#433" id="433">433</a>
|
||||
<a href="#434" id="434">434</a>
|
||||
<a href="#435" id="435">435</a>
|
||||
<a href="#436" id="436">436</a>
|
||||
</pre></div><pre class="rust"><code><span class="comment">// Copyright (C) 2022 Aravinth Manivannan <realaravinth@batsense.net>
|
||||
// SPDX-FileCopyrightText: 2023 Aravinth Manivannan <realaravinth@batsense.net>
|
||||
//
|
||||
@@ -382,6 +443,29 @@
|
||||
</span><span class="kw">use </span><span class="kw">crate</span>::errors::<span class="kw-2">*</span>;
|
||||
<span class="kw">use </span><span class="kw">crate</span>::prelude::<span class="kw-2">*</span>;
|
||||
|
||||
<span class="doccomment">/// easy traffic pattern
|
||||
</span><span class="kw">pub const </span>TRAFFIC_PATTERN: TrafficPattern = TrafficPattern {
|
||||
avg_traffic: <span class="number">500</span>,
|
||||
peak_sustainable_traffic: <span class="number">5_000</span>,
|
||||
broke_my_site_traffic: <span class="prelude-val">Some</span>(<span class="number">10_000</span>),
|
||||
};
|
||||
|
||||
<span class="doccomment">/// levels for complex captcha config
|
||||
</span><span class="kw">pub const </span>LEVELS: [Level; <span class="number">3</span>] = [
|
||||
Level {
|
||||
difficulty_factor: <span class="number">1</span>,
|
||||
visitor_threshold: <span class="number">1</span>,
|
||||
},
|
||||
Level {
|
||||
difficulty_factor: <span class="number">2</span>,
|
||||
visitor_threshold: <span class="number">2</span>,
|
||||
},
|
||||
Level {
|
||||
difficulty_factor: <span class="number">3</span>,
|
||||
visitor_threshold: <span class="number">3</span>,
|
||||
},
|
||||
];
|
||||
|
||||
<span class="doccomment">/// test all database functions
|
||||
</span><span class="kw">pub async fn </span>database_works<<span class="lifetime">'a</span>, T: MCDatabase>(
|
||||
db: <span class="kw-2">&</span>T,
|
||||
@@ -625,7 +709,6 @@
|
||||
db.record_confirm(c.key).<span class="kw">await</span>.unwrap();
|
||||
|
||||
<span class="comment">// analytics start
|
||||
|
||||
</span>db.analytics_create_psuedo_id_if_not_exists(c.key)
|
||||
.<span class="kw">await
|
||||
</span>.unwrap();
|
||||
@@ -657,11 +740,17 @@
|
||||
);
|
||||
|
||||
<span class="kw">let </span>analytics = CreatePerformanceAnalytics {
|
||||
time: <span class="number">0</span>,
|
||||
difficulty_factor: <span class="number">0</span>,
|
||||
time: <span class="number">1</span>,
|
||||
difficulty_factor: <span class="number">1</span>,
|
||||
worker_type: <span class="string">"wasm"</span>.into(),
|
||||
};
|
||||
|
||||
|
||||
<span class="macro">assert_eq!</span>(db.stats_get_num_logs_under_time(analytics.time).<span class="kw">await</span>.unwrap(), <span class="number">0</span>);
|
||||
|
||||
db.analysis_save(c.key, <span class="kw-2">&</span>analytics).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert_eq!</span>(db.stats_get_num_logs_under_time(analytics.time).<span class="kw">await</span>.unwrap(), <span class="number">1</span>);
|
||||
<span class="macro">assert_eq!</span>(db.stats_get_num_logs_under_time(analytics.time - <span class="number">1</span>).<span class="kw">await</span>.unwrap(), <span class="number">0</span>);
|
||||
<span class="kw">let </span>limit = <span class="number">50</span>;
|
||||
<span class="kw">let </span><span class="kw-2">mut </span>offset = <span class="number">0</span>;
|
||||
<span class="kw">let </span>a = db.analytics_fetch(c.key, limit, offset).<span class="kw">await</span>.unwrap();
|
||||
@@ -680,6 +769,39 @@
|
||||
</span>.unwrap();
|
||||
<span class="macro">assert_eq!</span>(db.analytics_fetch(c.key, <span class="number">1000</span>, <span class="number">0</span>).<span class="kw">await</span>.unwrap().len(), <span class="number">0</span>);
|
||||
<span class="macro">assert!</span>(!db.analytics_captcha_is_published(c.key).<span class="kw">await</span>.unwrap());
|
||||
|
||||
<span class="kw">let </span>rest_analytics= [
|
||||
CreatePerformanceAnalytics {
|
||||
time: <span class="number">2</span>,
|
||||
difficulty_factor: <span class="number">2</span>,
|
||||
worker_type: <span class="string">"wasm"</span>.into(),
|
||||
},
|
||||
CreatePerformanceAnalytics {
|
||||
time: <span class="number">3</span>,
|
||||
difficulty_factor: <span class="number">3</span>,
|
||||
worker_type: <span class="string">"wasm"</span>.into(),
|
||||
},
|
||||
|
||||
CreatePerformanceAnalytics {
|
||||
time: <span class="number">4</span>,
|
||||
difficulty_factor: <span class="number">4</span>,
|
||||
worker_type: <span class="string">"wasm"</span>.into(),
|
||||
},
|
||||
|
||||
CreatePerformanceAnalytics {
|
||||
time: <span class="number">5</span>,
|
||||
difficulty_factor: <span class="number">5</span>,
|
||||
worker_type: <span class="string">"wasm"</span>.into(),
|
||||
},
|
||||
];
|
||||
<span class="kw">for </span>a <span class="kw">in </span>rest_analytics.iter() {
|
||||
db.analysis_save(c.key, <span class="kw-2">&</span>a).<span class="kw">await</span>.unwrap();
|
||||
}
|
||||
<span class="macro">assert!</span>(db.stats_get_entry_at_location_for_time_limit_asc(<span class="number">1</span>, <span class="number">2</span>).<span class="kw">await</span>.unwrap().is_none());
|
||||
<span class="macro">assert_eq!</span>(db.stats_get_entry_at_location_for_time_limit_asc(<span class="number">2</span>, <span class="number">1</span>).<span class="kw">await</span>.unwrap(), <span class="prelude-val">Some</span>(<span class="number">2</span>));
|
||||
<span class="macro">assert_eq!</span>(db.stats_get_entry_at_location_for_time_limit_asc(<span class="number">3</span>, <span class="number">2</span>).<span class="kw">await</span>.unwrap(), <span class="prelude-val">Some</span>(<span class="number">3</span>));
|
||||
|
||||
|
||||
db.analytics_delete_all_records_for_campaign(c.key)
|
||||
.<span class="kw">await
|
||||
</span>.unwrap();
|
||||
|
||||
@@ -1288,6 +1288,64 @@
|
||||
<a href="#1288" id="1288">1288</a>
|
||||
<a href="#1289" id="1289">1289</a>
|
||||
<a href="#1290" id="1290">1290</a>
|
||||
<a href="#1291" id="1291">1291</a>
|
||||
<a href="#1292" id="1292">1292</a>
|
||||
<a href="#1293" id="1293">1293</a>
|
||||
<a href="#1294" id="1294">1294</a>
|
||||
<a href="#1295" id="1295">1295</a>
|
||||
<a href="#1296" id="1296">1296</a>
|
||||
<a href="#1297" id="1297">1297</a>
|
||||
<a href="#1298" id="1298">1298</a>
|
||||
<a href="#1299" id="1299">1299</a>
|
||||
<a href="#1300" id="1300">1300</a>
|
||||
<a href="#1301" id="1301">1301</a>
|
||||
<a href="#1302" id="1302">1302</a>
|
||||
<a href="#1303" id="1303">1303</a>
|
||||
<a href="#1304" id="1304">1304</a>
|
||||
<a href="#1305" id="1305">1305</a>
|
||||
<a href="#1306" id="1306">1306</a>
|
||||
<a href="#1307" id="1307">1307</a>
|
||||
<a href="#1308" id="1308">1308</a>
|
||||
<a href="#1309" id="1309">1309</a>
|
||||
<a href="#1310" id="1310">1310</a>
|
||||
<a href="#1311" id="1311">1311</a>
|
||||
<a href="#1312" id="1312">1312</a>
|
||||
<a href="#1313" id="1313">1313</a>
|
||||
<a href="#1314" id="1314">1314</a>
|
||||
<a href="#1315" id="1315">1315</a>
|
||||
<a href="#1316" id="1316">1316</a>
|
||||
<a href="#1317" id="1317">1317</a>
|
||||
<a href="#1318" id="1318">1318</a>
|
||||
<a href="#1319" id="1319">1319</a>
|
||||
<a href="#1320" id="1320">1320</a>
|
||||
<a href="#1321" id="1321">1321</a>
|
||||
<a href="#1322" id="1322">1322</a>
|
||||
<a href="#1323" id="1323">1323</a>
|
||||
<a href="#1324" id="1324">1324</a>
|
||||
<a href="#1325" id="1325">1325</a>
|
||||
<a href="#1326" id="1326">1326</a>
|
||||
<a href="#1327" id="1327">1327</a>
|
||||
<a href="#1328" id="1328">1328</a>
|
||||
<a href="#1329" id="1329">1329</a>
|
||||
<a href="#1330" id="1330">1330</a>
|
||||
<a href="#1331" id="1331">1331</a>
|
||||
<a href="#1332" id="1332">1332</a>
|
||||
<a href="#1333" id="1333">1333</a>
|
||||
<a href="#1334" id="1334">1334</a>
|
||||
<a href="#1335" id="1335">1335</a>
|
||||
<a href="#1336" id="1336">1336</a>
|
||||
<a href="#1337" id="1337">1337</a>
|
||||
<a href="#1338" id="1338">1338</a>
|
||||
<a href="#1339" id="1339">1339</a>
|
||||
<a href="#1340" id="1340">1340</a>
|
||||
<a href="#1341" id="1341">1341</a>
|
||||
<a href="#1342" id="1342">1342</a>
|
||||
<a href="#1343" id="1343">1343</a>
|
||||
<a href="#1344" id="1344">1344</a>
|
||||
<a href="#1345" id="1345">1345</a>
|
||||
<a href="#1346" id="1346">1346</a>
|
||||
<a href="#1347" id="1347">1347</a>
|
||||
<a href="#1348" id="1348">1348</a>
|
||||
</pre></div><pre class="rust"><code><span class="comment">// Copyright (C) 2022 Aravinth Manivannan <realaravinth@batsense.net>
|
||||
// SPDX-FileCopyrightText: 2023 Aravinth Manivannan <realaravinth@batsense.net>
|
||||
//
|
||||
@@ -2509,6 +2567,64 @@
|
||||
<span class="prelude-val">Ok</span>(res.nonce <span class="kw">as </span>u32)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
<span class="doccomment">/// Get number of analytics entries that are under a certain duration
|
||||
</span><span class="kw">async fn </span>stats_get_num_logs_under_time(<span class="kw-2">&</span><span class="self">self</span>, duration: u32) -> DBResult<usize> {
|
||||
|
||||
<span class="kw">struct </span>Count {
|
||||
count: <span class="prelude-ty">Option</span><i64>,
|
||||
}
|
||||
|
||||
<span class="comment">//"SELECT COUNT(*) FROM (SELECT difficulty_factor FROM mcaptcha_pow_analytics WHERE time <= ?) as count",
|
||||
</span><span class="kw">let </span>count = <span class="macro">sqlx::query_as!</span>(
|
||||
Count,
|
||||
<span class="string">"SELECT
|
||||
COUNT(difficulty_factor) AS count
|
||||
FROM
|
||||
mcaptcha_pow_analytics
|
||||
WHERE time <= ?;"</span>,
|
||||
duration <span class="kw">as </span>i32,
|
||||
)
|
||||
.fetch_one(<span class="kw-2">&</span><span class="self">self</span>.pool)
|
||||
.<span class="kw">await
|
||||
</span>.map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))<span class="question-mark">?</span>;
|
||||
|
||||
<span class="prelude-val">Ok</span>(count.count.unwrap_or_else(|| <span class="number">0</span>) <span class="kw">as </span>usize)
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Get the entry at a location in the list of analytics entires under a certain time limited
|
||||
/// and sorted in ascending order
|
||||
</span><span class="kw">async fn </span>stats_get_entry_at_location_for_time_limit_asc(<span class="kw-2">&</span><span class="self">self</span>, duration: u32, location: u32) -> DBResult<<span class="prelude-ty">Option</span><usize>> {
|
||||
|
||||
|
||||
<span class="kw">struct </span>Difficulty {
|
||||
difficulty_factor: <span class="prelude-ty">Option</span><i32>,
|
||||
}
|
||||
|
||||
<span class="kw">match </span><span class="macro">sqlx::query_as!</span>(
|
||||
Difficulty,
|
||||
<span class="string">"SELECT
|
||||
difficulty_factor
|
||||
FROM
|
||||
mcaptcha_pow_analytics
|
||||
WHERE
|
||||
time <= ?
|
||||
ORDER BY difficulty_factor ASC LIMIT 1 OFFSET ?;"</span>,
|
||||
duration <span class="kw">as </span>i32,
|
||||
location <span class="kw">as </span>i64 - <span class="number">1</span>,
|
||||
)
|
||||
.fetch_one(<span class="kw-2">&</span><span class="self">self</span>.pool)
|
||||
.<span class="kw">await
|
||||
</span>{
|
||||
<span class="prelude-val">Ok</span>(res) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(res.difficulty_factor.unwrap() <span class="kw">as </span>usize)),
|
||||
<span class="prelude-val">Err</span>(sqlx::Error::RowNotFound) => <span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>),
|
||||
<span class="prelude-val">Err</span>(e) => <span class="prelude-val">Err</span>(map_row_not_found_err(e, DBError::CaptchaNotFound))
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
<span class="attr">#[derive(Clone)]
|
||||
|
||||
@@ -1296,6 +1296,59 @@
|
||||
<a href="#1296" id="1296">1296</a>
|
||||
<a href="#1297" id="1297">1297</a>
|
||||
<a href="#1298" id="1298">1298</a>
|
||||
<a href="#1299" id="1299">1299</a>
|
||||
<a href="#1300" id="1300">1300</a>
|
||||
<a href="#1301" id="1301">1301</a>
|
||||
<a href="#1302" id="1302">1302</a>
|
||||
<a href="#1303" id="1303">1303</a>
|
||||
<a href="#1304" id="1304">1304</a>
|
||||
<a href="#1305" id="1305">1305</a>
|
||||
<a href="#1306" id="1306">1306</a>
|
||||
<a href="#1307" id="1307">1307</a>
|
||||
<a href="#1308" id="1308">1308</a>
|
||||
<a href="#1309" id="1309">1309</a>
|
||||
<a href="#1310" id="1310">1310</a>
|
||||
<a href="#1311" id="1311">1311</a>
|
||||
<a href="#1312" id="1312">1312</a>
|
||||
<a href="#1313" id="1313">1313</a>
|
||||
<a href="#1314" id="1314">1314</a>
|
||||
<a href="#1315" id="1315">1315</a>
|
||||
<a href="#1316" id="1316">1316</a>
|
||||
<a href="#1317" id="1317">1317</a>
|
||||
<a href="#1318" id="1318">1318</a>
|
||||
<a href="#1319" id="1319">1319</a>
|
||||
<a href="#1320" id="1320">1320</a>
|
||||
<a href="#1321" id="1321">1321</a>
|
||||
<a href="#1322" id="1322">1322</a>
|
||||
<a href="#1323" id="1323">1323</a>
|
||||
<a href="#1324" id="1324">1324</a>
|
||||
<a href="#1325" id="1325">1325</a>
|
||||
<a href="#1326" id="1326">1326</a>
|
||||
<a href="#1327" id="1327">1327</a>
|
||||
<a href="#1328" id="1328">1328</a>
|
||||
<a href="#1329" id="1329">1329</a>
|
||||
<a href="#1330" id="1330">1330</a>
|
||||
<a href="#1331" id="1331">1331</a>
|
||||
<a href="#1332" id="1332">1332</a>
|
||||
<a href="#1333" id="1333">1333</a>
|
||||
<a href="#1334" id="1334">1334</a>
|
||||
<a href="#1335" id="1335">1335</a>
|
||||
<a href="#1336" id="1336">1336</a>
|
||||
<a href="#1337" id="1337">1337</a>
|
||||
<a href="#1338" id="1338">1338</a>
|
||||
<a href="#1339" id="1339">1339</a>
|
||||
<a href="#1340" id="1340">1340</a>
|
||||
<a href="#1341" id="1341">1341</a>
|
||||
<a href="#1342" id="1342">1342</a>
|
||||
<a href="#1343" id="1343">1343</a>
|
||||
<a href="#1344" id="1344">1344</a>
|
||||
<a href="#1345" id="1345">1345</a>
|
||||
<a href="#1346" id="1346">1346</a>
|
||||
<a href="#1347" id="1347">1347</a>
|
||||
<a href="#1348" id="1348">1348</a>
|
||||
<a href="#1349" id="1349">1349</a>
|
||||
<a href="#1350" id="1350">1350</a>
|
||||
<a href="#1351" id="1351">1351</a>
|
||||
</pre></div><pre class="rust"><code><span class="comment">// Copyright (C) 2022 Aravinth Manivannan <realaravinth@batsense.net>
|
||||
// SPDX-FileCopyrightText: 2023 Aravinth Manivannan <realaravinth@batsense.net>
|
||||
//
|
||||
@@ -2525,6 +2578,59 @@
|
||||
<span class="prelude-val">Ok</span>(res.nonce <span class="kw">as </span>u32)
|
||||
}
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Get number of analytics entries that are under a certain duration
|
||||
</span><span class="kw">async fn </span>stats_get_num_logs_under_time(<span class="kw-2">&</span><span class="self">self</span>, duration: u32) -> DBResult<usize> {
|
||||
|
||||
<span class="kw">struct </span>Count {
|
||||
count: <span class="prelude-ty">Option</span><i64>,
|
||||
}
|
||||
|
||||
<span class="kw">let </span>count = <span class="macro">sqlx::query_as!</span>(
|
||||
Count,
|
||||
<span class="string">"SELECT COUNT(difficulty_factor) FROM mcaptcha_pow_analytics WHERE time <= $1;"</span>,
|
||||
duration <span class="kw">as </span>i32,
|
||||
)
|
||||
.fetch_one(<span class="kw-2">&</span><span class="self">self</span>.pool)
|
||||
.<span class="kw">await
|
||||
</span>.map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))<span class="question-mark">?</span>;
|
||||
|
||||
<span class="prelude-val">Ok</span>(count.count.unwrap_or_else(|| <span class="number">0</span>) <span class="kw">as </span>usize)
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Get the entry at a location in the list of analytics entires under a certain time limit
|
||||
/// and sorted in ascending order
|
||||
</span><span class="kw">async fn </span>stats_get_entry_at_location_for_time_limit_asc(<span class="kw-2">&</span><span class="self">self</span>, duration: u32, location: u32) -> DBResult<<span class="prelude-ty">Option</span><usize>> {
|
||||
|
||||
|
||||
<span class="kw">struct </span>Difficulty {
|
||||
difficulty_factor: <span class="prelude-ty">Option</span><i32>,
|
||||
}
|
||||
|
||||
<span class="kw">match </span><span class="macro">sqlx::query_as!</span>(
|
||||
Difficulty,
|
||||
<span class="string">"SELECT
|
||||
difficulty_factor
|
||||
FROM
|
||||
mcaptcha_pow_analytics
|
||||
WHERE
|
||||
time <= $1
|
||||
ORDER BY difficulty_factor ASC LIMIT 1 OFFSET $2;"</span>,
|
||||
duration <span class="kw">as </span>i32,
|
||||
location <span class="kw">as </span>i64 - <span class="number">1</span>,
|
||||
)
|
||||
.fetch_one(<span class="kw-2">&</span><span class="self">self</span>.pool)
|
||||
.<span class="kw">await
|
||||
</span>{
|
||||
<span class="prelude-val">Ok</span>(res) => <span class="prelude-val">Ok</span>(<span class="prelude-val">Some</span>(res.difficulty_factor.unwrap() <span class="kw">as </span>usize)),
|
||||
<span class="prelude-val">Err</span>(sqlx::Error::RowNotFound) => <span class="prelude-val">Ok</span>(<span class="prelude-val">None</span>),
|
||||
<span class="prelude-val">Err</span>(e) => <span class="prelude-val">Err</span>(map_row_not_found_err(e, DBError::CaptchaNotFound))
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
<span class="attr">#[derive(Clone)]
|
||||
|
||||
Reference in New Issue
Block a user