
    ]hV                     t   d dl mZ d dlmZmZmZmZmZmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ ddlmZmZ dd	lmZ dd
lmZ dZdZd Z	 	 	 	 	 	 	 	 d!dZ	 	 	 	 	 	 	 d"dZ G d de      Z G d de      Z G d de      Z  G d de      Z! G d de      Z" G d de      Z# G d de      Z$ G d d e      Z%y)#    )futures)BytesIOIOBaseSEEK_CURSEEK_ENDSEEK_SETUnsupportedOperation)islice)ceil)Lock)with_current_context   )encode_base64	url_quote)
get_length)return_response_headersi  @ z@{0} should be a seekable file-like/io.IOBase type stream object.c                    g }	 t        j                  |t         j                        \  }}|j                  |D cg c]  }|j	                          c}       	 t        dt        |            D ]7  }t        |      }|j                  | j                  t        |      |             9 	 c c}w # t        $ r Y nw xY wt        j                  |      \  }}	|j                  |D cg c]  }|j	                          nc c}w c}       |S )N)return_whenr   )r   waitFIRST_COMPLETEDextendresultrangelennextaddsubmitr   StopIteration)
executoruploaderpendingrunning	range_idsdonechunk_
next_chunk_runnings
             h/var/www/core.comfia.cic-ware.com/crm/lib/python3.12/site-packages/azure/storage/blob/_shared/uploads.py_parallel_uploadsr*      s    I
W':Q:QRgd;U%,,.;<	1c$i( Y!']
HOO,@,JJWXY  <
  		 \\'*ND($7elln778s   B+AB0 0	B<;B<&C>Nc                 H   |dkD  }	|	r	d|v rd |d<    |d| ||||	||d|}
|	rt        j                  |      5 }|
j                         }t        |d|      D cg c]'  }|j	                  t        |
j                        |      ) }}t        ||
j                  ||      }d d d        n,|
j                         D cg c]  }|
j                  |       }}t              rt        |d       D cg c]  }|d   	 c}S |
j                  S c c}w # 1 sw Y   DxY wc c}w c c}w )Nr   modified_access_conditions)service
total_size
chunk_sizestreamparallelvalidate_contentprogress_hookr   c                     | d   S Nr    )rs    r)   <lambda>z$upload_data_chunks.<locals>.<lambda>O   s
    ad     )keyr6   )r   ThreadPoolExecutorget_chunk_streamsr
   r   r   process_chunkr*   anysortedresponse_headers)r-   uploader_classr.   r/   max_concurrencyr0   r2   r3   kwargsr1   r    r   upload_tasksurunning_futuresr#   r   r7   s                     r)   upload_data_chunksrG   +   sS    "H0F:/3+, )# H ''8 	kH#557L  aA  4X5K5K LaPO  *(H4J4JLZijI	k 	k CKB\B\B^_X++F3_	_
