@@ -8,7 +8,7 @@ use gel_protocol::codec;
88use gel_protocol:: model:: { BigInt , Decimal } ;
99use pyo3:: exceptions:: { PyAssertionError , PyValueError } ;
1010use pyo3:: prelude:: * ;
11- use pyo3:: types:: { PyBytes , PyDict , PyFloat , PyInt , PyList , PyString , PyTuple } ;
11+ use pyo3:: types:: { PyBytes , PyDict , PyFloat , PyInt , PyList , PyString } ;
1212
1313use crate :: errors:: SyntaxError ;
1414use crate :: normalize:: { normalize as _normalize, Error , PackedEntry , Variable } ;
@@ -74,23 +74,22 @@ impl Entry {
7474impl Entry {
7575 fn get_variables ( & self , py : Python ) -> PyResult < PyObject > {
7676 let vars = PyDict :: new ( py) ;
77- for ( param_name, _, _, value) in VariableNameIter :: new ( self ) {
78- vars. set_item ( param_name, TokenizerValue ( value) ) ?;
77+ let first = match self . first_extra {
78+ Some ( first) => first,
79+ None => return Ok ( vars. into ( ) ) ,
80+ } ;
81+ for ( idx, var) in self . entry_pack . variables . iter ( ) . flatten ( ) . enumerate ( ) {
82+ let s = if self . extra_named {
83+ format ! ( "__edb_arg_{}" , first + idx)
84+ } else {
85+ ( first + idx) . to_string ( )
86+ } ;
87+ vars. set_item ( s, TokenizerValue ( & var. value ) ) ?;
7988 }
8089
8190 Ok ( vars. into ( ) )
8291 }
8392
84- // This function returns a dictionary mapping normalized parameter names to their blob and var indexes.
85- fn get_extra_variable_indexes ( & self , py : Python ) -> PyResult < PyObject > {
86- let indexes = PyDict :: new ( py) ;
87- for ( param_name, blob_index, var_index, _) in VariableNameIter :: new ( self ) {
88- indexes. set_item ( param_name, PyTuple :: new ( py, [ blob_index, var_index] ) ?) ?;
89- }
90-
91- Ok ( indexes. into ( ) )
92- }
93-
9493 fn pack ( & self , py : Python ) -> PyResult < PyObject > {
9594 let mut buf = vec ! [ 1u8 ] ; // type and version
9695 bincode:: serialize_into ( & mut buf, & self . entry_pack )
@@ -99,69 +98,6 @@ impl Entry {
9998 }
10099}
101100
102- struct VariableNameIter < ' a > {
103- entry_pack : & ' a PackedEntry ,
104- first_extra : Option < usize > ,
105- extra_named : bool ,
106- name_index : usize ,
107- blob_index : usize ,
108- var_index : usize ,
109- }
110-
111- impl < ' a > VariableNameIter < ' a > {
112- pub fn new ( entry : & ' a Entry ) -> Self {
113- VariableNameIter {
114- entry_pack : & entry. entry_pack ,
115- first_extra : entry. first_extra ,
116- extra_named : entry. extra_named ,
117- name_index : 0 ,
118- blob_index : 0 ,
119- var_index : 0 ,
120- }
121- }
122- }
123-
124- impl < ' a > Iterator for VariableNameIter < ' a > {
125- type Item = ( String , usize , usize , & ' a Value ) ;
126-
127- fn next ( & mut self ) -> Option < Self :: Item > {
128- // Check termination
129- let first = self . first_extra ?;
130- if self . blob_index >= self . entry_pack . variables . len ( ) {
131- return None ;
132- }
133- if self . var_index >= self . entry_pack . variables [ self . blob_index ] . len ( ) {
134- return None ;
135- }
136-
137- // Get result
138- let blob_vars = self . entry_pack . variables . get ( self . blob_index ) ?;
139-
140- let name = if self . extra_named {
141- format ! ( "__edb_arg_{}" , first + self . name_index)
142- } else {
143- ( first + self . name_index ) . to_string ( )
144- } ;
145-
146- let result = (
147- name,
148- self . blob_index ,
149- self . var_index ,
150- & blob_vars[ self . var_index ] . value ,
151- ) ;
152-
153- // Advance indexes
154- self . var_index += 1 ;
155- if self . var_index >= blob_vars. len ( ) {
156- self . var_index = 0 ;
157- self . blob_index += 1 ;
158- }
159- self . name_index += 1 ;
160-
161- Some ( result)
162- }
163- }
164-
165101pub fn serialize_extra ( variables : & [ Variable ] ) -> Result < Bytes , String > {
166102 use gel_protocol:: codec:: Codec ;
167103 use gel_protocol:: value:: Value as P ;
0 commit comments