[Python-3000-checkins] r63662 - in python/branches/py3k: Demo/classes/Dbm.py Doc/distutils/setupscript.rst Doc/library/anydbm.rst Doc/library/bsddb.rst Doc/library/dbhash.rst Doc/library/dbm.rst Doc/library/dumbdbm.rst Doc/library/gdbm.rst Doc/library/persistence.rst Doc/library/shelve.rst Doc/library/whichdb.rst Doc/reference/datamodel.rst Lib/anydbm.py Lib/dbhash.py Lib/dbm Lib/dbm/__init__.py Lib/dbm/bsd.py Lib/dbm/dumb.py Lib/dbm/gnu.py Lib/dbm/ndbm.py Lib/dumbdbm.py Lib/io.py Lib/shelve.py Lib/test/test___all__.py Lib/test/test_anydbm.py Lib/test/test_bsddb.py Lib/test/test_dbm.py Lib/test/test_dbm_dumb.py Lib/test/test_dbm_gnu.py Lib/test/test_dbm_ndbm.py Lib/test/test_dumbdbm.py Lib/test/test_gdbm.py Lib/test/test_whichdb.py Lib/whichdb.py Misc/PURIFY.README Misc/cheatsheet Modules/Setup.dist Modules/_dbmmodule.c Modules/_gdbmmodule.c Modules/_threadmodule.c Modules/dbmmodule.c Modules/gdbmmodule.c PC/os2emx/Makefile PC/os2vacpp/makefile PC/os2vacpp/makefile.omk Tools/scripts/db2pickle.py Tools/scripts/pickle2db.py setup.py

georg.brandl python-3000-checkins at python.org
Mon May 26 12:29:37 CEST 2008


Author: georg.brandl
Date: Mon May 26 12:29:35 2008
New Revision: 63662

Log:
Create the dbm package from PEP 3108. #2881.


Added:
   python/branches/py3k/Lib/dbm/
   python/branches/py3k/Lib/dbm/__init__.py
   python/branches/py3k/Lib/dbm/bsd.py   (contents, props changed)
      - copied, changed from r63646, /python/branches/py3k/Lib/dbhash.py
   python/branches/py3k/Lib/dbm/dumb.py   (contents, props changed)
      - copied, changed from r63646, /python/branches/py3k/Lib/dumbdbm.py
   python/branches/py3k/Lib/dbm/gnu.py
   python/branches/py3k/Lib/dbm/ndbm.py
   python/branches/py3k/Lib/test/test_dbm_dumb.py   (contents, props changed)
      - copied, changed from r63646, /python/branches/py3k/Lib/test/test_dumbdbm.py
   python/branches/py3k/Lib/test/test_dbm_gnu.py   (contents, props changed)
      - copied, changed from r63646, /python/branches/py3k/Lib/test/test_gdbm.py
   python/branches/py3k/Lib/test/test_dbm_ndbm.py   (contents, props changed)
      - copied, changed from r63646, /python/branches/py3k/Lib/test/test_dbm.py
   python/branches/py3k/Modules/_dbmmodule.c   (contents, props changed)
      - copied, changed from r63646, /python/branches/py3k/Modules/dbmmodule.c
   python/branches/py3k/Modules/_gdbmmodule.c   (contents, props changed)
      - copied, changed from r63646, /python/branches/py3k/Modules/gdbmmodule.c
Removed:
   python/branches/py3k/Doc/library/anydbm.rst
   python/branches/py3k/Doc/library/dbhash.rst
   python/branches/py3k/Doc/library/dumbdbm.rst
   python/branches/py3k/Doc/library/gdbm.rst
   python/branches/py3k/Doc/library/whichdb.rst
   python/branches/py3k/Lib/anydbm.py
   python/branches/py3k/Lib/dbhash.py
   python/branches/py3k/Lib/dumbdbm.py
   python/branches/py3k/Lib/test/test_dbm.py
   python/branches/py3k/Lib/test/test_dumbdbm.py
   python/branches/py3k/Lib/test/test_gdbm.py
   python/branches/py3k/Lib/test/test_whichdb.py
   python/branches/py3k/Lib/whichdb.py
   python/branches/py3k/Modules/dbmmodule.c
   python/branches/py3k/Modules/gdbmmodule.c
Modified:
   python/branches/py3k/Demo/classes/Dbm.py
   python/branches/py3k/Doc/distutils/setupscript.rst
   python/branches/py3k/Doc/library/bsddb.rst
   python/branches/py3k/Doc/library/dbm.rst
   python/branches/py3k/Doc/library/persistence.rst
   python/branches/py3k/Doc/library/shelve.rst
   python/branches/py3k/Doc/reference/datamodel.rst
   python/branches/py3k/Lib/io.py
   python/branches/py3k/Lib/shelve.py
   python/branches/py3k/Lib/test/test___all__.py
   python/branches/py3k/Lib/test/test_anydbm.py
   python/branches/py3k/Lib/test/test_bsddb.py
   python/branches/py3k/Misc/PURIFY.README
   python/branches/py3k/Misc/cheatsheet
   python/branches/py3k/Modules/Setup.dist
   python/branches/py3k/Modules/_threadmodule.c
   python/branches/py3k/PC/os2emx/Makefile
   python/branches/py3k/PC/os2vacpp/makefile
   python/branches/py3k/PC/os2vacpp/makefile.omk
   python/branches/py3k/Tools/scripts/db2pickle.py
   python/branches/py3k/Tools/scripts/pickle2db.py
   python/branches/py3k/setup.py

Modified: python/branches/py3k/Demo/classes/Dbm.py
==============================================================================
--- python/branches/py3k/Demo/classes/Dbm.py	(original)
+++ python/branches/py3k/Demo/classes/Dbm.py	Mon May 26 12:29:35 2008
@@ -7,8 +7,8 @@
 class Dbm:
 
     def __init__(self, filename, mode, perm):
-        import dbm
-        self.db = dbm.open(filename, mode, perm)
+        import dbm.ndbm
+        self.db = dbm.ndbm.open(filename, mode, perm)
 
     def __repr__(self):
         s = ''

Modified: python/branches/py3k/Doc/distutils/setupscript.rst
==============================================================================
--- python/branches/py3k/Doc/distutils/setupscript.rst	(original)
+++ python/branches/py3k/Doc/distutils/setupscript.rst	Mon May 26 12:29:35 2008
@@ -316,7 +316,7 @@
 library search path on target systems ::
 
    Extension(...,
-             libraries=['gdbm', 'readline'])
+             libraries=['_gdbm', 'readline'])
 
 If you need to link with libraries in a non-standard location, you'll have to
 include the location in ``library_dirs``::

Deleted: python/branches/py3k/Doc/library/anydbm.rst
==============================================================================
--- python/branches/py3k/Doc/library/anydbm.rst	Mon May 26 12:29:35 2008
+++ (empty file)
@@ -1,96 +0,0 @@
-
-:mod:`anydbm` --- Generic access to DBM-style databases
-=======================================================
-
-.. module:: anydbm
-   :synopsis: Generic interface to DBM-style database modules.
-
-
-.. index::
-   module: dbhash
-   module: bsddb
-   module: gdbm
-   module: dbm
-   module: dumbdbm
-
-:mod:`anydbm` is a generic interface to variants of the DBM database ---
-:mod:`dbhash` (requires :mod:`bsddb`), :mod:`gdbm`, or :mod:`dbm`.  If none of
-these modules is installed, the slow-but-simple implementation in module
-:mod:`dumbdbm` will be used.
-
-
-.. function:: open(filename[, flag[, mode]])
-
-   Open the database file *filename* and return a corresponding object.
-
-   If the database file already exists, the :mod:`whichdb` module is  used to
-   determine its type and the appropriate module is used; if it does not exist, the
-   first module listed above that can be imported is used.
-
-   The optional *flag* argument can be ``'r'`` to open an existing database for
-   reading only, ``'w'`` to open an existing database for reading and writing,
-   ``'c'`` to create the database if it doesn't exist, or ``'n'``, which will
-   always create a new empty database.  If not specified, the default value is
-   ``'r'``.
-
-   The optional *mode* argument is the Unix mode of the file, used only when the
-   database has to be created.  It defaults to octal ``0666`` (and will be modified
-   by the prevailing umask).
-
-
-.. exception:: error
-
-   A tuple containing the exceptions that can be raised by each of the supported
-   modules, with a unique exception also named :exc:`anydbm.error` as the first
-   item --- the latter is used when :exc:`anydbm.error` is raised.
-
-The object returned by :func:`open` supports most of the same functionality as
-dictionaries; keys and their corresponding values can be stored, retrieved, and
-deleted, and the :meth:`has_key` and :meth:`keys` methods are available.  Keys
-and values must always be strings.
-
-The following example records some hostnames and a corresponding title,  and
-then prints out the contents of the database::
-
-   import anydbm
-
-   # Open database, creating it if necessary.
-   db = anydbm.open('cache', 'c')
-
-   # Record some values
-   db['www.python.org'] = 'Python Website'
-   db['www.cnn.com'] = 'Cable News Network'
-
-   # Loop through contents.  Other dictionary methods
-   # such as .keys(), .values() also work.
-   for k, v in db.iteritems():
-       print(k, '\t', v)
-
-   # Storing a non-string key or value will raise an exception (most
-   # likely a TypeError).
-   db['www.yahoo.com'] = 4
-
-   # Close when done.
-   db.close()
-
-
-.. seealso::
-
-   Module :mod:`dbhash`
-      BSD ``db`` database interface.
-
-   Module :mod:`dbm`
-      Standard Unix database interface.
-
-   Module :mod:`dumbdbm`
-      Portable implementation of the ``dbm`` interface.
-
-   Module :mod:`gdbm`
-      GNU database interface, based on the ``dbm`` interface.
-
-   Module :mod:`shelve`
-      General object persistence built on top of  the Python ``dbm`` interface.
-
-   Module :mod:`whichdb`
-      Utility module used to determine the type of an existing database.
-

Modified: python/branches/py3k/Doc/library/bsddb.rst
==============================================================================
--- python/branches/py3k/Doc/library/bsddb.rst	(original)
+++ python/branches/py3k/Doc/library/bsddb.rst	Mon May 26 12:29:35 2008
@@ -92,7 +92,7 @@
 
 .. seealso::
 
-   Module :mod:`dbhash`
+   Module :mod:`dbm.bsd`
       DBM-style interface to the :mod:`bsddb`
 
 

Deleted: python/branches/py3k/Doc/library/dbhash.rst
==============================================================================
--- python/branches/py3k/Doc/library/dbhash.rst	Mon May 26 12:29:35 2008
+++ (empty file)
@@ -1,114 +0,0 @@
-
-:mod:`dbhash` --- DBM-style interface to the BSD database library
-=================================================================
-
-.. module:: dbhash
-   :synopsis: DBM-style interface to the BSD database library.
-.. sectionauthor:: Fred L. Drake, Jr. <fdrake at acm.org>
-
-
-.. index:: module: bsddb
-
-The :mod:`dbhash` module provides a function to open databases using the BSD
-``db`` library.  This module mirrors the interface of the other Python database
-modules that provide access to DBM-style databases.  The :mod:`bsddb` module is
-required  to use :mod:`dbhash`.
-
-This module provides an exception and a function:
-
-
-.. exception:: error
-
-   Exception raised on database errors other than :exc:`KeyError`.  It is a synonym
-   for :exc:`bsddb.error`.
-
-
-.. function:: open(path[, flag[, mode]])
-
-   Open a ``db`` database and return the database object.  The *path* argument is
-   the name of the database file.
-
-   The *flag* argument can be:
-
-   +---------+-------------------------------------------+
-   | Value   | Meaning                                   |
-   +=========+===========================================+
-   | ``'r'`` | Open existing database for reading only   |
-   |         | (default)                                 |
-   +---------+-------------------------------------------+
-   | ``'w'`` | Open existing database for reading and    |
-   |         | writing                                   |
-   +---------+-------------------------------------------+
-   | ``'c'`` | Open database for reading and writing,    |
-   |         | creating it if it doesn't exist           |
-   +---------+-------------------------------------------+
-   | ``'n'`` | Always create a new, empty database, open |
-   |         | for reading and writing                   |
-   +---------+-------------------------------------------+
-
-   For platforms on which the BSD ``db`` library supports locking, an ``'l'``
-   can be appended to indicate that locking should be used.
-
-   The optional *mode* parameter is used to indicate the Unix permission bits that
-   should be set if a new database must be created; this will be masked by the
-   current umask value for the process.
-
-
-.. seealso::
-
-   Module :mod:`anydbm`
-      Generic interface to ``dbm``\ -style databases.
-
-   Module :mod:`bsddb`
-      Lower-level interface to the BSD ``db`` library.
-
-   Module :mod:`whichdb`
-      Utility module used to determine the type of an existing database.
-
-
-.. _dbhash-objects:
-
-Database Objects
-----------------
-
-The database objects returned by :func:`open` provide the methods  common to all
-the DBM-style databases and mapping objects.  The following methods are
-available in addition to the standard methods.
-
-
-.. method:: dbhash.first()
-
-   It's possible to loop over every key/value pair in the database using this
-   method   and the :meth:`next` method.  The traversal is ordered by the databases
-   internal hash values, and won't be sorted by the key values.  This method
-   returns the starting key.
-
-
-.. method:: dbhash.last()
-
-   Return the last key/value pair in a database traversal.  This may be used to
-   begin a reverse-order traversal; see :meth:`previous`.
-
-
-.. method:: dbhash.next()
-
-   Returns the key next key/value pair in a database traversal.  The following code
-   prints every key in the database ``db``, without having to create a list in
-   memory that contains them all::
-
-      print(db.first())
-      for i in range(1, len(db)):
-          print(db.next())
-
-
-.. method:: dbhash.previous()
-
-   Returns the previous key/value pair in a forward-traversal of the database. In
-   conjunction with :meth:`last`, this may be used to implement a reverse-order
-   traversal.
-
-
-.. method:: dbhash.sync()
-
-   This method forces any unwritten data to be written to the disk.
-

Modified: python/branches/py3k/Doc/library/dbm.rst
==============================================================================
--- python/branches/py3k/Doc/library/dbm.rst	(original)
+++ python/branches/py3k/Doc/library/dbm.rst	Mon May 26 12:29:35 2008
@@ -1,14 +1,294 @@
-
-:mod:`dbm` --- Simple "database" interface
-==========================================
+:mod:`dbm` --- Interfaces to Unix "databases"
+=============================================
 
 .. module:: dbm
