
;t/Uc           @   s   d  d l  Z  d  d l Z d d l m Z d d l m Z m Z m Z m Z d d l	 m
 Z
 d d l m Z m Z d d l m Z d	 e f d
     YZ d S(   iNi   (   t   IDENTITY(   t   Tablet   Queryt   Fieldt
   Expression(   t   SQLALL(   t   use_common_filterst   xorifyi   (   t   NoSQLAdaptert   MongoDBAdapterc        
   B   s  e  Z dI Z d d g Z e Z i e d 6e d 6e d 6e d 6e d 6e d 6e d	 6e d
 6e d 6e	 d 6e	 d 6e
 j d 6e
 j d 6e
 j
 d 6e d 6e d 6e d 6e d 6e d 6Z i d d d 6Z d d dJ d e i  i  e dJ d 	 Z dJ d  Z d   Z d   Z d    Z e e dJ e d!  Z dJ e d"  Z dJ d#  Z d$ d%  Z dJ d&  Z dJ d'  Z e e d(  Z dJ d)  Z dJ d*  Z  dJ d+  Z! d,   Z" d-   Z# d.   Z$ d/   Z% d0   Z& d1   Z' dJ d2  Z( dJ d3  Z) dJ d4  Z* dJ d5  Z+ d6   Z, dJ d7  Z- d8   Z. d9   Z/ d:   Z0 d;   Z1 d<   Z2 d=   Z3 d>   Z4 d?   Z5 d@   Z6 dA   Z7 dB   Z8 dC   Z9 e dD  Z: dE   Z6 dF   Z8 dG   Z9 e dH  Z: RS(K   t   pymongot   loadst   dumpst   booleant   stringt   textt   jsont   passwordt   blobt   uploadt   integert   bigintt   floatt   doublet   datet   timet   datetimet   idt	   references   list:strings   list:integers   list:references   This must yet be replaceds"    with javascript in order to work.t   javascript_neededs   mongodb://127.0.0.1:5984/dbi    s   UTF-8c            sz  |   _  |   _ |	 r(   j |  n  d d  l } d d l m } d d l m } d d  l } | j	 j
 |  } |   _ |   _ |   _ d   _ |   _ d | d <d   _ |
   _ |   _   j   | j d d	    _ | j d
 t  r d n d	   _ t | t  r'i | d d 6} n  | j d  d  k rKt d   n    j |   f d  }   j | d t d  S(   Ni(   t   ObjectId(   t   SONt   mongodbt    t   _lastsqls   UTF-8t   minimumreplicationi    t   safei   t   databases   Database is required!c            sM   t    j d  r!   j j } n   j j } | |  d   j | j d  S(   Nt   MongoClientt   wR%   (   t   hasattrt   driverR&   t
   ConnectionR$   t   get(   t   urit   mR*   (   t   self(    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt	   connectorS   s    t   cursor(   t   dbR,   t   find_drivert   randomt   bson.objectidR   t   bson.sonR   t   pymongo.uri_parsert
   uri_parsert	   parse_urit   dbenginet   foldert   db_codect   _after_connectiont	   pool_sizet   find_or_make_work_folderR+   R#   t   TrueR$   t
   isinstancet   tuplet   Nonet   SyntaxErrort	   reconnectt   False(   R.   R1   R,   R=   R:   R;   t   credential_decodert   driver_argst   adapter_argst
   do_connectt   after_connectionR3   R   R   R
   R-   R/   (    (   R.   sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   __init__+   s6    		 					
			
!c         C   s  | s d } n  t  | t  r1t | j d d  j d d   d k } | j   rj | rj t |  } qG| d k r t d d j g  t d  D] } |  j j	 d  ^ q  d  } qG| j
   r| j d  s d	 | } n  y t | d  } Wq.t k
 r} t d
 |   q.XqGt d d   n t  | |  j  rG| St  | t t f  sot d d   n  t |  d j d  j d  } |  j |  S(   sz    Convert input to a valid Mongodb ObjectId instance

        self.object_id("<random>") -> ObjectId (not unique) instance i    t   0xR!   t   Li   s   <random>s   0x%sLt   0123456789abcdefs   0x%ss$   invalid objectid argument string: %ss"   Invalid objectid argument string. s$   Requires an integer or base 16 values#   object_id argument must be of type s-   ObjectId or an objectid representable integeri   (   R@   t
   basestringt   lent   replacet   isdigitt   intt   joint   rangeR3   t   choicet   isalnumt
   startswitht
   ValueErrorR   t   longt	   TypeErrort   hext   rstript   zfill(   R.   t   argt   rawhext   xt   et   hexvalue(    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt	   object_id]   s6    	*	5"c         C   sC   t  | |  j  r* t t |  d  } n  t t |   j | |  S(   Ni   (   R@   R   RZ   t   strt   superR	   t   parse_reference(   R.   t   valuet
   field_type(    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyRg      s    c         C   sC   t  | |  j  r* t t |  d  } n  t t |   j | |  S(   Ni   (   R@   R   RZ   Re   Rf   R	   t   parse_id(   R.   Rh   Ri   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyRj      s    c   	      C   s  t  | |  j  r | } n t j |  | |  } | d k rt | d  k rL | St j d d d  } t j j | |  S| d k r | d  k r | St j d d d  } t j j | |  S| d k r | d  k r | Sd d l	 m
 } t  | |  st  | t  s| t |   S| |  S| St  | t  r| j d	  r| j d
  r~g  } x$ | D] } | j |  j |   qZW| S| St  | t  r| j d  st  | t  s| d k r|  j |  } n  | S(   NR   i    R   i  i   R   i(   t   Binarys   list:s   list:referenceR   R   (   R@   R   R   t	   representRB   R   R   t   combineR   t   bsonRk   RO   Re   RX   t   appendRd   R   (	   R.   t   objt	   fieldtypeRh   t   tt   dRk   t   newvalt   v(    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyRl      sF    	
c         C   s"   | r t  d   n  d  | _ d  S(   Ns   Not implemented(   t   RuntimeErrorRB   t   _dbt(   R.   t   tablet   migratet   fake_migratet	   polymodelt   isCapped(    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   create_table   s    c      	   C   sx   | r t  d   n  t | t  s3 t d   n  |  j |  } t |  j | |  j | j g i  d t	 d | d  S(   Ns   COUNT DISTINCT not supporteds   Not Supportedt   countt   snapshot(
   Rv   R@   R   RC   t	   get_tableRZ   t   selectR1   t   _idR?   (   R.   t   queryt   distinctR   t	   tablename(    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyR~      s    "c         C   s  t  | t  r t  | j t  r | j j d k sE d | j j k r | j j d k rf d | j _ n  t  | j t t t	 f  r g  | j D] } |  j
 |  ^ q | _ n |  j
 | j  | _ | j | j | j  } q n  t  | t  r| j d k rd } q | j } n t  | t t f  r| j d  k	 rQ| j | j | j  } q | j d  k	 ru| j | j  } q t  | j t  s| j   } q | j } n^ | r|  j | |  } nC t  | t t f  rg  | D] } |  j | |  ^ q} n | } | S(   NR   R   R   (   R@   R   t   firstR   t   typet   namet   secondRA   t   listt   setRd   t   opR   RB   Re   Rl   (   R.   t
   expressionRi   t   itemt   result(    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   expand   s<    (	%R!   c         C   s+   |  j  | j } | j   |  j |  d  S(   N(   t
   connectiont
   _tablenamet   dropt   _drop_cleanup(   R.   Rx   t   modet   ctable(    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyR      s    
c         C   s!   | d  k r |  j S| r d Sd S(   Ni   i    (   RB   R$   (   R.   t   val(    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt	   _get_safe   s    c         C   s0   |  j  | j } | j d  d |  j |  d  S(   NR'   (   R   R   t   removeRB   R   (   R.   Rx   R   R$   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   truncate  s    c         C   s$  |  j    } g  g  } } | j d t  }	 | j d t  }
 d | k r_ |  j j j d  n  xN t | j    t d  D]0 } | | d  k	 r| |  j j j d |  q| q| W|
 r |
 d t	 |
 d  d } } n
 d } } |	 rnt
 |	 t t f  rt |	  }	 n  x_ |  j |	  j d  D]B } | j d	  rT| j | d d
 f  q%| j | d f  q%Wn  x: | D]2 } t
 | t  r| | j 7} qu| j |  quW| } t
 | t  r|  j |  } n2 t |  d k r| d j } n t d d   | r1t |  r1|  j | | g  } q1n  |  j |  } | pP|  j | } x | D] } d | | j <qZW|  j | } | ri | j | | d | d | d | d | j   d 6S| j | | d | d | d | d | } g  } g  } g  } xs | D]k } t |  } | j |  | j d  \ } } | d k rHd | _ n  | j d j  | | j f   qWx | D] } g  } xd | D]\ } | j d  \ } } | d k rd } n  | | k r| | } n d  } | j |  qW| j |  qrW| j d |  j!  } | | | | t  } | S(   Nt   orderbyt   limitbyt
   for_updates#   mongodb does not support for_updates$   select attribute not implemented: %si    i   t   ,t   -is%   The table name could not be found in s(   the query nor from the select statement.t   skipt   limitt   sortR   R~   t   .R   R   t	   processor(   s   limitbys   orderbys
   for_update("   R   R+   RE   R1   t   loggert   warnR   t   keysRB   RS   R@   R   RA   R   R   t   splitRX   Ro   R   t   _tableR   R   RP   R   RC   R   t   common_filterR   R   t   findR~   Re   RT   t   parse(   R.   R   t   fieldst
   attributesR~   R   t   mongofields_dictt
   new_fieldst   mongosort_listR   R   t   keyt   limitby_skipt   limitby_limitt   fR   R   t   mongoqry_dictt   fieldR   t   mongo_list_dictst   rowst   colnamest   newnamest   colnamet	   fieldnamet   recordt   rowRh   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyR     s    "

		# 	c   
      C   s   t    } |  j | j } xU | D]M \ } } | j d k r  | j } | | j j }	 |  j | |	  | | <q  q  W| j | d |  j |  t t	 | d  d  S(   s   Safe determines whether a asynchronous request is done or a
        synchronous action is done
        For safety, we use by default synchronous requestsR   R$   R'   R   i   (   s   ids   safe(
   t   dictR   R   R   R   Rl   t   insertR   RZ   Re   (
   R.   Rx   R   R$   t   valuesR   t   kRu   R   Rq   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyR   d  s    		c   
         sO  t  | t  s t d   n    j | t  } t  | t  sN t d   n  | r{ t |  r{   j | | g  } q{ n  d  } | r   j	 |  } n  i t
   f d   | D  d 6} yi   j | j | | d t d   j |  } | r y | d SWq$t t t f k
 r| SXn | SWn# t k
 rJ}	 t d |	   n Xd  S(	   Ns   Not implementeds   Not Supportedc         3   sB   |  ]8 \ } } | j  d k r | j    j | | j  f Vq d S(   R   R   N(   s   _ids   id(   R   Rl   R   (   t   .0R   Ru   (   R.   (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pys	   <genexpr>  s   s   $sett   multiR'   t   ns)   uncaught exception when updating rows: %s(   R@   R   Rv   R~   RE   RC   R   R   RB   R   R   R   t   updateR?   R   t   KeyErrort   AttributeErrorR[   t	   Exception(
   R.   R   R   R   R$   t   amountt   filtert   modifyR   Rb   (    (   R.   sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyR   t  s0    c         C   s   d } |  j  | t  } t | t  s@ t d t |    n  | rm t |  rm |  j | | g  } qm n  |  j |  } |  j	 | j
 | d |  j |  | S(   Ni    s   query type %s is not supportedR'   (   R~   RE   R@   R   Rv   R   R   R   R   R   R   R   (   R.   R   R   R$   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   delete  s    #c         C   s#   g  | D] } |  j  | |  ^ q S(   N(   R   (   R.   Rx   t   itemsR   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   bulk_insert  s    c         C   s   d |  j  |  S(   Ns   -%s(   R   (   R.   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   INVERT  s    c         C   s   |  j  |  } | j   d } | | } t |  t k r | d k rM d n d } i |  j | j  |  j | j  g | 6} n i i | d 6| 6} | S(   Ni    s   $ors   $ands   $not(   R   R   R   R   t   NOTR   R   (   R.   R   R   t   op_kt   op_bodyt   not_opt   r(    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyR     s    
.c         C   s#   i |  j  |  |  j  |  g d 6S(   Ns   $and(   R   (   R.   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   AND  s    c         C   s#   i |  j  |  |  j  |  g d 6S(   Ns   $or(   R   (   R.   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   OR  s    c         C   s   t  | t  r1 i i | d  g d 6|  j |  6S| g  k sX | d k sX | t   k rc i d d 6Sg  | D] } |  j | | j  ^ qj } i i | d 6|  j |  6S(   Nis   $ini    i   (    (   R@   Re   R   R   R   (   R.   R   R   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   BELONGS  s    "'(c         C   s&   i  } |  j  |  | |  j  |  <| S(   N(   R   (   R.   R   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   EQ  s    c         C   s-   i  } i |  j  |  d 6| |  j  |  <| S(   Ns   $ne(   R   (   R.   R   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   NE  s    #c         C   sL   | d  k r t d |   n  i  } i |  j |  d 6| |  j |  <| S(   Ns   Cannot compare %s < Nones   $lt(   RB   Rv   R   (   R.   R   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   LT  s
    #c         C   sL   | d  k r t d |   n  i  } i |  j |  d 6| |  j |  <| S(   Ns   Cannot compare %s <= Nones   $lte(   RB   Rv   R   (   R.   R   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   LE  s
    #c         C   s-   i  } i |  j  |  d 6| |  j  |  <| S(   Ns   $gt(   R   (   R.   R   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   GT  s    #c         C   sL   | d  k r t d |   n  i  } i |  j |  d 6| |  j |  <| S(   Ns   Cannot compare %s >= Nones   $gte(   RB   Rv   R   (   R.   R   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   GE  s
    #c         C   s9   t  |  j d   d |  j |  |  j | | j  f S(   NR   s   %s + %s(   t   NotImplementedErrort   error_messagesR   R   (   R.   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   ADD  s    c         C   s9   t  |  j d   d |  j |  |  j | | j  f S(   NR   s	   (%s - %s)(   R   R   R   R   (   R.   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   SUB  s    c         C   s9   t  |  j d   d |  j |  |  j | | j  f S(   NR   s	   (%s * %s)(   R   R   R   R   (   R.   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   MUL  s    c         C   s9   t  |  j d   d |  j |  |  j | | j  f S(   NR   s	   (%s / %s)(   R   R   R   R   (   R.   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   DIV  s    c         C   s9   t  |  j d   d |  j |  |  j | | j  f S(   NR   s
   (%s %% %s)(   R   R   R   R   (   R.   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   MOD  s    c         C   s*   t  |  j d   d |  j |  | f S(   NR   s   %s AS %s(   R   R   R   (   R.   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   AS  s    c         C   s0   t  d d   d |  j |  |  j |  f S(   Ns   This is not possible in NoSQLs%    but can be simulated with a wrapper.s   %s ON %s(   R   R   (   R.   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   ON  s    
c         C   s    d |  j  |  |  j  |  f S(   Ns   %s, %s(   R   (   R.   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   COMMA  s    c         C   s0   i d |  j  | d  j d d  |  j  |  6S(   Ns   %sR   t   %t   /(   R   RQ   (   R.   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   LIKE  s    c         C   sL   t  | |  j  r | n i | j d d  d 6d d 6} i | |  j |  6S(   NR   R!   s   $regext   is   $options(   R@   R   RQ   R   (   R.   R   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   ILIKE  s    c         C   s$   i d |  j  | d  |  j  |  6S(   Ns   /^%s/R   (   R   (   R.   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt
   STARTSWITH"  s    c         C   s$   i d |  j  | d  |  j  |  6S(   Ns   /%s^/R   (   R   (   R.   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   ENDSWITH'  s    c         C   sV   t  | |  j  r | n' i d t j |  j | d   d d 6} i | |  j |  6S(   Ns   .*R   s   $regex(   R@   R   t   ret   escapeR   (   R.   R   R   t   case_sensitiveR   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   CONTAINS,  s    *c         C   sH   d d  l  } i i | j |  j | d   j d d  d 6|  j |  6S(   NiR   R   s   .*s   $regex(   R   R   R   RQ   (   R.   R   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyR   4  s    c         C   s@   d d  l  } i i d | j |  j | d   d 6|  j |  6S(   Nit   ^R   s   $regex(   R   R   R   (   R.   R   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyR   ;  s    	c         C   s@   d d  l  } i i | j |  j | d   d d 6|  j |  6S(   NiR   t   $s   $regex(   R   R   R   (   R.   R   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyR   C  s    c         C   s8   i i d t  j |  j | d   d d 6|  j |  6S(   Ns   .*R   s   $regex(   R   R   R   (   R.   R   R   R   (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyR   M  s    (   s   pymongoN(;   t   __name__t
   __module__t   driverst   driver_auto_jsonRE   t   uploads_in_blobt   boolRe   RZ   R   R   R   R   R   t   typesR   RB   R    R?   RK   Rd   Rg   Rj   Rl   R}   R~   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   (    (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyR	      s   



	/#			.+["																						
(   R   R   t   _globalsR    t   objectsR   R   R   R   t   helpers.classesR   t   helpers.methodsR   R   t   baseR   R	   (    (    (    sQ   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/packages/dal/pydal/adapters/mongo.pyt   <module>   s   "