grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026î ¤ fq)ã@s}dZddlZddlZddlZddlZddgZdZ e Z Gdd„dej ƒZ ddd d„ZdS) a­A dumb and slow but simple dbm clone. For database spam, spam.dir contains the index (a text file), spam.bak *may* contain a backup of the index (also a text file), while spam.dat contains the data (a binary file). XXX TO DO: - seems to contain a bug when updating... - reclaim free space (currently, space once occupied by deleted or expanded items is never reused) - support concurrent access (currently, if two processes take turns making updates, they can mess up the index) - support efficient access to large databases (currently, the whole index is read when the database is opened, and some updates rewrite the whole index) - support opening for read-only (flag = 'm') éNÚerrorÚopenic@seZdZeZeZdd„Zdd„Zdd„ZeZdd„Z d d „Z d d „Z d d„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„ZeZdd„Zdd „ZeZd!d"„Zd#d$„Zd%d&„Zd'S)(Ú _DatabasecCs¹||_|d|_|d|_|d|_d|_ytj|jdddƒ}WnFtk r tj|jdddƒ�}|j|jƒWdQXYn X|j ƒ|j ƒdS)Nz.dirz.datz.bakÚrÚencodingzLatin-1Úw) Ú_modeÚ_dirfileÚ_datfileÚ_bakfileÚ_indexÚ_iorÚOSErrorÚ_chmodÚcloseÚ_update)ÚselfZ filebasenameÚmodeÚf©rú-/opt/alt/python34/lib64/python3.4/dbm/dumb.pyÚ__init__0s       z_Database.__init__cCsœi|_ytj|jdddƒ}Wntk r<Yn\X|�SxK|D]C}|jƒ}tj|ƒ\}}|jdƒ}||j|YnXy|jj|j|jƒWntk rpYnX|jj|jdddƒ�]}|j |jƒxC|jj ƒD]2\}}d|j dƒ|f}|j |ƒq²WWdQXdS)NrrzLatin-1z%r, %r ) r Ú_osÚunlinkr rÚrenamer r rrÚitemsÚdecodeÚwrite)rrrrÚentryrrrÚ_commit`s  !z_Database._commitcCs"|jdkrtdƒ‚ndS)Nz"DBM object has already been closed)r r)rrrrÚ _verify_open{sz_Database._verify_openc Cs|t|tƒr!|jdƒ}n|jƒ|j|\}}tj|jdƒ�#}|j|ƒ|j |ƒ}WdQX|S)Nzutf-8Úrb) Ú isinstanceÚstrrr&r r rr ÚseekÚread)rrÚposÚsizrZdatrrrÚ __getitem__s  z_Database.__getitem__c CsŽtj|jdƒ�g}|jddƒt|jƒƒ}|tdtt}|jd||ƒ|}|j|ƒWdQX|t|ƒfS)Nzrb+réés) r rr r*ÚintÚtellÚ _BLOCKSIZEr#Úlen)rÚvalrr,ZnposrrrÚ_addval�sz_Database._addvalc CsHtj|jdƒ�!}|j|ƒ|j|ƒWdQX|t|ƒfS)Nzrb+)r rr r*r#r4)rr,r5rrrrÚ_setval›s z_Database._setvalc Cse||j|t|tƒr!|jdƒ}n$t|ttfƒsEtdƒ‚nt|tƒrf|jdƒ}n$t|ttfƒsŠtdƒ‚n|jƒ||jkr¿|j||j |ƒƒn{|j|\}}|t dt }t |ƒt dt }||kr$|j ||ƒ|j|às z#_Database.items..)r&r r@)rr)rrr!Þs z_Database.itemsc Csot|tƒr!|jdƒ}ny||jkSWn6tk rj|jdkrctdƒd‚n‚YnXdS)Nzutf-8z"DBM object has already been closed)r(r)rr r<r)rrrrrÚ __contains__âs z_Database.__contains__c Cs9yt|jƒSWn!tk r4tdƒd‚YnXdS)Nz"DBM object has already been closed)Úiterr r<r)rrrrÚiterkeysís z_Database.iterkeysc Cs9yt|jƒSWn!tk r4tdƒd‚YnXdS)Nz"DBM object has already been closed)r4r r<r)rrrrÚ__len__ôs z_Database.__len__c Cs4z|jƒWdd|_|_|_|_XdS)N)r%r r r r )rrrrrúsz_Database.closecCs/t|jdƒr+|jj||jƒndS)NÚchmod)ÚhasattrrrGr)rÚfilerrrrsz_Database._chmodcCs|S)Nr)rrrrÚ __enter__sz_Database.__enter__cGs|jƒdS)N)r)rÚargsrrrÚ__exit__ sz_Database.__exit__N)Ú__name__Ú __module__Ú __qualname__rr rrr%Úsyncr&r.r6r7r9r=r>r@r!rCrEÚ__iter__rFrÚ__del__rrJrLrrrrr#s0         "       ri¶c CsMy tjdƒ}tj|ƒWntk r4Yn X||@}t||ƒS)aöOpen the database file, filename, and return corresponding object. The flag argument, used to control how the database is opened in the other DBM implementations, is ignored in the dbm.dumb module; the database is always opened for update, and will be created if it does not exist. The optional mode argument is the UNIX mode of the file, used only when the database has to be created. It defaults to octal code 0o666 (and will be modified by the prevailing umask). r)rÚumaskÚAttributeErrorr)rIZflagrZumrrrr s  )Ú__doc__ZastrÚior ÚosrÚ collectionsÚ__all__r3rrÚMutableMappingrrrrrrÚs     ê