o
    3Ih                     @   s0  d dl Z d dlZ d dlZd dl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 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 dlmZ 	d$dededededef
ddZ de!e ddfddZ"d%ddZ#deddfddZ$dedededdfd d!Z%deddfd"d#Z&dS )&    N)Event)Client)
Collection)cli)build_cli_args)SettingsSystem)get_sql)SqliteDB)Table)
invariants         ?hostportmax_retriesinitial_delayreturnc              	   C   sz   |}t |D ]4}ztj| |d}| }|dkrW  dS W n ty*   td Y nw ||d k r:t| |d9 }qdS )a9  Wait for server to be ready using exponential backoff.
    Args:
        client: ChromaDB client instance
        max_retries: Maximum number of retry attempts
        initial_delay: Initial delay in seconds before first retry
    Returns:
        bool: True if server is ready, False if max retries exceeded
    r   r   r   Tz!Heartbeat failed, trying again...      F)rangechromadb
HttpClient	heartbeat	Exceptionprinttimesleep)r   r   r   r   delayattemptclientr    r"   V/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/chromadb/test/test_cli.pywait_for_server   s"   
r$   argsc                 C   s   | t _t  d S )N)sysargvr   app)r%   r"   r"   r#   	start_app2   s   r)   c                  C   sx   ddd} ddg}| tdi |  t| tjt|fd}|  td t	ddd	s2J d
|
  |  d S )Nchroma_test_dataiA  )pathr   chromaruntargetr%   r   	localhostr   z4Server failed to start within maximum retry attemptsr"   )extendr   r   multiprocessingProcessr)   startr   r   r$   	terminatejoin)kwargsr%   server_processr"   r"   r#   test_app6   s   

r9   sqlite_persistentc                 C   s  | }| t}|j}|dd || t|}|d}|d}dtdt	dd fdd	}||d
 ||d |
 *}td}	| |	d}
t|
\}}||| | g ks`J W d    n1 sjw   Y  ddd|jjdgt_t  |
 8}td}	| |	d}
t|
\}}||| | }t|dksJ |d d dksJ W d    n1 sw   Y  t|dr|`|jdjsJ t|||gd d S )Nautomatically_purgeFcollection1collection2
collectionnumr   c                 S   s2   dd t |D }tj|d}| j||d d S )Nc                 S   s   g | ]}t |qS r"   )str).0ir"   r"   r#   
<listcomp>T   s    z4test_vacuum.<locals>.add_records.<locals>.<listcomp>r   )ids
embeddings)r   nprandomrandadd)r>   r?   rD   rE   r"   r"   r#   add_recordsS   s   z test_vacuum.<locals>.add_recordsd   i  maintenance_log*r,   vacuum--path--forcer   r   r   configT)instancer
   rQ   set_parameter
set_configr   from_systemcreate_collectionr   inttxr   querybuilderfrom_selectr	   executefetchallsettingspersist_directoryr&   r'   r   r(   lenhasattrget_parametervaluer   log_size_below_max)r:   systemsqliterQ   r!   r<   r=   rJ   curtqsqlparamsrowsr"   r"   r#   test_vacuumE   sB   










rm   r^   ready_eventshutdown_eventc                 C   sj   t | d}|  |t}| }|d |  |  W d    n1 s*w   Y  |  d S )N)r^   z"INSERT INTO tenants DEFAULT VALUES)	r   r4   rR   r
   rX   r\   setwaitstop)r^   rn   ro   re   rf   rg   r"   r"   r#   simulate_transactional_write{   s   




rs   c                 C   s   t d}| }| }|jt| j||fd}|  |  z(ddd| jjdddgt	_
t  | }d	|j v s>J W |  |  d
S |  |  w )zVVacuum command should fail with details if there is a long-lived lock on the database.spawnr.   r,   rN   rO   rP   z	--timeout10zFailed to vacuum ChromaN)r2   get_contextr   r3   rs   r^   r4   rq   r_   r&   r'   r   r(   
readouterrerrstriprp   r6   )r:   capfdctxrn   ro   processcapturedr"   r"   r#   test_vacuum_errors_if_locked   s$   


r~   )r   r   )r   N)'r2   multiprocessing.contextr&   r   multiprocessing.synchronizer   r   chromadb.api.clientr   chromadb.api.models.Collectionr   chromadb.clir   chromadb.cli.clir   chromadb.configr   r   chromadb.db.baser	   chromadb.db.impl.sqliter
   pypikar   numpyrF   chromadb.test.propertyr   r@   rW   floatboolr$   listr)   r9   rm   rs   r~   r"   r"   r"   r#   <module>   sR    

6
