U
    +Òd¤  ã                   @   sª   d dl Zd dlZd dlmZ 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 G dd„ deƒZdd„ Zdd„ Ze eje¡ e d	e¡ G d
d„ dƒZedœdd„ZdS )é    N)ÚtimeGeoObjectc                       s   e Zd Zd‡ fdd„	Z‡  ZS )ÚImageTableNotInDbExceptionÚ c                    s   d|› | _ tƒ  | j ¡ d S )NzImage table not in db )ÚmessageÚsuperÚ__init__)ÚselfZdbName©Ú	__class__© ú5/home/isk/software/changedetection/src/db_skeleton.pyr      s    z#ImageTableNotInDbException.__init__)r   )Ú__name__Ú
__module__Ú__qualname__r   Ú__classcell__r   r   r	   r   r      s   r   c                 C   s,   t  ¡ }t || ¡ | d¡ t | ¡ ¡S )zB
    http://stackoverflow.com/a/31312102/190597 (SoulNibbler)
    r   )ÚioÚBytesIOÚnpÚsaveÚseekÚsqlite3ÚBinaryÚread)ÚarrÚoutr   r   r   Úadapt_array   s    
r   c                 C   s   t  | ¡}| d¡ t |¡S )Nr   )r   r   r   r   Úload)Útextr   r   r   r   Úconvert_array   s    

r   Úarrayc                   @   s„   e Zd Zedœdd„Zedœdd„Zdd„ Zed	œd
d„Ze	j
dœdd„Zee	jedœdd„Zdd„ Zdd„ Ze	j
edœdd„ZdS )Ú	dbs_class)Údb_file_namec              	   C   st   || _ d | _d | _|  |¡ t |¡D}| ¡ }| d¡ | ¡ }t|ƒ| _	dd„ t
| j	 ¡ ƒD ƒ| _W 5 Q R X d S )Nz0SELECT name,type FROM pragma_table_info('image')c                 S   s$   g | ]\}}d |d kr|d ‘qS )ZBLOBé   r   r   )Ú.0ÚidxÚxr   r   r   Ú
<listcomp>/   s      z&dbs_class.__init__.<locals>.<listcomp>)r!   Ú	connectorÚcursorÚcheck_create_dbr   ÚconnectÚexecuteÚfetchallÚdictÚimage_columnsÚ	enumerateÚitemsÚimage_arrays)r   r!   r'   r(   Úresr   r   r   r   %   s    


zdbs_class.__init__)Únamec              	   C   sx   z^t j |¡s|  ¡  nDt |¡4}| ¡ }| d¡ | ¡ }t	|ƒdkrRt
|ƒ‚W 5 Q R X W n   t ¡  Y nX d S )NzBSELECT name FROM sqlite_master WHERE type='table' AND name='image'r   )ÚosÚpathÚisfileÚcreate_image_dbr   r*   r(   r+   r,   Úlenr   Úkill_allZkill_db_agent)r   r3   r'   r(   r2   r   r   r   r)   2   s    

zdbs_class.check_create_dbc              	   C   s2   d}t  | j¡}| ¡ }| |¡ W 5 Q R X d S )Na  CREATE TABLE image(
            hash BIGINT PRIMARY KEY,
            fullpath TEXT  UNIQUE NOT NULL,
            name TEXT UNIQUE NOT NULL,
            image TEXT NOT NULL UNIQUE,
            range REAL,
            perc BLOB,
            time BLOB,
            lat BLOB,
            lon BLOB,
            altitude BLOB,
            yaw BLOB,
            speed BLOB,
            angv_x BLOB,
            angv_y BLOB,
            angv_z BLOB,
            convex_hull BLOB,
            bb BLOB,
            data BLOB
        );)r   r*   r!   r(   r+   )r   Zcreate_stingr'   r(   r   r   r   r7   @   s    zdbs_class.create_image_db)ÚtimeGeoc              
   C   sÚ  t  | j¡Â}| ¡ }| d|jf¡}| ¡ d k	rBW 5 Q R £ d S i }|j|d< t|jƒ|d< t|j	ƒ|d< |j
|d< t  |j ¡ ¡|d< t  |j ¡ ¡|d< t  |j ¡ ¡|d< t  |j ¡ ¡|d	< t  |j ¡ ¡|d
< t  |j ¡ ¡|d< t  |j ¡ ¡|d< t  |j ¡ ¡|d< t  |j ¡ ¡|d< t  |j ¡ ¡|d< |j|d< t  |j ¡ ¡|d< t  |j ¡ ¡|d< t  |j ¡ ¡|d< | dd | ¡ ¡› ddt| ¡ ƒ d d… › dt| ¡ ƒ¡ |  ¡  W 5 Q R X d S )Nz%SELECT name FROM image WHERE hash = ?ÚhashÚfullpathÚimager3   ÚpercÚtimeÚlatÚlonÚaltitudeÚyawÚspeedÚangv_xÚangv_yÚangv_zÚrangeÚconvex_hullÚbbÚdatazinsert into image (ú,z
) VALUES (z?,éÿÿÿÿú))!r   r*   r!   r(   r+   r;   ÚfetchoneÚstrÚfnamer=   Úidr   r>   Útobytesr?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   Úrtree_bbrK   ÚjoinÚkeysr8   ÚtupleÚvaluesÚcommit)r   r:   r'   r(   r2   Úrecordr   r   r   Úinsert_image\   s8    


