src/dbfs/mk.c
author Tero Marttila <terom@fixme.fi>
Sat, 29 Nov 2008 01:12:00 +0200
branchnew-evsql
changeset 48 8b019d191353
parent 38 1fd4da071575
permissions -rw-r--r--
update dbfs code to work with new evsql
35
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#include <stdlib.h>
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include <assert.h>
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include <string.h>
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
#include "trans.h"
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
#include "../lib/log.h"
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
struct dbfs_mk_ctx {
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
    struct dbfs_trans base;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    const char *type, *data_expr;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    char *link, *name;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    uint16_t mode;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    uint32_t ino, parent;
38
1fd4da071575 rework/hack parent to be a FOREIGN KEY (add a dir_ino col), implement dbfs_link
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    15
1fd4da071575 rework/hack parent to be a FOREIGN KEY (add a dir_ino col), implement dbfs_link
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    16
    unsigned char is_dir : 1;
35
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
};
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
// default mode for symlinks
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
#define DBFS_SYMLINK_MODE 0777
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
// max. size for an dbfs_mk INSERT query
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
#define DBFS_MK_SQL_MAX 512
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
void dbfs_mk_free (struct dbfs_trans *ctx_base) {
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
    struct dbfs_mk_ctx *ctx = (struct dbfs_mk_ctx *) ctx_base;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    free(ctx->link);
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
    free(ctx->name);
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
}
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
void dbfs_mk_commit (struct dbfs_trans *ctx_base) {
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    struct dbfs_mk_ctx *ctx = (struct dbfs_mk_ctx *) ctx_base;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
    struct fuse_entry_param e;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    int err;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
    
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
    // build entry
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    e.ino = e.attr.st_ino = ctx->ino;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
    e.attr.st_mode = _dbfs_mode(ctx->type) | ctx->mode;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    e.attr.st_size = ctx->link ? strlen(ctx->link) : 0;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    e.attr.st_nlink = 1;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    e.attr_timeout = e.entry_timeout = CACHE_TIMEOUT;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
    // reply
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
    if ((err = fuse_reply_entry(ctx_base->req, &e)))
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
        goto error;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    // req good
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    ctx_base->req = NULL;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    // free
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    dbfs_trans_free(ctx_base);
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    // return
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
    return;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
error:
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    dbfs_trans_fail(ctx_base, err);
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
}
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
48
8b019d191353 update dbfs code to work with new evsql
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
    61
void dbfs_mk_filetree (struct evsql_result *res, void *arg) {
35
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    struct dbfs_mk_ctx *ctx = arg;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    int err = EIO;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
    
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    // check results
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
    if (_dbfs_check_res(res, 0, 0) < 0)
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
        goto error;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
    
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
    // commit
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    dbfs_trans_commit(&ctx->base);
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
    // fallthrough for result_free
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    err = 0;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
error:
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
    if (err)
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
        dbfs_trans_fail(&ctx->base, err);
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
    evsql_result_free(res);
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
}
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
48
8b019d191353 update dbfs code to work with new evsql
Tero Marttila <terom@fixme.fi>
parents: 38
diff changeset
    82
void dbfs_mk_inode (struct evsql_result *res, void *arg) {
35
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
    struct dbfs_mk_ctx *ctx = arg;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
    struct dbfs *dbfs_ctx = fuse_req_userdata(ctx->base.req);
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
    int err = EIO;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
    // check result
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
    if ((err = _dbfs_check_res(res, 1, 1)))
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
        SERROR(err = err > 0 ? ENOENT : EIO);
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
    // get ino
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
    if (evsql_result_uint32(res, 0, 0, &ctx->ino, 0))
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
        goto error;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
    // insert file_tree entry
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
    const char *sql = 
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        "INSERT"
38
1fd4da071575 rework/hack parent to be a FOREIGN KEY (add a dir_ino col), implement dbfs_link
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    98
        " INTO file_tree (name, parent, ino, ino_dir)"
1fd4da071575 rework/hack parent to be a FOREIGN KEY (add a dir_ino col), implement dbfs_link
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    99
        " VALUES ($1::varchar, $2::int4, $3::int4, $4::int4)";
35
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
    
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
    static struct evsql_query_params params = EVSQL_PARAMS(EVSQL_FMT_BINARY) {
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
        EVSQL_PARAM ( STRING ),
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
        EVSQL_PARAM ( UINT32 ),
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
        EVSQL_PARAM ( UINT32 ),
38
1fd4da071575 rework/hack parent to be a FOREIGN KEY (add a dir_ino col), implement dbfs_link
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   105
        EVSQL_PARAM ( UINT32 ),
35
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
        EVSQL_PARAMS_END
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
    };
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
    if (0
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
        ||  evsql_param_string(&params, 0, ctx->name)
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
        ||  evsql_param_uint32(&params, 1, ctx->parent)
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
        ||  evsql_param_uint32(&params, 2, ctx->ino)
38
1fd4da071575 rework/hack parent to be a FOREIGN KEY (add a dir_ino col), implement dbfs_link
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   114
        ||  ctx->is_dir ? evsql_param_uint32(&params, 3, ctx->ino) : evsql_param_null(&params, 3)
35
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
    )
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
        goto error;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
    
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
    // query
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
    if (evsql_query_params(dbfs_ctx->db, ctx->base.trans, sql, &params, dbfs_mk_filetree, ctx))
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
        goto error;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
    
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
    // fallthrough for result_free
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
    err = 0;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
error:
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
    if (err)
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
        dbfs_trans_fail(&ctx->base, err);
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
    evsql_result_free(res);
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
}
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
void dbfs_mk_begin (struct dbfs_trans *ctx_base) {
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
    struct dbfs_mk_ctx *ctx = (struct dbfs_mk_ctx *) ctx_base;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
    struct dbfs *dbfs_ctx = fuse_req_userdata(ctx_base->req);
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
    int ret;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
    // insert inode
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
    char sql_buf[DBFS_MK_SQL_MAX];
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
    
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
    if ((ret = snprintf(sql_buf, DBFS_MK_SQL_MAX, 
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
        "INSERT"
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
        " INTO inodes (type, mode, data, link_path)"
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
        " VALUES ($1::char(3), $2::int2, %s, $3::varchar)"
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
        " RETURNING inodes.ino", ctx->data_expr ? ctx->data_expr : "NULL"
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
    )) >= DBFS_MK_SQL_MAX)
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
        ERROR("sql_buf is too small: %d", ret);
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
    static struct evsql_query_params params = EVSQL_PARAMS(EVSQL_FMT_BINARY) {
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
        EVSQL_PARAM ( STRING ),
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
        EVSQL_PARAM ( UINT16 ),
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
        EVSQL_PARAM ( STRING ),
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
        EVSQL_PARAMS_END
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
    };
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
    if (0
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
        || evsql_param_string(&params, 0, ctx->type)
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
        || evsql_param_uint16(&params, 1, ctx->mode)
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
        || evsql_param_string(&params, 2, ctx->link)
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
    )
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
        goto error;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
    
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
    if (evsql_query_params(dbfs_ctx->db, ctx_base->trans, sql_buf, &params, dbfs_mk_inode, ctx) == NULL)
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
        goto error;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
    
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
    return;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
error:
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
    dbfs_trans_fail(ctx_base, EIO);
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
}
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
/*
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
 * It is assumed that name and link_path must be copied, but type remains useable
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
 */ 
