
    lc!!                        d Z ddlZddlZddlZ	 ddlZn# e$ r dZY nw xY w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j                  Z G d dej                  Z G d de          ZdS )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    2lib/python3.11/site-packages/smart_open/webhdfs.py	parse_urir   '   s    v:....    c                 R    t          j        t          |          }t          | |fi |S N)r   check_kwargsopen)r   modetransport_paramskwargss       r   open_urir   +   s-    &677FT$$V$$$r   c                 @   |                      t                    rt          |           } |t          j        k    rt          |           }n4|t          j        k    rt          | |          }nt          d|z            | 	                    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   s     6"" 2'11y$$ X **	'	' X!(-HHH!"ORV"VWWWs##B'DIKr   c                 l   t           j                            |           }|j        }|j        r|d                    |j                  z  }|j        }|j        r1||rdnddz   t           j                            |j                  z   z  }t           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22IF~ /%,,y~...OE 
!SSr\1FL4F4FyGY4Z4ZZ	
 <""	7C  r   c                 *    t          | j                  S r   )r   r   )
parsed_uris    r   convert_to_http_urir:   c   s    
///r   c                   H    e Zd Zd Zd Zd Zd Zd ZddZdd	Z	d
 Z
d ZdS )r   c                     || _         ddd}t          j        | j         |d          | _        | j        j        t
          j        k    rt                              | j                  d| _	        d S )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__h   sf    	1--!diMMM>%3 	A"00@@@			r   c                 :    t                               d           dS )zFlush and close this stream.zclose: calledN)loggerdebugrL   s    r   closezBufferedInputBase.closet   s    _%%%%%r   c                     dS )z+Return True if the stream can be read from.T rR   s    r   readablezBufferedInputBase.readablex       tr   c                     dS )zyIf False, seek(), tell() and truncate() will raise IOError.

        We offer only seek support, and no truncate support.FrU   rR   s    r   seekablezBufferedInputBase.seekable|   s	     ur   c                     t           j        )zUnsupported.ioUnsupportedOperationrR   s    r   detachzBufferedInputBase.detach   s    %%r   Nc                 z   |0d| j         | j        j                                        z   c| _         }|S |t	          | j                   k     r&| j         |d          | j         d |         c| _         }|S 	 | j         g}d}||k     rj| j        j                            t
          j                  }t	          |          dk    rn-|t	          |          z  }|                    |           ||k     jn# t          $ r Y nw xY wd	                    |          | _         | j         |d          | j         d |         c| _         }|S )Nr   r   )
rK   rE   rawreadlenr\   DEFAULT_BUFFER_SIZEappendStopIterationjoin)rL   sizeretvalbuffers
total_readraw_datas         r   ra   zBufferedInputBase.read   sX    	 #TY1C1H1H1J1J%JDIvMC	NN" 	 $	$%% 0$)ETE2BDIvM	ykGJt# )>-2223IJJ x==A% c(mm+
x((( t# )  	 	 	D	 HHW%%	 Idee,di.>	6s   2A:C- -
C:9C:r   c                 .    |                      |          S )zThis is the same as read().)rg   )ra   )rL   rg   s     r   read1zBufferedInputBase.read1   s    yydy###r   c                     |                      t          |                    }|sdS ||dt          |          <   t          |          S )zLRead up to len(b) bytes into b, and return the number of bytes
        read.r   N)ra   rb   )rL   bdatas      r   readintozBufferedInputBase.readinto   sG     yyQ   	1*3t99*4yyr   c                 b    d| j         | j        j                                        z   c| _         }|S )Nr   )rK   rE   r`   readline)rL   rh   s     r   rs   zBufferedInputBase.readline   s-    T^-?-H-H-J-J!J	6r   r   )r   )__name__
__module____qualname__rN   rS   rV   rY   r^   ra   rm   rq   rs   rU   r   r   r   r   g   s          & & &    & & &   6$ $ $ $      r   r   c                   L    e Zd ZefdZd Zd Zd Zd Zd Z	e
d             ZdS )	r    c                    || _         d| _        || _        ddd}t          j        | j         |d          }|j        t          j        k    st          	                    |          |j
        d         }t          j        |ddd	i
          }|j        t          j        k    st          	                    |          g | _        d| _        d| _        d| _        d| _        dS )zs
        Parameters
        ----------
        min_part_size: int, optional
            For writing only.

        FCREATET)r>   	overwriter@   allow_redirectslocationr(   content-typeapplication/octet-streamrp   headersr   N)rB   _closedr   rC   putrF   rG   TEMPORARY_REDIRECTrI   rJ   r   CREATEDlinespartschunk_bytes
total_sizer`   )rL   r   r   rM   init_responseresponses         r   rN   zBufferedOutputBase.__init__   s     	*!55 TYwPUVVV(G,FF 	@"00???#J/<"~Ga6bccc#w6 	;"00:::


 r   c                     dS )z+Return True if the stream supports writing.TrU   rR   s    r   writablezBufferedOutputBase.writable   rW   r   c                 *    t          j        d          )Nzdetach() not supportedr[   rR   s    r   r^   zBufferedOutputBase.detach   s    %&>???r   c                 N   ddi}t          j        | j        |d          }|j        t          j        k    st                              |          |j        d         }t          j        ||ddi          }|j        t          j	        k    st                              |          d S )	Nr>   APPENDFr{   r}   r~   r   r   )
