o
    mi                     @  s   d dl mZ d dl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 d dlmZ d dlmZm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 eeZer]d dlZ G dd de!Z"G dd dZ#ddgZ$dS )    )annotationsN)BytesIO)TYPE_CHECKINGOptionalTuple)	HTTPError)	urlencode)Requesturlopen)plugins)ResultResultParser)BNode)FORMAT_MIMETYPE_MAP"RESPONSE_TABLE_FORMAT_MIMETYPE_MAPc                   @  s   e Zd ZdS )SPARQLConnectorExceptionN)__name__
__module____qualname__ r   r   _/home/kim/smarthome/.venv/lib/python3.10/site-packages/rdflib/plugins/stores/sparqlconnector.pyr      s    r   c                   @  sn   e Zd ZdZ					dd ddZed!ddZejd"ddZ		d#d$ddZ		d#d%ddZ	d!ddZ
dS )&SPARQLConnectorzR
    this class deals with nitty gritty details of talking to a SPARQL server
    NxmlGETquery_endpointOptional[str]update_endpointreturnFormatmethod&te.Literal['GET', 'POST', 'POST_FORM']authOptional[Tuple[str, str]]c                 K  s   |  || _ || _|| _|| _|| _|durKt|turtdt|dkr)tdt	
td| d}| jdi  | jd dd	|d
 i dS dS )z
        auth, if present, must be a tuple of (username, password) used for Basic Authentication

        Any additional keyword arguments will be passed to to the request, and can be used to setup timeouts etc.
        Nzauth must be a tuple   z%auth must be a tuple (user, password)z%s:%sasciiheadersAuthorizationzBasic %szutf-8)r   r   r   kwargsr   typetupler   lenbase64	b64encodebytes
setdefaultupdatedecode)selfr   r   r   r   r    r&   Zbase64stringr   r   r   __init__    s"   
zSPARQLConnector.__init__returnstrc                 C  s   | j S )N)_method)r0   r   r   r   r   ?   s   zSPARQLConnector.methodNonec                 C  s   |dvrt d|| _d S )N)r   POST	POST_FORMz,Method must be "GET", "POST", or "POST_FORM")r   r4   )r0   r   r   r   r   r   C   s
   
querydefault_graphnamed_graphr   c           
   
   C  s"  | j stdi }|d urt|tur||d< d|  i}t| j}|di  |di  |d 	| | j
dkrn||d< |d 	| dt|d  }ztt| j | |d d	}W n tym }	 ztd
d }	~	ww | j
dkr|d 	ddi |d 	| dt|d  }ztt| j | | |d d}W n` ty }	 z|	jt|	d fW  Y d }	~	S d }	~	ww | j
dkr||d< |d 	| ztt| j t|d  |d d}W n! ty }	 z|	jt|	d fW  Y d }	~	S d }	~	ww td| j
 tjt| |jd dd dS )NQuery endpoint not set!zdefault-graph-uriAcceptparamsr$   r   r8   ?)r$   zGYou did something wrong formulating either the URI or your SPARQL queryr6   Content-Typezapplication/sparql-querydatar$   r7   zUnknown method %s;r   )content_type)r   r   r'   r   response_mime_typescopydeepcopyr&   r-   r.   r   r   r
   r	   	Exception
ValueErrorencoder   coder3   r   parser   readr$   split)
r0   r8   r9   r:   r=   r$   argsqsareser   r   r   r8   L   sv   


zSPARQLConnector.queryc           	      C  s   | j stdi }|d ur||d< |d ur||d< |  dd}t| j}|di  |d | |di  |d | dt|d  }t	t
| j | | |d d	}d S )
Nr;   zusing-graph-urizusing-named-graph-uriz(application/sparql-update; charset=UTF-8)r<   r?   r=   r$   r>   r@   )r   r   rD   rE   rF   r&   r-   r.   r   r
   r	   rI   )	r0   r8   r9   r:   r=   r$   rN   rO   rP   r   r   r   r.      s*   zSPARQLConnector.updatec                 C  sr   dd t t t t  D }t }t| jtdD ]}d|jvr-|	|
|jg  q||j qd|S )zConstruct a HTTP-Header Accept field to reflect the supported mime types.

        If the return_format parameter is set, the mime types are restricted to these accordingly.
        c                 S  s&   i | ]}|t |g t|g  qS r   )r   getr   ).0kr   r   r   
<dictcomp>   s    
z7SPARQLConnector.response_mime_types.<locals>.<dictcomp>)namekind/z, )listr   keysr   setr   r   r   rV   r.   rR   addjoin)r0   Zsparql_format_mimetype_mapZsupported_formatspluginr   r   r   rD      s   



z#SPARQLConnector.response_mime_types)NNr   r   N)
r   r   r   r   r   r   r   r   r    r!   )r2   r3   )r   r3   r2   r5   )NN)r8   r3   r9   r   r:   r   r2   r   )r8   r3   r9   r   r:   r   r2   r5   )r   r   r   __doc__r1   propertyr   setterr8   r.   rD   r   r   r   r   r      s&    J$r   )%
__future__r   r*   rE   loggingior   typingr   r   r   urllib.errorr   urllib.parser   urllib.requestr	   r
   Zrdflib.pluginr   Zrdflib.queryr   r   Zrdflib.termr   Zrdflib.utilr   r   	getLoggerr   logZtyping_extensionsterG   r   r   __all__r   r   r   r   <module>   s(    
 4