+   :synopsis: Interfaces to various Unix "database" formats.
+
+:mod:`dbm` is a generic interface to variants of the DBM database ---
+:mod:`dbm.bsd` (requires :mod:`bsddb`), :mod:`dbm.gnu`, or :mod:`dbm.ndbm`.  If
+none of these modules is installed, the slow-but-simple implementation in module
+:mod:`dbm.dumb` will be used.
+
+
+.. exception:: error
+
+   A tuple containing the exceptions that can be raised by each of the supported
+   modules, with a unique exception also named :exc:`dbm.error` as the first
+   item --- the latter is used when :exc:`dbm.error` is raised.
+
+
+.. function:: whichdb(filename)
+
+   This functionattempts to guess which of the several simple database modules
+   available --- :mod:`dbm.bsd`, :mod:`dbm.gnu`, :mod:`dbm.ndbm` or
+   :mod:`dbm.dumb` --- should be used to open a given file.
+
+   Returns one of the following values: ``None`` if the file can't be opened
+   because it's unreadable or doesn't exist; the empty string (``''``) if the
+   file's format can't be guessed; or a string containing the required module
+   name, such as ``'dbm.ndbm'`` or ``'dbm.gnu'``.
+
+
+.. function:: open(filename[, flag[, mode]])
+
+   Open the database file *filename* and return a corresponding object.
+
+   If the database file already exists, the :func:`whichdb` function is used to
+   determine its type and the appropriate module is used; if it does not exist,
+   the first module listed above that can be imported is used.
+
+   The optional *flag* argument can be ``'r'`` to open an existing database for
+   reading only, ``'w'`` to open an existing database for reading and writing,
+   ``'c'`` to create the database if it doesn't exist, or ``'n'``, which will
+   always create a new empty database.  If not specified, the default value is
+   ``'r'``.
+
+   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).
+
+
+The object returned by :func:`open` supports most of the same functionality as
+dictionaries; keys and their corresponding values can be stored, retrieved, and
+deleted, and the :keyword:`in` operator and the :meth:`keys` method are
+available.  Keys and values must always be strings.
+
+The following example records some hostnames and a corresponding title,  and
+then prints out the contents of the database::
+
+   import dbm
+
+   # Open database, creating it if necessary.
+   db = dbm.open('cache', 'c')
+
+   # Record some values
+   db['www.python.org'] = 'Python Website'
+   db['www.cnn.com'] = 'Cable News Network'
+
+   # Loop through contents.  Other dictionary methods
+   # such as .keys(), .values() also work.
+   for k, v in db.iteritems():
+       print(k, '\t', v)
+
+   # Storing a non-string key or value will raise an exception (most
+   # likely a TypeError).
+   db['www.yahoo.com'] = 4
+
+   # Close when done.
+   db.close()
+
+
+.. seealso::
+
+   Module :mod:`shelve`
+      Persistence module which stores non-string data.
+
+
+The individual submodules are described in the following sections.
+
+
+:mod:`dbm.bsd` --- DBM-style interface to the BSD database library
+------------------------------------------------------------------
+
+.. module:: dbm.bsd
+   :synopsis: DBM-style interface to the BSD database library.
+.. sectionauthor:: Fred L. Drake, Jr. <fdrake at acm.org>
+
+.. index:: module: bsddb
+
+The :mod:`dbm.bsd` module provides a function to open databases using the BSD
+``db`` library.  This module mirrors the interface of the other Python database
+modules that provide access to DBM-style databases.  The :mod:`bsddb` module is
+required  to use :mod:`dbm.bsd`.
+
+.. exception:: error
+
+   Exception raised on database errors other than :exc:`KeyError`.  It is a synonym
+   for :exc:`bsddb.error`.
+
+
+.. function:: open(path[, flag[, mode]])
+
+   Open a ``db`` database and return the database object.  The *path* argument is
+   the name of the database file.
+
+   The *flag* argument can be:
+
+   +---------+-------------------------------------------+
+   | Value   | Meaning                                   |
+   +=========+===========================================+
+   | ``'r'`` | Open existing database for reading only   |
+   |         | (default)                                 |
+   +---------+-------------------------------------------+
+   | ``'w'`` | Open existing database for reading and    |
+   |         | writing                                   |
+   +---------+-------------------------------------------+
+   | ``'c'`` | Open database for reading and writing,    |
+   |         | creating it if it doesn't exist           |
+   +---------+-------------------------------------------+
+   | ``'n'`` | Always create a new, empty database, open |
+   |         | for reading and writing                   |
+   +---------+-------------------------------------------+
+
+   For platforms on which the BSD ``db`` library supports locking, an ``'l'``
+   can be appended to indicate that locking should be used.
+
+   The optional *mode* parameter is used to indicate the Unix permission bits that
+   should be set if a new database must be created; this will be masked by the
+   current umask value for the process.
+
+   The database objects returned by :func:`open` provide the methods common to all
+   the DBM-style databases and mapping objects.  The following methods are
+   available in addition to the standard methods:
+
+   .. method:: dbhash.first()
+
+      It's possible to loop over every key/value pair in the database using this
+      method   and the :meth:`next` method.  The traversal is ordered by the databases
+      internal hash values, and won't be sorted by the key values.  This method
+      returns the starting key.
+
+   .. method:: dbhash.last()
+
+      Return the last key/value pair in a database traversal.  This may be used to
+      begin a reverse-order traversal; see :meth:`previous`.
+
+   .. method:: dbhash.next()
+
+      Returns the key next key/value pair in a database traversal.  The following code
+      prints every key in the database ``db``, without having to create a list in
+      memory that contains them all::
+
+         print(db.first())
+         for i in range(1, len(db)):
+             print(db.next())
+
+   .. method:: dbhash.previous()
+
+      Returns the previous key/value pair in a forward-traversal of the database. In
+      conjunction with :meth:`last`, this may be used to implement a reverse-order
+      traversal.
+
+   .. method:: dbhash.sync()
+
+      This method forces any unwritten data to be written to the disk.
+
+
+:mod:`dbm.gnu` --- GNU's reinterpretation of dbm
+------------------------------------------------
+
+.. module:: dbm.gnu
+   :platform: Unix
+   :synopsis: GNU's reinterpretation of dbm.
+
+
+This module is quite similar to the :mod:`dbm` module, but uses the GNU library
+``gdbm`` instead to provide some additional functionality.  Please note that the
+file formats created by ``gdbm`` and ``dbm`` are incompatible.
+
+The :mod:`dbm.gnu` module provides an interface to the GNU DBM library.
+``gdbm`` objects behave like mappings (dictionaries), except that keys and
+values are always strings.  Printing a :mod:`dbm.gnu` object doesn't print the
+keys and values, and the :meth:`items` and :meth:`values` methods are not
+supported.
+
+.. exception:: error
+
+   Raised on ``gdbm``\ -specific errors, such as I/O errors. :exc:`KeyError` is
+   raised for general mapping errors like specifying an incorrect key.
+
+
+.. function:: open(filename, [flag, [mode]])
+
+   Open a ``gdbm`` database and return a :class:`gdbm` object.  The *filename*
+   argument is the name of the database file.
+
+   The optional *flag* argument can be:
+
+   +---------+-------------------------------------------+
+   | Value   | Meaning                                   |
+   +=========+===========================================+
+   | ``'r'`` | Open existing database for reading only   |
+   |         | (default)                                 |
+   +---------+-------------------------------------------+
+   | ``'w'`` | Open existing database for reading and    |
+   |         | writing                                   |
+   +---------+-------------------------------------------+
+   | ``'c'`` | Open database for reading and writing,    |
+   |         | creating it if it doesn't exist           |
+   +---------+-------------------------------------------+
+   | ``'n'`` | Always create a new, empty database, open |
+   |         | for reading and writing                   |
+   +---------+-------------------------------------------+
+
+   The following additional characters may be appended to the flag to control
+   how the database is opened:
+
+   +---------+--------------------------------------------+
+   | Value   | Meaning                                    |
+   +=========+============================================+
+   | ``'f'`` | Open the database in fast mode.  Writes    |
+   |         | to the database will not be synchronized.  |
+   +---------+--------------------------------------------+
+   | ``'s'`` | Synchronized mode. This will cause changes |
+   |         | to the database to be immediately written  |
+   |         | to the file.                               |
+   +---------+--------------------------------------------+
+   | ``'u'`` | Do not lock database.                      |
+   +---------+--------------------------------------------+
+
+   Not all flags are valid for all versions of ``gdbm``.  The module constant
+   :const:`open_flags` is a string of supported flag characters.  The exception
+   :exc:`error` is raised if an invalid flag is specified.
+
+   The optional *mode* argument is the Unix mode of the file, used only when the
+   database has to be created.  It defaults to octal ``0666``.
+
+   In addition to the dictionary-like methods, ``gdbm`` objects have the
+   following methods:
+
+   .. method:: gdbm.firstkey()
+
+      It's possible to loop over every key in the database using this method  and the
+      :meth:`nextkey` method.  The traversal is ordered by ``gdbm``'s internal
+      hash values, and won't be sorted by the key values.  This method returns
+      the starting key.
+
+   .. method:: gdbm.nextkey(key)
+
+      Returns the key that follows *key* in the traversal.  The following code prints
+      every key in the database ``db``, without having to create a list in memory that
+      contains them all::
+
+         k = db.firstkey()
+         while k != None:
+             print(k)
+             k = db.nextkey(k)
+
+   .. method:: gdbm.reorganize()
+
+      If you have carried out a lot of deletions and would like to shrink the space
+      used by the ``gdbm`` file, this routine will reorganize the database.  ``gdbm``
+      will not shorten the length of a database file except by using this
+      reorganization; otherwise, deleted file space will be kept and reused as new
+      (key, value) pairs are added.
+
+   .. method:: gdbm.sync()
+
+      When the database has been opened in fast mode, this method forces any
+      unwritten data to be written to the disk.
+
+
+:mod:`dbm.ndbm` --- Interface based on ndbm
+-------------------------------------------
+
+.. module:: dbm.ndbm
    :platform: Unix
    :synopsis: The standard "database" interface, based on ndbm.
 
 
-The :mod:`dbm` module provides an interface to the Unix "(n)dbm" library.  Dbm
-objects behave like mappings (dictionaries), except that keys and values are
+The :mod:`dbm.ndbm` module provides an interface to the Unix "(n)dbm" library.
+Dbm objects behave like mappings (dictionaries), except that keys and values are
 always strings. Printing a dbm object doesn't print the keys and values, and the
 :meth:`items` and :meth:`values` methods are not supported.
 
@@ -17,13 +297,10 @@
 :program:`configure` script will attempt to locate the appropriate header file
 to simplify building this module.
 
-The module defines the following:
-
-
 .. exception:: error
 
-   Raised on dbm-specific errors, such as I/O errors. :exc:`KeyError` is raised for
-   general mapping errors like specifying an incorrect key.
+   Raised on dbm-specific errors, such as I/O errors. :exc:`KeyError` is raised
+   for general mapping errors like specifying an incorrect key.
 
 
 .. data:: library
@@ -61,14 +338,54 @@
    modified by the prevailing umask).
 
 
-.. seealso::
 
-   Module :mod:`anydbm`
-      Generic interface to ``dbm``\ -style databases.
+:mod:`dbm.dumb` --- Portable DBM implementation
+-----------------------------------------------
+
+.. module:: dbm.dumb
+   :synopsis: Portable implementation of the simple DBM interface.
+
+.. index:: single: databases
+
+.. note::
+
+   The :mod:`dbm.dumb` module is intended as a last resort fallback for the
+   :mod:`dbm` module when no more robust module is available. The :mod:`dbm.dumb`
+   module is not written for speed and is not nearly as heavily used as the other
+   database modules.
+
+The :mod:`dbm.dumb` module provides a persistent dictionary-like interface which
+is written entirely in Python.  Unlike other modules such as :mod:`gdbm` and
+:mod:`bsddb`, no external library is required.  As with other persistent
+mappings, the keys and values must always be strings.
+
+The module defines the following:
+
+
+.. exception:: error
+
+   Raised on dbm.dumb-specific errors, such as I/O errors.  :exc:`KeyError` is
+   raised for general mapping errors like specifying an incorrect key.
+
+
+.. function:: open(filename[, flag[, mode]])
+
+   Open a dumbdbm database and return a dumbdbm object.  The *filename* argument is
+   the basename of the database file (without any specific extensions).  When a
+   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 *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).
 
-   Module :mod:`gdbm`
-      Similar interface to the GNU GDBM library.
+   In addition to the methods provided by the :class:`collections.MutableMapping` class,
+   :class:`dumbdbm` objects provide the following method:
 
-   Module :mod:`whichdb`
-      Utility module used to determine the type of an existing database.
+   .. method:: dumbdbm.sync()
 
+      Synchronize the on-disk directory and data files.  This method is called
+      by the :meth:`Shelve.sync` method.

Deleted: python/branches/py3k/Doc/library/dumbdbm.rst
==============================================================================
--- python/branches/py3k/Doc/library/dumbdbm.rst	Mon May 26 12:29:35 2008
+++ (empty file)
@@ -1,78 +0,0 @@
-
-:mod:`dumbdbm` --- Portable DBM implementation
-==============================================
-
-.. module:: dumbdbm
-   :synopsis: Portable implementation of the simple DBM interface.
-
-
-.. index:: single: databases
-
-.. note::
-
-   The :mod:`dumbdbm` module is intended as a last resort fallback for the
-   :mod:`anydbm` module when no more robust module is available. The :mod:`dumbdbm`
-   module is not written for speed and is not nearly as heavily used as the other
-   database modules.
-
-The :mod:`dumbdbm` module provides a persistent dictionary-like interface which
-is written entirely in Python.  Unlike other modules such as :mod:`gdbm` and
-:mod:`bsddb`, no external library is required.  As with other persistent
-mappings, the keys and values must always be strings.
-
-The module defines the following:
-
-
-.. exception:: error
-
-   Raised on dumbdbm-specific errors, such as I/O errors.  :exc:`KeyError` is
-   raised for general mapping errors like specifying an incorrect key.
-
-
-.. function:: open(filename[, flag[, mode]])
-
-   Open a dumbdbm database and return a dumbdbm object.  The *filename* argument is
-   the basename of the database file (without any specific extensions).  When a
-   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 *mode* argument is the Unix mode of the file, used only when the
-   database has to be created.  It defaults to octal ``0666`` (and will be modified
-   by the prevailing umask).
-
-
-.. seealso::
-
-   Module :mod:`anydbm`
-      Generic interface to ``dbm``\ -style databases.
-
-   Module :mod:`dbm`
-      Similar interface to the DBM/NDBM library.
-
-   Module :mod:`gdbm`
-      Similar interface to the GNU GDBM library.
-
-   Module :mod:`shelve`
-      Persistence module which stores non-string data.
-
-   Module :mod:`whichdb`
-      Utility module used to determine the type of an existing database.
-
-
-.. _dumbdbm-objects:
-
-Dumbdbm Objects
----------------
-
-In addition to the methods provided by the :class:`UserDict.DictMixin` class,
-:class:`dumbdbm` objects provide the following methods.
-
-
-.. method:: dumbdbm.sync()
-
-   Synchronize the on-disk directory and data files.  This method is called by the
-   :meth:`sync` method of :class:`Shelve` objects.
-

Deleted: python/branches/py3k/Doc/library/gdbm.rst
==============================================================================
--- python/branches/py3k/Doc/library/gdbm.rst	Mon May 26 12:29:35 2008
+++ (empty file)
@@ -1,122 +0,0 @@
-
-:mod:`gdbm` --- GNU's reinterpretation of dbm
-=============================================
-
-.. module:: gdbm
-   :platform: Unix
-   :synopsis: GNU's reinterpretation of dbm.
-
-
-.. index:: module: dbm
-
-This module is quite similar to the :mod:`dbm` module, but uses ``gdbm`` instead
-to provide some additional functionality.  Please note that the file formats
-created by ``gdbm`` and ``dbm`` are incompatible.
-
-The :mod:`gdbm` module provides an interface to the GNU DBM library.  ``gdbm``
-objects behave like mappings (dictionaries), except that keys and values are
-always strings. Printing a ``gdbm`` object doesn't print the keys and values,
-and the :meth:`items` and :meth:`values` methods are not supported.
-
-The module defines the following constant and functions:
-
-
-.. exception:: error
-
-   Raised on ``gdbm``\ -specific errors, such as I/O errors. :exc:`KeyError` is
-   raised for general mapping errors like specifying an incorrect key.
-
-
-.. function:: open(filename, [flag, [mode]])
-
-   Open a ``gdbm`` database and return a ``gdbm`` object.  The *filename* argument
-   is the name of the database file.
-
-   The optional *flag* argument can be:
-
-   +---------+-------------------------------------------+
-   | Value   | Meaning                                   |
-   +=========+===========================================+
-   | ``'r'`` | Open existing database for reading only   |
-   |         | (default)                                 |
-   +---------+-------------------------------------------+
-   | ``'w'`` | Open existing database for reading and    |
-   |         | writing                                   |
-   +---------+-------------------------------------------+
-   | ``'c'`` | Open database for reading and writing,    |
-   |         | creating it if it doesn't exist           |
-   +---------+-------------------------------------------+
-   | ``'n'`` | Always create a new, empty database, open |
-   |         | for reading and writing                   |
-   +---------+-------------------------------------------+
-
-   The following additional characters may be appended to the flag to control
-   how the database is opened:
-
-   +---------+--------------------------------------------+
-   | Value   | Meaning                                    |
-   +=========+============================================+
-   | ``'f'`` | Open the database in fast mode.  Writes    |
-   |         | to the database will not be synchronized.  |
-   +---------+--------------------------------------------+
-   | ``'s'`` | Synchronized mode. This will cause changes |
-   |         | to the database to be immediately written  |
-   |         | to the file.                               |
-   +---------+--------------------------------------------+
-   | ``'u'`` | Do not lock database.                      |
-   +---------+--------------------------------------------+
-
-   Not all flags are valid for all versions of ``gdbm``.  The module constant
-   :const:`open_flags` is a string of supported flag characters.  The exception
-   :exc:`error` is raised if an invalid flag is specified.
-
-   The optional *mode* argument is the Unix mode of the file, used only when the
-   database has to be created.  It defaults to octal ``0666``.
-
-In addition to the dictionary-like methods, ``gdbm`` objects have the following
-methods:
-
-
-.. function:: firstkey()
-
-   It's possible to loop over every key in the database using this method  and the
-   :meth:`nextkey` method.  The traversal is ordered by ``gdbm``'s internal hash
-   values, and won't be sorted by the key values.  This method returns the starting
-   key.
-
-
-.. function:: nextkey(key)
-
-   Returns the key that follows *key* in the traversal.  The following code prints
-   every key in the database ``db``, without having to create a list in memory that
-   contains them all::
-
-      k = db.firstkey()
-      while k != None:
-          print(k)
-          k = db.nextkey(k)
-
-
-.. function:: reorganize()
-
-   If you have carried out a lot of deletions and would like to shrink the space
-   used by the ``gdbm`` file, this routine will reorganize the database.  ``gdbm``
-   will not shorten the length of a database file except by using this
-   reorganization; otherwise, deleted file space will be kept and reused as new
-   (key, value) pairs are added.
-
-
-.. function:: sync()
-
-   When the database has been opened in fast mode, this method forces any
-   unwritten data to be written to the disk.
-
-
-.. seealso::
-
-   Module :mod:`anydbm`
-      Generic interface to ``dbm``\ -style databases.
-
-   Module :mod:`whichdb`
-      Utility module used to determine the type of an existing database.
-

Modified: python/branches/py3k/Doc/library/persistence.rst
==============================================================================
--- python/branches/py3k/Doc/library/persistence.rst	(original)
+++ python/branches/py3k/Doc/library/persistence.rst	Mon May 26 12:29:35 2008
@@ -22,11 +22,5 @@
    copyreg.rst
    shelve.rst
    marshal.rst
-   anydbm.rst
-   whichdb.rst
    dbm.rst
-   gdbm.rst
-   dbhash.rst
-   bsddb.rst
-   dumbdbm.rst
    sqlite3.rst

