Fix case where --socket was not always been stored correctly.
[m6w6/libmemcached] / libmemcached / csl / context.h
index ce7b0316a124c3ebe4d2fdf84e080e4ac7794f1a..97303c50bf09f463e4566391356a4ed30cf79bbd 100644 (file)
 
 #pragma once
 
-#include <libmemcached/common.h>
+#include <libmemcached/csl/common.h>
+#include <libmemcached/csl/parser.h>
 
 class Context
 {
 public:
-  Context(const char *option_string, size_t option_string_length, memcached_st *memc_arg,
+  Context(const char *option_string, size_t option_string_length, memcached_st *memc_,
           memcached_return_t &rc_arg) :
+    previous_token(END),
     scanner(NULL),
+    buf(option_string),
     begin(NULL),
     pos(0),
-    memc(NULL),
+    length(option_string_length),
+    memc(memc_),
     rc(rc_arg),
     _is_server(false),
-    _end(false)
+    _end(false),
+    _has_hash(false)
   {
     _hostname[0]= 0;
-    buf= option_string;
-    length= option_string_length;
-    memc= memc_arg;
     init_scanner();
     rc= MEMCACHED_SUCCESS;
+
+    memc->state.is_parsing= true;
+    memcached_string_create(memc,
+                            &_string_buffer,
+                            1024);
   }
 
   bool end()
@@ -73,6 +80,8 @@ public:
     _end= true;
   }
 
+  bool set_hash(memcached_hash_t hash);
+
   void set_server()
   {
     _is_server= true;
@@ -83,55 +92,31 @@ public:
     _is_server= false;
   }
 
-  bool is_server()
+  bool is_server() const
   {
     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;
+  void hostname(const char*, size_t, server_t&);
 
-    return _hostname;
-  }
+  bool string_buffer(const char*, size_t, memcached_string_t&);
 
-  const char *hostname()
+  const char *hostname() const
   {
     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);
-  }
+  void abort(const char *, yytokentype, const char *);
+  void error(const char *, yytokentype, const char* );
 
   ~Context()
   {
+    memcached_string_free(&_string_buffer);
     destroy_scanner();
+    memc->state.is_parsing= false;
   }
 
+  yytokentype previous_token;
   void *scanner;
   const char *buf;
   const char *begin;
@@ -148,4 +133,6 @@ private:
   bool _is_server;
   bool _end;
   char _hostname[NI_MAXHOST];
+  bool _has_hash;
+  memcached_string_st _string_buffer;
 };