rC   postrB   rF   rG   r   rI   rJ   r   rH   )rL   rp   rM   r   r   r   s         r   _uploadzBufferedOutputBase._upload   s    " diQVWWW(G,FF 	@"00???#J/=4*8:T)UW W W#wz1 	;"00:::	; 	;r   c                    | j         rt          d          t          |t                    st	          d          | j                            |           | xj        t          |          z  c_        | xj	        t          |          z  c_	        | j        | j
        k    rd                    | j                  }t                              d| j        t          |          | j	        dz             |                     |           t                              d| j                   | xj        dz  c_        g dc| _        | _        d	S d	S )
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   rd   r   rb   r   r   rf   rP   infor   r   rQ   )rL   ro   buffs      r   writezBufferedOutputBase.write   s4   
 < 	=;<<<!U## 	=;<<<
!CFF"3q66!t11 		188DJ''DKK=
CIIt'D   LLLL6
CCCJJ!OJJ+-q(DJ(((		1 		1r   c                 $   d                     | j                  }|rlt                              d| j        t          |          | j        dz             |                     |           t                              d| j                   d| _	        d S )Nr   z0uploading last part #%i, %i bytes (total %.3fGB)r   z upload of last part #%i finishedT)
rf   r   rP   r   r   rb   r   r   rQ   r   )rL   r   s     r   rS   zBufferedOutputBase.close  s    xx
## 	IKKB
CIIt'D   LLLL;TZHHHr   c                     | j         S r   )r   rR   s    r   closedzBufferedOutputBase.closed  s
    |r   N)rt   ru   rv   MIN_PART_SIZErN   r   r^   r   r   rS   propertyr   rU   r   r   r    r       s        *7    B  @ @ @	; 	; 	;1 1 14	 	 	   X  r   r    c                   <     e Zd Zd fd	Zd Zed             Z xZS )rI   r(   Nc                     || _         || _        t          t          |                               t          |                      d S r   )msgrF   superrI   rN   repr)rL   r   rF   	__class__s      r   rN   zWebHdfsException.__init__  s=    &%%..tDzz:::::r   c                 X    d                     | j        j        | j        | j                  S )Nz{}(status_code={}, msg={!r}))r/   r   rt   rF   r   rR   s    r   __repr__zWebHdfsException.__repr__  s+    -44N#T%5tx
 
 	
r   c                 0     | |j         |j                  S )N)r   rF   )textrF   )clsr   s     r   rJ   zWebHdfsException.from_response"  s    sx}(2FGGGGr   )r(   N)rt   ru   rv   rN   r   classmethodrJ   __classcell__)r   s   @r   rI   rI     sn        ; ; ; ; ; ;

 
 

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