U
    d9                     @   s   d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ zdd	lmZ dd
lmZ W n ek
r   d ZZY nX dZG dd deZdS )zArangoDb result store backend.    N)	timedelta)cached_property)
_parse_url)ImproperlyConfigured   )KeyValueStoreBackend)
connection)AQLQueryError)ArangoDbBackendc                       s   e Zd ZdZdZdZdZdZdZdZ	dZ
dZeZd fdd		Zed
d Zedd Zedd Zdd Zdd Zdd Zdd Zdd Z  ZS )r
   a  ArangoDb backend.

    Sample url
    "arangodb://username:password@host:port/database/collection"
    *arangodb_backend_settings* is where the settings are present
    (in the app.conf)
    Settings should contain the host, port, username, password, database name,
    collection name else the default will be chosen.
    Default database name and collection name is celery.

    Raises
    ------
    celery.exceptions.ImproperlyConfigured:
        if module :pypi:`pyArango` is not available.

    z	127.0.0.1Z8529ZceleryNhttpFc                    sr  t  j|| tdkrtd|| _|dkrFd } } } } }}	n6t|\}
}}}}	}}|dkrnd }}n|d\}}| jj	dd}|dk	rt
|tstdni }|p|	d| j| _t|p|	d| j| _|	d| j| _|	d	| j| _|p
|	d
| j| _|p |	d| j| _|p6|	d| j| _|	pL|	d| j| _dj| j| j| jd| _d| _dS )z8Parse the url or load the settings from settings object.NzEYou need to install the pyArango library to use the ArangoDb backend./Zarangodb_backend_settingsz5ArangoDb backend settings should be grouped in a dicthostporthttp_protocolverifydatabase
collectionusernamepasswordz{http_protocol}://{host}:{port})r   r   r   )super__init__py_arango_connectionr   urlr   splitappconfget
isinstancedictr   intr   r   r   r   r   r   r   formatarangodb_url_connection)selfr   argskwargsr   r   r   r   r   r   Z_schemaZdatabase_collectionZ_queryconfig	__class__ </tmp/pip-unpacked-wheel-9cz4377o/celery/backends/arangodb.pyr   8   sT         

  zArangoDbBackend.__init__c                 C   s,   | j dkr&tj| j| j| j| jd| _ | j S )zConnect to the arangodb server.N)Z	arangoURLr   r   r   )r"   r   
Connectionr!   r   r   r   r#   r)   r)   r*   r   g   s    
  zArangoDbBackend.connectionc                 C   s   | j | j S )z&Database Object to the given database.)r   r   r,   r)   r)   r*   dbq   s    zArangoDbBackend.dbc                 C   s   t | jdS )N)seconds)r   expiresr,   r)   r)   r*   expires_deltav   s    zArangoDbBackend.expires_deltac              
   C   s   zVt dj| j|d | jdj| j|d}|jd d }|d krLW d S t|W S  t	k
r } zt 
| W Y d S d }~X Y n2 tk
r } zt 
| W Y d S d }~X Y nX d S )Nz*RETURN DOCUMENT("{collection}/{key}").task)r   keyresultr   )loggingdebugr    r   r-   AQLQueryresponsejsondumpsr	   error	Exception)r#   r1   queryr2   aql_errerrr)   r)   r*   r   z   s.      

zArangoDbBackend.getc              
   C   s   z6t dj| j||d | jdj| j||d W nV tk
rb } zt | W 5 d}~X Y n, tk
r } zt | W 5 d}~X Y nX dS )z<Insert a doc with value into task attribute and _key as key.z:INSERT {{ task: {task}, _key: "{key}" }} INTO {collection})r   r1   ZtaskN	r3   r4   r    r   r-   r5   r	   r9   r:   )r#   r1   valuer<   r=   r)   r)   r*   set   s&        zArangoDbBackend.setc              
   C   s   zZt |}tdj| j|d | jdj| j|d}g }||j	d  |
  q>W n tk
r   dd |D }| Y S  tk
r } z t| d gt|  W Y S d }~X Y n@ tk
 r } z t| d gt|  W Y S d }~X Y nX d S )Nzy
                FOR key in {keys}
                    RETURN DOCUMENT(CONCAT("{collection}/", key).task
                )r   keysr2   c                 S   s"   g | ]}|d kr|nt |qS )N)r7   r8   ).0r2   r)   r)   r*   
<listcomp>   s   z(ArangoDbBackend.mget.<locals>.<listcomp>)r7   r8   r3   r4   r    r   r-   r5   extendr6   Z	nextBatchStopIterationr	   r9   lenr:   )r#   rA   Z	json_keysr;   resultsvaluesr<   r=   r)   r)   r*   mget   s8    
  
"
zArangoDbBackend.mgetc              
   C   s   z2t dj|| jd | jdj|| jd W nV tk
r^ } zt | W 5 d }~X Y n, tk
r } zt | W 5 d }~X Y nX d S )Nz*REMOVE {{ _key: "{key}" }} IN {collection})r1   r   r>   )r#   r1   r<   r=   r)   r)   r*   delete   s"      zArangoDbBackend.deletec              
   C   s   | j  | j  }z*dj| j|d}t| | j	| W nV t
k
rj } zt| W 5 d}~X Y n, tk
r } zt| W 5 d}~X Y nX dS )zDelete expired meta-data.zcFOR item IN {collection} FILTER item.task.date_done < "{remove_before}" REMOVE item IN {collection})r   remove_beforeN)r   nowr0   	isoformatr    r   r3   r4   r-   r5   r	   r9   r:   )r#   rK   r;   r<   r=   r)   r)   r*   cleanup   s     
zArangoDbBackend.cleanup)N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   strZkey_tr   propertyr   r-   r   r0   r   r@   rI   rJ   rN   __classcell__r)   r)   r'   r*   r
      s,   /
	

$r
   )rR   r7   r3   datetimer   Zkombu.utils.objectsr   Zkombu.utils.urlr   Zcelery.exceptionsr   baser   ZpyArangor   r   ZpyArango.theExceptionsr	   ImportError__all__r
   r)   r)   r)   r*   <module>   s   