Skip to content

Commit 40d1b2f

Browse files
committed
Remove experimental indexing feature
With new message implementation users can fairly easily create their own indexes and this removal allows a significant simiplifcation of code and overall improvement of memory safety
1 parent 1ba7f35 commit 40d1b2f

8 files changed

Lines changed: 4 additions & 964 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,10 @@ float-cmp = "0.10"
4545
[features]
4646
default = ["message_ndarray"]
4747
docs = ["eccodes-sys/docs"]
48-
experimental_index = []
4948
message_ndarray = ["dep:ndarray"]
5049

5150
[package.metadata.docs.rs]
52-
features = ["docs", "experimental_index", "message_ndarray"]
51+
features = ["docs", "message_ndarray"]
5352

5453
[[bench]]
5554
name = "main"

src/codes_handle/mod.rs

Lines changed: 2 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
//! Definition and constructors of `CodesHandle`
22
//! used for accessing GRIB files
33
4-
#[cfg(feature = "experimental_index")]
5-
use crate::codes_index::CodesIndex;
64
use crate::{CodesError, intermediate_bindings::codes_handle_new_from_file, pointer_guard};
75
use eccodes_sys::{ProductKind_PRODUCT_GRIB, codes_handle};
86
use errno::errno;
@@ -250,45 +248,6 @@ impl CodesFile<CodesFileSource<Vec<u8>>> {
250248
}
251249
}
252250

