o
    ȷeuj                     @   s   d dl Z d dlZd dlmZ d dlZd dlmZ d dlmZ d dl	m
Z
mZ d dlmZmZmZ d dlmZmZ d dlmZmZmZ d	ZG d
d deZG dd deZG dd deZdS )    N)
find_class)Key)Blob)ListPropertyMapProperty)datetimedatetime)SDBPersistenceErrorS3ResponseError)mapsix	long_typez%Y-%m-%dT%H:%M:%SZc                   @   s   e Zd ZdS )TimeDecodeErrorN)__name__
__module____qualname__ r   r   U/var/www/ideatree/venv/lib/python3.10/site-packages/boto/sdb/db/manager/sdbmanager.pyr   $   s    r   c                   @   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&d' Zd(d) Zd*d+ Zd,d- ZeZd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Z d:d; Z!d<S )=SDBConvertera  
    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   ddl m} || _|| _t| j| jft| j| j	ft
| j| jf| j| j| jf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!rZ| j"| j#f| jt$< d S d S )Nr   )Model)%boto.sdb.db.modelr   model_classmanagerboolencode_booldecode_boolint
encode_int
decode_intfloatencode_floatdecode_floatencode_referencedecode_referencer   r   encode_datetimedecode_datetimer   encode_datedecode_dater	   encode_timedecode_timer   encode_blobdecode_blobstrencode_stringdecode_stringtype_mapr   PY2encode_longdecode_longlong)selfr   r   r   r   r   __init__7   s&   zSDBConverter.__init__c                 C   sF   z| j | v r| j }W n   Y || jv r!| j| d }||S |S )Nr   )r   mror0   )r5   	item_typevalueencoder   r   r   r:   L   s   
zSDBConverter.encodec                 C   s$   || j v r| j | d }||S |S )N   )r0   )r5   r8   r9   decoder   r   r   r<   W   s   
zSDBConverter.decodec                 C   s^   |d g fv rg S t |tst|d}| ||S i }t|D ]
\}}||d| < q| ||S )Nr8   %03d)
isinstancelistgetattrr:   	enumerate
encode_map)r5   propr9   r8   valueskvr   r   r   encode_list]   s   

zSDBConverter.encode_listc                 C   s   dd l }|d u r
d S t|tstdt| g }|D ])}t|d}| j| v r,| j}| ||| }|d urD|	d|
||f  q|S )Nr   zExpected a dict value, got %sr8   z%s:%s)urllibr>   dict
ValueErrortyper@   r   r7   r:   appendquote)r5   rC   r9   rH   	new_valuekeyr8   encoded_valuer   r   r   rB   n   s   

zSDBConverter.encode_mapc                 C   :   t |tr| ||S t |tr| ||S | |j|S N)r>   r   rG   r   rB   r:   	data_typer5   rC   r9   r   r   r   encode_prop~   
   

zSDBConverter.encode_propc                 C   sx   t |ts|g}t|dr:t|d}i }|D ]}|d ur5| ||\}}zt|}W n   |}Y |||< q| }|S Nr8   )r>   r?   hasattrr@   decode_map_elementr   rD   )r5   rC   r9   r8   dec_valvalrE   rF   r   r   r   decode_list   s    


zSDBConverter.decode_listc                 C   sD   t |ts|g}i }t|d}|D ]}| ||\}}|||< q|S rW   )r>   r?   r@   rY   )r5   rC   r9   	ret_valuer8   r[   rE   rF   r   r   r   
decode_map   s   


zSDBConverter.decode_mapc                 C   sb   ddl }|}d|v r|dd\}}||}| j| v r'||d}||fS | ||}||fS )z!Decode a single element for a mapr   N:r;   )id)rH   splitunquoter   r7   r<   )r5   r8   r9   rH   rO   r   r   r   rY      s   

zSDBConverter.decode_map_elementc                 C   rQ   rR   )r>   r   r\   r   r^   r<   rS   rT   r   r   r   decode_prop   rV   zSDBConverter.decode_propc                 C      t |}|d7 }d| S )N        z%010d)r   r5   r9   r   r   r   r         zSDBConverter.encode_intc                 C   sB   zt |}W n   tjd|  d}Y t |}|d8 }t |S )NzError, %s is not an integerr   re   )r   botologerrorrf   r   r   r   r      s   zSDBConverter.decode_intc                 C   rd   )N            z%020dr   rf   r   r   r   r2      rg   zSDBConverter.encode_longc                 C   s   t |}|d8 }|S )Nrk   rl   rf   r   r   r   r3      s   zSDBConverter.decode_longc                 C   s    |dkst | dv rdS dS )NT)trueyesrm   false)r-   lowerrf   r   r   r   r      s   zSDBConverter.encode_boolc                 C   s   |  dkrdS dS )Nrm   TF)rp   rf   r   r   r   r      s   zSDBConverter.decode_boolc                 C   s0  d| }| d}|d dd}|d }|dkrd}d	}ns|d d
kr7|d dkr7d}|dd dd}nZ|d d
krP|d d
krPd}dt| }d| }nA|d d
krw|d d
krwd}ddt|  }|dd}|dd dd}nd}ddt|  }|dd}dt| }d| }d|||f S )zM
        See http://tools.ietf.org/html/draft-wood-ldapext-float-00.
        z%eer      0r;           3000-+5N   4  r=   2%f
   1z%s %s %s)ra   ljustrjustr   r    )r5   r9   slmantissaexponentcaser   r   r   r!      s2   

