3
d}P                 @   s2  d dl Z d dlmZ d dlmZmZ d dlmZ d dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZ d	d
 Zyd dlmZ dZW nB ek
r   yd dlmZ dZW n ek
r   dZY nX Y nX erejZejejB ejB ZdZejZe j e!Z"dgZ#G dd de	Z$dd Z%dd Z&dd Z'dd Z(dS )    N)Thread)existsabspath)mkdir)StoreVALID_STORENO_STORE)URIRef)b)pathname2urlc             C   s
   | j dS )Nzutf-8)encode)u r   :/tmp/pip-build-7vycvbft/rdflib/rdflib/plugins/sleepycat.pybb   s    r   )dbTFi   2   	Sleepycatc                   s   e Zd ZdZdZdZdZdZd2 fdd	Zdd Z	e
e	Zd3dd	Zd
d Zd4ddZdd Zdd Zd5ddZd6ddZd7ddZd8ddZd9ddZd:ddZdd Zd d! Zd"d# Zd$d% Zd;d&d'Zd(d) Zd*d+ Zd,d- Zd<d.d/Zd=d0d1Z   Z!S )>r   TFNc                s@   t stdd| _|| _tt| j| | jj| _	| jj
| _d S )Nz1Unable to import bsddb/bsddb3, store is unusable.F)	has_bsddbImportError_Sleepycat__open_Sleepycat__identifiersuperr   __init__Znode_picklerloads_loadsdumps_dumps)selfZconfiguration
identifier)	__class__r   r   r   2   s    
zSleepycat.__init__c             C   s   | j S )N)r   )r   r   r   r   Z__get_identifier<   s    zSleepycat.__get_identifierc             C   s^   t |s(|dkr$t| | j| ntS tj }|jdt |jt	d |j
|ttjB  |S )NTr      )r   r   creater   r   ZDBEnvZset_cachesize	CACHESIZE	set_flagsENVSETFLAGSopenENVFLAGS	DB_CREATE)r   homeDirr"   db_envr   r   r   _init_db_environment@   s    zSleepycat._init_db_environmentc             C   s   | j S )N)r   )r   r   r   r   is_openO   s    zSleepycat.is_openc             C   s  t stS |}| jd kr(ttt|| _| j||}|tkr@tS || _d| _d }t	j
}t}| jdkrn|t	jO }|r||t	jO }d}d}	d gd | _d gd | _xtddD ]t}
t|
tdtdtdftdj }t	j|}|j|	 |j||||| || j|
< |t|
t|
f| j|
< qW i }xtdd	D ]}
g }xxtddD ]j}d
}d}x>t||d D ],}|
d
|d > @ r|d
> }|d
7 }nP q`W d| }|j||f||f qDW |j  |d \}}}dd }| j| |||| t|t|| jf||
< q0W || _t	j|| _| jj|	 | jjd|||| t	j|| _| jj|	 | jjd|||| t	j|| _ | j j|	 | j jd|||| t	j|| _!| j!j|	 | j!jd|t	j"|| t	j|| _#| j#j|	 | j#jd|t	j$|| d| _%t&| j'd}|j(d |j)  || _*t+S )NTi  r      spoc   r!      c                s    fdd}|S )Nc             3   sH   |d krdV  n|V  }x"| k r<| |d  V  |d7 }qW dV  d S )N r-   r!   r   )triplecontexti)endstartr   r   
get_prefix   s    
z;Sleepycat.open.<locals>.get_prefix_func.<locals>.get_prefixr   )r9   r8   r:   r   )r8   r9   r   get_prefix_func   s    
z'Sleepycat.open.<locals>.get_prefix_funccontexts	namespaceprefixZk2iZi2kF)target),r   r   r   r	   r   r   r+   r*   r   r   ZDB_BTREEDBOPENFLAGStransaction_awareZDB_AUTO_COMMITr(   _Sleepycat__indicies_Sleepycat__indicies_inforangeto_key_funcr
   decodeZDBr$   r&   from_key_funcappendsortresults_from_key_func_from_string_Sleepycat__lookup_dict_Sleepycat__contexts_Sleepycat__namespace_Sleepycat__prefix_Sleepycat__k2iZDB_HASH_Sleepycat__i2kZDB_RECNO_Sleepycat__needs_syncr   _Sleepycat__sync_run	setDaemonr9   _Sleepycat__sync_threadr   )r   pathr"   r)   r*   ZdbnameZdbtypeZdbopenflagsZdbmodeZ
dbsetflagsr7   Z
index_nameindexlookupresultsr9   ZscorelenjZ	tie_breakr;   tr   r   r   r&   R   s    



&




zSleepycat.openc             C   s   ddl m}m } yd	\}}x| jr| jr|  }}d| _xd| jr|d | jrZ| }d| _| | |ksv| | |kr:d| _tjd | j  P q:W q|d qW W n, tk
r } ztj| W Y d d }~X nX d S )
Nr   )sleeptime
   ,  Fg?syncr!   )r`   ra   )	r_   r^   r   rS   loggerdebugrb   	Exception	exception)r   r^   r_   Zmin_secondsZmax_secondst0t1er   r   r   Z
