MCPcopy Index your code
hub / github.com/RustPython/RustPython / next

Method next

crates/stdlib/src/_sqlite3.rs:2078–2195  ·  view source on GitHub ↗
(zelf: &Py<Self>, vm: &VirtualMachine)

Source from the content-addressed store, hash-verified

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]);

Callers 1

build_row_cast_mapMethod · 0.45

Calls 15

ptr_to_vecFunction · 0.85
ptr_to_strFunction · 0.85
db_lockMethod · 0.80
data_countMethod · 0.80
column_blobMethod · 0.80
noneMethod · 0.80
column_bytesMethod · 0.80
to_vecMethod · 0.80
column_typeMethod · 0.80
column_intMethod · 0.80
column_doubleMethod · 0.80
column_textMethod · 0.80

Tested by

no test coverage detected