This adds a couple of new options for options parsing.
authorBrian Aker <brian@tangent.org>
Mon, 21 Mar 2011 22:07:08 +0000 (15:07 -0700)
committerBrian Aker <brian@tangent.org>
Mon, 21 Mar 2011 22:07:08 +0000 (15:07 -0700)
libmemcached/callback.c
libmemcached/constants.h
libmemcached/memcached.c
libmemcached/memcached.h
libmemcached/options.cc
libmemcached/options.h
libmemcached/strerror.c
tests/mem_functions.c
tests/parser.cc
tests/parser.h

index 69e47d4d78ad9bd5bdc3c507496928f324e3a87c..6d5285a5fe1416170de6381b64b1571e3f28efb3 100644 (file)
@@ -39,7 +39,7 @@ memcached_return_t memcached_callback_set(memcached_st *ptr,
         memcached_array_free(ptr->prefix_key);
         ptr->prefix_key= memcached_strcpy(ptr, (const char *)data, strlen((const char*)data));
 
-        f (! ptr->prefix_key)
+        if (! ptr->prefix_key)
           return memcached_set_error(ptr, MEMCACHED_MEMORY_ALLOCATION_FAILURE, NULL);
       }
       else
index 2ec8a9e8479de489b33cac51cb6f484279400554..3c9614d16e0b6931cc23162bd8fd1bcb35946fee 100644 (file)
@@ -74,6 +74,7 @@ typedef enum {
   MEMCACHED_AUTH_PROBLEM,
   MEMCACHED_AUTH_FAILURE,
   MEMCACHED_AUTH_CONTINUE,
+  MEMCACHED_PARSE_ERROR,
   MEMCACHED_MAXIMUM_RETURN /* Always add new error code before */
 } memcached_return_t;
 
index 3d255fc0cab5c8cca2396de95a732ecbf93983b5..a1f4b379ff5cf79804e97df87b3e53acd99d2d89 100644 (file)
@@ -35,8 +35,8 @@ static const memcached_st global_copy= {
     .use_udp= false,
     .verify_key= false,
     .tcp_keepalive= false,
-    .load_from_file= false
-
+    .load_from_file= false,
+    .ping_service= false
   }
 };
 
@@ -176,6 +176,18 @@ memcached_st *memcached_create(memcached_st *ptr)
   return ptr;
 }
 
