Annotation of parser3/src/types/pa_vmemcached.C, revision 1.1

1.1     ! moko        1: /** @file
        !             2:        Parser: memcached class.
        !             3: 
        !             4:        Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com)
        !             5:        Authors:
        !             6:                Ivan Poluyanov <ivan-poluyanov@yandex.ru>
        !             7:                Artem Stepanov <timofei1394@thesecure.in>
        !             8: */
        !             9: 
        !            10: #include "pa_vmemcached.h"
        !            11: #include "pa_value.h"
        !            12: #include "pa_vstring.h"
        !            13: #include "pa_vvoid.h"
        !            14: 
        !            15: volatile const char * IDENT_PA_VMEMCACHED_C="$Id: pa_vmemcached.C,v 1.19 2012-03-16 09:24:18 moko Exp $" IDENT_PA_VMEMCACHED_H;
        !            16: 
        !            17: #ifdef WIN32
        !            18: const char *memcached_library="libmemcached.dll";
        !            19: #else
        !            20: const char *memcached_library="libmemcached.so";
        !            21: #endif
        !            22: 
        !            23: void error(const char *step, memcached_st* m, memcached_return rc) {
        !            24:        const char* str=f_memcached_strerror(m, rc);
        !            25:        throw Exception("memcached", 0, "%s error: %s (%d)", step, str ? str : "<unknown>", rc);
        !            26: }
        !            27: 
        !            28: inline void check(const char *step, memcached_st* m, memcached_return rc) {
        !            29:        if(rc==MEMCACHED_SUCCESS)
        !            30:                return;
        !            31:        error(step, m, rc);
        !            32: }
        !            33: 
        !            34: void VMemcached::open(const String& connect_string, size_t aflags){
        !            35:        const char *library = memcached_library;
        !            36:        const char *memcached_status = memcached_load(library);
        !            37: 
        !            38:        if(memcached_status)
        !            39:                throw Exception("memcached", 0, "failed to load memcached library %s: %s", library, memcached_status);
        !            40: 
        !            41:        if(connect_string.is_empty())
        !            42:                throw Exception("memcached", 0, "server name must not be empty");
        !            43: 
        !            44:        fflags=aflags;
        !            45: 
        !            46:        fm=f_memcached_create(NULL);
        !            47: 
        !            48:        memcached_server_st* fservers = f_memcached_servers_parse(connect_string.cstr());
        !            49:        check("server_push", fm, f_memcached_server_push(fm, fservers));
        !            50: }
        !            51: 
        !            52: void VMemcached::remove(const String& aname){
        !            53:        if(aname.is_empty())
        !            54:                throw Exception("memcached", 0, "key must not be empty");
        !            55:        const char* key_cstr=aname.cstr();
        !            56: 
        !            57:        memcached_return rc=f_memcached_delete(fm, key_cstr, strlen(key_cstr), (time_t)0);
        !            58:        if(rc != MEMCACHED_SUCCESS && rc != MEMCACHED_NOTFOUND)
        !            59:                error("delete", fm, rc);
        !            60: }
        !            61: 
        !            62: Value* VMemcached::get_element(const String& aname) {
        !            63:        if(Value *result=VStateless_object::get_element(aname))
        !            64:                return result;
        !            65: 
        !            66:        const char* key=aname.cstr();
        !            67: 
        !            68:        size_t length;
        !            69:        memcached_return rc;
        !            70:        const char* val=f_memcached_get(fm, key, strlen(key), &length, &fflags, &rc);
        !            71: 
        !            72:        if(rc==MEMCACHED_SUCCESS)
        !            73:                return new VString(*new String(val, String::L_TAINTED, length));
        !            74:        else if(rc==MEMCACHED_NOTFOUND)
        !            75:                return new VVoid();
        !            76: 
        !            77:        error("get", fm, rc);
        !            78:        return 0; // calm down compiler
        !            79: }
        !            80: 
        !            81: 
        !            82: const VJunction* VMemcached::put_element(const String& aname, Value* avalue, bool /*replace*/){
        !            83:        if(aname.is_empty())
        !            84:                throw Exception("memcached", 0, "key must not be empty");
        !            85: 
        !            86:        Value* lvalue=0;
        !            87:        time_t ttl=0;
        !            88: 
        !            89:        if(HashStringValue* hash=avalue->get_hash()) {
        !            90:                if(Value* ttl_value=hash->get(expires_name))
        !            91:                        ttl=ttl_value->as_int();
        !            92:                if(lvalue=hash->get(value_name)){
        !            93:                        if(lvalue->get_junction())
        !            94:                                throw Exception("memcached", 0, VALUE_NAME " must not be code");
        !            95:                } else
        !            96:                        throw Exception("memcached", &aname, "put hash value must contain ." VALUE_NAME);
        !            97:        } else {
        !            98:                lvalue=avalue;
        !            99:        }
        !           100: 
        !           101:        const char* key=aname.cstr();
        !           102:        size_t key_size=strlen(key);
        !           103: 
        !           104:        if(key_size >= MEMCACHED_MAX_KEY)
        !           105:                throw Exception("memcached", 0, "key length exceeds limit (%d bytes)", MEMCACHED_MAX_KEY-1);
        !           106: 
        !           107:        const char* value = avalue->as_string().cstr();
        !           108:        size_t value_size=strlen(value);
        !           109: 
        !           110:        check("set", fm, f_memcached_set(
        !           111:                        fm,
        !           112:                        key,
        !           113:                        key_size,
        !           114:                        value,
        !           115:                        value_size,
        !           116:                        ttl,
        !           117:                        fflags));
        !           118: 
        !           119:        return PUT_ELEMENT_REPLACED_ELEMENT;
        !           120: }
        !           121: 

E-mail: