o
    ðT·j¹  ã                   @   s8   d dl T d dlmZ G dd„ deƒZG dd„ deƒZdS )é    )Ú*)Ú	JSONFieldc                   @   s4   e Zd Zeedƒgd�Zeƒ Zeƒ Ze	ƒ Z
eƒ ZdS )ÚBaseChangeLogzDEFAULT CURRENT_TIMESTAMP)ÚconstraintsN)Ú__name__Ú
__module__Ú__qualname__ÚDateTimeFieldÚSQLÚ	timestampÚ	TextFieldÚactionÚtableÚIntegerFieldÚprimary_keyr   Úchanges© r   r   ú]/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/playhouse/sqlite_changelog.pyr      s    
r   c                   @   s\   e Zd ZeZdZdZdZddd„Zddd	„Z	dd
d„Z
dd„ Zedd„ ƒZ		ddd„ZdS )Ú	ChangeLogaé  CREATE TRIGGER IF NOT EXISTS %(table)s_changes_%(action)s
    AFTER %(action)s ON %(table)s
    BEGIN
        INSERT INTO %(change_table)s
            ("action", "table", "primary_key", "changes")
        SELECT
            '%(action)s', '%(table)s', %(new_old)s."%(primary_key)s", "changes"
        FROM (
            SELECT json_group_object(
                col,
                json_array(
                    case when json_valid("oldval") then json("oldval")
                        else "oldval" end,
                    case when json_valid("newval") then json("newval")
                        else "newval" end)
                ) AS "changes"
            FROM (
                SELECT json_extract(value, '$[0]') as "col",
                       json_extract(value, '$[1]') as "oldval",
                       json_extract(value, '$[2]') as "newval"
                FROM json_each(json_array(%(column_array)s))
                WHERE "oldval" IS NOT "newval"
            )
        );
    END;z3DROP TRIGGER IF EXISTS %(table)s_changes_%(action)s)ÚINSERTÚUPDATEÚDELETEÚ	changelogc                 C   s   || _ || _d S ©N)ÚdbÚ
table_name)Úselfr   r   r   r   r   Ú__init__7   s   
zChangeLog.__init__Nc           
      C   s”   g }|j jD ]>}|jrq|d ur|j|v rq|j}|sdnd| }|s%dnd| }	t|tƒr:|r4d|	 }	|r:d| }| d||	|f ¡ qd |¡S )NÚNULLzNEW."%s"zOLD."%s"zjson(%s)zjson_array('%s', %s, %s)z, )	Ú_metaÚsorted_fieldsr   ÚnameÚcolumn_nameÚ
isinstancer   ÚappendÚjoin)
r   ÚmodelÚuse_oldÚuse_newÚskip_fieldsÚ	col_arrayÚfieldÚcolumnÚnewÚoldr   r   r   Ú_build_column_array;   s   

zChangeLog._build_column_arrayc                 C   s^   || j v sJ ‚|dk}|dk}|  ||||¡}| j|jj||dkr#dnd|jjj|| jdœ S )Nr   r   ÚNEWÚOLD)r   r   Únew_oldr   Úcolumn_arrayÚchange_table)Ú_actionsr/   Útemplater   r   r   r"   )r   r&   r   r)   r'   r(   Úcolsr   r   r   Útrigger_sqlT   s   úzChangeLog.trigger_sqlc                 C   s"   || j v sJ ‚| j|jj|dœ S )N)r   r   )r5   Údrop_templater   r   )r   r&   r   r   r   r   Údrop_trigger_sqla   s
   þzChangeLog.drop_trigger_sqlc                    s,   t ˆ dƒsG ‡ fdd„dˆ jƒ}|ˆ _ˆ jS )NÚ_changelog_modelc                       s   e Zd ZG ‡ fdd„dƒZdS )z"ChangeLog.model.<locals>.ChangeLogc                       s   e Zd Z” jZ” jZdS )z'ChangeLog.model.<locals>.ChangeLog.MetaN)r   r   r   r   Údatabaser   r   ©r   r   r   ÚMetak   s    
r>   N)r   r   r   r>   r   r=   r   r   r   j   s    r   )ÚhasattrÚ
base_modelr;   )r   r   r   r=   r   r&   g   s   
zChangeLog.modelTc                 C   s~   | j }|r	| ¡  tt|||f| jƒƒ}	|r'|	D ]\}
}| j |  ||¡¡ q|	D ]\}}|r<|  |||¡}| j |¡ q)d S r   )	r&   Úcreate_tableÚlistÚzipr5   r   Úexecute_sqlr:   r8   )r   r&   r)   ÚdropÚinsertÚupdateÚdeleterA   r   ÚactionsÚ_r   ÚenabledÚsqlr   r   r   Úinstallr   s   €ýzChangeLog.install)r   r   )NTTTTT)r   r   r   r   r@   r6   r9   r5   r   r/   r8   r:   Úpropertyr&   rM   r   r   r   r   r      s    	




ÿr   N)ÚpeeweeÚplayhouse.sqlite_extr   ÚModelr   Úobjectr   r   r   r   r   Ú<module>   s    