[KLF Application][KLF Tools][KLF Backend][KLF Home]
KLatexFormula Project

src/klflibdbengine.h

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   file klflibdbengine.h
00003  *   This file is part of the KLatexFormula Project.
00004  *   Copyright (C) 2010 by Philippe Faist
00005  *   philippe.faist at bluewin.ch
00006  *                                                                         *
00007  *   This program is free software; you can redistribute it and/or modify  *
00008  *   it under the terms of the GNU General Public License as published by  *
00009  *   the Free Software Foundation; either version 2 of the License, or     *
00010  *   (at your option) any later version.                                   *
00011  *                                                                         *
00012  *   This program is distributed in the hope that it will be useful,       *
00013  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00014  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00015  *   GNU General Public License for more details.                          *
00016  *                                                                         *
00017  *   You should have received a copy of the GNU General Public License     *
00018  *   along with this program; if not, write to the                         *
00019  *   Free Software Foundation, Inc.,                                       *
00020  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00021  ***************************************************************************/
00022 /* $Id: klflibdbengine.h 461 2010-08-24 14:24:08Z philippe $ */
00023 
00024 #ifndef KLFLIBDBENGINE_H
00025 #define KLFLIBDBENGINE_H
00026 
00027 #include <QSqlDatabase>
00028 #include <QSqlQuery>
00029 
00030 #include <klfdefs.h>
00031 #include <klflib.h>
00032 #include <klflibview.h> // KLFLibLocalFileSchemeGuesser
00033 
00035 
00040 class KLF_EXPORT KLFLibDBConnectionClassUser {
00041 public:
00042   KLFLibDBConnectionClassUser();
00043   virtual ~KLFLibDBConnectionClassUser();
00044 
00045   inline bool autoDisconnectDB() const { return pAutoDisconnectDB; }
00046   inline void setAutoDisconnectDB(bool autodisconnectDB) { pAutoDisconnectDB = autodisconnectDB; }
00047   inline QString dbConnectionName() const { return pDBConnectionName; }
00048   inline void setDBConnectionName(const QString& name) { pDBConnectionName = name; }
00049   
00050 protected:
00051   bool pAutoDisconnectDB;
00052   QString pDBConnectionName;
00053 };
00054 
00055 
00056 class KLFLibDBEnginePropertyChangeNotifier;
00057 
00072 class KLF_EXPORT KLFLibDBEngine : public KLFLibResourceEngine, private KLFLibDBConnectionClassUser
00073 {
00074   Q_OBJECT
00075 
00076 public:
00083   static KLFLibDBEngine * openUrl(const QUrl& url, QObject *parent = NULL);
00084 
00096   static KLFLibDBEngine * createSqlite(const QString& fileName, const QString& subresourcename,
00097                                        const QString& subresourcetitle, QObject *parent = NULL);
00098 
00099 
00102   virtual ~KLFLibDBEngine();
00103 
00104   virtual uint compareUrlTo(const QUrl& other, uint interestFlags = 0xfffffff) const;
00105 
00106   virtual bool compareDefaultSubResourceEquals(const QString& subResourceName) const;
00107 
00108   virtual bool canModifyData(const QString& subRes, ModifyType modifytype) const;
00109   virtual bool canModifyProp(int propid) const;
00110   virtual bool canRegisterProperty(const QString& propName) const;
00111 
00114   virtual bool validDatabase() const;
00116   virtual void setDatabase(const QSqlDatabase& db_connection);
00117 
00118 
00119   virtual QList<KLFLib::entryId> allIds(const QString& subResource);
00120   virtual bool hasEntry(const QString&, entryId id);
00121   virtual QList<KLFLibEntryWithId> entries(const QString&, const QList<KLFLib::entryId>& idList,
00122                                            const QList<int>& wantedEntryProperties = QList<int>());
00123 
00124   virtual int query(const QString& subResource, const Query& query, QueryResult *result);
00125   virtual QList<QVariant> queryValues(const QString& subResource, int entryPropId);
00126 
00127   virtual KLFLibEntry entry(const QString& subRes, entryId id);
00128   virtual QList<KLFLibEntryWithId> allEntries(const QString& subRes,
00129                                               const QList<int>& wantedEntryProperties = QList<int>());
00130 
00131   virtual bool canCreateSubResource() const;
00132   virtual bool canRenameSubResource() const { return false; }
00133   virtual bool canDeleteSubResource(const QString& subResource) const;
00134 
00135   virtual QVariant subResourceProperty(const QString& subResource, int propId) const;
00136 
00137   virtual QList<int> subResourcePropertyIdList() const
00138   { return QList<int>() << SubResPropTitle << SubResPropViewType << SubResPropLocked; }
00139 
00140   virtual bool hasSubResource(const QString& subRes) const;
00141   virtual QStringList subResourceList() const;
00142 
00143 public slots:
00144 
00145   virtual bool createSubResource(const QString& subResource, const QString& subResourceTitle);
00146   virtual bool deleteSubResource(const QString& subResource);
00147 
00148   virtual QList<entryId> insertEntries(const QString& subRes, const KLFLibEntryList& entries);
00149   virtual bool changeEntries(const QString& subRes, const QList<entryId>& idlist,
00150                              const QList<int>& properties, const QList<QVariant>& values);
00151   virtual bool deleteEntries(const QString& subRes, const QList<entryId>& idlist);
00152 
00153   virtual bool saveTo(const QUrl& newPath);
00154 
00155   virtual bool setSubResourceProperty(const QString& subResource, int propId, const QVariant& value);
00156 
00157 protected:
00158   virtual bool saveResourceProperty(int propId, const QVariant& value);
00159 
00160 private slots:
00163   void resourcePropertyUpdate(int propId);
00166   void subResourcePropertyUpdate(const QString& subResource, int propId);
00167 
00169 
00170   void readResourceProperty(int propId);
00171 
00172   void readDbMetaInfo();
00173 
00174   void readAvailColumns(const QString& subResource);
00175 
00176 private:
00177   KLFLibDBEngine(const QSqlDatabase& db, bool autoDisconnectDB, const QUrl& url,
00178                  bool accessshared, QObject *parent);
00179 
00180   QSqlDatabase pDB;
00181 
00182   int pDBVersion;
00183 
00185   QMap<QString,QStringList> pDBAvailColumns;
00186   
00187   QStringList columnNameList(const QString& subResource, const QList<int>& entryPropList,
00188                              bool wantIdFirst = true);
00189   QStringList detectEntryColumns(const QSqlQuery& q);
00190   KLFLibEntry readEntry(const QSqlQuery& q, const QStringList& columns);
00191 
00192   QVariant dbMakeEntryPropertyValue(const QVariant& entryValue, int entryPropertyId);
00193   QVariant dbReadEntryPropertyValue(const QVariant& dbdata, int entryPropertyId);
00194 
00195   QVariant convertVariantToDBData(const QVariant& value) const;
00196   QVariant convertVariantFromDBData(const QVariant& dbdata) const;
00197   QVariant encaps(const char *ts, const QString& data) const;
00198   QVariant encaps(const char *ts, const QByteArray& data) const;
00199   QVariant decaps(const QString& string) const;
00200   QVariant decaps(const QByteArray& data) const;
00201 
00202   bool ensureDataTableColumnsExist(const QString& subResource, const QStringList& columnList);
00205   bool ensureDataTableColumnsExist(const QString& subResource);
00206 
00208   static bool initFreshDatabase(QSqlDatabase db);
00211   static bool createFreshDataTable(QSqlDatabase db, const QString& subresource);
00212 
00213   bool tableExists(const QString& subResource) const;
00214 
00215   static QString dataTableName(const QString& subResource);
00216   static QString quotedDataTableName(const QString& subResource);
00217 
00218   static QMap<QString,KLFLibDBEnginePropertyChangeNotifier*> pDBPropertyNotifiers;
00219   static KLFLibDBEnginePropertyChangeNotifier *dbPropertyNotifierInstance(const QString& dbname);
00220 };
00221 
00222 
00223 
00224 class KLF_EXPORT KLFLibDBLocalFileSchemeGuesser : public QObject, public KLFLibLocalFileSchemeGuesser
00225 {
00226 public:
00227   KLFLibDBLocalFileSchemeGuesser(QObject *parent) : QObject(parent) { }
00228 
00229   QString guessScheme(const QString& fileName) const;
00230 };
00231 
00232 
00234 class KLF_EXPORT KLFLibDBEngineFactory : public KLFLibEngineFactory
00235 {
00236   Q_OBJECT
00237 public:
00238   KLFLibDBEngineFactory(QObject *parent = NULL);
00239   virtual ~KLFLibDBEngineFactory() { }
00240 
00241   virtual QStringList supportedTypes() const;
00242   virtual QString schemeTitle(const QString& scheme) const ;
00243   virtual uint schemeFunctions(const QString& scheme) const ;
00244 
00245   virtual QString correspondingWidgetType(const QString& scheme) const;
00246   virtual KLFLibResourceEngine *openResource(const QUrl& location, QObject *parent = NULL);
00247 
00248   virtual KLFLibResourceEngine *createResource(const QString& scheme, const Parameters& parameters,
00249                                                QObject *parent = NULL);
00250 };
00251 
00252 
00253 
00254 #endif

Generated by doxygen 1.7.3