From: <ibr...@us...> - 2009-11-10 18:43:46
|
Revision: 3349 http://tora.svn.sourceforge.net/tora/?rev=3349&view=rev Author: ibre5041 Date: 2009-11-10 18:43:34 +0000 (Tue, 10 Nov 2009) Log Message: ----------- This is a starter of a new TOra tool. Modified Paths: -------------- branches/tora-trotl/src/CMakeLists.txt Added Paths: ----------- branches/tora-trotl/src/icons/awrtool.xpm branches/tora-trotl/src/toawr.cpp branches/tora-trotl/src/toawr.h Modified: branches/tora-trotl/src/CMakeLists.txt =================================================================== --- branches/tora-trotl/src/CMakeLists.txt 2009-11-10 18:41:21 UTC (rev 3348) +++ branches/tora-trotl/src/CMakeLists.txt 2009-11-10 18:43:34 UTC (rev 3349) @@ -239,6 +239,8 @@ # docklets docklets/toviewconnections.h docklets/toviewdirectory.h +# + toawr.h ) IF (ORACLE_FOUND) LIST(APPEND TORA_MOC_CLASSES tooraclesetting.h) @@ -412,6 +414,8 @@ # docklets docklets/toviewconnections.cpp docklets/toviewdirectory.cpp + # + toawr.cpp ) # compiled in icons for windows IF (WIN32 AND MSVC) @@ -583,7 +587,19 @@ SET_TARGET_PROPERTIES(trotl_test2 PROPERTIES COMPILE_FLAGS "-DTROTL_DLL") TARGET_LINK_LIBRARIES(trotl_test2 ${TORA_LIBS} ${TORA_MOC_LIB}) +ADD_EXECUTABLE(trotl_test3 ${GUI_TYPE} + trotl_test3.cpp +# ${TORA_I18N_QM} +# ${TORA_MOC_SOURCES} + ${TORA_SOURCES} +# ${TORA_UI_SOURCES} + ${TORA_RCC_SRCS} + ${APPLE_BUNDLE_SOURCES} +) +SET_TARGET_PROPERTIES(trotl_test3 PROPERTIES COMPILE_FLAGS "-DTROTL_DLL") +TARGET_LINK_LIBRARIES(trotl_test3 ${TORA_LIBS} ${TORA_MOC_LIB}) + # Install IF (WIN32) INSTALL(TARGETS ${EXE_NAME} RUNTIME DESTINATION .) Added: branches/tora-trotl/src/icons/awrtool.xpm =================================================================== --- branches/tora-trotl/src/icons/awrtool.xpm (rev 0) +++ branches/tora-trotl/src/icons/awrtool.xpm 2009-11-10 18:43:34 UTC (rev 3349) @@ -0,0 +1,25 @@ +/* XPM */ +static char * awrtool_xpm[] = { +"16 16 6 1", +" c None", +". c #000000", +"+ c #FFFFFF", +"@ c #7D7D7D", +"# c #333333", +"$ c #C2C2C2", +" ...... ", +" ..++++. ", +" .+.++++. ", +" .++.++++. ", +" .....++++. ", +" .+++....+. ", +" .++.++@.+. ", +" .+#$++@.+. ", +" .+#+++@.+. ", +" .+.+++@.+. ", +" .+......+. ", +" .+.+++@.+. ", +" .+.+++@.+. ", +" .+.+++@.+. ", +" .++++++++. ", +" .......... "}; Added: branches/tora-trotl/src/toawr.cpp =================================================================== --- branches/tora-trotl/src/toawr.cpp (rev 0) +++ branches/tora-trotl/src/toawr.cpp 2009-11-10 18:43:34 UTC (rev 3349) @@ -0,0 +1,409 @@ + +/* BEGIN_COMMON_COPYRIGHT_HEADER + * + * TOra - An Oracle Toolkit for DBA's and developers + * + * Shared/mixed copyright is held throughout files in this product + * + * Portions Copyright (C) 2000-2001 Underscore AB + * Portions Copyright (C) 2003-2005 Quest Software, Inc. + * Portions Copyright (C) 2004-2009 Numerous Other Contributors + * + * 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. + * + * You may link this product with any GPL'd Qt library. + * + * All trademarks belong to their respective owners. + * + * END_COMMON_COPYRIGHT_HEADER */ + +#include <iostream> + +#include <list> +#include <sstream> +#include "tora_logger.h" +#include "ts_log/ts_log_utils.h" + +#include <QToolBar> +#include <QLabel> +//#include <qtoolbutton.h> +#include <QLineEdit> +#include <QDateEdit> + +#include <toresultcombo.h> + +#include "totool.h" +#include "toawr.h" +#include "toresultview.h" +#include "toparamget.h" +#include "tochangeconnection.h" + +//#include "tosimplequery.moc" + +#include "icons/execute.xpm" +#include "icons/awrtool.xpm" + +// -- Instances in this Workload Repository schema +// => inst_num +// => dbid +static toSQL SQLDBInstances("toAWR:DBInstances", + "select distinct " + " (case when cd.dbid = wr.dbid and " + " cd.name = wr.db_name and " + " ci.instance_number = wr.instance_number and " + " ci.instance_name = wr.instance_name and " + " ci.host_name = wr.host_name " + " then '* '||wr.dbid||':'||wr.instance_name " + " else ' '||wr.dbid||':'||wr.instance_name " + " end) disp_dbdbid " + " , wr.dbid dbbid " + " , wr.instance_number instt_num " + " , wr.db_name dbb_name " + " , wr.instance_name instt_name " + " , wr.host_name host " + " from dba_hist_database_instance wr, v$database cd, v$instance ci" + " order by wr.startup_time desc", + "Instances in this Workload Repository schema"); + + +// -- +// -- Error reporting + +// whenever sqlerror exit; +// variable max_snap_time char(10); +// declare +// cursor cidnum is +// select 'X' +// from dba_hist_database_instance +// where instance_number = :inst_num +// and dbid = :dbid; + +// cursor csnapid is +// select to_char(max(end_interval_time),'dd/mm/yyyy') +// from dba_hist_snapshot +// where instance_number = :inst_num +// and dbid = :dbid; +// vx char(1); +// begin +// -- Check Database Id/Instance Number is a valid pair +// open cidnum; +// fetch cidnum into vx; +// if cidnum%notfound then +// raise_application_error(-20200, +// 'Database/Instance ' || :dbid || '/' || :inst_num || +// ' does not exist in DBA_HIST_DATABASE_INSTANCE'); +// end if; +// close cidnum; +// -- Check Snapshots exist for Database Id/Instance Number +// open csnapid; +// fetch csnapid into :max_snap_time; +// if csnapid%notfound then +// raise_application_error(-20200, +// 'No snapshots exist for Database/Instance '||:dbid||'/'||:inst_num); +// end if; +// close csnapid; +// end; +// / +// whenever sqlerror continue; + +// tohle asi muzu preskocit +// - validni kombinace <inst_num,dbid> je uz znama +// - <snapid,end_interval_time> nactu do komboboxu (anebo tam bude "No snaps") + + +// -- List available snapshots +static toSQL SQLSnaps("toAWR:Snaps", + " select to_char(s.end_interval_time,'dd Mon YYYY HH24:mi') snapdat \n" + " , di.instance_name inst_name \n" + " , di.db_name db_name \n" + " , s.snap_id snap_id \n" + " , s.snap_level lvl \n" + " , to_char(s.startup_time,'dd Mon \"at\" HH24:mi:ss') instart_fmt \n" + "from dba_hist_snapshot s \n" + " , dba_hist_database_instance di \n" + "where s.dbid = :dbid<varchar[40],in> \n" + " and di.dbid = :dbid<varchar[40],in> \n" + " and s.instance_number = :instnum<varchar[40],in> \n" + " and di.instance_number = :instnum<varchar[40],in> \n" + " and di.dbid = s.dbid \n" + " and di.instance_number = s.instance_number \n" + " and di.startup_time = s.startup_time \n" +// " and s.end_interval_time >= decode( &num_days " +// " , 0 , to_date('31-JAN-9999','DD-MON-YYYY') " +// " , 3.14, s.end_interval_time " +// " , to_date(:max_snap_time,'dd/mm/yyyy') - (&num_days-1)) " + " order by db_name, instance_name, snap_id \n" + , + "List availanble snapshots"); + + +// -- +// -- Error reporting +// whenever sqlerror exit; +static toSQL SQLCheckSnaps("toAWR:CheckSnaps", + " declare \n" + " cursor cspid(vspid dba_hist_snapshot.snap_id%type) is \n" + " select end_interval_time \n" + " , startup_time \n" + " from dba_hist_snapshot \n" + " where snap_id = vspid \n" + " and instance_number = :inst<varchar[40],in> \n" + " and dbid = :dbid<varchar[40],in>; \n" + " bsnapt dba_hist_snapshot.end_interval_time%type; \n" + " bstart dba_hist_snapshot.startup_time%type; \n" + " esnapt dba_hist_snapshot.end_interval_time%type; \n" + " estart dba_hist_snapshot.startup_time%type; \n" + " begin \n" + " -- Check Begin Snapshot id is valid, get corresponding instance startup time \n" + " open cspid(:fsnap<varchar[40],in>); \n" + " fetch cspid into bsnapt, bstart; \n" + " if cspid%notfound then \n" + " raise_application_error(-20200, \n" + " 'Begin Snapshot Id '||:fsnap<varchar[40],in>||' does not exist for this database/instance'); \n" + " end if; \n" + " close cspid; \n" + " -- Check End Snapshot id is valid and get corresponding instance startup time \n" + " open cspid(:tsnap<varchar[40],in>); \n" + " fetch cspid into esnapt, estart; \n" + " if cspid%notfound then \n" + " raise_application_error(-20200, \n" + " 'End Snapshot Id '||:tsnap<varchar[40],in>||' does not exist for this database/instance'); \n" + " end if; \n" + " if esnapt <= bsnapt then \n" + " raise_application_error(-20200, \n" + " 'End Snapshot Id '||:tsnap<varchar[40],in>||' must be greater than Begin Snapshot Id '||:fsnap<varchar[40],in>); \n" + " end if; \n" + " close cspid; \n" + " -- Check startup time is same for begin and end snapshot ids \n" + " if ( bstart != estart) then \n" + " raise_application_error(-20200, \n" + " 'The instance was shutdown between snapshots '||:fsnap<varchar[40],in>||' and '||:tsnap<varchar[40],in>); \n" + " end if; \n" + " end; \n"); + + +class toAWRTool : public toTool +{ +protected: + std::map<toConnection *, QWidget *> Windows; + + virtual const char **pictureXPM(void); +public: + toAWRTool() + : toTool(10003,"AWR") + { } + virtual const char *menuItem() + { + return "Simple Query"; + } + virtual QWidget *toolWindow(QWidget *parent,toConnection &connection) + { + std::map<toConnection *, QWidget *>::iterator i = Windows.find(&connection); + if (i != Windows.end()) + { + (*i).second->raise(); + (*i).second->setFocus(); + return NULL; + } + else + { + QWidget *window = new toAWR(parent, connection); + Windows[&connection] = window; + return window; + } + } + virtual void closeWindow(toConnection &connection) + { + std::map<toConnection *, QWidget *>::iterator i = Windows.find(&connection); + if (i != Windows.end()) + { + std::cerr << "Window deleted:" << std::endl; + Windows.erase(i); + } + } +}; + +const char **toAWRTool::pictureXPM(void) { return const_cast<const char**>(awrtool_xpm); } + + +static toAWRTool AWRTool; + +toAWR::toAWR(/*toTool *tool,*/ QWidget *parent, toConnection &_connection) + : toToolWidget(/* *tool*/AWRTool, "simplequery.html", parent, _connection, "toAWR") +{ + QToolBar *toolbar=toAllocBar(this, tr("Simple Query")); + layout()->addWidget(toolbar); + + toolbar->addWidget(new QLabel("Inst:", toolbar)); + dbid = new toResultCombo(toolbar, "AWR toolbar"); + fsnap = new toResultCombo(toolbar, "AWR toolbar"); + tsnap = new toResultCombo(toolbar, "AWR toolbar"); + connect(dbid, SIGNAL(activated(int)), this, SLOT(instanceChanged(int))); + connect(dbid, SIGNAL(done()), this, SLOT(instanceRead())); + toolbar->addWidget(dbid); + toolbar->addWidget(fsnap); + toolbar->addWidget(tsnap); + try + { + dbid->query(toSQL::sql("toAWR:DBInstances", connection())); + } + TOCATCH; + + + QDateTimeEdit *st = new QDateTimeEdit(QDate::currentDate()); st->setCalendarPopup(true); + QDateTimeEdit *et = new QDateTimeEdit(QDate::currentDate()); st->setCalendarPopup(false); + toolbar->addWidget(st); + toolbar->addWidget(et); + toolbar->addAction(QIcon(QPixmap(const_cast<const char**>(execute_xpm))), + tr("Generate report"), + this, + SLOT(execute())); + toolbar->addWidget(new toSpacer()); + + QAction *executeAct = new QAction(QPixmap(execute_xpm), tr("Execute_ current statement"), this); + executeAct->setShortcut(QKeySequence::Refresh); + connect(executeAct, SIGNAL(triggered()), this, SLOT(refresh(void))); + + new toChangeConnection(toolbar); + + Statement=new QLineEdit(this); + layout()->addWidget(Statement); + //Result=new toResultView(this); + //layout()->addWidget(Result); + + Tabs = new QTabWidget(this); + layout()->addWidget(Tabs); + + connect(Statement, SIGNAL(returnPressed()), this, SLOT(execute())); +} + +void toAWR::execute(void) +{ + try { + //QString sql=Statement->text(); + //toQList params=toParamGet::getParam(this,sql); + //Result->query(sql,params); + //Result->query(sql,toQList()); + + QVariant vdbid = dbid->itemData(dbid->currentIndex()); + QString dbids( vdbid.toStringList().at(0) ); + QString insts( vdbid.toStringList().at(1) ); + + QVariant vf = fsnap->itemData(fsnap->currentIndex()); + QVariant vt = tsnap->itemData(tsnap->currentIndex()); + QString fsnaps( vf.toStringList().at(2) ); + QString tsnaps( vt.toStringList().at(2) ); +// toQList params; +// params.push_back(fsnaps); +// params.push_back(tsnaps); + get_log().ts( std::string(__HERE__)) + << dbids.toAscii().constData() << ' ' + << insts.toAscii().constData() << ' ' + << fsnaps.toAscii().constData() << ' ' + << tsnaps.toAscii().constData() << std::endl; + + toQuery report(connection(), + "select NVL(output,' ') \n" + //"from table(dbms_workload_repository.awr_report_text( \n" + "from table(dbms_workload_repository.awr_report_html( \n" + " :dbid<varchar[40],in>, \n" + " :inst<varchar[40],in>, \n" + " :f<varchar[40],in>, \n" + " :t<varchar[40],in>, 0))", + dbids, insts, fsnaps, tsnaps); + + QString reports; + while (!report.eof()) + { + QString line = report.readValue(); + reports += line; + reports += '\n'; + } + std::cerr << reports.toAscii().constData() << std::endl; + + QWidget *box = new QWidget(Tabs); + QVBoxLayout *vbox = new QVBoxLayout; + vbox->setSpacing(0); + vbox->setContentsMargins(0, 0, 0, 0); + box->setLayout(vbox); + + vbox->addWidget(new QLabel(tr("AWR report"), box)); + QTextBrowser *tb = new QTextBrowser(box); + tb->setFontFamily("monospace"); + tb->setReadOnly(true); + tb->setText(reports); + //tb->setFontFamily("Courier"); + + vbox->addWidget(tb); + Tabs->addTab(box, tr("Redo Switches")); + + } TOCATCH +} + +toAWR::~toAWR() +{ + delete dbid; + delete fsnap; + delete tsnap; +} + +void toAWR::closeEvent(QCloseEvent *event) +{ + try + { + AWRTool.closeWindow(connection()); + } + TOCATCH; + + event->accept(); +} + +void toAWR::instanceChanged(int pos) +{ + QVariant d = dbid->itemData(pos); + QStringList l = d.toStringList(); + std::stringstream s; + for(QList<QString>::iterator i=l.begin(); i!=l.end(); ++i) + { + s << ":\'" << (*i).toAscii().constData() << '\''; + } + get_log().ts( std::string(__HERE__)) << "Instance changed:" << pos << s.str() << std::endl; + QString dbid = l.at(0); + QString inst = l.at(1); + try + { + toQList params; + params.push_back(dbid); + params.push_back(inst); + fsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast<const toQList&>(params ) ); + tsnap->query(toSQL::sql("toAWR:Snaps", connection()), const_cast<const toQList&>(params ) ); + } + TOCATCH; +}; + +void toAWR::instanceRead(void) +{ + dbid->setCurrentIndex(0); +}; Added: branches/tora-trotl/src/toawr.h =================================================================== --- branches/tora-trotl/src/toawr.h (rev 0) +++ branches/tora-trotl/src/toawr.h 2009-11-10 18:43:34 UTC (rev 3349) @@ -0,0 +1,82 @@ + +/* BEGIN_COMMON_COPYRIGHT_HEADER + * + * TOra - An Oracle Toolkit for DBA's and developers + * + * Shared/mixed copyright is held throughout files in this product + * + * Portions Copyright (C) 2000-2001 Underscore AB + * Portions Copyright (C) 2003-2005 Quest Software, Inc. + * Portions Copyright (C) 2004-2009 Numerous Other Contributors + * + * 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. + * + * You may link this product with any GPL'd Qt library. + * + * All trademarks belong to their respective owners. + * + * END_COMMON_COPYRIGHT_HEADER */ + +#ifndef TOAWR_H +#define TOAWR_H + +#include <iostream> + +#include "totool.h" + + + +class toResultView; +class QLineEdit; +class toConnection; + +class toResultCombo; + +class toAWR : public toToolWidget { + Q_OBJECT; + + toResultView *Result; + QLineEdit *Statement; + QAction *updateAct; + + QTabWidget *Tabs; + QTextBrowser *tb; + + toResultCombo *dbid, *fsnap, *tsnap; +public: + toAWR(/*toTool *tool,*/ QWidget *parent,toConnection &connection); + virtual ~toAWR(); + +protected: + void closeEvent(QCloseEvent *event); + +private slots: + void execute(void); + void instanceChanged(int); + void instanceRead(void); +}; + +#endif + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |