kexi

object.cpp

00001 /* This file is part of the KDE project
00002    Copyright (C) 2003-2005 Jaroslaw Staniek <js@iidea.pl>
00003 
00004    This program is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License as published by the Free Software Foundation; either
00007    version 2 of the License, or (at your option) any later version.
00008 
00009    This program is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Library General Public License for more details.
00013 
00014    You should have received a copy of the GNU Library General Public License
00015    along with this program; see the file COPYING.  If not, write to
00016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017  * Boston, MA 02110-1301, USA.
00018 */
00019 
00020 #include <kexidb/object.h>
00021 #include <kexidb/error.h>
00022 #include <kexidb/msghandler.h>
00023 
00024 #include <klocale.h>
00025 #include <kdebug.h>
00026 
00027 using namespace KexiDB;
00028 
00029 #define ERRMSG(a) \
00030     { if (m_msgHandler) m_msgHandler->showErrorMessage(a); }
00031 
00032 Object::Object(MessageHandler* handler)
00033 : m_previousServerResultNum(0)
00034 , m_previousServerResultNum2(0)
00035 , m_msgHandler(handler)
00036 , d(0) //empty
00037 {
00038     clearError();
00039 }
00040 
00041 Object::~Object()
00042 {
00043 }
00044 
00045 #define STORE_PREV_ERR \
00046     m_previousServerResultNum = m_previousServerResultNum2; \
00047     m_previousServerResultName = m_previousServerResultName2; \
00048     m_previousServerResultNum2 = serverResult(); \
00049     m_previousServerResultName2 = serverResultName(); \
00050     KexiDBDbg << "Object ERROR: " << m_previousServerResultNum2 << ": " \
00051         << m_previousServerResultName2 <<endl
00052 
00053 void Object::setError( int code, const QString &msg )
00054 {
00055     STORE_PREV_ERR;
00056 
00057     m_errno=code;
00058     m_errorSql = m_sql;
00059     if (m_errno==ERR_OTHER && msg.isEmpty())
00060         m_errMsg = i18n("Unspecified error encountered");
00061     else
00062         m_errMsg = msg;
00063     m_hasError = code!=ERR_NONE;
00064 
00065     if (m_hasError)
00066         ERRMSG(this);
00067 }
00068 
00069 void Object::setError( const QString &msg )
00070 {
00071     setError( ERR_OTHER, msg );
00072 }
00073 
00074 void Object::setError( const QString& title, const QString &msg )
00075 {
00076     STORE_PREV_ERR;
00077 
00078     m_errno=ERR_OTHER;
00079     QString origMsgTitle( m_msgTitle ); //store
00080     
00081     m_msgTitle += title;
00082     m_errMsg = msg;
00083     m_errorSql = m_sql;
00084     m_hasError = true;
00085     if (m_hasError)
00086         ERRMSG(this);
00087         
00088     m_msgTitle = origMsgTitle; //revert 
00089 }
00090 
00091 void Object::setError( KexiDB::Object *obj, const QString& prependMessage )
00092 {
00093     setError( obj, obj ? obj->errorNum() : ERR_OTHER, prependMessage );
00094 }
00095 
00096 void Object::setError( KexiDB::Object *obj, int code, const QString& prependMessage )
00097 {
00098     if (obj && (obj->errorNum()!=0 || !obj->serverErrorMsg().isEmpty())) {
00099         STORE_PREV_ERR;
00100 
00101         m_errno = obj->errorNum();
00102         m_hasError = obj->error();
00103         if (m_errno==0) {
00104             m_errno = code;
00105             m_hasError = true;
00106         }
00107         m_errMsg = (prependMessage.isEmpty() ? QString::null : (prependMessage + " ")) 
00108             + obj->errorMsg();
00109         m_sql = obj->m_sql;
00110         m_errorSql = obj->m_errorSql;
00111         m_serverResult = obj->serverResult();
00112         if (m_serverResult==0) //try copied
00113             m_serverResult = obj->m_serverResult;
00114         m_serverResultName = obj->serverResultName();
00115         if (m_serverResultName.isEmpty()) //try copied
00116             m_serverResultName = obj->m_serverResultName;
00117         m_serverErrorMsg = obj->serverErrorMsg();
00118         if (m_serverErrorMsg.isEmpty()) //try copied
00119             m_serverErrorMsg = obj->m_serverErrorMsg;
00120         //override
00121         if (code!=0 && code!=ERR_OTHER)
00122             m_errno = code;
00123         if (m_hasError)
00124             ERRMSG(this);
00125     }
00126     else {
00127         setError( code!=0 ? code : ERR_OTHER, prependMessage );
00128     }
00129 }
00130 
00131 void Object::clearError()
00132 { 
00133     m_errno = 0;
00134     m_hasError = false;
00135     m_errMsg = QString::null;
00136     m_sql = QString::null;
00137     m_errorSql = QString::null;
00138     m_serverResult = 0;
00139     m_serverResultName = QString::null;
00140     m_serverErrorMsg = QString::null;
00141     drv_clearServerResult();
00142 }
00143 
00144 QString Object::serverErrorMsg()
00145 {
00146     return m_serverErrorMsg;
00147 }
00148 
00149 int Object::serverResult()
00150 {
00151     return m_serverResult;
00152 }
00153 
00154 QString Object::serverResultName()
00155 {
00156     return m_serverResultName;
00157 }
00158 
00159 void Object::debugError()
00160 {
00161     if (error()) {
00162         KexiDBDbg << "KEXIDB ERROR: " << errorMsg() << endl;
00163         QString s = serverErrorMsg(), sn = serverResultName();
00164         if (!s.isEmpty())
00165             KexiDBDbg << "KEXIDB SERVER ERRMSG: " << s << endl;
00166         if (!sn.isEmpty())
00167             KexiDBDbg << "KEXIDB SERVER RESULT NAME: " << sn << endl;
00168         if (serverResult()!=0)
00169             KexiDBDbg << "KEXIDB SERVER RESULT #: " << serverResult() << endl;
00170     } else
00171         KexiDBDbg << "KEXIDB OK." << endl;
00172 }
00173 
00174 int Object::askQuestion( const QString& message, 
00175     KMessageBox::DialogType dlgType, KMessageBox::ButtonCode defaultResult,
00176     const KGuiItem &buttonYes, 
00177     const KGuiItem &buttonNo,
00178     const QString &dontShowAskAgainName,
00179     int options, 
00180     MessageHandler* msgHandler )
00181 {
00182     if (msgHandler)
00183         return msgHandler->askQuestion(message, dlgType, defaultResult, buttonYes, buttonNo, 
00184             dontShowAskAgainName, options);
00185 
00186     if (m_msgHandler)
00187         return m_msgHandler->askQuestion(message, dlgType, defaultResult, buttonYes, buttonNo, 
00188             dontShowAskAgainName, options);
00189 
00190     return defaultResult;
00191 }
KDE Home | KDE Accessibility Home | Description of Access Keys