|
|
//*************************************************************************** /* * TOra - An Oracle Toolkit for DBA's and developers * Copyright (C) 2003 Quest Software, Inc * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; only version 2 of * the License is valid for this program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * As a special exception, you have permission to link this program * with the Oracle Client libraries and distribute executables, as long * as you follow the requirements of the GNU GPL in regard to all of the * software in the executable aside from Oracle client libraries. * * Specifically you are not permitted to link this program with the * Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech. * And you are not permitted to distribute binaries compiled against * these libraries without written consent from Quest Software, Inc. * Observe that this does not disallow linking to the Qt Free Edition. * * All trademarks belong to their respective owners. * ****************************************************************************/ #ifndef TONOBLOCKQUERY_H #define TONOBLOCKQUERY_H #include "toconnection.h" #include "tothread.h" #include <time.h> class toResultStats; /** This is class to be able to run a query in the background without * blocking until a response is available from OCI. */ class toNoBlockQuery { private: /** A task to implement running the query. */ class queryTask : public toTask { toNoBlockQuery &Parent; public: queryTask(toNoBlockQuery &parent) : Parent(parent) { } virtual void run(void); }; friend class queryTask; /** This semaphore indicates wether the query is still running. */ toSemaphore Running; /** This semaphore indicates wether the child thread should * continue reading values. */ toSemaphore Continue; /** Lock for all this stuff */ toLock Lock; /** Current location that values are being read. */ toQList::iterator CurrentValue; /** Values read by the task. This can be changed without holding @ref Lock. */ toQList ReadingValues; /** Values ready to be read by client. */ toQList Values; /** Indicator if at end of query. */ bool EOQ; /** Indicator if to quit reading from query. */ bool Quit; /** SQL to execute. */ QString SQL; /** Error string if error occurs. */ toConnection::exception Error; /** Number of rows processed. */ int Processed; /** Parameters to pass to query before execution. */ toQList Param; /** Statistics to be used if any. */ toResultStats *Statistics; /** Description of result */ toQDescList Description; /** When query is executed */ time_t Started; /** Query used to run query */ toQuery *Query; /** Throw error if any. */ void checkError(); /** Stop reading query */ void stop(); public: /** Create a new query. * @param conn Connection to run on. * @param sql SQL to execute. * @param param Parameters to pass to query. * @param statistics Optional statistics widget to update with values from query. */ toNoBlockQuery(toConnection &conn, const QString &sql, const toQList ¶m, toResultStats *statistics=NULL); /** Create a new query. * @param conn Connection to run on. * @param mode Query mode to execute query in. * @param sql SQL to execute. * @param param Parameters to pass to query. * @param statistics Optional statistics widget to update with values from query. */ toNoBlockQuery(toConnection &conn, toQuery::queryMode mode, const QString &sql, const toQList ¶m, toResultStats *statistics=NULL); virtual ~toNoBlockQuery(); /** Poll if any result is available. * @return True if at least one row is available. */ bool poll(void); /** Get description of columns. * @return Description of columns list. Don't modify this list. */ toQDescList &describe(void); /** Read the next value from the query. * @return The next available value. */ toQValue readValue(void); /** Read the next value from the query. Don't send NULL as string. * @return The next available value. */ toQValue readValueNull(void); /** Get the number of rows processed. * @return Number of rows processed. */ int rowsProcessed(void); /** Check if at end of query. * @return True if query is done. */ bool eof(void); }; #endif