File: r3_persistent.c

package info (click to toggle)
libr3 1.3.4-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, buster, stretch
  • size: 1,084 kB
  • ctags: 1,086
  • sloc: ansic: 13,117; cpp: 175; makefile: 112; sh: 64; ruby: 52
file content (54 lines) | stat: -rw-r--r-- 1,537 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "php.h"
#include "php_r3.h"
#include "r3_persistent.h"
#include "php_expandable_mux.h"

inline int persistent_store(char *key, int key_len, int list_type, void * val TSRMLS_DC)
{
    zend_rsrc_list_entry new_le;
    zend_rsrc_list_entry *le;

    // store it if it's not in persistent_list
    if ( zend_hash_find(&EG(persistent_list), key, key_len + 1, (void**) &le) == SUCCESS ) {
        zend_hash_del(&EG(persistent_list), key, key_len + 1);
    }
    new_le.type = list_type;
    new_le.ptr = val;
    return zend_hash_update(&EG(persistent_list), key, key_len + 1, (void *) &new_le, sizeof(zend_rsrc_list_entry), NULL);
}

inline void * persistent_fetch(char *key, int key_len TSRMLS_DC)
{
    zend_rsrc_list_entry *le;
    if ( zend_hash_find(&EG(persistent_list), key, key_len + 1, (void**) &le) == SUCCESS ) {
        return le->ptr;
    }
    return NULL;
}


inline void * r3_persistent_fetch(char *ns, char *key TSRMLS_DC)
{
    char *newkey;
    int   newkey_len;
    void *ptr;
    newkey_len = spprintf(&newkey, 0, "r3_%s_%s", ns, key);
    ptr = persistent_fetch(newkey, newkey_len TSRMLS_CC);
    efree(newkey);
    return ptr;
}

/*
 * Store persistent value with r3 namespace.
 */
inline int r3_persistent_store(char *ns, char *key, int list_type, void * val TSRMLS_DC) 
{
    char *newkey;
    int   newkey_len;
    int   status;
    newkey_len = spprintf(&newkey, 0, "r3_%s_%s", ns, key);
    status = persistent_store(newkey, newkey_len, list_type, val TSRMLS_CC);
    efree(newkey);
    return status;
}