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 three of the GNU Affero 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 Affero 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)
47 pgInitialize(tr("Media Info"), parentWidget);
48 QTreeWidgetItem* thisitem = mainWin->getFromHash(this);
49 thisitem->setIcon(0,QIcon(QString::fromUtf8(":images/cartridge-edit.png")));
50 m_mediaName = mediaName;
51 connect(pbPrune, SIGNAL(clicked()), this, SLOT(pruneVol()));
52 connect(pbPurge, SIGNAL(clicked()), this, SLOT(purgeVol()));
53 connect(pbDelete, SIGNAL(clicked()), this, SLOT(deleteVol()));
54 connect(pbEdit, SIGNAL(clicked()), this, SLOT(editVol()));
55 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, "
141 "Media.MaxVolJobs, Media.MaxVolFiles, Media.MaxVolBytes, "
142 "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 ON (Media.LocationId=Location.LocationId) "
146 "WHERE Media.VolumeName='" + m_mediaName + "'";
148 if (mainWin->m_sqlDebug) {
149 Pmsg1(000, "MediaInfo query cmd : %s\n",query.toUtf8().data());
152 if (m_console->sql_cmd(query, results)) {
154 QStringList fieldlist;
156 foreach (resultline, results) { // should have only one result
157 fieldlist = resultline.split("\t");
158 QStringListIterator fld(fieldlist);
159 m_mediaId = fld.next();
161 label_VolumeName->setText(fld.next());
162 label_Pool->setText(fld.next());
163 label_MediaType->setText(fld.next());
164 label_FirstWritten->setText(fld.next());
165 LastWritten = fld.next();
166 label_LastWritten->setText(LastWritten);
167 // label_VolFiles->setText(fld.next());
168 label_VolMounts->setText(fld.next());
169 label_VolBytes->setText(convertBytesSI(fld.next().toULongLong()));
170 label_Enabled->setPixmap(QPixmap(":/images/inflag" + fld.next() + ".png"));
171 label_Location->setText(fld.next());
172 label_VolStatus->setText(fld.next());
173 label_RecyclePool->setText(fld.next());
174 chkbox_Recycle->setCheckState(fld.next().toInt()?Qt::Checked:Qt::Unchecked);
175 edit_utime(fld.next().toULongLong(), buf, sizeof(buf));
176 label_VolReadTime->setText(QString(buf));
178 edit_utime(fld.next().toULongLong(), buf, sizeof(buf));
179 label_VolWriteTime->setText(QString(buf));
181 edit_utime(fld.next().toULongLong(), buf, sizeof(buf));
182 label_VolUseDuration->setText(QString(buf));
184 label_MaxVolJobs->setText(fld.next());
185 label_MaxVolFiles->setText(fld.next());
186 label_MaxVolBytes->setText(fld.next());
189 edit_utime(stat.toULongLong(), buf, sizeof(buf));
190 label_VolRetention->setText(QString(buf));
192 if (LastWritten != "") {
193 t = str_to_utime(LastWritten.toAscii().data());
194 t = t + stat.toULongLong();
196 localtime_r(&ttime, &tm);
197 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm);
198 label_Expire->setText(QString(buf));
200 label_Online->setPixmap(QPixmap(":/images/inflag"+fld.next()+".png"));
201 // label_VolFiles->setText(fld.next());
202 // label_VolErrors->setText(fld.next());
206 // jobstatus_to_ascii_gui(stat[0].toAscii(), buf, sizeof(buf));
213 "SELECT DISTINCT JobId, Name, StartTime, Type, Level, JobFiles,"
214 "JobBytes,JobStatus "
215 "FROM Job JOIN JobMedia USING (JobId) JOIN Media USING (MediaId) "
216 "WHERE Media.VolumeName = '" + m_mediaName + "'";
218 if (mainWin->m_sqlDebug) {
219 Pmsg1(000, "MediaInfo query cmd : %s\n",query.toUtf8().data());
222 if (m_console->sql_cmd(query, results)) {
224 QStringList fieldlist;
226 tableJob->setRowCount(results.size());
227 foreach (resultline, results) {
228 fieldlist = resultline.split("\t");
229 QStringListIterator fld(fieldlist);
231 TableItemFormatter jobitem(*tableJob, row);
234 jobitem.setNumericFld(index++, fld.next());
237 jobitem.setTextFld(index++, fld.next());
240 jobitem.setTextFld(index++, fld.next(), true);
243 jobitem.setJobTypeFld(index++, fld.next());
246 jobitem.setJobLevelFld(index++, fld.next());
249 jobitem.setNumericFld(index++, fld.next());
252 jobitem.setBytesFld(index++, fld.next());
255 jobitem.setJobStatusFld(index++, fld.next());
260 tableJob->resizeColumnsToContents();
261 tableJob->resizeRowsToContents();
262 tableJob->verticalHeader()->hide();
265 tableJob->setEditTriggers(QAbstractItemView::NoEditTriggers);