BackupPC-XS

 view release on metacpan or  search on metacpan

BackupPC_XS.xs  view on Meta::CPAN


int
delete(info, d)
        BackupPC::XS::PoolRefCnt info;
        SV *d;
    CODE:
    {
        bpc_digest digest;
        char *str;
        STRLEN len;

        if ( !SvPOK(d) ) {
            XSRETURN_UNDEF;
        }
        str = SvPV(d, len);
        if ( 0 < len && len < sizeof(digest.digest) ) {
            memcpy(digest.digest, str, len);
            digest.len = len;
            if ( bpc_poolRefDelete(info, &digest) ) XSRETURN_UNDEF;
            RETVAL = 1;
        } else {
            XSRETURN_UNDEF;
        }
    }
    OUTPUT:
        RETVAL

int
incr(info, d, delta)
        BackupPC::XS::PoolRefCnt info;
        SV *d;
        int delta;
    CODE:
    {
        bpc_digest digest;
        char *str;
        STRLEN len;

        if ( !SvPOK(d) ) {
            XSRETURN_UNDEF;
        }
        str = SvPV(d, len);
        if ( 0 < len && len < sizeof(digest.digest) ) {
            memcpy(digest.digest, str, len);
            digest.len = len;
            RETVAL = bpc_poolRefIncr(info, &digest, delta);
        } else {
            XSRETURN_UNDEF;
        }
    }
    OUTPUT:
        RETVAL

void
iterate(info, idx)
        BackupPC::XS::PoolRefCnt info;
        unsigned int idx;
    PREINIT:
        bpc_digest digest;
        int count;
    PPCODE:
    {
        if ( !bpc_poolRefIterate(info, &digest, &count, &idx) ) {
            EXTEND(SP, 3);
            PUSHs(sv_2mortal(newSVpvn((char*)digest.digest, digest.len)));
            PUSHs(sv_2mortal(newSViv(count)));
            PUSHs(sv_2mortal(newSViv(idx)));
        }
    }

int
read(info, fileName)
        BackupPC::XS::PoolRefCnt info;
        char *fileName;
    CODE:
        RETVAL = bpc_poolRefFileRead(info, fileName);
    OUTPUT:
        RETVAL

int
write(info, fileName)
        BackupPC::XS::PoolRefCnt info;
        char *fileName;
    CODE:
        RETVAL = bpc_poolRefFileWrite(info, fileName);
    OUTPUT:
        RETVAL

void
print(info)
        BackupPC::XS::PoolRefCnt info;
    CODE:
        bpc_poolRefCountPrint(info);

void
DeltaFileInit(hostDir)
        char *hostDir;
    CODE:
        bpc_poolRefDeltaFileInitOld(hostDir);

unsigned int
DeltaFileFlush()
    CODE:
        RETVAL = bpc_poolRefDeltaFileFlushOld();
    OUTPUT:
        RETVAL

