o
    miu                     @  s  d dl mZ 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mZmZmZmZmZmZ d dlmZ d dlmZmZmZ d d	lmZmZmZ er\d d
lmZm Z m!Z!m"Z" d'ddZ#z
d dl$m%Z% dZ&W n e'yv   dZ&Y nw e&re%j(Z)e%j*e%j+B e%j,B Z-dZ.e%j,Z/e0e1Z2g dZ3eee4e4e4f e4ge4f Z5ee4gee4e4e4e4f f Z6eee7e7e7f ee7 gee7ddf f Z8ee4ee ee ee e4geeeeef eeddf f f Z9G dd deZ:d(ddZ;d)ddZ<d*d#d$Z=d+d%d&Z>dS ),    )annotationsN)mkdir)abspathexists)Thread)	TYPE_CHECKINGAnyCallableDict	GeneratorListOptionalTupleUnion)pathname2url)NO_STOREVALID_STOREStore)
IdentifierNodeURIRef)Graph_ContextType_TriplePatternType_TripleTypeustrreturnbytesc                 C  s
   |  dS Nutf-8)encode)r    r"   Z/home/kim/smarthome/.venv/lib/python3.10/site-packages/rdflib/plugins/stores/berkeleydb.pybb   s   
r$   )dbTFi   )
BerkeleyDB
_ToKeyFunc_FromKeyFunc_GetPrefixFunc_ResultsFromKeyFuncc                      sX  e Zd ZU dZdZdZdZdZdZde	d< 		d_d` fddZ
daddZeeZ	dbdcddZddddZ	dbdeddZdfddZdfdd Zdgdhd"d#Z		didjd+d,Z		didkd1d2Z	dldmd5d6Z		d_dnd8d9Zdldod;d<ZdbdpdAdBZdqdDdEZdrdFdGZdsdIdJZ	dldtdMdNZdudQdRZdvdSdTZdwdWdXZ dldxdZd[Z!	dldyd]d^Z"  Z#S )zr&   aA  A store that allows for on-disk persistent using BerkeleyDB, a fast key/value DB.

    This store implementation used to be known, previous to rdflib 6.0.0
    as 'Sleepycat' due to that being the then name of the Python wrapper
    for BerkeleyDB.

    This store allows for quads as well as triples. See examples of use
    in both the `examples.berkeleydb_example` and `test/test_store/test_store_berkeleydb.py`
    files.

    **NOTE on installation**:

    To use this store, you must have BerkeleyDB installed on your system
    separately to Python (`brew install berkeley-db` on a Mac) and also have
    the BerkeleyDB Python wrapper installed (`pip install berkeleydb`).
    You may need to install BerkeleyDB Python wrapper like this:
    `YES_I_HAVE_THE_RIGHT_TO_USE_THIS_BERKELEY_DB_VERSION=1 pip install berkeleydb`
    TFNdb.DBEnvdb_envconfigurationOptional[str]
identifierOptional[Identifier]c                   sD   t stdd| _|| _tt| | | jj| _	| jj
| _|  d S )Nz/Unable to import berkeleydb, store is unusable.F)	has_bsddbImportError_BerkeleyDB__open_BerkeleyDB__identifiersuperr&   __init__Znode_picklerloads_loadsdumps_dumps)selfr-   r/   	__class__r"   r#   r6   c   s   

zBerkeleyDB.__init__r   c                 C     | j S N)r4   r;   r"   r"   r#   Z__get_identifierq      zBerkeleyDB.__get_identifierhomeDirr   createboolc                 C  s^   t |s|du rt| | | ntS t }|dt |t	d |
|ttjB  |S )NTr      )r   r   rC   r   r%   ZDBEnvZset_cachesize	CACHESIZE	set_flagsENVSETFLAGSopenENVFLAGS	DB_CREATE)r;   rB   rC   r,   r"   r"   r#   _init_db_environmentv   s   zBerkeleyDB._init_db_environmentc                 C  r>   r?   )r3   r@   r"   r"   r#   is_open   rA   zBerkeleyDB.is_openUnion[str, tuple[str, str]]Optional[int]c                 C  s  t stS t|tu r|}ntd| jd u rttt|| _| 	||}|tkr+tS || _
d| _d }tj}t}| jdu rB|tjO }|rI|tjO }d}d}	d gd | _d gd | _tddD ]>}
t|
ddddd	dfd
d }t|}||	 |||||| || j|
< |t|
t|
f| j|
< q^i }tddD ]_}
g }tddD ]/}d}d}t||d D ]}|
d|d > @ r|d> }|d7 }q d| }|||f||f q|  |d \}}}ddd}| j| |||| t|t|| jf||
< q|| _ t|| _!| j!|	 | j!d|||| t|| _"| j"|	 | j"d|||| t|| _#| j#|	 | j#d|||| t|| _$| j$|	 | j$d|tj%|| t|| _&| j&|	 | j&d|tj'|| d| _(t)| j*d}|+d |,  || _-t.S )NzInvalid configuration providedTi  r      slatin-1poc   rE      startintendr   r)   c                   s   d	 fdd}|S )
NtripleTuple[str, str, str]contextr.   r   Generator[str, None, None]c                 3  sL    |d u r	dV  n|V  }| k r!| |d  V  |d7 }| k sdV  d S )N rP   rE   r"   )r\   r^   ir[   rY   r"   r#   
get_prefix   s   
z<BerkeleyDB.open.<locals>.get_prefix_func.<locals>.get_prefix)r\   r]   r^   r.   r   r_   r"   )rY   r[   rc   r"   rb   r#   get_prefix_func   s   z(BerkeleyDB.open.<locals>.get_prefix_funccontexts	namespaceprefixZk2iZi2kF)target)rY   rZ   r[   rZ   r   r)   )/r1   r   typer   	Exceptionr4   r   r   r   rL   r,   r3   r%   ZDB_BTREEDBOPENFLAGStransaction_awareZDB_AUTO_COMMITrK   _BerkeleyDB__indicies_BerkeleyDB__indicies_inforangeto_key_funcr!   decodeZDBrG   rI   from_key_funcappendsortresults_from_key_func_from_string_BerkeleyDB__lookup_dict_BerkeleyDB__contexts_BerkeleyDB__namespace_BerkeleyDB__prefix_BerkeleyDB__k2iZDB_HASH_BerkeleyDB__i2kZDB_RECNO_BerkeleyDB__needs_syncr   _BerkeleyDB__sync_run	setDaemonrY   _BerkeleyDB__sync_threadr   )r;   r-   rC   rB   r,   ZdbnameZdbtypeZdbopenflagsZdbmodeZ
dbsetflagsra   Z
index_nameindexlookupresultsrY   ZscorelenjZ	tie_breakrd   tr"   r"   r#   rI      s   











zBerkeleyDB.openNonec              
   C  s   ddl m}m } zNd\}}| jrT| jrJ|  }}d| _| jrI|d | jr+| }d| _| | |ks9| | |krFd| _td |   n| jsn|d | jsW d S W d S  tyn } zt| W Y d }~d S d }~ww )Nr   )sleeptime)
   i,  Fg?syncrE   )	r   r   r3   r}   loggerdebugr   rj   	exception)r;   r   r   Zmin_secondsZmax_secondst0t1er"   r"   r#   Z
__sync_run  s2   

zBerkeleyDB.__sync_runc                 C  sT   | j r(| jD ]}|  q| j  | j  | j  | j  | j  d S d S r?   )r3   rm   r   rx   ry   rz   r|   r{   )r;   ra   r"   r"   r#   r   %  s   





zBerkeleyDB.synccommit_pending_transactionc                 C  sd   d| _ | j  | jD ]}|  q| j  | j  | j  | j  | j	  | j
  d S )NF)r3   r   joinrm   closerx   ry   rz   r|   r{   r,   )r;   r   ra   r"   r"   r#   r   /  s   







zBerkeleyDB.closer\   r   r^   r   quotedtxnOptional[Any]c                 C  s  |\}}}| j sJ d|| ksJ dt| |||f|| | j}|||d}	|||d}
|||d}|||d}| j\}}}|jtd||	|
|f |d}|du r| jjt|d|d |jtdd|	|
|f |dpqd	d}t
|d		d}|t| d		d|}|dusJ |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 dS )z6        Add a triple to the store of triples.
        The Store must be open.z$Can not add triple directly to storer   %s^%s^%s^%s^N    r`   rR   ^T)r3   r   add
