/*
 * Copyright (c) 2002-2005 Sendmail, Inc. and its suppliers.
 *      All rights reserved.
 *
 * By using this file, you agree to the terms and conditions set
 * forth in the LICENSE file which can be found at the top level of
 * the sendmail distribution.
 *
 *	$Id: cdb.h,v 1.23 2006/07/18 02:43:16 ca Exp $
 */

#ifndef SM_CDB_H
#define SM_CDB_H 1

#include "sm/generic.h"
#include "sm/cstr.h"
#include "sm/mta.h"
#include "sm/io.h"

/* CDB context (handle) */
typedef struct cdb_ctx_S	cdb_ctx_T, *cdb_ctx_P;

extern sm_stream_T SmCDBSt;

/* cdb API according to db.func.tex */

#if 0
cdb_start(IN name, IN mode, IN estimated-size, IN hints,
OUT cdb-handle, OUT status):
open a CDB.
mode is read only or read/write (usually the latter).
hints may contain information about the intended (estimated)
usage, e.g., how many mailcontents may be open at the same time.

cdb_open(IN cdb-handle, IN trans-id, IN content-id, IN mode, IN size, IN hints,
OUT status, OUT content-id):
open a content entry.
mode: read or write.
trans-id: transaction id (can be NULL for read,
then content-id must be supplied),
size and hints can be supplied if mode is write.

cdb_write(IN cdb-handle, IN content-id, IN datap, IN len, OUT status, OUT written)

cdb_read(IN cdb-handle, IN content-id, IN datap, IN len, OUT status, OUT read)

cdb_commit(IN cdb-handle, IN content-id, OUT status):
make sure content is on persistent storage.

cdb_close(IN cdb-handle, IN content-id, OUT status).
Should close implicitly call commit?

cdb_abort(IN cdb-handle, IN content-id, OUT status):
obvious meaning.

cdb_unlink(IN cdb-handle, IN content-id, OUT status):
content is not used anymore.

cdb_stop(IN cdb-handle, OUT status):
stop using this CDB.

#endif /* 0 */

/* abstraction layer for cdb */

/*
**  Change this if the cdb_id use/generation changes!
**  Currently SMTPS uses the transaction id as cdb id,
**  see smtps/s2q.c.
**  XXX Maybe add a format specifier to avoid having to change it in
**	print statements when the type is changed?
**  Also add a SM_RCBV_* type?
*/

#define CDB_ID_SIZE SMTP_STID_SIZE
typedef sm_cstr_T	cdb_id_T;
typedef sm_cstr_P	cdb_id_P;

/* coordinate with sm/io.h and search for other SM_IO_WHAT_* */
#define SM_IO_WHAT_CDB_HDL	100	/* pass CDB context (handle) */

#define cdb_open(cdb_handle, ta_id, content_id, mode, size, hints)	\
	sm_io_open(&SmCDBSt, ta_id, mode, &(content_id),	\
		SM_IO_WHAT_CDB_HDL, cdb_handle, SM_IO_WHAT_END)

#define cdb_open_write(cdb_handle, ta_id, content_id, mode, instance, cdb_id)	\
	cdb_open_wr(cdb_handle, ta_id, &(content_id), mode, instance, NULL, 0, cdb_id)

#define cdb_open_wr_vector(cdb_handle, ta_id, content_id, mode, instance, io_vector, bufsize, cdb_id)	\
	cdb_open_wr(cdb_handle, ta_id, &(content_id), mode, instance, io_vector, bufsize, cdb_id)


#define cdb_open_read(cdb_handle, cdb_id, content_id) \
	sm_io_open(&SmCDBSt, cdb_id, SM_IO_RDONLY, &(content_id),	\
		SM_IO_WHAT_CDB_HDL, cdb_handle, SM_IO_WHAT_END)

#define cdb_write(cdb_handle, content_id, datap, len, written)	\
	sm_io_write(content_id, datap, len, written)

#define cdb_commit(cdb_handle, content_id)	\
	sm_io_setinfo(content_id, SM_IO_WHAT_COMMIT, NULL)

#define cdb_close(cdb_handle, content_id, flags) \
		sm_io_close(content_id, flags)

#define cdb_abort(cdb_handle, content_id)	\
		sm_io_setinfo(content_id, SM_IO_WHAT_ABORT, NULL)

#define cdb_unlink(cdb_handle, ta_id)	\
		cdb_remove(cdb_handle, ta_id)

sm_ret_T	 cdb_open_wr(cdb_ctx_P _cdb_ctx, sessta_id_T _ta_id, sm_file_T **_fp, int _mode, int _instance, sm_stream_T *io_vector, size_t _bufsize, cdb_id_P *_cdb_id);

sm_ret_T	 cdb_remove(cdb_ctx_P cdb_ctx, const char *_cdb_id);

sm_ret_T	 cdb_start(const char *_base, cdb_ctx_P *_pcdb_ctx);
sm_ret_T	 cdb_end(cdb_ctx_P _cdb_ctx);

#endif /* SM_CDB_H */


syntax highlighted by Code2HTML, v. 0.9.1