U
    h                     @   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__ZDateTimeFieldZSQL	timestampZ	TextFieldactiontableZIntegerFieldprimary_keyr   changes r   r   >/tmp/pip-unpacked-wheel-5j60pwdk/playhouse/sqlite_changelog.pyr      s
   r   c                   @   sX   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)INSERTZ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 k	r,|j|kr,q|j}|s:dnd| }|sJdnd| }	t|trt|rhd|	 }	|rtd| }|d||	|f  qd|S )NZNULLzNEW."%s"zOLD."%s"zjson(%s)zjson_array('%s', %s, %s)z, )	_metaZsorted_fieldsr   namecolumn_name
isinstancer   appendjoin)
r   modeluse_olduse_newskip_fieldsZ	col_arrayfieldcolumnnewoldr   r   r   _build_column_array;   s     
  zChangeLog._build_column_arrayc                 C   s^   || j kst|dk}|dk}| ||||}| j|jj||dkrFdnd|jjj|| jd S )Nr   r   ZNEWZOLD)r   r
   Znew_oldr   Zcolumn_arrayZchange_table)_actionsAssertionErrorr'   templater   r   r   r   )r   r   r
   r"   r    r!   colsr   r   r   trigger_sqlT   s    zChangeLog.trigger_sqlc                 C   s"   || j kst| j|jj|d S )N)r   r
   )r(   r)   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   Zdatabaser   r   r   r   r   Metak   s   r1   N)r   r   r   r1   r   r0   r   r   r   j   s   r   )hasattr
base_modelr/   )r   r   r   r0   r   r   g   s    
zChangeLog.modelTc                 C   s~   | j }|r|  tt|||f| j}	|rN|	D ]\}
}| j| || q0|	D ]&\}}|rR| |||}| j| qRd S r   )	r   create_tablelistzipr(   r   Zexecute_sqlr.   r,   )r   r   r"   Zdropinsertupdatedeleter4   r   actions_r
   ZenabledZsqlr   r   r   installr   s    zChangeLog.install)r   )N)N)NTTTTT)r   r   r   r   r3   r*   r-   r(   r   r'   r,   r.   propertyr   r<   r   r   r   r   r      s   	




      r   N)ZpeeweeZplayhouse.sqlite_extr   ZModelr   objectr   r   r   r   r   <module>   s   