]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/qt-console/fileset/fileset.cpp
Backport from Bacula Enterprise
[bacula/bacula] / bacula / src / qt-console / fileset / fileset.cpp
index 47d6b762d96bdb216bba7d98dae8ea4598c116a2..1a8a3f97fd99fd78172a6c4407704e0af26d9f59 100644 (file)
@@ -1,46 +1,37 @@
 /*
-   Bacula® - The Network Backup Solution
-
-   Copyright (C) 2007-2008 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.
-   This program is Free Software; you can redistribute it and/or
-   modify it under the terms of version two of the GNU General Public
-   License as published by the Free Software Foundation and included
-   in the file LICENSE.
-
-   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., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.
-
-   Bacula® is a registered trademark of John Walker.
-   The licensor of Bacula is the Free Software Foundation Europe
-   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
-   Switzerland, email:ftf@fsfeurope.org.
+   Bacula(R) - The Network Backup Solution
+
+   Copyright (C) 2000-2015 Kern Sibbald
+   Copyright (C) 2007-2009 Free Software Foundation Europe e.V.
+
+   The original author of Bacula is Kern Sibbald, with contributions
+   from many others, a complete list can be found in the file AUTHORS.
+
+   You may use this file and others of this release according to the
+   license defined in the LICENSE file, which includes the Affero General
+   Public License, v3.0 ("AGPLv3") and some additional permissions and
+   terms pursuant to its AGPLv3 Section 7.
+
+   This notice must be preserved when any source code is 
+   conveyed and/or propagated.
+
+   Bacula(R) is a registered trademark of Kern Sibbald.
 */
  
 /*
- *   Version $Id$
- *
  *  FileSet Class
  *
  *   Dirk Bartley, March 2007
  *
  */ 
 
+#include "bat.h"
 #include <QAbstractEventDispatcher>
 #include <QMenu>
-#include "bat.h"
 #include "fileset/fileset.h"
+#include "util/fmtwidgetitem.h"
 
-FileSet::FileSet()
+FileSet::FileSet() : Pages()
 {
    setupUi(this);
    m_name = tr("FileSets");
@@ -56,7 +47,6 @@ FileSet::FileSet()
    /* add context sensitive menu items specific to this classto the page
     * selector tree. m_contextActions is QList of QActions */
    m_contextActions.append(actionRefreshFileSet);
-   dockPage();
 }
 
 FileSet::~FileSet()
