o
    'yAfñ  ã                   @   sD   d dl Z d dlZd dlZd dlZe d¡Zde_G dd„ deƒZdS )é    Nzddns.databaseé   c                   @   s`   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zdd
d„Zdd„ Zdd„ Z	ddd„Z
dd„ Zdd„ Zd	S )ÚDDNSDatabasec                 C   s   || _ || _d | _d S ©N)ÚcoreÚpathÚ_db)Úselfr   r   © r	   ú2/usr/lib/python3.10/site-packages/ddns/database.pyÚ__init__    s   
zDDNSDatabase.__init__c                 C   sn   t  d| ¡ tj |¡}tj|tjtjB d}d |_	|s5|  
¡ r5t  d¡ | ¡ }| d¡ | dd¡ |S )NzOpening database %s)Zdetect_typeszInitialising database layouta%  
				CREATE TABLE updates (
					hostname  TEXT NOT NULL,
					status    TEXT NOT NULL,
					message   TEXT,
					timestamp timestamp NOT NULL
				);

				CREATE TABLE settings (
					k TEXT NOT NULL,
					v TEXT NOT NULL
				);

				CREATE INDEX idx_updates_hostname ON updates(hostname);
			z'INSERT INTO settings(k, v) VALUES(?, ?))ÚversionÚ1)ÚloggerÚdebugÚosr   ÚexistsÚsqlite3ZconnectZPARSE_DECLTYPESZPARSE_COLNAMESZisolation_levelÚis_writableÚcursorZexecutescriptÚexecute)r   r   r   ZconnÚcr	   r	   r
   Ú_open_database(   s   

zDDNSDatabase._open_databasec                 C   s0   t  | jt j¡}|rdS t  t j | j¡t j¡S )NT)r   Úaccessr   ÚW_OKÚdirname)r   Zretr	   r	   r
   r   F   s   zDDNSDatabase.is_writablec                 G   sH   | j d u r|  | j¡| _ | j  ¡ }z| ||¡ W | ¡  d S | ¡  w r   ©r   r   r   r   r   Úclose)r   ZqueryZ
parametersr   r	   r	   r
   Ú_executeP   s   

zDDNSDatabase._executeNc                 C   s2   |   ¡ st d¡ d S |  d|||tj ¡ ¡ d S )Nz>Could not log any updates because the database is not writablezOINSERT INTO updates(hostname, status, message, timestamp) 			VALUES(?, ?, ?, ?))r   r   Zwarningr   ÚdatetimeZutcnow)r   ÚhostnameÚstatusÚmessager	   r	   r
   Ú
add_updateZ   s   
ÿzDDNSDatabase.add_updatec                 C   s   t  d| ¡ |  |d¡S )Nz Logging successful update for %sZsuccess)r   r   r"   )r   r   r	   r	   r
   Úlog_successb   s   zDDNSDatabase.log_successc                 C   sB   |rd|j j|jf }nd }t d||pdf ¡ | j|d|dS )Nz%s: %sz Logging failed update for %s: %sÚ Úfailure)r!   )Ú	__class__Ú__name__Úreasonr   r   r"   )r   r   Z	exceptionr!   r	   r	   r
   Úlog_failureg   s
   zDDNSDatabase.log_failurec                 C   s~   | j du r|  | j¡| _ | j  ¡ }z(|r| d||f¡ n| d|f¡ |D ]}|d   W | ¡  S W | ¡  dS | ¡  w )zM
			Returns the timestamp of the last update (with the given status code).
		NzdSELECT timestamp FROM updates WHERE hostname = ? AND status = ? 					ORDER BY timestamp DESC LIMIT 1zUSELECT timestamp FROM updates WHERE hostname = ? 					ORDER BY timestamp DESC LIMIT 1r   r   )r   r   r    r   Úrowr	   r	   r
   Úlast_updateq   s    

ÿÿ
ýzDDNSDatabase.last_updatec                 C   sh   | j du r|  | j¡| _ | j  ¡ }z| d|f¡ |D ]}|d   W | ¡  S W | ¡  dS | ¡  w )z4
			Returns the update status of the last update.
		NzQSELECT status FROM updates WHERE hostname = ? 				ORDER BY timestamp DESC LIMIT 1r   r   ©r   r   r   r*   r	   r	   r
   Úlast_update_status‡   s   

ÿ
ýzDDNSDatabase.last_update_statusc                 C   sj   | j du r|  | j¡| _ | j  ¡ }z| d|df¡ |D ]}|d   W | ¡  S W | ¡  dS | ¡  w )zE
			Returns the reason string for the last failed update (if any).
		NzaSELECT message FROM updates WHERE hostname = ? AND status = ? 				ORDER BY timestamp DESC LIMIT 1r%   r   r   r,   r	   r	   r
   Úlast_update_failure_message™   s   

ÿ
ýz(DDNSDatabase.last_update_failure_messager   )r'   Ú
__module__Ú__qualname__r   r   r   r   r"   r#   r)   r+   r-   r.   r	   r	   r	   r
   r      s    




r   )	r   r   r   ZloggingZ	getLoggerr   Z	propagateÚobjectr   r	   r	   r	   r
   Ú<module>   s   
