
    ՟f-                         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 d dl	m
Z
 d dlmZ d dlmZmZmZmZmZmZ d	d
lmZ d	dlmZmZ d	dlmZ  G d de      ZddZ G d de      Zy)    N)datetime)	timedelta)AnyOptional)Flask)
SQLAlchemy)
want_bytes)ColumnDateTimeIntegerLargeBinarySequenceString   )retry_query)ServerSideSessionServerSideSessionInterface)Defaultsc                       e Zd Zy)SqlAlchemySessionN)__name__
__module____qualname__     ^/var/www/cvtools/html/venv/lib/python3.12/site-packages/flask_session/sqlalchemy/sqlalchemy.pyr   r      s    r   r   c                 B     G fdd| j                         }|S )Nc                       e Zd ZW ZW rdW ini ZW  ZW r ee eW       d      n	 eed      Z	 e e
d      d      Z ee      Z ee      Zdededefd	Zd
 Zy)%create_session_model.<locals>.SessionschemaT)primary_key   )unique
session_iddataexpiryc                 .    || _         || _        || _        y )Nr$   r%   r&   )selfr$   r%   r&   s       r   __init__z.create_session_model.<locals>.Session.__init__#   s    (DODI DKr   c                 "    d| j                    dS )Nz<Session data >)r%   r)   s    r   __repr__z.create_session_model.<locals>.Session.__repr__(   s    #DII;a00r   N)r   r   r   __tablename____table_args____bind_key__r
   r   r   idr   r$   r   r%   r   r&   strr   r   r*   r.   )bind_keyr    sequence
table_names   r   Sessionr      s    "/5(F+2  7HX.DAT2 	
 F3K5
k"!	!s 	!# 	!x 	!
	1r   r7   )Model)dbr6   r    r4   r5   r7   s    ```` r   create_session_modelr:      s    1 1"(( 1, Nr   c                   
    e Zd ZdZeZdZej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                   ej"                  ej$                  fdee   dee   dedededed	ed
edee   dee   dee   dee   f fdZ e       dd       Z e       dedee   fd       Z e       deddfd       Z e       dede deddfd       Z! xZ"S )SqlAlchemySessionInterfaceat  Uses the Flask-SQLAlchemy from a flask app as session storage.

    :param app: A Flask app instance.
    :param client: A Flask-SQLAlchemy instance.
    :param key_prefix: A prefix that is added to all storage keys.
    :param use_signer: Whether to sign the session id cookie or not.
    :param permanent: Whether to use permanent session or not.
    :param sid_length: The length of the generated session id in bytes.
    :param serialization_format: The serialization format to use for the session data.
    :param table: The table name you want to use.
    :param sequence: The sequence to use for the primary key if needed.
    :param schema: The db schema to use.
    :param bind_key: The db bind key to use.
    :param cleanup_n_requests: Delete expired sessions on average every N requests.

    .. versionadded:: 0.7
        db changed to client to be standard on all session interfaces.
        The `cleanup_n_request` parameter was added.

    .. versionadded:: 0.6
        The `sid_length`, `sequence`, `schema` and `bind_key` parameters were added.

    .. versionadded:: 0.2
        The `use_signer` parameter was added.
    Fappclient
key_prefix
use_signer	permanent
sid_lengthserialization_formattabler5   r    r4   cleanup_n_requestsc           	         || _         |t        |t              s't        j                  dt
        d       t        |      }|| _        t        |||
