
5dV~;                 @   s  d  d l  Z  d  d l Z d  d l Z d  d l m Z d  d l Z d  d l Z d  d l m Z d d l m	 Z	 m
 Z
 m Z d d l m Z m Z d d   Z e d	  Z Gd
 d   d e  Z Gd d   d e  Z e
 e e e  d d   Z Gd d   d e  Z e
 e e e e  d d   Z d d   Z Gd d   d e  Z e
 e e e e e  d d   Z Gd d   d e  Z e
 e e e e e  d d   Z e d k re	 j   n  d S)    N)wraps)b   )unittestdecorate_all_testsskip_if_tpc_disabled)ConnectingTestCaseskip_if_greenc                s"   t       f d d    } | S)Nc                s-   |  j  j d k  r |  j d  S  |   Sd  S)Ni8 z(large objects only supported from PG 8.1)connserver_versionskipTest)self)f ?/tmp/pip-build-0jahl3lb/psycopg2/psycopg2/tests/test_lobject.pyskip_if_no_lo_%   s    z%skip_if_no_lo.<locals>.skip_if_no_lo_)r   )r   r   r   )r   r   skip_if_no_lo$   s    r   z&libpq doesn't support LO in async modec               @   s(   e  Z d  Z d d   Z d d   Z d S)LargeObjectTestCasec             C   s#   t  j |   d  |  _ d  |  _ d  S)N)r   setUplo_oidtmpdir)r   r   r   r   r   2   s    	zLargeObjectTestCase.setUpc             C   s   |  j  r" t j |  j  d d n  |  j j r2 d  S|  j d  k	 r |  j j   y |  j j |  j d  } Wn t j	 k
 r Yq X| j
   n  t j |   d  S)Nignore_errorsTn)r   shutilrmtreer
   closedr   rollbacklobjectpsycopg2OperationalErrorunlinkr   tearDown)r   lor   r   r   r!   7   s    	zLargeObjectTestCase.tearDownN)__name__
__module____qualname__r   r!   r   r   r   r   r   1   s   r   c               @   s  e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d    Z d! d"   Z d# d$   Z d% d&   Z d' d(   Z d) d*   Z d+ d,   Z d- d.   Z d/ d0   Z d1 d2   Z d3 d4   Z d5 d6   Z d7 d8   Z d9 d:   Z d; d<   Z  d= d>   Z! d? d@   Z" dA dB   Z# dC dD   Z$ e% dE dF    Z& e% dG dH    Z' dI dJ   Z( dK S)LLargeObjectTestsc             C   s:   |  j  j   } |  j | d   |  j | j d d  d  S)Nr   w)r
   r   assertNotEqualassertEqualmode)r   r"   r   r   r   test_createK   s    zLargeObjectTests.test_createc             C   s   |  j  t t j j g   d  S)N)assertRaises	TypeErrorr   
extensionsr   )r   r   r   r   test_connection_neededP   s    	z'LargeObjectTests.test_connection_neededc             C   s<   |  j  j   } | j   |  j t j |  j  j | j  d  S)N)r
   r   r    r,   r   r   oid)r   r"   r   r   r   test_open_non_existentT   s    
z'LargeObjectTests.test_open_non_existentc             C   se   |  j  j   } |  j  j | j  } |  j | d   |  j | j | j  |  j | j d d  d  S)Nr   r)r
   r   r0   r(   r)   r*   )r   r"   lo2r   r   r   test_open_existing[   s
    z#LargeObjectTests.test_open_existingc             C   sO   |  j  j   } |  j  j | j d  } |  j | j d d  | j d  d  S)Nr'   r   s	   some data)r
   r   r0   r)   r*   write)r   r"   r3   r   r   r   test_open_for_writeb   s    z$LargeObjectTests.test_open_for_writec             C   s^   |  j  j   } | j   |  j  j | j d  } |  j | j | j  |  j | j d  d  S)Nr   T)r
   r   closer0   r)   r   )r   r"   r3   r   r   r   test_open_mode_nh   s
    
z!LargeObjectTests.test_open_mode_nc             C   s*   |  j  j   } |  j  j   | j   d  S)N)r
   r   r7   )r   r"   r   r   r   test_close_connection_goneq   s    z+LargeObjectTests.test_close_connection_gonec             C   sQ   |  j  j   } | j } | j   |  j  j d d |  } |  j | j |  d  S)Nr   r'   )r
   r   r0   r    r)   )r   r"   r0   r   r   r   test_create_with_oidv   s
    	
z%LargeObjectTests.test_create_with_oidc             C   sV   |  j  j   } | j   |  j t j |  j  j d d | j  |  j |  j  j  d  S)Nr   r'   )	r
   r   r7   r,   r   r   r0   
