3 \�.�@sPddlZddlZddlZddlZddgZdZe Z Gdd�dej �Z d d d�Z dS) �N�error�openic@s�eZdZeZeZd+dd�Zdd�Zdd�Zdd �ZeZ d d �Z d d �Z dd�Z dd�Z dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�ZeZd d!�Zd"d#�ZeZd$d%�Zd&d'�Zd(d)�Zd*S),� _Database�ccCsJ||_|dk|_|d|_|d|_|d|_d|_|j|�|j�dS)N�rz.dirz.datz.bak)�_mode� _readonly�_dirfile�_datfile�_bakfile�_index�_create�_update)�selfZ filebasename�mode�flag�r� /usr/lib64/python3.6/dbm/dumb.py�__init__0s     z_Database.__init__cCs�|dkrFx<|j|j|jfD](}ytj|�Wqtk r@YqXqWytj|jddd�}Wn^tk r�|d kr�ddl}|j dt dd �tj|jd dd��}|j |j�WdQRXYn X|j �dS) N�nrzLatin-1)�encodingrrzIThe database file is missing, the semantics of the 'c' flag will be used.�)� stacklevel�w)rr) r r r �_os�remove�OSError�_ior�warnings�warn�DeprecationWarning�_chmod�close)rr�filename�frrrrr Is   z_Database._createcCs�i|_ytj|jddd�}Wntk r:|j |_YnPXd|_|�>x6|D].}|j�}tj |�\}}|j d�}||j|<qNWWdQRXdS)NrzLatin-1)rF) r rrr rr� _modified�rstrip�_astZ literal_eval�encode)rr$�line�key�pos_and_siz_pairrrrr_s  z_Database._updatecCs�|jdks|j rdSy|jj|j�Wntk r<YnXy|jj|j|j�Wntk rhYnX|jj |jddd��F}|j |j�x2|jj �D]$\}}d|j d�|f}|j |�q�WWdQRXdS)NrzLatin-1)rz%r, %r )r r%r�unlinkr r�renamer rrr!�items�decode�write)rr$r*r+�entryrrr�_commitqs z_Database._commitcCs|jdkrtd��dS)Nz"DBM object has already been closed)r r)rrrr� _verify_open�s z_Database._verify_openc Cs\t|t�r|jd�}|j�|j|\}}tj|jd��}|j|�|j |�}WdQRX|S)Nzutf-8�rb) � isinstance�strr(r3r rrr �seek�read)rr*�pos�sizr$Zdatrrr� __getitem__�s   z_Database.__getitem__c Csrtj|jd��R}|jdd�t|j��}|tdtt}|jd||�|}|j|�WdQRX|t|�fS)Nzrb+r���) rrr r7�int�tell� _BLOCKSIZEr0�len)r�valr$r9Znposrrr�_addval�s  z_Database._addvalc Cs:tj|jd��}|j|�|j|�WdQRX|t|�fS)Nzrb+)rrr r7r0rB)rr9rCr$rrr�_setval�s z_Database._setvalc CsP||j|<tj|jddd��*}|j|j�|jd|jd�|f�WdQRXdS)N�azLatin-1)rz%r, %r )r rrr r!r0r/)rr*r+r$rrr�_addkey�s  z_Database._addkeycCs|jrddl}|jdtdd�t|t�r4|jd�}nt|ttf�sJt d��t|t�r`|jd�}nt|ttf�svt d��|j �d|_ ||j kr�|j ||j|��n^|j |\}}|td t}t|�td t}||kr�|j||�|j |<n|j|�|j |<dS) Nrz'The database is opened for reading onlyr<)rzutf-8zkeys must be bytes or stringszvalues must be bytes or stringsTr=)rrrr r5r6r(�bytes� bytearray� TypeErrorr3r%r rGrDrArBrE)rr*rCrr9r:Z oldblocksZ newblocksrrr� __setitem__�s,      z_Database.__setitem__cCsT|jrddl}|jdtdd�t|t�r2|jd�}|j�d|_|j |=|j �dS)Nrz'The database is opened for reading onlyr<)rzutf-8T) rrrr r5r6r(r3r%r r2)rr*rrrr� __delitem__�s   z_Database.__delitem__c Cs.y t|j�Stk r(td�d�YnXdS)Nz"DBM object has already been closed)�listr rJr)rrrr�keys�s z_Database.keyscs �j��fdd��jj�D�S)Ncsg|]}|�|f�qSrr)�.0r*)rrr� �sz#_Database.items..)r3r rN)rr)rrr.�sz_Database.itemsc CsPt|t�r|jd�}y ||jkStk rJ|jdkrDtd�d�n�YnXdS)Nzutf-8z"DBM object has already been closed)r5r6r(r rJr)rr*rrr� __contains__�s     z_Database.__contains__c Cs.y t|j�Stk r(td�d�YnXdS)Nz"DBM object has already been closed)�iterr rJr)rrrr�iterkeyss z_Database.iterkeysc Cs.y t|j�Stk r(td�d�YnXdS)Nz"DBM object has already been closed)rBr rJr)rrrr�__len__s z_Database.__len__c Cs,z |j�Wdd|_|_|_|_XdS)N)r2r r r r )rrrrr"s z_Database.closecCs t|jd�r|jj||j�dS)N�chmod)�hasattrrrUr)r�filerrrr!s z_Database._chmodcCs|S)Nr)rrrr� __enter__!sz_Database.__enter__cGs |j�dS)N)r")r�argsrrr�__exit__$sz_Database.__exit__N)r)�__name__� __module__� __qualname__rrrr rr2�syncr3r;rDrErGrKrLrNr.rQrS�__iter__rTr"�__del__r!rXrZrrrrr#s2   ' rr�c Csfytjd�}tj|�Wntk r,Yn X||@}|d krXddl}|jdtdd�t|||d �S) Nrrrrrz)Flag must be one of 'r', 'w', 'c', or 'n'r<)r)r)rrrr)r�umask�AttributeErrorrrr r)rWrrZumrrrrr(s   )rra)Zastr'�ior�osr� collections�__all__rArr�MutableMappingrrrrrr�s