o
    QDi                     @  s   d dl mZ d dl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mZ dd	lmZmZ erRd d
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ejdddG dd dZdS )    )annotationsN)PIPE)TYPE_CHECKINGOptionalUnion   )FrictionlessException)platform   )settingstypes)Engine)
SqlAdapter)Report)TableResource)RowTF)kw_onlyreprc                   @  s  e Zd ZU ded< ded< ded< dZded	< d
Zded< dZded< dZded< dZded< d
Z	ded< d
Z
ded< ejddZded< dd Zd8ddZdd Zdd  Zd8d!d"Zd9d$d%Zd:d'd(Zd9d)d*Zd+d, Zd-d. Zd/d0 Zd;d3d4Zd<d6d7Zd
S )=Indexerr   resourcezUnion[str, Engine]databasestr
table_nameFboolfastNzOptional[str]qsv_pathuse_fallbackwith_metadataignore_constraintszOptional[types.IOnRow]on_rowzOptional[types.IOnProgress]on_progress)initr   adapterc                 C  sD   t j}| jjdkrd| _| j}t|tr||}t j	
|| _d S )NcsvF)r	   
sqlalchemyr   formatr   r   
isinstancer   create_enginefrictionless_formatsr   r"   )selfsaengine r,   U/var/www/Datamplify/venv/lib/python3.10/site-packages/frictionless/indexer/indexer.py__attrs_post_init__$   s   

zIndexer.__attrs_post_init__returnOptional[Report]c              	   C  s   |    | j4 | jjjrg | jj_|   	 z|  W W  d    S  ty:   | jr5| jr5d| _Y q| 	   w 1 s>w   Y  d S )NTF)
prepare_resourcer   schemaforeign_keyscreate_tablepopulate_table	Exceptionr   r   delete_tabler)   r,   r,   r-   index/   s"   

zIndexer.indexc                 C  s0   | j rtj| j }|| j}|| j_d S d S N)r   r	   r(   
QsvAdapterread_schemar   r2   )r)   r"   r2   r,   r,   r-   r1   @   s
   zIndexer.prepare_resourcec                 C  s$   | j j| jj| jd| j| jd d S )NT)r   forcer   r   )r"   write_schemar   r2   r   r   r   r8   r,   r,   r-   r4   F   s   
zIndexer.create_tablec                 C  s$   | j r|  S | jr|  S |  S r:   )r   populate_table_fastr   populate_table_metapopulate_table_baser8   r,   r,   r-   r5   O   s
   zIndexer.populate_tableNonec                 C  s   | j j| jj| j| jd d S N)r   r   )r"   write_row_streamr   
row_streamr   
report_rowr8   r,   r,   r-   rA   V   s
   
zIndexer.populate_table_baser   c                 C  s   | j j| j| j| jdS rC   )r"   write_resource_with_metadatar   r   rF   r8   r,   r,   r-   r@   ]   s
   zIndexer.populate_table_metac                 C  s:   | j jj}|jdr|  S |jdr|  S td)Nsqlite
postgresqlz/Fast mode is only supported for Postgres/Sqlite)r"   r+   url
drivername
startswithpopulate_table_fast_sqlitepopulate_table_fast_postgresqlr   )r)   rJ   r,   r,   r-   r?   d   s   
zIndexer.populate_table_fastc                 C  s   | j jjjsJ d| j d}dd| j jjj|g}tj|ttd}t| j	j
ddD ]\}}|dkr7|j| | | j	jj d q)|j  |  d S )	Nz.import '|cat -' ""sqlite3z-csv)stdinstdoutr
   )start bytes)r"   r+   rJ   r   r   
subprocessPopenr   	enumerater   byte_streamrQ   writereport_progressstatsbytesclosewait)r)   sql_commandcommandprocessline_numberliner,   r,   r-   rM   l   s   
z"Indexer.populate_table_fast_sqlitec              
   C  s   | j jjjdd}tj|\}| ?}d| j }|	|%}	 | j
jtjd}|s,n|| | | j
jj d q!W d    n1 sGw   Y  W d    n1 sVw   Y  W d    d S W d    d S 1 snw   Y  d S )NF)hide_passwordzCOPY "%s" FROM STDIN CSV HEADERT)sizerT   )r"   r+   rJ   render_as_stringr	   psycopgconnectcursorr   copyr   
read_bytesr   
BLOCK_SIZErY   rZ   r[   r\   )r)   database_url
connectionri   queryrj   chunkr,   r,   r-   rN   x   s&   


"z&Indexer.populate_table_fast_postgresqlc                 C  s   | j | j d S r:   )r"   delete_resourcer   r8   r,   r,   r-   r7      s   zIndexer.delete_tablerowr   c                 C  s*   | j r
|  | j| | |j d d S )Nz rows)r   r   rZ   
row_number)r)   rr   r,   r,   r-   rF      s   zIndexer.report_rowmessagec                 C  s   | j r|  | j| d S d S r:   )r    r   )r)   rt   r,   r,   r-   rZ      s   zIndexer.report_progress)r/   r0   )r/   rB   )r/   r   )rr   r   )rt   r   )__name__
__module____qualname____annotations__r   r   r   r   r   r   r    attrsfieldr"   r.   r9   r1   r4   r5   rA   r@   r?   rM   rN   r7   rF   rZ   r,   r,   r,   r-   r      s2   
 

	



r   )
__future__r   rU   r   typingr   r   r   ry   	exceptionr   r	    r   r   r$   r   formats.sqlr   reportr   	resourcesr   tabler   definer   r,   r,   r,   r-   <module>   s     