Skip to content

Commit 009cf1a

Browse files
committed
checksum
1 parent db77c5b commit 009cf1a

File tree

421 files changed

+1916
-2362
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

421 files changed

+1916
-2362
lines changed

components/datetime/src/pattern/names.rs

+47-71
Original file line numberDiff line numberDiff line change
@@ -1997,22 +1997,6 @@ impl<FSet: DateTimeNamesMarker> RawDateTimeNames<FSet> {
19971997
Ok(())
19981998
}
19991999

2000-
fn load_mz_periods<P>(
2001-
&mut self,
2002-
provider: &P,
2003-
error_field: ErrorField,
2004-
) -> Result<(), PatternLoadError>
2005-
where
2006-
P: BoundDataProvider<tz::MzPeriodV1Marker> + ?Sized,
2007-
{
2008-
let variables = ();
2009-
self.mz_periods
2010-
.load_put(provider, Default::default(), variables)
2011-
.map_err(|e| MaybePayloadError::into_load_error(e, error_field))?
2012-
.map_err(|e| PatternLoadError::Data(e, error_field))?;
2013-
Ok(())
2014-
}
2015-
20162000
pub(crate) fn load_time_zone_generic_long_names(
20172001
&mut self,
20182002
provider: &(impl BoundDataProvider<tz::MzGenericLongV1Marker> + ?Sized),
@@ -2031,24 +2015,22 @@ impl<FSet: DateTimeNamesMarker> RawDateTimeNames<FSet> {
20312015
id: DataIdentifierBorrowed::for_locale(&locale),
20322016
..Default::default()
20332017
};
2034-
self.mz_generic_long
2018+
let cs1 = self
2019+
.mz_generic_long
20352020
.load_put(provider, req, variables)
20362021
.map_err(|e| MaybePayloadError::into_load_error(e, error_field))?
2037-
.map_err(|e| PatternLoadError::Data(e, error_field))?;
2038-
self.load_mz_periods(mz_period_provider, error_field)?;
2039-
#[allow(clippy::unwrap_used)] // we just loaded them
2040-
if self
2041-
.mz_generic_long
2042-
.get()
2043-
.inner
2044-
.get_option()
2045-
.unwrap()
2046-
.checksum
2047-
!= self.mz_periods.get().inner.get_option().unwrap().checksum
2048-
{
2022+
.map_err(|e| PatternLoadError::Data(e, error_field))?
2023+
.checksum;
2024+
let cs2 = self
2025+
.mz_periods
2026+
.load_put(mz_period_provider, Default::default(), ())
2027+
.map_err(|e| MaybePayloadError::into_load_error(e, error_field))?
2028+
.map_err(|e| PatternLoadError::Data(e, error_field))?
2029+
.checksum;
2030+
if cs1.is_none() || cs1 != cs2 {
20492031
return Err(PatternLoadError::Data(
20502032
DataErrorKind::InconsistentData(tz::MzPeriodV1Marker::INFO)
2051-
.with_req(tz::MzGenericLongV1Marker::INFO, req),
2033+
.with_req(tz::MzSpecificLongV1Marker::INFO, req),
20522034
error_field,
20532035
));
20542036
}
@@ -2073,24 +2055,22 @@ impl<FSet: DateTimeNamesMarker> RawDateTimeNames<FSet> {
20732055
id: DataIdentifierBorrowed::for_locale(&locale),
20742056
..Default::default()
20752057
};
2076-
self.mz_generic_short
2058+
let cs1 = self
2059+
.mz_generic_short
20772060
.load_put(provider, req, variables)
20782061
.map_err(|e| MaybePayloadError::into_load_error(e, error_field))?
2079-
.map_err(|e| PatternLoadError::Data(e, error_field))?;
2080-
self.load_mz_periods(mz_period_provider, error_field)?;
2081-
#[allow(clippy::unwrap_used)] // we just loaded them
2082-
if self
2083-
.mz_generic_short
2084-
.get()
2085-
.inner
2086-
.get_option()
2087-
.unwrap()
2088-
.checksum
2089-
!= self.mz_periods.get().inner.get_option().unwrap().checksum
2090-
{
2062+
.map_err(|e| PatternLoadError::Data(e, error_field))?
2063+
.checksum;
2064+
let cs2 = self
2065+
.mz_periods
2066+
.load_put(mz_period_provider, Default::default(), ())
2067+
.map_err(|e| MaybePayloadError::into_load_error(e, error_field))?
2068+
.map_err(|e| PatternLoadError::Data(e, error_field))?
2069+
.checksum;
2070+
if cs1.is_none() || cs1 != cs2 {
20912071
return Err(PatternLoadError::Data(
20922072
DataErrorKind::InconsistentData(tz::MzPeriodV1Marker::INFO)
2093-
.with_req(tz::MzGenericShortV1Marker::INFO, req),
2073+
.with_req(tz::MzSpecificLongV1Marker::INFO, req),
20942074
error_field,
20952075
));
20962076
}
@@ -2115,21 +2095,19 @@ impl<FSet: DateTimeNamesMarker> RawDateTimeNames<FSet> {
21152095
id: DataIdentifierBorrowed::for_locale(&locale),
21162096
..Default::default()
21172097
};
2118-
self.mz_specific_long
2098+
let cs1 = self
2099+
.mz_specific_long
21192100
.load_put(provider, req, variables)
21202101
.map_err(|e| MaybePayloadError::into_load_error(e, error_field))?
2121-
.map_err(|e| PatternLoadError::Data(e, error_field))?;
2122-
self.load_mz_periods(mz_period_provider, error_field)?;
2123-
#[allow(clippy::unwrap_used)] // we just loaded them
2124-
if self
2125-
.mz_specific_long
2126-
.get()
2127-
.inner
2128-
.get_option()
2129-
.unwrap()
2130-
.checksum
2131-
!= self.mz_periods.get().inner.get_option().unwrap().checksum
2132-
{
2102+
.map_err(|e| PatternLoadError::Data(e, error_field))?
2103+
.checksum;
2104+
let cs2 = self
2105+
.mz_periods
2106+
.load_put(mz_period_provider, Default::default(), ())
2107+
.map_err(|e| MaybePayloadError::into_load_error(e, error_field))?
2108+
.map_err(|e| PatternLoadError::Data(e, error_field))?
2109+
.checksum;
2110+
if cs1.is_none() || cs1 != cs2 {
21332111
return Err(PatternLoadError::Data(
21342112
DataErrorKind::InconsistentData(tz::MzPeriodV1Marker::INFO)
21352113
.with_req(tz::MzSpecificLongV1Marker::INFO, req),
@@ -2157,24 +2135,22 @@ impl<FSet: DateTimeNamesMarker> RawDateTimeNames<FSet> {
21572135
id: DataIdentifierBorrowed::for_locale(&locale),
21582136
..Default::default()
21592137
};
2160-
self.mz_specific_short
2138+
let cs1 = self
2139+
.mz_specific_short
21612140
.load_put(provider, req, variables)
21622141
.map_err(|e| MaybePayloadError::into_load_error(e, error_field))?
2163-
.map_err(|e| PatternLoadError::Data(e, error_field))?;
2164-
self.load_mz_periods(mz_period_provider, error_field)?;
2165-
#[allow(clippy::unwrap_used)] // we just loaded them
2166-
if self
2167-
.mz_specific_short
2168-
.get()
2169-
.inner
2170-
.get_option()
2171-
.unwrap()
2172-
.checksum
2173-
!= self.mz_periods.get().inner.get_option().unwrap().checksum
2174-
{
2142+
.map_err(|e| PatternLoadError::Data(e, error_field))?
2143+
.checksum;
2144+
let cs2 = self
2145+
.mz_periods
2146+
.load_put(mz_period_provider, Default::default(), ())
2147+
.map_err(|e| MaybePayloadError::into_load_error(e, error_field))?
2148+
.map_err(|e| PatternLoadError::Data(e, error_field))?
2149+
.checksum;
2150+
if cs1.is_none() || cs1 != cs2 {
21752151
return Err(PatternLoadError::Data(
21762152
DataErrorKind::InconsistentData(tz::MzPeriodV1Marker::INFO)
2177-
.with_req(tz::MzSpecificShortV1Marker::INFO, req),
2153+
.with_req(tz::MzSpecificLongV1Marker::INFO, req),
21782154
error_field,
21792155
));
21802156
}

components/datetime/src/provider/time_zones.rs

+6-12
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ pub struct ExemplarCitiesV1<'data> {
153153
/// An ICU4X mapping to generic metazone names.
154154
/// See CLDR-JSON timeZoneNames.json for more context.
155155
///
156+
/// These markers use a checksum to ensure consistency with [`MetazonePeriodV1`].
157+
///
156158
/// <div class="stab unstable">
157159
/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
158160
/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
@@ -168,11 +170,6 @@ pub struct ExemplarCitiesV1<'data> {
168170
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
169171
#[yoke(prove_covariance_manually)]
170172
pub struct MetazoneGenericNamesV1<'data> {
171-
/// An XxHash64 checksum of the full metazone names.
172-
///
173-
/// The checksum here should match the checksum in [`MetazonePeriodV1`]
174-
/// if these were generated from the same data set.
175-
pub checksum: u64,
176173
/// The default mapping between metazone id and localized metazone name.
177174
#[cfg_attr(feature = "serde", serde(borrow))]
178175
pub defaults: ZeroMap<'data, MetazoneId, str>,
@@ -185,6 +182,8 @@ pub struct MetazoneGenericNamesV1<'data> {
185182
/// Specific names include time variants such as "daylight."
186183
/// See CLDR-JSON timeZoneNames.json for more context.
187184
///
185+
/// These markers use a checksum to ensure consistency with [`MetazonePeriodV1`].
186+
///
188187
/// <div class="stab unstable">
189188
/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
190189
/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
@@ -200,11 +199,6 @@ pub struct MetazoneGenericNamesV1<'data> {
200199
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
201200
#[yoke(prove_covariance_manually)]
202201
pub struct MetazoneSpecificNamesV1<'data> {
203-
/// An XxHash64 checksum of the full metazone names.
204-
///
205-
/// The checksum here should match the checksum in [`MetazonePeriodV1`]
206-
/// if these were generated from the same data set.
207-
pub checksum: u64,
208202
/// The default mapping between metazone id and localized metazone name.
209203
#[cfg_attr(feature = "serde", serde(borrow))]
210204
pub defaults: ZeroMap<'data, (MetazoneId, ZoneVariant), str>,
@@ -225,6 +219,8 @@ pub type MetazoneId = core::num::NonZeroU8;
225219
/// An ICU4X mapping to the metazones at a given period.
226220
/// See CLDR-JSON metaZones.json for more context.
227221
///
222+
/// This markers uses a checksum to ensure consistency with [`Metazone*NamesV1`].
223+
///
228224
/// <div class="stab unstable">
229225
/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
230226
/// including in SemVer minor releases. While the serde representation of data structs is guaranteed
@@ -245,6 +241,4 @@ pub struct MetazonePeriodV1<'data> {
245241
/// the number of minutes since the local [`EPOCH`](icu_timezone::provider::EPOCH). It represents when the metazone started to be used.
246242
#[cfg_attr(feature = "serde", serde(borrow))]
247243
pub list: ZeroMap2d<'data, TimeZoneBcp47Id, IsoMinutesSinceEpoch, NichedOption<MetazoneId, 1>>,
248-
/// An XxHash64 checksum of the full metazone names.
249-
pub checksum: u64,
250244
}

components/datetime/src/scaffold/names_storage.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ pub trait MaybePayload<M: DynamicDataMarker, Variables>: UnstableSealed {
129129
provider: &P,
130130
req: DataRequest,
131131
variables: Variables,
132-
) -> Result<Result<(), DataError>, MaybePayloadError>
132+
) -> Result<Result<DataResponseMetadata, DataError>, MaybePayloadError>
133133
where
134134
P: BoundDataProvider<M> + ?Sized,
135135
Self: Sized;
@@ -199,15 +199,15 @@ where
199199
provider: &P,
200200
req: DataRequest,
201201
variables: Variables,
202-
) -> Result<Result<(), DataError>, MaybePayloadError>
202+
) -> Result<Result<DataResponseMetadata, DataError>, MaybePayloadError>
203203
where
204204
P: BoundDataProvider<M> + ?Sized,
205205
Self: Sized,
206206
{
207207
let arg_variables = variables;
208208
match &self.inner {
209209
OptionalNames::SingleLength { variables, .. } if arg_variables == *variables => {
210-
return Ok(Ok(()));
210+
return Ok(Ok(Default::default()));
211211
}
212212
OptionalNames::SingleLength { .. } => {
213213
return Err(MaybePayloadError::ConflictingField);
@@ -220,7 +220,7 @@ where
220220
payload: response.payload,
221221
variables: arg_variables,
222222
};
223-
Ok(Ok(()))
223+
Ok(Ok(response.metadata))
224224
}
225225
Err(e) => Ok(Err(e)),
226226
}
@@ -242,7 +242,7 @@ impl<M: DynamicDataMarker, Variables> MaybePayload<M, Variables> for () {
242242
_: &P,
243243
_: DataRequest,
244244
_: Variables,
245-
) -> Result<Result<(), DataError>, MaybePayloadError>
245+
) -> Result<Result<DataResponseMetadata, DataError>, MaybePayloadError>
246246
where
247247
P: BoundDataProvider<M> + ?Sized,
248248
Self: Sized,

components/timezone/src/ids.rs

+31-18
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ use crate::{
101101
#[derive(Debug, Clone)]
102102
pub struct TimeZoneIdMapper {
103103
data: DataPayload<IanaToBcp47MapV3Marker>,
104+
checksum: u64,
104105
}
105106

106107
impl TimeZoneIdMapper {
@@ -132,8 +133,14 @@ impl TimeZoneIdMapper {
132133
where
133134
P: DataProvider<IanaToBcp47MapV3Marker> + ?Sized,
134135
{
135-
let data = provider.load(Default::default())?.payload;
136-
Ok(Self { data })
136+
let response = provider.load(Default::default())?;
137+
Ok(Self {
138+
data: response.payload,
139+
checksum: response.metadata.checksum.ok_or_else(|| {
140+
DataError::custom("Missing checksum")
141+
.with_req(IanaToBcp47MapV3Marker::INFO, Default::default())
142+
})?,
143+
})
137144
}
138145

139146
/// Returns a borrowed version of the mapper that can be queried.
@@ -142,6 +149,7 @@ impl TimeZoneIdMapper {
142149
pub fn as_borrowed(&self) -> TimeZoneIdMapperBorrowed {
143150
TimeZoneIdMapperBorrowed {
144151
data: self.data.get(),
152+
checksum: self.checksum,
145153
}
146154
}
147155
}
@@ -158,6 +166,7 @@ impl AsRef<TimeZoneIdMapper> for TimeZoneIdMapper {
158166
#[derive(Debug, Copy, Clone)]
159167
pub struct TimeZoneIdMapperBorrowed<'a> {
160168
data: &'a IanaToBcp47MapV3<'a>,
169+
checksum: u64,
161170
}
162171

163172
#[cfg(feature = "compiled_data")]
@@ -179,6 +188,7 @@ impl TimeZoneIdMapperBorrowed<'static> {
179188
pub fn new() -> Self {
180189
Self {
181190
data: crate::provider::Baked::SINGLETON_IANA_TO_BCP47_MAP_V3_MARKER,
191+
checksum: crate::provider::Baked::SINGLETON_IANA_TO_BCP47_MAP_V3_MARKER_CHECKSUM,
182192
}
183193
}
184194

@@ -189,6 +199,7 @@ impl TimeZoneIdMapperBorrowed<'static> {
189199
pub fn static_to_owned(&self) -> TimeZoneIdMapper {
190200
TimeZoneIdMapper {
191201
data: DataPayload::from_static_ref(self.data),
202+
checksum: self.checksum,
192203
}
193204
}
194205
}
@@ -597,13 +608,20 @@ where
597608
/// [📚 Help choosing a constructor](icu_provider::constructors)
598609
#[cfg(feature = "compiled_data")]
599610
pub fn try_new_with_mapper(mapper: I) -> Result<Self, DataError> {
600-
Self {
611+
if mapper.as_ref().checksum
612+
!= crate::provider::Baked::SINGLETON_BCP47_TO_IANA_MAP_V1_MARKER_CHECKSUM
613+
{
614+
return Err(
615+
DataErrorKind::InconsistentData(IanaToBcp47MapV3Marker::INFO)
616+
.with_marker(Bcp47ToIanaMapV1Marker::INFO),
617+
);
618+
}
619+
Ok(Self {
601620
inner: mapper,
602621
data: DataPayload::from_static_ref(
603622
crate::provider::Baked::SINGLETON_BCP47_TO_IANA_MAP_V1_MARKER,
604623
),
605-
}
606-
.validated()
624+
})
607625
}
608626

609627
icu_provider::gen_any_buffer_data_constructors!((mapper: I) -> error: DataError,
@@ -621,22 +639,17 @@ where
621639
where
622640
P: DataProvider<IanaToBcp47MapV3Marker> + DataProvider<Bcp47ToIanaMapV1Marker> + ?Sized,
623641
{
624-
let data = provider.load(Default::default())?.payload;
625-
Self {
626-
inner: mapper,
627-
data,
628-
}
629-
.validated()
630-
}
631-
632-
fn validated(self) -> Result<Self, DataError> {
633-
if self.inner.as_ref().data.get().bcp47_ids_checksum != self.data.get().bcp47_ids_checksum {
642+
let response = provider.load(Default::default())?;
643+
if Some(mapper.as_ref().checksum) != response.metadata.checksum {
634644
return Err(
635645
DataErrorKind::InconsistentData(IanaToBcp47MapV3Marker::INFO)
636646
.with_marker(Bcp47ToIanaMapV1Marker::INFO),
637647
);
638648
}
639-
Ok(self)
649+
Ok(Self {
650+
inner: mapper,
651+
data: response.payload,
652+
})
640653
}
641654

642655
/// Gets the inner [`TimeZoneIdMapper`] for performing queries.
@@ -681,8 +694,8 @@ impl TimeZoneIdMapperWithFastCanonicalizationBorrowed<'static> {
681694
#[cfg(feature = "compiled_data")]
682695
pub fn new() -> Self {
683696
const _: () = assert!(
684-
crate::provider::Baked::SINGLETON_IANA_TO_BCP47_MAP_V3_MARKER.bcp47_ids_checksum
685-
== crate::provider::Baked::SINGLETON_BCP47_TO_IANA_MAP_V1_MARKER.bcp47_ids_checksum,
697+
crate::provider::Baked::SINGLETON_IANA_TO_BCP47_MAP_V3_MARKER_CHECKSUM
698+
== crate::provider::Baked::SINGLETON_BCP47_TO_IANA_MAP_V1_MARKER_CHECKSUM,
686699
);
687700
Self {
688701
inner: TimeZoneIdMapperBorrowed::new(),

0 commit comments

Comments
 (0)