
    \j!                        d Z ddlZddlZddlZ	 ddlZddlm	Z	m
Z
 ddlmZ  ej                  e      ZdZdZdZd Zd	 Zefd
Zd Zd Z G d dej2                        Z G d dej2                        Z G d de      Zy# e$ r dZY vw xY w)zyImplements reading and writing to/from WebHDFS.

The main entry point is the :func:`~smart_open.webhdfs.open` function.

    NT)utils	constantswebhdfs)zwebhdfs://host:port/path/filei   c                 $    t        t        |       S )N)schemeuri)dictSCHEME)
uri_as_strs    </root/env/lib/python3.12/site-packages/smart_open/webhdfs.py	parse_urir   '   s    v:..    c                 P    t        j                  t        |      }t        | |fi |S N)r   check_kwargsopen)r   modetransport_paramskwargss       r   open_urir   +   s'    &67FT$V$$r   c                    | j                  t              rt        |       } |t        j                  k(  rt        |       }n/|t        j                  k(  rt        | |      }nt        d|z        | j                  d      d   |_
        |S )z
    Parameters
    ----------
    http_uri: str
        webhdfs url converted to http REST url
    min_part_size: int, optional
        For writing only.

    )min_part_sizez+webhdfs support for mode %r not implemented/)
startswithr
   _convert_to_http_urir   READ_BINARYBufferedInputBaseWRITE_BINARYBufferedOutputBaseNotImplementedErrorsplitname)http_urir   r   fobjs       r   r   r   0   sz     6"'1y$$$ *	''	'!(-H!"ORV"VWWs#B'DIKr   c                    t         j                  j                  |       }|j                  }|j                  r|dj                  |j                        z  }|j                  }|j                  r6||rdnddz   t         j                  j                  |j                        z   z  }t         j                  j                  d|d|j                  z   |df      S )z
    Convert webhdfs uri to http url and return it as text

    Parameters
    ----------
    webhdfs_url: str
        A URL starting with webhdfs://
    z:{}& z
user.name=httpz/webhdfs/v1)urllibparseurlsplithostnameportformatqueryusernamequote
urlunsplitpath)webhdfs_url	split_urinetlocr0   s       r   r   r   H   s     %%k2IF~~%,,y~~..OOESr\1FLL4F4FyGYGY4ZZ	
 <<""	7C r   c                 ,    t        | j                        S r   )r   r   )
parsed_uris    r   convert_to_http_urir:   c   s    
//r   c                   Z    e Zd ZdZd Zd Zed        Zd Zd Z	d Z
ddZdd	Zd
 Zd Zy)r   Nc                    || _         ddd}t        j                  | j                   |d      | _        | j                  j                  t
        j                  k7  rt        j                  | j                        d| _	        y )NOPENr   )opoffsetT)paramsstreamr   )
_urirequestsget	_responsestatus_codehttplibOKWebHdfsExceptionfrom_response_buf)selfr   payloads      r   __init__zBufferedInputBase.__init__j   s]    	1-!diiM>>%%3"00@@	r   c                 V    t         j                  d       | j                  sd| _        yy)zFlush and close this stream.zclose: calledN)loggerdebugclosedrK   rL   s    r   closezBufferedInputBase.closev   s!    _%{{DI r   c                     | j                   d u S r   )rK   rS   s    r   rR   zBufferedInputBase.closed|   s    yyD  r   c                      y)z+Return True if the stream can be read from.T rS   s    r   readablezBufferedInputBase.readable       r   c                      y)zyIf False, seek(), tell() and truncate() will raise IOError.

        We offer only seek support, and no truncate support.FrW   rS   s    r   seekablezBufferedInputBase.seekable   s     r   c                 "    t         j                  )zUnsupported.ioUnsupportedOperationrS   s    r   detachzBufferedInputBase.detach   s    %%%r   c                    |;d| j                   | j                  j                  j                         z   c| _         }|S |t	        | j                         k  r&| j                   |d  | j                   d | c| _         }|S 	 | j                   g}d}||k  rg| j                  j                  j                  t
        j                        }t	        |      dk(  rn%|t	        |      z  }|j                  |       ||k  rgdj                        | _         | j                   |d  | j                   d | c| _         }|S # t        $ r Y Gw xY w)Nr   r   )
rK   rE   rawreadlenr^   DEFAULT_BUFFER_SIZEappendStopIterationjoin)rL   sizeretvalbuffers
total_readraw_datas         r   rc   zBufferedInputBase.read   s0   < #TYY1C1C1H1H1J%JDIvMC		N" $		$% 0$))ET2BDIvM	yykGJt#>>--2223I3IJ x=A%c(m+
x( t# HHW%	 IIde,dii.>	6  		s   =A:D4 4	E ?E c                 &    | j                  |      S )zThis is the same as read().)ri   )rc   )rL   ri   s     r   read1zBufferedInputBase.read1   s    yydy##r   c                 n    | j                  t        |            }|sy||dt        |       t        |      S )zLRead up to len(b) bytes into b, and return the number of bytes
        read.r   N)rc   rd   )rL   bdatas      r   readintozBufferedInputBase.readinto   s5     yyQ *3t94yr   c                 x    d| j                   | j                  j                  j                         z   c| _         }|S )Nr   )rK   rE   rb   readline)rL   rj   s     r   ru   zBufferedInputBase.readline   s1    T^^-?-?-H-H-J!J	6r   r   )r   )__name__
