Apophis
view release on metacpan or search on metacpan
lib/Apophis.xs view on Meta::CPAN
STRLEN id_len;
char path[APOPHIS_PATH_MAX];
PerlIO *fh;
unsigned char uuid[16];
char recomputed[HORUS_FMT_STR_LEN + 1];
CODE:
if (!sv_isobject(self))
croak("Apophis::verify: not an object");
hv = (HV *)SvRV(self);
ns = apophis_get_ns(aTHX_ hv);
if (items > 2) {
int i;
if ((items - 2) % 2 != 0)
croak("Apophis::verify: odd number of optional arguments");
opts = newHV();
sv_2mortal((SV *)opts);
for (i = 2; i < items; i += 2) {
STRLEN klen;
const char *k = SvPV(ST(i), klen);
hv_store(opts, k, klen, SvREFCNT_inc(ST(i+1)), 0);
}
}
store_dir = apophis_get_store_dir(aTHX_ hv, opts, &store_dir_len);
id_str = SvPV(id, id_len);
apophis_build_path(path, sizeof(path),
store_dir, store_dir_len, id_str, id_len);
fh = PerlIO_open(path, "rb");
if (!fh) {
RETVAL = FALSE;
} else {
apophis_identify_stream(aTHX_ uuid, ns, fh);
PerlIO_close(fh);
horus_format_uuid(recomputed, uuid, HORUS_FMT_STR);
RETVAL = (id_len == HORUS_FMT_STR_LEN &&
memcmp(id_str, recomputed, HORUS_FMT_STR_LEN) == 0)
? TRUE : FALSE;
}
OUTPUT:
RETVAL
# ------------------------------------------------------------------ #
# store_many(\@refs, %opts) -> @ids #
# ------------------------------------------------------------------ #
void
store_many(self, refs, ...)
SV *self
SV *refs
PREINIT:
HV *hv;
HV *opts = NULL;
const unsigned char *ns;
const char *store_dir;
STRLEN store_dir_len;
AV *av;
I32 len, i;
PPCODE:
if (!sv_isobject(self))
croak("Apophis::store_many: not an object");
hv = (HV *)SvRV(self);
ns = apophis_get_ns(aTHX_ hv);
if (!SvROK(refs) || SvTYPE(SvRV(refs)) != SVt_PVAV)
croak("Apophis::store_many: first argument must be an array ref");
av = (AV *)SvRV(refs);
len = av_len(av) + 1;
if (items > 2) {
int j;
if ((items - 2) % 2 != 0)
croak("Apophis::store_many: odd number of optional arguments");
opts = newHV();
sv_2mortal((SV *)opts);
for (j = 2; j < items; j += 2) {
STRLEN klen;
const char *k = SvPV(ST(j), klen);
hv_store(opts, k, klen, SvREFCNT_inc(ST(j+1)), 0);
}
}
store_dir = apophis_get_store_dir(aTHX_ hv, opts, &store_dir_len);
EXTEND(SP, len);
for (i = 0; i < len; i++) {
SV **svp = av_fetch(av, i, 0);
SV *content_sv;
const char *content;
STRLEN content_len;
unsigned char uuid[16];
char id_str[HORUS_FMT_STR_LEN + 1];
char path[APOPHIS_PATH_MAX];
apophis_stat_t st;
if (!svp || !SvROK(*svp))
croak("Apophis::store_many: element %d must be a scalar ref",
(int)i);
content_sv = SvRV(*svp);
content = SvPV(content_sv, content_len);
apophis_identify_content(uuid, ns, content, content_len);
horus_format_uuid(id_str, uuid, HORUS_FMT_STR);
apophis_build_path(path, sizeof(path),
store_dir, store_dir_len,
id_str, HORUS_FMT_STR_LEN);
if (stat(path, &st) != 0) {
apophis_ensure_parent_dir(path);
apophis_atomic_write(aTHX_ path, content, content_len);
}
PUSHs(sv_2mortal(newSVpvn(id_str, HORUS_FMT_STR_LEN)));
}
# ------------------------------------------------------------------ #
# find_missing(\@ids, %opts) -> @missing_ids #
# ------------------------------------------------------------------ #
void
find_missing(self, ids, ...)
SV *self
SV *ids
PREINIT:
HV *hv;
HV *opts = NULL;
const char *store_dir;
STRLEN store_dir_len;
AV *av;
I32 len, i;
PPCODE:
if (!sv_isobject(self))
croak("Apophis::find_missing: not an object");
hv = (HV *)SvRV(self);
if (!SvROK(ids) || SvTYPE(SvRV(ids)) != SVt_PVAV)
croak("Apophis::find_missing: first argument must be an array ref");
av = (AV *)SvRV(ids);
len = av_len(av) + 1;
if (items > 2) {
int j;
if ((items - 2) % 2 != 0)
croak("Apophis::find_missing: odd number of optional arguments");
opts = newHV();
sv_2mortal((SV *)opts);
for (j = 2; j < items; j += 2) {
STRLEN klen;
const char *k = SvPV(ST(j), klen);
hv_store(opts, k, klen, SvREFCNT_inc(ST(j+1)), 0);
}
}
store_dir = apophis_get_store_dir(aTHX_ hv, opts, &store_dir_len);
for (i = 0; i < len; i++) {
SV **svp = av_fetch(av, i, 0);
const char *id_str;
STRLEN id_len;
char path[APOPHIS_PATH_MAX];
apophis_stat_t st;
if (!svp || !SvOK(*svp)) continue;
id_str = SvPV(*svp, id_len);
apophis_build_path(path, sizeof(path),
store_dir, store_dir_len, id_str, id_len);
if (stat(path, &st) != 0) {
XPUSHs(sv_2mortal(newSVpvn(id_str, id_len)));
}
}
# ------------------------------------------------------------------ #
# meta($id, %opts) -> \%meta or undef #
# ------------------------------------------------------------------ #
SV *
meta(self, id, ...)
SV *self
SV *id
PREINIT:
HV *hv;
HV *opts = NULL;
const char *store_dir;
STRLEN store_dir_len;
const char *id_str;
STRLEN id_len;
char path[APOPHIS_PATH_MAX];
int path_len;
char meta_path[APOPHIS_PATH_MAX];
( run in 0.749 second using v1.01-cache-2.11-cpan-71847e10f99 )