/* 
 * Copyright (C) 2001-2003 FhG Fokus
 * Copyright (C) 2006-2007 iptelorg GmbH
 *
 * This file is part of Kamailio, a free SIP server.
 *
 * Kamailio is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version
 *
 * Kamailio is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License 
 * along with this program; if not, write to the Free Software 
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

#ifndef _DB_FLD_H
#define _DB_FLD_H  1

/** \ingroup DB_API 
 * @{ 
 */

#include "db_gen.h"
#include "../../core/str.h"
#include <time.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */


enum db_fld_type {
	DB_NONE = 0,   /* Bumper */
	DB_INT,        /* 32-bit integer */
	DB_FLOAT,      /* 32-bit fixed-precision number */
	DB_DOUBLE,     /* double data type */
	DB_CSTR,       /* Zero-terminated string */
	DB_STR,        /* str structure */
	DB_DATETIME,   /* Date and time in number of seconds since 1-Jan-1970 */
	DB_BLOB,       /* Generic binary object*/
	DB_BITMAP      /* Bitmap of flags */
};

extern char* db_fld_str[];

enum db_fld_op {
	DB_EQ = 0, /* The value of the field must be equal */
	DB_NE,     /* The value of the filed must be not equal */
	DB_LT,     /* The value of the field must be less than */
	DB_GT,     /* The value of the field must be greater than */
	DB_LEQ,    /* The value of the field must be less than or equal */
	DB_GEQ     /* The value of the field must be greater than or equal */
};

enum db_flags {
	DB_NULL = (1 << 0),  /**< The field is NULL, i.e. no value was provided */
	DB_NO_TZ = (1 << 1), /**< Inhibit time-zone shifts for timestamp fields */
};

/* union of all possible types */
typedef union db_fld_val {
	int          int4;   /* integer value */
	float        flt;    /* float value */
	double       dbl;    /* double value */
	time_t       time;   /* unix time value */
	char*        cstr;   /* NULL terminated string */
	str          lstr;   /* String with known length */
	str          blob;   /* Blob data */
	unsigned int bitmap; /* Bitmap data type, 32 flags, should be enough */ 
	long long    int8;   /* 8-byte integer */
} db_fld_val_t;

typedef struct db_fld {
	db_gen_t gen;  /* Generic part of the structure */
	char* name;
	enum db_fld_type type;
	unsigned int flags;
	db_fld_val_t v;
	enum db_fld_op op;
} db_fld_t;

#define DB_FLD_LAST(fld) ((fld).name == NULL)
#define DB_FLD_EMPTY(fld) ((fld) == NULL || (fld)[0].name == NULL)

struct db_fld* db_fld(size_t n);
void db_fld_free(struct db_fld* fld);

int db_fld_init(struct db_fld* fld);
void db_fld_close(struct db_fld* fld);

db_fld_t* db_fld_copy(db_fld_t* fld);

#ifdef __cplusplus
}
#endif /* __cplusplus */

/** @} */

#endif /* _DB_FLD_H */
