Cache-Memcached-Fast
view release on metacpan or search on metacpan
mg_get() is called again. Because any magic SV may be put to the
argument list more than once we create a temporal copies of them,
thus braking possible ties and ensuring that every argument is
fetched exactly once.
*/
static inline
char *
SvPV_stable_storage(pTHX_ SV *sv, STRLEN *lp)
{
if (SvGAMAGIC(sv))
sv = sv_2mortal(newSVsv(sv));
return SvPV(sv, *lp);
}
MODULE = Cache::Memcached::Fast PACKAGE = Cache::Memcached::Fast
Cache_Memcached_Fast *
_new(class, conf)
char * class
SV * conf
PROTOTYPE: $$
PREINIT:
Cache_Memcached_Fast *memd;
CODE:
Newx(memd, 1, Cache_Memcached_Fast);
memd->c = client_init();
if (! memd->c)
croak("Not enough memory");
if (! SvROK(conf) || SvTYPE(SvRV(conf)) != SVt_PVHV)
croak("Not a hash reference");
parse_config(aTHX_ memd, (HV *) SvRV(conf));
RETVAL = memd;
OUTPUT:
RETVAL
void
_destroy(memd)
Cache_Memcached_Fast * memd
PROTOTYPE: $
CODE:
client_destroy(memd->c);
if (memd->compress_method)
{
SvREFCNT_dec(memd->compress_method);
SvREFCNT_dec(memd->decompress_method);
}
if (memd->serialize_method)
{
SvREFCNT_dec(memd->serialize_method);
SvREFCNT_dec(memd->deserialize_method);
}
SvREFCNT_dec(memd->servers);
Safefree(memd);
void
_weaken(sv)
SV *sv
PROTOTYPE: $
CODE:
sv_rvweaken(sv);
void
enable_compress(memd, enable)
Cache_Memcached_Fast * memd
bool enable
PROTOTYPE: $$
CODE:
if (enable && ! memd->compress_method)
warn("Compression module was not found, can't enable compression");
else if ((memd->compress_threshold > 0) != enable)
memd->compress_threshold = -memd->compress_threshold;
void
set(memd, ...)
Cache_Memcached_Fast * memd
ALIAS:
add = CMD_ADD
replace = CMD_REPLACE
append = CMD_APPEND
prepend = CMD_PREPEND
cas = CMD_CAS
PROTOTYPE: $@
PREINIT:
int noreply;
struct result_object object =
{ NULL, result_store, NULL, NULL };
const char *key;
STRLEN key_len;
cas_type cas = 0;
const void *buf;
STRLEN buf_len;
flags_type flags = 0;
exptime_type exptime = 0;
int arg = 1;
SV *sv;
PPCODE:
object.arg = newAV();
sv_2mortal((SV *) object.arg);
noreply = (GIMME_V == G_VOID);
client_reset(memd->c, &object, noreply);
key = SvPV_stable_storage(aTHX_ ST(arg), &key_len);
++arg;
if (ix == CMD_CAS)
{
cas = SvUV(ST(arg));
++arg;
}
sv = ST(arg);
++arg;
sv = serialize(aTHX_ memd, sv, &flags);
sv = compress(aTHX_ memd, sv, &flags);
buf = (void *) SvPV_stable_storage(aTHX_ sv, &buf_len);
if (buf_len > memd->max_size)
XSRETURN_EMPTY;
if (items > arg)
{
/* exptime doesn't have to be defined. */
sv = ST(arg);
( run in 0.492 second using v1.01-cache-2.11-cpan-39bf76dae61 )