__sync_run   s*    

zSleepycat.__sync_runc             C   sT   | j rPx| jD ]}|j  qW | jj  | jj  | jj  | jj  | jj  d S )N)r   rC   rb   rN   rO   rP   rR   rQ   )r   r7   r   r   r   rb      s    



zSleepycat.syncc             C   sh   d| _ | jj  x| jD ]}|j  qW | jj  | jj  | jj  | jj  | j	j  | j
j  d S )NF)r   rV   joinrC   closerN   rO   rP   rR   rQ   r*   )r   Zcommit_pending_transactionr7   r   r   r   rk      s    





zSleepycat.closec             C   s  |\}}}| j std|| ks(tdtj| |||f|| | j}|||d}	|||d}
|||d}|||d}| j\}}}|jtd||	|
|f |d}|dkr| jj	t|d|d |jtdd|	|
|f |dpt
d}t|jt
d}|jt| t
dj|}|dk	s t|j	td||	|
|f d|d |j	td||
||	f d|d |j	td|||	|
f d|d |s|j	tdd|	|
|f ||d |j	tdd|
||	f ||d |j	tdd||	|
f ||d d| _dS )	z6        Add a triple to the store of triples.
        zThe Store must be open.z$Can not add triple directly to store)txnz%s^%s^%s^%s^Nr4   ^T)r   AssertionErrorr   add
_to_stringrC   getr   rN   putr
   setsplitrj   rS   )r   r5   r6   quotedrl   subject	predicateobjectrp   r.   r/   r0   r1   cspocposcospvaluecontexts_valuer<   r   r   r   ro      s<    

"   zSleepycat.addc             C   s:  |\}}}| j \}}	}
|jtdjtd|||tdg|dpFtd}t|jtd}|j| tdj|}x.| jD ]$\}}}|j||||f||d qzW |s6|rx| jD ]*\}}}|j	||||ftd||d qW nRxP| jD ]F\}}}y"|j||||ftd|d W q t
jk
r0   Y qX qW d S )Nrm   r4   )rl   )rC   rq   r
   rj   rs   rt   discardrD   deleterr   r   DBNotFoundError)r   spor1   ru   rl   r.   r/   r0   ry   rz   r{   r}   r<   r7   _to_keyZ	_from_keyr   r   r   Z__remove  s$    
