Ceph-Rados
view release on metacpan or search on metacpan
SV * fh
uint64_t psize
bool debug
PREINIT:
char * buf;
size_t len;
int err;
uint64_t off;
INIT:
PerlIO * io = IoIFP(sv_2io(fh));
uint64_t retlen = 0;
int chk_sz = 1024 * 1024;
Newx(buf, chk_sz, char);
CODE:
if (debug)
printf("preparing to write from FH to %s\n", oid);
for (off=0; off<psize; off+=chk_sz) {
len = psize < off + chk_sz ? psize % chk_sz : chk_sz;
err = PerlIO_read(io, buf, len);
if (err < 0)
croak("cannot read from filehandle: %s", strerror(-err));
if (debug)
printf("writing %" PRIu64 "-%" PRIu64 " / %" PRIu64 " bytes from FH to %s\n", off, off+len, psize, oid);
err = rados_write(ioctx, oid, buf, len, off);
if (err < 0)
croak("cannot write object '%s': %s", oid, strerror(-err));
retlen += len;
}
if (debug)
printf("wrote %" PRIu64 " bytes from FH to %s\n", retlen, oid);
RETVAL = retlen;
OUTPUT:
RETVAL
int
_append(io, oid, data, len)
rados_ioctx_t io
const char * oid
SV * data
size_t len
PREINIT:
const char * buf;
int err;
CODE:
buf = (const char *)SvPV(data, len);
err = rados_append(io, oid, buf, len);
if (err < 0)
croak("cannot append to object '%s': %s", oid, strerror(-err));
RETVAL = err == 0;
OUTPUT:
RETVAL
void
_stat(io, oid)
rados_ioctx_t io
const char * oid
PREINIT:
size_t size;
time_t mtime;
int err;
PPCODE:
err = rados_stat(io, oid, &size, &mtime);
if (err < 0)
croak("cannot stat object '%s': %s", oid, strerror(-err));
XPUSHs(sv_2mortal(newSVuv(size)));
XPUSHs(sv_2mortal(newSVuv(mtime)));
SV *
_read(io, oid, len, off = 0)
rados_ioctx_t io
const char * oid
size_t len
uint64_t off
PREINIT:
char * buf;
int retlen;
INIT:
Newx(buf, len, char);
CODE:
retlen = rados_read(io, oid, buf, len, off);
if (retlen < 0)
croak("cannot read object '%s': %s", oid, strerror(-retlen));
RETVAL = newSVpv(buf, retlen);
OUTPUT:
RETVAL
size_t
_read_to_fh(ioctx, oid, fh, len = 0, off = 0, debug=false)
rados_ioctx_t ioctx
const char * oid
SV * fh
size_t len
uint64_t off
bool debug
PREINIT:
char * buf;
int buflen;
uint64_t bufpos;
size_t psize;
time_t pmtime;
int err;
INIT:
PerlIO * io = IoOFP(sv_2io(fh));
int chk_sz = 1024 * 1024;
Newx(buf, chk_sz, char);
CODE:
if ((0 == len) || debug) {
// stat and determine read length
err = rados_stat(ioctx, oid, &psize, &pmtime);
if (err < 0)
croak("cannot stat object '%s': %s", oid, strerror(-err));
}
if (0 == len)
len = psize-off;
if (debug)
printf("preparing to write from %s to FH, %zu bytes\n", oid, len);
for (bufpos=off; bufpos<len+off; bufpos+=chk_sz) {
// logic is 'will bufpos move past ien+off next cycle'
buflen = len+off < bufpos+chk_sz ? len % chk_sz : chk_sz;
if (debug)
( run in 0.614 second using v1.01-cache-2.11-cpan-71847e10f99 )