38
1fd4da071575 rework/hack parent to be a FOREIGN KEY (add a dir_ino col), implement dbfs_link
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   175
void dbfs_mk (struct fuse_req *req, fuse_ino_t parent, const char *name, const char *type, uint16_t mode, const char *data_expr, const char *link, unsigned char is_dir) {
35
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
    struct dbfs_mk_ctx *ctx = NULL;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
    // alloc
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
    if ((ctx = calloc(1, sizeof(*ctx))) == NULL)
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
        ERROR("calloc");
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
    // start trans
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
    if (dbfs_trans_init(&ctx->base, req))
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
        goto error;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
 
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
    // callbacks
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
    ctx->base.free_fn = dbfs_mk_free;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
    ctx->base.begin_fn = dbfs_mk_begin;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
    ctx->base.commit_fn = dbfs_mk_commit;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
   
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
    // state
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
    ctx->ino = 0;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
    ctx->parent = parent;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
    ctx->type = type;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
    ctx->data_expr = data_expr;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
    ctx->mode = mode;
38
1fd4da071575 rework/hack parent to be a FOREIGN KEY (add a dir_ino col), implement dbfs_link
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   197
    ctx->is_dir = is_dir;
35
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
    // copy volatile strings
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
    if (
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
            (link && (ctx->link = strdup(link)) == NULL)
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
        ||  (name && (ctx->name = strdup(name)) == NULL)
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
    )
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
        ERROR("strdup");
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
    
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
    // log
38
1fd4da071575 rework/hack parent to be a FOREIGN KEY (add a dir_ino col), implement dbfs_link
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   207
    INFO("[dbfs.mk %p:%p] parent=%lu, name=%s, type=%s, mode=%#04o data_expr=%s link=%s is_dir=%hhd", ctx, req, parent, name, type, mode, data_expr, link, is_dir);
35
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
    // wait
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
    return;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
error:
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
    if (ctx)
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
        dbfs_trans_fail(&ctx->base, EIO);
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
}
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
/*
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
 * These are all just aliases to dbfs_mk
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
 */ 
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
void dbfs_mknod (struct fuse_req *req, fuse_ino_t parent, const char *name, mode_t mode, dev_t rdev) {
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
    int err;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
    if ((mode & S_IFMT) != S_IFREG)
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
        EERROR(err = EINVAL, "mode is not REG: %#08o", mode);
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
38
1fd4da071575 rework/hack parent to be a FOREIGN KEY (add a dir_ino col), implement dbfs_link
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   226
    dbfs_mk(req, parent, name, "REG", mode & 07777, "lo_create(0)", NULL, 0);
35
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
    return;
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
error:
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
    if ((err = fuse_reply_err(req, err)))
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
        EWARNING(err, "fuse_reply_error");
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
}
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
void dbfs_mkdir (struct fuse_req *req, fuse_ino_t parent, const char *name, mode_t mode) {
38
1fd4da071575 rework/hack parent to be a FOREIGN KEY (add a dir_ino col), implement dbfs_link
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   236
    dbfs_mk(req, parent, name, "DIR", mode, NULL, NULL, 1);
35
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
}
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
void dbfs_symlink (struct fuse_req *req, const char *link, fuse_ino_t parent, const char *name) {
38
1fd4da071575 rework/hack parent to be a FOREIGN KEY (add a dir_ino col), implement dbfs_link
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
   241
    dbfs_mk(req, parent, name, "LNK", DBFS_SYMLINK_MODE, NULL, link, 0);
35
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
}
4f10421681d2 working mknod, mkdir, symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   243