
    h'                        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  eddg      Z eg d	      ez  Ze eg d
      z  ZdZd ZddZd Z	 	 ddZd Zd Zd Z d Z!d Z"d Z#d Z$y)zCBits and pieces used by the driver that don't really fit elsewhere.    N)abc	iteritems
itervaluesstring_type)SON)	ASCENDING)CursorNotFoundDuplicateKeyErrorExecutionTimeoutNotMasterErrorOperationFailure
WriteErrorWriteConcernErrorWTimeoutErroriP-  [   )i{'  i{4  iR-  i|4     )      Y   i)#  i  _c                 X    t         j                  | D cg c]  }d|z  	 c}      S c c}w )z9Generate an index name from the set of fields it is over.z%s_%s)_UUNDERjoin)keysitems     R/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/pymongo/helpers.py_gen_index_namer   :   s#    <<D9D49::9s   'c                     || |fgS t        | t              r	| t        fgS t        | t        t        f      st        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.
    zEif no direction is specified, key_or_list must be an instance of list)
isinstancer   r   listtuple	TypeError)key_or_list	directions     r   _index_listr%   ?   sY    
 i())k;/ ),--K$7 F G G    c                    t        | t        j                        r t        dt	        t        |             z        t        | t        t        f      st        dt        |       z         t        |       st        d      t               }| D ]U  \  }}t        |t              st        d      t        |t        t        t        j                  f      st        d      |||<   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)
index_listindexkeyvalues       r   _index_documentr1   O   s    
 *ckk* #%))J*?%@A B 	B 
T5M2  "&z"23 4 	4z?ABBEE" e#{+JKK%+sCKK!@A N O Oc
 Lr&   c                    d| vr,t        | j                  d      | j                  d      | |      |r:d| v r6| d   }| j                  d      }|r|j                  d|i       t        |       | d   ry| }d| v r:t	        | d         D ])  }|j                  d      s|j                  d      r'|} n |d   }|j                  d      }	|r|	|	|v ry||v ry|	t
        v rt        ||       d	|v sd
|v rt        ||       |	dv rt        ||	| |      |	dk(  rt        ||	| |      |	dk(  rt        ||	| |      t        ||	| |      )z0Check the response to a command for errors.
    okz$errcodewriteConcernErrorerrorLabelsNrawerrmsg
not masterznode is recovering*  i*  i&1  2   +   )
r   getupdate_raise_write_concern_errorr   _NOT_MASTER_CODESr   r
   r   r	   )
responsemax_wire_versionallowable_errorsparse_write_concern_error_error_labelsdetailsshardr8   r4   s
             r   _check_command_responserJ   i   s   
 8x||F3'||F3'/1 	1
 !%8H%D-.,,}-MM='23"6*~G 0 	Eyy"599T?		 XF;;vD ''''   VX..		#76#AVX.. $$h8HII	vtX7GHH	VT85EFF
643C
DDr&   c                    t        | |       | j                  dd      r;t        | j                  d| j                  d            | j                  d      |       | j                  dd      }|| S |j                  d      rt	        ||       | }d| v r"| d   D ]  }|j                  d      |k(  s|} n |j                  d      }|d	v rt        |d   ||       t        |d   ||       )
zBReturn getlasterror response as a dict, or raise OperationFailure.wtimeoutFr8   errr4    r9   
errObjectsr:   )rJ   r>   r   
startswithr   r
   r   )resultrC   	error_msgrH   errobjr4   s         r   _check_gle_responserT      s    F$45zz*e$ FJJxE1BC"JJv."$ 	$ 

5"%IL)Y//G v\* 	Fzz% I- 	
 ;;vD$$f==
75>4
88r&   c                     | d   }|j                  d      dk(  rt        |j                  d      d|      t        |j                  d      |j                  d      |      )Nr4   r;   r8   )r>   r
   r   )write_errorserrors     r   _raise_last_write_errorrY      sX     EyyE!		( 3UEBB
UYYx(%))F*;U
CCr&   c                     d| v r?| d   j                  d      r+t        | j                  d      | j                  d      |       t        | j                  d      | j                  d      |       )NerrInforL   r8   r4   )r>   r   r   )rX   s    r   r@   r@      sh    EeI.22:>IIh6!2E; 	;
		(UYYv.7 7r&   c                     | j                  d      }|rt        |       | j                  d      }|r2| j                  d      }|r|j                  d|i       t        |       yy)zDBackward compatibility helper for write command error handling.
    writeErrorsr5   r6   N)r>   rY   r?   r@   )rQ   rW   rX   error_labelss       r   _check_write_command_responser_      s^     ::m,L-JJ*+Ezz-0LL-67"5)	 r&   c                 b    | j                  d      }|rt        |       t        | d   d          y)z=Backward compatibility helper for insert error handling.
    r]   writeConcernErrorsrV   N)r>   rY   r@   )bulk_write_resultrW   s     r   _raise_last_errorrc      s3     %((7L-01EFrJKr&   c                 6   t        | t        j                        r| S t        | t        j                  t        j                  f      rFt        d | D              st        |dt        j                        t        j                  | d      S t        |d      )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              3   <   K   | ]  }t        |t                y wN)r   r   ).0fields     r   	<genexpr>z'_fields_list_to_dict.<locals>.<genexpr>  s     Fe:e[1Fs   z2 must be a list of key names, each an instance of    z' must be a mapping or list of key names)r   r   r(   SequenceSetallr"   r   __name__dictfromkeys)fieldsoption_names     r   _fields_list_to_dictrs      s     &#++&&3<<12FvFF0;0;0D0DF G G }}VQ''
+69 : :r&   c                      t         j                  rGt        j                         } 	 t        j                  | d   | d   | d   dt         j                         ~ yy# t
        $ r Y ~ yw xY w# ~ w xY w)z1Print exceptions raised by subscribers to stderr.r   rj      N)sysstderrexc_info	tracebackprint_exceptionIOError)einfos    r   _handle_exceptionr}     sk     zz	%%eAha%(&*CJJ8
  
  		 s#   0A 	A&"A) %A&&A) )A,rf   )NF)%__doc__rv   ry   bson.py3compatr   r   r   r   bson.sonr   pymongor   pymongo.errorsr	   r
   r   r   r   r   r   r   	frozenset_SHUTDOWN_CODESrA   _RETRYABLE_ERROR_CODESr   r   r%   r1   rJ   rT   rY   r@   r_   rc   rs   r}    r&   r   <module>r      s    J 
  B B  + + + 	       +Y 8 .   ;
 6 .26;;E| 9FD7* L:.r&   