]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slap.h
Update of back-bdb2 to KDZ's new entry lock schema.
[openldap] / servers / slapd / slap.h
index fbce7eba8e81e8626cd26a62e11cb77c6e6dda7b..786702b2e4590cf4b33eb5926b3d610f30114d24 100644 (file)
 #define ldap_debug slap_debug
 #endif
 
+#ifdef SLAPD_BDB2
+extern int bdb2i_do_timing;
+#endif
+
+
 #include "ldap_log.h"
 
 #include "../../libraries/liblber/lber-int.h"
 #include "ldap.h"
 
-#include "lthread.h"
-#include "lthread_rdwr.h"
+#include "ldap_pvt_thread.h"
 #include "ldif.h"
 #ifdef f_next
 #undef f_next /* name conflict between sys/file.h on SCO and struct filter */
 
 #define MAXREMATCHES 10
 
+#define DNSEPARATOR(c) ((c) == ',' || (c) == ';')
+#define SEPARATOR(c)   ((c) == ',' || (c) == ';' || (c) == '+')
+#define SPACE(c)       ((c) == ' ' || (c) == '\n')
+#define NEEDSESCAPE(c) ((c) == '\\' || (c) == '"')
+
 LDAP_BEGIN_DECL
 
 extern int slap_debug;
 
-struct op;
-struct conn;
+struct slap_op;
+struct slap_conn;
 
 /*
  * represents an attribute value assertion (i.e., attr=value)
@@ -129,20 +138,19 @@ typedef unsigned long     ID;
  * represents an entry in core
  */
 typedef struct entry {
-       char            *e_dn;          /* DN of this entry               */
-       Attribute       *e_attrs;       /* list of attributes + values    */
-
-       ID              e_id;           /* id of this entry - this should */
-                                       /* really be private to back-ldbm */
-       char            e_state;        /* for the cache                  */
-
-       pthread_rdwr_t  e_rdwr; /* reader/writer lock             */
-
-#define ENTRY_STATE_DELETED    1
-#define ENTRY_STATE_CREATING   2
-       int             e_refcnt;       /* # threads ref'ing this entry   */
-       struct entry    *e_lrunext;     /* for cache lru list             */
-       struct entry    *e_lruprev;
+       /*
+        * The ID field should only be changed before entry is
+        * inserted into a cache.  The ID value is backend
+        * specific.
+        */
+       ID              e_id;
+
+       char            *e_dn;          /* DN of this entry */
+       char            *e_ndn;         /* normalized DN of this entry */
+       Attribute       *e_attrs;       /* list of attributes + values */
+
+       /* for use by the backend for any purpose */
+       void*   e_private;
 } Entry;
 
 /*
@@ -151,24 +159,24 @@ typedef struct entry {
 
 /* the "by" part */
 struct access {
+#define ACL_NONE       0x01
+#define ACL_COMPARE    0x02
+#define ACL_SEARCH     0x04
+#define ACL_READ       0x08
+#define ACL_WRITE      0x10
+#define ACL_SELF       0x40
+       int                     a_access;
+
        char            *a_dnpat;
        char            *a_addrpat;
        char            *a_domainpat;
        char            *a_dnattr;
-       long            a_access;
 
 #ifdef SLAPD_ACLGROUPS
         char           *a_group;
         char           *a_objectclassvalue;
         char           *a_groupattrname;
 #endif
-
-#define ACL_NONE       0x01
-#define ACL_COMPARE    0x02
-#define ACL_SEARCH     0x04
-#define ACL_READ       0x08
-#define ACL_WRITE      0x10
-#define ACL_SELF       0x40
        struct access   *a_next;
 };
 
@@ -210,61 +218,176 @@ struct objclass {
 };
 
 /*
- * represents a "database"
+ * Backend-info
+ * represents a backend 
  */
 
