]> granicus.if.org Git - python/commitdiff
Issue #18039: dbm.dump.open() now always creates a new database when the
authorSerhiy Storchaka <storchaka@gmail.com>
Tue, 10 Jun 2014 18:16:00 +0000 (21:16 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Tue, 10 Jun 2014 18:16:00 +0000 (21:16 +0300)
flag has the value 'n'.  Patch by Claudiu Popa.

Doc/library/dbm.rst
Lib/dbm/dumb.py
Lib/test/test_dbm_dumb.py
Misc/NEWS

index f5496d5b99c6f54f29d162abd220db2cda7263a0..b0133d840594cd92f164db3efd0cb3823c07db2c 100644 (file)
@@ -316,13 +316,18 @@ The module defines the following:
    dumbdbm database is created, files with :file:`.dat` and :file:`.dir` extensions
    are created.
 
-   The optional *flag* argument is currently ignored; the database is always opened
-   for update, and will be created if it does not exist.
+   The optional *flag* argument supports only the semantics of ``'c'``
+   and ``'n'`` values.  Other values will default to database being 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 ``0o666`` (and will be modified
    by the prevailing umask).
 
+   .. versionchanged:: 3.5
+      :func:`.open` always creates a new database when the flag has the value
+      ``'n'``.
+
    In addition to the methods provided by the
    :class:`collections.abc.MutableMapping` class, :class:`dumbdbm` objects
    provide the following method:
index 17854ee8f4d15c8c5ceb71486733515e4214b03c..75de29ad9e94a3cfb0c8a60aacf50ff9a6a4956a 100644 (file)
@@ -44,7 +44,7 @@ class _Database(collections.MutableMapping):
     _os = _os       # for _commit()
     _io = _io       # for _commit()
 
-    def __init__(self, filebasename, mode):
+    def __init__(self, filebasename, mode, flag='c'):
         self._mode = mode
 
         # The directory file is a text file.  Each line looks like
@@ -64,6 +64,17 @@ class _Database(collections.MutableMapping):
         # The index is an in-memory dict, mirroring the directory file.
         self._index = None  # maps keys to (pos, siz) pairs
 
+        # Handle the creation
+        self._create(flag)
+        self._update()
+
+    def _create(self, flag):
+        if flag == 'n':
+            for filename in (self._datfile, self._bakfile, self._dirfile):
+                try:
+                    _os.remove(filename)
+                except OSError:
+                    pass
         # Mod by Jack: create data file if needed
         try:
             f = _io.open(self._datfile, 'r', encoding="Latin-1")
@@ -71,7 +82,6 @@ class _Database(collections.MutableMapping):
             f = _io.open(self._datfile, 'w', encoding="Latin-1")
             self._chmod(self._datfile)
         f.close()
-        self._update()
 
     # Read directory file into the in-memory index dict.
     def _update(self):
@@ -266,20 +276,20 @@ class _Database(collections.MutableMapping):
         self.close()
 
 
-def open(file, flag=None, mode=0o666):
+def open(file, flag='c', mode=0o666):
     """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.
+    other DBM implementations, supports only the semantics of 'c' and 'n'
+    values.  Other values will default to the semantics of 'c' value:
+    the database will 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).
 
     """
-    # flag argument is currently ignored
 
     # Modify mode depending on the umask
     try:
@@ -290,5 +300,4 @@ def open(file, flag=None, mode=0o666):
     else:
         # Turn off any bits that are set in the umask
         mode = mode & (~um)
-
-    return _Database(file, mode)
+    return _Database(file, mode, flag=flag)
index 29f48a35616d4a1cd09b068454d5a0197689ba5b..ee5a32f3fb0a1c1fab515c64609a87f9a6f3efd9 100644 (file)
@@ -217,6 +217,14 @@ class DumbDBMTestCase(unittest.TestCase):
             self.assertEqual(str(cm.exception),
                              "DBM object has already been closed")
 
+    def test_create_new(self):
+        with dumbdbm.open(_fname, 'n') as f:
+            for k in self._dict:
+                f[k] = self._dict[k]
+
+        with dumbdbm.open(_fname, 'n') as f:
+            self.assertEqual(f.keys(), [])
+
     def tearDown(self):
         _delete_files()
 
index 96fe99e4c5a9272ad9193cd62d72f04c92d13b63..c796f605766cb7ccdb1539d5395b0f4aba87a364 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -92,6 +92,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #18039: dbm.dump.open() now always creates a new database when the
+  flag has the value 'n'.  Patch by Claudiu Popa.
+
 - Issue #21326: Add a new is_closed() method to asyncio.BaseEventLoop.
   run_forever() and run_until_complete() methods of asyncio.BaseEventLoop now
   raise an exception if the event loop was closed.