cinap_lenrekadd hg and python4bb9e2215 years agoHistory
858 lines · 19.0 KB · C
RawDownload
static PyObject *bsddb_set_location(bsddbobject *dp, PyObject *key){	int status;	DBT krec, drec;	char *data,buf[4096];	int size;	PyObject *result;	recno_t recno; 	if (dp->di_type == DB_RECNO) {		if (!PyArg_ParseTuple(key, "i;key type must be integer",				      &recno)) {			return NULL;		}		krec.data = &recno;		krec.size = sizeof(recno);	}	else {		if (!PyArg_ParseTuple(key, "s#;key type must be string",				      &data, &size)) {			return NULL;		}		krec.data = data;		krec.size = size;	}	check_bsddbobject_open(dp, NULL); 	BSDDB_BGN_SAVE(dp)	status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec, &drec, R_CURSOR);	if (status == 0) {		if (drec.size > sizeof(buf)) data = malloc(drec.size);		else data = buf;		if (data!=NULL) memcpy(data,drec.data,drec.size);	}	BSDDB_END_SAVE(dp)	if (data==NULL) return PyErr_NoMemory();	if (status != 0) {		if (status < 0)			PyErr_SetFromErrno(BsddbError);		else			PyErr_SetObject(PyExc_KeyError, key);		return NULL;	} 	if (dp->di_type == DB_RECNO)		result = Py_BuildValue("is#", *((int*)krec.data),				       data, drec.size);	else		result = Py_BuildValue("s#s#", krec.data, krec.size,				       data, drec.size);	if (data != buf) free(data);	return result;} static PyObject *bsddb_seq(bsddbobject *dp, int sequence_request){	int status;	DBT krec, drec;	char *kdata=NULL,kbuf[4096];	char *ddata=NULL,dbuf[4096];	PyObject *result; 	check_bsddbobject_open(dp, NULL);	krec.data = 0;	krec.size = 0; 	BSDDB_BGN_SAVE(dp)	status = (dp->di_bsddb->seq)(dp->di_bsddb, &krec,				     &drec, sequence_request);	if (status == 0) {		if (krec.size > sizeof(kbuf)) kdata = malloc(krec.size);		else kdata = kbuf;		if (kdata != NULL) memcpy(kdata,krec.data,krec.size);		if (drec.size > sizeof(dbuf)) ddata = malloc(drec.size);		else ddata = dbuf;		if (ddata != NULL) memcpy(ddata,drec.data,drec.size);	}	BSDDB_END_SAVE(dp)	if (status == 0) {		if ((kdata == NULL) || (ddata == NULL)) 			return PyErr_NoMemory();	}	else { 		/* (status != 0) */  		if (status < 0)			PyErr_SetFromErrno(BsddbError);		else			PyErr_SetString(PyExc_KeyError, "no key/data pairs");		return NULL;	} 	if (dp->di_type == DB_RECNO)		result = Py_BuildValue("is#", *((int*)kdata),				       ddata, drec.size);	else		result = Py_BuildValue("s#s#", kdata, krec.size,				       ddata, drec.size);	if (kdata != kbuf) free(kdata);	if (ddata != dbuf) free(ddata);	return result;} static PyObject *bsddb_next(bsddbobject *dp){	return bsddb_seq(dp, R_NEXT);}static PyObject *bsddb_previous(bsddbobject *dp){	return bsddb_seq(dp, R_PREV);}static PyObject *bsddb_first(bsddbobject *dp){	return bsddb_seq(dp, R_FIRST);}static PyObject *bsddb_last(bsddbobject *dp){	return bsddb_seq(dp, R_LAST);}static PyObject *bsddb_sync(bsddbobject *dp){	int status; 	check_bsddbobject_open(dp, NULL);	BSDDB_BGN_SAVE(dp)	status = (dp->di_bsddb->sync)(dp->di_bsddb, 0);	BSDDB_END_SAVE(dp)	if (status != 0) {		PyErr_SetFromErrno(BsddbError);		return NULL;	}	return PyInt_FromLong(status = 0);}static PyMethodDef bsddb_methods[] = {	{"close",		(PyCFunction)bsddb_close, METH_NOARGS},	{"keys",		(PyCFunction)bsddb_keys, METH_NOARGS},	{"has_key",		(PyCFunction)bsddb_has_key, METH_VARARGS},	{"set_location",	(PyCFunction)bsddb_set_location, METH_VARARGS},	{"next",		(PyCFunction)bsddb_next, METH_NOARGS},	{"previous",	(PyCFunction)bsddb_previous, METH_NOARGS},	{"first",		(PyCFunction)bsddb_first, METH_NOARGS},	{"last",		(PyCFunction)bsddb_last, METH_NOARGS},	{"sync",		(PyCFunction)bsddb_sync, METH_NOARGS},	{NULL,	       	NULL}		/* sentinel */}; static PyObject *bsddb_getattr(PyObject *dp, char *name){	return Py_FindMethod(bsddb_methods, dp, name);} static PyTypeObject Bsddbtype = {	PyObject_HEAD_INIT(NULL)	0,	"bsddb.bsddb",	sizeof(bsddbobject),	0,	(destructor)bsddb_dealloc, /*tp_dealloc*/	0,			/*tp_print*/	(getattrfunc)bsddb_getattr, /*tp_getattr*/	0,			/*tp_setattr*/	0,			/*tp_compare*/	0,			/*tp_repr*/	0,			/*tp_as_number*/	0,			/*tp_as_sequence*/	&bsddb_as_mapping,	/*tp_as_mapping*/}; static PyObject *bsdhashopen(PyObject *self, PyObject *args){	char *file;	char *flag = NULL;	int flags = O_RDONLY;	int mode = 0666;	int bsize = 0;	int ffactor = 0;	int nelem = 0;	int cachesize = 0;	int hash = 0; /* XXX currently ignored */	int lorder = 0; 	if (!PyArg_ParseTuple(args, "z|siiiiiii:hashopen",			      &file, &flag, &mode,			      &bsize, &ffactor, &nelem, &cachesize,			      &hash, &lorder))		return NULL;	if (flag != NULL) {		/* XXX need to pass O_EXCL, O_EXLOCK, O_NONBLOCK, O_SHLOCK */		if (flag[0] == 'r')			flags = O_RDONLY;		else if (flag[0] == 'w')			flags = O_RDWR;		else if (flag[0] == 'c')			flags = O_RDWR|O_CREAT;		else if (flag[0] == 'n')			flags = O_RDWR|O_CREAT|O_TRUNC;		else {			PyErr_SetString(BsddbError,				"Flag should begin with 'r', 'w', 'c' or 'n'");			return NULL;		}		if (flag[1] == 'l') {#if defined(O_EXLOCK) && defined(O_SHLOCK)			if (flag[0] == 'r')				flags |= O_SHLOCK;			else				flags |= O_EXLOCK;#else			PyErr_SetString(BsddbError,				     "locking not supported on this platform");			return NULL;#endif		}	}	return newdbhashobject(file, flags, mode,			       bsize, ffactor, nelem, cachesize, hash, lorder);} static PyObject *bsdbtopen(PyObject *self, PyObject *args){	char *file;	char *flag = NULL;	int flags = O_RDONLY;	int mode = 0666;	int cachesize = 0;	int maxkeypage = 0;	int minkeypage = 0;	int btflags = 0;	unsigned int psize = 0;	int lorder = 0; 	if (!PyArg_ParseTuple(args, "z|siiiiiii:btopen",			      &file, &flag, &mode,			      &btflags, &cachesize, &maxkeypage, &minkeypage,			      &psize, &lorder))		return NULL;	if (flag != NULL) {		/* XXX need to pass O_EXCL, O_EXLOCK, O_NONBLOCK, O_SHLOCK */		if (flag[0] == 'r')			flags = O_RDONLY;		else if (flag[0] == 'w')			flags = O_RDWR;		else if (flag[0] == 'c')			flags = O_RDWR|O_CREAT;		else if (flag[0] == 'n')			flags = O_RDWR|O_CREAT|O_TRUNC;		else {			PyErr_SetString(BsddbError,			       "Flag should begin with 'r', 'w', 'c' or 'n'");			return NULL;		}		if (flag[1] == 'l') {#if defined(O_EXLOCK) && defined(O_SHLOCK)			if (flag[0] == 'r')				flags |= O_SHLOCK;			else				flags |= O_EXLOCK;#else			PyErr_SetString(BsddbError,				    "locking not supported on this platform");			return NULL;#endif		}	}	return newdbbtobject(file, flags, mode,			     btflags, cachesize, maxkeypage, minkeypage,			     psize, lorder);} static PyObject *bsdrnopen(PyObject *self, PyObject *args){	char *file;	char *flag = NULL;	int flags = O_RDONLY;	int mode = 0666;	int cachesize = 0;	int rnflags = 0;	unsigned int psize = 0;	int lorder = 0;	size_t reclen = 0;	char  *bval = "";	char *bfname = NULL; 	if (!PyArg_ParseTuple(args, "z|siiiiiiss:rnopen",			      &file, &flag, &mode,			      &rnflags, &cachesize, &psize, &lorder,			      &reclen, &bval, &bfname))		return NULL; 	if (flag != NULL) {		/* XXX need to pass O_EXCL, O_EXLOCK, O_NONBLOCK, O_SHLOCK */		if (flag[0] == 'r')			flags = O_RDONLY;		else if (flag[0] == 'w')			flags = O_RDWR;		else if (flag[0] == 'c')			flags = O_RDWR|O_CREAT;		else if (flag[0] == 'n')			flags = O_RDWR|O_CREAT|O_TRUNC;		else {			PyErr_SetString(BsddbError,			       "Flag should begin with 'r', 'w', 'c' or 'n'");			return NULL;		}		if (flag[1] == 'l') {#if defined(O_EXLOCK) && defined(O_SHLOCK)			if (flag[0] == 'r')				flags |= O_SHLOCK;			else				flags |= O_EXLOCK;#else			PyErr_SetString(BsddbError,				    "locking not supported on this platform");			return NULL;#endif		}		else if (flag[1] != '\0') {			PyErr_SetString(BsddbError,				       "Flag char 2 should be 'l' or absent");			return NULL;		}	}	return newdbrnobject(file, flags, mode, rnflags, cachesize,			     psize, lorder, reclen, bval[0], bfname);} static PyMethodDef bsddbmodule_methods[] = {	{"hashopen",	(PyCFunction)bsdhashopen, METH_VARARGS},	{"btopen",	(PyCFunction)bsdbtopen, METH_VARARGS},	{"rnopen",	(PyCFunction)bsdrnopen, METH_VARARGS},	/* strictly for use by dbhhash!!! */	{"open",	(PyCFunction)bsdhashopen, METH_VARARGS},	{0,		0},}; PyMODINIT_FUNCinitbsddb185(void) {	PyObject *m, *d; 	Bsddbtype.ob_type = &PyType_Type;	m = Py_InitModule("bsddb185", bsddbmodule_methods);	if (m == NULL)		return;	d = PyModule_GetDict(m);	BsddbError = PyErr_NewException("bsddb.error", NULL, NULL);	if (BsddbError != NULL)		PyDict_SetItemString(d, "error", BsddbError);}

Lines 501–858 of 858. Previous lines