2
* Copyright (C) 2013 Canonical, Ltd.
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation; version 3.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU General Public License for more details.
13
* You should have received a copy of the GNU General Public License
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16
* Author: Pete Woods <pete.woods@canonical.com>
19
#include <usermetricsservice/DBusDataSource.h>
20
#include <usermetricsservice/DBusUserMetrics.h>
21
#include <usermetricsservice/DBusUserData.h>
22
#include <usermetricsservice/UserMetricsAdaptor.h>
23
#include <usermetricsservice/database/DataSource.h>
24
#include <usermetricsservice/database/UserData.h>
25
#include <usermetricsservice/database/DataSet.h>
26
#include <libusermetricscommon/DateFactory.h>
27
#include <libusermetricscommon/DBusPaths.h>
30
#include <QDjangoQuerySet.h>
33
using namespace UserMetricsCommon;
34
using namespace UserMetricsService;
36
DBusUserMetrics::DBusUserMetrics(QDBusConnection &dbusConnection,
37
QSharedPointer<DateFactory> dateFactory, QObject *parent) :
38
QObject(parent), m_dbusConnection(dbusConnection), m_adaptor(
39
new UserMetricsAdaptor(this)), m_dateFactory(dateFactory) {
42
QDjango::registerModel<DataSource>();
43
QDjango::registerModel<UserData>();
44
QDjango::registerModel<DataSet>();
46
QDjango::createTables();
50
if (!m_dbusConnection.registerService(DBusPaths::serviceName())) {
51
qWarning() << "Unable to register user metrics service on DBus";
53
if (!m_dbusConnection.registerObject(DBusPaths::userMetrics(), this)) {
54
throw logic_error("Unable to register user metrics object on DBus");
60
DBusUserMetrics::~DBusUserMetrics() {
61
m_dbusConnection.unregisterObject(DBusPaths::userMetrics());
62
if (!m_dbusConnection.unregisterService(DBusPaths::serviceName())) {
63
qWarning() << "Unable to unregister user metrics service on DBus";
67
QList<QDBusObjectPath> DBusUserMetrics::dataSources() const {
68
QList<QDBusObjectPath> dataSources;
69
for (DBusDataSourcePtr dataSource : m_dataSources.values()) {
70
dataSources << QDBusObjectPath(dataSource->path());
75
void DBusUserMetrics::syncDatabase() {
77
QSet<int> dataSourceNames;
78
QDjangoQuerySet<DataSource> query;
79
for (const DataSource &dataSource : query) {
80
const int id(dataSource.id());
81
dataSourceNames << id;
82
// if we don't have a local cache
83
if (!m_dataSources.contains(id)) {
84
DBusDataSourcePtr dbusDataSource(
85
new DBusDataSource(id, dataSource.name(),
87
m_dataSources.insert(id, dbusDataSource);
88
m_adaptor->dataSourceAdded(dbusDataSource->name(),
89
QDBusObjectPath(dbusDataSource->path()));
92
// remove any cached references to deleted sources
93
QSet<int> cachedDataSourceNames(
94
QSet<int>::fromList(m_dataSources.keys()));
95
QSet<int> &toRemove(cachedDataSourceNames.subtract(dataSourceNames));
96
for (int id : toRemove) {
97
DBusDataSourcePtr dataSource(m_dataSources.take(id));
98
m_adaptor->dataSourceRemoved(dataSource->name(),
99
QDBusObjectPath(dataSource->path()));
105
QDjangoQuerySet<UserData> query;
106
for (const UserData &userData : query) {
107
const int id(userData.id());
109
// if we don't have a local cache
110
if (!m_userData.contains(id)) {
111
DBusUserDataPtr dbusUserData(
112
new DBusUserData(id, userData.username(), *this,
113
m_dbusConnection, m_dateFactory));
114
m_userData.insert(id, dbusUserData);
115
m_adaptor->userDataAdded(dbusUserData->username(),
116
QDBusObjectPath(dbusUserData->path()));
119
// remove any cached references to deleted sources
120
QSet<int> cachedUsernames(QSet<int>::fromList(m_userData.keys()));
121
QSet<int> &toRemove(cachedUsernames.subtract(usernames));
122
for (int id : toRemove) {
123
DBusUserDataPtr userData(m_userData.take(id));
124
m_adaptor->userDataRemoved(userData->username(),
125
QDBusObjectPath(userData->path()));
130
QDBusObjectPath DBusUserMetrics::createDataSource(const QString &name,
131
const QString &formatString) {
132
QDjangoQuerySet<DataSource> dataSourcesQuery;
133
QDjangoQuerySet<DataSource> query(
134
dataSourcesQuery.filter(
135
QDjangoWhere("name", QDjangoWhere::Equals, name)));
137
if (query.size() == -1) {
138
throw logic_error("data source query failed");
141
DataSource dataSource;
143
if (query.size() == 0) {
144
dataSource.setName(name);
145
dataSource.setFormatString(formatString);
147
if (!dataSource.save()) {
148
throw logic_error("could not save data source");
153
query.at(0, &dataSource);
156
return QDBusObjectPath((*m_dataSources.constFind(dataSource.id()))->path());
159
QList<QDBusObjectPath> DBusUserMetrics::userDatas() const {
160
QList<QDBusObjectPath> userDatas;
161
for (DBusUserDataPtr userData : m_userData.values()) {
162
userDatas << QDBusObjectPath(userData->path());
167
QDBusObjectPath DBusUserMetrics::createUserData(const QString &username) {
168
QDjangoQuerySet<UserData> query(
169
QDjangoQuerySet<UserData>().filter(
170
QDjangoWhere("username", QDjangoWhere::Equals, username)));
172
if (query.size() == -1) {
173
throw logic_error("user data query failed");
178
if (query.size() == 0) {
179
userData.setUsername(username);
181
if (!userData.save()) {
182
throw logic_error("could not save user data");
187
query.at(0, &userData);
190
return QDBusObjectPath((*m_userData.constFind(userData.id()))->path());
193
DBusDataSourcePtr DBusUserMetrics::dataSource(const QString &name) const {
194
DataSource dataSource;
195
DataSource::findByName(name, &dataSource);
197
return m_dataSources.value(dataSource.id());
200
DBusUserDataPtr DBusUserMetrics::userData(const QString &username) const {
202
UserData::findByName(username, &userData);
204
return m_userData.value(userData.id());