Modified: python/branches/py3k/Doc/library/shelve.rst
==============================================================================
--- python/branches/py3k/Doc/library/shelve.rst	(original)
+++ python/branches/py3k/Doc/library/shelve.rst	Mon May 26 12:29:35 2008
@@ -21,7 +21,7 @@
    the underlying database.  As a side-effect, an extension may be added to the
    filename and more than one file may be created.  By default, the underlying
    database file is opened for reading and writing.  The optional *flag* parameter
-   has the same interpretation as the *flag* parameter of :func:`anydbm.open`.
+   has the same interpretation as the *flag* parameter of :func:`dbm.open`.
 
    By default, version 0 pickles are used to serialize values.  The version of the
    pickle protocol can be specified with the *protocol* parameter.
@@ -53,12 +53,12 @@
 ------------
 
   .. index::
-     module: dbm
-     module: gdbm
+     module: dbm.ndbm
+     module: dbm.gnu
      module: bsddb
 
-* The choice of which database package will be used (such as :mod:`dbm`,
-  :mod:`gdbm` or :mod:`bsddb`) depends on which interface is available.  Therefore
+* The choice of which database package will be used (such as :mod:`dbm.ndbm`,
+  :mod:`dbm.gnu` or :mod:`bsddb`) depends on which interface is available.  Therefore
   it is not safe to open the database directly using :mod:`dbm`.  The database is
   also (unfortunately) subject to the limitations of :mod:`dbm`, if it is used ---
   this means that (the pickled representation of) the objects stored in the
@@ -107,7 +107,7 @@
 .. class:: DbfilenameShelf(filename[, flag='c'[, protocol=None[, writeback=False]]])
 
    A subclass of :class:`Shelf` which accepts a *filename* instead of a dict-like
-   object.  The underlying file will be opened using :func:`anydbm.open`.  By
+   object.  The underlying file will be opened using :func:`dbm.open`.  By
    default, the file will be created and opened for both read and write.  The
    optional *flag* parameter has the same interpretation as for the :func:`open`
    function.  The optional *protocol* and *writeback* parameters have the same
@@ -152,25 +152,12 @@
 
 .. seealso::
 
-   Module :mod:`anydbm`
-      Generic interface to ``dbm``\ -style databases.
+   Module :mod:`dbm`
+      Generic interface to ``dbm``-style databases.
 
    Module :mod:`bsddb`
       BSD ``db`` database interface.
 
-   Module :mod:`dbhash`
-      Thin layer around the :mod:`bsddb` which provides an :func:`open` function like
-      the other database modules.
-
-   Module :mod:`dbm`
-      Standard Unix database interface.
-
-   Module :mod:`dumbdbm`
-      Portable implementation of the ``dbm`` interface.
-
-   Module :mod:`gdbm`
-      GNU database interface, based on the ``dbm`` interface.
-
    Module :mod:`pickle`
       Object serialization used by :mod:`shelve`.
 

Deleted: python/branches/py3k/Doc/library/whichdb.rst
==============================================================================
--- python/branches/py3k/Doc/library/whichdb.rst	Mon May 26 12:29:35 2008
+++ (empty file)
@@ -1,20 +0,0 @@
-
-:mod:`whichdb` --- Guess which DBM module created a database
-============================================================
-
-.. module:: whichdb
-   :synopsis: Guess which DBM-style module created a given database.
-
-
-The single function in this module attempts to guess which of the several simple
-database modules available--\ :mod:`dbm`, :mod:`gdbm`, or :mod:`dbhash`\
---should be used to open a given file.
-
-
-.. function:: whichdb(filename)
-
-   Returns one of the following values: ``None`` if the file can't be opened
-   because it's unreadable or doesn't exist; the empty string (``''``) if the
-   file's format can't be guessed; or a string containing the required module name,
-   such as ``'dbm'`` or ``'gdbm'``.
-

Modified: python/branches/py3k/Doc/reference/datamodel.rst
==============================================================================
--- python/branches/py3k/Doc/reference/datamodel.rst	(original)
+++ python/branches/py3k/Doc/reference/datamodel.rst	Mon May 26 12:29:35 2008
@@ -394,12 +394,12 @@
       section :ref:`dict`).
 
       .. index::
-         module: dbm
-         module: gdbm
+         module: dbm.ndbm
+         module: dbm.gnu
          module: bsddb
 
-      The extension modules :mod:`dbm`, :mod:`gdbm`, and :mod:`bsddb` provide
-      additional examples of mapping types.
+      The extension modules :mod:`dbm.ndbm`, :mod:`dbm.gnu`, and :mod:`bsddb`
+      provide additional examples of mapping types.
 
 Callable types
    .. index::

Deleted: python/branches/py3k/Lib/anydbm.py
==============================================================================
--- python/branches/py3k/Lib/anydbm.py	Mon May 26 12:29:35 2008
+++ (empty file)
@@ -1,83 +0,0 @@
-"""Generic interface to all dbm clones.
-
-Instead of
-
-        import dbm
-        d = dbm.open(file, 'w', 0o666)
-
-use
-
-        import anydbm
-        d = anydbm.open(file, 'w')
-
-The returned object is a dbhash, gdbm, dbm or dumbdbm object,
-dependent on the type of database being opened (determined by whichdb
-module) in the case of an existing dbm. If the dbm does not exist and
-the create or new flag ('c' or 'n') was specified, the dbm type will
-be determined by the availability of the modules (tested in the above
-order).
-
-It has the following interface (key and data are strings):
-
-        d[key] = data   # store data at key (may override data at
-                        # existing key)
-        data = d[key]   # retrieve data at key (raise KeyError if no
-                        # such key)
-        del d[key]      # delete data stored at key (raises KeyError
-                        # if no such key)
-        flag = key in d   # true if the key exists
-        list = d.keys() # return a list of all existing keys (slow!)
-
-Future versions may change the order in which implementations are
-tested for existence, add interfaces to other dbm-like
-implementations.
-
-The open function has an optional second argument.  This can be 'r',
-for read-only access, 'w', for read-write access of an existing
-database, 'c' for read-write access to a new or existing database, and
-'n' for read-write access to a new database.  The default is 'r'.
-
-Note: 'r' and 'w' fail if the database doesn't exist; 'c' creates it
-only if it doesn't exist; and 'n' always creates a new database.
-
-"""
-
-class error(Exception):
-    pass
-
-_names = ['dbhash', 'gdbm', 'dbm', 'dumbdbm']
-_errors = [error]
-_defaultmod = None
-
-for _name in _names:
-    try:
-        _mod = __import__(_name)
-    except ImportError:
-        continue
-    if not _defaultmod:
-        _defaultmod = _mod
-    _errors.append(_mod.error)
-
-if not _defaultmod:
-    raise ImportError("no dbm clone found; tried %s" % _names)
-
-error = tuple(_errors)
-
-def open(file, flag = 'r', mode = 0o666):
-    # guess the type of an existing database
-    from whichdb import whichdb
-    result=whichdb(file)
-    if result is None:
-        # db doesn't exist
-        if 'c' in flag or 'n' in flag:
-            # file doesn't exist and the new
-            # flag was used so use default type
-            mod = _defaultmod
-        else:
-            raise error("need 'c' or 'n' flag to open new db")
-    elif result == "":
-        # db type cannot be determined
-        raise error("db type could not be determined")
-    else:
-        mod = __import__(result)
-    return mod.open(file, flag, mode)

Deleted: python/branches/py3k/Lib/dbhash.py
==============================================================================
--- python/branches/py3k/Lib/dbhash.py	Mon May 26 12:29:35 2008
+++ (empty file)
@@ -1,16 +0,0 @@
-"""Provide a (g)dbm-compatible interface to bsddb.hashopen."""
-
-import sys
-try:
-    import bsddb
-except ImportError:
-    # prevent a second import of this module from spuriously succeeding
-    del sys.modules[__name__]
-    raise
-
-__all__ = ["error","open"]
-
-error = bsddb.error                     # Exported for anydbm
-
-def open(file, flag = 'r', mode=0o666):
-    return bsddb.hashopen(file, flag, mode)

Added: python/branches/py3k/Lib/dbm/__init__.py
==============================================================================
--- (empty file)
+++ python/branches/py3k/Lib/dbm/__init__.py	Mon May 26 12:29:35 2008
@@ -0,0 +1,198 @@
+"""Generic interface to all dbm clones.
+
+Use
+
+        import dbm
+        d = dbm.open(file, 'w', 0o666)
+
+The returned object is a dbm.bsd, dbm.gnu, dbm.ndbm or dbm.dumb
+object, dependent on the type of database being opened (determined by
+the whichdb function) in the case of an existing dbm.  If the dbm does
+not exist and the create or new flag ('c' or 'n') was specified, the
+dbm type will be determined by the availability of the modules (tested
+in the above order).
+
+It has the following interface (key and data are strings):
+
+        d[key] = data   # store data at key (may override data at
+                        # existing key)
+        data = d[key]   # retrieve data at key (raise KeyError if no
+                        # such key)
+        del d[key]      # delete data stored at key (raises KeyError
+                        # if no such key)
+        flag = key in d # true if the key exists
+        list = d.keys() # return a list of all existing keys (slow!)
+
+Future versions may change the order in which implementations are
+tested for existence, add interfaces to other dbm-like
+implementations.
+
+The open function has an optional second argument.  This can be 'r',
+for read-only access, 'w', for read-write access of an existing
+database, 'c' for read-write access to a new or existing database, and
+'n' for read-write access to a new database.  The default is 'r'.
+
+Note: 'r' and 'w' fail if the database doesn't exist; 'c' creates it
+only if it doesn't exist; and 'n' always creates a new database.
+"""
+
+__all__ = ['open', 'whichdb', 'error', 'errors']
+
+import io
+import os
+import struct
+import sys
+
+
+class error(Exception):
+    pass
+
+_names = ['dbm.bsd', 'dbm.gnu', 'dbm.ndbm', 'dbm.dumb']
+_errors = [error]
+_defaultmod = None
+_modules = {}
+
+for _name in _names:
+    try:
+        _mod = __import__(_name, fromlist=['open'])
+    except ImportError:
+        continue
+    if not _defaultmod:
+        _defaultmod = _mod
+    _modules[_name] = _mod
+    _errors.append(_mod.error)
+
+if not _defaultmod:
+    raise ImportError("no dbm clone found; tried %s" % _names)
+
+error = tuple(_errors)
+
+
+def open(file, flag = 'r', mode = 0o666):
+    # guess the type of an existing database
+    result = whichdb(file)
+    if result is None:
+        # db doesn't exist
+        if 'c' in flag or 'n' in flag:
+            # file doesn't exist and the new flag was used so use default type
+            mod = _defaultmod
+        else:
+            raise error("need 'c' or 'n' flag to open new db")
+    elif result == "":
+        # db type cannot be determined
+        raise error("db type could not be determined")
+    else:
+        mod = _modules[result]
+    return mod.open(file, flag, mode)
+
+
+try:
+    from dbm import ndbm
+    _dbmerror = ndbm.error
+except ImportError:
+    ndbm = None
+    # just some sort of valid exception which might be raised in the ndbm test
+    _dbmerror = IOError
+
+def whichdb(filename):
+    """Guess which db package to use to open a db file.
+
+    Return values:
+
+    - None if the database file can't be read;
+    - empty string if the file can be read but can't be recognized
+    - the name of the dbm submodule (e.g. "ndbm" or "gnu") if recognized.
+
+    Importing the given module may still fail, and opening the
+    database using that module may still fail.
+    """
+
+    # Check for ndbm first -- this has a .pag and a .dir file
+    try:
+        f = io.open(filename + ".pag", "rb")
+        f.close()
+        # dbm linked with gdbm on OS/2 doesn't have .dir file
+        if not (ndbm.library == "GNU gdbm" and sys.platform == "os2emx"):
+            f = io.open(filename + ".dir", "rb")
+            f.close()
+        return "dbm.ndbm"
+    except IOError:
+        # some dbm emulations based on Berkeley DB generate a .db file
+        # some do not, but they should be caught by the bsd checks
+        try:
+            f = io.open(filename + ".db", "rb")
+            f.close()
+            # guarantee we can actually open the file using dbm
+            # kind of overkill, but since we are dealing with emulations
+            # it seems like a prudent step
+            if ndbm is not None:
+                d = ndbm.open(filename)
+                d.close()
+                return "dbm.ndbm"
+        except (IOError, _dbmerror):
+            pass
+
+    # Check for dumbdbm next -- this has a .dir and a .dat file
+    try:
+        # First check for presence of files
+        os.stat(filename + ".dat")
+        size = os.stat(filename + ".dir").st_size
+        # dumbdbm files with no keys are empty
+        if size == 0:
+            return "dbm.dumb"
+        f = io.open(filename + ".dir", "rb")
+        try:
+            if f.read(1) in (b"'", b'"'):
+                return "dbm.dumb"
+        finally:
+            f.close()
+    except (OSError, IOError):
+        pass
+
+    # See if the file exists, return None if not
+    try:
+        f = io.open(filename, "rb")
+    except IOError:
+        return None
+
+    # Read the start of the file -- the magic number
+    s16 = f.read(16)
+    f.close()
+    s = s16[0:4]
+
+    # Return "" if not at least 4 bytes
+    if len(s) != 4:
+        return ""
+
+    # Convert to 4-byte int in native byte order -- return "" if impossible
+    try:
+        (magic,) = struct.unpack("=l", s)
+    except struct.error:
+        return ""
+
+    # Check for GNU dbm
+    if magic == 0x13579ace:
+        return "dbm.gnu"
+
+    ## Check for old Berkeley db hash file format v2
+    #if magic in (0x00061561, 0x61150600):
+    #    return "bsddb185" # not supported anymore
+
+    # Later versions of Berkeley db hash file have a 12-byte pad in
+    # front of the file type
+    try:
+        (magic,) = struct.unpack("=l", s16[-4:])
+    except struct.error:
+        return ""
+
+    # Check for BSD hash
+    if magic in (0x00061561, 0x61150600):
+        return "dbm.bsd"
+
+    # Unknown
+    return ""
+
+
+if __name__ == "__main__":
+    for filename in sys.argv[1:]:
+        print(whichdb(filename) or "UNKNOWN", filename)

Copied: python/branches/py3k/Lib/dbm/bsd.py (from r63646, /python/branches/py3k/Lib/dbhash.py)
==============================================================================
--- /python/branches/py3k/Lib/dbhash.py	(original)
+++ python/branches/py3k/Lib/dbm/bsd.py	Mon May 26 12:29:35 2008
@@ -1,16 +1,10 @@
 """Provide a (g)dbm-compatible interface to bsddb.hashopen."""
 
-import sys
-try:
-    import bsddb
-except ImportError:
-    # prevent a second import of this module from spuriously succeeding
-    del sys.modules[__name__]
-    raise
+import bsddb
 
-__all__ = ["error","open"]
+__all__ = ["error", "open"]
 
-error = bsddb.error                     # Exported for anydbm
+error = bsddb.error
 
 def open(file, flag = 'r', mode=0o666):
     return bsddb.hashopen(file, flag, mode)

Copied: python/branches/py3k/Lib/dbm/dumb.py (from r63646, /python/branches/py3k/Lib/dumbdbm.py)
==============================================================================
--- /python/branches/py3k/Lib/dumbdbm.py	(original)
+++ python/branches/py3k/Lib/dbm/dumb.py	Mon May 26 12:29:35 2008
@@ -25,9 +25,11 @@
 import os as _os
 import collections
 
+__all__ = ["error", "open"]
+
 _BLOCKSIZE = 512
 
-error = IOError                         # For anydbm
+error = IOError
 
 class _Database(collections.MutableMapping):
 
