@@ -54,26 +54,17 @@ impl Connection {
54
54
let msg = CStr :: from_ptr ( xdb_errmsg ( ptr) ) . to_str ( ) ?. to_string ( ) ;
55
55
return Err ( Error :: Query ( res. errcode , msg) ) ;
56
56
}
57
- Ok ( ExecResult {
58
- ptr,
59
- col_meta : res. col_meta ,
60
- column_count : res. col_count as usize ,
61
- row_count : res. row_count as usize ,
62
- column_types : ColumnType :: all ( & res) ,
63
- row_index : 0 ,
64
- } )
57
+ let types = ColumnType :: all ( & res) ;
58
+ Ok ( ExecResult { res, ptr, types } )
65
59
}
66
60
}
67
61
}
68
62
69
63
#[ derive( Debug ) ]
70
64
pub struct ExecResult {
65
+ res : xdb_res_t ,
71
66
ptr : * mut xdb_res_t ,
72
- col_meta : u64 ,
73
- column_count : usize ,
74
- row_count : usize ,
75
- column_types : Vec < ColumnType > ,
76
- row_index : usize ,
67
+ types : Vec < ColumnType > ,
77
68
}
78
69
79
70
impl Drop for ExecResult {
@@ -86,41 +77,41 @@ impl Drop for ExecResult {
86
77
87
78
impl ExecResult {
88
79
pub fn column_count ( & self ) -> usize {
89
- self . column_count
80
+ self . res . col_count as usize
90
81
}
91
82
92
83
pub fn row_count ( & self ) -> usize {
93
- self . row_count
84
+ self . res . row_count as usize
85
+ }
86
+
87
+ pub fn affected_rows ( & self ) -> u64 {
88
+ self . res . affected_rows
94
89
}
95
90
96
91
pub fn column_name < ' a > ( & ' a self , i : usize ) -> & ' a str {
97
92
unsafe {
98
- let name = xdb_column_name ( self . col_meta , i as u16 ) ;
93
+ let name = xdb_column_name ( self . res . col_meta , i as u16 ) ;
99
94
CStr :: from_ptr ( name) . to_str ( ) . unwrap ( )
100
95
}
101
96
}
102
97
103
98
pub fn column_type ( & self , i : usize ) -> ColumnType {
104
- self . column_types [ i]
99
+ self . types [ i]
105
100
}
106
- }
107
101
108
- impl < ' a > Iterator for & ' a mut ExecResult {
109
- type Item = Vec < Value < ' a > > ;
110
-
111
- fn next ( & mut self ) -> Option < Self :: Item > {
112
- if self . row_count <= self . row_index {
113
- return None ;
114
- }
115
- let mut values = Vec :: with_capacity ( self . column_count ) ;
102
+ pub fn fetch_row ( & mut self ) -> Option < Vec < Value < ' _ > > > {
116
103
unsafe {
117
- let y = xdb_fetch_row ( self . ptr ) ;
118
- for x in 0 ..self . column_count {
119
- let value = Value :: from_result ( self . col_meta , y, x as u16 , self . column_type ( x) ) ;
104
+ let row = xdb_fetch_row ( self . ptr ) ;
105
+ if row. is_null ( ) {
106
+ return None ;
107
+ }
108
+ let mut values = Vec :: with_capacity ( self . column_count ( ) ) ;
109
+ for col in 0 ..self . column_count ( ) {
110
+ let value =
111
+ Value :: from_result ( self . res . col_meta , row, col as u16 , self . column_type ( col) ) ;
120
112
values. push ( value) ;
121
113
}
114
+ Some ( values)
122
115
}
123
- self . row_index += 1 ;
124
- Some ( values)
125
116
}
126
117
}
0 commit comments