summaryrefslogtreecommitdiffstats
path: root/src/imports/jsondb/jsondbpartition.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/imports/jsondb/jsondbpartition.cpp')
-rw-r--r--src/imports/jsondb/jsondbpartition.cpp245
1 files changed, 120 insertions, 125 deletions
diff --git a/src/imports/jsondb/jsondbpartition.cpp b/src/imports/jsondb/jsondbpartition.cpp
index 2302317..040e047 100644
--- a/src/imports/jsondb/jsondbpartition.cpp
+++ b/src/imports/jsondb/jsondbpartition.cpp
@@ -38,14 +38,13 @@
** $QT_END_LICENSE$
**
****************************************************************************/
-
-#include "private/jsondb-strings_p.h"
#include "jsondbpartition.h"
+#include "jsondatabase.h"
#include "jsondbnotification.h"
#include "plugin.h"
-#include "jsondb-client.h"
#include "jsondbqueryobject.h"
-#include "jsondbchangessinceobject.h"
+#include <QJsonDbCreateRequest>
+#include <private/qjsondbstrings_p.h>
#include <qdebug.h>
QT_BEGIN_NAMESPACE_JSONDB
@@ -67,12 +66,9 @@ JsonDbPartition::JsonDbPartition(const QString &partitionName, QObject *parent)
:QObject(parent)
,_name(partitionName)
{
- connect(&jsonDb, SIGNAL(response(int,const QVariant&)),
- this, SLOT(dbResponse(int,const QVariant&)));
- connect(&jsonDb, SIGNAL(error(int,int,QString)),
- this, SLOT(dbErrorResponse(int,int,QString)));
}
+
JsonDbPartition::~JsonDbPartition()
{
}
@@ -91,10 +87,10 @@ void JsonDbPartition::setName(const QString &partitionName)
{
if (partitionName != _name) {
_name = partitionName;
- foreach (QPointer<JsonDbNotify> notify, notifications) {
- removeNotification(notify);
+ foreach (QPointer<QJsonDbWatcher> watcher, watchers) {
+ JsonDatabase::sharedConnection().removeWatcher(watcher);
}
- notifications.clear();
+ watchers.clear();
// tell notifications to resubscribe
emit nameChanged(partitionName);
}
@@ -112,6 +108,27 @@ static QVariant qjsvalue_to_qvariant(const QJSValue &value)
}
}
}
+
+QList<QJsonObject> qvariantlist_to_qjsonobject_list(const QVariantList &list)
+{
+ QList<QJsonObject> objects;
+ int count = list.count();
+ for (int i = 0; i < count; i++) {
+ objects.append(QJsonObject::fromVariantMap(list[i].toMap()));
+ }
+ return objects;
+}
+
+QVariantList qjsonobject_list_to_qvariantlist(const QList<QJsonObject> &list)
+{
+ QVariantList objects;
+ int count = list.count();
+ for (int i = 0; i < count; i++) {
+ objects.append(list[i].toVariantMap());
+ }
+ return objects;
+}
+
/*!
\qmlmethod int QtJsonDb::Partition::create(object newObject, object options, function callback)
@@ -168,9 +185,23 @@ int JsonDbPartition::create(const QJSValue &object, const QJSValue &options, co
actualOptions = QJSValue(QJSValue::UndefinedValue);
}
//#TODO ADD options
- int id = jsonDb.create(qjsvalue_to_qvariant(object), _name);
- createCallbacks.insert(id, actualCallback);
- return id;
+ QVariant obj = qjsvalue_to_qvariant(object);
+ QJsonDbWriteRequest *request(0);
+ if (obj.type() == QVariant::List) {
+ request = new QJsonDbCreateRequest(qvariantlist_to_qjsonobject_list(obj.toList()));
+ } else {
+ request = new QJsonDbCreateRequest(QJsonObject::fromVariantMap(obj.toMap()));
+ }
+ request->setPartition(_name);
+ connect(request, SIGNAL(finished()), this, SLOT(requestFinished()));
+ connect(request, SIGNAL(finished()), request, SLOT(deleteLater()));
+ connect(request, SIGNAL(error(QtJsonDb::QJsonDbRequest::ErrorCode,QString)),
+ this, SLOT(requestError(QtJsonDb::QJsonDbRequest::ErrorCode,QString)));
+ connect(request, SIGNAL(error(QtJsonDb::QJsonDbRequest::ErrorCode,QString)),
+ request, SLOT(deleteLater()));
+ JsonDatabase::sharedConnection().send(request);
+ writeCallbacks.insert(request, actualCallback);
+ return request->property("requestId").toInt();
}
/*!
@@ -241,9 +272,23 @@ int JsonDbPartition::update(const QJSValue &object, const QJSValue &options, co
actualOptions = QJSValue(QJSValue::UndefinedValue);
}
//#TODO ADD options
- int id = jsonDb.update(qjsvalue_to_qvariant(object), _name);
- updateCallbacks.insert(id, actualCallback);
- return id;
+ QVariant obj = qjsvalue_to_qvariant(object);
+ QJsonDbWriteRequest *request(0);
+ if (obj.type() == QVariant::List) {
+ request = new QJsonDbUpdateRequest(qvariantlist_to_qjsonobject_list(obj.toList()));
+ } else {
+ request = new QJsonDbUpdateRequest(QJsonObject::fromVariantMap(obj.toMap()));
+ }
+ request->setPartition(_name);
+ connect(request, SIGNAL(finished()), this, SLOT(requestFinished()));
+ connect(request, SIGNAL(finished()), request, SLOT(deleteLater()));
+ connect(request, SIGNAL(error(QtJsonDb::QJsonDbRequest::ErrorCode,QString)),
+ this, SLOT(requestError(QtJsonDb::QJsonDbRequest::ErrorCode,QString)));
+ connect(request, SIGNAL(error(QtJsonDb::QJsonDbRequest::ErrorCode,QString)),
+ request, SLOT(deleteLater()));
+ JsonDatabase::sharedConnection().send(request);
+ writeCallbacks.insert(request, actualCallback);
+ return request->property("requestId").toInt();
}
/*!
@@ -306,9 +351,23 @@ int JsonDbPartition::remove(const QJSValue &object, const QJSValue &options, co
actualOptions = QJSValue(QJSValue::UndefinedValue);
}
//#TODO ADD options
- int id = jsonDb.remove(qjsvalue_to_qvariant(object), _name);
- removeCallbacks.insert(id, actualCallback);
- return id;
+ QVariant obj = qjsvalue_to_qvariant(object);
+ QJsonDbWriteRequest *request(0);
+ if (obj.type() == QVariant::List) {
+ request = new QJsonDbRemoveRequest(qvariantlist_to_qjsonobject_list(obj.toList()));
+ } else {
+ request = new QJsonDbRemoveRequest(QJsonObject::fromVariantMap(obj.toMap()));
+ }
+ request->setPartition(_name);
+ connect(request, SIGNAL(finished()), this, SLOT(requestFinished()));
+ connect(request, SIGNAL(finished()), request, SLOT(deleteLater()));
+ connect(request, SIGNAL(error(QtJsonDb::QJsonDbRequest::ErrorCode,QString)),
+ this, SLOT(requestError(QtJsonDb::QJsonDbRequest::ErrorCode,QString)));
+ connect(request, SIGNAL(error(QtJsonDb::QJsonDbRequest::ErrorCode,QString)),
+ request, SLOT(deleteLater()));
+ JsonDatabase::sharedConnection().send(request);
+ writeCallbacks.insert(request, actualCallback);
+ return request->property("requestId").toInt();
}
/*!
@@ -457,45 +516,6 @@ JsonDbQueryObject* JsonDbPartition::createQuery(const QString &query, int limit,
return queryObject;
}
-/*!
- \qmlmethod object QtJsonDb::Partition::createChangesSince(stateNumber, types)
-
- Create the ChangesSince object. It will set the \a stateNumber, filter \a types parameters
- of the object. Users have to call start() to start the changesSince query in this partition.
- The script engine decides the life time of the returned object. The returned object can be
- saved in a 'property var' until it is required.
-
- \code
- import QtJsonDb 1.0 as JsonDb
- property var changesObject;
- function onFinished()
- {
- var results = queryObject.takeResults();
- console.log("Results: Count + results.length );
- }
-
- Component.onCompleted: {
- changesObject = nokiaPartition.createChangesSince(10, ["Contact"]);
- changesObject.finished.connect(onFinished);
- changesObject.start();
-
- }
- \endcode
- \sa QtJsonDb::ChangesSince
-
-*/
-
-JsonDbChangesSinceObject* JsonDbPartition::createChangesSince(int stateNumber, const QStringList &types)
-{
- JsonDbChangesSinceObject* changesSinceObject = new JsonDbChangesSinceObject();
- changesSinceObject->setTypes(types);
- changesSinceObject->setStateNumber(stateNumber);
- changesSinceObject->setPartition(this);
- changesSinceObject->componentComplete();
- QQmlEngine::setObjectOwnership(changesSinceObject, QQmlEngine::JavaScriptOwnership);
- return changesSinceObject;
-}
-
QQmlListProperty<QObject> JsonDbPartition::childElements()
{
return QQmlListProperty<QObject>(this, childQMLElements);
@@ -503,65 +523,47 @@ QQmlListProperty<QObject> JsonDbPartition::childElements()
void JsonDbPartition::updateNotification(JsonDbNotify *notify)
{
- JsonDbClient::NotifyTypes notifyActions = JsonDbClient::NotifyCreate
- | JsonDbClient::NotifyUpdate| JsonDbClient::NotifyRemove;
- notify->uuid= jsonDb.registerNotification(notifyActions, notify->query(), _name
- , notify, SLOT(dbNotified(QString,QtAddOn::JsonDb::JsonDbNotification))
- , notify, SLOT(dbNotifyReadyResponse(int,QVariant))
- , SLOT(dbNotifyErrorResponse(int,int,QString)));
- notifications.insert(notify->uuid, notify);
+ JsonDatabase::sharedConnection().addWatcher(notify->watcher);
+ watchers.append(notify->watcher);
}
-
void JsonDbPartition::removeNotification(JsonDbNotify *notify)
{
- if (notifications.contains(notify->uuid)) {
- jsonDb.unregisterNotification(notify->uuid);
- notifications.remove(notify->uuid);
+ if (watchers.contains(notify->watcher)) {
+ JsonDatabase::sharedConnection().removeWatcher(notify->watcher);
+ watchers.removeAll(notify->watcher);
}
}
-void JsonDbPartition::call(QMap<int, QJSValue> &callbacks, int id, const QVariant &result)
+void JsonDbPartition::call(QMap<QJsonDbWriteRequest*, QJSValue> &callbacks, QJsonDbWriteRequest *request)
{
- // Make sure that id exists in the map.
- QJSValue callback = callbacks[id];
+ QJSValue callback = callbacks[request];
QJSEngine *engine = callback.engine();
if (!engine) {
- callbacks.remove(id);
+ callbacks.remove(request);
return;
}
+ QList<QJsonObject> objects = request->takeResults();
QJSValueList args;
- QVariantMap object = result.toMap();
// object : id , statenumber , items
QJSValue response= engine->newObject();
- response.setProperty(JsonDbString::kStateNumberStr, object.value(JsonDbString::kStateNumberStr).toInt());
- response.setProperty(JsonDbString::kIdStr, id);
+ response.setProperty(JsonDbStrings::Protocol::stateNumber(), request->stateNumber());
+ response.setProperty(JsonDbStrings::Protocol::requestId(), request->property("requestId").toInt());
+ QJSValue items = engine->toScriptValue(qjsonobject_list_to_qvariantlist(objects));
+ response.setProperty(QLatin1String("items"), items);
- // response object : object { _version & _uuid } (can be a list)
- if (object.contains(QLatin1String("data"))) {
- QJSValue items = engine->toScriptValue(object.value(QLatin1String("data")));
- response.setProperty(QLatin1String("items"), items);
- } else {
- // Create an array with a single element
- QJSValue responseObject = engine->newObject();
- responseObject.setProperty(JsonDbString::kUuidStr, object.value(JsonDbString::kUuidStr).toString());
- responseObject.setProperty(JsonDbString::kVersionStr, object.value(JsonDbString::kVersionStr).toString());
- QJSValue items = engine->newArray(1);
- items.setProperty(0, responseObject);
- response.setProperty(QLatin1String("items"), items);
- }
args << QJSValue(QJSValue::UndefinedValue) << response;
callback.call(args);
- callbacks.remove(id);
+ callbacks.remove(request);
}
-void JsonDbPartition::callErrorCallback(QMap<int, QJSValue> &callbacks, int id, int code, const QString &message)
+void JsonDbPartition::callErrorCallback(QMap<QJsonDbWriteRequest*, QJSValue> &callbacks, QJsonDbWriteRequest *request,
+ QtJsonDb::QJsonDbRequest::ErrorCode code, const QString &message)
{
- // Make sure that id exists in the map.
- QJSValue callback = callbacks[id];
+ QJSValue callback = callbacks[request];
QJSEngine *engine = callback.engine();
if (!engine) {
- callbacks.remove(id);
+ callbacks.remove(request);
return;
}
QJSValueList args;
@@ -571,36 +573,13 @@ void JsonDbPartition::callErrorCallback(QMap<int, QJSValue> &callbacks, int id,
// object : id
QJSValue response = engine->newObject();
- response.setProperty(JsonDbString::kStateNumberStr, -1);
- response.setProperty(JsonDbString::kIdStr, id);
+ response.setProperty(JsonDbStrings::Protocol::stateNumber(), -1);
+ response.setProperty(JsonDbStrings::Protocol::requestId(), request->property("requestId").toInt());
response.setProperty(QLatin1String("items"), engine->newArray());
args << engine->toScriptValue(QVariant(error))<< response;
callback.call(args);
- callbacks.remove(id);
-}
-
-
-void JsonDbPartition::dbResponse(int id, const QVariant &result)
-{
- if (createCallbacks.contains(id)) {
- call(createCallbacks, id, result);
- } else if (updateCallbacks.contains(id)) {
- call(updateCallbacks, id, result);
- } else if (removeCallbacks.contains(id)) {
- call(removeCallbacks, id, result);
- }
-}
-
-void JsonDbPartition::dbErrorResponse(int id, int code, const QString &message)
-{
- if (createCallbacks.contains(id)) {
- callErrorCallback(createCallbacks, id, code, message);
- } else if (removeCallbacks.contains(id)) {
- callErrorCallback(removeCallbacks, id, code, message);
- } else if (updateCallbacks.contains(id)) {
- callErrorCallback(updateCallbacks, id, code, message);
- }
+ callbacks.remove(request);
}
void JsonDbPartition::queryFinished()
@@ -614,8 +593,8 @@ void JsonDbPartition::queryFinished()
QJSValueList args;
// object : id , statenumber , items
QJSValue response= engine->newObject();
- response.setProperty(JsonDbString::kStateNumberStr, object->stateNumber());
- response.setProperty(JsonDbString::kIdStr, id);
+ response.setProperty(JsonDbStrings::Protocol::stateNumber(), object->stateNumber());
+ response.setProperty(JsonDbStrings::Protocol::requestId(), id);
response.setProperty(QLatin1String("items"), engine->toScriptValue(object->takeResults()));
args << QJSValue(QJSValue::UndefinedValue) << response;
callback.call(args);
@@ -637,8 +616,8 @@ void JsonDbPartition::queryStatusChanged()
QJSValueList args;
QJSValue response = engine->newObject();
- response.setProperty(JsonDbString::kStateNumberStr, -1);
- response.setProperty(JsonDbString::kIdStr, id);
+ response.setProperty(JsonDbStrings::Protocol::stateNumber(), -1);
+ response.setProperty(JsonDbStrings::Protocol::requestId(), id);
response.setProperty(QLatin1String("items"), engine->newArray());
args << engine->toScriptValue(object->error())<< response;
@@ -650,6 +629,22 @@ void JsonDbPartition::queryStatusChanged()
}
}
+void JsonDbPartition::requestFinished()
+{
+ QJsonDbWriteRequest *request = qobject_cast<QJsonDbWriteRequest *>(sender());
+ if (writeCallbacks.contains(request)) {
+ call(writeCallbacks, request);
+ }
+}
+
+void JsonDbPartition::requestError(QtJsonDb::QJsonDbRequest::ErrorCode code, const QString &message)
+{
+ QJsonDbWriteRequest *request = qobject_cast<QJsonDbWriteRequest *>(sender());
+ if (writeCallbacks.contains(request)) {
+ callErrorCallback(writeCallbacks, request, code, message);
+ }
+
+}
#include "moc_jsondbpartition.cpp"
QT_END_NAMESPACE_JSONDB