Add Qt adapter and relative example.
This commit is contained in:
parent
3b153cbf9d
commit
8ef7d595ac
14
Makefile
14
Makefile
@ -36,6 +36,7 @@ export REDIS_TEST_CONFIG
|
|||||||
|
|
||||||
# Fallback to gcc when $CC is not in $PATH.
|
# Fallback to gcc when $CC is not in $PATH.
|
||||||
CC:=$(shell sh -c 'type $(CC) >/dev/null 2>/dev/null && echo $(CC) || echo gcc')
|
CC:=$(shell sh -c 'type $(CC) >/dev/null 2>/dev/null && echo $(CC) || echo gcc')
|
||||||
|
CXX:=$(shell sh -c 'type $(CXX) >/dev/null 2>/dev/null && echo $(CXX) || echo g++')
|
||||||
OPTIMIZATION?=-O3
|
OPTIMIZATION?=-O3
|
||||||
WARNINGS=-Wall -W -Wstrict-prototypes -Wwrite-strings
|
WARNINGS=-Wall -W -Wstrict-prototypes -Wwrite-strings
|
||||||
DEBUG?= -g -ggdb
|
DEBUG?= -g -ggdb
|
||||||
@ -116,6 +117,19 @@ hiredis-example-libuv: examples/example-libuv.c adapters/libuv.h $(STLIBNAME)
|
|||||||
$(CC) -o examples/$@ $(REAL_CFLAGS) $(REAL_LDFLAGS) -I. -I$(LIBUV_DIR)/include $< $(LIBUV_DIR)/.libs/libuv.a -lpthread -lrt $(STLIBNAME)
|
$(CC) -o examples/$@ $(REAL_CFLAGS) $(REAL_LDFLAGS) -I. -I$(LIBUV_DIR)/include $< $(LIBUV_DIR)/.libs/libuv.a -lpthread -lrt $(STLIBNAME)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(and $(QT_MOC),$(QT_INCLUDE_DIR),$(QT_LIBRARY_DIR)),)
|
||||||
|
hiredis-example-qt:
|
||||||
|
@echo "Please specify QT_MOC, QT_INCLUDE_DIR AND QT_LIBRARY_DIR"
|
||||||
|
@false
|
||||||
|
else
|
||||||
|
hiredis-example-qt: examples/example-qt.cpp adapters/qt.h $(STLIBNAME)
|
||||||
|
$(QT_MOC) adapters/qt.h -I. -I$(QT_INCLUDE_DIR) -I$(QT_INCLUDE_DIR)/QtCore | \
|
||||||
|
$(CXX) -x c++ -o qt-adapter-moc.o -c - $(REAL_CFLAGS) -I. -I$(QT_INCLUDE_DIR) -I$(QT_INCLUDE_DIR)/QtCore
|
||||||
|
$(QT_MOC) examples/example-qt.h -I. -I$(QT_INCLUDE_DIR) -I$(QT_INCLUDE_DIR)/QtCore | \
|
||||||
|
$(CXX) -x c++ -o qt-example-moc.o -c - $(REAL_CFLAGS) -I. -I$(QT_INCLUDE_DIR) -I$(QT_INCLUDE_DIR)/QtCore
|
||||||
|
$(CXX) -o examples/$@ $(REAL_CFLAGS) $(REAL_LDFLAGS) -I. -I$(QT_INCLUDE_DIR) -I$(QT_INCLUDE_DIR)/QtCore -L$(QT_LIBRARY_DIR) qt-adapter-moc.o qt-example-moc.o $< -pthread $(STLIBNAME) -lQtCore
|
||||||
|
endif
|
||||||
|
|
||||||
hiredis-example: examples/example.c $(STLIBNAME)
|
hiredis-example: examples/example.c $(STLIBNAME)
|
||||||
$(CC) -o examples/$@ $(REAL_CFLAGS) $(REAL_LDFLAGS) -I. $< $(STLIBNAME)
|
$(CC) -o examples/$@ $(REAL_CFLAGS) $(REAL_LDFLAGS) -I. $< $(STLIBNAME)
|
||||||
|
|
||||||
|
63
adapters/qt.h
Normal file
63
adapters/qt.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (C) 2014 Pietro Cerutti <gahr@gahr.ch>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __HIREDIS_QT_H__
|
||||||
|
#define __HIREDIS_QT_H__
|
||||||
|
#include <QSocketNotifier>
|
||||||
|
#include "../async.h"
|
||||||
|
|
||||||
|
class RedisQtAdapter : public QObject {
|
||||||
|
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
RedisQtAdapter(QObject * parent = 0)
|
||||||
|
: QObject(parent), m_ctx(0), m_read(0), m_write(0) { }
|
||||||
|
|
||||||
|
~RedisQtAdapter() { }
|
||||||
|
|
||||||
|
void setContext(redisAsyncContext * ac) {
|
||||||
|
m_ctx = ac;
|
||||||
|
|
||||||
|
delete m_read;
|
||||||
|
m_read = new QSocketNotifier(ac->c.fd, QSocketNotifier::Read, this),
|
||||||
|
connect(m_read, SIGNAL(activated(int)), this, SLOT(read()));
|
||||||
|
|
||||||
|
delete m_write;
|
||||||
|
m_write = new QSocketNotifier(ac->c.fd, QSocketNotifier::Write, this);
|
||||||
|
connect(m_write, SIGNAL(activated(int)), this, SLOT(write()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void read() { redisAsyncHandleRead(m_ctx); }
|
||||||
|
void write() { redisAsyncHandleWrite(m_ctx); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
redisAsyncContext * m_ctx;
|
||||||
|
QSocketNotifier * m_read;
|
||||||
|
QSocketNotifier * m_write;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* !__HIREDIS_QT_H__ */
|
46
examples/example-qt.cpp
Normal file
46
examples/example-qt.cpp
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
#include "example-qt.h"
|
||||||
|
|
||||||
|
void getCallback(redisAsyncContext *, void * r, void * privdata) {
|
||||||
|
|
||||||
|
redisReply * reply = static_cast<redisReply *>(r);
|
||||||
|
ExampleQt * ex = static_cast<ExampleQt *>(privdata);
|
||||||
|
if (reply == nullptr || ex == nullptr) return;
|
||||||
|
|
||||||
|
cout << "key: " << reply->str << endl;
|
||||||
|
|
||||||
|
ex->finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExampleQt::run() {
|
||||||
|
|
||||||
|
m_ctx = redisAsyncConnect("localhost", 6379);
|
||||||
|
|
||||||
|
if (m_ctx->err) {
|
||||||
|
cerr << "Error: " << m_ctx->errstr << endl;
|
||||||
|
redisAsyncFree(m_ctx);
|
||||||
|
emit finished();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_adapter.setContext(m_ctx);
|
||||||
|
|
||||||
|
redisAsyncCommand(m_ctx, NULL, NULL, "SET key %s", m_value);
|
||||||
|
redisAsyncCommand(m_ctx, getCallback, this, "GET key");
|
||||||
|
}
|
||||||
|
|
||||||
|
int main (int argc, char **argv) {
|
||||||
|
|
||||||
|
QCoreApplication app(argc, argv);
|
||||||
|
|
||||||
|
ExampleQt example(argv[argc-1]);
|
||||||
|
|
||||||
|
QObject::connect(&example, SIGNAL(finished()), &app, SLOT(quit()));
|
||||||
|
QTimer::singleShot(0, &example, SLOT(run()));
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
32
examples/example-qt.h
Normal file
32
examples/example-qt.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#ifndef __HIREDIS_EXAMPLE_QT_H
|
||||||
|
#define __HIREDIS_EXAMPLE_QT_H
|
||||||
|
|
||||||
|
#include <adapters/qt.h>
|
||||||
|
|
||||||
|
class ExampleQt : public QObject {
|
||||||
|
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
ExampleQt(const char * value, QObject * parent = 0)
|
||||||
|
: QObject(parent), m_value(value) {}
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void finished();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void run();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void finish() { emit finished(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
const char * m_value;
|
||||||
|
redisAsyncContext * m_ctx;
|
||||||
|
RedisQtAdapter m_adapter;
|
||||||
|
|
||||||
|
friend
|
||||||
|
void getCallback(redisAsyncContext *, void *, void *);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* !__HIREDIS_EXAMPLE_QT_H */
|
Loading…
Reference in New Issue
Block a user