assertTruer   )r   r"   r   r   r   test_create_with_existing_oid   s
    
z.LargeObjectTests.test_create_with_existing_oidc             C   s   t  j   |  _ t j j |  j d  } t | d  } | j d  | j   |  j	 j
 d d d |  } |  j | j   d  d  S)Nzdata.txtwbs	   some datar   r2   z	some data)tempfilemkdtempr   ospathjoinopenr5   r7   r
   r   r)   read)r   filenamefpr"   r   r   r   test_import   s    
zLargeObjectTests.test_importc             C   sC   |  j  j   } |  j | j d  | j   |  j | j d  d  S)NFT)r
   r   r)   r   r7   )r   r"   r   r   r   
test_close   s    
zLargeObjectTests.test_closec             C   s2   |  j  j   } |  j | j d  t d   d  S)Ns	   some dataz	some data)r
   r   r)   r5   len)r   r"   r   r   r   
test_write   s    zLargeObjectTests.test_writec             C   s<   |  j  j   } d d } |  j | j |  t |   d  S)Ndatai@B )r
   r   r)   r5   rI   )r   r"   rK   r   r   r   test_write_large   s    
z!LargeObjectTests.test_write_largec             C   s   |  j  j   } | j d  } | j   |  j  j | j  } | j d  } |  j t |  t d   |  j | d  |  j | j   d  d  S)Ns	   some data    somez data)r
   r   r5   r7   r0   rD   r)   type)r   r"   lengthxr   r   r   	test_read   s    
zLargeObjectTests.test_readc             C   s   |  j  j   } | j d  } | j   |  j  j | j d  } | j d  } |  j t |  t d   |  j | d  |  j | j   d  d  S)Ns	   some datarbrM       s   somes    data)r
   r   r5   r7   r0   rD   r)   rP   )r   r"   rQ   rR   r   r   r   test_read_binary   s    
z!LargeObjectTests.test_read_binaryc             C   s   |  j  j   } d } | j d |  } | j   |  j  j | j d  } | j d  } |  j t |  t d   |  j | d  |  j | j   d |  d  S)Nu   ☃z
some data rtrM   rN   rO   z data )r
   r   r5   r7   r0   rD   r)   rP   )r   r"   ZsnowmanrQ   rR   r   r   r   test_read_text   s    
zLargeObjectTests.test_read_textc             C   s   |  j  j   } d d } | j d |  } | j   |  j  j | j  } |  j | j d  d  | j   } |  j | | k d | d  d  | d  d  f  d  S)NrK   i@B rO   rM   z%r... != %r...d   )r
   r   r5   r7   r0   r)   rD   r;   )r   r"   rK   rQ   Zdata1r   r   r   test_read_large   s    

z LargeObjectTests.test_read_largec             C   s*  |  j  j   } | j d  } |  j | j   |  | j   |  j  j | j  } |  j | j d d  d  |  j | j   d  |  j | j   d  | j d  |  j | j d d  d  |  j | j   d  |  j | j   d  |  j | j d	 d  | d  |  j | j   d  d  S)
Ns	   some data   r   rK      r      ta)	r
   r   r5   r)   tellr7   r0   seekrD   )r   r"   rQ   r   r   r   test_seek_tell   s    
 zLargeObjectTests.test_seek_tellc             C   sO   |  j  j   } | j   |  j t j |  j  j | j  |  j | j d  d  S)NT)	r
   r   r    r,   r   r   r0   r)   r   )r   r"   r   r   r   test_unlink   s    
zLargeObjectTests.test_unlinkc          
   C   s   |  j  j   } | j d  t j   |  _ t j j |  j d  } | j	 |  |  j
 t j j |   t | d  } z |  j | j   d  Wd  | j   Xd  S)Ns	   some datazdata.txtrT   )r
   r   r5   r>   r?   r   r@   rA   rB   exportr;   existsrC   r)   rD   r7   )r   r"   rE   r   r   r   r   test_export   s    zLargeObjectTests.test_exportc             C   s'   |  j  j   } | j   | j   d  S)N)r
   r   r7   )r   r"   r   r   r   test_close_twice   s    
z!LargeObjectTests.test_close_twicec             C   s6   |  j  j   } | j   |  j t j | j d  d  S)Ns	   some data)r
   r   r7   r,   r   InterfaceErrorr5   )r   r"   r   r   r   test_write_after_close   s    
z'LargeObjectTests.test_write_after_closec             C   s6   |  j  j   } | j   |  j t j | j d  d  S)Nr[   )r
   r   r7   r,   r   rh   rD   )r   r"   r   r   r   test_read_after_close  s    
