o
    iu                     @   s"  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 d dlmZ d dlmZmZmZ d dlmZmZmZ e	rTd d	lmZmZmZmZ d
e de!fddZ"z
d dl#m$Z$ dZ%W n e&yr   dZ%Y nw e%re$j'Z(e$j)e$j*B e$j+B Z,dZ-e$j+Z.e /e0Z1g dZ2eee!e!e!f e!ge!f Z3ee!gee!e!e!e!f f Z4eee e e f ee  gee ddf f Z5ee!ee ee ee e!geeeeef eeddf f f Z6G dd deZ7de8de3fddZ9de8de4fddZ:de8dee!gef de6fddZ;de8de fddZ<dS )    N)mkdir)abspathexists)Thread)TYPE_CHECKINGAnyCallableDict	GeneratorListOptionalTuple)pathname2url)NO_STOREVALID_STOREStore)
IdentifierNodeURIRef)Graph_ContextType_TriplePatternType_TripleTypeureturnc                 C   s
   |  dS Nutf-8)encode)r    r   [/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/rdflib/plugins/stores/berkeleydb.pybb   s   
r    )dbTFi   )
BerkeleyDB
_ToKeyFunc_FromKeyFunc_GetPrefixFunc_ResultsFromKeyFuncc                       s  e Zd ZU dZdZdZdZdZdZde	d< 		dPde
e de
d	 f fd
dZde
d	 fddZeeZ	dQdededdfddZdefddZdQdedede
e fddZdRddZdRddZdSdeddfddZ		dTdd d!d"d#ed$e
e ddf
d%d&Z		dTd'eeeef d(ed#ed$e
e ddf
d)d*Z	dUd'd+d!e
d" d$e
e ddfd,d-Z		dPd'd+d!e
d" d$e
e deed ee
d" ddf f ddf fd.d/ZdUd!e
d" defd0d1Z dQd2ed3d4d5eddfd6d7Z!d2ede
d4 fd8d9Z"d3d4de
e fd:d;Z#deeed4f ddf fd<d=Z$	dUde
d  ded> fd?d@Z%dVdCdDZ&dWdEdFZ'dGede(fdHdIZ)dUdJe(d$e
e defdKdLZ*	dUd'd+d!e
d" d$e
e dedMee+e,f fdNdOZ-  Z.S )Xr"   aQ      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``
    TFNzdb.DBEnvdb_envconfiguration
identifierr   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__node_picklerloads_loadsdumps_dumps)selfr(   r)   	__class__r   r   r/   Y   s   

zBerkeleyDB.__init__r   c                 C      | j S N)r-   r5   r   r   r   __get_identifierg      zBerkeleyDB.__get_identifierhomeDircreatec                 C   s^   t |s|du rt| | | ntS t }|dt |t	d |
|ttjB  |S )NTr      )r   r   r>   r   r!   DBEnvset_cachesize	CACHESIZE	set_flagsENVSETFLAGSopenENVFLAGS	DB_CREATE)r5   r=   r>   r'   r   r   r   _init_db_environmentl   s   zBerkeleyDB._init_db_environmentc                 C   r8   r9   )r,   r:   r   r   r   is_open}   r<   zBerkeleyDB.is_openpathc                 C   s  t stS |}| jd u rttt|| _| ||}|tkr tS || _d| _d }t	j
}t}| jdu r7|t	jO }|r>|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|
< qSi }tdd
D ]e}
g }tddD ]/}d}d}t||d D ]}|
d|d > @ r|d> }|d7 }q d| }|||f||f q|  |d \}}}dtdtdtf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 )NTi  r      slatin-1poc   r?      startendr   c              	      s8   dt tttf dtt dttd d f f fdd}|S )Ntriplecontextr   c                 3   sL    |d u r	dV  n|V  }| k r!| |d  V  |d7 }| k sdV  d S )N rK   r?   r   )rV   rW   irU   rT   r   r   
get_prefix   s   
z<BerkeleyDB.open.<locals>.get_prefix_func.<locals>.get_prefix)r   strr   r
   )rT   rU   r[   r   rZ   r   get_prefix_func   s   z(BerkeleyDB.open.<locals>.get_prefix_funccontexts	namespaceprefixk2ii2kF)target).r*   r   r-   r   r   r   rH   r'   r,   r!   DB_BTREEDBOPENFLAGStransaction_awareDB_AUTO_COMMITrG   _BerkeleyDB__indicies_BerkeleyDB__indicies_inforangeto_key_funcr   decodeDBrC   rE   from_key_funcappendsortintr%   results_from_key_func_from_string_BerkeleyDB__lookup_dict_BerkeleyDB__contexts_BerkeleyDB__namespace_BerkeleyDB__prefix_BerkeleyDB__k2iDB_HASH_BerkeleyDB__i2kDB_RECNO_BerkeleyDB__needs_syncr   _BerkeleyDB__sync_run	setDaemonrT   _BerkeleyDB__sync_threadr   )r5   rJ   r>   r=   r'   dbnamedbtypedbopenflagsdbmode
