25 #ifndef __AMPS_MESSAGE_HPP__
26 #define __AMPS_MESSAGE_HPP__
27 #include "amps/util.hpp"
28 #include "amps/constants.hpp"
29 #include "amps/amps_generated.h"
35 #define AMPS_UNSET_SEQUENCE (amps_uint64_t)-1
38 #if defined(__GXX_EXPERIMENTAL_CXX0X__) || (_MSC_VER >= 1600)
39 #define AMPS_USE_FUNCTIONAL 1
42 #if (_MSC_VER >= 1600) || (__GNUC__ > 4) || ( (__GNUC__ == 4) && (__GNUC_MINOR__) >=5 )
43 #define AMPS_USE_LAMBDAS 1
46 #if (_MSC_VER >= 1600) || (__GNUC__ > 4) || ( (__GNUC__ == 4) && (__GNUC_MINOR__) >=8 )
47 #define AMPS_USE_EMPLACE 1
50 #ifdef AMPS_USE_FUNCTIONAL
60 #define AMPS_OPTIONS_NONE ""
61 #define AMPS_OPTIONS_LIVE "live,"
62 #define AMPS_OPTIONS_OOF "oof,"
63 #define AMPS_OPTIONS_REPLACE "replace,"
64 #define AMPS_OPTIONS_NOEMPTIES "no_empties,"
65 #define AMPS_OPTIONS_SENDKEYS "send_keys,"
66 #define AMPS_OPTIONS_TIMESTAMP "timestamp,"
67 #define AMPS_OPTIONS_NOSOWKEY "no_sowkey,"
68 #define AMPS_OPTIONS_CANCEL "cancel,"
69 #define AMPS_OPTIONS_RESUME "resume,"
70 #define AMPS_OPTIONS_PAUSE "pause,"
71 #define AMPS_OPTIONS_FULLY_DURABLE "fully_durable,"
72 #define AMPS_OPTIONS_EXPIRE "expire,"
73 #define AMPS_OPTIONS_TOPN(x) "top_n=##x,"
74 #define AMPS_OPTIONS_MAXBACKLOG(x) "max_backlog=##x,"
75 #define AMPS_OPTIONS_RATE(x) "rate=##x,"
79 typedef void* amps_subscription_handle;
93 mutable bool _isIgnoreAutoAck;
94 size_t _bookmarkSeqNo;
95 amps_subscription_handle _subscription;
96 ClientImpl* _clientImpl;
110 bool ignoreAutoAck_ =
false,
size_t bookmarkSeqNo_ = 0,
111 amps_subscription_handle subscription_ = NULL,
112 ClientImpl* clientImpl_ = NULL)
113 : _message(message_), _owner(owner_), _isIgnoreAutoAck(ignoreAutoAck_)
114 , _bookmarkSeqNo(bookmarkSeqNo_)
115 , _subscription(subscription_), _clientImpl(clientImpl_)
123 : _message(NULL), _owner(true), _isIgnoreAutoAck(false), _bookmarkSeqNo(0), _subscription(NULL), _clientImpl(NULL)
131 if (_owner && _message)
140 return new MessageImpl(copy,
true, _isIgnoreAutoAck, _bookmarkSeqNo,
141 _subscription, _clientImpl);
146 if (_owner && _message)
152 _bookmarkSeqNo = rhs_._bookmarkSeqNo;
153 _subscription = rhs_._subscription;
154 _isIgnoreAutoAck = rhs_._isIgnoreAutoAck;
155 _clientImpl = rhs_._clientImpl;
158 void setClientImpl(ClientImpl* clientImpl_)
160 _clientImpl = clientImpl_;
163 ClientImpl* clientImpl(
void)
const
180 _subscription = NULL;
181 _isIgnoreAutoAck =
false;
193 if (_message == message_)
197 if (_owner && _message)
204 _subscription = NULL;
205 _isIgnoreAutoAck =
false;
214 static unsigned long newId()
216 #if __cplusplus >= 201100L || _MSC_VER >= 1900
217 static std::atomic<uint_fast64_t> _id(0);
218 return (
unsigned long)++_id;
220 static AMPS_ATOMIC_TYPE _id = 0;
221 return (
unsigned long)(AMPS_FETCH_ADD(&_id, 1));
225 void setBookmarkSeqNo(
size_t val_)
227 _bookmarkSeqNo = val_;
230 size_t getBookmarkSeqNo(
void)
const
232 return _bookmarkSeqNo;
235 void setSubscriptionHandle(amps_subscription_handle subscription_)
237 _subscription = subscription_;
240 amps_subscription_handle getSubscriptionHandle(
void)
const
242 return _subscription;
245 void setIgnoreAutoAck()
const
247 _isIgnoreAutoAck =
true;
250 bool getIgnoreAutoAck()
const
252 return _isIgnoreAutoAck;
262 #ifdef DOXYGEN_PREPROCESSOR
264 #define DOX_COMMENTHEAD(s) / ## ** ## s ## * ## /
265 #define DOX_GROUPNAME(s) DOX_COMMENTHEAD(@name s Functions)
266 #define DOX_OPENGROUP(s) DOX_COMMENTHEAD(@{) \
268 #define DOX_CLOSEGROUP() DOX_COMMENTHEAD(@})
269 #define DOX_MAKEGETCOMMENT(x) DOX_COMMENTHEAD( Retrieves the value of the x header of the Message as a Field which references the underlying buffer managed by this Message. Notice that not all headers are present on all messages returned by AMPS. See the AMPS %Command Reference for details on which fields will be present in response to a specific command. )
270 #define DOX_MAKEGETRAWCOMMENT(x) DOX_COMMENTHEAD( Modifies the passed in arguments to reference the value of the x header of self in the underlying buffer managed by this Message. Notice that not all headers are present on all messages returned by AMPS. See the AMPS %Command Reference for details on which fields will be present in response to a specific command. )
271 #define DOX_MAKESETCOMMENT(x) DOX_COMMENTHEAD( Sets the value of the x header for this Message. Not all headers are processed by AMPS for all commands. See the AMPS %Command Reference for which headers are used by AMPS for a specific command. )
272 #define DOX_MAKEASSIGNCOMMENT(x) DOX_COMMENTHEAD( Assigns the value of the x header for this Message without copying. Not all headers are processed by AMPS for all commands. See the AMPS %Command Reference for which headers are used by AMPS for a specific command. )
273 #define DOX_MAKEASSIGNOWNCOMMENT(x) DOX_COMMENTHEAD( Assigns the value of the x header for this Message without copying and makes this Message responsible for deleting the value. Not all headers are processed by AMPS for all commands. See the AMPS %Command Reference for which headers are used by AMPS for a specific command. )
274 #define DOX_MAKENEWCOMMENT(x) DOX_COMMENTHEAD(Creates and sets a new sequential value for the x header for this Message. This function is most useful for headers such as %CommandId and %SubId.)
278 #define DOX_COMMENTHEAD(s)
279 #define DOX_GROUPNAME(s)
280 #define DOX_OPENGROUP(x)
281 #define DOX_CLOSEGROUP()
282 #define DOX_MAKEGETCOMMENT(x)
283 #define DOX_MAKEGETRAWCOMMENT(x)
284 #define DOX_MAKESETCOMMENT(x)
285 #define DOX_MAKEASSIGNCOMMENT(x)
286 #define DOX_MAKEASSIGNOWNCOMMENT(x)
287 #define DOX_MAKENEWCOMMENT(x)
295 #define AMPS_FIELD(x) \
297 DOX_MAKEGETCOMMENT(x) \
298 Field get##x() const {\
302 amps_message_get_field_value(_body.get().getMessage(),\
303 AMPS_##x, &ptr, &sz);\
304 returnValue.assign(ptr, sz);\
307 DOX_MAKEGETRAWCOMMENT(x) \
308 void getRaw##x(const char** dataptr, size_t* sizeptr) const {\
309 amps_message_get_field_value(_body.get().getMessage(),\
310 AMPS_##x, dataptr, sizeptr);\
313 DOX_MAKESETCOMMENT(x) \
314 Message& set##x(const std::string& v) {\
315 amps_message_set_field_value(_body.get().getMessage(),\
316 AMPS_##x, v.c_str(), v.length());\
319 DOX_MAKESETCOMMENT(x) \
320 Message& set##x(amps_uint64_t v) {\
322 AMPS_snprintf_amps_uint64_t(buf,22,v);\
323 amps_message_set_field_value_nts(_body.get().getMessage(),\
327 DOX_MAKEASSIGNCOMMENT(x) \
328 Message& assign##x(const std::string& v) {\
329 amps_message_assign_field_value(_body.get().getMessage(),\
330 AMPS_##x, v.c_str(), v.length());\
333 DOX_MAKEASSIGNCOMMENT(x) \
334 Message& assign##x(const char* data, size_t len) {\
335 amps_message_assign_field_value(_body.get().getMessage(),\
336 AMPS_##x, data, len);\
339 DOX_MAKEASSIGNOWNCOMMENT(x) \
340 Message& assignOwnership##x(const Field& f) {\
341 amps_message_assign_field_value_ownership(_body.get().getMessage(),\
342 AMPS_##x, f.data(), f.len());\
345 DOX_MAKESETCOMMENT(x) \
346 Message& set##x(const char* str) {\
347 amps_message_set_field_value_nts(_body.get().getMessage(),\
351 DOX_MAKESETCOMMENT(x) \
352 Message& set##x(const char* str,size_t len) {\
353 amps_message_set_field_value(_body.get().getMessage(),\
357 DOX_MAKENEWCOMMENT(x) \
359 char buf[Message::IdentifierLength+1];\
360 buf[Message::IdentifierLength] = 0;\
361 AMPS_snprintf(buf, Message::IdentifierLength+1, "auto%lu" , (unsigned long)(_body.get().newId()));\
362 amps_message_set_field_value_nts(_body.get().getMessage(),\
368 #define AMPS_FIELD_ALIAS(x,y) \
370 DOX_MAKEGETCOMMENT(y) \
371 Field get##y() const {\
375 amps_message_get_field_value(_body.get().getMessage(),\
376 AMPS_##y, &ptr, &sz);\
377 returnValue.assign(ptr, sz);\
380 DOX_MAKEGETRAWCOMMENT(y) \
381 void getRaw##y(const char** dataptr, size_t* sizeptr) const {\
382 amps_message_get_field_value(_body.get().getMessage(),\
383 AMPS_##y, dataptr, sizeptr);\
386 DOX_MAKESETCOMMENT(y) \
387 Message& set##y(const std::string& v) {\
388 amps_message_set_field_value(_body.get().getMessage(),\
389 AMPS_##y, v.c_str(), v.length());\
392 DOX_MAKESETCOMMENT(y) \
393 Message& set##y(amps_uint64_t v) {\
395 AMPS_snprintf_amps_uint64_t(buf,22,v);\
396 amps_message_set_field_value_nts(_body.get().getMessage(),\
400 DOX_MAKEASSIGNCOMMENT(y) \
401 Message& assign##y(const std::string& v) {\
402 amps_message_assign_field_value(_body.get().getMessage(),\
403 AMPS_##y, v.c_str(), v.length());\
406 DOX_MAKEASSIGNCOMMENT(y) \
407 Message& assign##y(const char* data, size_t len) {\
408 amps_message_assign_field_value(_body.get().getMessage(),\
409 AMPS_##y, data, len);\
412 DOX_MAKESETCOMMENT(y) \
413 Message& set##y(const char* str) {\
414 amps_message_set_field_value_nts(_body.get().getMessage(),\
418 DOX_MAKESETCOMMENT(y) \
419 Message& set##y(const char* str,size_t len) {\
420 amps_message_set_field_value(_body.get().getMessage(),\
424 DOX_MAKENEWCOMMENT(y) \
426 char buf[Message::IdentifierLength+1];\
427 buf[Message::IdentifierLength] = 0;\
428 AMPS_snprintf(buf, Message::IdentifierLength+1, "auto%lux" , (unsigned long)(_body.get().newId()));\
429 amps_message_set_field_value_nts(_body.get().getMessage(),\
433 DOX_MAKEGETCOMMENT(y) \
434 Field get##x() const {\
438 amps_message_get_field_value(_body.get().getMessage(),\
439 AMPS_##y, &ptr, &sz);\
440 returnValue.assign(ptr, sz);\
443 DOX_MAKEGETRAWCOMMENT(y) \
444 void getRaw##x(const char** dataptr, size_t* sizeptr) const {\
445 amps_message_get_field_value(_body.get().getMessage(),\
446 AMPS_##y, dataptr, sizeptr);\
449 DOX_MAKESETCOMMENT(y) \
450 Message& set##x(const std::string& v) {\
451 amps_message_set_field_value(_body.get().getMessage(),\
452 AMPS_##y, v.c_str(), v.length());\
455 DOX_MAKESETCOMMENT(y) \
456 Message& set##x(amps_uint64_t v) {\
458 AMPS_snprintf_amps_uint64_t(buf,22,v);\
459 amps_message_set_field_value_nts(_body.get().getMessage(),\
463 DOX_MAKEASSIGNCOMMENT(y) \
464 Message& assign##x(const std::string& v) {\
465 amps_message_assign_field_value(_body.get().getMessage(),\
466 AMPS_##y, v.c_str(), v.length());\
469 DOX_MAKEASSIGNCOMMENT(y) \
470 Message& assign##x(const char* data, size_t len) {\
471 amps_message_assign_field_value(_body.get().getMessage(),\
472 AMPS_##y, data, len);\
475 DOX_MAKESETCOMMENT(y) \
476 Message& set##x(const char* str) {\
477 amps_message_set_field_value_nts(_body.get().getMessage(),\
481 DOX_MAKESETCOMMENT(y) \
482 Message& set##x(const char* str,size_t len) {\
483 amps_message_set_field_value(_body.get().getMessage(),\
487 DOX_MAKENEWCOMMENT(y) \
489 char buf[Message::IdentifierLength+1];\
490 buf[Message::IdentifierLength] = 0;\
491 AMPS_snprintf(buf, Message::IdentifierLength+1, "auto%lux" , (unsigned long)(_body.get().newId()));\
492 amps_message_set_field_value_nts(_body.get().getMessage(),\
541 RefHandle<MessageImpl> _body;
589 return Message(_body.get().copy());
596 _body.get().copy(rhs_._body.get());
612 static const char* None(
void)
614 return AMPS_OPTIONS_NONE;
616 static const char* Live(
void)
618 return AMPS_OPTIONS_LIVE;
620 static const char* OOF(
void)
622 return AMPS_OPTIONS_OOF;
624 static const char* Replace(
void)
626 return AMPS_OPTIONS_REPLACE;
628 static const char* NoEmpties(
void)
630 return AMPS_OPTIONS_NOEMPTIES;
632 static const char* SendKeys(
void)
634 return AMPS_OPTIONS_SENDKEYS;
636 static const char* Timestamp(
void)
638 return AMPS_OPTIONS_TIMESTAMP;
640 static const char* NoSowKey(
void)
642 return AMPS_OPTIONS_NOSOWKEY;
644 static const char* Cancel(
void)
646 return AMPS_OPTIONS_CANCEL;
648 static const char* Resume(
void)
650 return AMPS_OPTIONS_RESUME;
652 static const char* Pause(
void)
654 return AMPS_OPTIONS_PAUSE;
656 static const char* FullyDurable(
void)
658 return AMPS_OPTIONS_FULLY_DURABLE;
660 static const char* Expire(
void)
662 return AMPS_OPTIONS_EXPIRE;
664 static std::string Conflation(
const char* conflation_)
667 AMPS_snprintf(buf,
sizeof(buf),
"conflation=%s,", conflation_);
670 static std::string ConflationKey(
const char* conflationKey_)
672 std::string option(
"conflation_key=");
673 option.append(conflationKey_).append(
",");
676 static std::string TopN(
int topN_)
679 AMPS_snprintf(buf,
sizeof(buf),
"top_n=%d,", topN_);
682 static std::string MaxBacklog(
int maxBacklog_)
685 AMPS_snprintf(buf,
sizeof(buf),
"max_backlog=%d,", maxBacklog_);
688 static std::string Rate(
const char* rate_)
691 AMPS_snprintf(buf,
sizeof(buf),
"rate=%s,", rate_);
694 static std::string RateMaxGap(
const char* rateMaxGap_)
697 AMPS_snprintf(buf,
sizeof(buf),
"rate_max_gap=%s,", rateMaxGap_);
700 static std::string SkipN(
int skipN_)
703 AMPS_snprintf(buf,
sizeof(buf),
"skip_n=%d,", skipN_);
707 static std::string Projection(
const std::string& projection_)
709 return "projection=[" + projection_ +
"],";
712 template<
class Iterator>
713 static std::string Projection(Iterator begin_, Iterator end_)
715 std::string projection =
"projection=[";
716 for (Iterator i = begin_; i != end_; ++i)
721 projection.insert(projection.length() - 1,
"]");
725 static std::string Grouping(
const std::string& grouping_)
727 return "grouping=[" + grouping_ +
"],";
730 template<
class Iterator>
731 static std::string Grouping(Iterator begin_, Iterator end_)
733 std::string grouping =
"grouping=[";
734 for (Iterator i = begin_; i != end_; ++i)
739 grouping.insert(grouping.length() - 1,
"]");
743 static std::string Select(
const std::string& select_)
745 return "select=[" + select_ +
"],";
748 template<
class Iterator>
749 static std::string Select(Iterator begin_, Iterator end_)
751 std::string select =
"select=[";
752 for (Iterator i = begin_; i != end_; ++i)
757 select.insert(select.length() - 1,
"]");
761 static std::string AckConflationInterval(
const std::string& interval_)
763 return "ack_conflation=" + interval_ +
",";
766 static std::string AckConflationInterval(
const char* interval_)
768 static const std::string start(
"ack_conflation=");
769 return start + interval_ +
",";
772 static std::string BookmarkNotFound(
const char* action_)
774 static const std::string start(
"bookmark_not_found=");
775 return start + action_ +
",";
778 static std::string BookmarkNotFoundNow()
780 return BookmarkNotFound(
"now");
783 static std::string BookmarkNotFoundEpoch()
785 return BookmarkNotFound(
"epoch");
788 static std::string BookmarkNotFoundFail()
790 return BookmarkNotFound(
"fail");
796 : _optionStr(options_)
802 int getMaxBacklog(
void)
const
806 std::string getConflation(
void)
const
810 std::string getConflationKey(
void)
const
812 return _conflationKey;
814 int getTopN(
void)
const
818 std::string getRate(
void)
const
822 std::string getRateMaxGap(
void)
const
846 _optionStr += AMPS_OPTIONS_LIVE;
855 _optionStr += AMPS_OPTIONS_OOF;
864 _optionStr += AMPS_OPTIONS_REPLACE;
872 _optionStr += AMPS_OPTIONS_NOEMPTIES;
880 _optionStr += AMPS_OPTIONS_SENDKEYS;
889 _optionStr += AMPS_OPTIONS_TIMESTAMP;
897 _optionStr += AMPS_OPTIONS_NOSOWKEY;
905 _optionStr += AMPS_OPTIONS_CANCEL;
916 _optionStr += AMPS_OPTIONS_RESUME;
931 _optionStr += AMPS_OPTIONS_PAUSE;
942 _optionStr += AMPS_OPTIONS_FULLY_DURABLE;
958 AMPS_snprintf(buf,
sizeof(buf),
"max_backlog=%d,", maxBacklog_);
960 _maxBacklog = maxBacklog_;
971 AMPS_snprintf(buf,
sizeof(buf),
"conflation=%s,", conflation_);
973 _conflation = conflation_;
988 AMPS_snprintf(buf,
sizeof(buf),
"conflation_key=%s,", conflationKey_);
990 _conflationKey = conflationKey_;
1001 AMPS_snprintf(buf,
sizeof(buf),
"top_n=%d,", topN_);
1015 AMPS_snprintf(buf,
sizeof(buf),
"rate=%s,", rate_);
1037 AMPS_snprintf(buf,
sizeof(buf),
"rate_max_gap=%s,", rateMaxGap_);
1039 _rateMaxGap = rateMaxGap_;
1050 AMPS_snprintf(buf,
sizeof(buf),
"skip_n=%d,", skipN_);
1061 _projection =
"projection=[" + projection_ +
"],";
1062 _optionStr += _projection;
1071 template<
class Iterator>
1074 _projection =
"projection=[";
1075 for (Iterator i = begin_; i != end_; ++i)
1080 _projection.insert(_projection.length() - 1,
"]");
1081 _optionStr += _projection;
1090 _grouping =
"grouping=[" + grouping_ +
"],";
1091 _optionStr += _grouping;
1100 template<
class Iterator>
1103 _grouping =
"grouping=[";
1104 for (Iterator i = begin_; i != end_; ++i)
1109 _grouping.insert(_grouping.length() - 1,
"]");
1110 _optionStr += _grouping;
1119 _optionStr += BookmarkNotFound(action_);
1127 _optionStr += BookmarkNotFoundNow();
1135 _optionStr += BookmarkNotFoundEpoch();
1143 _optionStr += BookmarkNotFoundFail();
1149 operator const std::string()
1151 return _optionStr.substr(0, _optionStr.length() - 1);
1158 return (_optionStr.empty() ? 0 : _optionStr.length() - 1);
1167 return (_optionStr.empty() ? 0 : _optionStr.data());
1171 std::string _optionStr;
1173 std::string _conflation;
1174 std::string _conflationKey;
1177 std::string _rateMaxGap;
1179 std::string _projection;
1180 std::string _grouping;
1187 typedef enum :
unsigned
1189 None = 0, Received = 1, Parsed = 2, Processed = 4, Persisted = 8, Completed = 16, Stats = 32
1197 switch (end - begin)
1200 return AckType::Stats;
1202 return AckType::Parsed;
1204 return AckType::Received;
1208 case 'e':
return AckType::Persisted;
1209 case 'r':
return AckType::Processed;
1210 case 'o':
return AckType::Completed;
1217 return AckType::None;
1224 unsigned result = AckType::None;
1225 const char* data = NULL;
size_t len = 0;
1227 const char* mark = data;
1228 for (
const char* end = data + len; data != end; ++data)
1247 if (ackType_ < AckTypeConstants<0>::Entries)
1250 AckTypeConstants<0>::Values[ackType_], AckTypeConstants<0>::Lengths[ackType_]);
1255 AMPS_FIELD(BatchSize)
1256 AMPS_FIELD(Bookmark)
1275 SOWAndSubscribe = 256,
1276 DeltaSubscribe = 512,
1277 SOWAndDeltaSubscribe = 1024,
1285 NoDataCommands = Publish | Unsubscribe | Heartbeat | SOWDelete | DeltaPublish
1286 | Logon | StartTimer | StopTimer | Flush
1292 const char* data = NULL;
size_t len = 0;
1296 case 1:
return Command::Publish;
1300 case 's':
return Command::SOW;
1301 case 'o':
return Command::OOF;
1302 case 'a':
return Command::Ack;
1308 case 'l':
return Command::Logon;
1309 case 'f':
return Command::Flush;
1313 return Command::Publish;
1318 case 's':
return Command::Subscribe;
1319 case 'h':
return Command::Heartbeat;
1320 case 'g':
return Command::GroupEnd;
1326 case 'o':
return Command::SOWDelete;
1327 case 't':
return Command::StopTimer;
1333 case 'g':
return Command::GroupBegin;
1334 case 'u':
return Command::Unsubscribe;
1338 return Command::DeltaPublish;
1340 return Command::DeltaSubscribe;
1342 return Command::SOWAndSubscribe;
1344 return Command::SOWAndDeltaSubscribe;
1346 return Command::Unknown;
1353 unsigned command = command_;
1360 CommandConstants<0>::Values[bits], CommandConstants<0>::Lengths[bits]);
1364 AMPS_FIELD(CommandId)
1365 AMPS_FIELD(ClientName)
1366 AMPS_FIELD(CorrelationId)
1367 AMPS_FIELD(Expiration)
1369 AMPS_FIELD(GroupSequenceNumber)
1370 AMPS_FIELD(Heartbeat)
1371 AMPS_FIELD(LeasePeriod)
1373 AMPS_FIELD(MessageLength)
1374 AMPS_FIELD(MessageType)
1384 AMPS_Options, &ptr, &sz);
1385 if (sz && ptr[sz - 1] ==
',')
1389 returnValue.assign(ptr, sz);
1393 DOX_MAKEGETRAWCOMMENT(Options)
1397 AMPS_Options, dataptr, sizeptr);
1398 if (*sizeptr && *dataptr && (*dataptr)[*sizeptr - 1] ==
',')
1405 DOX_MAKESETCOMMENT(Options)
1408 size_t sz = v.length();
1409 if (sz && v[sz - 1] ==
',')
1414 AMPS_Options, v.c_str(), sz);
1418 DOX_MAKEASSIGNCOMMENT(Options)
1421 size_t sz = v.length();
1422 if (sz && v[sz - 1] ==
',')
1427 AMPS_Options, v.c_str(), sz);
1431 DOX_MAKEASSIGNCOMMENT(Options)
1434 if (len && data[len - 1] ==
',')
1439 AMPS_Options, data, len);
1443 DOX_MAKESETCOMMENT(Options)
1448 size_t sz = strlen(str);
1449 if (sz && str[sz - 1] ==
',')
1454 AMPS_Options, str, sz);
1459 AMPS_Options, str, 0);
1464 DOX_MAKESETCOMMENT(Options)
1467 if (len && str[len - 1] ==
',')
1472 AMPS_Options, str, len);
1478 AMPS_FIELD(Password)
1479 AMPS_FIELD_ALIAS(QueryId, QueryID)
1481 AMPS_FIELD(RecordsInserted)
1482 AMPS_FIELD(RecordsReturned)
1483 AMPS_FIELD(RecordsUpdated)
1484 AMPS_FIELD(Sequence)
1485 AMPS_FIELD(SowDelete)
1489 AMPS_FIELD_ALIAS(SubId, SubscriptionId)
1490 AMPS_FIELD(SubscriptionIds)
1491 AMPS_FIELD(TimeoutInterval)
1492 AMPS_FIELD(Timestamp)
1512 AMPS_FIELD(TopicMatches)
1513 AMPS_FIELD(TopNRecordsReturned)
1528 returnValue.assign(ptr, sz);
1532 void getRawData(
const char** data,
size_t* sz)
const
1543 Message& assignData(
const std::string& v_)
1557 Message& assignData(
const char* data_,
size_t length_)
1570 Message& assignData(
const char* data_)
1577 return _body.get().getMessage();
1579 void replace(
amps_handle message,
bool owner =
false)
1581 _body.get().replace(message, owner);
1585 _body.get().disown();
1591 bool isValid(
void)
const
1593 return _body.isValid();
1597 _body.get().reset();
1601 void setBookmarkSeqNo(
size_t val)
1603 _body.get().setBookmarkSeqNo(val);
1606 size_t getBookmarkSeqNo()
const
1608 return _body.get().getBookmarkSeqNo();
1613 _body.get().setSubscriptionHandle(val);
1618 return _body.get().getSubscriptionHandle();
1621 void ack(
const char* options_ = NULL)
const;
1623 void setClientImpl(ClientImpl* pClientImpl)
1625 _body.get().setClientImpl(pClientImpl);
1628 void setIgnoreAutoAck()
const
1630 _body.get().setIgnoreAutoAck();
1633 bool getIgnoreAutoAck()
const
1635 return _body.get().getIgnoreAutoAck();
1640 void throwFor(
const T& ,
const std::string& ackReason_)
const
1642 switch (ackReason_[0])
1645 throw AuthenticationException(
"Logon failed for user \"" +
1649 switch (ackReason_.length())
1652 throw BadFilterException(
"bad filter '" +
1659 throw BadSowKeyException(
"bad sow key '" +
1665 throw BadSowKeyException(
"bad sow key '" +
1671 throw BadRegexTopicException(
"bad regex topic '" +
1680 if (ackReason_.length() == 23)
1682 throw DuplicateLogonException(
"Client '" +
1686 "' duplicate logon attempt");
1690 if (ackReason_.length() >= 9)
1692 switch (ackReason_[8])
1695 throw InvalidBookmarkException(
"invalid bookmark '" +
1700 throw CommandException(std::string(
"invalid message type '") +
1705 if (ackReason_[9] ==
'p')
1707 throw InvalidOptionsException(
"invalid options '" +
1711 else if (ackReason_[9] ==
'r')
1713 throw InvalidOrderByException(
"invalid order by '" +
1719 throw InvalidSubIdException(
"invalid subid '" +
1724 if (ackReason_.length() == 13)
1726 throw InvalidTopicException(
"invalid topic '" +
1730 else if (ackReason_.length() == 23)
1732 throw InvalidTopicException(
"invalid topic or filter. Topic '" +
1745 if (ackReason_.length() == 14)
1747 throw LogonRequiredException(
"logon required before command");
1751 switch (ackReason_[4])
1754 throw NameInUseException(
"name in use '" +
1759 throw NotEntitledException(
"User \"" +
1761 "\" not entitled to topic \"" +
1766 throw MissingFieldsException(
"command sent with no filter or bookmark.");
1769 throw MissingFieldsException(
"command sent with no client name.");
1772 throw MissingFieldsException(
"command sent with no topic or filter.");
1775 throw CommandException(
"operation on topic '" +
1777 "' with options '" +
1779 "' not supported.");
1786 switch (ackReason_.length())
1789 throw MissingFieldsException(
"orderby required");
1792 throw CommandException(
"orderby too large '" +
1799 throw CommandException(
"projection clause too large in options '" +
1804 switch (ackReason_[2])
1807 throw BadRegexTopicException(
"'regex topic not supported '" +
1816 switch (ackReason_[5])
1819 throw SubidInUseException(
"subid in use '" +
1824 throw CommandException(
"sow_delete command only supports one of: filter '" +
1835 throw PublishException(
"sow store failed.");
1842 switch (ackReason_[2])
1845 throw PublishException(
"tx store failure.");
1848 throw CommandException(
"txn replay failed for '" +
1857 throw CommandException(
"Error from server while processing this command: '" +
1863 operator+(
const std::string& lhs,
const Message::Field& rhs)
1865 return lhs + std::string(rhs);
1868 inline std::basic_ostream<char>&
1869 operator<<(std::basic_ostream<char>& os,
const Message::Field& rhs)
1871 os.write(rhs.data(), (std::streamsize)rhs.len());
1875 AMPS::Field::operator<(
const AMPS::Field& rhs)
const
1879 return rhs.
data() != NULL;
1885 return std::lexicographical_compare(data(), data() + len(), rhs.
data(), rhs.
data() + rhs.
len());
Defines the AMPS::Field class, which represents the value of a field in a message.
AMPSDLL amps_handle amps_message_create(amps_handle client)
Functions for creation and manipulation of AMPS messages.
AMPSDLL void amps_message_set_data(amps_handle message, const amps_char *value, size_t length)
Sets the data component of an AMPS message.
AMPSDLL void amps_message_get_field_value(amps_handle message, FieldId field, const amps_char **value_ptr, size_t *length_ptr)
Retrieves the value of a header field in an AMPS message.
AMPSDLL void amps_message_assign_field_value(amps_handle message, FieldId field, const amps_char *value, size_t length)
Assigns the value of a header field in an AMPS message, without copying the value.
AMPSDLL void amps_message_set_data_nts(amps_handle message, const amps_char *value)
Sets the data component of an AMPS message.
AMPSDLL void amps_message_reset(amps_handle message)
Clears all fields and data in a message.
AMPSDLL void amps_message_destroy(amps_handle message)
Destroys and frees the memory associated with an AMPS message object.
AMPSDLL void amps_message_assign_data(amps_handle message, const amps_char *value, size_t length)
Assigns the data component of an AMPS message, without copying the value.
AMPSDLL amps_handle amps_message_copy(amps_handle message)
Creates and returns a handle to a new AMPS message object that is a deep copy of the message passed i...
AMPSDLL void amps_message_set_field_value(amps_handle message, FieldId field, const amps_char *value, size_t length)
Sets the value of a header field in an AMPS message.
void * amps_handle
Opaque handle type used to refer to objects in the AMPS api.
Definition: amps.h:211
AMPSDLL void amps_message_get_data(amps_handle message, amps_char **value_ptr, size_t *length_ptr)
Gets the data component of an AMPS message.
Field represents the value of a single field in a Message.
Definition: Field.hpp:87
size_t len() const
Returns the length of the data underlying this field.
Definition: Field.hpp:280
const char * data() const
Returns the (non-null-terminated) data underlying this field.
Definition: Field.hpp:273
Implementation class for a Message.
Definition: Message.hpp:88
void replace(amps_handle message_, bool owner_=false)
Causes self to refer to a new AMPS message, freeing any current message owned by self along the way.
Definition: Message.hpp:190
MessageImpl(amps_handle message_, bool owner_=false, bool ignoreAutoAck_=false, size_t bookmarkSeqNo_=0, amps_subscription_handle subscription_=NULL, ClientImpl *clientImpl_=NULL)
Constructs a messageImpl from an existing AMPS message.
Definition: Message.hpp:109
amps_handle getMessage() const
Returns the underling AMPS message object from the C layer.
Definition: Message.hpp:170
MessageImpl()
Constructs a MessageImpl with a new, empty AMPS message.
Definition: Message.hpp:122
Class for constructing the options string to pass to AMPS in a Message.
Definition: Message.hpp:610
void setBookmarkNotFoundEpoch()
Set the option for the action to take if the requested bookmark to start the subscription is not foun...
Definition: Message.hpp:1133
size_t getLength() const
Return the length of this Options object as a string.
Definition: Message.hpp:1156
void setConflationKey(const char *conflationKey_)
Set the options for the conflation key, the identifiers for the field or fields used by AMPS to deter...
Definition: Message.hpp:985
void setReplace(void)
Set the option to replace a current subscription with this one.
Definition: Message.hpp:862
void setNone(void)
Clear any previously set options and set the options to an empty string (AMPS_OPTIONS_NONE).
Definition: Message.hpp:830
void setResume(void)
Set the option to resume a subscription.
Definition: Message.hpp:914
void setProjection(const std::string &projection_)
Set the option for projecting the results of an aggregated query or subscription.
Definition: Message.hpp:1059
void setGrouping(const std::string &grouping_)
Set the option for grouping the results of an aggregated query or subscription.
Definition: Message.hpp:1088
void setNoEmpties(void)
Set the option to not send empty messages on a delta subscription.
Definition: Message.hpp:870
void setNoSowKey(void)
Set the option to not set the SowKey header on messages.
Definition: Message.hpp:895
void setFullyDurable(void)
Set the option to only provide messages that have been persisted to all replication destinations that...
Definition: Message.hpp:940
void setConflation(const char *conflation_)
Set the options for conflation on a subscription.
Definition: Message.hpp:968
void setBookmarkNotFoundFail()
Set the option for the action to take if the requested bookmark to start the subscription is not foun...
Definition: Message.hpp:1141
void setTopN(int topN_)
Set the top N option, which specifies the maximum number of messages to return for this command.
Definition: Message.hpp:998
void setSendKeys(void)
Set the option to send key fields with a delta subscription.
Definition: Message.hpp:878
void setTimestamp(void)
Set the option to send a timestamp that the message was processed on a subscription or query.
Definition: Message.hpp:887
void setProjection(Iterator begin_, Iterator end_)
Set the option for projecting the results of an aggregated query or subscription.
Definition: Message.hpp:1072
void setMaxBacklog(int maxBacklog_)
Set the option for maximum backlog this subscription is willing to accept.
Definition: Message.hpp:955
void setBookmarkNotFound(const char *action_)
Set the option for the action to take if the requested bookmark to start the subscription is ot found...
Definition: Message.hpp:1117
void setSkipN(int skipN_)
Set the option for skip N, the number of messages in the result set to skip before returning messages...
Definition: Message.hpp:1047
const char * getStr() const
Return this Options object as a non-NULL-terminated string.
Definition: Message.hpp:1165
void setGrouping(Iterator begin_, Iterator end_)
Set the option for grouping the results of an aggregated query or subscription.
Definition: Message.hpp:1101
void setRate(const char *rate_)
Set the option for the maximum rate at which messages are provided to the subscription.
Definition: Message.hpp:1012
void setOOF(void)
Set the option to receive out of focus (OOF) messages on a subscription, where applicable.
Definition: Message.hpp:853
void setPause(void)
Set the option to pause a bookmark subscription.
Definition: Message.hpp:929
Options(std::string options_="")
ctor - default to None
Definition: Message.hpp:795
void setBookmarkNotFoundNow()
Set the option for the action to take if the requested bookmark to start the subscription is not foun...
Definition: Message.hpp:1125
void setCancel(void)
Set the cancel option, used on a sow_delete command to return a message to the queue.
Definition: Message.hpp:903
void setRateMaxGap(const char *rateMaxGap_)
Set the option for the maximum amount of time that a bookmark replay with a specified rate will allow...
Definition: Message.hpp:1034
void setLive(void)
Set the live option for a bookmark subscription, which requests that the subscription receives messag...
Definition: Message.hpp:844
Message encapsulates a single message sent to or received from an AMPS server, and provides methods f...
Definition: Message.hpp:540
Field getUserId() const
Retrieves the value of the UserId header of the Message as a Field which references the underlying bu...
Definition: Message.hpp:1515
void getRawTimestamp(const char **dataptr, size_t *sizeptr) const
Modifies the passed in arguments to reference the value of the Timestamp header of self in the underl...
Definition: Message.hpp:1492
Field getBookmark() const
Retrieves the value of the Bookmark header of the Message as a Field which references the underlying ...
Definition: Message.hpp:1256
void deepCopy(const Message &rhs_)
Makes self a deep copy of rhs_.
Definition: Message.hpp:594
static const unsigned int IdentifierLength
The length of identifiers used for unique identification of commands and subscriptions.
Definition: Message.hpp:550
Field getOrderBy() const
Retrieves the value of the OrderBy header of the Message as a Field which references the underlying b...
Definition: Message.hpp:1477
Message(amps_handle message_, bool owner_=false)
Constructs a new Message to wrap message.
Definition: Message.hpp:573
Field getData() const
Returns the data from this message.
Definition: Message.hpp:1522
Message deepCopy(void) const
Returns a deep copy of self.
Definition: Message.hpp:587
CtorFlag
A flag to indicate not to create a body.
Definition: Message.hpp:559
static const size_t BOOKMARK_NONE
An indicator of no bookmark value.
Definition: Message.hpp:554
void getRawTransmissionTime(const char **dataptr, size_t *sizeptr) const
Definition: Message.hpp:1506
Message & assignOptions(const std::string &v)
Assigns the value of the Options header for this Message without copying.
Definition: Message.hpp:1419
Field getMessageType() const
Retrieves the value of the MessageType header of the Message as a Field which references the underlyi...
Definition: Message.hpp:1374
Message(CtorFlag)
Constructs a new empty, invalid Message.
Definition: Message.hpp:563
Field getSowKeys() const
Retrieves the value of the SowKeys header of the Message as a Field which references the underlying b...
Definition: Message.hpp:1487
Field getTimestamp() const
Retrieves the value of the Timestamp header of the Message as a Field which references the underlying...
Definition: Message.hpp:1492
Field getSubscriptionId() const
Retrieves the value of the SubscriptionId header of the Message as a Field which references the under...
Definition: Message.hpp:1489
Field getFilter() const
Retrieves the value of the Filter header of the Message as a Field which references the underlying bu...
Definition: Message.hpp:1368
void getRawOptions(const char **dataptr, size_t *sizeptr) const
Modifies the passed in arguments to reference the value of the Options header of self in the underlyi...
Definition: Message.hpp:1394
static AckType::Type decodeSingleAckType(const char *begin, const char *end)
Decodes a single ack string.
Definition: Message.hpp:1195
Message & setAckTypeEnum(unsigned ackType_)
Encode self's "ack type" field from a bitmask of values from AckType.
Definition: Message.hpp:1245
unsigned getAckTypeEnum() const
Decode self's "ack type" field and return the corresponding bitmask of values from AckType.
Definition: Message.hpp:1222
Message & setOptions(const std::string &v)
Sets the value of the Options header for this Message.
Definition: Message.hpp:1406
Command::Type getCommandEnum() const
Decode self's "command" field and return one of the values from Command.
Definition: Message.hpp:1290
Field getSowKey() const
Retrieves the value of the SowKey header of the Message as a Field which references the underlying bu...
Definition: Message.hpp:1486
Message()
Construct a new, empty Message.
Definition: Message.hpp:581
Message & setCommandEnum(Command::Type command_)
Set self's "command" field from one of the values in Command.
Definition: Message.hpp:1350
Field getClientName() const
Retrieves the value of the ClientName header of the Message as a Field which references the underlyin...
Definition: Message.hpp:1365
Field getTransmissionTime() const
Definition: Message.hpp:1497
Field getSubId() const
Retrieves the value of the SubscriptionId header of the Message as a Field which references the under...
Definition: Message.hpp:1489
Field getTopic() const
Retrieves the value of the Topic header of the Message as a Field which references the underlying buf...
Definition: Message.hpp:1511
Message & setData(const char *data_, size_t length_)
Sets the data portion of self from a char array.
Definition: Message.hpp:1552
Message & setData(const char *data_)
Sets the data portion of self from a null-terminated string.
Definition: Message.hpp:1565
Field getOptions() const
Retrieves the value of the Options header of the Message as a Field which references the underlying b...
Definition: Message.hpp:1378
Message & setData(const std::string &v_)
Sets the data portion of self.
Definition: Message.hpp:1538
Class to hold string versions of failure reasons.
Definition: ampsplusplus.hpp:152
Valid values for the setAckTypeEnum() and getAckTypeEnum() methods.
Definition: Message.hpp:1186
Valid values for setCommandEnum() and getCommandEnum().
Definition: Message.hpp:1263