#include "ldbm.h"
+LDAP_BEGIN_DECL
+
#define DEFAULT_CACHE_SIZE 1000
-#define DEFAULT_DBCACHE_SIZE 100000
+
+#ifdef HAVE_BERKELEY_DB2
+# define DEFAULT_DBCACHE_SIZE (100 * DEFAULT_DB_PAGE_SIZE)
+#else
+# define DEFAULT_DBCACHE_SIZE 100000
+#endif
+
#define DEFAULT_DB_DIRECTORY "/usr/tmp"
#define DEFAULT_MODE 0600
#define SUB_PREFIX '*' /* prefix for substring keys */
#define CONT_PREFIX '\\' /* prefix for continuation keys */
+#define UNKNOWN_PREFIX '?' /* prefix for unknown keys */
+
#define DEFAULT_BLOCKSIZE 8192
/*
* the list is terminated by an id of NOID.
* b_ids a list of the actual ids themselves
*/
-typedef struct block {
- ID b_nmax; /* max number of ids in this list */
-#define ALLIDSBLOCK 0 /* == 0 => this is an allid block */
- ID b_nids; /* current number of ids used */
-#define INDBLOCK 0 /* == 0 => this is an indirect blk */
- ID b_ids[1]; /* the ids - actually bigger */
-} Block, IDList;
-#define ALLIDS( idl ) ((idl)->b_nmax == ALLIDSBLOCK)
-#define INDIRECT_BLOCK( idl ) ((idl)->b_nids == INDBLOCK)
+typedef ID ID_BLOCK;
+
+#define ID_BLOCK_NMAX_OFFSET 0
+#define ID_BLOCK_NIDS_OFFSET 1
+#define ID_BLOCK_IDS_OFFSET 2
+
+/* all ID_BLOCK macros operate on a pointer to a ID_BLOCK */
+
+#define ID_BLOCK_NMAX(b) ((b)[ID_BLOCK_NMAX_OFFSET])
+#define ID_BLOCK_NIDS(b) ((b)[ID_BLOCK_NIDS_OFFSET])
+#define ID_BLOCK_ID(b, n) ((b)[ID_BLOCK_IDS_OFFSET+(n)])
+
+#define ID_BLOCK_NOID(b, n) (ID_BLOCK_ID((b),(n)) == NOID)
+
+#define ID_BLOCK_ALLIDS_VALUE 0
+#define ID_BLOCK_ALLIDS(b) (ID_BLOCK_NMAX(b) == ID_BLOCK_ALLIDS_VALUE)
+
+#define ID_BLOCK_INDIRECT_VALUE 0
+#define ID_BLOCK_INDIRECT(b) (ID_BLOCK_NIDS(b) == ID_BLOCK_INDIRECT_VALUE)
/* for the in-core cache of entries */
struct cache {
Avlnode *c_idtree;
Entry *c_lruhead; /* lru - add accessed entries here */
Entry *c_lrutail; /* lru - rem lru entries from here */
- pthread_mutex_t c_mutex;
+ ldap_pvt_thread_mutex_t c_mutex;
};
/* for the cache of open index files */
struct dbcache {
- char *dbc_name;
int dbc_refcnt;
- time_t dbc_lastref;
- pthread_mutex_t dbc_mutex;
- pthread_cond_t dbc_cv;
- int dbc_readers;
- long dbc_blksize;
int dbc_maxids;
int dbc_maxindirect;
- LDBM dbc_db;
+ time_t dbc_lastref;
+ long dbc_blksize;
+ char *dbc_name;
+ LDBM dbc_db;
};
/* for the cache of attribute information (which are indexed, etc.) */
#define MAXDBCACHE 10
+/* this could be made an option */
+#ifndef SLAPD_NEXTID_CHUNK
+#define SLAPD_NEXTID_CHUNK 32
+#endif
+
struct ldbminfo {
ID li_nextid;
- pthread_mutex_t li_nextid_mutex;
+#if SLAPD_NEXTID_CHUNK > 1
+ ID li_nextid_wrote;
+#endif
+ char *li_nextid_file;
+ ldap_pvt_thread_mutex_t li_root_mutex;
+ ldap_pvt_thread_mutex_t li_add_mutex;
+ ldap_pvt_thread_mutex_t li_nextid_mutex;
int li_mode;
char *li_directory;
struct cache li_cache;
Avlnode *li_attrs;
int li_dbcachesize;
+ int li_dbcachewsync;
struct dbcache li_dbcache[MAXDBCACHE];
- pthread_mutex_t li_dbcache_mutex;
- pthread_cond_t li_dbcache_cv;
+ ldap_pvt_thread_mutex_t li_dbcache_mutex;
+ ldap_pvt_thread_cond_t li_dbcache_cv;
};
-#ifdef NEEDPROTOS
#include "proto-back-ldbm.h"
-#endif
+
+LDAP_END_DECL
#endif /* _back_ldbm_h_ */