dbsetflagsrY   
index_nameindexlookupresultsrT   scorelenj	tie_breakr]   tr   r   r   rE      s   










zBerkeleyDB.openc              
   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?syncr?   )	r   r   r,   r|   loggerdebugr   	Exception	exception)r5   r   r   min_secondsmax_secondst0t1er   r   r   
__sync_run   s2   

zBerkeleyDB.__sync_runc                 C   sT   | j r(| jD ]}|  q| j  | j  | j  | j  | j  d S d S r9   )r,   rh   r   ru   rv   rw   rz   rx   )r5   rY   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)r,   r   joinrh   closeru   rv   rw   rz   rx   r'   )r5   r   rY   r   r   r   r     s   







zBerkeleyDB.closerV   r   rW   r   quotedtxnc                 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    rX   rM   ^T)r,   r   add
_to_stringrh   getr    ru   putr   setsplitr   r|   )r5   rV   rW   r   r   subject	predicateobjectr   rL   rN   rO   rP   cspocposcospvaluecontexts_valuer^   r   r   r   r   +  s>   

      
zBerkeleyDB.addsporP   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   rM   rX   r   )rh   r   r   r   r   r   discardri   deleter   r!   DBNotFoundError)r5   r   rP   r   r   rL   rN   rO   r   r   r   r   r^   rY   _to_key	_from_keyr   r   r   __removeY  s@   


$	zBerkeleyDB.__remover   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nextrX   rM   r   )r,   r   remover   rh   r   r    _BerkeleyDB__remover|   _BerkeleyDB__lookupcursor	set_ranger!   r   r   getattr
startswithr   r   r   r   ri   r   ru   )r5   r   rW   r   r   r   r   r   rL   rN   rO   rP   r   r   r   r   r   r`   from_keyresults_from_keyr   current
needs_synckeyr   r^   rY   r   _r   r   r   r   }  s   
$&





#

zBerkeleyDB.removec                 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   )
r,   r   r   r   r!   r   r   r   r   r   )r5   r   rW   r   r   r   r   r   r`   r   r   r   r   r   r   r   r   r   r   triples  s>   

zBerkeleyDB.triplesc           	      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   rM   z%s^r   r?   r   )
r,   r   r    r   rh   r   r   r   r   r   )	r5   rW   r`   r   r   r   countr   r   r   r   r   __len__	  s(   


zBerkeleyDB.__len__r`   r_   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   rw   r   rv   r   )r5   r`   r_   r   bound_prefixbound_namespacer   r   r   bind#  s   


zBerkeleyDB.bindc                 C   s2   | d}| j|d }|d urt|dS d S r   )r   rv   r   r   rl   )r5   r`   nsr   r   r   r_   7  s
   
zBerkeleyDB.namespacec                 C   s.   | d}| j|d }|d ur|dS d S r   )r   rw   r   rl   )r5   r_   r`   r   r   r   r`   A  s
   

