File indexing completed on 2024-12-08 07:31:56

0001 /* This file is part of the KDE project
0002 
0003    Copyright (C) 2007 by Lukas Appelhans <l.appelhans@gmx.de>
0004    Copyright (C) 2008 by Javier Goday <jgoday@gmail.com>
0005 
0006    This program is free software; you can redistribute it and/or
0007    modify it under the terms of the GNU General Public
0008    License as published by the Free Software Foundation; either
0009    version 2 of the License, or (at your option) any later version.
0010 */
0011 
0012 #ifdef HAVE_SQLITE
0013 #include "core/transferhistorystore_sqlite_p.h"
0014 #include <QSqlDatabase>
0015 #include <QSqlError>
0016 #include <QSqlQuery>
0017 #include <QSqlRecord>
0018 
0019 #include <QFile>
0020 
0021 #include "kget_debug.h"
0022 #include <QDebug>
0023 
0024 using namespace Qt::Literals::StringLiterals;
0025 
0026 SQLiteStore::SQLiteStore(const QString &database)
0027     : TransferHistoryStore()
0028     , m_dbName(database)
0029     , m_sql()
0030 {
0031 }
0032 
0033 SQLiteStore::~SQLiteStore()
0034 {
0035     if (m_sql.isOpen()) {
0036         m_sql.close();
0037     }
0038 
0039     deleteExpiredItems();
0040 }
0041 
0042 void SQLiteStore::load()
0043 {
0044     m_items.clear();
0045     if (sql().open()) {
0046         if (!sql().tables().contains("transfer_history_item")) {
0047             createTables();
0048         }
0049 
0050         QSqlQuery query(u"SELECT * FROM transfer_history_item"_s, sql());
0051         query.exec();
0052 
0053         if (query.lastError().isValid()) {
0054             qCDebug(KGET_DEBUG) << query.lastError().text();
0055         } else {
0056             QSqlRecord rec = query.record();
0057 
0058             while (query.next()) {
0059                 TransferHistoryItem item;
0060                 item.setDest(query.value(rec.indexOf("dest")).toString());
0061                 item.setSource(query.value(rec.indexOf("source")).toString());
0062                 item.setState(query.value(rec.indexOf("state")).toInt());
0063                 item.setDateTime(QDateTime::fromSecsSinceEpoch(query.value(rec.indexOf("time")).toUInt()));
0064                 item.setSize(query.value(rec.indexOf("size")).toInt());
0065 
0066                 // do not load expired items
0067                 if (item.isExpired(expiryAge())) {
0068                     continue;
0069                 }
0070 
0071                 m_items << item;
0072                 Q_EMIT elementLoaded(query.at(), query.size(), item);
0073             }
0074         }
0075     }
0076 
0077     sql().close();
0078 
0079     Q_EMIT loadFinished();
0080 }
0081 
0082 void SQLiteStore::clear()
0083 {
0084     QFile::remove(m_dbName);
0085 }
0086 
0087 void SQLiteStore::saveItem(const TransferHistoryItem &item)
0088 {
0089     saveItems(QList<TransferHistoryItem>() << item);
0090 }
0091 
0092 void SQLiteStore::saveItems(const QList<TransferHistoryItem> &items)
0093 {
0094     if (sql().open()) {
0095         if (!sql().tables().contains("transfer_history_item")) {
0096             createTables();
0097         }
0098 
0099         if (!sql().transaction()) {
0100             qCWarning(KGET_DEBUG) << "Could not establish a transaction, might be slow.";
0101         }
0102 
0103         foreach (const TransferHistoryItem &item, items) {
0104             QSqlQuery query = sql().exec(
0105                 "insert into transfer_history_item(source, dest, size, time, state)"
0106                 "values ('"
0107                 + item.source() + "', '" + item.dest() + "', " + QString::number(item.size()) + ", " + QString::number(item.dateTime().toSecsSinceEpoch())
0108                 + ", '" + QString::number(item.state()) + "')");
0109 
0110             if (query.lastError().isValid()) {
0111                 qCDebug(KGET_DEBUG) << query.lastError().text();
0112             }
0113             m_items << item;
0114         }
0115 
0116         if (!sql().commit()) {
0117             qCWarning(KGET_DEBUG) << "Could not commit changes.";
0118         }
0119     }
0120     sql().close();
0121 
0122     Q_EMIT saveFinished();
0123 }
0124 
0125 void SQLiteStore::deleteItem(const TransferHistoryItem &item)
0126 {
0127     if (sql().open()) {
0128         if (!sql().tables().contains("transfer_history_item")) {
0129             createTables();
0130         }
0131 
0132         QSqlQuery query = sql().exec(
0133             "delete from transfer_history_item where "
0134             " source = '"
0135             + item.source() + "';");
0136 
0137         if (query.lastError().isValid()) {
0138             qCDebug(KGET_DEBUG) << query.lastError().text();
0139         }
0140 
0141         sql().commit();
0142         m_items.removeAll(item);
0143     }
0144     sql().close();
0145 
0146     Q_EMIT deleteFinished();
0147 }
0148 
0149 QSqlDatabase SQLiteStore::sql()
0150 {
0151     if (!m_sql.isValid()) {
0152         m_sql = QSqlDatabase::addDatabase("QSQLITE");
0153         m_sql.setDatabaseName(m_dbName);
0154     }
0155 
0156     return m_sql;
0157 }
0158 
0159 void SQLiteStore::createTables()
0160 {
0161     QSqlQuery query = sql().exec(
0162         "CREATE TABLE transfer_history_item(dest VARCHAR NOT NULL, "
0163         "source VARCHAR NOT NULL, size int NOT NULL, time int not null, "
0164         "state int, PRIMARY KEY(dest, source));");
0165 
0166     if (query.lastError().isValid()) {
0167         qCDebug(KGET_DEBUG) << query.lastError().text();
0168     }
0169 }
0170 
0171 #endif
0172 
0173 #include "moc_transferhistorystore_sqlite_p.cpp"