Skip to content

Commit 6a9c532

Browse files
authored
Merge pull request #1975 from Kobzol/issue-data-write
Do not write `IssueData` to the DB when it is unchanged
2 parents 9a2eebf + 333665a commit 6a9c532

File tree

6 files changed

+22
-14
lines changed

6 files changed

+22
-14
lines changed

src/db/issue_data.rs

+17-9
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,19 @@ use tokio_postgres::{Client as DbClient, Transaction};
1616

1717
pub struct IssueData<'db, T>
1818
where
19-
T: for<'a> Deserialize<'a> + Serialize + Default + std::fmt::Debug + Sync,
19+
T: for<'a> Deserialize<'a> + Serialize + Default + std::fmt::Debug + Sync + PartialEq + Clone,
2020
{
2121
transaction: Transaction<'db>,
2222
repo: String,
2323
issue_number: i32,
2424
key: String,
2525
pub data: T,
26+
initial_data: T,
2627
}
2728

2829
impl<'db, T> IssueData<'db, T>
2930
where
30-
T: for<'a> Deserialize<'a> + Serialize + Default + std::fmt::Debug + Sync,
31+
T: for<'a> Deserialize<'a> + Serialize + Default + std::fmt::Debug + Sync + PartialEq + Clone,
3132
{
3233
pub async fn load(
3334
db: &'db mut DbClient,
@@ -51,25 +52,32 @@ where
5152
.context("selecting issue data")?
5253
.map(|row| row.get::<usize, Json<T>>(0).0)
5354
.unwrap_or_default();
55+
56+
let initial_data = data.clone();
57+
5458
Ok(IssueData {
5559
transaction,
5660
repo,
5761
issue_number,
5862
key: key.to_string(),
5963
data,
64+
initial_data,
6065
})
6166
}
6267

6368
pub async fn save(self) -> Result<()> {
64-
self.transaction
65-
.execute(
66-
"INSERT INTO issue_data (repo, issue_number, key, data) \
69+
// Avoid writing to the DB needlessly.
70+
if self.data != self.initial_data {
71+
self.transaction
72+
.execute(
73+
"INSERT INTO issue_data (repo, issue_number, key, data) \
6774
VALUES ($1, $2, $3, $4) \
6875
ON CONFLICT (repo, issue_number, key) DO UPDATE SET data=EXCLUDED.data",
69-
&[&self.repo, &self.issue_number, &self.key, &Json(&self.data)],
70-
)
71-
.await
72-
.context("inserting issue data")?;
76+
&[&self.repo, &self.issue_number, &self.key, &Json(&self.data)],
77+
)
78+
.await
79+
.context("inserting issue data")?;
80+
}
7381
self.transaction
7482
.commit()
7583
.await

src/handlers/check_commits.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ mod non_default_branch;
2424
const CHECK_COMMITS_WARNINGS_KEY: &str = "check-commits-warnings";
2525

2626
/// State stored in the database
27-
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
27+
#[derive(Debug, Default, serde::Deserialize, serde::Serialize, Clone, PartialEq)]
2828
struct CheckCommitsWarningsState {
2929
/// List of the last warnings in the most recent comment.
3030
last_warnings: Vec<String>,

src/handlers/mentions.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub(super) struct MentionsInput {
2020
paths: Vec<String>,
2121
}
2222

23-
#[derive(Debug, Default, Deserialize, Serialize)]
23+
#[derive(Debug, Default, Deserialize, Serialize, Clone, PartialEq)]
2424
struct MentionState {
2525
paths: Vec<String>,
2626
}

src/handlers/merge_conflicts.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const MERGE_CONFLICTS_KEY: &str = "merge-conflicts";
4545
const UNKNOWN_RESCAN_DELAY: Duration = Duration::from_secs(60);
4646

4747
/// State stored in the database for a PR.
48-
#[derive(Debug, Default, Deserialize, Serialize)]
48+
#[derive(Debug, Default, Deserialize, Serialize, Clone, PartialEq)]
4949
struct MergeConflictState {
5050
/// The GraphQL ID of the most recent warning comment.
5151
///

src/handlers/relnotes.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crate::{
2222

2323
const RELNOTES_KEY: &str = "relnotes";
2424

25-
#[derive(Debug, Default, Deserialize, Serialize)]
25+
#[derive(Debug, Default, Deserialize, Serialize, Clone, PartialEq)]
2626
struct RelnotesState {
2727
relnotes_issue: Option<u64>,
2828
}

src/handlers/shortcut.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use parser::command::shortcut::ShortcutCommand;
1515
const AUTHOR_REMINDER_KEY: &str = "author-reminder";
1616

1717
/// State stored in the database for a PR.
18-
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)]
18+
#[derive(Debug, Default, serde::Deserialize, serde::Serialize, Clone, PartialEq)]
1919
struct AuthorReminderState {
2020
/// ID of the reminder comment.
2121
reminder_comment: Option<String>,

0 commit comments

Comments
 (0)