||	      | _        |j                         5  |r| j                  j                  ||      }n| j                  j                  }| j                  j                  j                  |d       d d d        t        | =  |||||||       y # 1 sw Y   xY w)NznNo valid SQLAlchemy instance provided, attempting to create a new instance on localhost with default settings.   )
stacklevel)bindT)rI   
checkfirst)r=   
isinstancer   warningswarnRuntimeWarningr>   r:   sql_session_modelapp_context
get_engineengine	__table__createsuperr*   )r)   r=   r>   r?   r@   rA   rB   rC   rD   r5   r    r4   rE   rR   	__class__s                 r   r*   z#SqlAlchemySessionInterface.__init__L   s     >FJ!?MM A
  _F "6E68X"
 __ 	R//(/C++"",,33D3Q	R 	 	
	R 	Rs   -AC))C2returnNc                    	 | j                   j                  j                  | j                        j	                  | j                  j
                  t        j                         k        j                  d       | j                   j                  j                          y # t        $ r& | j                   j                  j                           w xY w)NF)synchronize_session)r>   sessionqueryrO   filterr&   r   utcnowdeletecommit	Exceptionrollbackr-   s    r   _delete_expired_sessionsz3SqlAlchemySessionInterface._delete_expired_sessions|   s    	KK%%d&<&<=DD&&--1BBff/KK&&( 	KK((*	s   BB /Cstore_idc                 *   | j                   j                  j                  |      j                         }|ry|j                  !|j                  t        j                         k  rL	 | j                  j                  j                  |       | j                  j                  j                          d }|r0t        |j                        }| j                  j!                  |      S y # t        $ r& | j                  j                  j                           w xY wNr$   )rO   r[   	filter_byfirstr&   r   r]   r>   rZ   r^   r_   r`   ra   r	   r%   
serializerdecode)r)   rc   recordserialized_session_datas       r   _retrieve_session_dataz1SqlAlchemySessionInterface._retrieve_session_data   s     ''--7787LRRT v}},AR0R##**62##**, F&0&=#??))*ABB  ##,,.s   %A	C# #/Dc                    	 | j                   j                  j                  |      j                          | j                  j
                  j                          y # t        $ r& | j                  j
                  j                           w xY wre   )	rO   r[   rg   r^   r>   rZ   r_   r`   ra   )r)   rc   s     r   _delete_sessionz*SqlAlchemySessionInterface._delete_session   sk    	""((22h2GNNPKK&&( 	KK((*	s   AA /B
session_lifetimerZ   c                    t        j                         |z   }| j                  j                  |      }	 | j                  j
                  j                  |      j                         }|r||_        ||_	        n9| j	                  |||      }| j                  j                  j                  |       | j                  j                  j                          y # t        $ r& | j                  j                  j                           w xY w)Nrf   r(   )r   r]   ri   encoderO   r[   rg   rh   r%   r&   r>   rZ   addr_   r`   ra   )r)   rp   rZ   rc   storage_expiration_datetimerl   rk   s          r   _upsert_sessionz*SqlAlchemySessionInterface._upsert_session   s     '/oo&7:J&J# #'//"8"8"A	++11;;x;PVVXF5 ;//'06 0 
 ##''/KK&&( 	KK((*	s   B"C /D)rW   N)#r   r   r   __doc__r   session_classttlr   SESSION_SQLALCHEMYSESSION_KEY_PREFIXSESSION_USE_SIGNERSESSION_PERMANENTSESSION_ID_LENGTHSESSION_SERIALIZATION_FORMATSESSION_SQLALCHEMY_TABLESESSION_SQLALCHEMY_SEQUENCESESSION_SQLALCHEMY_SCHEMASESSION_SQLALCHEMY_BIND_KEYSESSION_CLEANUP_N_REQUESTSr   r   r   r3   boolintr*   r   rb   dictrm   ro   	TimeDeltar   ru   __classcell__)rV   s   @r   r<   r<   .   s   4 &M
C
 (0'B'B"55#66"44"44$,$I$I66"*"F"F ( B B"*"F"F,4,O,O.
e_.
 $.
 	.

 .
 .
 .
 ".
 .
 3-.
 .
 3-.
 %SM.
` ]  ]s x~  & ]    ] )4EQT	 r   r<   )NNN)rL   r   r   r   typingr   r   flaskr   flask_sqlalchemyr   itsdangerousr	   
sqlalchemyr
   r   r   r   r   r   _utilsr   baser   r   defaultsr   r   r:   r<   r   r   r   <module>r      sJ      +    ' # O O   @ 	) 	4O!; Or   