use super::CommitStoreOperations;
use crate::commits::store::diesel::{schema::commits, CommitStoreError};
use crate::error::InternalError;
use diesel::{dsl::max, prelude::*};
pub(in crate::commits) trait CommitStoreGetNextCommitNumOperation {
fn get_next_commit_num(&self) -> Result<i64, CommitStoreError>;
}
#[cfg(feature = "postgres")]
impl<'a> CommitStoreGetNextCommitNumOperation
for CommitStoreOperations<'a, diesel::pg::PgConnection>
{
fn get_next_commit_num(&self) -> Result<i64, CommitStoreError> {
self.conn.transaction::<_, CommitStoreError, _>(|| {
let commit_num = commits::table
.select(max(commits::commit_num))
.first(self.conn)
.map(|option: Option<i64>| match option {
Some(num) => num + 1,
None => 0,
})
.map_err(|err| {
CommitStoreError::InternalError(InternalError::from_source(Box::new(err)))
})?;
Ok(commit_num)
})
}
}
#[cfg(feature = "sqlite")]
impl<'a> CommitStoreGetNextCommitNumOperation
for CommitStoreOperations<'a, diesel::sqlite::SqliteConnection>
{
fn get_next_commit_num(&self) -> Result<i64, CommitStoreError> {
self.conn.transaction::<_, CommitStoreError, _>(|| {
let commit_num = commits::table
.select(max(commits::commit_num))
.first(self.conn)
.map(|option: Option<i64>| match option {
Some(num) => num + 1,
None => 0,
})
.map_err(|err| {
CommitStoreError::InternalError(InternalError::from_source(Box::new(err)))
})?;
Ok(commit_num)
})
}
}