-typedef struct backend Backend;
-struct backend {
+typedef struct backend_info BackendInfo;       /* per backend type */
+typedef struct backend_db BackendDB;           /* per backend database */
+
+extern int nBackendInfo;
+extern int nBackendDB;
+extern BackendInfo     *backendInfo;
+extern BackendDB       *backendDB;
+
+extern int                     slapMode;       
+#define SLAP_UNDEFINED_MODE    0
+#define SLAP_SERVER_MODE       1
+#define SLAP_TOOL_MODE         2
+
+/* temporary aliases */
+typedef BackendDB Backend;
+#define nbackends nBackendDB
+#define backends backendDB
+
+struct backend_db {
+       BackendInfo     *bd_info;       /* pointer to shared backend info */
+
+       /* BackendInfo accessors */
+#define                be_config       bd_info->bi_db_config
+#define                be_type         bd_info->bi_type
+
+#define                be_bind         bd_info->bi_op_bind
+#define                be_unbind       bd_info->bi_op_unbind
+#define                be_add          bd_info->bi_op_add
+#define                be_compare      bd_info->bi_op_compare
+#define                be_delete       bd_info->bi_op_delete
+#define                be_modify       bd_info->bi_op_modify
+#define                be_modrdn       bd_info->bi_op_modrdn
+#define                be_search       bd_info->bi_op_search
+
+#define                be_group        bd_info->bi_acl_group
+
+       /* these should be renamed from be_ to bd_ */
        char    **be_suffix;    /* the DN suffixes of data in this backend */
-        char    **be_suffixAlias;       /* the DN suffix aliases of data in this backend */
-       char    *be_rootdn;     /* the magic "root" dn for this db         */
-       char    *be_rootpw;     /* the magic "root" password for this db   */
+       char    **be_suffixAlias;       /* the DN suffix aliases of data in this backend */
+       char    *be_root_dn;    /* the magic "root" dn for this db      */
+       char    *be_root_ndn;   /* the magic "root" normalized dn for this db   */
+       char    *be_root_pw;    /* the magic "root" password for this db        */
        int     be_readonly;    /* 1 => db is in "read only" mode          */
-        int     be_maxDerefDepth;       /* limit for depth of an alias deref  */
+       int     be_maxDerefDepth;       /* limit for depth of an alias deref  */
        int     be_sizelimit;   /* size limit for this backend             */
        int     be_timelimit;   /* time limit for this backend             */
        struct acl *be_acl;     /* access control list for this backend    */
        int     be_dfltaccess;  /* access given if no acl matches          */
        char    **be_replica;   /* replicas of this backend (in master)    */
        char    *be_replogfile; /* replication log file (in master)        */
-       char    *be_updatedn;   /* allowed to make changes (in replicas)   */
+       char    *be_update_ndn; /* allowed to make changes (in replicas)   */
        int     be_lastmod;     /* keep track of lastmodified{by,time}     */
-       char    *be_type;       /* type of database                        */
-
-       void    *be_private;    /* anything the backend needs              */
-
-       /* backend routines */
-       int     (*be_bind)   LDAP_P((Backend *be, struct conn *c, struct op *o, char *dn, int method, struct berval *cred ));
-       void    (*be_unbind) LDAP_P((Backend *be, struct conn *c, struct op *o ));
-       int     (*be_search) LDAP_P((Backend *be, struct conn *c, struct op *o, char *base, int scope, int deref, int slimit, int tlimit, Filter *f, char *filterstr, char **attrs, int attrsonly));
-       int     (*be_compare)LDAP_P((Backend *be, struct conn *c, struct op *o, char *dn, Ava *ava));
-       int     (*be_modify) LDAP_P((Backend *be, struct conn *c, struct op *o, char *dn, LDAPModList *m));
-       int     (*be_modrdn) LDAP_P((Backend *be, struct conn *c, struct op *o, char *dn, char *newrdn, int deleteoldrdn ));
-       int     (*be_add)    LDAP_P((Backend *be, struct conn *c, struct op *o, Entry *e));
-       int     (*be_delete) LDAP_P((Backend *be, struct conn *c, struct op *o, char *dn));
-       /* Bug: be_abandon in unused! */
-       void    (*be_abandon)LDAP_P((Backend *be, struct conn *c, struct op *o, int msgid));
-       void    (*be_config) LDAP_P((Backend *be, char *fname, int lineno, int argc, char **argv ));
-       void    (*be_init)   LDAP_P((Backend *be));
-       void    (*be_close)  LDAP_P((Backend *be));
 
+       void    *be_private;    /* anything the backend database needs     */
+};
+
+struct backend_info {
+       char    *bi_type;       /* type of backend */
+
+       /*
+        * per backend type routines:
+        * bi_init: called to allocate a backend_info structure,
+        *              called once BEFORE configuration file is read.
+        *              bi_init() initializes this structure hence is
+        *              called directly from be_initialize()
+        * bi_config: called per 'backend' specific option
+        *              all such options must before any 'database' options
+        *              bi_config() is called only from read_config()
+        * bi_open: called to open each database, called
+        *              once AFTER configuration file is read but
+        *              BEFORE any bi_db_open() calls.
+        *              bi_open() is called from backend_startup()
+        * bi_close: called to close each database, called
+        *              once during shutdown after all bi_db_close calls.
+        *              bi_close() is called from backend_shutdown()
+        * bi_destroy: called to destroy each database, called
+        *              once during shutdown after all bi_db_destroy calls.
+        *              bi_destory() is called from backend_destroy()
+        */
+       int (*bi_init)  LDAP_P((BackendInfo *bi));
+       int     (*bi_config) LDAP_P((BackendInfo *bi,
+               char *fname, int lineno, int argc, char **argv ));
+       int (*bi_open) LDAP_P((BackendInfo *bi));
+       int (*bi_close) LDAP_P((BackendInfo *bi));
+       int (*bi_destroy) LDAP_P((BackendInfo *bi));
+
+       /*
+        * per database routines:
+        * bi_db_init: called to initialize each database,
+        *      called upon reading 'database <type>' 
+        *      called only from backend_db_init()
+        * bi_db_config: called to configure each database,
+        *  called per database to handle per database options
+        *      called only from read_config()
+        * bi_db_open: called to open each database
+        *      called once per database immediately AFTER bi_open()
+        *      calls but before daemon startup.
+        *  called only by backend_startup()
+        * bi_db_close: called to close each database
+        *      called once per database during shutdown but BEFORE
+        *  any bi_close call.
+        *  called only by backend_shutdown()
+        * bi_db_destroy: called to destroy each database
+        *  called once per database during shutdown AFTER all
+        *  bi_close calls but before bi_destory calls.
+        *  called only by backend_destory()
+        */
+       int (*bi_db_init) LDAP_P((Backend *bd));
+       int     (*bi_db_config) LDAP_P((Backend *bd,
+               char *fname, int lineno, int argc, char **argv ));
+       int (*bi_db_open) LDAP_P((Backend *bd));
+       int (*bi_db_close) LDAP_P((Backend *bd));
+       int (*bi_db_destroy) LDAP_P((Backend *db));
+
+       /* LDAP Operations Handling Routines */
+       int     (*bi_op_bind)  LDAP_P(( BackendDB *bd,
+               struct slap_conn *c, struct slap_op *o,
+               char *dn, int method, struct berval *cred, char** edn ));
+       int (*bi_op_unbind) LDAP_P((BackendDB *bd,
+               struct slap_conn *c, struct slap_op *o ));
+       int     (*bi_op_search) LDAP_P((BackendDB *bd,
+               struct slap_conn *c, struct slap_op *o,
+               char *base, int scope, int deref, int slimit, int tlimit,
+               Filter *f, char *filterstr, char **attrs, int attrsonly));
+       int     (*bi_op_compare)LDAP_P((BackendDB *bd,
+               struct slap_conn *c, struct slap_op *o,
+               char *dn, Ava *ava));
+       int     (*bi_op_modify) LDAP_P((BackendDB *bd,
+               struct slap_conn *c, struct slap_op *o,
+               char *dn, LDAPModList *m));
+       int     (*bi_op_modrdn) LDAP_P((BackendDB *bd,
+               struct slap_conn *c, struct slap_op *o,
+               char *dn, char *newrdn, int deleteoldrdn ));
+       int     (*bi_op_add)    LDAP_P((BackendDB *bd,
+               struct slap_conn *c, struct slap_op *o,
+               Entry *e));
+       int     (*bi_op_delete) LDAP_P((BackendDB *bd,
+               struct slap_conn *c, struct slap_op *o,
+               char *dn));
+       /* Bug: be_op_abandon in unused! */
+       int     (*bi_op_abandon) LDAP_P((BackendDB *bd,
+               struct slap_conn *c, struct slap_op *o,
+               int msgid));
+
+       /* Auxilary Functions */
 #ifdef SLAPD_ACLGROUPS
-       int     (*be_group)  LDAP_P((Backend *be, char *bdn, char *edn, char *objectclassValue, char *groupattrName ));
+       int     (*bi_acl_group)  LDAP_P((Backend *bd,
+               Entry *e, char *bdn, char *edn,
+               char *objectclassValue, char *groupattrName ));
 #endif
+
+       unsigned int bi_nDB;    /* number of databases of this type */
+       void    *bi_private;    /* anything the backend type needs */
 };
 
 /*
  * represents an operation pending from an ldap client
  */
 
-typedef struct op {
+typedef struct slap_op {
        BerElement      *o_ber;         /* ber of the request             */
        long            o_msgid;        /* msgid of the request           */
        unsigned long   o_tag;          /* tag of the request             */
        time_t          o_time;         /* time op was initiated          */
        char            *o_dn;          /* dn bound when op was initiated */
-        char            *o_suffix;      /* suffix if aliased              */
-        char            *o_suffixAliased;       /* pending suffix translation     */
+       char            *o_ndn;         /* normalized dn bound when op was initiated */
        int             o_authtype;     /* auth method used to bind dn    */
                                        /* values taken from ldap.h       */
                                        /* LDAP_AUTH_*                    */
@@ -275,22 +398,24 @@ typedef struct op {
        struct sockaddr o_clientaddr;   /* client address if via CLDAP    */
        char            o_searchbase;   /* search base if via CLDAP       */
 #endif
-       struct op       *o_next;        /* next operation pending         */
-       pthread_t       o_tid;          /* thread handling this op        */
+       struct slap_op  *o_next;        /* next operation pending         */
+       ldap_pvt_thread_t       o_tid;          /* thread handling this op        */
        int             o_abandon;      /* signals op has been abandoned  */
-       pthread_mutex_t o_abandonmutex; /* signals op has been abandoned  */
+       ldap_pvt_thread_mutex_t o_abandonmutex; /* signals op has been abandoned  */
 
-       int             o_private;      /* anything the backend needs     */
+       void    *o_private;     /* anything the backend needs     */
 } Operation;
 
 /*
  * represents a connection from an ldap client
  */
 
-typedef struct conn {
+typedef struct slap_conn {
        Sockbuf         c_sb;           /* ber connection stuff           */
-       char            *c_dn;          /* current DN bound to this conn  */
-       pthread_mutex_t c_dnmutex;      /* mutex for c_dn field           */
+       char            *c_cdn;         /* DN provided by the client */
+       char            *c_dn;          /* DN bound to this conn  */
+       ldap_pvt_thread_mutex_t c_dnmutex;      /* mutex for c_dn field           */
+       int             c_protocol;     /* version of the LDAP protocol used by client */
        int             c_authtype;     /* auth method used to bind c_dn  */
 #ifdef LDAP_COMPAT
        int             c_version;      /* for compatibility w/2.0, 3.0   */
@@ -298,9 +423,9 @@ typedef struct conn {
        char            *c_addr;        /* address of client on this conn */
        char            *c_domain;      /* domain of client on this conn  */
        Operation       *c_ops;         /* list of pending operations     */
-       pthread_mutex_t c_opsmutex;     /* mutex for c_ops list & stats   */
-       pthread_mutex_t c_pdumutex;     /* only one pdu written at a time */
-       pthread_cond_t  c_wcv;          /* used to wait for sd write-ready*/
+       ldap_pvt_thread_mutex_t c_opsmutex;     /* mutex for c_ops list & stats   */
+       ldap_pvt_thread_mutex_t c_pdumutex;     /* only one pdu written at a time */
+       ldap_pvt_thread_cond_t  c_wcv;          /* used to wait for sd write-ready*/
        int             c_gettingber;   /* in the middle of ber_get_next  */
        BerElement      *c_currentber;  /* ber we're getting              */
        int             c_writewaiter;  /* signals write-ready sd waiter  */