U
    W¨+d´H  ã                   @   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G d	d
„ d
eƒZG dd„ deƒZdS )é    N)Ú
find_classÚPassword)ÚKey)ÚModel)ÚsixÚencodebytes)Údatetime)ÚgetDOMImplementationÚparseÚparseStringÚNodez%Y-%m-%dT%H:%M:%SZc                   @   s    e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&S )'ÚXMLConvertera¤  
    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   sp   || _ t| j| jft| j| jft| j| j	ft
| j| j	ft| j| jft| j| jfi| _tjrl| j| jf| jt< d S ©N)ÚmanagerÚboolÚencode_boolÚdecode_boolÚintÚ
encode_intÚ
decode_intr   Úencode_referenceÚdecode_referencer   r   Úencode_passwordÚdecode_passwordr   Úencode_datetimeÚdecode_datetimeÚtype_mapr   ÚPY2Úencode_longÚdecode_longÚlong)Úselfr   © r"   úB/tmp/pip-unpacked-wheel-dlxw5sjy/boto/sdb/db/manager/xmlmanager.pyÚ__init__+   s     
 
 
 
 
ûzXMLConverter.__init__c                 C   s*   d}|j D ]}|j|jkr
||j7 }q
|S )NÚ )Ú
childNodesZnodeTypeZ	TEXT_NODEÚdata)r!   Zparent_nodeÚvalueÚnoder"   r"   r#   Úget_text_value6   s
    
zXMLConverter.get_text_valuec                 C   s$   || j kr | j | d }||ƒS |S ©Nr   )r   )r!   Ú	item_typer(   Úencoder"   r"   r#   r-   =   s    
zXMLConverter.encodec                 C   s.   || j kr | j | d }||ƒS |  |¡}|S )Né   )r   r*   )r!   r,   r(   Údecoder"   r"   r#   r/   C   s
    

zXMLConverter.decodec                 C   sj   t |tƒrXt|dƒrRg }|D ]0}t|dƒ}t| ¡ kr:t}| |  ||¡¡ q|S |S n|  |j|¡S d S )Nr,   )	Ú
isinstanceÚlistÚhasattrÚgetattrr   ÚmroÚappendr-   Ú	data_type)r!   Úpropr(   Ú	new_valueÚvr,   r"   r"   r#   Úencode_propK   s    


zXMLConverter.encode_propc                 C   sz   |j tkrht|dƒr\t|dƒ}t| ¡ kr.t}g }| d¡D ]}|  ||¡}| |¡ q<|S |  	|¡S n|  |j |¡S d S )Nr,   Úitem)
r6   r1   r2   r3   r   r4   ÚgetElementsByTagNamer/   r5   r*   )r!   r7   r(   r,   ÚvaluesÚ	item_noder"   r"   r#   Údecode_propZ   s    


zXMLConverter.decode_propc                 C   s   t |ƒ}d| S ©Nz%d)r   ©r!   r(   r"   r"   r#   r   j   s    zXMLConverter.encode_intc                 C   s    |   |¡}|rt|ƒ}nd }|S r   )r*   r   rA   r"   r"   r#   r   n   s
    

zXMLConverter.decode_intc                 C   s   t |ƒ}d| S r@   )r    rA   r"   r"   r#   r   v   s    zXMLConverter.encode_longc                 C   s   |   |¡}t|ƒS r   )r*   r    rA   r"   r"   r#   r   z   s    
zXMLConverter.decode_longc                 C   s   |dkrdS dS d S )NTÚtrueÚfalser"   rA   r"   r"   r#   r   ~   s    zXMLConverter.encode_boolc                 C   s"   |   |¡}| ¡ dkrdS dS d S )NrB   TF)r*   ÚlowerrA   r"   r"   r#   r   „   s    
zXMLConverter.decode_boolc                 C   s
   |  t¡S r   )ÚstrftimeÚISO8601rA   r"   r"   r#   r   ‹   s    zXMLConverter.encode_datetimec                 C   s,   |   |¡}zt |t¡W S    Y d S X d S r   )r*   r   ÚstrptimerF   rA   r"   r"   r#   r   Ž   s
    
