Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commite64754f

Browse files
committed
Improve performance of fetching number columns by skipping UTF-8 validation
1 parent5bbb87a commite64754f

File tree

2 files changed

+40
-29
lines changed

2 files changed

+40
-29
lines changed

‎ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Internal Changes:
1111
* Update ODPI-C to 5.3.0. (see[ODPI-C release notes])
1212
* Improve performance of fetching numeric types when number column definition is out of range of i64.
1313
Seehttps://github.com/kubo/rust-oracle/issues/89#issuecomment-2435662861
14+
* Improve performance of fetching number columns by skipping UTF-8 validation
1415

1516
##0.6.2 (2024-06-26)
1617

‎src/sql_value.rs

Lines changed: 39 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,9 @@ macro_rules! define_fn_to_int {
8686
flt_to_int!(self.get_f32_unchecked()?,f32, $type),
8787
NativeType::Double =>
8888
flt_to_int!(self.get_f64_unchecked()?,f64, $type),
89-
NativeType::Char |
90-
NativeType::Clob |
91-
NativeType::Number =>
92-
Ok(self.get_cow_str()?.parse()?),
89+
NativeType::Char =>Ok(self.get_cow_str_unchecked()?.parse()?),
90+
NativeType::Number =>Ok(self.get_str_unchecked()?.parse()?),
91+
NativeType::Clob =>Ok(self.get_clob_as_string_unchecked()?.parse()?),
9392
_ =>
9493
self.invalid_conversion_to_rust_type(stringify!($type))
9594
}
@@ -445,14 +444,6 @@ impl SqlValue<'_> {
445444
}
446445
}
447446

448-
fnget_cow_str(&self) ->Result<Cow<str>>{
449-
matchself.native_type{
450-
NativeType::Char |NativeType::Number =>self.get_cow_str_unchecked(),
451-
NativeType::Clob =>Ok(self.get_clob_as_string_unchecked()?.into()),
452-
_ =>self.invalid_conversion_to_rust_type("String"),
453-
}
454-
}
455-
456447
//
457448
// get_TYPE_unchecked methods
458449
//
@@ -497,6 +488,20 @@ impl SqlValue<'_> {
497488
}
498489
}
499490

