o
    ȷeH                     @   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   st   || _ 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r8| j| jf| jt< d S 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"   U/var/www/ideatree/venv/lib/python3.10/site-packages/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 )
childNodesnodeType	TEXT_NODEdata)r!   parent_nodevaluenoder"   r"   r#   get_text_value6   s   

zXMLConverter.get_text_valuec                 C   s$   || j v r| j | d }||S |S Nr   )r   )r!   	item_typer+   encoder"   r"   r#   r0   =   s   
zXMLConverter.encodec                 C   s.   || j v r| j | d }||S | |}|S )N   )r   r-   )r!   r/   r+   decoder"   r"   r#   r2   C   s
   

zXMLConverter.decodec                 C   sd   t |tr+t|dr)g }|D ]}t|d}t| v rt}|| || q|S |S | |j|S )Nr/   )	
isinstancelisthasattrgetattrr   mroappendr0   	data_type)r!   propr+   	new_valuevr/   r"   r"   r#   encode_propK   s   


zXMLConverter.encode_propc                 C   st   |j tkr3t|dr.t|d}t| v rt}g }|dD ]}| ||}|| q|S | 	|S | |j |S )Nr/   item)
r9   r4   r5   r6   r   r7   getElementsByTagNamer2   r8   r-   )r!   r:   r+   r/   values	item_noder"   r"   r#   decode_propZ   s   



zXMLConverter.decode_propc                 C      t |}d| S Nz%d)r   r!   r+   r"   r"   r#   r   j      zXMLConverter.encode_intc                 C   s"   |  |}|rt|}|S d }|S r   )r-   r   rE   r"   r"   r#   r   n   s   
zXMLConverter.decode_intc                 C   rC   rD   )r    rE   r"   r"   r#   r   v   rF   zXMLConverter.encode_longc                 C      |  |}t|S r   )r-   r    rE   r"   r"   r#   r   z      
zXMLConverter.decode_longc                 C   s   |dkrdS dS )NTtruefalser"   rE   r"   r"   r#   r   ~   s   zXMLConverter.encode_boolc                 C   s   |  |}| dkrdS dS )NrI   TF)r-   lowerrE   r"   r"   r#   r      s   
zXMLConverter.decode_boolc                 C   s
   | tS r   )strftimeISO8601rE   r"   r"   r#   r      s   
zXMLConverter.encode_datetimec                 C   s&   |  |}zt|tW S    Y d S r   )r-   r   strptimerM   rE   r"   r"   r#   r      s
   
zXMLConverter.decode_datetimec                 C   sX   t |tjr|S |d u rdS | jjd}|d|j |dd|jj	|jj
f  |S )Nr%   objectidclass%s.%s)r3   r   string_typesr   doccreateElementsetAttributerP   	__class__
__module____name__)r!   r+   val_noder"   r"   r#   r      s   zXMLConverter.encode_referencec                 C   sH   |sd S z|j d }|d}|d}t|}||W S    Y d S )Nr   rQ   rP   )r&   getAttributer   
get_by_ids)r!   r+   
class_namerP   clsr"   r"   r#   r      s   


zXMLConverter.decode_referencec                 C   s   |rt |dkrt|S d S r.   )lenstrrE   r"   r"   r#   r      s   zXMLConverter.encode_passwordc                 C   rG   r   )r-   r   rE   r"   r"   r#   r      rH   zXMLConverter.decode_passwordN)rY   rX   __qualname____doc__r$   r-   r0   r2   r=   rB   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d?d(d)Zd>d*d+Zd>d,d-Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z dS )@
XMLManagerc
                 C   s   || _ |s
|j }|| _|| _|| _|| _|| _|| _|| _	d | _
t| | _t | _| jd dd | _d | _|	| _d | _| jrWtd| j| jf d d }
d|
 }|| _d S d S )Nobjectsz%s:%szBasic %s)r^   rY   rK   db_namedb_user	db_passwddb_hostdb_portdb_tableddl_dirs3r   	converterr	   implcreateDocumentrT   
connection
enable_sslauth_headerr   )r!   r^   rf   rg   rh   ri   rj   rk   rl   rr   base64string
authheaderr"   r"   r#   r$      s,   