zXMLConverter.decode_datetimec                 C   s\   t |tjƒr|S |d krdS | jj d¡}| d|j¡ | dd|jj	|jj
f ¡ |S d S )Nr%   ÚobjectÚidÚclassú%s.%s)r0   r   Ústring_typesr   ÚdocÚcreateElementÚsetAttributerI   Ú	__class__Ú
__module__Ú__name__)r!   r(   Zval_noder"   r"   r#   r   •   s    zXMLConverter.encode_referencec                 C   sN   |sd S z2|j d }| d¡}| d¡}t|ƒ}| |¡W S    Y d S X d S )Nr   rJ   rI   )r&   ÚgetAttributer   Z
get_by_ids)r!   r(   Ú
class_namerI   Úclsr"   r"   r#   r       s    


zXMLConverter.decode_referencec                 C   s    |rt |ƒdkrt|ƒS d S d S r+   )ÚlenÚstrrA   r"   r"   r#   r   ¬   s    zXMLConverter.encode_passwordc                 C   s   |   |¡}t|ƒS r   )r*   r   rA   r"   r"   r#   r   ²   s    
zXMLConverter.decode_passwordN)rR   rQ   Ú__qualname__Ú__doc__r$   r*   r-   r/   r:   r?   r   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   r      s&   r   c                   @   s  e Zd Zdd„ Zdd„ Zd>dd„Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd?dd„Zd d!„ Zd"d#„ Zd$d%„ Zd@d&d'„ZdAd(d)„ZdBd*d+„ZdCd,d-„Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z dS )DÚ
XMLManagerc
                 C   s®   || _ |s|j ¡ }|| _|| _|| _|| _|| _|| _|| _	d | _
t| ƒ| _tƒ | _| j d dd ¡| _d | _|	| _d | _| jrªtd| j| jf ƒd d… }
d|
 }|| _d S )NÚobjectsz%s:%séÿÿÿÿzBasic %s)rU   rR   rD   Údb_nameÚdb_userÚ	db_passwdÚdb_hostÚdb_portÚdb_tableÚddl_dirÚs3r   Ú	converterr	   ÚimplÚcreateDocumentrM   Ú
connectionÚ
enable_sslÚauth_headerr   )r!   rU   r]   r^   r_   r`   ra   rb   rc   ri   Zbase64stringZ
authheaderr"   r"   r#   r$   ¹   s*    

zXMLManager.__init__c                 C   s:   | j r6| jrddlm} nddlm} || j | jƒ| _d S )Nr   )ÚHTTPSConnection)ÚHTTPConnection)r`   ri   Úhttplibrk   rl   ra   rh   )r!   Ú
Connectionr"   r"   r#   Ú_connectÒ   s
    zXMLManager._connectNc                 C   sh   | j s|  ¡  z| j  ¡  W n   Y nX | j  ¡  i }| jrH| j|d< | j  ||||¡ | j  ¡ }|S )z3
        Make a request on this connection
        ÚAuthorization)rh   ro   ÚcloseÚconnectrj   ÚrequestÚgetresponse)r!   ÚmethodÚurlZ	post_dataÚbodyÚheadersÚrespr"   r"   r#   Ú_make_requestÛ   s    


