src/dbfs/trans.h
author Tero Marttila <terom@fixme.fi>
Sat, 13 Dec 2008 18:55:01 +0200
branchnew-evsql
changeset 52 f5037572c326
parent 33 c71f3053c714
permissions -rw-r--r--
improved evsql docs and added a doxygen config file
#ifndef DBFS_TRANS_H
#define DBFS_TRANS_H

/*
 * Support for single-fuse_req transactions.
 */

#include "dbfs.h"

// forward-declaration
struct dbfs_trans;

// generic callback
typedef void (*dbfs_trans_cb) (struct dbfs_trans *ctx);

/*
 * Request/transaction state.
 */
struct dbfs_trans {
    struct fuse_req *req;
    struct evsql_trans *trans;
    
    // called when the dbfs_trans is being free'd
    dbfs_trans_cb free_fn;

    // called once the transaction is ready
    dbfs_trans_cb begin_fn;

    // called once the transaction has been commited
    dbfs_trans_cb commit_fn;

    // set by trans_error to EIO if !NULL
    int *err_ptr;
};

/*
 * Call from commit_fn once you've set req to NULL. Also called from trans_fail.
 *
 * Will call free_fn if present.
 */
void dbfs_trans_free (struct dbfs_trans *ctx);

/*
 * Fail the dbfs_trans, aborting any trans, erroring out any req and freeing the ctx.
 */
void dbfs_trans_fail (struct dbfs_trans *ctx, int err);

/*
 * Initialize the ctx with the given req (stays the same during the lifetime), and opens the transaction.
 *
 * You should set the callback functions after/before calling this.
 *
 * begin_fn will be called once the transaction is open, if that fails, the req will be errored for you.
 *
 * If opening the transaction fails, this will return nonzero and not touch req, otherwise zero.
 */
int dbfs_trans_init (struct dbfs_trans *ctx, struct fuse_req *req);

/*
 * Same as init, but allocates/frees-on-error the dbfs_trans for you.
 */
struct dbfs_trans *dbfs_trans_new (struct fuse_req *req);

/*
 * Commit the dbfs_trans. After calling this, the ctx may or may not be valid, and commit_fn may or may not be called.
 */
void dbfs_trans_commit (struct dbfs_trans *ctx);

#endif /* DBFS_TRANS_H */