parent
e40c351676
commit
fff0c87a6d
@ -13,7 +13,7 @@ use serde::{Deserialize, Serialize};
|
|||||||
use std::env;
|
use std::env;
|
||||||
use tera::Tera;
|
use tera::Tera;
|
||||||
|
|
||||||
const DEFAULT_POSTS_PER_PAGE: usize = 5;
|
const DEFAULT_POSTS_PER_PAGE: u64 = 5;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
struct AppState {
|
struct AppState {
|
||||||
@ -22,8 +22,8 @@ struct AppState {
|
|||||||
}
|
}
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
pub struct Params {
|
pub struct Params {
|
||||||
page: Option<usize>,
|
page: Option<u64>,
|
||||||
posts_per_page: Option<usize>,
|
posts_per_page: Option<u64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
#[derive(Deserialize, Serialize, Debug, Clone)]
|
||||||
|
@ -13,7 +13,7 @@ use serde::{Deserialize, Serialize};
|
|||||||
use std::env;
|
use std::env;
|
||||||
use tera::Tera;
|
use tera::Tera;
|
||||||
|
|
||||||
const DEFAULT_POSTS_PER_PAGE: usize = 5;
|
const DEFAULT_POSTS_PER_PAGE: u64 = 5;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
struct AppState {
|
struct AppState {
|
||||||
@ -23,8 +23,8 @@ struct AppState {
|
|||||||
|
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
pub struct Params {
|
pub struct Params {
|
||||||
page: Option<usize>,
|
page: Option<u64>,
|
||||||
posts_per_page: Option<usize>,
|
posts_per_page: Option<u64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
#[derive(Deserialize, Serialize, Debug, Clone)]
|
||||||
|
@ -72,8 +72,8 @@ async fn main() -> anyhow::Result<()> {
|
|||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
struct Params {
|
struct Params {
|
||||||
page: Option<usize>,
|
page: Option<u64>,
|
||||||
posts_per_page: Option<usize>,
|
posts_per_page: Option<u64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug, Clone)]
|
#[derive(Deserialize, Serialize, Debug, Clone)]
|
||||||
|
@ -16,15 +16,15 @@ use std::net::SocketAddr;
|
|||||||
use tokio::signal::ctrl_c;
|
use tokio::signal::ctrl_c;
|
||||||
use tokio::signal::unix::{signal, SignalKind};
|
use tokio::signal::unix::{signal, SignalKind};
|
||||||
|
|
||||||
const DEFAULT_POSTS_PER_PAGE: usize = 5;
|
const DEFAULT_POSTS_PER_PAGE: u64 = 5;
|
||||||
|
|
||||||
#[rpc(server, client)]
|
#[rpc(server, client)]
|
||||||
pub trait PostRpc {
|
pub trait PostRpc {
|
||||||
#[method(name = "Post.List")]
|
#[method(name = "Post.List")]
|
||||||
async fn list(
|
async fn list(
|
||||||
&self,
|
&self,
|
||||||
page: Option<usize>,
|
page: Option<u64>,
|
||||||
posts_per_page: Option<usize>,
|
posts_per_page: Option<u64>,
|
||||||
) -> RpcResult<Vec<post::Model>>;
|
) -> RpcResult<Vec<post::Model>>;
|
||||||
|
|
||||||
#[method(name = "Post.Insert")]
|
#[method(name = "Post.Insert")]
|
||||||
@ -45,8 +45,8 @@ pub struct PpcImpl {
|
|||||||
impl PostRpcServer for PpcImpl {
|
impl PostRpcServer for PpcImpl {
|
||||||
async fn list(
|
async fn list(
|
||||||
&self,
|
&self,
|
||||||
page: Option<usize>,
|
page: Option<u64>,
|
||||||
posts_per_page: Option<usize>,
|
posts_per_page: Option<u64>,
|
||||||
) -> RpcResult<Vec<post::Model>> {
|
) -> RpcResult<Vec<post::Model>> {
|
||||||
let page = page.unwrap_or(1);
|
let page = page.unwrap_or(1);
|
||||||
let posts_per_page = posts_per_page.unwrap_or(DEFAULT_POSTS_PER_PAGE);
|
let posts_per_page = posts_per_page.unwrap_or(DEFAULT_POSTS_PER_PAGE);
|
||||||
|
@ -12,7 +12,7 @@ use sea_orm::{entity::*, query::*, DatabaseConnection};
|
|||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use tera::Tera;
|
use tera::Tera;
|
||||||
|
|
||||||
const DEFAULT_POSTS_PER_PAGE: usize = 5;
|
const DEFAULT_POSTS_PER_PAGE: u64 = 5;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
struct AppState {
|
struct AppState {
|
||||||
@ -22,8 +22,8 @@ struct AppState {
|
|||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
struct Params {
|
struct Params {
|
||||||
page: Option<usize>,
|
page: Option<u64>,
|
||||||
posts_per_page: Option<usize>,
|
posts_per_page: Option<u64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[handler]
|
#[handler]
|
||||||
|
@ -20,7 +20,7 @@ use pool::Db;
|
|||||||
pub use entity::post;
|
pub use entity::post;
|
||||||
pub use entity::post::Entity as Post;
|
pub use entity::post::Entity as Post;
|
||||||
|
|
||||||
const DEFAULT_POSTS_PER_PAGE: usize = 5;
|
const DEFAULT_POSTS_PER_PAGE: u64 = 5;
|
||||||
|
|
||||||
#[get("/new")]
|
#[get("/new")]
|
||||||
async fn new() -> Template {
|
async fn new() -> Template {
|
||||||
@ -80,8 +80,8 @@ async fn update(
|
|||||||
#[get("/?<page>&<posts_per_page>")]
|
#[get("/?<page>&<posts_per_page>")]
|
||||||
async fn list(
|
async fn list(
|
||||||
conn: Connection<'_, Db>,
|
conn: Connection<'_, Db>,
|
||||||
page: Option<usize>,
|
page: Option<u64>,
|
||||||
posts_per_page: Option<usize>,
|
posts_per_page: Option<u64>,
|
||||||
flash: Option<FlashMessage<'_>>,
|
flash: Option<FlashMessage<'_>>,
|
||||||
) -> Template {
|
) -> Template {
|
||||||
let db = conn.into_inner();
|
let db = conn.into_inner();
|
||||||
|
@ -18,8 +18,8 @@ where
|
|||||||
S: SelectorTrait + 'db,
|
S: SelectorTrait + 'db,
|
||||||
{
|
{
|
||||||
pub(crate) query: SelectStatement,
|
pub(crate) query: SelectStatement,
|
||||||
pub(crate) page: usize,
|
pub(crate) page: u64,
|
||||||
pub(crate) page_size: usize,
|
pub(crate) page_size: u64,
|
||||||
pub(crate) db: &'db C,
|
pub(crate) db: &'db C,
|
||||||
pub(crate) selector: PhantomData<S>,
|
pub(crate) selector: PhantomData<S>,
|
||||||
}
|
}
|
||||||
@ -28,9 +28,9 @@ where
|
|||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct ItemsAndPagesNumber {
|
pub struct ItemsAndPagesNumber {
|
||||||
/// The total number of items of a paginator
|
/// The total number of items of a paginator
|
||||||
pub number_of_items: usize,
|
pub number_of_items: u64,
|
||||||
/// The total number of pages of a paginator
|
/// The total number of pages of a paginator
|
||||||
pub number_of_pages: usize,
|
pub number_of_pages: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
// LINT: warn if paginator is used without an order by clause
|
// LINT: warn if paginator is used without an order by clause
|
||||||
@ -41,7 +41,7 @@ where
|
|||||||
S: SelectorTrait + 'db,
|
S: SelectorTrait + 'db,
|
||||||
{
|
{
|
||||||
/// Fetch a specific page; page index starts from zero
|
/// Fetch a specific page; page index starts from zero
|
||||||
pub async fn fetch_page(&self, page: usize) -> Result<Vec<S::Item>, DbErr> {
|
pub async fn fetch_page(&self, page: u64) -> Result<Vec<S::Item>, DbErr> {
|
||||||
let query = self
|
let query = self
|
||||||
.query
|
.query
|
||||||
.clone()
|
.clone()
|
||||||
@ -65,7 +65,7 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Get the total number of items
|
/// Get the total number of items
|
||||||
pub async fn num_items(&self) -> Result<usize, DbErr> {
|
pub async fn num_items(&self) -> Result<u64, DbErr> {
|
||||||
let builder = self.db.get_database_backend();
|
let builder = self.db.get_database_backend();
|
||||||
let stmt = builder.build(
|
let stmt = builder.build(
|
||||||
SelectStatement::new()
|
SelectStatement::new()
|
||||||
@ -80,14 +80,14 @@ where
|
|||||||
None => return Ok(0),
|
None => return Ok(0),
|
||||||
};
|
};
|
||||||
let num_items = match builder {
|
let num_items = match builder {
|
||||||
DbBackend::Postgres => result.try_get::<i64>("", "num_items")? as usize,
|
DbBackend::Postgres => result.try_get::<i64>("", "num_items")? as u64,
|
||||||
_ => result.try_get::<i32>("", "num_items")? as usize,
|
_ => result.try_get::<i32>("", "num_items")? as u64,
|
||||||
};
|
};
|
||||||
Ok(num_items)
|
Ok(num_items)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the total number of pages
|
/// Get the total number of pages
|
||||||
pub async fn num_pages(&self) -> Result<usize, DbErr> {
|
pub async fn num_pages(&self) -> Result<u64, DbErr> {
|
||||||
let num_items = self.num_items().await?;
|
let num_items = self.num_items().await?;
|
||||||
let num_pages = self.compute_pages_number(num_items);
|
let num_pages = self.compute_pages_number(num_items);
|
||||||
Ok(num_pages)
|
Ok(num_pages)
|
||||||
@ -105,8 +105,8 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Compute the number of pages for the current page
|
/// Compute the number of pages for the current page
|
||||||
fn compute_pages_number(&self, num_items: usize) -> usize {
|
fn compute_pages_number(&self, num_items: u64) -> u64 {
|
||||||
(num_items / self.page_size) + (num_items % self.page_size > 0) as usize
|
(num_items / self.page_size) + (num_items % self.page_size > 0) as u64
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Increment the page counter
|
/// Increment the page counter
|
||||||
@ -115,7 +115,7 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Get current page number
|
/// Get current page number
|
||||||
pub fn cur_page(&self) -> usize {
|
pub fn cur_page(&self) -> u64 {
|
||||||
self.page
|
self.page
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -215,10 +215,10 @@ where
|
|||||||
type Selector: SelectorTrait + Send + Sync + 'db;
|
type Selector: SelectorTrait + Send + Sync + 'db;
|
||||||
|
|
||||||
/// Paginate the result of a select operation.
|
/// Paginate the result of a select operation.
|
||||||
fn paginate(self, db: &'db C, page_size: usize) -> Paginator<'db, C, Self::Selector>;
|
fn paginate(self, db: &'db C, page_size: u64) -> Paginator<'db, C, Self::Selector>;
|
||||||
|
|
||||||
/// Perform a count on the paginated results
|
/// Perform a count on the paginated results
|
||||||
async fn count(self, db: &'db C) -> Result<usize, DbErr>
|
async fn count(self, db: &'db C) -> Result<u64, DbErr>
|
||||||
where
|
where
|
||||||
Self: Send + Sized,
|
Self: Send + Sized,
|
||||||
{
|
{
|
||||||
@ -233,7 +233,7 @@ where
|
|||||||
{
|
{
|
||||||
type Selector = S;
|
type Selector = S;
|
||||||
|
|
||||||
fn paginate(self, db: &'db C, page_size: usize) -> Paginator<'db, C, S> {
|
fn paginate(self, db: &'db C, page_size: u64) -> Paginator<'db, C, S> {
|
||||||
Paginator {
|
Paginator {
|
||||||
query: self.query,
|
query: self.query,
|
||||||
page: 0,
|
page: 0,
|
||||||
@ -250,7 +250,7 @@ where
|
|||||||
S: SelectorTrait + Send + Sync + 'db,
|
S: SelectorTrait + Send + Sync + 'db,
|
||||||
{
|
{
|
||||||
type Selector = S;
|
type Selector = S;
|
||||||
fn paginate(self, db: &'db C, page_size: usize) -> Paginator<'db, C, S> {
|
fn paginate(self, db: &'db C, page_size: u64) -> Paginator<'db, C, S> {
|
||||||
let sql = &self.stmt.sql[6..];
|
let sql = &self.stmt.sql[6..];
|
||||||
let mut query = SelectStatement::new();
|
let mut query = SelectStatement::new();
|
||||||
query.expr(if let Some(values) = self.stmt.values {
|
query.expr(if let Some(values) = self.stmt.values {
|
||||||
@ -277,7 +277,7 @@ where
|
|||||||
{
|
{
|
||||||
type Selector = SelectModel<M>;
|
type Selector = SelectModel<M>;
|
||||||
|
|
||||||
fn paginate(self, db: &'db C, page_size: usize) -> Paginator<'db, C, Self::Selector> {
|
fn paginate(self, db: &'db C, page_size: u64) -> Paginator<'db, C, Self::Selector> {
|
||||||
self.into_model().paginate(db, page_size)
|
self.into_model().paginate(db, page_size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -292,7 +292,7 @@ where
|
|||||||
{
|
{
|
||||||
type Selector = SelectTwoModel<M, N>;
|
type Selector = SelectTwoModel<M, N>;
|
||||||
|
|
||||||
fn paginate(self, db: &'db C, page_size: usize) -> Paginator<'db, C, Self::Selector> {
|
fn paginate(self, db: &'db C, page_size: u64) -> Paginator<'db, C, Self::Selector> {
|
||||||
self.into_model().paginate(db, page_size)
|
self.into_model().paginate(db, page_size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -492,9 +492,9 @@ mod tests {
|
|||||||
async fn num_pages() -> Result<(), DbErr> {
|
async fn num_pages() -> Result<(), DbErr> {
|
||||||
let (db, num_items) = setup_num_items();
|
let (db, num_items) = setup_num_items();
|
||||||
|
|
||||||
let num_items = num_items as usize;
|
let num_items = num_items as u64;
|
||||||
let page_size = 2_usize;
|
let page_size = 2_u64;
|
||||||
let num_pages = (num_items / page_size) + (num_items % page_size > 0) as usize;
|
let num_pages = (num_items / page_size) + (num_items % page_size > 0) as u64;
|
||||||
let paginator = fruit::Entity::find().paginate(&db, page_size);
|
let paginator = fruit::Entity::find().paginate(&db, page_size);
|
||||||
|
|
||||||
assert_eq!(paginator.num_pages().await?, num_pages);
|
assert_eq!(paginator.num_pages().await?, num_pages);
|
||||||
@ -524,9 +524,9 @@ mod tests {
|
|||||||
async fn num_pages_raw() -> Result<(), DbErr> {
|
async fn num_pages_raw() -> Result<(), DbErr> {
|
||||||
let (db, num_items) = setup_num_items();
|
let (db, num_items) = setup_num_items();
|
||||||
|
|
||||||
let num_items = num_items as usize;
|
let num_items = num_items as u64;
|
||||||
let page_size = 2_usize;
|
let page_size = 2_u64;
|
||||||
let num_pages = (num_items / page_size) + (num_items % page_size > 0) as usize;
|
let num_pages = (num_items / page_size) + (num_items % page_size > 0) as u64;
|
||||||
let paginator = fruit::Entity::find()
|
let paginator = fruit::Entity::find()
|
||||||
.from_raw_sql(RAW_STMT.clone())
|
.from_raw_sql(RAW_STMT.clone())
|
||||||
.paginate(&db, page_size);
|
.paginate(&db, page_size);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user