Merge in Ubuntu fixes.
[m6w6/libmemcached] / libmemcached / options / context.h
index 9e4ecb3a32d5d873f25e2937a914a5838f0bbe30..2597b196180ded836ef0a9b1c6dde53c387c3847 100644 (file)
@@ -37,7 +37,7 @@
 
 #pragma once
 
-#include <libmemcached/memcached.h>
+#include <libmemcached/common.h>
 
 class Context
 {
@@ -49,8 +49,10 @@ public:
     pos(0),
     memc(NULL),
     rc(rc_arg),
+    _is_server(false),
     _end(false)
   {
+    _hostname[0]= 0;
     buf= option_string;
     length= option_string_length;
     memc= memc_arg;
@@ -71,6 +73,60 @@ public:
     _end= true;
   }
 
+  void set_server()
+  {
+    _is_server= true;
+  }
+
+  void unset_server()
+  {
+    _is_server= false;
+  }
+
+  bool is_server()
+  {
+    return _is_server;
+  }
+
+  const char *set_hostname(const char *str, size_t size)
+  {
+    size_t copy_length= (size_t)NI_MAXHOST > size ? size : (size_t)NI_MAXHOST;
+    memcpy(_hostname, str, copy_length);
+    _hostname[copy_length]= 0;
+
+    return _hostname;
+  }
+
+  const char *hostname()
+  {
+    return _hostname;
+  }
+
+  void abort(const char *error)
+  {
+    if (rc == MEMCACHED_SUCCESS)
+      rc= MEMCACHED_PARSE_ERROR;
+
+    memcached_string_st *error_string= memcached_string_create(memc, NULL, 1024);
+    memcached_string_append(error_string, memcached_literal_param("Error occured while parsing: "));
+    memcached_string_append(error_string, memcached_string_make_from_cstr(begin));
+    memcached_string_append(error_string, memcached_literal_param(" ("));
+
+    if (rc == MEMCACHED_PARSE_ERROR and error)
+    {
+      memcached_string_append(error_string, memcached_string_make_from_cstr(error));
+    }
+    else
+    {
+      memcached_string_append(error_string, memcached_string_make_from_cstr(memcached_strerror(NULL, rc)));
+    }
+    memcached_string_append(error_string, memcached_literal_param(")"));
+
+    memcached_set_error(*memc, rc, MEMCACHED_AT, memcached_string_value(error_string), memcached_string_length(error_string));
+
+    memcached_string_free(error_string);
+  }
+
   ~Context()
   {
     destroy_scanner();
@@ -89,5 +145,7 @@ protected:
   void destroy_scanner();
 
 private:
+  bool _is_server;
   bool _end;
+  char _hostname[NI_MAXHOST];
 };