Skip to content

Commit 093a3ef

Browse files
authored
Merge pull request #1024 from input-output-hk/djo/837/sqlite-upgrade-and-bundling
Sqlite crate upgrade and enable sqlite bundling to remove the dependency to system sqlite
2 parents 4c61045 + 1467582 commit 093a3ef

File tree

20 files changed

+340
-401
lines changed

20 files changed

+340
-401
lines changed

Cargo.lock

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-aggregator/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-aggregator"
3-
version = "0.3.44"
3+
version = "0.3.45"
44
description = "A Mithril Aggregator server"
55
authors = { workspace = true }
66
edition = { workspace = true }
@@ -28,7 +28,7 @@ slog = { version = "2.7.0", features = ["max_level_trace", "release_max_level_de
2828
slog-async = "2.7.0"
2929
slog-bunyan = "2.4.0"
3030
slog-scope = "4.4.0"
31-
sqlite = "0.28"
31+
sqlite = { version = "0.31.0", features = ["bundled"] }
3232
tar = "0.4.38"
3333
thiserror = "1.0.31"
3434
tokio = { version = "1.17.0", features = ["full"] }

mithril-aggregator/src/database/provider/certificate.rs

Lines changed: 61 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -182,19 +182,19 @@ impl SqLiteEntity for CertificateRecord {
182182
where
183183
Self: Sized,
184184
{
185-
let certificate_id = row.get::<String, _>(0);
186-
let parent_certificate_id = row.get::<Option<String>, _>(1);
187-
let message = row.get::<String, _>(2);
188-
let signature = row.get::<String, _>(3);
189-
let aggregate_verification_key = row.get::<String, _>(4);
190-
let epoch_int = row.get::<i64, _>(5);
191-
let beacon_string = row.get::<String, _>(6);
192-
let protocol_version = row.get::<String, _>(7);
193-
let protocol_parameters_string = row.get::<String, _>(8);
194-
let protocol_message_string = row.get::<String, _>(9);
195-
let signers_string = row.get::<String, _>(10);
196-
let initiated_at = row.get::<String, _>(11);
197-
let sealed_at = row.get::<String, _>(12);
185+
let certificate_id = row.read::<&str, _>(0).to_string();
186+
let parent_certificate_id = row.read::<Option<&str>, _>(1).map(|s| s.to_owned());
187+
let message = row.read::<&str, _>(2).to_string();
188+
let signature = row.read::<&str, _>(3).to_string();
189+
let aggregate_verification_key = row.read::<&str, _>(4).to_string();
190+
let epoch_int = row.read::<i64, _>(5);
191+
let beacon_string = row.read::<&str, _>(6);
192+
let protocol_version = row.read::<&str, _>(7).to_string();
193+
let protocol_parameters_string = row.read::<&str, _>(8);
194+
let protocol_message_string = row.read::<&str, _>(9);
195+
let signers_string = row.read::<&str, _>(10);
196+
let initiated_at = row.read::<&str, _>(11);
197+
let sealed_at = row.read::<&str, _>(12);
198198

199199
let certificate_record = Self {
200200
certificate_id,
@@ -207,43 +207,43 @@ impl SqLiteEntity for CertificateRecord {
207207
"Could not cast i64 ({epoch_int}) to u64. Error: '{e}'"
208208
))
209209
})?),
210-
beacon: serde_json::from_str(&beacon_string).map_err(
210+
beacon: serde_json::from_str(beacon_string).map_err(
211211
|e| {
212212
HydrationError::InvalidData(format!(
213213
"Could not turn string '{beacon_string}' to Beacon. Error: {e}"
214214
))
215215
},
216216
)?,
217217
protocol_version,
218-
protocol_parameters: serde_json::from_str(&protocol_parameters_string).map_err(
218+
protocol_parameters: serde_json::from_str(protocol_parameters_string).map_err(
219219
|e| {
220220
HydrationError::InvalidData(format!(
221221
"Could not turn string '{protocol_parameters_string}' to ProtocolParameters. Error: {e}"
222222
))
223223
},
224224
)?,
225-
protocol_message: serde_json::from_str(&protocol_message_string).map_err(
225+
protocol_message: serde_json::from_str(protocol_message_string).map_err(
226226
|e| {
227227
HydrationError::InvalidData(format!(
228228
"Could not turn string '{protocol_message_string}' to ProtocolMessage. Error: {e}"
229229
))
230230
},
231231
)?,
232-
signers: serde_json::from_str(&signers_string).map_err(
232+
signers: serde_json::from_str(signers_string).map_err(
233233
|e| {
234234
HydrationError::InvalidData(format!(
235235
"Could not turn string '{signers_string}' to Vec<SignerWithStake>. Error: {e}"
236236
))
237237
},
238238
)?,
239-
initiated_at: DateTime::parse_from_rfc3339(&initiated_at).map_err(
239+
initiated_at: DateTime::parse_from_rfc3339(initiated_at).map_err(
240240
|e| {
241241
HydrationError::InvalidData(format!(
242242
"Could not turn string '{initiated_at}' to rfc3339 Datetime. Error: {e}"
243243
))
244244
},
245245
)?.with_timezone(&Utc),
246-
sealed_at: DateTime::parse_from_rfc3339(&sealed_at).map_err(
246+
sealed_at: DateTime::parse_from_rfc3339(sealed_at).map_err(
247247
|e| {
248248
HydrationError::InvalidData(format!(
249249
"Could not turn string '{sealed_at}' to rfc3339 Datetime. Error: {e}"
@@ -777,68 +777,50 @@ mod tests {
777777
for certificate in certificates {
778778
let certificate_record: CertificateRecord = certificate.into();
779779
let mut statement = connection.prepare(&query)?;
780-
781780
statement
782-
.bind(1, certificate_record.certificate_id.as_str())
783-
.unwrap();
784-
if let Some(parent_certificate_id) = certificate_record.parent_certificate_id {
785-
statement.bind(2, parent_certificate_id.as_str()).unwrap();
786-
} else {
787-
statement.bind(2, &Value::Null).unwrap();
788-
}
789-
statement
790-
.bind(3, certificate_record.message.as_str())
791-
.unwrap();
792-
statement
793-
.bind(4, certificate_record.signature.as_str())
794-
.unwrap();
795-
statement
796-
.bind(5, certificate_record.aggregate_verification_key.as_str())
797-
.unwrap();
798-
statement
799-
.bind(6, certificate_record.epoch.0 as i64)
800-
.unwrap();
801-
statement
802-
.bind(
803-
7,
804-
serde_json::to_string(&certificate_record.beacon)
805-
.unwrap()
806-
.as_str(),
807-
)
808-
.unwrap();
809-
statement
810-
.bind(8, certificate_record.protocol_version.as_str())
811-
.unwrap();
812-
statement
813-
.bind(
814-
9,
815-
serde_json::to_string(&certificate_record.protocol_parameters)
816-
.unwrap()
817-
.as_str(),
818-
)
819-
.unwrap();
820-
statement
821-
.bind(
822-
10,
823-
serde_json::to_string(&certificate_record.protocol_message)
824-
.unwrap()
825-
.as_str(),
826-
)
827-
.unwrap();
828-
statement
829-
.bind(
830-
11,
831-
serde_json::to_string(&certificate_record.signers)
832-
.unwrap()
833-
.as_str(),
834-
)
835-
.unwrap();
836-
statement
837-
.bind(12, certificate_record.initiated_at.to_rfc3339().as_str())
838-
.unwrap();
839-
statement
840-
.bind(13, certificate_record.sealed_at.to_rfc3339().as_str())
781+
.bind::<&[(_, Value)]>(&[
782+
(1, certificate_record.certificate_id.into()),
783+
(
784+
2,
785+
match certificate_record.parent_certificate_id {
786+
None => Value::Null,
787+
Some(parent_certificate_id) => parent_certificate_id.into(),
788+
},
789+
),
790+
(3, certificate_record.message.into()),
791+
(4, certificate_record.signature.into()),
792+
(5, certificate_record.aggregate_verification_key.into()),
793+
(6, i64::try_from(certificate_record.epoch.0).unwrap().into()),
794+
(
795+
7,
796+
serde_json::to_string(&certificate_record.beacon)
797+
.unwrap()
798+
.into(),
799+
),
800+
(8, certificate_record.protocol_version.into()),
801+
(
802+
9,
803+
serde_json::to_string(&certificate_record.protocol_parameters)
804+
.unwrap()
805+
.into(),
806+
),
807+
(
808+
10,
809+
serde_json::to_string(&certificate_record.protocol_message)
810+
.unwrap()
811+
.into(),
812+
),
813+
(
814+
11,
815+
serde_json::to_string(&certificate_record.signers)
816+
.unwrap()
817+
.into(),
818+
),
819+
(12, certificate_record.initiated_at.to_rfc3339().into()),
820+
(13, certificate_record.sealed_at.to_rfc3339().into()),
821+
])
841822
.unwrap();
823+
842824
statement.next().unwrap();
843825
}
844826

mithril-aggregator/src/database/provider/epoch_setting.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ impl SqLiteEntity for EpochSettingRecord {
3838
where
3939
Self: Sized,
4040
{
41-
let epoch_setting_id_int = row.get::<i64, _>(0);
42-
let protocol_parameters_string = &row.get::<String, _>(1);
41+
let epoch_setting_id_int = row.read::<i64, _>(0);
42+
let protocol_parameters_string = &row.read::<&str, _>(1);
4343

4444
let epoch_setting_record = Self {
4545
epoch_setting_id: Epoch(epoch_setting_id_int.try_into().map_err(|e| {
@@ -425,14 +425,16 @@ mod tests {
425425
];
426426
for (epoch, protocol_parameters) in epoch_settings {
427427
let mut statement = connection.prepare(&query)?;
428-
429-
statement.bind(1, *epoch).unwrap();
430428
statement
431-
.bind(
432-
2,
433-
serde_json::to_string(protocol_parameters).unwrap().as_str(),
434-
)
429+
.bind::<&[(_, Value)]>(&[
430+
(1, Value::Integer(*epoch)),
431+
(
432+
2,
433+
serde_json::to_string(protocol_parameters).unwrap().into(),
434+
),
435+
])
435436
.unwrap();
437+
436438
statement.next().unwrap();
437439
}
438440

mithril-aggregator/src/database/provider/open_message.rs

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -73,38 +73,39 @@ impl SqLiteEntity for OpenMessageRecord {
7373
where
7474
Self: Sized,
7575
{
76-
let open_message_id = row.get::<String, _>(0);
77-
let open_message_id = Uuid::parse_str(&open_message_id).map_err(|e| {
76+
let open_message_id = row.read::<&str, _>(0);
77+
let open_message_id = Uuid::parse_str(open_message_id).map_err(|e| {
7878
HydrationError::InvalidData(format!(
7979
"Invalid UUID in open_message.open_message_id: '{open_message_id}'. Error: {e}"
8080
))
8181
})?;
82-
let protocol_message = row.get::<String, _>(4);
83-
let protocol_message = serde_json::from_str(&protocol_message).map_err(|e| {
82+
let protocol_message = row.read::<&str, _>(4);
83+
let protocol_message = serde_json::from_str(protocol_message).map_err(|e| {
8484
HydrationError::InvalidData(format!(
8585
"Invalid protocol message JSON representation '{protocol_message}'. Error: {e}"
8686
))
8787
})?;
88-
let epoch_setting_id = row.get::<i64, _>(1);
88+
let epoch_setting_id = row.read::<i64, _>(1);
8989
let epoch_val = u64::try_from(epoch_setting_id)
9090
.map_err(|e| panic!("Integer field open_message.epoch_setting_id (value={epoch_setting_id}) is incompatible with u64 Epoch representation. Error = {e}"))?;
9191

9292
// TODO: We need to check first that the cell can be read as a string first
9393
// (e.g. when beacon json is '{"network": "dev", "epoch": 1, "immutable_file_number": 2}').
9494
// If it fails, we fallback on readign the cell as an integer (e.g. when beacon json is '5').
9595
// Maybe there is a better way of doing this.
96-
let beacon_str = row
97-
.try_get::<String, _>(2)
98-
.unwrap_or_else(|_| (row.get::<i64, _>(2)).to_string());
96+
let beacon_str = match row.try_read::<&str, _>(2) {
97+
Ok(value) => value.to_string(),
98+
Err(_) => (row.read::<i64, _>(2)).to_string(),
99+
};
99100

100-
let signed_entity_type_id = usize::try_from(row.get::<i64, _>(3)).map_err(|e| {
101+
let signed_entity_type_id = usize::try_from(row.read::<i64, _>(3)).map_err(|e| {
101102
panic!(
102103
"Integer field open_message.signed_entity_type_id cannot be turned into usize: {e}"
103104
)
104105
})?;
105106
let signed_entity_type = SignedEntityType::hydrate(signed_entity_type_id, &beacon_str)?;
106-
let is_certified = row.get::<i64, _>(5) != 0;
107-
let datetime = &row.get::<String, _>(6);
107+
let is_certified = row.read::<i64, _>(5) != 0;
108+
let datetime = &row.read::<&str, _>(6);
108109
let created_at =
109110
DateTime::parse_from_rfc3339(datetime).map_err(|e| {
110111
HydrationError::InvalidData(format!(
@@ -359,7 +360,7 @@ impl SqLiteEntity for OpenMessageWithSingleSignaturesRecord {
359360
where
360361
Self: Sized,
361362
{
362-
let single_signatures = &row.get::<String, _>(7);
363+
let single_signatures = &row.read::<&str, _>(7);
363364
let single_signatures: Vec<SingleSignatures> = serde_json::from_str(single_signatures)
364365
.map_err(|e| {
365366
HydrationError::InvalidData(format!(
@@ -674,7 +675,11 @@ values (1, '{"k": 100, "m": 5, "phi": 0.65 }'), (2, '{"k": 100, "m": 5, "phi": 0
674675
let (expr, params) = provider
675676
.get_insert_condition(
676677
epoch,
677-
&SignedEntityType::CardanoImmutableFilesFull(Beacon::default()),
678+
&SignedEntityType::CardanoImmutableFilesFull(Beacon::new(
679+
"testnet".to_string(),
680+
2,
681+
4,
682+
)),
678683
&ProtocolMessage::new(),
679684
)
680685
.unwrap()
@@ -683,11 +688,16 @@ values (1, '{"k": 100, "m": 5, "phi": 0.65 }'), (2, '{"k": 100, "m": 5, "phi": 0
683688
assert_eq!("(open_message_id, epoch_setting_id, beacon, signed_entity_type_id, protocol_message, created_at) values (?1, ?2, ?3, ?4, ?5, ?6)".to_string(), expr);
684689
assert_eq!(Value::Integer(12), params[1]);
685690
assert_eq!(
686-
Value::String(r#"{"network":"","epoch":0,"immutable_file_number":0}"#.to_string()),
691+
Value::String(
692+
r#"{"network":"testnet","epoch":2,"immutable_file_number":4}"#.to_string()
693+
),
687694
params[2]
688695
);
689696
assert_eq!(Value::Integer(2), params[3]);
690-
assert!(!params[4].as_string().unwrap().is_empty());
697+
assert_eq!(
698+
Value::String(serde_json::to_string(&ProtocolMessage::new()).unwrap()),
699+
params[4]
700+
);
691701
}
692702

693703
#[test]

0 commit comments

Comments
 (0)