X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fqt-console%2Frestore%2Frestoretree.cpp;h=1dc8c5cb16e0737d126732c1de749ba47adf4a43;hb=00be6ada3459eedda80fd138f28d30783c7e2623;hp=7be6e77cd7f146a3fdb803f70a5cc7abd2151417;hpb=86c68f4f15793dbca225bdd7d697b9c4b964922e;p=bacula%2Fbacula diff --git a/bacula/src/qt-console/restore/restoretree.cpp b/bacula/src/qt-console/restore/restoretree.cpp index 7be6e77cd7..1dc8c5cb16 100644 --- a/bacula/src/qt-console/restore/restoretree.cpp +++ b/bacula/src/qt-console/restore/restoretree.cpp @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2007-2007 Free Software Foundation Europe e.V. + Copyright (C) 2007-2009 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -20,7 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - Bacula® is a registered trademark of John Walker. + Bacula® is a registered trademark of Kern Sibbald. The licensor of Bacula is the Free Software Foundation Europe (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. @@ -42,7 +42,7 @@ restoreTree::restoreTree() { setupUi(this); - m_name = "Version Browser"; + m_name = tr("Version Browser"); pgInitialize(); QTreeWidgetItem* thisitem = mainWin->getFromHash(this); thisitem->setIcon(0, QIcon(QString::fromUtf8(":images/browse.png"))); @@ -50,28 +50,24 @@ restoreTree::restoreTree() m_closeable = true; m_populated = false; - readSettings(); - dockPage(); - m_winRegExpDrive.setPattern("^[a-z]:/$"); - m_winRegExpPath.setPattern("^[a-z]:/"); - m_slashregex.setPattern("/"); m_debugCnt = 0; m_debugTrap = true; - QGridLayout *m_gridLayout = new QGridLayout(this); - m_gridLayout->setSpacing(6); - m_gridLayout->setMargin(9); - m_gridLayout->setObjectName(QString::fromUtf8("m_gridLayout")); + QGridLayout *gridLayout = new QGridLayout(this); + gridLayout->setSpacing(6); + gridLayout->setMargin(9); + gridLayout->setObjectName(QString::fromUtf8("gridLayout")); - QSplitter *splitter_2 = new QSplitter(Qt::Vertical, this); + m_splitter = new QSplitter(Qt::Vertical, this); QScrollArea *area = new QScrollArea(); area->setObjectName(QString::fromUtf8("area")); area->setWidget(widget); area->setWidgetResizable(true); - splitter_2->addWidget(splitter); - splitter_2->addWidget(area); + m_splitter->addWidget(area); + m_splitter->addWidget(splitter); + splitter->setChildrenCollapsible(false); - m_gridLayout->addWidget(splitter_2, 0, 0, 1, 1); + gridLayout->addWidget(m_splitter, 0, 0, 1, 1); /* progress widgets */ prBar1->setVisible(false); @@ -84,6 +80,8 @@ restoreTree::restoreTree() limitSpinBox->setValue(mainWin->m_recordLimitVal); daysCheckBox->setCheckState(mainWin->m_daysLimitCheck ? Qt::Checked : Qt::Unchecked); daysSpinBox->setValue(mainWin->m_daysLimitVal); + readSettings(); + m_nullFileNameId = -1; } restoreTree::~restoreTree() @@ -117,12 +115,12 @@ void restoreTree::setupPage() connect(jobTable, SIGNAL(cellClicked(int, int)), this, SLOT(jobTableCellClicked(int, int))); - QStringList titles = QStringList() << "Directories"; + QStringList titles = QStringList() << tr("Directories"); directoryTree->setHeaderLabels(titles); clientCombo->addItems(m_console->client_list); - fileSetCombo->addItem("Any"); + fileSetCombo->addItem(tr("Any")); fileSetCombo->addItems(m_console->fileset_list); - jobCombo->addItem("Any"); + jobCombo->addItem(tr("Any")); jobCombo->addItems(m_console->job_list); directoryTree->setContextMenuPolicy(Qt::ActionsContextMenu); @@ -141,10 +139,10 @@ void restoreTree::updateRefresh() ); if (m_dropdownChanged) { if (mainWin->m_rtPopDirDebug) Pmsg0(000, "In restoreTree::updateRefresh Is CHANGED\n"); - refreshLabel->setText("Refresh From Re-Select"); + refreshLabel->setText(tr("Refresh From Re-Select")); } else { if (mainWin->m_rtPopDirDebug) Pmsg0(000, "In restoreTree::updateRefresh Is not Changed\n"); - refreshLabel->setText("Refresh From JobChecks"); + refreshLabel->setText(tr("Refresh From JobChecks")); } } @@ -154,6 +152,8 @@ void restoreTree::updateRefresh() */ void restoreTree::populateDirectoryTree() { + m_debugTrap = true; + m_debugCnt = 0; m_slashTrap = false; m_dirPaths.clear(); directoryTree->clear(); @@ -168,100 +168,119 @@ void restoreTree::populateDirectoryTree() m_versionExceptionHash.clear(); m_directoryIconStateHash.clear(); - QString jobComboText = jobCombo->currentText(); - QString clientComboText = clientCombo->currentText(); - QString fileSetComboText = fileSetCombo->currentText(); updateRefresh(); - int taskcount = 2, ontask = 1; + int taskcount = 3, ontask = 1; if (m_dropdownChanged) taskcount += 1; /* Set progress bars and repaint */ prBar1->setVisible(true); prBar1->setRange(0,taskcount); prBar1->setValue(0); - prLabel1->setText("Task " + QString("%1").arg(ontask)+ " of " + QString("%1").arg(taskcount)); + prLabel1->setText(tr("Task %1 of %2").arg(ontask).arg(taskcount)); prLabel1->setVisible(true); prBar2->setVisible(true); prBar2->setRange(0,0); - prLabel2->setText("Querying Database"); + prLabel2->setText(tr("Querying Database")); prLabel2->setVisible(true); repaint(); if (m_dropdownChanged) { - m_prevJobCombo = jobComboText; - m_prevClientCombo = clientComboText; - m_prevFileSetCombo = fileSetComboText; + m_prevJobCombo = jobCombo->currentText(); + m_prevClientCombo = clientCombo->currentText(); + m_prevFileSetCombo = fileSetCombo->currentText(); m_prevLimitSpinBox = limitSpinBox->value(); m_prevDaysSpinBox = daysSpinBox->value(); m_prevLimitCheckState = limitCheckBox->checkState(); m_prevDaysCheckState = daysCheckBox->checkState(); updateRefresh(); - if (mainWin->m_rtPopDirDebug) Pmsg0(000, "Repopulating the Job Table\n"); - - QString condition = " Client.Name='" + clientCombo->itemText(clientCombo->currentIndex()) + "'"; - if ((jobCombo->currentIndex() >= 0) && (jobComboText != "Any")) { - condition.append(" AND Job.name = '" + jobComboText + "'"); - } - if ((fileSetCombo->currentIndex() >= 0) && (fileSetComboText != "Any")) { - condition.append(" AND FileSet.FileSet='" + fileSetComboText + "'"); - } - /* If Limit check box For limit by days is checked */ - if (daysCheckBox->checkState() == Qt::Checked) { - QDateTime stamp = QDateTime::currentDateTime().addDays(-daysSpinBox->value()); - QString since = stamp.toString(Qt::ISODate); - condition.append(" AND Job.Starttime>'" + since + "'"); - } - /* INNER JOIN FileSet eliminates all restore jobs */ - m_jobQueryPart = - " INNER JOIN Client ON (Job.ClientId=Client.ClientId)" - " INNER JOIN FileSet ON (Job.FileSetId=FileSet.FileSetId)" - " WHERE" + condition + - " AND Job.purgedfiles=0"; prBar1->setValue(ontask++); - prLabel1->setText("Task " + QString("%1").arg(ontask)+ " of " + QString("%1").arg(taskcount)); + prLabel1->setText(tr("Task %1 of %2").arg(ontask).arg(taskcount)); prBar2->setValue(0); prBar2->setRange(0,0); - prLabel2->setText("Querying Jobs"); + prLabel2->setText(tr("Querying Jobs")); repaint(); populateJobTable(); - setJobsCheckedList(); - } else { - if (mainWin->m_rtPopDirDebug) Pmsg0(000, "Repopulating from checks in Job Table\n"); - setJobsCheckedList(); } + setJobsCheckedList(); + if (mainWin->m_rtPopDirDebug) Pmsg0(000, "Repopulating from checks in Job Table\n"); if (m_checkedJobs != "") { + /* First get the filenameid of where the nae is null. These will be the directories + * This could be done in a subquery but postgres's query analyzer won't do the right + * thing like I want */ + if (m_nullFileNameId == -1) { + QString cmd = "SELECT FilenameId FROM Filename WHERE name=''"; + if (mainWin->m_sqlDebug) + Pmsg1(000, "Query cmd : %s\n", cmd.toUtf8().data()); + QStringList qres; + if (m_console->sql_cmd(cmd, qres)) { + if (qres.count()) { + QStringList fieldlist = qres[0].split("\t"); + QString field = fieldlist[0]; + bool ok; + int val = field.toInt(&ok, 10); + if (ok) m_nullFileNameId = val; + } + } + } + /* now create the query to get the list of paths */ QString cmd = - "SELECT DISTINCT Path.Path AS Path" - " FROM Path" - " INNER JOIN File ON (File.PathId=Path.PathId)" - " INNER JOIN Job ON (File.JobId=Job.JobId)" - " WHERE Job.Jobid IN (" + m_checkedJobs + ")" + "SELECT DISTINCT Path.Path AS Path, File.PathId AS PathId" + " FROM File" + " INNER JOIN Path ON (File.PathId=Path.PathId)"; + if (m_nullFileNameId != -1) + cmd += " WHERE File.FilenameId=" + QString("%1").arg(m_nullFileNameId); + else + cmd += " WHERE File.FilenameId IN (SELECT FilenameId FROM Filename WHERE Name='')"; + cmd += " AND File.Jobid IN (" + m_checkedJobs + ")" " ORDER BY Path"; - if (mainWin->m_sqlDebug) { + if (mainWin->m_sqlDebug) Pmsg1(000, "Query cmd : %s\n", cmd.toUtf8().data()); - } prBar1->setValue(ontask++); - prLabel1->setText("Task " + QString("%1").arg(ontask)+ " of " + QString("%1").arg(taskcount)); + prLabel1->setText(tr("Task %1 of %2").arg(ontask).arg(taskcount)); prBar2->setValue(0); - prLabel2->setText("Processing Directories"); - QStringList directories; - if (m_console->sql_cmd(cmd, directories)) { - if (mainWin->m_miscDebug) { - Pmsg1(000, "Done with query %i directories\n", directories.count()); + prBar2->setRange(0,0); + prLabel2->setText(tr("Querying for Directories")); + repaint(); + QStringList results; + m_directoryPathIdHash.clear(); + bool querydone = false; + if (m_console->sql_cmd(cmd, results)) { + if (!querydone) { + querydone = true; + prLabel2->setText(tr("Processing Directories")); + prBar2->setRange(0,results.count()); + repaint(); } - prBar2->setRange(0,directories.count()); - repaint(); - foreach(QString directory, directories) { - m_debugCnt += 1; - prBar2->setValue(m_debugCnt); - parseDirectory(directory); + if (mainWin->m_miscDebug) + Pmsg1(000, "Done with query %i results\n", results.count()); + QStringList fieldlist; + foreach(QString resultline, results) { + /* Update progress bar periodically */ + if ((++m_debugCnt && 0x3FF) == 0) { + prBar2->setValue(m_debugCnt); + } + fieldlist = resultline.split("\t"); + int fieldcnt = 0; + QString field; + /* Iterate through fields in the record */ + foreach (field, fieldlist) { + if (fieldcnt == 0 ) { + parseDirectory(field); + } else if (fieldcnt == 1) { + bool ok; + int pathid = field.toInt(&ok, 10); + if (ok) + m_directoryPathIdHash.insert(fieldlist[0], pathid); + } + fieldcnt += 1; + } } } } else { - QMessageBox::warning(this, tr("Bat"), + QMessageBox::warning(this, "Bat", tr("No jobs were selected in the job query !!!.\n" - "Press OK to continue?"), + "Press OK to continue"), QMessageBox::Ok ); } prBar1->setVisible(false); @@ -288,8 +307,12 @@ void restoreTree::setJobsCheckedList() m_JobsCheckedList += jobItem->text(); first = false; jobItem->setBackground(Qt::green); - } else - jobItem->setBackground(Qt::gray); + } else { + if (jobItem->flags()) + jobItem->setBackground(Qt::gray); + else + jobItem->setBackground(Qt::darkYellow); + } } m_checkedJobs = m_JobsCheckedList; } @@ -300,14 +323,14 @@ void restoreTree::setJobsCheckedList() */ void restoreTree::parseDirectory(QString &dir_in) { - /* m_debugTrap is to only print debugs for a few occurances of calling parseDirectory + /* m_debugTrap is to only print debugs for a few occurennces of calling parseDirectory * instead of printing out what could potentially a whole bunch */ if (m_debugCnt > 2) m_debugTrap = false; - /* Clean up the directory string remove some funny char after last '/' */ - QRegExp rgx("[^/]$"); - int lastslash = rgx.indexIn(dir_in); - dir_in.replace(lastslash, dir_in.length()-lastslash, ""); + /* Truncate everything after the last / */ + if (dir_in.right(1) != "/") { + dir_in.truncate(dir_in.lastIndexOf("/") + 1); + } if ((mainWin->m_miscDebug) && (m_debugTrap)) Pmsg1(000, "parsing %s\n", dir_in.toUtf8().data()); @@ -319,7 +342,7 @@ void restoreTree::parseDirectory(QString &dir_in) /* start from the end, turn /etc/somedir/subdir/ into /etc/somedir and subdir/ * if not added into tree, then try /etc/ and somedir/ if not added, then try * / and etc/ . That should succeed, then add the ones that failed in reverse */ - while (((index = m_slashregex.lastIndexIn(dir_in, -2)) != -1) && (!done)) { + while (((index = dir_in.lastIndexOf("/", -2)) != -1) && (!done)) { direct = path = dir_in; path.replace(index+1, dir_in.length()-index-1,""); direct.replace(0, index+1, ""); @@ -328,10 +351,11 @@ void restoreTree::parseDirectory(QString &dir_in) .arg(dir_in.length()).arg(index).arg(path).arg(direct); Pmsg0(000, msg.toUtf8().data()); } - if (addDirectory(path, direct)) done = true; + if (addDirectory(path, direct)) { done = true; } else { - if ((mainWin->m_miscDebug) && (m_debugTrap)) + if ((mainWin->m_miscDebug) && (m_debugTrap)) { Pmsg0(000, "Saving for later\n"); + } pathAfter.prepend(path); dirAfter.prepend(direct); } @@ -339,15 +363,17 @@ void restoreTree::parseDirectory(QString &dir_in) } for (int k=0; km_miscDebug) && (m_debugTrap)) Pmsg2(000, "Adding After %s %s\n", pathAfter[k].toUtf8().data(), dirAfter[k].toUtf8().data()); - else + } else { if ((mainWin->m_miscDebug) && (m_debugTrap)) Pmsg2(000, "Error Adding %s %s\n", pathAfter[k].toUtf8().data(), dirAfter[k].toUtf8().data()); + } } } + /* * Function called from fill directory when a directory is found to see if this * directory exists in the directory pane and then add it to the directory pane @@ -367,7 +393,7 @@ bool restoreTree::addDirectory(QString &m_cwd, QString &newdirr) if (!m_slashTrap) { /* add unix '/' directory first */ - if (m_dirPaths.empty() && (m_winRegExpPath.indexIn(fullPath, 0) == -1)) { + if (m_dirPaths.empty() && !isWin32Path(fullPath)) { m_slashTrap = true; QTreeWidgetItem *item = new QTreeWidgetItem(directoryTree); QString text("/"); @@ -381,8 +407,9 @@ bool restoreTree::addDirectory(QString &m_cwd, QString &newdirr) m_dirPaths.insert(text, item); } /* no need to check for windows drive if unix */ - if (m_winRegExpDrive.indexIn(m_cwd, 0) == 0) { + if (isWin32Path(m_cwd)) { if (!m_dirPaths.contains(m_cwd)) { + if (m_cwd.count('/') > 1) { return false; } /* this is a windows drive add the base widget */ QTreeWidgetItem *item = new QTreeWidgetItem(directoryTree); item->setText(0, m_cwd); @@ -437,10 +464,8 @@ bool restoreTree::addDirectory(QString &m_cwd, QString &newdirr) void restoreTree::currentStackItem() { if(!m_populated) { - if (!m_console->preventInUseConnect()) - return; setupPage(); - m_populated=true; + m_populated = true; } } @@ -457,13 +482,13 @@ void restoreTree::refreshButtonPushed() */ void restoreTree::jobComboChanged(int) { - if (jobCombo->currentText() == "Any") { - fileSetCombo->setCurrentIndex(fileSetCombo->findText("Any", Qt::MatchExactly)); + if (jobCombo->currentText() == tr("Any")) { + fileSetCombo->setCurrentIndex(fileSetCombo->findText(tr("Any"), Qt::MatchExactly)); return; } job_defaults job_defs; - (void)index; + //(void)index; job_defs.job_name = jobCombo->currentText(); if (m_console->get_job_defaults(job_defs)) { fileSetCombo->setCurrentIndex(fileSetCombo->findText(job_defs.fileset_name, Qt::MatchExactly)); @@ -479,88 +504,107 @@ void restoreTree::directoryCurrentItemChanged(QTreeWidgetItem *item, QTreeWidget if (item == NULL) return; - m_fileCheckStateList.clear(); - disconnect(fileTable, SIGNAL(itemChanged(QTableWidgetItem *)), - this, SLOT(fileTableItemChanged(QTableWidgetItem *))); - QBrush blackBrush(Qt::black); - QString directory = item->data(0, Qt::UserRole).toString(); - directoryLabel->setText("Present Working Directory : " + directory); - QString cmd = - "SELECT DISTINCT Filename.Name AS FileName" - " FROM File " - " INNER JOIN Filename on (Filename.FilenameId=File.FilenameId)" - " INNER JOIN Path ON (Path.PathId=File.PathId)" - " INNER JOIN Job ON (File.JobId=Job.JobId)" - " WHERE Path.Path='" + directory + "' AND Filename.Name!=''" - " AND Job.Jobid IN (" + m_checkedJobs + ")" - " ORDER BY FileName"; - - QStringList headerlist = (QStringList() << "File Name"); fileTable->clear(); /* Also clear the version table here */ versionTable->clear(); versionFileLabel->setText(""); versionTable->setRowCount(0); versionTable->setColumnCount(0); + + QStringList headerlist = (QStringList() << tr("File Name") << tr("Filename Id")); fileTable->setColumnCount(headerlist.size()); fileTable->setHorizontalHeaderLabels(headerlist); - - if (mainWin->m_sqlDebug) { - Pmsg1(000, "Query cmd : %s\n", cmd.toUtf8().data()); - } - QStringList results; - if (m_console->sql_cmd(cmd, results)) { + fileTable->setRowCount(0); - QTableWidgetItem* tableItem; - QString field; - QStringList fieldlist; - fileTable->setRowCount(results.size()); + m_fileCheckStateList.clear(); + disconnect(fileTable, SIGNAL(itemChanged(QTableWidgetItem *)), + this, SLOT(fileTableItemChanged(QTableWidgetItem *))); + QBrush blackBrush(Qt::black); + QString directory = item->data(0, Qt::UserRole).toString(); + directoryLabel->setText(tr("Present Working Directory: %1").arg(directory)); + int pathid = m_directoryPathIdHash.value(directory, -1); + if (pathid != -1) { + QString cmd = + "SELECT DISTINCT Filename.Name AS FileName, Filename.FilenameId AS FilenameId" + " FROM File " + " INNER JOIN Filename on (Filename.FilenameId=File.FilenameId)" + " WHERE File.PathId=" + QString("%1").arg(pathid) + + " AND File.Jobid IN (" + m_checkedJobs + ")" + " AND Filename.Name!=''" + " ORDER BY FileName"; - int row = 0; - /* Iterate through the record returned from the query */ - foreach (QString resultline, results) { - /* Iterate through fields in the record */ - int column = 0; - fieldlist = resultline.split("\t"); - foreach (field, fieldlist) { - field = field.trimmed(); /* strip leading & trailing spaces */ - tableItem = new QTableWidgetItem(field, 1); - /* Possible flags are Qt::ItemFlags flag = Qt::ItemIsSelectable | Qt::ItemIsEditablex - * | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsUserCheckable - * | Qt::ItemIsEnabled | Qt::ItemIsTristate; */ - tableItem->setForeground(blackBrush); - /* Just in case a column ever gets added */ - if (column == 0) { - Qt::ItemFlags flag = Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsTristate; - tableItem->setFlags(flag); - tableItem->setData(Qt::UserRole, QVariant(directory)); - fileTable->setItem(row, column, tableItem); - m_fileCheckStateList.append(Qt::Unchecked); - tableItem->setCheckState(Qt::Unchecked); + if (mainWin->m_sqlDebug) { + Pmsg1(000, "Query cmd : %s\n", cmd.toUtf8().data()); + } + QStringList results; + if (m_console->sql_cmd(cmd, results)) { + + QTableWidgetItem* tableItem; + QString field; + QStringList fieldlist; + fileTable->setRowCount(results.size()); + + int row = 0; + /* Iterate through the record returned from the query */ + foreach (QString resultline, results) { + /* Iterate through fields in the record */ + int column = 0; + fieldlist = resultline.split("\t"); + foreach (field, fieldlist) { + field = field.trimmed(); /* strip leading & trailing spaces */ + tableItem = new QTableWidgetItem(field, 1); + /* Possible flags are Qt::ItemFlags flag = Qt::ItemIsSelectable | Qt::ItemIsEditablex + * | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsUserCheckable + * | Qt::ItemIsEnabled | Qt::ItemIsTristate; */ + tableItem->setForeground(blackBrush); + /* Just in case a column ever gets added */ + if (column == 0) { + Qt::ItemFlags flag = Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsTristate; + tableItem->setFlags(flag); + tableItem->setData(Qt::UserRole, QVariant(directory)); + fileTable->setItem(row, column, tableItem); + m_fileCheckStateList.append(Qt::Unchecked); + tableItem->setCheckState(Qt::Unchecked); + } else if (column == 1) { + Qt::ItemFlags flag = Qt::ItemIsEnabled; + tableItem->setFlags(flag); + bool ok; + int filenameid = field.toInt(&ok, 10); + if (!ok) filenameid = -1; + tableItem->setData(Qt::UserRole, QVariant(filenameid)); + fileTable->setItem(row, column, tableItem); + } + column++; } - column++; + row++; } - row++; + fileTable->setRowCount(row); } - fileTable->setRowCount(row); - } - fileTable->resizeColumnsToContents(); - fileTable->resizeRowsToContents(); - fileTable->verticalHeader()->hide(); + fileTable->resizeColumnsToContents(); + fileTable->resizeRowsToContents(); + fileTable->verticalHeader()->hide(); + fileTable->hideColumn(1); + if (mainWin->m_rtDirCurICDebug) Pmsg0(000, "will update file table checks\n"); + updateFileTableChecks(); + } else if (mainWin->m_sqlDebug) + Pmsg1(000, "did not perform query, pathid=%i not found\n", pathid); connect(fileTable, SIGNAL(itemChanged(QTableWidgetItem *)), - this, SLOT(fileTableItemChanged(QTableWidgetItem *))); - if (mainWin->m_rtDirCurICDebug) Pmsg0(000, "will update file table checks\n"); - updateFileTableChecks(); + this, SLOT(fileTableItemChanged(QTableWidgetItem *))); } /* * Function to populate the version table */ -void restoreTree::fileCurrentItemChanged(QTableWidgetItem *fileTableItem, QTableWidgetItem *) +void restoreTree::fileCurrentItemChanged(QTableWidgetItem *currentFileTableItem, QTableWidgetItem *) { - if (fileTableItem == NULL) + if (currentFileTableItem == NULL) return; + int currentRow = fileTable->row(currentFileTableItem); + QTableWidgetItem *fileTableItem = fileTable->item(currentRow, 0); + QTableWidgetItem *fileNameIdTableItem = fileTable->item(currentRow, 1); + int fileNameId = fileNameIdTableItem->data(Qt::UserRole).toInt(); + m_versionCheckStateList.clear(); disconnect(versionTable, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(versionTableItemChanged(QTableWidgetItem *))); @@ -570,66 +614,85 @@ void restoreTree::fileCurrentItemChanged(QTableWidgetItem *fileTableItem, QTable QString directory = fileTableItem->data(Qt::UserRole).toString(); QBrush blackBrush(Qt::black); - QString cmd = - "SELECT Job.JobId AS JobId, Job.Level AS Type, Job.EndTime AS EndTime, File.Md5 AS MD5, File.FileId AS FileId" - " FROM File" - " INNER JOIN Filename on (Filename.FilenameId=File.FilenameId)" - " INNER JOIN Path ON (Path.PathId=File.PathId)" - " INNER JOIN Job ON (File.JobId=Job.JobId)" - " WHERE Filename.Name='" + file + "' AND Path.Path='" + directory + "'" - " AND Job.Jobid IN (" + m_checkedJobs + ")" - " ORDER BY Job.EndTime DESC"; - - QStringList headerlist = (QStringList() << "Job Id" << "Type" << "End Time" << "Md5" << "FileId"); + + QStringList headerlist = (QStringList() + << tr("Job Id") << tr("Type") << tr("End Time") << tr("Hash") << tr("FileId") << tr("Job Type") << tr("First Volume")); versionTable->clear(); versionTable->setColumnCount(headerlist.size()); versionTable->setHorizontalHeaderLabels(headerlist); - - if (mainWin->m_sqlDebug) { - Pmsg1(000, "Query cmd : %s\n", cmd.toUtf8().data()); - } - QStringList results; - if (m_console->sql_cmd(cmd, results)) { + versionTable->setRowCount(0); - QTableWidgetItem* tableItem; - QString field; - QStringList fieldlist; - versionTable->setRowCount(results.size()); - - int row = 0; - /* Iterate through the record returned from the query */ - foreach (QString resultline, results) { - fieldlist = resultline.split("\t"); - int column = 0; - /* remove directory */ - if (fieldlist[0].trimmed() != "") { - /* Iterate through fields in the record */ - foreach (field, fieldlist) { - field = field.trimmed(); /* strip leading & trailing spaces */ - tableItem = new QTableWidgetItem(field, 1); - tableItem->setFlags(0); - tableItem->setForeground(blackBrush); - tableItem->setData(Qt::UserRole, QVariant(directory)); - versionTable->setItem(row, column, tableItem); - - if (column == 0) { - Qt::ItemFlags flag = Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsTristate; - tableItem->setFlags(flag); - m_versionCheckStateList.append(Qt::Unchecked); - tableItem->setCheckState(Qt::Unchecked); + int pathid = m_directoryPathIdHash.value(directory, -1); + if ((pathid != -1) && (fileNameId != -1)) { + QString cmd = + "SELECT Job.JobId AS JobId, Job.Level AS Type," + " Job.EndTime AS EndTime, File.MD5 AS MD5," + " File.FileId AS FileId, Job.Type AS JobType," + " (SELECT Media.VolumeName FROM JobMedia JOIN Media ON JobMedia.MediaId=Media.MediaId WHERE JobMedia.JobId=Job.JobId ORDER BY JobMediaId LIMIT 1) AS FirstVolume" + " FROM File" + " INNER JOIN Filename on (Filename.FilenameId=File.FilenameId)" + " INNER JOIN Path ON (Path.PathId=File.PathId)" + " INNER JOIN Job ON (File.JobId=Job.JobId)" + " WHERE Path.PathId=" + QString("%1").arg(pathid) + + //" AND Filename.Name='" + file + "'" + " AND Filename.FilenameId=" + QString("%1").arg(fileNameId) + + " AND Job.Jobid IN (" + m_checkedJobs + ")" + " ORDER BY Job.EndTime DESC"; + + if (mainWin->m_sqlDebug) + Pmsg1(000, "Query cmd : %s\n", cmd.toUtf8().data()); + QStringList results; + if (m_console->sql_cmd(cmd, results)) { + + QTableWidgetItem* tableItem; + QString field; + QStringList fieldlist; + versionTable->setRowCount(results.size()); + + int row = 0; + /* Iterate through the record returned from the query */ + foreach (QString resultline, results) { + fieldlist = resultline.split("\t"); + int column = 0; + /* remove directory */ + if (fieldlist[0].trimmed() != "") { + /* Iterate through fields in the record */ + foreach (field, fieldlist) { + field = field.trimmed(); /* strip leading & trailing spaces */ + if (column == 5 ) { + QByteArray jtype(field.trimmed().toAscii()); + if (jtype.size()) { + field = job_type_to_str(jtype[0]); + } + } + tableItem = new QTableWidgetItem(field, 1); + tableItem->setFlags(0); + tableItem->setForeground(blackBrush); + tableItem->setData(Qt::UserRole, QVariant(directory)); + versionTable->setItem(row, column, tableItem); + + if (column == 0) { + Qt::ItemFlags flag = Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsTristate; + tableItem->setFlags(flag); + m_versionCheckStateList.append(Qt::Unchecked); + tableItem->setCheckState(Qt::Unchecked); + } + column++; } - column++; + row++; } - row++; } } + versionTable->resizeColumnsToContents(); + versionTable->resizeRowsToContents(); + versionTable->verticalHeader()->hide(); + updateVersionTableChecks(); + } else { + if (mainWin->m_sqlDebug) + Pmsg2(000, "not querying : pathid=%i fileNameId=%i\n", pathid, fileNameId); } - versionTable->resizeColumnsToContents(); - versionTable->resizeRowsToContents(); - versionTable->verticalHeader()->hide(); connect(versionTable, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(versionTableItemChanged(QTableWidgetItem *))); - updateVersionTableChecks(); } /* @@ -638,8 +701,9 @@ void restoreTree::fileCurrentItemChanged(QTableWidgetItem *fileTableItem, QTable void restoreTree::writeSettings() { QSettings settings(m_console->m_dir->name(), "bat"); - settings.beginGroup("RestoreTree"); - settings.setValue("splitterSizes", splitter->saveState()); + settings.beginGroup(m_groupText); + settings.setValue(m_splitText1, m_splitter->saveState()); + settings.setValue(m_splitText2, splitter->saveState()); settings.endGroup(); } @@ -648,9 +712,13 @@ void restoreTree::writeSettings() */ void restoreTree::readSettings() { + m_groupText = tr("RestoreTreePage"); + m_splitText1 = "splitterSizes1_3"; + m_splitText2 = "splitterSizes2_3"; QSettings settings(m_console->m_dir->name(), "bat"); - settings.beginGroup("RestoreTree"); - splitter->restoreState(settings.value("splitterSizes").toByteArray()); + settings.beginGroup(m_groupText); + if (settings.contains(m_splitText1)) { m_splitter->restoreState(settings.value(m_splitText1).toByteArray()); } + if (settings.contains(m_splitText2)) { splitter->restoreState(settings.value(m_splitText2).toByteArray()); } settings.endGroup(); } @@ -670,20 +738,48 @@ void restoreTree::directoryItemExpanded(QTreeWidgetItem *item) } /* - * I wanted a table to show what jobs meet the criterion and are being used to + * Show what jobs meet the criteria and are being used to * populate the directory tree and file and version tables. */ void restoreTree::populateJobTable() { QBrush blackBrush(Qt::black); - QStringList headerlist = (QStringList() << "Job Id" << "End Time" << "Level" << "Name" << "TU" << "TD"); + + if (mainWin->m_rtPopDirDebug) Pmsg0(000, "Repopulating the Job Table\n"); + QStringList headerlist = (QStringList() + << tr("Job Id") << tr("End Time") << tr("Level") << tr("Type") + << tr("Name") << tr("Purged") << tr("TU") << tr("TD")); + m_toggleUpIndex = headerlist.indexOf(tr("TU")); + m_toggleDownIndex = headerlist.indexOf(tr("TD")); + int purgedIndex = headerlist.indexOf(tr("Purged")); + int typeIndex = headerlist.indexOf(tr("Type")); jobTable->clear(); jobTable->setColumnCount(headerlist.size()); jobTable->setHorizontalHeaderLabels(headerlist); QString jobQuery = - "SELECT Job.Jobid AS Id, Job.EndTime AS EndTime, Job.Level AS Level, Job.Name AS JobName" - " FROM Job" + m_jobQueryPart + - " ORDER BY Job.EndTime DESC"; + "SELECT Job.Jobid AS Id, Job.EndTime AS EndTime," + " Job.Level AS Level, Job.Type AS Type," + " Job.Name AS JobName, Job.purgedfiles AS Purged" + " FROM Job" + /* INNER JOIN FileSet eliminates all restore jobs */ + " INNER JOIN Client ON (Job.ClientId=Client.ClientId)" + " INNER JOIN FileSet ON (Job.FileSetId=FileSet.FileSetId)" + " WHERE" + " Client.Name='" + clientCombo->currentText() + "'"; + if ((jobCombo->currentIndex() >= 0) && (jobCombo->currentText() != tr("Any"))) { + jobQuery += " AND Job.name = '" + jobCombo->currentText() + "'"; + } + if ((fileSetCombo->currentIndex() >= 0) && (fileSetCombo->currentText() != tr("Any"))) { + jobQuery += " AND FileSet.FileSet='" + fileSetCombo->currentText() + "'"; + } + /* If Limit check box For limit by days is checked */ + if (daysCheckBox->checkState() == Qt::Checked) { + QDateTime stamp = QDateTime::currentDateTime().addDays(-daysSpinBox->value()); + QString since = stamp.toString(Qt::ISODate); + jobQuery += " AND Job.Starttime>'" + since + "'"; + } + //jobQuery += " AND Job.purgedfiles=0"; + jobQuery += " ORDER BY Job.EndTime DESC"; /* If Limit check box for limit records returned is checked */ if (limitCheckBox->checkState() == Qt::Checked) { QString limit; @@ -712,15 +808,28 @@ void restoreTree::populateJobTable() foreach (field, fieldlist) { field = field.trimmed(); /* strip leading & trailing spaces */ if (field != "") { + if (column == typeIndex) { + QByteArray jtype(field.trimmed().toAscii()); + if (jtype.size()) { + field = job_type_to_str(jtype[0]); + } + } tableItem = new QTableWidgetItem(field, 1); tableItem->setFlags(0); tableItem->setForeground(blackBrush); jobTable->setItem(row, column, tableItem); if (column == 0) { - Qt::ItemFlags flag = Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsTristate; - tableItem->setFlags(flag); - tableItem->setCheckState(Qt::Checked); - tableItem->setBackground(Qt::green); + bool ok; + int purged = fieldlist[purgedIndex].toInt(&ok, 10); + if (!((ok) && (purged == 1))) { + Qt::ItemFlags flag = Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsTristate; + tableItem->setFlags(flag); + tableItem->setCheckState(Qt::Checked); + tableItem->setBackground(Qt::green); + } else { + tableItem->setFlags(0); + tableItem->setCheckState(Qt::Unchecked); + } } column++; } @@ -741,30 +850,35 @@ void restoreTree::populateJobTable() jobTable->resizeColumnsToContents(); jobTable->resizeRowsToContents(); jobTable->verticalHeader()->hide(); + jobTable->hideColumn(purgedIndex); } void restoreTree::jobTableCellClicked(int row, int column) { - if (column == 4){ + if (column == m_toggleUpIndex){ int cnt; for (cnt=0; cntitem(cnt, 0); - Qt::CheckState state = item->checkState(); - if (state == Qt::Checked) - item->setCheckState(Qt::Unchecked); - else if (state == Qt::Unchecked) - item->setCheckState(Qt::Checked); + if (item->flags()) { + Qt::CheckState state = item->checkState(); + if (state == Qt::Checked) + item->setCheckState(Qt::Unchecked); + else if (state == Qt::Unchecked) + item->setCheckState(Qt::Checked); + } } } - if (column == 5){ + if (column == m_toggleDownIndex){ int cnt, max = jobTable->rowCount(); for (cnt=row; cntitem(cnt, 0); - Qt::CheckState state = item->checkState(); - if (state == Qt::Checked) - item->setCheckState(Qt::Unchecked); - else if (state == Qt::Unchecked) - item->setCheckState(Qt::Checked); + if (item->flags()) { + Qt::CheckState state = item->checkState(); + if (state == Qt::Checked) + item->setCheckState(Qt::Unchecked); + else if (state == Qt::Unchecked) + item->setCheckState(Qt::Checked); + } } } } @@ -1031,7 +1145,7 @@ void restoreTree::versionTableItemChanged(QTableWidgetItem *item) m_versionExceptionHash.remove(fullPath); } else if (prevState != curState) { if (mainWin->m_rtVerTabICDebug) Pmsg2(000, " THE STATE OF THE version Check has changed, Setting StateList[%i] to %i\n", row, curState); - if ((curState == Qt::Checked) || (curState == Qt::PartiallyChecked) && (row != 0)) { + if ((curState == Qt::Checked) || (curState == Qt::PartiallyChecked && row != 0)) { if (mainWin->m_rtVerTabICDebug) Pmsg2(000, "Inserting into m_versionExceptionHash %s, %i\n", fullPath.toUtf8().data(), thisJobNum); m_versionExceptionHash.insert(fullPath, thisJobNum); if (fileState != Qt::Checked) { @@ -1108,6 +1222,7 @@ void restoreTree::updateFileTableChecks() int rcnt = fileTable->rowCount(); for (int row=0; rowitem(row, 0); + if (!item) { return; } Qt::CheckState curState = item->checkState(); Qt::CheckState newState = Qt::PartiallyChecked; @@ -1149,6 +1264,7 @@ void restoreTree::updateVersionTableChecks() /* deterimine the default state from the state of the file */ QTableWidgetItem *fileTableItem = fileTable->item(fileTable->currentRow(), 0); + if (!fileTableItem) { return; } Qt::CheckState fileState = fileTableItem->checkState(); QString file = fileTableItem->text(); QString fullPath = dirName + file; @@ -1158,6 +1274,7 @@ void restoreTree::updateVersionTableChecks() int cnt = versionTable->rowCount(); for (int row=0; rowitem(row, 0); + if (!item) { break; } Qt::CheckState curState = item->checkState(); Qt::CheckState newState = Qt::Unchecked; @@ -1190,7 +1307,7 @@ void restoreTree::fullPathtoSubPaths(QStringList &subPaths, QString &fullPath_in bool done = false; QString fullPath = fullPath_in; QString direct, path; - while (((index = m_slashregex.lastIndexIn(fullPath, -2)) != -1) && (!done)) { + while (((index = fullPath.lastIndexOf("/", -2)) != -1) && (!done)) { direct = path = fullPath; path.replace(index+1, fullPath.length()-index-1, ""); direct.replace(0, index+1, ""); @@ -1409,15 +1526,15 @@ void restoreTree::directorySetIcon(int operation, int change, QString &path, QTr } /* - * Test Button + * Restore Button */ void restoreTree::restoreButtonPushed() { /* Set progress bars and repaint */ prLabel1->setVisible(true); - prLabel1->setText("Task 1 of 3"); + prLabel1->setText(tr("Task 1 of 3")); prLabel2->setVisible(true); - prLabel2->setText("Processing Checked directories"); + prLabel2->setText(tr("Processing Checked directories")); prBar1->setVisible(true); prBar1->setRange(0, 3); prBar1->setValue(0); @@ -1444,77 +1561,76 @@ void restoreTree::restoreButtonPushed() QTreeWidgetItemIterator diter(directoryTree, QTreeWidgetItemIterator::Checked); while (*diter) { QString directory = (*diter)->data(0, Qt::UserRole).toString(); - if (mainWin->m_rtRestore1Debug) - Pmsg1(000, "Directory Checked=\"%s\"\n", directory.toUtf8().data()); - /* With a checked directory, query for the files in the directory */ - - QString cmd = - "SELECT t1.Filename AS Filename, t1.JobId AS JobId, File.FileIndex AS FileIndex" - " FROM" - " ( SELECT Filename.Name AS Filename, MAX(Job.JobId) AS JobId" - " FROM File" - " INNER JOIN Filename on (Filename.FilenameId=File.FilenameId)" - " INNER JOIN Path ON (Path.PathId=File.PathId)" - " INNER JOIN Job ON (Job.JobId=File.JobId)" - " WHERE Path.Path='" + directory + "' AND Filename.Name!=''" - " AND Job.Jobid IN (" + m_checkedJobs + ")" - " GROUP BY Filename.Name" - ") t1, File " - " INNER JOIN Filename on (Filename.FilenameId=File.FilenameId)" - " INNER JOIN Path ON (Path.PathId=File.PathId)" - " INNER JOIN Job ON (Job.JobId=File.JobId)" - " WHERE" - " Path.Path='" + directory + "'" - " AND Filename.Name=t1.Filename" - " AND Job.Jobid=t1.JobId" - " ORDER BY Filename"; - - if (mainWin->m_sqlDebug) Pmsg1(000, "Query cmd : %s\n", cmd.toUtf8().data()); - QStringList results; - if (m_console->sql_cmd(cmd, results)) { - QStringList fieldlist; + int pathid = m_directoryPathIdHash.value(directory, -1); + if (pathid != -1) { + if (mainWin->m_rtRestore1Debug) + Pmsg1(000, "Directory Checked=\"%s\"\n", directory.toUtf8().data()); + /* With a checked directory, query for the files in the directory */ - int row = 0; - /* Iterate through the record returned from the query */ - foreach (QString resultline, results) { - /* Iterate through fields in the record */ - int column = 0; - QString fullPath = ""; - Qt::CheckState fileExcpState = (Qt::CheckState)4; - fieldlist = resultline.split("\t"); - int version = 0; - int fileIndex = 0; - foreach (QString field, fieldlist) { - if (column == 0) { - fullPath = directory + field; - } - if (column == 1) { - version = field.toInt(); + QString cmd = + "SELECT Filename.Name AS Filename, t1.JobId AS JobId, File.FileIndex AS FileIndex" + " FROM" + " ( SELECT File.FilenameId AS FilenameId, MAX(Job.JobId) AS JobId" + " FROM File" + " INNER JOIN Job ON (Job.JobId=File.JobId)" + " WHERE File.PathId=" + QString("%1").arg(pathid) + + " AND Job.Jobid IN (" + m_checkedJobs + ")" + " GROUP BY File.FilenameId" + ") t1, File " + " INNER JOIN Filename on (Filename.FilenameId=File.FilenameId)" + " INNER JOIN Job ON (Job.JobId=File.JobId)" + " WHERE File.PathId=" + QString("%1").arg(pathid) + + " AND File.FilenameId=t1.FilenameId" + " AND Job.Jobid=t1.JobId" + " ORDER BY Filename"; + + if (mainWin->m_sqlDebug) Pmsg1(000, "Query cmd : %s\n", cmd.toUtf8().data()); + QStringList results; + if (m_console->sql_cmd(cmd, results)) { + QStringList fieldlist; + + int row = 0; + /* Iterate through the record returned from the query */ + foreach (QString resultline, results) { + /* Iterate through fields in the record */ + int column = 0; + QString fullPath = ""; + Qt::CheckState fileExcpState = (Qt::CheckState)4; + fieldlist = resultline.split("\t"); + int version = 0; + int fileIndex = 0; + foreach (QString field, fieldlist) { + if (column == 0) { + fullPath = directory + field; + } + if (column == 1) { + version = field.toInt(); + } + if (column == 2) { + fileIndex = field.toInt(); + } + column++; } - if (column == 2) { - fileIndex = field.toInt(); + fileExcpState = m_fileExceptionHash.value(fullPath, (Qt::CheckState)3); + + int excpVersion = m_versionExceptionHash.value(fullPath, 0); + if (fileExcpState != Qt::Unchecked) { + QString debugtext; + if (excpVersion != 0) { + debugtext = QString("*E* version=%1").arg(excpVersion); + version = excpVersion; + fileIndex = queryFileIndex(fullPath, excpVersion); + } else + debugtext = QString("___ version=%1").arg(version); + if (mainWin->m_rtRestore1Debug) + Pmsg2(000, "Restoring %s File %s\n", debugtext.toUtf8().data(), fullPath.toUtf8().data()); + fullPathDone.insert(fullPath, 1); + fileIndexHash.insert(fullPath, fileIndex); + versionFilesMulti.insert(version, fullPath); + vFMCounter += 1; } - column++; - } - fileExcpState = m_fileExceptionHash.value(fullPath, (Qt::CheckState)3); - - int excpVersion = m_versionExceptionHash.value(fullPath, 0); - if (fileExcpState != Qt::Unchecked) { - QString debugtext; - if (excpVersion != 0) { - debugtext = QString("*E* version=%1").arg(excpVersion); - version = excpVersion; - fileIndex = queryFileIndex(fullPath, excpVersion); - } else - debugtext = QString("___ version=%1").arg(version); - if (mainWin->m_rtRestore1Debug) - Pmsg2(000, "Restoring %s File %s\n", debugtext.toUtf8().data(), fullPath.toUtf8().data()); - fullPathDone.insert(fullPath, 1); - fileIndexHash.insert(fullPath, fileIndex); - versionFilesMulti.insert(version, fullPath); - vFMCounter += 1; + row++; } - row++; } } ditcount += 1; @@ -1522,8 +1638,8 @@ void restoreTree::restoreButtonPushed() ++diter; } /* while (*diter) */ prBar1->setValue(1); - prLabel1->setText("Task 2 of 3"); - prLabel2->setText("Processing Exceptions"); + prLabel1->setText( tr("Task 2 of 3")); + prLabel2->setText(tr("Processing Exceptions")); prBar2->setRange(0, 0); repaint(); @@ -1560,8 +1676,8 @@ void restoreTree::restoreButtonPushed() } /* while ftera.hasNext */ /* The progress bars for the next step */ prBar1->setValue(2); - prLabel1->setText("Task 3 of 3"); - prLabel2->setText("Filling Database Table"); + prLabel1->setText(tr("Task 3 of 3")); + prLabel2->setText(tr("Filling Database Table")); prBar2->setRange(0, vFMCounter); vFMCounter = 0; prBar2->setValue(vFMCounter); @@ -1640,7 +1756,7 @@ int restoreTree::mostRecentVersionfromFullPath(QString &fullPath) { int qversion = 0; QString directory, fileName; - int index = m_slashregex.lastIndexIn(fullPath, -2); + int index = fullPath.lastIndexOf("/", -2); if (index != -1) { directory = fileName = fullPath; directory.replace(index+1, fullPath.length()-index-1, ""); @@ -1650,35 +1766,38 @@ int restoreTree::mostRecentVersionfromFullPath(QString &fullPath) .arg(fullPath.length()).arg(index).arg(fileName).arg(directory); Pmsg0(000, msg.toUtf8().data()); } - /* so now we need the latest version from the database */ - QString cmd = - "SELECT MAX(Job.JobId)" - " FROM File " - " INNER JOIN Filename on (Filename.FilenameId=File.FilenameId)" - " INNER JOIN Path ON (Path.PathId=File.PathId)" - " INNER JOIN Job ON (File.JobId=Job.JobId)" - " WHERE Path.Path='" + directory + "' AND Filename.Name!=''" - " AND Job.Jobid IN (" + m_checkedJobs + ")" - " AND Filename.Name='" + fileName + "'" - " GROUP BY Filename.Name"; - - if (mainWin->m_sqlDebug) Pmsg1(000, "Query cmd : %s\n", cmd.toUtf8().data()); - QStringList results; - if (m_console->sql_cmd(cmd, results)) { - QStringList fieldlist; - int row = 0; - /* Iterate through the record returned from the query */ - foreach (QString resultline, results) { - /* Iterate through fields in the record */ - int column = 0; - fieldlist = resultline.split("\t"); - foreach (QString field, fieldlist) { - if (column == 0) { - qversion = field.toInt(); + int pathid = m_directoryPathIdHash.value(directory, -1); + if (pathid != -1) { + /* so now we need the latest version from the database */ + QString cmd = + "SELECT MAX(Job.JobId)" + " FROM File " + " INNER JOIN Filename on (Filename.FilenameId=File.FilenameId)" + " INNER JOIN Job ON (File.JobId=Job.JobId)" + " WHERE File.PathId=" + QString("%1").arg(pathid) + + " AND Job.Jobid IN (" + m_checkedJobs + ")" + " AND Filename.Name='" + fileName + "'" + " AND File.FilenameId!=" + QString("%1").arg(m_nullFileNameId) + + " GROUP BY Filename.Name"; + + if (mainWin->m_sqlDebug) Pmsg1(000, "Query cmd : %s\n", cmd.toUtf8().data()); + QStringList results; + if (m_console->sql_cmd(cmd, results)) { + QStringList fieldlist; + int row = 0; + /* Iterate through the record returned from the query */ + foreach (QString resultline, results) { + /* Iterate through fields in the record */ + int column = 0; + fieldlist = resultline.split("\t"); + foreach (QString field, fieldlist) { + if (column == 0) { + qversion = field.toInt(); + } + column++; } - column++; + row++; } - row++; } } } /* if (index != -1) */ @@ -1690,7 +1809,7 @@ int restoreTree::queryFileIndex(QString &fullPath, int jobId) { int qfileIndex = 0; QString directory, fileName; - int index = m_slashregex.lastIndexIn(fullPath, -2); + int index = fullPath.lastIndexOf("/", -2); if (index != -1) { directory = fileName = fullPath; directory.replace(index+1, fullPath.length()-index-1, ""); @@ -1700,39 +1819,46 @@ int restoreTree::queryFileIndex(QString &fullPath, int jobId) .arg(fullPath.length()).arg(index).arg(fileName).arg(directory); Pmsg0(000, msg.toUtf8().data()); } - /* so now we need the latest version from the database */ - QString cmd = - "SELECT" - " File.FileIndex" - " FROM File" - " INNER JOIN Filename on (Filename.FilenameId=File.FilenameId)" - " INNER JOIN Path ON (Path.PathId=File.PathId)" - " INNER JOIN Job ON (File.JobId=Job.JobId)" - " WHERE" - " Path.Path='" + directory + "'" - " AND Filename.Name='" + fileName + "'" - " AND Job.Jobid='" + QString("%1").arg(jobId) + "'" - " GROUP BY File.FileIndex"; - - if (mainWin->m_sqlDebug) Pmsg1(000, "Query cmd : %s\n", cmd.toUtf8().data()); - QStringList results; - if (m_console->sql_cmd(cmd, results)) { - QStringList fieldlist; - int row = 0; - /* Iterate through the record returned from the query */ - foreach (QString resultline, results) { - /* Iterate through fields in the record */ - int column = 0; - fieldlist = resultline.split("\t"); - foreach (QString field, fieldlist) { - if (column == 0) { - qfileIndex = field.toInt(); + int pathid = m_directoryPathIdHash.value(directory, -1); + if (pathid != -1) { + /* so now we need the latest version from the database */ + QString cmd = + "SELECT" + " File.FileIndex" + " FROM File" + " INNER JOIN Filename on (Filename.FilenameId=File.FilenameId)" + " INNER JOIN Job ON (File.JobId=Job.JobId)" + " WHERE File.PathId=" + QString("%1").arg(pathid) + + " AND Filename.Name='" + fileName + "'" + " AND Job.Jobid='" + QString("%1").arg(jobId) + "'" + " GROUP BY File.FileIndex"; + + if (mainWin->m_sqlDebug) Pmsg1(000, "Query cmd : %s\n", cmd.toUtf8().data()); + QStringList results; + if (m_console->sql_cmd(cmd, results)) { + QStringList fieldlist; + int row = 0; + /* Iterate through the record returned from the query */ + foreach (QString resultline, results) { + /* Iterate through fields in the record */ + int column = 0; + fieldlist = resultline.split("\t"); + foreach (QString field, fieldlist) { + if (column == 0) { + qfileIndex = field.toInt(); + } + column++; } - column++; + row++; } - row++; } } } /* if (index != -1) */ return qfileIndex; } + + +void restoreTree::PgSeltreeWidgetClicked() +{ + dockPage(); +}