Skip to content

Commit

Permalink
Merge pull request #77 from myYearbook/1.2.2-behaviors
Browse files Browse the repository at this point in the history
MEMCACHED_BEHAVIOR_TCP_KEEPALIVE and MEMCACHED_CALLBACK_PREFIX_KEY
  • Loading branch information
lericson committed Jun 1, 2012
2 parents def0eab + 96ac5b6 commit e1de295
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 9 deletions.
48 changes: 40 additions & 8 deletions _pylibmcmodule.c
Expand Up @@ -1648,12 +1648,12 @@ static PyObject *PylibMC_Client_get_behaviors(PylibMC_Client *self) {
static PyObject *PylibMC_Client_set_behaviors(PylibMC_Client *self, static PyObject *PylibMC_Client_set_behaviors(PylibMC_Client *self,
PyObject *behaviors) { PyObject *behaviors) {
PylibMC_Behavior *b; PylibMC_Behavior *b;
PyObject *py_v;
uint64_t v;
memcached_return r;
char *key;


for (b = PylibMC_behaviors; b->name != NULL; b++) { for (b = PylibMC_behaviors; b->name != NULL; b++) {
PyObject *py_v;
uint64_t v;
memcached_return r;

if (!PyMapping_HasKeyString(behaviors, b->name)) { if (!PyMapping_HasKeyString(behaviors, b->name)) {
continue; continue;
} else if ((py_v = PyMapping_GetItemString(behaviors, b->name)) == NULL) { } else if ((py_v = PyMapping_GetItemString(behaviors, b->name)) == NULL) {
Expand All @@ -1675,6 +1675,28 @@ static PyObject *PylibMC_Client_set_behaviors(PylibMC_Client *self,
} }
} }


for (b = PylibMC_callbacks; b->name != NULL; b++) {
if (!PyMapping_HasKeyString(behaviors, b->name)) {
continue;
} else if ((py_v = PyMapping_GetItemString(behaviors, b->name)) == NULL) {
goto error;
}

key = PyString_AS_STRING(py_v);

r = memcached_callback_set(self->mc, b->flag, key);

if (r == MEMCACHED_BAD_KEY_PROVIDED) {
PyErr_Format(PyExc_ValueError, "bad key provided: %s", key);
goto error;
} else if (r != MEMCACHED_SUCCESS) {
PyErr_Format(PylibMCExc_MemcachedError,
"memcached_callback_set returned %d for "
"callback '%.32s' = %.32s", r, b->name, key);
goto error;
}
}

Py_RETURN_NONE; Py_RETURN_NONE;
error: error:
return NULL; return NULL;
Expand Down Expand Up @@ -2072,7 +2094,7 @@ static void _make_excs(PyObject *module) {
} }


static void _make_behavior_consts(PyObject *mod) { static void _make_behavior_consts(PyObject *mod) {
PyObject *behavior_names; PyObject *names;
PylibMC_Behavior *b; PylibMC_Behavior *b;
char name[128]; char name[128];


Expand All @@ -2087,13 +2109,23 @@ static void _make_behavior_consts(PyObject *mod) {
PyModule_AddIntConstant(mod, name, b->flag); PyModule_AddIntConstant(mod, name, b->flag);
} }


behavior_names = PyList_New(0); names = PyList_New(0);

for (b = PylibMC_callbacks; b->name != NULL; b++) {
sprintf(name, "callback_%s", b->name);
PyModule_AddIntConstant(mod, name, b->flag);
PyList_Append(names, PyString_FromString(b->name));
}

PyModule_AddObject(mod, "all_callbacks", names);

names = PyList_New(0);


for (b = PylibMC_behaviors; b->name != NULL; b++) { for (b = PylibMC_behaviors; b->name != NULL; b++) {
PyList_Append(behavior_names, PyString_FromString(b->name)); PyList_Append(names, PyString_FromString(b->name));
} }


PyModule_AddObject(mod, "all_behaviors", behavior_names); PyModule_AddObject(mod, "all_behaviors", names);
} }


static PyMethodDef PylibMC_functions[] = { static PyMethodDef PylibMC_functions[] = {
Expand Down
5 changes: 5 additions & 0 deletions _pylibmcmodule.h
Expand Up @@ -176,6 +176,7 @@ typedef struct {
static PylibMC_Behavior PylibMC_behaviors[] = { static PylibMC_Behavior PylibMC_behaviors[] = {
{ MEMCACHED_BEHAVIOR_NO_BLOCK, "no_block" }, { MEMCACHED_BEHAVIOR_NO_BLOCK, "no_block" },
{ MEMCACHED_BEHAVIOR_TCP_NODELAY, "tcp_nodelay" }, { MEMCACHED_BEHAVIOR_TCP_NODELAY, "tcp_nodelay" },
{ MEMCACHED_BEHAVIOR_TCP_KEEPALIVE, "tcp_keepalive" },
{ MEMCACHED_BEHAVIOR_HASH, "hash" }, { MEMCACHED_BEHAVIOR_HASH, "hash" },
{ MEMCACHED_BEHAVIOR_KETAMA_HASH, "ketama_hash" }, { MEMCACHED_BEHAVIOR_KETAMA_HASH, "ketama_hash" },
{ MEMCACHED_BEHAVIOR_KETAMA, "ketama" }, { MEMCACHED_BEHAVIOR_KETAMA, "ketama" },
Expand Down Expand Up @@ -212,6 +213,10 @@ static PylibMC_Behavior PylibMC_behaviors[] = {
{ 0, NULL } { 0, NULL }
}; };


static PylibMC_Behavior PylibMC_callbacks[] = {
{ MEMCACHED_CALLBACK_PREFIX_KEY, "prefix_key" },
{ 0, NULL }
};
static PylibMC_Behavior PylibMC_hashers[] = { static PylibMC_Behavior PylibMC_hashers[] = {
{ MEMCACHED_HASH_DEFAULT, "default" }, { MEMCACHED_HASH_DEFAULT, "default" },
{ MEMCACHED_HASH_MD5, "md5" }, { MEMCACHED_HASH_MD5, "md5" },
Expand Down
3 changes: 2 additions & 1 deletion pylibmc/client.py
Expand Up @@ -3,9 +3,10 @@
import _pylibmc import _pylibmc
from .consts import (hashers, distributions, all_behaviors, from .consts import (hashers, distributions, all_behaviors,
hashers_rvs, distributions_rvs, hashers_rvs, distributions_rvs,
BehaviorDict) all_callbacks, BehaviorDict)


_all_behaviors_set = set(all_behaviors) _all_behaviors_set = set(all_behaviors)
_all_behaviors_set.update(set(all_callbacks))


server_type_map = {"tcp": _pylibmc.server_type_tcp, server_type_map = {"tcp": _pylibmc.server_type_tcp,
"udp": _pylibmc.server_type_udp, "udp": _pylibmc.server_type_udp,
Expand Down
1 change: 1 addition & 0 deletions pylibmc/consts.py
Expand Up @@ -14,6 +14,7 @@
setattr(modpkg, name, exc) setattr(modpkg, name, exc)


all_behaviors = _pylibmc.all_behaviors all_behaviors = _pylibmc.all_behaviors
all_callbacks = _pylibmc.all_callbacks
hashers, hashers_rvs = {}, {} hashers, hashers_rvs = {}, {}
distributions, distributions_rvs = {}, {} distributions, distributions_rvs = {}, {}
# Not the prettiest way of doing things, but works well. # Not the prettiest way of doing things, but works well.
Expand Down

0 comments on commit e1de295

Please sign in to comment.