o
    h                     @   s   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Zd dl	Z	d dl
Z
d dlZd dlmZ ddlmZmZ eejddZG d	d
 d
ZdedefddZddee fddZdd Zedkrhe  dS dS )    N)Path)Optional)datetime   )AsyncLoggerLogLevelT)	log_levelverbosec                   @   s\   e Zd ZdefddZdedefddZdedefd	d
ZdededefddZdd Z	dS )DatabaseMigrationdb_pathc                 C   s   || _ | tj|| _d S N)r   _ensure_content_dirsospathdirnamecontent_paths)selfr    r   P/var/www/Befach/backend/venv/lib/python3.10/site-packages/crawl4ai/migrations.py__init__   s   zDatabaseMigration.__init__	base_pathreturnc                 C   sN   dddddd}i }|  D ]\}}tj||}tj|dd |||< q|S )	Nhtml_contentcleaned_htmlmarkdown_contentextracted_contentscreenshots)htmlcleanedmarkdown	extractedr   T)exist_ok)itemsr   r   joinmakedirs)r   r   dirsr   keyr   r   r   r   r   r      s   
z&DatabaseMigration._ensure_content_dirscontentc                 C   s"   t  }||  | }|S r   )xxhashxxh64updateencode	hexdigest)r   r'   xcontent_hashr   r   r   _generate_content_hash(   s   z(DatabaseMigration._generate_content_hashcontent_typec              	      s   |sdS |  |}tj| j| |}tj|sEtj|ddd4 I d H }||I d H  W d   I d H  |S 1 I d H s@w   Y  |S )N wzutf-8)encoding)	r/   r   r   r#   r   existsaiofilesopenwrite)r   r'   r0   r.   	file_pathfr   r   r   _store_content/   s   
z DatabaseMigration._store_contentc                    s  t jddd zt| j4 I dH }|d4 I dH }| I dH }W d  I dH  n1 I dH s5w   Y  d}|D ][}|\}}}}	}
}| |dI dH }| |dI dH }| |	d	I dH }| |
d
I dH }| |dI dH }|d||||||fI dH  |d7 }|d dkrt jd| ddd q>| I dH  t j	d| ddd W d  I dH  W dS 1 I dH sw   Y  W dS  t
y } zt jdddt|id |d}~ww )z/Migrate existing database to file-based storagezStarting database migration...INITtagNzqSELECT url, html, cleaned_html, markdown, 
                       extracted_content, screenshot FROM crawled_datar   r   r   r   r    r   aE  
                        UPDATE crawled_data 
                        SET html = ?, 
                            cleaned_html = ?,
                            markdown = ?,
                            extracted_content = ?,
                            screenshot = ?
                        WHERE url = ?
                    r   d   z	Migrated z records...zMigration completed. z records processed.COMPLETEMigration failed: {error}ERRORerrormessager=   params)loggerinfo	aiosqliteconnectr   executefetchallr:   commitsuccess	ExceptionrB   str)r   dbcursorrowsmigrated_countrowurlr   r   r   r   
screenshot	html_hashcleaned_hashmarkdown_hashextracted_hashscreenshot_hasher   r   r   migrate_database<   sN   (
2'
z"DatabaseMigration.migrate_databaseN)
__name__
__module____qualname__rO   r   dictr   r/   r:   r]   r   r   r   r   r
      s    r
   r   r   c              
      s   t j| stjddd dS t d}|  d| }zt	dI dH  t
| | tjd| d	d |W S  tyS } ztjd
ddt|id |d}~ww )z"Create backup of existing databasez,No existing database found. Skipping backup.r;   r<   Nz%Y%m%d_%H%M%Sz.backup_r   zDatabase backup created at: r?   r@   rA   rB   rC   )r   r   r4   rF   rG   r   nowstrftimeasynciosleepshutilcopy2rN   rB   rO   )r   	timestampbackup_pathr\   r   r   r   backup_databaser   s(   
rj   c                    sl   | du rt jt dd} t j| stjddd dS t| I dH }|s)dS t	| }|
 I dH  dS )zRun database migrationNz	.crawl4aizcrawl4ai.dbz/No existing database found. Skipping migration.r;   r<   )r   r   r#   r   homer4   rF   rG   rj   r
   r]   )r   ri   	migrationr   r   r   run_migration   s   rm   c                  C   s>   ddl } | jdd}|jddd | }tt|j dS )zCLI entry point for migrationr   Nz/Migrate Crawl4AI database to file-based storage)descriptionz	--db-pathzCustom database path)help)argparseArgumentParseradd_argument
parse_argsrd   runrm   r   )rp   parserargsr   r   r   main   s
   rw   __main__r   )r   rd   loggingpathlibr   rH   typingr   r(   r5   rf   timer   async_loggerr   r   DEBUGrF   r
   rO   rj   rm   rw   r^   r   r   r   r   <module>   s(    ^	
