src/server/plugins/postgresql/vfs.c

Fri, 28 Jan 2022 15:44:30 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 28 Jan 2022 15:44:30 +0100
branch
webdav
changeset 276
0cb4eda146c4
parent 275
535004faa1a5
child 278
38bf7b42b58c
permissions
-rw-r--r--

add function to create a postgresql-based VFS

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2022 Olaf Wintermann. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *
 *   2. Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include "vfs.h"

static VFS pg_vfs_class = {
    pg_vfs_open,
    pg_vfs_stat,
    pg_vfs_fstat,
    pg_vfs_opendir,
    pg_vfs_fdopendir,
    pg_vfs_mkdir,
    pg_vfs_unlink,
    pg_vfs_rmdir
};

static VFS_IO pg_vfs_io_class = {
    pg_vfs_io_read,
    pg_vfs_io_write,
    pg_vfs_io_pread,
    pg_vfs_io_pwrite,
    pg_vfs_io_seek,
    pg_vfs_io_close,
    NULL, // no pg aio implementation yet
    NULL
};

static VFS_DIRIO pg_vfs_dirio_class = {
    pg_vfs_dirio_readdir,
    pg_vfs_dirio_close
};



VFS* pg_vfs_create(Session *sn, Request *rq, pblock *pb) {
    // resourcepool is required
    char *resource_pool = pblock_find("resourcepool", pb);
    if(!resource_pool) {
        log_ereport(LOG_MISCONFIG, "pg_vfs_create: missing resourcepool parameter");
        return NULL;
    }
    
    // get the resource first (most likely to fail due to misconfig)
    ResourceData *resdata = resourcepool_lookup(sn, rq, resource_pool, 0);
    if(!resdata) {
        log_ereport(LOG_MISCONFIG, "postgresql vfs: resource pool %s not found", resource_pool);
        return NULL;
    }
    // resdata will be freed automatically when the request is finished
    
    // Create a new VFS object and a separate instance object
    // VFS contains fptrs that can be copied from pg_vfs_class
    // instance contains request specific data (PGconn)
    VFS *vfs = pool_malloc(sn->pool, sizeof(VFS));
    if(!vfs) {
        return NULL;
    }
    
    PgVFS *vfs_priv = pool_malloc(sn->pool, sizeof(PgVFS));
    if(!vfs_priv) {
        pool_free(sn->pool, vfs);
        return NULL;
    }
    
    memcpy(vfs, &pg_vfs_class, sizeof(VFS));
    vfs->flags = 0;
    vfs->instance = vfs_priv;
    
    return vfs;
}


/* -------------------------- VFS functions -------------------------- */

SYS_FILE pg_vfs_open(VFSContext *ctx, const char *path, int oflags) {
    
}

int pg_vfs_stat(VFSContext *ctx, const char *path, struct stat *buf) {
    
}

int pg_vfs_fstat(VFSContext *ctx, SYS_FILE fd, struct stat *buf) {
    
}

VFS_DIR pg_vfs_opendir(VFSContext *ctx, const char *path) {
    
}

VFS_DIR pg_vfs_fdopendir(VFSContext *ctx, SYS_FILE fd) {
    
}

int pg_vfs_mkdir(VFSContext *ctx, const char *path) {
    
}

int pg_vfs_unlink(VFSContext *ctx, const char *path) {
    
}

int pg_vfs_rmdir(VFSContext *Ctx, const char *path) {
    
}


/* -------------------------- VFS_IO functions -------------------------- */

ssize_t pg_vfs_io_read(SYS_FILE fd, void *buf, size_t nbyte) {
    
}

ssize_t pg_vfs_io_write(SYS_FILE fd, const void *buf, size_t nbyte) {
    
}

ssize_t pg_vfs_io_pread(SYS_FILE fd, void *buf, size_t nbyte, off_t offset) {
    
}

ssize_t pg_vfs_io_pwrite(SYS_FILE fd, const void *buf, size_t nbyte, off_t offset) {
    
}

off_t pg_vfs_io_seek(SYS_FILE fd, off_t offset, int whence) {
    
}

void pg_vfs_io_close(SYS_FILE fd) {
    
}


/* -------------------------- VFS_DIRIO functions -------------------------- */

int pg_vfs_dirio_readdir(VFS_DIR dir, VFS_ENTRY *entry, int getstat) {
    
}

void pg_vfs_dirio_close(VFS_DIR dir) {
    
}

mercurial