zSDBConverter.encode_floatc                 C   s   |d }|dd }|dd  }|dkrdS |dkrn0|dkr(d	t |d
  }n#|dkr9dt|d  }d| }ndt|d  }d	tt |d
  }t|d | S )Nr            ru   rt   ry   r{   r=   r|   r}   r~   r   rw   rq   )r   r    abs)r5   r9   r   r   r   r   r   r   r"      s   
zSDBConverter.decode_floatc                 C   s,   t |tjr|S t |tr|tS | S rR   )r>   r   string_typesr   strftimeISO8601	isoformatrf   r   r   r   r%     s
   

zSDBConverter.encode_datetimec                 C   s   |du r|S z3d|v r"d|v rt |dd dW S t |tW S |d}tt|d t|d t|d W S  tyC   Y dS w )	z'Handles both Dates and DateTime objectsNT.r   z%Y-%m-%dT%H:%M:%Srw   r;   r   )r   strptimera   r   r   r   	Exceptionrf   r   r   r   r&     s   
&zSDBConverter.decode_datetimec                 C   s   t |tjr|S | S rR   )r>   r   r   r   rf   r   r   r   r'   %  s   zSDBConverter.encode_datec                 C   s>   z| d}tt|d t|d t|d W S    Y d S )Nrw   r   r;   r   )ra   r   r   rf   r   r   r   r(   *  s
   
&zSDBConverter.decode_datec                 C   s`   d|v sd|v rt d| |d}tt|d d}t|dkr,|t|d  t| 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.
        rw   rx   z'Can't handle timezone aware objects: %rr   r   r_   r   r;   )r   ra   r   r   lenrL   r	   )r5   r9   tmpargr   r   r   r*   3  s   
zSDBConverter.decode_timec                 C   s"   |dv rd S t |tjr|S |jS )N)NNone  )r>   r   r   r`   rf   r   r   r   r#   D  s
   zSDBConverter.encode_referencec                 C   s   |r|dkrd S |S )Nr   r   rf   r   r   r   r$   L  s   zSDBConverter.decode_referencec                 C   s   |sd S t |tjr|S |js(| j }|tt	 }d|j
j|jf |_n(td|j}|rI| j }|j|ddd}||d}ntd|j |jd ur[||j |jS )N
s3://%s/%s^s3:\/\/([^\/]*)\/(.*)$r;   Fvalidater   zInvalid Blob ID: %s)r>   r   r   r`   r   get_blob_bucketnew_keyr-   uuiduuid4bucketnamerematchget_s3_connection
get_bucketgroupget_keyr
   r9   set_contents_from_string)r5   r9   r   rO   r   s3r   r   r   r+   Q  s"   


zSDBConverter.encode_blobc              
   C   s   |sd S t d|}|r?| j }|j|ddd}z