_to_stringrm   getr$   rx   putr!   setsplitr   r}   )r;   r\   r^   r   r   subject	predicateobjectr   rQ   rS   rT   rU   cspocposcospvaluecontexts_valuere   r"   r"   r#   r   ;  s>   

      
zBerkeleyDB.addspoTuple[bytes, bytes, bytes]rU   r   c              
   C  s<  |\}}}| j \}}	}
|jdddd|||ddg|dp'dd}t|dd}|| dd|}| jD ]\}}}|j||||f||d qB|s|ru| jD ]\}}}|j	||||fdd||d q\d S | jD ]#\}}}z|j||||fdd|d W qx t
jy   Y qxw d S d S )Nr   rR   r`   r   )rm   r   r!   r   r   r   discardrn   deleter   r%   DBNotFoundError)r;   r   rU   r   r   rQ   rS   rT   r   r   r   r   re   ra   _to_keyZ	_from_keyr"   r"   r#   Z__removei  s@   


$	zBerkeleyDB.__remover   Optional[_ContextType]c                 C  s  |\}}}| j sJ dt| |||f| | j}|d ur#|| kr#d }|d ur{|d ur{|d ur{|d ur{|||d}|||d}	|||d}
|||d}| jd jtd|||	|
f |d}|d ury| jt|t|	t|
ft||d d| _d S d S | j\}}}| j	|||f||d\}}}}|j
|d}z	||}d}W n tjy   d }d}Y nw |  |r;|\}}|j
|d}z|| t|d }W n tjy   d }Y nw |  ||r8||\}}}	}
|d u r,|j||dpdd	}t|d
d	}|dd	 |D ]}| jD ]\}}}|j|||	|
f||d qqn| j||	|
f||d nn|s|d urk|d u rk|d u rk|d u rkz| jjt|||d|d W n tjyj   Y nw || _d S )Nr   r   r   r   TFnextr`   rR   r   )r3   r   remover   rm   r   r$   _BerkeleyDB__remover}   _BerkeleyDB__lookupcursor	set_ranger%   r   r   getattr
startswithr!   r   r   r   rn   r   rx   )r;   r   r^   r   r   r   r   r   rQ   rS   rT   rU   r   r   r   r   r   rg   from_keyresults_from_keyr   currentZ
needs_synckeyr   re   ra   r   _r"   r"   r#   r     s   
$&