zXMLManager.__init__c                 C   s>   | j r| jrddlm} nddlm} || j | j| _d S d S )Nr   )HTTPSConnection)HTTPConnection)ri   rr   httplibrv   rw   rj   rq   )r!   
Connectionr"   r"   r#   _connect   s   zXMLManager._connectNc                 C   sd   | j s|   z| j   W n   Y | j   i }| jr"| j|d< | j |||| | j  }|S )z3
        Make a request on this connection
        Authorization)rq   rz   closeconnectrs   requestgetresponse)r!   methodurl	post_databodyheadersrespr"   r"   r#   _make_request   s   


zXMLManager._make_requestc                 C   s   | j d dd S )Nrd   )ro   rp   r!   r"   r"   r#   new_doc   s   zXMLManager.new_docc                 c   s    | dD ]L}|s|d}t|}|d}||}| dD ]-}|d}||}	|	rNt|	dr<| ||	j}
n| |	|}
|	|
}
t	||	j
|
 q!|V  qd S )NrO   rQ   rP   propertynamer/   )r?   r[   r   find_propertyr5   get_listr/   decode_valuemake_value_from_datastoresetattrr   )r!   r^   rT   obj_noder]   rP   obj	prop_node	prop_namer:   r+   r"   r"   r#   _object_lister   s&   





zXMLManager._object_listerc                 C   s   |    d S r   )rz   r   r"   r"   r#   reset  s   zXMLManager.resetc                 C   s   | j S r   )rT   r   r"   r"   r#   get_doc  s   zXMLManager.get_docc                 C      | j ||S r   )rn   r=   r!   r:   r+   r"   r"   r#   encode_value	     zXMLManager.encode_valuec                 C   r   r   )rn   rB   r   r"   r"   r#   r     r   zXMLManager.decode_valuec                 C   s   | j st| j| j| _ | j S r   )rm   boto
connect_s3aws_access_key_idaws_secret_access_keyr   r"   r"   r#   get_s3_connection  s   zXMLManager.get_s3_connectionc                 C   sR   g }z	| dd }W n   g  Y S | dD ]}| j||}|| q|S )Nitemsr   r>   )r?   rn   r2   r8   )r!   r   r/   r@   
items_noderA   r+   r"   r"   r#   r     s   zXMLManager.get_listc                 C   s   | dd }|s|d}t|}|s|d}||}| dD ]*}|d}||}	| |	|}
|	|
}
|
d urLz	t||	j|
 W q"   Y q"q"|S )NrO   r   rQ   rP   r   r   )r?   r[   r   r   r   r   r   r   )r!   r^   rP   rT   r   r]   r   r   r   r:   r+   r"   r"   r#   get_object_from_doc  s&   




zXMLManager.get_object_from_docc                 C   s   | dd }|s|d}t|}|s|d}i }| dD ] }|d}||}	| |	|}
|	|
}
|
du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)
        rO   r   rQ   rP   r   r   N)r?   r[   r   r   r   r   r   )r!   r^   rP   rT   r   r]   propsr   r   r:   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r%t|}ntd|j | |||S )N)Can't query without a database connection/%s/%sGET   	Error: %s)	rq   rz   NotImplementedErrorrf   r   statusr
   	Exceptionr   )r!   r^   rP   r   r   rT   r"   r"   r#   
get_objectJ  s   

zXMLManager.get_objectc           
      C   s   | j s|   | j stdddlm} t| ||||}|r,d| j|d|if }nd| j }| d|}|j	dkrAt
