You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
klamav/src/collectiondb.h

214 lines
7.1 KiB

// (c) 2004 Mark Kretschmann <markey@web.de>
// (c) 2004 Christian Muehlhaeuser <chris@chris.de>
// (c) 2004 Sami Nieminen <sami.nieminen@iki.fi>
// (c) 2005 Ian Monroe <ian@monroe.nu>
// See COPYING file for licensing information.
#ifndef KLAMAV_COLLECTIONDB_H
#define KLAMAV_COLLECTIONDB_H
#include <kurl.h>
#include <qdir.h> //stack allocated
#include <qimage.h>
#include <qobject.h> //baseclass
#include <qptrqueue.h> //baseclass
#include <qsemaphore.h> //stack allocated
#include <qstringlist.h> //stack allocated
class DbConnection;
class DbConnectionPool;
class DbConfig
{};
class SqliteConfig : public DbConfig
{
public:
SqliteConfig( const QString& /* dbfile */ );
const QString dbFile() const { return m_dbfile; }
private:
QString m_dbfile;
};
class DbConnection
{
public:
enum DbConnectionType { sqlite = 0, mysql = 1, postgresql = 2 };
DbConnection( DbConfig* /* config */ );
virtual ~DbConnection() = 0;
virtual QStringList query( const QString& /* statement */ ) = 0;
virtual int insert( const QString& /* statement */, const QString& /* table */ ) = 0;
const bool isInitialized() const { return m_initialized; }
virtual bool isConnected() const = 0;
virtual const QString lastError() const { return "None"; }
protected:
bool m_initialized;
DbConfig *m_config;
};
typedef struct sqlite3 sqlite3;
typedef struct sqlite3_context sqlite3_context;
typedef struct Mem sqlite3_value;
class SqliteConnection : public DbConnection
{
public:
SqliteConnection( SqliteConfig* /* config */ );
~SqliteConnection();
QStringList query( const QString& /* statement */ );
int insert( const QString& /* statement */, const QString& /* table */ );
bool isConnected()const { return true; }
private:
static void sqlite_rand(sqlite3_context *context, int /*argc*/, sqlite3_value ** /*argv*/);
static void sqlite_power(sqlite3_context *context, int argc, sqlite3_value **argv);
sqlite3* m_db;
};
class DbConnectionPool : QPtrQueue<DbConnection>
{
public:
DbConnectionPool( bool temporary );
~DbConnectionPool();
const DbConnection::DbConnectionType getDbConnectionType() const { return m_dbConnType; }
const DbConfig *getDbConfig() const { return m_dbConfig; }
void createDbConnections();
DbConnection *getDbConnection();
void putDbConnection( const DbConnection* /* conn */ );
QString escapeString( QString string )
{
return
string.replace( '\'', "''" );
}
private:
static const int POOL_SIZE = 5;
bool m_isTemporary;
QSemaphore m_semaphore;
DbConnection::DbConnectionType m_dbConnType;
DbConfig *m_dbConfig;
};
class CollectionDB : public QObject
{
Q_OBJECT
signals:
public:
CollectionDB( bool temporary = false );
~CollectionDB();
static CollectionDB *instance();
const QString escapeString( const QString &string ) { return m_dbConnPool->escapeString(string); }
const QString boolT() { if (m_dbConnPool->getDbConnectionType() == DbConnection::postgresql) return "'t'"; else return "1"; }
const QString boolF() { if (m_dbConnPool->getDbConnectionType() == DbConnection::postgresql) return "'f'"; else return "0"; }
const QString textColumnType() { if ( m_dbConnPool->getDbConnectionType() == DbConnection::postgresql ) return "TEXT"; else return "VARCHAR(255)"; }
const QString textColumnType(int length){ if ( m_dbConnPool->getDbConnectionType() == DbConnection::postgresql ) return "TEXT"; else return QString("VARCHAR(%1)").arg(length); }
// We might consider using LONGTEXT type, as some lyrics could be VERY long..???
const QString longTextColumnType() { if ( m_dbConnPool->getDbConnectionType() == DbConnection::postgresql ) return "TEXT"; else return "TEXT"; }
const QString randomFunc() { if ( m_dbConnPool->getDbConnectionType() == DbConnection::postgresql ) return "random()"; else return "RAND()"; }
int getType() { return m_dbConnPool->getDbConnectionType(); }
/**
* This method returns a static DbConnection for components that want to use
* the same connection for the whole time. Should not be used anywhere else
* but in CollectionReader.
*
* @return static DbConnection
*/
DbConnection *getStaticDbConnection();
/**
* Returns the DbConnection back to connection pool.
*
* @param conn DbConnection to be returned
*/
void returnStaticDbConnection( DbConnection *conn );
//sql helper methods
QStringList query( const QString& statement, DbConnection *conn = NULL );
int insert( const QString& statement, const QString& table, DbConnection *conn = NULL );
//table management methods
bool isEmpty();
bool isValid(const QString &column, const QString &table);
void createTables( DbConnection *conn = NULL );
void createActivityTable( DbConnection *conn = NULL );
void createMetaDBTable( DbConnection *conn = NULL );
void loadMetaDBTable( DbConnection *conn = NULL );
void dropTables( DbConnection *conn = NULL );
void clearTables( DbConnection *conn = NULL );
void moveTempTables( DbConnection *conn );
QString typeCount( const QString &type_id );
QStringList messagesForType( const QString &type_id, const bool isValue );
QStringList allActivity( );
QStringList allActivityOfType(const QString &type, const QString &days );
void insertEvent(const QString &type, const QString &event,const QString &file = NULL, DbConnection *conn = NULL );
void expireActivity(const QString &days );
void insertMetaDBEntry(const QString &date, const QString &submission, const QString &creator,const QString &virus,const QString &alias, const QString &sender,DbConnection *conn = NULL);
QString latestMetaDBDate( );
protected:
QCString md5sum( const QString& artist, const QString& album, const QString& file = QString::null );
/** Manages regular folder monitoring scan */
public slots:
private slots:
private:
//bump DATABASE_VERSION whenever changes to the table structure are made. will remove old db file.
static const int DATABASE_VERSION = 20;
static const int DATABASE_STATS_VERSION = 3;
static const int MONITOR_INTERVAL = 60; //sec
static const bool DEBUGSQL = false;
void initialize();
void destroy();
//general management methods
uint IDFromValue( QString name, QString value, bool autocreate = true, const bool temporary = false,
const bool updateSpelling = false, DbConnection *conn = NULL );
QString valueFromID( QString table, uint id );
//member variables
DbConnectionPool *m_dbConnPool;
bool m_isTemporary;
bool m_monitor;
};
#endif /* KLAMAV_COLLECTIONDB_H */