void
DeltaUpdate(compress, d, count)
        int compress;
        SV *d;
        int count;
    CODE:
    {
        bpc_digest digest;
        char *str;
        STRLEN len;

        if ( SvPOK(d) ) {
            str = SvPV(d, len);
            if ( 0 < len && len < sizeof(digest.digest) ) {

BackupPC_XS.xs  view on Meta::CPAN


void
print(info)
        BackupPC::XS::DeltaRefCnt info;
    CODE:
        bpc_poolRefDeltaPrint(info);

MODULE = BackupPC::XS		PACKAGE = BackupPC::XS::PoolWrite

BackupPC::XS::PoolWrite
new(compressLevel, d = NULL)
        int  compressLevel;
        SV   *d;
    CODE:
    {
        int ret = 0;

        RETVAL = calloc(1, sizeof(bpc_poolWrite_info));
        if ( d && SvPOK(d) ) {
            bpc_digest digest;
            char *str;
            STRLEN len;

            str = SvPV(d, len);
            if ( 0 < len && len < sizeof(digest.digest) ) {
                memcpy(digest.digest, str, len);
                digest.len = len;
                ret = bpc_poolWrite_open(RETVAL, compressLevel, &digest);
            } else {
                ret = bpc_poolWrite_open(RETVAL, compressLevel, NULL);
            }
        } else {
            ret = bpc_poolWrite_open(RETVAL, compressLevel, NULL);
        }
        if ( ret ) {
            free(RETVAL);
            RETVAL = NULL;
        }
    }
    OUTPUT:
        RETVAL

void
DESTROY(info)
        BackupPC::XS::PoolWrite info;
    CODE:
    {
        bpc_poolWrite_cleanup(info);
        free(info);
    }

void
close(info)
        BackupPC::XS::PoolWrite info;
    PREINIT:
        int match;
        bpc_digest digest;
        off_t poolFileSize;
        int errorCnt;

    PPCODE:
    {
        bpc_poolWrite_close(info, &match, &digest, &poolFileSize, &errorCnt);
        EXTEND(SP, 4);
        PUSHs(sv_2mortal(newSViv(match)));
        PUSHs(sv_2mortal(newSVpvn((char*)digest.digest, digest.len)));
        PUSHs(sv_2mortal(newSViv(poolFileSize)));
        PUSHs(sv_2mortal(newSViv(errorCnt)));
    }

int
write(info, data)
        BackupPC::XS::PoolWrite info;
        SV *data;
    CODE:
    {
        char *str;
        STRLEN len;

        if ( SvROK(data) ) {
            str = SvPV(SvRV(data), len);
            RETVAL = bpc_poolWrite_write(info, (unsigned char*)str, len);
        } else {
            RETVAL = -1;
        }
    }
    OUTPUT:
        RETVAL

void
addToPool(info, fileName, v3PoolFile)
        BackupPC::XS::PoolWrite info;
        char *fileName;
        int v3PoolFile;
    CODE:
        bpc_poolWrite_addToPool(info, fileName, v3PoolFile);

MODULE = BackupPC::XS		PACKAGE = BackupPC::XS::Attrib

BackupPC::XS::Attrib
new(compressLevel)
        int compressLevel;
    CODE:
    {
        RETVAL = calloc(1, sizeof(bpc_attrib_dir));
        bpc_attrib_dirInit(RETVAL, compressLevel);
    }
    OUTPUT:
        RETVAL

void
DESTROY(dir)
        BackupPC::XS::Attrib dir;
    CODE:
    {
        bpc_attrib_dirDestroy(dir);
        free(dir);
    }

SV*
get(dir, fileName = NULL)
        BackupPC::XS::Attrib dir;
        char *fileName;
    CODE:
    {
        if ( fileName ) {
            bpc_attrib_file *file = bpc_attrib_fileGet(dir, fileName, 0);
            if ( !file ) XSRETURN_UNDEF;
            RETVAL = newRV_noinc((SV*)convert_file2hv(file, file->name));
        } else {
            ssize_t entrySize, i;

            RETVAL = NULL;
            if ( (entrySize = bpc_attrib_getEntries(dir, NULL, 0)) > 0 ) {
                char *entries = malloc(entrySize), *p;

                if ( entries && bpc_attrib_getEntries(dir, entries, entrySize) > 0 ) {
                    HV *rh = newHV();
                    for ( i = 0, p = entries ; i < entrySize ; ) {
                        int len = strlen(p);
                        bpc_attrib_file *file;

                        file = bpc_attrib_fileGet(dir, p, 0);
                        p += len + 1;
                        i += len + 1;
                        if ( !file ) continue;
                        (void)hv_store(rh, file->name, strlen(file->name), newRV_noinc((SV*)convert_file2hv(file, file->name)), 0);
                    }
                    RETVAL = newRV_noinc((SV*)rh);
                }
                if ( entries ) free(entries);
            }
            if ( !RETVAL ) XSRETURN_UNDEF;
        }
    }
    OUTPUT:
        RETVAL

int
set(dir, fileName, hv)
        BackupPC::XS::Attrib dir;
        char *fileName;
        HV *hv;
    CODE:
    {
        bpc_attrib_file *file = bpc_attrib_fileGet(dir, fileName, 0);

        RETVAL = file ? 1 : 0;
        if ( !file ) {
            file = bpc_attrib_fileGet(dir, fileName, 1);
            bpc_attrib_fileInit(file, fileName, 0);
        }
        convert_hv2file(hv, file);
    }
    OUTPUT:
        RETVAL

void
digest(dir)
        BackupPC::XS::Attrib dir;
    PREINIT:
    PPCODE:
    {
        bpc_digest *digest = bpc_attrib_dirDigestGet(dir);
        if ( digest && digest->len > 0 ) {
            EXTEND(SP, 1);
            PUSHs(sv_2mortal(newSVpvn((char*)digest->digest, digest->len)));
        }
    }

void
iterate(dir, idx)
        BackupPC::XS::Attrib dir;
        unsigned int idx;
    PREINIT:
        bpc_attrib_file *file;
    PPCODE:
    {
        if ( !bpc_attrib_fileIterate(dir, &file, &idx) && file ) {
            EXTEND(SP, 2);
            PUSHs(sv_2mortal(newRV_noinc((SV*)convert_file2hv(file, file->name))));
            PUSHs(sv_2mortal(newSViv(idx)));
        }
    }

char*
errStr(void)
    CODE:
        RETVAL = "TODO";
    OUTPUT:
        RETVAL

int
count(dir)
        BackupPC::XS::Attrib dir;
    CODE:
        RETVAL = bpc_attrib_fileCount(dir);
    OUTPUT:
        RETVAL

void
delete(dir, fileName)
        BackupPC::XS::Attrib dir;
        char *fileName;
    CODE:
        bpc_attrib_fileDeleteName(dir, fileName);

int
read(dir, dirPath, attribFileName = "attrib")
        BackupPC::XS::Attrib dir;
        char *dirPath;
        char *attribFileName;
    CODE:
        if ( !*dirPath ) dirPath = NULL;
        RETVAL = !bpc_attrib_dirRead(dir, dirPath, attribFileName, 0);
    OUTPUT:
        RETVAL

int
write(dir, dirPath, attribFileName, d = NULL, deltaInfo = NULL)
        BackupPC::XS::Attrib dir;
        char *dirPath;
        char *attribFileName;
        SV *d;
        BackupPC::XS::DeltaRefCnt deltaInfo;
    CODE:
        if ( !*dirPath ) dirPath = NULL;
        if ( d && SvPOK(d) ) {
            bpc_digest digest;
            char *str;
            STRLEN len;

            str = SvPV(d, len);
            if ( 0 < len && len < sizeof(digest.digest) ) {
                memcpy(digest.digest, str, len);
                digest.len = len;
                RETVAL = !bpc_attrib_dirWrite(deltaInfo, dir, dirPath, attribFileName, &digest);

BackupPC_XS.xs  view on Meta::CPAN

        char pathCopy[BPC_MAXPATHLEN];

        snprintf(pathCopy, sizeof(pathCopy), "%s", path);
        RETVAL = NULL;
        if ( (entrySize = bpc_attribCache_getDirEntries(ac, pathCopy, NULL, 0)) > 0 ) {
            char *entries = malloc(entrySize), *p;

            if ( entries && bpc_attribCache_getDirEntries(ac, pathCopy, entries, entrySize) > 0 ) {
                HV *rh = newHV();
                for ( i = 0, p = entries ; i < entrySize ; ) {
                    int len = strlen(p);
                    char *fileNameSave = p;
                    char filePath[BPC_MAXPATHLEN];
                    bpc_attrib_file *file;

                    snprintf(filePath, sizeof(filePath), "%s/%s", path, p);
                    file = bpc_attribCache_getFile(ac, filePath, 0, dontReadInode);
                    p += len + 1 + sizeof(ino_t);
                    i += len + 1 + sizeof(ino_t);
                    if ( !file ) continue;
                    /* printf("Storing file name %s for path %s\n", fileNameSave, path); */
                    (void)hv_store(rh, fileNameSave, strlen(fileNameSave), newRV_noinc((SV*)convert_file2hv(file, fileNameSave)), 0);
                }
                RETVAL = newRV_noinc((SV*)rh);
            }
            if ( entries ) free(entries);
        }
        if ( !RETVAL ) XSRETURN_UNDEF;
    }
    OUTPUT:
        RETVAL

void
flush(ac, all = 1, path = NULL)
        BackupPC::XS::AttribCache ac;
        int all
        char *path;
    CODE:
        bpc_attribCache_flush(ac, all, path);

SV*
getFullMangledPath(ac, dirName)
        BackupPC::XS::AttribCache ac;
        char *dirName;
    CODE:
    {
        char path[BPC_MAXPATHLEN];
        bpc_attribCache_getFullMangledPath(ac, path, dirName, -1);
        RETVAL = newSVpvn(path, strlen(path));
    }
    OUTPUT:
        RETVAL

MODULE = BackupPC::XS		PACKAGE = BackupPC::XS::FileDigest

void
digest(fileName, compress)
        char *fileName;
        int compress;
    PREINIT:
    PPCODE:
    {
        bpc_digest digest;
        if ( bpc_fileDigest(fileName, compress, &digest) == 0 ) {
            EXTEND(SP, 1);
            PUSHs(sv_2mortal(newSVpvn((char*)digest.digest, digest.len)));
        }
    }

MODULE = BackupPC::XS		PACKAGE = BackupPC::XS::DirOps

int
path_create(path)
        char *path;
    CODE:
        RETVAL = bpc_path_create(path);
    OUTPUT:
        RETVAL

int
path_remove(path, compress, deltaInfo = NULL)
        char *path;
        int compress;
        BackupPC::XS::DeltaRefCnt deltaInfo;
    CODE:
        RETVAL = bpc_path_remove(deltaInfo, path, compress);
    OUTPUT:
        RETVAL

int
refCountAll(path, compress, incr = 1, deltaInfo = NULL)
        char *path;
        int compress;
        int incr;
        BackupPC::XS::DeltaRefCnt deltaInfo;
    CODE:
        RETVAL = bpc_path_refCountAll(deltaInfo, path, compress, incr);
    OUTPUT:
        RETVAL

void
refCountAllInodeMax(path, compress, incr = 1, deltaInfo = NULL)
        char *path;
        int compress;
        int incr;
        BackupPC::XS::DeltaRefCnt deltaInfo;
    PREINIT:
        int retVal;
        unsigned int inodeMax = 0;
    PPCODE:
    {
        retVal = bpc_path_refCountAllInodeMax(deltaInfo, path, compress, incr, &inodeMax);
        EXTEND(SP, 2);
        PUSHs(sv_2mortal(newSViv(retVal)));
        PUSHs(sv_2mortal(newSViv(inodeMax)));
    }

int
lockRangeFd(fd, offset, len, block)
        int fd;
        unsigned int offset;
        unsigned int len;
        int block;
    CODE:
        RETVAL = bpc_lockRangeFd(fd, offset, len, block);
    OUTPUT:
        RETVAL

int
unlockRangeFd(fd, offset, len)
        int fd;
        unsigned int offset;
        unsigned int len;
    CODE:
        RETVAL = bpc_unlockRangeFd(fd, offset, len);
    OUTPUT:
        RETVAL

int
lockRangeFile(lockFile, offset, len, block)
        char *lockFile;
        unsigned int offset;
        unsigned int len;
        int block;
    CODE:
        RETVAL = bpc_lockRangeFile(lockFile, offset, len, block);
    OUTPUT:
        RETVAL

void
unlockRangeFile(lockFd)
        int lockFd;
    CODE:
        bpc_unlockRangeFile(lockFd);
        
MODULE = BackupPC::XS		PACKAGE = BackupPC::XS::Lib

void
ConfInit(topDir, hardLinkMax, poolV3Enabled, logLevel = 0)
        char *topDir;
        int hardLinkMax;
        int poolV3Enabled;
        int logLevel;
    CODE:
        bpc_lib_conf_init(topDir, hardLinkMax, poolV3Enabled, logLevel);

SV*
logMsgGet()
    CODE:
    {



( run in 2.497 seconds using v1.01-cache-2.11-cpan-71847e10f99 )