1 #ifndef NDBMEMCACHE_KEYPREFIX_H
2 #define NDBMEMCACHE_KEYPREFIX_H
3 
4 #include <stdio.h>
5 
6 /***** This section defines a data structures available to C. ***/
7 /* The prefix_info_t is the compacted form of the parts of the
8    KeyPrefix that must be available to C code.
9 */
10 
11 /* The value of 13 imposes a limit of 8,192 prefixes */
12 #define KEY_PREFIX_BITS 13
13 #define MAX_KEY_PREFIXES ( 1 << KEY_PREFIX_BITS )
14 
15 /* The value of 4 imposes a limit of 16 clusters */
16 #define CLUSTER_ID_BITS 4
17 #define MAX_CLUSTERS ( 1 << CLUSTER_ID_BITS )
18 
19 typedef struct ndb_prefix_bitfield {
20   unsigned usable         : 1;
21   unsigned use_ndb        : 1;
22   unsigned _unused1       : 1;
23   unsigned prefix_id      : KEY_PREFIX_BITS;
24 
25   unsigned do_mc_read     : 1;
26   unsigned do_db_read     : 1;
27   unsigned do_mc_write    : 1;
28   unsigned do_db_write    : 1;
29   unsigned do_mc_delete   : 1;
30   unsigned do_db_delete   : 1;
31   unsigned do_db_flush    : 1;
32   unsigned has_cas_col    : 1;
33 
34   unsigned has_flags_col  : 1;
35   unsigned has_expire_col : 1;
36   unsigned has_math_col   : 1;
37   unsigned cluster_id     : CLUSTER_ID_BITS;
38 } prefix_info_t;
39 
40 
41 /***** This section is available to C++ only. ***/
42 #ifdef __cplusplus
43 
44 #include <sys/types.h>
45 #include <string.h>
46 #include <stdlib.h>
47 
48 #include "TableSpec.h"
49 
50 class KeyPrefix {
51 public:
52   /* public methods */
53   KeyPrefix(const char *name);
54   KeyPrefix(const KeyPrefix &);
55   ~KeyPrefix();
56   int cmp(const char *key, int nkey);
57   void dump(FILE *) const;
58 
59   /* public instance variables */
60   TableSpec *table;
61   prefix_info_t info;
62   const char *prefix;
63   const size_t prefix_len;
64 };
65 
66 
67 /**** Inline methods for KeyPrefix ****/
cmp(const char * key,int nkey)68 inline int KeyPrefix::cmp(const char *key, int nkey) {
69   return strncmp(prefix, key, prefix_len);
70 };
71 
72 #endif
73 
74 #endif
75 
76