9 Feb

Memcached Functions for MySQL 1.1 released!

I’m pleased to announce the release of Memcached Functions for MySQL, version 1.1. It’s been a while since the 1.0 release, and I’ll use writing a book and having a baby as an excuse, but nevertheless, this release has several changes and new features:

  • Fixed all the calls to libmemcached that were broken when libmemcached changed. This release works with Libmemcached 0.44
  • Added my own string functions as the libmemcached string functions I relied on before were made local/private from the shared library
  • Added memc_get_cas() and memc_get_cas_by_key() functions. You can now obtain the CAS value of an item! For instance:
mysql> select memc_servers_set('localhost:11211');
+-------------------------------------+
| memc_servers_set('localhost:11211') |
+-------------------------------------+
|                                   0 |
+-------------------------------------+
1 row in set (0.00 sec)

mysql> select memc_set('key1', 'test value');
+--------------------------------+
| memc_set('key1', 'test value') |
+--------------------------------+
|                              1 |
+--------------------------------+
1 row in set (0.00 sec)

mysql> select memc_get_cas('key1');
+----------------------+
| memc_get_cas('key1') |
+----------------------+
|                   81 |
+----------------------+
1 row in set (0.00 sec)

mysql> select memc_set('key1', 'test new value');
+------------------------------------+
| memc_set('key1', 'test new value') |
+------------------------------------+
|                                  1 |
+------------------------------------+
1 row in set (0.00 sec)

mysql> select memc_get_cas('key1');
+----------------------+
| memc_get_cas('key1') |
+----------------------+
|                   82 |
+----------------------+
1 row in set (0.00 sec)

mysql> select memc_get_cas('key1');
+----------------------+
| memc_get_cas('key1') |
+----------------------+
|                   83 |
+----------------------+
1 row in set (0.00 sec)

mysql> select memc_get('key1');
+----------------------------------+
| memc_get('key1')                 |
+----------------------------------+
| ah! someone else changed "key1"! |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select memc_cas('key1', 'change this value using cas', 83);
+-----------------------------------------------------+
| memc_cas('key1', 'change this value using cas', 83) |
+-----------------------------------------------------+
|                                                   1 |
+-----------------------------------------------------+
1 row in set (0.00 sec)

mysql> select memc_get('key1');
+-----------------------------+
| memc_get('key1')            |
+-----------------------------+
| change this value using cas |
+-----------------------------+
1 row in set (0.01 sec)

mysql> select memc_get_cas('key1');
+----------------------+
| memc_get_cas('key1') |
+----------------------+
|                   84 |
+----------------------+

mysql> select memc_cas('key1','this value will not change because the cas is not the 84', 83);
+---------------------------------------------------------------------------------+
| memc_cas('key1','this value will not change because the cas is not the 84', 83) |
+---------------------------------------------------------------------------------+
|                                                                               0 |
+---------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select memc_get_cas('key1');
+----------------------+
| memc_get_cas('key1') |
+----------------------+
|                   84 |
+----------------------+
1 row in set (0.00 sec)

mysql> select memc_get('key1');
+-----------------------------+
| memc_get('key1')            |
+-----------------------------+
| change this value using cas |
+-----------------------------+
1 row in set (0.00 sec)

This is convenient to know if someone else changed an item since you last updated it yourself, hence the usefulness of CAS, which is a check and set operation which means “store this data but only if no one else has updated since I last fetched it.”

Enjoy the code! You can find the release at:

http://patg.net/downloads/memcached_functions_mysql-1.1.tar.gz

