o
    #F5j<                     @   sn   d dl Z d dl mZ d dlmZ d dlmZmZmZ d dlZd dlZej	ej
d eeZG dd dZdS )    N)Error)datetime)OptionalDictList)levelc                	   @   s   e Zd ZdefddZdd Zdd Zdd	 Zd
ede	e fddZ
	dd
edededefddZd
ededefddZd
edefddZdd ZdS )Databaseconfigc                 C   s    || _ d | _|   |   d S )N)r	   
connectionconnectinit_tables)selfr	    r   </var/www/www-root/data/www/avtoreputaciya.ru/vk_parser/db.py__init__   s   zDatabase.__init__c              
   C   sd   z| j r| j jrW dS tjdi | j| _ td W dS  ty1 } z	td|   d}~ww )u   Подключение к БДNu9   ✅ Подключение к БД установленоu1   ❌ Ошибка подключения к БД: r   )	r
   openpymysqlr   r	   loggerinfor   error)r   er   r   r   r      s   zDatabase.connectc                 C   s@   z| j r| j js|   W dS W dS  ty   |   Y dS w )uJ   Проверить и переподключиться если нужноN)r
   r   r   r   r   r   r   r   ensure_connection!   s   zDatabase.ensure_connectionc                 C   sF   |    | j }|d |d | j  |  td dS )u   Создание таблицa(  
            CREATE TABLE IF NOT EXISTS groups_tracking (
                group_id VARCHAR(50) PRIMARY KEY,
                group_name VARCHAR(255),
                last_post_id VARCHAR(50),
                last_post_date DATETIME,
                last_parsed_at DATETIME,
                total_posts_parsed INT DEFAULT 0,
                updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                INDEX idx_last_post (last_post_id)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
        a  
            CREATE TABLE IF NOT EXISTS posts (
                id INT AUTO_INCREMENT PRIMARY KEY,
                group_id VARCHAR(50) NOT NULL,
                post_id VARCHAR(50) NOT NULL,
                post_url VARCHAR(255),
                author_id VARCHAR(50),
                author_name VARCHAR(255),
                text LONGTEXT,
                text_clean LONGTEXT,
                date DATETIME,
                likes INT DEFAULT 0,
                reposts INT DEFAULT 0,
                views INT DEFAULT 0,
                comments INT DEFAULT 0,
                attachments JSON,
                raw_html LONGTEXT,
                parsed_at DATETIME DEFAULT CURRENT_TIMESTAMP,
                UNIQUE KEY unique_post (group_id, post_id),
                INDEX idx_group_date (group_id, date),
                INDEX idx_date (date),
                FULLTEXT INDEX idx_text (text)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
        u3   ✅ Таблицы инициализированыN)r   r
   cursorexecutecommitcloser   r   )r   r   r   r   r   r   )   s   



zDatabase.init_tablesgroup_idreturnc                 C   s@   |    | j }|d|f | }|  |r|d S dS )uL   Получить ID последнего сохраненного постаz<SELECT last_post_id FROM groups_tracking WHERE group_id = %sr   Nr   r
   r   r   fetchoner   r   r   r   resultr   r   r   get_last_post_idZ      
zDatabase.get_last_post_id   last_post_idlast_post_datetotal_parsedc                 C   s>   |    | j }|d|||||f | j  |  dS )u5   Обновить информацию о группеa  
            INSERT INTO groups_tracking 
            (group_id, last_post_id, last_post_date, last_parsed_at, total_posts_parsed)
            VALUES (%s, %s, %s, NOW(), %s)
            ON DUPLICATE KEY UPDATE 
                last_post_id = VALUES(last_post_id),
                last_post_date = VALUES(last_post_date),
                last_parsed_at = NOW(),
                total_posts_parsed = total_posts_parsed + %s
        N)r   r
   r   r   r   r   )r   r   r&   r'   r(   r   r   r   r   update_group_trackingf   s   
	

zDatabase.update_group_tracking	post_datac                 C   s   |    | j }zzU|d||d|d|d|d|d|d|d|d	d
|dd
|dd
|dd
tj|dg dd|df | j  |jd
kW W |	  S  t
y } ztd|d d|  | j  W Y d}~W |	  dS d}~ww |	  w )u'   Сохранить пост в базуaJ  
                INSERT IGNORE INTO posts (
                    group_id, post_id, post_url, author_id, author_name,
                    text, text_clean, date, likes, reposts, views, comments,
                    attachments, raw_html
                ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
            post_idpost_url	author_idauthor_nametext
text_cleandatelikesr   repostsviewscommentsattachmentsF)ensure_asciiraw_htmlu-   Ошибка сохранения поста z: N)r   r
   r   r   getjsondumpsr   rowcountr   r   r   r   rollback)r   r   r*   r   r   r   r   r   	save_postx   s>   








zDatabase.save_postc                 C   s@   |    | j }|d|f | }|  |r|d S dS )u]   Получить количество сохраненных постов для группыz.SELECT COUNT(*) FROM posts WHERE group_id = %sr   r   r!   r   r   r   get_posts_count   r$   zDatabase.get_posts_countc                 C   s.   | j r| j jr| j   td dS dS dS )u#   Закрыть соединениеu+   Соединение с БД закрытоN)r
   r   r   r   r   r   r   r   r   r      s   
zDatabase.closeN)r%   )__name__
__module____qualname__dictr   r   r   r   strr   r#   r   intr)   r   boolr>   r?   r   r   r   r   r   r      s    1
'r   )r   r   r   typingr   r   r   r:   loggingbasicConfigINFO	getLoggerr@   r   r   r   r   r   r   <module>   s   
