ó
è?F[c           @   sÀ   d  d l  Z  d  d l 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 d  d l m Z m Z m Z m Z d Z d	 e f d
 „  ƒ  YZ d e f d „  ƒ  YZ d S(   iÿÿÿÿN(   t
   find_classt   Password(   t   Key(   t   Model(   t   sixt   encodebytes(   t   datetime(   t   getDOMImplementationt   parset   parseStringt   Nodes   %Y-%m-%dT%H:%M:%SZt   XMLConverterc           B   s°   e  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 RS(   s¤  
    Responsible for converting base Python types to format compatible with underlying
    database.  For SimpleDB, that means everything needs to be converted to a string
    when stored in SimpleDB and from a string when retrieved.

    To convert a value, pass it to the encode or decode method.  The encode method
    will take a Python native value and convert to DB format.  The decode method will
    take a DB format value and convert it to Python native format.  To find the appropriate
    method to call, the generic encode/decode methods will look for the type-specific
    method by searching for a method called "encode_<type name>" or "decode_<type name>".
    c         C   s­   | |  _  i |  j |  j f t 6|  j |  j f t 6|  j |  j f t	 6|  j |  j f t
 6|  j |  j f t 6|  j |  j f t 6|  _ t j r© |  j |  j f |  j t <n  d  S(   N(   t   managert   encode_boolt   decode_boolt   boolt
   encode_intt
   decode_intt   intt   encode_referencet   decode_referenceR   R   t   encode_passwordt   decode_passwordR   t   encode_datetimet   decode_datetimeR   t   type_mapR   t   PY2t   encode_longt   decode_longt   long(   t   selfR   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   __init__+   s    		c         C   s@   d } x3 | j  D]( } | j | j k r | | j 7} q q W| S(   Nt    (   t
   childNodest   nodeTypet	   TEXT_NODEt   data(   R   t   parent_nodet   valuet   node(    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   get_text_value6   s
    c         C   s.   | |  j  k r* |  j  | d } | | ƒ S| S(   Ni    (   R   (   R   t	   item_typeR&   t   encode(    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR*   =   s    
c         C   s=   | |  j  k r* |  j  | d } | | ƒ S|  j | ƒ } | S(   Ni   (   R   R(   (   R   R)   R&   t   decode(    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR+   C   s
    
c         C   sš   t  | t ƒ rƒ t | d ƒ r| g  } xQ | D]I } t | d ƒ } t | j ƒ  k r[ t } n  | j |  j | | ƒ ƒ q+ W| S| Sn |  j | j | ƒ Sd  S(   NR)   (	   t
   isinstancet   listt   hasattrt   getattrR   t   mrot   appendR*   t	   data_type(   R   t   propR&   t	   new_valuet   vR)   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   encode_propK   s    	c         C   s²   | j  t k r› t | d ƒ r‹ t | d ƒ } t | j ƒ  k rH t } n  g  } x6 | j d ƒ D]% } |  j | | ƒ } | j | ƒ q^ W| S|  j	 | ƒ Sn |  j | j  | ƒ Sd  S(   NR)   t   item(
   R2   R-   R.   R/   R   R0   t   getElementsByTagNameR+   R1   R(   (   R   R3   R&   R)   t   valuest	   item_node(    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   decode_propZ   s    	c         C   s   t  | ƒ } d | S(   Ns   %d(   R   (   R   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR   j   s    c         C   s.   |  j  | ƒ } | r$ t | ƒ } n d  } | S(   N(   R(   R   t   None(   R   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR   n   s
    c         C   s   t  | ƒ } d | S(   Ns   %d(   R   (   R   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR   v   s    c         C   s   |  j  | ƒ } t | ƒ S(   N(   R(   R   (   R   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR   z   s    c         C   s   | t  k r d Sd Sd  S(   Nt   truet   false(   t   True(   R   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR   ~   s    c         C   s-   |  j  | ƒ } | j ƒ  d k r% t St Sd  S(   NR=   (   R(   t   lowerR?   t   False(   R   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR   „   s    c         C   s   | j  t ƒ S(   N(   t   strftimet   ISO8601(   R   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR   ‹   s    c         C   s2   |  j  | ƒ } y t j | t ƒ SWn d  SXd  S(   N(   R(   R   t   strptimeRC   R<   (   R   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR   Ž   s
    c         C   s|   t  | t j ƒ r | S| d  k r& d S|  j j j d ƒ } | j d | j ƒ | j d d | j	 j
 | j	 j f ƒ | Sd  S(   NR    t   objectt   idt   classs   %s.%s(   R,   R   t   string_typesR<   R   t   doct   createElementt   setAttributeRF   t	   __class__t
   __module__t   __name__(   R   R&   t   val_node(    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR   •   s    &c         C   sa   | s
 d  SyH | j d } | j d ƒ } | j d ƒ } t | ƒ } | j | ƒ SWn d  SXd  S(   Ni    RG   RF   (   R<   R!   t   getAttributeR    t
   get_by_ids(   R   R&   t
   class_nameRF   t   cls(    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR       s    c         C   s*   | r" t  | ƒ d k r" t | ƒ Sd  Sd  S(   Ni    (   t   lent   strR<   (   R   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR   ¬   s    
c         C   s   |  j  | ƒ } t | ƒ S(   N(   R(   R   (   R   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR   ²   s    (   RN   RM   t   __doc__R   R(   R*   R+   R6   R;   R   R   R   R   R   R   R   R   R   R   R   R   (    (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR      s&   																	t
   XMLManagerc           B   s4  e  Z d  „  Z d „  Z 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 d d „ Z d „  Z d „  Z d „  Z d d „ Z d d „ Z d d d „ Z d d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z  RS(   c
         C   sý   | |  _  | s! | j j ƒ  } n  | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _	 d  |  _ t |  ƒ |  _ t ƒ  |  _ |  j j d  d d  ƒ |  _ d  |  _ |	 |  _ d  |  _ |  j rù t d |  j |  j f ƒ d  }
 d |
 } | |  _ n  d  S(   Nt   objectss   %s:%siÿÿÿÿs   Basic %s(   RS   RN   R@   t   db_namet   db_usert	   db_passwdt   db_hostt   db_portt   db_tablet   ddl_dirR<   t   s3R   t	   converterR   t   implt   createDocumentRI   t
   connectiont
   enable_sslt   auth_headerR   (   R   RS   RY   RZ   R[   R\   R]   R^   R_   Re   t   base64stringt
   authheader(    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR   ¹   s*    													 
c         C   sT   |  j  rP |  j r% d d l m } n d d l m } | |  j  |  j ƒ |  _ n  d  S(   Niÿÿÿÿ(   t   HTTPSConnection(   t   HTTPConnection(   R\   Re   t   httplibRi   Rj   R]   Rd   (   R   t
   Connection(    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   _connectÒ   s
    		c         C   s‰   |  j  s |  j ƒ  n  y |  j  j ƒ  Wn n X|  j  j ƒ  i  } |  j r] |  j | d <n  |  j  j | | | | ƒ |  j  j ƒ  } | S(   s3   
        Make a request on this connection
        t   Authorization(   Rd   Rm   t   closet   connectRf   t   requestt   getresponse(   R   t   methodt   urlt	   post_datat   bodyt   headerst   resp(    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   _make_requestÛ   s    		c         C   s   |  j  j d  d d  ƒ S(   NRX   (   Rb   Rc   R<   (   R   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   new_docí   s    c         c   sþ   x÷ | j  d ƒ D]æ } | s: | j d ƒ } t | ƒ } n  | j d ƒ } | | ƒ } x™ | j  d ƒ D]ˆ } | j d ƒ } | j | ƒ }	 |	 re t |	 d ƒ r¶ |  j | |	 j ƒ }
 n! |  j |	 | ƒ }
 |	 j |
 ƒ }
 t	 | |	 j
 |
 ƒ qe qe W| Vq Wd  S(   NRE   RG   RF   t   propertyt   nameR)   (   R8   RP   R    t   find_propertyR.   t   get_listR)   t   decode_valuet   make_value_from_datastoret   setattrR|   (   R   RS   RI   t   obj_nodeRR   RF   t   objt	   prop_nodet	   prop_nameR3   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   _object_listerð   s     c         C   s   |  j  ƒ  d  S(   N(   Rm   (   R   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   reset  s    c         C   s   |  j  S(   N(   RI   (   R   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   get_doc  s    c         C   s   |  j  j | | ƒ S(   N(   Ra   R6   (   R   R3   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   encode_value	  s    c         C   s   |  j  j | | ƒ S(   N(   Ra   R;   (   R   R3   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR     s    c         C   s.   |  j  s' t j |  j |  j ƒ |  _  n  |  j  S(   N(   R`   t   botot
   connect_s3t   aws_access_key_idt   aws_secret_access_key(   R   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   get_s3_connection  s    	c         C   sh   g  } y | j  d ƒ d } Wn g  SXx9 | j  d ƒ D]( } |  j j | | ƒ } | j | ƒ q8 W| S(   Nt   itemsi    R7   (   R8   Ra   R+   R1   (   R   R„   R)   R9   t
   items_nodeR:   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR~     s    c         C   sè   | j  d ƒ d } | s7 | j d ƒ } t | ƒ } n  | sO | j d ƒ } n  | | ƒ } x† | j  d ƒ D]u } | j d ƒ } | j | ƒ }	 |  j |	 | ƒ }
 |	 j |
 ƒ }
 |
 d  k	 rk y t | |	 j |
 ƒ Wqà qà Xqk qk W| S(   NRE   i    RG   RF   R{   R|   (	   R8   RP   R    R}   R   R€   R<   R   R|   (   R   RS   RF   RI   R‚   RR   Rƒ   R„   R…   R3   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   get_object_from_doc  s$    c         C   s×   | j  d ƒ d } | s7 | j d ƒ } t | ƒ } n  | sO | j d ƒ } n  i  } xr | j  d ƒ D]a } | j d ƒ } | j | ƒ }	 |  j |	 | ƒ }
 |	 j |
 ƒ }
 |
 d k	 re |
 | |	 j <qe qe W| | | f S(   sµ   
        Pull out the properties from this document
        Returns the class, the properties in a hash, and the id if provided as a tuple
        :return: (cls, props, id)
        RE   i    RG   RF   R{   R|   N(   R8   RP   R    R}   R   R€   R<   R|   (   R   RS   RF   RI   R‚   RR   t   propsR„   R…   R3   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   get_props_from_doc3  s    c         C   s—   |  j  s |  j ƒ  n  |  j  s. t d ƒ ‚ n  d |  j | f } |  j d | ƒ } | j d k rq t | ƒ } n t d | j ƒ ‚ |  j | | | ƒ S(   Ns)   Can't query without a database connections   /%s/%st   GETiÈ   s	   Error: %s(	   Rd   Rm   t   NotImplementedErrorRY   Ry   t   statusR   t	   ExceptionR‘   (   R   RS   RF   Rt   Rx   RI   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt
   get_objectJ  s    		c   
      C   så   |  j  s |  j ƒ  n  |  j  s. t d ƒ ‚ n  d d l m } t |  j | | | | ƒ ƒ } | r… d |  j | i | d 6ƒ f } n d |  j } |  j d | ƒ } | j	 d k rÂ t
 | ƒ }	 n t d	 | j	 ƒ ‚ |  j | |	 ƒ S(
   Ns)   Can't query without a database connectioniÿÿÿÿ(   t	   urlencodes   /%s?%st   querys   /%sR”   iÈ   s	   Error: %s(   Rd   Rm   R•   t   urllibR™   RU   t   _build_queryRY   Ry   R–   R   R—   R†   (
   R   RS   t   filterst   limitt   order_byR™   Rš   Rt   Rx   RI   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyRš   X  s    		#c         C   s»  d d  l  } t | ƒ d k r- t d ƒ ‚ n  g  } | j d t ƒ } x| D]\ } }	 | j ƒ  j ƒ  \ }
 } t } xÇ | D]¿ } | j |
 k r} t } | j	 |	 ƒ t
 k rg  } x: |	 D]2 } |  j | | ƒ } | j d |
 | | f ƒ qº W| j d d j | ƒ ƒ q<|  j | |	 ƒ }	 | j d |
 | |	 f ƒ q} q} W| sL t d	 |
 ƒ ‚ qL qL W| r®| j d
 ƒ r…| d } d } n | } d } | j d | | | f ƒ n  d j | ƒ S(   Niÿÿÿÿi   s   Too many filters, max is 4t   hiddens   '%s' %s '%s's   [%s]s    OR s   ['%s' %s '%s']s   %s is not a valid fieldt   -i   t   desct   ascs"   ['%s' starts-with ''] sort '%s' %ss    intersection (   t   typesRT   R—   t
   propertiesRA   t   stript   splitR|   R?   t   TypeTypeR-   R‰   R1   t   joint
   startswith(   R   RS   R   Rž   RŸ   R¤   t   partsR¥   t   filterR&   R|   t   opt   foundR{   t   filter_partst   valt   keyt   type(    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyRœ   m  s:    !
	c         O   s   t  d ƒ ‚ d  S(   Ns    GQL queries not supported in XML(   R•   (   R   t   query_stringt   argst   kwds(    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt	   query_gqlŽ  s    c         C   sˆ   | j  d ƒ } | j | ƒ xe | D]] } | j  d ƒ } | j | ƒ t | t ƒ rd | j | ƒ q# | j | ƒ } | j | ƒ q# Wd  S(   NR   R7   (   RJ   t   appendChildR,   R
   t   createTextNode(   R   RI   R   R„   R   R7   R:   t	   text_node(    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt	   save_list‘  s    c   
      C   sÿ   |  j  | ƒ } | j r1 d |  j | j f } n d |  j } |  j d | d | j ƒ  ƒ} |  j | j d t | ƒ ƒ } | j | _ xr | j	 ƒ  D]d } y | j
 } Wn t k
 r¿ d } n X| r“ t | | j
 ƒ }	 |	 r÷ t | | j
 |	 ƒ q÷ q“ q“ W| S(   s1   
        Marshal the object and do a PUT
        s   /%s/%ss   /%st   PUTRv   N(   t   marshal_objectRF   RY   Ry   t   toxmlR‘   RL   R<   R   R¥   R|   t   AttributeErrorR/   R   (
   R   Rƒ   t   expected_valueRI   Rt   Rx   t   new_objR3   t   propnameR&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   save_object  s"    	
c   	      C   s™  | s |  j  ƒ  } n  | s' |  j } n  | j d ƒ } | j rU | j d | j ƒ n  | j d d | j j | j j f ƒ | j } | j	 | ƒ x| j
 d t ƒ D]í } | j d ƒ } | j d | j ƒ | j d | j ƒ | j | ƒ } | d  k	 r„|  j | | ƒ } t | t ƒ r1|  j | | | ƒ q„t | t ƒ rP| j	 | ƒ q„| j t j | ƒ j d	 d
 ƒ ƒ } | j	 | ƒ n  | j	 | ƒ q¤ W| S(   NRE   RF   RG   s   %s.%sR    R{   R|   R²   t   asciit   ignore(   Rz   RI   RJ   RF   RK   RL   RM   RN   t   documentElementR·   R¥   RA   R|   t	   type_namet   get_value_for_datastoreR<   R‰   R,   R-   Rº   R
   R¸   R   t	   text_typeR*   (	   R   Rƒ   RI   R‚   t   rootR{   R„   R&   R¹   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyR¼   µ  s4    		$c         C   s@   t  | t j ƒ r! t | ƒ } n t | ƒ } |  j | | | ƒ S(   N(   R,   R   RH   R	   R   R‘   (   R   t   fpRS   RF   RI   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   unmarshal_objectÕ  s    c         C   s@   t  | t j ƒ r! t | ƒ } n t | ƒ } |  j | | | ƒ S(   sf   
        Same as unmarshalling an object, except it returns
        from "get_props_from_doc"
        (   R,   R   RH   R	   R   R“   (   R   RÊ   RS   RF   RI   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   unmarshal_propsÜ  s    c         C   s&   d |  j  | j f } |  j d | ƒ S(   Ns   /%s/%st   DELETE(   RY   RF   Ry   (   R   Rƒ   Rt   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   delete_objectç  s    c         C   s'   |  j  j | j i | | 6d t ƒd  S(   Nt   replace(   t   domaint   put_attributesRF   R?   (   R   Rƒ   R|   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   set_key_valueë  s    c         C   s   |  j  j | j | ƒ d  S(   N(   RÐ   t   delete_attributesRF   (   R   Rƒ   R|   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   delete_key_valueî  s    c         C   s4   |  j  j | j | ƒ } | | k r, | | Sd  Sd  S(   N(   RÐ   t   get_attributesRF   R<   (   R   Rƒ   R|   t   a(    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   get_key_valueñ  s    c         C   s   |  j  j | j ƒ S(   N(   RÐ   t   get_itemRF   (   R   Rƒ   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   get_raw_itemø  s    c         C   s   d  S(   N(    (   R   R3   Rƒ   R|   R&   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   set_propertyû  s    c         C   s   d  S(   N(    (   R   R3   Rƒ   R|   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   get_propertyþ  s    c         C   s+   | j  s' | j | j ƒ } t | _  n  | S(   N(   t   _loadedt	   get_by_idRF   R?   (   R   Rƒ   (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   load_object  s    	N(!   RN   RM   R   Rm   R<   Ry   Rz   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=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyRW   ·   s<   															!		 							(   RŠ   t
   boto.utilsR    R   t   boto.sdb.db.keyR   t   boto.sdb.db.modelR   t   boto.compatR   R   R   t   xml.dom.minidomR   R   R	   R
   RC   RE   R   RW   (    (    (    s=   lib/python2.7/site-packages/boto/sdb/db/manager/xmlmanager.pyt   <module>   s   "˜