__module____qualname__rK   rN   rT   propertyrR   rX   r[   r`   rc   ro   rs   ru   rW   r   r   r   r   g   sH    D ! !&6$r   r   c                   D    e Zd ZefdZd Zd Zd Zd Zd Z	e
d        Zy)	r    c                    || _         d| _        || _        ddd}t        j                  | j                   |d      }|j
                  t        j                  k(  st        j                  |      |j                  d   }t        j                  |ddd	i
      }|j
                  t        j                  k(  st        j                  |      g | _        d| _        d| _        d| _        y)zs
        Parameters
        ----------
        min_part_size: int, optional
            For writing only.

        FCREATET)r>   	overwriter@   allow_redirectslocationr(   content-typeapplication/octet-streamrr   headersr   N)rB   _closedr   rC   putrF   rG   TEMPORARY_REDIRECTrI   rJ   r   CREATEDlinespartschunk_bytes
total_size)rL   r   r   rM   init_responseresponses         r   rN   zBufferedOutputBase.__init__   s     	*!5 TYYwPUV((G,F,FF"00??##J/<<"~Ga6bc##w6"00::

r   c                      y)z+Return True if the stream supports writing.TrW   rS   s    r   writablezBufferedOutputBase.writable   rY   r   c                 ,    t        j                  d      )Nzdetach() not supportedr]   rS   s    r   r`   zBufferedOutputBase.detach   s    %%&>??r   c                 j   ddi}t        j                  | j                  |d      }|j                  t        j
                  k(  st        j                  |      |j                  d   }t        j                  ||ddi      }|j                  t        j                  k(  st        j                  |      y )	Nr>   APPENDFr~   r   r   r   r   )
rC   postrB   rF   rG   r   rI   rJ   r   rH   )rL   rr   rM   r   r   r   s         r   _uploadzBufferedOutputBase._upload   s    " diiQVW((G,F,FF"00??##J/==4*8:T)UW##wzz1"00:: 2r   c                    | j                   rt        d      t        |t              st	        d      | j
                  j                  |       | xj                  t        |      z  c_        | xj                  t        |      z  c_	        | j                  | j                  k\  rdj                  | j
                        }t        j                  d| j                  t        |      | j                  dz         | j                  |       t        j!                  d| j                         | xj                  dz  c_        g dc| _        | _        y	y	)
z`
        Write the given bytes (binary string) into the WebHDFS file from constructor.

        zI/O operation on closed filezinput must be a binary stringr   z+uploading part #%i, %i bytes (total %.3fGB)      Azupload of part #%i finished   r   N)r   
ValueError
isinstancebytes	TypeErrorr   rf   r   rd   r   r   rh   rP   infor   r   rQ   )rL   rq   buffs      r   writezBufferedOutputBase.write   s    
 <<;<<!U#;<<

!CF"3q6!t11188DJJ'DKK=

CIt'D LLLL6

CJJ!OJ+-q(DJ( 2r   c                    dj                  | j                        }|rit        j                  d| j                  t        |      | j                  dz         | j                  |       t        j                  d| j                         d| _	        y )Nr   z0uploading last part #%i, %i bytes (total %.3fGB)r   z upload of last part #%i finishedT)
rh   r   rP   r   r   rd   r   r   rQ   r   )rL   r   s     r   rT   zBufferedOutputBase.close
  sf    xx

#KKB

CIt'D LLLL;TZZHr   c                     | j                   S r   )r   rS   s    r   rR   zBufferedOutputBase.closed  s    ||r   N)rv   rw   rx   MIN_PART_SIZErN   r   r`   r   r   rT   ry   rR   rW   r   r   r    r       s8    *7 8@	;14	  r   r    c                   6     e Zd Zd fd	Zd Zed        Z xZS )rI   c                 Z    || _         || _        t        t        |   t        |              y r   )msgrF   superrI   rN   repr)rL   r   rF   	__class__s      r   rN   zWebHdfsException.__init__  s&    &.tDz:r   c                 x    dj                  | j                  j                  | j                  | j                        S )Nz{}(status_code={}, msg={!r}))r/   r   rv   rF   r   rS   s    r   __repr__zWebHdfsException.__repr__   s0    -44NN##T%5%5txx
 	
r   c                 >     | |j                   |j                        S )N)r   rF   )textrF   )clsr   s     r   rJ   zWebHdfsException.from_response%  s    x}}(2F2FGGr   )r(   N)rv   rw   rx   rN   r   classmethodrJ   __classcell__)r   s   @r   rI   rI     s#    ;


 H Hr   rI   )__doc__r^   loggingurllib.parser*   rC   ImportErrorMISSING_DEPS
smart_openr   r   http.clientclientrG   	getLoggerrv   rP   r
   URI_EXAMPLESr   r   r   r   r   r:   BufferedIOBaser   r    	ExceptionrI   rW   r   r   <module>r      s    
   ( 			8	$	 /%
 (5 060T)) TnY** YxHy HK  Ls   B B
B