(zelf: &Py<Self>, vm: &VirtualMachine)
| 2076 | impl SelfIter for Cursor {} |
| 2077 | impl IterNext for Cursor { |
| 2078 | fn next(zelf: &Py<Self>, vm: &VirtualMachine) -> PyResult<PyIterReturn> { |
| 2079 | // Check if connection is closed first, and if so, clear statement to release file lock |
| 2080 | if zelf.connection.is_closed() { |
| 2081 | let mut guard = zelf.inner.lock(); |
| 2082 | if let Some(stmt) = guard.as_mut().and_then(|inner| inner.statement.take()) { |
| 2083 | stmt.lock().reset(); |
| 2084 | } |
| 2085 | return Err(new_programming_error( |
| 2086 | vm, |
| 2087 | "Cannot operate on a closed database.".to_owned(), |
| 2088 | )); |
| 2089 | } |
| 2090 | |
| 2091 | let mut inner = zelf.inner(vm)?; |
| 2092 | let Some(stmt) = &inner.statement else { |
| 2093 | return Ok(PyIterReturn::StopIteration(None)); |
| 2094 | }; |
| 2095 | let st = stmt.lock(); |
| 2096 | let db = zelf.connection.db_lock(vm)?; |
| 2097 | // fetch_one_row |
| 2098 | |
| 2099 | let num_cols = st.data_count(); |
| 2100 | |
| 2101 | let mut row = Vec::with_capacity(num_cols as usize); |
| 2102 | |
| 2103 | for i in 0..num_cols { |
| 2104 | let val = if let Some(converter) = |
| 2105 | inner.row_cast_map.get(i as usize).cloned().flatten() |
| 2106 | { |
| 2107 | let blob = st.column_blob(i); |
| 2108 | if blob.is_null() { |
| 2109 | vm.ctx.none() |
| 2110 | } else { |
| 2111 | let nbytes = st.column_bytes(i); |
| 2112 | let blob = unsafe { |
| 2113 | core::slice::from_raw_parts(blob.cast::<u8>(), nbytes as usize) |
| 2114 | }; |
| 2115 | let blob = vm.ctx.new_bytes(blob.to_vec()); |
| 2116 | converter.call((blob,), vm)? |
| 2117 | } |
| 2118 | } else { |
| 2119 | let col_type = st.column_type(i); |
| 2120 | match col_type { |
| 2121 | SQLITE_NULL => vm.ctx.none(), |
| 2122 | SQLITE_INTEGER => vm.ctx.new_int(st.column_int(i)).into(), |
| 2123 | SQLITE_FLOAT => vm.ctx.new_float(st.column_double(i)).into(), |
| 2124 | SQLITE_TEXT => { |
| 2125 | let text = |
| 2126 | ptr_to_vec(st.column_text(i), st.column_bytes(i), db.db, vm)?; |
| 2127 | |
| 2128 | let text_factory = zelf.connection.text_factory.to_owned(); |
| 2129 | |
| 2130 | if text_factory.is(PyStr::class(&vm.ctx)) { |
| 2131 | let text = String::from_utf8(text).map_err(|err| { |
| 2132 | let col_name = st.column_name(i); |
| 2133 | let col_name_str = ptr_to_str(col_name, vm).unwrap_or("?"); |
| 2134 | let valid_up_to = err.utf8_error().valid_up_to(); |
| 2135 | let text_prefix = String::from_utf8_lossy(&err.as_bytes()[..valid_up_to]); |
no test coverage detected