9~$YNCD!DD$$$	k 	k `Ds)    D,D	D9D.D	DDc           
          |dkD  }|r	d|v rd |d<    |d| |||||d|}	|rt        j                  |      5 }
|	j                         }t        |d|      D cg c]'  }|
j	                  t        |	j                        |      ) }}t        |
|	j                  ||      }d d d        n,|	j                         D cg c]  }|	j                  |       }}t              rt        |      S g S c c}w # 1 sw Y   &xY wc c}w )Nr   r,   )r-   r.   r/   r0   r1   r3   r   r6   )
r   r;   get_substream_blocksr
   r   r   process_substream_blockr*   r>   r?   )r-   rA   r.   r/   rB   r0   r3   rC   r1   r    r   rD   rE   rF   r#   bs                   r)   upload_substream_blocksrL   S   s7    "H0F:/3+, # H ''8 	uH#88:L  aA  4X5U5U VXYZO  *(H4T4TVbdstI	u 	u CKB_B_BabQX55a8b	b
9~i  I	u 	u cs#    C/,C*C/8C;*C//C8c                   V    e Zd Z	 	 	 ddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zy)_ChunkUploaderNc	                    || _         || _        || _        || _        || _        |r
t               nd | _        d| _        |r
t               nd | _        || _	        || _
        || _        d | _        d | _        d | _        |	| _        y r5   )r-   r.   r/   r0   r1   r   stream_lockprogress_totalprogress_lockr3   	encryptorpadderr@   etaglast_modifiedrequest_options)
selfr-   r.   r/   r0   r1   rS   rT   r3   rC   s
             r)   __init__z_ChunkUploader.__init__z   s     $$  &.464  '/TVT* # $	!%r9   c              #     K   d}	 d}| j                   }	 | j                  r;t        | j                   t        |      z
  | j                  |t        |      z   z
        }| j                  j                  |      }t        |t              st        d      ||xs dz  }|dk(  st        |      | j                   k(  rnt        |      | j                   k(  rU| j                  r| j                  j                  |      }| j                  r| j                  j                  |      }||f n| j                  r6| j                  j                  |      | j                  j                         z   }| j                  r6| j                  j                  |      | j                  j                         z   }|r||f y |t        |      z  }w)Nr   r9   z"Blob data should be of type bytes.)r/   r.   minr   r0   read
isinstancebytes	TypeErrorrT   updaterS   finalize)rX   indexdata	read_sizetemps        r)   r<   z _ChunkUploader.get_chunk_streams   s    DI ?? #DOOc$i$?TY\_`d\eTeAf gI{{''	2!$.#$HII# 3;#d)t">  4yDOO+;;;;--d3D>>>>006DTk!;;;;--d3dkk6J6J6LLD>>>>0069P9P9RRD+%SYEA s   GGc                 :    |d   }|d   }| j                  ||      S )Nr   r   )_upload_chunk_with_progress)rX   
chunk_datachunk_byteschunk_offsets       r)   r=   z_ChunkUploader.process_chunk   s'     m!!}//kJJr9   c                    | j                   +| j                   5  | xj                  |z  c_        d d d        n| xj                  |z  c_        | j                  r'| j                  | j                  | j                         y y # 1 sw Y   =xY wN)rR   rQ   r3   r.   )rX   lengths     r)   _update_progressz_ChunkUploader._update_progress   s}    )## .##v-#. . 6)t22DOOD . .s   BB
c                     t        d      Nz#Must be implemented by child class.NotImplementedErrorrX   rj   rh   s      r)   _upload_chunkz_ChunkUploader._upload_chunk       !"GHHr9   c                 ^    | j                  ||      }| j                  t        |             |S rl   )rt   rn   r   )rX   rj   rh   range_ids       r)   rg   z*_ChunkUploader._upload_chunk_with_progress   s+    %%lJ?c*o.r9   c              #     K   | j                   J | j                  }| j                  }|"t        | j                        }|t        d      t        t        || j                   dz  z              }|| j                   z  dk(  r| j                   n|| j                   z  }t        |      D ]C  }|| j                   z  }||dz
  k(  r|n| j                   }|t        | j                  |||      f E y w)Nz2Unable to determine content length of upload data.g      ?r   r   )
r/   rP   r.   r   r0   
ValueErrorintr   r   	SubStream)rX   lockblob_lengthblockslast_block_sizeirb   rm   s           r)   rI   z#_ChunkUploader.get_substream_blocks   s     ***oo$T[[1K" !UVVT+3)>?@A-84??-Ja-O$//U`cgcrcrUrv 	EA'E()VaZ_T__F4;;vtDDD	Es   C.C0c                 2    | j                  |d   |d         S )Nr   r   )%_upload_substream_block_with_progress)rX   
block_datas     r)   rJ   z&_ChunkUploader.process_substream_block   s    99*Q-TUWWr9   c                     t        d      rp   rq   rX   rb   block_streams      r)   _upload_substream_blockz&_ChunkUploader._upload_substream_block   ru   r9   c                 ^    | j                  ||      }| j                  t        |             |S rl   )r   rn   r   )rX   rb   r   rw   s       r)   r   z4_ChunkUploader._upload_substream_block_with_progress   s,    //|Dc,/0r9   c                 H    |j                   | _         |j                  | _        y rl   )rU   rV   )rX   resps     r)   set_response_propertiesz&_ChunkUploader.set_response_properties   s    II	!//r9   )NNN)__name__
__module____qualname__rY   r<   r=   rn   rt   rg   rI   rJ   r   r   r   r6   r9   r)   rN   rN   x   sL     &@"HK
EI
E$XI
0r9   rN   c                   *     e Zd Z fdZd Zd Z xZS )BlockBlobChunkUploaderc                 ^    |j                  dd        t        t        |   |i | d | _        y )Nr,   )popsuperr   rY   current_lengthrX   argsrC   	__class__s      r)   rY   zBlockBlobChunkUploader.__init__   s/    