491+
/// Gets the SQL value as utf8 string. The native_type must be
492+
/// NativeType::Char or NativeType::Number. Otherwise, this may cause access
493+
/// violation.
494+
/// Unlike get_cow_str_unchecked() this doesn't check whether the byte sequence
495+
/// is a valid UTF-8.
496+
fnget_str_unchecked(&self) ->Result<&str>{
497+
self.check_not_null()?;
498+
unsafe{
499+
let bytes =dpiData_getBytes(self.data()?);
500+
let s = slice::from_raw_parts((*bytes).ptras*mutu8,(*bytes).lengthasusize);
501+
Ok(str::from_utf8_unchecked(s))
502+
}
503+
}
504+
500505
/// Gets the SQL value as Vec<u8>. The native_type must be
501506
/// NativeType::Raw. Otherwise, this may cause access violation.
502507
fnget_raw_unchecked(&self) ->Result<Vec<u8>>{
@@ -907,9 +912,9 @@ impl SqlValue<'_> {
907912
NativeType::UInt64 =>Ok(self.get_u64_unchecked()?.try_into()?),
908913
NativeType::Float =>flt_to_int!(self.get_f32_unchecked()?,f32,i64),
909914
NativeType::Double =>flt_to_int!(self.get_f64_unchecked()?,f64,i64),
910-
NativeType::Char|NativeType::Clob |NativeType::Number=>{
911-
Ok(self.get_cow_str()?.parse()?)
912-
}
915+
NativeType::Char =>Ok(self.get_cow_str_unchecked()?.parse()?),
916+
NativeType::Number =>Ok(self.get_str_unchecked()?.parse()?),
917+
NativeType::Clob =>Ok(self.get_clob_as_string_unchecked()?.parse()?),
913918
_ =>self.invalid_conversion_to_rust_type("i64"),
914919
}
915920
}
@@ -939,9 +944,9 @@ impl SqlValue<'_> {
939944
NativeType::UInt64 =>self.get_u64_unchecked(),
940945
NativeType::Float =>flt_to_int!(self.get_f32_unchecked()?,f32,u64),
941946
NativeType::Double =>flt_to_int!(self.get_f64_unchecked()?,f64,u64),
942-
NativeType::Char|NativeType::Clob |NativeType::Number=>{
943-
Ok(self.get_cow_str()?.parse()?)
944-
}
947+
NativeType::Char =>Ok(self.get_cow_str_unchecked()?.parse()?),
948+
NativeType::Number =>Ok(self.get_str_unchecked()?.parse()?),
949+
NativeType::Clob =>Ok(self.get_clob_as_string_unchecked()?.parse()?),
945950
_ =>self.invalid_conversion_to_rust_type("u64"),
946951
}
947952
}
@@ -954,9 +959,9 @@ impl SqlValue<'_> {
954959
NativeType::UInt64 =>Ok(self.get_u64_unchecked()?asf32),
955960
NativeType::Float =>self.get_f32_unchecked(),
956961
NativeType::Double =>Ok(self.get_f64_unchecked()?asf32),
957-
NativeType::Char|NativeType::Clob |NativeType::Number=>{
958-
Ok(self.get_cow_str()?.parse()?)
959-
}
962+
NativeType::Char =>Ok(self.get_cow_str_unchecked()?.parse()?),
963+
NativeType::Number =>Ok(self.get_str_unchecked()?.parse()?),
964+
NativeType::Clob =>Ok(self.get_clob_as_string_unchecked()?.parse()?),
960965
_ =>self.invalid_conversion_to_rust_type("f32"),
961966
}
962967
}
@@ -969,9 +974,9 @@ impl SqlValue<'_> {
969974
NativeType::UInt64 =>Ok(self.get_u64_unchecked()?asf64),
970975
NativeType::Float =>Ok(self.get_f32_unchecked()?asf64),
971976
NativeType::Double =>self.get_f64_unchecked(),
972-
NativeType::Char|NativeType::Clob |NativeType::Number=>{
973-
Ok(self.get_cow_str()?.parse()?)
974-
}
977+
NativeType::Char =>Ok(self.get_cow_str_unchecked()?.parse()?),
978+
NativeType::Number =>Ok(self.get_str_unchecked()?.parse()?),
979+
NativeType::Clob =>Ok(self.get_clob_as_string_unchecked()?.parse()?),
975980
_ =>self.invalid_conversion_to_rust_type("f64"),
976981
}
977982
}
@@ -983,7 +988,8 @@ impl SqlValue<'_> {
983988
NativeType::UInt64 =>Ok(self.get_u64_unchecked()?.to_string()),
984989
NativeType::Float =>Ok(self.get_f32_unchecked()?.to_string()),
985990
NativeType::Double =>Ok(self.get_f64_unchecked()?.to_string()),
986-
NativeType::Char |NativeType::Number =>Ok(self.get_cow_str_unchecked()?.into()),
991+
NativeType::Char =>Ok(self.get_cow_str_unchecked()?.into()),
992+
NativeType::Number =>Ok(self.get_str_unchecked()?.into()),
987993
NativeType::Raw =>self.get_raw_as_hex_string_unchecked(),
988994
NativeType::Timestamp =>Ok(self.get_timestamp_unchecked()?.to_string()),
989995
NativeType::IntervalDS =>Ok(self.get_interval_ds_unchecked()?.to_string()),
@@ -1012,7 +1018,8 @@ impl SqlValue<'_> {
10121018
matchself.native_type{
10131019
NativeType::Raw =>self.get_raw_unchecked(),
10141020
NativeType::Blob =>self.get_blob_unchecked(),
1015-
NativeType::Char |NativeType::Clob =>Ok(parse_str_into_raw(&self.get_cow_str()?)?),
1021+
NativeType::Char =>Ok(parse_str_into_raw(&self.get_cow_str_unchecked()?)?),
1022+
NativeType::Clob =>Ok(parse_str_into_raw(&self.get_clob_as_string_unchecked()?)?),
10161023
_ =>self.invalid_conversion_to_rust_type("raw"),
10171024
}
10181025
}
@@ -1022,7 +1029,8 @@ impl SqlValue<'_> {
10221029
pub(crate)fnto_timestamp(&self) ->Result<Timestamp>{
10231030
matchself.native_type{
10241031
NativeType::Timestamp =>self.get_timestamp_unchecked(),
1025-
NativeType::Char |NativeType::Clob =>Ok(self.get_cow_str()?.parse()?),
1032+
NativeType::Char =>Ok(self.get_cow_str_unchecked()?.parse()?),
1033+
NativeType::Clob =>Ok(self.get_clob_as_string_unchecked()?.parse()?),
10261034
_ =>self.invalid_conversion_to_rust_type("Timestamp"),
10271035
}
10281036
}
@@ -1032,7 +1040,8 @@ impl SqlValue<'_> {
10321040
pub(crate)fnto_interval_ds(&self) ->Result<IntervalDS>{
10331041
matchself.native_type{
10341042
NativeType::IntervalDS =>self.get_interval_ds_unchecked(),
1035-
NativeType::Char |NativeType::Clob =>Ok(self.get_cow_str()?.parse()?),
1043+
NativeType::Char =>Ok(self.get_cow_str_unchecked()?.parse()?),
1044+
NativeType::Clob =>Ok(self.get_clob_as_string_unchecked()?.parse()?),
10361045
_ =>self.invalid_conversion_to_rust_type("IntervalDS"),
10371046
}
10381047
}
@@ -1042,7 +1051,8 @@ impl SqlValue<'_> {
10421051
pub(crate)fnto_interval_ym(&self) ->Result<IntervalYM>{
10431052
matchself.native_type{
10441053
NativeType::IntervalYM =>self.get_interval_ym_unchecked(),
1045-
NativeType::Char |NativeType::Clob =>Ok(self.get_cow_str()?.parse()?),
1054+
NativeType::Char =>Ok(self.get_cow_str_unchecked()?.parse()?),
1055+
NativeType::Clob =>Ok(self.get_clob_as_string_unchecked()?.parse()?),
10461056
_ =>self.invalid_conversion_to_rust_type("IntervalYM"),
10471057
}
10481058
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp