cutelyst  3.7.0
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.
memcached.h
1 /*
2  * SPDX-FileCopyrightText: (C) 2017-2022 Matthias Fehring <mf@huessenbergnetz.de>
3  * SPDX-License-Identifier: BSD-3-Clause
4  */
5 
6 #ifndef CUTELYSTMEMCACHED_H
7 #define CUTELYSTMEMCACHED_H
8 
9 #include <Cutelyst/cutelyst_global.h>
10 #include <Cutelyst/plugin.h>
11 
12 #include <QDataStream>
13 #include <QVersionNumber>
14 
15 namespace Cutelyst {
16 
17 class Context;
18 class MemcachedPrivate;
19 
128 class CUTELYST_PLUGIN_MEMCACHED_EXPORT Memcached : public Plugin
129 {
130  Q_OBJECT
131  Q_DECLARE_PRIVATE(Memcached)
132 public:
136  Memcached(Application *parent);
137 
141  virtual ~Memcached() override;
142 
167  End,
188  InProgress,
189  ServerTemporaryDisabled,
190  ServerMemoryAllocationFailure,
191  MaximumReturn,
192  PluginNotRegisterd
193  };
194  Q_ENUM(MemcachedReturnType)
195 
196 
200  void setDefaultConfig(const QVariantMap &defaultConfig);
201 
213  static bool set(const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
214 
228  template< typename T>
229  static bool set(const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
230 
246  static bool setByKey(const QString &groupKey, const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
247 
264  template< typename T>
265  static bool setByKey(const QString &groupKey, const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
266 
281  static bool add(const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
282 
299  template< typename T>
300  static bool add(const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
301 
320  static bool addByKey(const QString &groupKey, const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
321 
342  template< typename T>
343  static bool addByKey(const QString &groupKey, const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
344 
359  static bool replace(const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
360 
377  template< typename T>
378  static bool replace(const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
379 
398  static bool replaceByKey(const QString &groupKey, const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
399 
420  template< typename T>
421  static bool replaceByKey(const QString &groupKey, const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
422 
437  static QByteArray get(const QString &key, uint64_t *cas = nullptr, MemcachedReturnType *returnType = nullptr);
438 
467  template< typename T>
468  static T get(const QString &key, uint64_t *cas = nullptr, MemcachedReturnType *returnType = nullptr);
469 
488  static QByteArray getByKey(const QString &groupKey, const QString &key, uint64_t *cas = nullptr, MemcachedReturnType *returnType = nullptr);
489 
522  template< typename T>
523  static T getByKey(const QString &groupKey, const QString &key, uint64_t *cas = nullptr, MemcachedReturnType *returnType = nullptr);
524 
532  static bool remove(const QString &key, MemcachedReturnType *returnType = nullptr);
533 
545  static bool removeByKey(const QString &groupKey, const QString &key, MemcachedReturnType *returnType = nullptr);
546 
553  static bool exist(const QString &key, MemcachedReturnType *returnType = nullptr);
554 
565  static bool existByKey(const QString &groupKey, const QString &key, MemcachedReturnType *returnType = nullptr);
566 
571  static const time_t expirationNotAdd;
572 
587  static bool increment(const QString &key, uint32_t offset, uint64_t *value = nullptr, MemcachedReturnType *returnType = nullptr);
588 
606  static bool incrementByKey(const QString &groupKey, const QString &key, uint64_t offset, uint64_t *value = nullptr, MemcachedReturnType *returnType = nullptr);
607 
630  static bool incrementWithInitial(const QString &key, uint64_t offset, uint64_t initial, time_t expiration, uint64_t *value = nullptr, MemcachedReturnType *returnType = nullptr);
631 
659  static bool incrementWithInitialByKey(const QString &groupKey, const QString &key, uint64_t offset, uint64_t initial, time_t expiration, uint64_t *value = nullptr, MemcachedReturnType *returnType = nullptr);
660 
675  static bool decrement(const QString &key, uint32_t offset, uint64_t *value = nullptr, MemcachedReturnType *returnType = nullptr);
676 
694  static bool decrementByKey(const QString &groupKey, const QString &key, uint64_t offset, uint64_t *value = nullptr, MemcachedReturnType *returnType = nullptr);
695 
718  static bool decrementWithInitial(const QString &key, uint64_t offset, uint64_t initial, time_t expiration, uint64_t *value = nullptr, MemcachedReturnType *returnType = nullptr);
719 
747  static bool decrementWithInitialByKey(const QString &groupKey, const QString &key, uint64_t offset, uint64_t initial, time_t expiration, uint64_t *value = nullptr, MemcachedReturnType *returnType = nullptr);
748 
760  static bool cas(const QString &key, const QByteArray &value, time_t expiration, uint64_t cas, MemcachedReturnType *returnType = nullptr);
761 
775  template< typename T>
776  static bool cas(const QString &key, const T &value, time_t expiration, uint64_t cas, MemcachedReturnType *returnType = nullptr);
777 
794  static bool casByKey(const QString &groupKey, const QString &key, const QByteArray &value, time_t expiration, uint64_t cas, MemcachedReturnType *returnType = nullptr);
795 
814  template< typename T>
815  static bool casByKey(const QString &groupKey, const QString &key, const T &value, time_t expiration, uint64_t cas, MemcachedReturnType *returnType = nullptr);
816 
824  static bool flushBuffers(MemcachedReturnType *returnType = nullptr);
825 
836  static bool flush(time_t expiration, MemcachedReturnType *returnType = nullptr);
837 
850  static QHash<QString, QByteArray> mget(const QStringList &keys, QHash<QString, uint64_t> *casValues = nullptr, MemcachedReturnType *returnType = nullptr);
851 
866  template< typename T>
867  static QHash<QString, T> mget(const QStringList &keys, QHash<QString,uint64_t> *casValues = nullptr, MemcachedReturnType *returnType = nullptr);
868 
886  static QHash<QString, QByteArray> mgetByKey(const QString &groupKey, const QStringList &keys, QHash<QString,uint64_t> *casValues = nullptr, MemcachedReturnType *returnType = nullptr);
887 
907  template< typename T>
908  static QHash<QString, T> mgetByKey(const QString &groupKey, const QStringList &keys, QHash<QString,uint64_t> *casValues = nullptr, MemcachedReturnType *returnType = nullptr);
909 
918  static bool touch(const QString &key, time_t expiration, MemcachedReturnType *returnType = nullptr);
919 
933  static bool touchByKey(const QString &groupKey, const QString &key, time_t expiration, MemcachedReturnType *returnType = nullptr);
934 
938  static QString errorString(Context *c, MemcachedReturnType rt);
939 
943  static QVersionNumber libMemcachedVersion();
944 
945 protected:
946  const QScopedPointer<MemcachedPrivate> d_ptr;
947 
951  virtual bool setup(Application *app) override;
952 };
953 
954 template< typename T>
955 bool Memcached::set(const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType)
956 {
957  QByteArray data;
958 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
959  QDataStream out(&data, QIODevice::WriteOnly);
960 #else
961  QDataStream out(&data, QIODeviceBase::WriteOnly);
962 #endif
963  out << value;
964  return Memcached::set(key, data, expiration, returnType);
965 }
966 
967 template< typename T>
968 bool Memcached::setByKey(const QString &groupKey, const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType)
969 {
970  QByteArray data;
971 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
972  QDataStream out(&data, QIODevice::WriteOnly);
973 #else
974  QDataStream out(&data, QIODeviceBase::WriteOnly);
975 #endif
976  out << value;
977  return Memcached::setByKey(groupKey, key, data, expiration, returnType);
978 }
979 
980 template< typename T>
981 bool Memcached::add(const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType)
982 {
983  QByteArray data;
984 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
985  QDataStream out(&data, QIODevice::WriteOnly);
986 #else
987  QDataStream out(&data, QIODeviceBase::WriteOnly);
988 #endif
989  out << value;
990  return Memcached::add(key, data, expiration, returnType);
991 }
992 
993 template< typename T>
994 bool Memcached::addByKey(const QString &groupKey, const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType)
995 {
996  QByteArray data;
997 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
998  QDataStream out(&data, QIODevice::WriteOnly);
999 #else
1000  QDataStream out(&data, QIODeviceBase::WriteOnly);
1001 #endif
1002  out << value;
1003  return Memcached::addByKey(groupKey, key, data, expiration, returnType);
1004 }
1005 
1006 template< typename T>
1007 bool Memcached::replace(const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType)
1008 {
1009  QByteArray data;
1010 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
1011  QDataStream out(&data, QIODevice::WriteOnly);
1012 #else
1013  QDataStream out(&data, QIODeviceBase::WriteOnly);
1014 #endif
1015  out << value;
1016  return Memcached::replace(key, data, expiration, returnType);
1017 }
1018 
1019 template< typename T>
1020 bool Memcached::replaceByKey(const QString &groupKey, const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType)
1021 {
1022  QByteArray data;
1023 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
1024  QDataStream out(&data, QIODevice::WriteOnly);
1025 #else
1026  QDataStream out(&data, QIODeviceBase::WriteOnly);
1027 #endif
1028  out << value;
1029  return Memcached::replaceByKey(groupKey, key, data, expiration, returnType);
1030 }
1031 
1032 template< typename T>
1033 T Memcached::get(const QString &key, uint64_t *cas, MemcachedReturnType *returnType)
1034 {
1035  T retVal;
1036  QByteArray ba = Memcached::get(key, cas, returnType);
1037  if (!ba.isEmpty()) {
1038 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
1039  QDataStream in(&ba, QIODevice::ReadOnly);
1040 #else
1041  QDataStream in(&ba, QIODeviceBase::ReadOnly);
1042 #endif
1043  in >> retVal;
1044  }
1045  return retVal;
1046 }
1047 
1048 template< typename T>
1049 T Memcached::getByKey(const QString &groupKey, const QString &key, uint64_t *cas, MemcachedReturnType *returnType)
1050 {
1051  T retVal;
1052  QByteArray ba = Memcached::getByKey(groupKey, key, cas, returnType);
1053  if (!ba.isEmpty()) {
1054 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
1055  QDataStream in(&ba, QIODevice::ReadOnly);
1056 #else
1057  QDataStream in(&ba, QIODeviceBase::ReadOnly);
1058 #endif
1059  in >> retVal;
1060  }
1061  return retVal;
1062 }
1063 
1064 template< typename T>
1065 bool Memcached::cas(const QString &key, const T &value, time_t expiration, uint64_t cas, MemcachedReturnType *returnType)
1066 {
1067  QByteArray data;
1068 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
1069  QDataStream out(&data, QIODevice::WriteOnly);
1070 #else
1071  QDataStream out(&data, QIODeviceBase::WriteOnly);
1072 #endif
1073  out << value;
1074  return Memcached::cas(key, data, expiration, cas, returnType);
1075 }
1076 
1077 template< typename T>
1078 bool Memcached::casByKey(const QString &groupKey, const QString &key, const T &value, time_t expiration, uint64_t cas, MemcachedReturnType *returnType)
1079 {
1080  QByteArray data;
1081 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
1082  QDataStream out(&data, QIODevice::WriteOnly);
1083 #else
1084  QDataStream out(&data, QIODeviceBase::WriteOnly);
1085 #endif
1086  out << value;
1087  return Memcached::casByKey(groupKey, key, data, expiration, cas, returnType);
1088 }
1089 
1090 template< typename T>
1091 QHash<QString, T> Memcached::mget(const QStringList &keys, QHash<QString, uint64_t> *casValues, MemcachedReturnType *returnType)
1092 {
1093  QHash<QString, T> hash;
1094  QHash<QString,QByteArray> _data = Memcached::mget(keys, casValues, returnType);
1095  if (!_data.empty()) {
1096  auto i = _data.constBegin();
1097  while (i != _data.constEnd()) {
1098  T retVal;
1099  QDataStream in(i.value());
1100  in >> retVal;
1101  hash.insert(i.key(), retVal);
1102  ++i;
1103  }
1104  }
1105  return hash;
1106 }
1107 
1108 template< typename T>
1109 QHash<QString, T> Memcached::mgetByKey(const QString &groupKey, const QStringList &keys, QHash<QString,uint64_t> *casValues, MemcachedReturnType *returnType)
1110 {
1111  QHash<QString, T> hash;
1112  QHash<QString,QByteArray> _data = Memcached::mgetByKey(groupKey, keys, casValues, returnType);
1113  if (!_data.empty()) {
1114  auto i = _data.constBegin();
1115  while (i != _data.constEnd()) {
1116  T retVal;
1117  QDataStream in(i.value());
1118  in >> retVal;
1119  hash.insert(i.key(), retVal);
1120  ++i;
1121  }
1122  }
1123  return hash;
1124 }
1125 
1126 }
1127 
1128 #endif // CUTELYSTMEMCACHED_H
The Cutelyst Application.
Definition: application.h:43
The Cutelyst Context.
Definition: context.h:39
Cutelyst Memcached plugin.
Definition: memcached.h:129
static bool replaceByKey(const QString &groupKey, const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType=nullptr)
Definition: memcached.cpp:434
static bool add(const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType=nullptr)
Definition: memcached.cpp:314
static QByteArray get(const QString &key, uint64_t *cas=nullptr, MemcachedReturnType *returnType=nullptr)
Definition: memcached.cpp:476
static bool casByKey(const QString &groupKey, const QString &key, const QByteArray &value, time_t expiration, uint64_t cas, MemcachedReturnType *returnType=nullptr)
Definition: memcached.cpp:991
static bool cas(const QString &key, const QByteArray &value, time_t expiration, uint64_t cas, MemcachedReturnType *returnType=nullptr)
Definition: memcached.cpp:951
static QHash< QString, QByteArray > mgetByKey(const QString &groupKey, const QStringList &keys, QHash< QString, uint64_t > *casValues=nullptr, MemcachedReturnType *returnType=nullptr)
Definition: memcached.cpp:1155
static const time_t expirationNotAdd
Definition: memcached.h:571
static bool set(const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType=nullptr)
Definition: memcached.cpp:233
static bool setByKey(const QString &groupKey, const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType=nullptr)
Definition: memcached.cpp:272
static QHash< QString, QByteArray > mget(const QStringList &keys, QHash< QString, uint64_t > *casValues=nullptr, MemcachedReturnType *returnType=nullptr)
Definition: memcached.cpp:1080
static bool replace(const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType=nullptr)
Definition: memcached.cpp:395
static bool addByKey(const QString &groupKey, const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType=nullptr)
Definition: memcached.cpp:353
static QByteArray getByKey(const QString &groupKey, const QString &key, uint64_t *cas=nullptr, MemcachedReturnType *returnType=nullptr)
Definition: memcached.cpp:529
The Cutelyst namespace holds all public Cutelyst API.
Definition: Mainpage.dox:8