2
ÿzdbs_class.insert_image)r;   c              
   C   sš   t  | j¡„}| ¡ }| d|f¡ | ¡ }|d krBW 5 Q R £ d S tt| j 	¡ |ƒƒ}| j
D ]}tj|| tjd||< q\td |ƒW  5 Q R £ S Q R X d S )Nú"SELECT * FROM image WHERE hash = ?©Údtype)r   r*   r!   r(   r+   rO   r-   Úzipr.   rV   r1   r   Ú
frombufferÚfloat64r   ©r   r;   r'   r(   r2   Úres2Úcolr   r   r   Ú
read_image}   s    
zdbs_class.read_image)Úimage_idÚtimegeoÚreturnc              	      sT  t  | j¡<}| ¡ }| d|f¡ | ¡ }|d krDW 5 Q R £ d S tt| j 	¡ |ƒƒ‰| j
D ]}tjˆ| tjdˆ|< q^| jD ]}t ˆ| ¡ˆ|< q‚|  |¡\}‰‰ dd„ }|ˆd |d d …df ƒ |ˆd |ƒ |ˆd |d d …d	f ƒ |ˆd
 |d d …df ƒ |ˆd |d d …df ƒ |ˆd |d d …df ƒ |ˆd |d d …df ƒ |ˆd |d d …df ƒ |ˆd |d d …df ƒ |ˆd |d d …df ƒ t ‡fdd„|d d …df D ƒ¡}	t ‡ fdd„|d d d… D ƒ¡}
t ‡fdd„ˆd D ƒ¡}t ‡fdd„ˆd d d d… D ƒ¡}||	|ƒ ||
|ƒ W 5 Q R X d S )Nz(SELECT * FROM image WHERE image_name = ?r]   c                 S   s0   | j |j krt d¡ t | |¡s,t d¡ d S )Nz#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<z!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>)ÚshapeÚloggingÚinfor   Úarray_equal)Úa1Úa2r   r   r   Ú
cmp_arrays›   s    
z)dbs_class.check_image.<locals>.cmp_arraysr>   r   Útimesr@   é   rA   é   rB   é   rC   é   rD   é   rE   é   rF   é   rG   é	   c                    s   g | ]}ˆ |ƒ‘qS r   r   ©r#   r%   ©Út_mapr   r   r&   ¬   s     z)dbs_class.check_image.<locals>.<listcomp>c                    s   g | ]}ˆ |ƒ‘qS r   r   ry   ©Úperc_mapr   r   r&   ­   s     rM   c                    s   g | ]}ˆ d  |ƒ‘qS rz   r   ry   ©rc   r   r   r&   ¯   s     c                    s   g | ]}ˆ d  |ƒ‘qS r|   r   ry   r~   r   r   r&   °   s     )r   r*   r!   r(   r+   rO   r-   r_   r.   rV   r1   r   r`   ra   Zimage_funcsÚpickleÚloadsZcreate_maps_for_imagesr   )r   rf   rg   r'   r(   r2   rd   rp   ro   Zres_t_oZ
res_perc_oZres_t_sZ
res_perc_sr   )r}   rc   r{   r   Úcheck_image‹   s:    

$"&
zdbs_class.check_imagec                 C   s   d S ©Nr   ©r   r   r   r   Úcreate_object_dbµ   s    zdbs_class.create_object_dbc                 C   s   d S r‚   r   rƒ   r   r   r   Úinsert_object¸   s    zdbs_class.insert_object)r;   rh   c              
   C   sä   t  | j¡Î}| ¡ }| d|f¡ | ¡ }|d krBW 5 Q R £ d S tt| j 	¡ |ƒƒ}| j
D ]}tj|| tjd||< q\t |d t|d ƒd df¡|d< t |d t|d ƒd df¡|d< t|d |ƒW  5 Q R £ S Q R X d S )Nr\   r]   rK   é
   rI   rq   )r   r*   r!   r(   r+   rO   r-   r_   r.   rV   r1   r   r`   ra   Úresizer8   r   rb   r   r   r   Úis_in_image_db»   s    
$$zdbs_class.is_in_image_dbN)r   r   r   rP   r   r)   r7   r   r[   r   Úint64re   r   r   r„   r…   rˆ   r   r   r   r   r    $   s   !*r    )Úfnc                 C   s2   t  d¡}t  | ¡}| |¡ | ¡  | ¡  d S )Nz:memory:)r   r*   ÚbackupÚclose)rŠ   Z	memory_dbZ	backup_dbr   r   r   ÚcopyMemoryToDiskË   s
    


r   )Úos.pathr4   r   Zsrc.kill_allr9   Únumpyr   r   r   rj   Úsrc.timeGeor   Ú	Exceptionr   r   r   Úregister_adapterÚndarrayÚregister_converterr    rP   r   r   r   r   r   Ú<module>   s    	 (