z&LargeObjectTests.test_read_after_closec             C   s6   |  j  j   } | j   |  j t j | j d  d  S)Nr   )r
   r   r7   r,   r   rh   ra   )r   r"   r   r   r   test_seek_after_close
  s    
z&LargeObjectTests.test_seek_after_closec             C   s3   |  j  j   } | j   |  j t j | j  d  S)N)r
   r   r7   r,   r   rh   r`   )r   r"   r   r   r   test_tell_after_close  s    
z&LargeObjectTests.test_tell_after_closec             C   s'   |  j  j   } | j   | j   d  S)N)r
   r   r7   r    )r   r"   r   r   r   test_unlink_after_close  s    
z(LargeObjectTests.test_unlink_after_closec          
   C   s   |  j  j   } | j d  | j   t j   |  _ t j j	 |  j d  } | j
 |  |  j t j j |   t | d  } z |  j | j   d  Wd  | j   Xd  S)Ns	   some datazdata.txtrT   )r
   r   r5   r7   r>   r?   r   r@   rA   rB   rd   r;   re   rC   r)   rD   )r   r"   rE   r   r   r   r   test_export_after_close  s    
z(LargeObjectTests.test_export_after_closec             C   s6   |  j  j   } | j |  _ |  j  j   | j   d  S)N)r
   r   r0   r   commitr7   )r   r"   r   r   r   test_close_after_commit)  s    z(LargeObjectTests.test_close_after_commitc             C   sE   |  j  j   } | j |  _ |  j  j   |  j t j | j d  d  S)Ns	   some data)	r
   r   r0   r   ro   r,   r   ProgrammingErrorr5   )r   r"   r   r   r   test_write_after_commit1  s    z(LargeObjectTests.test_write_after_commitc             C   sE   |  j  j   } | j |  _ |  j  j   |  j t j | j d  d  S)Nr[   )	r
   r   r0   r   ro   r,   r   rq   rD   )r   r"   r   r   r   test_read_after_commit8  s    z'LargeObjectTests.test_read_after_commitc             C   sE   |  j  j   } | j |  _ |  j  j   |  j t j | j d  d  S)Nr   )	r
   r   r0   r   ro   r,   r   rq   ra   )r   r"   r   r   r   test_seek_after_commit?  s    z'LargeObjectTests.test_seek_after_commitc             C   sB   |  j  j   } | j |  _ |  j  j   |  j t j | j  d  S)N)	r
   r   r0   r   ro   r,   r   rq   r`   )r   r"   r   r   r   test_tell_after_commitF  s    z'LargeObjectTests.test_tell_after_commitc             C   s6   |  j  j   } | j |  _ |  j  j   | j   d  S)N)r
   r   r0   r   ro   r    )r   r"   r   r   r   test_unlink_after_commitM  s    z)LargeObjectTests.test_unlink_after_commitc          
   C   s   |  j  j   } | j d  |  j  j   t j   |  _ t j j	 |  j d  } | j
 |  |  j t j j |   t | d  } z |  j | j   d  Wd  | j   Xd  S)Ns	   some datazdata.txtrT   )r
   r   r5   ro   r>   r?   r   r@   rA   rB   rd   r;   re   rC   r)   rD   r7   )r   r"   rE   r   r   r   r   test_export_after_commitU  s    z)LargeObjectTests.test_export_after_commitc             C   sU   |  j  j d  |  j  j   } | j |  _ |  j  j   |  j t j | j	 d  d  S)Ntest_lobjectr[   )
r
   	tpc_beginr   r0   r   
tpc_commitr,   r   rq   rD   )r   r"   r   r   r   test_read_after_tpc_commitd  s
    z+LargeObjectTests.test_read_after_tpc_commitc          
   C   sj   |  j  j d  |  j  j   } | j |  _ |  j  j   z |  j t j | j	 d  Wd  |  j  j
   Xd  S)Nrx   r[   )r
   ry   r   r0   r   Ztpc_preparer,   r   rq   rD   rz   )r   r"   r   r   r   test_read_after_tpc_preparem  s    z,LargeObjectTests.test_read_after_tpc_preparec             C   s0   y |  j  j d  Wn t j k
 r+ Yn Xd  S)Nl    )r
   r   r   r   )r   r   r   r   test_large_oidy  s    zLargeObjectTests.test_large_oidN))r#   r$   r%   r+   r/   r1   r4   r6   r8   r9   r:   r<   rG   rH   rJ   rL   rS   rV   rX   rZ   rb   rc   rf   rg   ri   rj   rk   rl   rm   rn   rp   rr   rs   rt   ru   rv   rw   r   r{   r|   r}   r   r   r   r   r&   J   sJ   		
		r&   c                s"   t       f d d    } | S)Nc                sK   |  j  j d k  r |  j d  St t j j d  sA |  j d  S  |   S)Ni9 z0the server doesn't support large object truncatetruncatezNpsycopg2 has been built against a libpq without large object truncate support.)r
   r   r   hasattrr   r.   r   )r   )r   r   r   skip_if_no_truncate_  s    z1skip_if_no_truncate.<locals>.skip_if_no_truncate_)r   )r   r   r   )r   r   skip_if_no_truncate  s    r   c               @   s4   e  Z d  Z d d   Z d d   Z d d   Z d S)LargeObjectTruncateTestsc             C   s   |  j  j   } | j d  | j   |  j  j | j d  } | j d  |  j | j   d  |  j | j   d  | j d  | j	 d  |  j | j   d  | j   | j	 d  |  j | j   d  d  S)	Nz	some datar'   rM   r   rO      Zsome  rN   )
