xref: /trunk/main/dbaccess/source/ui/dlg/AdabasStat.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_dbaccess.hxx"
30 
31 #ifndef _TOOLS_DEBUG_HXX
32 #include <tools/debug.hxx>
33 #endif
34 #ifndef _CPPUHELPER_EXC_HLP_HXX_
35 #include <cppuhelper/exc_hlp.hxx>
36 #endif
37 #ifndef TOOLS_DIAGNOSE_EX_H
38 #include <tools/diagnose_ex.h>
39 #endif
40 #ifndef _DBAUI_ADASTAT_HXX_
41 #include "AdabasStat.hxx"
42 #endif
43 #ifndef _COMPHELPER_TYPES_HXX_
44 #include <comphelper/types.hxx>
45 #endif
46 #ifndef _COM_SUN_STAR_SDBC_XSTATEMENT_HPP_
47 #include <com/sun/star/sdbc/XStatement.hpp>
48 #endif
49 #ifndef _COM_SUN_STAR_SDBC_XROW_HPP_
50 #include <com/sun/star/sdbc/XRow.hpp>
51 #endif
52 #ifndef _COM_SUN_STAR_SDBC_XRESULTSET_HPP_
53 #include <com/sun/star/sdbc/XResultSet.hpp>
54 #endif
55 #ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
56 #include <com/sun/star/beans/XPropertySet.hpp>
57 #endif
58 #ifndef DBAUI_ADABASSTAT_HRC
59 #include "AdabasStat.hrc"
60 #endif
61 #ifndef _DBU_DLG_HRC_
62 #include "dbu_dlg.hrc"
63 #endif
64 #ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
65 #include "dbustrings.hrc"
66 #endif
67 #ifndef DBAUI_TOOLS_HXX
68 #include "UITools.hxx"
69 #endif
70 #ifndef _CONNECTIVITY_DBTOOLS_HXX_
71 #include <connectivity/dbtools.hxx>
72 #endif
73 #ifndef _DBAUI_SQLMESSAGE_HXX_
74 #include "sqlmessage.hxx"
75 #endif
76 
77 using namespace dbaui;
78 DBG_NAME(OAdabasStatistics)
79 namespace dbaui
80 {
81     using namespace dbtools;
82     using namespace ::com::sun::star::uno;
83     using namespace ::com::sun::star::beans;
84     using namespace ::com::sun::star::sdbc;
85     using namespace ::com::sun::star::lang;
86 
87 
88 
89 OAdabasStatistics::OAdabasStatistics( Window* pParent,
90                                      const ::rtl::OUString& _rUser,
91                                      const Reference< ::com::sun::star::sdbc::XConnection >& _xCurrentConnection,
92                                      const Reference< XMultiServiceFactory >& _xFactory)
93     : ModalDialog( pParent, ModuleRes(DLG_ADABASSTAT) )
94     ,m_FL_FILES(            this , ModuleRes(FL_FILES))
95     ,m_FT_SYSDEVSPACE(      this , ModuleRes(FT_SYSDEVSPACE))
96     ,m_ET_SYSDEVSPACE(      this , STR_ADABAS_HELP_SYSDEVSPACE,ModuleRes(ET_SYSDEVSPACE))
97     ,m_FT_TRANSACTIONLOG(   this , ModuleRes(FT_TRANSACTIONLOG))
98     ,m_ET_TRANSACTIONLOG(   this , STR_ADABAS_HELP_TRANSACT,ModuleRes(ET_TRANSACTIONLOG))
99     ,m_FT_DATADEVSPACE(     this , ModuleRes(FT_DATADEVSPACE))
100     ,m_LB_DATADEVS(         this , STR_ADABAS_HELP_DATADEVSPACES,ModuleRes(LB_DATADEVS))
101     ,m_FL_SIZES(            this , ModuleRes(FL_SIZES))
102     ,m_FT_SIZE(             this , ModuleRes(FT_SIZE))
103     ,m_ET_SIZE(             this , STR_ADABAS_HELP_SIZE,ModuleRes(ET_SIZE))
104     ,m_FT_FREESIZE(         this , ModuleRes(FT_FREESIZE))
105     ,m_ET_FREESIZE(         this , STR_ADABAS_HELP_FREESIZE,ModuleRes(ET_FREESIZE))
106     ,m_FT_MEMORYUSING(      this , ModuleRes(FT_MEMORYUSING))
107     ,m_ET_MEMORYUSING(      this , STR_ADABAS_HELP_MEMORYUSING,ModuleRes(ET_MEMORYUSING))
108     ,m_PB_OK(               this , ModuleRes(PB_OK))
109     ,m_xConnection(_xCurrentConnection)
110     ,m_bErrorShown(sal_False)
111 {
112     DBG_CTOR(OAdabasStatistics,NULL);
113 
114     FreeResource();
115 
116     DBG_ASSERT(m_xConnection.is(),"No connection");
117     if(m_xConnection.is())
118     {
119         Reference<XStatement> xStmt;
120         Reference<XResultSet> xRes;
121 
122         sal_Bool bCanSelect     = sal_False;
123         ::rtl::OUString aStmt;
124         ::rtl::OUString sSchema = _rUser.toAsciiUpperCase();
125 
126         Reference<XDatabaseMetaData> xMetaData;
127         // first read the sizes
128         try
129         {
130             xMetaData = m_xConnection->getMetaData();
131             bCanSelect = checkSystemTable(::rtl::OUString::createFromAscii("SERVERDBSTATISTICS"),sSchema);
132 
133             if(bCanSelect)
134             {
135                 aStmt = ::rtl::OUString::createFromAscii("SELECT SERVERDBSIZE, UNUSEDPAGES FROM ");
136 
137                 aStmt += ::dbtools::quoteTableName(xMetaData,sSchema,::dbtools::eInDataManipulation);
138                 aStmt += ::rtl::OUString::createFromAscii(".\"SERVERDBSTATISTICS\"");
139 
140                 xStmt = m_xConnection->createStatement();
141                 xRes = xStmt->executeQuery(aStmt);
142 
143 
144                 Reference<XRow> xRow(xRes,UNO_QUERY);
145                 // first the db sizes
146                 if(xRes.is() && xRes->next())
147                 {
148                     double nUsedPages = xRow->getInt(1) / 256;
149                     double nFreePages = xRow->getInt(2) / 256;
150 
151                     m_ET_SIZE.SetText(::rtl::OUString::valueOf((sal_Int32)nUsedPages));
152                     m_ET_FREESIZE.SetText(::rtl::OUString::valueOf((sal_Int32)nFreePages));
153                     m_ET_MEMORYUSING.SetValue(static_cast<sal_Int32>(((nUsedPages-nFreePages)/nUsedPages)*100));
154                 }
155                 else
156                     showError();
157 
158                 xRow = NULL;
159             }
160             else
161                 showError();
162         }
163         catch(const SQLException& )
164         {
165             ::dbaui::showError( SQLExceptionInfo( ::cppu::getCaughtException() ), pParent, _xFactory );
166         }
167         catch( const Exception& )
168         {
169             DBG_UNHANDLED_EXCEPTION();
170         }
171         try
172         {
173             ::comphelper::disposeComponent(xStmt);
174         }
175         catch( const Exception& )
176         {
177             DBG_UNHANDLED_EXCEPTION();
178         }
179 
180         // now fill the datadev spaces
181         if(bCanSelect)
182         {
183             try
184             {
185                 bCanSelect = checkSystemTable(::rtl::OUString::createFromAscii("DATADEVSPACES"),sSchema);
186 
187                 if(bCanSelect)
188                 {
189                     // then the db files
190                     aStmt = ::rtl::OUString::createFromAscii("SELECT DEVSPACENAME FROM ");
191                     aStmt += ::dbtools::quoteTableName(xMetaData,sSchema,::dbtools::eInDataManipulation);
192                     aStmt += ::rtl::OUString::createFromAscii(".\"DATADEVSPACES\"");
193                     xStmt = m_xConnection->createStatement();
194                     xRes = xStmt->executeQuery(aStmt);
195 
196                     Reference<XRow> xRow(xRes,UNO_QUERY);
197                     while(xRes.is() && xRes->next())
198                     {
199                         m_LB_DATADEVS.InsertEntry(xRow->getString(1));
200                     }
201                     if(!m_LB_DATADEVS.GetEntryCount())
202                         showError();
203                 }
204                 else
205                     showError();
206             }
207             catch(const SQLException& e)
208             {
209                 ::dbaui::showError(SQLExceptionInfo(e),pParent,_xFactory);
210             }
211             catch( const Exception& )
212             {
213                 DBG_UNHANDLED_EXCEPTION();
214             }
215             try
216             {
217                 ::comphelper::disposeComponent(xStmt);
218             }
219             catch( const Exception& )
220             {
221                 DBG_UNHANDLED_EXCEPTION();
222             }
223 
224             // now fill the sysdatadev spaces
225             if(bCanSelect)
226             {
227                 try
228                 {
229                     bCanSelect = checkSystemTable(::rtl::OUString::createFromAscii("CONFIGURATION"),sSchema);
230 
231                     if(bCanSelect)
232                     {
233                         aStmt = ::rtl::OUString::createFromAscii("SELECT * FROM ");
234                         aStmt += ::dbtools::quoteTableName(xMetaData,sSchema,::dbtools::eInDataManipulation);
235                         aStmt += ::rtl::OUString::createFromAscii(".CONFIGURATION WHERE DESCRIPTION LIKE 'SYS%DEVSPACE%NAME'");
236                         xStmt = m_xConnection->createStatement();
237                         xRes = xStmt->executeQuery(aStmt);
238                         if(xRes.is() && xRes->next())
239                         {
240                             Reference<XRow> xRow(xRes,UNO_QUERY);
241                             m_ET_SYSDEVSPACE.SetText(xRow->getString(2));
242                         }
243                         else
244                             showError();
245 
246                         aStmt = ::rtl::OUString::createFromAscii("SELECT * FROM ");
247                         aStmt += ::dbtools::quoteTableName(xMetaData,sSchema,::dbtools::eInDataManipulation);
248                         aStmt += ::rtl::OUString::createFromAscii(".CONFIGURATION WHERE DESCRIPTION = 'TRANSACTION LOG NAME'");
249                         xRes = xStmt->executeQuery(aStmt);
250                         if(xRes.is() && xRes->next())
251                         {
252                             Reference<XRow> xRow(xRes,UNO_QUERY);
253                             m_ET_TRANSACTIONLOG.SetText(xRow->getString(2));
254                         }
255                         else
256                             showError();
257                     }
258                     else
259                         showError();
260                 }
261                 catch(const SQLException& e)
262                 {
263                     ::dbaui::showError(SQLExceptionInfo(e),pParent,_xFactory);
264                 }
265                 catch( const Exception& )
266                 {
267                     DBG_UNHANDLED_EXCEPTION();
268                 }
269                 try
270                 {
271                     ::comphelper::disposeComponent(xStmt);
272                 }
273                 catch( const Exception& )
274                 {
275                     DBG_UNHANDLED_EXCEPTION();
276                 }
277             }
278         }
279     }
280 
281     m_ET_SYSDEVSPACE.SetSpecialReadOnly(sal_True);
282     m_ET_TRANSACTIONLOG.SetSpecialReadOnly(sal_True);
283     m_LB_DATADEVS.SetSpecialReadOnly(sal_True);
284     m_ET_SIZE.SetSpecialReadOnly(sal_True);
285     m_ET_FREESIZE.SetSpecialReadOnly(sal_True);
286     m_ET_MEMORYUSING.SetSpecialReadOnly(sal_True);
287 }
288 //------------------------------------------------------------------------
289 OAdabasStatistics::~OAdabasStatistics()
290 {
291     DBG_DTOR(OAdabasStatistics,NULL);
292 }
293 // -----------------------------------------------------------------------------
294 sal_Bool OAdabasStatistics::checkSystemTable(const ::rtl::OUString& _rsSystemTable, ::rtl::OUString& _rsSchemaName )
295 {
296     sal_Bool bCanSelect = sal_False;
297     Reference<XDatabaseMetaData> xMeta = m_xConnection->getMetaData();
298     if ( xMeta.is() )
299     {
300         Reference<XResultSet> xRes = xMeta->getTablePrivileges(Any(),::rtl::OUString::createFromAscii("%"),  _rsSystemTable);
301         if(xRes.is())
302         {
303             Reference<XRow> xRow(xRes,UNO_QUERY);
304             static const ::rtl::OUString sSelect = ::rtl::OUString::createFromAscii("SELECT");
305             // first the db sizes
306             while( xRow.is() && xRes->next() )
307             {
308                 _rsSchemaName = xRow->getString(2);
309                 if(sSelect == xRow->getString(6) && !xRow->wasNull())
310                 {
311                     bCanSelect = sal_True;
312                     break;
313                 }
314             }
315             ::comphelper::disposeComponent(xRes);
316         }
317     }
318 
319     return bCanSelect;
320 }
321 // -----------------------------------------------------------------------------
322 void OAdabasStatistics::showError()
323 {
324     if(!m_bErrorShown)
325     {
326         OSQLMessageBox aMsg(GetParent(),GetText(),String(ModuleRes(STR_ADABAS_ERROR_SYSTEMTABLES)));
327         aMsg.Execute();
328         m_bErrorShown = sal_True;
329     }
330 }
331 // -----------------------------------------------------------------------------
332 }
333 
334