253-
#[cfg(feature = "experimental_index")]
254-
#[cfg_attr(docsrs, doc(cfg(feature = "experimental_index")))]
255-
impl CodesFile<CodesIndex> {
256-
/// Creates [`CodesHandle`] for provided [`CodesIndex`].
257-
///
258-
/// ## Example
259-
///
260-
/// ```
261-
/// # fn run() -> anyhow::Result<()> {
262-
/// # use eccodes::{CodesHandle, CodesIndex};
263-
/// #
264-
/// let index = CodesIndex::new_from_keys(&vec!["shortName", "typeOfLevel", "level"])?;
265-
/// let handle = CodesHandle::new_from_index(index)?;
266-
///
267-
/// Ok(())
268-
/// # }
269-
/// ```
270-
///
271-
/// The function takes ownership of the provided [`CodesIndex`] which owns
272-
/// the GRIB data. [`CodesHandle`] created from [`CodesIndex`] is of different type
273-
/// than the one created from file or memory buffer, because it internally uses
274-
/// different functions to access messages. But it can be used in the same way.
275-
///
276-
/// ⚠️ Warning: This function may interfere with other functions in concurrent context,
277-
/// due to ecCodes issues with thread-safety for indexes. More information can be found
278-
/// in [`codes_index`](crate::codes_index) module documentation.
279-
///
280-
/// ## Errors
281-
///
282-
/// Returns [`CodesError::Internal`] with error code
283-
/// when internal [`codes_handle`] cannot be created.
284-
#[instrument(level = "trace")]
285-
pub fn new_from_index(index: CodesIndex) -> Result<Self, CodesError> {
286-
let new_handle = CodesFile { source: index };
287-
288-
Ok(new_handle)
289-
}
290-
}
291-
292251
#[instrument(level = "trace")]
293252
fn open_with_fdopen(file: &File) -> Result<*mut FILE, CodesError> {
294253
let file_ptr = unsafe { libc::fdopen(file.as_raw_fd(), "r".as_ptr().cast::<c_char>()) };
@@ -328,8 +287,6 @@ fn open_with_fmemopen(file_data: &[u8]) -> Result<*mut FILE, CodesError> {
328287
#[cfg(test)]
329288
mod tests {
330289
use crate::codes_handle::{CodesFile, ProductKind};
331-
#[cfg(feature = "experimental_index")]
332-
use crate::codes_index::{CodesIndex, Select};
333290
use anyhow::{Context, Result};
334291
use eccodes_sys::ProductKind_PRODUCT_GRIB;
335292
use fallible_iterator::FallibleIterator;
@@ -371,27 +328,6 @@ mod tests {
371328
Ok(())
372329
}
373330

374-
#[test]
375-
#[cfg(feature = "experimental_index")]
376-
fn index_constructor_and_destructor() -> Result<()> {
377-
use anyhow::Ok;
378-
379-
let file_path = Path::new("./data/iceland-surface.grib.idx");
380-
let index = CodesIndex::read_from_file(file_path)?
381-
.select("shortName", "2t")?
382-
.select("typeOfLevel", "surface")?
383-
.select("level", 0)?
384-
.select("stepType", "instant")?;
385-
386-
let i_ptr = index.pointer.clone();
387-
388-
let handle = CodesFile::new_from_index(index)?;
389-
390-
assert_eq!(handle.source.pointer, i_ptr);
391-
392-
Ok(())
393-
}
394-
395331
#[test]
396332
fn codes_handle_drop_file() -> Result<()> {
397333
let file_path = Path::new("./data/iceland-surface.grib");
@@ -425,72 +361,10 @@ mod tests {
425361

426362
let mut handle = CodesFile::new_from_file(file_path, product_kind)?;
427363

428-
let _ref_msg = handle
429-
.ref_message_iter()
430-
.next()?
431-
.context("no message")?;
364+
let _ref_msg = handle.ref_message_iter().next()?.context("no message")?;
432365
let mut clone_msg = _ref_msg.try_clone()?;
433366
drop(_ref_msg);
434-
let _oth_ref = handle
435-
.ref_message_iter()
436-
.next()?
437-
.context("no message")?;
438-
439-
let _nrst = clone_msg.codes_nearest()?;
440-
drop(_nrst);
441-
let _kiter = clone_msg.default_keys_iterator()?;
442-
}
443-
444-
Ok(())
445-
}
446-
447-
#[test]
448-
#[cfg(feature = "experimental_index")]
449-
fn codes_handle_drop_index() -> Result<()> {
450-
let file_path = Path::new("./data/iceland-surface.grib.idx");
451-
let index = CodesIndex::read_from_file(file_path)?;
452-
assert!(!index.pointer.is_null());
453-
454-
let handle = CodesFile::new_from_index(index)?;
455-
drop(handle);
456-
457-
Ok(())
458-
}
459-
460-
#[test]
461-
#[cfg(feature = "experimental_index")]
462-
fn empty_index_constructor() -> Result<()> {
463-
let index =
464-
CodesIndex::new_from_keys(&vec!["shortName", "typeOfLevel", "level", "stepType"])?;
465-
466-
let mut handle = CodesFile::new_from_index(index)?;
467-
468-
assert!(!handle.source.pointer.is_null());
469-
470-
let msg = handle.ref_message_generator().next()?;
471-
472-
assert!(!msg.is_some());
473-
474-
Ok(())
475-
}
476-
477-
#[test]
478-
#[cfg(feature = "experimental_index")]
479-
fn multiple_drops_with_index() -> Result<()> {
480-
{
481-
let keys = vec!["typeOfLevel", "level"];
482-
let index = CodesIndex::new_from_keys(&keys)?;
483-
let grib_path = Path::new("./data/iceland-levels.grib");
484-
let index = index
485-
.add_grib_file(grib_path)?
486-
.select("typeOfLevel", "isobaricInhPa")?
487-
.select("level", 600)?;
488-
489-
let mut handle = CodesFile::new_from_index(index)?;
490-
let mut mgen = handle.ref_message_generator();
491-
let _ref_msg = mgen.next()?.context("no message")?;
492-
let mut clone_msg = _ref_msg.try_clone()?;
493-
let _oth_ref = mgen.next()?.context("no message")?;
367+
let _oth_ref = handle.ref_message_iter().next()?.context("no message")?;
494368

495369
let _nrst = clone_msg.codes_nearest()?;
496370
drop(_nrst);

0 commit comments

Comments
 (0)