o ckF[H@sddlZddlmZmZddlmZddlmZddlm Z m Z ddl m Z ddl m Z mZmZmZdZGd d d eZGd d d eZdS) N) find_classPassword)Key)Model)six encodebytes)datetime)getDOMImplementationparse parseStringNodez%Y-%m-%dT%H:%M:%SZc@seZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZddZd d!Zd"d#Zd$d%Zd&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_" or "decode_". c Cst||_t|j|jft|j|jft|j|j ft |j|j ft |j |j ft|j|jfi|_tjr8|j|jf|jt<dSdSN)managerbool encode_bool decode_boolint encode_int decode_intrencode_referencedecode_referencerrencode_passworddecode_passwordrencode_datetimedecode_datetimetype_maprPY2 encode_long decode_longlong)selfrr"@/usr/lib/python3/dist-packages/boto/sdb/db/manager/xmlmanager.py__init__+s      zXMLConverter.__init__cCs*d}|jD] }|j|jkr||j7}q|S)N) childNodesnodeType TEXT_NODEdata)r! parent_nodevaluenoder"r"r#get_text_value6s    zXMLConverter.get_text_valuecCs$||jvr|j|d}||S|SNr)r)r! item_typer+encoder"r"r#r0=s zXMLConverter.encodecCs.||jvr|j|d}||S||}|S)N)rr-)r!r/r+decoder"r"r#r2Cs  zXMLConverter.decodecCsdt|tr+t|dr)g}|D]}t|d}t|vrt}||||q|S|S||j|S)Nr/) isinstancelisthasattrgetattrrmroappendr0 data_type)r!propr+ new_valuevr/r"r"r# encode_propKs    zXMLConverter.encode_propcCst|jtkr3t|dr.t|d}t|vrt}g}|dD] }|||}||q|S| |S||j|S)Nr/item) r9r4r5r6rr7getElementsByTagNamer2r8r-)r!r:r+r/values item_noder"r"r# decode_propZs       zXMLConverter.decode_propcCt|}d|SNz%d)rr!r+r"r"r#rjzXMLConverter.encode_intcCs"||}|r t|}|Sd}|Sr)r-rrEr"r"r#rns zXMLConverter.decode_intcCrCrD)r rEr"r"r#rvrFzXMLConverter.encode_longcC||}t|Sr)r-r rEr"r"r#rz zXMLConverter.decode_longcCs|dkrdSdS)NTtruefalser"rEr"r"r#r~szXMLConverter.encode_boolcCs||}|dkr dSdS)NrITF)r-lowerrEr"r"r#rs  zXMLConverter.decode_boolcCs |tSr)strftimeISO8601rEr"r"r#rs zXMLConverter.encode_datetimecCs&||}zt|tWSYdSr)r-rstrptimerMrEr"r"r#rs zXMLConverter.decode_datetimecCsXt|tjr|S|durdS|jjd}|d|j|dd|jj |jj f|S)Nr%objectidclass%s.%s) r3r string_typesrdoc createElement setAttributerP __class__ __module____name__)r!r+val_noder"r"r#rs zXMLConverter.encode_referencecCsH|sdSz|jd}|d}|d}t|}||WSYdS)NrrQrP)r& getAttributer get_by_ids)r!r+ class_namerPclsr"r"r#rs    zXMLConverter.decode_referencecCs|r t|dkr t|SdSr.)lenstrrEr"r"r#rszXMLConverter.encode_passwordcCrGr)r-rrEr"r"r#rrHzXMLConverter.decode_passwordN)rYrX __qualname____doc__r$r-r0r2r=rBrrrrrrrrrrrrr"r"r"r#r s(    r c@seZdZddZddZd>ddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZddZd>ddZd d!Zd"d#Zd$d%Zd?d&d'Zd?d(d)Zd>d*d+Zd>d,d-Zd.d/Zd0d1Zd2d3Zd4d5Zd6d7Zd8d9Zd:d;Zd|jr|jr ddlm}nddlm}||j|j|_dSdS)Nr)HTTPSConnection)HTTPConnection)rirrhttplibrvrwrjrq)r! Connectionr"r"r#_connects  zXMLManager._connectNcCsd|js|z|jWnY|ji}|jr"|j|d<|j|||||j}|S)z3 Make a request on this connection Authorization)rqrzcloseconnectrsrequest getresponse)r!methodurl post_databodyheadersrespr"r"r# _make_requests   zXMLManager._make_requestcCs|jdddS)Nrd)rorpr!r"r"r#new_docszXMLManager.new_docc cs|dD]L}|s|d}t|}|d}||}|dD]-}|d}||} | rNt| dr<||| j} n || |} | | } t || j | q!|VqdS)NrOrQrPpropertynamer/) r?r[r find_propertyr5get_listr/ decode_valuemake_value_from_datastoresetattrr) r!r^rTobj_noder]rPobj prop_node prop_namer:r+r"r"r#_object_listers&       zXMLManager._object_listercCs |dSr)rzrr"r"r#resets zXMLManager.resetcCs|jSr)rTrr"r"r#get_docszXMLManager.get_doccC|j||Sr)rnr=r!r:r+r"r"r# encode_value zXMLManager.encode_valuecCrr)rnrBrr"r"r#r rzXMLManager.decode_valuecCs|js t|j|j|_|jSr)rmboto connect_s3aws_access_key_idaws_secret_access_keyrr"r"r#get_s3_connectionszXMLManager.get_s3_connectioncCsRg}z |dd}WngYS|dD]}|j||}||q|S)Nitemsrr>)r?rnr2r8)r!rr/r@ items_noderAr+r"r"r#rs zXMLManager.get_listc Cs|dd}|s|d}t|}|s|d}||}|dD]*}|d}||} || |} | | } | durLz t|| j| Wq"Yq"q"|S)NrOrrQrPrr)r?r[rrrrrr) r!r^rPrTrr]rrrr:r+r"r"r#get_object_from_docs&      zXMLManager.get_object_from_docc Cs|dd}|s|d}t|}|s|d}i}|dD] }|d}||} || |} | | } | dur@| || j<q |||fS)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) rOrrQrPrrN)r?r[rrrrr) r!r^rPrTrr]propsrrr:r+r"r"r#get_props_from_doc3s         zXMLManager.get_props_from_doccCsf|js||jstdd|j|f}|d|}|jdkr%t|}ntd|j||||S)N)Can't query without a database connection/%s/%sGET Error: %s) rqrzNotImplementedErrorrfrstatusr Exceptionr)r!r^rPrrrTr"r"r# get_objectJs   zXMLManager.get_objectc Cs|js||jstdddlm}t|||||}|r,d|j|d|if}nd|j}|d|}|j dkrAt |} nt d |j | || S) Nrr) urlencodez/%s?%squery/%srrr) rqrzrurllibrr` _build_queryrfrrr rr) r!r^filterslimitorder_byrrrrrTr"r"r#rXs      zXMLManager.queryc Cs.ddl}t|dkrtdg}|jdd}|D][\}} |\} } d} |D]B} | j| krjd} || tkrZg}| D]}| | |}| d| | |fq<| dd |q(| | | } | d | | | fq(| sstd | q|r| d r|d d}d}n|}d}| d|||fd |S)NrzToo many filters, max is 4FhiddenTz '%s' %s '%s'z[%s]z OR z['%s' %s '%s']z%s is not a valid field-r1descascz"['%s' starts-with ''] sort '%s' %sz intersection ) typesr_r propertiesstripsplitrTypeTyper4rr8join startswith)r!r^rrrrpartsrfilterr+ropfoundr filter_partsvalkeytyper"r"r#rms>          zXMLManager._build_querycOstd)Nz GQL queries not supported in XML)r)r! query_stringargskwdsr"r"r# query_gqlszXMLManager.query_gqlcCs`|d}|||D]!}|d}||t|tr#||q ||}||q dS)Nrr>)rU appendChildr3r createTextNode)r!rTrrrr>rA text_noder"r"r# save_lists        zXMLManager.save_listc Cs||}|jrd|j|jf}nd|j}|jd||d}||jdt|}|j|_|D]$}z|j }Wn t yDd}Ynw|rVt ||j } | rVt ||j | q2|S)z1 Marshal the object and do a PUT rrPUT)rN) marshal_objectrPrfrtoxmlrrWr rrAttributeErrorr6r) r!rexpected_valuerTrrnew_objr:propnamer+r"r"r# save_objects&      zXMLManager.save_objectc Cs|s|}|s |j}|d}|jr|d|j|dd|jj|jjf|j}| ||j ddD]R}|d}|d|j |d |j | |}|dur|||}t|trg||||nt|trr| |n|t|d d }| || |q6|S) NrOrPrQrRFrrrrasciiignore)rrTrUrPrVrWrXrYdocumentElementrrr type_nameget_value_for_datastorerr3r4rr rr text_typer0) r!rrTrrootrrr+rr"r"r#rs6          zXMLManager.marshal_objectcC,t|tjr t|}nt|}||||Sr)r3rrSr r rr!fpr^rPrTr"r"r#unmarshal_objects  zXMLManager.unmarshal_objectcCr)zf Same as unmarshalling an object, except it returns from "get_props_from_doc" )r3rrSr r rrr"r"r#unmarshal_propss  zXMLManager.unmarshal_propscCsd|j|jf}|d|S)NrDELETE)rfrPr)r!rrr"r"r# delete_objects zXMLManager.delete_objectcCs|jj|j||idddS)NT)replace)domainput_attributesrP)r!rrr+r"r"r# set_key_valueszXMLManager.set_key_valuecCs|j|j|dSr)rdelete_attributesrP)r!rrr"r"r#delete_key_valueszXMLManager.delete_key_valuecCs$|j|j|}||vr||SdSr)rget_attributesrP)r!rrar"r"r# get_key_valueszXMLManager.get_key_valuecCs|j|jSr)rget_itemrPr!rr"r"r# get_raw_itemrzXMLManager.get_raw_itemcCdSrr")r!r:rrr+r"r"r# set_propertyzXMLManager.set_propertycCrrr")r!r:rrr"r"r# get_propertyrzXMLManager.get_propertycCs|js ||j}d|_|S)NT)_loaded get_by_idrPrr"r"r# load_objects zXMLManager.load_object)NNr)!rYrXrar$rzrrrrrrrrrrrrrrrrrrrrrrrrrrrrr"r"r"r#rcs>   !    rc)r boto.utilsrrboto.sdb.db.keyrboto.sdb.db.modelr boto.compatrrrxml.dom.minidomr r r r rMrOr rcr"r"r"r#s