|}	ntd	|j	 | ||	S )
Nr   r   )	urlencodez/%s?%squery/%sr   r   r   )rq   rz   r   urllibr   r`   _build_queryrf   r   r   r
   r   r   )
r!   r^   filterslimitorder_byr   r   r   r   rT   r"   r"   r#   r   X  s   


zXMLManager.queryc              	   C   s.  dd l }t|dkrtdg }|jdd}|D ][\}}	|  \}
}d}|D ]B}|j|
krjd}||	tkrZg }|	D ]}| 	||}|
d|
||f  q<|
dd	|  q(| 	||	}	|
d
|
||	f  q(|sstd|
 q|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-r1   descascz"['%s' starts-with ''] sort '%s' %sz intersection )typesr_   r   
propertiesstripsplitr   TypeTyper4   r   r8   join
startswith)r!   r^   r   r   r   r   partsr   filterr+   r   opfoundr   filter_partsvalkeytyper"   r"   r#   r   m  s>   


zXMLManager._build_queryc                 O   s   t d)Nz GQL queries not supported in XML)r   )r!   query_stringargskwdsr"   r"   r#   	query_gql  s   zXMLManager.query_gqlc                 C   s`   | d}|| |D ]!}| d}|| t|tr#|| q||}|| qd S )Nr   r>   )rU   appendChildr3   r   createTextNode)r!   rT   r   r   r   r>   rA   	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 ]$}z|j	}W n t
yD   d}Y nw |rVt||j	}	|	rVt||j	|	 q2|S )z1
        Marshal the object and do a PUT
        r   r   PUT)r   N)marshal_objectrP   rf   r   toxmlr   rW   r
   r   r   AttributeErrorr6   r   )
r!   r   expected_valuerT   r   r   new_objr:   propnamer+   r"   r"   r#   save_object  s&   


zXMLManager.save_objectc           	      C   s  |s|   }|s| j}|d}|jr|d|j |dd|jj|jjf  |j}|	| |j
ddD ]R}|d}|d|j |d	|j ||}|d ur| ||}t|trg| ||| nt|trr|	| n|t|d
d}|	| |	| q6|S )NrO   rP   rQ   rR   Fr   r   r   r   asciiignore)r   rT   rU   rP   rV   rW   rX   rY   documentElementr   r   r   	type_nameget_value_for_datastorer   r3   r4   r   r   r   r   	text_typer0   )	r!   r   rT   r   rootr   r   r+   r   r"   r"   r#   r     s6   






zXMLManager.marshal_objectc                 C   ,   t |tjrt|}nt|}| |||S r   )r3   r   rS   r   r
   r   r!   fpr^   rP   rT   r"   r"   r#   unmarshal_object  s   
zXMLManager.unmarshal_objectc                 C   r   )zf
        Same as unmarshalling an object, except it returns
        from "get_props_from_doc"
        )r3   r   rS   r   r
   r   r   r"   r"   r#   unmarshal_props  s   
zXMLManager.unmarshal_propsc                 C   s   d| j |jf }| d|S )Nr   DELETE)rf   rP   r   )r!   r   r   r"   r"   r#   delete_object  s   zXMLManager.delete_objectc                 C   s   | j j|j||idd d S )NT)replace)domainput_attributesrP   )r!   r   r   r+   r"   r"   r#   set_key_value  s   zXMLManager.set_key_valuec                 C   s   | j |j| d S r   )r   delete_attributesrP   )r!   r   r   r"   r"   r#   delete_key_value  s   zXMLManager.delete_key_valuec                 C   s$   | j |j|}||v r|| S d S r   )r   get_attributesrP   )r!   r   r   ar"   r"   r#   get_key_value  s   zXMLManager.get_key_valuec                 C   s   | j |jS r   )r   get_itemrP   r!   r   r"   r"   r#   get_raw_item  r   zXMLManager.get_raw_itemc                 C      d S r   r"   )r!   r:   r   r   r+   r"   r"   r#   set_property     zXMLManager.set_propertyc                 C   r   r   r"   )r!   r:   r   r   r"   r"   r#   get_property  r   zXMLManager.get_propertyc                 C   s   |j s||j}d|_ |S )NT)_loaded	get_by_idrP   r   r"   r"   r#   load_object  s   zXMLManager.load_object)NNr   )!rY   rX   ra   r$   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"   r#   rc      s>    
	
!


 
rc   )r   
boto.utilsr   r   boto.sdb.db.keyr   boto.sdb.db.modelr   boto.compatr   r   r   xml.dom.minidomr	   r
   r   r   rM   rO   r   rc   r"   r"   r"   r#   <module>   s    