@@ -1461,6 +1461,12 @@ mod _sqlite {
14611461 statement : Option < PyRef < Statement > > ,
14621462 }
14631463
1464+ #[ derive( FromArgs ) ]
1465+ struct FetchManyArgs {
1466+ #[ pyarg( any, name = "size" , optional) ]
1467+ size : Option < c_int > ,
1468+ }
1469+
14641470 #[ pyclass( with( Constructor , IterNext , Iterable ) , flags( BASETYPE ) ) ]
14651471 impl Cursor {
14661472 fn new (
@@ -1684,38 +1690,15 @@ mod _sqlite {
16841690 #[ pymethod]
16851691 fn fetchmany (
16861692 zelf : & Py < Self > ,
1687- mut args : FuncArgs ,
1693+ args : FetchManyArgs ,
16881694 vm : & VirtualMachine ,
16891695 ) -> PyResult < Vec < PyObjectRef > > {
1690- let size_posarg = args. take_positional ( ) ;
1691- let size_kwarg = args. take_keyword ( "size" ) ;
1692-
1693- if !args. args . is_empty ( ) {
1694- return Err ( vm. new_type_error ( format ! (
1695- "fetchmany() takes from 0 to 1 positional arguments but {} were given" ,
1696- args. args. len( ) + 1
1697- ) ) ) ;
1698- }
1699-
1700- if let Some ( ( name_str, _) ) = args. kwargs . into_iter ( ) . next ( ) {
1701- return Err ( vm. new_type_error ( format ! (
1702- "fetchmany() got an unexpected keyword argument {name_str}" ,
1703- ) ) ) ;
1704- }
1705-
1706- let max_rows: c_int = match ( size_posarg, size_kwarg) {
1707- ( Some ( pos) , None ) => pos. try_into_value ( vm) ?,
1708- ( None , Some ( kw) ) => kw. try_into_value ( vm) ?,
1709- ( None , None ) => zelf. arraysize . load ( Ordering :: Relaxed ) ,
1710- ( Some ( _) , Some ( _) ) => {
1711- return Err ( vm. new_type_error (
1712- "fetchmany() got multiple values for argument 'size'" . to_owned ( ) ,
1713- ) ) ;
1714- }
1715- } ;
1696+ let max_rows = args
1697+ . size
1698+ . unwrap_or_else ( || zelf. arraysize . load ( Ordering :: Relaxed ) ) ;
17161699
17171700 let mut list = vec ! [ ] ;
1718- while let PyIterReturn :: Return ( row) = Self :: next ( zelf, vm) ? {
1701+ while let PyIterReturn :: Return ( row) = Cursor :: next ( zelf, vm) ? {
17191702 list. push ( row) ;
17201703 if max_rows > 0 && list. len ( ) as c_int >= max_rows {
17211704 break ;
0 commit comments