.
&"zSleepycat.__removec             C   s  |\}}}| j stdtj| |||f| | j}|d k	rF|| krFd }|d k	r|d k	r|d k	r|d k	r|||d}|||d}	|||d}
|||d}| jd jtd|||	|
f |d}|d k	r| jt|t|	t|
ft||d d| _	n| j\}}}| j
|||f||d\}}}}|j|d}y|j|}d}W n  tjk
rZ   d }d}Y nX |j  x|r|\}}|j|d}y|j| t|d }W n tjk
r   d }Y nX |j  |j|r|||\}}}	}
|d krd|j||dptd}t|jtd	}|jtd xX|D ]8}x0| jD ]&\}}}|j|||	|
f||d q2W q&W n| j||	|
f||d nP qhW |d k	r|d kr|d kr|d kry | jjt|||d|d W n tjk
r   Y nX || _	d S )
NzThe Store must be open.)rl   r   z%s^%s^%s^%s^TFnextr4   rm   )r   rn   r   removerp   rC   rq   r   _Sleepycat__removerS   _Sleepycat__lookupcursor	set_ranger   r   rk   getattr
startswithr
   rs   rt   ro   rD   r   rN   )r   r   r6   rl   rv   rw   rx   rp   r.   r/   r0   r1   r|   ry   rz   r{   rX   r>   from_keyresults_from_keyr   currentZ
needs_synckeyr}   r<   r7   r   _r   r   r   r   *  sv    
&







(
zSleepycat.removec             c   s  | j std|\}}}|dk	r,|| kr,d}| j|||f||d\}}}	}
|j|d}y|j|}W n tjk
r~   d}Y nX |j  x|r|\}}|j|d}y|j| t|d }W n tjk
r   d}Y nX |j  |o|j	|r|j
||d}|
|||||V  qP qW dS )z*A generator over all the triples matching zThe Store must be open.N)rl   r   )r   rn   r   r   r   r   r   rk   r   r   rq   )r   r   r6   rl   rv   rw   rx   rX   r>   r   r   r   r   r   r|   r}   r   r   r   triplest  s6    



zSleepycat.triplesc       	      C   s   | j std|d k	r"|| kr"d }|d kr4td}ntd| j| }| jd }|j }|j|}d}x2|r|\}}|j|r|d7 }t	|d }qhP qhW |j
  |S )NzThe Store must be open.rm   z%s^r   r!   r   )r   rn   r
   r   rp   rC   r   r   r   r   rk   )	r   r6   r>   rX   r   r   countr   r|   r   r   r   __len__  s&    



zSleepycat.__len__c             C   sH   |j d}|j d}| jj|}|r0| jj| || j|< || j|< d S )Nzutf-8)r   rP   rq   rO   r   )r   r>   r=   Zbound_prefixr   r   r   bind  s    


zSleepycat.bindc             C   s2   |j d}| jj|d }|d k	r.t|jdS d S )Nzutf-8)r   rO   rq   r	   rG   )r   r>   nsr   r   r   r=     s
    
zSleepycat.namespacec             C   s.   |j d}| jj|d }|d k	r*|jdS d S )Nzutf-8)r   rP   rq   rG   )r   r=   r>   r   r   r   r>     s
    

zSleepycat.prefixc             c   sz   | j j }g }|j }x6|rL|\}}|j|jd|jdf t|d }qW |j  x|D ]\}}|t|fV  q\W d S )Nzutf-8r   )rO   r   firstrI   rG   r   rk   r	   )r   r   rZ   r   r>   r=   r   r   r   
namespaces  s    
zSleepycat.namespacesc             c   s  | j }| j}|r~|\}}}||}||}||}| jd jtdd|||f }|r|x|jtdD ]}|rf||V  qfW n| j}	|	j }
|
j	 }|
j
  xf|r|\}}||}|V  |	j }
y|
j| t|
d }W n tjk
r   d }Y nX |
j
  qW d S )Nr   z%s^%s^%s^%s^r4   rm   r   )rL   rp   rC   rq   r   rt   r
   rN   r   r   rk   r   r   r   r   )r   r5   rL   rp   r.   r/   r0   r<   r1   rX   r   r   r   r|   r6   r   r   r   r<     s8    