#

zBerkeleyDB.removeXGenerator[Tuple[_TripleType, Generator[Optional[_ContextType], None, None]], None, None]c                 c  s   | j sJ d|\}}}|dur|| krd}| j|||f||d\}}}	}
|j|d}z||}W n tjy?   d}Y nw |  |r|\}}|j|d}z|| t|d }W n tjyi   d}Y nw |  |r||r|j	||d}|
|||||V  ndS |sFdS dS )z)A generator over all the triples matchingr   Nr   r   )
r3   r   r   r   r%   r   r   r   r   r   )r;   r   r^   r   r   r   r   r   rg   r   r   r   r   r   r   r   r"   r"   r#   triples  s>   

zBerkeleyDB.triplesrZ   c           	      C  s   | j sJ d|d ur|| krd }|d u rdd}n	td| | }| jd }| }||}d}|rM|\}}||rJ|d7 }t|d }nn|s6|	  |S )Nr   r   rR   z%s^r   rE   r   )
r3   r!   r$   r   rm   r   r   r   r   r   )	r;   r^   rg   r   r   r   countr   r   r"   r"   r#   __len__  s(   


zBerkeleyDB.__len__rg   rf   r   overridec                 C  s   | d}| d}| j|}| j|}|r4|r | j| |r(| j| || j|< || j|< d S |p7|| j|p<|< |p@|| j|pE|< d S r   )r!   rz   r   ry   r   )r;   rg   rf   r   Zbound_prefixZbound_namespacer"   r"   r#   bind3  s   


