1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
|
/*
* $Id$
*
* db_berkeley module, portions of this code were templated using
* the dbtext and postgres modules.
* Copyright (C) 2007 Cisco Systems
*
* This file is part of SIP-router, a free SIP server.
*
* SIP-router 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
*
* SIP-router 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
*
* History:
* --------
* 2007-09-19 genesis (wiquan)
*/
/*! \file
* Berkeley DB : Library
*
* \ingroup database
*/
#ifndef _BDB_LIB_H_
#define _BDB_LIB_H_
#include <time.h>
#include <stdlib.h>
#include <syslog.h>
#include <sys/stat.h>
#include <db.h>
#include "../../str.h"
#include "../../lib/srdb2/db.h"
#include "../../lib/srdb2/db_fld.h"
/*max number of columns in a table*/
#define MAX_NUM_COLS 32
/*max char width of a table row*/
#define MAX_ROW_SIZE 2048
/*max char width of a table name*/
#define MAX_TABLENAME_SIZE 64
#define METADATA_COLUMNS "METADATA_COLUMNS"
#define METADATA_KEY "METADATA_KEY"
#define METADATA_READONLY "METADATA_READONLY"
#define METADATA_LOGFLAGS "METADATA_LOGFLAGS"
#define METADATA_DEFAULTS "METADATA_DEFAULTS"
/*journal logging flag masks */
#define JLOG_NONE 0
#define JLOG_INSERT 1
#define JLOG_DELETE 2
#define JLOG_UPDATE 4
#define JLOG_FILE 8
#define JLOG_STDOUT 16
#define JLOG_SYSLOG 32
#define DELIM "|"
#define DELIM_LEN (sizeof(DELIM)-1)
#define BDB_VALUE 0
#define BDB_KEY 1
typedef enum db_fld_type bdb_type_t;
typedef struct {
bdb_type_t type; /**< Type of the value */
int nul; /**< Means that the column in database has no value */
int free; /**< Means that the value should be freed */
/** Column value structure that holds the actual data in a union. */
union {
int int_val; /**< integer value */
long long ll_val; /**< long long value */
double double_val; /**< double value */
time_t time_val; /**< unix time_t value */
const char* string_val; /**< zero terminated string */
str str_val; /**< str type string value */
str blob_val; /**< binary object data */
unsigned int bitmap_val; /**< Bitmap data type */
} val;
} bdb_val_t, *bdb_val_p;
// typedef db_val_t bdb_val_t, *bdb_val_p;
typedef struct _bdb_row
{
bdb_val_p fields;
struct _bdb_row *prev;
struct _bdb_row *next;
} bdb_row_t, *bdb_row_p;
typedef struct _bdb_col
{
str name;
str dv; /* default value */
int type;
int flag;
} bdb_col_t, *bdb_col_p;
typedef struct _bdb_table
{
str name;
DB *db;
bdb_col_p colp [MAX_NUM_COLS];
int ncols;
int nkeys;
int ro; /*db readonly flag*/
int logflags; /*flags indication what-where to journal log */
FILE* fp; /*jlog file pointer */
time_t t; /*jlog creation time */
ino_t ino;
} bdb_table_t, *bdb_table_p;
typedef struct _bdb_tcache
{
bdb_table_p dtp;
struct _bdb_tcache *prev;
struct _bdb_tcache *next;
} bdb_tcache_t, *bdb_tcache_p;
typedef struct _bdb_db
{
str name;
DB_ENV *dbenv;
bdb_tcache_p tables;
} bdb_db_t, *bdb_db_p;
typedef struct _bdb_params
{
u_int32_t cache_size;
int auto_reload;
int log_enable;
int journal_roll_interval;
} bdb_params_t, *bdb_params_p;
int bdblib_init(bdb_params_p _parms);
int bdblib_destroy(void);
int bdblib_close(bdb_db_p _db_p, str* _n);
int bdblib_reopen(bdb_db_p _db_p, str* _n);
int bdblib_recover(bdb_table_p _tp, int error_code);
void bdblib_log(int op, bdb_db_p _db, bdb_table_p _tp, char* _msg, int len);
int bdblib_create_dbenv(DB_ENV **dbenv, char* home);
int bdblib_create_journal(bdb_db_p _db_p, bdb_table_p _tp);
bdb_db_p bdblib_get_db(str *_s);
bdb_tcache_p bdblib_get_table(bdb_db_t *_db, str *_s);
bdb_table_p bdblib_create_table(bdb_db_t *_db, str *_s);
int bdb_db_free(bdb_db_p _dbp);
int bdb_tcache_free(bdb_tcache_p _tbc);
int bdb_table_free(bdb_table_p _tp);
int load_metadata_columns(bdb_table_p _tp);
int load_metadata_keys(bdb_table_p _tp);
int load_metadata_readonly(bdb_table_p _tp);
int load_metadata_logflags(bdb_table_p _tp);
int load_metadata_defaults(bdb_table_p _tp);
int bdblib_valtochar(bdb_table_p tp, db_fld_t *fld, int fld_count, char *kout,
int *klen, int ktype);
int bdb_is_database(char *dirpath);
int bdb_get_colpos(bdb_table_t *tp, char *name);
int bdb_str2int(char *s, int *v);
int bdb_str2double(char *s, double *v);
int bdb_str2time(char *s, time_t *v);
#endif
|