diff --git a/src/core/kexidataiteminterface.h b/src/core/kexidataiteminterface.h --- a/src/core/kexidataiteminterface.h +++ b/src/core/kexidataiteminterface.h @@ -26,6 +26,7 @@ #include "kexicore_export.h" class KexiDataItemInterface; +class KDbConnection; class KDbField; class KDbQueryColumnInfo; @@ -81,7 +82,7 @@ virtual KDbQueryColumnInfo* columnInfo() = 0; //! Used internally to set column information. - virtual void setColumnInfo(KDbQueryColumnInfo* cinfo) = 0; + virtual void setColumnInfo(KDbConnection *conn, KDbQueryColumnInfo* cinfo) = 0; //! Sets listener. No need to reimplement this. virtual void installListener(KexiDataItemChangesListener* listener); diff --git a/src/migration/KexiSqlMigrate.cpp b/src/migration/KexiSqlMigrate.cpp --- a/src/migration/KexiSqlMigrate.cpp +++ b/src/migration/KexiSqlMigrate.cpp @@ -137,7 +137,7 @@ if (!result) { return false; } - const KDbQueryColumnInfo::Vector fieldsExpanded(dstTable->query()->fieldsExpanded()); + const KDbQueryColumnInfo::Vector fieldsExpanded(dstTable->query()->fieldsExpanded(destConn)); const int numFields = qMin(fieldsExpanded.count(), result->fieldsCount()); Q_FOREVER { QSharedPointer record = result->fetchRecord(); diff --git a/src/plugins/forms/kexiformview.cpp b/src/plugins/forms/kexiformview.cpp --- a/src/plugins/forms/kexiformview.cpp +++ b/src/plugins/forms/kexiformview.cpp @@ -709,17 +709,18 @@ deleteQuery(); } else { - qDebug() << d->query->parameters(); + qDebug() << d->query->parameters(conn); // like in KexiQueryView::executeQuery() QList params; { KexiUtils::WaitCursorRemover remover; - params = KexiQueryParameters::getParameters(this, *conn->driver(), d->query, &ok); + params = KexiQueryParameters::getParameters(this, conn, d->query, &ok); } if (ok) //input cancelled d->cursor = conn->executeQuery(d->query, params); } - d->scrollView->invalidateDataSources(invalidSources, d->query); + d->scrollView->invalidateDataSources( + invalidSources, d->cursor ? d->cursor->connection() : nullptr, d->query); ok = d->cursor != 0; } diff --git a/src/plugins/forms/widgets/kexidbautofield.h b/src/plugins/forms/widgets/kexidbautofield.h --- a/src/plugins/forms/widgets/kexidbautofield.h +++ b/src/plugins/forms/widgets/kexidbautofield.h @@ -83,7 +83,7 @@ virtual void setDataSourcePluginId(const QString &pluginId) { KexiFormDataItemInterface::setDataSourcePluginId(pluginId); } - virtual void setColumnInfo(KDbQueryColumnInfo* cinfo); + void setColumnInfo(KDbConnection *conn, KDbQueryColumnInfo* cinfo) override; virtual void setInvalidState(const QString& text); virtual bool isReadOnly() const; @@ -208,7 +208,7 @@ void setLabelPositionInternal(LabelPosition position, bool noLabel); //! Used by KexiDBAutoField::setColumnInfo() and KexiDBComboBox::setColumnInfo() - void setColumnInfoInternal(KDbQueryColumnInfo* cinfo, KDbQueryColumnInfo* visibleColumnInfo); + void setColumnInfoInternal(KDbQueryColumnInfo *cinfo, KDbQueryColumnInfo *visibleColumnInfo); private: class Private; diff --git a/src/plugins/forms/widgets/kexidbautofield.cpp b/src/plugins/forms/widgets/kexidbautofield.cpp --- a/src/plugins/forms/widgets/kexidbautofield.cpp +++ b/src/plugins/forms/widgets/kexidbautofield.cpp @@ -63,6 +63,7 @@ QBrush textBrush; //!< needed because for unbound mode editor==0 bool autoCaption; bool focusPolicyChanged; + KDbConnection *conn = nullptr; }; //------------------------------------- @@ -182,7 +183,7 @@ } KexiFormDataItemInterface *formIface = dynamic_cast(newSubwidget); if (formIface) { - formIface->setColumnInfo(columnInfo()); //needed at least by KexiDBImageBox + formIface->setColumnInfo(d->conn, columnInfo()); //needed at least by KexiDBImageBox formIface->setVisibleColumnInfo(visibleColumnInfo()); //needed at least by KexiDBComboBox } newSubwidget->setProperty("dataSource", dataSource()); //needed at least by KexiDBImageBox @@ -484,14 +485,15 @@ } void -KexiDBAutoField::setColumnInfo(KDbQueryColumnInfo* cinfo) +KexiDBAutoField::setColumnInfo(KDbConnection *conn, KDbQueryColumnInfo* cinfo) { - KexiFormDataItemInterface::setColumnInfo(cinfo); + KexiFormDataItemInterface::setColumnInfo(conn, cinfo); + d->conn = conn; setColumnInfoInternal(cinfo, cinfo); } -void -KexiDBAutoField::setColumnInfoInternal(KDbQueryColumnInfo* cinfo, KDbQueryColumnInfo* visibleColumnInfo) +void KexiDBAutoField::setColumnInfoInternal(KDbQueryColumnInfo *cinfo, + KDbQueryColumnInfo *visibleColumnInfo) { // change widget type depending on field type if (d->widgetType_property == Auto) { @@ -517,7 +519,7 @@ KexiFormDataItemInterface *iface = dynamic_cast((QWidget*)subwidget()); if (iface) - iface->setColumnInfo(visibleColumnInfo); + iface->setColumnInfo(d->conn, visibleColumnInfo); } //static @@ -624,7 +626,7 @@ { KexiFormDataItemInterface::setDataSource(ds); if (ds.isEmpty()) { - setColumnInfo(0); + setColumnInfo(d->conn, nullptr); } } @@ -811,4 +813,3 @@ return true; return false; } - diff --git a/src/plugins/forms/widgets/kexidbcombobox.h b/src/plugins/forms/widgets/kexidbcombobox.h --- a/src/plugins/forms/widgets/kexidbcombobox.h +++ b/src/plugins/forms/widgets/kexidbcombobox.h @@ -67,7 +67,7 @@ //! Reimplemented after KexiDBAutoField: jsut sets \a cinfo without initializing a subwidget. //! Initialization is performed by \ref setVisibleColumnInfo(). - virtual void setColumnInfo(KDbQueryColumnInfo* cinfo); + void setColumnInfo(KDbConnection *conn, KDbQueryColumnInfo* cinfo) override; /*! Used internally to set visible database column information. Reimplemented: performs initialization of the subwidget. */ @@ -166,6 +166,9 @@ Also used for grabbing page down/up keys. */ virtual bool keyPressed(QKeyEvent *ke); + //! Implemented for KexiComboBoxBase + KDbConnection *connection() override; + class Private; Private * const d; }; diff --git a/src/plugins/forms/widgets/kexidbcombobox.cpp b/src/plugins/forms/widgets/kexidbcombobox.cpp --- a/src/plugins/forms/widgets/kexidbcombobox.cpp +++ b/src/plugins/forms/widgets/kexidbcombobox.cpp @@ -51,6 +51,7 @@ ~Private() { } + KDbConnection *connection = nullptr; KexiComboBoxPopup *popup; KComboBox *paintedCombo; //!< fake combo used only to pass it as 'this' for QStyle (because styles use ) QSize sizeHint; //!< A cache for KexiDBComboBox::sizeHint(), @@ -468,10 +469,10 @@ return KexiDataItemInterface::originalValue() != value(); } -void -KexiDBComboBox::setColumnInfo(KDbQueryColumnInfo* cinfo) +void KexiDBComboBox::setColumnInfo(KDbConnection *conn, KDbQueryColumnInfo* cinfo) { - KexiFormDataItemInterface::setColumnInfo(cinfo); + d->connection = conn; + KexiFormDataItemInterface::setColumnInfo(conn, cinfo); } void KexiDBComboBox::setVisibleColumnInfo(KDbQueryColumnInfo* cinfo) @@ -607,3 +608,7 @@ KexiComboBoxBase::undoChanges(); } +KDbConnection *KexiDBComboBox::connection() +{ + return d->connection; +} diff --git a/src/plugins/forms/widgets/kexidbimagebox.h b/src/plugins/forms/widgets/kexidbimagebox.h --- a/src/plugins/forms/widgets/kexidbimagebox.h +++ b/src/plugins/forms/widgets/kexidbimagebox.h @@ -203,7 +203,7 @@ QByteArray data() const; virtual void contextMenuEvent(QContextMenuEvent * e); - virtual void setColumnInfo(KDbQueryColumnInfo* cinfo); + void setColumnInfo(KDbConnection *conn, KDbQueryColumnInfo* cinfo) override; virtual void paintEvent(QPaintEvent*); virtual void resizeEvent(QResizeEvent* e); virtual bool eventFilter(QObject * watched, QEvent * e); diff --git a/src/plugins/forms/widgets/kexidbimagebox.cpp b/src/plugins/forms/widgets/kexidbimagebox.cpp --- a/src/plugins/forms/widgets/kexidbimagebox.cpp +++ b/src/plugins/forms/widgets/kexidbimagebox.cpp @@ -756,9 +756,9 @@ } } -void KexiDBImageBox::setColumnInfo(KDbQueryColumnInfo* cinfo) +void KexiDBImageBox::setColumnInfo(KDbConnection *conn,KDbQueryColumnInfo* cinfo) { - KexiFormDataItemInterface::setColumnInfo(cinfo); + KexiFormDataItemInterface::setColumnInfo(conn, cinfo); //updating strings and title is needed updateActionStrings(); } diff --git a/src/plugins/forms/widgets/kexidblabel.h b/src/plugins/forms/widgets/kexidblabel.h --- a/src/plugins/forms/widgets/kexidblabel.h +++ b/src/plugins/forms/widgets/kexidblabel.h @@ -110,7 +110,7 @@ protected: void init(); - virtual void setColumnInfo(KDbQueryColumnInfo* cinfo); + void setColumnInfo(KDbConnection *conn, KDbQueryColumnInfo* cinfo) override; virtual void paintEvent(QPaintEvent*); virtual void resizeEvent(QResizeEvent* e); diff --git a/src/plugins/forms/widgets/kexidblabel.cpp b/src/plugins/forms/widgets/kexidblabel.cpp --- a/src/plugins/forms/widgets/kexidblabel.cpp +++ b/src/plugins/forms/widgets/kexidblabel.cpp @@ -174,9 +174,9 @@ return QLabel::pixmap(); } -void KexiDBLabel::setColumnInfo(KDbQueryColumnInfo* cinfo) +void KexiDBLabel::setColumnInfo(KDbConnection *conn, KDbQueryColumnInfo* cinfo) { - KexiFormDataItemInterface::setColumnInfo(cinfo); + KexiFormDataItemInterface::setColumnInfo(conn, cinfo); KexiDBTextWidgetInterface::setColumnInfo(cinfo, this); } diff --git a/src/plugins/forms/widgets/kexidblineedit.h b/src/plugins/forms/widgets/kexidblineedit.h --- a/src/plugins/forms/widgets/kexidblineedit.h +++ b/src/plugins/forms/widgets/kexidblineedit.h @@ -101,7 +101,7 @@ virtual bool cursorAtEnd(); virtual void clear(); - virtual void setColumnInfo(KDbQueryColumnInfo* cinfo); + void setColumnInfo(KDbConnection *conn, KDbQueryColumnInfo* cinfo) override; /*! Handles action having standard name \a actionName. Action could be: "edit_copy", "edit_paste", etc. diff --git a/src/plugins/forms/widgets/kexidblineedit.cpp b/src/plugins/forms/widgets/kexidblineedit.cpp --- a/src/plugins/forms/widgets/kexidblineedit.cpp +++ b/src/plugins/forms/widgets/kexidblineedit.cpp @@ -287,9 +287,9 @@ QLineEdit::clear(); } -void KexiDBLineEdit::setColumnInfo(KDbQueryColumnInfo* cinfo) +void KexiDBLineEdit::setColumnInfo(KDbConnection *conn, KDbQueryColumnInfo* cinfo) { - KexiFormDataItemInterface::setColumnInfo(cinfo); + KexiFormDataItemInterface::setColumnInfo(conn, cinfo); m_textFormatter.setField(cinfo ? cinfo->field() : nullptr); KexiTextFormatter::OverrideDecimalPlaces overrideDecimalPlaces; overrideDecimalPlaces.enabled = true; diff --git a/src/plugins/forms/widgets/kexidbtextedit.h b/src/plugins/forms/widgets/kexidbtextedit.h --- a/src/plugins/forms/widgets/kexidbtextedit.h +++ b/src/plugins/forms/widgets/kexidbtextedit.h @@ -74,7 +74,7 @@ virtual bool cursorAtEnd(); virtual void clear(); - virtual void setColumnInfo(KDbQueryColumnInfo* cinfo); + void setColumnInfo(KDbConnection *conn, KDbQueryColumnInfo* cinfo) override; /*! If \a displayDefaultValue is true, the value set by KexiDataItemInterface::setValue() is displayed in a special way. Used by KexiFormDataProvider::fillDataItems(). diff --git a/src/plugins/forms/widgets/kexidbtextedit.cpp b/src/plugins/forms/widgets/kexidbtextedit.cpp --- a/src/plugins/forms/widgets/kexidbtextedit.cpp +++ b/src/plugins/forms/widgets/kexidbtextedit.cpp @@ -214,9 +214,9 @@ document()->clear(); } -void KexiDBTextEdit::setColumnInfo(KDbQueryColumnInfo* cinfo) +void KexiDBTextEdit::setColumnInfo(KDbConnection *conn, KDbQueryColumnInfo* cinfo) { - KexiFormDataItemInterface::setColumnInfo(cinfo); + KexiFormDataItemInterface::setColumnInfo(conn, cinfo); if (!cinfo) { m_length = 0; return; diff --git a/src/plugins/importexport/csv/KexiCsvImportExportPlugin.cpp b/src/plugins/importexport/csv/KexiCsvImportExportPlugin.cpp --- a/src/plugins/importexport/csv/KexiCsvImportExportPlugin.cpp +++ b/src/plugins/importexport/csv/KexiCsvImportExportPlugin.cpp @@ -77,13 +77,13 @@ KexiCSVExport::Options options; if (!options.assign(args)) return false; - KDbTableOrQuerySchema tableOrQuery( - KexiMainWindowIface::global()->project()->dbConnection(), options.itemId); + KDbConnection *conn = KexiMainWindowIface::global()->project()->dbConnection(); + KDbTableOrQuerySchema tableOrQuery(conn, options.itemId); QTextStream *stream = 0; if (args->contains("textStream")) { stream = KDbUtils::stringToPointer(args->value("textStream")); } - return KexiCSVExport::exportData(&tableOrQuery, options, -1, stream); + return KexiCSVExport::exportData(conn, &tableOrQuery, options, -1, stream); } return false; } diff --git a/src/plugins/importexport/csv/kexicsvexport.h b/src/plugins/importexport/csv/kexicsvexport.h --- a/src/plugins/importexport/csv/kexicsvexport.h +++ b/src/plugins/importexport/csv/kexicsvexport.h @@ -23,6 +23,7 @@ #include class QTextStream; +class KDbConnection; class KDbTableOrQuerySchema; namespace KexiCSVExport @@ -55,7 +56,7 @@ @param recordCount record count of the input data or -1 if the record cound has not yet been computed @param predefinedTextStream text stream that should be used instead of writing to a file */ -bool exportData(KDbTableOrQuerySchema *tableOrQuery, const Options& options, +bool exportData(KDbConnection* conn, KDbTableOrQuerySchema *tableOrQuery, const Options& options, int recordCount = -1, QTextStream *predefinedTextStream = 0); } diff --git a/src/plugins/importexport/csv/kexicsvexport.cpp b/src/plugins/importexport/csv/kexicsvexport.cpp --- a/src/plugins/importexport/csv/kexicsvexport.cpp +++ b/src/plugins/importexport/csv/kexicsvexport.cpp @@ -82,10 +82,9 @@ //------------------------------------ -bool KexiCSVExport::exportData(KDbTableOrQuerySchema *tableOrQuery, +bool KexiCSVExport::exportData(KDbConnection* conn, KDbTableOrQuerySchema *tableOrQuery, const Options& options, int recordCount, QTextStream *predefinedTextStream) { - KDbConnection* conn = tableOrQuery->connection(); if (!conn) return false; @@ -99,7 +98,7 @@ } if (recordCount == -1) - recordCount = KDb::recordCount(tableOrQuery, queryParams); + recordCount = conn->recordCount(tableOrQuery, queryParams); if (recordCount == -1) return false; @@ -111,7 +110,8 @@ //! @todo OPTIMIZATION: use fieldsExpanded(true /*UNIQUE*/) //! @todo OPTIMIZATION? (avoid multiple data retrieving) look for already fetched data within KexiProject.. - KDbQueryColumnInfo::Vector fields(query->fieldsExpanded(KDbQuerySchema::WithInternalFields)); + const KDbQueryColumnInfo::Vector fields( + query->fieldsExpanded(conn, KDbQuerySchema::FieldsExpandedMode::WithInternalFields)); QString buffer; QScopedPointer kSaveFile; @@ -166,9 +166,8 @@ #define APPEND_EOLN \ if (copyToClipboard) { APPEND('\n'); } else { APPEND("\r\n"); } - qDebug() << 0 << "Columns: " << query->fieldsExpanded().count(); // 0. Cache information - const int fieldsCount = query->fieldsExpanded().count(); //real fields count without internals + const int fieldsCount = query->fieldsExpanded(conn).count(); //real fields count without internals const QChar delimiter(options.delimiter.at(0)); const bool hasTextQuote = !options.textQuote.isEmpty(); const QString textQuote(options.textQuote.at(0)); @@ -185,7 +184,7 @@ KDbQueryColumnInfo* ci; const int indexForVisibleLookupValue = fields[i]->indexForVisibleLookupValue(); if (-1 != indexForVisibleLookupValue) { - ci = query->expandedOrInternalField(indexForVisibleLookupValue); + ci = query->expandedOrInternalField(conn, indexForVisibleLookupValue); visibleFieldIndex[i] = indexForVisibleLookupValue; } else { ci = fields[i]; diff --git a/src/plugins/importexport/csv/kexicsvexportwizard.cpp b/src/plugins/importexport/csv/kexicsvexportwizard.cpp --- a/src/plugins/importexport/csv/kexicsvexportwizard.cpp +++ b/src/plugins/importexport/csv/kexicsvexportwizard.cpp @@ -67,12 +67,12 @@ QString infoLblFromText; QString captionOrName; KexiGUIMessageHandler msgh(this); + KDbConnection* conn = KexiMainWindowIface::global()->project()->dbConnection(); if (m_options.useTempQuery) { m_tableOrQuery = new KDbTableOrQuerySchema(KexiMainWindowIface::global()->unsavedQuery(options.itemId)); - captionOrName = KexiMainWindowIface::global()->project()->dbConnection()->querySchema(m_options.itemId)->captionOrName(); + captionOrName = conn->querySchema(m_options.itemId)->captionOrName(); } else { - m_tableOrQuery = new KDbTableOrQuerySchema( - KexiMainWindowIface::global()->project()->dbConnection(), m_options.itemId); + m_tableOrQuery = new KDbTableOrQuerySchema(conn, m_options.itemId); captionOrName = m_tableOrQuery->captionOrName(); } if (m_tableOrQuery->table()) { @@ -92,16 +92,15 @@ infoLblFromText = xi18n("Exporting data from query:"); } } else { - msgh.showErrorMessage(KexiMainWindowIface::global()->project()->dbConnection()->result(), - KDbMessageHandler::Error, + msgh.showErrorMessage(conn->result(), KDbMessageHandler::Error, xi18n("Could not open data for exporting.")); m_canceled = true; return; } QString text = "\n" + captionOrName; - int m_recordCount = KDb::recordCount(m_tableOrQuery); - int columns = KDb::fieldCount(m_tableOrQuery); + int m_recordCount = conn->recordCount(m_tableOrQuery); + int columns = m_tableOrQuery->fieldCount(conn); text += "\n"; if (m_recordCount > 0) text += xi18n("(rows: %1, columns: %2)", m_recordCount, columns); @@ -307,15 +306,16 @@ void KexiCSVExportWizard::done(int result) { + KDbConnection* conn = KexiMainWindowIface::global()->project()->dbConnection(); if (QDialog::Accepted == result) { if (m_fileSavePage) { //qDebug() << selectedFile(); m_options.fileName = selectedFile(); } m_options.delimiter = m_delimiterWidget->delimiter(); m_options.textQuote = m_textQuote->textQuote(); m_options.addColumnNames = m_addColumnNamesCheckBox->isChecked(); - if (!KexiCSVExport::exportData(m_tableOrQuery, m_options)) + if (!KexiCSVExport::exportData(conn, m_tableOrQuery, m_options)) return; //store options diff --git a/src/plugins/importexport/csv/kexicsvimportdialog.cpp b/src/plugins/importexport/csv/kexicsvimportdialog.cpp --- a/src/plugins/importexport/csv/kexicsvimportdialog.cpp +++ b/src/plugins/importexport/csv/kexicsvimportdialog.cpp @@ -465,18 +465,16 @@ } nextButton()->setEnabled(true); - KDbTableOrQuerySchema *tableOrQuery = new KDbTableOrQuerySchema( - KexiMainWindowIface::global()->project()->dbConnection(), - item->identifier() - ); + KDbConnection *conn = KexiMainWindowIface::global()->project()->dbConnection(); + KDbTableOrQuerySchema *tableOrQuery = new KDbTableOrQuerySchema(conn, item->identifier()); m_tableCaptionLabel->setText(tableOrQuery->captionOrName()); m_tableNameLabel->setText(tableOrQuery->name()); - m_recordCountLabel->setText(QString::number(KDb::recordCount(tableOrQuery))); - m_colCountLabel->setText(QString::number(tableOrQuery->fieldCount())); + m_recordCountLabel->setText(QString::number(conn->recordCount(tableOrQuery))); + m_colCountLabel->setText(QString::number(tableOrQuery->fieldCount(conn))); delete m_fieldsListModel; m_fieldsListModel = new KexiFieldListModel(m_fieldsListView, ShowDataTypes); - m_fieldsListModel->setSchema(tableOrQuery); + m_fieldsListModel->setSchema(conn, tableOrQuery); m_fieldsListView->setModel(m_fieldsListModel); m_fieldsListView->header()->resizeSections(QHeaderView::ResizeToContents); } diff --git a/src/plugins/queries/kexiquerydesignerguieditor.cpp b/src/plugins/queries/kexiquerydesignerguieditor.cpp --- a/src/plugins/queries/kexiquerydesignerguieditor.cpp +++ b/src/plugins/queries/kexiquerydesignerguieditor.cpp @@ -87,7 +87,6 @@ public: Private(KexiQueryDesignerGuiEditor *p) : q(p) - , conn(0) { droppedNewRecord = 0; slotTableAdded_enabled = true; @@ -109,9 +108,6 @@ KexiQueryDesignerGuiEditor *q; KDbTableViewData *data; KexiDataTableView *dataTable; - //! @todo KEXI3 use equivalent of QPointer - KDbConnection *conn; - KexiRelationsView *relations; KexiSectionHeader *head; QSplitter *spl; @@ -172,8 +168,6 @@ : KexiView(parent) , d(new Private(this)) { - d->conn = KexiMainWindowIface::global()->project()->dbConnection(); - d->spl = new QSplitter(Qt::Vertical, this); d->spl->setChildrenCollapsible(false); d->relations = new KexiRelationsView(d->spl); @@ -307,6 +301,7 @@ void KexiQueryDesignerGuiEditor::updateColumnsData() { + KDbConnection *conn = KexiMainWindowIface::global()->project()->dbConnection(); d->dataTable->dataAwareObject()->acceptRecordEditing(); QStringList sortedTableNames; @@ -351,7 +346,7 @@ //table /*! @todo what about query? */ const KDbTableSchema *table = d->relations->tables()->value(tableName)->schema()->table(); - KDbTableSchemaChangeListener::registerForChanges(d->conn, tempData(), table); //this table will be used + KDbTableSchemaChangeListener::registerForChanges(conn, tempData(), table); //this table will be used data = d->tablesColumnData->createItem(); (*data)[COLUMN_ID_COLUMN] = table->name(); (*data)[COLUMN_ID_TABLE] = (*data)[COLUMN_ID_COLUMN]; @@ -394,6 +389,7 @@ KexiQueryDesignerGuiEditor::buildSchema(QString *errMsg) { //build query schema + KDbConnection *conn = KexiMainWindowIface::global()->project()->dbConnection(); KexiQueryPartTempData * temp = tempData(); if (temp->query()) { KexiQueryView *queryDataView = dynamic_cast(window()->viewForMode(Kexi::DataViewMode)); @@ -507,7 +503,7 @@ } continue; } else { - KDbTableSchema *t = d->conn->tableSchema(tableName); + KDbTableSchema *t = conn->tableSchema(tableName); if (fieldName == "*") { //single-table asterisk: + ".*" + number if (fieldVisible) { @@ -624,8 +620,8 @@ //! @todo ok, but not for expressions QString aliasString((*set)["alias"].value().toString()); currentColumn = temp->query()->columnInfo( - (*set)["table"].value().toString() + "." - + (aliasString.isEmpty() ? currentField->name() : aliasString)); + conn, (*set)["table"].value().toString() + "." + + (aliasString.isEmpty() ? currentField->name() : aliasString)); if (currentField && currentColumn) { if (currentColumn->isVisible()) orderByColumns.appendColumn(currentColumn, sortOrder); @@ -635,7 +631,7 @@ } temp->query()->setOrderByColumnList(orderByColumns); - qDebug() << *temp->query(); + qDebug() << KDbConnectionAndQuerySchema(conn, *temp->query()); temp->registerTableSchemaChanges(temp->query()); //! @todo ? return true; @@ -694,16 +690,17 @@ tristate KexiQueryDesignerGuiEditor::afterSwitchFrom(Kexi::ViewMode mode) { - if (!d->relations->setConnection(d->conn)) { - window()->setStatus(d->conn); + KDbConnection *conn = KexiMainWindowIface::global()->project()->dbConnection(); + if (!d->relations->setConnection(conn)) { + window()->setStatus(conn); return false; } if (mode == Kexi::NoViewMode || (mode == Kexi::DataViewMode && !tempData()->query())) { //this is not a SWITCH but a fresh opening in this view mode if (!window()->neverSaved()) { if (!loadLayout()) { //err msg - window()->setStatus(d->conn, + window()->setStatus(conn, xi18n("Query definition loading failed."), xi18n("Query design may be corrupted so it could not be opened even in text view.\n" "You can delete the query and create it again.")); @@ -776,6 +773,7 @@ { Q_ASSERT(cancel); Q_UNUSED(options); + KDbConnection *conn = KexiMainWindowIface::global()->project()->dbConnection(); if (!d->dataTable->dataAwareObject()->acceptRecordEditing()) { *cancel = true; return 0; @@ -792,7 +790,7 @@ } (KDbObject&)*temp->query() = object; //copy main attributes - bool ok = d->conn->storeNewObjectData(temp->query()); + bool ok = conn->storeNewObjectData(temp->query()); if (ok) { ok = KexiMainWindowIface::global()->project()->removeUserDataBlock(temp->query()->id()); // for sanity } @@ -871,6 +869,7 @@ void KexiQueryDesignerGuiEditor::showFieldsOrRelationsForQueryInternal( KDbQuerySchema *query, bool showFields, bool showRelations, KDbResultInfo& result) { + KDbConnection *conn = KexiMainWindowIface::global()->project()->dbConnection(); result.clear(); const bool was_dirty = isDirty(); @@ -953,7 +952,7 @@ QSet usedCriterias; // <-- used criterias will be saved here // so in step 4. we will be able to add // remaining invisible columns with criterias - qDebug() << *query; + qDebug() << KDbConnectionAndQuerySchema(conn, *query); foreach(KDbField* field, *query->fields()) { qDebug() << *field; } @@ -1020,8 +1019,8 @@ //4. show ORDER BY information d->data->clearRecordEditBuffer(); const KDbOrderByColumnList* orderByColumns = query->orderByColumnList(); - QHash columnsOrder( - query->columnsOrder(KDbQuerySchema::UnexpandedListWithoutAsterisks)); + const QHash columnsOrder( + query->columnsOrder(conn, KDbQuerySchema::ColumnsOrderMode::UnexpandedListWithoutAsterisks)); for (auto orderByColumnIt(orderByColumns->constBegin()); orderByColumnIt != orderByColumns->constEnd(); ++orderByColumnIt) { @@ -1134,6 +1133,7 @@ bool KexiQueryDesignerGuiEditor::loadLayout() { + KDbConnection *conn = KexiMainWindowIface::global()->project()->dbConnection(); QString xml; //! @todo errmsg if (!loadDataBlock(&xml, "query_layout") || xml.isEmpty()) { @@ -1166,7 +1166,7 @@ //add tables and relations to the relation view for (el = doc_el.firstChild().toElement(); !el.isNull(); el = el.nextSibling().toElement()) { if (el.tagName() == "table") { - KDbTableSchema *t = d->conn->tableSchema(el.attribute("name")); + KDbTableSchema *t = conn->tableSchema(el.attribute("name")); int x = el.attribute("x", "-1").toInt(); int y = el.attribute("y", "-1").toInt(); int width = el.attribute("width", "-1").toInt(); @@ -1192,11 +1192,12 @@ bool KexiQueryDesignerGuiEditor::storeLayout() { + KDbConnection *conn = KexiMainWindowIface::global()->project()->dbConnection(); KexiQueryPartTempData * temp = tempData(); // Save SQL without driver-escaped keywords. if (window()->schemaObject()) //set this instance as obsolete (only if it's stored) - d->conn->setQuerySchemaObsolete(window()->schemaObject()->name()); + conn->setQuerySchemaObsolete(window()->schemaObject()->name()); KDbSelectStatementOptions options; options.setAddVisibleLookupColumns(false); diff --git a/src/plugins/queries/kexiquerypart.cpp b/src/plugins/queries/kexiquerypart.cpp --- a/src/plugins/queries/kexiquerypart.cpp +++ b/src/plugins/queries/kexiquerypart.cpp @@ -143,14 +143,16 @@ //! @todo return 0; } - qDebug() << *query; + qDebug() << KDbConnectionAndQuerySchema( + KexiMainWindowIface::global()->project()->dbConnection(), *query); (KDbObject&)*query = object; //copy main attributes temp->registerTableSchemaChanges(query); if (ownedByWindow) *ownedByWindow = false; - qDebug() << *query; + qDebug() << KDbConnectionAndQuerySchema( + KexiMainWindowIface::global()->project()->dbConnection(), *query); return query; } diff --git a/src/plugins/queries/kexiqueryview.cpp b/src/plugins/queries/kexiqueryview.cpp --- a/src/plugins/queries/kexiqueryview.cpp +++ b/src/plugins/queries/kexiqueryview.cpp @@ -78,13 +78,12 @@ return false; KexiUtils::WaitCursor wait; KDbCursor *oldCursor = d->cursor; - qDebug() << query->parameters(); - bool ok; KDbConnection * conn = KexiMainWindowIface::global()->project()->dbConnection(); + qDebug() << query->parameters(conn); + bool ok; { KexiUtils::WaitCursorRemover remover; - d->currentParams = KexiQueryParameters::getParameters(this, - *conn->driver(), query, &ok); + d->currentParams = KexiQueryParameters::getParameters(this, conn, query, &ok); } if (!ok) {//input cancelled return cancelled; diff --git a/src/plugins/reports/KexiDBReportDataSource.cpp b/src/plugins/reports/KexiDBReportDataSource.cpp --- a/src/plugins/reports/KexiDBReportDataSource.cpp +++ b/src/plugins/reports/KexiDBReportDataSource.cpp @@ -73,7 +73,7 @@ return; KDbOrderByColumnList order; for (int i = 0; i < sorting.count(); i++) { - if (!order.appendField(d->copySchema, sorting[i].field(), + if (!order.appendField(d->connection, d->copySchema, sorting[i].field(), KDbOrderByColumn::fromQt(sorting[i].order()))) { qWarning() << "Cannot set sort field" << i << sorting[i].field(); @@ -127,7 +127,8 @@ } else if ( d->copySchema) { - qDebug() << "Opening cursor.." << *d->copySchema; + qDebug() << "Opening cursor.." + << KDbConnectionAndQuerySchema(d->connection, *d->copySchema); d->cursor = d->connection->executeQuery(d->copySchema, KDbCursor::Option::Buffered); } @@ -173,8 +174,10 @@ && d->connection->querySchema(d->objectName)) { qDebug() << d->objectName << "is a query.."; - qDebug() << *d->connection->querySchema(d->objectName); - d->originalSchema = new KDbQuerySchema(*(d->connection->querySchema(d->objectName))); + qDebug() << KDbConnectionAndQuerySchema(d->connection, + *d->connection->querySchema(d->objectName)); + d->originalSchema + = new KDbQuerySchema(*(d->connection->querySchema(d->objectName)), d->connection); } if (d->originalSchema) { @@ -185,10 +188,10 @@ } else { qDebug() << "Original: ERROR"; } - qDebug() << *d->originalSchema; + qDebug() << KDbConnectionAndQuerySchema(d->connection, *d->originalSchema); - d->copySchema = new KDbQuerySchema(*d->originalSchema); - qDebug() << *d->copySchema; + d->copySchema = new KDbQuerySchema(*d->originalSchema, d->connection); + qDebug() << KDbConnectionAndQuerySchema(d->connection, *d->copySchema); if (builder.generateSelectStatement(&sql, d->copySchema)) { qDebug() << "Copy:" << sql; } else { @@ -207,13 +210,12 @@ int KexiDBReportDataSource::fieldNumber ( const QString &fld ) const { - if (!d->cursor || !d->cursor->query()) { return -1; } - const KDbQueryColumnInfo::Vector fieldsExpanded( - d->cursor->query()->fieldsExpanded(KDbQuerySchema::Unique)); - for (int i = 0; i < fieldsExpanded.size() ; ++i) { + const KDbQueryColumnInfo::Vector fieldsExpanded(d->cursor->query()->fieldsExpanded( + d->connection, KDbQuerySchema::FieldsExpandedMode::Unique)); + for (int i = 0; i < fieldsExpanded.size(); ++i) { if (0 == QString::compare(fld, fieldsExpanded[i]->aliasOrName(), Qt::CaseInsensitive)) { return i; } @@ -227,10 +229,10 @@ return QStringList(); } QStringList names; - const KDbQueryColumnInfo::Vector fieldsExpanded( - d->originalSchema->fieldsExpanded(KDbQuerySchema::Unique)); + const KDbQueryColumnInfo::Vector fieldsExpanded(d->originalSchema->fieldsExpanded( + d->connection, KDbQuerySchema::FieldsExpandedMode::Unique)); for (int i = 0; i < fieldsExpanded.size(); i++) { -//! @todo in some Kexi mode captionOrAliasOrName() would be used here (more user-friendly) + //! @todo in some Kexi mode captionOrAliasOrName() would be used here (more user-friendly) names.append(fieldsExpanded[i]->aliasOrName()); } return names; @@ -294,9 +296,8 @@ qint64 KexiDBReportDataSource::recordCount() const { - if ( d->copySchema ) - { - return KDb::recordCount ( d->copySchema ); + if (d->copySchema) { + return d->connection->recordCount(d->copySchema); } return 1; diff --git a/src/plugins/scripting/kexidb/kexidbcursor.cpp b/src/plugins/scripting/kexidb/kexidbcursor.cpp --- a/src/plugins/scripting/kexidb/kexidbcursor.cpp +++ b/src/plugins/scripting/kexidb/kexidbcursor.cpp @@ -117,7 +117,7 @@ return false; } - KDbQueryColumnInfo* column = query->fieldsExpanded().at(index); + KDbQueryColumnInfo* column = query->fieldsExpanded(m_cursor->connection()).at(index); if (! column) { qWarning() << "Invalid column, index=" << index << " value=" << value; return false; diff --git a/src/widget/dataviewcommon/kexidataawareobjectiface.cpp b/src/widget/dataviewcommon/kexidataawareobjectiface.cpp --- a/src/widget/dataviewcommon/kexidataawareobjectiface.cpp +++ b/src/widget/dataviewcommon/kexidataawareobjectiface.cpp @@ -1250,7 +1250,7 @@ bool KexiDataAwareObjectInterface::columnEditable(int col) { KDbTableViewColumn* c = m_data ? column(col) : 0; - return c ? (! c->isReadOnly()) : false; + return c ? (!isReadOnly() && !c->isReadOnly()) : false; } QHeaderView* KexiDataAwareObjectInterface::horizontalHeader() const diff --git a/src/widget/dataviewcommon/kexidataprovider.h b/src/widget/dataviewcommon/kexidataprovider.h --- a/src/widget/dataviewcommon/kexidataprovider.h +++ b/src/widget/dataviewcommon/kexidataprovider.h @@ -74,7 +74,7 @@ be omitted for fillDataItems(). Used by KexiFormView::initDataSource(). */ void invalidateDataSources(const QSet& invalidSources, - KDbQuerySchema* query = 0); + KDbConnection *conn, KDbQuerySchema* query); /*! Fills the same data provided by \a value to every data item (other than \a item) having the same data source as \a item. This method is called immediately when diff --git a/src/widget/dataviewcommon/kexidataprovider.cpp b/src/widget/dataviewcommon/kexidataprovider.cpp --- a/src/widget/dataviewcommon/kexidataprovider.cpp +++ b/src/widget/dataviewcommon/kexidataprovider.cpp @@ -167,25 +167,25 @@ return false; } -void KexiFormDataProvider::invalidateDataSources(const QSet& invalidSources, - KDbQuerySchema* query) +void KexiFormDataProvider::invalidateDataSources(const QSet &invalidSources, + KDbConnection *conn, KDbQuerySchema *query) { //fill m_fieldNumbersForDataItems mapping from data item to field number //(needed for fillDataItems) KDbQueryColumnInfo::Vector fieldsExpanded; // int dataFieldsCount; // == fieldsExpanded.count() if query is available or else == m_dataItems.count() - if (query) { - fieldsExpanded = query->fieldsExpanded(KDbQuerySchema::WithInternalFields); + if (conn && query) { + fieldsExpanded = query->fieldsExpanded(conn, KDbQuerySchema::FieldsExpandedMode::WithInternalFields); // dataFieldsCount = fieldsExpanded.count(); - QHash columnsOrder(query->columnsOrder()); + QHash columnsOrder(query->columnsOrder(conn)); for (QHash::const_iterator it = columnsOrder.constBegin(); it != columnsOrder.constEnd(); ++it) { qDebug() << "query->columnsOrder()[ " << it.key()->field()->name() << " ] = " << it.value(); } foreach(KexiFormDataItemInterface *item, m_dataItems) { - KDbQueryColumnInfo* ci = query->columnInfo(item->dataSource()); + KDbQueryColumnInfo* ci = query->columnInfo(conn, item->dataSource()); int index = ci ? columnsOrder[ ci ] : -1; qDebug() << "query->columnsOrder()[ " << (ci ? ci->field()->name() : QString()) << " ] = " << index << " (dataSource: " << item->dataSource() << ", name=" @@ -203,7 +203,7 @@ QSet tmpUsedDataSources; if (query) { - qDebug() << *query; + qDebug() << KDbConnectionAndQuerySchema(conn, *query); } m_disableFillDuplicatedDataItems = true; // temporary disable fillDuplicatedDataItems() // because setColumnInfo() can activate it @@ -220,7 +220,7 @@ int fieldNumber = m_fieldNumbersForDataItems[ item ]; if (query) { KDbQueryColumnInfo *ci = fieldsExpanded[fieldNumber]; - item->setColumnInfo(ci); + item->setColumnInfo(conn, ci); qDebug() << "- item=" << dynamic_cast(item)->objectName() << " dataSource=" << item->dataSource() << " field=" << ci->field()->name(); diff --git a/src/widget/dataviewcommon/kexiformdataiteminterface.h b/src/widget/dataviewcommon/kexiformdataiteminterface.h --- a/src/widget/dataviewcommon/kexiformdataiteminterface.h +++ b/src/widget/dataviewcommon/kexiformdataiteminterface.h @@ -25,6 +25,7 @@ #include #include +class KDbConnection; class KDbField; //! An interface for declaring form widgets to be data-aware. @@ -106,7 +107,8 @@ Reimplement if you need to do additional actions, e.g. set data validator based on field type. Don't forget about calling superclass implementation. */ - virtual void setColumnInfo(KDbQueryColumnInfo* cinfo) { + virtual void setColumnInfo(KDbConnection *conn, KDbQueryColumnInfo* cinfo) { + Q_UNUSED(conn) m_columnInfo = cinfo; } diff --git a/src/widget/fields/KexiFieldComboBox.cpp b/src/widget/fields/KexiFieldComboBox.cpp --- a/src/widget/fields/KexiFieldComboBox.cpp +++ b/src/widget/fields/KexiFieldComboBox.cpp @@ -105,7 +105,7 @@ delete d->model; d->model = new KexiFieldListModel(this, ShowEmptyItem); - d->model->setSchema(&tableOrQuery); + d->model->setSchema(d->prj->dbConnection(), &tableOrQuery); setModel(d->model); //update selection diff --git a/src/widget/fields/KexiFieldListModel.h b/src/widget/fields/KexiFieldListModel.h --- a/src/widget/fields/KexiFieldListModel.h +++ b/src/widget/fields/KexiFieldListModel.h @@ -25,6 +25,7 @@ #include +class KDbConnection; class KDbTableOrQuerySchema; //! Flags used to alter models behaviour and appearance @@ -48,7 +49,7 @@ /*! Sets table or query schema \a schema. The schema object will be owned by the KexiFieldListView object. */ - void setSchema(KDbTableOrQuerySchema* schema); + void setSchema(KDbConnection *conn, KDbTableOrQuerySchema* schema); virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; virtual int rowCount(const QModelIndex& parent = QModelIndex()) const; diff --git a/src/widget/fields/KexiFieldListModel.cpp b/src/widget/fields/KexiFieldListModel.cpp --- a/src/widget/fields/KexiFieldListModel.cpp +++ b/src/widget/fields/KexiFieldListModel.cpp @@ -62,7 +62,7 @@ delete d; } -void KexiFieldListModel::setSchema(KDbTableOrQuerySchema* schema) +void KexiFieldListModel::setSchema(KDbConnection *conn, KDbTableOrQuerySchema* schema) { if (schema && d->schema == schema) return; @@ -75,7 +75,7 @@ qDeleteAll(d->items); d->items.clear(); KexiFieldListModelItem *item = 0; - KDbQueryColumnInfo::Vector columns = d->schema->columns(true /*unique*/); + KDbQueryColumnInfo::Vector columns = d->schema->columns(conn, KDbTableOrQuerySchema::ColumnsMode::Unique); const int count = columns.count(); for (int i = -2; i < count; i++) { KDbQueryColumnInfo *colinfo = 0; diff --git a/src/widget/fields/KexiFieldListView.h b/src/widget/fields/KexiFieldListView.h --- a/src/widget/fields/KexiFieldListView.h +++ b/src/widget/fields/KexiFieldListView.h @@ -40,7 +40,7 @@ /*! Sets table or query schema \a schema. The schema object will be owned by the KexiFieldListView object. */ - void setSchema(KDbTableOrQuerySchema* schema); + void setSchema(KDbConnection *conn, KDbTableOrQuerySchema* schema); /*! \return table or query schema schema set for this widget. */ KDbTableOrQuerySchema* schema() const; diff --git a/src/widget/fields/KexiFieldListView.cpp b/src/widget/fields/KexiFieldListView.cpp --- a/src/widget/fields/KexiFieldListView.cpp +++ b/src/widget/fields/KexiFieldListView.cpp @@ -67,7 +67,7 @@ delete d; } -void KexiFieldListView::setSchema(KDbTableOrQuerySchema* schema) +void KexiFieldListView::setSchema(KDbConnection *conn, KDbTableOrQuerySchema* schema) { if (schema && d->schema == schema) return; @@ -84,7 +84,7 @@ d->model = new KexiFieldListModel(this, d->options); - d->model->setSchema(schema); + d->model->setSchema(conn, schema); setModel(d->model); } diff --git a/src/widget/kexiqueryparameters.h b/src/widget/kexiqueryparameters.h --- a/src/widget/kexiqueryparameters.h +++ b/src/widget/kexiqueryparameters.h @@ -39,8 +39,8 @@ //! @todo support defaults //! @todo support validation rules, e.g. min/max value, unsigned //! @todo support Enum type (list of strings, need support for keys and user-visible strings) - static QList getParameters(QWidget *parent, const KDbDriver &driver, - KDbQuerySchema* querySchema, bool *ok); + static QList getParameters(QWidget *parent, KDbConnection *conn, + KDbQuerySchema *querySchema, bool *ok); }; #endif // KEXIDBCONNECTIONWIDGET_H diff --git a/src/widget/kexiqueryparameters.cpp b/src/widget/kexiqueryparameters.cpp --- a/src/widget/kexiqueryparameters.cpp +++ b/src/widget/kexiqueryparameters.cpp @@ -30,15 +30,14 @@ #include #include -//static -QList KexiQueryParameters::getParameters(QWidget *parent, - const KDbDriver &driver, KDbQuerySchema* querySchema, bool *ok) +// static +QList KexiQueryParameters::getParameters(QWidget *parent, KDbConnection *conn, + KDbQuerySchema *querySchema, bool *ok) { Q_ASSERT(ok); Q_ASSERT(querySchema); - Q_UNUSED(driver); *ok = false; - const QList params(querySchema->parameters()); + const QList params(querySchema->parameters(conn)); QList values; const QString caption(xi18nc("@title:window Enter Query Parameter Value", "Enter Parameter Value")); foreach(const KDbQuerySchemaParameter ¶meter, params) { diff --git a/src/widget/relations/KexiRelationsScrollArea.h b/src/widget/relations/KexiRelationsScrollArea.h --- a/src/widget/relations/KexiRelationsScrollArea.h +++ b/src/widget/relations/KexiRelationsScrollArea.h @@ -127,6 +127,8 @@ //! removes selected table or connection void removeSelectedObject(); + void setConnection(KDbConnection *conn); + protected Q_SLOTS: void containerMoved(KexiRelationsTableContainer *c); void slotListUpdate(QObject *s); diff --git a/src/widget/relations/KexiRelationsScrollArea.cpp b/src/widget/relations/KexiRelationsScrollArea.cpp --- a/src/widget/relations/KexiRelationsScrollArea.cpp +++ b/src/widget/relations/KexiRelationsScrollArea.cpp @@ -50,6 +50,7 @@ autoScrollTimer.setSingleShot(true); } + KDbConnection *connection = nullptr; QWidget *areaWidget; TablesHash tables; bool readOnly; @@ -154,7 +155,7 @@ KexiRelationsTableContainer* KexiRelationsScrollArea::addTableContainer(KDbTableSchema *t, const QRect &rect) { - if (!t) + if (!t || !d->connection) return 0; qDebug() << t->name(); @@ -165,10 +166,9 @@ return c; } - c = new KexiRelationsTableContainer(d->areaWidget, this, + c = new KexiRelationsTableContainer(this, d->connection, /*! @todo what about query? */ - new KDbTableOrQuerySchema(t) - ); + new KDbTableOrQuerySchema(t), d->areaWidget); connect(c, SIGNAL(endDrag()), this, SLOT(slotTableViewEndDrag())); connect(c, SIGNAL(gotFocus()), this, SLOT(slotTableViewGotFocus())); connect(c, SIGNAL(contextMenuRequest(QPoint)), @@ -498,6 +498,11 @@ } } +void KexiRelationsScrollArea::setConnection(KDbConnection *conn) +{ + d->connection = conn; +} + void KexiRelationsScrollArea::hideTable(KexiRelationsTableContainer* container) { diff --git a/src/widget/relations/KexiRelationsTableContainer.h b/src/widget/relations/KexiRelationsTableContainer.h --- a/src/widget/relations/KexiRelationsTableContainer.h +++ b/src/widget/relations/KexiRelationsTableContainer.h @@ -39,10 +39,8 @@ Q_OBJECT public: - KexiRelationsTableContainer( - QWidget* parent, - KexiRelationsScrollArea *scrollArea, - KDbTableOrQuerySchema *schema); + KexiRelationsTableContainer(KexiRelationsScrollArea *scrollArea, KDbConnection *conn, + KDbTableOrQuerySchema *schema, QWidget *parent = nullptr); virtual ~KexiRelationsTableContainer(); diff --git a/src/widget/relations/KexiRelationsTableContainer.cpp b/src/widget/relations/KexiRelationsTableContainer.cpp --- a/src/widget/relations/KexiRelationsTableContainer.cpp +++ b/src/widget/relations/KexiRelationsTableContainer.cpp @@ -48,12 +48,11 @@ //---------------------- -KexiRelationsTableContainer::KexiRelationsTableContainer( - QWidget* parent, - KexiRelationsScrollArea *scrollArea, - KDbTableOrQuerySchema *schema) - : QFrame(parent) - , d(new Private) +KexiRelationsTableContainer::KexiRelationsTableContainer(KexiRelationsScrollArea *scrollArea, + KDbConnection *conn, + KDbTableOrQuerySchema *schema, + QWidget *parent) + : QFrame(parent), d(new Private) { d->scrollArea = scrollArea; setObjectName("KexiRelationsTableContainer"); @@ -74,7 +73,7 @@ connect(d->tableHeader, SIGNAL(moved()), this, SLOT(moved())); connect(d->tableHeader, SIGNAL(endDrag()), this, SIGNAL(endDrag())); - d->fieldList = new KexiRelationsTableFieldList(schema, d->scrollArea, this); + d->fieldList = new KexiRelationsTableFieldList(conn, schema, d->scrollArea, this); d->fieldList->setObjectName("KexiRelationsTableFieldList"); d->fieldList->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum)); d->fieldList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); diff --git a/src/widget/relations/KexiRelationsTableContainer_p.h b/src/widget/relations/KexiRelationsTableContainer_p.h --- a/src/widget/relations/KexiRelationsTableContainer_p.h +++ b/src/widget/relations/KexiRelationsTableContainer_p.h @@ -39,8 +39,8 @@ Q_OBJECT public: - KexiRelationsTableFieldList(KDbTableOrQuerySchema* tableOrQuerySchema, - KexiRelationsScrollArea *scrollArea, QWidget *parent = 0); + KexiRelationsTableFieldList(KDbConnection *conn, KDbTableOrQuerySchema* tableOrQuerySchema, + KexiRelationsScrollArea *scrollArea, QWidget *parent = nullptr); virtual ~KexiRelationsTableFieldList(); int globalY(const QString &item); diff --git a/src/widget/relations/KexiRelationsTableContainer_p.cpp b/src/widget/relations/KexiRelationsTableContainer_p.cpp --- a/src/widget/relations/KexiRelationsTableContainer_p.cpp +++ b/src/widget/relations/KexiRelationsTableContainer_p.cpp @@ -147,13 +147,13 @@ //===================================================================================== -KexiRelationsTableFieldList::KexiRelationsTableFieldList( - KDbTableOrQuerySchema* tableOrQuerySchema, - KexiRelationsScrollArea *scrollArea, QWidget *parent) - : KexiFieldListView(parent, ShowAsterisk) - , m_scrollArea(scrollArea) +KexiRelationsTableFieldList::KexiRelationsTableFieldList(KDbConnection *conn, + KDbTableOrQuerySchema *tableOrQuerySchema, + KexiRelationsScrollArea *scrollArea, + QWidget *parent) + : KexiFieldListView(parent, ShowAsterisk), m_scrollArea(scrollArea) { - setSchema(tableOrQuerySchema); + setSchema(conn, tableOrQuerySchema); setAcceptDrops(true); connect(horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(slotContentsMoving())); diff --git a/src/widget/relations/KexiRelationsView.cpp b/src/widget/relations/KexiRelationsView.cpp --- a/src/widget/relations/KexiRelationsView.cpp +++ b/src/widget/relations/KexiRelationsView.cpp @@ -416,6 +416,7 @@ result.sort(); d->tableCombo->addItems(result); } + d->scrollArea->setConnection(conn); return true; } diff --git a/src/widget/tableview/KexiTableScrollArea.cpp b/src/widget/tableview/KexiTableScrollArea.cpp --- a/src/widget/tableview/KexiTableScrollArea.cpp +++ b/src/widget/tableview/KexiTableScrollArea.cpp @@ -688,7 +688,7 @@ } } - const bool columnReadOnly = tvcol->isReadOnly(); + const bool columnReadOnly = isReadOnly() || tvcol->isReadOnly(); const bool dontPaintNonpersistentSelectionBecauseDifferentRowHasBeenHighlighted = d->appearance.recordHighlightingEnabled && !d->appearance.persistentSelections && m_curRecord >= 0 && record != m_curRecord; @@ -1291,7 +1291,7 @@ } editor->hide(); if (m_data->cursor() && m_data->cursor()->query()) - editor->createInternalEditor(*m_data->cursor()->query()); + editor->createInternalEditor(m_data->cursor()->connection(), *m_data->cursor()->query()); connect(editor, SIGNAL(editRequested()), this, SLOT(slotEditRequested())); connect(editor, SIGNAL(cancelRequested()), this, SLOT(cancelEditor())); diff --git a/src/widget/tableview/kexicomboboxbase.h b/src/widget/tableview/kexicomboboxbase.h --- a/src/widget/tableview/kexicomboboxbase.h +++ b/src/widget/tableview/kexicomboboxbase.h @@ -64,11 +64,8 @@ virtual bool valueIsNull(); virtual bool valueIsEmpty(); -public: virtual void hide(); - void createPopup(bool show); - void showPopup(); //! Call this from slot @@ -84,6 +81,11 @@ virtual QWidget *internalEditor() const = 0; protected: + //! @return connection for this combo + virtual KDbConnection *connection() = 0; + + void createPopup(bool show); + virtual void setValueInternal(const QVariant& add, bool removeOld); //! Used to select record item for a user-entered value \a v. diff --git a/src/widget/tableview/kexicomboboxbase.cpp b/src/widget/tableview/kexicomboboxbase.cpp --- a/src/widget/tableview/kexicomboboxbase.cpp +++ b/src/widget/tableview/kexicomboboxbase.cpp @@ -412,7 +412,7 @@ } if (!popup()) { - setPopup(column() ? new KexiComboBoxPopup(thisWidget, column()) + setPopup(column() ? new KexiComboBoxPopup(thisWidget, connection(), column()) : new KexiComboBoxPopup(thisWidget, field())); QObject::connect(popup(), SIGNAL(recordAccepted(KDbRecordData*,int)), thisWidget, SLOT(slotRecordAccepted(KDbRecordData*,int))); diff --git a/src/widget/tableview/kexicomboboxpopup.h b/src/widget/tableview/kexicomboboxpopup.h --- a/src/widget/tableview/kexicomboboxpopup.h +++ b/src/widget/tableview/kexicomboboxpopup.h @@ -22,6 +22,7 @@ #include +class KDbConnection; class KDbField; class KDbRecordData; class KDbTableViewColumn; @@ -36,10 +37,10 @@ public: //! @todo js: more ctors! /*! Constructor for creating a popup using definition from \a column. - If the column is lookup column, it's definition is used to display + If the column is lookup column, its definition is used to display one or more column within the popup. Otherwise column.field() is used to display single-column data. */ - KexiComboBoxPopup(QWidget* parent, KDbTableViewColumn *column); + KexiComboBoxPopup(QWidget* parent, KDbConnection *conn, KDbTableViewColumn *column); /*! Alternative constructor supporting lookup fields and enum hints. */ KexiComboBoxPopup(QWidget* parent, KDbField *field); @@ -77,7 +78,7 @@ //! The main function for setting data; data can be set either by passing \a column or \a field. //! The second case is used for lookup - void setData(KDbTableViewColumn *column, KDbField *field); + void setData(KDbConnection *conn, KDbTableViewColumn *column, KDbField *field); //! used by setData() void setDataInternal(KDbTableViewData *data, bool owner = true); //!< helper diff --git a/src/widget/tableview/kexicomboboxpopup.cpp b/src/widget/tableview/kexicomboboxpopup.cpp --- a/src/widget/tableview/kexicomboboxpopup.cpp +++ b/src/widget/tableview/kexicomboboxpopup.cpp @@ -114,22 +114,22 @@ const int KexiComboBoxPopup::defaultMaxRecordCount = 8; -KexiComboBoxPopup::KexiComboBoxPopup(QWidget* parent, KDbTableViewColumn *column) +KexiComboBoxPopup::KexiComboBoxPopup(QWidget* parent, KDbConnection *conn, KDbTableViewColumn *column) : QFrame(parent, Qt::Popup) , d( new KexiComboBoxPopupPrivate ) { init(); //setup tv data - setData(column, 0); + setData(conn, column, 0); } KexiComboBoxPopup::KexiComboBoxPopup(QWidget* parent, KDbField *field) : QFrame(parent, Qt::Popup) , d( new KexiComboBoxPopupPrivate ) { init(); //setup tv data - setData(0, field); + setData(nullptr, nullptr, field); } KexiComboBoxPopup::~KexiComboBoxPopup() @@ -164,7 +164,7 @@ this, SLOT(slotTVItemAccepted(KDbRecordData*,int,int))); } -void KexiComboBoxPopup::setData(KDbTableViewColumn *column, KDbField *aField) +void KexiComboBoxPopup::setData(KDbConnection *conn, KDbTableViewColumn *column, KDbField *aField) { d->visibleColumnsToShow.clear(); const KDbField *field = aField; @@ -195,21 +195,21 @@ KDbCursor *cursor = 0; switch (lookupFieldSchema->recordSource().type()) { case KDbLookupFieldSchemaRecordSource::Table: { - KDbTableSchema *lookupTable - = field->table()->connection()->tableSchema(lookupFieldSchema->recordSource().name()); + KDbTableSchema *lookupTable = conn->tableSchema(lookupFieldSchema->recordSource().name()); if (!lookupTable) //! @todo errmsg return; if (multipleLookupColumnJoined) { /*qDebug() << "--- Orig query: "; qDebug() << *lookupTable->query(); qDebug() << field->table()->connection()->selectStatement(*lookupTable->query());*/ - d->privateQuery = new KDbQuerySchema(*lookupTable->query()); + d->privateQuery = new KDbQuerySchema(*lookupTable->query(), conn); } else { // Create a simple SELECT query that contains only needed columns, // that is visible and bound ones. The bound columns are placed on the end. // Don't do this if one or more visible or bound columns cannot be found. - const KDbQueryColumnInfo::Vector fieldsExpanded(lookupTable->query()->fieldsExpanded()); + const KDbQueryColumnInfo::Vector fieldsExpanded( + lookupTable->query()->fieldsExpanded(conn)); d->privateQuery = new KDbQuerySchema; bool columnsFound = true; QList visibleAndBoundColumns = visibleColumns; @@ -224,42 +224,42 @@ } if (columnsFound) { // proper data source: bound + visible columns - cursor = field->table()->connection()->prepareQuery(d->privateQuery); + cursor = conn->prepareQuery(d->privateQuery); /*qDebug() << "--- Composed query:"; qDebug() << *d->privateQuery; qDebug() << field->table()->connection()->selectStatement(*d->privateQuery);*/ } else { // for sanity delete d->privateQuery; d->privateQuery = 0; - cursor = field->table()->connection()->prepareQuery(lookupTable); + cursor = conn->prepareQuery(lookupTable); } } break; } case KDbLookupFieldSchemaRecordSource::Query: { KDbQuerySchema *lookupQuery - = field->table()->connection()->querySchema(lookupFieldSchema->recordSource().name()); + = conn->querySchema(lookupFieldSchema->recordSource().name()); if (!lookupQuery) //! @todo errmsg return; if (multipleLookupColumnJoined) { /*qDebug() << "--- Orig query: "; qDebug() << *lookupQuery; qDebug() << field->table()->connection()->selectStatement(*lookupQuery);*/ - d->privateQuery = new KDbQuerySchema(*lookupQuery); + d->privateQuery = new KDbQuerySchema(*lookupQuery, conn); } else { d->visibleColumnsToShow = visibleColumns; qSort(d->visibleColumnsToShow); // because we will depend on a sorted list - cursor = field->table()->connection()->prepareQuery(lookupQuery); + cursor = conn->prepareQuery(lookupQuery); } break; } default:; } if (multipleLookupColumnJoined && d->privateQuery) { // append a column computed using multiple columns - const KDbQueryColumnInfo::Vector fieldsExpanded(d->privateQuery->fieldsExpanded()); + const KDbQueryColumnInfo::Vector fieldsExpanded(d->privateQuery->fieldsExpanded(conn)); int fieldsExpandedSize(fieldsExpanded.size()); KDbExpression expr; QList::ConstIterator it(visibleColumns.constBegin()); @@ -308,8 +308,8 @@ // #endif //! @todo ... - qDebug() << "--- Private query:" << *d->privateQuery; - cursor = field->table()->connection()->prepareQuery(d->privateQuery); + qDebug() << "--- Private query:" << KDbConnectionAndQuerySchema(conn, *d->privateQuery); + cursor = conn->prepareQuery(d->privateQuery); } if (!cursor) //! @todo errmsg @@ -384,7 +384,8 @@ else { // record source type is Query // Set width to 0 and disable resizing of columns that shouldn't be visible - const KDbQueryColumnInfo::Vector fieldsExpanded(d->tv->cursor()->query()->fieldsExpanded()); + const KDbQueryColumnInfo::Vector fieldsExpanded( + d->tv->cursor()->query()->fieldsExpanded(d->tv->cursor()->connection())); QList::ConstIterator visibleColumnsToShowIt = d->visibleColumnsToShow.constBegin(); for (int i = 0; i < fieldsExpanded.count(); ++i) { bool show = visibleColumnsToShowIt != d->visibleColumnsToShow.constEnd() && i == *visibleColumnsToShowIt; diff --git a/src/widget/tableview/kexicomboboxtableedit.h b/src/widget/tableview/kexicomboboxtableedit.h --- a/src/widget/tableview/kexicomboboxtableedit.h +++ b/src/widget/tableview/kexicomboboxtableedit.h @@ -97,7 +97,7 @@ /*! \return total size of this editor, including popup button. */ virtual QSize totalSize() const; - virtual void createInternalEditor(KDbQuerySchema& schema); + virtual void createInternalEditor(KDbConnection *conn, const KDbQuerySchema& schema); /*! Reimplemented after KexiInputTableEdit. */ virtual void handleAction(const QString& actionName); @@ -132,6 +132,9 @@ void slotPopupHidden(); protected: + //! Implemented for KexiComboBoxBase + KDbConnection *connection() override; + //! internal void updateFocus(const QRect& r); diff --git a/src/widget/tableview/kexicomboboxtableedit.cpp b/src/widget/tableview/kexicomboboxtableedit.cpp --- a/src/widget/tableview/kexicomboboxtableedit.cpp +++ b/src/widget/tableview/kexicomboboxtableedit.cpp @@ -61,6 +61,7 @@ KDbTableViewColumn* visibleTableViewColumn; KexiTableEdit* internalEditor; int arrowWidth; + KDbConnection *connection = nullptr; }; //====================================================== @@ -79,7 +80,7 @@ connect(m_lineedit, SIGNAL(textChanged(QString)), this, SLOT(slotLineEditTextChanged(QString))); - m_rightMarginWhenFocused = this->column()->isReadOnly() ? 0 : d->button->width(); + m_rightMarginWhenFocused = (isReadOnly() || this->column()->isReadOnly()) ? 0 : d->button->width(); m_rightMarginWhenFocused -= RIGHT_MARGIN_DELTA; updateLineEditStyleSheet(); m_rightMarginWhenFocused += RIGHT_MARGIN_DELTA; @@ -92,8 +93,14 @@ delete d; } -void KexiComboBoxTableEdit::createInternalEditor(KDbQuerySchema& schema) +KDbConnection *KexiComboBoxTableEdit::connection() { + return d->connection; +} + +void KexiComboBoxTableEdit::createInternalEditor(KDbConnection *conn, const KDbQuerySchema& schema) +{ + d->connection = conn; if (!m_column->visibleLookupColumnInfo() || d->visibleTableViewColumn/*sanity*/) return; const KDbField::Type t = m_column->visibleLookupColumnInfo()->field()->type(); @@ -108,7 +115,7 @@ KDbQueryColumnInfo *visibleLookupColumnInfo = 0; if (ci->indexForVisibleLookupValue() != -1) { //Lookup field is defined - visibleLookupColumnInfo = schema.expandedOrInternalField(ci->indexForVisibleLookupValue()); + visibleLookupColumnInfo = schema.expandedOrInternalField(conn, ci->indexForVisibleLookupValue()); } d->visibleTableViewColumn = new KDbTableViewColumn(schema, ci, visibleLookupColumnInfo); //! todo set d->internalEditor visible and use it to enable data entering by hand @@ -136,11 +143,13 @@ void KexiComboBoxTableEdit::resize(int w, int h) { d->totalSize = QSize(w, h); - if (!column()->isReadOnly()) { + if (isReadOnly() || column()->isReadOnly()) { + m_rightMarginWhenFocused = 0; + } else { + m_rightMarginWhenFocused = d->button->width(); d->button->resize(h, h); QWidget::resize(w, h); } - m_rightMarginWhenFocused = column()->isReadOnly() ? 0 : d->button->width(); m_rightMarginWhenFocused -= RIGHT_MARGIN_DELTA; updateLineEditStyleSheet(); m_rightMarginWhenFocused += RIGHT_MARGIN_DELTA; @@ -159,7 +168,7 @@ // internal void KexiComboBoxTableEdit::updateFocus(const QRect& r) { - if (!column()->isReadOnly()) { + if (!isReadOnly() && !column()->isReadOnly()) { if (d->button->width() > r.width()) moveChild(d->button, r.right() + 1, r.top()); else @@ -223,7 +232,7 @@ { // this method is sometimes called by hand: // do not allow to simulate clicks when the button is disabled - if (column()->isReadOnly() || !d->button->isEnabled()) + if (isReadOnly() || column()->isReadOnly() || !d->button->isEnabled()) return; if (m_mouseBtnPressedWhenPopupVisible) { @@ -253,7 +262,7 @@ void KexiComboBoxTableEdit::show() { KexiInputTableEdit::show(); - if (!column()->isReadOnly()) { + if (!isReadOnly() && !column()->isReadOnly()) { d->button->show(); } } @@ -327,7 +336,7 @@ return true; } } - if (!column()->isReadOnly() && e->type() == QEvent::MouseButtonPress + if (!isReadOnly() && !column()->isReadOnly() && e->type() == QEvent::MouseButtonPress && qobject_cast(parentWidget())) { QPoint gp = static_cast(e)->globalPos() + d->button->pos(); diff --git a/src/widget/tableview/kexitableedit.h b/src/widget/tableview/kexitableedit.h --- a/src/widget/tableview/kexitableedit.h +++ b/src/widget/tableview/kexitableedit.h @@ -55,7 +55,7 @@ //! Implemented for KexiDataItemInterface. //! Does nothing because instead KDbTableViewColumn is used to get field's schema. - virtual void setColumnInfo(KDbQueryColumnInfo *); + void setColumnInfo(KDbConnection *conn, KDbQueryColumnInfo *cinfo) override; //! \return column information for this item //! (extended information, comparing to field()). @@ -169,7 +169,7 @@ /*! Created internal editor for this editor is needed. This method is only implemented in KexiComboBoxTableEdit since it's visible value differs from internal value, so a different KexiTableEdit object is used to displaying the data. */ - virtual void createInternalEditor(KDbQuerySchema& schema); + virtual void createInternalEditor(KDbConnection *conn, const KDbQuerySchema& schema); Q_SIGNALS: void editRequested(); diff --git a/src/widget/tableview/kexitableedit.cpp b/src/widget/tableview/kexitableedit.cpp --- a/src/widget/tableview/kexitableedit.cpp +++ b/src/widget/tableview/kexitableedit.cpp @@ -97,7 +97,7 @@ return m_column->columnInfo(); } -void KexiTableEdit::setColumnInfo(KDbQueryColumnInfo *) +void KexiTableEdit::setColumnInfo(KDbConnection *, KDbQueryColumnInfo *) { } @@ -148,9 +148,10 @@ return QWidget::size(); } -void KexiTableEdit::createInternalEditor(KDbQuerySchema& schema) +void KexiTableEdit::createInternalEditor(KDbConnection *conn, const KDbQuerySchema& schema) { - Q_UNUSED(schema); + Q_UNUSED(conn) + Q_UNUSED(schema) } const KDbField *KexiTableEdit::displayedField()