zBerkeleyDB.bindOptional[URIRef]c                 C  s2   | d}| j|d }|d urt|dS d S r   )r!   ry   r   r   rq   )r;   rg   nsr"   r"   r#   rf   G  s
   
zBerkeleyDB.namespacec                 C  s.   | d}| j|d }|d ur|dS d S r   )r!   rz   r   rq   )r;   rf   rg   r"   r"   r#   rg   Q  s
   

zBerkeleyDB.prefix)Generator[Tuple[str, URIRef], None, None]c                 c  sv    | j  }g }| }|r'|\}}||d|df t|d }|s|  |D ]\}}|t|fV  q-d S )Nr    r   )ry   r   firstrs   rq   r   r   r   )r;   r   r   r   rg   rf   r"   r"   r#   
namespaces[  s   
zBerkeleyDB.namespacesOptional[_TripleType]#Generator[_ContextType, None, None]c                 c  s   | j }| j}|rB|\}}}||}||}||}| jd tdd|||f }|r>|ddD ]}|r=||V  q4d S d S | j}	|	 }
|
	 }|

  |r|\}}||}|V  |	 }
z|
| t|
d }W n tjy{   d }Y nw |

  |sSd S d S )Nr   r   r`   r   rR   r   )rv   r   rm   r   r$   r   r!   rx   r   r   r   r   r   r%   r   )r;   r\   rv   r   rQ   rS   rT   re   rU   r   r   r   r   r   r^   r"   r"   r#   re   h  sB   
 

zBerkeleyDB.contextsgraphr   c                 C  s   | j t| |d d S )Nr   )rx   r   r$   r   r;   r   r"   r"   r#   	add_graph  s   zBerkeleyDB.add_graphc                 C  s   |  d| d S )N)NNN)r   r   r"   r"   r#   remove_graph  s   zBerkeleyDB.remove_graphra   r   c                 C  s   | j t|}| |S r?   )r|   r   rZ   r8   )r;   ra   kr"   r"   r#   rv     s   
zBerkeleyDB._from_stringtermc                 C  sr   |  |}| jj||d}|d u r3| jrd| j|| }nd| j| }| jj|| |d |S | }|S )Nr   z%s)	r:   r{   r   rl   r|   rs   r   r!   rq   )r;   r   r   r   ra   r"   r"   r#   r     s   
zBerkeleyDB._to_string6Tuple[db.DB, bytes, _FromKeyFunc, _ResultsFromKeyFunc]c                 C  s   |\}}}| j }|d ur|||d}d}|d ur"|d7 }|||d}|d ur0|d7 }|||d}|d ur>|d7 }|||d}| j| \}	}
}}td|
|||f|}|	|||fS )Nr   r   rE   rW      r   )r   rw   r$   r   )r;   r   r^   r   r   r   r   r   ra   r   Zprefix_funcr   r   rg   r"   r"   r#   Z__lookup  s"   
zBerkeleyDB.__lookup)NN)r-   r.   r/   r0   )r   r0   )T)rB   r   rC   rD   r   r+   )r   rD   )r-   rN   rC   rD   r   rO   )r   r   )F)r   rD   r   r   )FN)
r\   r   r^   r   r   rD   r   r   r   r   )
r   r   rU   r   r   rD   r   r   r   r   r?   )r   r   r^   r   r   r   r   r   )r   r   r^   r   r   r   r   r   )r^   r   r   rZ   )rg   r   rf   r   r   rD   r   r   )rg   r   r   r   )rf   r   r   r.   )r   r   )r\   r   r   r   )r   r   r   r   )r   r   )ra   r   r   r   )r   r   r   r   r   r   )r   r   r^   r   r   r   r   r   )$__name__
__module____qualname____doc__Zcontext_awareZformula_awarerl   Zgraph_awarer,   __annotations__r6   Z_BerkeleyDB__get_identifierpropertyr/   rL   rM   rI   r~   r   r   r   r   r   r   r   r   rf   rg   r   re   r   r   rv   r   r   __classcell__r"   r"   r<   r#   r&   I   sZ   
 

 


2(^1





,

r&   ra   rZ   r'   c                   s   d fdd}|S )	Nr\   r   r^   r   r   c              	     s@   d d||  d  |  d d  |  d d  d dfS )zTakes a string; returns keyr   rR   rP   rE   rW   r`   )r!   r   )r\   r^   ra   r"   r#   to_key  s   

