| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | /***********************************************************
 | 
					
						
							| 
									
										
										
										
											1995-01-04 19:10:35 +00:00
										 |  |  | Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, | 
					
						
							|  |  |  | The Netherlands. | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                         All Rights Reserved | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-10-25 14:44:06 +00:00
										 |  |  | Permission to use, copy, modify, and distribute this software and its | 
					
						
							|  |  |  | documentation for any purpose and without fee is hereby granted, | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | provided that the above copyright notice appear in all copies and that | 
					
						
							| 
									
										
										
										
											1996-10-25 14:44:06 +00:00
										 |  |  | both that copyright notice and this permission notice appear in | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | supporting documentation, and that the names of Stichting Mathematisch | 
					
						
							| 
									
										
										
										
											1996-10-25 14:44:06 +00:00
										 |  |  | Centrum or CWI or Corporation for National Research Initiatives or | 
					
						
							|  |  |  | CNRI not be used in advertising or publicity pertaining to | 
					
						
							|  |  |  | distribution of the software without specific, written prior | 
					
						
							|  |  |  | permission. | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-10-25 14:44:06 +00:00
										 |  |  | While CWI is the initial source for this software, a modified version | 
					
						
							|  |  |  | is made available by the Corporation for National Research Initiatives | 
					
						
							|  |  |  | (CNRI) at the Internet address ftp://ftp.python.org.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH | 
					
						
							|  |  |  | REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF | 
					
						
							|  |  |  | MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH | 
					
						
							|  |  |  | CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL | 
					
						
							|  |  |  | DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR | 
					
						
							|  |  |  | PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | 
					
						
							|  |  |  | TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | 
					
						
							|  |  |  | PERFORMANCE OF THIS SOFTWARE. | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ******************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* DBM module using dictionary interface */ | 
					
						
							| 
									
										
										
										
											1998-03-03 22:02:24 +00:00
										 |  |  | /* Author: Anthony Baxter, after dbmmodule.c */ | 
					
						
							|  |  |  | /* Doc strings: Mitch Chapman */ | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | #include "Python.h"
 | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <sys/types.h>
 | 
					
						
							|  |  |  | #include <sys/stat.h>
 | 
					
						
							|  |  |  | #include <fcntl.h>
 | 
					
						
							|  |  |  | #include "gdbm.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-10-03 05:13:27 +00:00
										 |  |  | #ifdef WIN32
 | 
					
						
							|  |  |  | #include "gdbmerrno.h"
 | 
					
						
							|  |  |  | extern const char * gdbm_strerror(gdbm_error); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-03 22:02:24 +00:00
										 |  |  | static char 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."; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	PyObject_HEAD | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	int di_size;	/* -1 means recompute */ | 
					
						
							|  |  |  | 	GDBM_FILE di_dbm; | 
					
						
							|  |  |  | } dbmobject; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | staticforward PyTypeObject Dbmtype; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define is_dbmobject(v) ((v)->ob_type == &Dbmtype)
 | 
					
						
							| 
									
										
										
										
											1997-07-17 22:56:01 +00:00
										 |  |  | #define check_dbmobject_open(v) if ((v)->di_dbm == NULL) \
 | 
					
						
							|  |  |  |                { PyErr_SetString(DbmError, "GDBM object has already been closed"); \ | 
					
						
							|  |  |  |                  return NULL; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | static PyObject *DbmError; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-03 22:02:24 +00:00
										 |  |  | static char 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."; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | newdbmobject(file, flags, mode) | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	char *file; | 
					
						
							|  |  |  | int flags; | 
					
						
							|  |  |  | int mode; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | { | 
					
						
							|  |  |  |         dbmobject *dp; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	dp = PyObject_NEW(dbmobject, &Dbmtype); | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	if (dp == NULL) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	dp->di_size = -1; | 
					
						
							| 
									
										
										
										
											1995-03-14 15:04:40 +00:00
										 |  |  | 	errno = 0; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	if ( (dp->di_dbm = gdbm_open(file, 0, flags, mode, NULL)) == 0 ) { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		if (errno != 0) | 
					
						
							|  |  |  | 			PyErr_SetFromErrno(DbmError); | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			PyErr_SetString(DbmError, | 
					
						
							|  |  |  | 					(char *) gdbm_strerror(gdbm_errno)); | 
					
						
							|  |  |  | 		Py_DECREF(dp); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	return (PyObject *)dp; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Methods */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | dbm_dealloc(dp) | 
					
						
							|  |  |  | 	register dbmobject *dp; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |         if ( dp->di_dbm ) | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		gdbm_close(dp->di_dbm); | 
					
						
							|  |  |  | 	PyMem_DEL(dp); | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | dbm_length(dp) | 
					
						
							|  |  |  | 	dbmobject *dp; | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1997-07-17 22:56:01 +00:00
										 |  |  |         if (dp->di_dbm == NULL) { | 
					
						
							|  |  |  |                  PyErr_SetString(DbmError, "GDBM object has already been closed");  | 
					
						
							|  |  |  |                  return -1;  | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  |         if ( dp->di_size < 0 ) { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		datum key,okey; | 
					
						
							|  |  |  | 		int size; | 
					
						
							|  |  |  | 		okey.dsize=0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		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; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return dp->di_size; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | dbm_subscript(dp, key) | 
					
						
							|  |  |  | 	dbmobject *dp; | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | register PyObject *key; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	PyObject *v; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	datum drec, krec; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	if (!PyArg_Parse(key, "s#", &krec.dptr, &krec.dsize) ) | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	drec = gdbm_fetch(dp->di_dbm, krec); | 
					
						
							|  |  |  | 	if ( drec.dptr == 0 ) { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		PyErr_SetString(PyExc_KeyError, | 
					
						
							|  |  |  | 				PyString_AS_STRING((PyStringObject *)key)); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	v = PyString_FromStringAndSize(drec.dptr, drec.dsize); | 
					
						
							| 
									
										
										
										
											1995-03-14 15:04:40 +00:00
										 |  |  | 	free(drec.dptr); | 
					
						
							|  |  |  | 	return v; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | dbm_ass_sub(dp, v, w) | 
					
						
							|  |  |  | 	dbmobject *dp; | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | PyObject *v, *w; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | { | 
					
						
							|  |  |  |         datum krec, drec; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  |         if ( !PyArg_Parse(v, "s#", &krec.dptr, &krec.dsize) ) { | 
					
						
							|  |  |  | 		PyErr_SetString(PyExc_TypeError, | 
					
						
							|  |  |  | 				"gdbm mappings have string indices only"); | 
					
						
							|  |  |  | 		return -1; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1997-07-17 22:56:01 +00:00
										 |  |  |         if (dp->di_dbm == NULL) { | 
					
						
							|  |  |  |                  PyErr_SetString(DbmError, "GDBM object has already been closed");  | 
					
						
							|  |  |  |                  return -1;  | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	dp->di_size = -1; | 
					
						
							|  |  |  | 	if (w == NULL) { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		if ( gdbm_delete(dp->di_dbm, krec) < 0 ) { | 
					
						
							|  |  |  | 			PyErr_SetString(PyExc_KeyError, | 
					
						
							|  |  |  | 				      PyString_AS_STRING((PyStringObject *)v)); | 
					
						
							|  |  |  | 			return -1; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		if ( !PyArg_Parse(w, "s#", &drec.dptr, &drec.dsize) ) { | 
					
						
							|  |  |  | 			PyErr_SetString(PyExc_TypeError, | 
					
						
							|  |  |  | 				    "gdbm mappings have 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, | 
					
						
							|  |  |  | 					   (char *) gdbm_strerror(gdbm_errno)); | 
					
						
							|  |  |  | 			return -1; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | static PyMappingMethods dbm_as_mapping = { | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	(inquiry)dbm_length,		/*mp_length*/ | 
					
						
							|  |  |  | 	(binaryfunc)dbm_subscript,	/*mp_subscript*/ | 
					
						
							|  |  |  | 	(objobjargproc)dbm_ass_sub,	/*mp_ass_subscript*/ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-03 22:02:24 +00:00
										 |  |  | static char dbm_close__doc__[] = "\
 | 
					
						
							|  |  |  | close() -> None\n\ | 
					
						
							| 
									
										
										
										
											1998-04-13 18:11:55 +00:00
										 |  |  | Closes the database."; | 
					
						
							| 
									
										
										
										
											1998-03-03 22:02:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											1995-07-07 22:37:11 +00:00
										 |  |  | dbm_close(dp, args) | 
					
						
							|  |  |  | 	register dbmobject *dp; | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | PyObject *args; | 
					
						
							| 
									
										
										
										
											1995-07-07 22:37:11 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	if ( !PyArg_NoArgs(args) ) | 
					
						
							| 
									
										
										
										
											1995-07-07 22:37:11 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  |         if ( dp->di_dbm ) | 
					
						
							|  |  |  | 		gdbm_close(dp->di_dbm); | 
					
						
							|  |  |  | 	dp->di_dbm = NULL; | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	Py_INCREF(Py_None); | 
					
						
							|  |  |  | 	return Py_None; | 
					
						
							| 
									
										
										
										
											1995-07-07 22:37:11 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-03 22:02:24 +00:00
										 |  |  | static char dbm_keys__doc__[] = "\
 | 
					
						
							|  |  |  | keys() -> list_of_keys\n\ | 
					
						
							|  |  |  | Get a list of all keys in the database."; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | dbm_keys(dp, args) | 
					
						
							|  |  |  | 	register dbmobject *dp; | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | PyObject *args; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	register PyObject *v, *item; | 
					
						
							| 
									
										
										
										
											1996-07-21 02:32:44 +00:00
										 |  |  | 	datum key, nextkey; | 
					
						
							| 
									
										
										
										
											1995-08-28 02:58:00 +00:00
										 |  |  | 	int err; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (dp == NULL || !is_dbmobject(dp)) { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		PyErr_BadInternalCall(); | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1996-07-21 02:32:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	if (!PyArg_NoArgs(args)) | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1996-07-21 02:32:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-07-17 22:56:01 +00:00
										 |  |  | 	check_dbmobject_open(dp); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	v = PyList_New(0); | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	if (v == NULL) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1996-07-21 02:32:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	key = gdbm_firstkey(dp->di_dbm); | 
					
						
							|  |  |  | 	while (key.dptr) { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		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); | 
					
						
							| 
									
										
										
										
											1996-07-21 02:32:44 +00:00
										 |  |  | 		free(key.dptr); | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		key = nextkey; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1996-07-21 02:32:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	return v; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-03 22:02:24 +00:00
										 |  |  | static char dbm_has_key__doc__[] = "\
 | 
					
						
							|  |  |  | has_key(key) -> boolean\n\ | 
					
						
							|  |  |  | Find out whether or not the database contains a given key."; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | dbm_has_key(dp, args) | 
					
						
							|  |  |  | 	register dbmobject *dp; | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | PyObject *args; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1995-03-14 15:04:40 +00:00
										 |  |  | 	datum key; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	if (!PyArg_Parse(args, "s#", &key.dptr, &key.dsize)) | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1997-07-17 22:56:01 +00:00
										 |  |  | 	check_dbmobject_open(dp); | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	return PyInt_FromLong((long) gdbm_exists(dp->di_dbm, key)); | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-03 22:02:24 +00:00
										 |  |  | static char 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."; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | dbm_firstkey(dp, args) | 
					
						
							|  |  |  | 	register dbmobject *dp; | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | PyObject *args; | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	register PyObject *v; | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | 	datum key; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	if (!PyArg_NoArgs(args)) | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1997-07-17 22:56:01 +00:00
										 |  |  | 	check_dbmobject_open(dp); | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | 	key = gdbm_firstkey(dp->di_dbm); | 
					
						
							|  |  |  | 	if (key.dptr) { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		v = PyString_FromStringAndSize(key.dptr, key.dsize); | 
					
						
							|  |  |  | 		free(key.dptr); | 
					
						
							|  |  |  | 		return v; | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		Py_INCREF(Py_None); | 
					
						
							|  |  |  | 		return Py_None; | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-03 22:02:24 +00:00
										 |  |  | static char 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)"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | dbm_nextkey(dp, args) | 
					
						
							|  |  |  | 	register dbmobject *dp; | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | PyObject *args; | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	register PyObject *v; | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | 	datum key, nextkey; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	if (!PyArg_Parse(args, "s#", &key.dptr, &key.dsize)) | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1997-07-17 22:56:01 +00:00
										 |  |  | 	check_dbmobject_open(dp); | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | 	nextkey = gdbm_nextkey(dp->di_dbm, key); | 
					
						
							|  |  |  | 	if (nextkey.dptr) { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		v = PyString_FromStringAndSize(nextkey.dptr, nextkey.dsize); | 
					
						
							|  |  |  | 		free(nextkey.dptr); | 
					
						
							|  |  |  | 		return v; | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		Py_INCREF(Py_None); | 
					
						
							|  |  |  | 		return Py_None; | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-03 22:02:24 +00:00
										 |  |  | static char 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."; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | dbm_reorganize(dp, args) | 
					
						
							|  |  |  | 	register dbmobject *dp; | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | PyObject *args; | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	if (!PyArg_NoArgs(args)) | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1997-07-17 22:56:01 +00:00
										 |  |  | 	check_dbmobject_open(dp); | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | 	errno = 0; | 
					
						
							|  |  |  | 	if (gdbm_reorganize(dp->di_dbm) < 0) { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		if (errno != 0) | 
					
						
							|  |  |  | 			PyErr_SetFromErrno(DbmError); | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			PyErr_SetString(DbmError, | 
					
						
							|  |  |  | 					(char *) gdbm_strerror(gdbm_errno)); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	Py_INCREF(Py_None); | 
					
						
							|  |  |  | 	return Py_None; | 
					
						
							| 
									
										
										
										
											1995-03-16 16:07:34 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-03 22:02:24 +00:00
										 |  |  | static char 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."; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-03-25 17:39:56 +00:00
										 |  |  | static PyObject * | 
					
						
							|  |  |  | dbm_sync(dp, args) | 
					
						
							|  |  |  | 	register dbmobject *dp; | 
					
						
							|  |  |  |                 PyObject *args; | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (!PyArg_NoArgs(args)) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1997-07-17 22:56:01 +00:00
										 |  |  | 	check_dbmobject_open(dp); | 
					
						
							| 
									
										
										
										
											1997-03-25 17:39:56 +00:00
										 |  |  | 	gdbm_sync(dp->di_dbm); | 
					
						
							|  |  |  | 	Py_INCREF(Py_None); | 
					
						
							|  |  |  | 	return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | static PyMethodDef dbm_methods[] = { | 
					
						
							| 
									
										
										
										
											1998-03-03 22:02:24 +00:00
										 |  |  | 	{"close",	(PyCFunction)dbm_close, 0, dbm_close__doc__}, | 
					
						
							|  |  |  | 	{"keys",	(PyCFunction)dbm_keys, 0, dbm_keys__doc__}, | 
					
						
							|  |  |  | 	{"has_key",	(PyCFunction)dbm_has_key, 0, dbm_has_key__doc__}, | 
					
						
							|  |  |  | 	{"firstkey",	(PyCFunction)dbm_firstkey, 0, dbm_firstkey__doc__}, | 
					
						
							|  |  |  | 	{"nextkey",	(PyCFunction)dbm_nextkey, 0, dbm_nextkey__doc__}, | 
					
						
							|  |  |  | 	{"reorganize",	(PyCFunction)dbm_reorganize, 0, dbm_reorganize__doc__}, | 
					
						
							|  |  |  | 	{"sync",                    (PyCFunction)dbm_sync, 0, dbm_sync__doc__}, | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	{NULL,		NULL}		/* sentinel */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | dbm_getattr(dp, name) | 
					
						
							|  |  |  | 	dbmobject *dp; | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | char *name; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	return Py_FindMethod(dbm_methods, (PyObject *)dp, name); | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | static PyTypeObject Dbmtype = { | 
					
						
							| 
									
										
										
										
											1998-10-03 05:13:27 +00:00
										 |  |  | 	PyObject_HEAD_INIT(0) | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	0, | 
					
						
							| 
									
										
										
										
											1995-07-07 22:37:11 +00:00
										 |  |  | 	"gdbm", | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	sizeof(dbmobject), | 
					
						
							|  |  |  | 	0, | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	(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*/ | 
					
						
							|  |  |  | 	0,			   /*tp_as_sequence*/ | 
					
						
							|  |  |  | 	&dbm_as_mapping,	   /*tp_as_mapping*/ | 
					
						
							| 
									
										
										
										
											1998-03-03 22:02:24 +00:00
										 |  |  |         0,                         /*tp_hash*/ | 
					
						
							|  |  |  |         0,                         /*tp_call*/ | 
					
						
							|  |  |  |         0,                         /*tp_str*/ | 
					
						
							|  |  |  |         0,                         /*tp_getattro*/ | 
					
						
							|  |  |  |         0,                         /*tp_setattro*/ | 
					
						
							|  |  |  |         0,                         /*tp_as_buffer*/ | 
					
						
							|  |  |  |         0,                         /*tp_xxx4*/ | 
					
						
							|  |  |  |         gdbm_object__doc__,        /*tp_doc*/ | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ----------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-03 22:02:24 +00:00
										 |  |  | static char dbmopen__doc__[] = "\
 | 
					
						
							|  |  |  | open(filename, [flag, [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\ | 
					
						
							|  |  |  | 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\ | 
					
						
							|  |  |  | \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. "; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | dbmopen(self, args) | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	PyObject *self; | 
					
						
							|  |  |  | PyObject *args; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	char *name; | 
					
						
							|  |  |  | 	char *flags = "r "; | 
					
						
							|  |  |  | 	int iflags; | 
					
						
							|  |  |  | 	int mode = 0666; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	if ( !PyArg_ParseTuple(args, "s|si", &name, &flags, &mode) ) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1996-01-26 21:08:01 +00:00
										 |  |  | 	switch (flags[0]) { | 
					
						
							|  |  |  | 	case 'r': | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		iflags = GDBM_READER; | 
					
						
							|  |  |  | 		break; | 
					
						
							| 
									
										
										
										
											1996-01-26 21:08:01 +00:00
										 |  |  | 	case 'w': | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		iflags = GDBM_WRITER; | 
					
						
							|  |  |  | 		break; | 
					
						
							| 
									
										
										
										
											1996-01-26 21:08:01 +00:00
										 |  |  | 	case 'c': | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		iflags = GDBM_WRCREAT; | 
					
						
							|  |  |  | 		break; | 
					
						
							| 
									
										
										
										
											1996-01-26 21:08:01 +00:00
										 |  |  | 	case 'n': | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		iflags = GDBM_NEWDB; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		PyErr_SetString(DbmError, | 
					
						
							|  |  |  | 				"Flags should be one of 'r', 'w', 'c' or 'n'"); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1996-01-26 21:08:01 +00:00
										 |  |  | 	if (flags[1] == 'f') | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 		iflags |= GDBM_FAST; | 
					
						
							|  |  |  | 	return newdbmobject(name, iflags, mode); | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | static PyMethodDef dbmmodule_methods[] = { | 
					
						
							| 
									
										
										
										
											1998-03-03 22:02:24 +00:00
										 |  |  | 	{ "open", (PyCFunction)dbmopen, 1, dbmopen__doc__}, | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	{ 0, 0 }, | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | initgdbm() { | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	PyObject *m, *d; | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-10-03 05:13:27 +00:00
										 |  |  | 	Dbmtype.ob_type = &PyType_Type; | 
					
						
							| 
									
										
										
										
											1998-03-03 22:02:24 +00:00
										 |  |  | 	m = Py_InitModule4("gdbm", dbmmodule_methods, | 
					
						
							|  |  |  |                            gdbmmodule__doc__, (PyObject *)NULL, | 
					
						
							|  |  |  | 			   PYTHON_API_VERSION); | 
					
						
							| 
									
										
										
										
											1996-12-17 19:55:33 +00:00
										 |  |  | 	d = PyModule_GetDict(m); | 
					
						
							| 
									
										
										
										
											1997-10-01 04:29:29 +00:00
										 |  |  | 	DbmError = PyErr_NewException("gdbm.error", NULL, NULL); | 
					
						
							|  |  |  | 	if (DbmError != NULL) | 
					
						
							|  |  |  | 		PyDict_SetItemString(d, "error", DbmError); | 
					
						
							| 
									
										
										
										
											1994-08-08 08:06:37 +00:00
										 |  |  | } |