/* $Id: storage_driver.h,v 1.22 2011/06/28 00:13:48 sbajic Exp $ */
/*
DSPAM
COPYRIGHT (C) 2002-2012 DSPAM PROJECT
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
#ifdef HAVE_CONFIG_H
#include
#endif
#ifndef _STORAGE_DRIVER_H
# define _STORAGE_DRIVER_H
#include "libdspam_objects.h"
#include "diction.h"
#include "pref.h"
#include "config_shared.h"
#ifdef DAEMON
#include
#endif
/*
* _ds_drv_connection: a storage resource for a server worker thread
* in stateful (daemon) mode, the storage driver may create a series
* of _ds_drv_connections which are then pooled into a series of worker
* threads. depending on the locking paradigm (mutex or rwlock), one
* connection may or may not service multiple threads simultaneously.
* connections usually contain stateful resources such as connections to
* a backend database or in the case of hash_drv, pointers to an mmap'd
* portion of memory.
*/
struct _ds_drv_connection
{
void *dbh;
#ifdef DAEMON
pthread_mutex_t lock;
pthread_rwlock_t rwlock;
#endif
};
/*
* DRIVER_CTX: storage driver context
* a single storage driver context is used to pool connection resources,
* set driver behavior (e.g. locking paradigm), and most importantly connect
* to the dspam context being used by the worker thread.
*/
typedef struct {
DSPAM_CTX *CTX; /* IN */
int status; /* OUT */
int flags; /* IN */
int connection_cache; /* IN */
struct _ds_drv_connection **connections; /* OUT */
} DRIVER_CTX;
/*
* _ds_storage_record: dspam-facing storage structure
* the _ds_storage_record structure is a common structure passed between
* libdspam and the storage abstraction layer. each instance represents a
* single token in a diction. once the storage driver has it, it can create
* its own internal structures, but must pass this structure back and forth
* to libdspam.
*/
struct _ds_storage_record
{
unsigned long long token;
long spam_hits;
long innocent_hits;
time_t last_hit;
};
/*
* _ds_storage_signature: dspam-facing signature structure
* the _ds_storage_signature structure is a common structure passed between
* libdspam and the storage abstraction layer. the signature represents
* binary training data used later for reclassification of errors. once the
* storage driver has it, it can create its own internal structures, but
* must pass this structure back and forth to libdspam.
*/
struct _ds_storage_signature
{
char signature[256];
void *data;
long length;
time_t created_on;
};
int dspam_init_driver (DRIVER_CTX *DTX);
int dspam_shutdown_driver (DRIVER_CTX *DTX);
int _ds_init_storage (DSPAM_CTX * CTX, void *dbh);
int _ds_shutdown_storage (DSPAM_CTX * CTX);
void *_ds_connect (DSPAM_CTX *CTX);
int _ds_getall_spamrecords (DSPAM_CTX * CTX, ds_diction_t diction);
int _ds_setall_spamrecords (DSPAM_CTX * CTX, ds_diction_t diction);
int _ds_delall_spamrecords (DSPAM_CTX * CTX, ds_diction_t diction);
int _ds_get_spamrecord(
DSPAM_CTX * CTX,
unsigned long long token,
struct _ds_spam_stat *stat);
int _ds_set_spamrecord(
DSPAM_CTX * CTX,
unsigned long long token,
struct _ds_spam_stat *stat);
int _ds_del_spamrecord(
DSPAM_CTX * CTX,
unsigned long long token);
struct _ds_storage_record *_ds_get_nexttoken (DSPAM_CTX * CTX);
struct _ds_storage_signature *_ds_get_nextsignature (DSPAM_CTX * CTX);
char *_ds_get_nextuser (DSPAM_CTX * CTX);
int _ds_delete_signature(
DSPAM_CTX * CTX,
const char *signature);
int _ds_get_signature(
DSPAM_CTX * CTX,
struct _ds_spam_signature *SIG,
const char *signature);
int _ds_set_signature(
DSPAM_CTX * CTX,
struct _ds_spam_signature *SIG,
const char *signature);
int _ds_verify_signature(
DSPAM_CTX * CTX,
const char *signature);
int _ds_create_signature_id(
DSPAM_CTX * CTX,
char *buf,
size_t len);
/*
* Storage Driver Preferences Extension
* When defined, the built-in preferences functions are overridden with
* functions specific to the storage driver. This allows preferences to be
* alternatively stored in the storage facility instead of flat files.
* The selected storage driver must support preference extensions.
*/
agent_pref_t _ds_pref_load(
config_t config,
const char *user,
const char *home, void *dbh);
int _ds_pref_set(
config_t config,
const char *user,
const char *home,
const char *attrib,
const char *value,
void *dbh);
int _ds_pref_del(
config_t config,
const char *user,
const char *home,
const char *attrib,
void *dbh);
/* Driver context flags */
#define DRF_STATEFUL 0x01
#define DRF_RWLOCK 0x02
/* Driver statuses */
#define DRS_ONLINE 0x01
#define DRS_OFFLINE 0x02
#define DRS_UNKNOWN 0xFF
#define CONTROL_TOKEN 11624422384514212933llu
/* $$CONTROL$$ */
#endif /* _STORAGE_DRIVER_H */