@@ -231,7 +233,7 @@
     """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 dumbdbm module; 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.
 

Added: python/branches/py3k/Lib/dbm/gnu.py
==============================================================================
--- (empty file)
+++ python/branches/py3k/Lib/dbm/gnu.py	Mon May 26 12:29:35 2008
@@ -0,0 +1,3 @@
+"""Provide the _gdbm module as a dbm submodule."""
+
+from _gdbm import *

Added: python/branches/py3k/Lib/dbm/ndbm.py
==============================================================================
--- (empty file)
+++ python/branches/py3k/Lib/dbm/ndbm.py	Mon May 26 12:29:35 2008
@@ -0,0 +1,3 @@
+"""Provide the _dbm module as a dbm submodule."""
+
+from _dbm import *

Deleted: python/branches/py3k/Lib/dumbdbm.py
==============================================================================
--- python/branches/py3k/Lib/dumbdbm.py	Mon May 26 12:29:35 2008
+++ (empty file)
@@ -1,255 +0,0 @@
-"""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')
-
-"""
-
-import io as _io
-import os as _os
-import collections
-
-_BLOCKSIZE = 512
-
-error = IOError                         # For anydbm
-
-class _Database(collections.MutableMapping):
-
-    # The on-disk directory and data files can remain in mutually
-    # inconsistent states for an arbitrarily long time (see comments
-    # at the end of __setitem__).  This is only repaired when _commit()
-    # gets called.  One place _commit() gets called is from __del__(),
-    # and if that occurs at program shutdown time, module globals may
-    # already have gotten rebound to None.  Since it's crucial that
-    # _commit() finish successfully, we can't ignore shutdown races
-    # here, and _commit() must not reference any globals.
-    _os = _os       # for _commit()
-    _io = _io       # for _commit()
-
-    def __init__(self, filebasename, mode):
-        self._mode = mode
-
-        # The directory file is a text file.  Each line looks like
-        #    "%r, (%d, %d)\n" % (key, pos, siz)
-        # where key is the string key, pos is the offset into the dat
-        # file of the associated value's first byte, and siz is the number
-        # of bytes in the associated value.
-        self._dirfile = filebasename + '.dir'
-
-        # The data file is a binary file pointed into by the directory
-        # file, and holds the values associated with keys.  Each value
-        # begins at a _BLOCKSIZE-aligned byte offset, and is a raw
-        # binary 8-bit string value.
-        self._datfile = filebasename + '.dat'
-        self._bakfile = filebasename + '.bak'
-
-        # The index is an in-memory dict, mirroring the directory file.
-        self._index = None  # maps keys to (pos, siz) pairs
-
-        # Mod by Jack: create data file if needed
-        try:
-            f = _io.open(self._datfile, 'r')
-        except IOError:
-            f = _io.open(self._datfile, 'w')
-            self._chmod(self._datfile)
-        f.close()
-        self._update()
-
-    # Read directory file into the in-memory index dict.
-    def _update(self):
-        self._index = {}
-        try:
-            f = _io.open(self._dirfile, 'r')
-        except IOError:
-            pass
-        else:
-            for line in f:
-                line = line.rstrip()
-                key, pos_and_siz_pair = eval(line)
-                self._index[key] = pos_and_siz_pair
-            f.close()
-
-    # Write the index dict to the directory file.  The original directory
-    # file (if any) is renamed with a .bak extension first.  If a .bak
-    # file currently exists, it's deleted.
-    def _commit(self):
-        # CAUTION:  It's vital that _commit() succeed, and _commit() can
-        # be called from __del__().  Therefore we must never reference a
-        # global in this routine.
-        if self._index is None:
-            return  # nothing to do
-
-        try:
-            self._os.unlink(self._bakfile)
-        except self._os.error:
-            pass
-
-        try:
-            self._os.rename(self._dirfile, self._bakfile)
-        except self._os.error:
-            pass
-
-        f = self._io.open(self._dirfile, 'w')
-        self._chmod(self._dirfile)
-        for key, pos_and_siz_pair in self._index.items():
-            f.write("%r, %r\n" % (key, pos_and_siz_pair))
-        f.close()
-
-    sync = _commit
-
-    def __getitem__(self, key):
-        key = key.decode("latin-1")
-        pos, siz = self._index[key]     # may raise KeyError
-        f = _io.open(self._datfile, 'rb')
-        f.seek(pos)
-        dat = f.read(siz)
-        f.close()
-        return dat
-
-    # Append val to the data file, starting at a _BLOCKSIZE-aligned
-    # offset.  The data file is first padded with NUL bytes (if needed)
-    # to get to an aligned offset.  Return pair
-    #     (starting offset of val, len(val))
-    def _addval(self, val):
-        f = _io.open(self._datfile, 'rb+')
-        f.seek(0, 2)
-        pos = int(f.tell())
-        npos = ((pos + _BLOCKSIZE - 1) // _BLOCKSIZE) * _BLOCKSIZE
-        f.write(b'\0'*(npos-pos))
-        pos = npos
-        f.write(val)
-        f.close()
-        return (pos, len(val))
-
-    # Write val to the data file, starting at offset pos.  The caller
-    # is responsible for ensuring that there's enough room starting at
-    # pos to hold val, without overwriting some other value.  Return
-    # pair (pos, len(val)).
-    def _setval(self, pos, val):
-        f = _io.open(self._datfile, 'rb+')
-        f.seek(pos)
-        f.write(val)
-        f.close()
-        return (pos, len(val))
-
-    # key is a new key whose associated value starts in the data file
-    # at offset pos and with length siz.  Add an index record to
-    # the in-memory index dict, and append one to the directory file.
-    def _addkey(self, key, pos_and_siz_pair):
-        self._index[key] = pos_and_siz_pair
-        f = _io.open(self._dirfile, 'a')
-        self._chmod(self._dirfile)
-        f.write("%r, %r\n" % (key, pos_and_siz_pair))
-        f.close()
-
-    def __setitem__(self, key, val):
-        if not isinstance(key, bytes):
-            raise TypeError("keys must be bytes")
-        key = key.decode("latin-1") # hashable bytes
-        if not isinstance(val, (bytes, bytearray)):
-            raise TypeError("values must be byte strings")
-        if key not in self._index:
-            self._addkey(key, self._addval(val))
-        else:
-            # See whether the new value is small enough to fit in the
-            # (padded) space currently occupied by the old value.
-            pos, siz = self._index[key]
-            oldblocks = (siz + _BLOCKSIZE - 1) // _BLOCKSIZE
-            newblocks = (len(val) + _BLOCKSIZE - 1) // _BLOCKSIZE
-            if newblocks <= oldblocks:
-                self._index[key] = self._setval(pos, val)
-            else:
-                # The new value doesn't fit in the (padded) space used
-                # by the old value.  The blocks used by the old value are
-                # forever lost.
-                self._index[key] = self._addval(val)
-
-            # Note that _index may be out of synch with the directory
-            # file now:  _setval() and _addval() don't update the directory
-            # file.  This also means that the on-disk directory and data
-            # files are in a mutually inconsistent state, and they'll
-            # remain that way until _commit() is called.  Note that this
-            # is a disaster (for the database) if the program crashes
-            # (so that _commit() never gets called).
-
-    def __delitem__(self, key):
-        key = key.decode("latin-1")
-        # The blocks used by the associated value are lost.
-        del self._index[key]
-        # XXX It's unclear why we do a _commit() here (the code always
-        # XXX has, so I'm not changing it).  _setitem__ doesn't try to
-        # XXX keep the directory file in synch.  Why should we?  Or
-        # XXX why shouldn't __setitem__?
-        self._commit()
-
-    def keys(self):
-        return [key.encode("latin-1") for key in self._index.keys()]
-
-    def items(self):
-        return [(key.encode("latin-1"), self[key.encode("latin-1")])
-                for key in self._index.keys()]
-
-    def __contains__(self, key):
-        key = key.decode("latin-1")
-        return key in self._index
-
-    def iterkeys(self):
-        return iter(self._index.keys())
-    __iter__ = iterkeys
-
-    def __len__(self):
-        return len(self._index)
-
-    def close(self):
-        self._commit()
-        self._index = self._datfile = self._dirfile = self._bakfile = None
-
-    __del__ = close
-
-    def _chmod (self, file):
-        if hasattr(self._os, 'chmod'):
-            self._os.chmod(file, self._mode)
-
-
-def open(file, flag=None, 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 dumbdbm 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).
-
-    """
-    # flag argument is currently ignored
-
-    # Modify mode depending on the umask
-    try:
-        um = _os.umask(0)
-        _os.umask(um)
-    except AttributeError:
-        pass
-    else:
-        # Turn off any bits that are set in the umask
-        mode = mode & (~um)
-
-    return _Database(file, mode)

Modified: python/branches/py3k/Lib/io.py
==============================================================================
--- python/branches/py3k/Lib/io.py	(original)
+++ python/branches/py3k/Lib/io.py	Mon May 26 12:29:35 2008
@@ -270,7 +270,7 @@
     """Wrapper for builtins.open
 
     Trick so that open won't become a bound method when stored
-    as a class variable (as dumbdbm does).
+    as a class variable (as dbm.dumb does).
 
     See initstdio() in Python/pythonrun.c.
     """

Modified: python/branches/py3k/Lib/shelve.py
==============================================================================
--- python/branches/py3k/Lib/shelve.py	(original)
+++ python/branches/py3k/Lib/shelve.py	Mon May 26 12:29:35 2008
@@ -190,15 +190,15 @@
 
 
 class DbfilenameShelf(Shelf):
