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 
129 class CUTELYST_PLUGIN_MEMCACHED_EXPORT Memcached : public Plugin
130 {
131  Q_OBJECT
132  Q_DECLARE_PRIVATE(Memcached)
133 public:
137  Memcached(Application *parent);
138 
142  virtual ~Memcached() override;
143 
168  End,
189  InProgress,
190  ServerTemporaryDisabled,
191  ServerMemoryAllocationFailure,
192  MaximumReturn,
193  PluginNotRegisterd
194  };
195  Q_ENUM(MemcachedReturnType)
196 
197 
201  void setDefaultConfig(const QVariantMap &defaultConfig);
202 
214  static bool set(const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
215 
229  template< typename T>
230  static bool set(const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
231 
247  static bool setByKey(const QString &groupKey, const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
248 
265  template< typename T>
266  static bool setByKey(const QString &groupKey, const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
267 
282  static bool add(const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
283 
300  template< typename T>
301  static bool add(const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
302 
321  static bool addByKey(const QString &groupKey, const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
322 
343  template< typename T>
344  static bool addByKey(const QString &groupKey, const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
345 
360  static bool replace(const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
361 
378  template< typename T>
379  static bool replace(const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
380 
399  static bool replaceByKey(const QString &groupKey, const QString &key, const QByteArray &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
400 
421  template< typename T>
422  static bool replaceByKey(const QString &groupKey, const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType = nullptr);
423 
438  static QByteArray get(const QString &key, uint64_t *cas = nullptr, MemcachedReturnType *returnType = nullptr);
439 
468  template< typename T>
469  static T get(const QString &key, uint64_t *cas = nullptr, MemcachedReturnType *returnType = nullptr);
470 
489  static QByteArray getByKey(const QString &groupKey, const QString &key, uint64_t *cas = nullptr, MemcachedReturnType *returnType = nullptr);
490 
523  template< typename T>
524  static T getByKey(const QString &groupKey, const QString &key, uint64_t *cas = nullptr, MemcachedReturnType *returnType = nullptr);
525 
533  static bool remove(const QString &key, MemcachedReturnType *returnType = nullptr);
534 
546  static bool removeByKey(const QString &groupKey, const QString &key, MemcachedReturnType *returnType = nullptr);
547 
554  static bool exist(const QString &key, MemcachedReturnType *returnType = nullptr);
555 
566  static bool existByKey(const QString &groupKey, const QString &key, MemcachedReturnType *returnType = nullptr);
567 
572  static const time_t expirationNotAdd;
573 
588  static bool increment(const QString &key, uint32_t offset, uint64_t *value = nullptr, MemcachedReturnType *returnType = nullptr);
589 
607  static bool incrementByKey(const QString &groupKey, const QString &key, uint64_t offset, uint64_t *value = nullptr, MemcachedReturnType *returnType = nullptr);
608 
631  static bool incrementWithInitial(const QString &key, uint64_t offset, uint64_t initial, time_t expiration, uint64_t *value = nullptr, MemcachedReturnType *returnType = nullptr);
632 
660  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);
661 
676  static bool decrement(const QString &key, uint32_t offset, uint64_t *value = nullptr, MemcachedReturnType *returnType = nullptr);
677 
695  static bool decrementByKey(const QString &groupKey, const QString &key, uint64_t offset, uint64_t *value = nullptr, MemcachedReturnType *returnType = nullptr);
696 
719  static bool decrementWithInitial(const QString &key, uint64_t offset, uint64_t initial, time_t expiration, uint64_t *value = nullptr, MemcachedReturnType *returnType = nullptr);
720 
748  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);
749 
761  static bool cas(const QString &key, const QByteArray &value, time_t expiration, uint64_t cas, MemcachedReturnType *returnType = nullptr);
762 
776  template< typename T>
777  static bool cas(const QString &key, const T &value, time_t expiration, uint64_t cas, MemcachedReturnType *returnType = nullptr);
778 
795  static bool casByKey(const QString &groupKey, const QString &key, const QByteArray &value, time_t expiration, uint64_t cas, MemcachedReturnType *returnType = nullptr);
796 
815  template< typename T>
816  static bool casByKey(const QString &groupKey, const QString &key, const T &value, time_t expiration, uint64_t cas, MemcachedReturnType *returnType = nullptr);
817 
825  static bool flushBuffers(MemcachedReturnType *returnType = nullptr);
826 
837  static bool flush(time_t expiration, MemcachedReturnType *returnType = nullptr);
838 
851  static QHash<QString, QByteArray> mget(const QStringList &keys, QHash<QString, uint64_t> *casValues = nullptr, MemcachedReturnType *returnType = nullptr);
852 
867  template< typename T>
868  static QHash<QString, T> mget(const QStringList &keys, QHash<QString,uint64_t> *casValues = nullptr, MemcachedReturnType *returnType = nullptr);
869 
887  static QHash<QString, QByteArray> mgetByKey(const QString &groupKey, const QStringList &keys, QHash<QString,uint64_t> *casValues = nullptr, MemcachedReturnType *returnType = nullptr);
888 
908  template< typename T>
909  static QHash<QString, T> mgetByKey(const QString &groupKey, const QStringList &keys, QHash<QString,uint64_t> *casValues = nullptr, MemcachedReturnType *returnType = nullptr);
910 
919  static bool touch(const QString &key, time_t expiration, MemcachedReturnType *returnType = nullptr);
920 
934  static bool touchByKey(const QString &groupKey, const QString &key, time_t expiration, MemcachedReturnType *returnType = nullptr);
935 
939  static QString errorString(Context *c, MemcachedReturnType rt);
940 
944  static QVersionNumber libMemcachedVersion();
945 
946 protected:
947  const QScopedPointer<MemcachedPrivate> d_ptr;
948 
952  virtual bool setup(Application *app) override;
953 };
954 
955 template< typename T>
956 bool Memcached::set(const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType)
957 {
958  QByteArray data;
959 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
960  QDataStream out(&data, QIODevice::WriteOnly);
961 #else
962  QDataStream out(&data, QIODeviceBase::WriteOnly);
963 #endif
964  out << value;
965  return Memcached::set(key, data, expiration, returnType);
966 }
967 
968 template< typename T>
969 bool Memcached::setByKey(const QString &groupKey, const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType)
970 {
971  QByteArray data;
972 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
973  QDataStream out(&data, QIODevice::WriteOnly);
974 #else
975  QDataStream out(&data, QIODeviceBase::WriteOnly);
976 #endif
977  out << value;
978  return Memcached::setByKey(groupKey, key, data, expiration, returnType);
979 }
980 
981 template< typename T>
982 bool Memcached::add(const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType)
983 {
984  QByteArray data;
985 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
986  QDataStream out(&data, QIODevice::WriteOnly);
987 #else
988  QDataStream out(&data, QIODeviceBase::WriteOnly);
989 #endif
990  out << value;
991  return Memcached::add(key, data, expiration, returnType);
992 }
993 
994 template< typename T>
995 bool Memcached::addByKey(const QString &groupKey, const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType)
996 {
997  QByteArray data;
998 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
999  QDataStream out(&data, QIODevice::WriteOnly);
1000 #else
1001  QDataStream out(&data, QIODeviceBase::WriteOnly);
1002 #endif
1003  out << value;
1004  return Memcached::addByKey(groupKey, key, data, expiration, returnType);
1005 }
1006 
1007 template< typename T>
1008 bool Memcached::replace(const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType)
1009 {
1010  QByteArray data;
1011 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
1012  QDataStream out(&data, QIODevice::WriteOnly);
1013 #else
1014  QDataStream out(&data, QIODeviceBase::WriteOnly);
1015 #endif
1016  out << value;
1017  return Memcached::replace(key, data, expiration, returnType);
1018 }
1019 
1020 template< typename T>
1021 bool Memcached::replaceByKey(const QString &groupKey, const QString &key, const T &value, time_t expiration, MemcachedReturnType *returnType)
1022 {
1023  QByteArray data;
1024 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
1025  QDataStream out(&data, QIODevice::WriteOnly);
1026 #else
1027  QDataStream out(&data, QIODeviceBase::WriteOnly);
1028 #endif
1029  out << value;
1030  return Memcached::replaceByKey(groupKey, key, data, expiration, returnType);
1031 }
1032 
1033 template< typename T>
1034 T Memcached::get(const QString &key, uint64_t *cas, MemcachedReturnType *returnType)
1035 {
1036  T retVal;
1037  QByteArray ba = Memcached::get(key, cas, returnType);
1038  if (!ba.isEmpty()) {
1039 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
1040  QDataStream in(&ba, QIODevice::ReadOnly);
1041 #else
1042  QDataStream in(&ba, QIODeviceBase::ReadOnly);
1043 #endif
1044  in >> retVal;
1045  }
1046  return retVal;
1047 }
1048 
1049 template< typename T>
1050 T Memcached::getByKey(const QString &groupKey, const QString &key, uint64_t *cas, MemcachedReturnType *returnType)
1051 {
1052  T retVal;
1053  QByteArray ba = Memcached::getByKey(groupKey, key, cas, returnType);
1054  if (!ba.isEmpty()) {
1055 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
1056  QDataStream in(&ba, QIODevice::ReadOnly);
1057 #else
1058  QDataStream in(&ba, QIODeviceBase::ReadOnly);
1059 #endif
1060  in >> retVal;
1061  }
1062  return retVal;
1063 }
1064 
1065 template< typename T>
1066 bool Memcached::cas(const QString &key, const T &value, time_t expiration, uint64_t cas, MemcachedReturnType *returnType)
1067 {
1068  QByteArray data;
1069 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
1070  QDataStream out(&data, QIODevice::WriteOnly);
1071 #else
1072  QDataStream out(&data, QIODeviceBase::WriteOnly);
1073 #endif
1074  out << value;
1075  return Memcached::cas(key, data, expiration, cas, returnType);
1076 }
1077 
1078 template< typename T>
1079 bool Memcached::casByKey(const QString &groupKey, const QString &key, const T &value, time_t expiration, uint64_t cas, MemcachedReturnType *returnType)
1080 {
1081  QByteArray data;
1082 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
1083  QDataStream out(&data, QIODevice::WriteOnly);
1084 #else
1085  QDataStream out(&data, QIODeviceBase::WriteOnly);
1086 #endif
1087  out << value;
1088  return Memcached::casByKey(groupKey, key, data, expiration, cas, returnType);
1089 }
1090 
1091 template< typename T>
1092 QHash<QString, T> Memcached::mget(const QStringList &keys, QHash<QString, uint64_t> *casValues, MemcachedReturnType *returnType)
1093 {
1094  QHash<QString, T> hash;
1095  QHash<QString,QByteArray> _data = Memcached::mget(keys, casValues, returnType);
1096  if (!_data.empty()) {
1097  auto i = _data.constBegin();
1098  while (i != _data.constEnd()) {
1099  T retVal;
1100  QDataStream in(i.value());
1101  in >> retVal;
1102  hash.insert(i.key(), retVal);
1103  ++i;
1104  }
1105  }
1106  return hash;
1107 }
1108 
1109 template< typename T>
1110 QHash<QString, T> Memcached::mgetByKey(const QString &groupKey, const QStringList &keys, QHash<QString,uint64_t> *casValues, MemcachedReturnType *returnType)
1111 {
1112  QHash<QString, T> hash;
1113  QHash<QString,QByteArray> _data = Memcached::mgetByKey(groupKey, keys, casValues, returnType);
1114  if (!_data.empty()) {
1115  auto i = _data.constBegin();
1116  while (i != _data.constEnd()) {
1117  T retVal;
1118  QDataStream in(i.value());
1119  in >> retVal;
1120  hash.insert(i.key(), retVal);
1121  ++i;
1122  }
1123  }
1124  return hash;
1125 }
1126 
1127 }
1128 
1129 #endif // CUTELYSTMEMCACHED_H
The Cutelyst Application.
Definition: application.h:43
The Cutelyst Context.
Definition: context.h:39
Cutelyst Memcached plugin.
Definition: memcached.h:130
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:572
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