Merge lp:~mandel/ubuntu-download-manager/remove-db-pimpl into lp:ubuntu-download-manager

Proposed by Manuel de la Peña
Status: Merged
Approved by: Manuel de la Peña
Approved revision: 197
Merged at revision: 196
Proposed branch: lp:~mandel/ubuntu-download-manager/remove-db-pimpl
Merge into: lp:ubuntu-download-manager
Diff against target: 432 lines (+170/-207)
2 files modified
libubuntudownloadmanager/downloads/downloads_db.cpp (+160/-203)
libubuntudownloadmanager/downloads/downloads_db.h (+10/-4)
To merge this branch: bzr merge lp:~mandel/ubuntu-download-manager/remove-db-pimpl
Reviewer Review Type Date Requested Status
Michał Karnicki (community) Approve
PS Jenkins bot continuous-integration Approve
Review via email: mp+197041@code.launchpad.net

Commit message

Remove the pimpl pattern from the DownloadsDb because that class will never be exposed to other projects.

Description of the change

Remove the pimpl pattern from the DownloadsDb because that class will never be exposed to other projects.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Michał Karnicki (karni) wrote :

256 + qDebug() << "open the db" << _db.open();
You probably should split the line to open the db and do the logging, because if that qDebug() ever gets commented out, the open() call at the end of the line will not be invoked.

        + QJsonDocument json = QJsonDocument::fromVariant(QVariant(metadata));
322 + return QString(json.toJson());
Personally I would name it jsonDoc, just because json.toJson() looks funny ;) Do as you see fit.

341 + _db.open();
You may wanna log that as well, like you do in line 256.

If the _db.open() call fails, is it safe to continue with execution, or should you return from the method?

Otherwise, looking good.

review: Needs Fixing
197. By Manuel de la Peña

Updated according to reviews.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Michał Karnicki (karni) wrote :