-    """Shelf implementation using the "anydbm" generic dbm interface.
+    """Shelf implementation using the "dbm" generic dbm interface.
 
     This is initialized with the filename for the dbm database.
     See the module's __doc__ string for an overview of the interface.
     """
 
     def __init__(self, filename, flag='c', protocol=None, writeback=False):
-        import anydbm
-        Shelf.__init__(self, anydbm.open(filename, flag), protocol, writeback)
+        import dbm
+        Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback)
 
 
 def open(filename, flag='c', protocol=None, writeback=False):
@@ -208,7 +208,7 @@
     database.  As a side-effect, an extension may be added to the
     filename and more than one file may be created.  The optional flag
     parameter has the same interpretation as the flag parameter of
-    anydbm.open(). The optional protocol parameter specifies the
+    dbm.open(). The optional protocol parameter specifies the
     version of the pickle protocol (0, 1, or 2).
 
     See the module's __doc__ string for an overview of the interface.

Modified: python/branches/py3k/Lib/test/test___all__.py
==============================================================================
--- python/branches/py3k/Lib/test/test___all__.py	(original)
+++ python/branches/py3k/Lib/test/test___all__.py	Mon May 26 12:29:35 2008
@@ -57,7 +57,7 @@
         self.check_all("copy")
         self.check_all("copyreg")
         self.check_all("csv")
-        self.check_all("dbhash")
+        self.check_all("dbm.bsd")
         self.check_all("decimal")
         self.check_all("difflib")
         self.check_all("dircache")

Modified: python/branches/py3k/Lib/test/test_anydbm.py
==============================================================================
--- python/branches/py3k/Lib/test/test_anydbm.py	(original)
+++ python/branches/py3k/Lib/test/test_anydbm.py	Mon May 26 12:29:35 2008
@@ -1,50 +1,34 @@
 #! /usr/bin/env python
-"""Test script for the anydbm module
-   based on testdumbdbm.py
-"""
+"""Test script for the dbm.open function based on testdumbdbm.py"""
 
 import os
 import unittest
-import anydbm
+import dbm
 import glob
-from test import support
-
-_fname = support.TESTFN
-
-_all_modules = []
-
-for _name in anydbm._names:
-    try:
-        _module = __import__(_name)
-    except ImportError:
-        continue
-    _all_modules.append(_module)
+import test.support
 
+_fname = test.support.TESTFN
 
 #
-# Iterates over every database module supported by anydbm
-# currently available, setting anydbm to use each in turn,
-# and yielding that module
+# Iterates over every database module supported by dbm currently available,
+# setting dbm to use each in turn, and yielding that module
 #
 def dbm_iterator():
-    old_default = anydbm._defaultmod
-    for module in _all_modules:
-        anydbm._defaultmod = module
+    old_default = dbm._defaultmod
+    for module in dbm._modules.values():
+        dbm._defaultmod = module
         yield module
-    anydbm._defaultmod = old_default
+    dbm._defaultmod = old_default
 
 #
-# Clean up all scratch databases we might have created
-# during testing
+# Clean up all scratch databases we might have created during testing
 #
 def delete_files():
     # we don't know the precise name the underlying database uses
     # so we use glob to locate all names
     for f in glob.glob(_fname + "*"):
-        try:
-            os.unlink(f)
-        except OSError:
-            pass
+        test.support.unlink(f)
+
 
 class AnyDBMTestCase(unittest.TestCase):
     _dict = {'0': b'',
@@ -60,7 +44,7 @@
         unittest.TestCase.__init__(self, *args)
 
     def test_anydbm_creation(self):
-        f = anydbm.open(_fname, 'c')
+        f = dbm.open(_fname, 'c')
         self.assertEqual(list(f.keys()), [])
         for key in self._dict:
             f[key.encode("ascii")] = self._dict[key]
@@ -69,26 +53,26 @@
 
     def test_anydbm_modification(self):
         self.init_db()
-        f = anydbm.open(_fname, 'c')
+        f = dbm.open(_fname, 'c')
         self._dict['g'] = f[b'g'] = b"indented"
         self.read_helper(f)
         f.close()
 
     def test_anydbm_read(self):
         self.init_db()
-        f = anydbm.open(_fname, 'r')
+        f = dbm.open(_fname, 'r')
         self.read_helper(f)
         f.close()
 
     def test_anydbm_keys(self):
         self.init_db()
-        f = anydbm.open(_fname, 'r')
+        f = dbm.open(_fname, 'r')
         keys = self.keys_helper(f)
         f.close()
 
     def test_anydbm_access(self):
         self.init_db()
-        f = anydbm.open(_fname, 'r')
+        f = dbm.open(_fname, 'r')
         key = "a".encode("ascii")
         assert(key in f)
         assert(f[key] == b"Python:")
@@ -100,7 +84,7 @@
             self.assertEqual(self._dict[key], f[key.encode("ascii")])
 
     def init_db(self):
-        f = anydbm.open(_fname, 'n')
+        f = dbm.open(_fname, 'n')
         for k in self._dict:
             f[k.encode("ascii")] = self._dict[k]
         f.close()
@@ -118,10 +102,44 @@
         delete_files()
 
 
+class WhichDBTestCase(unittest.TestCase):
+    # Actual test methods are added to namespace after class definition.
+    def __init__(self, *args):
+        unittest.TestCase.__init__(self, *args)
+
+    def test_whichdb(self):
+        for module in dbm_iterator():
+            # Check whether whichdb correctly guesses module name
+            # for databases opened with "module" module.
+            # Try with empty files first
+            name = module.__name__
+            if name == 'dbm.dumb':
+                continue   # whichdb can't support dbm.dumb
+            test.support.unlink(_fname)
+            f = module.open(_fname, 'c')
+            f.close()
+            self.assertEqual(name, dbm.whichdb(_fname))
+            # Now add a key
+            f = module.open(_fname, 'w')
+            f[b"1"] = b"1"
+            # and test that we can find it
+            self.assertTrue(b"1" in f)
+            # and read it
+            self.assertTrue(f[b"1"] == b"1")
+            f.close()
+            self.assertEqual(name, dbm.whichdb(_fname))
+
+    def tearDown(self):
+        delete_files()
+
+    def setUp(self):
+        delete_files()
+
+
 def test_main():
     try:
         for module in dbm_iterator():
-            support.run_unittest(AnyDBMTestCase)
+            test.support.run_unittest(AnyDBMTestCase, WhichDBTestCase)
     finally:
         delete_files()
 

Modified: python/branches/py3k/Lib/test/test_bsddb.py
==============================================================================
--- python/branches/py3k/Lib/test/test_bsddb.py	(original)
+++ python/branches/py3k/Lib/test/test_bsddb.py	Mon May 26 12:29:35 2008
@@ -5,7 +5,7 @@
 import os, sys
 import copy
 import bsddb
-import dbhash # Just so we know it's imported
+import dbm.bsd # Just so we know it's imported
 import unittest
 from test import support
 

Deleted: python/branches/py3k/Lib/test/test_dbm.py
==============================================================================
--- python/branches/py3k/Lib/test/test_dbm.py	Mon May 26 12:29:35 2008
+++ (empty file)
@@ -1,40 +0,0 @@
-from test import support
-import unittest
-import os
-import random
-import dbm
-from dbm import error
-
-class DbmTestCase(unittest.TestCase):
-
-    def setUp(self):
-        self.filename = support.TESTFN
-        self.d = dbm.open(self.filename, 'c')
-        self.d.close()
-
-    def tearDown(self):
-        for suffix in ['', '.pag', '.dir', '.db']:
-            support.unlink(self.filename + suffix)
-
-    def test_keys(self):
-        self.d = dbm.open(self.filename, 'c')
-        self.assert_(self.d.keys() == [])
-        self.d['a'] = 'b'
-        self.d['12345678910'] = '019237410982340912840198242'
-        self.d.keys()
-        self.assert_(b'a' in self.d)
-        self.d.close()
-
-    def test_modes(self):
-        for mode in ['r', 'rw', 'w', 'n']:
-            try:
-                self.d = dbm.open(self.filename, mode)
-                self.d.close()
-            except dbm.error:
-                self.fail()
-
-def test_main():
-    support.run_unittest(DbmTestCase)
-
-if __name__ == '__main__':
-    test_main()

Copied: python/branches/py3k/Lib/test/test_dbm_dumb.py (from r63646, /python/branches/py3k/Lib/test/test_dumbdbm.py)
==============================================================================
--- /python/branches/py3k/Lib/test/test_dumbdbm.py	(original)
+++ python/branches/py3k/Lib/test/test_dbm_dumb.py	Mon May 26 12:29:35 2008
@@ -6,7 +6,7 @@
 import io
 import os
 import unittest
-import dumbdbm
+import dbm.dumb as dumbdbm
 from test import support
 
 _fname = support.TESTFN

Copied: python/branches/py3k/Lib/test/test_dbm_gnu.py (from r63646, /python/branches/py3k/Lib/test/test_gdbm.py)
==============================================================================
--- /python/branches/py3k/Lib/test/test_gdbm.py	(original)
+++ python/branches/py3k/Lib/test/test_dbm_gnu.py	Mon May 26 12:29:35 2008
@@ -1,4 +1,4 @@
-import gdbm
+import dbm.gnu as gdbm
 import unittest
 import os
 from test.support import verbose, TESTFN, run_unittest, unlink

Copied: python/branches/py3k/Lib/test/test_dbm_ndbm.py (from r63646, /python/branches/py3k/Lib/test/test_dbm.py)
==============================================================================
--- /python/branches/py3k/Lib/test/test_dbm.py	(original)
+++ python/branches/py3k/Lib/test/test_dbm_ndbm.py	Mon May 26 12:29:35 2008
@@ -2,14 +2,14 @@
 import unittest
 import os
 import random
-import dbm
-from dbm import error
+import dbm.ndbm
+from dbm.ndbm import error
 
 class DbmTestCase(unittest.TestCase):
 
     def setUp(self):
         self.filename = support.TESTFN
-        self.d = dbm.open(self.filename, 'c')
+        self.d = dbm.ndbm.open(self.filename, 'c')
         self.d.close()
 
     def tearDown(self):
@@ -17,7 +17,7 @@
             support.unlink(self.filename + suffix)
 
     def test_keys(self):
-        self.d = dbm.open(self.filename, 'c')
+        self.d = dbm.ndbm.open(self.filename, 'c')
         self.assert_(self.d.keys() == [])
         self.d['a'] = 'b'
         self.d['12345678910'] = '019237410982340912840198242'
@@ -28,9 +28,9 @@
     def test_modes(self):
         for mode in ['r', 'rw', 'w', 'n']:
             try:
-                self.d = dbm.open(self.filename, mode)
+                self.d = dbm.ndbm.open(self.filename, mode)
                 self.d.close()
-            except dbm.error:
+            except error:
                 self.fail()
 
 def test_main():

Deleted: python/branches/py3k/Lib/test/test_dumbdbm.py
==============================================================================
--- python/branches/py3k/Lib/test/test_dumbdbm.py	Mon May 26 12:29:35 2008
+++ (empty file)
@@ -1,185 +0,0 @@
-#! /usr/bin/env python
-"""Test script for the dumbdbm module
-   Original by Roger E. Masse
-"""
-
-import io
-import os
-import unittest
-import dumbdbm
-from test import support
-
-_fname = support.TESTFN
-
-def _delete_files():
-    for ext in [".dir", ".dat", ".bak"]:
-        try:
-            os.unlink(_fname + ext)
-        except OSError:
-            pass
-
-class DumbDBMTestCase(unittest.TestCase):
-    _dict = {'0': b'',
-             'a': b'Python:',
-             'b': b'Programming',
-             'c': b'the',
-             'd': b'way',
-             'f': b'Guido',
-             'g': b'intended',
-             }
-
-    def __init__(self, *args):
-        unittest.TestCase.__init__(self, *args)
-
-    def test_dumbdbm_creation(self):
-        f = dumbdbm.open(_fname, 'c')
-        self.assertEqual(list(f.keys()), [])
-        for key in self._dict:
-            f[key.encode("ascii")] = self._dict[key]
-        self.read_helper(f)
-        f.close()
-
-    def test_dumbdbm_creation_mode(self):
-        # On platforms without chmod, don't do anything.
-        if not (hasattr(os, 'chmod') and hasattr(os, 'umask')):
-            return
-
-        try:
-            old_umask = os.umask(0o002)
-            f = dumbdbm.open(_fname, 'c', 0o637)
-            f.close()
-        finally:
-            os.umask(old_umask)
-
-        expected_mode = 0o635
-        if os.name != 'posix':
-            # Windows only supports setting the read-only attribute.
-            # This shouldn't fail, but doesn't work like Unix either.
-            expected_mode = 0o666
-
-        import stat
-        st = os.stat(_fname + '.dat')
-        self.assertEqual(stat.S_IMODE(st.st_mode), expected_mode)
-        st = os.stat(_fname + '.dir')
-        self.assertEqual(stat.S_IMODE(st.st_mode), expected_mode)
-
-    def test_close_twice(self):
-        f = dumbdbm.open(_fname)
-        f[b'a'] = b'b'
-        self.assertEqual(f[b'a'], b'b')
-        f.close()
-        f.close()
-
-    def test_dumbdbm_modification(self):
-        self.init_db()
-        f = dumbdbm.open(_fname, 'w')
-        self._dict['g'] = f[b'g'] = b"indented"
-        self.read_helper(f)
-        f.close()
-
-    def test_dumbdbm_read(self):
-        self.init_db()
-        f = dumbdbm.open(_fname, 'r')
-        self.read_helper(f)
-        f.close()
-
-    def test_dumbdbm_keys(self):
-        self.init_db()
-        f = dumbdbm.open(_fname)
-        keys = self.keys_helper(f)
-        f.close()
-
-    def test_write_contains(self):
-        f = dumbdbm.open(_fname)
-        f[b'1'] = b'hello'
-        self.assertTrue(b'1' in f)
-        f.close()
-
-    def test_write_write_read(self):
-        # test for bug #482460
-        f = dumbdbm.open(_fname)
-        f[b'1'] = b'hello'
-        f[b'1'] = b'hello2'
-        f.close()
-        f = dumbdbm.open(_fname)
-        self.assertEqual(f[b'1'], b'hello2')
-        f.close()
-
-    def test_line_endings(self):
-        # test for bug #1172763: dumbdbm would die if the line endings
-        # weren't what was expected.
-        f = dumbdbm.open(_fname)
-        f[b'1'] = b'hello'
-        f[b'2'] = b'hello2'
-        f.close()
-
-        # Mangle the file by changing the line separator to Windows or Unix
-        data = io.open(_fname + '.dir', 'rb').read()
-        if os.linesep == '\n':
-            data = data.replace(b'\n', b'\r\n')
-        else:
-            data = data.replace(b'\r\n', b'\n')
-        io.open(_fname + '.dir', 'wb').write(data)
-
-        f = dumbdbm.open(_fname)
-        self.assertEqual(f[b'1'], b'hello')
-        self.assertEqual(f[b'2'], b'hello2')
-
-
-    def read_helper(self, f):
-        keys = self.keys_helper(f)
-        for key in self._dict:
-            self.assertEqual(self._dict[key], f[key.encode("ascii")])
-
-    def init_db(self):
-        f = dumbdbm.open(_fname, 'w')
-        for k in self._dict:
-            f[k.encode("ascii")] = self._dict[k]
-        f.close()
-
-    def keys_helper(self, f):
-        keys = sorted(k.decode("ascii") for k in f.keys())
-        dkeys = sorted(self._dict.keys())
-        self.assertEqual(keys, dkeys)
-        return keys
-
-    # Perform randomized operations.  This doesn't make assumptions about
-    # what *might* fail.
-    def test_random(self):
-        import random
-        d = {}  # mirror the database
-        for dummy in range(5):
-            f = dumbdbm.open(_fname)
-            for dummy in range(100):
-                k = random.choice('abcdefghijklm')
-                if random.random() < 0.2:
-                    if k in d:
-                        del d[k]
-                        del f[k.encode("ascii")]
-                else:
-                    v = random.choice((b'a', b'b', b'c')) * random.randrange(10000)
-                    d[k] = v
-                    f[k.encode("ascii")] = v
-                    self.assertEqual(f[k.encode("ascii")], v)
-            f.close()
-
-            f = dumbdbm.open(_fname)
-            expected = sorted((k.encode("latin-1"), v) for k, v in d.items())
-            got = sorted(f.items())
-            self.assertEqual(expected, got)
-            f.close()
-
-    def tearDown(self):
-        _delete_files()
-
-    def setUp(self):
-        _delete_files()
-
-def test_main():
-    try:
-        support.run_unittest(DumbDBMTestCase)
-    finally:
-        _delete_files()
-
-if __name__ == "__main__":
-    test_main()

Deleted: python/branches/py3k/Lib/test/test_gdbm.py
==============================================================================
--- python/branches/py3k/Lib/test/test_gdbm.py	Mon May 26 12:29:35 2008
+++ (empty file)
@@ -1,81 +0,0 @@
-import gdbm
-import unittest
-import os
-from test.support import verbose, TESTFN, run_unittest, unlink
-
-
-filename = TESTFN
-
-class TestGdbm(unittest.TestCase):
-    def setUp(self):
-        self.g = None
-
-    def tearDown(self):
-        if self.g is not None:
-            self.g.close()
-        unlink(filename)
-
-    def test_key_methods(self):
-        self.g = gdbm.open(filename, 'c')
-        self.assertEqual(self.g.keys(), [])
-        self.g['a'] = 'b'
-        self.g['12345678910'] = '019237410982340912840198242'
-        key_set = set(self.g.keys())
-        self.assertEqual(key_set, set([b'a', b'12345678910']))
-        self.assert_(b'a' in self.g)
-        key = self.g.firstkey()
-        while key:
-            self.assert_(key in key_set)
-            key_set.remove(key)
-            key = self.g.nextkey(key)
-        self.assertRaises(KeyError, lambda: self.g['xxx'])
-
-    def test_error_conditions(self):
-        # Try to open a non-existent database.
-        unlink(filename)
-        self.assertRaises(gdbm.error, gdbm.open, filename, 'r')
-        # Try to access a closed database.
-        self.g = gdbm.open(filename, 'c')
-        self.g.close()
-        self.assertRaises(gdbm.error, lambda: self.g['a'])
-        # try pass an invalid open flag
-        self.assertRaises(gdbm.error, lambda: gdbm.open(filename, 'rx').close())
-
-    def test_flags(self):
-        # Test the flag parameter open() by trying all supported flag modes.
-        all = set(gdbm.open_flags)
-        # Test standard flags (presumably "crwn").
-        modes = all - set('fsu')
-        for mode in modes:
-            self.g = gdbm.open(filename, mode)
-            self.g.close()
-
-        # Test additional flags (presumably "fsu").
-        flags = all - set('crwn')
-        for mode in modes:
-            for flag in flags:
-                self.g = gdbm.open(filename, mode + flag)
-                self.g.close()
-
-    def test_reorganize(self):
-        self.g = gdbm.open(filename, 'c')
-        size0 = os.path.getsize(filename)
-
-        self.g['x'] = 'x' * 10000
-        size1 = os.path.getsize(filename)
-        self.assert_(size0 < size1)
-
-        del self.g['x']
-        # 'size' is supposed to be the same even after deleting an entry.
-        self.assertEqual(os.path.getsize(filename), size1)
-
-        self.g.reorganize()
-        size2 = os.path.getsize(filename)
-        self.assert_(size1 > size2 >= size0)
-
-
-def test_main():
-    run_unittest(TestGdbm)
-
-if __name__ == '__main__':
-    test_main()

Deleted: python/branches/py3k/Lib/test/test_whichdb.py
==============================================================================
--- python/branches/py3k/Lib/test/test_whichdb.py	Mon May 26 12:29:35 2008
+++ (empty file)
@@ -1,58 +0,0 @@
-#! /usr/bin/env python
-"""Test script for the whichdb module
-   based on test_anydbm.py
-"""
-
-import os
-import test.support
-import unittest
-import whichdb
-import anydbm
-import glob
-from test.test_anydbm import delete_files, dbm_iterator
-
-_fname = test.support.TESTFN
-
-class WhichDBTestCase(unittest.TestCase):
-    # Actual test methods are added to namespace
-    # after class definition.
-    def __init__(self, *args):
-        unittest.TestCase.__init__(self, *args)
-
-    def test_whichdb(self):
-        for module in dbm_iterator():
-            # Check whether whichdb correctly guesses module name
-            # for databases opened with "module" module.
-            # Try with empty files first
-            name = module.__name__
-            if name == 'dumbdbm':
-                continue   # whichdb can't support dumbdbm
-            test.support.unlink(_fname)
-            f = module.open(_fname, 'c')
-            f.close()
-            self.assertEqual(name, whichdb.whichdb(_fname))
-            # Now add a key
-            f = module.open(_fname, 'w')
-            f[b"1"] = b"1"
-            # and test that we can find it
-            self.assertTrue(b"1" in f)
-            # and read it
-            self.assertTrue(f[b"1"] == b"1")
-            f.close()
-            self.assertEqual(name, whichdb.whichdb(_fname))
-
-    def tearDown(self):
-        delete_files()
-
-    def setUp(self):
-        delete_files()
-
-
-def test_main():
-    try:
-        test.support.run_unittest(WhichDBTestCase)
-    finally:
-        delete_files()
-
-if __name__ == "__main__":
-    test_main()

Deleted: python/branches/py3k/Lib/whichdb.py
==============================================================================
--- python/branches/py3k/Lib/whichdb.py	Mon May 26 12:29:35 2008
+++ (empty file)
@@ -1,118 +0,0 @@
-# !/usr/bin/env python
-"""Guess which db package to use to open a db file."""
-
-import io
-import os
-import struct
-import sys
-
-try:
-    import dbm
-    _dbmerror = dbm.error
-except ImportError:
-    dbm = None
-    # just some sort of valid exception which might be raised in the
-    # dbm test
-    _dbmerror = IOError
-
-def whichdb(filename):
-    """Guess which db package to use to open a db file.
-
-    Return values:
-
-    - None if the database file can't be read;
-    - empty string if the file can be read but can't be recognized
-    - the module name (e.g. "dbm" or "gdbm") if recognized.
-
-    Importing the given module may still fail, and opening the
-    database using that module may still fail.
-    """
-
-    # Check for dbm first -- this has a .pag and a .dir file
-    try:
-        f = io.open(filename + ".pag", "rb")
-        f.close()
-        # dbm linked with gdbm on OS/2 doesn't have .dir file
-        if not (dbm.library == "GNU gdbm" and sys.platform == "os2emx"):
-            f = io.open(filename + ".dir", "rb")
-            f.close()
-        return "dbm"
-    except IOError:
-        # some dbm emulations based on Berkeley DB generate a .db file
-        # some do not, but they should be caught by the dbhash checks
-        try:
-            f = io.open(filename + ".db", "rb")
-            f.close()
-            # guarantee we can actually open the file using dbm
-            # kind of overkill, but since we are dealing with emulations
-            # it seems like a prudent step
-            if dbm is not None:
-                d = dbm.open(filename)
-                d.close()
-                return "dbm"
-        except (IOError, _dbmerror):
-            pass
-
-    # Check for dumbdbm next -- this has a .dir and a .dat file
-    try:
-        # First check for presence of files
-        os.stat(filename + ".dat")
-        size = os.stat(filename + ".dir").st_size
-        # dumbdbm files with no keys are empty
-        if size == 0:
-            return "dumbdbm"
-        f = io.open(filename + ".dir", "rb")
-        try:
-            if f.read(1) in (b"'", b'"'):
-                return "dumbdbm"
-        finally:
-            f.close()
-    except (OSError, IOError):
-        pass
-
-    # See if the file exists, return None if not
-    try:
-        f = io.open(filename, "rb")
-    except IOError:
-        return None
-
-    # Read the start of the file -- the magic number
-    s16 = f.read(16)
-    f.close()
-    s = s16[0:4]
-
-    # Return "" if not at least 4 bytes
-    if len(s) != 4:
-        return ""
-
-    # Convert to 4-byte int in native byte order -- return "" if impossible
-    try:
-        (magic,) = struct.unpack("=l", s)
-    except struct.error:
-        return ""
-
-    # Check for GNU dbm
-    if magic == 0x13579ace:
-        return "gdbm"
-
-    # Check for old Berkeley db hash file format v2
-    if magic in (0x00061561, 0x61150600):
-        return "bsddb185"
-
-    # Later versions of Berkeley db hash file have a 12-byte pad in
-    # front of the file type
-    try:
-        (magic,) = struct.unpack("=l", s16[-4:])
-    except struct.error:
-        return ""
-
-    # Check for BSD hash
-    if magic in (0x00061561, 0x61150600):
-        return "dbhash"
-
-    # Unknown
-    return ""
-
-if __name__ == "__main__":
-    for filename in sys.argv[1:]:
-        print(whichdb(filename) or "UNKNOWN", filename)

Modified: python/branches/py3k/Misc/PURIFY.README
==============================================================================
--- python/branches/py3k/Misc/PURIFY.README	(original)
+++ python/branches/py3k/Misc/PURIFY.README	Mon May 26 12:29:35 2008
@@ -57,8 +57,8 @@
 
     suppress umr ...; "socketmodule.c"
     suppress umr ...; time_strftime
-    suppress umr ...; "dbmmodule.c"
-    suppress umr ...; "gdbmmodule.c"
+    suppress umr ...; "_dbmmodule.c"
+    suppress umr ...; "_gdbmmodule.c"
     suppress umr ...; "grpmodule.c"
     suppress umr ...; "nismodule.c"
     suppress umr ...; "pwdmodule.c"

Modified: python/branches/py3k/Misc/cheatsheet
==============================================================================
--- python/branches/py3k/Misc/cheatsheet	(original)
+++ python/branches/py3k/Misc/cheatsheet	Mon May 26 12:29:35 2008
@@ -1795,8 +1795,8 @@
                            Standard library modules
    Operation                                 Result
 aifc             Stuff to parse AIFF-C and AIFF files.
-anydbm           Generic interface to all dbm clones. (dbhash, gdbm,
-                 dbm,dumbdbm)
+dbm              Generic interface to all dbm clones. (dbm.bsd, dbm.gnu,
+                 dbm.ndbm, dbm.dumb)
 asynchat         Support for 'chat' style protocols
 asyncore         Asynchronous File I/O (in select style)
 atexit           Register functions to be called at exit of Python interpreter.
@@ -1822,21 +1822,16 @@
 copy             Generic shallow and deep copying operations.
 copy_reg         Helper to provide extensibility for pickle/cPickle.
 csv              Read and write files with comma separated values.
-dbhash           (g)dbm-compatible interface to bsdhash.hashopen.
 dircache         Sorted list of files in a dir, using a cache.
-[DEL:dircmp:DEL] [DEL:Defines a class to build directory diff tools on.:DEL]
 difflib          Tool for creating delta between sequences.
 dis              Bytecode disassembler.
 distutils        Package installation system.
 doctest          Tool for running and verifying tests inside doc strings.
 dospath          Common operations on DOS pathnames.
-dumbdbm          A dumb and slow but simple dbm clone.
-[DEL:dump:DEL]   [DEL:Print python code that reconstructs a variable.:DEL]
 email            Comprehensive support for internet email.
 filecmp          File comparison.
 fileinput        Helper class to quickly write a loop over all standard input
                  files.
-[DEL:find:DEL]   [DEL:Find files directory hierarchy matching a pattern.:DEL]
 fnmatch          Filename matching with shell patterns.
 formatter        A test formatter.
 fpformat         General floating point formatting functions.
@@ -1847,7 +1842,6 @@
                  www.pauahtun.org/pub/getargspy.zip
 getpass          Utilities to get a password and/or the current user name.
 glob             filename globbing.
-[DEL:grep:DEL]   [DEL:'grep' utilities.:DEL]
 gzip             Read & write gzipped files.
 heapq            Priority queue implemented using lists organized as heaps.
 HMAC             Keyed-Hashing for Message Authentication -- RFC 2104.
@@ -1882,8 +1876,6 @@
 nturl2path       Mac specific module for conversion between pathnames and URLs.
 optparse         A comprehensive tool for processing command line options.
 os               Either mac, dos or posix depending system.
-[DEL:packmail:   [DEL:Create a self-unpacking shell archive.:DEL]
-DEL]
 pdb              A Python debugger.
 pickle           Pickling (save and restore) of Python objects (a faster
                  Cimplementation exists in built-in module: cPickle).
@@ -1929,7 +1921,7 @@
 sunau            Stuff to parse Sun and NeXT audio files.
 sunaudio         Interpret sun audio headers.
 symbol           Non-terminal symbols of Python grammar (from "graminit.h").
-tabnanny,/font>  Check Python source for ambiguous indentation.
+tabnanny         Check Python source for ambiguous indentation.
 tarfile          Facility for reading and writing to the *nix tarfile format.
 telnetlib        TELNET client class. Based on RFC 854.
 tempfile         Temporary file name allocation.
@@ -1950,15 +1942,11 @@
 UserDict         A wrapper to allow subclassing of built-in dict class.
 UserList         A wrapper to allow subclassing of built-in list class.
 UserString       A wrapper to allow subclassing of built-in string class.
-[DEL:util:DEL]   [DEL:some useful functions that don't fit elsewhere !!:DEL]
 uu               UUencode/UUdecode.
 unittest         Utilities for implementing unit testing.
 wave             Stuff to parse WAVE files.
 weakref          Tools for creating and managing weakly referenced objects.
 webbrowser       Platform independent URL launcher.
-[DEL:whatsound:  [DEL:Several routines that help recognizing sound files.:DEL]
-DEL]
-whichdb          Guess which db package to use to open a db file.
 xdrlib           Implements (a subset of) Sun XDR (eXternal Data
                  Representation)
 xmllib           A parser for XML, using the derived class as static DTD.
@@ -1966,7 +1954,6 @@
 xml.sax          Classes for processing XML using the SAX API.
 xmlrpclib        Support for remote procedure calls using XML.
 zipfile          Read & write PK zipped files.
-[DEL:zmod:DEL]   [DEL:Demonstration of abstruse mathematical concepts.:DEL]
 
 
 
@@ -1993,7 +1980,7 @@
 
 * Unix/Posix *
 
-            dbm                 Interface to Unix ndbm database library
+            dbm                 Interface to Unix dbm databases
             grp                 Interface to Unix group database
             posix               OS functionality standardized by C and POSIX standards
             posixpath           POSIX pathname functions

Modified: python/branches/py3k/Modules/Setup.dist
==============================================================================
--- python/branches/py3k/Modules/Setup.dist	(original)
+++ python/branches/py3k/Modules/Setup.dist	Mon May 26 12:29:35 2008
@@ -294,8 +294,8 @@
 # Modules that provide persistent dictionary-like semantics.  You will
 # probably want to arrange for at least one of them to be available on
 # your machine, though none are defined by default because of library
-# dependencies.  The Python module anydbm.py provides an
-# implementation independent wrapper for these; dumbdbm.py provides
+# dependencies.  The Python module dbm/__init__.py provides an
+# implementation independent wrapper for these; dbm/dumb.py provides
 # similar functionality (but slower of course) implemented in Python.
 
 # The standard Unix dbm module has been moved to Setup.config so that
@@ -305,13 +305,13 @@
 #
 # First, look at Setup.config; configure may have set this for you.
 
-#dbm dbmmodule.c 	# dbm(3) may require -lndbm or similar
+#_dbm _dbmmodule.c 	# dbm(3) may require -lndbm or similar
 
 # Anthony Baxter's gdbm module.  GNU dbm(3) will require -lgdbm:
 #
 # First, look at Setup.config; configure may have set this for you.
 
-#gdbm gdbmmodule.c -I/usr/local/include -L/usr/local/lib -lgdbm
+#_gdbm _gdbmmodule.c -I/usr/local/include -L/usr/local/lib -lgdbm
 
 
 # Sleepycat Berkeley DB interface.

Copied: python/branches/py3k/Modules/_dbmmodule.c (from r63646, /python/branches/py3k/Modules/dbmmodule.c)
==============================================================================
--- /python/branches/py3k/Modules/dbmmodule.c	(original)
+++ python/branches/py3k/Modules/_dbmmodule.c	Mon May 26 12:29:35 2008
@@ -332,7 +332,7 @@
 
 static PyTypeObject Dbmtype = {
 	PyVarObject_HEAD_INIT(NULL, 0)
-	"dbm.dbm",
+	"_dbm.dbm",
 	sizeof(dbmobject),
 	0,
 	(destructor)dbm_dealloc,  /*tp_dealloc*/
@@ -391,17 +391,17 @@
 };
 
 PyMODINIT_FUNC
-initdbm(void) {
+init_dbm(void) {
 	PyObject *m, *d, *s;
 
 	if (PyType_Ready(&Dbmtype) < 0)
 		return;
-	m = Py_InitModule("dbm", dbmmodule_methods);
+	m = Py_InitModule("_dbm", dbmmodule_methods);
 	if (m == NULL)
 		return;
 	d = PyModule_GetDict(m);
 	if (DbmError == NULL)
-		DbmError = PyErr_NewException("dbm.error", NULL, NULL);
+		DbmError = PyErr_NewException("_dbm.error", NULL, NULL);
 	s = PyUnicode_FromString(which_dbm);
 	if (s != NULL) {
 		PyDict_SetItemString(d, "library", s);

Copied: python/branches/py3k/Modules/_gdbmmodule.c (from r63646, /python/branches/py3k/Modules/gdbmmodule.c)
==============================================================================
--- /python/branches/py3k/Modules/gdbmmodule.c	(original)
+++ python/branches/py3k/Modules/_gdbmmodule.c	Mon May 26 12:29:35 2008
@@ -389,7 +389,7 @@
 
 static PyTypeObject Dbmtype = {
     PyVarObject_HEAD_INIT(0, 0)
-    "gdbm.gdbm",
+    "_gdbm.gdbm",
     sizeof(dbmobject),
     0,
     (destructor)dbm_dealloc,            /*tp_dealloc*/
@@ -512,18 +512,18 @@
 };
 
 PyMODINIT_FUNC
-initgdbm(void) {
+init_gdbm(void) {
     PyObject *m, *d, *s;
 
     if (PyType_Ready(&Dbmtype) < 0)
 	    return;
-    m = Py_InitModule4("gdbm", dbmmodule_methods,
+    m = Py_InitModule4("_gdbm", dbmmodule_methods,
                        gdbmmodule__doc__, (PyObject *)NULL,
                        PYTHON_API_VERSION);
     if (m == NULL)
 	return;
     d = PyModule_GetDict(m);
-    DbmError = PyErr_NewException("gdbm.error", NULL, NULL);
+    DbmError = PyErr_NewException("_gdbm.error", NULL, NULL);
     if (DbmError != NULL) {
         PyDict_SetItemString(d, "error", DbmError);
         s = PyUnicode_FromString(dbmmodule_open_flags);

Modified: python/branches/py3k/Modules/_threadmodule.c
==============================================================================
--- python/branches/py3k/Modules/_threadmodule.c	(original)
+++ python/branches/py3k/Modules/_threadmodule.c	Mon May 26 12:29:35 2008
@@ -127,7 +127,7 @@
 
 static PyTypeObject Locktype = {
 	PyVarObject_HEAD_INIT(&PyType_Type, 0)
-	"thread.lock",			/*tp_name*/
+	"_thread.lock",			/*tp_name*/
 	sizeof(lockobject),		/*tp_size*/
 	0,				/*tp_itemsize*/
 	/* methods */
@@ -336,7 +336,7 @@
 
 static PyTypeObject localtype = {
 	PyVarObject_HEAD_INIT(NULL, 0)
-	/* tp_name           */ "thread._local",
+	/* tp_name           */ "_thread._local",
 	/* tp_basicsize      */ sizeof(localobject),
 	/* tp_itemsize       */ 0,
 	/* tp_dealloc        */ (destructor)local_dealloc,

Deleted: python/branches/py3k/Modules/dbmmodule.c
==============================================================================
--- python/branches/py3k/Modules/dbmmodule.c	Mon May 26 12:29:35 2008
+++ (empty file)
@@ -1,412 +0,0 @@
-
-/* DBM module using dictionary interface */
-
-
-#include "Python.h"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-/* Some Linux systems install gdbm/ndbm.h, but not ndbm.h.  This supports
- * whichever configure was able to locate.
- */
-#if defined(HAVE_NDBM_H)
-#include <ndbm.h>
-#if defined(PYOS_OS2) && !defined(PYCC_GCC)
-static char *which_dbm = "ndbm";
-#else
-static char *which_dbm = "GNU gdbm";  /* EMX port of GDBM */
-#endif
-#elif defined(HAVE_GDBM_NDBM_H)
-#include <gdbm/ndbm.h>
-static char *which_dbm = "GNU gdbm";
-#elif defined(HAVE_BERKDB_H)
-#include <db.h>
-static char *which_dbm = "Berkeley DB";
-#else
-#error "No ndbm.h available!"
-#endif
-
-typedef struct {
-	PyObject_HEAD
-	int di_size;	/* -1 means recompute */
-	DBM *di_dbm;
-} dbmobject;
-
-static PyTypeObject Dbmtype;
-
-#define is_dbmobject(v) (Py_TYPE(v) == &Dbmtype)
-#define check_dbmobject_open(v) if ((v)->di_dbm == NULL) \
-               { PyErr_SetString(DbmError, "DBM object has already been closed"); \
-                 return NULL; }
-
-static PyObject *DbmError;
-
-static PyObject *
-newdbmobject(char *file, int flags, int mode)
-{
-        dbmobject *dp;
-
-	dp = PyObject_New(dbmobject, &Dbmtype);
-	if (dp == NULL)
-		return NULL;
-	dp->di_size = -1;
-	if ( (dp->di_dbm = dbm_open(file, flags, mode)) == 0 ) {
-		PyErr_SetFromErrno(DbmError);
-		Py_DECREF(dp);
-		return NULL;
-	}
-	return (PyObject *)dp;
-}
-
-/* Methods */
-
-static void
-dbm_dealloc(register dbmobject *dp)
-{
-        if ( dp->di_dbm )
-		dbm_close(dp->di_dbm);
-	PyObject_Del(dp);
-}
-
-static Py_ssize_t
-dbm_length(dbmobject *dp)
-{
-        if (dp->di_dbm == NULL) {
-                 PyErr_SetString(DbmError, "DBM object has already been closed"); 
-                 return -1; 
-        }
-        if ( dp->di_size < 0 ) {
-		datum key;
-		int size;
-
-		size = 0;
-		for ( key=dbm_firstkey(dp->di_dbm); key.dptr;
-		      key = dbm_nextkey(dp->di_dbm))
-			size++;
-		dp->di_size = size;
-	}
-	return dp->di_size;
-}
-
-static PyObject *
-dbm_subscript(dbmobject *dp, register PyObject *key)
-{
-	datum drec, krec;
-	Py_ssize_t tmp_size;
-	
-	if (!PyArg_Parse(key, "s#", &krec.dptr, &tmp_size) )
-		return NULL;
-	
-	krec.dsize = tmp_size;
-        check_dbmobject_open(dp);
-	drec = dbm_fetch(dp->di_dbm, krec);
-	if ( drec.dptr == 0 ) {
-		PyErr_SetObject(PyExc_KeyError, key);
-		return NULL;
-	}
-	if ( dbm_error(dp->di_dbm) ) {
-		dbm_clearerr(dp->di_dbm);
-		PyErr_SetString(DbmError, "");
-		return NULL;
-	}
-	return PyBytes_FromStringAndSize(drec.dptr, drec.dsize);
-}
-
-static int
-dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w)
-{
-        datum krec, drec;
-	Py_ssize_t tmp_size;
-	
-        if ( !PyArg_Parse(v, "s#", &krec.dptr, &tmp_size) ) {
-		PyErr_SetString(PyExc_TypeError,
-				"dbm mappings have string keys only");
-		return -1;
-	}
-	krec.dsize = tmp_size;
-        if (dp->di_dbm == NULL) {
-                 PyErr_SetString(DbmError, "DBM object has already been closed"); 
-                 return -1;
-        }
-	dp->di_size = -1;
-	if (w == NULL) {
-		if ( dbm_delete(dp->di_dbm, krec) < 0 ) {
-			dbm_clearerr(dp->di_dbm);
-			PyErr_SetObject(PyExc_KeyError, v);
-			return -1;
-		}
-	} else {
-		if ( !PyArg_Parse(w, "s#", &drec.dptr, &tmp_size) ) {
-			PyErr_SetString(PyExc_TypeError,
-			     "dbm mappings have byte string elements only");
-			return -1;
-		}
-		drec.dsize = tmp_size;
-		if ( dbm_store(dp->di_dbm, krec, drec, DBM_REPLACE) < 0 ) {
-			dbm_clearerr(dp->di_dbm);
-			PyErr_SetString(DbmError,
-					"cannot add item to database");
-			return -1;
-		}
-	}
-	if ( dbm_error(dp->di_dbm) ) {
-		dbm_clearerr(dp->di_dbm);
-		PyErr_SetString(DbmError, "");
-		return -1;
-	}
-	return 0;
-}
-
-static PyMappingMethods dbm_as_mapping = {
-	(lenfunc)dbm_length,		/*mp_length*/
-	(binaryfunc)dbm_subscript,	/*mp_subscript*/
-	(objobjargproc)dbm_ass_sub,	/*mp_ass_subscript*/
-};
-
-static PyObject *
-dbm__close(register dbmobject *dp, PyObject *unused)
-{
-        if (dp->di_dbm)
-		dbm_close(dp->di_dbm);
-	dp->di_dbm = NULL;
-	Py_INCREF(Py_None);
-	return Py_None;
-}
-
-static PyObject *
-dbm_keys(register dbmobject *dp, PyObject *unused)
-{
-	register PyObject *v, *item;
-	datum key;
-	int err;
-
-        check_dbmobject_open(dp);
-	v = PyList_New(0);
-	if (v == NULL)
-		return NULL;
-	for (key = dbm_firstkey(dp->di_dbm); key.dptr;
-	     key = dbm_nextkey(dp->di_dbm)) {
-		item = PyBytes_FromStringAndSize(key.dptr, key.dsize);
-		if (item == NULL) {
-			Py_DECREF(v);
-			return NULL;
-		}
-		err = PyList_Append(v, item);
-		Py_DECREF(item);
-		if (err != 0) {
-			Py_DECREF(v);
-			return NULL;
-		}
-	}
-	return v;
-}
-
-static int
-dbm_contains(PyObject *self, PyObject *arg)
-{
-	dbmobject *dp = (dbmobject *)self;
-	datum key, val;
-
-	if ((dp)->di_dbm == NULL) {
-		PyErr_SetString(DbmError,
-				"DBM object has already been closed");
-                 return -1;
-	}
-	if (PyUnicode_Check(arg)) {
-		arg = _PyUnicode_AsDefaultEncodedString(arg, NULL);
-		if (arg == NULL)
-			return -1;
-	}
-	if (!PyString_Check(arg)) {
-		PyErr_Format(PyExc_TypeError,
-			     "dbm key must be string, not %.100s",
-			     arg->ob_type->tp_name);
-		return -1;
-	}
-	key.dptr = PyString_AS_STRING(arg);
-	key.dsize = PyString_GET_SIZE(arg);
-	val = dbm_fetch(dp->di_dbm, key);
-	return val.dptr != NULL;
-}
-
-static PySequenceMethods dbm_as_sequence = {
-	0,			/* sq_length */
-	0,			/* sq_concat */
-	0,			/* sq_repeat */
-	0,			/* sq_item */
-	0,			/* sq_slice */
-	0,			/* sq_ass_item */
-	0,			/* sq_ass_slice */
-	dbm_contains,		/* sq_contains */
-	0,			/* sq_inplace_concat */
-	0,			/* sq_inplace_repeat */
-};
-
-static PyObject *
-dbm_get(register dbmobject *dp, PyObject *args)
-{
-	datum key, val;
-	PyObject *defvalue = Py_None;
-	char *tmp_ptr;
-	Py_ssize_t tmp_size;
-
-	if (!PyArg_ParseTuple(args, "s#|O:get",
-                              &tmp_ptr, &tmp_size, &defvalue))
-		return NULL;
-	key.dptr = tmp_ptr;
-	key.dsize = tmp_size;
-        check_dbmobject_open(dp);
-	val = dbm_fetch(dp->di_dbm, key);
-	if (val.dptr != NULL)
-		return PyBytes_FromStringAndSize(val.dptr, val.dsize);
-	else {
-		Py_INCREF(defvalue);
-		return defvalue;
-	}
-}
-
-static PyObject *
-dbm_setdefault(register dbmobject *dp, PyObject *args)
-{
-	datum key, val;
-	PyObject *defvalue = NULL;
-	char *tmp_ptr;
-	Py_ssize_t tmp_size;
-
-	if (!PyArg_ParseTuple(args, "s#|O:setdefault",
-                              &tmp_ptr, &tmp_size, &defvalue))
-		return NULL;
-	key.dptr = tmp_ptr;
-	key.dsize = tmp_size;
-        check_dbmobject_open(dp);
-	val = dbm_fetch(dp->di_dbm, key);
-	if (val.dptr != NULL)
-		return PyBytes_FromStringAndSize(val.dptr, val.dsize);
-	if (defvalue == NULL) {
-		defvalue = PyBytes_FromStringAndSize(NULL, 0);
-		if (defvalue == NULL)
-			return NULL;
-		val.dptr = NULL;
-		val.dsize = 0;
-	}
-	else {
-		if ( !PyArg_Parse(defvalue, "s#", &val.dptr, &tmp_size) ) {
-			PyErr_SetString(PyExc_TypeError,
-				"dbm mappings have byte string elements only");
-			return NULL;
-		}
-		val.dsize = tmp_size;
-		Py_INCREF(defvalue);
-	}
-	if (dbm_store(dp->di_dbm, key, val, DBM_INSERT) < 0) {
-		dbm_clearerr(dp->di_dbm);
-		PyErr_SetString(DbmError, "cannot add item to database");
-		Py_DECREF(defvalue);
-		return NULL;
-	}
-	return defvalue;
-}
-
-static PyMethodDef dbm_methods[] = {
-	{"close",	(PyCFunction)dbm__close,	METH_NOARGS,
-	 "close()\nClose the database."},
-	{"keys",	(PyCFunction)dbm_keys,		METH_NOARGS,
-	 "keys() -> list\nReturn a list of all keys in the database."},
-	{"get",		(PyCFunction)dbm_get,		METH_VARARGS,
-	 "get(key[, default]) -> value\n"
-	 "Return the value for key if present, otherwise default."},
-	{"setdefault",	(PyCFunction)dbm_setdefault,	METH_VARARGS,
-	 "setdefault(key[, default]) -> value\n"
-	 "Return the value for key if present, otherwise default.  If key\n"
-	 "is not in the database, it is inserted with default as the value."},
-	{NULL,		NULL}		/* sentinel */
-};
-
-static PyObject *
-dbm_getattr(dbmobject *dp, char *name)
-{
-	return Py_FindMethod(dbm_methods, (PyObject *)dp, name);
-}
-
-static PyTypeObject Dbmtype = {
-	PyVarObject_HEAD_INIT(NULL, 0)
-	"dbm.dbm",
-	sizeof(dbmobject),
-	0,
-	(destructor)dbm_dealloc,  /*tp_dealloc*/
-	0,			  /*tp_print*/
-	(getattrfunc)dbm_getattr, /*tp_getattr*/
-	0,			  /*tp_setattr*/
-	0,			  /*tp_compare*/
-	0,			  /*tp_repr*/
-	0,			  /*tp_as_number*/
-	&dbm_as_sequence,	  /*tp_as_sequence*/
-	&dbm_as_mapping,	  /*tp_as_mapping*/
-	0,                    /*tp_hash*/
-	0,                    /*tp_call*/
-	0,                    /*tp_str*/
-	0,                    /*tp_getattro*/
-	0,                    /*tp_setattro*/
-	0,                    /*tp_as_buffer*/
-	Py_TPFLAGS_DEFAULT,   /*tp_xxx4*/
-};
-
-/* ----------------------------------------------------------------- */
-
-static PyObject *
-dbmopen(PyObject *self, PyObject *args)
-{
-	char *name;
-	char *flags = "r";
-	int iflags;
-	int mode = 0666;
-
-        if ( !PyArg_ParseTuple(args, "s|si:open", &name, &flags, &mode) )
-		return NULL;
-	if ( strcmp(flags, "r") == 0 )
-		iflags = O_RDONLY;
-	else if ( strcmp(flags, "w") == 0 )
-		iflags = O_RDWR;
-	else if ( strcmp(flags, "rw") == 0 ) /* B/W compat */
-		iflags = O_RDWR|O_CREAT; 
-	else if ( strcmp(flags, "c") == 0 )
-		iflags = O_RDWR|O_CREAT;
-	else if ( strcmp(flags, "n") == 0 )
-		iflags = O_RDWR|O_CREAT|O_TRUNC;
-	else {
-		PyErr_SetString(DbmError,
-				"arg 2 to open should be 'r', 'w', 'c', or 'n'");
-		return NULL;
-	}
-        return newdbmobject(name, iflags, mode);
-}
-
-static PyMethodDef dbmmodule_methods[] = {
-	{ "open", (PyCFunction)dbmopen, METH_VARARGS,
-	  "open(path[, flag[, mode]]) -> mapping\n"
-	  "Return a database object."},
-	{ 0, 0 },
-};
-
-PyMODINIT_FUNC
-initdbm(void) {
-	PyObject *m, *d, *s;
-
-	if (PyType_Ready(&Dbmtype) < 0)
-		return;
-	m = Py_InitModule("dbm", dbmmodule_methods);
-	if (m == NULL)
-		return;
-	d = PyModule_GetDict(m);
-	if (DbmError == NULL)
-		DbmError = PyErr_NewException("dbm.error", NULL, NULL);
-	s = PyUnicode_FromString(which_dbm);
-	if (s != NULL) {
-		PyDict_SetItemString(d, "library", s);
-		Py_DECREF(s);
-	}
-	if (DbmError != NULL)
-		PyDict_SetItemString(d, "error", DbmError);
-}

Deleted: python/branches/py3k/Modules/gdbmmodule.c
==============================================================================
--- python/branches/py3k/Modules/gdbmmodule.c	Mon May 26 12:29:35 2008
+++ (empty file)
@@ -1,533 +0,0 @@
-
-/* DBM module using dictionary interface */
-/* Author: Anthony Baxter, after dbmmodule.c */
-/* Doc strings: Mitch Chapman */
-
-
-#include "Python.h"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include "gdbm.h"
-
-#if defined(WIN32) && !defined(__CYGWIN__)
-#include "gdbmerrno.h"
-extern const char * gdbm_strerror(gdbm_error);
-#endif
-
-PyDoc_STRVAR(gdbmmodule__doc__,
-"This module provides an interface to the GNU DBM (GDBM) library.\n\
-\n\
-This module is quite similar to the dbm module, but uses GDBM instead to\n\
-provide some additional functionality. Please note that the file formats\n\
-created by GDBM and dbm are incompatible. \n\
-\n\
-GDBM objects behave like mappings (dictionaries), except that keys and\n\
-values are always strings. Printing a GDBM object doesn't print the\n\
-keys and values, and the items() and values() methods are not\n\
-supported.");
-
-typedef struct {
-    PyObject_HEAD
-    int di_size;	/* -1 means recompute */
-    GDBM_FILE di_dbm;
-} dbmobject;
-
-static PyTypeObject Dbmtype;
-
-#define is_dbmobject(v) (Py_TYPE(v) == &Dbmtype)
-#define check_dbmobject_open(v) if ((v)->di_dbm == NULL) \
-    { PyErr_SetString(DbmError, "GDBM object has already been closed"); \
-      return NULL; }
-
-
-
-static PyObject *DbmError;
-
-PyDoc_STRVAR(gdbm_object__doc__,
-"This object represents a GDBM database.\n\
-GDBM objects behave like mappings (dictionaries), except that keys and\n\
-values are always strings. Printing a GDBM object doesn't print the\n\
-keys and values, and the items() and values() methods are not\n\
-supported.\n\
-\n\
-GDBM objects also support additional operations such as firstkey,\n\
-nextkey, reorganize, and sync.");
-
-static PyObject *
-newdbmobject(char *file, int flags, int mode)
-{
-    dbmobject *dp;
-
-    dp = PyObject_New(dbmobject, &Dbmtype);
-    if (dp == NULL)
-        return NULL;
-    dp->di_size = -1;
-    errno = 0;
-    if ((dp->di_dbm = gdbm_open(file, 0, flags, mode, NULL)) == 0) {
-        if (errno != 0)
-            PyErr_SetFromErrno(DbmError);
-        else
-            PyErr_SetString(DbmError, gdbm_strerror(gdbm_errno));
-        Py_DECREF(dp);
-        return NULL;
-    }
-    return (PyObject *)dp;
-}
-
-/* Methods */
-
-static void
-dbm_dealloc(register dbmobject *dp)
-{
-    if (dp->di_dbm)
-        gdbm_close(dp->di_dbm);
-    PyObject_Del(dp);
-}
-
-static Py_ssize_t
-dbm_length(dbmobject *dp)
-{
-    if (dp->di_dbm == NULL) {
-        PyErr_SetString(DbmError, "GDBM object has already been closed");
-        return -1;
-    }
-    if (dp->di_size < 0) {
-        datum key,okey;
-        int size;
-        okey.dsize=0;
-        okey.dptr=NULL;
-
-        size = 0;
-        for (key=gdbm_firstkey(dp->di_dbm); key.dptr;
-             key = gdbm_nextkey(dp->di_dbm,okey)) {
-            size++;
-            if(okey.dsize) free(okey.dptr);
-            okey=key;
-        }
-        dp->di_size = size;
-    }
-    return dp->di_size;
-}
-
-static PyObject *
-dbm_subscript(dbmobject *dp, register PyObject *key)
-{
-    PyObject *v;
-    datum drec, krec;
-
-    if (!PyArg_Parse(key, "s#", &krec.dptr, &krec.dsize) )
-        return NULL;
-
-    if (dp->di_dbm == NULL) {
-        PyErr_SetString(DbmError,
-                        "GDBM object has already been closed");
-        return NULL;
-    }
-    drec = gdbm_fetch(dp->di_dbm, krec);
-    if (drec.dptr == 0) {
-        PyErr_SetObject(PyExc_KeyError, key);
-        return NULL;
-    }
-    v = PyString_FromStringAndSize(drec.dptr, drec.dsize);
-    free(drec.dptr);
-    return v;
-}
-
-static int
-dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w)
-{
-    datum krec, drec;
-
-    if (!PyArg_Parse(v, "s#", &krec.dptr, &krec.dsize) ) {
-        PyErr_SetString(PyExc_TypeError,
-                        "gdbm mappings have string indices only");
-        return -1;
-    }
-    if (dp->di_dbm == NULL) {
-        PyErr_SetString(DbmError,
-                        "GDBM object has already been closed");
-        return -1;
-    }
-    dp->di_size = -1;
-    if (w == NULL) {
-        if (gdbm_delete(dp->di_dbm, krec) < 0) {
-            PyErr_SetObject(PyExc_KeyError, v);
-            return -1;
-        }
-    }
-    else {
-        if (!PyArg_Parse(w, "s#", &drec.dptr, &drec.dsize)) {
-            PyErr_SetString(PyExc_TypeError,
-                            "gdbm mappings have byte string elements only");
-            return -1;
-        }
-        errno = 0;
-        if (gdbm_store(dp->di_dbm, krec, drec, GDBM_REPLACE) < 0) {
-            if (errno != 0)
-                PyErr_SetFromErrno(DbmError);
-            else
-                PyErr_SetString(DbmError,
-                                gdbm_strerror(gdbm_errno));
-            return -1;
-        }
-    }
-    return 0;
-}
-
-static PyMappingMethods dbm_as_mapping = {
-    (lenfunc)dbm_length,		/*mp_length*/
-    (binaryfunc)dbm_subscript,          /*mp_subscript*/
-    (objobjargproc)dbm_ass_sub,         /*mp_ass_subscript*/
-};
-
-PyDoc_STRVAR(dbm_close__doc__,
-"close() -> None\n\
-Closes the database.");
-
-static PyObject *
-dbm_close(register dbmobject *dp, PyObject *unused)
-{
-    if (dp->di_dbm)
-        gdbm_close(dp->di_dbm);
-    dp->di_dbm = NULL;
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-/* XXX Should return a set or a set view */
-PyDoc_STRVAR(dbm_keys__doc__,
-"keys() -> list_of_keys\n\
-Get a list of all keys in the database.");
-
-static PyObject *
-dbm_keys(register dbmobject *dp, PyObject *unused)
-{
-    register PyObject *v, *item;
-    datum key, nextkey;
-    int err;
-
-    if (dp == NULL || !is_dbmobject(dp)) {
-        PyErr_BadInternalCall();
-        return NULL;
-    }
-    check_dbmobject_open(dp);
-
-    v = PyList_New(0);
-    if (v == NULL)
-        return NULL;
-
-    key = gdbm_firstkey(dp->di_dbm);
-    while (key.dptr) {
-        item = PyString_FromStringAndSize(key.dptr, key.dsize);
-        if (item == NULL) {
-            free(key.dptr);
-            Py_DECREF(v);
-            return NULL;
-        }
-        err = PyList_Append(v, item);
-        Py_DECREF(item);
-        if (err != 0) {
-            free(key.dptr);
-            Py_DECREF(v);
-            return NULL;
-        }
-        nextkey = gdbm_nextkey(dp->di_dbm, key);
-        free(key.dptr);
-        key = nextkey;
-    }
-    return v;
-}
-
-static int
-dbm_contains(PyObject *self, PyObject *arg)
-{
-    dbmobject *dp = (dbmobject *)self;
-    datum key;
-
-    if ((dp)->di_dbm == NULL) {
-	PyErr_SetString(DbmError,
-			"GDBM object has already been closed");
-	return -1;
-    }
-    if (!PyString_Check(arg)) {
-	PyErr_Format(PyExc_TypeError,
-		     "gdbm key must be bytes, not %.100s",
-		     arg->ob_type->tp_name);
-	return -1;
-    }
-    key.dptr = PyString_AS_STRING(arg);
-    key.dsize = PyString_GET_SIZE(arg);
-    return gdbm_exists(dp->di_dbm, key);
-}
-
-static PySequenceMethods dbm_as_sequence = {
-	0,			/* sq_length */
-	0,			/* sq_concat */
-	0,			/* sq_repeat */
-	0,			/* sq_item */
-	0,			/* sq_slice */
-	0,			/* sq_ass_item */
-	0,			/* sq_ass_slice */
-	dbm_contains,		/* sq_contains */
-	0,			/* sq_inplace_concat */
-	0,			/* sq_inplace_repeat */
-};
-
-PyDoc_STRVAR(dbm_firstkey__doc__,
-"firstkey() -> key\n\
-It's possible to loop over every key in the database using this method\n\
-and the nextkey() method. The traversal is ordered by GDBM's internal\n\
-hash values, and won't be sorted by the key values. This method\n\
-returns the starting key.");
-
-static PyObject *
-dbm_firstkey(register dbmobject *dp, PyObject *unused)
-{
-    register PyObject *v;
-    datum key;
-
-    check_dbmobject_open(dp);
-    key = gdbm_firstkey(dp->di_dbm);
-    if (key.dptr) {
-        v = PyString_FromStringAndSize(key.dptr, key.dsize);
-        free(key.dptr);
-        return v;
-    }
-    else {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-
-PyDoc_STRVAR(dbm_nextkey__doc__,
-"nextkey(key) -> next_key\n\
-Returns the key that follows key in the traversal.\n\
-The following code prints every key in the database db, without having\n\
-to create a list in memory that contains them all:\n\
-\n\
-      k = db.firstkey()\n\
-      while k != None:\n\
-          print k\n\
-          k = db.nextkey(k)");
-
-static PyObject *
-dbm_nextkey(register dbmobject *dp, PyObject *args)
-{
-    register PyObject *v;
-    datum key, nextkey;
-
-    if (!PyArg_ParseTuple(args, "s#:nextkey", &key.dptr, &key.dsize))
-        return NULL;
-    check_dbmobject_open(dp);
-    nextkey = gdbm_nextkey(dp->di_dbm, key);
-    if (nextkey.dptr) {
-        v = PyString_FromStringAndSize(nextkey.dptr, nextkey.dsize);
-        free(nextkey.dptr);
-        return v;
-    }
-    else {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-
-PyDoc_STRVAR(dbm_reorganize__doc__,
-"reorganize() -> None\n\
-If you have carried out a lot of deletions and would like to shrink\n\
-the space used by the GDBM file, this routine will reorganize the\n\
-database. GDBM will not shorten the length of a database file except\n\
-by using this reorganization; otherwise, deleted file space will be\n\
-kept and reused as new (key,value) pairs are added.");
-
-static PyObject *
-dbm_reorganize(register dbmobject *dp, PyObject *unused)
-{
-    check_dbmobject_open(dp);
-    errno = 0;
-    if (gdbm_reorganize(dp->di_dbm) < 0) {
-        if (errno != 0)
-            PyErr_SetFromErrno(DbmError);
-        else
-            PyErr_SetString(DbmError, gdbm_strerror(gdbm_errno));
-        return NULL;
-    }
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-PyDoc_STRVAR(dbm_sync__doc__,
-"sync() -> None\n\
-When the database has been opened in fast mode, this method forces\n\
-any unwritten data to be written to the disk.");
-
-static PyObject *
-dbm_sync(register dbmobject *dp, PyObject *unused)
-{
-    check_dbmobject_open(dp);
-    gdbm_sync(dp->di_dbm);
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static PyMethodDef dbm_methods[] = {
-    {"close",	  (PyCFunction)dbm_close,   METH_NOARGS, dbm_close__doc__},
-    {"keys",	  (PyCFunction)dbm_keys,    METH_NOARGS, dbm_keys__doc__},
-    {"firstkey",  (PyCFunction)dbm_firstkey,METH_NOARGS, dbm_firstkey__doc__},
-    {"nextkey",	  (PyCFunction)dbm_nextkey, METH_VARARGS, dbm_nextkey__doc__},
-    {"reorganize",(PyCFunction)dbm_reorganize,METH_NOARGS, dbm_reorganize__doc__},
-    {"sync",      (PyCFunction)dbm_sync,    METH_NOARGS, dbm_sync__doc__},
-    {NULL,		NULL}		/* sentinel */
-};
-
-static PyObject *
-dbm_getattr(dbmobject *dp, char *name)
-{
-    return Py_FindMethod(dbm_methods, (PyObject *)dp, name);
-}
-
-static PyTypeObject Dbmtype = {
-    PyVarObject_HEAD_INIT(0, 0)
-    "gdbm.gdbm",
-    sizeof(dbmobject),
-    0,
-    (destructor)dbm_dealloc,            /*tp_dealloc*/
-    0,                                  /*tp_print*/
-    (getattrfunc)dbm_getattr,           /*tp_getattr*/
-    0,                                  /*tp_setattr*/
-    0,                                  /*tp_compare*/
-    0,                                  /*tp_repr*/
-    0,                                  /*tp_as_number*/
-    &dbm_as_sequence,                   /*tp_as_sequence*/
-    &dbm_as_mapping,                    /*tp_as_mapping*/
-    0,                                  /*tp_hash*/
-    0,                                  /*tp_call*/
-    0,                                  /*tp_str*/
-    0,                                  /*tp_getattro*/
-    0,                                  /*tp_setattro*/
-    0,                                  /*tp_as_buffer*/
-    Py_TPFLAGS_DEFAULT,                 /*tp_xxx4*/
-    gdbm_object__doc__,                 /*tp_doc*/
-};
-
-/* ----------------------------------------------------------------- */
-
-PyDoc_STRVAR(dbmopen__doc__,
-"open(filename, [flags, [mode]])  -> dbm_object\n\
-Open a dbm database and return a dbm object. The filename argument is\n\
-the name of the database file.\n\
-\n\
-The optional flags argument can be 'r' (to open an existing database\n\
-for reading only -- default), 'w' (to open an existing database for\n\
-reading and writing), 'c' (which creates the database if it doesn't\n\
-exist), or 'n' (which always creates a new empty database).\n\
-\n\
-Some versions of gdbm support additional flags which must be\n\
-appended to one of the flags described above. The module constant\n\
-'open_flags' is a string of valid additional flags. The 'f' flag\n\
-opens the database in fast mode; altered data will not automatically\n\
-be written to the disk after every change. This results in faster\n\
-writes to the database, but may result in an inconsistent database\n\
-if the program crashes while the database is still open. Use the\n\
-sync() method to force any unwritten data to be written to the disk.\n\
-The 's' flag causes all database operations to be synchronized to\n\
-disk. The 'u' flag disables locking of the database file.\n\
-\n\
-The optional mode argument is the Unix mode of the file, used only\n\
-when the database has to be created. It defaults to octal 0666. ");
-
-static PyObject *
-dbmopen(PyObject *self, PyObject *args)
-{
-    char *name;
-    char *flags = "r";
-    int iflags;
-    int mode = 0666;
-
-    if (!PyArg_ParseTuple(args, "s|si:open", &name, &flags, &mode))
-        return NULL;
-    switch (flags[0]) {
-    case 'r':
-        iflags = GDBM_READER;
-        break;
-    case 'w':
-        iflags = GDBM_WRITER;
-        break;
-    case 'c':
-        iflags = GDBM_WRCREAT;
-        break;
-    case 'n':
-        iflags = GDBM_NEWDB;
-        break;
-    default:
-        PyErr_SetString(DbmError,
-                        "First flag must be one of 'r', 'w', 'c' or 'n'");
-        return NULL;
-    }
-    for (flags++; *flags != '\0'; flags++) {
-        char buf[40];
-        switch (*flags) {
-#ifdef GDBM_FAST
-            case 'f':
-                iflags |= GDBM_FAST;
-                break;
-#endif
-#ifdef GDBM_SYNC
-            case 's':
-                iflags |= GDBM_SYNC;
-                break;
-#endif
-#ifdef GDBM_NOLOCK
-            case 'u':
-                iflags |= GDBM_NOLOCK;
-                break;
-#endif
-            default:
-                PyOS_snprintf(buf, sizeof(buf), "Flag '%c' is not supported.",
-                	      *flags);
-                PyErr_SetString(DbmError, buf);
-                return NULL;
-        }
-    }
-
-    return newdbmobject(name, iflags, mode);
-}
-
-static char dbmmodule_open_flags[] = "rwcn"
-#ifdef GDBM_FAST
-                                     "f"
-#endif
-#ifdef GDBM_SYNC
-                                     "s"
-#endif
-#ifdef GDBM_NOLOCK
-                                     "u"
-#endif
-                                     ;
-
-static PyMethodDef dbmmodule_methods[] = {
-    { "open", (PyCFunction)dbmopen, METH_VARARGS, dbmopen__doc__},
-    { 0, 0 },
-};
-
-PyMODINIT_FUNC
-initgdbm(void) {
-    PyObject *m, *d, *s;
-
-    if (PyType_Ready(&Dbmtype) < 0)
-	    return;
-    m = Py_InitModule4("gdbm", dbmmodule_methods,
-                       gdbmmodule__doc__, (PyObject *)NULL,
-                       PYTHON_API_VERSION);
-    if (m == NULL)
-	return;
-    d = PyModule_GetDict(m);
-    DbmError = PyErr_NewException("gdbm.error", NULL, NULL);
-    if (DbmError != NULL) {
-        PyDict_SetItemString(d, "error", DbmError);
-        s = PyUnicode_FromString(dbmmodule_open_flags);
-        PyDict_SetItemString(d, "open_flags", s);
-        Py_DECREF(s);
-    }
-}

Modified: python/branches/py3k/PC/os2emx/Makefile
==============================================================================
--- python/branches/py3k/PC/os2emx/Makefile	(original)
+++ python/branches/py3k/PC/os2emx/Makefile	Mon May 26 12:29:35 2008
@@ -464,7 +464,7 @@
   HARDEXTMODULES+=	_curses_
 endif
 ifeq ($(HAVE_GDBM),yes)
-  HARDEXTMODULES+=	gdbm dbm
+  HARDEXTMODULES+=	_gdbm _dbm
 endif
 ifeq ($(HAVE_BZ2),yes)
   HARDEXTMODULES+=	bz2
@@ -626,10 +626,10 @@
 _curses_$(MODULE.EXT): _curses_panel$(MODULE.EXT)
 	cp $^ $@
 
-dbm$(MODULE.EXT): $(OUT)dbmmodule$O $(OUT)dbm_m.def $(PYTHON.IMPLIB)
+_dbm$(MODULE.EXT): $(OUT)_dbmmodule$O $(OUT)dbm_m.def $(PYTHON.IMPLIB)
 	$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS) -lgdbm
 
-gdbm$(MODULE.EXT): $(OUT)gdbmmodule$O $(OUT)gdbm_m.def $(PYTHON.IMPLIB)
+_gdbm$(MODULE.EXT): $(OUT)_gdbmmodule$O $(OUT)gdbm_m.def $(PYTHON.IMPLIB)
 	$(LD) $(LDFLAGS.DLL) -o $@ $(^^) $(L^) $(LIBS) -lgdbm
 
 

Modified: python/branches/py3k/PC/os2vacpp/makefile
==============================================================================
--- python/branches/py3k/PC/os2vacpp/makefile	(original)
+++ python/branches/py3k/PC/os2vacpp/makefile	Mon May 26 12:29:35 2008
@@ -494,7 +494,7 @@
 	 $(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \
 	 $(PY_INCLUDE)\tupleobject.h
 
-dbmmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
+_dbmmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
 	 $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
 	 $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
 	 $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h $(PY_INCLUDE)\intobject.h \
@@ -576,7 +576,7 @@
 	 $(PY_INCLUDE)\stringobject.h $(PY_INCLUDE)\sysmodule.h $(PY_INCLUDE)\traceback.h \
 	 $(PY_INCLUDE)\tupleobject.h
 
-gdbmmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
+_gdbmmodule.obj: $(PY_INCLUDE)\abstract.h $(PY_INCLUDE)\ceval.h $(PY_INCLUDE)\classobject.h \
 	 $(PY_INCLUDE)\cobject.h $(PY_INCLUDE)\complexobject.h pyconfig.h \
 	 $(PY_INCLUDE)\dictobject.h $(PY_INCLUDE)\fileobject.h $(PY_INCLUDE)\floatobject.h \
 	 $(PY_INCLUDE)\funcobject.h $(PY_INCLUDE)\import.h $(PY_INCLUDE)\intobject.h \

Modified: python/branches/py3k/PC/os2vacpp/makefile.omk
==============================================================================
--- python/branches/py3k/PC/os2vacpp/makefile.omk	(original)
+++ python/branches/py3k/PC/os2vacpp/makefile.omk	Mon May 26 12:29:35 2008
@@ -171,8 +171,8 @@
   # audioop.c       -- Various Compute Operations on Audio Samples
 
   # Database:
-  # dbmmodule.c     -- Wrapper of DBM Database API (Generic Flavor)
-  # gdbmmodule.c    -- Wrapper of DBM Database API (GNU Flavor)
+  # _dbmmodule.c    -- Wrapper of DBM Database API (Generic Flavor)
+  # _gdbmmodule.c   -- Wrapper of DBM Database API (GNU Flavor)
 
   # Cryptography:
   # cryptmodule.c   -- Simple Wrapper for crypt() Function
@@ -410,7 +410,7 @@
 	 pystate.h python.h pythonrun.h rangeobject.h sliceobject.h \
 	 stringobject.h sysmodule.h traceback.h tupleobject.h
 
-dbmmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
+_dbmmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
 	 pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
 	 import.h intobject.h intrcheck.h listobject.h longobject.h \
 	 methodobject.h modsupport.h moduleobject.h mymalloc.h myproto.h \
@@ -458,7 +458,7 @@
 	 pystate.h python.h pythonrun.h rangeobject.h sliceobject.h \
 	 stringobject.h sysmodule.h traceback.h tupleobject.h
 
-gdbmmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
+_gdbmmodule.obj: abstract.h ceval.h classobject.h cobject.h complexobject.h \
 	 pyconfig.h dictobject.h fileobject.h floatobject.h funcobject.h \
 	 import.h intobject.h intrcheck.h listobject.h longobject.h \
 	 methodobject.h modsupport.h moduleobject.h mymalloc.h myproto.h \

Modified: python/branches/py3k/Tools/scripts/db2pickle.py
==============================================================================
--- python/branches/py3k/Tools/scripts/db2pickle.py	(original)
+++ python/branches/py3k/Tools/scripts/db2pickle.py	Mon May 26 12:29:35 2008
@@ -6,7 +6,7 @@
 Convert the database file given on the command line to a pickle
 representation.  The optional flags indicate the type of the database:
 
-    -a - open using anydbm
+    -a - open using dbm (any supported format)
     -b - open as bsddb btree file
     -d - open as dbm file
     -g - open as gdbm file
@@ -25,15 +25,15 @@
 except ImportError:
     bsddb = None
 try:
-    import dbm
+    import dbm.ndbm as dbm
 except ImportError:
     dbm = None
 try:
-    import gdbm
+    import dbm.gnu as gdbm
 except ImportError:
     gdbm = None
 try:
-    import anydbm
+    import dbm as anydbm
 except ImportError:
     anydbm = None
 import sys
@@ -94,19 +94,19 @@
             try:
                 dbopen = anydbm.open
             except AttributeError:
-                sys.stderr.write("anydbm module unavailable.\n")
+                sys.stderr.write("dbm module unavailable.\n")
                 return 1
         elif opt in ("-g", "--gdbm"):
             try:
                 dbopen = gdbm.open
             except AttributeError:
-                sys.stderr.write("gdbm module unavailable.\n")
+                sys.stderr.write("dbm.gnu module unavailable.\n")
                 return 1
         elif opt in ("-d", "--dbm"):
             try:
                 dbopen = dbm.open
             except AttributeError:
-                sys.stderr.write("dbm module unavailable.\n")
+                sys.stderr.write("dbm.ndbm module unavailable.\n")
                 return 1
     if dbopen is None:
         if bsddb is None:

Modified: python/branches/py3k/Tools/scripts/pickle2db.py
==============================================================================
--- python/branches/py3k/Tools/scripts/pickle2db.py	(original)
+++ python/branches/py3k/Tools/scripts/pickle2db.py	Mon May 26 12:29:35 2008
@@ -7,10 +7,10 @@
 database.  If the database already exists, any contents are deleted.  The
 optional flags indicate the type of the output database:
 
-    -a - open using anydbm
+    -a - open using dbm (open any supported format)
     -b - open as bsddb btree file
-    -d - open as dbm file
-    -g - open as gdbm file
+    -d - open as dbm.ndbm file
+    -g - open as dbm.gnu file
     -h - open as bsddb hash file
     -r - open as bsddb recno file
 
@@ -30,15 +30,15 @@
 except ImportError:
     bsddb = None
 try:
-    import dbm
+    import dbm.ndbm as dbm
 except ImportError:
     dbm = None
 try:
-    import gdbm
+    import dbm.gnu as gdbm
 except ImportError:
     gdbm = None
 try:
-    import anydbm
+    import dbm as anydbm
 except ImportError:
     anydbm = None
 import sys
@@ -99,19 +99,19 @@
             try:
                 dbopen = anydbm.open
             except AttributeError:
-                sys.stderr.write("anydbm module unavailable.\n")
+                sys.stderr.write("dbm module unavailable.\n")
                 return 1
         elif opt in ("-g", "--gdbm"):
             try:
                 dbopen = gdbm.open
             except AttributeError:
-                sys.stderr.write("gdbm module unavailable.\n")
+                sys.stderr.write("dbm.gnu module unavailable.\n")
                 return 1
         elif opt in ("-d", "--dbm"):
             try:
                 dbopen = dbm.open
             except AttributeError:
-                sys.stderr.write("dbm module unavailable.\n")
+                sys.stderr.write("dbm.ndbm module unavailable.\n")
                 return 1
     if dbopen is None:
         if bsddb is None:

Modified: python/branches/py3k/setup.py
==============================================================================
--- python/branches/py3k/setup.py	(original)
+++ python/branches/py3k/setup.py	Mon May 26 12:29:35 2008
@@ -637,8 +637,8 @@
         # Modules that provide persistent dictionary-like semantics.  You will
         # probably want to arrange for at least one of them to be available on
         # your machine, though none are defined by default because of library
-        # dependencies.  The Python module anydbm.py provides an
-        # implementation independent wrapper for these; dumbdbm.py provides
+        # dependencies.  The Python module dbm/__init__.py provides an
+        # implementation independent wrapper for these; dbm/dumb.py provides
         # similar functionality (but slower of course) implemented in Python.
 
         # Sleepycat^WOracle Berkeley DB interface.
@@ -902,16 +902,16 @@
                     ndbm_libs = ['ndbm']
                 else:
                     ndbm_libs = []
-                exts.append( Extension('dbm', ['dbmmodule.c'],
+                exts.append( Extension('_dbm', ['_dbmmodule.c'],
                                        define_macros=[('HAVE_NDBM_H',None)],
                                        libraries = ndbm_libs ) )
             elif (self.compiler.find_library_file(lib_dirs, 'gdbm')
                   and find_file("gdbm/ndbm.h", inc_dirs, []) is not None):
-                exts.append( Extension('dbm', ['dbmmodule.c'],
+                exts.append( Extension('_dbm', ['_dbmmodule.c'],
                                        define_macros=[('HAVE_GDBM_NDBM_H',None)],
                                        libraries = ['gdbm'] ) )
             elif db_incs is not None:
-                exts.append( Extension('dbm', ['dbmmodule.c'],
+                exts.append( Extension('_dbm', ['_dbmmodule.c'],
                                        library_dirs=dblib_dir,
                                        runtime_library_dirs=dblib_dir,
                                        include_dirs=db_incs,
@@ -919,14 +919,14 @@
                                                       ('DB_DBM_HSEARCH',None)],
                                        libraries=dblibs))
             else:
-                missing.append('dbm')
+                missing.append('_dbm')
 
         # Anthony Baxter's gdbm module.  GNU dbm(3) will require -lgdbm:
         if (self.compiler.find_library_file(lib_dirs, 'gdbm')):
-            exts.append( Extension('gdbm', ['gdbmmodule.c'],
+            exts.append( Extension('_gdbm', ['_gdbmmodule.c'],
                                    libraries = ['gdbm'] ) )
         else:
-            missing.append('gdbm')
+            missing.append('_gdbm')
 
         # Unix-only modules
         if platform not in ['mac', 'win32']:


More information about the Python-3000-checkins mailing list