/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software .
*
* Copyright 2008-2022 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted only as authorized by the OpenLDAP
* Public License.
*
* A copy of this license is available in the file LICENSE in the
* top-level directory of the distribution or, alternatively, at
* .
*/
/* ACKNOWLEDGEMENTS:
* This work was initially developed by Howard Chu for inclusion
* in OpenLDAP Software. This work was sponsored by MySQL.
*/
#ifndef SLAPD_NDB_H
#define SLAPD_NDB_H
#include "slap.h"
#include
#include
LDAP_BEGIN_DECL
/* The general design is to use one relational table per objectclass. This is
* complicated by objectclass inheritance and auxiliary classes though.
*
* Attributes must only occur in a single table. For objectclasses that inherit
* from other classes, attributes defined in the superior class are only stored
* in the superior class' table. When multiple unrelated classes define the same
* attributes, an attributeSet should be defined instead, containing all of the
* common attributes.
*
* The no_set table lists which other attributeSets apply to the current
* objectClass. The no_attrs table lists all of the non-inherited attributes of
* the class, including those residing in an attributeSet.
*
* Usually the table is named identically to the objectClass, but it can also
* be explicitly named something else if needed.
*/
#define NDB_MAX_OCSETS 8
struct ndb_attrinfo;
typedef struct ndb_ocinfo {
struct berval no_name; /* objectclass cname */
struct berval no_table;
ObjectClass *no_oc;
struct ndb_ocinfo *no_sets[NDB_MAX_OCSETS];
struct ndb_attrinfo **no_attrs;
int no_flag;
int no_nsets;
int no_nattrs;
} NdbOcInfo;
#define NDB_INFO_ATLEN 0x01
#define NDB_INFO_ATSET 0x02
#define NDB_INFO_INDEX 0x04
#define NDB_INFO_ATBLOB 0x08
typedef struct ndb_attrinfo {
struct berval na_name; /* attribute cname */
AttributeDescription *na_desc;
AttributeType *na_attr;
NdbOcInfo *na_oi;
int na_flag;
int na_len;
int na_column;
int na_ixcol;
} NdbAttrInfo;
typedef struct ListNode {
struct ListNode *ln_next;
void *ln_data;
} ListNode;
#define NDB_IS_OPEN(ni) (ni->ni_cluster != NULL)
struct ndb_info {
/* NDB connection */
char *ni_connectstr;
char *ni_dbname;
Ndb_cluster_connection **ni_cluster;
/* MySQL connection parameters */
MYSQL ni_sql;
char *ni_hostname;
char *ni_username;
char *ni_password;
char *ni_socket;
unsigned long ni_clflag;
unsigned int ni_port;
/* Search filter processing */
int ni_search_stack_depth;
void *ni_search_stack;
#define DEFAULT_SEARCH_STACK_DEPTH 16
#define MINIMUM_SEARCH_STACK_DEPTH 8
/* Schema config */
NdbOcInfo *ni_opattrs;
ListNode *ni_attridxs;
ListNode *ni_attrlens;
ListNode *ni_attrsets;
ListNode *ni_attrblobs;
ldap_pvt_thread_rdwr_t ni_ai_rwlock;
Avlnode *ni_ai_tree;
ldap_pvt_thread_rdwr_t ni_oc_rwlock;
Avlnode *ni_oc_tree;
int ni_nconns; /* number of connections to open */
int ni_nextconn; /* next conn to use */
ldap_pvt_thread_mutex_t ni_conn_mutex;
};
#define NDB_MAX_RDNS 16
#define NDB_RDN_LEN 128
#define NDB_MAX_OCS 64
#define DN2ID_TABLE "OL_dn2id"
#define EID_COLUMN 0U
#define VID_COLUMN 1U
#define OCS_COLUMN 1U
#define RDN_COLUMN 2U
#define IDX_COLUMN (2U+NDB_MAX_RDNS)
#define NEXTID_TABLE "OL_nextid"
#define NDB_OC_BUFLEN 1026 /* 1024 data plus 2 len bytes */
#define INDEX_NAME "OL_index"
typedef struct NdbRdns {
short nr_num;
char nr_buf[NDB_MAX_RDNS][NDB_RDN_LEN+1];
} NdbRdns;
typedef struct NdbOcs {
int no_ninfo;
int no_ntext;
int no_nitext; /* number of implicit classes */
NdbOcInfo *no_info[NDB_MAX_OCS];
struct berval no_text[NDB_MAX_OCS];
struct berval no_itext[NDB_MAX_OCS]; /* implicit classes */
} NdbOcs;
typedef struct NdbArgs {
Ndb *ndb;
NdbTransaction *txn;
Entry *e;
NdbRdns *rdns;
struct berval *ocs;
int erdns;
} NdbArgs;
#define NDB_NO_SUCH_OBJECT 626
#define NDB_ALREADY_EXISTS 630
LDAP_END_DECL
#include "proto-ndb.h"
#endif