Merge in additional language plus some of the configure language for
authorBrian Aker <brian@tangent.org>
Wed, 23 Mar 2011 22:46:23 +0000 (15:46 -0700)
committerBrian Aker <brian@tangent.org>
Wed, 23 Mar 2011 22:46:23 +0000 (15:46 -0700)
END/RESET/etc.

clients/memparse.cc
libmemcached/constants.h
libmemcached/options.cc
libmemcached/options.h
libmemcached/options/context.h
libmemcached/options/parser.yy
libmemcached/options/scanner.l
libmemcached/strerror.c
tests/mem_functions.c
tests/parser.cc
tests/parser.h

index eb978f2c12eb1d3866273fc33720f082be55c4d7..2c80fcd50825c6fe92ee1186b1f67b703c0ef6c1 100644 (file)
@@ -58,8 +58,8 @@ int main(int argc, char *argv[])
 
     if (rc != MEMCACHED_SUCCESS)
     {
-      std::cerr << "Failed to parse options:" << argv[x] << std::endl;
-      std::cerr << "\t" << buffer << std::endl;
+      std::cerr << "Failed to parse argument #" << x << " " << argv[x] << std::endl;
+      std::cerr << "Error message from parser was:\t" << buffer << std::endl;
       return EXIT_FAILURE;
     }
   }
index 3c9614d16e0b6931cc23162bd8fd1bcb35946fee..e01623c8e663680d02a54c0f0af6e0d4a5e351dd 100644 (file)
@@ -75,6 +75,7 @@ typedef enum {
   MEMCACHED_AUTH_FAILURE,
   MEMCACHED_AUTH_CONTINUE,
   MEMCACHED_PARSE_ERROR,
+  MEMCACHED_PARSE_USER_ERROR,
   MEMCACHED_MAXIMUM_RETURN /* Always add new error code before */
 } memcached_return_t;
 
index 35e8b783ac6e782507f989aebbd6be2748bfed0c..02b885fca60e69e6f6efd54c1bea381c874c352b 100644 (file)
 
 #include "common.h"
 
-#include <libmemcached/options/parser.h>
-#include <libmemcached/options/scanner.h>
+#include <iostream>
 
