You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/kexi/kexidb/drivers/sqlite/sqlitevacuum.cpp

151 lines
4.1 KiB

/* This file is part of the KDE project
Copyright (C) 2006 Jaroslaw Staniek <js@iidea.pl>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include <kexidb/global.h>
#include "sqlitevacuum.h"
#include <kstandarddirs.h>
#include <kprogress.h>
#include <kdebug.h>
#include <tdelocale.h>
#include <tdetempfile.h>
#include <tdemessagebox.h>
#include <tdeio/global.h>
#include <tqfileinfo.h>
#include <tqdir.h>
#include <tqapplication.h>
#include <tqprocess.h>
#include <tqcursor.h>
#include <unistd.h>
SQLiteVacuum::SQLiteVacuum(const TQString& filePath)
: m_filePath(filePath)
{
m_process = 0;
m_percent = 0;
m_dlg = 0;
m_result = true;
}
SQLiteVacuum::~SQLiteVacuum()
{
delete m_process;
if (m_dlg)
m_dlg->close();
delete m_dlg;
}
tristate SQLiteVacuum::run()
{
const TQString ksqlite_app = TDEStandardDirs::findExe( "ksqlite" );
if (ksqlite_app.isEmpty()) {
m_result = false;
return m_result;
}
TQFileInfo fi(m_filePath);
if (!fi.isReadable()) {
KexiDBDrvWarn << "SQLiteVacuum::run(): No such file" << m_filePath << endl;
return false;
}
const uint origSize = fi.size();
TQStringList args;
args << ksqlite_app << "-verbose-vacuum" << m_filePath << "vacuum";
m_process = new TQProcess(args, this, "process");
m_process->setWorkingDirectory( TQFileInfo(m_filePath).dir(true) );
connect( m_process, TQT_SIGNAL(readyReadStdout()), this, TQT_SLOT(readFromStdout()) );
connect( m_process, TQT_SIGNAL(processExited()), this, TQT_SLOT(processExited()) );
if (!m_process->start()) {
m_result = false;
return m_result;
}
m_dlg = new KProgressDialog(0, 0, i18n("Compacting database"),
"<qt>"+i18n("Compacting database \"%1\"...")
.arg("<nobr>"+TQDir::convertSeparators(TQFileInfo(m_filePath).fileName())+"</nobr>")
);
m_dlg->adjustSize();
m_dlg->resize(300, m_dlg->height());
connect(m_dlg, TQT_SIGNAL(cancelClicked()), this, TQT_SLOT(cancelClicked()));
m_dlg->setMinimumDuration(1000);
m_dlg->setAutoClose(true);
m_dlg->progressBar()->setTotalSteps(100);
m_dlg->exec();
while (m_process->isRunning()) {
readFromStdout();
usleep(50000);
}
delete m_process;
m_process = 0;
if (m_result == true) {
const uint newSize = TQFileInfo(m_filePath).size();
const uint decrease = 100-100*newSize/origSize;
KMessageBox::information(0, i18n("The database has been compacted. Current size decreased by %1% to %2.")
.arg(decrease).arg(TDEIO::convertSize(newSize)));
}
return m_result;
}
void SQLiteVacuum::readFromStdout()
{
while (true) {
TQString s( m_process->readLineStdout() ); //readStdout();
if (s.isEmpty())
break;
m_dlg->progressBar()->setProgress(m_percent);
// KexiDBDrvDbg << m_percent << " " << s << endl;
if (s.startsWith("VACUUM: ")) {
//set previously known progress
m_dlg->progressBar()->setProgress(m_percent);
//update progress info
if (s.mid(8,4)=="100%") {
m_percent = 100;
m_dlg->setAllowCancel(false);
m_dlg->setCursor(TQCursor(TQt::WaitCursor));
}
else if (s.mid(9,1)=="%") {
m_percent = s.mid(8,1).toInt();
}
else if (s.mid(10,1)=="%") {
m_percent = s.mid(8,2).toInt();
}
m_process->writeToStdin(TQString(" "));
}
}
}
void SQLiteVacuum::processExited()
{
// KexiDBDrvDbg << sender()->name() << " EXIT" << endl;
m_dlg->close();
delete m_dlg;
m_dlg = 0;
}
void SQLiteVacuum::cancelClicked()
{
if (!m_process->normalExit()) {
m_process->writeToStdin(TQString("q")); //quit
m_result = cancelled;
}
}
#include "sqlitevacuum.moc"