src/dbfs/trans.h
author Tero Marttila <terom@fixme.fi>
Fri, 17 Oct 2008 18:53:05 +0300
changeset 33 c71f3053c714
permissions -rw-r--r--
working symlink
33
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#ifndef DBFS_TRANS_H
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#define DBFS_TRANS_H
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
/*
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
 * Support for single-fuse_req transactions.
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
 */
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
#include "dbfs.h"
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
// forward-declaration
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
struct dbfs_trans;
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
// generic callback
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
typedef void (*dbfs_trans_cb) (struct dbfs_trans *ctx);
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
/*
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
 * Request/transaction state.
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
 */
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
struct dbfs_trans {
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    struct fuse_req *req;
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    struct evsql_trans *trans;
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
    // called when the dbfs_trans is being free'd
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    dbfs_trans_cb free_fn;
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
    // called once the transaction is ready
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    dbfs_trans_cb begin_fn;
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
    // called once the transaction has been commited
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
    dbfs_trans_cb commit_fn;
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    // set by trans_error to EIO if !NULL
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    int *err_ptr;
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
};
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
/*
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
 * Call from commit_fn once you've set req to NULL. Also called from trans_fail.
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
 *
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
 * Will call free_fn if present.
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
 */
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
void dbfs_trans_free (struct dbfs_trans *ctx);
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
/*
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
 * Fail the dbfs_trans, aborting any trans, erroring out any req and freeing the ctx.
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
 */
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
void dbfs_trans_fail (struct dbfs_trans *ctx, int err);
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
/*
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
 * Initialize the ctx with the given req (stays the same during the lifetime), and opens the transaction.
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
 *
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
 * You should set the callback functions after/before calling this.
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
 *
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
 * begin_fn will be called once the transaction is open, if that fails, the req will be errored for you.
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
 *
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
 * If opening the transaction fails, this will return nonzero and not touch req, otherwise zero.
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
 */
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
int dbfs_trans_init (struct dbfs_trans *ctx, struct fuse_req *req);
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
/*
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
 * Same as init, but allocates/frees-on-error the dbfs_trans for you.
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
 */
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
struct dbfs_trans *dbfs_trans_new (struct fuse_req *req);
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
/*
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
 * Commit the dbfs_trans. After calling this, the ctx may or may not be valid, and commit_fn may or may not be called.
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
 */
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
void dbfs_trans_commit (struct dbfs_trans *ctx);
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
c71f3053c714 working symlink
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
#endif /* DBFS_TRANS_H */