@@ -70,11 +60,8 @@ FileSet::~FileSet()
  */
 void FileSet::populateTable()
 {
-   QTableWidgetItem *tableItem;
-   QBrush blackBrush(Qt::black);
 
-   if (!m_console->preventInUseConnect())
-       return;
+   Freeze frz(*tableWidget); /* disable updating*/
 
    m_checkcurwidget = false;
    tableWidget->clear();
@@ -85,52 +72,99 @@ void FileSet::populateTable()
 
    tableWidget->setColumnCount(headerlist.count());
    tableWidget->setHorizontalHeaderLabels(headerlist);
-   tableWidget->setRowCount(m_console->fileset_list.count());
+   tableWidget->horizontalHeader()->setHighlightSections(false);
    tableWidget->verticalHeader()->hide();
-   int row = 0;
+   tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
+   tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
+   tableWidget->setSortingEnabled(false); /* rows move on insert if sorting enabled */
 
+   QString fileset_comsep("");
+   bool first = true;
+   QStringList notFoundList = m_console->fileset_list;
    foreach(QString filesetName, m_console->fileset_list) {
+      if (first) {
+         fileset_comsep += "'" + filesetName + "'";
+         first = false;
+      }
+      else
+         fileset_comsep += ",'" + filesetName + "'";
+   }
 
+   int row = 0;
+   tableWidget->setRowCount(m_console->fileset_list.count());
+   if (fileset_comsep != "") {
       /* Set up query QString and header QStringList */
       QString query("");
       query += "SELECT FileSet AS Name, FileSetId AS Id, CreateTime"
            " FROM FileSet"
-           " WHERE ";
-      query += " FileSet='" + filesetName + "'";
-      query += " ORDER BY CreateTime DESC LIMIT 1";
+           " WHERE FileSetId IN (SELECT MAX(FileSetId) FROM FileSet WHERE";
+      query += " FileSet IN (" + fileset_comsep + ")";
+      query += " GROUP BY FileSet) ORDER BY FileSet";
 
       QStringList results;
       if (mainWin->m_sqlDebug) {
          Pmsg1(000, "FileSet query cmd : %s\n",query.toUtf8().data());
       }
       if (m_console->sql_cmd(query, results)) {
-         int resultCount = results.count();
-         if (resultCount) {
-            QString resultline;
-            QString field;
-            QStringList fieldlist;
-            /* only use the last one */
-            resultline = results[resultCount - 1];
+         QStringList fieldlist;
+
+         /* Iterate through the record returned from the query */
+         foreach (QString resultline, results) {
             fieldlist = resultline.split("\t");
-            int column = 0;
-            /* Iterate through fields in the record */
-            foreach (field, fieldlist) {
-               field = field.trimmed();  /* strip leading & trailing spaces */
-               tableItem = new QTableWidgetItem(field, 1);
-               tableItem->setFlags(Qt::ItemIsSelectable);
-               tableItem->setForeground(blackBrush);
-               tableItem->setData(Qt::UserRole, 1);
-               tableWidget->setItem(row, column, tableItem);
-               column++;
+            if (fieldlist.size() != 3) {
+               Pmsg1(000, "Unexpected line %s", resultline.toUtf8().data());
+               continue;
             }
+
+            /* remove this fileSet from notFoundList */
+            int indexOf = notFoundList.indexOf(fieldlist[0]);
+            if (indexOf != -1) { notFoundList.removeAt(indexOf); }
+
+            TableItemFormatter item(*tableWidget, row);
+  
+            /* Iterate through fields in the record */
+            QStringListIterator fld(fieldlist);
+            int col = 0;
+
+            /* name */
+            item.setTextFld(col++, fld.next());
+
+            /* id */
+            item.setNumericFld(col++, fld.next());
+
+            /* creation time */
+            item.setTextFld(col++, fld.next());
+
+            row++;
          }
       }
+   }
+   foreach(QString filesetName, notFoundList) {
+      TableItemFormatter item(*tableWidget, row);
+      item.setTextFld(0, filesetName);
       row++;
    }
-   /* Resize the columns */
-   for (int cnter=0; cnter<headerlist.size(); cnter++) {
-      tableWidget->resizeColumnToContents(cnter);
+   
+   /* set default sorting */
+   tableWidget->sortByColumn(headerlist.indexOf(tr("FileSet Name")), Qt::AscendingOrder);
+   tableWidget->setSortingEnabled(true);
+   
+   /* Resize rows and columns */
+   tableWidget->resizeColumnsToContents();
+   tableWidget->resizeRowsToContents();
+
+   /* make read only */
+   int rcnt = tableWidget->rowCount();
+   int ccnt = tableWidget->columnCount();
+   for(int r=0; r < rcnt; r++) {
+      for(int c=0; c < ccnt; c++) {
+         QTableWidgetItem* item = tableWidget->item(r, c);
+         if (item) {
+            item->setFlags(Qt::ItemFlags(item->flags() & (~Qt::ItemIsEditable)));
+         }
+      }
    }
+   m_populated = true;
 }
 
 /*
@@ -142,7 +176,9 @@ void FileSet::PgSeltreeWidgetClicked()
    if (!m_populated) {
       populateTable();
       createContextMenu();
-      m_populated = true;
+   }
+   if (!isOnceDocked()) {
+      dockPage();
    }
 }
 
@@ -153,7 +189,7 @@ void FileSet::PgSeltreeWidgetClicked()
 void FileSet::tableItemChanged(QTableWidgetItem *currentwidgetitem, QTableWidgetItem *previouswidgetitem)
 {
    /* m_checkcurwidget checks to see if this is during a refresh, which will segfault */
-   if (m_checkcurwidget) {
+   if (m_checkcurwidget && currentwidgetitem) {
       int currentRow = currentwidgetitem->row();
       QTableWidgetItem *currentrowzeroitem = tableWidget->item(currentRow, 0);
       m_currentlyselected = currentrowzeroitem->text();
@@ -189,7 +225,7 @@ void FileSet::createContextMenu()
    connect(actionRefreshFileSet, SIGNAL(triggered()), this,
                 SLOT(populateTable()));
    connect(actionStatusFileSetInConsole, SIGNAL(triggered()), this,
-                SLOT(consoleStatusFileSet()));
+                SLOT(consoleShowFileSet()));
    connect(actionShowJobs, SIGNAL(triggered()), this,
                 SLOT(showJobs()));
 }
@@ -198,10 +234,10 @@ void FileSet::createContextMenu()
  * Function responding to actionListJobsofFileSet which calls mainwin function
  * to create a window of a list of jobs of this fileset.
  */
-void FileSet::consoleStatusFileSet()
+void FileSet::consoleShowFileSet()
 {
-   QString cmd("status fileset=");
-   cmd += m_currentlyselected;
+   QString cmd("show fileset=\"");
+   cmd += m_currentlyselected + "\"";
    consoleCommand(cmd);
 }
 
@@ -210,11 +246,10 @@ void FileSet::consoleStatusFileSet()
  */
 void FileSet::currentStackItem()
 {
-   if(!m_populated) {
+   if (!m_populated) {
       populateTable();
       /* Create the context menu for the fileset table */
       createContextMenu();
-      m_populated=true;
    }
 }