o .&a1$@sddlZddlZddlZddlZddlZddlZddlmZddlm Z ddlm Z ddlm Z e e ZGdddeZGdd d ejZGd d d eZGd d d eZGdddeZGddde ZdS)N)collections_abc)BaseHistoryHandler)sqlite3) binary_typec@s^eZdZdZdZddZddZddZd d Zd d Z d dZ e ddZ e j ddZ dS)DatabaseConnectionz CREATE TABLE IF NOT EXISTS records ( id TEXT, request_id TEXT, source TEXT, event_type TEXT, timestamp INTEGER, payload TEXT )zPRAGMA journal_mode=WALcCstj|ddd|_|dS)NF)check_same_threadisolation_level)rconnect _connection_ensure_database_setup)self db_filenamerB/usr/lib/python3/dist-packages/awscli/customizations/history/db.py__init__*s zDatabaseConnection.__init__cC|jdSNr closer rrrr/zDatabaseConnection.closecGs|jj|g|RSr)r execute)r query parametersrrrr2szDatabaseConnection.executecCs||dSr)_create_record_table_try_to_enable_walrrrrr 5s z)DatabaseConnection._ensure_database_setupcCs||jdSr)r _CREATE_TABLErrrrr9sz'DatabaseConnection._create_record_tablecCs4z ||jWdStjytdYdSw)NzFailed to enable sqlite WAL.)r _ENABLE_WALrErrorLOGdebugrrrrr<s z%DatabaseConnection._try_to_enable_walcCs|jjSrr row_factoryrrrrr"DszDatabaseConnection.row_factorycCs ||j_dSrr!)r r"rrrr"Hs N)__name__ __module__ __qualname__rrrrrr rrpropertyr"setterrrrrrs  rcsDeZdZddZddZddZddZfd d Zd d ZZ S) PayloadSerializercCst|Sr)dictr objrrr_encode_mutable_mappingNz)PayloadSerializer._encode_mutable_mappingcCs|Sr) isoformatr*rrr_encode_datetimeQr-z"PayloadSerializer._encode_datetimecCs*z|d}W|Styd}Y|Sw)Nzutf-8z)decodeUnicodeDecodeErrorr*rrr_try_decode_bytesTs  z#PayloadSerializer._try_decode_bytescsdt|tr |}|St|tr tfdd|D}|St|ttfr0fdd|D}|S)Nc3s"|] \}}||fVqdSr_remove_non_unicode_stings).0kvrrr _s z?PayloadSerializer._remove_non_unicode_stings..csg|]}|qSrr3)r5orrr bsz@PayloadSerializer._remove_non_unicode_stings..) isinstancestrr2r)itemslisttupler*rrrr4[s   z,PayloadSerializer._remove_non_unicode_stingscs@z tt||WSty||}tt||YSwr)superr(encoder1r4)r r+ scrubbed_obj __class__rrrAes   zPayloadSerializer.encodecCsHt|tjr ||St|tjr||St|tr ||St|Sr) r;datetimer/rMutableMappingr,rr2reprr*rrrdefaultws      zPayloadSerializer.default) r#r$r%r,r/r2r4rArH __classcell__rrrCrr(Ms r(c@s0eZdZdZddZddZddZdd Zd S) DatabaseRecordWriterz INSERT INTO records( id, request_id, source, event_type, timestamp, payload) VALUES (?,?,?,?,?,?) cCs||_t|_dSr)r threadingLock_lockr connectionrrrrzDatabaseRecordWriter.__init__cCrrrrrrrrrzDatabaseRecordWriter.closecCsF||}|j|j|j|WddS1swYdSr)_create_db_recordrMr r _WRITE_RECORD)r record db_recordrrr write_records "z!DatabaseRecordWriter.write_recordcCs@|d}tj|dtd}|d|d|d||d|f}|S)N event_typepayload)cls command_id request_idsource timestamp)jsondumpsr(get)r rSrVjson_serialized_payloadrTrrrrQs z&DatabaseRecordWriter._create_db_recordN)r#r$r%rRrrrUrQrrrrrJs  rJc@sXeZdZdZdeZdeZdeZddZddZd d Z d d Z d dZ ddZ dS)DatabaseRecordReaderzORDER 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 DESCcCs||_|j|j_dSr)r _row_factoryr"rNrrrrrPzDatabaseRecordReader.__init__cCrrrrrrrrrzDatabaseRecordReader.closecCsFi}t|jD]\}}||}|ddkrt|}|||d<q|S)NrrW) enumerate descriptionr]loads)r cursorrowdidxcolvalrrrrbs  z!DatabaseRecordReader._row_factorycc$|j|j}|D]}|Vq dSr)r r_GET_LAST_ID_RECORDSr rfrgrrriter_latest_records z(DatabaseRecordReader.iter_latest_recordsccs(|j|j|g}|D]}|Vq dSr)r r_GET_RECORDS_BY_ID)r record_idrfrgrrr iter_recordss z!DatabaseRecordReader.iter_recordsccrlr)r r_GET_ALL_RECORDSrnrrriter_all_recordsrpz%DatabaseRecordReader.iter_all_recordsN) r#r$r% _ORDERINGrmrqrtrrrbrorsrurrrrras     rac@sLeZdZegdZdZddZddZddZd d Z d d Z d dZ dS) RecordBuilder)API_CALL HTTP_REQUEST HTTP_RESPONSEPARSED_RESPONSErxcCsd|_t|_dSr) _identifierrKlocal_localsrrrrrrPzRecordBuilder.__init__cCst|jdd}|SNrZ)getattrr~)r rZrrr_get_current_thread_request_idsz,RecordBuilder._get_current_thread_request_idcCst|jdttdSr)setattrr~r<uuiduuid4rrrr_start_http_lifecyclesz#RecordBuilder._start_http_lifecyclecCs,||jkr |||jvr|}|SdSr)!_START_OF_REQUEST_LIFECYCLE_EVENTr_REQUEST_LIFECYCLE_EVENTSr)r rVrZrrr_get_request_ids  zRecordBuilder._get_request_idcCs|jdur tt|_|jSr)r|r<rrrrrr_get_identifiers zRecordBuilder._get_identifiercCs>|}||||ttdd}||}|r||d<|S)Ni)rYrVrWr[r\rZ)rinttimer)r rVrWr[uidrSrZrrr build_records zRecordBuilder.build_recordN) r#r$r%setrrrrrrrrrrrrrws rwc@seZdZddZddZdS)DatabaseHistoryHandlercCs||_||_dSr)_writer_record_builder)r writerrecord_builderrrrr s zDatabaseHistoryHandler.__init__cCs |j|||}|j|dSr)rrrrU)r rVrWr[rSrrremitszDatabaseHistoryHandler.emitN)r#r$r%rrrrrrr s r)rrr]rErKlogging awscli.compatrbotocore.historyrrr getLoggerr#robjectr JSONEncoderr(rJrarwrrrrrs"      /:!5,