zBerkeleyDB.prefixc                 c   sv    | j  }g }| }|r'|\}}||d|df t|d }|s|  |D ]\}}|t|fV  q-d S )Nr   r   )rv   r   firstro   rl   r   r   r   )r5   r   r   r   r`   r_   r   r   r   
namespacesK  s   
zBerkeleyDB.namespaces)r   NNc                 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   rX   r   rM   r   )rs   r   rh   r   r    r   r   ru   r   r   r   r   r   r!   r   )r5   rV   rs   r   rL   rN   rO   r^   rP   r   r   r   r   r   rW   r   r   r   r^   X  sB   
 

zBerkeleyDB.contextsgraphr   c                 C   s   | j t| |d d S )Nr   )ru   r   r    r   r5   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_graphrY   c                 C   s   | j t|}| |S r9   )rz   r   rq   r2   )r5   rY   kr   r   r   rs     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)	r4   rx   r   rf   rz   ro   r   r   rl   )r5   r   r   r   rY   r   r   r   r     s   
zBerkeleyDB._to_stringzdb.DBc                 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   r?   rR      r   )r   rt   r    r   )r5   r   rW   r   r   r   r   r   rY   r   prefix_funcr   r   r`   r   r   r   __lookup  s"   
zBerkeleyDB.__lookup)NN)T)r   N)F)FNr9   )r   r   r   N)r   r   )/__name__
__module____qualname____doc__context_awareformula_awarerf   graph_awarer'   __annotations__r   r\   r/   _BerkeleyDB__get_identifierpropertyr)   boolrH   rI   rq   rE   r}   r   r   r   r   r   bytesr   r   r
   r   r   r   r_   r`   r   r^   r   r   r   rs   r   r$   r&   r   __classcell__r   r   r6   r   r"   =   s   
 

}


2
(
^
1
 


,
r"   rY   c                    s(   dt tttf dtdtf fdd}|S )NrV   rW   r   c              	      s@   d d||  d  |  d d  |  d d  d dfS )zTakes a string; returns keyr   rM   rK   r?   rR   rX   )r   r   )rV   rW   rY   r   r   to_key  s   

zto_key_func.<locals>.to_key)r   r   )rY   r   r   r   r   rk     s   $rk   c                    s&   dt dtt t t t f f fdd}|S )Nr   r   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   rM   r   rK   r?   rR   r   r   )r   partsr   r   r   r     s   zfrom_key_func.<locals>.from_key)r   r   )rY   r   r   r   r   rn     s   "
rn   from_stringc                    sT   dt dtt dtt dtt dt dtttttf ttd d f f f fdd}|S )	Nr   r   r   r   r   r   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   rM   NrK   r   r?   rR   c                 3   s    | ]	}|r |V  qd S r9   r   ).0rP   )r   r   r   	<genexpr>  s    z:results_from_key_func.<locals>.from_key.<locals>.<genexpr>r   )	r   r   r   r   r   r   rL   rN   rO   r   rY   r   r   r     s   z'results_from_key_func.<locals>.from_key)r   r   r   r   r
   )rY   r   r   r   r   r   rr     s   rr   c                 C   s<   d\}}}| d@ rd}| d@ rd}| d@ rd}d|||f S )	Nz???r?   rL   rR   rN   r   rO   z%s,%s,%sr   )rY   rL   rN   rO   r   r   r   readable_index  s   
r   )=loggingosr   os.pathr   r   	threadingr   typingr   r   r   r	   r
   r   r   r   urllib.requestr   rdflib.storer   r   r   rdflib.termr   r   r   rdflib.graphr   r   r   r   r\   r   r    
berkeleydbr!   r*   r+   DB_CDB_ALLDBrD   DB_INIT_MPOOLDB_INIT_CDB	DB_THREADrF   rB   re   	getLoggerr   r   __all__r#   r$   r%   r&   r"   rq   rk   rn   rr   r   r   r   r   r   <module>   sd    (
	"     
#