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 new Job(jobid, pageSelectorTreeWidgetItem);
71 // connect(j, SIGNAL(destroyed()), this, SLOT(populateTree()));
74 void MediaInfo::pruneVol()
76 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 new MediaEdit(mainWin->getFromHash(this), m_mediaId);
122 // connect(edit, SIGNAL(destroyed()), this, SLOT(populateTree()));
126 * Populate the text in the window
128 void MediaInfo::populateForm()
133 QString stat, LastWritten;
137 "SELECT MediaId, VolumeName, Pool.Name, MediaType, FirstWritten,"
138 "LastWritten, VolMounts, VolBytes, Media.Enabled,"
139 "Location.Location, VolStatus, RecyclePool.Name, Media.Recycle, "
140 "VolReadTime/1000000, VolWriteTime/1000000, Media.VolUseDuration, "
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 if (LastWritten != "") {
190 t = str_to_utime(LastWritten.toAscii().data());
191 t = t + stat.toULongLong();
193 localtime_r(&ttime, &tm);
194 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm);
195 label_Expire->setText(QString(buf));
197 label_Online->setPixmap(QPixmap(":/images/inflag"+fld.next()+".png"));
198 // label_VolFiles->setText(fld.next());
199 // label_VolErrors->setText(fld.next());
203 // jobstatus_to_ascii_gui(stat[0].toAscii(), buf, sizeof(buf));
210 "SELECT DISTINCT JobId, Name, StartTime, Type, Level, JobFiles,"
211 "JobBytes,JobStatus "
212 "FROM Job JOIN JobMedia USING (JobId) JOIN Media USING (MediaId) "
213 "WHERE Media.VolumeName = '" + m_mediaName + "'";
216 if (m_console->sql_cmd(query, results)) {
218 QStringList fieldlist;
220 tableJob->setRowCount(results.size());
221 foreach (resultline, results) {
222 fieldlist = resultline.split("\t");
223 QStringListIterator fld(fieldlist);
225 TableItemFormatter jobitem(*tableJob, row);
228 jobitem.setNumericFld(index++, fld.next());
231 jobitem.setTextFld(index++, fld.next());
234 jobitem.setTextFld(index++, fld.next(), true);
237 jobitem.setJobTypeFld(index++, fld.next());
240 jobitem.setJobLevelFld(index++, fld.next());
243 jobitem.setNumericFld(index++, fld.next());
246 jobitem.setBytesFld(index++, fld.next());
249 jobitem.setJobStatusFld(index++, fld.next());
254 tableJob->resizeColumnsToContents();
255 tableJob->resizeRowsToContents();
256 tableJob->verticalHeader()->hide();
259 tableJob->setEditTriggers(QAbstractItemView::NoEditTriggers);