B
    fdP                 @   sz   d dl Z d dlZd dlZd dlmZmZmZ d dlmZ ddl	m
Z
 ddlmZ dZeeed	d
dZG dd de
ZdS )    N)ListTupleAny)raw   )Storage   )utilsag  
CREATE TABLE sessions
(
    dc_id     INTEGER PRIMARY KEY,
    api_id    INTEGER,
    test_mode INTEGER,
    auth_key  BLOB,
    date      INTEGER NOT NULL,
    user_id   INTEGER,
    is_bot    INTEGER
);

CREATE TABLE peers
(
    id             INTEGER PRIMARY KEY,
    access_hash    INTEGER,
    type           INTEGER NOT NULL,
    username       TEXT,
    phone_number   TEXT,
    last_update_on INTEGER NOT NULL DEFAULT (CAST(STRFTIME('%s', 'now') AS INTEGER))
);

CREATE TABLE version
(
    number INTEGER PRIMARY KEY
);

CREATE INDEX idx_peers_id ON peers (id);
CREATE INDEX idx_peers_username ON peers (username);
CREATE INDEX idx_peers_phone_number ON peers (phone_number);

CREATE TRIGGER trg_peers_last_update_on
    AFTER UPDATE
    ON peers
BEGIN
    UPDATE peers
    SET last_update_on = CAST(STRFTIME('%s', 'now') AS INTEGER)
    WHERE id = NEW.id;
END;
)peer_idaccess_hash	peer_typec             C   s`   |dkrt jj| |dS |dkr0t jj|  dS |dkrNt jjt| |dS td| d S )N)userZbot)user_idr   group)Zchat_id)ZchannelZ
supergroup)Z
channel_idr   zInvalid peer type: )r   typesZInputPeerUserZInputPeerChatZInputPeerChannelr	   Zget_channel_id
ValueError)r
   r   r    r   C/tmp/pip-unpacked-wheel-rcokkf2l/pyrogram/storage/sqlite_storage.pyget_input_peerG   s    
r   c                   sT  e Zd ZdZdZed fddZdd Zdd	 Zd
d Z	dd Z
dd Zeeeeeeef  dddZedddZedddZedddZdd Zeddd Zefedd!d"Zefedd#d$Zefedd%d&Zefedd'd(Zefedd)d*Zefedd+d,Zefedd-d.Zefedd/d0Z efedd1d2Z!  Z"S )3SQLiteStorage   ip  )namec                s   t  | d | _d S )N)super__init__conn)selfr   )	__class__r   r   r   `   s    zSQLiteStorage.__init__c          	   C   sB   | j 2 | j t | j d| jf | j dd W d Q R X d S )NzINSERT INTO version VALUES (?)z1INSERT INTO sessions VALUES (?, ?, ?, ?, ?, ?, ?))r   NNNr   NN)r   ZexecutescriptSCHEMAexecuteVERSION)r   r   r   r   createe   s    
zSQLiteStorage.createc                s   t d S )N)NotImplementedError)r   r   r   r   opens   s    zSQLiteStorage.openc                s&   |  tt I d H  | j  d S )N)dateinttimer   commit)r   r   r   r   savev   s    zSQLiteStorage.savec                s   | j   d S )N)r   close)r   r   r   r   r(   z   s    zSQLiteStorage.closec                s   t d S )N)r!   )r   r   r   r   delete}   s    zSQLiteStorage.delete)peersc                s   | j d| d S )NzXREPLACE INTO peers (id, access_hash, type, username, phone_number)VALUES (?, ?, ?, ?, ?))r   Zexecutemany)r   r*   r   r   r   update_peers   s    zSQLiteStorage.update_peers)r
   c                s2   | j d|f }|d kr*td| t| S )Nz4SELECT id, access_hash, type FROM peers WHERE id = ?zID not found: )r   r   fetchoneKeyErrorr   )r   r
   rr   r   r   get_peer_by_id   s    zSQLiteStorage.get_peer_by_id)usernamec                sb   | j d|f }|d kr*td| tt |d  | jkrRtd| t|d d  S )NzfSELECT id, access_hash, type, last_update_on FROM peers WHERE username = ?ORDER BY last_update_on DESCzUsername not found: r   zUsername expired: )r   r   r,   r-   absr%   USERNAME_TTLr   )r   r0   r.   r   r   r   get_peer_by_username   s    z"SQLiteStorage.get_peer_by_username)phone_numberc                s2   | j d|f }|d kr*td| t| S )Nz>SELECT id, access_hash, type FROM peers WHERE phone_number = ?zPhone number not found: )r   r   r,   r-   r   )r   r4   r.   r   r   r   get_peer_by_phone_number   s    z&SQLiteStorage.get_peer_by_phone_numberc             C   s*   t  d j}| jd| d d S )Nr   zSELECT z FROM sessionsr   )inspectstackfunctionr   r   r,   )r   attrr   r   r   _get   s    zSQLiteStorage._get)valuec          	   C   s<   t  d j}| j | jd| d|f W d Q R X d S )Nr   zUPDATE sessions SET z = ?)r6   r7   r8   r   r   )r   r;   r9   r   r   r   _set   s
    
zSQLiteStorage._setc             C   s   |t kr|  S | |S )N)objectr:   r<   )r   r;   r   r   r   	_accessor   s    zSQLiteStorage._accessorc                s
   |  |S )N)r>   )r   r;   r   r   r   dc_id   s    zSQLiteStorage.dc_idc                s
   |  |S )N)r>   )r   r;   r   r   r   api_id   s    zSQLiteStorage.api_idc                s
   |  |S )N)r>   )r   r;   r   r   r   	test_mode   s    zSQLiteStorage.test_modec                s
   |  |S )N)r>   )r   r;   r   r   r   auth_key   s    zSQLiteStorage.auth_keyc                s
   |  |S )N)r>   )r   r;   r   r   r   r#      s    zSQLiteStorage.datec                s
   |  |S )N)r>   )r   r;   r   r   r   r      s    zSQLiteStorage.user_idc                s
   |  |S )N)r>   )r   r;   r   r   r   is_bot   s    zSQLiteStorage.is_botc          	   C   sB   |t kr| jd d S | j | jd|f W d Q R X d S )NzSELECT number FROM versionr   zUPDATE version SET number = ?)r=   r   r   r,   )r   r;   r   r   r   version   s    zSQLiteStorage.version)#__name__
__module____qualname__r   r2   strr   r    r"   r'   r(   r)   r   r   r$   r+   r/   r3   r5   r:   r   r<   r=   r>   r?   r@   boolrA   bytesrB   r#   r   rC   rD   __classcell__r   r   )r   r   r   \   s.    	r   )r6   Zsqlite3r%   typingr   r   r   Zpyrogramr   Zstorager    r	   r   r$   rH   r   r   r   r   r   r   <module>   s   *