2 Bacula® - The Network Backup Solution
4 Copyright (C) 2007-2008 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 John Walker.
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.
31 * Dirk Bartley, March 2007
34 #include <QAbstractEventDispatcher>
35 #include <QTableWidgetItem>
36 #include <QMessageBox>
38 #include "mediaedit.h"
44 MediaEdit::MediaEdit(QTreeWidgetItem *parentWidget, QString &mediaId)
47 pgInitialize(tr("Media Edit"), parentWidget);
48 QTreeWidgetItem* thisitem = mainWin->getFromHash(this);
49 thisitem->setIcon(0,QIcon(QString::fromUtf8(":images/cartridge-edit.png")));
54 connect(okButton, SIGNAL(pressed()), this, SLOT(okButtonPushed()));
55 connect(cancelButton, SIGNAL(pressed()), this, SLOT(cancelButtonPushed()));
57 connect(retentionSpin, SIGNAL(valueChanged(int)), this, SLOT(retentionChanged()));
58 connect(useDurationSpin, SIGNAL(valueChanged(int)), this, SLOT(useDurationChanged()));
59 connect(retentionRadio, SIGNAL(pressed()), this, SLOT(retentionRadioPressed()));
60 connect(useDurationRadio, SIGNAL(pressed()), this, SLOT(useDurationRadioPressed()));
67 if (!m_console->preventInUseConnect())
70 /* The media's pool */
71 poolCombo->addItems(m_console->pool_list);
73 /* The media's Status */
74 QStringList statusList = (QStringList() << "Full" << "Used" << "Append"
75 << "Error" << "Purged" << "Recycle" << "Read-Only" << "Cleaning");
76 statusCombo->addItems(statusList);
78 /* Set up the query for the default values */
79 QStringList FieldList = (QStringList()
80 << "Media.VolumeName" << "Pool.Name" << "Media.VolStatus" << "Media.Slot"
81 << "Media.VolRetention" << "Media.VolUseDuration" << "Media.MaxVolJobs"
82 << "Media.MaxVolFiles" << "Media.MaxVolBytes" << "Media.Recycle" << "Media.Enabled"
84 QStringList AsList = (QStringList()
85 << "VolumeName" << "PoolName" << "Status" << "Slot"
86 << "Retention" << "UseDuration" << "MaxJobs"
87 << "MaxFiles" << "MaxBytes" << "Recycle" << "Enabled"
90 QString query("SELECT ");
91 foreach (QString field, FieldList) {
95 query += field + " AS " + AsList[i];
98 query += " FROM Media"
99 " JOIN Pool ON (Media.PoolId=Pool.PoolId)"
100 " LEFT OUTER JOIN Pool AS Pol ON (Media.recyclepoolid=Pol.PoolId)"
101 " WHERE Media.MediaId='" + mediaId + "'";
103 if (mainWin->m_sqlDebug) {
104 Pmsg1(000, "MediaList query cmd : %s\n",query.toUtf8().data());
107 if (m_console->sql_cmd(query, results)) {
109 QStringList fieldlist;
111 /* Iterate through the lines of results, there should only be one. */
112 foreach (QString resultline, results) {
113 fieldlist = resultline.split("\t");
116 /* Iterate through fields in the record */
117 foreach (field, fieldlist) {
118 field = field.trimmed(); /* strip leading & trailing spaces */
122 volumeLabel->setText(QString("Volume : %1").arg(m_mediaName));
128 m_slot = field.toInt(&ok, 10);
129 if (!ok){ m_slot = 0; }
131 m_retention = field.toInt(&ok, 10);
132 if (!ok){ m_retention = 0; }
134 m_useDuration = field.toInt(&ok, 10);
135 if (!ok){ m_useDuration = 0; }
137 m_maxVolJobs = field.toInt(&ok, 10);
138 if (!ok){ m_maxVolJobs = 0; }
140 m_maxVolFiles = field.toInt(&ok, 10);
141 if (!ok){ m_maxVolFiles = 0; }
143 m_maxVolBytes = field.toInt(&ok, 10);
144 if (!ok){ m_maxVolBytes = 0; }
146 if (field == "1") m_recycle = true;
147 else m_recycle = false;
148 } else if (i == 10) {
149 if (field == "1") m_enabled = true;
150 else m_enabled = false;
151 } else if (i == 11) {
152 m_recyclePool = field;
155 } /* foreach field */
156 } /* foreach resultline */
157 } /* if results from query */
159 if (m_mediaName != "") {
161 /* default value for pool */
162 index = poolCombo->findText(m_pool, Qt::MatchExactly);
164 poolCombo->setCurrentIndex(index);
167 /* default value for status */
168 index = statusCombo->findText(m_status, Qt::MatchExactly);
170 statusCombo->setCurrentIndex(index);
172 slotSpin->setValue(m_slot);
173 retentionSpin->setValue(m_retention);
174 useDurationSpin->setValue(m_useDuration);
175 setSpins(retentionSpin->value());
176 retentionRadio->setChecked(true);
177 maxJobsSpin->setValue(m_maxVolJobs);
178 maxFilesSpin->setValue(m_maxVolFiles);
179 maxBytesSpin->setValue(m_maxVolBytes);
180 if (m_recycle) recycleCheck->setCheckState(Qt::Checked);
181 else recycleCheck->setCheckState(Qt::Unchecked);
182 if (m_enabled) enabledCheck->setCheckState(Qt::Checked);
183 else enabledCheck->setCheckState(Qt::Unchecked);
184 /* default for recycle pool */
185 recyclePoolCombo->addItems(m_console->pool_list);
186 recyclePoolCombo->insertItem(0, "*None*");
187 index = recyclePoolCombo->findText(m_recyclePool, Qt::MatchExactly);
191 recyclePoolCombo->setCurrentIndex(index);
193 QMessageBox::warning(this, tr("No Volume name"), tr("No Volume name given"),
194 QMessageBox::Ok, QMessageBox::Ok);
200 * Function to handle updating the record then closing the page
202 void MediaEdit::okButtonPushed()
207 scmd = QString("update volume=\"%1\"")
209 if (m_pool != poolCombo->currentText()) {
210 scmd += " pool=\"" + poolCombo->currentText() + "\"";
213 if (m_status != statusCombo->currentText()) {
214 scmd += " volstatus=\"" + statusCombo->currentText() + "\"";
217 if (m_slot != slotSpin->value()) {
218 scmd += " slot=" + QString().setNum(slotSpin->value());
221 if (m_retention != retentionSpin->value()) {
222 scmd += " VolRetention=" + QString().setNum(retentionSpin->value());
225 if (m_useDuration != useDurationSpin->value()) {
226 scmd += " VolUse=" + QString().setNum(useDurationSpin->value());
229 if (m_maxVolJobs != maxJobsSpin->value()) {
230 scmd += " MaxVolJobs=" + QString().setNum(maxJobsSpin->value());
233 if (m_maxVolFiles != maxFilesSpin->value()) {
234 scmd += " MaxVolFiles=" + QString().setNum(maxFilesSpin->value());
237 if (m_maxVolBytes != maxBytesSpin->value()) {
238 scmd += " MaxVolBytes=" + QString().setNum(maxBytesSpin->value());
241 if ((m_recycle) && (recycleCheck->checkState() == Qt::Unchecked)) {
242 scmd += " Recycle=no";
245 if ((!m_recycle) && (recycleCheck->checkState() == Qt::Checked)) {
246 scmd += " Recycle=yes";
249 if ((m_enabled) && (enabledCheck->checkState() == Qt::Unchecked)) {
250 scmd += " enabled=no";
253 if ((!m_enabled) && (enabledCheck->checkState() == Qt::Checked)) {
254 scmd += " enabled=yes";
257 if (m_recyclePool != recyclePoolCombo->currentText()) {
258 scmd += " recyclepool=\"";
259 if (recyclePoolCombo->currentText() != "*None*") {
260 scmd += recyclePoolCombo->currentText();
266 if (mainWin->m_commandDebug) {
267 Pmsg1(000, "sending command : %s\n",scmd.toUtf8().data());
269 consoleCommand(scmd);
274 /* close if cancel */
275 void MediaEdit::cancelButtonPushed()
281 * Slot for user changed retention
283 void MediaEdit::retentionChanged()
285 retentionRadio->setChecked(true);
286 setSpins(retentionSpin->value());
290 * Slot for user changed the use duration
292 void MediaEdit::useDurationChanged()
294 useDurationRadio->setChecked(true);
295 setSpins(useDurationSpin->value());
299 * Set the 5 duration spins from a known duration value
301 void MediaEdit::setSpins(int value)
303 int years, months, days, hours, minutes, seconds, left;
305 years = abs(value / 31536000);
306 left = value - years * 31536000;
307 months = abs(left / 2592000);
308 left = left - months * 2592000;
309 days = abs(left / 86400);
310 left = left - days * 86400;
311 hours = abs(left / 3600);
312 left = left - hours * 3600;
313 minutes = abs(left / 60);
314 seconds = left - minutes * 60;
316 yearsSpin->setValue(years);
317 monthsSpin->setValue(months);
318 daysSpin->setValue(days);
319 hoursSpin->setValue(hours);
320 minutesSpin->setValue(minutes);
321 secondsSpin->setValue(seconds);
326 * This slot is called any time any one of the 5 duration spins a changed.
328 void MediaEdit::durationChanged()
331 if (secondsSpin->value() == -1) {
332 secondsSpin->setValue(59);
333 minutesSpin->setValue(minutesSpin->value()-1);
335 if (minutesSpin->value() == -1) {
336 minutesSpin->setValue(59);
337 hoursSpin->setValue(hoursSpin->value()-1);
339 if (hoursSpin->value() == -1) {
340 hoursSpin->setValue(23);
341 daysSpin->setValue(daysSpin->value()-1);
343 if (daysSpin->value() == -1) {
344 daysSpin->setValue(29);
345 monthsSpin->setValue(monthsSpin->value()-1);
347 if (monthsSpin->value() == -1) {
348 monthsSpin->setValue(11);
349 yearsSpin->setValue(yearsSpin->value()-1);
351 if (yearsSpin->value() == -1) {
352 yearsSpin->setValue(0);
355 if (secondsSpin->value() == 60) {
356 secondsSpin->setValue(0);
357 minutesSpin->setValue(minutesSpin->value()+1);
359 if (minutesSpin->value() == 60) {
360 minutesSpin->setValue(0);
361 hoursSpin->setValue(hoursSpin->value()+1);
363 if (hoursSpin->value() == 24) {
364 hoursSpin->setValue(0);
365 daysSpin->setValue(daysSpin->value()+1);
367 if (daysSpin->value() == 30) {
368 daysSpin->setValue(0);
369 monthsSpin->setValue(monthsSpin->value()+1);
371 if (monthsSpin->value() == 12) {
372 monthsSpin->setValue(0);
373 yearsSpin->setValue(yearsSpin->value()+1);
376 if (retentionRadio->isChecked()) {
378 retention = secondsSpin->value() + minutesSpin->value() * 60 +
379 hoursSpin->value() * 3600 + daysSpin->value() * 86400 +
380 monthsSpin->value() * 2592000 +
381 yearsSpin->value() * 31536000;
382 disconnect(retentionSpin, SIGNAL(valueChanged(int)), this, SLOT(retentionChanged()));
383 retentionSpin->setValue(retention);
384 connect(retentionSpin, SIGNAL(valueChanged(int)), this, SLOT(retentionChanged()));
386 if (useDurationRadio->isChecked()) {
388 useDuration = secondsSpin->value() + minutesSpin->value() * 60 +
389 hoursSpin->value() * 3600 + daysSpin->value() * 86400 +
390 monthsSpin->value() * 2592000 +
391 yearsSpin->value() * 31536000;
392 disconnect(useDurationSpin, SIGNAL(valueChanged(int)), this, SLOT(useDurationChanged()));
393 useDurationSpin->setValue(useDuration);
394 connect(useDurationSpin, SIGNAL(valueChanged(int)), this, SLOT(useDurationChanged()));
398 /* Connect the spins */
399 void MediaEdit::connectSpins()
401 connect(secondsSpin, SIGNAL(valueChanged(int)), this, SLOT(durationChanged()));
402 connect(minutesSpin, SIGNAL(valueChanged(int)), this, SLOT(durationChanged()));
403 connect(hoursSpin, SIGNAL(valueChanged(int)), this, SLOT(durationChanged()));
404 connect(daysSpin, SIGNAL(valueChanged(int)), this, SLOT(durationChanged()));
405 connect(monthsSpin, SIGNAL(valueChanged(int)), this, SLOT(durationChanged()));
406 connect(yearsSpin, SIGNAL(valueChanged(int)), this, SLOT(durationChanged()));
409 /* disconnect spins so that we can set the value of other spin from changed duration spin */
410 void MediaEdit::disconnectSpins()
412 disconnect(secondsSpin, SIGNAL(valueChanged(int)), this, SLOT(durationChanged()));
413 disconnect(minutesSpin, SIGNAL(valueChanged(int)), this, SLOT(durationChanged()));
414 disconnect(hoursSpin, SIGNAL(valueChanged(int)), this, SLOT(durationChanged()));
415 disconnect(daysSpin, SIGNAL(valueChanged(int)), this, SLOT(durationChanged()));
416 disconnect(monthsSpin, SIGNAL(valueChanged(int)), this, SLOT(durationChanged()));
417 disconnect(yearsSpin, SIGNAL(valueChanged(int)), this, SLOT(durationChanged()));
420 /* slot for setting spins when retention radio checked */
421 void MediaEdit::retentionRadioPressed()
423 setSpins(retentionSpin->value());
426 /* slot for setting spins when duration radio checked */
427 void MediaEdit::useDurationRadioPressed()
429 setSpins(useDurationSpin->value());