@@ -7,29 +7,95 @@ use chrono::{DateTime, Utc};
7
7
use nexus_db_schema:: schema:: db_metadata;
8
8
use serde:: { Deserialize , Serialize } ;
9
9
10
- /// Internal database metadata
10
+ /// These fields of "db_metadata" have been stable since the initial
11
+ /// release of the database.
12
+ ///
13
+ /// For backwards-compatibility purposes, they can be loaded separately
14
+ /// from DbMetadata.
11
15
#[ derive(
12
16
Queryable , Insertable , Debug , Clone , Selectable , Serialize , Deserialize ,
13
17
) ]
14
18
#[ diesel( table_name = db_metadata) ]
15
- pub struct DbMetadata {
19
+ pub struct DbMetadataBase {
16
20
singleton : bool ,
17
21
time_created : DateTime < Utc > ,
18
22
time_modified : DateTime < Utc > ,
19
23
version : SemverVersion ,
20
24
target_version : Option < SemverVersion > ,
21
25
}
22
26
27
+ impl DbMetadataBase {
28
+ pub fn version ( & self ) -> & SemverVersion {
29
+ & self . version
30
+ }
31
+ }
32
+
33
+ /// Internal database metadata
34
+ #[ derive(
35
+ Queryable , Insertable , Debug , Clone , Selectable , Serialize , Deserialize ,
36
+ ) ]
37
+ #[ diesel( table_name = db_metadata) ]
38
+ pub struct DbMetadata {
39
+ #[ diesel( embed) ]
40
+ base : DbMetadataBase ,
41
+ quiesce_started : bool ,
42
+ quiesce_completed : bool ,
43
+ }
44
+
23
45
impl DbMetadata {
46
+ pub fn from_base ( base : DbMetadataBase , quiesced : bool ) -> Self {
47
+ Self { base, quiesce_started : quiesced, quiesce_completed : quiesced }
48
+ }
49
+
24
50
pub fn time_created ( & self ) -> & DateTime < Utc > {
25
- & self . time_created
51
+ & self . base . time_created
26
52
}
27
53
28
54
pub fn time_modified ( & self ) -> & DateTime < Utc > {
29
- & self . time_modified
55
+ & self . base . time_modified
30
56
}
31
57
32
58
pub fn version ( & self ) -> & SemverVersion {
33
- & self . version
59
+ & self . base . version
60
+ }
61
+
62
+ pub fn target_version ( & self ) -> Option < & SemverVersion > {
63
+ self . base . target_version . as_ref ( )
64
+ }
65
+
66
+ pub fn quiesce_started ( & self ) -> bool {
67
+ self . quiesce_started
68
+ }
69
+
70
+ pub fn quiesce_completed ( & self ) -> bool {
71
+ self . quiesce_completed
72
+ }
73
+ }
74
+
75
+ #[ derive( AsChangeset ) ]
76
+ #[ diesel( table_name = db_metadata) ]
77
+ pub struct DbMetadataUpdate {
78
+ time_modified : DateTime < Utc > ,
79
+ version : String ,
80
+ #[ diesel( treat_none_as_null = true ) ]
81
+ target_version : Option < String > ,
82
+ quiesce_started : Option < bool > ,
83
+ quiesce_completed : Option < bool > ,
84
+ }
85
+
86
+ impl DbMetadataUpdate {
87
+ pub fn update_to_version ( version : semver:: Version ) -> Self {
88
+ Self {
89
+ time_modified : Utc :: now ( ) ,
90
+ version : version. to_string ( ) ,
91
+ target_version : None ,
92
+ quiesce_started : None ,
93
+ quiesce_completed : None ,
94
+ }
95
+ }
96
+
97
+ pub fn clear_quiesce ( & mut self ) {
98
+ self . quiesce_started = Some ( false ) ;
99
+ self . quiesce_completed = Some ( false ) ;
34
100
}
35
101
}
0 commit comments