#ifndef PACKAGES_DB_H
#define PACKAGES_DB_H

#ifdef PACKAGE_DB

#ifdef USE_MSQL
/* MSQL v2 requires this so that it knows the right prototypes */
#define _OS_UNIX

#ifdef INCL_LOCAL_MSQL_H
#include "/usr/local/include/msql.h"
#endif
#ifdef INCL_LOCAL_MSQL_MSQL_H
#include "/usr/local/msql/include/msql.h"
#endif
#ifdef INCL_LOCAL_MINERVA_MSQL_H
#include "/usr/local/Minerva/include/msql.h"
#endif
#ifdef INCL_LIB_HUGHES_MSQL_H
#include "/usr/lib/Hughes/include/msql.h"
#endif
#endif

#ifdef USE_MYSQL
#ifdef INCL_LOCAL_MYSQL_H
#include "/usr/local/include/mysql.h"
#endif
#ifdef INCL_LOCAL_INCLUDE_MYSQL_MYSQL_H
#include "/usr/local/include/mysql/mysql.h"
#endif
#ifdef INCL_LOCAL_MYSQL_INCLUDE_MYSQL_MYSQL_H
#include "/usr/local/mysql/include/mysql/mysql.h"
#endif
#ifdef INCL_LOCAL_MYSQL_MYSQL_H
#include "/usr/local/mysql/include/mysql.h"
#endif
#ifdef INCL_MYSQL_MYSQL_H
#include "/usr/include/mysql/mysql.h"
#endif
#endif
#include "/usr/local/mysql/include/mysql/mysql.h"

typedef union dbconn_u {
#ifdef USE_MSQL
    struct tmp_msql {
	int handle;
	m_result * result_set;
    } msql;
#endif
#ifdef USE_MYSQL
    struct tmp_mysql {
	char errormsg[256];
	MYSQL *handle;
	MYSQL_RES *results;
    } mysql;
#endif
} dbconn_t;

/*
 * Structure so we can have a lookup table for the specific database
 */
typedef struct db_defn_s {
    char *name;
    int (*connect)(dbconn_t *, char *, char *, char *, char *);
    int (*close)(dbconn_t *);
    int (*execute)(dbconn_t *, char *);
    array_t * (*fetch)(dbconn_t *, int);
    int (*commit)(dbconn_t *);
    int (*rollback)(dbconn_t *);
    void (*cleanup)(dbconn_t *);
    void (*status)(dbconn_t *, outbuffer_t *);
    char * (*error)(dbconn_t *);
} db_defn_t;

#define DB_FLAG_EMPTY	0x1

typedef struct _db {
    int flags;
    db_defn_t *type;
    dbconn_t c;
} db_t;

void db_cleanup PROT((void));

#endif	/* PACKAGES_DB */

#endif	/* PACKAGES_DB_H */
