Skip to content

Commit 81e1b14

Browse files
committed
impl it in driver
1 parent 16d2dff commit 81e1b14

File tree

2 files changed

+47
-55
lines changed

2 files changed

+47
-55
lines changed

core/src/pages.rs

Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -47,58 +47,6 @@ impl Page {
4747
}
4848
self.stats = p.stats;
4949
}
50-
51-
pub fn affected_rows(&self) -> Result<i64, String> {
52-
if self.schema.is_empty() {
53-
return Ok(0);
54-
}
55-
56-
let first_field = &self.schema[0];
57-
58-
if !first_field.name.contains("number of rows") {
59-
return Ok(0);
60-
}
61-
62-
if self.data.is_empty() || self.data[0].is_empty() {
63-
return Ok(0);
64-
}
65-
66-
match &self.data[0][0] {
67-
Some(value_str) => self.parse_row_count_string(value_str),
68-
None => Ok(0),
69-
}
70-
}
71-
72-
fn parse_row_count_string(&self, value_str: &str) -> Result<i64, String> {
73-
let trimmed = value_str.trim();
74-
75-
if trimmed.is_empty() {
76-
return Ok(0);
77-
}
78-
79-
if let Ok(count) = trimmed.parse::<i64>() {
80-
return Ok(count);
81-
}
82-
83-
if let Ok(count) = serde_json::from_str::<i64>(trimmed) {
84-
return Ok(count);
85-
}
86-
87-
let unquoted = trimmed.trim_matches('"');
88-
if let Ok(count) = unquoted.parse::<i64>() {
89-
return Ok(count);
90-
}
91-
92-
Err(format!(
93-
"failed to parse affected rows from: '{}'",
94-
value_str
95-
))
96-
}
97-
98-
///the schema can be `number of rows inserted`, `number of rows deleted`, `number of rows updated` when sql start with `insert`, `delete`, `update`
99-
pub fn has_affected_rows(&self) -> bool {
100-
!self.schema.is_empty() && self.schema[0].name.contains("number of rows")
101-
}
10250
}
10351

10452
type PageFut = Pin<Box<dyn Future<Output = Result<QueryResponse>> + Send>>;

driver/src/rest_api.rs

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,7 @@ impl IConnection for RestAPIConnection {
6565
async fn exec(&self, sql: &str) -> Result<i64> {
6666
info!("exec: {}", sql);
6767
let page = self.client.query_all(sql).await?;
68-
69-
let affected_rows = page.affected_rows().map_err(Error::InvalidResponse)?;
70-
68+
let affected_rows = parse_affected_rows_from_page(&page)?;
7169
Ok(affected_rows)
7270
}
7371

@@ -290,3 +288,49 @@ impl FromRowStats for RawRowWithStats {
290288
Ok(RawRowWithStats::Row(RawRow::new(rows, row)))
291289
}
292290
}
291+
292+
fn parse_affected_rows_from_page(page: &databend_client::Page) -> Result<i64> {
293+
if page.schema.is_empty() {
294+
return Ok(0);
295+
}
296+
297+
let first_field = &page.schema[0];
298+
if !first_field.name.contains("number of rows") {
299+
return Ok(0);
300+
}
301+
302+
if page.data.is_empty() || page.data[0].is_empty() {
303+
return Ok(0);
304+
}
305+
306+
match &page.data[0][0] {
307+
Some(value_str) => parse_row_count_string(value_str).map_err(Error::InvalidResponse),
308+
None => Ok(0),
309+
}
310+
}
311+
312+
fn parse_row_count_string(value_str: &str) -> Result<i64, String> {
313+
let trimmed = value_str.trim();
314+
315+
if trimmed.is_empty() {
316+
return Ok(0);
317+
}
318+
319+
if let Ok(count) = trimmed.parse::<i64>() {
320+
return Ok(count);
321+
}
322+
323+
if let Ok(count) = serde_json::from_str::<i64>(trimmed) {
324+
return Ok(count);
325+
}
326+
327+
let unquoted = trimmed.trim_matches('"');
328+
if let Ok(count) = unquoted.parse::<i64>() {
329+
return Ok(count);
330+
}
331+
332+
Err(format!(
333+
"failed to parse affected rows from: '{}'",
334+
value_str
335+
))
336+
}

0 commit comments

Comments
 (0)