zXMLManager._make_requestc                 C   s   | j  d dd ¡S )Nr[   )rf   rg   ©r!   r"   r"   r#   Únew_docí   s    zXMLManager.new_docc                 c   s¨   |  d¡D ]˜}|s$| d¡}t|ƒ}| d¡}||ƒ}|  d¡D ]Z}| d¡}| |¡}	|	r@t|	dƒrv|  ||	j¡}
n|  |	|¡}
|	 |
¡}
t	||	j
|
ƒ q@|V  q
d S )NrH   rJ   rI   ÚpropertyÚnamer,   )r<   rS   r   Úfind_propertyr2   Úget_listr,   Údecode_valueÚmake_value_from_datastoreÚsetattrr~   )r!   rU   rM   Úobj_noderT   rI   ÚobjÚ	prop_nodeÚ	prop_namer7   r(   r"   r"   r#   Ú_object_listerð   s     





zXMLManager._object_listerc                 C   s   |   ¡  d S r   )ro   r{   r"   r"   r#   Úreset  s    zXMLManager.resetc                 C   s   | j S r   )rM   r{   r"   r"   r#   Úget_doc  s    zXMLManager.get_docc                 C   s   | j  ||¡S r   )re   r:   ©r!   r7   r(   r"   r"   r#   Úencode_value	  s    zXMLManager.encode_valuec                 C   s   | j  ||¡S r   )re   r?   r‹   r"   r"   r#   r     s    zXMLManager.decode_valuec                 C   s   | j st | j| j¡| _ | j S r   )rd   ÚbotoZ
connect_s3Zaws_access_key_idZaws_secret_access_keyr{   r"   r"   r#   Úget_s3_connection  s    zXMLManager.get_s3_connectionc                 C   sT   g }z|  d¡d }W n   g  Y S X |  d¡D ]}| j ||¡}| |¡ q2|S )NÚitemsr   r;   )r<   re   r/   r5   )r!   r†   r,   r=   Ú
items_noder>   r(   r"   r"   r#   r€     s    
zXMLManager.get_listc                 C   s    |  d¡d }|s$| d¡}t|ƒ}|s2| d¡}||ƒ}|  d¡D ]V}| d¡}| |¡}	|  |	|¡}
|	 |
¡}
|
d k	rDzt||	j|
ƒ W qD   Y qDX qD|S )NrH   r   rJ   rI   r}   r~   )r<   rS   r   r   r   r‚   rƒ   r~   )r!   rU   rI   rM   r„   rT   r…   r†   r‡   r7   r(   r"   r"   r#   Úget_object_from_doc  s$    




zXMLManager.get_object_from_docc                 C   sŒ   |  d¡d }|s$| d¡}t|ƒ}|s2| d¡}i }|  d¡D ]@}| d¡}| |¡}	|  |	|¡}
|	 |
¡}
|
dk	r@|
||	j< q@|||fS )zµ
        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)
        rH   r   rJ   rI   r}   r~   N)r<   rS   r   r   r   r‚   r~   )r!   rU   rI   rM   r„   rT   Úpropsr†   r‡   r7   r(   r"   r"   r#   Úget_props_from_doc3  s    




zXMLManager.get_props_from_docc                 C   sf   | j s|  ¡  | j stdƒ‚d| j|f }|  d|¡}|jdkrJt|ƒ}ntd|j ƒ‚|  |||¡S )Nú)Can't query without a database connectionú/%s/%sÚGETéÈ   ú	Error: %s)	rh   ro   ÚNotImplementedErrorr]   rz   Ústatusr
   Ú	Exceptionr‘   )r!   rU   rI   rv   ry   rM   r"   r"   r#   Ú
get_objectJ  s    

zXMLManager.get_objectc           
      C   sœ   | j s|  ¡  | j stdƒ‚ddlm} t|  ||||¡ƒ}|rXd| j|d|iƒf }n
d| j }|  d|¡}|j	dkr‚t
|ƒ}	ntd	|j	 ƒ‚|  ||	¡S )
Nr”   r   )Ú	urlencodez/%s?%sÚqueryú/%sr–   r—   r˜   )rh   ro   r™   Úurllibr   rW   Ú_build_queryr]   rz   rš   r
   r›   rˆ   )
r!   rU   ÚfiltersÚlimitÚorder_byr   rž   rv   ry   rM   r"   r"   r#   rž   X  s    


zXMLManager.queryc              	   C   s2  dd l }t|ƒdkrtdƒ‚g }|jdd}|D ]¶\}}	| ¡  ¡ \}
}d}|D ]„}|j|
krPd}| |	¡tkr´g }|	D ]$}|  	||¡}| 
d|
||f ¡ qx| 
dd	 |¡ ¡ qP|  	||	¡}	| 
d
|
||	f ¡ qP|s0td|
 ƒ‚q0|r(| d¡r|dd … }d}n|}d}| 
d|||f ¡ d |¡S )Nr   é   zToo many filters, max is 4F©ÚhiddenTz'%s' %s '%s'z[%s]z OR z['%s' %s '%s']z%s is not a valid fieldú-r.   ÚdescZascz"['%s' starts-with ''] sort '%s' %sz intersection )ÚtypesrV   r›   Ú
propertiesÚstripÚsplitr~   ZTypeTyper1   rŒ   r5   ÚjoinÚ
startswith)r!   rU   r¢   r£   r¤   rª   Úpartsr«   Úfilterr(   r~   ÚopÚfoundr}   Zfilter_partsÚvalÚkeyÚtyper"   r"   r#   r¡   m  s:    
zXMLManager._build_queryc                 O   s   t dƒ‚d S )Nz GQL queries not supported in XML)r™   )r!   Zquery_stringÚargsÚkwdsr"   r"   r#   Ú	query_gqlŽ  s    zXMLManager.query_gqlc                 C   s`   |  d¡}| |¡ |D ]B}|  d¡}| |¡ t|tƒrF| |¡ q| |¡}| |¡ qd S )Nr   r;   )rN   ÚappendChildr0   r   ÚcreateTextNode)r!   rM   r   r†   r   r;   r>   Ú	text_noder"   r"   r#   Ú	save_list‘  s    





