@@ -16,18 +16,19 @@ use tokio_postgres::{Client as DbClient, Transaction};
16
16
17
17
pub struct IssueData < ' db , T >
18
18
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 ,
20
20
{
21
21
transaction : Transaction < ' db > ,
22
22
repo : String ,
23
23
issue_number : i32 ,
24
24
key : String ,
25
25
pub data : T ,
26
+ initial_data : T ,
26
27
}
27
28
28
29
impl < ' db , T > IssueData < ' db , T >
29
30
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 ,
31
32
{
32
33
pub async fn load (
33
34
db : & ' db mut DbClient ,
@@ -51,25 +52,32 @@ where
51
52
. context ( "selecting issue data" ) ?
52
53
. map ( |row| row. get :: < usize , Json < T > > ( 0 ) . 0 )
53
54
. unwrap_or_default ( ) ;
55
+
56
+ let initial_data = data. clone ( ) ;
57
+
54
58
Ok ( IssueData {
55
59
transaction,
56
60
repo,
57
61
issue_number,
58
62
key : key. to_string ( ) ,
59
63
data,
64
+ initial_data,
60
65
} )
61
66
}
62
67
63
68
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) \
67
74
VALUES ($1, $2, $3, $4) \
68
75
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
+ }
73
81
self . transaction
74
82
. commit ( )
75
83
. await
0 commit comments