o
    !d1$                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dlm
Z
 d dlmZ eeZG dd deZG dd	 d	ejZG d
d deZG dd deZG dd deZG dd de	ZdS )    N)collections_abc)BaseHistoryHandler)sqlite3)binary_typec                   @   s^   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
edd Zejdd ZdS )DatabaseConnectionz
        CREATE TABLE IF NOT EXISTS records (
          id TEXT,
          request_id TEXT,
          source TEXT,
          event_type TEXT,
          timestamp INTEGER,
          payload TEXT
        )zPRAGMA journal_mode=WALc                 C   s   t j|dd d| _|   d S )NF)Zcheck_same_threadZisolation_level)r   connect_connection_ensure_database_setup)selfZdb_filename r   Dusr/lib/python3.10/site-packages/awscli/customizations/history/db.py__init__*   s   zDatabaseConnection.__init__c                 C      | j   d S Nr   closer
   r   r   r   r   /      zDatabaseConnection.closec                 G   s   | j j|g|R  S r   )r   execute)r
   query
parametersr   r   r   r   2   s   zDatabaseConnection.executec                 C   s   |    |   d S r   )_create_record_table_try_to_enable_walr   r   r   r   r	   5   s   z)DatabaseConnection._ensure_database_setupc                 C   s   |  | j d S r   )r   _CREATE_TABLEr   r   r   r   r   9   s   z'DatabaseConnection._create_record_tablec                 C   s4   z	|  | j W d S  tjy   td Y d S w )NzFailed to enable sqlite WAL.)r   _ENABLE_WALr   ErrorLOGdebugr   r   r   r   r   <   s
   z%DatabaseConnection._try_to_enable_walc                 C   s   | j jS r   r   row_factoryr   r   r   r   r   D   s   zDatabaseConnection.row_factoryc                 C   s   || j _d S r   r   )r
   r   r   r   r   r   H   s   N)__name__
__module____qualname__r   r   r   r   r   r	   r   r   propertyr   setterr   r   r   r   r      s    	
r   c                       sD   e Zd Zdd Zdd Zdd Zdd Z fd	d
Zdd Z  Z	S )PayloadSerializerc                 C   s   t |S r   )dictr
   objr   r   r   _encode_mutable_mappingN      z)PayloadSerializer._encode_mutable_mappingc                 C   s   |  S r   )	isoformatr'   r   r   r   _encode_datetimeQ   r*   z"PayloadSerializer._encode_datetimec                 C   s*   z| d}W |S  ty   d}Y |S w )Nzutf-8z<Byte sequence>)decodeUnicodeDecodeErrorr'   r   r   r   _try_decode_bytesT   s   z#PayloadSerializer._try_decode_bytesc                    sd   t |tr |}|S t |tr t fdd| D }|S t |ttfr0 fdd|D }|S )Nc                 3   s"    | ]\}}|  |fV  qd S r   _remove_non_unicode_stings).0kvr   r   r   	<genexpr>_   s     z?PayloadSerializer._remove_non_unicode_stings.<locals>.<genexpr>c                    s   g | ]}  |qS r   r0   )r2   or   r   r   
<listcomp>b   s    z@PayloadSerializer._remove_non_unicode_stings.<locals>.<listcomp>)
isinstancestrr/   r&   itemslisttupler'   r   r   r   r1   [   s   


z,PayloadSerializer._remove_non_unicode_stingsc                    s@   z	t t| |W S  ty   | |}t t| | Y S w r   )superr%   encoder.   r1   )r
   r(   Zscrubbed_obj	__class__r   r   r>   e   s   
zPayloadSerializer.encodec                 C   sH   t |tjr| |S t |tjr| |S t |tr | |S t|S r   )	r8   datetimer,   r   MutableMappingr)   r   r/   reprr'   r   r   r   defaultw   s   



zPayloadSerializer.default)
r    r!   r"   r)   r,   r/   r1   r>   rD   __classcell__r   r   r?   r   r%   M   s    
r%   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )DatabaseRecordWriterz
        INSERT INTO records(
            id, request_id, source, event_type, timestamp, payload)
        VALUES (?,?,?,?,?,?) c                 C   s   || _ t | _d S r   )r   	threadingLock_lockr
   Z
connectionr   r   r   r         zDatabaseRecordWriter.__init__c                 C   r   r   r   r   r   r   r   r      r   zDatabaseRecordWriter.closec                 C   sF   |  |}| j | j| j| W d    d S 1 sw   Y  d S r   )_create_db_recordrI   r   r   _WRITE_RECORD)r
   record	db_recordr   r   r   write_record   s   
