diff options
Diffstat (limited to 'kbabel/kbabeldict/modules/dbsearchengine/database.h')
-rw-r--r-- | kbabel/kbabeldict/modules/dbsearchengine/database.h | 329 |
1 files changed, 329 insertions, 0 deletions
diff --git a/kbabel/kbabeldict/modules/dbsearchengine/database.h b/kbabel/kbabeldict/modules/dbsearchengine/database.h new file mode 100644 index 00000000..bf4767df --- /dev/null +++ b/kbabel/kbabeldict/modules/dbsearchengine/database.h @@ -0,0 +1,329 @@ +/*************************************************************************** + database.h - + ------------------- + begin : Fri Sep 8 2000 + copyright : (C) 2000 by Andrea Rizzi + email : rizzi@kde.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program 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. * + * * + * * + * In addition, as a special exception, the copyright holders give * + * permission to link the code of this program with any edition of * + * the Qt library by Trolltech AS, Norway (or with modified versions * + * of Qt that use the same license as Qt), and distribute linked * + * combinations including the two. You must obey the GNU General * + * Public License in all respects for all of the code used other than * + * Qt. If you modify this file, you may extend this exception to * + * your version of the file, but you are not obligated to do so. If * + * you do not wish to do so, delete this exception statement from * + * your version. * + ***************************************************************************/ +/* + Translation search engine + + + Copyright 2000 + Andrea Rizzi rizzi@kde.org + +*/ + + +#ifndef _DATABASE_H_ +#define _DATABASE_H_ + +#include <config.h> + +#ifdef USE_DB_H_PATH +#include USE_DB_H_PATH +#else +#ifdef HAVE_DB4_DB_H +#include <db4/db.h> +#else +#include <db.h> +#endif +#endif + +#define uint32 u_int32_t + +#include <qvaluelist.h> +#include <qptrlist.h> +#include <qstring.h> +#include <qobject.h> +#include <qdatetime.h> +#include <qcstring.h> //bytearray + + +class WordItem // Returned by getWordLocations +{ + public: + + WordItem(char *data,QString w); + WordItem(QString w); + //WordItem(const WordItem &wi); + //WordItem& operator=(const WordItem & wi ); + + //The word (key in database) + QString word; + //Sorted locations + //QByteArray locations; //too many problems with this.. + //NOTE: + //This is allocated only if you call WordItem(char *data,QString w); + //YOU MUST FREE IT when you do not need it anymore + //No destructor will do it !!! + + uint32 *locations; + + + uint32 count; + //Is this word common ? + int score; + + bool notFound(); +}; + + +class InfoItem +{ + public: + + //Create the NO INFO item + InfoItem(); + + // Create an info item from raw data + InfoItem(const char *rawData,QString lang); + + QString catalogName; + QString lastFullPath; + + QString lastTranslator; + QDateTime revisionDate; + QString charset; + QString language; + + + int size(); + void rawData(char *); + +}; + +class TranslationItem +{ + public: + QString translation; + QValueList<int> infoRef; + uint32 numRef; + +}; + +class DataBaseItem +{ + public: + /* + Create empty class; + */ + DataBaseItem(); + + /* + Create a DataBaseItem from raw data + */ + DataBaseItem(char *_key,char *_data); + + /* + return the size (in raw data) of this item. + */ + uint32 sizeData(); + uint32 sizeKey(); + + bool isNull() { return (numTra==0); } + + /* + You MUST allocate data of sizeData() byte. + */ + void toRawData(char *_data); + void toRawKey(char *_key); + + QString key; + QValueList<TranslationItem> translations; + uint32 numTra; + uint32 location; +}; + +class DataBaseManager : public QObject +{ + + Q_OBJECT + + public: + /* + Main constructor. + directory is the name of the directory where the database structre + is stored. + + DIRECTORY/translations.$LANG.db The trasnaltion archive + DIRECTORY/catalogsinfo.$LANG.db Info about catalogs + + //Not yet implemented + DIRECTORY/wordsindex.$LANG.db Index of words + + + */ + + DataBaseManager(QString directory,QString lang,QObject *parent=0,const char *name=0); + ~DataBaseManager(); + /* + Create a new databse structure. + + */ + int createDataBase(QString directory,QString language,int mode=0664); + + + + + /* + Put a DataBaseItem into the database. + + if ow==false enter the new DataBaseItem only + if the key of DataBaseItem does not previously exist + + It also update the wordIndex. + + */ + + int putItem(DataBaseItem *item,bool ow=false); + + DataBaseItem getItem(QString key); + + /* + @return the first entry in the database. + */ + + DataBaseItem firstItem(); + + /* + @return the current entry of the database. + */ + + DataBaseItem currentItem(); + + /* + @return the next entry in the database. + */ + + DataBaseItem nextItem(); + + + /* + * Add a new translation to the database + * catalog is a valid catalog refnum (use catalogRef to get one) + * if ow is true a translation of a key coming from catalog is + * overwritten if you provide a new translation + */ + + int putNewTranslation(QString key,QString tran,int catalog,bool ow=true); + + /* + @return info about catalog n + */ + + InfoItem getCatalogInfo(int n); + + /* + Add an entry to catalogsinfo database and + @return a refnum for the new added item + */ + + int addCatalogInfo(InfoItem *catInfo,int); + + /* + Search an Item with the same "location" and + @return its refnum. + */ + + int searchCatalogInfo(QString location); + + /* Get a catalog info for location, + * if it doesn't exist it will create one. + * @return the refnum + */ + + int catalogRef(QString location,QString author,QString path); + + /* + Put at refnum the catInfo + @return true if everything is OK + */ + + bool putCatalogInfo(int refnum, InfoItem *catInfo); + + /* + Get word info + */ + WordItem getWordLocations(QString word); + + /* + Add a location for word + */ + bool addLocation(QString word, unsigned int location); + + /* + Remove location for word + */ + bool removeLocation(QString word, int location); + + + /* + * Rebuild location and word indexes + */ + void rebuildIndexes(); + + uint32 appendKey(class QString); + + QString getKey(uint32 n); + + /* + Load the catalogs info. + */ + void loadInfo(); + + + void sync(); + + bool isOk(); + int count(); + int current(); + + void openDataBase(); + void closeDataBase(); + + static QValueList<QString> wordsIn(QString string); + + signals: + + void cannotOpenDB(int); + + + protected: + DataBaseItem cursorGet(uint32 flags); + + QString language; + QString basedir; + QValueList<InfoItem> info; + + DB *db,*infoDb,*wordDb,*indexDb; + DBC *cursor; + bool iAmOk; + bool indexOk; //Database could word without word index +}; + + + + + +#endif |