/6$d4dEfE"r9   c                     |d}t        t        t        |                  } | j                  j                  |t	        |      |f| j
                  | j                  d| j                   ||fS )N032ddata_stream_totalupload_stream_current)r   r   r-   stage_blockr   r.   rQ   rW   )rX   rj   rh   rb   block_ids        r)   rt   z$BlockBlobChunkUploader._upload_chunk   st    % =+?!@A   
O	
 #oo"&"5"5	
 ""	
 hr9   c                 
   	 d|| j                   z  d} | j                  j                  |t        |      |f| j                  | j
                  d| j                   |j                          |S # |j                          w xY w)NBlockId05r   )r/   r-   r   r   r.   rQ   rW   close)rX   rb   r   r   s       r)   r   z.BlockBlobChunkUploader._upload_substream_block  s    	! %"8" =>H$DLL$$L! #'//&*&9&9 &&    s   AA0 0Br   r   r   rY   rt   r   __classcell__r   s   @r)   r   r      s    #
r9   r   c                       e Zd Zd Zd Zd Zy)PageBlobChunkUploaderc                 ,    t        t        |             S rl   )r>   	bytearray)rX   rh   s     r)   _is_chunk_emptyz%PageBlobChunkUploader._is_chunk_empty  s     y,---r9   c                    | j                  |      s|t        |      z   dz
  }d| d| }d } | j                  j                  d|t        |      ||t        | j
                  | j                  d| j                  | _        | j                  s>| j                  j                  d      r"| j                  d   | j                  d   _        y y y y )Nr   bytes=-)bodycontent_lengthtransactional_content_md5r   clsr   r   r,   rU   r6   )r   r   r-   upload_pagesr   r.   rQ   rW   r@   r1   getif_match)rX   rj   rh   	chunk_endcontent_rangecomputed_md5s         r)   rt   z#PageBlobChunkUploader._upload_chunk#  s    ##J/$s:6:I$\N!I;?ML$=DLL$=$= 	%":*6#+"&//&*&9&9	% &&	%D! ==T%9%9%=%=>Z%[NRNcNcdjNk$$%ABK &\= 0r9   c                      y rl   r6   r   s      r)   r   z-PageBlobChunkUploader._upload_substream_block7      r9   N)r   r   r   r   rt   r   r6   r9   r)   r   r     s    .
l(r9   r   c                   *     e Zd Z fdZd Zd Z xZS )AppendBlobChunkUploaderc                 :    t        t        | 
  |i | d | _        y rl   )r   r   rY   r   r   s      r)   rY   z AppendBlobChunkUploader.__init__=  s     %t5tFvF"r9   c           	         | j                   p | j                  j                  d|t        |      t        | j
                  | j                  d| j                  | _        t        | j                  d         | _         y | j                   |z   | j                  d   _
         | j                  j                  d|t        |      t        | j
                  | j                  d| j                  | _        y )N)r   r   r   r   r   blob_append_offset!append_position_access_conditionsr6   )r   r-   append_blockr   r   r.   rQ   rW   r@   rz   append_positionrs   s      r)   rt   z%AppendBlobChunkUploader._upload_chunkA  s    &$=DLL$=$= %":+"&//&*&9&9% &&%D! #&d&;&;<P&Q"RD ##l2   !DEU$=DLL$=$= %":+"&//&*&9&9% &&%D!r9   c                      y rl   r6   r   s      r)   r   z/AppendBlobChunkUploader._upload_substream_blockX  r   r9   r   r   s   @r)   r   r   ;  s    #.r9   r   c                       e Zd Zd Zd Zy)DataLakeFileChunkUploaderc           
      >    | j                   j                  d||t        |      t        | j                  | j
                  d| j                  | _        | j                  s>| j                  j                  d      r"| j                  d   | j                  d   _
        y y y )Nr   positionr   r   r   r   r,   rU   r6   )r-   append_datar   r   r.   rQ   rW   r@   r1   r   r   rs   s      r)   rt   z'DataLakeFileChunkUploader._upload_chunk^  s     8 8 8 !
