o
    i                  
   @   sb  d dl Z d dlZ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Zdaz:d dlmZ d dlm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Z dZW n  e!y Z" zede" de  d#  W Y dZ"["ndZ"["ww dd Z$dd Z%dd Z&dd Z'da(dd Z)dd Z*dd  Z+d!d" Z,d#d$ Z-d%d& Z.dS )'    N)log_startup_warning) get_missing_requirements_message)FileLockTimeout)argsF)command)Config)MigrationContext)ScriptDirectory)create_engineevent)sessionmaker)
StaticPool)BaseTzh
------------------------------------------------------------------------
Error importing dependencies: 
z
This error is happening because ComfyUI now uses a local sqlite database.
------------------------------------------------------------------------
c                   C   s   t S )zG
    Temporary function to check if the dependencies are available
    )_DB_AVAILABLE r   r   -/mnt/c/Users/fbmor/ComfyUI/app/database/db.pydependencies_available&   s   r   c                   C   s   t  otduS )z
    Temporary function to check if the database is available to create a session
    During initial release there may be environmental issues (or missing dependencies) that prevent the database from being created
    N)r   Sessionr   r   r   r   can_create_session-   s   r   c                  C   sh   t jt jtd} t jt j| d}t jt j| d}t|}|d| |dtj	 |S )Nz../..zalembic.ini
alembic_dbscript_locationzsqlalchemy.url)
ospathjoindirname__file__abspathr   set_main_optionr   database_url)	root_pathconfig_pathscripts_pathconfigr   r   r   get_alembic_config5   s   r%   c                  C   s.   t j} | dr| dd S td|  d)Nz
sqlite:///z///   zUnsupported database URL 'z'.)r   r    
startswithsplit
ValueError)urlr   r   r   get_db_pathA   s   
r+   c                 C   sB   | d }t |az	tjdd W dS  ty    td|  dw )zAcquire an OS-level file lock to prevent multi-process access.

    Uses filelock for cross-platform support (macOS, Linux, Windows).
    The OS automatically releases the lock when the process exits, even on crashes.
    z.lockr   )timeoutz$Could not acquire lock on database 'zk'. Another ComfyUI process may already be using it. Use --database-url to specify a separate database file.N)r   _db_lockacquirer   RuntimeError)db_path	lock_pathr   r   r   _acquire_file_lockK   s   
r2   c                 C   s   | dv S )zACheck if the database URL refers to an in-memory SQLite database.)zsqlite:///:memory:z	sqlite://r   db_urlr   r   r   _is_memory_db^   s   r5   c                  C   s6   t j} td|   t| rt|  d S t|  d S )NzDatabase URL: )r   r    loggingdebugr5   _init_memory_db_init_file_dbr3   r   r   r   init_dbc   s
   r:   c                 C   s@   t | tddid}t|ddd }tj| t|dadS )	u	  Initialize an in-memory SQLite database using metadata.create_all.

    Alembic migrations don't work with in-memory SQLite because each
    connection gets its own separate database — tables created by Alembic's
    internal connection are lost immediately.
    check_same_threadF)	poolclassconnect_argsconnectc                 S      |   }|d |  d S NzPRAGMA foreign_keys=ONcursorexecuteclosedbapi_connectionconnection_recordrB   r   r   r   set_sqlite_pragmaz      
z*_init_memory_db.<locals>.set_sqlite_pragmabindN)	r   r   r   listens_forr   metadata
create_allr   r   )r4   enginerH   r   r   r   r8   m   s   

r8   c              
   C   s   t  }tj|}t }t| }t|ddd }| }t	
|}| }t|}	|	 }
|
du r:td nG||
kr|d }|rKt|| nd}zt||
 td| d|
  W n  ty } z|rut|| t| td	 |d}~ww |  t| t|d
adS )zBInitialize a file-backed SQLite database using Alembic migrations.r>   c                 S   r?   r@   rA   rE   r   r   r   rH      rI   z(_init_file_db.<locals>.set_sqlite_pragmaNzNo target revision found.z.bkpzDatabase upgraded from z to zError upgrading database: rJ   )r+   r   r   existsr%   r   r   rL   r>   r	   	configureget_current_revisionr
   from_configget_current_headr6   warningshutilcopyr   upgradeinfo	Exceptionremove	exceptionrD   r2   r   r   )r4   r0   	db_existsr$   rO   rH   conncontextcurrent_revscript
target_revbackup_pather   r   r   r9      s@   





r9   c                   C   s   t  S )N)r   r   r   r   r   create_session   s   re   )/r6   r   rV   
app.loggerr   utils.install_utilr   filelockr   r   comfy.cli_argsr   r   r   alembicr   alembic.configr   alembic.runtime.migrationr	   alembic.scriptr
   
sqlalchemyr   r   sqlalchemy.ormr   sqlalchemy.poolr   app.database.modelsr   app.assets.database.modelsappImportErrorrd   stripr   r   r%   r+   r-   r2   r5   r:   r8   r9   re   r   r   r   r   <module>   sT    
8