view release on metacpan or search on metacpan
lib/Apophis.xs view on Meta::CPAN
static HV *
apophis_meta_read(pTHX_ const char *meta_path)
{
PerlIO *fh;
HV *meta;
apophis_stat_t st;
char *buf, *p, *end;
SSize_t nread;
if (stat(meta_path, &st) != 0) return NULL;
fh = PerlIO_open(meta_path, "r");
if (!fh) return NULL;
buf = (char *)malloc((size_t)st.st_size + 1);
if (!buf) { PerlIO_close(fh); return NULL; }
nread = PerlIO_read(fh, buf, (Size_t)st.st_size);
PerlIO_close(fh);
lib/Apophis.xs view on Meta::CPAN
/*
* pp_apophis_store - Custom op: fused identify + mkdir + atomic write
*
* Stack input: self_sv, content_ref_sv
* Stack output: uuid_string_sv
*
* Fuses the entire store pipeline into a single op:
* 1. Extract namespace bytes from object
* 2. SHA-1 hash content â UUID v5
* 3. Compute 2-level sharded path
* 4. stat() for CAS dedup check
* 5. mkdir -p parent directories
* 6. Atomic write (temp + rename)
* 7. Format and return UUID string
*/
static OP *
pp_apophis_store(pTHX) {
dSP;
SV *content_ref_sv = POPs;
SV *self_sv = POPs;
HV *hv;
lib/Apophis.xs view on Meta::CPAN
/* Get store_dir from object */
store_dir = apophis_get_store_dir(aTHX_ hv, NULL, &store_dir_len);
/* Build sharded path */
apophis_build_path(path, sizeof(path),
store_dir, store_dir_len,
id_str, HORUS_FMT_STR_LEN);
/* CAS dedup: only write if not already stored */
if (stat(path, &st) != 0) {
apophis_ensure_parent_dir(path);
apophis_atomic_write(aTHX_ path, content, content_len);
}
EXTEND(SP, 1);
PUSHs(sv_2mortal(newSVpvn(id_str, HORUS_FMT_STR_LEN)));
PUTBACK;
return NORMAL;
}
/*
* pp_apophis_exists - Custom op: UUID â boolean existence check
*
* Stack input: self_sv, id_sv
* Stack output: bool_sv
*
* Fuses: path computation + stat() into a single op.
*/
static OP *
pp_apophis_exists(pTHX) {
dSP;
SV *id_sv = POPs;
SV *self_sv = POPs;
HV *hv;
const char *store_dir;
STRLEN store_dir_len;
const char *id_str;
lib/Apophis.xs view on Meta::CPAN
croak("Apophis: pp_exists: not an object");
hv = (HV *)SvRV(self_sv);
store_dir = apophis_get_store_dir(aTHX_ hv, NULL, &store_dir_len);
id_str = SvPV(id_sv, id_len);
apophis_build_path(path, sizeof(path),
store_dir, store_dir_len, id_str, id_len);
EXTEND(SP, 1);
PUSHs(stat(path, &st) == 0 ? &PL_sv_yes : &PL_sv_no);
PUTBACK;
return NORMAL;
}
/*
* pp_apophis_fetch - Custom op: UUID â content scalar ref or undef
*
* Stack input: self_sv, id_sv
* Stack output: \$content or undef
*
lib/Apophis.xs view on Meta::CPAN
croak("Apophis: pp_fetch: not an object");
hv = (HV *)SvRV(self_sv);
store_dir = apophis_get_store_dir(aTHX_ hv, NULL, &store_dir_len);
id_str = SvPV(id_sv, id_len);
apophis_build_path(path, sizeof(path),
store_dir, store_dir_len, id_str, id_len);
EXTEND(SP, 1);
if (stat(path, &st) != 0) {
PUSHs(&PL_sv_undef);
} else {
PerlIO *fh = PerlIO_open(path, "rb");
if (!fh)
croak("Apophis: pp_fetch: cannot open '%s': %s",
path, strerror(errno));
SV *content = newSV((STRLEN)st.st_size + 1);
SvPOK_on(content);
SSize_t nread = PerlIO_read(fh, SvPVX(content), (Size_t)st.st_size);
lib/Apophis.xs view on Meta::CPAN
apophis_identify_content(uuid, ns, content, content_len);
horus_format_uuid(id_str, uuid, HORUS_FMT_STR);
/* Build path */
store_dir = apophis_get_store_dir(aTHX_ hv, opts, &store_dir_len);
path_len = apophis_build_path(path, sizeof(path),
store_dir, store_dir_len,
id_str, HORUS_FMT_STR_LEN);
/* CAS dedup: skip if already exists */
if (stat(path, &st) != 0) {
apophis_ensure_parent_dir(path);
apophis_atomic_write(aTHX_ path, content, content_len);
}
/* Write metadata sidecar if provided */
if (meta) {
char meta_path[APOPHIS_PATH_MAX];
apophis_build_meta_path(meta_path, sizeof(meta_path),
path, path_len);
apophis_meta_write(aTHX_ meta_path, meta);
lib/Apophis.xs view on Meta::CPAN
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);
/* Check existence */
if (stat(path, &st) != 0) {
RETVAL = &PL_sv_undef;
} else {
/* Read entire file */
fh = PerlIO_open(path, "rb");
if (!fh)
croak("Apophis::fetch: cannot open '%s': %s",
path, strerror(errno));
content = newSV((STRLEN)st.st_size + 1);
SvPOK_on(content);
lib/Apophis.xs view on Meta::CPAN
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);
RETVAL = (stat(path, &st) == 0) ? TRUE : FALSE;
OUTPUT:
RETVAL
# ------------------------------------------------------------------ #
# remove($id, %opts) -> bool #
# ------------------------------------------------------------------ #
bool
remove(self, id, ...)
SV *self
lib/Apophis.xs view on Meta::CPAN
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 #
# ------------------------------------------------------------------ #
lib/Apophis.xs view on Meta::CPAN
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, ...)
lib/Apophis.xs view on Meta::CPAN
content = SvPV(content_sv, content_len);
apophis_identify_content(uuid, ns, content, content_len);
horus_format_uuid(id_str, uuid, HORUS_FMT_STR);
store_dir = apophis_get_store_dir(aTHX_ hv, NULL, &store_dir_len);
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);
}
RETVAL = newSVpvn(id_str, HORUS_FMT_STR_LEN);
OUTPUT:
RETVAL
# op_exists($self, $id) -> bool
# Fused path computation + stat â single call.
lib/Apophis.xs view on Meta::CPAN
CODE:
if (!sv_isobject(self))
croak("Apophis::op_exists: not an object");
hv = (HV *)SvRV(self);
store_dir = apophis_get_store_dir(aTHX_ hv, NULL, &store_dir_len);
id_str = SvPV(id, id_len);
apophis_build_path(path, sizeof(path),
store_dir, store_dir_len, id_str, id_len);
RETVAL = (stat(path, &st) == 0) ? TRUE : FALSE;
OUTPUT:
RETVAL
# op_fetch($self, $id) -> \$content or undef
# Fused path computation + stat + read â single call.
SV *
op_fetch(self, id)
SV *self
SV *id
lib/Apophis.xs view on Meta::CPAN
CODE:
if (!sv_isobject(self))
croak("Apophis::op_fetch: not an object");
hv = (HV *)SvRV(self);
store_dir = apophis_get_store_dir(aTHX_ hv, NULL, &store_dir_len);
id_str = SvPV(id, id_len);
apophis_build_path(path, sizeof(path),
store_dir, store_dir_len, id_str, id_len);
if (stat(path, &st) != 0) {
RETVAL = &PL_sv_undef;
} else {
fh = PerlIO_open(path, "rb");
if (!fh)
croak("Apophis::op_fetch: cannot open '%s': %s",
path, strerror(errno));
content = newSV((STRLEN)st.st_size + 1);
SvPOK_on(content);
nread = PerlIO_read(fh, SvPVX(content), (Size_t)st.st_size);