@@ -36,6 +36,7 @@ class _dbm.dbm "dbmobject *" "&Dbmtype"
3636
3737typedef struct {
3838 PyObject_HEAD
39+ int flags ;
3940 int di_size ; /* -1 means recompute */
4041 DBM * di_dbm ;
4142} dbmobject ;
@@ -60,6 +61,7 @@ newdbmobject(const char *file, int flags, int mode)
6061 if (dp == NULL )
6162 return NULL ;
6263 dp -> di_size = -1 ;
64+ dp -> flags = flags ;
6365 /* See issue #19296 */
6466 if ( (dp -> di_dbm = dbm_open ((char * )file , flags , mode )) == 0 ) {
6567 PyErr_SetFromErrnoWithFilename (DbmError , file );
@@ -143,13 +145,20 @@ dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w)
143145 if (w == NULL ) {
144146 if ( dbm_delete (dp -> di_dbm , krec ) < 0 ) {
145147 dbm_clearerr (dp -> di_dbm );
146- PyErr_SetObject (PyExc_KeyError , v );
148+ /* we might get a failure for reasons like file corrupted,
149+ but we are not able to distinguish it */
150+ if (dp -> flags & O_RDWR ) {
151+ PyErr_SetObject (PyExc_KeyError , v );
152+ }
153+ else {
154+ PyErr_SetString (DbmError , "cannot delete item from database" );
155+ }
147156 return -1 ;
148157 }
149158 } else {
150159 if ( !PyArg_Parse (w , "s#" , & drec .dptr , & tmp_size ) ) {
151160 PyErr_SetString (PyExc_TypeError ,
152- "dbm mappings have byte or string elements only" );
161+ "dbm mappings have bytes or string elements only" );
153162 return -1 ;
154163 }
155164 drec .dsize = tmp_size ;
@@ -335,7 +344,7 @@ _dbm_dbm_setdefault_impl(dbmobject *self, const char *key,
335344 else {
336345 if ( !PyArg_Parse (default_value , "s#" , & val .dptr , & tmp_size ) ) {
337346 PyErr_SetString (PyExc_TypeError ,
338- "dbm mappings have byte string elements only" );
347+ "dbm mappings have bytes or string elements only" );
339348 return NULL ;
340349 }
341350 val .dsize = tmp_size ;
0 commit comments