2 Bacula® - The Network Backup Solution
4 Copyright (C) 2007-2009 Free Software Foundation Europe e.V.
6 The main author of Bacula is Kern Sibbald, with contributions from
7 many others, a complete list can be found in the file AUTHORS.
8 This program is Free Software; you can redistribute it and/or
9 modify it under the terms of version two of the GNU General Public
10 License as published by the Free Software Foundation and included
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 Bacula® is a registered trademark of Kern Sibbald.
24 The licensor of Bacula is the Free Software Foundation Europe
25 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26 Switzerland, email:ftf@fsfeurope.org.
30 #include <QAbstractEventDispatcher>
31 #include <QTableWidgetItem>
32 #include <QMessageBox>
33 #include "mediaedit/mediaedit.h"
34 #include "relabel/relabel.h"
36 #include "mediainfo.h"
37 #include "util/fmtwidgetitem.h"
43 MediaInfo::MediaInfo(QTreeWidgetItem *parentWidget, QString &mediaName)
46 pgInitialize(tr("Media Info"), parentWidget);
47 QTreeWidgetItem* thisitem = mainWin->getFromHash(this);
48 thisitem->setIcon(0,QIcon(QString::fromUtf8(":images/cartridge-edit.png")));
49 m_mediaName = mediaName;
50 connect(pbPrune, SIGNAL(clicked()), this, SLOT(pruneVol()));
51 connect(pbPurge, SIGNAL(clicked()), this, SLOT(purgeVol()));
52 connect(pbDelete, SIGNAL(clicked()), this, SLOT(deleteVol()));
53 connect(pbEdit, SIGNAL(clicked()), this, SLOT(editVol()));
54 connect(tableJob, SIGNAL(itemDoubleClicked(QTableWidgetItem*)), this, SLOT(showInfoForJob(QTableWidgetItem *)));
63 * Subroutine to call class to show the log in the database from that job
65 void MediaInfo::showInfoForJob(QTableWidgetItem * item)
67 QTreeWidgetItem* pageSelectorTreeWidgetItem = mainWin->getFromHash(this);
68 int row = item->row();
69 QString jobid = tableJob->item(row, 0)->text();
70 Job *j=new Job(jobid, pageSelectorTreeWidgetItem);
71 connect(j, SIGNAL(destroyed()), this, SLOT(populateTree()));
74 void MediaInfo::pruneVol()
76 prunePage* prune = new prunePage(m_mediaName, "");
77 connect(prune, SIGNAL(destroyed()), this, SLOT(populateTree()));
80 // TODO: use same functions as in medialist.cpp
81 void MediaInfo::purgeVol()
83 if (QMessageBox::warning(this, "Bat",
84 tr("Are you sure you want to purge ?? !!!.\n"
85 "The Purge command will delete associated Catalog database records from Jobs and"
86 " Volumes without considering the retention period. Purge works only on the"
87 " Catalog database and does not affect data written to Volumes. This command can"
88 " be dangerous because you can delete catalog records associated with current"
89 " backups of files, and we recommend that you do not use it unless you know what"
91 "Press OK to proceed with the purge operation?"),
92 QMessageBox::Ok | QMessageBox::Cancel)
93 == QMessageBox::Cancel) { return; }
95 QString cmd("purge volume=");
100 void MediaInfo::deleteVol()
102 if (QMessageBox::warning(this, "Bat",
103 tr("Are you sure you want to delete?? !!!.\n"
104 "This delete command is used to delete a Volume record and all associated catalog"
105 " records that were created. This command operates only on the Catalog"
106 " database and has no effect on the actual data written to a Volume. This"
107 " command can be dangerous and we strongly recommend that you do not use"
108 " it unless you know what you are doing. All Jobs and all associated"
109 " records (File and JobMedia) will be deleted from the catalog."
110 "Press OK to proceed with delete operation.?"),
111 QMessageBox::Ok | QMessageBox::Cancel)
112 == QMessageBox::Cancel) { return; }
114 QString cmd("delete volume=");
119 void MediaInfo::editVol()
121 MediaEdit* edit = new MediaEdit(mainWin->getFromHash(this),
123 connect(edit, SIGNAL(destroyed()), this, SLOT(populateTree()));
127 * Populate the text in the window
129 void MediaInfo::populateForm()
134 QString stat, LastWritten;
138 "SELECT MediaId, VolumeName, Pool.Name, MediaType, FirstWritten,"
139 "LastWritten, VolMounts, VolBytes, Media.Enabled,"
140 "Location.Location, VolStatus, RecyclePool.Name, Media.Recycle, "
141 "VolReadTime, VolWriteTime, Media.VolUseDuration, Media.MaxVolJobs, "
142 "Media.MaxVolFiles, Media.MaxVolBytes, Media.VolRetention,InChanger,Slot "
143 "FROM Media JOIN Pool USING (PoolId) LEFT JOIN Pool AS RecyclePool "
144 "ON (Media.RecyclePoolId = RecyclePool.PoolId) "
145 "LEFT JOIN Location USING (LocationId) "
146 "WHERE Media.VolumeName = '" + m_mediaName + "'";
149 if (m_console->sql_cmd(query, results)) {
151 QStringList fieldlist;
153 foreach (resultline, results) { // should have only one result
154 fieldlist = resultline.split("\t");
155 QStringListIterator fld(fieldlist);
156 m_mediaId = fld.next();
158 label_VolumeName->setText(fld.next());
159 label_Pool->setText(fld.next());
160 label_MediaType->setText(fld.next());
161 label_FirstWritten->setText(fld.next());
162 LastWritten = fld.next();
163 label_LastWritten->setText(LastWritten);
164 // label_VolFiles->setText(fld.next());
165 label_VolMounts->setText(fld.next());
166 label_VolBytes->setText(convertBytesSI(fld.next().toULongLong()));
167 label_Enabled->setPixmap(QPixmap(":/images/inflag" + fld.next() + ".png"));
168 label_Location->setText(fld.next());
169 label_VolStatus->setText(fld.next());
170 label_RecyclePool->setText(fld.next());
171 chkbox_Recycle->setCheckState(fld.next().toInt()?Qt::Checked:Qt::Unchecked);
172 edit_utime(fld.next().toULongLong(), buf, sizeof(buf));
173 label_VolReadTime->setText(QString(buf));
175 edit_utime(fld.next().toULongLong(), buf, sizeof(buf));
176 label_VolWriteTime->setText(QString(buf));
178 edit_utime(fld.next().toULongLong(), buf, sizeof(buf));
179 label_VolUseDuration->setText(QString(buf));
181 label_MaxVolJobs->setText(fld.next());
182 label_MaxVolFiles->setText(fld.next());
183 label_MaxVolBytes->setText(fld.next());
186 edit_utime(stat.toULongLong(), buf, sizeof(buf));
187 label_VolRetention->setText(QString(buf));
189 t = str_to_utime(LastWritten.toAscii().data());
190 t = t + stat.toULongLong();
192 localtime_r(&ttime, &tm);
193 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm);
194 label_Expire->setText(QString(buf));
195 label_Online->setPixmap(QPixmap(":/images/inflag"+fld.next()+".png"));
196 // label_VolFiles->setText(fld.next());
197 // label_VolErrors->setText(fld.next());
201 // jobstatus_to_ascii_gui(stat[0].toAscii(), buf, sizeof(buf));
208 "SELECT DISTINCT JobId, Name, StartTime, Type, Level, JobFiles,"
209 "JobBytes,JobStatus "
210 "FROM Job JOIN JobMedia USING (JobId) JOIN Media USING (MediaId) "
211 "WHERE Media.VolumeName = '" + m_mediaName + "'";
214 if (m_console->sql_cmd(query, results)) {
216 QStringList fieldlist;
218 tableJob->setRowCount(results.size());
219 foreach (resultline, results) {
220 fieldlist = resultline.split("\t");
221 QStringListIterator fld(fieldlist);
223 TableItemFormatter jobitem(*tableJob, row);
226 jobitem.setNumericFld(index++, fld.next());
229 jobitem.setTextFld(index++, fld.next());
232 jobitem.setTextFld(index++, fld.next(), true);
235 jobitem.setJobTypeFld(index++, fld.next());
238 jobitem.setJobLevelFld(index++, fld.next());
241 jobitem.setNumericFld(index++, fld.next());
244 jobitem.setBytesFld(index++, fld.next());
247 jobitem.setJobStatusFld(index++, fld.next());
252 tableJob->resizeColumnsToContents();
253 tableJob->resizeRowsToContents();
254 tableJob->verticalHeader()->hide();
257 int rcnt = tableJob->rowCount();
258 int ccnt = tableJob->columnCount();
259 for(int r=0; r < rcnt; r++) {
260 for(int c=0; c < ccnt; c++) {
261 QTableWidgetItem* item = tableJob->item(r, c);
263 item->setFlags(Qt::ItemFlags(item->flags() & (~Qt::ItemIsEditable)));