+// Use File Relocation bp
+void bRunRestore::UFRcb()
+{
+ if (UseFileRelocationChk->checkState() == Qt::Checked) {
+ WhereEntry->setEnabled(false);
+ UseRegexpChk->setEnabled(true);
+ if (UseRegexpChk->checkState() == Qt::Checked) {
+ AddSuffixEntry->setEnabled(false);
+ AddPrefixEntry->setEnabled(false);
+ StripPrefixEntry->setEnabled(false);
+ WhereRegexpEntry->setEnabled(true);
+ } else {
+ AddSuffixEntry->setEnabled(true);
+ AddPrefixEntry->setEnabled(true);
+ StripPrefixEntry->setEnabled(true);
+ WhereRegexpEntry->setEnabled(false);
+ }
+ } else {
+ WhereEntry->setEnabled(true);
+ AddSuffixEntry->setEnabled(false);
+ AddPrefixEntry->setEnabled(false);
+ StripPrefixEntry->setEnabled(false);
+ UseRegexpChk->setEnabled(false);
+ WhereRegexpEntry->setEnabled(false);
+ }
+}
+
+// Expert mode for file relocation
+void bRunRestore::useRegexp()
+{
+ if (UseRegexpChk->checkState() == Qt::Checked) {
+ AddSuffixEntry->setEnabled(false);
+ AddPrefixEntry->setEnabled(false);
+ StripPrefixEntry->setEnabled(false);
+ WhereRegexpEntry->setEnabled(true);
+ } else {
+ AddSuffixEntry->setEnabled(true);
+ AddPrefixEntry->setEnabled(true);
+ StripPrefixEntry->setEnabled(true);
+ WhereRegexpEntry->setEnabled(false);
+ }
+}
+
+// Display Form to run the restore job
+bRunRestore::bRunRestore(bRestore *parent)
+{
+ brestore = parent;
+ setupUi(this);
+ ClientCb->addItems(parent->console()->client_list);
+ int i = ClientCb->findText(parent->m_client);
+ if (i >= 0) {
+ ClientCb->setCurrentIndex(i);
+ }
+ StorageCb->addItem(QString(""));
+ RestoreCb->addItems(parent->console()->restore_list);
+ WhenEditor->setDateTime(QDateTime::currentDateTime());
+ StorageCb->addItems(parent->console()->storage_list);
+ connect(UseFileRelocationChk, SIGNAL(clicked()), this, SLOT(UFRcb()));
+ connect(UseRegexpChk, SIGNAL(clicked()), this, SLOT(useRegexp()));
+ connect(ActionBp, SIGNAL(accepted()), this, SLOT(computeRestore()));
+ // TODO: handle multiple restore job
+ struct job_defaults jd;
+ if (parent->console()->restore_list.size() > 0) {
+ jd.job_name = parent->console()->restore_list[0];
+ brestore->console()->get_job_defaults(jd);
+ WhereEntry->setText(jd.where);
+ }
+ computeVolumeList();
+}
+
+void bRestore::get_info_from_selection(QStringList &fileids,
+ QStringList &jobids,
+ QStringList &dirids,
+ QStringList &findexes)
+{
+ struct stat statp;
+ int32_t LinkFI;
+ for (int i=0; i < RestoreList->rowCount(); i++) {
+ QTableWidgetItem *item = RestoreList->item(i, 1);
+ QString data = item->data(Qt::UserRole).toString();
+ QStringList lst = data.split("\t");
+ if (lst.at(1) != "0") { // skip path
+ fileids << lst.at(2);
+ jobids << lst.at(3);
+ decode_stat(lst.at(4).toLocal8Bit().data(),
+ &statp, &LinkFI);
+ if (LinkFI) {
+ findexes << lst.at(3) + "," + QString().setNum(LinkFI);
+ }
+ } else {
+ dirids << lst.at(0);
+ jobids << lst.at(3).split(","); // Can have multiple jobids
+ }
+ }
+ fileids.removeDuplicates();
+ jobids.removeDuplicates();
+ dirids.removeDuplicates();
+ findexes.removeDuplicates();
+}
+
+// To compute volume list with directories, query is much slower
+void bRunRestore::computeVolumeList()
+{
+ brestore->get_info_from_selection(m_fileids, m_jobids, m_dirids, m_findexes);
+ if (m_fileids.size() == 0) {
+ return;
+ }
+
+ Freeze frz_lst(*TableMedia); /* disable updating*/
+ QString q =
+" SELECT DISTINCT VolumeName, Enabled, InChanger "
+ " FROM File, "
+ " ( " // -- Get all media from this job
+ " SELECT MIN(FirstIndex) AS FirstIndex, MAX(LastIndex) AS LastIndex, "
+ " VolumeName, Enabled, Inchanger "
+ " FROM JobMedia JOIN Media USING (MediaId) "
+ " WHERE JobId IN (" + m_jobids.join(",") + ") "
+ " GROUP BY VolumeName,Enabled,InChanger "
+ " ) AS allmedia "
+ " WHERE File.FileId IN (" + m_fileids.join(",") + ") "
+ " AND File.FileIndex >= allmedia.FirstIndex "
+ " AND File.FileIndex <= allmedia.LastIndex ";
+ int row=0;
+ QStringList results;
+ if (brestore->console()->sql_cmd(q, results)) {
+ QStringList fieldlist;
+ TableMedia->setRowCount(results.size());
+ /* Iterate through the record returned from the query */
+ foreach (QString resultline, results) {
+ // 0 1 2
+ //volname, enabled, inchanger
+ fieldlist = resultline.split("\t");
+ int col=0;
+ TableItemFormatter item(*TableMedia, row++);
+ item.setInChanger(col++, fieldlist.at(2)); // inchanger
+ item.setTextFld(col++, fieldlist.at(0)); // Volume
+ }
+ }
+ TableMedia->verticalHeader()->hide();
+ TableMedia->resizeColumnsToContents();
+ TableMedia->resizeRowsToContents();
+ TableMedia->setEditTriggers(QAbstractItemView::NoEditTriggers);
+}
+
+int64_t bRunRestore::runRestore(QString tablename)
+{
+ QString q;
+ QString tmp;
+
+ tmp = ClientCb->currentText();
+ if (tmp == "") {
+ return 0;
+ }
+ q = "restore client=" + tmp;
+
+ tmp = CommentEntry->text();
+ if (tmp != "") {
+ tmp.replace("\"", " ");
+ q += " comment=\"" + tmp + "\"";
+ }
+
+ tmp = StorageCb->currentText();
+ if (tmp != "") {
+ q += " storage=" + tmp;
+ }
+
+ if (UseFileRelocationChk->checkState() == Qt::Checked) {
+ if (UseRegexpChk->checkState() == Qt::Checked) {
+ tmp = WhereRegexpEntry->text();
+ if (tmp != "") {
+ tmp.replace("\"", "");
+ q += " regexwhere=\"" + tmp + "\"";
+ }
+ } else {
+ QStringList lst;
+ tmp = StripPrefixEntry->text();
+ if (tmp != "") {
+ tmp.replace("\"", "");
+ lst.append("!" + tmp + "!!i");
+ }
+ tmp = AddPrefixEntry->text();
+ if (tmp != "") {
+ tmp.replace("\"", "");
+ lst.append("!^!" + tmp + "!");
+ }
+ tmp = AddSuffixEntry->text();
+ if (tmp != "") {
+ tmp.replace("\"", "");
+ lst.append("!([^/])$!$1" + tmp + "!");
+ }
+ if (lst.size() > 0) {
+ q += " regexwhere=\"" + lst.join(",") + "\"";
+ }
+ }
+ } else {
+ tmp = WhereEntry->text();
+ if (tmp != "") {
+ tmp.replace("\"", "");
+ q += " where=\"" + tmp + "\"";
+ }
+ }
+
+// q += " priority=" + tmp.setNum(PrioritySb->value());
+// q += " job=\"" + RestoreCb->currentText() + "\"";
+ q += " file=\"?" + tablename + "\"";
+ q += " when=\"" + WhenEditor->dateTime().toString("yyyy-MM-dd hh:mm:ss") + "\"";
+ q += " done yes";
+
+ if (mainWin->m_miscDebug) qDebug() << q;
+ QStringList results;
+ if (brestore->console()->dir_cmd(q, results)) {
+ foreach (QString resultline, results) {
+ QStringList fieldlist = resultline.split("=");
+ if (fieldlist.size() == 2) {
+ return fieldlist.at(1).toLongLong();
+ }
+ }
+ }
+ return 0;
+}
+
+void bRunRestore::computeRestore()
+{
+ QString q = ".bvfs_restore path=b2123 jobid=" + m_jobids.join(",");
+ if (m_fileids.size() > 0) {
+ q += " fileid=" + m_fileids.join(",");
+ }
+ if (m_dirids.size() > 0) {
+ q += " dirid=" + m_dirids.join(",");
+ }
+ if (m_findexes.size() > 0) {
+ q += " hardlink=" + m_findexes.join(",");
+ }
+ if (mainWin->m_miscDebug) qDebug() << q;
+
+ QStringList results;
+ if (brestore->console()->dir_cmd(q, results)) {
+ if (results.size() == 1 && results[0] == "OK") {
+ int64_t jobid = runRestore("b2123");
+ if (mainWin->m_miscDebug) qDebug() << "jobid=" << jobid;
+ q = ".bvfs_cleanup path=b2123";
+ brestore->console()->dir_cmd(q, results);
+ }
+ }
+}