Add support for gdbm2 open flags ('s' and 'u'). Add module constant

open_flags which contains the flags supported by gdbm.  Closes patch
#102802.
This commit is contained in:
Neil Schemenauer 2000-12-17 07:14:13 +00:00
parent e8f3ad560f
commit e9e860faf3
2 changed files with 69 additions and 18 deletions

View File

@ -35,12 +35,21 @@ The optional \var{flag} argument can be
\code{'c'} (which creates the database if it doesn't exist), or
\code{'n'} (which always creates a new empty database).
Appending \character{f} to the flag opens the database in fast mode;
altered data will not automatically be written to the disk after every
change. This results in faster writes to the database, but may result
in an inconsistent database if the program crashes while the database
is still open. Use the \method{sync()} method to force any unwritten
data to be written to the disk.
The following additional characters may be appended to the flag to
control how the database is opened:
\begin{itemize}
\item \code{'f'} --- Open the database in fast mode. Writes to the database
will not be syncronized.
\item \code{'s'} --- Synchronized mode. This will cause changes to the database
will be immediately written to the file.
\item \code{'u'} --- Do not lock database.
\end{itemize}
Not all flags are valid for all versions of \code{gdbm}. The
module constant \code{open_flags} is a string of supported flag
characters. The exception \exception{error} is raised if an invalid
flag is specified.
The optional \var{mode} argument is the \UNIX{} mode of the file, used
only when the database has to be created. It defaults to octal

View File

@ -407,21 +407,25 @@ static PyTypeObject Dbmtype = {
/* ----------------------------------------------------------------- */
static char dbmopen__doc__[] = "\
open(filename, [flag, [mode]]) -> dbm_object\n\
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 flag argument can be 'r' (to open an existing database\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\
Appending f to the flag opens the database in fast mode; altered\n\
data will not automatically be written to the disk after every\n\
change. This results in faster writes to the database, but may\n\
result in an inconsistent database if the program crashes while the\n\
database is still open. Use the sync() method to force any\n\
unwritten data to be written to the disk.\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. ";
@ -451,14 +455,49 @@ dbmopen(PyObject *self, PyObject *args)
break;
default:
PyErr_SetString(DbmError,
"Flags should be one of 'r', 'w', 'c' or 'n'");
"First flag must be one of 'r', 'w', 'c' or 'n'");
return NULL;
}
if (flags[1] == 'f')
iflags |= GDBM_FAST;
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:
sprintf(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 },
@ -474,6 +513,9 @@ initgdbm(void) {
PYTHON_API_VERSION);
d = PyModule_GetDict(m);
DbmError = PyErr_NewException("gdbm.error", NULL, NULL);
if (DbmError != NULL)
if (DbmError != NULL) {
PyDict_SetItemString(d, "error", DbmError);
PyDict_SetItemString(d, "open_flags",
PyString_FromString(dbmmodule_open_flags));
}
}