Ë
    jQêjê  ã                   ój   — d Z ddlZddlZddlZddlmZ ddlmZ dZ	dZ
 G d„ dej                  «      Zy)	zGSeekable binary input for Functions that consume Blob V2 values lazily.é    N)ÚCallable)Ú
HTTPStatusi   i,  c                   óâ   ‡ — e Zd ZdZdeeegef   defˆ fd„Zede	defd„«       Z
defd„Zdefd	„Zdefd
„Zdefd„Zej"                  fdededefd„Zdededefd„Zddedefd„Zdefd„Zˆ xZS )Ú
BlobReaderaù  Read a blob incrementally inside a Function.

    Annotating a Function input with ``BlobReader`` requests a lazy, seekable
    reader. Annotating it with ``bytes`` requests materialized bytes instead.
    ``read_range`` does not change the sequential cursor. Readers are scoped
    to the invocation and must not be retained for a later call.

    For local calls, construct a reader from a range-reading callable and the
    blob's size. The callable accepts an offset and length and returns bytes.
    Ú
read_rangeÚsizec                 ó¦   •— t         ‰| �  «        || _        t        j                  |«      | _        | j
                  dk  rt        d«      ‚d| _        y )Nr   zblob size must be nonnegative)ÚsuperÚ__init__Ú_read_rangeÚoperatorÚindexÚ_sizeÚ
ValueErrorÚ	_position)Úselfr   r   Ú	__class__s      €úY/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/lancedb/_blob_reader.pyr   zBlobReader.__init__   sD   ø€ Ü‰ÑÔØ%ˆÔÜ—^‘^ DÓ)ˆŒ
Ø�:‰:˜Š>ÜÐ<Ó=Ð=Øˆ�ó    Úuric                 óœ   ‡‡— t         j                  j                  t         j                  j                  i «      «      Šˆˆfd„} | ||«      S )Nc           	      ój  •— t         j                  j                  ‰dd| › d| |z   dz
  › �i¬«      }‰j                  |t        ¬«      5 }|j
                  t        j                  k7  rt        d«      ‚|j                  |dz   «      }t        |«      |k7  rt        d«      ‚|cd d d «       S # 1 sw Y   y xY w)	NÚRangezbytes=ú-é   )Úheaders)Útimeoutz4blob range service did not return a partial responsez5blob range service returned an invalid payload length)ÚurllibÚrequestÚRequestÚopenÚ_READ_TIMEOUT_SECONDSÚstatusr   ÚPARTIAL_CONTENTÚOSErrorÚreadÚlen)ÚoffsetÚlengthr   ÚresponseÚdataÚopenerr   s        €€r   r   z(BlobReader._from_uri.<locals>.read_range(   s¾   ø€ Ü—n‘n×,Ñ,Ø˜g¨°¨x°q¸À&¹È1Ñ9LÐ8MÐ'NÐOð -ó ˆGð —‘˜WÔ.C�ÓDð 