||d}W n ty> } z|jdkr3 W Y d }~d S d }~ww d S |rPt	|d|j
j|jf dS d S )	Nr   r;   Fr   r   	Forbiddenr   )filer`   )r   r   r   r   r   r   r   r   reasonr   r   r   )r5   r9   r   r   r   rO   rq   r   r   r   r,   h  s$   

zSDBConverter.decode_blobc              
   C   sT   t |ts|S zt|dW S    g }|D ]}|tt| qd| Y S )z/Convert ASCII, Latin-1 or UTF-8 to pure Unicodezutf-8r   )r>   r-   r   	text_typerL   unichrordjoin)r5   r9   arrchr   r   r   r.   |  s   
zSDBConverter.encode_stringc                 C   s   |S )zHDecoding a string is really nothing, just
        return the value as-isr   rf   r   r   r   r/     s   zSDBConverter.decode_stringN)"r   r   r   __doc__r6   r:   r<   rG   rB   rU   r\   r^   rY   rc   r   r   r2   r3   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	d7ddZedd Zedd Zdd	 Zd
d Zdd Z	dd Z
dd Zd7ddZdd Zd7ddZdd Zdd Zd8ddZdd  Zd9d!d"Zd#d$ Zd%d& Zd7d'd(Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 ZdS ):
SDBManagerNc                 C   sz   || _ || _|| _|| _|| _|| _|| _|| _|	| _d | _	d | _
t| | _d | _d | _|
d u r8t|dr8|j}
|
| _d S )N__consistent__)clsdb_namedb_user	db_passwddb_hostdb_portdb_tableddl_dir
enable_sslr   r   r   	converter_sdb_domainrX   r   
consistent)r5   r   r   r   r   r   r   r   r   r   r   r   r   r   r6     s"   

zSDBManager.__init__c                 C      | j d u r	|   | j S rR   )r   _connectr5   r   r   r   sdb     
zSDBManager.sdbc                 C   r   rR   )r   r   r   r   r   r   domain  r   zSDBManager.domainc                    s   t  j j jd}z fddtj D d }||d< W n	 ty'   Y nw tjdi | _	 j	j
 jdd _ jsH j	 j _d S d S )	N)aws_access_key_idaws_secret_access_key	is_securec                    s   g | ]
}|j  jkr|qS r   )endpointr   ).0xr   r   r   
<listcomp>  s    z'SDBManager._connect.<locals>.<listcomp>r   regionFr   r   )rI   r   r   r   rh   r   regions
IndexErrorconnect_sdbr   lookupr   r   create_domain)r5   argsr   r   r   r   r     s   zSDBManager._connectc                 c   s*    |D ]}|  ||j|}|r|V  qd S rR   )
get_objectr   )r5   r   query_listeritemobjr   r   r   _object_lister  s   zSDBManager._object_listerc                 C   s&   |d u rd S |st |S | j||S rR   )r-   r   rU   rT   r   r   r   encode_value  s
   zSDBManager.encode_valuec                 C   s   | j ||S rR   )r   rc   rT   r   r   r   decode_value     zSDBManager.decode_valuec                 C   s   | j st| j| j| _ | j S rR   )r   rh   
connect_s3r   r   r   r   r   r   r     s   zSDBManager.get_s3_connectionc                 C   sR   |   }d|j| jjf }| }z
||| _W | jS    ||| _Y | jS )Nz%s-%s)r   r   r   r   rp   r   r   create_bucket)r5   bucket_namer   r   r   r   r     s   zSDBManager.get_blob_bucketc                 C   s   |j sT| jj|j| jd}d|v rO|jddD ]7}|j|v rN| |||j }||}z	t	||j| W q t
yM } ztj| W Y d }~qd }~ww qd|_ d S d S )Nconsistent_read__type__FhiddenT)_loadedr   get_attributesr`   r   
propertiesr   r   make_value_from_datastoresetattrr   rh   ri   	exception)r5   r   arC   r9   rq   r   r   r   load_object  s    


zSDBManager.load_objectc           	      C   s   d }|s| j j|| jd}d|v rh|r|d |jkr#t|d |d }|rUi }|jddD ]}|j|v rG| |||j }||}|||j< q-||fi |}d|_	|S d||d |d f }t
jd|  |S )	Nr   r   r   Fr   Tz(%s) class %s.%s not foundzsdbmanager: %s)r   r   r   r   r   r   r   r   r   r   rh   ri   info)	r5   r   r`   r   r   paramsrC   r9   r   r   r   r   r     s(   


zSDBManager.get_objectc                 C   s   |  d |S rR   )r   )r5   r`   r   r   r   get_object_from_id  s   zSDBManager.get_object_from_idc                 C   sb   d| j j| |j|j|j|jf }|jr|d|j 7 }| j j||j|jd}||_	| 
|j|S )Nzselect * from `%s` %sz	 limit %s)	max_items
next_token)r   r   _build_filter_partr   filterssort_byselectlimitr   rsr   )r5   query	query_strr   r   r   r   r     s   $zSDBManager.queryTc           	      C   sR   d| j j| ||||f }d}| j |D ]}|t|d 7 }|r&|  S q|S )zX
        Get the number of results that would
        be returned in this query
        zselect count(*) from `%s` %sr   Count)r   r   r   r   r   )	r5   r   r   quickr   r   r   countrowr   r   r   r     s   zSDBManager.countc                 C   s   |dkrd}|dkrd| }|d u r&|dv rdd|i S |dv r$d| S d	}|j tkrE|dv r2d
}n|dv r8d}|dv rA|dsEd| }d|||ddf S )N__id__
itemName()z`%s`)is=z%(name)s is nullr   )zis not!=z%s is not nullr   like)r  notnot like)r  r	  %z%%:%sz
%s %s '%s''z'')	__class__r   
startswithreplace)r5   propertyr   opr[   r   r   r   _build_filter   s$   
zSDBManager._build_filterc                 C   s  ddl }g }d}|r|d dkrd}|dd }nd}|r,|r%||v r%d}|d	|  t|tjrSd
||jf }	|dv rE|	d| 7 }	|	S |durQ|	d||f 7 }	|	S |D ]}
g }|
d }t|tse|g}|D ]}| dd\}}|
d }|	|}||krd}|
|tkrg }|D ])}| ||}t|tr|D ]}|| |||| qq|| |||| q|d	d|  qg| ||}t|tr|D ]}|| |||| qqg|| |||| qg|d	d|  qUd|j }| | D ]	}|d| 7 }q|d7 }|| d}|r3|s#|d|  |dv r-d| }nd||f }t|dkrCdd||f S dS )z'
        Build the filter part
        r   NFrw   DESCr;   ASCTz(%s)zWHERE %s AND `__type__` = '%s')r  r  z ORDER BY itemName() %sz ORDER BY `%s` %sr   z OR z or z(`__type__` = '%s'z or `__type__` = '%s')r   z`%s` LIKE '%%'zWHERE %s %sz AND )typesrL   r>   r   r   r   r?   stripra   find_propertyTypeTyper   r  r   _get_all_decendentskeysr   )r5   r   r   order_byr   r  query_partsorder_by_filteredorder_by_methodr   filterfilter_partsfilter_propsfilter_propr   r  r9   r  filter_parts_subr[   rF   
type_querysubclassorder_by_queryr   r   r   r   5  s~   







zSDBManager._build_filter_partc                 C   s.   i }|j D ]}|||j< || | q|S )z$Get all decendents for a given class)__sub_classes__r   updater  )r5   r   
decendentsscr   r   r   r    s
   