"z!DatabaseRecordWriter.write_recordc                 C   s@   |d }t j|d td}|d |d|d ||d |f}|S )N
event_typepayload)cls
command_id
request_idsource	timestamp)jsondumpsr%   get)r
   rN   rQ   Zjson_serialized_payloadrO   r   r   r   rL      s   
z&DatabaseRecordWriter._create_db_recordN)r    r!   r"   rM   r   r   rP   rL   r   r   r   r   rF      s    rF   c                   @   sX   e Zd ZdZde Zde Zde Zdd Zdd Zd	d
 Z	dd Z
dd Zdd ZdS )DatabaseRecordReaderzORDER BY timestampz
        SELECT * FROM records
        WHERE id =
        (SELECT id FROM records WHERE timestamp =
        (SELECT max(timestamp) FROM records)) %s;z%SELECT * from records where id = ? %szSELECT a.id AS id_a,     b.id AS id_b,     a.timestamp as timestamp,     a.payload AS args,     b.payload AS rc FROM records a, records b where a.event_type == "CLI_ARGUMENTS" AND     b.event_type = "CLI_RC" AND     id_a == id_b %s DESCc                 C   s   || _ | j| j _d S r   )r   _row_factoryr   rJ   r   r   r   r      rK   zDatabaseRecordReader.__init__c                 C   r   r   r   r   r   r   r   r      r   zDatabaseRecordReader.closec                 C   sF   i }t |jD ]\}}|| }|d dkrt|}|||d < q|S )Nr   rR   )	enumeratedescriptionrX   loads)r
   cursorrowdidxcolvalr   r   r   r\      s   
z!DatabaseRecordReader._row_factoryc                 c   $    | j | j}|D ]}|V  q
d S r   )r   r   _GET_LAST_ID_RECORDSr
   r`   ra   r   r   r   iter_latest_records   
   z(DatabaseRecordReader.iter_latest_recordsc                 c   s(    | j | j|g}|D ]}|V  qd S r   )r   r   _GET_RECORDS_BY_ID)r
   Z	record_idr`   ra   r   r   r   iter_records   s
   z!DatabaseRecordReader.iter_recordsc                 c   rf   r   )r   r   _GET_ALL_RECORDSrh   r   r   r   iter_all_records   rj   z%DatabaseRecordReader.iter_all_recordsN)r    r!   r"   Z	_ORDERINGrg   rk   rm   r   r   r\   ri   rl   rn   r   r   r   r   r[      s     		r[   c                   @   sL   e Zd Zeg dZdZdd Zdd Zdd Zd	d
 Z	dd Z
dd ZdS )RecordBuilder)API_CALLZHTTP_REQUESTZHTTP_RESPONSEZPARSED_RESPONSErp   c                 C   s   d | _ t | _d S r   )_identifierrG   local_localsr   r   r   r   r      rK   zRecordBuilder.__init__c                 C   s   t | jdd }|S NrU   )getattrrs   )r
   rU   r   r   r   _get_current_thread_request_id   s   z,RecordBuilder._get_current_thread_request_idc                 C   s   t | jdtt  d S rt   )setattrrs   r9   uuiduuid4r   r   r   r   _start_http_lifecycle   s   z#RecordBuilder._start_http_lifecyclec                 C   s,   || j kr	|   || jv r|  }|S d S r   )!_START_OF_REQUEST_LIFECYCLE_EVENTrz   _REQUEST_LIFECYCLE_EVENTSrv   )r
   rQ   rU   r   r   r   _get_request_id   s   

zRecordBuilder._get_request_idc                 C   s   | j d u rtt | _ | j S r   )rq   r9   rx   ry   r   r   r   r   _get_identifier   s   
zRecordBuilder._get_identifierc                 C   s>   |   }||||tt d d}| |}|r||d< |S )Ni  )rT   rQ   rR   rV   rW   rU   )r~   inttimer}   )r
   rQ   rR   rV   uidrN   rU   r   r   r   build_record   s   
zRecordBuilder.build_recordN)r    r!   r"   setr|   r{   r   rv   rz   r}   r~   r   r   r   r   r   ro      s    ro   c                   @   s   e Zd Zdd Zdd ZdS )DatabaseHistoryHandlerc                 C   s   || _ || _d S r   )_writer_record_builder)r
   writerZrecord_builderr   r   r   r   
  s   
zDatabaseHistoryHandler.__init__c                 C   s    | j |||}| j| d S r   )r   r   r   rP   )r
   rQ   rR   rV   rN   r   r   r   emit  s   zDatabaseHistoryHandler.emitN)r    r!   r"   r   r   r   r   r   r   r   	  s    r   )rx   r   rX   rA   rG   loggingZawscli.compatr   Zbotocore.historyr   r   r   	getLoggerr    r   objectr   JSONEncoderr%   rF   r[   ro   r   r   r   r   r   <module>   s"   
/:!5,