Tokyo Cabinet 是
![](/icons/12469yi.gif)
![](/icons/12469de.gif)
![](/icons/12469dou2.gif)
![](/icons/12469de.gif)
![](/icons/12469yi.gif)
![](/icons/12469de.gif)
![](/icons/12469dou2.gif)
![](/icons/12469de.gif)
![](/icons/12469zifu.gif)
![](/icons/12469dou2.gif)
![](/icons/12469de.gif)
![](/icons/12469dou2.gif)
当做为Hash表数据库使用时
![](/icons/12469dou.gif)
![](/icons/12469de.gif)
![](/icons/12469de.gif)
![](/icons/12469dou2.gif)
![](/icons/12469dou.gif)
![](/icons/12469dou.gif)
![](/icons/12469dou.gif)
![](/icons/12469dou.gif)
![](/icons/12469dou.gif)
![](/icons/12469de.gif)
![](/icons/12469dou2.gif)
![](/icons/12469de.gif)
![](/icons/12469de.gif)
![](/icons/12469dou.gif)
![](/icons/12469de.gif)
当按B+树来存储时
![](/icons/12469dou.gif)
![](/icons/12469de.gif)
![](/icons/12469dou2.gif)
![](/icons/12469yi.gif)
![](/icons/12469de.gif)
![](/icons/12469dou.gif)
![](/icons/12469dou.gif)
![](/icons/12469hanshu.gif)
![](/icons/12469dou2.gif)
![](/icons/12469de.gif)
![](/icons/12469hanshu.gif)
![](/icons/12469dou2.gif)
![](/icons/12469de.gif)
![](/icons/12469yi.gif)
![](/icons/12469dou2.gif)
![](/icons/12469dou.gif)
![](/icons/12469de.gif)
![](/icons/12469zifu.gif)
![](/icons/12469dou2.gif)
![](/icons/12469dou.gif)
![](/icons/12469de.gif)
![](/icons/12469de.gif)
![](/icons/12469dou2.gif)
As for database of fixed-length
![](/icons/12469if.gif)
On-memory database supports "bnum", "capnum", and "capsiz". Hash database supports "mode", "bnum", "apow", "fpow", "opts", "rcnum", and "xmsiz". B+ tree database supports "mode", "lmemb", "nmemb", "bnum", "apow", "fpow", "opts", "lcnum", "ncnum", and "xmsiz". Fixed-length database supports "mode", "width", and "limsiz". "capnum" spec
![](/icons/12469if.gif)
![](/icons/12469if.gif)
---------------------
#
![](/icons/12469include.gif)
#
![](/icons/12469include.gif)
#
![](/icons/12469include.gif)
#
![](/icons/12469include.gif)
#
![](/icons/12469include.gif)
![](/icons/12469int.gif)
![](/icons/12469int.gif)
![](/icons/12469main.gif)
![](/icons/12469int.gif)
TCADB *adb;
char *key, *value;
/* create the object */
adb = tcadb
![](/icons/12469new.gif)
![](/icons/12469kh.gif)
/* open the database */
![](/icons/12469if.gif)
fpr
![](/icons/12469int.gif)
}
/* store records */
![](/icons/12469if.gif)
!tcadbput2(adb, "bar", "step") ||
!tcadbput2(adb, "baz", "jump")){
fpr
![](/icons/12469int.gif)
}
/* retrieve records */
value = tcadbget2(adb, "foo");
![](/icons/12469if.gif)
pr
![](/icons/12469int.gif)
free(value);
}
![](/icons/12469else.gif)
fpr
![](/icons/12469int.gif)
}
/* traverse records */
tcadbiterinit(adb);
while((key = tcadbiternext2(adb)) != NULL){
value = tcadbget2(adb, key);
![](/icons/12469if.gif)
pr
![](/icons/12469int.gif)
free(value);
}
free(key);
}
/* close the database */
![](/icons/12469if.gif)
fpr
![](/icons/12469int.gif)
}
/* delete the object */
tcadbdel(adb);
![](/icons/12469return.gif)
}
___________________________________________
python
![](/icons/12469de.gif)
anydbm.open(filename[, flag[, mode]])
Open the database file filename and
![](/icons/12469return.gif)
If the database file already exists, the whichdb module is used to determine its type and the appropriate module is used;
![](/icons/12469if.gif)
The optional flag argument can be 'r' to open an existing database for reading _disibledevent=>
# 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
![](/icons/12469kh.gif)
![](/icons/12469kh.gif)
for k, v in db.iteritems
![](/icons/12469kh.gif)
pr
![](/icons/12469int.gif)
# Storing a non-
![](/icons/12469string.gif)
# likely a TypeError).
db['www.yahoo.com'] = 4
# Close when done.
db.close
![](/icons/12469kh.gif)
___________________________________________
Python gdbm封装
![](/icons/12469de.gif)
/* DBM module using dictionary
![](/icons/12469int.gif)
/* Author: Anthony Baxter, after dbmmodule.c */
/* Doc
![](/icons/12469string.gif)
#
![](/icons/12469include.gif)
#
![](/icons/12469include.gif)
#
![](/icons/12469include.gif)
#
![](/icons/12469include.gif)
#
![](/icons/12469include.gif)
#
![](/icons/12469if.gif)
![](/icons/12469define.gif)
![](/icons/12469define.gif)
#
![](/icons/12469include.gif)
extern const char * gdbm_strerror(gdbm_error);
#end
![](/icons/12469if.gif)
PyDoc_STRVAR(gdbmmodule__doc__,
"This module provides an
![](/icons/12469int.gif)
\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
![](/icons/12469string.gif)
![](/icons/12469int.gif)
![](/icons/12469int.gif)
keys and values, and the items
![](/icons/12469kh.gif)
![](/icons/12469kh.gif)
supported.");
typedef struct {
PyObject_HEAD
![](/icons/12469int.gif)
GDBM_FILE di_dbm;
} dbmobject;
![](/icons/12469static.gif)
#
![](/icons/12469define.gif)
![](/icons/12469dd.gif)
#
![](/icons/12469define.gif)
![](/icons/12469if.gif)
![](/icons/12469dd.gif)
{ PyErr_SetString(DbmError, "GDBM object has already been closed"); \
![](/icons/12469return.gif)
![](/icons/12469static.gif)
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
![](/icons/12469string.gif)
![](/icons/12469int.gif)
![](/icons/12469int.gif)
keys and values, and the items
![](/icons/12469kh.gif)
![](/icons/12469kh.gif)
supported.\n\
\n\
GDBM objects also support additional operations such as firstkey,\n\
nextkey, reorganize, and sync.");
![](/icons/12469static.gif)
![](/icons/12469new.gif)
![](/icons/12469int.gif)
![](/icons/12469int.gif)
{
dbmobject *dp;
dp = PyObject_New(dbmobject, &Dbmtype);
![](/icons/12469if.gif)
![](/icons/12469dd.gif)
![](/icons/12469return.gif)
dp->di_size = -1;
errno = 0;
![](/icons/12469if.gif)
![](/icons/12469dd.gif)
![](/icons/12469if.gif)
PyErr_SetFromErrno(DbmError);
![](/icons/12469else.gif)
PyErr_SetString(DbmError, gdbm_strerror(gdbm_errno));
Py_DECREF(dp);
![](/icons/12469return.gif)
}
![](/icons/12469return.gif)
}
/* Methods */
![](/icons/12469static.gif)
dbm_dealloc(register dbmobject *dp)
{
![](/icons/12469if.gif)
gdbm_close(dp->di_dbm);
PyObject_Del(dp);
}
![](/icons/12469static.gif)
dbm_length(dbmobject *dp)
{
![](/icons/12469if.gif)
![](/icons/12469dd.gif)
PyErr_SetString(DbmError, "GDBM object has already been closed");
![](/icons/12469return.gif)
}
![](/icons/12469if.gif)
datum key,okey;
![](/icons/12469int.gif)
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
![](/icons/12469jiajia.gif)
![](/icons/12469if.gif)
okey=key;
}
dp->di_size = size;
}
![](/icons/12469return.gif)
}
![](/icons/12469static.gif)
dbm_subscript(dbmobject *dp, register PyObject *key)
{
PyObject *v;
datum drec, krec;
![](/icons/12469if.gif)
![](/icons/12469return.gif)
![](/icons/12469if.gif)
![](/icons/12469dd.gif)
PyErr_SetString(DbmError,
"GDBM object has already been closed");
![](/icons/12469return.gif)
}
drec = gdbm_fetch(dp->di_dbm, krec);
![](/icons/12469if.gif)
![](/icons/12469dd.gif)
PyErr_SetString(PyExc_KeyError,
PyString_AS_STRING((PyStringObject *)key));
![](/icons/12469return.gif)
}
v = PyString_FromStringAndSize(drec.dptr, drec.dsize);
free(drec.dptr);
![](/icons/12469return.gif)
}
![](/icons/12469static.gif)
![](/icons/12469int.gif)
dbm_ass_sub(dbmobject *dp, PyObject *v, PyObject *w)
{
datum krec, drec;
![](/icons/12469if.gif)
PyErr_SetString(PyExc_TypeError,
"gdbm mappings have
![](/icons/12469string.gif)
"GDBM object has already been closed");
![](/icons/12469return.gif)
}
dp->di_size = -1;
![](/icons/12469if.gif)
![](/icons/12469dd.gif)
![](/icons/12469if.gif)
PyErr_SetString(PyExc_KeyError,
PyString_AS_STRING((PyStringObject *)v));
![](/icons/12469return.gif)
}
}
![](/icons/12469else.gif)
![](/icons/12469if.gif)
PyErr_SetString(PyExc_TypeError,
"gdbm mappings have
![](/icons/12469string.gif)
![](/icons/12469if.gif)
![](/icons/12469if.gif)
PyErr_SetFromErrno(DbmError);
![](/icons/12469else.gif)
PyErr_SetString(DbmError,
gdbm_strerror(gdbm_errno));
![](/icons/12469return.gif)
}
}
![](/icons/12469return.gif)
}
![](/icons/12469static.gif)
(lenfunc)dbm_length, /*mp_length*/
(binaryfunc)dbm_subscript, /*mp_subscript*/
(objobjargproc)dbm_ass_sub, /*mp_ass_subscript*/
};
PyDoc_STRVAR(dbm_close__doc__,
"close
![](/icons/12469kh.gif)
Closes the database.");
![](/icons/12469static.gif)
dbm_close(register dbmobject *dp, PyObject *unused)
{
![](/icons/12469if.gif)
gdbm_close(dp->di_dbm);
dp->di_dbm = NULL;
Py_INCREF(Py_None);
![](/icons/12469return.gif)
}
PyDoc_STRVAR(dbm_keys__doc__,
"keys
![](/icons/12469kh.gif)
Get a list of all keys in the database.");
![](/icons/12469static.gif)
dbm_keys(register dbmobject *dp, PyObject *unused)
{
register PyObject *v, *item;
datum key, nextkey;
![](/icons/12469int.gif)
![](/icons/12469if.gif)
![](/icons/12469dd.gif)
PyErr_BadInternalCall
![](/icons/12469kh.gif)
![](/icons/12469return.gif)
}
check_dbmobject_open(dp);
v = PyList_New(0);
![](/icons/12469if.gif)
![](/icons/12469dd.gif)
![](/icons/12469return.gif)
key = gdbm_firstkey(dp->di_dbm);
while (key.dptr) {
item = PyString_FromStringAndSize(key.dptr, key.dsize);
![](/icons/12469if.gif)
![](/icons/12469dd.gif)
free(key.dptr);
Py_DECREF(v);
![](/icons/12469return.gif)
}
err = PyList_Append(v, item);
Py_DECREF(item);
![](/icons/12469if.gif)
free(key.dptr);
Py_DECREF(v);
![](/icons/12469return.gif)
}
nextkey = gdbm_nextkey(dp->di_dbm, key);
free(key.dptr);
key = nextkey;
}
![](/icons/12469return.gif)
}
PyDoc_STRVAR(dbm_has_key__doc__,
"has_key(key) -> boolean\n\
Find out whether or not the database contains a given key.");
![](/icons/12469static.gif)
dbm_has_key(register dbmobject *dp, PyObject *args)
{
datum key;
![](/icons/12469if.gif)
![](/icons/12469return.gif)
check_dbmobject_open(dp);
![](/icons/12469return.gif)
}
PyDoc_STRVAR(dbm_firstkey__doc__,
"firstkey
![](/icons/12469kh.gif)
It's possible to loop over every key in the database using this method\n\
and the nextkey
![](/icons/12469kh.gif)
![](/icons/12469int.gif)
hash values, and won't be sorted by the key values. This method\n\
![](/icons/12469return.gif)
![](/icons/12469static.gif)
dbm_firstkey(register dbmobject *dp, PyObject *unused)
{
register PyObject *v;
datum key;
check_dbmobject_open(dp);
key = gdbm_firstkey(dp->di_dbm);
![](/icons/12469if.gif)
v = PyString_FromStringAndSize(key.dptr, key.dsize);
free(key.dptr);
![](/icons/12469return.gif)
}
![](/icons/12469else.gif)
Py_INCREF(Py_None);
![](/icons/12469return.gif)
}
}
PyDoc_STRVAR(dbm_nextkey__doc__,
"nextkey(key) -> next_key\n\
Returns the key that follows key in the traversal.\n\
The following code pr
![](/icons/12469int.gif)
to create a list in memory that contains them all:\n\
\n\
k = db.firstkey
![](/icons/12469kh.gif)
while k != None:\n\
pr
![](/icons/12469int.gif)
k = db.nextkey(k)");
![](/icons/12469static.gif)
dbm_nextkey(register dbmobject *dp, PyObject *args)
{
register PyObject *v;
datum key, nextkey;
![](/icons/12469if.gif)
![](/icons/12469return.gif)
check_dbmobject_open(dp);
nextkey = gdbm_nextkey(dp->di_dbm, key);
![](/icons/12469if.gif)
v = PyString_FromStringAndSize(nextkey.dptr, nextkey.dsize);
free(nextkey.dptr);
![](/icons/12469return.gif)
}
![](/icons/12469else.gif)
Py_INCREF(Py_None);
![](/icons/12469return.gif)
}
}
PyDoc_STRVAR(dbm_reorganize__doc__,
"reorganize
![](/icons/12469kh.gif)
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
![](/icons/12469short.gif)
by using this reorganization; otherwise, deleted file space will be\n\
kept and reused as
![](/icons/12469new.gif)
![](/icons/12469static.gif)
dbm_reorganize(register dbmobject *dp, PyObject *unused)
{
check_dbmobject_open(dp);
errno = 0;
![](/icons/12469if.gif)
![](/icons/12469if.gif)
PyErr_SetFromErrno(DbmError);
![](/icons/12469else.gif)
PyErr_SetString(DbmError, gdbm_strerror(gdbm_errno));
![](/icons/12469return.gif)
}
Py_INCREF(Py_None);
![](/icons/12469return.gif)
}
PyDoc_STRVAR(dbm_sync__doc__,
"sync
![](/icons/12469kh.gif)
When the database has been opened in fast mode, this method forces\n\
any unwritten data to be written to the disk.");
![](/icons/12469static.gif)
dbm_sync(register dbmobject *dp, PyObject *unused)
{
check_dbmobject_open(dp);
gdbm_sync(dp->di_dbm);
Py_INCREF(Py_None);
![](/icons/12469return.gif)
}
![](/icons/12469static.gif)
![](/icons/12469zhk2.gif)
{"close", (PyCFunction)dbm_close, METH_NOARGS, dbm_close__doc__},
{"keys", (PyCFunction)dbm_keys, METH_NOARGS, dbm_keys__doc__},
{"has_key", (PyCFunction)dbm_has_key, METH_VARARGS, dbm_has_key__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 */
};
![](/icons/12469static.gif)
dbm_getattr(dbmobject *dp, char *name)
{
![](/icons/12469return.gif)
}
![](/icons/12469static.gif)
PyObject_HEAD_INIT(0)
0,
"gdbm.gdbm",
![](/icons/12469sizeof.gif)
0,
(destructor)dbm_dealloc, /*tp_dealloc*/
0, /*tp_pr
![](/icons/12469int.gif)
(getattrfunc)dbm_getattr, /*tp_getattr*/
0, /*tp_
![](/icons/12469set.gif)
0, /*tp_compare*/
0, /*tp_repr*/
0, /*tp_as_number*/
0, /*tp_as_sequence*/
&dbm_as_mapping, /*tp_as_mapping*/
0, /*tp_hash*/
0, /*tp_call*/
0, /*tp_str*/
0, /*tp_getattro*/
0, /*tp_
![](/icons/12469set.gif)
0, /*tp_as_buffer*/
0, /*tp_xxx4*/
gdbm_object__doc__, /*tp_doc*/
};
/* ----------------------------------------------------------------- */
PyDoc_STRVAR(dbmopen__doc__,
"open(filename, [flags, [mode]]) -> dbm_object\n\
Open a dbm database and
![](/icons/12469return.gif)
the name of the database file.\n\
\n\
The optional flags argument can be 'r' (to open an existing database\n\
for reading _disibledevent=>
reading and writing), 'c' (which creates the database
![](/icons/12469if.gif)
exist), or 'n' (which always creates a
![](/icons/12469new.gif)
\n\
Some versions of gdbm support additional flags which must be\n\
appended to _disibledevent=>
![](/icons/12469int.gif)
![](/icons/12469if.gif)
![](/icons/12469int.gif)
![](/icons/12469if.gif)
![](/icons/12469return.gif)
switch (flags[0]) {
![](/icons/12469case.gif)
![](/icons/12469if.gif)
![](/icons/12469break.gif)
![](/icons/12469case.gif)
![](/icons/12469if.gif)
![](/icons/12469break.gif)
![](/icons/12469case.gif)
![](/icons/12469if.gif)
![](/icons/12469break.gif)
![](/icons/12469case.gif)
![](/icons/12469if.gif)
![](/icons/12469break.gif)
default:
PyErr_SetString(DbmError,
"First flag must be _disibledevent=>char buf[40];
switch (*flags) {
#
![](/icons/12469if.gif)
![](/icons/12469case.gif)
![](/icons/12469if.gif)
![](/icons/12469break.gif)
#end
![](/icons/12469if.gif)
#
![](/icons/12469if.gif)
![](/icons/12469case.gif)
![](/icons/12469if.gif)
![](/icons/12469break.gif)
#end
![](/icons/12469if.gif)
#
![](/icons/12469if.gif)
![](/icons/12469case.gif)
![](/icons/12469if.gif)
![](/icons/12469break.gif)
#end
![](/icons/12469if.gif)
default:
PyOS_snpr
![](/icons/12469int.gif)
![](/icons/12469sizeof.gif)
*flags);
PyErr_SetString(DbmError, buf);
![](/icons/12469return.gif)
}
}
![](/icons/12469return.gif)
![](/icons/12469new.gif)
![](/icons/12469if.gif)
}
![](/icons/12469static.gif)
![](/icons/12469zhk2.gif)
#
![](/icons/12469if.gif)
"f"
#end
![](/icons/12469if.gif)
#
![](/icons/12469if.gif)
"s"
#end
![](/icons/12469if.gif)
#
![](/icons/12469if.gif)
"u"
#end
![](/icons/12469if.gif)
;
![](/icons/12469static.gif)
![](/icons/12469zhk2.gif)
{ "open", (PyCFunction)dbmopen, METH_VARARGS, dbmopen__doc__},
{ 0, 0 },
};
PyMODINIT_FUNC
initgdbm(void) {
PyObject *m, *d, *s;
Dbmtype.ob_type = &PyType_Type;
m = Py_InitModule4("gdbm", dbmmodule_methods,
gdbmmodule__doc__, (PyObject *)NULL,
PYTHON_API_VERSION);
![](/icons/12469if.gif)
![](/icons/12469dd.gif)
![](/icons/12469return.gif)
d = PyModule_GetDict(m);
DbmError = PyErr_NewException("gdbm.error", NULL, NULL);
![](/icons/12469if.gif)
PyDict_SetItemString(d, "error", DbmError);
s = PyString_FromString(dbmmodule_open_flags);
PyDict_SetItemString(d, "open_flags", s);
Py_DECREF(s);
}
}
最新评论