|
@@ -1,6 +1,5 @@
|
|
-use std::{cell::RefCell, collections::HashMap, fmt::Write, future::Future};
|
|
|
|
|
|
+use std::{cell::RefCell, collections::HashMap, fmt::Write};
|
|
|
|
|
|
-use futures_util::future::{try_join, try_join_all, TryFutureExt};
|
|
|
|
use xitca_postgres::{statement::Statement, AsyncIterator, Postgres};
|
|
use xitca_postgres::{statement::Statement, AsyncIterator, Postgres};
|
|
use xitca_unsafe_collection::no_hash::NoHashBuilder;
|
|
use xitca_unsafe_collection::no_hash::NoHashBuilder;
|
|
|
|
|
|
@@ -82,7 +81,8 @@ pub async fn create(config: &str) -> HandleResult<Client> {
|
|
}
|
|
}
|
|
|
|
|
|
impl Client {
|
|
impl Client {
|
|
- async fn query_one_world(&self, id: i32) -> HandleResult<World> {
|
|
|
|
|
|
+ pub async fn get_world(&self) -> HandleResult<World> {
|
|
|
|
+ let id = self.rng.borrow_mut().gen_id();
|
|
self.client
|
|
self.client
|
|
.query_raw(&self.world, [id])
|
|
.query_raw(&self.world, [id])
|
|
.await?
|
|
.await?
|
|
@@ -93,15 +93,25 @@ impl Client {
|
|
.map_err(Into::into)
|
|
.map_err(Into::into)
|
|
}
|
|
}
|
|
|
|
|
|
- pub fn get_world(&self) -> impl Future<Output = HandleResult<World>> + '_ {
|
|
|
|
- let id = self.rng.borrow_mut().gen_id();
|
|
|
|
- self.query_one_world(id)
|
|
|
|
- }
|
|
|
|
|
|
+ pub async fn get_worlds(&self, num: u16) -> HandleResult<Vec<World>> {
|
|
|
|
+ let mut pipe = self.client.pipeline();
|
|
|
|
+
|
|
|
|
+ {
|
|
|
|
+ let mut rng = self.rng.borrow_mut();
|
|
|
|
+ (0..num).try_for_each(|_| pipe.query_raw(&self.world, [rng.gen_id()]))?;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let mut worlds = Vec::new();
|
|
|
|
+ worlds.reserve(num as usize);
|
|
|
|
+
|
|
|
|
+ let mut res = pipe.run().await?;
|
|
|
|
+ while let Some(mut item) = res.next().await.transpose()? {
|
|
|
|
+ while let Some(row) = item.next().await.transpose()? {
|
|
|
|
+ worlds.push(World::new(row.get_raw(0), row.get_raw(1)))
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
- pub fn get_worlds(&self, num: u16) -> impl Future<Output = HandleResult<Vec<World>>> + '_ {
|
|
|
|
- let mut rng = self.rng.borrow_mut();
|
|
|
|
- let gets = (0..num).map(|_| self.query_one_world(rng.gen_id()));
|
|
|
|
- try_join_all(gets)
|
|
|
|
|
|
+ Ok(worlds)
|
|
}
|
|
}
|
|
|
|
|
|
pub async fn update(&self, num: u16) -> HandleResult<Vec<World>> {
|
|
pub async fn update(&self, num: u16) -> HandleResult<Vec<World>> {
|
|
@@ -110,41 +120,45 @@ impl Client {
|
|
let mut params = Vec::new();
|
|
let mut params = Vec::new();
|
|
params.reserve(len * 3);
|
|
params.reserve(len * 3);
|
|
|
|
|
|
- let gets = {
|
|
|
|
|
|
+ let mut pipe = self.client.pipeline();
|
|
|
|
+
|
|
|
|
+ {
|
|
let mut rng = self.rng.borrow_mut();
|
|
let mut rng = self.rng.borrow_mut();
|
|
- let gets = (0..num).map(|_| {
|
|
|
|
|
|
+ (0..num).try_for_each(|_| {
|
|
let w_id = rng.gen_id();
|
|
let w_id = rng.gen_id();
|
|
let r_id = rng.gen_id();
|
|
let r_id = rng.gen_id();
|
|
- params.push(w_id);
|
|
|
|
- params.push(r_id);
|
|
|
|
- self.query_one_world(w_id).map_ok(move |mut world| {
|
|
|
|
- world.randomnumber = r_id;
|
|
|
|
- world
|
|
|
|
- })
|
|
|
|
- });
|
|
|
|
- try_join_all(gets)
|
|
|
|
- };
|
|
|
|
|
|
+ params.extend([w_id, r_id]);
|
|
|
|
+ pipe.query_raw(&self.world, [w_id])
|
|
|
|
+ })?;
|
|
|
|
+ }
|
|
|
|
|
|
params.extend_from_within(..len);
|
|
params.extend_from_within(..len);
|
|
-
|
|
|
|
let st = self.updates.get(&num).unwrap();
|
|
let st = self.updates.get(&num).unwrap();
|
|
- let update = self.client.execute_raw(st, ¶ms).map_err(Into::into);
|
|
|
|
|
|
+ pipe.query_raw(st, ¶ms)?;
|
|
|
|
+
|
|
|
|
+ let mut worlds = Vec::new();
|
|
|
|
+ worlds.reserve(len);
|
|
|
|
+ let mut r_ids = params.into_iter().skip(1).step_by(2);
|
|
|
|
+
|
|
|
|
+ let mut res = pipe.run().await?;
|
|
|
|
+ while let Some(mut item) = res.next().await.transpose()? {
|
|
|
|
+ while let Some(row) = item.next().await.transpose()? {
|
|
|
|
+ let r_id = r_ids.next().unwrap();
|
|
|
|
+ worlds.push(World::new(row.get_raw(0), r_id))
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
- try_join(gets, update).await.map(|(world, _)| world)
|
|
|
|
|
|
+ Ok(worlds)
|
|
}
|
|
}
|
|
|
|
|
|
pub async fn tell_fortune(&self) -> HandleResult<Fortunes> {
|
|
pub async fn tell_fortune(&self) -> HandleResult<Fortunes> {
|
|
let mut items = Vec::with_capacity(32);
|
|
let mut items = Vec::with_capacity(32);
|
|
-
|
|
|
|
items.push(Fortune::new(0, "Additional fortune added at request time."));
|
|
items.push(Fortune::new(0, "Additional fortune added at request time."));
|
|
|
|
|
|
let mut stream = self.client.query_raw::<[i32; 0]>(&self.fortune, []).await?;
|
|
let mut stream = self.client.query_raw::<[i32; 0]>(&self.fortune, []).await?;
|
|
-
|
|
|
|
- while let Some(row) = stream.next().await {
|
|
|
|
- let row = row?;
|
|
|
|
|
|
+ while let Some(row) = stream.next().await.transpose()? {
|
|
items.push(Fortune::new(row.get_raw(0), row.get_raw::<String>(1)));
|
|
items.push(Fortune::new(row.get_raw(0), row.get_raw::<String>(1)));
|
|
}
|
|
}
|
|
-
|
|
|
|
items.sort_by(|it, next| it.message.cmp(&next.message));
|
|
items.sort_by(|it, next| it.message.cmp(&next.message));
|
|
|
|
|
|
Ok(Fortunes::new(items))
|
|
Ok(Fortunes::new(items))
|