o ckF[uj@sddlZddlZddlmZddlZddlmZddlmZddl m Z m Z ddl m Z m Z mZddlmZmZddlmZmZmZd ZGd d d eZGd d d eZGdddeZdS)N) find_class)Key)Blob) ListProperty MapProperty)datetimedatetime)SDBPersistenceErrorS3ResponseError)mapsix long_typez%Y-%m-%dT%H:%M:%SZc@s eZdZdS)TimeDecodeErrorN)__name__ __module__ __qualname__rr@/usr/lib/python3/dist-packages/boto/sdb/db/manager/sdbmanager.pyr$src@seZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-ZeZd.d/Zd0d1Zd2d3Zd4d5Zd6d7Zd8d9Z d:d;Z!d" or "decode_". cCsddlm}||_||_t|j|jft|j|j ft |j |j f|j|j |jft|j |jft|j|jft|j|jft|j|jft|j|jft|j|jfi |_t j!rZ|j"|j#f|jt$<dSdS)Nr)Model)%boto.sdb.db.modelr model_classmanagerbool encode_bool decode_boolint encode_int decode_intfloat encode_float decode_floatencode_referencedecode_referencerrencode_datetimedecode_datetimer encode_date decode_dater encode_time decode_timer encode_blob decode_blobstr encode_string decode_stringtype_mapr PY2 encode_long decode_longlong)selfrrrrr__init__7s&           zSDBConverter.__init__cCsFz |j|vr |j}WnY||jvr!|j|d}||S|S)Nr)rmror0)r5 item_typevalueencoderrrr:Ls zSDBConverter.encodecCs$||jvr|j|d}||S|S)N)r0)r5r8r9decoderrrr<Ws zSDBConverter.decodecCs^|dgfvrgSt|tst|d}|||Si}t|D] \}}||d|<q|||S)Nr8%03d) isinstancelistgetattrr: enumerate encode_map)r5propr9r8valueskvrrr encode_list]s     zSDBConverter.encode_listcCsddl}|dur dSt|tstdt|g}|D])}t|d}|j|vr,|j}||||}|durD| d| ||fq|S)NrzExpected a dict value, got %sr8z%s:%s) urllibr>dict ValueErrortyper@rr7r:appendquote)r5rCr9rH new_valuekeyr8 encoded_valuerrrrBns  zSDBConverter.encode_mapcC:t|tr |||St|tr|||S||j|SN)r>rrGrrBr: data_typer5rCr9rrr encode_prop~    zSDBConverter.encode_propcCsxt|ts|g}t|dr:t|d}i}|D]}|dur5|||\}}zt|}Wn|}Y|||<q|}|SNr8)r>r?hasattrr@decode_map_elementrrD)r5rCr9r8dec_valvalrErFrrr decode_lists    zSDBConverter.decode_listcCsDt|ts|g}i}t|d}|D]}|||\}}|||<q|SrW)r>r?r@rY)r5rCr9 ret_valuer8r[rErFrrr decode_maps   zSDBConverter.decode_mapcCsbddl}|}d|vr|dd\}}||}|j|vr'||d}||fS|||}||fS)z!Decode a single element for a maprN:r;)id)rHsplitunquoterr7r<)r5r8r9rHrOrrrrYs   zSDBConverter.decode_map_elementcCrQrR)r>rr\rr^r<rSrTrrr decode_proprVzSDBConverter.decode_propcCt|}|d7}d|S)Nz%010d)rr5r9rrrrzSDBConverter.encode_intcCsBzt|}Wntjd|d}Yt|}|d8}t|S)NzError, %s is not an integerrre)rbotologerrorrfrrrrs zSDBConverter.decode_intcCrd)Nz%020drrfrrrr2rgzSDBConverter.encode_longcCst|}|d8}|S)Nrkrlrfrrrr3szSDBConverter.decode_longcCs |dks t|dvrdSdS)NT)trueyesrmfalse)r-lowerrfrrrrszSDBConverter.encode_boolcCs|dkrdSdS)NrmTF)rprfrrrrs zSDBConverter.decode_boolcCs0d|}|d}|ddd}|d}|dkrd}d }ns|dd kr7|dd kr7d }|dd dd}nZ|dd krP|dd krPd}dt|}d|}nA|dd krw|dd krwd}ddt|}|dd}|dd dd}nd}ddt|}|dd}dt|}d|}d|||fS)zM See http://tools.ietf.org/html/draft-wood-ldapext-float-00. z%eer0r;3000-+5N4r=2%f 1z%s %s %s)raljustrjustrr )r5r9slmantissaexponentcaserrrr!s2      zSDBConverter.encode_floatcCs|d}|dd}|dd}|dkrdS|dkrn0|dkr(d t|d }n#|d kr9d t|d }d|}nd t|d }d tt|d }t|d|S)Nrrurtryr{r=r|r}r~rrwrq)rr abs)r5r9rrrrrrr"s   zSDBConverter.decode_floatcCs,t|tjr|St|tr|tS|SrR)r>r string_typesrstrftimeISO8601 isoformatrfrrrr% s   zSDBConverter.encode_datetimecCs|dur|Sz3d|vr"d|vrt|dddWSt|tWS|d}tt|dt|dt|dWStyCYdSw) z'Handles both Dates and DateTime objectsNT.rz%Y-%m-%dT%H:%M:%Srwr;r)rstrptimerarrr Exceptionrfrrrr&s & zSDBConverter.decode_datetimecCst|tjr|S|SrR)r>r rrrfrrrr'%s zSDBConverter.encode_datecCs>z|d}tt|dt|dt|dWSYdS)Nrwrr;r)rarrrfrrrr(*s  &zSDBConverter.decode_datecCs`d|vsd|vrtd||d}tt|dd}t|dkr,|t|dt|S) a converts strings in the form of HH:MM:SS.mmmmmm (created by datetime.time.isoformat()) to datetime.time objects. Timzone-aware strings ("HH:MM:SS.mmmmmm+HH:MM") won't be handled right now and will raise TimeDecodeError. rwrxz'Can't handle timezone aware objects: %rrrr_rr;)rrar rlenrLr )r5r9tmpargrrrr*3s   zSDBConverter.decode_timecCs"|dvrdSt|tjr|S|jS)N)NNone )r>r rr`rfrrrr#Ds  zSDBConverter.encode_referencecCs|r|dkrdS|S)Nrrrfrrrr$Ls zSDBConverter.decode_referencecCs|sdSt|tjr |S|js(|j}|tt }d|j j |j f|_n(t d|j}|rI|j}|j|ddd}||d}ntd|j|jdur[||j|jS)N s3://%s/%s^s3:\/\/([^\/]*)\/(.*)$r;FvalidaterzInvalid Blob ID: %s)r>r rr`rget_blob_bucketnew_keyr-uuiduuid4bucketnamerematchget_s3_connection get_bucketgroupget_keyr r9set_contents_from_string)r5r9rrOrs3rrrr+Qs"     zSDBConverter.encode_blobc Cs|sdStd|}|r?|j}|j|ddd}z ||d}Wnty>}z |jdkr3WYd}~dSd}~wwdS|rPt |d|j j |j fdSdS) Nrr;Frr Forbiddenr)filer`) rrrrrrrr reasonrrr)r5r9rrrrOrqrrrr,hs$   zSDBConverter.decode_blobc CsTt|ts|Szt|dWSg}|D] }|tt|qd|YS)z/Convert ASCII, Latin-1 or UTF-8 to pure Unicodezutf-8r)r>r-r text_typerLunichrordjoin)r5r9arrchrrrr.|s zSDBConverter.encode_stringcCs|S)zHDecoding a string is really nothing, just return the value as-isrrfrrrr/szSDBConverter.decode_stringN)"rrr__doc__r6r:r<rGrBrUr\r^rYrcrrr2r3rrr!r"r%r&r'r(r)r*r#r$r+r,r.r/rrrrr(s@     rc@seZdZ d7ddZeddZeddZdd Zd d Zd d Z ddZ ddZ d7ddZ ddZ d7ddZddZddZd8ddZdd Zd9d!d"Zd#d$Zd%d&Zd7d'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6ZdS): SDBManagerNc Csz||_||_||_||_||_||_||_||_| |_d|_ d|_ t ||_ d|_ d|_| dur8t|dr8|j} | |_dS)N__consistent__)clsdb_namedb_user db_passwddb_hostdb_portdb_tableddl_dir enable_sslrrr converter_sdb_domainrXr consistent) r5rrrrrrrrrrrrrr6s"  zSDBManager.__init__cC|jdur ||jSrR)r_connectr5rrrsdb zSDBManager.sdbcCrrR)rrrrrrdomainrzSDBManager.domaincstjjjd}zfddtjDd}||d<Wn ty'Ynwtjdi|_ j j j dd_ j sHj j _ dSdS) N)aws_access_key_idaws_secret_access_key is_securecsg|] }|jjkr|qSr)endpointr).0xrrr sz'SDBManager._connect..rregionFrr)rIrrrrhrregions IndexError connect_sdbrlookuprr create_domain)r5argsrrrrrs  zSDBManager._connectccs*|D]}|||j|}|r|VqdSrR) get_objectr)r5r query_listeritemobjrrr_object_listerszSDBManager._object_listercCs&|durdS|s t|S|j||SrR)r-rrUrTrrr encode_values zSDBManager.encode_valuecCs|j||SrR)rrcrTrrr decode_valuezSDBManager.decode_valuecCs|js t|j|j|_|jSrR)rrh connect_s3rrrrrrrszSDBManager.get_s3_connectioncCsR|}d|j|jjf}|}z |||_W|jS|||_Y|jS)Nz%s-%s)rrrrrprr create_bucket)r5 bucket_namerrrrrszSDBManager.get_blob_bucketc Cs|jsT|jj|j|jd}d|vrO|jddD]7}|j|vrN||||j}||}z t ||j|Wqt yM}z t j |WYd}~qd}~wwqd|_dSdS)Nconsistent_read__type__FhiddenT)_loadedrget_attributesr`r propertiesrrmake_value_from_datastoresetattrrrhri exception)r5rarCr9rqrrr load_objects    zSDBManager.load_objectc Csd}|s |jj||jd}d|vrh|r|d|jkr#t|d|d}|rUi}|jddD]}|j|vrG||||j}||}|||j<q-||fi|}d|_ |Sd||d|df}t j d||S) NrrrFrTz(%s) class %s.%s not foundzsdbmanager: %s) rrrrrrrrrrrhriinfo) r5rr`rrparamsrCr9rrrrrs(   zSDBManager.get_objectcCs |d|SrR)r)r5r`rrrget_object_from_ids zSDBManager.get_object_from_idcCsbd|jj||j|j|j|jf}|jr|d|j7}|jj||j|jd}||_ | |j|S)Nzselect * from `%s` %sz limit %s) max_items next_token) rr_build_filter_partrfilterssort_byselectlimitrrsr)r5query query_strrrrrr s $zSDBManager.queryTc CsRd|jj|||||f}d}|j|D]}|t|d7}|r&|Sq|S)zX Get the number of results that would be returned in this query zselect count(*) from `%s` %srCount)rrrrr) r5rrquickrrrcountrowrrrrszSDBManager.countcCs|dkrd}|dkrd|}|dur&|dvrdd|iS|dvr$d|Sd }|jtkrE|dvr2d }n|d vr8d }|d vrA|dsEd|}d|||ddfS)N__id__ itemName()z`%s`)is=z%(name)s is nullr)zis not!=z%s is not nullrlike)rnotnot like)rr %z%%:%sz %s %s '%s''z'') __class__r startswithreplace)r5propertyropr[rrr _build_filter s$  zSDBManager._build_filterc Csddl}g}d}|r|ddkrd}|dd}nd}|r,|r%||vr%d}|d |t|tjrSd ||jf} |d vrE| d |7} | S|durQ| d ||f7} | S|D]} g} | d} t| tse| g} | D]} | dd\}}| d}| |}||krd}| |tkrg}|D])}| ||}t|tr|D] }|| ||||qq|| ||||q| d d |qg| ||}t|tr|D] }| | ||||qqg| | ||||qg|d d | qUd|j}||D] }|d|7}q|d7}||d}|r3|s#|d||d vr-d |}nd ||f}t|dkrCdd ||fSdS)z' Build the filter part rNFrwDESCr;ASCTz(%s)zWHERE %s AND `__type__` = '%s')rrz ORDER BY itemName() %sz ORDER BY `%s` %srz OR z or z(`__type__` = '%s'z or `__type__` = '%s')rz`%s` LIKE '%%'z WHERE %s %sz AND )typesrLr>r rrr?stripra find_propertyTypeTyperrr_get_all_decendentskeysr)r5rrorder_byrr query_partsorder_by_filteredorder_by_methodrfilter filter_parts filter_props filter_proprrr9rfilter_parts_subr[rF type_querysubclassorder_by_queryrrrr5s~               zSDBManager._build_filter_partcCs.i}|jD]}|||j<|||q|S)z$Get all decendents for a given class)__sub_classes__rupdater)r5r decendentsscrrrrs   zSDBManager._get_all_decendentscOstd)Nz%GQL queries not supported in SimpleDB)NotImplementedError)r5 query_stringrkwdsrrr query_gqlszSDBManager.query_gqlc CsX|js tt|_|jj|jj|d}g}|jddD]R}| |}|dur/| ||}|gkr5d}|dur@| |j q|||j <|j rpz|j |i}t|jd i|}|j|jkretd|j WqtyoYqwq|r||d} |d} | durt| ts| | | } | |d<|jj|j|d|dt|dkr|j|j||S) N)rr __lineage__FrError: %s must be unique!rr;T)rexpected_valuer)r`r-rrr rr get_lineagerget_value_for_datastorerrLruniquenextfindr StopIterationrr>rrput_attributesrdelete_attributes) r5rr1attrs del_attrsrr9robj2rCrFrrr save_objectsL          zSDBManager.save_objectcCs|j|jdSrRrr9r`r5rrrr delete_objectszSDBManager.delete_objectcCst|||||}|||}|jr)r5rrrrrdelete_key_valueszSDBManager.delete_key_valuecCs*|jj|j||jd}||vr||SdS)Nr)rrr`r)r5rrrrrr get_key_valueszSDBManager.get_key_valuecCs|j|jSrR)rget_itemr`r?rrr get_raw_itemrzSDBManager.get_raw_itemrR)TNN)NN)rrrr6rrrrrrrrrrrrrrrrrr.r=r@rBrDrErFrGrIrrrrrs<       R &  r)rhr boto.utilsrrboto.sdb.db.keyrboto.sdb.db.blobrboto.sdb.db.propertyrrrrr boto.exceptionr r boto.compatr r rrrrobjectrrrrrrs    k