+memcached_st *memcached_create_with_options(const char *string, size_t length)
+{
+  memcached_st *self= memcached_create(NULL);
+
+  if (! self)
+    return NULL;
+
+  memcached_parse_options(self, string, length);
+
+  return self;
+}
+
 void memcached_reset(memcached_st *ptr)
 {
   WATCHPOINT_ASSERT(ptr);
index 9d0d2f0be30a814e949a7833f230dd60e3364a3c..65b3b048bfe96c175e4243933f67c118e56b315c 100644 (file)
@@ -86,6 +86,7 @@ struct memcached_st {
     bool verify_key:1;
     bool tcp_keepalive:1;
     bool load_from_file:1;
+    bool ping_service:1;
   } flags;
   memcached_server_distribution_t distribution;
   hashkit_st hashkit;
@@ -146,6 +147,9 @@ void memcached_servers_reset(memcached_st *ptr);
 LIBMEMCACHED_API
 memcached_st *memcached_create(memcached_st *ptr);
 
+LIBMEMCACHED_API
+memcached_st *memcached_create_with_options(const char *string, size_t length);
+
 LIBMEMCACHED_API
 void memcached_free(memcached_st *ptr);
 
index 5a9feacb8754920113c6b339ecc99c8f5482878a..fefcb57dc1d81ef64923d38e3fdefcd73de2dce8 100644 (file)
 
 int libmemcached_parse(type_st *, yyscan_t *);
 
+memcached_return_t memcached_check_options(const char *option_string, size_t length, const char *error_buffer, size_t error_buffer_size)
+{
+  memcached_st memc;
+  if (! memcached_create(&memc))
+    return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
+
+  memcached_return_t rc= memcached_parse_options(&memc, option_string, length);
+  if (rc != MEMCACHED_SUCCESS && error_buffer && error_buffer_size)
+  {
+    strncpy(error_buffer, error_buffer_size, memcached_last_error_message(&memc));
+  }
+
+  memcached_free(&memc);
+
+  return rc;
+}
+
 memcached_return_t memcached_parse_options(memcached_st *self, char const *option_string, size_t length)
 {
   type_st pp;
@@ -61,7 +78,7 @@ memcached_return_t memcached_parse_options(memcached_st *self, char const *optio
   libmemcached_lex_destroy(pp.yyscanner);
 
   if (not success)
-    return MEMCACHED_INVALID_ARGUMENTS;
+    return memcached_set_error(self, MEMCACHED_PARSE_ERROR, NULL);
 
   return MEMCACHED_SUCCESS;
 }
@@ -83,7 +100,6 @@ memcached_return_t memcached_parse_file_options(memcached_st *self, const char *
       continue;
 
     rc= memcached_parse_options(self, buffer, length);
-
     if (rc != MEMCACHED_SUCCESS)
       break;
   }
index a2351548c2ec394f70c83e89bb6122c152a92db1..b1b9b92ad67271a4657afd22c3086a9b699b545d 100644 (file)
@@ -41,6 +41,9 @@
 extern "C" {
 #endif
 
+LIBMEMCACHED_API
+  memcached_return_t memcached_check_options(const char *option_string, size_t length, const char *error_buffer, size_t error_buffer_size);
+
 LIBMEMCACHED_API
   memcached_return_t memcached_parse_options(memcached_st *ptr, const char *option_string, size_t length);
 
index d1c0f2976b5695860cc4ade9901e32f8301e984a..5fc365c2a5a6febb1ba3ef8b10d1143ee9438fae 100644 (file)
@@ -91,6 +91,8 @@ const char *memcached_strerror(memcached_st *ptr, memcached_return_t rc)
     return "AUTHENTICATION FAILURE";
   case MEMCACHED_AUTH_CONTINUE:
     return "CONTINUE AUTHENTICATION";
+  case MEMCACHED_PARSE_ERROR:
+    return "ERROR OCCURED WHILE PARSING";
   case MEMCACHED_MAXIMUM_RETURN:
     return "Gibberish returned!";
   default:
index 7eb8e83b0de26889ccdaf12a688c7780f7510734..4b961911ddbe810ffa0a5fc455ebcd5a07862df0 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 };
+                        1769812374U, 2302537950U, 1110330676U, 3365377466U };
 
   // You have updated the memcache_error messages but not updated docs/tests.
-  test_true(MEMCACHED_MAXIMUM_RETURN == 43);
+  test_true(MEMCACHED_MAXIMUM_RETURN == 44);
   for (rc= MEMCACHED_SUCCESS; rc < MEMCACHED_MAXIMUM_RETURN; rc++)
   {
     uint32_t hash_val;
@@ -6320,11 +6320,12 @@ test_st parser_tests[] ={
   {"boolean_options", 0, (test_callback_fn)parser_boolean_options_test },
   {"distribtions", 0, (test_callback_fn)parser_distribution_test },
   {"hash", 0, (test_callback_fn)parser_hash_test },
+  {"memcached_check_options", 0, (test_callback_fn)memcached_check_options_test },
+  {"memcached_parse_file_options", 0, (test_callback_fn)memcached_parse_file_options_test },
   {"number_options", 0, (test_callback_fn)parser_number_options_test },
+  {"prefix_key", 0, (test_callback_fn)parser_key_prefix_test },
   {"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 8119c82bcb8a1262b987a31b21fc802e4107d232..5a8187552638b1d35b2c25311d2372ed3abb0e02 100644 (file)
@@ -347,3 +347,34 @@ test_return_t memcached_parse_file_options_test(memcached_st *junk)
 
   return TEST_SUCCESS;
 }
+
+test_return_t memcached_check_options_test(memcached_st *junk)
+{
+  (void)junk;
+
+  memcached_return_t rc;
+
+  rc= memcached_check_options(STRING_WITH_LEN("--server=localhost"), NULL, 0);
+  test_true(rc == MEMCACHED_SUCCESS);
+
+  rc= memcached_check_options(STRING_WITH_LEN("--dude=localhost"), NULL, 0);
+  test_false(rc == MEMCACHED_SUCCESS);
+  test_true(rc == MEMCACHED_PARSE_ERROR);
+
+  return TEST_SUCCESS;
+}
+
+test_return_t memcached_create_with_options_test(memcached_st *junk)
+{
+  (void)junk;
+
+  memcached_st *memc_ptr;
+  memc_ptr= memcached_create_with_options(STRING_WITH_LEN("--server=localhost"));
+  test_true(memc_ptr);
+  memcached_free(memc_ptr);
+
+  memc_ptr= memcached_create_with_options(STRING_WITH_LEN("--dude=localhost"));
+  test_false(memc_ptr);
+
+  return TEST_SUCCESS;
+}
index 90a117a8f5a3868ad667a3df64686024ee49a83c..d3dfbf64567166e71bc4380919f698e445308635 100644 (file)
@@ -70,6 +70,12 @@ test_return_t parser_key_prefix_test(memcached_st *junk);
 LIBTEST_INTERNAL_API
 test_return_t memcached_parse_file_options_test(memcached_st *junk);
 
+LIBTEST_INTERNAL_API
+  test_return_t memcached_check_options_test(memcached_st *junk);
+
+LIBTEST_INTERNAL_API
+  test_return_t memcached_create_with_options_test(memcached_st *junk);
+
 #ifdef __cplusplus
 }
 #endif