!z?'"oo"&"5"5!
 ""!
 }}!5!5!9!9:V!WJNJ_J_`fJgD  !=>G "X}r9   c           
          	  | j                   j                  d||t        |      t        | j                  | j
                  d| j                   |j                          y # |j                          w xY w)Nr   r6   )r-   r   r   r   r.   rQ   rW   r   r   s      r)   r   z1DataLakeFileChunkUploader._upload_substream_blockm  sl    	!$DLL$$ !"<0+"&//&*&9&9 &&  L s   AA! !A3Nr   r   r   rt   r   r6   r9   r)   r   r   \  s    h!r9   r   c                       e Zd Zd Zd Zy)FileChunkUploaderc                     t        |      }||z   dz
  } | j                  j                  |||f| j                  | j                  d| j
                  }d| d| |fS )Nr   r   r   r   )r   r-   upload_ranger.   rQ   rW   )rX   rj   rh   rm   r   responses         r)   rt   zFileChunkUploader._upload_chunk~  sz    Z 6)A-	,4<<,,
 #oo"&"5"5
 ""
 ~Qyk2H<<r9   c                      y rl   r6   r   s      r)   r   z)FileChunkUploader._upload_substream_block  r   r9   Nr   r6   r9   r)   r   r   |  s    =r9   r   c                   p     e Zd Z fdZd Zd Zd Zd ZddZd Z	d Z
dd	Zd
 Zd Zd Zd Zd Z xZS )r{   c                 >   	 |j                  dt               || _        || _        d| _        || _        || _        t               | _
        |t        k  r|nt        | _        d| _        d| _        t        t         | G          y # t        $ r}t        d      |d }~ww xY w)Nr   z#Wrapped stream must support seek().)seekr   	Exceptionry   _lock_wrapped_stream	_position_stream_begin_index_lengthr   _buffer'_LARGE_BLOB_UPLOAD_MAX_READ_BUFFER_SIZE_max_buffer_size_current_buffer_start_current_buffer_sizer   r{   rY   )rX   wrapped_streamstream_begin_indexrm   lockObjexcr   s         r)   rY   zSubStream.__init__  s    	M8, 
-#5 y
 FFFLs 	 &'"$%!i')#  	MBCL	Ms   B 	BBBc                     | j                   S rl   )r   rX   s    r)   __len__zSubStream.__len__  s    ||r9   c                     | j                   r| j                   j                          d | _        t        j                  |        y rl   )r   r   r   r   r   s    r)   r   zSubStream.close  s-    <<LL #Tr9   c                 6    | j                   j                         S rl   )r   filenor   s    r)   r   zSubStream.fileno  s    ##**,,r9   c                      y rl   r6   r   s    r)   flushzSubStream.flush  r   r9   c                 L   | j                   rt        d      || j                  | j                  z
  }|| j                  z   | j                  k\  r| j                  | j                  z
  }|dk(  s| j                  j                   ry| j                  j                  |      }t        |      }||z
  }| xj                  |z  c_        |dkD  r| j                  5  t        | j                  | j                  | j                  z
        }| j                  r| j                  5  | j                  | j                  z   }| j                  j                  |t               | j                  j                         |k7  rt        d      | j                  j                  |      }d d d        nq| j                  | j                  z   }| j                  j                         |k7  r | j                  j                  |t               | j                  j                  |      }d d d        rot!        |      | _        | j                  | _        t        |      | _        | j                  j                  |      }||z  }| xj                  t        |      z  c_        |S # 1 sw Y   xY w# 1 sw Y   xY w)NzStream is closed.r   r9   z.Stream failed to seek to the desired location.)closedry   r   r   r   r\   r   r[   r   r   r   r   r   r   tellIOErrorr   r   r   )	rX   sizeread_buffer
bytes_readbytes_remainingcurrent_max_buffer_sizeabsolute_positionbuffer_from_streamsecond_read_buffers	            r)   r\   zSubStream.read  sU   ;;011<<<$..0D $.. DLL0<<$..0D 19++ ll''-%
+*$ Q \ +.d.C.CT\\TXTbTbEb*c' :: `,0,D,Dt~~,U),,112CXN//446:KK")*Z"[[-1-A-A-F-FG^-_*` ` )-(@(@4>>(Q% ++0026GG,,112CXN)-)=)=)B)BCZ)[&/\2 "  ''9:-1^^*,/0B,C) &*\\%6%6%G"11#&8"99=` `\ \s'   AJA=JA:JJ	JJ#c                      yNTr6   r   s    r)   readablezSubStream.readable      r9   c                     t         rl   r	   )rX   rK   s     r)   readintozSubStream.readinto      ""r9   c                    |t         u rd}n8|t        u r| j                  }n#|t        u r| j                  }| }nt        d      ||z   }|| j                  kD  r| j                  }n|dk  rd}|| j                  k  s|| j                  | j                  z   k\  r*| j                  j                          t               | _        n/|| j                  z
  }| j                  j                  |t                || _        |S )Nr   z,Invalid argument for the 'whence' parameter.)r   r   r   r   r   ry   r   r   r   r   r   r   )rX   offsetwhencestart_indexposdeltas         r)   r   zSubStream.seek   s    XKx..Kx,,KWFKLLF",,C1WC +++sd6P6PSWSlSl6l/lLL "9DL$444ELLeX.
