src/dbfs/dbfs.c
author Tero Marttila <terom@fixme.fi>
Fri, 17 Oct 2008 20:12:20 +0300
changeset 35 4f10421681d2
parent 34 460f995d3769
child 36 56427f22e969
permissions -rw-r--r--
working mknod, mkdir, symlink
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include <stdlib.h>
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
     4
#include "dbfs.h"
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
#include "../dbfs.h"
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents: 28
diff changeset
     6
#include "../lib/log.h"
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
static struct fuse_lowlevel_ops dbfs_llops = {
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
    .init           = dbfs_init,
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    .destroy        = dbfs_destroy,
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    .lookup         = dbfs_lookup,
32
90e14e0df133 working readlink
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    14
    // .forget
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    .getattr        = dbfs_getattr,
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    16
    .setattr        = dbfs_setattr,
32
90e14e0df133 working readlink
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    17
    .readlink       = dbfs_readlink,
35
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    18
    .mknod          = dbfs_mknod,
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    19
    .mkdir          = dbfs_mkdir,
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents: 34
diff changeset
    20
    
33
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents: 32
diff changeset
    21
    .symlink        = dbfs_symlink,
34
460f995d3769 fix readdir to use ORDER BY, rename
Tero Marttila <terom@fixme.fi>
parents: 33
diff changeset
    22
    .rename         = dbfs_rename,
33
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents: 32
diff changeset
    23
30
d8fabd347a8e working open+read+flush+release
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    24
    .open           = dbfs_open,
d8fabd347a8e working open+read+flush+release
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    25
    .read           = dbfs_read,
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    26
    .write          = dbfs_write,
30
d8fabd347a8e working open+read+flush+release
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    27
    .flush          = dbfs_flush,
d8fabd347a8e working open+read+flush+release
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    28
    .release        = dbfs_release,
d8fabd347a8e working open+read+flush+release
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    29
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    .opendir        = dbfs_opendir,
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    .readdir        = dbfs_readdir,
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    .releasedir     = dbfs_releasedir,
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
};
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
void dbfs_init (void *userdata, struct fuse_conn_info *conn) {
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
    INFO("[dbfs.init] userdata=%p, conn=%p", userdata, conn);
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
}
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
void dbfs_destroy (void *arg) {
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    struct dbfs *ctx = arg;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    INFO("[dbfs.destroy %p]", ctx);
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
    // exit libevent
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
    event_base_loopexit(ctx->ev_base, NULL);
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
}
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
void dbfs_sql_error (struct evsql *evsql, void *arg) {
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    struct dbfs *ctx = arg;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    // AAAAAAAAAA.... panic
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
    WARNING("[dbfs] SQL error: BREAKING MAIN LOOP LIEK NAO");
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
    event_base_loopbreak(ctx->ev_base);
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
}
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
30
d8fabd347a8e working open+read+flush+release
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    58
struct dbfs *dbfs_new (struct event_base *ev_base, struct fuse_args *args, const char *db_conninfo) {
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    struct dbfs *ctx = NULL;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
    // alloc ctx
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    if ((ctx = calloc(1, sizeof(*ctx))) == NULL)
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
        ERROR("calloc");
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
    
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    ctx->ev_base = ev_base;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
    ctx->db_conninfo = db_conninfo;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
    // open sql
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
    if ((ctx->db = evsql_new_pq(ctx->ev_base, ctx->db_conninfo, dbfs_sql_error, ctx)) == NULL)
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
        ERROR("evsql_new_pq");
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
    // open fuse
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    if ((ctx->ev_fuse = evfuse_new(ctx->ev_base, args, &dbfs_llops, ctx)) == NULL)
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        ERROR("evfuse_new");
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
    // success
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
    return ctx;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
error:
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
    if (ctx)
30
d8fabd347a8e working open+read+flush+release
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    81
        dbfs_free(ctx);
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
    return NULL;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
}    
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
30
d8fabd347a8e working open+read+flush+release
Tero Marttila <terom@fixme.fi>
parents: 29
diff changeset
    86
void dbfs_free (struct dbfs *ctx) {
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
    // cleanup
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
    if (ctx->ev_fuse) {
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
        evfuse_free(ctx->ev_fuse);
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
        ctx->ev_fuse = NULL;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
    }
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
    if (ctx->db) {
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
        // XXX: not yet implemented 
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
        // evsql_close(ctx->db);
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        // ctx->db = NULL;
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
    }
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
    
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
    free(ctx);
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
}