zXMLManager.save_listc           
   	   C   s´   |   |¡}|jr"d| j|jf }n
d| j }| jd|| ¡ d}|  |jdt|ƒ¡}|j|_| ¡ D ]J}z
|j	}W n t
k
rŠ   d}Y nX |rdt||j	ƒ}	|	rdt||j	|	ƒ qd|S )z1
        Marshal the object and do a PUT
        r•   rŸ   ÚPUT)rw   N)Úmarshal_objectrI   r]   rz   Ztoxmlr‘   rP   r
   r«   r~   ÚAttributeErrorr3   rƒ   )
r!   r…   Zexpected_valuerM   rv   ry   Znew_objr7   Zpropnamer(   r"   r"   r#   Úsave_object  s"    



zXMLManager.save_objectc           	      C   s  |s|   ¡ }|s| j}| d¡}|jr4| d|j¡ | dd|jj|jjf ¡ |j}| 	|¡ |j
ddD ]¦}| d¡}| d|j¡ | d	|j¡ | |¡}|d k	r|  ||¡}t|tƒrÐ|  |||¡ n8t|tƒræ| 	|¡ n"| t |¡ d
d¡¡}| 	|¡ | 	|¡ ql|S )NrH   rI   rJ   rK   Fr¦   r}   r~   r¶   ÚasciiÚignore)r|   rM   rN   rI   rO   rP   rQ   rR   ZdocumentElementrº   r«   r~   Ú	type_nameZget_value_for_datastorerŒ   r0   r1   r½   r   r»   r   Ú	text_typer-   )	r!   r…   rM   r„   Úrootr}   r†   r(   r¼   r"   r"   r#   r¿   µ  s6    
ÿ






zXMLManager.marshal_objectc                 C   s,   t |tjƒrt|ƒ}nt|ƒ}|  |||¡S r   )r0   r   rL   r   r
   r‘   ©r!   ÚfprU   rI   rM   r"   r"   r#   Úunmarshal_objectÕ  s    
zXMLManager.unmarshal_objectc                 C   s,   t |tjƒrt|ƒ}nt|ƒ}|  |||¡S )zf
        Same as unmarshalling an object, except it returns
        from "get_props_from_doc"
        )r0   r   rL   r   r
   r“   rÇ   r"   r"   r#   Úunmarshal_propsÜ  s    
zXMLManager.unmarshal_propsc                 C   s   d| j |jf }|  d|¡S )Nr•   ÚDELETE)r]   rI   rz   )r!   r…   rv   r"   r"   r#   Údelete_objectç  s    zXMLManager.delete_objectc                 C   s   | j j|j||idd d S )NT)Úreplace)ÚdomainZput_attributesrI   )r!   r…   r~   r(   r"   r"   r#   Úset_key_valueë  s    zXMLManager.set_key_valuec                 C   s   | j  |j|¡ d S r   )rÎ   Zdelete_attributesrI   )r!   r…   r~   r"   r"   r#   Údelete_key_valueî  s    zXMLManager.delete_key_valuec                 C   s(   | j  |j|¡}||kr || S d S d S r   )rÎ   Zget_attributesrI   )r!   r…   r~   Úar"   r"   r#   Úget_key_valueñ  s    zXMLManager.get_key_valuec                 C   s   | j  |j¡S r   )rÎ   Zget_itemrI   ©r!   r…   r"   r"   r#   Úget_raw_itemø  s    zXMLManager.get_raw_itemc                 C   s   d S r   r"   )r!   r7   r…   r~   r(   r"   r"   r#   Úset_propertyû  s    zXMLManager.set_propertyc                 C   s   d S r   r"   )r!   r7   r…   r~   r"   r"   r#   Úget_propertyþ  s    zXMLManager.get_propertyc                 C   s   |j s| |j¡}d|_ |S )NT)Ú_loadedZ	get_by_idrI   rÓ   r"   r"   r#   Úload_object  s    zXMLManager.load_object)NN)NN)N)N)NN)NN)!rR   rQ   rX   r$   ro   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Ö   rØ   r"   r"   r"   r#   rZ   ·   s<   	

!

 

rZ   )r   Z
boto.utilsr   r   Zboto.sdb.db.keyr   Zboto.sdb.db.modelr   Zboto.compatr   r   r   Zxml.dom.minidomr	   r
   r   r   rF   rH   r   rZ   r"   r"   r"   r#   Ú<module>   s    