ÈØ—?‘?¤j×&@Ñ&@Ò@Ü!ØNóð ð  —}‘} V¨a¡ZÓ0�Ü�t“9 Ò&Ü!ØOóð ð ÷
÷ 
ò 
ús   ÁAB)Â)B2)r   r   Úbuild_openerÚProxyHandler)Úclsr   r   r   r,   s    `  @r   Ú	_from_urizBlobReader._from_uri$   s:   ù€ ä—‘×,Ñ,¬V¯^©^×-HÑ-HÈÓ-LÓMˆõ	ñ  �:˜tÓ$Ð$r   Úreturnc                 ó   — | j                    S ©N©Úclosed©r   s    r   ÚreadablezBlobReader.readable:   ó   € Ø—;‘;ˆÐr   c                 ó   — | j                    S r3   r4   r6   s    r   ÚseekablezBlobReader.seekable=   r8   r   c                 ó:   — | j                  «        | j                  S )z1Return the blob size without reading its payload.)Ú_checkClosedr   r6   s    r   r   zBlobReader.size@   s   € à×ÑÔØ�z‰zÐr   c                 ó:   — | j                  «        | j                  S r3   )r<   r   r6   s    r   ÚtellzBlobReader.tellE   s   € Ø×ÑÔØ�~‰~Ðr   r(   Úwhencec                 óR  — | j                  «        t        j                  |«      }|t        j                  k(  r|}nT|t        j
                  k(  r| j                  |z   }n1|t        j                  k(  r| j                  |z   }nt        d|› �«      ‚|dk  rt        d«      ‚|| _        |S )Nzinvalid whence: r   znegative seek position)
r<   r   r   ÚioÚSEEK_SETÚSEEK_CURr   ÚSEEK_ENDr   r   )r   r(   r?   Úpositions       r   ÚseekzBlobReader.seekI   s“   € Ø×ÑÔÜ—‘ Ó'ˆØ”R—[‘[Ò Ø‰HØ”r—{‘{Ò"Ø—~‘~¨Ñ.‰HØ”r—{‘{Ò"Ø—z‘z FÑ*‰HäÐ/°¨xÐ8Ó9Ð9Ø�aŠ<ÜÐ5Ó6Ð6Ø!ˆŒØˆr   r)   c                 óÂ  — | j                  «        t        j                  |«      t        j                  |«      }}|dk  s|dk  rt        d«      ‚t	        |t        d| j                  |z
  «      «      }g }|rYt	        |t        «      }| j                  ||«      }t        |«      |k7  rt        d«      ‚|j                  |«       ||z  }||z  }|rŒYdj                  |«      S )z?Read a byte range without changing the cursor; truncate at EOF.r   z%offset and length must be nonnegativez4blob range reader returned an invalid payload lengthr   )r<   r   r   r   ÚminÚmaxr   Ú_READ_CHUNK_BYTESr   r'   r%   ÚappendÚjoin)r   r(   r)   Ú	remainingÚchunksÚcountÚchunks          r   r   zBlobReader.read_rangeY   sÒ   € à×ÑÔÜ!Ÿ™¨Ó/´·±ÀÓ1G�ˆØ�AŠ:˜ !šÜÐDÓEÐEÜ˜¤ A t§z¡z°FÑ':Ó ;Ó<ˆ	ØˆÙÜ˜	Ô#4Ó5ˆEØ×$Ñ$ V¨UÓ3ˆEÜ�5‹z˜UÒ"ÜÐTÓUÐUØ�M‰M˜%Ô Ø�e‰OˆFØ˜ÑˆIò ð �x‰x˜ÓÐr   c                 ó  — | j                  «        |€dnt        j                  |«      }|dk  r#t        d| j                  | j
                  z
  «      }| j                  | j
                  |«      }| xj
                  t        |«      z  c_        |S )Néÿÿÿÿr   )r<   r   r   rI   r   r   r   r'   )r   r   r+   s      r   r&   zBlobReader.readk   sm   € Ø×ÑÔØ�\‰r¤x§~¡~°dÓ';ˆØ�!Š8Ü�q˜$Ÿ*™* t§~¡~Ñ5Ó6ˆDØ�‰˜tŸ~™~¨tÓ4ˆØ�Šœ#˜d›)Ñ#�Øˆr   c                 óœ   — t        |«      j                  d«      }| j                  t        |«      «      }||d t        |«       t        |«      S )NÚB)Ú
memoryviewÚcastr&   r'   )r   ÚbufferÚviewr+   s       r   ÚreadintozBlobReader.readintot   sC   € Ü˜&Ó!×&Ñ& sÓ+ˆØ�y‰yœ˜T›Ó#ˆØ ˆˆ[Œs�4‹yÐÜ�4‹yÐr   )rR   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚintÚbytesr   ÚclassmethodÚstrr0   Úboolr7   r:   r   r>   rA   rB   rF   r   r&   rY   Ú__classcell__)r   s   @r   r   r      s×   ø„ ñ	ð 8¨S°#¨J¸Ð,=Ñ#>ð Àcõ ð ð%˜Cð % sò %ó ð%ð*˜$ó ð˜$ó ð�có ð
�có ð /1¯k©kñ ˜3ð ¨ð ¸có ð   ð  ¨cð  °eó  ñ$˜ð  eó ð #÷ r   r   )r]   rA   r   Úurllib.requestr   Úcollections.abcr   Úhttpr   rJ   r"   Ú	RawIOBaser   © r   r   ú<module>ri      s8   ðñ Nã 	Û Û Ý $Ý àÐ ØÐ ôh�—‘õ hr   