kexi

kexiqueryview.cpp

00001 /* This file is part of the KDE project
00002    Copyright (C) 2004 Lucijan Busch <lucijan@kde.org>
00003    Copyright (C) 2004, 2006 Jaroslaw Staniek <js@iidea.pl>
00004 
00005    This program is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Library General Public
00007    License as published by the Free Software Foundation; either
00008    version 2 of the License, or (at your option) any later version.
00009 
00010    This program is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Library General Public License for more details.
00014 
00015    You should have received a copy of the GNU Library General Public License
00016    along with this program; see the file COPYING.  If not, write to
00017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018  * Boston, MA 02110-1301, USA.
00019 */
00020 
00021 #include <kexiproject.h>
00022 #include <kexidb/connection.h>
00023 #include <kexidb/parser/parser.h>
00024 #include <kexidb/cursor.h>
00025 #include <keximainwindow.h>
00026 #include <kexiutils/utils.h>
00027 
00028 #include "kexiqueryview.h"
00029 #include "kexiquerydesignersql.h"
00030 #include "kexiquerydesignerguieditor.h"
00031 #include "kexiquerypart.h"
00032 #include <widget/tableview/kexitableview.h>
00033 #include <widget/kexiqueryparameters.h>
00034 
00036 class KexiQueryView::Private
00037 {
00038     public:
00039         Private()
00040             : cursor(0)
00041 //          , queryHasBeenChangedInViewMode( Kexi::NoViewMode )
00042         {}
00043         ~Private() {}
00044         KexiDB::Cursor *cursor;
00048 //      int queryHasBeenChangedInViewMode;
00049 };
00050 
00051 //---------------------------------------------------------------------------------
00052 
00053 KexiQueryView::KexiQueryView(KexiMainWindow *win, QWidget *parent, const char *name)
00054  : KexiDataTable(win, parent, name)
00055  , d( new Private() )
00056 {
00057     tableView()->setInsertingEnabled(false); //default
00058 }
00059 
00060 KexiQueryView::~KexiQueryView()
00061 {
00062     if (d->cursor)
00063         d->cursor->connection()->deleteCursor(d->cursor);
00064     delete d;
00065 }
00066 
00067 tristate KexiQueryView::executeQuery(KexiDB::QuerySchema *query)
00068 {
00069     if (!query)
00070         return false;
00071     KexiUtils::WaitCursor wait;
00072     KexiDB::Cursor *oldCursor = d->cursor;
00073     KexiDB::debug( query->parameters() );
00074     bool ok;
00075     QValueList<QVariant> params;
00076     {
00077         KexiUtils::WaitCursorRemover remover;
00078         params = KexiQueryParameters::getParameters(this, 
00079             *mainWin()->project()->dbConnection()->driver(), *query, ok);
00080     }
00081     if (!ok) {//input cancelled
00082         return cancelled;
00083     }
00084     d->cursor = mainWin()->project()->dbConnection()->executeQuery(*query, params);
00085     if (!d->cursor) {
00086         parentDialog()->setStatus(parentDialog()->mainWin()->project()->dbConnection(), 
00087             i18n("Query executing failed."));
00088         //todo: also provide server result and sql statement
00089         return false;
00090     }
00091     setData(d->cursor);
00092 
00094     d->cursor->close();
00095 
00096     if (oldCursor)
00097         oldCursor->connection()->deleteCursor(oldCursor);
00098 
00100     tableView()->setReadOnly( true );
00102     //set data model itself read-only too
00103     tableView()->data()->setReadOnly( true );
00104     tableView()->setInsertingEnabled( false );
00105     return true;
00106 }
00107 
00108 tristate KexiQueryView::afterSwitchFrom(int mode)
00109 {
00110     if (mode==Kexi::NoViewMode) {
00111         KexiDB::QuerySchema *querySchema = static_cast<KexiDB::QuerySchema *>(parentDialog()->schemaData());
00112         const tristate result = executeQuery(querySchema);
00113         if (true != result)
00114             return result;
00115     }
00116     else if (mode==Kexi::DesignViewMode || Kexi::TextViewMode) {
00117         KexiQueryPart::TempData * temp = static_cast<KexiQueryPart::TempData*>(parentDialog()->tempData());
00118 
00119         //remember what view we should use to store data changes, if needed
00120 //      if (temp->queryChangedInPreviousView)
00121 //          d->queryHasBeenChangedInViewMode = mode;
00122 //      else
00123 //          d->queryHasBeenChangedInViewMode = Kexi::NoViewMode;
00124 
00125         const tristate result = executeQuery(temp->query());
00126         if (true != result)
00127             return result;
00128     }
00129     return true;
00130 }
00131 
00132 KexiDB::SchemaData* KexiQueryView::storeNewData(const KexiDB::SchemaData& sdata, bool &cancel)
00133 {
00134     KexiViewBase * view = parentDialog()->viewThatRecentlySetDirtyFlag();
00135     if (dynamic_cast<KexiQueryDesignerGuiEditor*>(view))
00136         return dynamic_cast<KexiQueryDesignerGuiEditor*>(view)->storeNewData(sdata, cancel);
00137     if (dynamic_cast<KexiQueryDesignerSQLView*>(view))
00138         return dynamic_cast<KexiQueryDesignerSQLView*>(view)->storeNewData(sdata, cancel);
00139     return 0;
00140 }
00141 
00142 tristate KexiQueryView::storeData(bool dontAsk)
00143 {
00144     KexiViewBase * view = parentDialog()->viewThatRecentlySetDirtyFlag();
00145     if (dynamic_cast<KexiQueryDesignerGuiEditor*>(view))
00146         return dynamic_cast<KexiQueryDesignerGuiEditor*>(view)->storeData(dontAsk);
00147     if (dynamic_cast<KexiQueryDesignerSQLView*>(view))
00148         return dynamic_cast<KexiQueryDesignerSQLView*>(view)->storeData(dontAsk);
00149     return false;
00150 }
00151 
00152 
00153 #include "kexiqueryview.moc"
00154 
KDE Home | KDE Accessibility Home | Description of Access Keys