@@ -2200,14 +2200,24 @@ def download_binary_data(trans_id):
22002200 (status , error_msg , conn , trans_obj ,
22012201 session_obj ) = check_transaction_status (trans_id )
22022202
2203- cur = conn ._Connection__async_cursor
2204- register_binary_data_typecasters (cur )
2203+ if error_msg :
2204+ return internal_server_error (
2205+ errormsg = error_msg
2206+ )
2207+
22052208 if not status or conn is None or trans_obj is None or \
22062209 session_obj is None :
22072210 return internal_server_error (
22082211 errormsg = TRANSACTION_STATUS_CHECK_FAILED
22092212 )
22102213
2214+ cur = conn ._Connection__async_cursor
2215+ if cur is None :
2216+ return internal_server_error (
2217+ errormsg = gettext ('No active result cursor.' )
2218+ )
2219+ register_binary_data_typecasters (cur )
2220+
22112221 data = request .values if request .values else request .get_json (silent = True )
22122222 if data is None :
22132223 return make_json_response (
@@ -2222,7 +2232,25 @@ def download_binary_data(trans_id):
22222232 binary_data = cur .fetchone ()
22232233 binary_data = binary_data [col_pos ]
22242234
2225- return send_file (
2235+ try :
2236+ row_pos = int (data ['rowpos' ])
2237+ col_pos = int (data ['colpos' ])
2238+ if row_pos < 0 or col_pos < 0 :
2239+ raise ValueError
2240+ cur .scroll (row_pos )
2241+ row = cur .fetchone ()
2242+ if row is None or col_pos >= len (row ):
2243+ return internal_server_error (
2244+ errormsg = gettext ('Requested cell is out of range.' )
2245+ )
2246+ binary_data = row [col_pos ]
2247+ except (ValueError , IndexError , TypeError ) as e :
2248+ current_app .logger .error (e )
2249+ return internal_server_error (
2250+ errormsg = 'Invalid row/column position.'
2251+ )
2252+
2253+ return send_file (
22262254 BytesIO (binary_data ),
22272255 as_attachment = True ,
22282256 download_name = 'binary_data' ,
0 commit comments