r9   c                      yr   r6   r   s    r)   seekablezSubStream.seekable  r   r9   c                     | j                   S rl   )r   r   s    r)   r   zSubStream.tell!  s    ~~r9   c                     t         rl   r   r   s    r)   writezSubStream.write$  r   r9   c                     t         rl   r   r   s    r)   
writelineszSubStream.writelines'  r   r9   c                      yNFr6   r   s    r)   	writeablezSubStream.writeable*      r9   rl   )r   )r   r   r   rY   r   r   r   r   r\   r   r   r   r  r   r	  r  r  r   r   s   @r)   r{   r{     sJ    *4-=~#<##r9   r{   c                   B    e Zd ZdZddZd Zd Zd Zd Zd Z	d Z
d	 Zy
)IterStreamerz'
    File-like streaming iterator.
    c                 N    || _         t        |      | _        d| _        || _        y Nr9   )	generatoriteriteratorleftoverencoding)rX   r  r  s      r)   rY   zIterStreamer.__init__3  s"    "Y r9   c                 6    | j                   j                         S rl   )r  r   r   s    r)   r   zIterStreamer.__len__9  s    ~~%%''r9   c                     | j                   S rl   )r  r   s    r)   __iter__zIterStreamer.__iter__<  s    }}r9   c                      yr  r6   r   s    r)   r  zIterStreamer.seekable?  r  r9   c                 ,    t        | j                        S rl   )r   r  r   s    r)   __next__zIterStreamer.__next__B  s    DMM""r9   c                     t        d      )Nz%Data generator does not support tell.r   rX   r   rC   s      r)   r   zIterStreamer.tellE  s    "#JKKr9   c                     t        d      )NzData generator is not seekable.r   r   s      r)   r   zIterStreamer.seekH  s    "#DEEr9   c                 L   | j                   }t        | j                         }	 ||k  rT| j                         }t        |t              r|j                  | j                        }||z  }|t        |      z  }||k  rT||k\  r
||d  | _         |d | S # t        $ r
 d| _         Y &w xY wr  )r  r   r  r]   strencoder  r   )rX   r   rc   countr%   s        r)   r\   zIterStreamer.readK  s    }}DMM"		 $,eS)!LL7EU# $, D= KDMET{  	 DM	 s   AB B#"B#N)zUTF-8)r   r   r   __doc__rY   r   r  r  r  r   r   r\   r6   r9   r)   r  r  .  s1    !(#LFr9   r  )NNNNNNNN)NNNNNNN)&
concurrentr   ior   r   r   r   r   r	   	itertoolsr
   mathr   	threadingr   azure.core.tracing.commonr    r   r   request_handlersr   response_handlersr   r   &_ERROR_VALUE_SHOULD_BE_SEEKABLE_STREAMr*   rG   rL   objectrN   r   r   r   r   r   r{   r  r6   r9   r)   <module>r2     s     R R    : % ( 6 +: ')k &( %%R "J|0V |0~"^ "JN >n B! !@ ([ [|.6 .r9   