
zR\D=                 @   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 m	 Z	 m
 Z
 m Z 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   )unittestdecorate_all_testsskip_if_tpc_disabledConnectingTestCaseskip_if_greenslowc                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 P/var/www/dbchiro/venv/lib/python3.4/site-packages/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   Z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 e 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% dE dF   Z& e' dG dH    Z( e' dI dJ    Z) dK dL   Z* dM dN   Z+ dO S)P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   r/   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   r/   r(   r)   write)r   r!   r2   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   closer/   r(   r   )r   r!   r2   r   r   r   test_open_mode_nh   s
    
z!LargeObjectTests.test_open_mode_nc             C   si   |  j  j   } |  j  j d d   } |  j  j d d  } |  j | j | j  |  j | j | j  d  S)Nr)    )r
   r   r(   r)   )r   r!   r2   Zlo3r   r   r   test_mode_defaultsq   s
    z#LargeObjectTests.test_mode_defaultsc             C   s*   |  j  j   } |  j  j   | j   d  S)N)r
   r   r6   )r   r!   r   r   r   test_close_connection_gonex   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   r/   r   r(   )r   r!   r/   r   r   r   test_create_with_oid}   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   r6   r+   r   r   r/   
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   r1   z	some data)tempfilemkdtempr   ospathjoinopenr4   r6   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   r6   )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(   r4   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(   r4   rJ   )r   r!   rL   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   r8   somez data)r
   r   r4   r6   r/   rE   r(   type)r   r!   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rbrN       s   somes    data)r
   r   r4   r6   r/   rE   r(   rP   )r   r!   rQ   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 ZrtrN   r8   rO   z data )r
   r   r4   r6   r/   rE   r(   rP   )r   r!   ZsnowmanrQ   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)NrL   i@B rO   rN   z%r... != %r...d   )r
   r   r4   r6   r/   r(   rE   r<   )r   r!   rL   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   rL      r      ta)	r
   r   r4   r(   tellr6   r/   seekrE   )r   r!   lengthr   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   r/   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.txtrS   )r
   r   r4   r?   r@   r   rA   rB   rC   exportr<   existsrD   r(   rE   r6   )r   r!   rF   r   r   r   r   test_export   s    zLargeObjectTests.test_exportc             C   s'   |  j  j   } | j   | j   d  S)N)r
   r   r6   )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   r6   r+   r   InterfaceErrorr4   )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)NrY   )r
   r   r6   r+   r   rg   rE   )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   r6   r+   r   rg   r_   )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   r6   r+   r   rg   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   r6   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.txtrS   )r
   r   r4   r6   r?   r@   r   rA   rB   rC   rc   r<   rd   rD   r(   rE   )r   r!   rF   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   r/   r   commitr6   )r   r!   r   r   r   test_close_after_commit1  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   r/   r   rn   r+   r   ProgrammingErrorr4   )r   r!   r   r   r   test_write_after_commit9  s    z(LargeObjectTests.test_write_after_commitc             C   sE   |  j  j   } | j |  _ |  j  j   |  j t j | j d  d  S)NrY   )	r
   r   r/   r   rn   r+   r   rp   rE   )r   r!   r   r   r   test_read_after_commit@  s    z'LargeObjectTests.test_read_after_commitc             C   sE   |  j  j   } | j |  _ |  j  j   |  j t j | j d  d  S)Nr   )	r
   r   r/   r   rn   r+   r   rp   r_   )r   r!   r   r   r   test_seek_after_commitG  s    z'LargeObjectTests.test_seek_after_commitc             C   sB   |  j  j   } | j |  _ |  j  j   |  j t j | j  d  S)N)	r
   r   r/   r   rn   r+   r   rp   r^   )r   r!   r   r   r   test_tell_after_commitN  s    z'LargeObjectTests.test_tell_after_commitc             C   s6   |  j  j   } | j |  _ |  j  j   | j   d  S)N)r
   r   r/   r   rn   r   )r   r!   r   r   r   test_unlink_after_commitU  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.txtrS   )r
   r   r4   rn   r?   r@   r   rA   rB   rC   rc   r<   rd   rD   r(   rE   r6   )r   r!   rF   r   r   r   r   test_export_after_commit]  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_lobjectrY   )
r
   	tpc_beginr   r/   r   
tpc_commitr+   r   rp   rE   )r   r!   r   r   r   test_read_after_tpc_commitl  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)Nrw   rY   )r
   rx   r   r/   r   Ztpc_preparer+   r   rp   rE   ry   )r   r!   r   r   r   test_read_after_tpc_prepareu  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_oid  s    zLargeObjectTests.test_large_oidc             C   sK   Gd d   d t  j j  } |  j j d |  } |  j t | |   d  S)Nc               @   s   e  Z d  Z d S)z7LargeObjectTests.test_factory.<locals>.lobject_subclassN)r"   r#   r$   r   r   r   r   lobject_subclass  s   r}   Zlobject_factory)r   r-   r   r
   r<   
isinstance)r   r}   r!   r   r   r   test_factory  s    zLargeObjectTests.test_factoryN),r"   r#   r$   r*   r.   r0   r3   r5   r7   r9   r:   r;   r=   rH   rI   rK   rM   rR   rU   rV   r	   rX   ra   rb   re   rf   rh   ri   rj   rk   rl   rm   ro   rq   rr   rs   rt   ru   rv   r   rz   r{   r|   r   r   r   r   r   r%   J   sN   		
		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&   rN   r   rO      Zsome  r8   )
r
   r   r4   r6   r/   r   r(   r^   rE   r_   )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   r6   r+   r   rg   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   r/   r   rn   r+   r   rp   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(   r_   r^   )r   r!   r`   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   rg   NotSupportedErrorr_   )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   rg   r   r   )r   r!   r`   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__)rA   r   r?   	functoolsr   r   Zpsycopg2.extensionsZ	testutilsr   r   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>   s8   .
 F$