Looks good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'libubuntudownloadmanager/downloads/downloads_db.cpp'
2--- libubuntudownloadmanager/downloads/downloads_db.cpp 2013-10-25 11:44:53 +0000
3+++ libubuntudownloadmanager/downloads/downloads_db.cpp 2013-12-02 11:55:39 +0000
4@@ -84,234 +84,191 @@
5
6 namespace DownloadManager {
7
8-class DownloadsDbPrivate {
9- Q_DECLARE_PUBLIC(DownloadsDb)
10-
11- public:
12- explicit DownloadsDbPrivate(DownloadsDb* parent)
13- : q_ptr(parent) {
14- _fileManager = new FileManager();
15- internalInit();
16- }
17-
18- DownloadsDbPrivate(FileManager* fileManager, DownloadsDb* parent)
19- : _fileManager(fileManager),
20- q_ptr(parent) {
21- internalInit();
22- }
23-
24- QSqlDatabase db() {
25- return _db;
26- }
27-
28- QString filename() {
29- return _dbName;
30- }
31-
32- bool dbExists() {
33- return _fileManager->exists(_dbName);
34- }
35-
36- void internalInit() {
37-
38- QString dataPath = QStandardPaths::writableLocation(
39- QStandardPaths::DataLocation);
40- QString path = dataPath + QDir::separator() + "ubuntu-download-manager";
41-
42- bool wasCreated = QDir().mkpath(path);
43- if (!wasCreated) {
44- qCritical() << "Could not create the data path" << path;
45- }
46- _dbName = path + QDir::separator() + "downloads.db";
47- _db = QSqlDatabase::addDatabase("QSQLITE");
48- _db.setDatabaseName(_dbName);
49- qDebug() << "Db file is" << _dbName;
50- }
51-
52- bool init() {
53- TRACE;
54- // create the required tables
55- qDebug() << "open the db" << _db.open();
56-
57- _db.transaction();
58-
59- // create the required tables and indexes
60- bool success = true;
61- QSqlQuery query;
62- success &= query.exec(SINGLE_DOWNLOAD_TABLE);
63- success &= query.exec(GROUP_DOWNLOAD_TABLE);
64- success &= query.exec(GROUP_DOWNLOAD_RELATION);
65-
66- if (success)
67- _db.commit();
68- else
69- _db.rollback();
70- _db.close();
71- return success;
72- }
73-
74- QString stateToString(Download::State state) {
75- switch (state) {
76- case Download::IDLE:
77- return IDLE_STRING;
78- case Download::START:
79- return START_STRING;
80- case Download::PAUSE:
81- return PAUSE_STRING;
82- case Download::RESUME:
83- return RESUME_STRING;
84- case Download::CANCEL:
85- return CANCEL_STRING;
86- case Download::FINISH:
87- return FINISH_STRING;
88- case Download::ERROR:
89- return ERROR_STRING;
90- default:
91- return IDLE_STRING;
92- }
93- }
94-
95- Download::State stringToState(QString state) {
96- QString lowerState = state.toLower();
97-
98- if (lowerState == IDLE_STRING)
99- return Download::IDLE;
100-
101- if (lowerState == START_STRING)
102- return Download::START;
103-
104- if (lowerState == PAUSE_STRING)
105- return Download::PAUSE;
106-
107- if (lowerState == RESUME_STRING)
108- return Download::RESUME;
109-
110- if (lowerState == CANCEL_STRING)
111- return Download::CANCEL;
112-
113- if (lowerState == FINISH_STRING)
114- return Download::FINISH;
115-
116- if (lowerState == ERROR_STRING)
117- return Download::ERROR;
118-
119- // default case
120- return Download::IDLE;
121- }
122-
123- QString metadataToString(const QVariantMap& metadata) {
124- QJsonDocument json = QJsonDocument::fromVariant(QVariant(metadata));
125- return QString(json.toJson());
126- }
127-
128- QString headersToString(const QMap<QString, QString>& headers) {
129- QVariantMap headersVariant;
130- foreach(const QString& key, headers.keys()) {
131- headersVariant[key] = headers[key];
132- }
133- QJsonDocument json = QJsonDocument::fromVariant(
134- QVariant(headersVariant));
135- return QString(json.toJson());
136- }
137-
138- bool storeSingleDownload(FileDownload* download) {
139- // decide if we store it as a new download or update an existing one
140- _db.open();
141-
142- QSqlQuery query;
143- query.prepare(PRESENT_SINGLE_DOWNLOAD);
144- query.bindValue(":uuid", download->downloadId());
145-
146- query.exec();
147- int rows = 0;
148- if (query.next())
149- rows = query.value(0).toInt();
150-
151- if (rows > 0) {
152- qDebug() << "Update download";
153- query.prepare(UPDATE_SINGLE_DOWNLOAD);
154- } else {
155- qDebug() << "Insert download";
156- query.prepare(INSERT_SINGLE_DOWNLOAD);
157- }
158-
159- query.bindValue(":uuid", download->downloadId());
160- query.bindValue(":url", download->url().toString());
161- query.bindValue(":dbus_path", download->path());
162- query.bindValue(":local_path", download->filePath());
163- query.bindValue(":hash", download->hash());
164- query.bindValue(":hash_algo",
165- HashAlgorithm::getHashAlgo(download->hashAlgorithm()));
166- query.bindValue(":state", stateToString(download->state()));
167- query.bindValue(":total_size",
168- QString::number(download->totalSize()));
169- query.bindValue(":throttle",
170- QString::number(download->throttle()));
171- query.bindValue(":metadata",
172- metadataToString(download->metadata()));
173- query.bindValue(":headers",
174- headersToString(download->headers()));
175-
176- bool success = query.exec();
177- if (!success)
178- qDebug() << query.lastError();
179-
180- _db.close();
181-
182- return success;
183- }
184-
185- private:
186- QString _dbName;
187- FileManager* _fileManager;
188- QSqlDatabase _db;
189- DownloadsDb* q_ptr;
190-};
191-
192-/*
193- * PUBLIC IMPLEMENTATION
194- */
195-
196-DownloadsDb::DownloadsDb(QObject *parent)
197- : QObject(parent),
198- d_ptr(new DownloadsDbPrivate(this)) {
199+DownloadsDb::DownloadsDb(QObject* parent)
200+ : QObject(parent) {
201+ _fileManager = new FileManager();
202+ internalInit();
203 }
204
205-DownloadsDb::DownloadsDb(FileManager* fileManager, QObject *parent)
206+DownloadsDb::DownloadsDb(FileManager* fileManager, QObject* parent)
207 : QObject(parent),
208- d_ptr(new DownloadsDbPrivate(fileManager, this)) {
209+ _fileManager(fileManager) {
210+ internalInit();
211 }
212
213 QSqlDatabase
214 DownloadsDb::db() {
215- Q_D(DownloadsDb);
216- return d->db();
217+ return _db;
218 }
219
220 QString
221 DownloadsDb::filename() {
222- Q_D(DownloadsDb);
223- return d->filename();
224+ return _dbName;
225 }
226
227 bool
228 DownloadsDb::dbExists() {
229- Q_D(DownloadsDb);
230- return d->dbExists();
231+ return _fileManager->exists(_dbName);
232+}
233+
234+void
235+DownloadsDb::internalInit() {
236+ QString dataPath = QStandardPaths::writableLocation(
237+ QStandardPaths::DataLocation);
238+ QString path = dataPath + QDir::separator() + "ubuntu-download-manager";
239+
240+ bool wasCreated = QDir().mkpath(path);
241+ if (!wasCreated) {
242+ qCritical() << "Could not create the data path" << path;
243+ }
244+ _dbName = path + QDir::separator() + "downloads.db";
245+ _db = QSqlDatabase::addDatabase("QSQLITE");
246+ _db.setDatabaseName(_dbName);
247+ qDebug() << "Db file is" << _dbName;
248 }
249
250 bool
251 DownloadsDb::init() {
252- Q_D(DownloadsDb);
253- return d->init();
254+ TRACE;
255+ // create the required tables
256+ bool opened = _db.open();
257+ if (!opened) {
258+ qCritical() << _db.lastError();
259+ return false;
260+ }
261+
262+ _db.transaction();
263+
264+ // create the required tables and indexes
265+ bool success = true;
266+ QSqlQuery query;
267+ success &= query.exec(SINGLE_DOWNLOAD_TABLE);
268+ success &= query.exec(GROUP_DOWNLOAD_TABLE);
269+ success &= query.exec(GROUP_DOWNLOAD_RELATION);
270+
271+ if (success)
272+ _db.commit();
273+ else
274+ _db.rollback();
275+ _db.close();
276+ return success;
277+}
278+
279+QString
280+DownloadsDb::stateToString(Download::State state) {
281+ switch (state) {
282+ case Download::IDLE:
283+ return IDLE_STRING;
284+ case Download::START:
285+ return START_STRING;
286+ case Download::PAUSE:
287+ return PAUSE_STRING;
288+ case Download::RESUME:
289+ return RESUME_STRING;
290+ case Download::CANCEL:
291+ return CANCEL_STRING;
292+ case Download::FINISH:
293+ return FINISH_STRING;
294+ case Download::ERROR:
295+ return ERROR_STRING;
296+ default:
297+ return IDLE_STRING;
298+ }
299+}
300+
301+Download::State
302+DownloadsDb::stringToState(QString state) {
303+ QString lowerState = state.toLower();
304+ if (lowerState == IDLE_STRING)
305+ return Download::IDLE;
306+ if (lowerState == START_STRING)
307+ return Download::START;
308+ if (lowerState == PAUSE_STRING)
309+ return Download::PAUSE;
310+ if (lowerState == RESUME_STRING)
311+ return Download::RESUME;
312+ if (lowerState == CANCEL_STRING)
313+ return Download::CANCEL;
314+ if (lowerState == FINISH_STRING)
315+ return Download::FINISH;
316+ if (lowerState == ERROR_STRING)
317+ return Download::ERROR;
318+
319+ // default case
320+ return Download::IDLE;
321+}
322+
323+QString
324+DownloadsDb::metadataToString(const QVariantMap& metadata) {
325+ QJsonDocument jsonDoc = QJsonDocument::fromVariant(QVariant(metadata));
326+ return QString(jsonDoc.toJson());
327+}
328+
329+QString
330+DownloadsDb::headersToString(const QMap<QString, QString>& headers) {
331+ QVariantMap headersVariant;
332+ foreach(const QString& key, headers.keys()) {
333+ headersVariant[key] = headers[key];
334+ }
335+ QJsonDocument jsonDoc = QJsonDocument::fromVariant(
336+ QVariant(headersVariant));
337+ return QString(jsonDoc.toJson());
338 }
339
340 bool
341 DownloadsDb::storeSingleDownload(FileDownload* download) {
342- Q_D(DownloadsDb);
343- return d->storeSingleDownload(download);
344+ // decide if we store it as a new download or update an existing one
345+ bool opened = _db.open();
346+
347+ if (!opened) {
348+ qCritical() << _db.lastError();
349+ return false;
350+ }
351+
352+ QSqlQuery query;
353+ query.prepare(PRESENT_SINGLE_DOWNLOAD);
354+ query.bindValue(":uuid", download->downloadId());
355+
356+ query.exec();
357+ int rows = 0;
358+ if (query.next())
359+ rows = query.value(0).toInt();
360+
361+ if (rows > 0) {
362+ qDebug() << "Update download";
363+ query.prepare(UPDATE_SINGLE_DOWNLOAD);
364+ } else {
365+ qDebug() << "Insert download";
366+ query.prepare(INSERT_SINGLE_DOWNLOAD);
367+ }
368+
369+ query.bindValue(":uuid", download->downloadId());
370+ query.bindValue(":url", download->url().toString());
371+ query.bindValue(":dbus_path", download->path());
372+ query.bindValue(":local_path", download->filePath());
373+ query.bindValue(":hash", download->hash());
374+ query.bindValue(":hash_algo",
375+ HashAlgorithm::getHashAlgo(download->hashAlgorithm()));
376+ query.bindValue(":state", stateToString(download->state()));
377+ query.bindValue(":total_size",
378+ QString::number(download->totalSize()));
379+ query.bindValue(":throttle",
380+ QString::number(download->throttle()));
381+ query.bindValue(":metadata",
382+ metadataToString(download->metadata()));
383+ query.bindValue(":headers",
384+ headersToString(download->headers()));
385+
386+ bool success = query.exec();
387+ if (!success)
388+ qDebug() << query.lastError();
389+
390+ _db.close();
391+
392+ return success;
393 }
394
395+
396 } // DownloadManager
397
398 } // Ubuntu
399
400=== modified file 'libubuntudownloadmanager/downloads/downloads_db.h'
401--- libubuntudownloadmanager/downloads/downloads_db.h 2013-10-25 11:44:53 +0000
402+++ libubuntudownloadmanager/downloads/downloads_db.h 2013-12-02 11:55:39 +0000
403@@ -28,10 +28,8 @@
404
405 namespace DownloadManager {
406
407-class DownloadsDbPrivate;
408 class DownloadsDb : public QObject {
409 Q_OBJECT
410- Q_DECLARE_PRIVATE(DownloadsDb)
411
412 public:
413 explicit DownloadsDb(QObject *parent = 0);
414@@ -44,8 +42,16 @@
415 bool storeSingleDownload(FileDownload* download);
416
417 private:
418- // use pimpl so that we can mantains ABI compatibility
419- DownloadsDbPrivate* d_ptr;
420+ QString headersToString(const QMap<QString, QString>& headers);
421+ void internalInit();
422+ QString metadataToString(const QVariantMap& metadata);
423+ QString stateToString(Download::State state);
424+ Download::State stringToState(QString state);
425+
426+ private:
427+ QString _dbName;
428+ FileManager* _fileManager;
429+ QSqlDatabase _db;
430 };
431
432 } // DownloadManager

Subscribers

People subscribed via source and target branches