10 Responses to “Memcached Functions for MySQL 1.1 released!”

  1. Pavel 09. Feb, 2011 at 7:09 pm #

    Great! I’ve been missing something like the cas functions .. thanks for the relase :)

  2. Frank Mashraqi 10. Feb, 2011 at 8:07 am #

    Sheer Awesomeness! Thanks!

  3. tim 25. Apr, 2011 at 11:23 pm #

    Hi,
    It’s very nice!
    Libmemcached 0.44 + memcached_functions_mysql-1.1 + CentOS 5
    But I can’t complete it:

    common.h:3:18: error: util.h: No such file or directory

    Do you have any idear?
    Thank you.

  4. CaptTofu 26. Apr, 2011 at 7:59 am #

    Tim,

    Hmm… Is there a util.h in the distribution? If not, try commenting that out of common.h and recompiling.

  5. Peter 31. Aug, 2011 at 7:25 pm #

    Hi! It does not help when I comment out of common.h
    You use my_string_st but I cannot find any declaration of it and the compiler complains:
    util.c:172: error: `my_string_st’ undeclared (first use in this function)

    This happens when I comment out util.h

    Please advice.

    Thank you, Peter

  6. pgalbraith 07. Sep, 2011 at 12:16 pm #

    Hi there,

    what version of libmemcached are you using?

    regards,

    Patrick

  7. Roni 25. Jan, 2012 at 7:40 am #

    Any news about the above error?

    Regards,

    Roni

  8. Roni 25. Jan, 2012 at 7:43 am #

    About the util.h include I fixed it by using:
    #include <libmemcached/util.h>

  9. Roni 01. Feb, 2012 at 5:44 am #

    I installed: libmemcached-1.0.3

    And then tryied to installed: memcached_functions_mysql-1.1

    While "configure" run fine, the make failed with:

    make[2]: Entering directory `/root/Install/mysql_memcach/memcached_functions_mysql-1.1/src’
    /bin/sh ../libtool –preserve-dup-deps –tag=CC –mode=compile gcc -DHAVE_CONFIG_H -I. -I../include -I/opt/mysql/mysql/include -g -DUNIV_LINUX -DUNIV_LINUX -g -O2 -MT util.lo -MD -MP -MF .deps/util.Tpo -c -o util.lo util.c
    libtool: compile: gcc -DHAVE_CONFIG_H -I. -I../include -I/opt/mysql/mysql/include -g -DUNIV_LINUX -DUNIV_LINUX -g -O2 -MT util.lo -MD -MP -MF .deps/util.Tpo -c util.c -fPIC -DPIC -o .libs/util.o
    util.c: In function ‘string_create’:
    util.c:172: error: invalid application of ‘sizeof’ to incomplete type ‘my_string_st’
    util.c:173: error: dereferencing pointer to incomplete type
    util.c:174: error: dereferencing pointer to incomplete type
    util.c:175: error: dereferencing pointer to incomplete type
    util.c:176: error: dereferencing pointer to incomplete type
    util.c:177: error: dereferencing pointer to incomplete type
    util.c:178: error: dereferencing pointer to incomplete type
    util.c:178: error: dereferencing pointer to incomplete type
    util.c: In function ‘string_append’:
    util.c:185: error: dereferencing pointer to incomplete type
    util.c:185: error: dereferencing pointer to incomplete type
    util.c:188: error: dereferencing pointer to incomplete type
    util.c:190: error: dereferencing pointer to incomplete type
    util.c:197: error: dereferencing pointer to incomplete type
    util.c:202: error: dereferencing pointer to incomplete type
    util.c:202: error: dereferencing pointer to incomplete type
    util.c:202: error: dereferencing pointer to incomplete type
    util.c:204: error: dereferencing pointer to incomplete type
    util.c:207: error: dereferencing pointer to incomplete type
    util.c:208: error: dereferencing pointer to incomplete type
    util.c:209: error: dereferencing pointer to incomplete type
    util.c: In function ‘free_string’:
    util.c:216: error: dereferencing pointer to incomplete type
    util.c: In function ‘string_reset’:
    util.c:222: error: dereferencing pointer to incomplete type
    util.c:222: error: dereferencing pointer to incomplete type
    util.c:223: error: dereferencing pointer to incomplete type
    util.c:224: error: dereferencing pointer to incomplete type
    util.c:224: error: dereferencing pointer to incomplete type
    make[2]: *** [util.lo] Error 1
    make[2]: Leaving directory `/root/Install/mysql_memcach/memcached_functions_mysql-1.1/src’
    make[1]: *** [all] Error 2
    make[1]: Leaving directory `/root/Install/mysql_memcach/memcached_functions_mysql-1.1/src’
    make: *** [all-recursive] Error 1

  10. Roni 06. Feb, 2012 at 2:28 am #

    Currently this is whats working in my environment:
    http://buzznt.blogspot.com/2012/02/memcached-and-udf-for-mysql-on-centos.html

Leave a Reply