B
    ê¹`"  ã               @   sp   d Z ddlmZ dZdZG dd„ dƒZG dd„ deƒZG d	d
„ d
eƒZdd„ ZG dd„ deƒZ	G dd„ dƒZ
dS )zBuffers
é    )ÚBytesIOi   i    c               @   sj   e Zd ZdZddd„Zdd„ Zdd„ ZeZd	d
„ Zddd„Z	ddd„Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚFileBasedBufferr   Nc             C   sr   || _ |d k	rn| ¡ }| ¡ }| d¡ x| t¡}|s:P | |¡ q*W t| ¡ | ƒ| _| |¡ | |¡ d S )Nr   )	ÚfileÚgetfileÚtellÚseekÚreadÚ
COPY_BYTESÚwriteÚintÚremain)Úselfr   Úfrom_bufferÚ	from_fileÚread_posÚdata© r   úX/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/waitress/buffers.pyÚ__init__   s    


zFileBasedBuffer.__init__c             C   s   | j S )N)r   )r   r   r   r   Ú__len__,   s    zFileBasedBuffer.__len__c             C   s   dS )NTr   )r   r   r   r   Ú__nonzero__/   s    zFileBasedBuffer.__nonzero__c             C   sB   | j }| ¡ }| dd¡ | |¡ | |¡ | jt|ƒ | _d S )Nr   é   )r   r   r   r
   r   Úlen)r   Úsr   r   r   r   r   Úappend4   s    

zFileBasedBuffer.appendéÿÿÿÿFc             C   sT   | j }|s| ¡ }|dk r$| ¡ }n
| |¡}|rF|  jt|ƒ8  _n
| |¡ |S )Nr   )r   r   r   r   r   r   )r   ÚnumbytesÚskipr   r   Úresr   r   r   Úget<   s    


zFileBasedBuffer.getc             C   s:   | j |k rtd|| j f ƒ‚| j |d¡ | j | | _ d S )Nz)Can't skip %d bytes in buffer of %d bytesé   )r   Ú
ValueErrorr   r   )r   r   Úallow_pruner   r   r   r   K   s
    
zFileBasedBuffer.skipc             C   s
   t ƒ ‚d S )N)ÚNotImplementedError)r   r   r   r   ÚnewfileS   s    zFileBasedBuffer.newfilec             C   st   | j }| jdkrB| ¡ }| dd¡ | ¡ }| |¡ |dkrBd S |  ¡ }x| t¡}|s\P | |¡ qLW || _ d S )Nr   r   )r   r   r   r   r$   r   r	   r
   )r   r   r   ÚszÚnfr   r   r   r   ÚpruneV   s    


zFileBasedBuffer.prunec             C   s   | j S )N)r   )r   r   r   r   r   h   s    zFileBasedBuffer.getfilec             C   s    t | jdƒr| j ¡  d| _d S )NÚcloser   )Úhasattrr   r(   r   )r   r   r   r   r(   k   s    
zFileBasedBuffer.close)N)r   F)r   )Ú__name__Ú
__module__Ú__qualname__r   r   r   r   Ú__bool__r   r   r   r$   r'   r   r(   r   r   r   r   r      s   


r   c               @   s   e Zd Zddd„Zdd„ ZdS )ÚTempfileBasedBufferNc             C   s   t  | |  ¡ |¡ d S )N)r   r   r$   )r   r   r   r   r   r   r   s    zTempfileBasedBuffer.__init__c             C   s   ddl m} |dƒS )Nr   )ÚTemporaryFilezw+b)Útempfiler/   )r   r/   r   r   r   r$   u   s    zTempfileBasedBuffer.newfile)N)r*   r+   r,   r   r$   r   r   r   r   r.   q   s   
r.   c               @   s   e Zd Zddd„Zdd„ ZdS )ÚBytesIOBasedBufferNc             C   s&   |d k	rt  | tƒ |¡ ntƒ | _d S )N)r   r   r   r   )r   r   r   r   r   r   |   s    zBytesIOBasedBuffer.__init__c             C   s   t ƒ S )N)r   )r   r   r   r   r$   ƒ   s    zBytesIOBasedBuffer.newfile)N)r*   r+   r,   r   r$   r   r   r   r   r1   {   s   
r1   c             C   s&   t | dƒr|  ¡ S t | dƒo$t | dƒS )NÚseekabler   r   )r)   r2   )Úfpr   r   r   Ú_is_seekable‡   s    
r4   c               @   sF   e Zd Zddd„Zddd„Zdd	d
„Zdd„ Zdd„ ZeZdd„ Z	dS )ÚReadOnlyFileBasedBufferé €  c             C   s   || _ || _d S )N)r   Ú
block_size)r   r   r7   r   r   r   r      s    z ReadOnlyFileBasedBuffer.__init__Nc             C   sb   t | jƒr\| j ¡ }| j dd¡ | j ¡ }| j |¡ || }|d krP|| _nt||ƒ| _| jS )Nr   r   )r4   r   r   r   r   Úmin)r   ÚsizeZ	start_posZend_posÚfsizer   r   r   Úprepare”   s    


zReadOnlyFileBasedBuffer.preparer   Fc             C   sZ   |dks|| j kr| j }| j}|s*| ¡ }| |¡}|rL|  j t|ƒ8  _ n
| |¡ |S )Nr   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   ¡   s    

zReadOnlyFileBasedBuffer.getc             C   s   | S )Nr   )r   r   r   r   Ú__iter__¯   s    z ReadOnlyFileBasedBuffer.__iter__c             C   s   | j  | j¡}|st‚|S )N)r   r   r7   ÚStopIteration)r   Úvalr   r   r   Únext²   s    zReadOnlyFileBasedBuffer.nextc             C   s   t ‚d S )N)r#   )r   r   r   r   r   r   º   s    zReadOnlyFileBasedBuffer.append)r6   )N)r   F)
r*   r+   r,   r   r;   r   r<   r?   Ú__next__r   r   r   r   r   r5      s   


r5   c               @   s„   e Zd ZdZdZdZdZdd„ Zdd„ Zd	d
„ Z	e	Z
dd„ Zdd„ Zdd„ Zdd„ Zddd„Zddd„Zdd„ Zdd„ Zdd„ ZdS ) ÚOverflowableBufferzÏ
    This buffer implementation has four stages:
    - No data
    - Bytes-based buffer
    - BytesIO-based buffer
    - Temporary file storage
    The first two stages are fastest for simple transfers.
    FNó    c             C   s
   || _ d S )N)Úoverflow)r   rC   r   r   r   r   Ì   s    zOverflowableBuffer.__init__c             C   s$   | j }|d k	r| ¡ S | j ¡ S d S )N)Úbufr   Ústrbuf)r   rD   r   r   r   r   Ð   s    zOverflowableBuffer.__len__c             C   s   |   ¡ dkS )Nr   )r   )r   r   r   r   r   Ù   s    zOverflowableBuffer.__nonzero__c             C   sF   | j }t|ƒ| jkr|  ¡  n|  ¡  | j}|rB| | j ¡ d| _ |S )NrB   )rE   r   rC   Ú_set_large_bufferÚ_set_small_bufferrD   r   )r   rE   rD   r   r   r   Ú_create_bufferà   s    
z!OverflowableBuffer._create_bufferc             C   s   t | jƒ| _d| _d S )NF)r1   rD   Ú
overflowed)r   r   r   r   rG   ì   s    z$OverflowableBuffer._set_small_bufferc             C   s   t | jƒ| _d| _d S )NT)r.   rD   rI   )r   r   r   r   rF   ð   s    z$OverflowableBuffer._set_large_bufferc             C   sl   | j }|d kr>| j}t|ƒt|ƒ tk r6|| | _d S |  ¡ }| |¡ | ¡ }| jsh|| jkrh|  	¡  d S )N)
rD   rE   r   ÚSTRBUF_LIMITrH   r   r   rI   rC   rF   )r   r   rD   rE   r%   r   r   r   r   ô   s    


zOverflowableBuffer.appendr   c             C   s0   | j }|d kr$| j}|s|S |  ¡ }| ||¡S )N)rD   rE   rH   r   )r   r   r   rD   rE   r   r   r   r     s    zOverflowableBuffer.getc             C   sB   | j }|d kr2|r*|t| jƒkr*d| _d S |  ¡ }| ||¡ d S )NrB   )rD   r   rE   rH   r   )r   r   r"   rD   r   r   r   r     s    zOverflowableBuffer.skipc             C   sD   | j }|dkrd| _dS | ¡  | jr@| ¡ }|| jk r@|  ¡  dS )zt
        A potentially expensive operation that removes all data
        already retrieved from the buffer.
        NrB   )rD   rE   r'   rI   r   rC   rG   )r   rD   r%   r   r   r   r'     s    
zOverflowableBuffer.prunec             C   s   | j }|d kr|  ¡ }| ¡ S )N)rD   rH   r   )r   rD   r   r   r   r   +  s    zOverflowableBuffer.getfilec             C   s   | j }|d k	r| ¡  d S )N)rD   r(   )r   rD   r   r   r   r(   1  s    zOverflowableBuffer.close)r   F)F)r*   r+   r,   Ú__doc__rI   rD   rE   r   r   r   r-   rH   rG   rF   r   r   r   r'   r   r(   r   r   r   r   rA   ¾   s"   	
	
rA   N)rK   Úior   r	   rJ   r   r.   r1   r4   r5   rA   r   r   r   r   Ú<module>   s   X
1