o
    :i                     @   s   d dl Z d dlZ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
 dZdZdeddfd	d
ZG dd dZdddZdS )    N)Path)Iterable)modelszstorage.dbmzstorage.sqlitelocationreturnc           
   
   C   s  t | t }t | t }| rd S | sd S zUtt|d}tt|}|	 }|
d | D ]%}|| }t|trE|d}t|}t|}|
d|t|f q5|  |  |  |  W d S  ty }	 ztd|	 td |	d }	~	ww )NcCCREATE TABLE IF NOT EXISTS points (id TEXT PRIMARY KEY, point BLOB)utf-8z INSERT INTO points VALUES (?, ?)z Failed to migrate dbm to sqlite:zKPlease try to use previous version of qdrant-client or re-create collection)r   STORAGE_FILE_NAME_OLDSTORAGE_FILE_NAMEexistsdbmopenstrsqlite3connectcursorexecutekeys
isinstanceencodepickleloadsCollectionPersistence
encode_keyBinarycommitcloseunlink	Exceptionloggingerror)
r   dbm_pathsql_pathdbm_storageconcurkeyvalue
sqlite_keye r+   l/home/aiteam/pcaa-dev/dashboard-backend/venv/lib/python3.10/site-packages/qdrant_client/local/persistence.pytry_migrate_to_sqlite   sF   




r-   c                   @   s   e Zd ZU dZedB ed< edejde	fddZ
dde	d	efd
dZdddZdddZdejddfddZdejddfddZdeej fddZdS )r   NCHECK_SAME_THREADr'   r   c                 C   s   t t|dS )Nr	   )base64	b64encoder   dumpsdecode)clsr'   r+   r+   r,   r   ?   s   z CollectionPersistence.encode_keyFr   force_disable_check_same_threadc                 C   s   t | t|t | _| jjjddd | jdu rA|du rAtd}|	d
 d }|dk| j_W d   n1 s<w   Y  |rGd| j_tjt| j| jd	| _|   dS )
z
        Create or load a collection from the local storage.
        Args:
            location: path to the collection directory.
        T)exist_okparentsNFz:memory:zNselect * from pragma_compile_options where compile_options like 'THREADSAFE=%'r   zTHREADSAFE=1)check_same_thread)r-   r   r   r   parentmkdirr.   r   r   r   fetchone	__class__r   storage_ensure_table)selfr   r4   tmp_conn
threadsafer+   r+   r,   __init__C   s&   zCollectionPersistence.__init__c                 C   s   | j   d S )N)r<   r   )r>   r+   r+   r,   r   e   s   zCollectionPersistence.closec                 C   s"   | j  }|d | j   d S )Nr   )r<   r   r   r   )r>   r   r+   r+   r,   r=   h   s   

z#CollectionPersistence._ensure_tablepointc                 C   sD   |  |j}t|}| j }|d|t|f | j	  dS )zi
        Persist a point in the local storage.
        Args:
            point: point to persist
        z+INSERT OR REPLACE INTO points VALUES (?, ?)N)
r   idr   r1   r<   r   r   r   r   r   )r>   rB   r'   r(   r   r+   r+   r,   persistm   s   

zCollectionPersistence.persistpoint_idc                 C   s0   |  |}| j }|d|f | j  dS )zv
        Delete a point from the local storage.
        Args:
            point_id: id of the point to delete
        zDELETE FROM points WHERE id = ?N)r   r<   r   r   r   )r>   rE   r'   r   r+   r+   r,   delete   s   

zCollectionPersistence.deletec                 c   s8    | j  }|d | D ]
}t|d V  qdS )zg
        Load a point from the local storage.
        Returns:
            point: loaded point
        zSELECT point FROM pointsr   N)r<   r   r   fetchallr   r   )r>   r   rowr+   r+   r,   load   s   

zCollectionPersistence.load)Fr   N)__name__
__module____qualname__r.   bool__annotations__classmethodr   ExtendedPointIdr   r   rA   r   r=   PointStructrD   rF   r   rI   r+   r+   r+   r,   r   <   s   
 
"
r   c                  C   s   dd l } |  S}t|}tjdg dddid}|| | D ]}||ks*J  ~t|}| D ]}||ks<J  ||j ||j | D ]}J dW d    d S 1 s^w   Y  d S )Nr      )g      ?g       @g      @a)rC   vectorpayloadFzShould not load anything)	tempfileTemporaryDirectoryr   r   rR   rD   rI   rF   rC   )rW   tmpdirpersistencerB   loaded_point_r+   r+   r,   test_persistence   s&   

"r]   rJ   )r/   r   r    r   r   pathlibr   typingr   qdrant_client.httpr   r
   r   r   r-   r   r]   r+   r+   r+   r,   <module>   s    -`