
    \j              	          U 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
mZmZ d dlmZ  e       Zi Zeeef   ed<   i Zeeee
   f   ed<    e       Zee   ed	<   d
Zdedeeef   fdZdededdfdZddedz  defdZddedz  defdZddedz  dee
   fdZddedz  dee
ddf   fdZeddedz  dee
ddf   fd       Zy)    )	Generator)contextmanager)create_engineevent)Engine)Sessiondeclarative_basesessionmaker)get_settings_engine_cache_session_factory_cache_prepared_urlsi0u  database_urlreturnc                 @    | j                  d      rdt        dz  dS i S )NsqliteFi  )check_same_threadtimeout)
startswithSQLITE_BUSY_TIMEOUT_MS)r   s    (apps/ordini/backend/app/core/database.py_connect_argsr      s'    x(%*7MPT7TUUI    engineNc                 b    |j                  d      sy t        j                  | d      dd       }y )Nr   connectc                    | j                         }	 |j                  dt         d       |j                  d       |j                  d       |j                  d       |j                          y # |j                          w xY w)NzPRAGMA busy_timeout = ;zPRAGMA foreign_keys = ON;zPRAGMA journal_mode = WAL;zPRAGMA synchronous = NORMAL;)cursorexecuter   close)dbapi_connection_connection_recordr   s      r   _set_sqlite_pragmasz5_configure_sqlite_engine.<locals>._set_sqlite_pragmas   sg    !((*	NN34J3K1MNNN67NN78NN9:LLNFLLNs   AA/ /B)r   N)r   r   listens_for)r   r   r$   s      r   _configure_sqlite_enginer&      s2    ""8,
vy) *r   c                     | xs t               j                  }t        j                  |      }|=t	        |d|j                  d       t        |            }t        ||       |t        |<   |S )NTr   )futurepool_pre_pingconnect_args)r   r   r   getr   r   r   r&   r   
target_urlr   s      r   
get_enginer.   )   sm    <!<!<Jz*F~(33H==&z2	
 	!4$*j!Mr   c                     | xs t               j                  }t        |      }|t        vr5t        j
                  j                  |       t        j                  |       |S )N)bind)r   r   r.   r   Basemetadata
create_alladdr,   s      r   prepare_databaser5   9   sN    <!<!<J
#F'  f -:&Mr   c                     | xs t               j                  }t        j                  |      }|!t	        t        |      ddd      }|t        |<   |S )NFT)r0   	autoflush
autocommitr(   )r   r   r   r+   r
   r5   )r   r-   session_factorys      r   _get_session_factoryr:   B   sT    <!<!<J,00<O&,<Z,HTYfktxy-<z*r   c              #      K   t        |       } |       }	 | |j                          y # |j                          w xY wwNr:   r!   r   r9   dbs      r   open_db_sessionr@   K   s4     *<8O		B


   A + A =A c              #      K   t        |       } |       }	 | |j                          y # |j                          w xY wwr<   r=   r>   s      r   db_session_contextrC   T   s4     *<8O		B


rA   r<   ) collections.abcr   
contextlibr   
sqlalchemyr   r   sqlalchemy.enginer   sqlalchemy.ormr   r	   r
   app.core.configr   r1   r   dictstr__annotations__r   setr   r   objectr   r&   r.   r5   r:   r@   rC    r   r   <module>rP      s>   % % + $ B B ( #%tCK  %;= S,w"778 =5C    S&[(9 V 3 4  S4Z 6  3:  sTz \'=R #* 	'4QUBU8V  S4Z 9WdTXEX;Y  r   