Ceph-Rados

 view release on metacpan or  search on metacpan

XS/IO.xs  view on Meta::CPAN

  OUTPUT:
    RETVAL

int
_write_from_fh(ioctx, oid, fh, psize, debug=false)
    rados_ioctx_t  ioctx
    const char *     oid
    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)
            printf("Reading %u bytes, offset %" PRIu64 ", of %" PRIu64 "-%" PRIu64 "/%" PRIu64 " from cephio\n", buflen, bufpos, off, len+off, psize);

        err = rados_read(ioctx, oid, buf, buflen, bufpos);
        if (err < 0)
            croak("cannot read object '%s': %s", oid, strerror(-err));
        if (debug)
            printf("Writing %zu bytes to FH\n", len);
        err = PerlIO_write(io, buf, buflen);
        if (err < 0)
            croak("cannot write to filehandle: %s", strerror(-err));
    }
    if (err < 0)
        croak("cannot read object '%s': %s", oid, strerror(-err));
    RETVAL = len;
  OUTPUT:
    RETVAL


uint64_t
_pool_required_alignment(io)
    rados_ioctx_t    io
  PREINIT:
    uint64_t         req;
    int              err;
  CODE:
    err = rados_ioctx_pool_required_alignment2(io, &req);
    if (err < 0)
        croak("cannot rados_ioctx_pool_required_alignment2(): %s", strerror(-err));
    RETVAL = req;
  OUTPUT:
    RETVAL

int
remove(io, oid)
    rados_ioctx_t    io
    const char *     oid
  PREINIT:
    int              err;
  CODE:
    err = rados_remove(io, oid);
    if (err < 0)
        croak("cannot remove object '%s': %s", oid, strerror(-err));
    RETVAL = err == 0;
  OUTPUT:
    RETVAL

void
destroy(io)
    rados_ioctx_t    io



( run in 0.981 second using v1.01-cache-2.11-cpan-99c4e6809bf )