From: Brian Aker Date: Thu, 7 Apr 2011 17:41:44 +0000 (-0700) Subject: New docs system. X-Git-Tag: 0.51~17^2~9 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=f0a568f40ab283bb0be08bd0d930c70386418b97;hp=c4f9265e4f61a10ba1d4b6999c856a8c7df97f56;p=m6w6%2Flibmemcached New docs system. --- diff --git a/.bzrignore b/.bzrignore index 4a94ff95..5014439a 100644 --- a/.bzrignore +++ b/.bzrignore @@ -260,6 +260,7 @@ memflush.pop memrm.pop memslap.pop memstat.pop +out patch patch2 stamp-h1 diff --git a/ChangeLog b/ChangeLog index 09bfd51a..feff0112 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,9 +2,7 @@ * 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. - * Added new documentation system. - * A behavior change has been now made that if you specify a weight for any server, we enable the weight flag and do weight balancing. diff --git a/docs/memslap.pod.THIS b/docs/memslap.pod.THIS deleted file mode 100644 index 43f714cc..00000000 --- a/docs/memslap.pod.THIS +++ /dev/null @@ -1,33 +0,0 @@ -=head1 NAME - -memslap - Load testing and benchmarking tool for memcached - -=head1 SYNOPSIS - - memslap [options] - -=head1 DESCRIPTION - -B is a load generation and benchmark tool for memcached(1) -servers. It simulates loads on memcached server clusters. - -You can specify servers via the B<--servers> option or via the -environment variable C. - -For a full list of operations run the tool with the B<--help> option. - -=head1 HOME - -To find out more information please check: -L - -=head1 AUTHOR - -Brian Aker, Ebrian@tangent.orgE - -=head1 SEE ALSO - -memcached(1) libmemcached(3) - -=cut - diff --git a/libmemcached/hosts.c b/libmemcached/hosts.c index eafbb1b5..65a4cd41 100644 --- a/libmemcached/hosts.c +++ b/libmemcached/hosts.c @@ -226,8 +226,8 @@ static memcached_return_t update_continuum(memcached_st *ptr) for (uint32_t x= 0; x < pointer_per_hash; x++) { uint32_t value= ketama_server_hash(sort_host, (size_t)sort_host_length, x); - ptr->ketama.continuum[continuum_index].index= host_index; - ptr->ketama.continuum[continuum_index++].value= value; + ptr->ketama.continuum[continuum_index].index= host_index; + ptr->ketama.continuum[continuum_index++].value= value; } } else @@ -274,9 +274,9 @@ static memcached_return_t update_continuum(memcached_st *ptr) { for (uint32_t x = 0; x < pointer_per_hash; x++) { - uint32_t value= ketama_server_hash(sort_host, (size_t)sort_host_length, x); - ptr->ketama.continuum[continuum_index].index= host_index; - ptr->ketama.continuum[continuum_index++].value= value; + uint32_t value= ketama_server_hash(sort_host, (size_t)sort_host_length, x); + ptr->ketama.continuum[continuum_index].index= host_index; + ptr->ketama.continuum[continuum_index++].value= value; } } else @@ -444,3 +444,20 @@ static memcached_return_t server_add(memcached_st *ptr, const char *hostname, return run_distribution(ptr); } + +memcached_return_t memcached_server_add_parsed(memcached_st *ptr, + const char *hostname, + size_t hostname_length, + in_port_t port, + uint32_t weight) +{ + char buffer[NI_MAXHOST]; + + memcpy(buffer, hostname, hostname_length); + buffer[hostname_length]= 0; + + return server_add(ptr, buffer, + port, + weight, + MEMCACHED_CONNECTION_TCP); +} diff --git a/libmemcached/options/parser.am b/libmemcached/options/parser.am index 7bfd21c7..e69de29b 100644 --- a/libmemcached/options/parser.am +++ b/libmemcached/options/parser.am @@ -1,29 +0,0 @@ -# vim:expandtab:shiftwidth=2:tabstop=2:smarttab: -# -# Libmemcached Scanner and Parser -# -# Copyright (C) 2011 DataDifferental, http://datadifferential.com -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . - - -libmemcached/options/parser.h: libmemcached/options/parser.cc - -libmemcached/options/parser.cc: libmemcached/options/parser.yy libmemcached/options/scanner.l libmemcached/options/scanner.h - $(AM_V_YACC)$(am__skipyacc) $(YACC) $(YLFLAGS) $(AM_YFLAGS) -o $@ $< - -libmemcached/options/scanner.h: libmemcached/options/scanner.cc - -libmemcached/options/scanner.cc: libmemcached/options/scanner.l libmemcached/options/parser.yy - $(AM_V_GEN)$(LEX) $< diff --git a/libmemcached/options/parser.yy b/libmemcached/options/parser.yy deleted file mode 100644 index d309c227..00000000 --- a/libmemcached/options/parser.yy +++ /dev/null @@ -1,459 +0,0 @@ -/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: - * - * Libmemcached Scanner and Parser - * - * Copyright (C) 2011 DataDifferental, http://datadifferential.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -%error-verbose -%debug -%defines -%expect 0 -%output "libmemcached/options/parser.cc" -%defines "libmemcached/options/parser.h" -%lex-param { yyscan_t *scanner } -%name-prefix="config_" -%parse-param { Context *context } -%parse-param { yyscan_t *scanner } -%pure-parser -%require "2.2" -%start begin -%verbose - -%{ - -#include - -#include - -#include -#include -#include -#include -#include - -#pragma GCC diagnostic ignored "-Wold-style-cast" -#include - -int conf_lex(YYSTYPE* lvalp, void* scanner); - -#define parser_abort(A, B) do { (A)->abort((B)); YYABORT; } while (0) - -inline void config_error(Context *context, yyscan_t *scanner, const char *error) -{ - if (not context->end()) - context->abort(error); -} - -%} - -%token COMMENT -%token END -%token ERROR -%token RESET -%token PARSER_DEBUG -%token INCLUDE -%token CONFIGURE_FILE -%token EMPTY_LINE -%token SERVER -%token SERVERS -%token SERVERS_OPTION -%token UNKNOWN_OPTION -%token UNKNOWN - -/* All behavior options */ -%token AUTO_EJECT_HOSTS -%token BINARY_PROTOCOL -%token BUFFER_REQUESTS -%token CONNECT_TIMEOUT -%token DISTRIBUTION -%token HASH -%token HASH_WITH_PREFIX_KEY -%token IO_BYTES_WATERMARK -%token IO_KEY_PREFETCH -%token IO_MSG_WATERMARK -%token KETAMA_HASH -%token KETAMA_WEIGHTED -%token NOREPLY -%token NUMBER_OF_REPLICAS -%token POLL_TIMEOUT -%token RANDOMIZE_REPLICA_READ -%token RCV_TIMEOUT -%token RETRY_TIMEOUT -%token SERVER_FAILURE_LIMIT -%token SND_TIMEOUT -%token SOCKET_RECV_SIZE -%token SOCKET_SEND_SIZE -%token SORT_HOSTS -%token SUPPORT_CAS -%token _TCP_NODELAY -%token _TCP_KEEPALIVE -%token _TCP_KEEPIDLE -%token USER_DATA -%token USE_UDP -%token VERIFY_KEY - -/* Callbacks */ -%token PREFIX_KEY - -/* Hash types */ -%token MD5 -%token CRC -%token FNV1_64 -%token FNV1A_64 -%token FNV1_32 -%token FNV1A_32 -%token HSIEH -%token MURMUR -%token JENKINS - -/* Distributions */ -%token CONSISTENT -%token MODULA -%token RANDOM - -/* Boolean values */ -%token TRUE -%token FALSE - -%nonassoc ',' -%nonassoc '=' - -%token FLOAT -%token NUMBER -%token PORT -%token WEIGHT_START -%token IPADDRESS -%token HOSTNAME -%token STRING -%token QUOTED_STRING -%token FILE_PATH - -%type string -%type distribution -%type hash -%type behavior_boolean -%type behavior_number - -%% - -begin: - statement - | begin ' ' statement - ; - -statement: - expression - { } - | COMMENT - { } - | EMPTY_LINE - { } - | END - { - context->set_end(); - YYACCEPT; - } - | ERROR - { - context->rc= MEMCACHED_PARSE_USER_ERROR; - parser_abort(context, NULL); - } - | RESET - { - memcached_reset(context->memc); - } - | PARSER_DEBUG - { - yydebug= 1; - } - | INCLUDE ' ' string - { - if ((context->rc= memcached_parse_configure_file(context->memc, $3.c_str, $3.length)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL); - } - } - ; - - -expression: - SERVER HOSTNAME optional_port optional_weight - { - if ((context->rc= memcached_server_add_with_weight(context->memc, $2.c_str, $2.port, $2.weight)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL); - } - context->unset_server(); - } - | SERVER IPADDRESS optional_port optional_weight - { - if ((context->rc= memcached_server_add_with_weight(context->memc, $2.c_str, $2.port, $2.weight)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL); - } - context->unset_server(); - } - | CONFIGURE_FILE string - { - memcached_set_configuration_file(context->memc, $2.c_str, $2.length); - } - | behaviors - ; - -behaviors: - PREFIX_KEY string - { - if ((context->rc= memcached_set_prefix_key(context->memc, $2.c_str, $2.length)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL);; - } - } - | DISTRIBUTION distribution - { - if ((context->rc= memcached_behavior_set(context->memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, $2)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL);; - } - } - | DISTRIBUTION distribution ',' hash - { - if ((context->rc= memcached_behavior_set(context->memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, $2)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL);; - } - if ((context->rc= memcached_behavior_set_distribution_hash(context->memc, $4)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL);; - } - } - | HASH hash - { - if ((context->rc= memcached_behavior_set(context->memc, MEMCACHED_BEHAVIOR_HASH, $2)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL);; - } - } - | behavior_number NUMBER - { - if ((context->rc= memcached_behavior_set(context->memc, $1, $2)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL);; - } - } - | behavior_boolean - { - if ((context->rc= memcached_behavior_set(context->memc, $1, true)) != MEMCACHED_SUCCESS) - { - parser_abort(context, NULL);; - } - } - | USER_DATA - { - } - ; - -behavior_number: - CONNECT_TIMEOUT - { - $$= MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT; - } - | IO_MSG_WATERMARK - { - $$= MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK; - } - | IO_BYTES_WATERMARK - { - $$= MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK; - } - | IO_KEY_PREFETCH - { - $$= MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH; - } - | NUMBER_OF_REPLICAS - { - $$= MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS; - } - | POLL_TIMEOUT - { - $$= MEMCACHED_BEHAVIOR_POLL_TIMEOUT; - } - | RCV_TIMEOUT - { - $$= MEMCACHED_BEHAVIOR_RCV_TIMEOUT; - } - | RETRY_TIMEOUT - { - $$= MEMCACHED_BEHAVIOR_RETRY_TIMEOUT; - } - | SERVER_FAILURE_LIMIT - { - $$= MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT; - } - | SND_TIMEOUT - { - $$= MEMCACHED_BEHAVIOR_SND_TIMEOUT; - } - | SOCKET_RECV_SIZE - { - $$= MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE; - } - | SOCKET_SEND_SIZE - { - $$= MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE; - } - ; - -behavior_boolean: - AUTO_EJECT_HOSTS - { - $$= MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS; - } - | BINARY_PROTOCOL - { - $$= MEMCACHED_BEHAVIOR_BINARY_PROTOCOL; - } - | BUFFER_REQUESTS - { - $$= MEMCACHED_BEHAVIOR_BUFFER_REQUESTS; - } - | HASH_WITH_PREFIX_KEY - { - $$= MEMCACHED_BEHAVIOR_HASH_WITH_PREFIX_KEY; - } - | NOREPLY - { - $$= MEMCACHED_BEHAVIOR_NOREPLY; - } - | RANDOMIZE_REPLICA_READ - { - $$= MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ; - } - | SORT_HOSTS - { - $$= MEMCACHED_BEHAVIOR_SORT_HOSTS; - } - | SUPPORT_CAS - { - $$= MEMCACHED_BEHAVIOR_SUPPORT_CAS; - } - | _TCP_NODELAY - { - $$= MEMCACHED_BEHAVIOR_TCP_NODELAY; - } - | _TCP_KEEPALIVE - { - $$= MEMCACHED_BEHAVIOR_TCP_KEEPALIVE; - } - | _TCP_KEEPIDLE - { - $$= MEMCACHED_BEHAVIOR_TCP_KEEPIDLE; - } - | USE_UDP - { - $$= MEMCACHED_BEHAVIOR_USE_UDP; - } - | VERIFY_KEY - { - $$= MEMCACHED_BEHAVIOR_VERIFY_KEY; - } - - -optional_port: - { } - | PORT - { }; - ; - -optional_weight: - { } - | WEIGHT_START - { } - ; - -hash: - MD5 - { - $$= MEMCACHED_HASH_MD5; - } - | CRC - { - $$= MEMCACHED_HASH_CRC; - } - | FNV1_64 - { - $$= MEMCACHED_HASH_FNV1_64; - } - | FNV1A_64 - { - $$= MEMCACHED_HASH_FNV1A_64; - } - | FNV1_32 - { - $$= MEMCACHED_HASH_FNV1_32; - } - | FNV1A_32 - { - $$= MEMCACHED_HASH_FNV1A_32; - } - | HSIEH - { - $$= MEMCACHED_HASH_HSIEH; - } - | MURMUR - { - $$= MEMCACHED_HASH_MURMUR; - } - | JENKINS - { - $$= MEMCACHED_HASH_JENKINS; - } - ; - -string: - STRING - { - $$= $1; - } - | QUOTED_STRING - { - $$.c_str= $1.c_str +1; // +1 to move use passed the initial quote - $$.length= $1.length -1; // -1 removes the end quote - } - ; - -distribution: - CONSISTENT - { - $$= MEMCACHED_DISTRIBUTION_CONSISTENT; - } - | MODULA - { - $$= MEMCACHED_DISTRIBUTION_MODULA; - } - | RANDOM - { - $$= MEMCACHED_DISTRIBUTION_RANDOM; - } - ; - -%% - -void Context::start() -{ - config_parse(this, (void **)scanner); -} - diff --git a/libmemcached/options/scanner.l b/libmemcached/options/scanner.l deleted file mode 100644 index 8f3e09de..00000000 --- a/libmemcached/options/scanner.l +++ /dev/null @@ -1,233 +0,0 @@ -/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: - * - * Libmemcached Scanner and Parser - * - * Copyright (C) 2011 DataDifferental, http://datadifferential.com - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -%top{ - -#pragma GCC diagnostic ignored "-Wold-style-cast" -#pragma GCC diagnostic ignored "-Wsign-compare" -#pragma GCC diagnostic ignored "-Wunused-parameter" - -#include -#include -#include -#include - -#define YY_EXTRA_TYPE Context* - -} - - -%{ -#include -#include - -#define PARAM yyget_extra(yyscanner) - -#define get_lex_chars(buffer, result, max_size, context) \ -{ \ - if (context->pos >= context->length) \ - { \ - result= YY_NULL; \ - } \ - else \ - { \ - result= (int)(context->length - context->pos); \ - (size_t)result > (size_t)max_size ? result= max_size : 0; \ - memcpy(buffer, context->buf + context->pos, result); \ - context->pos += result; \ - } \ -} - - -#define YY_INPUT(buffer, result, max_size) get_lex_chars(buffer, result, max_size, PARAM) - -%} - -%option 8bit -%option bison-bridge -%option case-insensitive -%option debug -%option nounput -%option noyywrap -%option outfile="libmemcached/options/scanner.cc" header-file="libmemcached/options/scanner.h" -%option perf-report -%option prefix="config_" -%option reentrant - -%% - - -=|,|[ ] { return yytext[0];} - -[[:digit:]]+ { yylval->number = atoi(yytext); return (NUMBER); } - -:[[:digit:]]{1,5} { yylval->server.port = atoi(yytext +1); return PORT; } - -"/?"[[:digit:]]{1,5} { yylval->server.weight = atoi(yytext +2); return WEIGHT_START; } - -[\t\r\n] ; /* skip whitespace */ - - -^#.*$ { - return COMMENT; - } - -"--SERVER=" { yyextra->begin= yytext; yyextra->set_server(); return SERVER; } - -"--VERIFY_KEY" { yyextra->begin= yytext; return VERIFY_KEY; } -"--VERIFY-KEY" { yyextra->begin= yytext; return VERIFY_KEY; } -"--AUTO_EJECT_HOSTS" { yyextra->begin= yytext; return AUTO_EJECT_HOSTS; } -"--AUTO-EJECT_HOSTS" { yyextra->begin= yytext; return AUTO_EJECT_HOSTS; } -"--BINARY_PROTOCOL" { yyextra->begin= yytext; return BINARY_PROTOCOL; } -"--BINARY-PROTOCOL" { yyextra->begin= yytext; return BINARY_PROTOCOL; } -"--BUFFER_REQUESTS" { yyextra->begin= yytext; return BUFFER_REQUESTS; } -"--BUFFER-REQUESTS" { yyextra->begin= yytext; return BUFFER_REQUESTS; } -"--CONFIGURE_FILE=" { yyextra->begin= yytext; return CONFIGURE_FILE; } -"--CONFIGURE-FILE=" { yyextra->begin= yytext; return CONFIGURE_FILE; } -"--CONNECT_TIMEOUT=" { yyextra->begin= yytext; return CONNECT_TIMEOUT; } -"--CONNECT-TIMEOUT=" { yyextra->begin= yytext; return CONNECT_TIMEOUT; } -"--DISTRIBUTION=" { yyextra->begin= yytext; return DISTRIBUTION; } -"--HASH=" { yyextra->begin= yytext; return HASH; } -"--HASH_WITH_PREFIX_KEY" { yyextra->begin= yytext; return HASH_WITH_PREFIX_KEY; } -"--HASH-WITH-PREFIX_KEY" { yyextra->begin= yytext; return HASH_WITH_PREFIX_KEY; } -"--IO_BYTES_WATERMARK=" { yyextra->begin= yytext; return IO_BYTES_WATERMARK; } -"--IO-BYTES-WATERMARK=" { yyextra->begin= yytext; return IO_BYTES_WATERMARK; } -"--IO_KEY_PREFETCH=" { yyextra->begin= yytext; return IO_KEY_PREFETCH; } -"--IO-KEY-PREFETCH=" { yyextra->begin= yytext; return IO_KEY_PREFETCH; } -"--IO_MSG_WATERMARK=" { yyextra->begin= yytext; return IO_MSG_WATERMARK; } -"--IO-MSG-WATERMARK=" { yyextra->begin= yytext; return IO_MSG_WATERMARK; } -"--NOREPLY" { yyextra->begin= yytext; return NOREPLY; } -"--NUMBER_OF_REPLICAS=" { yyextra->begin= yytext; return NUMBER_OF_REPLICAS; } -"--NUMBER-OF-REPLICAS=" { yyextra->begin= yytext; return NUMBER_OF_REPLICAS; } -"--POLL_TIMEOUT=" { yyextra->begin= yytext; return POLL_TIMEOUT; } -"--POLL-TIMEOUT=" { yyextra->begin= yytext; return POLL_TIMEOUT; } -"--RANDOMIZE_REPLICA_READ" { yyextra->begin= yytext; return RANDOMIZE_REPLICA_READ; } -"--RANDOMIZE-REPLICA-READ" { yyextra->begin= yytext; return RANDOMIZE_REPLICA_READ; } -"--RCV_TIMEOUT=" { yyextra->begin= yytext; return RCV_TIMEOUT; } -"--RCV-TIMEOUT=" { yyextra->begin= yytext; return RCV_TIMEOUT; } -"--RETRY_TIMEOUT=" { yyextra->begin= yytext; return RETRY_TIMEOUT; } -"--RETRY-TIMEOUT=" { yyextra->begin= yytext; return RETRY_TIMEOUT; } -"--SERVER_FAILURE_LIMIT=" { yyextra->begin= yytext; return SERVER_FAILURE_LIMIT; } -"--SERVER-FAILURE-LIMIT=" { yyextra->begin= yytext; return SERVER_FAILURE_LIMIT; } -"--SND_TIMEOUT=" { yyextra->begin= yytext; return SND_TIMEOUT; } -"--SND-TIMEOUT=" { yyextra->begin= yytext; return SND_TIMEOUT; } -"--SOCKET_RECV_SIZE=" { yyextra->begin= yytext; return SOCKET_RECV_SIZE; } -"--SOCKET-RECV-SIZE=" { yyextra->begin= yytext; return SOCKET_RECV_SIZE; } -"--SOCKET_SEND_SIZE=" { yyextra->begin= yytext; return SOCKET_SEND_SIZE; } -"--SOCKET-SEND-SIZE=" { yyextra->begin= yytext; return SOCKET_SEND_SIZE; } -"--SORT_HOSTS" { yyextra->begin= yytext; return SORT_HOSTS; } -"--SORT-HOSTS" { yyextra->begin= yytext; return SORT_HOSTS; } -"--SUPPORT_CAS" { yyextra->begin= yytext; return SUPPORT_CAS; } -"--SUPPORT-CAS" { yyextra->begin= yytext; return SUPPORT_CAS; } -"--TCP_NODELAY" { yyextra->begin= yytext; return _TCP_NODELAY; } -"--TCP-NODELAY" { yyextra->begin= yytext; return _TCP_NODELAY; } -"--TCP_KEEPALIVE" { yyextra->begin= yytext; return _TCP_KEEPALIVE; } -"--TCP-KEEPALIVE" { yyextra->begin= yytext; return _TCP_KEEPALIVE; } -"--TCP_KEEPIDLE" { yyextra->begin= yytext; return _TCP_KEEPIDLE; } -"--TCP-KEEPIDLE" { yyextra->begin= yytext; return _TCP_KEEPIDLE; } -"--USER_DATA" { yyextra->begin= yytext; return USER_DATA; } -"--USER-DATA" { yyextra->begin= yytext; return USER_DATA; } -"--USE_UDP" { yyextra->begin= yytext; return USE_UDP; } -"--USE-UDP" { yyextra->begin= yytext; return USE_UDP; } - -"--PREFIX-KEY=" { yyextra->begin= yytext; return PREFIX_KEY; } -"--PREFIX_KEY=" { yyextra->begin= yytext; return PREFIX_KEY; } - -INCLUDE { yyextra->begin= yytext; return INCLUDE; } -RESET { yyextra->begin= yytext; return RESET; } -DEBUG { yyextra->begin= yytext; return PARSER_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; } - - -"--"[[:alnum:]]* { - yyextra->begin= yytext; - return UNKNOWN_OPTION; - } - -CONSISTENT { return CONSISTENT; } -MODULA { return MODULA; } -RANDOM { return RANDOM; } - -MD5 { return MD5; } -CRC { return CRC; } -FNV1_64 { return FNV1_64; } -FNV1A_64 { return FNV1A_64; } -FNV1_32 { return FNV1_32; } -FNV1A_32 { return FNV1A_32; } -HSIEH { return HSIEH; } -MURMUR { return MURMUR; } -JENKINS { return JENKINS; } - -(([[:digit:]]{1,3}"."){3}([[:digit:]]{1,3})) { - yylval->server.port= MEMCACHED_DEFAULT_PORT; - yylval->server.weight= 1; - yylval->server.c_str= yyextra->set_hostname(yytext, yyleng); - if (yylval->server.c_str) - yylval->server.length= yyleng; - return IPADDRESS; - } - -[[:alnum:]]["."[:alnum:]_-]+[[:alnum:]] { - if (yyextra->is_server()) - { - yylval->server.port= MEMCACHED_DEFAULT_PORT; - yylval->server.weight= 1; - yylval->server.c_str= yyextra->set_hostname(yytext, yyleng); - if (yylval->server.c_str) - yylval->server.length= yyleng; - - return HOSTNAME; - } - - yylval->string.c_str = yytext; - yylval->string.length = yyleng; - - return STRING; - } - -(\".*\") { - yylval->string.c_str = yytext; - yylval->string.length = yyleng; - return QUOTED_STRING; - } - -. { - yyextra->begin= yytext; - return UNKNOWN; - } - -%% - -void Context::init_scanner() -{ - yylex_init(&scanner); - yyset_extra(this, scanner); -} - -void Context::destroy_scanner() -{ - yylex_destroy(scanner); -} - diff --git a/libmemcached/server.h b/libmemcached/server.h index fd731e0e..98f5ed68 100644 --- a/libmemcached/server.h +++ b/libmemcached/server.h @@ -93,6 +93,13 @@ LIBMEMCACHED_API memcached_return_t memcached_server_add(memcached_st *ptr, const char *hostname, in_port_t port); +LIBMEMCACHED_LOCAL + memcached_return_t memcached_server_add_parsed(memcached_st *ptr, + const char *hostname, + size_t hostname_length, + in_port_t port, + uint32_t weight); + LIBMEMCACHED_API memcached_return_t memcached_server_add_udp_with_weight(memcached_st *ptr, const char *hostname,