00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
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>
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