zto_key_func.<locals>.to_key)r\   r   r^   r   r   r   r"   )ra   r   r"   r   r#   rp     s   rp   r(   c                   s   d fdd}|S )Nr   r   r   !Tuple[bytes, bytes, bytes, bytes]c                   s\   |  dd}|d |d  d d d  |d  d d d  |d  d d d  fS )zTakes a key; returns stringr   rR   r   rP   rE   rW   r   r!   )r   partsr   r"   r#   r     s   zfrom_key_func.<locals>.from_key)r   r   r   r   r"   )ra   r   r"   r   r#   rr     s   
rr   from_stringCallable[[bytes], Node]r*   c                   s   d fd
d}|S )Nr   r   r   Optional[Node]r   r   r   r   ;Tuple[Tuple[Node, Node, Node], Generator[Node, None, None]]c           	        s   |  dd}|du r |d d d d  }n|}|du r0 |d d d d  }n|}|du rE |d d d d  }n|}|||f fdd	| ddD fS )
zCTakes a key and subject, predicate, object; returns tuple for yieldr   rR   NrP   r   rE   rW   c                 3  s    | ]	}|r |V  qd S r?   r"   ).0rU   )r   r"   r#   	<genexpr>
  s    z:results_from_key_func.<locals>.from_key.<locals>.<genexpr>r   )	r   r   r   r   r   r   rQ   rS   rT   r   ra   r"   r#   r     s   z'results_from_key_func.<locals>.from_key)r   r   r   r   r   r   r   r   r   r   r   r   r"   )ra   r   r   r"   r   r#   ru     s   ru   c                 C  s<   d\}}}| d@ rd}| d@ rd}| d@ rd}d|||f S )	Nz???rE   rQ   rW   rS   r   rT   z%s,%s,%sr"   )ra   rQ   rS   rT   r"   r"   r#   readable_index  s   
r   )r   r   r   r   )ra   rZ   r   r'   )ra   rZ   r   r(   )ra   rZ   r   r   r   r*   )ra   rZ   r   r   )?
__future__r   loggingosr   Zos.pathr   r   	threadingr   typingr   r   r	   r
   r   r   r   r   r   urllib.requestr   Zrdflib.storer   r   r   Zrdflib.termr   r   r   Zrdflib.graphr   r   r   r   r$   Z
berkeleydbr%   r1   r2   ZDB_CDB_ALLDBrH   ZDB_INIT_MPOOLZDB_INIT_CDBZ	DB_THREADrJ   rF   rk   	getLoggerr   r   __all__r   r'   r(   r   r)   r*   r&   rp   rr   ru   r   r"   r"   r"   r#   <module>   sZ    ,

	"     


#