1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-01 21:18:10 +03:00

r7133: work in progress, including a HIGHLY revised and simplified schema

(This used to be commit aa9bb6ad4c)
This commit is contained in:
Derrell Lipman 2005-05-31 03:31:54 +00:00 committed by Gerald (Jerry) Carter
parent 580b5bb8ef
commit 913c19cd5b
2 changed files with 368 additions and 217 deletions

View File

@ -1,22 +1,22 @@
/*
ldb database library
Copyright (C) Andrew Tridgell 2004
** NOTE! The following LGPL license applies to the ldb
** library. This does NOT imply that all of Samba is released
** under the LGPL
** NOTE! The following LGPL license applies to the ldb
** library. This does NOT imply that all of Samba is released
** under the LGPL
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
@ -25,7 +25,7 @@
/*
* Name: ldb
*
* Component: ldb sqlite backend
* Component: ldb sqlite3 backend
*
* Description: core files for SQLITE3 backend
*
@ -39,30 +39,30 @@
#undef SQL_EXEC /* just in case; not expected to be defined */
#define SQL_EXEC(lsqlite3, query, reset) \
do { \
lsqlite3->last_rc = \
sqlite3_step(lsqlite3->queries.query); \
if (lsqlite3->last_rc == SQLITE_BUSY || reset) \
(void) sqlite3_reset(lsqlite3->queries.query); \
} while lsqlite3->last_rc == SQLITE_BUSY;
do { \
lsqlite3->last_rc = \
sqlite3_step(lsqlite3->queries.query); \
if (lsqlite3->last_rc == SQLITE_BUSY || reset) \
(void) sqlite3_reset(lsqlite3->queries.query); \
} while lsqlite3->last_rc == SQLITE_BUSY;
#if 0
/*
* we don't need this right now, but will once we add some backend options
*
* find an option in an option list (a null terminated list of strings)
*
* this assumes the list is short. If it ever gets long then we really should
* do this in some smarter way
*/
/*
find an option in an option list (a null terminated list of strings)
this assumes the list is short. If it ever gets long then we really
should do this in some smarter way
*/
static const char *lsqlite3_option_find(const struct lsqlite3_private *lsqlite3, const char *name)
static const char *
lsqlite3_option_find(const struct lsqlite3_private *lsqlite3,
const char *name)
{
int i;
size_t len = strlen(name);
int i;
size_t len = strlen(name);
if (!lsqlite3->options) return NULL;
@ -80,10 +80,13 @@ static const char *lsqlite3_option_find(const struct lsqlite3_private *lsqlite3,
/*
* rename a record
*/
static int lsqlite3_rename(struct ldb_module *module, const char *olddn, const char *newdn)
static int
lsqlite3_rename(struct ldb_module *module,
const char *olddn,
const char *newdn)
{
int column;
struct lsqlite3_private *lsqlite3 = module->private_data;
int column;
struct lsqlite3_private * lsqlite3 = module->private_data;
/* ignore ltdb specials */
if (olddn[0] == '@' ||newdn[0] == '@') {
@ -117,11 +120,13 @@ static int lsqlite3_rename(struct ldb_module *module, const char *olddn, const c
/*
* delete a record
*/
static int lsqlite3_delete(struct ldb_module *module, const char *dn)
static int
lsqlite3_delete(struct ldb_module *module,
const char *dn)
{
int ret = 0;
int column;
struct lsqlite3_private *lsqlite3 = module->private_data;
int ret = 0;
int column;
struct lsqlite3_private * lsqlite3 = module->private_data;
/* ignore ltdb specials */
if (dn[0] == '@') {
@ -146,7 +151,9 @@ static int lsqlite3_delete(struct ldb_module *module, const char *dn)
/*
* free a search result
*/
static int lsqlite3_search_free(struct ldb_module *module, struct ldb_message **res)
static int
lsqlite3_search_free(struct ldb_module *module,
struct ldb_message **res)
{
talloc_free(res);
return 0;
@ -156,12 +163,15 @@ static int lsqlite3_search_free(struct ldb_module *module, struct ldb_message **
/*
* add a single set of ldap message values to a ldb_message
*/
static int lsqlite3_add_msg_attr(struct ldb_context *ldb,
struct ldb_message *msg,
const char *attr, struct berval **bval)
static int
lsqlite3_add_msg_attr(struct ldb_context *ldb,
struct ldb_message *msg,
const char *attr,
struct berval **bval)
{
int count, i;
struct ldb_message_element *el;
int i;
int count;
struct ldb_message_element * el;
count = ldap_count_values_len(bval);
@ -211,13 +221,18 @@ static int lsqlite3_add_msg_attr(struct ldb_context *ldb,
/*
* search for matching records
*/
static int lsqlite3_search(struct ldb_module *module, const char *base,
enum ldb_scope scope, const char *expression,
const char * const *attrs, struct ldb_message ***res)
static int
lsqlite3_search(struct ldb_module *module,
const char *base,
enum ldb_scope scope,
const char *expression,
const char * const *attrs,
struct ldb_message ***res)
{
struct ldb_context *ldb = module->ldb;
struct lsqlite3_private *lsqlite3 = module->private_data;
int count, msg_count;
int count;
int msg_count;
struct ldb_context * ldb = module->ldb;
struct lsqlite3_private * lsqlite3 = module->private_data;
if (base == NULL) {
base = "";
@ -316,16 +331,18 @@ failed:
* Issue a series of SQL statements to implement the ADD/MODIFY/DELETE
* requests in the ldb_message
*/
static int lsqlite3_msg_to_sql(struct ldb_context *ldb,
const struct ldb_message *msg,
long long dn_id,
int use_flags)
static int
lsqlite3_msg_to_sql(struct ldb_context *ldb,
const struct ldb_message *msg,
long long dn_id,
int use_flags)
{
int flags;
unsigned int i, j;
struct ldb_context *ldb = module->ldb;
struct lsqlite3_private *lsqlite3 = module->private_data;
sqlite3_stmt *stmt = NULL;
int flags;
unsigned int i;
unsigned int j;
sqlite3_stmt * stmt = NULL;
struct ldb_context * ldb = module->ldb;
struct lsqlite3_private * lsqlite3 = module->private_data;
for (i = 0; i < msg->num_elements; i++) {
const struct ldb_message_element *el = &msg->elements[i];
@ -428,11 +445,13 @@ static int lsqlite3_msg_to_sql(struct ldb_context *ldb,
/*
* add a record
*/
static int lsqlite3_add(struct ldb_module *module, const struct ldb_message *msg)
static int
lsqlite3_add(struct ldb_module *module,
const struct ldb_message *msg)
{
struct ldb_context *ldb = module->ldb;
struct lsqlite3_private *lsqlite3 = module->private_data;
int ret;
int ret;
struct ldb_context * ldb = module->ldb;
struct lsqlite3_private * lsqlite3 = module->private_data;
/* ignore ltdb specials */
if (msg->dn[0] == '@') {
@ -482,12 +501,13 @@ static int lsqlite3_add(struct ldb_module *module, const struct ldb_message *msg
/*
* modify a record
*/
static int lsqlite3_modify(struct ldb_module *module, const struct ldb_message *msg)
static int
lsqlite3_modify(struct ldb_module *module,
const struct ldb_message *msg)
{
struct ldb_context *ldb = module->ldb;
struct lsqlite3_private *lsqlite3 = module->private_data;
LDAPMod **mods;
int ret = 0;
int ret = 0;
struct ldb_context * ldb = module->ldb;
struct lsqlite3_private * lsqlite3 = module->private_data;
/* ignore ltdb specials */
if (msg->dn[0] == '@') {
@ -538,11 +558,13 @@ static int lsqlite3_modify(struct ldb_module *module, const struct ldb_message *
return lsqlite3->last_rc == SQLITE_DONE && ret == 0 ? 0 : -1;
}
static int lsqlite3_lock(struct ldb_module *module, const char *lockname)
static int
lsqlite3_lock(struct ldb_module *module,
const char *lockname)
{
int ret = 0;
struct ldb_context *ldb = module->ldb;
struct lsqlite3_private *lsqlite3 = module->private_data;
int ret = 0;
struct ldb_context * ldb = module->ldb;
struct lsqlite3_private * lsqlite3 = module->private_data;
if (lockname == NULL) {
return -1;
@ -559,11 +581,13 @@ static int lsqlite3_lock(struct ldb_module *module, const char *lockname)
return lsqlite3->last_rc == 0 ? 0 : -1;
}
static int lsqlite3_unlock(struct ldb_module *module, const char *lockname)
static int
lsqlite3_unlock(struct ldb_module *module,
const char *lockname)
{
int ret = 0;
struct ldb_context *ldb = module->ldb;
struct lsqlite3_private *lsqlite3 = module->private_data;
int ret = 0;
struct ldb_context * ldb = module->ldb;
struct lsqlite3_private * lsqlite3 = module->private_data;
if (lockname == NULL) {
return -1;
@ -587,9 +611,11 @@ static int lsqlite3_unlock(struct ldb_module *module, const char *lockname)
/*
* return extended error information
*/
static const char *lsqlite3_errstring(struct ldb_module *module)
static const char *
lsqlite3_errstring(struct ldb_module *module)
{
struct lsqlite3_private *lsqlite3 = module->private_data;
struct lsqlite3_private * lsqlite3 = module->private_data;
return sqlite3_errmsg(lsqlite3->sqlite3);
}
@ -608,22 +634,25 @@ static const struct ldb_module_ops lsqlite3_ops = {
};
static int lsqlite3_destructor(void *p)
static int
lsqlite3_destructor(void *p)
{
struct lsqlite3_private *lsqlite3 = p;
struct lsqlite3_private * lsqlite3 = p;
(void) sqlite3_close(lsqlite3->sqlite3);
return 0;
}
static int lsqlite3_initialize(lsqlite3_private *lsqlite3,
const char *url)
static int
lsqlite3_initialize(lsqlite3_private *lsqlite3,
const char *url)
{
int bNewDatabase = False;
char *p;
char *pTail;
struct stat statbuf;
sqlite3_stmt *stmt;
const char *schema =
int bNewDatabase = False;
char * p;
char * pTail;
struct stat statbuf;
sqlite3_stmt * stmt;
const char * schema =
"
-- ------------------------------------------------------
@ -983,13 +1012,14 @@ static int lsqlite3_initialize(lsqlite3_private *lsqlite3,
/*
* connect to the database
*/
struct ldb_context *lsqlite3_connect(const char *url,
unsigned int flags,
const char *options[])
struct ldb_context *
lsqlite3_connect(const char *url,
unsigned int flags,
const char *options[])
{
struct ldb_context *ldb = NULL;
struct lsqlite3_private *lsqlite3 = NULL;
int i;
int i;
struct ldb_context * ldb = NULL;
struct lsqlite3_private * lsqlite3 = NULL;
ldb = talloc(NULL, struct ldb_context);
if (!ldb) {

View File

@ -12,110 +12,163 @@
SELECT 'LDB' AS database_type,
'1.0' AS version;
CREATE TABLE ldb_distinguished_names
/*
* Get the next USN value with:
* BEGIN EXCLUSIVE;
* UPDATE usn SET value = value + 1;
* SELECT value FROM usn;
* COMMIT;
*/
CREATE TABLE usn
(
dn_id INTEGER PRIMARY KEY AUTOINCREMENT,
dn TEXT UNIQUE
value INTEGER
);
CREATE TABLE ldb_object_classes
CREATE TABLE ldb_object
(
class_name TEXT PRIMARY KEY,
tree_key TEXT,
max_child_num INTEGER
);
/* tree_key is auto-generated by the insert trigger */
tree_key TEXT PRIMARY KEY,
CREATE TABLE ldb_dn_object_classes
(
dn_id INTEGER REFERENCES ldb_distinguished_names,
class_name TEXT REFERENCES ldb_object_classes
parent_tree_key TEXT,
full_path TEXT,
attr_name TEXT REFERENCES ldb_attributes,
attr_value TEXT,
/*
* object_type can take on these values (to date):
* 1: object is a node of a DN
* 2: object is an attribute/value pair of its parent DN
*/
object_type INTEGER,
/*
* if object_type is 1, the node can have children.
* this tracks the maximum previously assigned child
* number so we can generate a new unique tree key for
* a new child object. note that this is always incremented,
* so if children are deleted, this will not represent
* the _number_ of children.
*/
max_child_num INTEGER,
/*
* Automatically maintained meta-data (a gift for metze)
*/
object_guid TEXT UNIQUE,
timestamp INTEGER, -- originating_time
invoke_id TEXT, -- GUID: originating_invocation_id
usn INTEGER, -- hyper: originating_usn
/* do not allow duplicate name/value pairs */
UNIQUE (parent_tree_key, attr_name, attr_value, object_type)
);
CREATE TABLE ldb_attributes
(
attr_name TEXT PRIMARY KEY,
case_insensitive_p BOOLEAN DEFAULT FALSE,
wildcard_p BOOLEAN DEFAULT FALSE,
hidden_p BOOLEAN DEFAULT FALSE,
integer_p BOOLEAN DEFAULT FALSE
);
parent_tree_key TEXT,
CREATE TABLE ldb_attr_value_pairs
(
dn_id INTEGER REFERENCES ldb_distinguished_names,
attr_name TEXT, -- optionally REFERENCES ldb_attributes
attr_value TEXT,
objectclass_p BOOLEAN DEFAULT 0,
UNIQUE (dn_id, attr_name, attr_value)
case_insensitive_p BOOLEAN DEFAULT 0,
wildcard_p BOOLEAN DEFAULT 0,
hidden_p BOOLEAN DEFAULT 0,
integer_p BOOLEAN DEFAULT 0,
/* tree_key is auto-generated by the insert trigger */
tree_key TEXT, -- null if not a object/sub class
-- level 1 if an objectclass
-- level 1-n if a subclass
max_child_num INTEGER
);
-- ------------------------------------------------------
CREATE TRIGGER ldb_distinguished_names_delete_tr
AFTER DELETE
ON ldb_distinguished_names
FOR EACH ROW
BEGIN
DELETE FROM ldb_attr_value_pairs
WHERE dn_id = old.dn_id;
DELETE FROM ldb_dn_object_classes
WHERE dn_id = old.dn_id;
END;
CREATE INDEX ldb_object_full_path_idx
ON ldb_object (full_path);
CREATE TRIGGER ldb_attr_value_pairs_insert_tr
BEFORE INSERT
ON ldb_attr_value_pairs
FOR EACH ROW
BEGIN
INSERT OR IGNORE INTO ldb_attributes
(attr_name)
VALUES
(new.attr_name);
END;
CREATE TRIGGER ldb_attr_value_pairs_delete_tr
AFTER DELETE
ON ldb_attr_value_pairs
FOR EACH ROW
BEGIN
DELETE FROM ldb_attributes
WHERE (SELECT COUNT(*)
FROM ldb_attr_value_pairs
WHERE attr_name = old.attr_name) = 0
AND attr_name = old.attr_name;
END;
CREATE INDEX ldb_attributes_tree_key_ids
ON ldb_attributes (tree_key);
-- ------------------------------------------------------
CREATE INDEX ldb_distinguished_names_dn_idx
ON ldb_distinguished_names (dn);
/* Gifts for metze. Automatically updated meta-data */
CREATE TRIGGER ldb_object_insert_tr
AFTER INSERT
ON ldb_object
FOR EACH ROW
BEGIN
UPDATE ldb_object
SET max_child_num = max_child_num + 1
WHERE tree_key = new.parent_tree_key;
UPDATE usn SET value = value + 1;
UPDATE ldb_object
SET tree_key =
(SELECT
new.tree_key ||
base160(SELECT max_child_num
FROM ldb_object
WHERE tree_key =
new.parent_tree_key));
max_child_num = 0,
object_guid = random_guid(),
timestamp = strftime('%s', 'now'),
usn = (SELECT value FROM usn);
WHERE tree_key = new.tree_key;
END;
CREATE INDEX ldb_object_classes_tree_key_idx
ON ldb_object_classes (tree_key);
CREATE TRIGGER ldb_object_update_tr
AFTER UPDATE
ON ldb_object
FOR EACH ROW
BEGIN
UPDATE usn SET value = value + 1;
UPDATE ldb_object
SET timestamp = strftime('%s', 'now'),
usn = (SELECT value FROM usn);
WHERE tree_key = new.tree_key;
END;
CREATE TRIGGER ldb_attributes_insert_tr
AFTER INSERT
ON ldb_attributes
FOR EACH ROW
BEGIN
UPDATE ldb_attributes
SET max_child_num = max_child_num + 1
WHERE tree_key = new.parent_tree_key;
UPDATE ldb_attributes
SET tree_key =
(SELECT
new.tree_key ||
base160(SELECT max_child_num
FROM ldb_attributes
WHERE tree_key =
new.parent_tree_key));
max_child_num = 0
WHERE tree_key = new.tree_key;
END;
CREATE INDEX ldb_dn_object_classes_dn_id_idx
ON ldb_dn_object_classes (dn_id);
CREATE INDEX ldb_dn_object_classes_class_name_idx
ON ldb_dn_object_classes (class_name);
CREATE INDEX ldb_attr_value_pairs_dn_id_name_case_idx
ON ldb_attr_value_pairs (dn_id, attr_name);
CREATE INDEX ldb_attr_value_pairs_dn_id_name_nocase_idx
ON ldb_attr_value_pairs (dn_id, attr_name COLLATE NOCASE);
-- ------------------------------------------------------
/* all defaults for dn, initially */
INSERT INTO ldb_attributes (attr_name)
VALUES ('dn');
/* Initialize usn */
INSERT INTO usn (value) VALUES (0);
/* Create root object */
INSERT INTO ldb_object
(tree_key, parent_tree_key,
full_path,
object_type, max_child_num)
VALUES ('', NULL,
'',
1, 0);
/* We need an implicit "top" level object class */
INSERT INTO ldb_object_classes (class_name, tree_key)
SELECT 'top', /* next_tree_key(NULL) */ '0001';
INSERT INTO ldb_attributes (attr_name,
parent_tree_key)
SELECT 'top', '';
-- ------------------------------------------------------
@ -129,63 +182,103 @@
* objectclass: domainRelatedObject
*/
-- newDN
INSERT INTO ldb_distinguished_names (dn_id, dn)
VALUES (1, 'o=University of Michigan,c=US');
BEGIN;
INSERT OR IGNORE INTO ldb_object
(parent_tree_key
full_path,
attr_name, attr_value, object_type, max_child_num)
VALUES ('',
'c=US',
'c', 'US', 1, 0);
INSERT INTO ldb_object
(parent_tree_key,
full_path,
attr_name, attr_value, object_type, max_child_num)
VALUES ('0001',
'o=University of Michigan,c=US',
'o', 'University of Michigan', 1, 0);
-- newObjectClass
INSERT OR IGNORE INTO ldb_object_classes (class_name, tree_key)
SELECT 'organization', /* next_tree_key(NULL) */ '0002';
INSERT OR IGNORE INTO ldb_attributes
(attr_name, parent_tree_key, objectclass_p)
VALUES
('objectclass', '', 1);
INSERT OR IGNORE INTO ldb_object_classes (class_name, tree_key)
SELECT 'domainRelatedObject', /* next_tree_key(NULL) */ '0003';
INSERT INTO ldb_object
(parent_tree_key,
full_path,
attr_name, attr_value, object_type, max_child_num)
VALUES ('00010001',
NULL,
'objectclass', 'organization', 2, 0);
-- assignObjectClass
INSERT OR IGNORE INTO ldb_dn_object_classes (dn_id, class_name)
VALUES (1, 'organization');
INSERT OR IGNORE INTO ldb_attributes
(attr_name, parent_tree_key, objectclass_p)
VALUES
('objectclass', '', 1);
INSERT INTO ldb_object
(parent_tree_key,
full_path,
attr_name, attr_value, object_type, max_child_num)
VALUES ('00010001',
NULL,
'objectclass', 'domainRelatedObject', 2, 0);
COMMIT;
INSERT OR IGNORE INTO ldb_dn_object_classes (dn_id, class_name)
VALUES (1, 'domainRelatedObject');
/*
* dn: o=University of Michigan,c=US
* l: Ann Arbor, Michigan
* st: Michigan
* o: University of Michigan
* o: UMICH
* o: UM
* o: U-M
* o: U of M
* description: The University of Michigan at Ann Arbor
* seeAlso:
* postaladdress: University of Michigan $ 535 W. William St. $ Ann Arbor, MI 481
* 09 $ US
* telephonenumber: +1 313 764-1817
* associateddomain: example.com
*/
-- addAttrValuePair
INSERT INTO ldb_attr_value_pairs (dn_id, attr_name, attr_value)
VALUES (1, 'l', 'Ann Arbor, Michigan');
INSERT INTO ldb_attr_value_pairs (dn_id, attr_name, attr_value)
VALUES (1, 'st', 'Michigan');
INSERT INTO ldb_attr_value_pairs (dn_id, attr_name, attr_value)
VALUES (1, 'o', 'University of Michigan');
INSERT INTO ldb_attr_value_pairs (dn_id, attr_name, attr_value)
VALUES (1, 'o', 'UMICH');
INSERT INTO ldb_attr_value_pairs (dn_id, attr_name, attr_value)
VALUES (1, 'o', 'UM');
INSERT INTO ldb_attr_value_pairs (dn_id, attr_name, attr_value)
VALUES (1, 'o', 'U-M');
INSERT INTO ldb_attr_value_pairs (dn_id, attr_name, attr_value)
VALUES (1, 'o', 'U of M');
INSERT INTO ldb_attr_value_pairs (dn_id, attr_name, attr_value)
VALUES (1, 'description', 'The University of Michigan at Ann Arbor');
INSERT INTO ldb_attr_value_pairs (dn_id, attr_name, attr_value)
VALUES (1, 'seeAlso', '');
INSERT INTO ldb_attr_value_pairs (dn_id, attr_name, attr_value)
VALUES (1, 'postaladdress', 'University of Michigan $ 535 W. William St. $ Ann Arbor, MI 48109 $ US');
INSERT INTO ldb_attr_value_pairs (dn_id, attr_name, attr_value)
VALUES (1, 'telephonenumber', '+1 313 764-1817');
INSERT INTO ldb_attr_value_pairs (dn_id, attr_name, attr_value)
VALUES (1, 'associateddomain', 'example.com');
BEGIN;
INSERT INTO ldb_object
(parent_tree_key, full_path,
attr_name, attr_value, object_type, max_child_num)
VALUES ('00010001', NULL,
'l', 'Ann Arbor, Michigan', 2, 0);
INSERT INTO ldb_object
(parent_tree_key, full_path,
attr_name, attr_value, object_type, max_child_num)
VALUES ('00010001', NULL,
'st', 'Michigan', 2, 0);
INSERT INTO ldb_object
(parent_tree_key, full_path,
attr_name, attr_value, object_type, max_child_num)
VALUES ('00010001', NULL,
'o', 'University of Michigan', 2, 0);
INSERT INTO ldb_object
(parent_tree_key, full_path,
attr_name, attr_value, object_type, max_child_num)
VALUES ('00010001', NULL,
'o', 'UMICH', 2, 0);
INSERT INTO ldb_object
(parent_tree_key, full_path,
attr_name, attr_value, object_type, max_child_num)
VALUES ('00010001', NULL,
'seeAlso', '', 2, 0);
INSERT INTO ldb_object
(parent_tree_key, full_path,
attr_name, attr_value, object_type, max_child_num)
VALUES ('00010001', NULL,
'telephonenumber', '+1 313 764-1817', 2, 0);
COMMIT;
-- ----------------------------------------------------------------------
@ -197,18 +290,41 @@ INSERT INTO ldb_attr_value_pairs (dn_id, attr_name, attr_value)
* dn: CASE_INSENSITIVE
*/
-- newAttribute
INSERT OR REPLACE INTO ldb_attributes
(attr_name, case_insensitive_p, wildcard_p, hidden_p, integer_p)
VALUES ('uid', 1, 1, 0, 0);
INSERT OR REPLACE INTO ldb_attributes
(attr_name, case_insensitive_p, wildcard_p, hidden_p, integer_p)
VALUES ('cn', 1, 0, 0, 0);
INSERT OR REPLACE INTO ldb_attributes
(attr_name, case_insensitive_p, wildcard_p, hidden_p, integer_p)
VALUES ('ou', 1, 0, 0, 0);
INSERT OR REPLACE INTO ldb_attributes
(attr_name, case_insensitive_p, wildcard_p, hidden_p, integer_p)
VALUES ('dn', 1, 0, 0, 0);
BEGIN;
INSERT OR IGNORE INTO ldb_attributes
(attr_name, parent_tree_key, objectclass_p)
VALUES
('uid', '', 0);
UPDATE ldb_attributes
SET case_insensitive_p = 1,
wildcard_p = 1,
hidden_p = 0,
integer_p = 0
WHERE attr_name = 'uid'
UPDATE ldb_attributes
SET case_insensitive_p = 1,
wildcard_p = 0,
hidden_p = 0,
integer_p = 0
WHERE attr_name = 'cn'
UPDATE ldb_attributes
SET case_insensitive_p = 1,
wildcard_p = 0,
hidden_p = 0,
integer_p = 0
WHERE attr_name = 'ou'
UPDATE ldb_attributes
SET case_insensitive_p = 1,
wildcard_p = 0,
hidden_p = 0,
integer_p = 0
WHERE attr_name = 'dn'
-- ----------------------------------------------------------------------
@ -224,6 +340,10 @@ INSERT OR REPLACE INTO ldb_attributes
* user: computer
*/
-- insertSubclass
/* NOT YET UPDATED!!! *
INSERT OR REPLACE INTO ldb_object_classes (class_name, tree_key)
SELECT 'domain', /* next_tree_key('top') */ '00010001';
INSERT OR REPLACE INTO ldb_object_classes (class_name, tree_key)
@ -240,3 +360,4 @@ INSERT OR REPLACE INTO ldb_object_classes (class_name, tree_key)
SELECT 'OpenLDAPperson', /* next_tree_key('organizationPerson') */ '0001000200010002';
INSERT OR REPLACE INTO ldb_object_classes (class_name, tree_key)
SELECT 'computer', /* next_tree_key('user') */ '0001000200010001';