zeroshade commented on code in PR #3099: URL: https://github.com/apache/arrow-adbc/pull/3099#discussion_r2198836790
########## rust/core/src/driver_manager.rs: ########## @@ -184,6 +279,59 @@ impl ManagedDriver { Ok(ManagedDriver { inner }) } + /// Load a driver either by name, filename, path, or via locating a toml manifest file. + /// The `load_flags` control what directories are searched to locate a manifest. + /// The `entrypoint` allows customizing the name of the driver initialization function + /// if it is not the default `AdbcDriverInit` and isn't described in the loaded manifest. + /// If not provided, an entrypoint will be searched for based on the driver's name. + /// The `version` defines the ADBC revision to attempt to initialize. + /// + /// The full logic used here is as follows: + /// - if `name` has an extension: it is treated as a filename. If the load_flags does not + /// contain `LOAD_FLAG_ALLOW_RELATIVE_PATHS`, then relative paths will be rejected. + /// - if the extension is `toml` then we attempt to load the Driver Manifest, otherwise + /// we defer to the previous logic in load_dynamic_from_filename which will attempt to + /// load the library + /// - if `name` does not have an extension but is an absolute path: we first check to see + /// if there is an existing file with the same name that *does* have a "toml" extension, + /// attempting to load that if it exists. Otherwise we just pass it to load_dynamic_from_filename. + /// - Finally, if there's no extension and it is not an absolute path, we call `find_driver` Review Comment: how's the updated version? ########## rust/core/src/driver_manager.rs: ########## @@ -161,8 +170,94 @@ struct ManagedDriverInner { _library: Option<libloading::Library>, } +#[derive(Default)] +struct DriverInfo { + manifest_file: std::path::PathBuf, + lib_path: std::path::PathBuf, + entrypoint: Option<Vec<u8>>, + // TODO: until we add more logging these are unused so we'll leave + // them out until such time that we do so. + // driver_name: String, + // version: String, + // source: String, +} + +impl DriverInfo { + fn load_driver_manifest(&self) -> Result<Self> { + let contents = fs::read_to_string(self.manifest_file.as_path()).map_err(|e| { + Error::with_message_and_status( + format!( + "Could not read manifest '{}': {e}", + self.manifest_file.display() + ), + Status::InvalidArguments, + ) + })?; + + let manifest = contents + .parse::<Table>() + .map_err(|e| Error::with_message_and_status(e.to_string(), Status::InvalidArguments))?; + + // leave these out until we add logging that would actually utilize them + // let driver_name = get_optional_key(&manifest, "name"); + // let version = get_optional_key(&manifest, "version"); + // let source = get_optional_key(&manifest, "source"); + let (os, arch, extra) = arch_triplet(); + + let mut lib_path = PathBuf::default(); + if let Some(driver) = manifest.get("Driver").and_then(|v| v.get("shared")) { + if driver.is_str() { + lib_path = PathBuf::from(driver.as_str().unwrap_or_default()); + } else if driver.is_table() { + lib_path = PathBuf::from( + driver + .get(format!("{os}_{arch}{extra}")) + .and_then(Value::as_str) + .unwrap_or_default(), + ); + } + } + + if lib_path.as_os_str().is_empty() { + return Err(Error::with_message_and_status( + format!( + "Manifest '{}' missing Driver.shared key of {os}_{arch}{extra}", Review Comment: How is the updated verison? -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: github-unsubscr...@arrow.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org