# Change Log ## 0.5.8 (2024-06-26) Fixed Issues: * Fix memory leaks when [`Batch`] is explicitly closed by [`close()`][`Batch::close()`]. ## 0.5.7 (2023-01-30) New features: * Add `stmt_without_lifetime` feature flag. * Add [`ObjectType::package_name()`] * Add [`Statement::last_row_id()`] * Add [`Connection::last_warning()`] * Add [`iter()`][`Collection::iter()`], [`indices()`][`Collection::indices()`] and [`values()`][`Collection::values()`] methods, which creates iterators over [`Collection`] elements. Fixed Issues: * [`FromSql::from_sql`] for [chrono] data types returns [`Error::OutOfRange`] instead of panics when an invalid timestamp is retrieved from Oracle. Changes: * The [`Eq`] trait was implemented for enum types. Internal Changes: * Update ODPI-C to 4.6.0. (see [ODPI-C release notes](https://oracle.github.io/odpi/doc/releasenotes.html)) ## 0.5.6 (2022-08-09) Fixed Issues: * Fix RowValue which can reference an invalid Ok that defined outside (contributed by [GH-62]) Changes: * [`Connection::prepare()`] was marked as deprecated. Internal Changes: * Update ODPI-C to 4.4.1. (see [ODPI-C release notes](https://oracle.github.io/odpi/doc/releasenotes.html)) * Suppress 'cargo clippy' warnings * Use atomic types instead of RefCell and Mutex ## 0.5.5 (2022-05-11) New features: * [`RowValue` derive macro] (contributed by [GH-49]) * Add query methods for Statement which take ownership (contributed by [GH-50]) * Support connection pooling * [`pool`] * [`Connection::close_with_mode()`] * [`Connection::tag()`] * [`Connection::tag_found()`] * [`Connection::is_new_connection()`] * Add methods related to statement caching * [`Connector::stmt_cache_size()`] * [`StatementBuilder::exclude_from_cache()`] * [`StatementBuilder::tag()`] * Support Advanced Queuing experimentally when `aq_unstable` feature is enabled Breaking changes may be introduced by a minor release. Fixed bugs: * Fix resource leaks when statement are explicitly closed by [`Statement::close()`]. * Fix syntax typo in doc comment about [`Row::get_as()`] ([GH-54]) Internal Changes: * Update ODPI-C to 4.3.0. (see ODPI-C release notes: [4.3.0](https://oracle.github.io/odpi/doc/releasenotes.html#version-4-3-november-4-2021)) ## 0.5.4 (2022-01-20) Fixed bugs: * Fix resource leaks when Oracle object datatypes are used. ([GH-48][]) ## 0.5.3 (2021-08-15) New features: * Add [`Connection::statement()`][] and [`StatementBuilder`][] to create [`Statement`][] and deprecate [`Connection::prepare()`][]. * Customize prefetch row size ([`StatementBuilder::prefetch_rows()`]) [GH-40] * Read/Write LOBs as streams ([`sql_type::Lob`][], [`sql_type::Clob`][], [`sql_type::Nclob`][] and [`sql_type::Blob`][]) * Ref cursors including implicit statement results ([`sql_type::RefCursor`][]) [GH-38] * Add [`Connection::oci_attr`][], [`Connection::set_oci_attr`][], [`Statement::oci_attr`][] and [`Statement::oci_attr`][] to support OCI handle attributes. * `Impl ToSql for &'a [u8; N]` Internal Changes: * Bind LOB columns as string or binary by default ## 0.5.2 (2021-06-11) * Update ODPI-C to 4.2.1. (see ODPI-C release notes: [4.2.0](https://oracle.github.io/odpi/doc/releasenotes.html#version-4-2-may-18-2021) and [4.2.1](https://oracle.github.io/odpi/doc/releasenotes.html#version-4-2-1-june-1-2021)) * Make it possible to get rowid as string ([GH-36][]) * Make it possible to bind boolean values (PL/SQL only) ## 0.5.1 (2021-04-18) * Add [Batch DML][`Batch`] feature ([GH-29][]) * Implement `FromStr` for `Version`. * Add `OracleType::Json` variant. (Note: JSON data type has not been supported yet.) ## 0.4.0 (2021-03-07) Changes: * Based on ODPI-C 4.1.0 * The return value of [`DbError::offset()`][] was changed from u16 to u32. ## 0.3.3 (2020-10-25) Changes: * Add new methods [`Connection::call_timeout()`][] and [`Connection::set_call_timeout()`][] ## 0.3.2 (2019-11-14) Changes: * Fix SEGV while getting Object type's FLOAT data type attributes. ([GH-19][]) * Add workaround to use with [tracing-core](https://crates.io/crates/tracing-core). ([GH-18][]) ## 0.3.1 (2019-10-05) Changes: * Add a new method [`Connection::status()`][] and a new enum [`ConnStatus`][] to get the status of the connection. ## 0.3.0 (2019-10-02) Incompatible changes: * Remove `ConnParam` enum and add `Connector` struct to use builder pattern. * The fourth argument of `Connection::connect` was removed. From: ```rust let conn = Connection::connect(username, password, connect_string, &[])?; ``` To: ```rust let conn = Connection::connect(username, password, connect_string)?; ``` * Use `Connector` to use additional parameters. From: ```rust let conn = Connection::connect(username, password, connect_string, &[ConnParam::Sysdba])?; ``` To: ```rust let conn = Connector::new(username, password, connect_string).privilege(Privilege::Sysdba).connect()?; ``` or ```rust let mut connector = Connector::new(username, password, connect_string); connector.privilege(Privilege::Sysdba); let conn = connector.connect().unwrap(); ``` * Add a new submodule `sql_type` and move the following structs, enums and traits from the root module to the submodule. * `Collection` * `IntervalDS` * `IntervalYM` * `Object` * `ObjectType` * `ObjectTypeAttr` * `OracleType` * `Timestamp` * `FromSql` * `ToSql` * `ToSqlNull` * Remove `client_version()` method and add `Version::client()` method instead. * Remove the associated type `Item` from `RowValue` trait. * Add `&Connection` argument to trait methods: `ToSql::oratype` and `ToSqlNull::oratype_for_null`. * Iterator for `&ResultSet` was removed and that for `ResultSet` was added again for better ergonomics. Change `for row_result in &result_set {...}` to either `for row_result in result_set {...}` if the `ResultSet` can be consumed or to `for row_result in result_set.by_ref() {...}` otherwise. Changes: * Implement `FusedIterator` for `ResultSet`. * The return value of [`Connection::object_type()`][] is cached in the connection. When "CREATE TYPE", "ALTER TYPE" or "DROP TYPE" is executed, the cache clears. * Add `Connection.clear_object_type_cache()`. * Update ODPI-C to version 3.2.2. ## 0.2.2 (2019-09-29) * Implement `Sync` and `Send` for `Connection`. ([GH-14][]) ## 0.2.1 (2019-04-14) Changes: * Fix memory corruption when using object and collection data types. * Update ODPI-C to version 3.1.3. ## 0.2.0 (2018-10-02) Incompatible changes: * Make errors usable across threads ([GH-6][]) ## 0.1.2 (2018-09-22 - yanked because of packaging miss) Changes: * Change the license to the Universal Permissive License v 1.0 and/or the Apache License v 2.0. * Update ODPI-C to 3.0.0, which includes support for Oracle 18c client. * New methods * [`Statement::row_count()`][] ## 0.1.1 (2018-07-16) Changes: * Allow fetching BLOB data as `Vec`. * Implement `ToSql` and `ToSqlNull` for `&[u8]`. * Implement `Debug` for `Connection`, `Statement` and so on. * Update ODPI-C to version 2.4.2. ## 0.1.0 (2018-04-15) Changes: * New methods * [`Statement::is_query()`][] * [`Statement::is_plsql()`][] * [`Statement::is_ddl()`][] * [`Statement::is_dml()`][] Incompatible changes: * Iterator for `ResultSet` was removed and that for `&ResultSet` was added in order not to consume `ResultSet` by for-loop. Change `for row_result in result_set {...}` to `for row_result in &result_set {...}`. ## 0.0.8 (2018-03-25) Fixed bugs: * Fix an error when a column value converted from the database character set to UTF-8 becomes longer than the column size. ([GH-3][]) Incompatible changes: * BindIndex and ColumnIndex were sealed and cannot be implemented for types outside of the crate. * The `Other` variant of [`StatetmentType`][] enum was removed. `Commit`, `Rollback`, `ExplainPlan`, `Call` and `Unknown` variants were added to the enum. * Change the return type of [`ObjectType::new_object()`][] from `Option` to `Result`. * Change the return type of [`ObjectType::new_collection()`][] from `Option` to `Result`. ## 0.0.7 (2018-03-18) The method to prepare statements was changed for future extension. Changes: * New methods and structs * [`Statement::returned_values()`][] to support RETURNING INTO clause. * [`StmtParam`][] struct to specify prepared statement parameters. Incompatible changes: * Changed Methods * [`Connection::prepare()`][]. The `params` argument was added. * Removed methods * `Statement::set_fetch_array_size()`. Use [`StmtParam::FetchArraySize`][] instead. ## 0.0.6 (2018-03-11) Methods for establishing connections were changed in order to avoid incompatible changes when connection pooling is supported in future. Changes: * New methods and enums. * [`Connection::connect()`][] * [`ConnParam`][] * Deprecated methods. * `Connnection::new()`. Use [`Connection::connect()`][] instead. Incompatible changes: * Renamed variants. * `Error::NoMoreData` → [`Error::NoDataFound`][] * Removed structs and enums. * `Connector` (connection builder). Use [`ConnParam`][] in order to specify extra connection parameters instead. * `AuthMode`. Use [`ConnParam`][] to specify authentication mode instead. * Methods whose return type was changed from `&String` to `&str`. * [`Connection::tag()`][] * [`ColumnInfo::name()`][] * [`DbError::message()`][] * [`DbError::fn_name()`][] * [`DbError::action()`][] * [`ObjectType::schema()`][] * [`ObjectType::name()`][] * [`ObjectTypeAttr::name()`][] * Methods whose return type was changed from `&Vec<...>` to `&[...]`. * [`Row::sql_values()`][] * [`ResultSet::column_info()`][] * [`ObjectType::attributes()`][] ## 0.0.5 (2018-03-04) New features: * Add query methods to `Connection` to fetch rows without using `Statement`. * [`Connection::query()`][] * [`Connection::query_named()`][] * [`Connection::query_as()`][] * [`Connection::query_as_named()`][] * Add query_row methods to `Statement` to fetch a first row without using `ResultSet`. * [`Statement::query_row()`][] * [`Statement::query_row_named()`][] * [`Statement::query_row_as()`][] * [`Statement::query_row_as_named()`][] Incompatible changes: * Merge `RowResultSet` struct into `RowValueResultSet` and rename it to `ResultSet`. ## 0.0.4 (2018-02-25) New features: * Add query methods to `Statement` to fetch rows as iterator. * [`Statement::query()`][] * [`Statement::query_named()`][] * [`Statement::query_as()`][] * [`Statement::query_as_named()`][] * Add query_row methods to `Connection` to fetch a first row without using `Statement`. * [`Connection::query_row()`][] * [`Connection::query_row_named()`][] * [`Connection::query_row_as()`][] * [`Connection::query_row_as_named()`][] * Autocommit mode. Incompatible changes: * Execute methods fail for select statements. Use query methods instead. * [`Connection::execute()`][] * [`Connection::execute_named()`][] * [`Statement::execute()`][] * [`Statement::execute_named()`][] * Renamed traits, methods and variants. * `ColumnValues` → [`RowValue`][] * `Row::values()` → [`Row::get_as()`][] * `Row::columns()` → [`Row::sql_values()`][] * `Error::Overflow` → [`Error::OutOfRange`][] * Removed methods. * Statement::column_count() * Statement::column_names() * Statement::column_info() * Statement::fetch() * SqlValue::clone() [GH-3]: https://github.com/kubo/rust-oracle/issues/3 [GH-6]: https://github.com/kubo/rust-oracle/issues/6 [GH-14]: https://github.com/kubo/rust-oracle/issues/14 [GH-18]: https://github.com/kubo/rust-oracle/issues/18 [GH-19]: https://github.com/kubo/rust-oracle/issues/19 [GH-29]: https://github.com/kubo/rust-oracle/issues/29 [GH-36]: https://github.com/kubo/rust-oracle/issues/36 [GH-38]: https://github.com/kubo/rust-oracle/issues/38 [GH-40]: https://github.com/kubo/rust-oracle/issues/40 [GH-48]: https://github.com/kubo/rust-oracle/issues/48 [GH-49]: https://github.com/kubo/rust-oracle/issues/49 [GH-50]: https://github.com/kubo/rust-oracle/issues/50 [GH-54]: https://github.com/kubo/rust-oracle/issues/54 [GH-62]: https://github.com/kubo/rust-oracle/pull/62 [chrono]: https://docs.rs/chrono/latest/chrono/index.html [`pool`]: https://www.jiubao.org/rust-oracle/oracle/pool/index.html [`Batch`]: https://www.jiubao.org/rust-oracle/oracle/struct.Batch.html [`Batch::close()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Batch.html#method.close [`Collection`]: https://www.jiubao.org/rust-oracle/oracle/sql_type/struct.Collection.html [`Collection::indices()`]: https://www.jiubao.org/rust-oracle/oracle/sql_type/struct.Collection.html#method.indices [`Collection::iter()`]: https://www.jiubao.org/rust-oracle/oracle/sql_type/struct.Collection.html#method.iter [`Collection::values()`]: https://www.jiubao.org/rust-oracle/oracle/sql_type/struct.Collection.html#method.values [`ColumnInfo::name()`]: https://www.jiubao.org/rust-oracle/oracle/struct.ColumnInfo.html#method.name [`Connection::connect()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.connect [`Connection::call_timeout()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.call_timeout [`Connection::close_with_mode()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.close_with_mode [`Connection::execute()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.execute [`Connection::execute_named()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.execute_named [`Connection::is_new_connection()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.is_new_connection [`Connection::last_warning()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.last_warning [`Connection::object_type()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.object_type [`Connection::prepare()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.prepare [`Connection::query()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.query [`Connection::query_named()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.query_named [`Connection::query_as()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.query_as [`Connection::query_as_named()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.query_as_named [`Connection::query_row()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.query_row [`Connection::query_row_named()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.query_row_named [`Connection::query_row_as()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.query_row_as [`Connection::query_row_as_named()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.query_row_as_named [`Connection::statement()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.statement [`Connection::status()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.status [`Connection::set_call_timeout()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.set_call_timeout [`Connection::tag()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.tag [`Connection::tag_found()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connection.html#method.tag_found [`Connector::stmt_cache_size()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Connector.html#method.stmt_cache_size [`ConnParam`]: https://docs.rs/oracle/0.2.*/oracle/enum.ConnParam.html [`ConnStatus`]: https://www.jiubao.org/rust-oracle/oracle/enum.ConnStatus.html [`DbError::action()`]: https://www.jiubao.org/rust-oracle/oracle/struct.DbError.html#method.action [`DbError::fn_name()`]: https://www.jiubao.org/rust-oracle/oracle/struct.DbError.html#method.fn_name [`DbError::message()`]: https://www.jiubao.org/rust-oracle/oracle/struct.DbError.html#method.message [`DbError::offset()`]: https://www.jiubao.org/rust-oracle/oracle/struct.DbError.html#method.offset [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html [`Error::NoDataFound`]: https://www.jiubao.org/rust-oracle/oracle/enum.Error.html#variant.NoDataFound [`Error::OutOfRange`]: https://www.jiubao.org/rust-oracle/oracle/enum.Error.html#variant.OutOfRange [`FromSql::from_sql`]: https://www.jiubao.org/rust-oracle/oracle/sql_type/trait.FromSql.html#method.from_sql [`ObjectType::attributes()`]: https://docs.rs/oracle/0.2.*/oracle/struct.ObjectType.html#method.attributes [`ObjectType::name()`]: https://docs.rs/oracle/0.2.*/oracle/struct.ObjectType.html#method.name [`ObjectType::new_collection()`]: https://docs.rs/oracle/0.2.*/oracle/struct.ObjectType.html#method.new_collection [`ObjectType::new_object()`]: https://docs.rs/oracle/0.2.*/oracle/struct.ObjectType.html#method.new_object [`ObjectType::schema()`]: https://docs.rs/oracle/0.2.*/oracle/struct.ObjectType.html#method.schema [`ObjectType::package_name()`]: https://www.jiubao.org/rust-oracle/oracle/sql_type/struct.ObjectType.html#method.package_name [`ObjectTypeAttr::name()`]: https://docs.rs/oracle/0.2.*/oracle/struct.ObjectTypeAttr.html#method.name [`ResultSet::column_info()`]: https://www.jiubao.org/rust-oracle/oracle/struct.ResultSet.html#method.column_info [`Row::sql_values()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Row.html#method.sql_values [`Row::get_as()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Row.html#method.get_as [`RowValue`]: https://www.jiubao.org/rust-oracle/oracle/trait.RowValue.html [`RowValue` derive macro]: https://www.jiubao.org/rust-oracle/oracle/derive.RowValue.html [`Statement::close()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.close [`Statement::last_row_id()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.last_row_id [`Statement::execute()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.execute [`Statement::execute_named()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.execute_named [`Statement::query()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.query [`Statement::query_named()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.query_named [`Statement::query_as()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.query_as [`Statement::query_as_named()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.query_as_named [`Statement::query_row()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.query_row [`Statement::query_row_named()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.query_row_named [`Statement::query_row_as()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.query_row_as [`Statement::query_row_as_named()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.query_row_as_named [`Statement::returned_values()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.returned_values [`Statement::row_count()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.row_count [`Statement::is_query()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.is_query [`Statement::is_plsql()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.is_plsql [`Statement::is_ddl()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.is_ddl [`Statement::is_dml()`]: https://www.jiubao.org/rust-oracle/oracle/struct.Statement.html#method.id_dml [`StatementBuilder`]: https://www.jiubao.org/rust-oracle/oracle/struct.StatementBuilder.html [`StatementBuilder::exclude_from_cache()`]: https://www.jiubao.org/rust-oracle/oracle/struct.StatementBuilder.html#method.exclude_from_cache [`StatementBuilder::prefetch_rows()`]: https://www.jiubao.org/rust-oracle/oracle/struct.StatementBuilder.html#method.prefetch_rows [`StatementBuilder::tag()`]: https://www.jiubao.org/rust-oracle/oracle/struct.StatementBuilder.html#method.tag [`StmtParam`]: https://www.jiubao.org/rust-oracle/oracle/enum.StmtParam.html [`StmtParam::FetchArraySize`]: https://www.jiubao.org/rust-oracle/oracle/enum.StmtParam.html#variant.FetchArraySize