[217] | 1 | <?xml version="1.0" encoding="iso-8859-1"?>
|
---|
| 2 | <!DOCTYPE chapter PUBLIC "-//Samba-Team//DTD DocBook V4.2-Based Variant V1.0//EN" "http://www.samba.org/samba/DTD/samba-doc">
|
---|
| 3 | <chapter id="gencache">
|
---|
| 4 | <chapterinfo>
|
---|
| 5 | <author>
|
---|
| 6 | <firstname>Rafal</firstname><surname>Szczesniak</surname>
|
---|
| 7 | </author>
|
---|
| 8 | <pubdate>April 2003</pubdate>
|
---|
| 9 | </chapterinfo>
|
---|
| 10 |
|
---|
| 11 | <title>General cache mechanism and API</title>
|
---|
| 12 |
|
---|
| 13 | <sect1>
|
---|
| 14 | <title>Abstract</title>
|
---|
| 15 | <para>
|
---|
| 16 | General cache (gencache) was designed to combine various kinds of caching
|
---|
| 17 | mechanisms into one, defined by a simple API. This way, anyone can use it
|
---|
| 18 | to create their own caching layer on top of gencache. An example of
|
---|
| 19 | such approach is the netbios name cache.
|
---|
| 20 | </para>
|
---|
| 21 | </sect1>
|
---|
| 22 |
|
---|
| 23 | <sect1>
|
---|
| 24 | <title>The mechanism</title>
|
---|
| 25 | <para>
|
---|
| 26 | Gencache utilises <emphasise>tdb</emphasise> database, like many other
|
---|
| 27 | parts of Samba. As its origins are in Berkeley DB implementation, it
|
---|
| 28 | uses key/value pairs stored in binary file. The values gencache
|
---|
| 29 | operates on are string-based, however. This makes very easy to use it
|
---|
| 30 | in command line environment eg. to quickly take a look at what's in
|
---|
| 31 | the cache or set some value.
|
---|
| 32 | </para>
|
---|
| 33 |
|
---|
| 34 | <para>
|
---|
| 35 | All the data is stored in <filename>gencache.tdb</filename>
|
---|
| 36 | file. Records put there are in key/value format as mentioned below,
|
---|
| 37 | but as it's a cache, the timeout plays also important role and has a
|
---|
| 38 | special place in the key/value pair, as well as API.
|
---|
| 39 | </para>
|
---|
| 40 | </sect1>
|
---|
| 41 |
|
---|
| 42 |
|
---|
| 43 | <sect1>
|
---|
| 44 | <title>The data structure</title>
|
---|
| 45 | <para>
|
---|
| 46 | The record stored in <filename>gencache.tdb</filename> file consists
|
---|
| 47 | of the key, the value and the expiration timeout. While the first part
|
---|
| 48 | is stored completely independent from the others, the last two are
|
---|
| 49 | kept together. The form the record has is:
|
---|
| 50 | </para>
|
---|
| 51 |
|
---|
| 52 | <para><programlisting>
|
---|
| 53 | key: <string>
|
---|
| 54 | value: <12-digit timeout>/<string>
|
---|
| 55 | </programlisting></para>
|
---|
| 56 |
|
---|
| 57 | <para>The timeout part is the ASCII representation of
|
---|
| 58 | <emphasis>time_t</emphasis> value of the time when the cache entry
|
---|
| 59 | expires. Obviously the API, the programmer is provided with, hides this detail,
|
---|
| 60 | so that you don't have to care about checking it. Simply watch
|
---|
| 61 | carefully the return status of the function.
|
---|
| 62 | </para>
|
---|
| 63 | </sect1>
|
---|
| 64 |
|
---|
| 65 | <sect1>
|
---|
| 66 | <title>The API</title>
|
---|
| 67 |
|
---|
| 68 | <para><programlisting>
|
---|
| 69 | BOOL gencache_init()
|
---|
| 70 | </programlisting></para>
|
---|
| 71 |
|
---|
| 72 | <para>This is used to initialise to whole caching mechanism. It means
|
---|
| 73 | opening the file or creating it if non-existing. If it's already been
|
---|
| 74 | opened earlier, then the routine just does nothing and returns
|
---|
| 75 | <constant>true</constant>. If something goes wrong, say the user
|
---|
| 76 | doesn't have necessary rights, the function returns
|
---|
| 77 | <constant>false</constant>.</para>
|
---|
| 78 |
|
---|
| 79 | <para><programlisting>
|
---|
| 80 | BOOL gencache_shutdown()
|
---|
| 81 | </programlisting></para>
|
---|
| 82 |
|
---|
| 83 | <para>This is the proper way to close the cache file. It simply
|
---|
| 84 | returns <constant>true</constant> after successful closing file and
|
---|
| 85 | <constant>false</constant> upon a failure.</para>
|
---|
| 86 |
|
---|
| 87 | <para><programlisting>
|
---|
| 88 | BOOL gencache_set(const char* keystr, const char* value, time_t timeout)
|
---|
| 89 | </programlisting></para>
|
---|
| 90 |
|
---|
| 91 | <para>This is one of the most basic functions. What it allows you to
|
---|
| 92 | do is to set some particular cache entry. If the entry haven't
|
---|
| 93 | existed yet, the function will act just as it was "gencache_add"
|
---|
| 94 | function. If it's already been in the cache, the entry will be set to
|
---|
| 95 | the new value. In either case, the cache entry will be set with given
|
---|
| 96 | key, value and timeout. Thus it is comfortable way to just set the
|
---|
| 97 | entry and not care about the details.</para>
|
---|
| 98 |
|
---|
| 99 | <para><programlisting>
|
---|
| 100 | BOOL gencache_set_only(const char* keystr, const char* value, time_t timeout)
|
---|
| 101 | </programlisting></para>
|
---|
| 102 |
|
---|
| 103 | <para><programlisting>
|
---|
| 104 | BOOL gencache_del(const char* keystr)
|
---|
| 105 | </programlisting></para>
|
---|
| 106 |
|
---|
| 107 | <para><programlisting>
|
---|
| 108 | BOOL gencache_get(const char* keystr, char** valstr, time_t* timeout)
|
---|
| 109 | </programlisting></para>
|
---|
| 110 |
|
---|
| 111 | <para><programlisting>
|
---|
| 112 | void gencache_iterate(void (*fn)(const char* key, const char *value, time_t timeout, void* dptr),
|
---|
| 113 | void* data, const char* keystr_pattern)
|
---|
| 114 |
|
---|
| 115 | </programlisting></para>
|
---|
| 116 |
|
---|
| 117 | </sect1>
|
---|
| 118 |
|
---|
| 119 | </chapter>
|
---|