o
    3Ih$                     @   s:  d dl Z d dlmZmZmZmZ d dlmZmZ d dl	m
Z
mZ d dlm  mZ d dlmZ d dlmZ d dlmZmZmZ d dlZd dlmZ d dlZd d	lmZmZmZmZm Z  d d
l!m"Z" d dl#m$Z$ d dl%Z%d dl&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z- e .e/Z0G dd dej1Z1G dd deeeZ2dS )    N)
ConnectionLockPoolPerThreadPoolPool)MigratableDB	Migration)SystemSettings)SqlEmbeddingsQueue)SqlSysDB)OpenTelemetryClientOpenTelemetryGranularitytrace_method)override)SequencecastOptionalTypeAny)Literal)TracebackTypeUUID)local)files)Traversablec                
   @   sv   e Zd ZU eed< eed< dedefddZede	j
fdd	Zed
eee  dee dee ded fddZdS )	TxWrapper_conn_pool	conn_poolstackc                 C   s   || _ | | _|| _d S N)	_tx_stackconnectr   r   )selfr   r     r%   W/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/chromadb/db/impl/sqlite.py__init__    s   

zTxWrapper.__init__returnc                 C   s@   t | jjdkr| jd | jd | jj|  | j S )Nr   PRAGMA case_sensitive_like = ONzBEGIN;)lenr"   r    r   executeappendcursorr$   r%   r%   r&   	__enter__%   s
   
zTxWrapper.__enter__exc_type	exc_value	tracebackFc                 C   sZ   | j j  t| j jdkr|d u r| j  n| j  | j   | j	
| j dS )Nr   F)r"   r    popr*   r   commitrollbackr-   closer   return_to_pool)r$   r0   r1   r2   r%   r%   r&   __exit__-   s   
zTxWrapper.__exit__N)__name__
__module____qualname__r   __annotations__r   r   r'   r   baseCursorr/   r   r   BaseExceptionr   r   r8   r%   r%   r%   r&   r      s    
 
r   c                       s  e Zd ZU eed< eed< ee ed< eed< e	ed< e
ed< def fdd	Zed
ejed3 fdd
Zedejed3 fddZeedeej fddZeedefddZeedefddZedee fddZedefddZedejed3 fddZedejed3ddZedejede
fddZed ejed!edee  fd"d Z!ed#e"j#d$e ddfd%d&Z$eed'e%e& de%e' fd(d)Z(eed*e%e' de%e& fd+d,Z)eedee* fd-d.Z+d4d0e,ddfd1d2Z-  Z.S )5SqliteDB
_conn_pool	_settings_migration_imports_db_filer"   _is_persistentsystemc                    s   |j | _tdtdtdg| _| jd| _|t| _| js,d| _t	| jdd| _
n"| jdd	 | _tj| jsHtjtj| jdd
 t| j| _
t | _t | d S )Nz$chromadb.migrations.embeddings_queuezchromadb.migrations.sysdbzchromadb.migrations.metadbis_persistentzfile::memory:?cache=sharedT)is_uripersist_directoryz/chroma.sqlite3)exist_ok)settingsrB   r   rC   requirerE   r   _opentelemetry_clientrD   r   rA   ospathexistsmakedirsdirnamer   r   r"   superr'   )r$   rF   	__class__r%   r&   r'   G   s"   zSqliteDB.__init__zSqliteDB.startr(   Nc                    s   t    |  }|d |d W d    n1 sw   Y  |   | jddkr?| jdj	du rAt
d d S d S d S )NzPRAGMA foreign_keys = ONr)   
migrationsapplyautomatically_purgeFu   ⚠️ It looks like you upgraded from a version below 0.5.6 and could benefit from vacuuming your database. Run chromadb utils vacuum --help for more information.)rS   starttxr+   initialize_migrationsrB   rL   configget_parametervalueloggerwarnr$   currT   r%   r&   rY   a   s   


zSqliteDB.stopc                    s   t    | j  d S r!   )rS   stoprA   r6   r.   rT   r%   r&   rc   s   s   
c                   C      t jS r!   )pypikaQueryr%   r%   r%   r&   querybuildery      zSqliteDB.querybuilderc                   C      dS )N?r%   r%   r%   r%   r&   parameter_format~      zSqliteDB.parameter_formatc                   C   ri   )Nsqliter%   r%   r%   r%   r&   migration_scope   rl   zSqliteDB.migration_scopec                 C   s   | j S r!   )rC   r.   r%   r%   r&   migration_dirs   s   zSqliteDB.migration_dirsc                 C   s$   t | jds
g | j_t| j| jdS )Nr    )r    )hasattrr"   r    r   rA   r.   r%   r%   r&   rZ      s   zSqliteDB.txzSqliteDB.reset_statec                    s   | j ds
td|  }|d | D ]}|d|d   qW d    n1 s/w   Y  | j  |   t	 
  d S )Nallow_resetzResetting the database is not allowed. Set `allow_reset` to true in the config in tests or other non-production environments where reset should be permitted.zo
                    SELECT name FROM sqlite_master
                    WHERE type='table'
                    zDROP TABLE IF EXISTS r   )rB   rL   