-int libmemcached_parse(Context*, yyscan_t *);
+#include <libmemcached/options/context.h>
 
 const char *memcached_parse_filename(memcached_st *memc)
 {
@@ -54,9 +53,15 @@ size_t memcached_parse_filename_length(memcached_st *memc)
 
 static memcached_return_t _parse_file_options(memcached_st *self, memcached_string_t *filename)
 {
-  FILE *fp= fopen(filename->c_str, "r");
+  std::string real_name(filename->c_str, filename->size);
+  FILE *fp= fopen(real_name.c_str(), "r");
   if (! fp)
-    return memcached_set_errno(self, errno, NULL);
+  {
+    memcached_string_t tmp;
+    tmp.c_str= real_name.c_str();
+    tmp.size= real_name.size();
+    return memcached_set_errno(self, errno, &tmp);
+  }
 
   char buffer[BUFSIZ];
   memcached_return_t rc= MEMCACHED_INVALID_ARGUMENTS;
@@ -76,7 +81,7 @@ static memcached_return_t _parse_file_options(memcached_st *self, memcached_stri
   return rc;
 }
 
-memcached_return_t libmemcached_check_configuration(const char *option_string, size_t length, const char *error_buffer, size_t error_buffer_size)
+memcached_return_t libmemcached_check_configuration(const char *option_string, size_t length, char *error_buffer, size_t error_buffer_size)
 {
   memcached_st memc, *memc_ptr;
 
@@ -114,7 +119,7 @@ memcached_return_t memcached_parse_configuration(memcached_st *self, char const
   memcached_return_t rc;
   Context context(option_string, length, self, rc);
 
-  libmemcached_parse(&context, context.scanner);
+  context.start();
 
   return rc;
 }
index f06ae566d13591c2f5e0d72aaa28b89ff2be69ad..0a27be982646889261dc69530cc70b85d1f7ad59 100644 (file)
@@ -42,7 +42,7 @@ extern "C" {
 #endif
 
 LIBMEMCACHED_API
-  memcached_return_t libmemcached_check_configuration(const char *option_string, size_t length, const char *error_buffer, size_t error_buffer_size);
+  memcached_return_t libmemcached_check_configuration(const char *option_string, size_t length, char *error_buffer, size_t error_buffer_size);
 
 LIBMEMCACHED_API
   memcached_return_t memcached_parse_configuration(memcached_st *ptr, const char *option_string, size_t length);
index e650b5ee582c290681f98490b059312b78218dc6..9e4ecb3a32d5d873f25e2937a914a5838f0bbe30 100644 (file)
@@ -63,6 +63,8 @@ public:
     return _end;
   }
 
+  void start();
+
   void set_end()
   {
     rc= MEMCACHED_SUCCESS;
index dd19ef8b52d3c98a58722b6fcaff2f3a3b24d645..1471904573b17aa10b8a7c8396c10a4147256ea9 100644 (file)
@@ -61,6 +61,7 @@ inline void parser_abort_func(Context *context, const char *error)
     context->rc= MEMCACHED_PARSE_ERROR;
 
   std::string error_message;
+  error_message+= "Error occured while parsing: ";
   error_message+= context->begin;
   error_message+= " (";
   if (context->rc == MEMCACHED_PARSE_ERROR and error)
@@ -82,10 +83,17 @@ inline void libmemcached_error(YYLTYPE *locp, Context *context, yyscan_t *scanne
     parser_abort_func(context, error);
 }
 
+int libmemcached_parse(Context*, yyscan_t *);
+void Context::start() 
+{
+  libmemcached_parse(this, scanner);
+}
+
 %}
 
 %token COMMENT
 %token END
+%token ERROR
 %token RESET
 %token DEBUG
 %token INCLUDE
@@ -194,30 +202,22 @@ statement:
             context->set_end();
             YYACCEPT;
           }
-        | RESET
+        | ERROR
           {
-            memcached_reset(context->memc);
+            context->rc= MEMCACHED_PARSE_USER_ERROR;
+            parser_abort(context, NULL);
           }
-        | RESET SERVERS
+        | RESET
           {
-            memcached_servers_reset(context->memc);
+            memcached_reset(context->memc);
           }
         | DEBUG
           {
             yydebug= 1;
           }
-        | DEBUG TRUE
-          {
-            yydebug= 1;
-          }
-        | DEBUG FALSE
-          {
-            yydebug= 0;
-          }
-        | INCLUDE FILE_PATH
+        | INCLUDE ' ' string
           {
-            std::cerr << "Got into INCLUDE" << std::endl;
-            if ((context->rc= memcached_parse_configure_file(context->memc, $2.c_str, $2.length)) != MEMCACHED_SUCCESS)
+            if ((context->rc= memcached_parse_configure_file(context->memc, $3.c_str, $3.length)) != MEMCACHED_SUCCESS)
             {
               parser_abort(context, NULL);
             }
@@ -434,7 +434,7 @@ server:
           HOSTNAME_WITH_PORT NUMBER
           {
             $$.c_str= $1.c_str;
-            $$.length= $1.length -1;
+            $$.length= $1.length -1; // -1 to remove :
             $$.port= $2;
           }
         | HOSTNAME
@@ -452,7 +452,7 @@ server:
         | IPADDRESS_WITH_PORT NUMBER
           {
             $$.c_str= $1.c_str;
-            $$.length= $1.length -1;
+            $$.length= $1.length -1; // -1 to remove :
             $$.port= $2;
           }
         | IPADDRESS
@@ -509,8 +509,8 @@ string:
           }
         | QUOTED_STRING
           {
-            $$.c_str= $1.c_str +1;
-            $$.length= $1.length -2;
+            $$.c_str= $1.c_str +1; // +1 to move use passed the initial quote
+            $$.length= $1.length -1; // -1 removes the end quote
           }
         ;
 
index 124900cf75cd5f95576bccdcbf751b7b7ae92249..aadfdc3ba66cb917ef96c573ee2a3ddf58752c20 100644 (file)
@@ -159,11 +159,12 @@ static void get_lex_chars(char* buffer, int& result, int max_size, Context *cont
 "--PREFIX-KEY"                         { yyextra->begin= yytext; return PREFIX_KEY; }
 "--PREFIX_KEY"                         { yyextra->begin= yytext; return PREFIX_KEY; }
 
-INCLUDE           { yyextra->begin= yytext; std::cerr << "Found INCLUDE" << std::endl; return INCLUDE; }
+INCLUDE           { yyextra->begin= yytext; return INCLUDE; }
 RESET           { yyextra->begin= yytext; return RESET; }
 DEBUG           { yyextra->begin= yytext; return DEBUG; }
 SERVERS           { yyextra->begin= yytext; return SERVERS; }
 END           { yyextra->begin= yytext; return END; }
+ERROR           { yyextra->begin= yytext; return ERROR; }
 
 TRUE           { return TRUE; }
 FALSE           { return FALSE; }
@@ -241,3 +242,4 @@ void Context::destroy_scanner()
 {
   yylex_destroy(scanner);
 }
+
index 5fc365c2a5a6febb1ba3ef8b10d1143ee9438fae..773ccd032de109e0b078fa0337ec88da3444d162 100644 (file)
@@ -93,6 +93,8 @@ const char *memcached_strerror(memcached_st *ptr, memcached_return_t rc)
     return "CONTINUE AUTHENTICATION";
   case MEMCACHED_PARSE_ERROR:
     return "ERROR OCCURED WHILE PARSING";
+  case MEMCACHED_PARSE_USER_ERROR:
+    return "USER INITIATED ERROR OCCURED WHILE PARSING";
   case MEMCACHED_MAXIMUM_RETURN:
     return "Gibberish returned!";
   default:
index b823b3f2f839befa5790a3b1e11cc6b45339db43..9b27a60ab415224b770b9134d0e08072bf964e64 100644 (file)
@@ -401,10 +401,10 @@ static test_return_t error_test(memcached_st *memc)
                         2300930706U, 2943759320U, 674306647U, 2400528935U,
                         54481931U, 4186304426U, 1741088401U, 2979625118U,
                         4159057246U, 3425930182U, 2593724503U,  1868899624U,
-                        1769812374U, 2302537950U, 1110330676U, 3365377466U };
+                        1769812374U, 2302537950U, 1110330676U, 3365377466U, 
+                        1336171666U, 3365377466U };
 
   // You have updated the memcache_error messages but not updated docs/tests.
-  test_true(MEMCACHED_MAXIMUM_RETURN == 44);
   for (rc= MEMCACHED_SUCCESS; rc < MEMCACHED_MAXIMUM_RETURN; rc++)
   {
     uint32_t hash_val;
@@ -418,6 +418,7 @@ static test_return_t error_test(memcached_st *memc)
     }
     test_true(values[rc] == hash_val);
   }