r
   r   r5   r7   r0   r~   r)   r`   rD   ra   )r   r"   r   r   r   test_truncate  s    

z&LargeObjectTruncateTests.test_truncatec             C   s3   |  j  j   } | j   |  j t j | j  d  S)N)r
   r   r7   r,   r   rh   r~   )r   r"   r   r   r   test_truncate_after_close  s    
z2LargeObjectTruncateTests.test_truncate_after_closec             C   sB   |  j  j   } | j |  _ |  j  j   |  j t j | j  d  S)N)	r
   r   r0   r   ro   r,   r   rq   r~   )r   r"   r   r   r   test_truncate_after_commit  s    z3LargeObjectTruncateTests.test_truncate_after_commitN)r#   r$   r%   r   r   r   r   r   r   r   r     s   r   c             C   s7   |  j  d k  r  d d |  j  f Sd t j k r3 d Sd	 S)
z)Return (bool, msg) about the lo64 supporti` Fz.server version %s doesn't support the lo64 APIlo64/this psycopg build doesn't support the lo64 APIT*this server and build support the lo64 API)Fr   )Tr   )r   r   __version__)r
   r   r   r   	_has_lo64  s    r   c                s"   t       f d d    } | S)Nc                s6   t  |  j  \ } } | s( |  j |  S  |   Sd  S)N)r   r
   r   )r   r   msg)r   r   r   skip_if_no_lo64_  s     z)skip_if_no_lo64.<locals>.skip_if_no_lo64_)r   )r   r   r   )r   r   skip_if_no_lo64  s    r   c               @   s   e  Z d  Z d d   Z d S)LargeObject64Testsc             C   sX   |  j  j   } d } | j |  |  j | j | d  |  |  j | j   |  d  S)Nr         r   l        i   @l        )r
   r   r~   r)   ra   r`   )r   r"   rQ   r   r   r   (test_seek_tell_truncate_greater_than_2gb  s
    z;LargeObject64Tests.test_seek_tell_truncate_greater_than_2gbN)r#   r$   r%   r   r   r   r   r   r     s   r   c                s"   t       f d d    } | S)Nc                s6   t  |  j  \ } } | r( |  j |  S  |   Sd  S)N)r   r
   r   )r   r   r   )r   r   r   skip_if_lo64_  s     z#skip_if_lo64.<locals>.skip_if_lo64_)r   )r   r   r   )r   r   skip_if_lo64  s    r   c               @   s(   e  Z d  Z d d   Z d d   Z d S)LargeObjectNot64Testsc             C   sA   |  j  j   } d } |  j t t j t j f | j | d  d  S)Nr       r   l        )r
   r   r,   OverflowErrorr   rh   NotSupportedErrorra   )r   r"   offsetr   r   r   test_seek_larger_than_2gb  s
    z/LargeObjectNot64Tests.test_seek_larger_than_2gbc             C   s>   |  j  j   } d } |  j t t j t j f | j |  d  S)Nr   r   l        )r
   r   r,   r   r   rh   r   r~   )r   r"   rQ   r   r   r   test_truncate_larger_than_2gb  s
    z3LargeObjectNot64Tests.test_truncate_larger_than_2gbN)r#   r$   r%   r   r   r   r   r   r   r     s   r   c               C   s   t  j   j t  S)N)r   Z
TestLoaderZloadTestsFromNamer#   r   r   r   r   
test_suite  s    r   __main__)r@   r   r>   	functoolsr   r   Zpsycopg2.extensionsr   Z	testutilsr   r   r   r   r	   r   Zskip_lo_if_greenr   r&   r   r   r   r   r   r   r   r   r#   mainr   r   r   r   <module>   s<   
 7$	
	