
p/Uc           @   s  d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l	 Z	 d d l
 m Z m Z m Z m Z m Z m Z d d l m Z 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 d d l m Z m  Z  m! Z! m" Z" m# Z# m$ Z$ d d	 l% m& Z& m' Z' m( Z( m) Z) d d
 l* m+ Z+ m, Z, m- Z- m. Z. m/ Z/ m0 Z0 m1 Z1 m2 Z2 i d d 6d d 6d d 6d d d 6d d d 6Z3 d e4 f d     YZ5 d e4 f d     YZ6 d e4 f d     YZ7 d e4 f d     YZ8 d e4 f d     YZ9 d e7 f d     YZ: d  e4 f d!     YZ; d" e4 f d#     YZ< d$ e4 f d%     YZ= d& e4 f d'     YZ> d( e4 f d)     YZ? d* e4 f d+     YZ@ d S(,   iNi   (   t   StringIOt   ogetattrt   osetattrt   pjoint   existst   hashlib_md5(   t   GLOBALSt   DEFAULTt   IDENTITYt   ANDt   OR(   t   json(   t   Key(   t   NotFoundExceptiont   NotAuthorizedException(   t   REGEX_TABLE_DOT_FIELDt   REGEX_ALPHANUMERICt   REGEX_PYTHON_KEYWORDSt   REGEX_STORE_PATTERNt   REGEX_UPLOAD_PATTERNt   REGEX_CLEANUP_FN(   t	   Referencet   MethodAddert   SQLCallableListt   SQLALL(   t   list_representt   bar_decode_integert   bar_decode_stringt
   bar_encodet   archive_recordt   cleanupt   use_common_filterst	   pluralizei   t   stringt   passwordt   uploadi   i   t   texti   t   blobt   Rowc           B   s  e  Z d  Z d   Z d   Z d   Z e j Z d   Z	 e Z
 d d  Z d   Z Z d   Z d   Z d	   Z d
   Z d   Z d   Z d   Z d   Z Z d   Z d   Z e Z d   Z d   Z d   Z	 e d d  Z d d d d  Z d d d e  d  Z! RS(   sd   
    A dictionary that lets you do d['a'] as well as d.a
    this is only used to store a `Row`
    c         O   s   |  j  j | |   S(   N(   t   __dict__t   update(   t   selft   argst   kwargs(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   <lambda>)   s   	c         C   s  t  | t  rC y t |  | j  SWq t t t f k
 r? q Xn t  | t  r y t |  | j  SWn t t t f k
 r n Xy  t t |  | j	  | j  SWq t t t f k
 r q Xn  t
 |  } t |  d  j d d   } | d  k	 r| j | t  } | t k r| Sn  y t |  |  SWn t t t f k
 rHn Xt j |  } | ry' t |  | j d   | j d  SWqt t t f k
 r| j d  } qXn  y t |  |  SWnQ t t t f k
 r} y% t |  d  |  |  | <|  | SWq|  qXn Xd  S(   NR'   t   _extrai   i   t   __get_lazy_reference__(   t
   isinstancet   TableR   t
   _tablenamet   KeyErrort   AttributeErrort	   TypeErrort   Fieldt   namet	   tablenamet   strt   gett   NoneR   R   t   matcht   group(   R)   t   kt   keyR-   t   vt   mt   ae(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __getitem__,   sL     'c         C   s   t  |  t |  |  S(   N(   t   setattrR8   (   R)   R>   t   value(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   V   s    c         C   s
   t  |   S(   N(   R&   (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   Z   s    c         C   sB   y |  j  |  SWn* t t t f k
 r= |  j j | |  SXd  S(   N(   RB   R2   R3   R4   R'   R9   (   R)   R>   t   default(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR9   _   s    c         C   s   | |  j  k S(   N(   R'   (   R)   R>   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   e   s    c         C   s   t  |  j  d k S(   Ni    (   t   lenR'   (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   g   s    c         O   s   |  j  j | |   S(   N(   R'   R(   (   R)   R*   R+   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   i   s    c         C   s   |  j  j   S(   N(   R'   t   keys(   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   k   s    c         C   s   |  j  j   S(   N(   R'   t   items(   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   m   s    c         C   s   |  j  j   S(   N(   R'   t   values(   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   o   s    c         C   s   |  j  j   S(   N(   R'   t   __iter__(   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   q   s    c         C   s   |  j  j   S(   N(   R'   t	   iteritems(   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   s   s    c         C   s   d |  j    S(   Ns   <Row %s>(   t   as_dict(   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   u   s    c         C   s   t  j |  d  S(   Nt   id(   t   objectt   __getattribute__(   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   w   s    c         C   s   t  t j |  d   S(   NRM   (   t   longRN   RO   (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   y   s    c         C   s3   y |  j    | j    k SWn t k
 r. t SXd  S(   N(   RL   R3   t   False(   R)   t   other(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __eq__   s    c         C   s   |  | k S(   N(    (   R)   RR   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __ne__   s    c         C   s   t  t |    S(   N(   R&   t   dict(   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __copy__   s    c         C   s~  t  t t t t t t t g } t | t t	 t
 f  rC | | 7} n | rY | j |  n  t |   } xt j | j    D] } | | } | | d  k r q{ q{ t | t  r | j   | | <q{ t | t  r t |  | | <q{ t | t j  r
t |  | | <q{ t | t j t j t j f  rW| rv| j   j d d  d  | | <qvq{ t | t	 |   s{ | | =q{ q{ W| S(   Nt   Tt    i   (   R8   t   unicodet   intRP   t   floatt   boolt   listRU   R/   t   tuplet   sett   appendt   copyRG   R:   R&   RL   R   t   decimalt   Decimalt   datetimet   datet   timet	   isoformatt   replace(   R)   t   datetime_to_strt   custom_typest   SERIALIZABLE_TYPESt   dR=   R?   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRL      s,    
!&t   rows     c            s%   d   f d      |  | d | S(   Ns     c            s   t  |  t  rp | d } g  |  D]  }   |  | | | d  ^ q  } d | | | j d   | D  | | f St |   s t j |  r d | | |  | f Sd | | |  f Sn d  Sd  S(   Ns     
s     s   %s<%s>
%s
%s</%s>c         s   s   |  ] } | r | Vq d  S(   N(    (   t   .0t   item(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pys	   <genexpr>   s    s   %s<%s>%s</%s>s   %s<extra name="%s">%s</extra>(   R/   R&   t   joint   callableR   R;   R:   (   Rm   t   fieldt   indentt   spct   xRH   (   t   f(    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRv      s    
-Rs   (    (   R)   t   row_namet   colnamesRs   (    (   Rv   s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   as_xml   s    RN   c         K   s   |  j  |   } | r t t j d  d  rr t t d d  rN t d d n d } t d d | d | pn | St j |  Sn | Sd S(   s!  
        serializes the row to a JSON object
        kwargs are passed to .as_dict method
        only "object" mode supported

        `serialize = False` used by Rows.as_json

        TODO: return array mode with query column order

        mode and colnames are not implemented
        t   serializersR   t   custom_jsonRE   N(   RL   t   hasattrR   R9   R:   R   t   dumps(   R)   t   modeRE   Rx   t	   serializeR+   Ro   R{   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   as_json   s    'N("   t   __name__t
   __module__t   __doc__t   __init__RB   t   __setitem__RN   t   __delattr__t   __delitem__RV   t   __call__R:   R9   t   has_keyt   __contains__t   __nonzero__R(   RG   RH   RI   RJ   RK   t   __str__t   __repr__t   __int__t   __long__t   __getattr__RS   RT   RQ   RL   Ry   t   TrueR   (    (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR&   "   s6   		*																R0   c           B   s  e  Z d  Z d   Z e d    Z d   Z d1 d d d d1 d  Z d   Z	 d	   Z
 e d
  Z d   Z d   Z e d  Z d   Z e Z d   Z d   Z d   Z e Z d   Z d   Z d   Z d   Z d   Z e d    Z e d    Z d d  Z d d  Z e d  Z  d   Z! d   Z" d   Z# d    Z$ d!   Z% e d"  Z& e d#  Z' e d$  Z( d%   Z) d1 d&  Z* d1 d'  Z+ d1 d( d) d1 d*  Z, e e- d+  Z. e- d,  Z/ e- d-  Z0 e- d.  Z1 d/   Z2 d0   Z3 RS(2   s(  
    Represents a database table

    Example::
        You can create a table as::
            db = DAL(...)
            db.define_table('users', Field('name'))

        And then::

            db.users.insert(name='me') # print db.users._insert(...) to see SQL
            db.users.drop()

    c            sm  d d l  m } t  _ |  _ |  _ t | t  su | d d k su t | |  su d | k su t	 j
 |  r t d |   n  d#  _ | j d   _ | j d  p | o | j j  j p |   _ | j d	  p | o | j j |   _ | j d
   _ | j d   _ | j d | j d d  j     _ | j d t  j j    j     _ d | k r| d d# k	 r| j d   _ n  g   _ t j  g  _! t j  g  _" g   _# g   _$ g   _% t&    _' t(   g     t)  d d#  } | d# k	 rt | t*  sGt d |   n  t+ |  d k r4g  | D]. } t | t,  r`| j- | d k r`| ^ q`d  _. q4n g  | D]Q } t | t,  r| j/ d k st | t0  r| j d d#  d k r| ^ qs4t, d d  }  j1 |    j2 d  |  _. n  g  }	     f d   }
 xM| D]E} t | t3 t4 f  r|	 j1 |  qVt | t,  r| j-   k r| j5 d# k	 rt6 j6 |  } n  |
 |  qVt | t0  r| d   k r|
 t, |    qVt | t7  rs| } x | D]Q } | j-   k r| j/ d k r| j oP j } |
 | j8 d |   qqWqVt | t, t7 f  sVt d |   qVqVW } | } t9    _: g   _; t* |  } | r| j j< t= k rg  | D] } | j/ d k r| j- ^ q} x | D] } | j> } t | t,  rp| j/ d k rp| t= k rp| j? rpd | j- } | _> n  t | t  r| | k r| j? r| j1 t, | d d d d t d t  qqWn  t(   } t@ t7  d g  | r| jA r| jB } n  f d    } x | D] } | j- } | |  | rK| jC rK| j   } n | } | | k rvt d! | | f   n | j2 |   jD j1 |  |  | <| j/ d k r|  d <n  | | _E | _  | _F | _G | | _5 | _ qWtH    _I | d# k	 rKx@ | D]5 } |  jD k r7t d" |   qt=  | _J qWn  x |	 D] } |  | j- <qRWd# S($   sP  
        Initializes the table and performs checking on the provided fields.

        Each table will have automatically an 'id'.

        If a field is of type Table, the fields (excluding 'id') from that table
        will be used instead.

        Raises:
            SyntaxError: when a supplied field is of incorrect type.
        i   (   t   DALi    t   _t   .s:   Field: invalid table name: %s, use rname for "funny" namest   rnamet   sequence_namet   trigger_namet   common_filtert   formatt   singularRX   t   pluralt
   primarykeyt   _primarykeys3   primarykey must be a list of fields from table '%s'RM   t   typec            s<    j  |     j |  j  |  j d k r8 |   _ n  d  S(   NRM   (   R`   t   addR6   R   t   _id(   Rr   (   t
   fieldnamest	   newfieldsR)   (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   include_new4  s    t	   fieldnamet   point_self_references_tos1   define_table argument is not a Field or Table: %sR%   R#   s   %s_blobRE   t    t   writablet   readablet   fieldsc            s#   |    k r t  d |    n  d  S(   Ns   field name %s not allowed(   t   SyntaxError(   t
   field_name(   t   reserved(    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   check_reserveda  s    s   duplicate field %s in table %ss3   primarykey must be a list of fields from table '%s N(K   t   baseR   RQ   t   _actualt   _dbR1   R/   R8   R|   R   R;   R   R:   t   _otR9   t   _rnamet   _adapterR   t   _sequence_nameR   t   _trigger_namet   _common_filtert   _formatRh   t
   capitalizet	   _singularR    t   lowert   _pluralR   t   _before_insertt   Sett   delete_uploaded_filest   _before_updatet   _before_deletet   _after_insertt   _after_updatet   _after_deleteR   t
   add_methodR_   t   getattrR]   RF   R5   R6   R   R   RU   R`   R   t   FieldMethodt   FieldVirtualt   dbRa   R0   t   cloneR   t   _fieldst   virtualfieldst   uploads_in_blobR   t   uploadfieldt   uploadfst   dirR   t   check_reserved_keywordt   _ignore_field_caseR   R7   t   tablet   _tableR   t   ALLt   notnull(   R)   R   R7   R   R*   R   R   Rv   Rr   t   virtual_fieldsR   R   t   t2t   uploadfieldst   fnt   fieldnames_setR   R   t
   fname_itemR=   (    (   R   R   R   R)   s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR      s    			 	!$				,$ 	+	%		

c         C   s   |  j  S(   N(   R   (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    c         O   s   t  d   d  S(   Ns   Syntax Not Supported(   t   RuntimeError(   R)   R*   R+   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR(     s    s   %(tablename)s_archivet	   is_activet   current_recordc      	      s  |  j    | p   } | t d |  j  } | | j   k rA d  S|  j   } |   k } | re |  n d } g  }	 xU |  D]M }
 | p |
 j j d  } |	 j |
 j d t	 d | r |
 j n d   qx W| j
 | t | | d | |	 t d |  j   |  j j | | | d   | r| | k r|  j j d	    |  |  j   f d
   |  j   rz  f d   |  _ q |  _ n  d  S(   NR7   t   bigintt	   referencet   uniqueR   t   labelR   c         S   s   t  |  | | | |  S(   N(   R   (   t   qsett   fsR   t   ant   cn(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,     s    c         S   s   |  j  d t  S(   NR   (   R(   RQ   (   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,     s    c      	      sa   t  t g    j j |   D]A } | | k sG t   | d d   | k r   | j t k ^ q  S(   NR   (   t   reduceR	   R   t   tablesR   R:   R   R   (   t   queryt   tR6   t   tn(   R   (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,     s    	c            s   t  t  |     |   g  S(   N(   R   R	   (   t   q(   t   newqueryR   (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,     s    (   R   RU   R1   R   R   R   t
   startswithR`   R   RQ   t   define_tableR5   R   R   R   R   (   R)   t
   archive_dbt   archive_nameR   R   t   current_record_labelR   t   same_dbt
   field_typet   clonesRr   t   nfk(    (   R   R   R   s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   _enable_record_versioning  s6    	,		
	c         K   sV   t    } xF | j   D]8 \ } } |  | j |  \ } } | r | | | <q q W| S(   N(   R&   RK   t   validate(   R)   t   varst   errorsR>   RD   t   error(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt	   _validate  s    	c         C   s  |  j  } | j } g  |  _ g  |  _ xg|  D]_} | j } t | t  r| d  d k r| d j   } | s t d |  n  d | k r | j	 d  \ } } } n | d  } } | | k r | j | g   | g | | <q+ n  | | }	 | rLt |	 d  st d   n  | |	 j k r?t d | | |  j f   n  |	 | }
 n	 |	 j }
 |	 j j |  |
 | _ |  j j |  q+ d  | _ q+ W|  j | k r| j |  j  } x! | D] } |  j j |  qWn  d  S(   Ni
   s
   reference s   Table: reference to nothing: %sR   R   s<   keyed tables can only reference other keyed tables (for now)s:   invalid field '%s' for referenced table '%s' in table '%s'(   R   t   _pending_referencest   _referenced_byt   _referencesR   R/   R8   t   stripR   t	   partitionR:   R9   R|   R   R1   R   R`   t   referentt   pop(   R)   R   t   prRr   R   t   reft
   rtablenamet   throw_itt
   rfieldnamet   rtablet   rfieldt   refereest   referee(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   _create_references  sF    					
		c         C   sW   t  g  | j   D]@ \ } } | |  j k r |  | j d k sD | r | | f ^ q  S(   NRM   (   RU   RK   R   R   (   R)   t   recordRM   R=   R?   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   _filter_fields  s    c         C   s   d } xr | j   D]d \ } } | |  j k r^ | rK | |  | | k @} qw |  | | k } q t d | |  j f   q W| S(   s    for keyed table only s-   Field %s is not part of the primary key of %sN(   R:   RK   R   R   R1   (   R)   R>   R   R=   R?   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   _build_query  s    c         C   s   | s
 d  St | t  rM |  j |  } |  j |  j d d d t  j   Sy% d |  j j k on t | t	  } Wn t } n Xt
 |  j   s | r |  j |  j | k  j d d d t  j   St |  t
 |   Sd  S(   Nt   limitbyi    i   t   orderby_on_limitbyt   google(   i    i   (   i    i   (   R:   R/   RU   R  R   t   selectRQ   t   firstt   _drivers_availableR   R8   t   isdigitR   R   (   R)   R>   R   t   isgoogle(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRB     s"    
c   	   	   K   s  | j  d t  } d | k r( | d =n  | j  d d   } d | k rP | d =n  | t k	 r6t | t  r |  j |  j d d
 d | d | d t  j   } nW t	 |  j
   s d  } n< |  j |  j | k  j d d d | d | d t  j   } | r2x1 | j   D]  \ } } | | | k rd  SqWn  | S| rt d	   g  | j   D] \ } } |  | | k ^ qR } |  j |  j d d d | d | d t  j   Sd  Sd  S(   Nt   _for_updatet   _orderbyR  i    i   t
   for_updatet   orderbyR  c         S   s   |  | @S(   N(    (   t   at   b(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   0  s    (   i    i   (   i    i   (   i    i   (   R9   RQ   R:   R   R/   t   QueryR   R  R  R8   R  R   RK   R   (	   R)   R>   R+   R  R  R  R=   R?   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s:    

	 ;1c         C   s  t  | t  r t  | t  r t | j    t |  j  k r |  j |  } i  } | j |  | j |  |  j |   s |  j |  } |  j	 |  j |  j |    q q|t
 d |  j   n t |  j   rD| d k r |  j |  j |    q||  j	 |  j | k  j |  j |    d  k r|t
 d |   q|n8 t  | t  rft
 d |   n  t |  t |  |  d  S(   Ns-   key must have all fields from primary key: %si    s   No such record: %ss   value must be a dictionary: %s(   R/   RU   R_   RG   R   R  R(   t   insertR  R   R   R8   R  R   R:   R   (   R)   R>   RD   t   kvR   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   5  s,    !%c         C   sC   | d  d k r/ | |  k r/ t  d |   n  t |  | |  d  S(   Ni   R   s)   Object exists and cannot be redefined: %s(   R   R   (   R)   R>   RD   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __setattr__R  s    c         C   s   t  | t  rI |  j |  } |  j |  j   s t d |   q nE t |  j   s{ |  j |  j | k  j   r t d |   n  d  S(   Ns   No such record: %s(	   R/   RU   R  R   t   deleteR   R8   R  R   (   R)   R>   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   W  s    c         C   s   t  |  |  S(   N(   R|   (   R)   R>   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   `  s    c         C   s   |  j  j   S(   N(   R'   RH   (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRH   e  s    c         c   s!   x |  j  D] } |  | Vq
 Wd  S(   N(   R   (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRJ   h  s    c         C   s   |  j  j   S(   N(   R'   RK   (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRK   l  s    c         C   s    d |  j  d j |  j    f S(   Ns   <Table %s (%s)>t   ,(   R1   Rp   R   (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   o  s    c         C   s_   |  j  d  k	 rX |  j  } d t t |  j j   k rG d | |  j f Sd | |  j f S|  j S(   Nt   Oracles   %s %ss   %s AS %s(   R   R:   R8   R   R   R   R1   (   R)   t   ot(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   r  s    	c         C   s)   |  j  } | r | S|  j j j |  j  S(   N(   R   R   R   t   sqlsafe_tableR1   (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   sqlsafe{  s    	 c         C   s?   |  j  } |  j } | r# | r# | S|  j j j |  j |  j  S(   N(   R   R   R   R   R'  R1   (   R)   R   R&  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   sqlsafe_alias  s
    		 R   c         C   s   |  j  j j |  |  S(   N(   R   R   t   _drop(   R)   R~   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR*    s    c         C   s   |  j  j j |  |  S(   N(   R   R   t   drop(   R)   R~   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR+    s    c         C   s  i  } x~ | D]v } | |  j  k rD | d k r t d |   q q |  | } | | } | j rs | j |  } n  | | f | | <q Wg  } x |  D] } | j } | | k r | j r | j | | f  qk| r
| j d  k	 r
| j } | | | <| | f | | <qk| rE| j d  k	 rE| j } | | | <| | f | | <qk| rk| j	 rkt
 d |   qkq q W| rt |  }	 xx | D]m \ } } y+ | j |	  |	 | <}
 | |
 f | | <Wqt t f k
 r| j	 rt d |   qqXqWn  | j   S(   NRM   s%   Field %s does not belong to the tables!   Table: missing required field: %ss   unable to compute field: %s(   R   R   t	   filter_inR6   t   computeR`   RE   R:   R(   t   requiredR   R&   R2   R3   RI   (   R)   R   R(   t
   new_fieldsR6   Rr   RD   t
   to_computet   ofieldRm   t	   new_value(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   _listify  sL    

				
	
	c      
   C   sN  xG|  D]?} | j  d k r | j | k r | | j } | d  k pP t | t  sFt | d  r t | d  r | j | j d | j } n t | t	  r d | k r d | k r t
 j
 | d  } | j | d | d } q3d  } nE t | d  r't | d  r'| j | d | j } n t d   | | | j <qFq q Wd  S(   NR#   t   filet   filenamet   datat   readR6   s   Unable to handle upload(   R   R6   R:   R/   R8   R|   t   storeR4  R5  RU   R    R   (   R)   R   Rr   RD   t   new_namet   stream(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   _attempt_upload  s    	c         C   ss   t  j  |  } x] |  D]U } | j | k r | j d k r | j d k	 r | j d k	 r | j | | j <q q W| S(   s>   If there are no fields/values specified, return table defaultsRM   N(   Ra   R6   R   R-  R:   RE   (   R)   R   Rr   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt	   _defaults  s    c         K   s.   |  j  |  } |  j j j |  |  j |   S(   N(   R<  R   R   t   _insertR3  (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR=    s    c            s   |  j       |  j    t   f d   |  j D  r? d S|  j j j |  |  j     } | r |  j r t	      g  |  j D] } |   |  ^ q n  | S(   Nc         3   s   |  ] } |    Vq d  S(   N(    (   Rn   Rv   (   R   (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pys	   <genexpr>  s    i    (
   R<  R;  t   anyR   R   R   R   R3  R   R&   (   R)   R   t   retRv   (    (   R   s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s     !&c         K   s   t    } t    | _ t j |  } xW | j   D]I \ } } |  | j |  \ } } | rp d | | j | <q1 | | | <q1 W| j s |  j |   | _ n	 d  | _ | S(   Ns   %s(   R&   R   Ra   RK   R   R   RM   R:   (   R)   R   t   responseR/  R>   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   validate_and_insert  s    			c         K   s  t    } t    | _ t j |  } xW | j   D]I \ } } |  | j |  \ } } | rp d | | j | <q1 | | | <q1 W| t k r |  |   } n* t | t  r |  |   } n |  |  } | j r| rd |  k r|  j |  j	 | |  j	 j
 k  }	 no d  }
 xW | j   D]I \ } } |
 d  k rGt |  |  | k }
 q|
 t |  |  | k @}
 qW|  j |
  }	 |	 j |   | _ n	 d  | _ | S(   Ns   %sR   (   R&   R   Ra   RK   R   R   R/   RU   R   R   R6   R:   R   R(   RM   (   R)   t   _keyR   R@  R/  R>   RD   R   R  t   mysetR   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   validate_and_update  s2    	%	c         K   st   | t  k r |  |   } n* t | t  r9 |  |   } n |  |  } | ra | j |   d  } n |  j |   } | S(   N(   R   R/   RU   t   update_recordR:   R   (   R)   RB  RI   R  t   newid(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   update_or_insert"  s    	c   	      K   so  | t  k s | d k r i  } x6 | j   D]( \ } } | |  j k r+ | | | <q+ q+ W| i  k rx |  |   } | } q i  } x9 | j   D]+ \ } } t |  |  j r | | | <q q W|  |   } | } n* t | t  r |  |   } n |  |  } | r\|  j | |  } t |  d  rki  } x$ |  j D] } t | |  | | <q0W| | _	 qkn |  j
 |   } | S(   NR   R   (   R   RK   R   R   R.  R/   RU   RD  R|   RM   RA  (	   R)   RB  R   t   primary_keysR>   RD   R  t   required_keysR@  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   validate_and_update_or_insert0  s4    		c      	      s   g  | D] }   j  |  ^ q } t   f d   | D  rB d S  j j j   |  } | o g    j D]8 } g  t |  D] \ } } | | | |  ^ q} ^ qj | S(   s6   
        here items is a list of dictionaries
        c         3   s+   |  ]! }   j  D] } | |  Vq q d  S(   N(   R   (   Rn   Ro   Rv   (   R)   (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pys	   <genexpr>U  s    i    (   R3  R>  R   R   t   bulk_insertR   t	   enumerate(   R)   RH   Ro   R?  Rv   R=   (    (   R)   s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRK  P  s    " Lc         C   s   |  j  j j |  |  S(   N(   R   R   t	   _truncate(   R)   R~   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRM  Z  s    c         C   s   |  j  j j |  |  S(   N(   R   R   t   truncate(   R)   R~   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRN  ]  s    s   <NULL>t   uuidc   "   
      s  | j  d d  } | j  d d  }	 | j  d t j  }
 | j  d t  } | re  j  j   n  t j | d | d |	 d |
 } d } t | t	  r  j
 | k r i  |  j
 <n  |  j
 } n    f d   }  f d   } t } d } xt |  D]\ } } | sPn  | sg  | D] } | j d	 d
  d ^ q$t |   } g  d } } xt |  D]_ \ } } | |  r| } n) |  j k r| j |  | f  n  | | k rj| } qjqjWqg  } xm | D]e \ } } y$ | j | | | | | |   Wqt k
 rAt d | d
 | | | f   qXqW| pg| d k pg| d k pg| st | |  }  j t	 |    } | rt } | | k r| | n d |  j
 <n  x | | |  j
 k  r j  j  | | | k  j    j t	 |    } qWn | s= j t	 |    } n} | | }  j  | | k }   j |   j   j   }! |! r|! j t	 |    |!  j j } n  j t	 |    } | r| d k	 r| | t | |  <qqWd S(   s  
        Import records from csv file.
        Column headers must have same names as table fields.
        Field 'id' is ignored.
        If column names read 'table.file' the 'table.' prefix is ignored.

        - 'unique' argument is a field which must be unique (typically a
          uuid field)
        - 'restore' argument is default False; if set True will remove old values
          in table first.
        - 'id_map' if set to None will not map ids

        The import will keep the id numbers in the restored table.
        This assumes that there is an field of type id that is integer and in
        incrementing order.
        Will keep the id numbers in restored table.
        t	   delimiterR$  t	   quotechart   "t   quotingt   restorec            s1  d } |   k r d  } n	|  j d k r< t j |  } n|  j d k sZ |  j d k r~ | j   so d  } q$t |  } n|  j d k r | j   s d  } q$t |  } ns|  j j d  r t |  } nR|  j j |  r[|  j t	 |  j   } | d  k	 r9g  t |  D] } | | t |  ^ q} q$g  t |  D] } | ^ qF} n |  j j d  r|t
 |  } n | r|  j j d	  ry% | |  j d
 j   t |  } Wq$t k
 rq$XnT | r$|  j j d	  r$y% | |  j d
 j   t |  } Wq$t k
 r q$Xn  |  j | f S(   Ns   list:referenceR%   t   doubleR[   t   integerR   s   list:strings   list:R   i	   (   s   integers   bigint(   R:   R   t   base64t	   b64decodeR   R[   RP   R   R   RF   R   R2   R6   (   Rr   RD   t   id_mapt	   id_offsett   list_reference_st	   ref_tableR?   (   t   null(    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   fix  sD    			-"%%c            s%   |    k r   |  j  d k St Sd  S(   NRM   (   R   RQ   (   t   colname(   R)   (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   is_id  s    R   i   is+   Unable to parse line:%s field:%s value:'%s'i    N(   R9   t   csvt   QUOTE_MINIMALRQ   R   RN  t   readerR:   R/   RU   R1   R   RL  t   splitRF   R   R`   t
   ValueErrorR   RP   R   R#  R  R  RE  R   R6   ("   R)   t   csvfileRY  R]  R   RZ  R*   R+   RP  RQ  RS  RT  Rc  Rx   t   id_map_selfR^  R`  R  t
   unique_idxt   linenot   lineRu   t   colst   cidt   iR_  RH   Rr   t   csv_idt   curr_idt   new_idt   unique_valueR   R  (    (   R]  R)   s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   import_from_csv_file`  sr    '3	$#$&(
c         C   s   t  d t |   d g  d |  j d |  j d |  j d |  j d |  j d |  j  } xM |  D]E } | j sw | j	 sw | rX | d j
 | j d	 | d
 |   qX qX W| S(   NR7   R   R   R   R   R   R   R   t   flatt   sanitize(   RU   R8   R   R   R   R   R   R   R   R   R`   RL   (   R)   Rs  Rt  t   table_as_dictRr   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRL     s    					c         C   sL   |  j  j d  s! t d   n  |  j d t d |  } |  j  j d |  S(   Nt   xmls   No xml serializers availableRs  Rt  (   R   t   has_serializert   ImportErrorRL   R   R   (   R)   Rt  Rl   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRy      s    c         C   sL   |  j  j d  s! t d   n  |  j d t d |  } |  j  j d |  S(   NR   s   No json serializers availableRs  Rt  (   R   Rw  Rx  RL   R   R   (   R)   Rt  Rl   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    c         C   sL   |  j  j d  s! t d   n  |  j d t d |  } |  j  j d |  S(   Nt   yamls   No YAML serializers availableRs  Rt  (   R   Rw  Rx  RL   R   R   (   R)   Rt  Rl   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   as_yaml  s    c         C   s   |  j  j j |  |  S(   N(   R   R   t   alias(   R)   R{  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt
   with_alias  s    c         C   s   t  |  j |  j j j |  |  S(   N(   t
   ExpressionR   R   t   ON(   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   on  s    N(4   R   R   R   R   t   propertyR   R(   R:   R   R   R  RQ   R  R  RB   R   R   R   R   R"  R   R   R   RH   RJ   RK   R   R   R(  R)  R*  R+  R3  R;  R<  R=  R   RA  RD  RG  RJ  RK  RM  RN  Rr  R   RL   Ry   R   Rz  R|  R  (    (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR0      sh   		$		*		"											4				
	# 	
	R}  c           B   s  e  Z d; d; d; d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 d   Z d	   Z d
   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z  d   Z! d   Z" d    Z# d!   Z$ e% d"  Z& d#   Z' d$   Z( d%   Z) d&   Z* d'   Z+ e, e, d(  Z- d)   Z. d* d+ d, d-  Z/ d.   Z0 d/   Z1 d0   Z2 d1   Z3 d2   Z4 d3   Z5 d4   Z6 d5   Z7 d6   Z8 d7   Z9 d8   Z: d9   Z; d:   Z< RS(<   c         K   sz   | |  _  | |  _ | |  _ | |  _ t | d d   |  _ | rd | rd t | d  rd | j |  _ n	 | |  _ | |  _	 d  S(   NR   R   (
   R   t   opR  t   secondR   R:   R   R|   R   t   optional_args(   R)   R   R  R  R  R   R  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    
					c         C   s(   |  j  } t | | j j |  d |  j  S(   Nt   SUM(   R   R}  R   t	   AGGREGATER   (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   sum1  s    	c         C   s(   |  j  } t | | j j |  d |  j  S(   Nt   MAX(   R   R}  R   R  R   (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   max5  s    	c         C   s(   |  j  } t | | j j |  d |  j  S(   Nt   MIN(   R   R}  R   R  R   (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   min9  s    	c         C   s%   |  j  } t | | j j |  d  d  S(   NRV  (   R   R}  R   t   LENGTHR:   (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRF   =  s    	c         C   s(   |  j  } t | | j j |  d |  j  S(   Nt   AVG(   R   R}  R   R  R   (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   avgA  s    	c         C   s(   |  j  } t | | j j |  d |  j  S(   Nt   ABS(   R   R}  R   R  R   (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   absE  s    	c         C   s(   |  j  } t | | j j |  d  |  j  S(   N(   R   R}  R   t   LOWERR:   R   (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   I  s    	c         C   s(   |  j  } t | | j j |  d  |  j  S(   N(   R   R}  R   t   UPPERR:   R   (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   upperM  s    	c         C   s.   |  j  } t | | j j |  | | f |  j  S(   N(   R   R}  R   t   REPLACER   (   R)   R  R  R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRh   Q  s    	c         C   s%   |  j  } t | | j j |  d d  S(   Nt   yearRV  (   R   R}  R   t   EXTRACT(   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR  U  s    	c         C   s%   |  j  } t | | j j |  d d  S(   Nt   monthRV  (   R   R}  R   R  (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR  Y  s    	c         C   s%   |  j  } t | | j j |  d d  S(   Nt   dayRV  (   R   R}  R   R  (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR  ]  s    	c         C   s%   |  j  } t | | j j |  d d  S(   Nt   hourRV  (   R   R}  R   R  (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR  a  s    	c         C   s%   |  j  } t | | j j |  d d  S(   Nt   minuteRV  (   R   R}  R   R  (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   minutese  s    	c         G   s(   |  j  } t | | j j |  | |  j  S(   N(   R   R}  R   t   COALESCER   (   R)   t   othersR   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   coalescei  s    	c         C   s(   |  j  } t | | j j |  d  |  j  S(   N(   R   R}  R   t   COALESCE_ZEROR:   R   (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   coalesce_zerom  s    	c         C   s%   |  j  } t | | j j |  d d  S(   NR  RV  (   R   R}  R   R  (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   secondsq  s    	c         C   s%   |  j  } t | | j j |  d  d  S(   NRV  (   R   R}  R   t   EPOCHR:   (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   epochu  s    	c         C   s  t  | t  r | j } | j } |  j } | d k  rY d |  j   t |  d f } n
 | d } | d  k s~ | t j	 k r |  j   } nF | d k  r d |  j   t |  d | f } n d | d | f } t
 | | j j |  | | f |  j  S|  | | d !Sd  S(   Ni    s	   (%s - %d)i   s   (%s - %d - %s)s	   (%s - %s)(   R/   t   slicet   startt   stopR   RF   R  R:   t   syst   maxintR}  R   t	   SUBSTRINGR   (   R)   Rm  R  R  R   t   pos0t   length(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRB   y  s    			#
&c         C   s   |  j  j j |  |  j  S(   N(   R   R   t   expandR   (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    c         C   s(   |  j  } t | | j j |  | |  j  S(   N(   R   R}  R   t   COMMAR   (   R)   RR   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __or__  s    	c         C   sS   |  j  } t |  d  r4 |  j | j j k r4 |  j St | | j j |  d |  j S(   Nt   _opR   (   R   R|   R  R   t   INVERTR  R}  R   (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt
   __invert__  s    	$c         C   s(   |  j  } t | | j j |  | |  j  S(   N(   R   R}  R   t   ADDR   (   R)   RR   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __add__  s    	c         C   s   |  j  } |  j d
 k r! d } nB |  j d k r9 d } n* |  j j d  rW |  j } n t d	   t | | j j |  | |  S(   NRV  R   Re   Rf   Rd   RU  R[   s   decimal(s,   subtraction operation not supported for type(   s   integers   bigint(   s   dates   times   datetimes   doubles   float(   R   R   R   R   R}  R   t   SUB(   R)   RR   R   t   result_type(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __sub__  s    			c         C   s(   |  j  } t | | j j |  | |  j  S(   N(   R   R}  R   t   MULR   (   R)   RR   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __mul__  s    	c         C   s(   |  j  } t | | j j |  | |  j  S(   N(   R   R}  R   t   DIVR   (   R)   RR   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __div__  s    	c         C   s(   |  j  } t | | j j |  | |  j  S(   N(   R   R}  R   t   MODR   (   R)   RR   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __mod__  s    	c         C   s"   |  j  } t | | j j |  |  S(   N(   R   R  R   t   EQ(   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRS     s    	c         C   s"   |  j  } t | | j j |  |  S(   N(   R   R  R   t   NE(   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRT     s    	c         C   s"   |  j  } t | | j j |  |  S(   N(   R   R  R   t   LT(   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __lt__  s    	c         C   s"   |  j  } t | | j j |  |  S(   N(   R   R  R   t   LE(   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __le__  s    	c         C   s"   |  j  } t | | j j |  |  S(   N(   R   R  R   t   GT(   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __gt__  s    	c         C   s"   |  j  } t | | j j |  |  S(   N(   R   R  R   t   GE(   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __ge__  s    	c         C   s:   |  j  } | r | j j p$ | j j } t | | |  |  S(   N(   R   R   t   LIKEt   ILIKER  (   R)   RD   t   case_sensitiveR   R  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   like  s    	c         C   s   |  j  | d t S(   NR  (   R  RQ   (   R)   RD   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   ilike  s    c         C   s"   |  j  } t | | j j |  |  S(   N(   R   R  R   t   REGEXP(   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   regexp  s    	c         O   s   |  j  } t |  d k r( | d } n  t | t  rX | |  j | j j j  } ni t | t  s t	 |  } | j
 d  r d | k r | j d  |  d k t | | j j |  |  BSn  t | | j j |  |  S(   sB  
        Accepts the following inputs::

           field.belongs(1,2)
           field.belongs((1,2))
           field.belongs(query)

        Does NOT accept:

               field.belongs(1)

        If the set you want back includes `None` values, you can do::

            field.belongs((1,None), null=True)

        i   i    R]  N(   R   RF   R/   R  t   _selectR  R   R   t
   basestringR_   R9   R:   t   removeR   t   BELONGS(   R)   RD   t   kwattrR   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   belongs  s    	!&c         C   s@   |  j  } |  j d k r' t d   n  t | | j j |  |  S(   NR!   R$   R   R#   s,   startswith used with incompatible field type(   s   strings   texts   jsons   upload(   R   R   R   R  R   t
   STARTSWITH(   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    	c         C   s@   |  j  } |  j d k r' t d   n  t | | j j |  |  S(   NR!   R$   R   R#   s*   endswith used with incompatible field type(   s   strings   texts   jsons   upload(   R   R   R   R  R   t   ENDSWITH(   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   endswith   s    	c      
   C   s   |  j  } t | t t f  r g  | D]- } t |  r% |  j t |  d | ^ q% } | sk |  j d  St | rz t p} t |  Sn  |  j	 d	 k r |  j	 j
 d  r t d   n  t | | j j |  | d | S(
   sG   
        For MongoDB and GAE contains is always case sensitive
        R  R   R!   R$   R   R#   s   list:s*   contains used with incompatible field type(   s   strings   texts   jsons   upload(   R   R/   R]   R^   R8   t   containsR   R	   R
   R   R   R   R  R   t   CONTAINS(   R)   RD   t   allR  R   R?   t
   subqueries(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR    s    	7"c         C   s(   |  j  } t | | j j |  | |  j  S(   N(   R   R}  R   t   ASR   (   R)   R{  R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR|    s    	i   i    i   c         C   s7   t  |  j |  j j j |  t d | d | d |  d  S(   Nt	   precisiont   optionst   versionR!   (   R}  R   R   t   ST_ASGEOJSONRU   (   R)   R  R  R  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   st_asgeojson  s    c         C   s%   |  j  } t | | j j |  d d S(   NR   R!   (   R   R}  R   t	   ST_ASTEXT(   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt	   st_astext!  s    	c         C   s%   |  j  } t | | j j |  d d S(   NR   R!   (   R   R}  R   t   ST_X(   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   st_x%  s    	c         C   s%   |  j  } t | | j j |  d d S(   NR   R!   (   R   R}  R   t   ST_Y(   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   st_y)  s    	c         C   s%   |  j  } t | | j j |  | d  S(   NRU  (   R   R}  R   t   ST_DISTANCE(   R)   RR   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   st_distance-  s    	c         C   s(   |  j  } t | | j j |  | |  j  S(   N(   R   R}  R   t   ST_SIMPLIFYR   (   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   st_simplify1  s    	c         C   s(   |  j  } t | | j j |  | |  j  S(   N(   R   R}  R   t   ST_SIMPLIFYPRESERVETOPOLOGYR   (   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   st_simplifypreservetopology5  s    	c         C   s"   |  j  } t | | j j |  |  S(   N(   R   R  R   t   ST_CONTAINS(   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   st_contains;  s    	c         C   s"   |  j  } t | | j j |  |  S(   N(   R   R  R   t	   ST_EQUALS(   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt	   st_equals?  s    	c         C   s"   |  j  } t | | j j |  |  S(   N(   R   R  R   t   ST_INTERSECTS(   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   st_intersectsC  s    	c         C   s"   |  j  } t | | j j |  |  S(   N(   R   R  R   t   ST_OVERLAPS(   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   st_overlapsG  s    	c         C   s"   |  j  } t | | j j |  |  S(   N(   R   R  R   t
   ST_TOUCHES(   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt
   st_touchesK  s    	c         C   s"   |  j  } t | | j j |  |  S(   N(   R   R  R   t	   ST_WITHIN(   R)   RD   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt	   st_withinO  s    	c         C   s(   |  j  } t | | j j |  | | f  S(   N(   R   R  R   t
   ST_DWITHIN(   R)   RD   t   distanceR   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt
   st_dwithinS  s    	N(=   R   R   R:   R   R  R  R  RF   R  R  R   R  Rh   R  R  R  R  R  R  R  R  R  RB   R   R  R  R  R  R  R  R  RS   RT   R  R  R  R  R   R  R  R  R  R   R  RQ   R  R|  R  R  R  R  R  R  R  R  R  R  R  R  R  R  (    (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR}    st   																																																			R   c           B   s&   e  Z d d  d d d  Z d   Z RS(   R!   c         C   s   | r | | f n	 d | f \ |  _  |  _ | |  _ | pQ |  j  j   j d d  |  _ d  d  |  _ t |  _	 d  |  _
 t |  _ t |  _ d  |  _ d  |  _ | |  _ d  |  _ d  S(   Nt   unknownR   RX   c         S   s   |  S(   N(    (   R?   t   r(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   ^  s    (   R6   Rv   R   R   Rh   R   R:   t	   representR   t	   formattert   commentR   R   RQ   R   t   requirest   widgetR7   t
   filter_out(   R)   R6   Rv   t   ftypeR   t
   table_name(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   Y  s    *	$							c         C   s   d |  j  |  j f S(   Ns   %s.%s(   R7   R6   (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   g  s    N(   R   R   R:   R   R   (    (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   X  s   R   c           B   s   e  Z d d d   Z RS(   c         C   s7   | r | | f n	 d | f \ |  _  |  _ | |  _ d  S(   NR  (   R6   Rv   t   handler(   R)   R6   Rv   R  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   l  s    *N(   R   R   R:   R   (    (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   k  s   R5   c            B   s@  e  Z e Z e Z e Z d  d e e	 e d e	 e	 e
 d d d e
 e
 d d e	 d d e	 d d d d d d d d d d d d  Z d   Z e	 d  Z d d d  Z d e	 d  Z d d  Z d   Z d	   Z d d
  Z e	 e
 d  Z e
 d  Z e
 d  Z e
 d  Z d   Z d   Z e d    Z e d    Z RS(   R!   t   CASCADEc!   !   	   C   s  d  |  _ |  _ d  |  _ d  |  _ d  |  _ t | t  rm y t |  } Wqm t	 k
 ri t
 d   qm Xn  t |  |  _ } t | t  s t t |  s | d d k s d | k s t j |  r t
 d |   n  t | t t f  s | |  _ n d | |  _ | d  k	 r| n t j |  j d  |  _ | t k rG| n	 | pPd  |  _ | |  _ | j   |  _ | |  _ |	 |  _ |
 |  _ | |  _ | |  _ | |  _  | |  _! | |  _" | |  _# | |  _$ | |  _% | |  _& | |  _' | d  k r| d k rt( n | |  _) | |  _* t+ |  _, | |  _- | |  _. | |  _/ | |  _0 | |  _1 | |  _2 | |  _3 | d  k	 rm| n | j4 d d
  j5   |  _6 | d  k	 r| n g  |  _7 | |  _8 |  |  _9 d  S(   Ns!   Field: invalid unicode field namei    R   R   s:   Field: invalid field name: %s, use rname for "funny" namess   reference %si   s   list:integers   list:stringRX   (   s   list:integers   list:string(:   R:   R   R   R  R  R  R/   RY   R8   t   UnicodeEncodeErrorR   R   R6   R|   R0   R   R;   R5   R   t   DEFAULTLENGTHR9   R  R   RE   R.  R  t   ondeleteR   R   R   t   uploadfoldert   uploadseparateR   R  R  R   R   R(   t	   authorizet
   autodeleteR   R  R-  R   t   isattachmentt   custom_storet   custom_retrievet   custom_retrieve_file_propertiest   custom_deleteR,  R  t   custom_qualifierRh   t   titleR   R   t   map_noneR   (!   R)   R   R   R  RE   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   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     sf    #			*!																								c         O   s   |  j  j | |   d  S(   N(   R'   R(   (   R)   R*   t
   attributes(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   set_attributes  s    c         K   sO   t  j  |   } | r; | j d | j k r; d | | _ n  | j j |  | S(   Ns   reference %s(   Ra   R   R1   R'   R(   (   R)   R   R*   Rr   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    c         C   s  |  j  r |  j  | | |  St | t j  rI | p: | j } | j } n | s[ | j } n  t j j	 | j
 d t j  j
 d t j   } t j |  } | r | j d  p d } |  j j   j
 d d  d } t j |  j   } d |  j |  j | | f } | |  j d	 t |   d
 | } |  j }	 t |	 t  ry|	 j }
 i | |	 j 6| j   |
 6} |	 j j |   nM|	 t k r| rnN |  j r|  j } n9 |  j j j  rt! |  j j j  d d  } n t" d   |  j# r&|  j$ rt" d   n  t! | d |  j |  j f | d   } n  t% |  sBt j& |  n  t! | |  } |  j$ rr|  j$ j' | d  } n t' | d  } y t( j) | |  Wn! t* k
 rt* d |   n X| j+   n  | S(   Nt   /s   \t   et   txtt   -R   is   %s.%s.%s.%si   R   s   ..t   uploadss.   you must specify a Field(...,uploadfolder=...)s   not supporteds   %s.%si   t   wbsa   Unable to store file "%s" because invalid permissions, readonly file system, or filename too long(,   R  R/   t   cgit   FieldStorageR5  R4  R6   t   ost   patht   basenameRh   t   sepR   t   searchR<   R   RO  RW  t	   b16encodeR   R1   R  RF   R   R5   R7  R   R   R   R
  R   R   t   folderR   R   R  R   R   t   makedirst   opent   shutilt   copyfileobjt   IOErrort   close(   R)   R4  R5  R!  R@   t	   extensiont   uuid_keyt   encoded_filenamet   newfilenamet   self_uploadfieldt   blob_uploadfield_nameRG   t   pathfilenamet	   dest_file(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR8    sb    	0#							 	c         C   s|  |  j  } |  j r" |  j | |  S|  j s: t | t  rm |  j |  | k  j   j   } | sm t  qm n  |  j r |  j |  r t	  n  |  j
 | |  } | d } t | t  r t j | | p d  } n t | t  r| j  }	 | | k }
 | j |
  |	 } t j |  } nS |  j r@|  j j | d  } n2 t | d |  } | rc| | f St | d  } | | f S(   sk   
        If `nameonly==True` return (filename, fullfilename) instead of
        (filename, stream)
        R5  R   t   rbR!  (   R   R  R  R/   R8   R   R  R  R   R   t   retrieve_file_propertiesR    R5   R   R   R(  R   (   R)   R6   R!  t   nameonlyR1  Rm   t   file_propertiesR5  R:  R2  R   R6  t   fullname(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   retrieve/  s2    		!	
		
c   	      C   s  t  j |  } | s  |  j r3 t d |   n  |  j } |  j rU |  j | |  S| j d  r y1 t j | j d  t	  } t
 j d |  } Wq t t f k
 r | } q Xn | } t | t t f  r t d d  d |  S| s|  j r|  j } qt |  j j j d d  } n  |  j rx| j d  } | j d	  } | j d
  } t | d | | f | d   } n  t d | d |  S(   Ns!   Can't retrieve %s file propertiesR6   R   R!  R5  s   ..R  R   Rr   t   uuidkeys   %s.%si   (   R   R;   R  R4   R   R  R<   RW  t	   b16decodeR   R   t   subR3   R/   R8   R5   RU   R:   R
  R   R   R   R&  R  (	   R)   R6   R!  R@   R1  R5  R   Rv   t   u(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR6  S  s2    				#c         C   s   |  j  } | d  k r |  j S| s& | St | t t f  sG | g } n- t | t  re t |  } n t j |  } | j   x/ | D]' } t | d  r | j	 |  } q q W| S(   NR  (
   R   R:   R  R/   R]   R^   Ra   t   reverseR|   R  (   R)   RD   R   Ro   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR  r  s    	
c         C   s   |  j  s |  j  t k r8 | |  j k r. | n d  d  f S|  j  } t | t t f  sb | g } n  x0 | D]( } | |  \ } } | ri | | f Sqi W| |  j k r | n d  d  f S(   N(   R   R   R  R:   R/   R]   R^   (   R)   RD   R   t	   validatorR   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    	c         C   s"   t  |  j |  j j j |  | d  S(   NRV  (   R}  R   R   t   COUNT(   R)   t   distinct(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   count  s    c            s   d" } t  t t t t t t d   f     f d      t   } | oX |  j	 pW |  j
 s xW | D]O } | r | j i   t |  |   | 6 qb | j i t |  |  | 6 qb W| j d  | d! <n  | S(#   NR6   R  R  R	  R  R  R  R  R  R  R   R(   R  R   R
  R  R   R   R-  R  RE   R   R.  R   R   R  R   R  R   R  R,  c            s   t  |  t  r/ t   f d   |  j   D  St  |  t t t f  rd g  |  D] }   |  ^ qN St  |    rw |  St  |  t j t j t j f  r t	 |   Sd  Sd  S(   Nc         3   s-   |  ]# \ } }   |    |  f Vq d  S(   N(    (   Rn   R=   R?   (   t   flatten(    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pys	   <genexpr>  s    (   R/   RU   RH   R^   R]   R_   Rd   Re   Rf   R8   R:   (   t   objR?   (   RD  t   serializable(    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRD    s     
R   (   s   names	   authorizes	   represents   ondeletes   custom_stores
   autodeletes   custom_retrieves
   filter_outs   uploadseparates   widgets   uploadfss   updates   custom_deletes   uploadfields   uploadfolders   custom_qualifiers   uniques   writables   computes   map_nones   defaults   types   requireds   readables   requiress   comments   labels   lengths   notnulls   custom_retrieve_file_propertiess	   filter_in(   RZ   RP   R  R[   R^   R\   R   R:   RU   R   R   R(   R   R  (   R)   Rs  Rt  t   attrsRl   t   attr(    (   RD  RF  s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRL     s&           	&!c         C   sL   |  j  j d  s! t d   n  |  j d t d |  } |  j  j d |  S(   NRv  s   No xml serializers availableRs  Rt  (   R   Rw  Rx  RL   R   R   (   R)   Rt  Rl   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRy     s    c         C   sL   |  j  j d  s! t d   n  |  j d t d |  } |  j  j d |  S(   NR   s   No json serializers availableRs  Rt  (   R   Rw  Rx  RL   R   R   (   R)   Rt  Rl   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    c         C   sL   |  j  j d  s! t d   n  |  j d t d |  } |  j  j d |  S(   NRy  s   No YAML serializers availableRs  Rt  (   R   Rw  Rx  RL   R   R   (   R)   Rt  Rl   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRz    s    c         C   s   t  S(   N(   R   (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    c         C   s.   y d |  j  |  j f SWn d |  j SXd  S(   Ns   %s.%ss   <no table>.%s(   R7   R6   (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    c         C   sA   |  j  r6 |  j  j d |  j p4 |  j j j |  j  Sd |  j S(   NR   s   <no table>.%s(   R   R(  R   R   R   t   sqlsafe_fieldR6   (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR(    s    	 c         C   s   |  j  p |  j j j |  j  S(   N(   R   R   R   RI  R6   (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   sqlsafe_name  s    N(   R   R   R   t   VirtualR   t   Methodt   LazyR:   R   RQ   R   R   R  R   R8  R:  R6  R  R   RC  RL   Ry   R   Rz  R   R   R  R(  RJ  (    (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR5   r  sd   !9	6$		$		R  c           B   s   e  Z d  Z d d e d  Z d   Z d   Z d   Z e Z	 d   Z
 e
 Z d   Z d   Z d   Z d	 d
 d  Z e e d  Z e d  Z e d  Z RS(   s   
    Necessary to define a set.
    It can be stored or can be passed to `DAL.__call__()` to obtain a `Set`

    Example:
        Use as::

            query = db.users.name=='Max'
            set = db(query)
            records = set.select()

    c         K   sA   | |  _  |  _ | |  _ | |  _ | |  _ | |  _ | |  _ d  S(   N(   R   R   R  R  R  t   ignore_common_filtersR  (   R)   R   R  R  R  RN  R  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    					c         C   s*   d d l  m } d | j |  j j |   S(   Ni   (   t   BaseAdapters
   <Query %s>(   t   adapters.baseRO  R  R   R   (   R)   RO  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    c         C   s   t  |  j j j |    S(   N(   R8   R   R   R  (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    c         C   s   t  |  j |  j j j |  |  S(   N(   R  R   R   R	   (   R)   RR   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __and__  s    c         C   s   t  |  j |  j j j |  |  S(   N(   R  R   R   R
   (   R)   RR   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR  	  s    c         C   s;   |  j  |  j j j k r |  j St |  j |  j j j |   S(   N(   R  R   R   t   NOTR  R  (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR    s    c         C   s   t  |   t  |  k S(   N(   t   repr(   R)   RR   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRS     s    c         C   s   |  | k S(   N(    (   R)   RR   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRT     s    i   i    c         C   s   |  j  j j |  | |  S(   N(   R   R   t   CASE(   R)   R   Rv   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   case  s    c      
      s]   t  t t t t t t t t d  t
 f
       f d    | rR   j  S j Sd S(   s  Experimental stuff

        This allows to return a plain dictionary with the basic
        query representation. Can be used with json/xml services
        for client-side db I/O

        Example:
            Usage::

                q = db.auth_user.id != 0
                q.as_dict(flat=True)
                {
                "op": "NE",
                "first":{
                    "tablename": "auth_user",
                    "fieldname": "id"
                    },
                "second":0
                }
        c            s  t    } x{|  j   D]m\ } } | d k r t |  j  rV  | j  | | <qt | t  r i | j d 6| j d 6| | <qt | t  r  | j  | | <qt |    r | | | <qt | t	 j
 t	 j t	 j	 f  rt |  | | <qq | d k rEt |  r&| j | | <qt | t  r| | | <qq t |    r t | t   rv |  | | <q| | | <q q W| S(   NR  R  R7   R   R  (   s   firsts   second(   RU   RH   R/   t	   __class__R'   R5   R1   R6   R}  Rd   Re   Rf   RY   Rq   R   R  (   Rl   t   newdR=   R?   (   Rk   t   loopR)   (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRX  5  s6    	N(   R^   RU   R_   R]   RZ   RP   R[   R  R   R:   R\   R'   (   R)   Rs  Rt  (    (   Rk   RX  R)   s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRL     s    c         C   sL   |  j  j d  s! t d   n  |  j d t d |  } |  j  j d |  S(   NRv  s   No xml serializers availableRs  Rt  (   R   Rw  Rx  RL   R   R   (   R)   Rt  Rl   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRy   Y  s    c         C   sL   |  j  j d  s! t d   n  |  j d t d |  } |  j  j d |  S(   NR   s   No json serializers availableRs  Rt  (   R   Rw  Rx  RL   R   R   (   R)   Rt  Rl   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   _  s    N(   R   R   R   R:   RQ   R   R   R   RQ  t   __rand__R  t   __ror__R  RS   RT   RU  R   RL   Ry   R   (    (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR    s"   
							=R   c           B   s   e  Z d  Z d d  Z d   Z e d  Z d d  Z d   Z	 d   Z
 d   Z e e d  Z e d	  Z e d
  Z d   Z d   Z d   Z d d d  Z d   Z d   Z d   Z d   Z d   Z d   Z d d  Z RS(   s  
    Represents a set of records in the database.
    Records are identified by the `query=Query(...)` object.
    Normally the Set is generated by `DAL.__call__(Query(...))`

    Given a set, for example::

        myset = db(db.users.name=='Max')

    you can::

        myset.update(db.users.name='Massimo')
        myset.delete() # all elements in the set
        myset.select(orderby=db.users.id, groupby=db.users.name, limitby=(0,10))

    and take subsets:

       subset = myset(db.users.id<5)

    c         C   s   | |  _  | |  _ d  |  _ t | t  r< |  j |  } n  | d  k	 ru t |  | k ru t j |  } | | _	 n  | |  _
 d  S(   N(   R   R   R:   t   dqueryR/   RU   t   parseR   Ra   RN  R   (   R)   R   R   RN  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   }  s    			c         C   s-   d d l  m } d | j |  j j |  j  S(   Ni   (   RO  s   <Set %s>(   RP  RO  R  R   R   R   (   R)   RO  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    c         C   s   | d  k r |  St | t  r7 |  j j j |  } nB t | t  r[ t |  j |  } n t | t  ry | d  k } n  |  j	 r t
 |  j |  j	 | @d | St
 |  j | d | Sd  S(   NRN  (   R:   R/   R0   R   R   t   id_queryR8   R}  R5   R   R   (   R)   R   RN  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    	c         C   s   |  j  j j |  j |  S(   N(   R   R   t   _countR   (   R)   RB  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR^    s    c         O   s   |  j  j } | j |  j | j d d   | j d d   | j d d   | j d d    } | j | |  } | j |  j | |  S(   NRp   t   leftR  t   groupby(   R   R   R   R   R9   R:   t
   expand_allR  (   R)   R   R  t   adaptert
   tablenames(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR    s    c         C   s4   |  j  } | j j |  j  } | j j | |  j  S(   N(   R   R   t	   get_tableR   t   _delete(   R)   R   R7   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRe    s    	c         K   sP   |  j  } | j j |  j  } | | j | d t } | j j | |  j |  S(   NR(   (   R   R   Rd  R   R3  R   t   _update(   R)   t   update_fieldsR   R7   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRf    s    	c         C   s   | r d  } } } |  j j } | sR |  j j t |  j  |  j j } } } n  i |  j j d |  d 6} i | d 6| d 6| d 6| d 6| d <| S|  j Sd  S(   NRs  R   t   uidt   codecR6   t   uriR   (	   R:   R   t	   _db_codect   _dbnameR8   t   _db_uidR   RL   R'   (   R)   Rs  Rt  Rh  t   dbnameRj  Ri  Rl   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRL     s    c         C   sL   |  j  j d  s! t d   n  |  j d t d |  } |  j  j d |  S(   NRv  s   No xml serializers availableRs  Rt  (   R   Rw  Rx  RL   R   R   (   R)   Rt  Rl   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRy     s    c         C   sL   |  j  j d  s! t d   n  |  j d t d |  } |  j  j d |  S(   NR   s   No json serializers availableRs  Rt  (   R   Rw  Rx  RL   R   R   (   R)   Rt  Rl   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    c         C   s   | |  _  |  j |  j   S(   s3   Experimental: Turn a dictionary into a Query object(   R[  t   build(   R)   R[  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR\    s    	c         C   s  | d | d | j  d d4  } } } d4 } } } | d5 k r t |  t |  f t t f k su t d   n  | d k r |  j |  |  j |  @} q|  j |  |  j |  B} nS| d k r | d4 k r t d   n  |  j |  } nx i | d	 6| d
 6j   D] \ } }	 t |	 t  rP|	 j  d  rP|  j |	  }	 n  t |	 t  rd |	 k r|  j |	 d |	 d }	 n  | d	 k r|	 } q|	 } qWt	 |  j j
 |  rt |  j j
 |  }
 n  | d k r| | k } n$| d k r	| | k } n	| d k r$| | k } n | d k r?| | k } n | d k rZ| | k  } n | d k ru| | k } n | d6 k rt |  j |
  } n| | d7 k rt |  j |
 |  } nX | d8 k rt |  j |
 | |  } n1 | p| st |  j |  } n t d3 |   | S(9   s   Experimental: see .parse()R  R  R  R	   R
   s   Invalid AND/OR queryRR  s   Invalid NOT queryR_  t   rightR7   R   R  R  R  R  R  R  t   JOINt	   LEFT_JOINt   RANDOMt
   ALLOW_NULLR  R  R  t   PRIMARY_KEYR  t   RAWR  RA  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R~  R  t   NOT_NULLR  R  R  s   Operator not supported: %sN(   s   ANDs   OR(   Rq  Rr  Rs  Rt  (   s   LOWERs   UPPERs   EPOCHRu  s   COALESCE_ZERORv  s   INVERT(   s   COUNTs   EXTRACTs	   AGGREGATEs	   SUBSTRINGs   REGEXPs   LIKEs   ILIKEs
   STARTSWITHs   ENDSWITHs   ADDs   SUBs   MULs   DIVs   MODs   ASs   ONs   COMMARw  s   COALESCEs   CONTAINSs   BELONGS(   R9   R:   R   RU   R   Ro  RH   R/   R   R|   R   R   R}  (   R)   Rl   R  R  R  R_  Rp  t   builtR=   R?   t   opm(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRo    sd    $' 	
      	   	 c         C   s   |  j  d d d t  S(   NR  i    i   R  (   i    i   (   R  RQ   (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   isempty  s    c            s   |  j    | r |  j d |  } t | t  r | d } | d } | j d  } | s   j d | } t |  j   } q n/ | \ } }   j d | } t |  j   } | | |  |   f d  |  S  j j	 |  j
 |  S(   NRB  t   modelt
   expirationR>   R  c            s     j  j |  j |  S(   N(   R   RC  R   (   R)   RB  (   R   (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,      s    (   R   R^  R/   RU   R9   t   _uriR   t	   hexdigestR   RC  R   (   R)   RB  t   cachet   sqlt   cache_modelt   time_expireR>   (    (   R   s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRC    s$    	

c         O   s   |  j  j } | j |  j | j d d   | j d d   | j d d   | j d d    } | j | |  } | j |  j | |  S(   NRp   R_  R  R`  (   R   R   R   R   R9   R:   Ra  R  (   R)   R   R  Rb  Rc  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR  %  s    c         O   s   t  |  j |  j | |    S(   N(   R}  R   R  (   R)   R   R  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   nested_select/  s    c            s     j  } | j j   j  } | | } t   f d   | j D  rK d S| j j |   j  } | o g  | j D] } |    ^ qs | S(   Nc         3   s   |  ] } |    Vq d  S(   N(    (   Rn   Rv   (   R)   (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pys	   <genexpr>6  s    i    (   R   R   Rd  R   R>  R   R#  R   (   R)   R   R7   R   R?  Rv   (    (   R)   s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR#  2  s    	
 &c            s     j  } | j j   j  } | | } | j   t    f d   | j D  r[ d S| j  d t } | s t	 d   n  | j j
 d | j   j |  } | o g  | j D] } |     ^ q | S(   Nc         3   s   |  ] } |     Vq d  S(   N(    (   Rn   Rv   (   R)   Rg  (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pys	   <genexpr>@  s    i    R(   s   No fields to updates   %s(   R   R   Rd  R   R;  R>  R   R3  R   R   R(   R1   R   (   R)   Rg  R   R7   R   R   R?  Rv   (    (   R)   Rg  s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR(   ;  s    	
"")c         K   su   |  j  j j |  j  } |  j  | } | j | d t } | sO t d   n  |  j  j j d | |  j |  } | S(   sY   
        Same as update but does not call table._before_update and _after_update
        R(   s   No fields to updates   %s(   R   R   Rd  R   R3  R   R   R(   (   R)   Rg  R7   R   R   R?  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   update_naiveI  s     "c            su   j  j j  j  } t   } t   | _ t j |    x^ | j   D]P \ } }  j  | | j |  \ } } | r d | | j | <qI |   | <qI W j  | } | j r d  | _
 n t    f d   | j D  sb| j    | j   d t } | st d   n   j  j j |  j |  }	 |	 o^g  | j D] }
 |
     ^ qFn d }	 |	 | _
 | S(   Ns   %sc         3   s   |  ] } |     Vq d  S(   N(    (   Rn   Rv   (   R/  R)   (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pys	   <genexpr>d  s    R(   s   No fields to updatei    (   R   R   Rd  R   R&   R   Ra   RK   R   R:   t   updatedR>  R   R;  R3  R   R   R(   R   (   R)   Rg  R7   R@  R>   RD   R   R   R   R?  Rv   (    (   R/  R)   s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRD  U  s,    	 	" ,	c      	   C   s  |  j  |  j  j j |  j  d } | r8 | j   } n	 | j } g  | D]? } | | j d k rH | | j t k rH | | j	 rH | ^ qH } | s t
 Sx;|  j g  | D] } | | ^ q   D]} x
| D]} | | } | j | d   } | s q n  | r| | | k rq n  | j r.| j |  q | j }	 |	 s[t |  j  j j d d  }	 n  | j r| j d  }
 t |	 d |
 d |
 d f |
 d d   }	 n  t |	 |  } t |  r t j |  q q Wq Wt
 S(	   Ni    R#   s   ..R  R   s   %s.%si   i   (   R   R   R   R   RG   R   R   R   R   R  RQ   R  R9   R:   R  R
  R   R&  R  Rd  R   R   t   unlink(   R)   t   upload_fieldsR   R   Rv   R  R   Rr   t   oldnameR
  RH   t   oldpath(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   o  sB    #	 -
			N(   R   R   R   R:   R   R   RQ   R   R^  R  Re  Rf  R   RL   Ry   R   R\  Ro  Rz  RC  R  R  R#  R(   R  RD  R   (    (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   f  s,   		
				6		
						t   LazyReferenceGetterc           B   s   e  Z d    Z d   Z RS(   c         C   s'   | j  | j | |  _ |  _ |  _ d  S(   N(   R   R1   R   R7   RM   (   R)   R   RM   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    c         C   s{   |  j  j t k r t    n  |  j  |  j } |  j  | } x0 | j D]% } | j | k rE t | |  j  SqE Wt    d  S(   N(	   R   t   _lazy_tablesRQ   R3   R7   R   R   t   LazySetRM   (   R)   t   other_tablenameR   t   other_tableR
  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    (   R   R   R   R   (    (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR    s   	R  c           B   s   e  Z d    Z d   Z d   Z e d  Z d d  Z d   Z	 d   Z
 d   Z d   Z d d d	  Z d
   Z d   Z d   Z d   Z d   Z d   Z d d  Z RS(   c         C   s7   | j  | j | j | f \ |  _  |  _ |  _ |  _ d  S(   N(   R   R1   R6   R7   R   RM   (   R)   Rr   RM   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    c         C   s0   |  j  |  j |  j |  j k } t |  j  |  S(   N(   R   R7   R   RM   R   (   R)   R   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   _getset  s     c         C   s   t  |  j    S(   N(   RS  R  (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    c         C   s   |  j    | |  S(   N(   R  (   R)   R   RN  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    c         C   s   |  j    j |  S(   N(   R  R^  (   R)   RB  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR^    s    c         O   s   |  j    j | |   S(   N(   R  R  (   R)   R   R  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR    s    c         C   s   |  j    j   S(   N(   R  Re  (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRe    s    c         K   s   |  j    j |   S(   N(   R  Rf  (   R)   Rg  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRf    s    c         C   s   |  j    j   S(   N(   R  Rz  (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRz    s    c         C   s   |  j    j | |  S(   N(   R  RC  (   R)   RB  R  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRC    s    c         O   s   |  j    j | |   S(   N(   R  R  (   R)   R   R  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR    s    c         O   s   |  j    j | |   S(   N(   R  R  (   R)   R   R  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR    s    c         C   s   |  j    j   S(   N(   R  R#  (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR#    s    c         K   s   |  j    j |   S(   N(   R  R(   (   R)   Rg  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR(     s    c         K   s   |  j    j |   S(   N(   R  R  (   R)   Rg  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR    s    c         K   s   |  j    j |   S(   N(   R  RD  (   R)   Rg  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRD    s    c         C   s   |  j    j |  S(   N(   R  R   (   R)   R  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    N(   R   R   R   R  R   RQ   R   R:   R^  R  Re  Rf  Rz  RC  R  R  R#  R(   R  RD  R   (    (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR    s"   													t   VirtualCommandc           B   s   e  Z d    Z d   Z RS(   c         C   s   | |  _  | |  _ d  S(   N(   t   methodRm   (   R)   R  Rm   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    	c         O   s   |  j  |  j | |  S(   N(   R  Rm   (   R)   R*   R+   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    (   R   R   R   R   (    (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR    s   	t   Rowsc           B   s^  e  Z d  Z d" g  g  e d" d  Z d   Z d   Z d   Z d   Z	 d   Z
 d   Z d   Z d	   Z d
   Z d   Z d" d  Z d   Z d   Z d" d  Z d   Z e d  Z d   Z d" d" d  Z e e e d" d  Z d e e e d" d  Z d d e d  Z d d  Z e d d d  Z d d d  Z d  d" d!  Z e Z  e Z! RS(#   s   
    A wrapper for the return value of a select. It basically represents a table.
    It has an iterator and each row is represented as a `Row` dictionary.
    c         C   s1   | |  _  | |  _ | |  _ | |  _ | |  _ d  S(   N(   R   t   recordsRx   t   compactR@  (   R)   R   R  Rx   R  t   rawrows(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s
    				c         C   s   d t  |  j  S(   Ns   <Rows (%s)>(   RF   R  (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR     s    c   
      K   s  | s
 |  Sx|  j  D] } x | j   D] \ } } t |  } | | k r_ t   } | | <n
 | | } t } x | D] } | d d k rv t | |  }	 t |	 d  r t |	 |  | | <qt |	  t	 j
 k r| s | j j |  t } n  |	   | | <qqv qv Wq' Wq W|  S(   s  
        For reference::

            db.define_table('x',Field('number','integer'))
            if db(db.x).isempty(): [db.x.insert(number=i) for i in range(10)]

            from gluon.dal import lazy_virtualfield

            class MyVirtualFields(object):
                # normal virtual field (backward compatible, discouraged)
                def normal_shift(self): return self.x.number+1
                # lazy virtual field (because of @staticmethod)
                @lazy_virtualfield
                def lazy_shift(instance,row,delta=4): return row.x.number+delta
            db.x.virtualfields.append(MyVirtualFields())

            for row in db(db.x).select():
                print row.number, row.normal_shift, row.lazy_shift(delta=7)

        i    R   t   __lazy__(   R  RK   R   R&   RQ   R   R|   R  R   t   typest
   MethodTypeR'   R(   R   (
   R)   t   keyed_virtualfieldsRm   R7   R   R  t   boxR  t	   attributeR  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   setvirtualfields  s(    
	c         C   sY   |  j  | j  k r! t d   n  |  j | j } t |  j | |  j  d |  j pU | j S(   Ns"   Cannot & incompatible Rows objectsR  (   Rx   t	   ExceptionR  R  R   R  (   R)   RR   R  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRQ  	  s
    c         C   s   |  j  | j  k r! t d   n  g  | j D] } | |  j k r+ | ^ q+ } |  j | } t |  j | |  j  d |  j p} | j S(   Ns"   Cannot | incompatible Rows objectsR  (   Rx   R  R  R  R   R  (   R)   RR   R  R  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR  	  s    c         C   s   t  |  j  r d Sd S(   Ni   i    (   RF   R  (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   (	  s    c         C   s   t  |  j  S(   N(   RF   R  (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __len__-	  s    c         C   s)   t  |  j |  j | | !|  j d |  j S(   NR  (   R  R   R  Rx   R  (   R)   R  R  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   __getslice__0	  s    c         C   sZ   |  j  | } | j   } |  j rV t |  d k rV | d d k rV | | j   d S| S(   Ni   i    R-   (   R  RG   R  RF   (   R)   Rm  Rm   RG   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRB   3	  s
    +c         c   s*   x# t  t |    D] } |  | Vq Wd S(   s'   
        Iterator over records
        N(   t   xrangeRF   (   R)   Rm  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRJ   :	  s    c         C   s#   t  j    } |  j |  | j   S(   s6   
        Serializes the table into a csv file
        (   R    t   export_to_csv_filet   getvalue(   R)   t   s(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   B	  s    c         C   s4   g  |  D]) } | | r" t  |  n
 |  j d ^ q S(   Ni    (   R8   Rx   (   R)   t   columnR  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR  K	  s    c         C   s   |  j  s d  S|  d S(   Ni    (   R  R:   (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR  N	  s    	c         C   s   |  j  s d  S|  d S(   Ni(   R  R:   (   R)   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   lastS	  s    	c   	      C   s   |  s% t  |  j g  |  j d |  j Sg  } | r@ | \ } } n d t |   } } d } xf t |   D]X \ } } | |  rf | | k r | j |  j |  n  | d 7} | | k r Pq qf qf Wt  |  j | |  j d |  j S(   sr   
        Returns a new Rows object, a subset of the original object,
        filtered by the function `f`
        R  i    i   (   R  R   Rx   R  RF   RL  R`   R  (	   R)   Rv   R  R  R  R  R=   Rm  Rm   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   findX	  s     
 c         C   s   |  j  s( t |  j g  |  j d |  j Sg  } d } xW | t |   k  r |  | } | |  r | j |  j  |  |  j  | =q7 | d 7} q7 Wt |  j | |  j d |  j S(   s   
        Removes elements from the calling Rows object, filtered by the function
        `f`, and returns a new Rows object containing the removed elements
        R  i    i   (   R  R  R   Rx   R  RF   R`   (   R)   Rv   t   removedRm  Rm   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   excludel	  s    	
c            sn   t  |  j g  |  j d |  j } g  t t |  j |   d   f d   d | D] \ } } | ^ qO | _ | S(   sI   
        Returns a list of sorted elements (not sorted in place)
        R  R>   c            s     |  d  S(   Ni   (    (   R  (   Rv   (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   	  s    R?  (   R  R   Rx   R  t   sortedt   zipR  (   R)   Rv   R?  t   rowsR  R  (    (   Rv   s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   sort~	  s
    !"c            s   t   d | k r | d  n     f d     t |  d k rG |  S|  j sT i  St   } x! |  D] }   | | d |  qd W| S(   s9   
        Regroups the rows, by one of the fields
        t
   one_resultc            s   | t  |  d k r*  r  |  S|  g Sn  | | } |  | } | | k rj   |  | | d i   | | <n   |  | | d | |  } t |  t t    k r | | j   n8 t |  t t    k r | | c | 7<n
 | | | <| S(   s    helper function:
            i   (   RF   R   RU   R(   R]   (   Rm   R   t   numt   groupsR>   RD   t   struct(   t   build_fields_structR  (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR  	  s    


 
i    (   RQ   RF   R  RU   (   R)   R   R*   t   grouped_row_groupRm   (    (   R  R  s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   group_by_value	  s    		c            s  | d k r/    f d   t t    D S j j d  sP t d   n  t j  j |  } | j	   }   r g    D]4 } | j
 ^ q n" g  | D] } | d k r | ^ q } x | D] }   r g    D] } | j
 | k r | j ^ q nd g  | | j	   D]P } t  j | |  rt  j | | t  r j | | j r| ^ q}	 xH |	 D]@ }
  j j d  j | |
 | | |
 | |  | | |
 <qeWq W j rt |  d k r| d d k r| | d S| S(   s  
        Takes an index and returns a copy of the indexed row with values
        transformed via the "represent" attributes of the associated fields.

        Args:
            i: index. If not specified, a generator is returned for iteration
                over all the rows.
            fields: a list of fields to transform (if None, all fields with
                "represent" attributes will be transformed)
        c         3   s$   |  ] }  j  | d    Vq d S(   R   N(   t   render(   Rn   Rm  (   R   R)   (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pys	   <genexpr>	  s    t   rows_renders^   Rows.render() needs a `rows_render`                                representer in DAL instanceR-   i   i    N(   R:   t   rangeRF   R   t   has_representerR   Ra   t   deepcopyR  RG   R7   R6   R|   R/   R5   R  R  (   R)   Rm  R   Rm   RG   Rv   R=   R   R   t   repr_fieldsRr   (    (   R   R)   s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR  	  s*    #"%H 	+c         C   sg   |  j  | } |  _  | rA g  |  D] } | j | |  ^ q  } n g  |  D] } | ^ qH } | |  _  | S(   s   
        Returns the data as a list or dictionary.

        Args:
            storage_to_dict: when True returns a dict, otherwise a list
            datetime_to_str: convert datetime fields as strings
        (   R  RL   (   R)   R  t   storage_to_dictRi   Rj   t   ocRo   RH   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   as_list	  s    (	RM   c            sp  t  } |  j   } | r t | t  r t g  | j   D] } t | | j  ^ q7  } d | k r | r d   }	 |	       f d   } q n  |  j | | | |  }
 t | t  r| j	 d  d k r| j
 d  \ } } t g  |
 D] } | | | | f ^ q  St | t  rCt g  |
 D] } | | | f ^ q& St g  |
 D] } | |  | f ^ qM Sd S(   s  
        Returns the data as a dictionary of dictionaries (storage_to_dict=True)
        or records (False)

        Args:
            key: the name of the field to be used as dict key, normally the id
            compact: ? (default True)
            storage_to_dict: when True returns a dict, otherwise a list(default True)
            datetime_to_str: convert datetime fields as strings (default False)
        R   c          s   s&   d }  x t  r! |  V|  d 7}  q	 Wd  S(   Ni    i   (   R   (   Rm  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   new_key
  s    	c            s
     j    S(   N(   t   next(   R  (   t   key_generator(    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR,   
  s    i   N(   RQ   R  R/   R  R>  RI   RV  R  R8   RC  Rd  RU   (   R)   R>   R  R  Ri   Rj   t   multiRv   R?   R  R  R   Rr   R  (    (   R  s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRL   	  s    1		$+'t	   parent_idt   childrenc   	      C   s   g  } i  } | r< t  |  j d | t k r0 d n |   n |  } x% | D] } | | | j <g  | | <qI WxI | D]A } | | } | d k r | j |  qq | | | j |  qq W| S(   s  
        returns the data as list of trees.

        :param parent_name: the name of the field holding the reference to the
                            parent (default parent_id).
        :param children_name: the name where the children of each row will be
                              stored as a list (default children).
        :param render: whether we will render the fields using their represent
                       (default False) can be a list of fields to render or
                       True to render all.
        R   N(   R]   R  R   R:   RM   R`   (	   R)   t   parent_namet   children_nameR  t   rootst   drowsR  Rm   t   parent(    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   as_trees
  s    6
s   <NULL>c            sm  | j  d d  } | j  d d  } | j  d t j  } | j  d t  } t j | d | d | d | }	  f d   }
 | j  d  j  } | j  d	 t  } | r |	 j |
 |   n    f d
   } i  } x D]} g  } xo| D]g}  j j	 j
 j |  } | s(| j | j |  q | j   \ } }  j | | } t | j  | d  t t f  r}| | | } n
 | | } | j d k r| d k	 rt j |  } n | rA| j rA| j j d  r,| | k ri  | | <n  | | | k r| j | |  | | | <n  | | | } qA| j | |  } n  | j | |   q W|	 j |  q Wd S(   s  
        Exports data to csv, the first line contains the column names

        Args:
            ofile: where the csv must be exported to
            null: how null values must be represented (default '<NULL>')
            delimiter: delimiter to separate values (default ',')
            quotechar: character to use to quote string values (default '"')
            quoting: quote system, use csv.QUOTE_*** (default csv.QUOTE_MINIMAL)
            represent: use the fields .represent value (default False)
            colnames: list of column names to use (default self.colnames)

        This will only work when exporting rows objects!!!!
        DO NOT use this with db.export_to_csv()
        RP  R$  RQ  RR  RS  R  c            se   g  } xX |  D]P }   j  j j j |  } | sA | j |  q | j d j | j     q W| S(   NR   (   R   R   R   R;   R`   Rp   R  (   Rx   t   unq_colnamest   colR@   (   R)   (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   unquote_colnamesO
  s     Rx   t   write_colnamesc            s   |  d k r   St |  t  r, |  j d  St |  t  rE t |   St |  d  rn |  j   d  j d d  St |  t	 t
 f  r t |   S|  S(   s   
            Returns a cleaned up value that can be used for csv export:

            - unicode text is encoded as such
            - None values are replaced with the given representation (default <NULL>)
            t   utf8Rg   i   RW   RX   N(   R:   R/   RY   t   encodeR   RP   R|   Rg   Rh   R]   R^   R   (   RD   (   R]  (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   none_exception_
  s    

R%   R   N(   R9   Ra  Rb  RQ   t   writerRx   R   t   writerowR   R   R   R;   R`   R-   R  R/   R:   R&   RU   R   RW  t	   b64encodeR  R   (   R)   t   ofileR]  R*   R+   RP  RQ  RS  R  R  R  Rx   R  R  t
   repr_cacheR  Rm   R  R@   R   Rv   Rr   RD   (    (   R]  R)   s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR  8
  sH    
!
Rm   R  c            s   | r#  j  j d  r# t } n  | rV d | d j    f d    D  | f S j  j d   } t | d  r t t | d   r | j   S| S(   sJ   
        Serializes the table using sqlhtml.SQLTABLE (if present)
        t   rows_xmls   <%s>
%s
</%s>s   
c         3   s*   |  ]  } | j  d    d  j  Vq d S(   Rw   Rx   N(   Ry   Rx   (   Rn   Rm   (   Rw   R)   (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pys	   <genexpr>
  s   Rv  (	   R   R  R   Rp   R  R|   Rq   R   Rv  (   R)   t   strictRw   t	   rows_namet   rv(    (   Rw   R)   s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRv  
  s    	$
c         C   s   |  j  d t d | d |  S(   NR  Rw   R  (   Rv  R   (   R)   Rw   R  (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyRy   
  s    RN   c         C   s   g  |  D]- } | j  d | d | d t d |  j  ^ q } |  j j d  r |  j j d  rm |  j j j n d } |  j j d | d | p | St	 j
 |  Sd S(   s   
        Serializes the rows to a JSON list or object with objects
        mode='object' is not implemented (should return a nested
        object structure)
        R~   RE   R   Rx   R   R{   N(   R   RQ   Rx   R   Rw  Rz   R{   R:   R   R   R}   (   R)   R~   RE   R  RH   R{   (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR   
  s    7'N("   R   R   R   R:   R   R   R   R  RQ  R  R   R  R  RB   RJ   R   R  R  R  R  R  RQ   R  R  R  R  RL   R  R  Rv  Ry   R   t   as_csvR   (    (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyR    sP   		+														4#$V(A   RW  R  Ra   Ra  Rd   Rb   R   R)  R  R  t   _compatR    R   R   R   R   R   t   _globalsR   R   R   R	   R
   t   _loadR   t   _gaeR   t
   exceptionsR   R   t   helpers.regexR   R   R   R   R   R   t   helpers.classesR   R   R   R   t   helpers.methodsR   R   R   R   R   R   R   R    R  RN   R&   R0   R}  R   R   R5   R  R   R  R  R  R  (    (    (    s>   /var/www/c4bv.valis/web2py/gluon/packages/dal/pydal/objects.pyt   <module>   sP   .(.":
   B @ m 1'