mirror of
https://github.com/samba-team/samba.git
synced 2025-01-07 17:18:11 +03:00
8420a36dc7
Signed-off-by: Andrew Tridgell <tridge@samba.org>
329 lines
10 KiB
Plaintext
329 lines
10 KiB
Plaintext
-- ------------------------------------------------------
|
|
|
|
PRAGMA auto_vacuum=1;
|
|
|
|
-- ------------------------------------------------------
|
|
|
|
BEGIN EXCLUSIVE;
|
|
|
|
-- ------------------------------------------------------
|
|
|
|
CREATE TABLE ldb_info AS
|
|
SELECT 'LDB' AS database_type,
|
|
'1.0' AS version;
|
|
|
|
/*
|
|
* Get the next USN value with:
|
|
* BEGIN EXCLUSIVE;
|
|
* UPDATE usn SET value = value + 1;
|
|
* SELECT value FROM usn;
|
|
* COMMIT;
|
|
*/
|
|
CREATE TABLE usn
|
|
(
|
|
value INTEGER
|
|
);
|
|
|
|
CREATE TABLE ldb_object
|
|
(
|
|
/* tree_key is auto-generated by the insert trigger */
|
|
tree_key TEXT PRIMARY KEY,
|
|
|
|
parent_tree_key TEXT,
|
|
dn 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,
|
|
parent_tree_key TEXT,
|
|
|
|
objectclass_p BOOLEAN DEFAULT 0,
|
|
|
|
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 INDEX ldb_object_dn_idx
|
|
ON ldb_object (dn);
|
|
|
|
CREATE INDEX ldb_attributes_tree_key_ids
|
|
ON ldb_attributes (tree_key);
|
|
|
|
-- ------------------------------------------------------
|
|
|
|
/* 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 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;
|
|
|
|
|
|
-- ------------------------------------------------------
|
|
|
|
/* Initialize usn */
|
|
INSERT INTO usn (value) VALUES (0);
|
|
|
|
/* Create root object */
|
|
INSERT INTO ldb_object
|
|
(tree_key, parent_tree_key,
|
|
dn,
|
|
object_type, max_child_num)
|
|
VALUES ('', NULL,
|
|
'',
|
|
1, 0);
|
|
|
|
/* We need an implicit "top" level object class */
|
|
INSERT INTO ldb_attributes (attr_name,
|
|
parent_tree_key)
|
|
SELECT 'top', '';
|
|
|
|
-- ------------------------------------------------------
|
|
|
|
COMMIT;
|
|
|
|
-- ------------------------------------------------------
|
|
|
|
/*
|
|
* dn: o=University of Michigan,c=US
|
|
* objectclass: organization
|
|
* objectclass: domainRelatedObject
|
|
*/
|
|
-- newDN
|
|
BEGIN;
|
|
|
|
INSERT OR IGNORE INTO ldb_object
|
|
(parent_tree_key
|
|
dn,
|
|
attr_name, attr_value, object_type, max_child_num)
|
|
VALUES ('',
|
|
'c=US',
|
|
'c', 'US', 1, 0);
|
|
|
|
INSERT INTO ldb_object
|
|
(parent_tree_key,
|
|
dn,
|
|
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_attributes
|
|
(attr_name, parent_tree_key, objectclass_p)
|
|
VALUES
|
|
('objectclass', '', 1);
|
|
|
|
INSERT INTO ldb_object
|
|
(parent_tree_key,
|
|
dn,
|
|
attr_name, attr_value, object_type, max_child_num)
|
|
VALUES ('00010001',
|
|
NULL,
|
|
'objectclass', 'organization', 2, 0);
|
|
|
|
INSERT OR IGNORE INTO ldb_attributes
|
|
(attr_name, parent_tree_key, objectclass_p)
|
|
VALUES
|
|
('objectclass', '', 1);
|
|
|
|
INSERT INTO ldb_object
|
|
(parent_tree_key,
|
|
dn,
|
|
attr_name, attr_value, object_type, max_child_num)
|
|
VALUES ('00010001',
|
|
NULL,
|
|
'objectclass', 'domainRelatedObject', 2, 0);
|
|
|
|
COMMIT;
|
|
|
|
|
|
/*
|
|
* dn: o=University of Michigan,c=US
|
|
* l: Ann Arbor, Michigan
|
|
* st: Michigan
|
|
* o: University of Michigan
|
|
* o: UMICH
|
|
* seeAlso:
|
|
* telephonenumber: +1 313 764-1817
|
|
*/
|
|
-- addAttrValuePair
|
|
BEGIN;
|
|
|
|
INSERT INTO ldb_object
|
|
(parent_tree_key, dn,
|
|
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, dn,
|
|
attr_name, attr_value, object_type, max_child_num)
|
|
VALUES ('00010001', NULL,
|
|
'st', 'Michigan', 2, 0);
|
|
|
|
INSERT INTO ldb_object
|
|
(parent_tree_key, dn,
|
|
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, dn,
|
|
attr_name, attr_value, object_type, max_child_num)
|
|
VALUES ('00010001', NULL,
|
|
'o', 'UMICH', 2, 0);
|
|
|
|
INSERT INTO ldb_object
|
|
(parent_tree_key, dn,
|
|
attr_name, attr_value, object_type, max_child_num)
|
|
VALUES ('00010001', NULL,
|
|
'seeAlso', '', 2, 0);
|
|
|
|
INSERT INTO ldb_object
|
|
(parent_tree_key, dn,
|
|
attr_name, attr_value, object_type, max_child_num)
|
|
VALUES ('00010001', NULL,
|
|
'telephonenumber', '+1 313 764-1817', 2, 0);
|
|
|
|
COMMIT;
|
|
|
|
-- ----------------------------------------------------------------------
|
|
|
|
/*
|
|
* dn: @ATTRIBUTES
|
|
* uid: CASE_INSENSITIVE WILDCARD
|
|
* cn: CASE_INSENSITIVE
|
|
* ou: CASE_INSENSITIVE
|
|
* dn: CASE_INSENSITIVE
|
|
*/
|
|
-- newAttribute
|
|
|
|
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'
|
|
|