Merge in all changes related to being able to read configuration files.
authorBrian Aker <brian@tangent.org>
Mon, 21 Mar 2011 16:02:56 +0000 (09:02 -0700)
committerBrian Aker <brian@tangent.org>
Mon, 21 Mar 2011 16:02:56 +0000 (09:02 -0700)
ChangeLog
libmemcached/options.cc
libmemcached/options/parser.yy
libmemcached/options/scanner.l
support/example.cnf [new file with mode: 0644]
tests/mem_functions.c
tests/parser.cc
tests/parser.h

index 538463c4f3b65279247fbb5dc7f3f4105e83ad50..9c0bea9ccff6f3769ce1fad28d73f381faa11560 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+0.49
+  * Fix calls to auto methods so that if value is not passed in nothing bad happens.
+  * New parser calls for generating memcached_st objects.
+  * New error system.
+
 0.48 Tue Mar 15 23:05:18 PDT 2011
   * Fix memory leak in server parse.
   * Move test framework out to be its own library (easier to work with Gearman).
index 0d8c39f2f0eff813dab35e37c0fae532fceaa28d..5a9feacb8754920113c6b339ecc99c8f5482878a 100644 (file)
@@ -66,10 +66,28 @@ memcached_return_t memcached_parse_options(memcached_st *self, char const *optio
   return MEMCACHED_SUCCESS;
 }
 
-memcached_return_t memcached_parse_file_options(memcached_st *ptr, const char *filename)
+memcached_return_t memcached_parse_file_options(memcached_st *self, const char *filename)
 {
-  (void)ptr;
-  (void)filename;
+  FILE *fp= fopen(filename, "r");
+  
+  if (! fp)
+    return memcached_set_errno(self, errno, NULL);
 
-  return MEMCACHED_SUCCESS;
+  char buffer[BUFSIZ];
+  memcached_return_t rc= MEMCACHED_INVALID_ARGUMENTS;
+  while (fgets(buffer, sizeof(buffer), fp))
+  {
+    size_t length= strlen(buffer);
+    
+    if (length == 1 and buffer[0] == '\n')
+      continue;
+
+    rc= memcached_parse_options(self, buffer, length);
+
+    if (rc != MEMCACHED_SUCCESS)
+      break;
+  }
+  fclose(fp);
+
+  return rc;
 }
index 8cd16d538f287cfb2d2518ad01faef065e50d1c8..5b1406283541add6e8479df7e107d15b9c375f06 100644 (file)
@@ -60,6 +60,8 @@ inline void libmemcached_error(YYLTYPE *locp, type_st *parser, yyscan_t *scanner
 %token SERVER
 %token SERVERS
 %token UNKNOWN
+%token COMMENT
+%token EMPTY_LINE
 
 %token DASH_OPTION
 
@@ -143,6 +145,10 @@ statement:
           { }
         | statement ' ' DASH_OPTION expression
           { }
+        | COMMENT
+          { }
+        | EMPTY_LINE
+          { }
         ;
 
 
index 3a135ff92055c5c00f17ce341dbfec9d998c0537..f5d09e7a3aaa1e1755f5bc3cf4ab2470d7c1f830 100644 (file)
@@ -81,6 +81,10 @@ static void get_lex_chars(char* buffer, int& result, int max_size, struct type_s
 
 [\t\r\n] ; /* skip whitespace */
 
+^#.*$ {
+      return COMMENT;
+    }
+
 "--" { return DASH_OPTION; }
 
 SERVER                          { return SERVER; }
@@ -195,7 +199,7 @@ JENKINS                     { return JENKINS; }
       return STRING;
     }
 
-\"[[:alnum:]]*\" { 
+\".*\" { 
       yylval->string.c_str = yytext;
       yylval->string.length = yyleng;
       return QUOTED_STRING;
diff --git a/support/example.cnf b/support/example.cnf
new file mode 100644 (file)
index 0000000..3ccb796
--- /dev/null
@@ -0,0 +1,11 @@
+# http://en.wikipedia.org/wiki/Consistent_hashing
+--distribution=consistent
+
+# Store one additional copy on each node.
+--number-of-replicas=2
+--prefix-key="my_foo"
+--prefix-key="my_prefix"
+--server=localhost:11211
+--server=localhost:11212
+--server=localhost:11213
+--verify-key
index 3aff82fd13266fe5fcd6976347fb9f28526963f2..090d00cc1978a71873b3e7d9740ea5d81ab05fba 100644 (file)
@@ -6320,6 +6320,7 @@ test_st parser_tests[] ={
   {"server", 0, (test_callback_fn)server_test },
   {"servers", 0, (test_callback_fn)servers_test },
   {"prefix_key", 0, (test_callback_fn)parser_key_prefix_test },
+  {"memcached_parse_file_options", 0, (test_callback_fn)memcached_parse_file_options_test },
   {0, 0, (test_callback_fn)0}
 };
 
index 9eb8171494b4037d58c8ad6cc2e692dff1e47507..8119c82bcb8a1262b987a31b21fc802e4107d232 100644 (file)
@@ -332,3 +332,18 @@ test_return_t parser_key_prefix_test(memcached_st *junk)
   (void)junk;
   return _test_option(distribution_strings);
 }
+
+test_return_t memcached_parse_file_options_test(memcached_st *junk)
+{
+  (void)junk;
+  memcached_st memc;
+  memcached_st *memc_ptr= memcached_create(&memc);
+
+  test_true(memc_ptr);
+
+  memcached_return_t rc= memcached_parse_file_options(memc_ptr, "support/example.cnf");
+  test_true_got(rc == MEMCACHED_SUCCESS, rc == MEMCACHED_INVALID_ARGUMENTS ? memcached_last_error_message(&memc) : memcached_strerror(NULL, rc));
+  memcached_free(memc_ptr);
+
+  return TEST_SUCCESS;
+}
index 5c5ad7f22be7fccedaebd23040db55600f6dbc74..90a117a8f5a3868ad667a3df64686024ee49a83c 100644 (file)
@@ -67,6 +67,9 @@ test_return_t parser_boolean_options_test(memcached_st *junk);
 LIBTEST_INTERNAL_API
 test_return_t parser_key_prefix_test(memcached_st *junk);
 
+LIBTEST_INTERNAL_API
+test_return_t memcached_parse_file_options_test(memcached_st *junk);
+
 #ifdef __cplusplus
 }
 #endif