3
O6bN(                 @   s  d Z ddlZddlZddlmZmZmZmZ ddl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 edd	gZed
dddddgeB ZeedddddgB ZdZdd Zd-ddZdd Zd.ddZdd  Z d!d" Z!d#d$ Z"d%d& Z#d'd( Z$d)d* Z%d+d, Z&dS )/zCBits and pieces used by the driver that don't really fit elsewhere.    N)abc	iteritems
itervaluesstring_type)SON)	ASCENDING)CursorNotFoundDuplicateKeyErrorExecutionTimeoutNotPrimaryErrorOperationFailure
WriteErrorWriteConcernErrorWTimeoutError)HelloCompatiP-  [   iJ'  i{'  i{4  iR-  i|4           Y   i)#  i  _c             C   s   t jdd | D S )z9Generate an index name from the set of fields it is over.c             S   s   g | ]}d | qS )z%s_%s ).0itemr   r   N/var/www/html/sandeepIITI/myenv/lib/python3.6/site-packages/pymongo/helpers.py
<listcomp>>   s    z#_gen_index_name.<locals>.<listcomp>)_UUNDERjoin)keysr   r   r   _gen_index_name<   s    r   c             C   sD   |dk	r| |fgS t | tr&| tfgS t | ttfs<td| S dS )zHelper to generate a list of (key, direction) pairs.

    Takes such a list, or a single key, or a single key and direction.
    NzEif no direction is specified, key_or_list must be an instance of list)
isinstancer   r   listtuple	TypeError)Zkey_or_list	directionr   r   r   _index_listA   s    


r%   c             C   s   t | tjr"tdtt|  nt | ttfs@tdt|  t| sPt	dt
 }xD| D ]<\}}t |tsvtdt |tttjfstd|||< q\W |S )zbHelper to generate an index specifying document.

    Takes a list of (key, direction) pairs.
    zhpassing a dict to sort/create_index/hint is not allowed - use a list of tuples instead. did you mean %r?z0must use a list of (key, direction) pairs, not: z&key_or_list must not be the empty listz,first item in each key pair must be a stringz[second item in each key pair must be 1, -1, '2d', or another valid MongoDB index specifier.)r    r   Mappingr#   r!   r   r"   reprlen
ValueErrorr   r   int)Z
index_listindexkeyvaluer   r   r   _index_documentQ   s     
r.   Fc       
      C   sv  d| kr"t | jd| jd| ||rZd| krZ| d }| jd}|rR|jd|i t| | d rfdS | }d| krx0t| d D ] }|jdr|jd r|}P qW |d }|jd}	|r|	dk	r|	|krdS n||krdS |	dk	r|	tkrt|| n tj|ksd	|krt|| |	dkr2t	||	| |n2|	dkrLt
||	| |n|	dkrdt||	| |t ||	| |dS )z0Check the response to a command for errors.
    okz$errcodewriteConcernErrorerrorLabelsNrawerrmsgznode is recovering*  *  &1  2   +   )r5   r6   r7   )r   getupdate_raise_write_concern_errorr   _NOT_MASTER_CODESr   r   LEGACY_ERRORr	   r
   r   )
responsemax_wire_versionZallowable_errorsZparse_write_concern_error_errorZ_labelsdetailsZshardr4   r0   r   r   r   _check_command_responsek   sN    






rC   c             C   s   t | | | jddr6t| jd| jd| jd| | jdd}|dkrN| S |jtjrdt|| | }d| krx$| d D ]}|jd|krz|}P qzW |jd}|dkrt|d || t|d || dS )zBReturn getlasterror response as a dict, or raise OperationFailure.wtimeoutFr4   errr0    NZ
errObjects*  *  &1  )rG   rH   rI   )	rC   r:   r   
startswithr   r>   r   r	   r   )resultr@   	error_msgrB   Zerrobjr0   r   r   r   _check_gle_response   s(    


rM   c             C   sD   | d }|j ddkr(t|j dd|t|j d|j d|d S )N   r0   i*  r4   )r:   r	   r   )write_errorserrorr   r   r   _raise_last_write_error   s    rR   c             C   sJ   d| kr.| d j dr.t| j d| j d| t| j d| j d| d S )NZerrInforD   r4   r0   )r:   r   r   )rQ   r   r   r   r<      s
    r<   c             C   sL   | j d}|rt| | j d}|rH| j d}|r@|jd|i t| dS )zDBackward compatibility helper for write command error handling.
    writeErrorsr1   r2   N)r:   rR   r;   r<   )rK   rP   rQ   Zerror_labelsr   r   r   _check_write_command_response   s    


rT   c             C   s*   | j d}|rt| t| d d  dS )z=Backward compatibility helper for insert error handling.
    rS   ZwriteConcernErrorsrN   NrO   )r:   rR   r<   )Zbulk_write_resultrP   r   r   r   _raise_last_error   s    
rU   c             C   sd   t | tjr| S t | tjtjfrRtdd | D sFtd|tjf t	j
| dS td|f dS )zTakes a sequence of field names and returns a matching dictionary.

    ["a", "b"] becomes {"a": 1, "b": 1}

    and

    ["a.b.c", "d", "a.c"] becomes {"a.b.c": 1, "d": 1, "a.c": 1}
    c             s   s   | ]}t |tV  qd S )N)r    r   )r   fieldr   r   r   	<genexpr>  s    z'_fields_list_to_dict.<locals>.<genexpr>z6%s must be a list of key names, each an instance of %srN   z)%s must be a mapping or list of key namesN)r    r   r&   SequenceSetallr#   r   __name__dictfromkeys)fieldsZoption_namer   r   r   _fields_list_to_dict   s    	r_   c              C   sV   t jrRt j } z>y$tj| d | d | d dt j W n tk
rH   Y nX W d~ X dS )z1Print exceptions raised by subscribers to stderr.r   rN      N)sysstderrexc_info	tracebackprint_exceptionIOError)Zeinfor   r   r   _handle_exception  s    
rg   )N)NF)'__doc__ra   rd   Zbson.py3compatr   r   r   r   Zbson.sonr   Zpymongor   Zpymongo.errorsr   r	   r
   r   r   r   r   r   Zpymongo.hello_compatr   	frozensetZ_SHUTDOWN_CODESr=   Z_RETRYABLE_ERROR_CODESr   r   r%   r.   rC   rM   rR   r<   rT   rU   r_   rg   r   r   r   r   <module>   sJ   (

 
=#		