zSleepycat.contextsc             C   s   | j jt| j|d d S )Nr4   )rN   rr   r   rp   )r   graphr   r   r   	add_graph  s    zSleepycat.add_graphc             C   s   | j d| d S )N)NNN)r   )r   r   r   r   r   remove_graph  s    zSleepycat.remove_graphc             C   s   | j jt|}| j|S )N)rR   rq   intr   )r   r7   kr   r   r   rL     s    zSleepycat._from_stringc             C   sl   | j |}| jj||d}|d kr`| jr<d| jj|| }nd| jj| }| jj|||d n|j }|S )N)rl   z%s)r   rQ   rq   rB   rR   rI   rr   rG   )r   Ztermrl   r   r7   r   r   r   rp     s    
zSleepycat._to_stringc             C   s   |\}}}| j }|d k	r$|||d}d}|d k	rD|d7 }|||d}|d k	r`|d7 }|||d}|d k	r||d7 }|||d}| j| \}	}
}}tdj|
|||f|}|	|||fS )N)rl   r   r!   r3      rm   )rp   rM   r   rj   )r   r   r6   rl   rv   rw   rx   rp   r7   rX   Zprefix_funcr   r   r>   r   r   r   __lookup  s$    
zSleepycat.__lookup)NN)T)T)F)FN)FN)N)NN)N)N)N)N)"__name__
__module____qualname__Zcontext_awareZformula_awarerB   Zgraph_awarer*   r   Z_Sleepycat__get_identifierpropertyr   r+   r,   r&   rT   rb   rk   ro   r   r   r   r   r   r=   r>   r   r<   r   r   rL   rp   r   __classcell__r   r   )r    r   r   +   s:   


k


*

J
%
	
!
c                s    fdd}|S )Nc                s<   t dj||  d  |  d d  |  d d  t dfS )zTakes a string; returns keyrm   r-   r!   r3   r4   )r
   rj   )r5   r6   )r7   r   r   to_key*  s
    
zto_key_func.<locals>.to_keyr   )r7   r   r   )r7   r   rF   )  s    rF   c                s    fdd}|S )Nc                sZ   | j td}|d |d  d d d  |d  d d d  |d  d d d  fS )zTakes a key; returns stringrm   r   r-   r!   r3   )rt   r
   )r   parts)r7   r   r   r   5  s
    zfrom_key_func.<locals>.from_keyr   )r7   r   r   )r7   r   rH   4  s    rH   c                s    fdd}|S )Nc       	         s   | j td}|dkr4 |d d d d  }n|}|dkr^ |d d d d  }n|}|dkr |d d d d  }n|}|||f fdd|j tdD fS )	zCTakes a key and subject, predicate, object; returns tuple for yieldrm   Nr-   r   r!   r3   c             3   s   | ]}|r |V  qd S )Nr   ).0r1   )from_stringr   r   	<genexpr>S  s    z:results_from_key_func.<locals>.from_key.<locals>.<genexpr>)rt   r
   )	r   rv   rw   rx   r}   r   r.   r/   r0   )r   r7   r   r   r   A  s    z'results_from_key_func.<locals>.from_keyr   )r7   r   r   r   )r   r7   r   rK   @  s    rK   c             C   s<   d
\}}}| d@ rd}| d@ r"d}| d@ r.d}d	|||f S )N?r-   r!   r.   r3   r/   r   r0   z%s,%s,%sz???r   )r7   r.   r/   r0   r   r   r   readable_indexW  s    
r   i   i   ))logging	threadingr   os.pathr   r   osr   Zrdflib.storer   r   r   Zrdflib.termr	   sixr
   Zsix.moves.urllib.requestr   r   Zbsddbr   r   r   Zbsddb3ZDB_CDB_ALLDBr%   ZDB_INIT_MPOOLZDB_INIT_CDBZ	DB_THREADr'   r#   rA   	getLoggerr   rc   __all__r   rF   rH   rK   r   r   r   r   r   <module>   sB   
    