ValueErrorrZ   r+   fetchallrA   r6   rY   rS   reset_state)r$   rb   rowrT   r%   r&   rt      s   


zSqliteDB.setup_migrationsc                 C   s8   |   }|d W d    d S 1 sw   Y  d S )Na~  
                    CREATE TABLE IF NOT EXISTS migrations (
                        dir TEXT NOT NULL,
                        version INTEGER NOT NULL,
                        filename TEXT NOT NULL,
                        sql TEXT NOT NULL,
                        hash TEXT NOT NULL,
                        PRIMARY KEY (dir, version)
                    )
                    )rZ   r+   ra   r%   r%   r&   setup_migrations   s
   
"zSqliteDB.migrations_initializedc                 C   s\   |    }|d | d dkr	 W d    dS 	 W d    dS 1 s'w   Y  d S )Nz[SELECT count(*) FROM sqlite_master
                WHERE type='table' AND name='migrations'r   FT)rZ   r+   fetchonera   r%   r%   r&   migrations_initialized   s   
	$zSqliteDB.db_migrationsdirc           
      C   s   |   M}|d|jf g }| D ]4}tt|d }tt|d }tt|d }tt|d }tt|d }	|t|||||	| 	 d q|W  d    S 1 sTw   Y  d S )Nz
                SELECT dir, version, filename, sql, hash
                FROM migrations
                WHERE dir = ?
                ORDER BY version ASC
                r               )ry   versionfilenamesqlhashscope)
rZ   r+   namers   r   strintr,   r   rn   )
r$   ry   rb   rV   ru   	found_dirfound_versionfound_filename	found_sql
found_hashr%   r%   r&   db_migrations   s0   


$rb   	migrationc              	   C   s<   | |d  |d|d |d |d |d |d f d S )Nr   zw
            INSERT INTO migrations (dir, version, filename, sql, hash)
            VALUES (?, ?, ?, ?, ?)
            ry   r~   r   r   )executescriptr+   )r$   rb   r   r%   r%   r&   apply_migration   s   zSqliteDB.apply_migrationr^   c                 C      | d urt | S d S r!   r   )r^   r%   r%   r&   uuid_from_db      zSqliteDB.uuid_from_dbuuidc                 C   r   r!   )r   )r   r%   r%   r&   
uuid_to_db   r   zSqliteDB.uuid_to_dbc                   C   rd   r!   )sqlite3IntegrityErrorr%   r%   r%   r&   unique_constraint_error  rh   z SqliteDB.unique_constraint_error   timeoutc                 C   s:   | j  }|dt|d   |d |d dS )zdRuns VACUUM on the database. `timeout` is the maximum time to wait for an exclusive lock in seconds.zPRAGMA busy_timeout = i  VACUUMz}
            INSERT INTO maintenance_log (operation, timestamp)
            VALUES ('vacuum', CURRENT_TIMESTAMP)
            N)rA   r#   r+   r   )r$   r   connr%   r%   r&   vacuum  s   

zSqliteDB.vacuum)r(   N)r   )/r9   r:   r;   r   r<   r	   r   r   r   r   boolr   r'   r   r   ALLr   rY   rc   staticmethodr   re   rf   rg   rk   rn   ro   r   rZ   rt   rv   rx   r   r   r=   r>   r   r   r   r   r   r   r?   r   r   r   __classcell__r%   r%   rT   r&   r@   ?   sf   
 





r@   )3loggingchromadb.db.impl.sqlite_poolr   r   r   r   chromadb.db.migrationsr   r   chromadb.configr   r	   chromadb.db.basedbr=   #chromadb.db.mixins.embeddings_queuer
   chromadb.db.mixins.sysdbr    chromadb.telemetry.opentelemetryr   r   r   r   	overridesr   re   typingr   r   r   r   r   typing_extensionsr   typesr   rN   r   r   	threadingr   importlib_resourcesr   importlib_resources.abcr   	getLoggerr9   r_   r   r@   r%   r%   r%   r&   <module>   s,    
#