zSDBManager._get_all_decendentsc                 O   s   t d)Nz%GQL queries not supported in SimpleDB)NotImplementedError)r5   query_stringr   kwdsr   r   r   	query_gql  s   zSDBManager.query_gqlc              	   C   sX  |j s
tt |_ |jj|jj| d}g }|jddD ]R}|	|}|d ur/| 
||}|g kr5d }|d u r@||j q|||j< |jrpz|j|i}t|jd	i |}|j |j kretd|j W q tyo   Y qw q|r||d }	|d }
|
d urt|
ts| 
|	|
}
|
|d< | jj|j |d|d t|dkr| j|j | |S )
N)r   r   __lineage__Fr   Error: %s must be unique!r   r;   T)r  expected_valuer   )r`   r-   r   r   r  r   r   get_lineager   get_value_for_datastorer   rL   r   uniquenextfindr
   StopIterationr  r>   r   r   put_attributesr   delete_attributes)r5   r   r1  attrs	del_attrsr  r9   r   obj2rC   rF   r   r   r   save_object  sL   


	zSDBManager.save_objectc                 C   s   | j |j d S rR   r   r9  r`   r5   r   r   r   r   delete_object  s   zSDBManager.delete_objectc                 C   s   t ||| ||}| ||}|jr<z|j|i}t|jdi |}|j|jkr1td|j W n	 t	y;   Y nw | j
j|j||idd d S )Nr0  Tr  r   )r   r3  r   r4  r   r5  r6  r`   r
   r7  r   r8  )r5   rC   r   r   r9   r   r<  r   r   r   set_property  s   

zSDBManager.set_propertyc                 C   sT   | j j|j| jd}||v r$| ||| }||}t||j| |S td| )Nr   z%s not found)	r   r   r`   r   r   r   r   r   AttributeError)r5   rC   r   r   r   r9   r   r   r   get_property  s   
zSDBManager.get_propertyc                 C   s   | j j|j||idd d S )NTrA  )r   r8  r`   )r5   r   r   r9   r   r   r   set_key_value  s   zSDBManager.set_key_valuec                 C   s   | j |j| d S rR   r>  )r5   r   r   r   r   r   delete_key_value  s   zSDBManager.delete_key_valuec                 C   s*   | j j|j|| jd}||v r|| S d S )Nr   )r   r   r`   r   )r5   r   r   r   r   r   r   get_key_value  s   zSDBManager.get_key_valuec                 C   s   | j |jS rR   )r   get_itemr`   r?  r   r   r   get_raw_item  r   zSDBManager.get_raw_itemrR   )TNN)NN)r   r   r   r6   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r.  r=  r@  rB  rD  rE  rF  rG  rI  r   r   r   r   r     s<    







R
&r   )rh   r   
boto.utilsr   r   boto.sdb.db.keyr   boto.sdb.db.blobr   boto.sdb.db.propertyr   r   r   r   r	   boto.exceptionr
   r   boto.compatr   r   r   r   r   r   objectr   r   r   r   r   r   <module>   s      k