+  test_true(MEMCACHED_MAXIMUM_RETURN == 45);
 
   return TEST_SUCCESS;
 }
index 968dd0c73203af04f54e8bd1ba45bb74bfbd7814..717859b469e6b65ac58807ca8f2b65519d60b2e8 100644 (file)
@@ -422,6 +422,50 @@ test_return_t memcached_create_with_options_test(memcached_st *junk)
   return TEST_SUCCESS;
 }
 
+test_return_t test_include_keyword(memcached_st *junk)
+{
+  (void)junk;
+  char buffer[BUFSIZ];
+  memcached_return_t rc;
+  rc= libmemcached_check_configuration(STRING_WITH_LEN("INCLUDE \"support/example.cnf\""), buffer, sizeof(buffer));
+  test_true_got(rc == MEMCACHED_SUCCESS, buffer);
+
+  return TEST_SUCCESS;
+}
+
+test_return_t test_end_keyword(memcached_st *junk)
+{
+  (void)junk;
+  char buffer[BUFSIZ];
+  memcached_return_t rc;
+  rc= libmemcached_check_configuration(STRING_WITH_LEN("--server=localhost END bad keywords"), buffer, sizeof(buffer));
+  test_true_got(rc == MEMCACHED_SUCCESS, buffer);
+
+  return TEST_SUCCESS;
+}
+
+test_return_t test_reset_keyword(memcached_st *junk)
+{
+  (void)junk;
+  char buffer[BUFSIZ];
+  memcached_return_t rc;
+  rc= libmemcached_check_configuration(STRING_WITH_LEN("--server=localhost reset --server=bad.com"), buffer, sizeof(buffer));
+  test_true_got(rc == MEMCACHED_SUCCESS, buffer);
+
+  return TEST_SUCCESS;
+}
+
+test_return_t test_error_keyword(memcached_st *junk)
+{
+  (void)junk;
+  char buffer[BUFSIZ];
+  memcached_return_t rc;
+  rc= libmemcached_check_configuration(STRING_WITH_LEN("--server=localhost ERROR --server=bad.com"), buffer, sizeof(buffer));
+  test_true_got(rc != MEMCACHED_SUCCESS, buffer);
+
+  return TEST_SUCCESS;
+}
+
 #define RANDOM_STRINGS 50
 test_return_t random_statement_build_test(memcached_st *junk)
 {
index 0e762b0bd7df006ec1051cb79ea19f90648cca33..b21cdf70f02b65c98ee497fcad1ed16223ca48e4 100644 (file)
@@ -85,6 +85,18 @@ LIBTEST_INTERNAL_API
 LIBTEST_INTERNAL_API
   test_return_t random_statement_build_test(memcached_st *junk);
 
+LIBTEST_INTERNAL_API
+test_return_t test_include_keyword(memcached_st *junk);
+
+LIBTEST_INTERNAL_API
+test_return_t test_end_keyword(memcached_st *junk);
+
+LIBTEST_INTERNAL_API
+test_return_t test_reset_keyword(memcached_st *junk);
+
+LIBTEST_INTERNAL_API
+test_return_t test_error_keyword(memcached_st *junk);
+
 #ifdef __cplusplus
 }
 #endif