summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/client/jsondb-client.cpp48
-rw-r--r--src/client/jsondb-client.h15
-rw-r--r--src/client/jsondb-client_p.h3
-rw-r--r--tools/jsondb-client/client.cpp7
4 files changed, 65 insertions, 8 deletions
diff --git a/src/client/jsondb-client.cpp b/src/client/jsondb-client.cpp
index 9ce6eeff..eb820661 100644
--- a/src/client/jsondb-client.cpp
+++ b/src/client/jsondb-client.cpp
@@ -208,8 +208,12 @@ void JsonDbClientPrivate::_q_statusChanged()
if (status != JsonDbClient::Error) {
requestQueue.unite(sentRequestQueue);
sentRequestQueue.clear();
- newStatus = JsonDbClient::Connecting;
- QTimer::singleShot(5000, q, SLOT(_q_timeout()));
+ if (autoReconnect) {
+ newStatus = JsonDbClient::Connecting;
+ QTimer::singleShot(5000, q, SLOT(_q_timeout()));
+ } else {
+ newStatus = JsonDbClient::Error;
+ }
}
break;
case JsonDbConnection::Connecting:
@@ -949,6 +953,46 @@ JsonDbChangesSince *JsonDbClient::changesSince()
}
/*!
+ \property JsonDbClient::autoReconnect
+
+ \brief Specifies whether to reconnect when server connection is lost.
+*/
+void JsonDbClient::setAutoReconnect(bool reconnect)
+{
+ Q_D(JsonDbClient);
+ d->autoReconnect = reconnect;
+}
+
+bool JsonDbClient::autoReconnect() const
+{
+ return d_func()->autoReconnect;
+}
+
+/*!
+ Connects to the server if not connected.
+ \sa autoReconnect(), disconnectFromServer()
+*/
+void JsonDbClient::connectToServer()
+{
+ Q_D(JsonDbClient);
+ if (d->status == JsonDbClient::Connecting || d->status == JsonDbClient::Ready)
+ return;
+ d->connection->connectToServer();
+}
+
+/*!
+ Disconnects to the server if connected.
+ \sa autoReconnect(), connectToServer()
+*/
+void JsonDbClient::disconnectFromServer()
+{
+ Q_D(JsonDbClient);
+ if (d->status != JsonDbClient::Ready)
+ return;
+ d->connection->disconnectFromServer();
+}
+
+/*!
\fn void JsonDbClient::notified(const QString &notifyUuid, const JsonDbNotification &notification)
Signal that a notification has been received. The notification object must
diff --git a/src/client/jsondb-client.h b/src/client/jsondb-client.h
index 2b592185..b0c3c692 100644
--- a/src/client/jsondb-client.h
+++ b/src/client/jsondb-client.h
@@ -67,6 +67,7 @@ class Q_ADDON_JSONDB_EXPORT JsonDbClient : public QObject
{
Q_OBJECT
Q_PROPERTY(Status status READ status NOTIFY statusChanged)
+ Q_PROPERTY(bool autoReconnect READ autoReconnect WRITE setAutoReconnect)
public:
JsonDbClient(const QString &socketName, QObject *parent = 0);
JsonDbClient(QObject *parent = 0);
@@ -85,13 +86,19 @@ public:
Q_DECLARE_FLAGS(NotifyTypes, NotifyType)
enum Status {
- Null,
- Connecting,
- Ready,
- Error
+ Null = 0,
+ Connecting = 1,
+ Ready = 2,
+ Error = 3
};
Status status() const;
+ void setAutoReconnect(bool reconnect);
+ bool autoReconnect() const;
+
+ void connectToServer();
+ void disconnectFromServer();
+
public slots:
QT_DEPRECATED
int find(const QsonObject &query, QObject *target = 0, const char *successSlot = 0, const char *errorSlot = 0);
diff --git a/src/client/jsondb-client_p.h b/src/client/jsondb-client_p.h
index a003b310..e65db614 100644
--- a/src/client/jsondb-client_p.h
+++ b/src/client/jsondb-client_p.h
@@ -63,7 +63,7 @@ class JsonDbClientPrivate
Q_DECLARE_PUBLIC(JsonDbClient)
public:
JsonDbClientPrivate(JsonDbClient *q)
- : q_ptr(q), connection(0)
+ : q_ptr(q), connection(0), status(JsonDbClient::Null), autoReconnect(true)
{ }
~JsonDbClientPrivate()
@@ -80,6 +80,7 @@ public:
JsonDbConnection *connection;
JsonDbClient::Status status;
+ bool autoReconnect;
QMap<int, QVariantMap> requestQueue;
QMap<int, QVariantMap> sentRequestQueue;
diff --git a/tools/jsondb-client/client.cpp b/tools/jsondb-client/client.cpp
index 70197e02..c45616b9 100644
--- a/tools/jsondb-client/client.cpp
+++ b/tools/jsondb-client/client.cpp
@@ -321,7 +321,8 @@ void Client::usage()
{
std::stringstream out;
out << "Valid commands:" << std::endl
- << std::endl
+ << " connect" << std::endl
+ << " disconnect" << std::endl
<< "Direct database commands - these take an explict object" << std::endl
<< " create [partition:<name>] OBJECT" << std::endl
<< " update [partition:<name>] OBJECT" << std::endl
@@ -490,6 +491,10 @@ bool Client::processCommand(const QString &command)
qDebug() << "Sending changesSince: " << stateNumber << "types: " << types;
mRequests << mConnection->changesSince(stateNumber, types, partition);
+ } else if (cmd == "connect") {
+ mConnection->connectToServer();
+ } else if (cmd == "disconnect") {
+ mConnection->disconnectFromServer();
} else if (!cmd.isEmpty()) {
InputThread::print("Unrecognized command: " % cmd);
usage();