File indexing completed on 2024-12-01 13:00:26

0001 /* This file is part of the KDE project
0002    Copyright (C) 2005 Jarosław Staniek <staniek@kde.org>
0003 
0004    This program is free software; you can redistribute it and/or
0005    modify it under the terms of the GNU Library General Public
0006    License as published by the Free Software Foundation; either
0007    version 2 of the License, or (at your option) any later version.
0008 
0009    This program is distributed in the hope that it will be useful,
0010    but WITHOUT ANY WARRANTY; without even the implied warranty of
0011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0012    Library General Public License for more details.
0013 
0014    You should have received a copy of the GNU Library General Public License
0015    along with this program; see the file COPYING.  If not, write to
0016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0017  * Boston, MA 02110-1301, USA.
0018 */
0019 
0020 #ifndef KDB_CONNECTION_P_H
0021 #define KDB_CONNECTION_P_H
0022 
0023 #include "KDbConnectionData.h"
0024 #include "KDbConnection.h"
0025 #include "KDbConnectionOptions.h"
0026 #include "kdb_export.h"
0027 #include "KDbParser.h"
0028 #include "KDbProperties.h"
0029 #include "KDbQuerySchema_p.h"
0030 #include "KDbVersionInfo.h"
0031 
0032 //! Interface for accessing connection's internal result, for use by drivers.
0033 class KDB_EXPORT KDbConnectionInternal
0034 {
0035 public:
0036     explicit KDbConnectionInternal(KDbConnection *conn);
0037     KDbConnection* const connection;
0038 private:
0039     Q_DISABLE_COPY(KDbConnectionInternal)
0040 };
0041 
0042 class KDbConnectionPrivate
0043 {
0044     Q_DECLARE_TR_FUNCTIONS(KDbConnectionPrivate)
0045 public:
0046     KDbConnectionPrivate(KDbConnection* const conn, KDbDriver *drv,
0047                          const KDbConnectionData& _connData,
0048                          const KDbConnectionOptions &_options);
0049 
0050     ~KDbConnectionPrivate();
0051 
0052     void deleteAllCursors();
0053 
0054     void errorInvalidDBContents(const QString& details);
0055 
0056     QString strItIsASystemObject() const;
0057 
0058     inline KDbParser *parser() {
0059         return m_parser ? m_parser : (m_parser = new KDbParser(conn));
0060     }
0061 
0062     inline KDbTableSchema* table(const QString& name) const {
0063         return m_tablesByName.value(name);
0064     }
0065 
0066     inline KDbTableSchema* table(int id) const {
0067         return m_tables.value(id);
0068     }
0069 
0070     //! used just for removing system KDbTableSchema objects on db close.
0071     inline QSet<KDbInternalTableSchema*> internalKDbTables() const {
0072         return m_internalKDbTables;
0073     }
0074 
0075     /*! Allocates all needed table KDb system objects for kexi__* KDb library's
0076      system tables schema.
0077      These objects are used internally in this connection and are added to list of tables
0078      (by name,      not by id because these have no ids).
0079     */
0080     void setupKDbSystemSchema();
0081 
0082     void insertTable(KDbTableSchema* tableSchema);
0083 
0084     /*! Removes table schema having identifier @a id from internal structures and destroys it.
0085      Does not make any change at the backend. */
0086     void removeTable(int id);
0087 
0088     void takeTable(KDbTableSchema* tableSchema);
0089 
0090     void renameTable(KDbTableSchema* tableSchema, const QString& newName);
0091 
0092     void changeTableId(KDbTableSchema* tableSchema, int newId);
0093 
0094     void clearTables();
0095 
0096     inline KDbQuerySchema* query(const QString& name) const {
0097         return m_queriesByName.value(name);
0098     }
0099 
0100     inline KDbQuerySchema* query(int id) const {
0101         return m_queries.value(id);
0102     }
0103 
0104     void insertQuery(KDbQuerySchema* query);
0105 
0106     /*! Removes @a querySchema from internal structures and
0107      destroys it. Does not make any change at the backend. */
0108     void removeQuery(KDbQuerySchema* querySchema);
0109 
0110     void setQueryObsolete(KDbQuerySchema* query);
0111 
0112     void clearQueries();
0113 
0114     /*! @return a full table schema for a table retrieved using 'kexi__*' system tables.
0115      Connection keeps ownership of the returned object.
0116      Used internally by tableSchema() methods.
0117      On failure deletes @a table and returns @c nullptr. */
0118     Q_REQUIRED_RESULT KDbTableSchema *setupTableSchema(KDbTableSchema *table);
0119 
0120     /*! @return a full query schema for a query using 'kexi__*' system tables.
0121      Connection keeps ownership of the returned object.
0122      Used internally by querySchema() methods.
0123      On failure deletes @a query and returns @c nullptr. */
0124     Q_REQUIRED_RESULT KDbQuerySchema *setupQuerySchema(KDbQuerySchema *query);
0125 
0126     //! @return cached fields expanded information for @a query
0127     KDbQuerySchemaFieldsExpanded *fieldsExpanded(const KDbQuerySchema *query);
0128 
0129     //! Inserts cached fields expanded information for @a query
0130     void insertFieldsExpanded(const KDbQuerySchema *query, KDbQuerySchemaFieldsExpanded *cache);
0131 
0132     //! Removes cached fields expanded information for @a query
0133     void removeFieldsExpanded(const KDbQuerySchema *query);
0134 
0135     KDbConnection* const conn; //!< The @a KDbConnection instance this @a KDbConnectionPrivate belongs to.
0136     KDbConnectionData connData; //!< the @a KDbConnectionData used within that connection.
0137 
0138     //! True for read only connection. Used especially for file-based drivers.
0139     KDbConnectionOptions options;
0140 
0141     //!< The driver this @a KDbConnection instance uses.
0142     KDbDriver * const driver;
0143 
0144     /*! Default transaction handle.
0145     If transactions are supported: Any operation on database (e.g. inserts)
0146     that is started without specifying transaction context, will be performed
0147     in the context of this transaction. */
0148     KDbTransaction default_trans;
0149     QList<KDbTransaction> transactions;
0150 
0151     QHash<const KDbTableSchema*, QSet<KDbTableSchemaChangeListener*>* > tableSchemaChangeListeners;
0152 
0153     QHash<const KDbQuerySchema*, QSet<KDbTableSchemaChangeListener*>* > queryTableSchemaChangeListeners;
0154 
0155     //! Used in KDbConnection::setQuerySchemaObsolete( const QString& queryName )
0156     //! to collect obsolete queries. THese are deleted on connection deleting.
0157     QSet<KDbQuerySchema*> obsoleteQueries;
0158 
0159     //! server version information for this connection.
0160     KDbServerVersionInfo serverVersion;
0161 
0162     //! Database version information for this connection.
0163     KDbVersionInfo databaseVersion;
0164 
0165     KDbParser *m_parser = nullptr;
0166 
0167     //! cursors created for this connection
0168     QSet<KDbCursor*> cursors;
0169 
0170     //! Database properties
0171     KDbProperties dbProperties;
0172 
0173     QString availableDatabaseName; //!< used by anyAvailableDatabaseName()
0174     QString usedDatabase; //!< database name that is opened now (the currentDatabase() name)
0175 
0176     //! true if rollbackTransaction() and commitTransaction() shouldn't remove
0177     //! the transaction object from 'transactions' list; used by closeDatabase()
0178     bool dontRemoveTransactions = false;
0179 
0180     //! used to avoid endless recursion between useDatabase() and databaseExists()
0181     //! when useTemporaryDatabaseIfNeeded() works
0182     bool skipDatabaseExistsCheckInUseDatabase = false;
0183 
0184     /*! Used when single transactions are only supported (KDbDriver::SingleTransactions).
0185      True value means default KDbTransaction has been started inside connection object
0186      (by beginAutoCommitTransaction()), otherwise default transaction has been started outside
0187      of the object (e.g. before createTable()), so we shouldn't autocommit the transaction
0188      in commitAutoCommitTransaction(). Also, beginAutoCommitTransaction() doesn't restarts
0189      transaction if default_trans_started_inside is false. Such behavior allows user to
0190      execute a sequence of actions like CREATE TABLE...; INSERT DATA...; within a single transaction
0191      and commit it or rollback by hand. */
0192     bool defaultTransactionStartedInside = false;
0193 
0194     bool isConnected = false;
0195 
0196     bool autoCommit = true;
0197 
0198     bool insideCloseDatabase = false; //!< helper: true while closeDatabase() is executed
0199 
0200 private:
0201     //! Table schemas retrieved on demand with tableSchema()
0202     QHash<int, KDbTableSchema*> m_tables;
0203     QHash<QString, KDbTableSchema*> m_tablesByName;
0204     //! used just for removing system KDbTableSchema objects on db close.
0205     QSet<KDbInternalTableSchema*> m_internalKDbTables;
0206     //! Query schemas retrieved on demand with querySchema()
0207     QHash<int, KDbQuerySchema*> m_queries;
0208     QHash<QString, KDbQuerySchema*> m_queriesByName;
0209     KDbUtils::AutodeletedHash<const KDbQuerySchema*, KDbQuerySchemaFieldsExpanded*> m_fieldsExpandedCache;
0210     Q_DISABLE_COPY(KDbConnectionPrivate)
0211 };
0212 
0213 #endif