int backsql_unbind(BackendDB *be,Connection *conn,Operation *op)
{
Debug(LDAP_DEBUG_TRACE,"==>backsql_unbind()\n",0,0,0);
- backsql_free_db_conn(be,conn);
send_ldap_result(conn,op,LDAP_SUCCESS,NULL,NULL,NULL,0);
Debug(LDAP_DEBUG_TRACE,"<==backsql_unbind()\n",0,0,0);
return 0;
if ((rc=SQLExecute(sth)) != SQL_SUCCESS && rc!= SQL_SUCCESS_WITH_INFO)
{
- Debug(LDAP_DEBUG_TRACE,"backsql_get_attr_values(): error executing query\n",0,0,0);
+ Debug(LDAP_DEBUG_TRACE,"backsql_get_attr_values(): error executing attribute query '%s'\n",at->query,0,0);
backsql_PrintErrors(bsi->bi->db_env,bsi->dbh,sth,rc);
SQLFreeStmt(sth,SQL_DROP);
return 1;
bsi->e=e;
bsi->c_eid=eid;
e->e_attrs=NULL;
- if (bsi->base_dn != NULL)
- e->e_dn=ch_strdup(bsi->c_eid->dn);
+ e->e_private=NULL;
+
+// if (bsi->base_dn != NULL)???
+
+ e->e_id=eid->id;
+ e->e_dn=ch_strdup(bsi->c_eid->dn);
+ e->e_ndn=dn_normalize(ch_strdup(bsi->c_eid->dn));
if (bsi->attrs!=NULL)
{
extern int backsql_compare LDAP_P((BackendDB *bd,
Connection *conn, Operation *op,
const char *dn, const char *ndn,
- Ava *ava ));
+ AttributeAssertion *ava ));
extern int backsql_modify LDAP_P(( BackendDB *bd,
Connection *conn, Operation *op,
const char *dn, const char *ndn,
- LDAPModList *ml ));
+ Modifications *ml ));
extern int backsql_modrdn LDAP_P(( BackendDB *bd,
Connection *conn, Operation *op,
extern int backsql_abandon LDAP_P(( BackendDB *bd,
Connection *conn, Operation *op, int msgid ));
+extern int backsql_connection_destroy LDAP_P(( BackendDB *bd,
+ Connection *conn));
+
LDAP_END_DECL
#endif /* _SQL_EXTERNAL_H */
bi->bi_chk_referrals = 0;
bi->bi_connection_init = 0;
- bi->bi_connection_destroy = 0;
+ bi->bi_connection_destroy = backsql_connection_destroy;
Debug(LDAP_DEBUG_TRACE,"<==backsql_initialize()\n",0,0,0);
return 0;
return 0;
}
+int backsql_connection_destroy(BackendDB *be,Connection *conn)
+{
+ Debug(LDAP_DEBUG_TRACE,"==>backsql_connection_destroy()\n",0,0,0);
+ backsql_free_db_conn(be,conn);
+ Debug(LDAP_DEBUG_TRACE,"<==backsql_connection_destroy()\n",0,0,0);
+ return 0;
+}
+
#endif /* SLAPD_SQL */
#include "util.h"
int backsql_modify(BackendDB *be,Connection *conn,Operation *op,
- const char *dn,const char *ndn,LDAPModList *modlist)
+ const char *dn,const char *ndn,Modifications *modlist)
{
backsql_info *bi=(backsql_info*)be->be_private;
SQLHDBC dbh;
RETCODE rc;
backsql_oc_map_rec *oc=NULL;
backsql_entryID e_id,*res;
- LDAPModList *c_mod;
+ Modification *c_mod;
+ Modifications *ml;
backsql_at_map_rec *at=NULL;
struct berval *at_val;
int i;
SQLAllocStmt(dbh, &sth);
Debug(LDAP_DEBUG_TRACE,"backsql_modify(): traversing modifications list\n",0,0,0);
- for(c_mod=modlist;c_mod!=NULL;c_mod=c_mod->ml_next)
+ for(ml=modlist;ml!=NULL;ml=ml->sml_next)
{
- Debug(LDAP_DEBUG_TRACE,"backsql_modify(): attribute '%s'\n",c_mod->ml_type,0,0);
- at=backsql_at_with_name(oc,c_mod->ml_type);
+ c_mod=&ml->sml_mod;
+ Debug(LDAP_DEBUG_TRACE,"backsql_modify(): attribute '%s'\n",c_mod->sm_desc->ad_cname->bv_val,0,0);
+ at=backsql_at_with_name(oc,c_mod->sm_desc->ad_cname->bv_val);
if (at==NULL)
{
- Debug(LDAP_DEBUG_TRACE,"backsql_modify(): attribute provided is not registered in this objectclass ('%s')\n",c_mod->ml_type,0,0);
+ Debug(LDAP_DEBUG_TRACE,"backsql_modify(): attribute provided is not registered in this objectclass ('%s')\n",c_mod->sm_desc->ad_cname->bv_val,0,0);
continue;
}
- switch(c_mod->ml_op)
+ switch(c_mod->sm_op)
{
case LDAP_MOD_REPLACE:
{
Debug(LDAP_DEBUG_TRACE,"backsql_modify(): add procedure is not defined for this attribute ('%s')\n",at->name,0,0);
break;
}
- if (c_mod->ml_bvalues==NULL)
+ if (c_mod->sm_bvalues==NULL)
{
Debug(LDAP_DEBUG_TRACE,"backsql_modify(): no values given to add for attribute '%s'\n",at->name,0,0);
break;
}
Debug(LDAP_DEBUG_TRACE,"backsql_modify(): adding new values for attribute '%s'\n",at->name,0,0);
- for(i=0,at_val=c_mod->ml_bvalues[0];at_val!=NULL;i++,at_val=c_mod->ml_bvalues[i])
+ for(i=0,at_val=c_mod->sm_bvalues[0];at_val!=NULL;i++,at_val=c_mod->sm_bvalues[i])
{
if (at->expect_return & BACKSQL_ADD)
{
Debug(LDAP_DEBUG_TRACE,"backsql_modify(): delete procedure is not defined for this attribute ('%s')\n",at->name,0,0);
break;
}
- if (c_mod->ml_bvalues==NULL)
+ if (c_mod->sm_bvalues==NULL)
{
Debug(LDAP_DEBUG_TRACE,"backsql_modify(): no values given to delete for attribute '%s' -- deleting all values\n",at->name,0,0);
goto del_all;
}
Debug(LDAP_DEBUG_TRACE,"backsql_modify(): deleting values for attribute '%s'\n",at->name,0,0);
- for(i=0,at_val=c_mod->ml_bvalues[0];at_val!=NULL;i++,at_val=c_mod->ml_bvalues[i])
+ for(i=0,at_val=c_mod->sm_bvalues[0];at_val!=NULL;i++,at_val=c_mod->sm_bvalues[i])
{
if (at->expect_return & BACKSQL_DEL)
{
int backsql_modrdn(BackendDB *be,Connection *conn,Operation *op,
const char *dn,const char *ndn,const char *newrdn,int deleteoldrdn,const char *newSuperior)
{
- Debug(LDAP_DEBUG_TRACE,"==>backsql_modrdn()\n",0,0,0);
+ backsql_info *bi=(backsql_info*)be->be_private;
+ SQLHDBC dbh;
+ SQLHSTMT sth;
+ RETCODE rc;
+ backsql_oc_map_rec *oc=NULL;
+ backsql_entryID e_id,pe_id,new_pid,*res;
+ backsql_at_map_rec *at=NULL;
+ char *p_dn=NULL,*new_pdn=NULL, *new_dn;
+
+
+ Debug(LDAP_DEBUG_TRACE,"==>backsql_modrdn() renaming entry '%s', newrdn='%s', newSuperior='%s'\n",dn,newrdn,newSuperior);
+ dbh=backsql_get_db_conn(be,conn);
+ if (!dbh)
+ {
+ Debug(LDAP_DEBUG_TRACE,"backsql_modrdn(): could not get connection handle - exiting\n",0,0,0);
+ send_ldap_result(conn,op,LDAP_OTHER,"","SQL-backend error",NULL,NULL);
+ return 1;
+ }
+ res=backsql_dn2id(bi,&e_id,dbh,(char*)ndn);
+ if (res==NULL)
+ {
+ Debug(LDAP_DEBUG_TRACE,"backsql_modrdn(): could not lookup entry id\n",0,0,0);
+ send_ldap_result(conn,op,LDAP_NO_SUCH_OBJECT,"",NULL,NULL,NULL);
+ return 1;
+ }
+ Debug(LDAP_DEBUG_TRACE,"backsql_modrdn(): entry id is %d\n",e_id.id,0,0);
+
+ p_dn=dn_parent(be,ndn);
+
+ if (newSuperior)
+ new_pdn=dn_validate(ch_strdup(newSuperior));
+ else
+ new_pdn=p_dn;
+
+ SQLAllocStmt(dbh, &sth);
+
+ if (newSuperior && !strcasecmp(p_dn,new_pdn))
+ {
+ Debug(LDAP_DEBUG_TRACE,"backsql_modrdn(): newSuperior is equal to old parent - aborting\n",0,0,0);
+ send_ldap_result(conn,op,LDAP_OTHER,"",NULL,NULL,NULL);
+ goto modrdn_return;
+ }
+
+ if (newSuperior && !strcasecmp(ndn,new_pdn))
+ {
+ Debug(LDAP_DEBUG_TRACE,"backsql_modrdn(): newSuperior is equal to entry being moved - aborting\n",0,0,0);
+ send_ldap_result(conn,op,LDAP_OTHER,"",NULL,NULL,NULL);
+ goto modrdn_return;
+ }
+
+ build_new_dn( &new_dn, dn, new_pdn, newrdn );
+ if (!dn_validate(new_dn))
+ {
+ Debug(LDAP_DEBUG_TRACE,"backsql_modrdn(): new dn is invalid ('%s') - aborting\n",new_dn,0,0);
+ send_ldap_result(conn,op,LDAP_OTHER,"",NULL,NULL,NULL);
+ goto modrdn_return;
+ }
+ Debug(LDAP_DEBUG_TRACE,"backsql_modrdn(): new entry dn is '%s'\n",new_dn,0,0);
+
+ res=backsql_dn2id(bi,&pe_id,dbh,(char*)p_dn);
+ if (res==NULL)
+ {
+ Debug(LDAP_DEBUG_TRACE,"backsql_modrdn(): could not lookup old parent entry id\n",0,0,0);
+ send_ldap_result(conn,op,LDAP_NO_SUCH_OBJECT,"",NULL,NULL,NULL);
+ goto modrdn_return;
+ }
+ Debug(LDAP_DEBUG_TRACE,"backsql_modrdn(): old parent entry id is %d\n",pe_id.id,0,0);
+
+ res=backsql_dn2id(bi,&new_pid,dbh,(char*)new_pdn);
+ if (res==NULL)
+ {
+ Debug(LDAP_DEBUG_TRACE,"backsql_modrdn(): could not lookup new parent entry id\n",0,0,0);
+ send_ldap_result(conn,op,LDAP_NO_SUCH_OBJECT,"",NULL,NULL,NULL);
+ goto modrdn_return;
+ }
+ Debug(LDAP_DEBUG_TRACE,"backsql_modrdn(): new parent entry id is %d\n",new_pid.id,0,0);
+
+ Debug(LDAP_DEBUG_TRACE,"backsql_modrdn(): executing delentry_query\n",0,0,0);
+ SQLBindParameter(sth,1,SQL_PARAM_INPUT,SQL_C_ULONG,SQL_INTEGER,0,0,&e_id.id,0,0);
+ rc=SQLExecDirect(sth,bi->delentry_query,SQL_NTS);
+ if (rc != SQL_SUCCESS)
+ {
+ Debug(LDAP_DEBUG_TRACE,"backsql_modrdn(): failed to delete record from ldap_entries\n",0,0,0);
+ backsql_PrintErrors(bi->db_env,dbh,sth,rc);
+ send_ldap_result(conn,op,LDAP_OTHER,"","SQL-backend error",NULL,NULL);
+ goto modrdn_return;
+ }
+
+ SQLFreeStmt(sth,SQL_RESET_PARAMS);
+
+ Debug(LDAP_DEBUG_TRACE,"backsql_modrdn(): executing insentry_query\n",0,0,0);
+ backsql_BindParamStr(sth,1,new_dn,BACKSQL_MAX_DN_LEN);
+ SQLBindParameter(sth,2,SQL_PARAM_INPUT,SQL_C_LONG,SQL_INTEGER,0,0,&e_id.oc_id,0,0);
+ SQLBindParameter(sth,3,SQL_PARAM_INPUT,SQL_C_LONG,SQL_INTEGER,0,0,&new_pid.id,0,0);
+ SQLBindParameter(sth,4,SQL_PARAM_INPUT,SQL_C_LONG,SQL_INTEGER,0,0,&e_id.keyval,0,0);
+ rc=SQLExecDirect(sth,bi->insentry_query,SQL_NTS);
+ if (rc != SQL_SUCCESS)
+ {
+ Debug(LDAP_DEBUG_TRACE,"backsql_modrdn(): could not insert ldap_entries record\n",0,0,0);
+ backsql_PrintErrors(bi->db_env,dbh,sth,rc);
+ send_ldap_result(conn,op,LDAP_OTHER,"","SQL-backend error",NULL,NULL);
+ goto modrdn_return;
+ }
+
+ //should process deleteoldrdn here...
+
+ send_ldap_result(conn,op,LDAP_SUCCESS,"",NULL,NULL,NULL);
+modrdn_return:
+ SQLFreeStmt(sth,SQL_DROP);
+ if (p_dn)
+ ch_free(p_dn);
+ if (newSuperior && new_pdn)
+ ch_free(new_pdn);
+ if (new_dn)
+ ch_free(new_dn);
+ Debug(LDAP_DEBUG_TRACE,"<==backsql_modrdn()\n",0,0,0);
return 0;
}
for(at=e->e_attrs;at!=NULL;at=at->a_next)
{
//Debug(LDAP_DEBUG_TRACE,"backsql_add(): scanning entry -- %s\n",at->a_type,0,0);
- if (!strcasecmp(at->a_type,"objectclass"))
+ if (!strcasecmp(at->a_desc->ad_cname->bv_val,"objectclass"))
{
oc=backsql_oc_with_name(bi,at->a_vals[0]->bv_val);
break;
for(at=e->e_attrs;at!=NULL;at=at->a_next)
{
- at_rec=backsql_at_with_name(oc,at->a_type);
+ at_rec=backsql_at_with_name(oc,at->a_desc->ad_cname->bv_val);
+
if (at_rec==NULL)
{
- Debug(LDAP_DEBUG_TRACE,"backsql_add(): attribute provided is not registered in this objectclass ('%s')\n",at->a_type,0,0);
+ Debug(LDAP_DEBUG_TRACE,"backsql_add(): attribute provided is not registered in this objectclass ('%s')\n",at->a_desc->ad_cname->bv_val,0,0);
continue;
}
if (at_rec->add_proc==NULL)
{
- Debug(LDAP_DEBUG_TRACE,"backsql_add(): add procedure is not defined for this attribute ('%s')\n",at->a_type,0,0);
+ Debug(LDAP_DEBUG_TRACE,"backsql_add(): add procedure is not defined for this attribute ('%s')\n",at->a_desc->ad_cname->bv_val,0,0);
continue;
}
return 0;
}
-int backsql_compare(BackendDB *be,Connection *conn,Operation *op,
- const char *dn,const char *ndn,Ava *ava)
+int backsql_compare(BackendDB *bd,
+ Connection *conn, Operation *op,
+ const char *dn, const char *ndn,
+ AttributeAssertion *ava )
{
Debug(LDAP_DEBUG_TRACE,"==>backsql_compare()\n",0,0,0);
return 0;
--- /dev/null
+create table ldap_oc_mappings (
+ id int identity (1, 1) not null ,
+ name varchar (64) not null ,
+ keytbl varchar (64) not null ,
+ keycol varchar (64) not null ,
+ create_proc varchar (255) NULL ,
+ delete_proc varchar (255) NULL,
+ expect_return int not null
+)
+GO
+
+alter table ldap_oc_mappings add
+ constraint pk_ldap_oc_mappings primary key
+ (
+ id
+ )
+GO
+
+
+alter table ldap_oc_mappings add
+ constraint unq1_ldap_oc_mappings unique
+ (
+ name
+ )
+GO
+
+
+create table ldap_attr_mappings (
+ id int identity (1, 1) not null ,
+ oc_map_id int not null references ldap_oc_mappings(id),
+ name varchar (255) not null ,
+ sel_expr varchar (255) not null ,
+ from_tbls varchar (255) not null ,
+ join_where varchar (255) NULL ,
+ add_proc varchar (255) NULL ,
+ modify_proc varchar (255) NULL ,
+ delete_proc varchar (255) NULL ,
+ param_order int not null,
+ expect_return int not null
+)
+GO
+
+alter table ldap_attr_mappings add
+ constraint pk_ldap_attr_mappings primary key
+ (
+ id
+ )
+GO
+
+
+create table ldap_entries (
+ id int identity (1, 1) not null ,
+ dn varchar (255) not null ,
+ oc_map_id int not null references ldap_oc_mappings(id),
+ parent int not null ,
+ keyval int not null
+)
+GO
+
+
+alter table ldap_entries add
+ constraint pk_ldap_entries primary key
+ (
+ id
+ )
+GO
+
+alter table ldap_entries add
+ constraint unq1_ldap_entries unique
+ (
+ oc_map_id,
+ keyval
+ )
+GO
+
+alter table ldap_entries add
+ constraint unq2_ldap_entries unique
+ (
+ dn
+ )
+GO
+
+
+create table ldap_referrals
+ (
+ entry_id int not null references ldap_entries(id),
+ url text not null
+)
+GO
+
+create index entry_idx on ldap_referrals(entry_id);
+
+create table ldap_entry_objclasses
+ (
+ entry_id int not null references ldap_entries(id),
+ oc_name varchar(64)
+ )
+GO
+
+create index entry_idx on ldap_entry_objclasses(entry_id);
\ No newline at end of file
--- /dev/null
+drop table ldap_attr_mappings
+GO
+
+drop table ldap_referrals
+GO
+
+drop table ldap_entry_objclasses
+GO
+
+drop table ldap_entries
+GO
+
+drop table ldap_oc_mappings
+GO
+++ /dev/null
-CREATE TABLE ldap_attrs (
- id int IDENTITY (1, 1) NOT NULL ,
- oc_id int NOT NULL ,
- name varchar (255) NOT NULL ,
- sel_expr varchar (255) NOT NULL ,
- from_tbls varchar (255) NOT NULL ,
- join_where varchar (255) NULL ,
- add_proc varchar (255) NULL ,
- modify_proc varchar (255) NULL ,
- delete_proc varchar (255) NULL ,
- param_order int NOT NULL,
- expect_return int NOT NULL
-)
-GO
-
-CREATE TABLE ldap_entries (
- id int IDENTITY (1, 1) NOT NULL ,
- dn varchar (255) NOT NULL ,
- objclass int NOT NULL ,
- parent int NOT NULL ,
- keyval int NOT NULL
-)
-GO
-
-CREATE TABLE ldap_objclasses (
- id int IDENTITY (1, 1) NOT NULL ,
- name varchar (64) NOT NULL ,
- keytbl varchar (64) NOT NULL ,
- keycol varchar (64) NOT NULL ,
- create_proc varchar (255) NULL ,
- delete_proc varchar (255) NULL,
- expect_return int NOT NULL
-)
-GO
-
-
-ALTER TABLE ldap_attrs WITH NOCHECK ADD
- CONSTRAINT PK_ldap_attrs PRIMARY KEY
- (
- id
- )
-GO
-
-ALTER TABLE ldap_entries WITH NOCHECK ADD
- CONSTRAINT PK_ldap_entries PRIMARY KEY
- (
- id
- )
-GO
-
-ALTER TABLE ldap_entries WITH NOCHECK ADD
- CONSTRAINT UNQ1_ldap_entries UNIQUE
- (
- objclass,
- keyval
- )
-GO
-
-ALTER TABLE ldap_entries WITH NOCHECK ADD
- CONSTRAINT UNQ2_ldap_entries UNIQUE
- (
- dn
- )
-GO
-
-ALTER TABLE ldap_objclasses WITH NOCHECK ADD
- CONSTRAINT PK_ldap_objclasses PRIMARY KEY
- (
- id
- )
-GO
-
-
-ALTER TABLE ldap_objclasses WITH NOCHECK ADD
- CONSTRAINT UNQ_ldap_objclasses UNIQUE
- (
- name
- )
-GO
+++ /dev/null
-
-CREATE TABLE authors_docs (
- pers_id int NOT NULL ,
- doc_id int NOT NULL
-)
-GO
-
-CREATE TABLE documents (
- id int IDENTITY (1, 1) NOT NULL ,
- abstract varchar (255) NULL ,
- title varchar (255) NULL ,
- body binary (255) NULL
-)
-GO
-
-CREATE TABLE institutes (
- id int IDENTITY (1, 1) NOT NULL ,
- name varchar (255) NOT NULL
-)
-GO
-
-
-CREATE TABLE persons (
- id int IDENTITY (1, 1) NOT NULL ,
- name varchar (255) NULL
-)
-GO
-
-CREATE TABLE phones (
- id int IDENTITY (1, 1) NOT NULL ,
- phone varchar (255) NOT NULL ,
- pers_id int NOT NULL
-)
-GO
-
-ALTER TABLE authors_docs WITH NOCHECK ADD
- CONSTRAINT PK_authors_docs PRIMARY KEY
- (
- pers_id,
- doc_id
- )
-GO
-
-ALTER TABLE documents WITH NOCHECK ADD
- CONSTRAINT PK_documents PRIMARY KEY
- (
- id
- )
-GO
-
-ALTER TABLE institutes WITH NOCHECK ADD
- CONSTRAINT PK_institutes PRIMARY KEY
- (
- id
- )
-GO
-
-
-ALTER TABLE persons WITH NOCHECK ADD
- CONSTRAINT PK_persons PRIMARY KEY
- (
- id
- )
-GO
-
-ALTER TABLE phones WITH NOCHECK ADD
- CONSTRAINT PK_phones PRIMARY KEY
- (
- id
- )
-GO
-
-SET QUOTED_IDENTIFIER OFF SET ANSI_NULLS ON
-GO
-
-CREATE PROCEDURE add_phone @pers_id int, @phone varchar(255) AS
-INSERT INTO ldap.phones (pers_id,phone) VALUES (@pers_id,@phone)
-GO
-
-CREATE PROCEDURE create_person @@keyval int OUTPUT AS
-INSERT INTO ldap.persons (name) VALUES ('');
-set @@keyval=(SELECT MAX(id) FROM ldap.persons)
-GO
-
-CREATE PROCEDURE delete_person @keyval int AS
-DELETE FROM ldap.phones WHERE pers_id=@keyval;
-DELETE FROM ldap.authors_docs WHERE pers_id=@keyval;
-DELETE FROM ldap.persons WHERE id=@keyval;
-GO
-
-CREATE PROCEDURE create_org @@keyval int OUTPUT AS
-INSERT INTO ldap.institutes (name) VALUES ('');
-set @@keyval=(SELECT MAX(id) FROM ldap.institutes)
-GO
-
-CREATE PROCEDURE create_document @@keyval int OUTPUT AS
-INSERT INTO ldap.documents (title) VALUES ('');
-set @@keyval=(SELECT MAX(id) FROM ldap.documents)
-GO
-
-CREATE PROCEDURE delete_org @keyval int AS
-DELETE FROM ldap.institutes WHERE id=@keyval;
-GO
-
-CREATE PROCEDURE delete_document @keyval int AS
-DELETE FROM ldap.authors_docs WHERE doc_id=@keyval;
-DELETE FROM ldap.documents WHERE id=@keyval;
-GO
-
-CREATE PROCEDURE delete_phone @keyval int,@phone varchar(64) AS
-DELETE FROM ldap.phones WHERE pers_id=@keyval AND phone=@phone;
-GO
-
-CREATE PROCEDURE set_person_name @keyval int, @new_name varchar(255) AS
-UPDATE ldap.persons SET name=@new_name WHERE id=@keyval;
-GO
-
-CREATE PROCEDURE set_org_name @keyval int, @new_name varchar(255) AS
-UPDATE ldap.institutes SET name=@new_name WHERE id=@keyval;
-GO
-
-CREATE PROCEDURE set_doc_title @keyval int, @new_title varchar(255) AS
-UPDATE ldap.documents SET title=@new_title WHERE id=@keyval;
-GO
-
-CREATE PROCEDURE set_doc_abstract @keyval int, @new_abstract varchar(255) AS
-UPDATE ldap.documents SET abstract=@new_abstract WHERE id=@keyval;
-GO
-
-CREATE PROCEDURE make_author_link @keyval int, @author_dn varchar(255) AS
-DECLARE @per_id int;
-SET @per_id=(SELECT keyval FROM ldap.ldap_entries
- WHERE objclass=1 AND dn=@author_dn);
-IF NOT (@per_id IS NULL)
- INSERT INTO ldap.authors_docs (doc_id,pers_id) VALUES (@keyval,@per_id);
-GO
-
-CREATE PROCEDURE make_doc_link @keyval int, @doc_dn varchar(255) AS
-DECLARE @doc_id int;
-SET @doc_id=(SELECT keyval FROM ldap.ldap_entries
- WHERE objclass=2 AND dn=@doc_dn);
-IF NOT (@doc_id IS NULL)
- INSERT INTO ldap.authors_docs (pers_id,doc_id) VALUES (@keyval,@doc_id);
-GO
-
-CREATE PROCEDURE del_doc_link @keyval int, @doc_dn varchar(255) AS
-DECLARE @doc_id int;
-SET @doc_id=(SELECT keyval FROM ldap.ldap_entries
- WHERE objclass=2 AND dn=@doc_dn);
-IF NOT (@doc_id IS NULL)
-DELETE FROM ldap.authors_docs WHERE pers_id=@keyval AND doc_id=@doc_id;
-GO
-
-CREATE PROCEDURE del_author_link @keyval int, @author_dn varchar(255) AS
-DECLARE @per_id int;
-SET @per_id=(SELECT keyval FROM ldap.ldap_entries
- WHERE objclass=1 AND dn=@author_dn);
-IF NOT (@per_id IS NULL)
- DELETE FROM ldap.authors_docs WHERE doc_id=@keyval AND pers_id=@per_id;
-GO
+++ /dev/null
-
-if exists (select * from sysobjects where id = object_id(N'ldap_attrs') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
-drop table ldap_attrs
-GO
-
-if exists (select * from sysobjects where id = object_id(N'ldap_entries') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
-drop table ldap_entries
-GO
-
-if exists (select * from sysobjects where id = object_id(N'ldap_objclasses') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
-drop table ldap_objclasses
-GO
-
+++ /dev/null
-drop procedure create_person
-drop procedure set_person_name
-drop procedure delete_phone
-drop procedure add_phone
-drop procedure make_doc_link
-drop procedure del_doc_link
-drop procedure delete_person
-
-drop procedure create_org
-drop procedure set_org_name
-drop procedure delete_org
-
-drop procedure create_document
-drop procedure set_doc_title
-drop procedure set_doc_abstract
-drop procedure make_author_link
-drop procedure del_author_link
-drop procedure delete_document
-
-if exists (select * from sysobjects where id = object_id(N'authors_docs') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
-drop table authors_docs
-GO
-
-if exists (select * from sysobjects where id = object_id(N'documents') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
-drop table documents
-GO
-
-if exists (select * from sysobjects where id = object_id(N'institutes') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
-drop table institutes
-GO
-
-if exists (select * from sysobjects where id = object_id(N'persons') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
-drop table persons
-GO
-
-if exists (select * from sysobjects where id = object_id(N'phones') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
-drop table phones
-GO
-
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
-include ./slapd.at.conf
-include ./slapd.oc.conf
+include ./schema/core.schema
+include ./schema/cosine.schema
+include ./schema/inetorgperson.schema
# Define global ACLs to disable default read access.
argsfile ./slapd.args
#######################################################################
-# ldbm database definitions
+# sql database definitions
#######################################################################
-#database ldbm
-#suffix "dc=your-domain, dc=com"
-#suffix "o=Your Organization Name, c=US"
-#directory /usr/tmp
-#rootdn "cn=root, dc=your-domain, dc=com"
-#rootdn "cn=root, o=Your Organization Name, c=US"
-#rootpw secret
-# cleartext passwords, especially for the rootdn, should
-# be avoid. See slapd.conf(5) for details.
-
database sql
suffix "o=sql,c=RU"
rootdn "cn=root,o=sql,c=RU"
+++ /dev/null
-set IDENTITY_INSERT institutes ON
-insert into institutes (id,name) values (1,'sql')
-set IDENTITY_INSERT institutes OFF
-
-set IDENTITY_INSERT persons ON
-insert into persons (id,name) values (1,'Mitya Kovalev')
-insert into persons (id,name) values (2,'Torvlobnor Puzdoy')
-insert into persons (id,name) values (3,'Akakiy Zinberstein')
-set IDENTITY_INSERT persons OFF
-
-set IDENTITY_INSERT phones ON
-insert into phones (id,phone,pers_id) values (1,'332-2334',1)
-insert into phones (id,phone,pers_id) values (2,'222-3234',1)
-insert into phones (id,phone,pers_id) values (3,'545-4563',2)
-set IDENTITY_INSERT phones OFF
-
-set IDENTITY_INSERT documents ON
-insert into documents (id,abstract,title) values (1,'abstract1','book1')
-insert into documents (id,abstract,title) values (2,'abstract2','book2')
-set IDENTITY_INSERT documents OFF
-
-insert into authors_docs (pers_id,doc_id) values (1,1)
-insert into authors_docs (pers_id,doc_id) values (1,2)
-insert into authors_docs (pers_id,doc_id) values (2,1)
-
-SET IDENTITY_INSERT ldap_entries ON
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (1,'o=sql,c=RU',3,0,1)
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (2,'cn=Mitya Kovalev,o=sql,c=RU',1,1,1)
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (3,'cn=Torvlobnor Puzdoy,o=sql,c=RU',1,1,2)
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (4,'cn=Akakiy Zinberstein,o=sql,c=RU',1,1,3)
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (5,'documentTitle=book1,o=sql,c=RU',2,1,1)
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (6,'documentTitle=book2,o=sql,c=RU',2,1,2)
-
-SET IDENTITY_INSERT ldap_entries OFF
+++ /dev/null
-
-
-SET IDENTITY_INSERT ldap_objclasses ON
-insert into ldap_objclasses (id,name,keytbl,keycol,create_proc,delete_proc,expect_return)
-values (1,'person','persons','id','{call create_person(?)}','{call delete_person(?)}',0)
-
-insert into ldap_objclasses (id,name,keytbl,keycol,create_proc,delete_proc,expect_return)
-values (2,'document','documents','id','{call create_document(?)}','{call delete_document(?)}',0)
-
-insert into ldap_objclasses (id,name,keytbl,keycol,create_proc,delete_proc,expect_return)
-values (3,'organization','institutes','id','{call create_org(?)}','{call delete_org(?)}',0)
-SET IDENTITY_INSERT ldap_objclasses OFF
-
-
-SET IDENTITY_INSERT ldap_attrs ON
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (1,1,'cn','persons.name','persons',NULL,'{call set_person_name(?,?)}',
- NULL,NULL,0,0)
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (2,1,'telephoneNumber','phones.phone','persons,phones',
- 'phones.pers_id=persons.id','{call add_phone(?,?)}',
- NULL,'{call delete_phone(?,?)}',0,0)
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (3,1,'sn','persons.name','persons',NULL,'{call set_person_name(?,?)}',
- NULL,NULL,0,0)
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (4,2,'abstract','documents.abstract','documents',NULL,'{call set_doc_abstract(?,?)}',
- NULL,NULL,0,0)
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (5,2,'documentTitle','documents.title','documents',NULL,'{call set_doc_title(?,?)}',
- NULL,NULL,0,0)
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (6,2,'documentAuthor','persons.name','persons,documents,authors_docs',
- 'persons.id=authors_docs.pers_id AND documents.id=authors_docs.doc_id',
- NULL,NULL,NULL,0,0)
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (7,3,'o','institutes.name','institutes',NULL,'{call set_org_name(?,?)}',
- NULL,NULL,0,0)
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (8,1,'documentDN','ldap_entries.dn','ldap_entries,documents,authors_docs,persons',
- 'ldap_entries.keyval=documents.id AND ldap_entries.objclass=2 AND authors_docs.doc_id=documents.id AND authors_docs.pers_id=persons.id',
- '{call make_doc_link(?,?)}',NULL,'{call del_doc_link(?,?)}',0,0)
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (9,2,'authorDN','ldap_entries.dn','ldap_entries,documents,authors_docs,persons',
- 'ldap_entries.keyval=persons.id AND ldap_entries.objclass=1 AND authors_docs.doc_id=documents.id AND authors_docs.pers_id=persons.id',
- '{call make_author_link(?,?)}',NULL,'{call del_author_link(?,?)}',0,0)
-
-SET IDENTITY_INSERT ldap_attrs OFF
--- /dev/null
+
+CREATE TABLE authors_docs (
+ pers_id int NOT NULL ,
+ doc_id int NOT NULL
+)
+GO
+
+CREATE TABLE documents (
+ id int IDENTITY (1, 1) NOT NULL ,
+ abstract varchar (255) NULL ,
+ title varchar (255) NULL ,
+ body binary (255) NULL
+)
+GO
+
+CREATE TABLE institutes (
+ id int IDENTITY (1, 1) NOT NULL ,
+ name varchar (255) NOT NULL
+)
+GO
+
+
+CREATE TABLE persons (
+ id int IDENTITY (1, 1) NOT NULL ,
+ name varchar (255) NULL
+)
+GO
+
+CREATE TABLE phones (
+ id int IDENTITY (1, 1) NOT NULL ,
+ phone varchar (255) NOT NULL ,
+ pers_id int NOT NULL
+)
+GO
+
+ALTER TABLE authors_docs WITH NOCHECK ADD
+ CONSTRAINT PK_authors_docs PRIMARY KEY
+ (
+ pers_id,
+ doc_id
+ )
+GO
+
+ALTER TABLE documents WITH NOCHECK ADD
+ CONSTRAINT PK_documents PRIMARY KEY
+ (
+ id
+ )
+GO
+
+ALTER TABLE institutes WITH NOCHECK ADD
+ CONSTRAINT PK_institutes PRIMARY KEY
+ (
+ id
+ )
+GO
+
+
+ALTER TABLE persons WITH NOCHECK ADD
+ CONSTRAINT PK_persons PRIMARY KEY
+ (
+ id
+ )
+GO
+
+ALTER TABLE phones WITH NOCHECK ADD
+ CONSTRAINT PK_phones PRIMARY KEY
+ (
+ id
+ )
+GO
+
--- /dev/null
+set IDENTITY_INSERT institutes ON
+insert into institutes (id,name) values (1,'sql')
+set IDENTITY_INSERT institutes OFF
+
+set IDENTITY_INSERT persons ON
+insert into persons (id,name) values (1,'Mitya Kovalev')
+insert into persons (id,name) values (2,'Torvlobnor Puzdoy')
+insert into persons (id,name) values (3,'Akakiy Zinberstein')
+set IDENTITY_INSERT persons OFF
+
+set IDENTITY_INSERT phones ON
+insert into phones (id,phone,pers_id) values (1,'332-2334',1)
+insert into phones (id,phone,pers_id) values (2,'222-3234',1)
+insert into phones (id,phone,pers_id) values (3,'545-4563',2)
+set IDENTITY_INSERT phones OFF
+
+set IDENTITY_INSERT documents ON
+insert into documents (id,abstract,title) values (1,'abstract1','book1')
+insert into documents (id,abstract,title) values (2,'abstract2','book2')
+set IDENTITY_INSERT documents OFF
+
+insert into authors_docs (pers_id,doc_id) values (1,1)
+insert into authors_docs (pers_id,doc_id) values (1,2)
+insert into authors_docs (pers_id,doc_id) values (2,1)
--- /dev/null
+drop procedure create_person
+drop procedure set_person_name
+drop procedure delete_phone
+drop procedure add_phone
+drop procedure make_doc_link
+drop procedure del_doc_link
+drop procedure delete_person
+
+drop procedure create_org
+drop procedure set_org_name
+drop procedure delete_org
+
+drop procedure create_document
+drop procedure set_doc_title
+drop procedure set_doc_abstract
+drop procedure make_author_link
+drop procedure del_author_link
+drop procedure delete_document
+
+if exists (select * from sysobjects where id = object_id(N'authors_docs') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
+drop table authors_docs
+GO
+
+if exists (select * from sysobjects where id = object_id(N'documents') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
+drop table documents
+GO
+
+if exists (select * from sysobjects where id = object_id(N'institutes') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
+drop table institutes
+GO
+
+if exists (select * from sysobjects where id = object_id(N'persons') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
+drop table persons
+GO
+
+if exists (select * from sysobjects where id = object_id(N'phones') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
+drop table phones
+GO
+
--- /dev/null
+drop table if exists ldap_oc_mappings;
+create table ldap_oc_mappings
+ (
+ id integer unsigned not null primary key auto_increment,
+ name varchar(64) not null,
+ keytbl varchar(64) not null,
+ keycol varchar(64) not null,
+ create_proc varchar(255),
+ delete_proc varchar(255),
+ expect_return tinyint not null
+);
+
+drop table if exists ldap_attr_mappings;
+create table ldap_attr_mappings
+ (
+ id integer unsigned not null primary key auto_increment,
+ oc_map_id integer unsigned not null references ldap_oc_mappings(id),
+ name varchar(255) not null,
+ sel_expr varchar(255) not null,
+ from_tbls varchar(255) not null,
+ join_where varchar(255),
+ add_proc varchar(255),
+ delete_proc varchar(255),
+ param_order tinyint not null,
+ expect_return tinyint not null
+);
+
+drop table if exists ldap_entries;
+create table ldap_entries
+ (
+ id integer unsigned not null primary key auto_increment,
+ dn varchar(255) not null,
+ oc_map_id integer unsigned not null references ldap_oc_mappings(id),
+ parent int NOT NULL ,
+ keyval int NOT NULL
+);
+
+alter table ldap_entries add
+ constraint unq1_ldap_entries unique
+ (
+ oc_map_id,
+ keyval
+ );
+
+alter table ldap_entries add
+ constraint unq2_ldap_entries unique
+ (
+ dn
+ );
+
+drop table if exists ldap_referrals;
+create table ldap_referrals
+ (
+ entry_id integer not null references ldap_entries(id),
+ url text not null
+);
+
+drop table if exists ldap_entry_objclasses;
+create table ldap_entry_objclasses
+ (
+ entry_id integer not null references ldap_entries(id),
+ oc_name varchar(64)
+ );
+
--- /dev/null
+DROP TABLE IF EXISTS ldap_referrals;
+
+DROP TABLE IF EXISTS ldap_entry_objclasses;
+
+DROP TABLE IF EXISTS ldap_attr_mappings;
+
+DROP TABLE IF EXISTS ldap_entries;
+
+DROP TABLE IF EXISTS ldap_oc_mappings;
+++ /dev/null
-CREATE TABLE ldap_attrs (
- id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
- oc_id int NOT NULL,
- name varchar(255) NOT NULL,
- sel_expr varchar(255) NOT NULL,
- from_tbls varchar(255) NOT NULL,
- join_where varchar(255),
- add_proc varchar(255),
- modify_proc varchar(255),
- delete_proc varchar(255),
- param_order tinyint NOT NULL,
- expect_return tinyint NOT NULL
-);
-
-
-CREATE TABLE ldap_entries (
- id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
- dn varchar(255) NOT NULL ,
- objclass int NOT NULL ,
- parent int NOT NULL ,
- keyval int NOT NULL
-);
-
-
-CREATE TABLE ldap_objclasses (
- id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
- name varchar(64) NOT NULL ,
- keytbl varchar(64) NOT NULL ,
- keycol varchar(64) NOT NULL ,
- create_proc varchar(255),
- delete_proc varchar(255),
- expect_return tinyint NOT NULL
-);
-
-ALTER TABLE ldap_entries ADD
- CONSTRAINT UNQ1_ldap_entries UNIQUE
- (
- objclass,
- keyval
- );
-
-ALTER TABLE ldap_entries ADD
- CONSTRAINT UNQ2_ldap_entries UNIQUE
- (
- dn
- );
-
-
-ALTER TABLE ldap_objclasses ADD
- CONSTRAINT UNQ_ldap_objclasses UNIQUE
- (
- name
- );
+++ /dev/null
-CREATE TABLE persons (
- id int NOT NULL,
- name varchar(255) NOT NULL
-);
-
-CREATE TABLE institutes (
- id int NOT NULL,
- name varchar(255)
-);
-
-CREATE TABLE documents (
- id int NOT NULL,
- title varchar(255) NOT NULL,
- abstract varchar(255)
-);
-
-CREATE TABLE authors_docs (
- pers_id int NOT NULL,
- doc_id int NOT NULL
-);
-
-CREATE TABLE phones (
- id int NOT NULL ,
- phone varchar(255) NOT NULL ,
- pers_id int NOT NULL
-);
-
-
-
-ALTER TABLE authors_docs ADD
- CONSTRAINT PK_authors_docs PRIMARY KEY
- (
- pers_id,
- doc_id
- );
-
-ALTER TABLE documents ADD
- CONSTRAINT PK_documents PRIMARY KEY
- (
- id
- );
-
-ALTER TABLE institutes ADD
- CONSTRAINT PK_institutes PRIMARY KEY
- (
- id
- );
-
-
-ALTER TABLE persons ADD
- CONSTRAINT PK_persons PRIMARY KEY
- (
- id
- );
-
-ALTER TABLE phones ADD
- CONSTRAINT PK_phones PRIMARY KEY
- (
- id
- );
-
+++ /dev/null
-DROP TABLE IF EXISTS ldap_attrs;
-
-DROP TABLE IF EXISTS ldap_entries;
-
-DROP TABLE IF EXISTS ldap_objclasses;
+++ /dev/null
-DROP TABLE IF EXISTS persons;
-DROP TABLE IF EXISTS institutes;
-DROP TABLE IF EXISTS documents;
-DROP TABLE IF EXISTS authors_docs;
-DROP TABLE IF EXISTS phones;
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
-include /usr/local/etc/openldap/slapd.at.conf
-include /usr/local/etc/openldap/slapd.oc.conf
+include /usr/local/etc/openldap/schema/core.schema
+include /usr/local/etc/openldap/schema/cosine.schema
+include /usr/local/etc/openldap/schema/inetorgperson.schema
# Define global ACLs to disable default read access.
argsfile /usr/local/var/slapd.args
#######################################################################
-# ldbm database definitions
+# sql database definitions
#######################################################################
database sql
dbuser root
dbpasswd
subtree_cond "ldap_entries.dn LIKE CONCAT('%',?)"
-insentry_query "INSERT INTO ldap_entries (dn,objclass,parent,keyval) VALUES (?,?,?,?)"
+insentry_query "INSERT INTO ldap_entries (dn,oc_map_id,parent,keyval) VALUES (?,?,?,?)"
+++ /dev/null
-insert into institutes (id,name) values (1,'sql');
-
-insert into persons (id,name) values (1,'Mitya Kovalev');
-insert into persons (id,name) values (2,'Torvlobnor Puzdoy');
-insert into persons (id,name) values (3,'Akakiy Zinberstein');
-
-insert into phones (id,phone,pers_id) values (1,'332-2334',1);
-insert into phones (id,phone,pers_id) values (2,'222-3234',1);
-insert into phones (id,phone,pers_id) values (3,'545-4563',2);
-
-insert into documents (id,abstract,title) values (1,'abstract1','book1');
-insert into documents (id,abstract,title) values (2,'abstract2','book2');
-
-insert into authors_docs (pers_id,doc_id) values (1,1);
-insert into authors_docs (pers_id,doc_id) values (1,2);
-insert into authors_docs (pers_id,doc_id) values (2,1);
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (1,'o=sql,c=RU',3,0,1);
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (2,'cn=Mitya Kovalev,o=sql,c=RU',1,1,1);
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (3,'cn=Torvlobnor Puzdoy,o=sql,c=RU',1,1,2);
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (4,'cn=Akakiy Zinberstein,o=sql,c=RU',1,1,3);
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (5,'documentTitle=book1,o=sql,c=RU',2,1,1);
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (6,'documentTitle=book2,o=sql,c=RU',2,1,2);
+++ /dev/null
-insert into ldap_objclasses (id,name,keytbl,keycol,create_proc,delete_proc,expect_return)
-values (1,'person','persons','id',"insert into persons (name) values ('');\n select last_insert_id();",NULL,0);
-
-insert into ldap_objclasses (id,name,keytbl,keycol,create_proc,delete_proc,expect_return)
-values (2,'document','documents','id',NULL,NULL,0);
-
-insert into ldap_objclasses (id,name,keytbl,keycol,create_proc,delete_proc,expect_return)
-values (3,'organization','institutes','id',NULL,NULL,0);
-
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (1,1,'cn','persons.name','persons',NULL,NULL,NULL,NULL,3,0);
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (2,1,'telephoneNumber','phones.phone','persons,phones',
- 'phones.pers_id=persons.id',NULL,NULL,NULL,3,0);
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (3,1,'sn','persons.name','persons',NULL,NULL,NULL,NULL,3,0);
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (4,2,'abstract','documents.abstract','documents',NULL,NULL,NULL,NULL,3,0);
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (5,2,'documentTitle','documents.title','documents',NULL,NULL,NULL,NULL,3,0);
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (6,2,'documentAuthor','persons.name','persons,documents,authors_docs',
- 'persons.id=authors_docs.pers_id AND documents.id=authors_docs.doc_id',
- NULL,NULL,NULL,3,0);
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (7,3,'o','institutes.name','institutes',NULL,NULL,NULL,NULL,3,0);
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (8,1,'documentDN','ldap_entries.dn','ldap_entries,documents,authors_docs,persons',
- 'ldap_entries.keyval=documents.id AND ldap_entries.objclass=2 AND authors_docs.doc_id=documents.id AND authors_docs.pers_id=persons.id',
- NULL,NULL,NULL,3,0);
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (9,2,'authorDN','ldap_entries.dn','ldap_entries,documents,authors_docs,persons',
- 'ldap_entries.keyval=persons.id AND ldap_entries.objclass=1 AND authors_docs.doc_id=documents.id AND authors_docs.pers_id=persons.id',
- NULL,NULL,NULL,3,0);
--- /dev/null
+drop table if exists persons;
+CREATE TABLE persons (
+ id int NOT NULL,
+ name varchar(255) NOT NULL
+);
+
+drop table if exists institutes;
+CREATE TABLE institutes (
+ id int NOT NULL,
+ name varchar(255)
+);
+
+drop table if exists documents;
+CREATE TABLE documents (
+ id int NOT NULL,
+ title varchar(255) NOT NULL,
+ abstract varchar(255)
+);
+
+drop table if exists authors_docs;
+CREATE TABLE authors_docs (
+ pers_id int NOT NULL,
+ doc_id int NOT NULL
+);
+
+drop table if exists phones;
+CREATE TABLE phones (
+ id int NOT NULL ,
+ phone varchar(255) NOT NULL ,
+ pers_id int NOT NULL
+);
+
+
+
+ALTER TABLE authors_docs ADD
+ CONSTRAINT PK_authors_docs PRIMARY KEY
+ (
+ pers_id,
+ doc_id
+ );
+
+ALTER TABLE documents ADD
+ CONSTRAINT PK_documents PRIMARY KEY
+ (
+ id
+ );
+
+ALTER TABLE institutes ADD
+ CONSTRAINT PK_institutes PRIMARY KEY
+ (
+ id
+ );
+
+
+ALTER TABLE persons ADD
+ CONSTRAINT PK_persons PRIMARY KEY
+ (
+ id
+ );
+
+ALTER TABLE phones ADD
+ CONSTRAINT PK_phones PRIMARY KEY
+ (
+ id
+ );
+
--- /dev/null
+insert into institutes (id,name) values (1,'sql');
+
+insert into persons (id,name) values (1,'Mitya Kovalev');
+insert into persons (id,name) values (2,'Torvlobnor Puzdoy');
+insert into persons (id,name) values (3,'Akakiy Zinberstein');
+
+insert into phones (id,phone,pers_id) values (1,'332-2334',1);
+insert into phones (id,phone,pers_id) values (2,'222-3234',1);
+insert into phones (id,phone,pers_id) values (3,'545-4563',2);
+
+insert into documents (id,abstract,title) values (1,'abstract1','book1');
+insert into documents (id,abstract,title) values (2,'abstract2','book2');
+
+insert into authors_docs (pers_id,doc_id) values (1,1);
+insert into authors_docs (pers_id,doc_id) values (1,2);
+insert into authors_docs (pers_id,doc_id) values (2,1);
--- /dev/null
+DROP TABLE IF EXISTS persons;
+DROP TABLE IF EXISTS institutes;
+DROP TABLE IF EXISTS documents;
+DROP TABLE IF EXISTS authors_docs;
+DROP TABLE IF EXISTS phones;
--- /dev/null
+create table ldap_oc_mappings (
+ id number not null ,
+ name varchar2(64) not null ,
+ keytbl varchar2(64) not null ,
+ keycol varchar2(64) not null ,
+ create_proc varchar2(255),
+ delete_proc varchar2(255),
+ expect_return number not null
+);
+
+alter table ldap_oc_mappings add
+ constraint PK_ldap_oc_mappings primary key
+ (
+ id
+ );
+
+alter table ldap_oc_mappings add
+ constraint unq_ldap_oc_mappings unique
+ (
+ name
+ );
+
+create table ldap_attr_mappings (
+ id number not null,
+ oc_map_id number not null references ldap_oc_mappings(id),
+ name varchar2(255) not null,
+ sel_expr varchar2(255) not null,
+ from_tbls varchar2(255) not null,
+ join_where varchar2(255),
+ add_proc varchar2(255),
+ delete_proc varchar2(255),
+ param_order number not null,
+ expect_return number not null
+);
+
+alter table ldap_attr_mappings add
+ constraint pk_ldap_attr_mappings primary key
+ (
+ id
+ );
+
+
+create table ldap_entries (
+ id number not null ,
+ dn varchar2(255) not null ,
+ oc_map_id number not null references ldap_oc_mappings(id),
+ parent number not null ,
+ keyval number not null
+);
+
+alter table ldap_entries add
+ constraint PK_ldap_entries primary key
+ (
+ id
+ );
+
+alter table ldap_entries add
+ constraint unq1_ldap_entries unique
+ (
+ oc_map_id,
+ keyval
+ );
+
+alter table ldap_entries add
+ constraint unq2_ldap_entries unique
+ (
+ dn
+ );
+
+create sequence ldap_objclass_ids start with 1 increment by 1;
+
+create sequence ldap_attr_ids start with 1 increment by 1;
+
+create sequence ldap_entry_ids start with 1 increment by 1;
+
+create table ldap_referrals
+ (
+ entry_id number not null references ldap_entries(id),
+ url varchar(1023) not null
+);
+
+create table ldap_entry_objclasses
+ (
+ entry_id number not null references ldap_entries(id),
+ oc_name varchar(64)
+ );
--- /dev/null
+drop table ldap_attr_mappings;
+drop table ldap_entry_objclasses;
+drop table ldap_referrals;
+drop sequence ldap_entry_ids;
+drop sequence ldap_attr_ids;
+drop sequence ldap_objclass_ids;
+drop table ldap_entries;
+drop table ldap_oc_mappings;
+++ /dev/null
-CREATE TABLE ldap_attrs (
- id NUMBER NOT NULL,
- oc_id NUMBER NOT NULL,
- name varchar2(255) NOT NULL,
- sel_expr varchar2(255) NOT NULL,
- from_tbls varchar2(255) NOT NULL,
- join_where varchar2(255),
- add_proc varchar2(255),
- modify_proc varchar2(255),
- delete_proc varchar2(255),
- param_order NUMBER NOT NULL,
- expect_return NUMBER NOT NULL
-);
-
-
-CREATE TABLE ldap_entries (
- id NUMBER NOT NULL ,
- dn varchar2(255) NOT NULL ,
- objclass NUMBER NOT NULL ,
- parent NUMBER NOT NULL ,
- keyval NUMBER NOT NULL
-);
-
-
-CREATE TABLE ldap_objclasses (
- id NUMBER NOT NULL ,
- name varchar2(64) NOT NULL ,
- keytbl varchar2(64) NOT NULL ,
- keycol varchar2(64) NOT NULL ,
- create_proc varchar2(255),
- delete_proc varchar2(255),
- expect_return NUMBER NOT NULL
-);
-
-
-ALTER TABLE ldap_attrs ADD
- CONSTRAINT PK_ldap_attrs PRIMARY KEY
- (
- id
- );
-
-ALTER TABLE ldap_entries ADD
- CONSTRAINT PK_ldap_entries PRIMARY KEY
- (
- id
- );
-
-ALTER TABLE ldap_objclasses ADD
- CONSTRAINT PK_ldap_objclasses PRIMARY KEY
- (
- id
- );
-
-ALTER TABLE ldap_entries ADD
- CONSTRAINT UNQ1_ldap_entries UNIQUE
- (
- objclass,
- keyval
- );
-
-ALTER TABLE ldap_entries ADD
- CONSTRAINT UNQ2_ldap_entries UNIQUE
- (
- dn
- );
-
-
-ALTER TABLE ldap_objclasses ADD
- CONSTRAINT UNQ_ldap_objclasses UNIQUE
- (
- name
- );
-
-
-CREATE SEQUENCE ldap_objclass_ids START WITH 1 INCREMENT BY 1;
-
-CREATE SEQUENCE ldap_attr_ids START WITH 1 INCREMENT BY 1;
-
-CREATE SEQUENCE ldap_entry_ids START WITH 1 INCREMENT BY 1;
+++ /dev/null
-CREATE TABLE persons (
- id NUMBER NOT NULL,
- name varchar2(255) NOT NULL
-);
-
-CREATE TABLE institutes (
- id NUMBER NOT NULL,
- name varchar2(255)
-);
-
-CREATE TABLE documents (
- id NUMBER NOT NULL,
- title varchar2(255) NOT NULL,
- abstract varchar2(255)
-);
-
-CREATE TABLE authors_docs (
- pers_id NUMBER NOT NULL,
- doc_id NUMBER NOT NULL
-);
-
-CREATE TABLE phones (
- id NUMBER NOT NULL ,
- phone varchar2(255) NOT NULL ,
- pers_id NUMBER NOT NULL
-);
-
-
-ALTER TABLE authors_docs ADD
- CONSTRAINT PK_authors_docs PRIMARY KEY
- (
- pers_id,
- doc_id
- );
-
-ALTER TABLE documents ADD
- CONSTRAINT PK_documents PRIMARY KEY
- (
- id
- );
-
-ALTER TABLE institutes ADD
- CONSTRAINT PK_institutes PRIMARY KEY
- (
- id
- );
-
-ALTER TABLE persons ADD
- CONSTRAINT PK_persons PRIMARY KEY
- (
- id
- );
-
-ALTER TABLE phones ADD
- CONSTRAINT PK_phones PRIMARY KEY
- (
- id
- );
-
-CREATE SEQUENCE person_ids START WITH 1 INCREMENT BY 1;
-
-CREATE SEQUENCE document_ids START WITH 1 INCREMENT BY 1;
-
-CREATE SEQUENCE institute_ids START WITH 1 INCREMENT BY 1;
-
-CREATE SEQUENCE phone_ids START WITH 1 INCREMENT BY 1;
-
-CREATE OR REPLACE PROCEDURE create_person(keyval OUT NUMBER) AS
-BEGIN
-INSERT INTO persons (id,name) VALUES (person_ids.nextval,' ');
-SELECT person_ids.currval INTO keyval FROM DUAL;
-END;
-/
-
-CREATE OR REPLACE PROCEDURE delete_person(keyval IN NUMBER) AS
-BEGIN
-DELETE FROM phones WHERE pers_id=keyval;
-DELETE FROM authors_docs WHERE pers_id=keyval;
-DELETE FROM persons WHERE id=keyval;
-END;
-/
-
-CREATE OR REPLACE PROCEDURE create_org(keyval OUT NUMBER) AS
-BEGIN
-INSERT INTO institutes (id,name) VALUES (institute_ids.nextval,' ');
-SELECT institute_ids.currval INTO keyval FROM DUAL;
-END;
-/
-
-CREATE OR REPLACE PROCEDURE delete_org(keyval IN NUMBER) AS
-BEGIN
-DELETE FROM institutes WHERE id=keyval;
-END;
-/
-
-CREATE OR REPLACE PROCEDURE create_document(keyval OUT NUMBER) AS
-BEGIN
-INSERT INTO documents (id,title) VALUES (document_ids.nextval,' ');
-SELECT document_ids.currval INTO keyval FROM DUAL;
-END;
-/
-
-CREATE OR REPLACE PROCEDURE delete_document (keyval IN NUMBER) AS
-BEGIN
-DELETE FROM authors_docs WHERE doc_id=keyval;
-DELETE FROM documents WHERE id=keyval;
-END;
-/
-
-CREATE OR REPLACE PROCEDURE add_phone(pers_id IN NUMBER, phone IN varchar2) AS
-BEGIN
-INSERT INTO phones (id,pers_id,phone) VALUES (phone_ids.nextval,pers_id,phone);
-END;
-/
-
-CREATE OR REPLACE PROCEDURE delete_phone(keyval IN NUMBER, phone IN varchar2) AS
-BEGIN
-DELETE FROM phones WHERE pers_id=keyval AND phone=phone;
-END;
-/
-
-CREATE OR REPLACE PROCEDURE set_person_name(keyval IN NUMBER, new_name IN varchar2) AS
-BEGIN
-UPDATE persons SET name=new_name WHERE id=keyval;
-END;
-/
-
-CREATE OR REPLACE PROCEDURE set_org_name(keyval IN NUMBER, new_name IN varchar2) AS
-BEGIN
-UPDATE institutes SET name=new_name WHERE id=keyval;
-END;
-/
-
-CREATE OR REPLACE PROCEDURE set_doc_title (keyval IN NUMBER, new_title IN varchar2) AS
-BEGIN
-UPDATE documents SET title=new_title WHERE id=keyval;
-END;
-/
-
-CREATE OR REPLACE PROCEDURE set_doc_abstract (keyval IN NUMBER, new_abstract IN varchar2) AS
-BEGIN
-UPDATE documents SET abstract=new_abstract WHERE id=keyval;
-END;
-/
-
-CREATE OR REPLACE FUNCTION make_author_link (keyval IN NUMBER, author_dn IN varchar2) RETURN NUMBER AS
-per_id NUMBER;
-BEGIN
-SELECT keyval INTO per_id FROM ldap_entries
- WHERE objclass=1 AND dn=author_dn;
-IF NOT (per_id IS NULL) THEN
- INSERT INTO authors_docs (doc_id,pers_id) VALUES (keyval,per_id);
- RETURN 1;
-END IF;
-RETURN 0;
-END;
-/
-
-CREATE OR REPLACE FUNCTION make_doc_link (keyval IN NUMBER, doc_dn IN varchar2) RETURN NUMBER AS
-docid NUMBER;
-BEGIN
-SELECT keyval INTO docid FROM ldap_entries
- WHERE objclass=2 AND dn=doc_dn;
-IF NOT (docid IS NULL) THEN
- INSERT INTO authors_docs (pers_id,doc_id) VALUES (keyval,docid);
- RETURN 1;
-END IF;
-RETURN 0;
-END;
-/
-
-CREATE OR REPLACE FUNCTION del_doc_link (keyval IN NUMBER, doc_dn IN varchar2) RETURN NUMBER AS
-docid NUMBER;
-BEGIN
-SELECT keyval INTO docid FROM ldap_entries
- WHERE objclass=2 AND dn=doc_dn;
-IF NOT (docid IS NULL) THEN
- DELETE FROM authors_docs WHERE pers_id=keyval AND doc_id=docid;
- RETURN 1;
-END IF;
-RETURN 0;
-END;
-/
-
-CREATE OR REPLACE FUNCTION del_author_link (keyval IN NUMBER, author_dn IN varchar2) RETURN NUMBER AS
-per_id NUMBER;
-BEGIN
-SELECT keyval INTO per_id FROM ldap_entries
- WHERE objclass=1 AND dn=author_dn;
-
-IF NOT (per_id IS NULL) THEN
- DELETE FROM authors_docs WHERE doc_id=keyval AND pers_id=per_id;
- RETURN 1;
-END IF;
- RETURN 0;
-END;
-/
-
+++ /dev/null
-DROP TABLE ldap_attrs;
-DROP TABLE ldap_entries;
-DROP TABLE ldap_objclasses;
-DROP SEQUENCE ldap_entry_ids;
-DROP SEQUENCE ldap_attr_ids;
-DROP SEQUENCE ldap_objclass_ids;
-
+++ /dev/null
-DROP TABLE persons;
-DROP TABLE institutes;
-DROP TABLE documents;
-DROP TABLE authors_docs;
-DROP TABLE phones;
-DROP SEQUENCE person_ids;
-DROP SEQUENCE institute_ids;
-DROP SEQUENCE document_ids;
-DROP SEQUENCE phone_ids;
-DROP PROCEDURE create_person;
-DROP PROCEDURE delete_person;
-DROP PROCEDURE add_phone;
-DROP PROCEDURE delete_phone;
-DROP PROCEDURE set_person_name;
-DROP PROCEDURE set_org_name;
-DROP PROCEDURE set_doc_title;
-DROP PROCEDURE set_doc_abstract;
-DROP PROCEDURE create_document;
-DROP PROCEDURE create_org;
-DROP PROCEDURE delete_document;
-DROP PROCEDURE delete_org;
-DROP PROCEDURE make_doc_link;
-DROP PROCEDURE del_doc_link;
-DROP PROCEDURE make_author_link;
-DROP PROCEDURE del_author_link;
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
-include ./slapd.at.conf
-include ./slapd.oc.conf
+include /usr/local/etc/openldap/schema/core.schema
+include /usr/local/etc/openldap/schema/cosine.schema
+include /usr/local/etc/openldap/schema/inetorgperson.schema
# Define global ACLs to disable default read access.
# service AND an understanding of referrals.
#referral ldap://root.openldap.org
-pidfile ./slapd.pid
-argsfile ./slapd.args
+pidfile /usr/local/var/slapd.pid
+argsfile /usr/local/var/slapd.args
#######################################################################
-# ldbm database definitions
+# sql database definitions
#######################################################################
-#database ldbm
-#suffix "dc=your-domain, dc=com"
-#suffix "o=Your Organization Name, c=US"
-#directory /usr/tmp
-#rootdn "cn=root, dc=your-domain, dc=com"
-#rootdn "cn=root, o=Your Organization Name, c=US"
-#rootpw secret
-# cleartext passwords, especially for the rootdn, should
-# be avoid. See slapd.conf(5) for details.
-
database sql
suffix "o=sql,c=RU"
rootdn "cn=root,o=sql,c=RU"
rootpw secret
-#dbname ldap_ora8_ms
dbname ldap_ora8
dbuser ldap
dbpasswd ldap
subtree_cond "UPPER(ldap_entries.dn) LIKE CONCAT('%',UPPER(?))"
-insentry_query "INSERT INTO ldap_entries (id,dn,objclass,parent,keyval) VALUES (ldap_entry_ids.nextval,?,?,?,?)"
+insentry_query "INSERT INTO ldap_entries (id,dn,oc_map_id,parent,keyval) VALUES (ldap_entry_ids.nextval,?,?,?,?)"
upper_func UPPER
+++ /dev/null
-insert into institutes (id,name) values (institute_ids.nextval,'sql');
-
-insert into persons (id,name) values (person_ids.nextval,'Mitya Kovalev');
-
-insert into persons (id,name) values (person_ids.nextval,'Torvlobnor Puzdoy');
-
-insert into persons (id,name) values (person_ids.nextval,'Akakiy Zinberstein');
-
-
-insert into phones (id,phone,pers_id) values (phone_ids.nextval,'332-2334',1);
-
-insert into phones (id,phone,pers_id) values (phone_ids.nextval,'222-3234',1);
-
-insert into phones (id,phone,pers_id) values (phone_ids.nextval,'545-4563',2);
-
-
-insert into documents (id,abstract,title) values (document_ids.nextval,'abstract1','book1');
-
-insert into documents (id,abstract,title) values (document_ids.nextval,'abstract2','book2');
-
-
-insert into authors_docs (pers_id,doc_id) values (1,1);
-
-insert into authors_docs (pers_id,doc_id) values (1,2);
-
-insert into authors_docs (pers_id,doc_id) values (2,1);
-
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (ldap_entry_ids.nextval,'o=sql,c=RU',3,0,1);
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (ldap_entry_ids.nextval,'cn=Mitya Kovalev,o=sql,c=RU',1,1,1);
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (ldap_entry_ids.nextval,'cn=Torvlobnor Puzdoy,o=sql,c=RU',1,1,2);
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (ldap_entry_ids.nextval,'cn=Akakiy Zinberstein,o=sql,c=RU',1,1,3);
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (ldap_entry_ids.nextval,'documentTitle=book1,o=sql,c=RU',2,1,1);
-
-insert into ldap_entries (id,dn,objclass,parent,keyval)
-values (ldap_entry_ids.nextval,'documentTitle=book2,o=sql,c=RU',2,1,2);
+++ /dev/null
-insert into ldap_objclasses (id,name,keytbl,keycol,create_proc,delete_proc,expect_return)
-values (1,'person','persons','id','{call create_person(?)}','{call delete_person(?)}',0);
-
-insert into ldap_objclasses (id,name,keytbl,keycol,create_proc,delete_proc,expect_return)
-values (2,'document','documents','id','{call create_document(?)}','{call delete_document(?)}',0);
-
-insert into ldap_objclasses (id,name,keytbl,keycol,create_proc,delete_proc,expect_return)
-values (3,'organization','institutes','id','{call create_org(?)}','{call delete_org(?)}',0);
-
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (1,1,'cn','persons.name','persons',NULL,'{call set_person_name(?,?)}',
- NULL,NULL,0,0);
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (2,1,'telephoneNumber','phones.phone','persons,phones',
- 'phones.pers_id=persons.id','{call add_phone(?,?)}',
- NULL,'{call delete_phone(?,?)}',0,0);
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (3,1,'sn','persons.name','persons',NULL,'{call set_person_name(?,?)}',
- NULL,NULL,0,0);
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (4,2,'abstract','documents.abstract','documents',NULL,'{call set_doc_abstract(?,?)}',
- NULL,NULL,0,0);
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (5,2,'documentTitle','documents.title','documents',NULL,'{call set_doc_title(?,?)}',
- NULL,NULL,0,0);
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (6,2,'documentAuthor','persons.name','persons,documents,authors_docs',
- 'persons.id=authors_docs.pers_id AND documents.id=authors_docs.doc_id',
- NULL,NULL,NULL,0,0);
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (7,3,'o','institutes.name','institutes',NULL,'{call set_org_name(?,?)}',
- NULL,NULL,0,0);
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (8,1,'documentDN','ldap_entries.dn','ldap_entries,documents,authors_docs,persons',
- 'ldap_entries.keyval=documents.id AND ldap_entries.objclass=2 AND authors_docs.doc_id=documents.id AND authors_docs.pers_id=persons.id',
- '{?=call make_doc_link(?,?)}',NULL,'{?=call del_doc_link(?,?)}',0,3);
-
-insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return)
-values (9,2,'authorDN','ldap_entries.dn','ldap_entries,documents,authors_docs,persons',
- 'ldap_entries.keyval=persons.id AND ldap_entries.objclass=1 AND authors_docs.doc_id=documents.id AND authors_docs.pers_id=persons.id',
- '{?=call make_author_link(?,?)}',NULL,'{?=call del_author_link(?,?)}',0,3);
--- /dev/null
+CREATE TABLE persons (
+ id NUMBER NOT NULL,
+ name varchar2(255) NOT NULL
+);
+
+CREATE TABLE institutes (
+ id NUMBER NOT NULL,
+ name varchar2(255)
+);
+
+CREATE TABLE documents (
+ id NUMBER NOT NULL,
+ title varchar2(255) NOT NULL,
+ abstract varchar2(255)
+);
+
+CREATE TABLE authors_docs (
+ pers_id NUMBER NOT NULL,
+ doc_id NUMBER NOT NULL
+);
+
+CREATE TABLE phones (
+ id NUMBER NOT NULL ,
+ phone varchar2(255) NOT NULL ,
+ pers_id NUMBER NOT NULL
+);
+
+
+ALTER TABLE authors_docs ADD
+ CONSTRAINT PK_authors_docs PRIMARY KEY
+ (
+ pers_id,
+ doc_id
+ );
+
+ALTER TABLE documents ADD
+ CONSTRAINT PK_documents PRIMARY KEY
+ (
+ id
+ );
+
+ALTER TABLE institutes ADD
+ CONSTRAINT PK_institutes PRIMARY KEY
+ (
+ id
+ );
+
+ALTER TABLE persons ADD
+ CONSTRAINT PK_persons PRIMARY KEY
+ (
+ id
+ );
+
+ALTER TABLE phones ADD
+ CONSTRAINT PK_phones PRIMARY KEY
+ (
+ id
+ );
+
+CREATE SEQUENCE person_ids START WITH 1 INCREMENT BY 1;
+
+CREATE SEQUENCE document_ids START WITH 1 INCREMENT BY 1;
+
+CREATE SEQUENCE institute_ids START WITH 1 INCREMENT BY 1;
+
+CREATE SEQUENCE phone_ids START WITH 1 INCREMENT BY 1;
--- /dev/null
+insert into institutes (id,name) values (institute_ids.nextval,'sql');
+
+insert into persons (id,name) values (person_ids.nextval,'Mitya Kovalev');
+
+insert into persons (id,name) values (person_ids.nextval,'Torvlobnor Puzdoy');
+
+insert into persons (id,name) values (person_ids.nextval,'Akakiy Zinberstein');
+
+
+insert into phones (id,phone,pers_id) values (phone_ids.nextval,'332-2334',1);
+
+insert into phones (id,phone,pers_id) values (phone_ids.nextval,'222-3234',1);
+
+insert into phones (id,phone,pers_id) values (phone_ids.nextval,'545-4563',2);
+
+
+insert into documents (id,abstract,title) values (document_ids.nextval,'abstract1','book1');
+
+insert into documents (id,abstract,title) values (document_ids.nextval,'abstract2','book2');
+
+
+insert into authors_docs (pers_id,doc_id) values (1,1);
+
+insert into authors_docs (pers_id,doc_id) values (1,2);
+
+insert into authors_docs (pers_id,doc_id) values (2,1);
+
--- /dev/null
+DROP TABLE persons;
+DROP TABLE institutes;
+DROP TABLE documents;
+DROP TABLE authors_docs;
+DROP TABLE phones;
+DROP SEQUENCE person_ids;
+DROP SEQUENCE institute_ids;
+DROP SEQUENCE document_ids;
+DROP SEQUENCE phone_ids;
+DROP PROCEDURE create_person;
+DROP PROCEDURE delete_person;
+DROP PROCEDURE add_phone;
+DROP PROCEDURE delete_phone;
+DROP PROCEDURE set_person_name;
+DROP PROCEDURE set_org_name;
+DROP PROCEDURE set_doc_title;
+DROP PROCEDURE set_doc_abstract;
+DROP PROCEDURE create_document;
+DROP PROCEDURE create_org;
+DROP PROCEDURE delete_document;
+DROP PROCEDURE delete_org;
+DROP PROCEDURE make_doc_link;
+DROP PROCEDURE del_doc_link;
+DROP PROCEDURE make_author_link;
+DROP PROCEDURE del_author_link;
return strcasecmp(m1->name,m2->name);
}
+char* backsql_make_attr_query(backsql_oc_map_rec *oc_map,backsql_at_map_rec *at_map)
+{
+ char *tmps;
+ int tmpslen;
+
+ tmps=NULL;tmpslen=0;
+ tmps=backsql_strcat(tmps,&tmpslen,"SELECT ",at_map->sel_expr," AS ",at_map->name,
+ " FROM ",at_map->from_tbls,
+ " WHERE ",oc_map->keytbl,".",oc_map->keycol,"=?",NULL);
+ if (at_map->join_where!=NULL && at_map->join_where[0]!='\0')
+ tmps=backsql_strcat(tmps,&tmpslen," AND ",at_map->join_where,NULL);
+ at_map->query=ch_strdup(tmps);
+ ch_free(tmps);
+ return at_map->query;
+}
+
+
+int backsql_add_sysmaps(backsql_oc_map_rec *oc_map)
+{
+ backsql_at_map_rec *at_map;
+ long len;
+ char s[30];
+
+ sprintf(s,"%d",oc_map->id);
+ at_map=(backsql_at_map_rec*)ch_calloc(1,sizeof(backsql_at_map_rec));
+ at_map->name=ch_strdup("objectClass");
+ at_map->sel_expr=ch_strdup("ldap_entry_objclasses.oc_name");
+ at_map->from_tbls=ch_strdup("ldap_entry_objclasses,ldap_entries");
+ len=strlen(at_map->from_tbls);
+ backsql_merge_from_clause(&at_map->from_tbls,&len,oc_map->keytbl);
+ at_map->join_where=NULL; len=0;
+ at_map->join_where=backsql_strcat(at_map->join_where,&len,
+ "ldap_entries.id=ldap_entry_objclasses.entry_id and ldap_entries.keyval=",
+ oc_map->keytbl,".",oc_map->keycol," and ldap_entries.oc_map_id=",s,NULL);
+ at_map->add_proc=NULL;
+ at_map->delete_proc=NULL;
+ at_map->param_order=0;
+ at_map->expect_return=0;
+ backsql_make_attr_query(oc_map,at_map);
+ avl_insert(&oc_map->attrs,at_map,(AVL_CMP)backsql_cmp_attr,backsql_dummy);
+
+ at_map=(backsql_at_map_rec*)ch_calloc(1,sizeof(backsql_at_map_rec));
+ at_map->name=ch_strdup("ref");
+ at_map->sel_expr=ch_strdup("ldap_referrals.url");
+ at_map->from_tbls=ch_strdup("ldap_referrals,ldap_entries");
+ len=strlen(at_map->from_tbls);
+ backsql_merge_from_clause(&at_map->from_tbls,&len,oc_map->keytbl);
+ at_map->join_where=NULL; len=0;
+ at_map->join_where=backsql_strcat(at_map->join_where,&len,
+ "ldap_entries.id=ldap_referrals.entry_id and ldap_entries.keyval=",
+ oc_map->keytbl,".",oc_map->keycol," and ldap_entries.oc_map_id=",s,NULL);
+ at_map->add_proc=NULL;
+ at_map->delete_proc=NULL;
+ at_map->param_order=0;
+ at_map->expect_return=0;
+ backsql_make_attr_query(oc_map,at_map);
+ avl_insert(&oc_map->attrs,at_map,(AVL_CMP)backsql_cmp_attr,backsql_dummy);
+
+ return 1;
+}
+
int backsql_load_schema_map(backsql_info *si,SQLHDBC dbh)
{
SQLHSTMT oc_sth,at_sth;
oc_map->name,oc_map->keytbl,oc_map->keycol);
Debug(LDAP_DEBUG_TRACE,"create_proc='%s' delete_proc='%s' expect_return=%d; attributes:\n",
oc_map->create_proc,oc_map->delete_proc,oc_map->expect_return);
+ Debug(LDAP_DEBUG_TRACE,"load_schema_map(): autoadding 'objectClass' and 'ref' mappings\n",0,0,0);
+ backsql_add_sysmaps(oc_map);
if ((rc=SQLExecute(at_sth)) != SQL_SUCCESS)
{
Debug(LDAP_DEBUG_TRACE,"load_schema_map(): error executing at_query: \n",0,0,0);
Debug(LDAP_DEBUG_TRACE,"********'%s'\n",at_row.cols[0],0,0);
Debug(LDAP_DEBUG_TRACE,"name='%s',sel_expr='%s' from='%s' ",at_row.cols[0],
at_row.cols[1],at_row.cols[2]);
- Debug(LDAP_DEBUG_TRACE,"join_where='%s',add_proc='%s' modify_proc='%s' ",at_row.cols[3],
- at_row.cols[4],at_row.cols[5]);
- Debug(LDAP_DEBUG_TRACE,"delete_proc='%s'\n",at_row.cols[6],0,0);
+ Debug(LDAP_DEBUG_TRACE,"join_where='%s',add_proc='%s' ",at_row.cols[3],
+ at_row.cols[4],0);
+ Debug(LDAP_DEBUG_TRACE,"delete_proc='%s'\n",at_row.cols[5],0,0);
at_map=(backsql_at_map_rec*)ch_calloc(1,sizeof(backsql_at_map_rec));
at_map->name=ch_strdup(at_row.cols[0]);
at_map->sel_expr=ch_strdup(at_row.cols[1]);
ch_free(tmps);
at_map->join_where=ch_strdup((at_row.is_null[3]<0)?"":at_row.cols[3]);
at_map->add_proc=(at_row.is_null[4]<0)?NULL:ch_strdup(at_row.cols[4]);
- at_map->modify_proc=(at_row.is_null[5]<0)?NULL:ch_strdup(at_row.cols[5]);
- at_map->delete_proc=(at_row.is_null[6]<0)?NULL:ch_strdup(at_row.cols[6]);
- at_map->param_order=atoi(at_row.cols[7]);
- at_map->expect_return=atoi(at_row.cols[8]);
- tmps=NULL;tmpslen=0;
- tmps=backsql_strcat(tmps,&tmpslen,"SELECT ",at_map->sel_expr," AS ",at_map->name,
- " FROM ",at_map->from_tbls,
- " WHERE ",oc_map->keytbl,".",oc_map->keycol,"=?",NULL);
- if (at_map->join_where!=NULL && at_map->join_where[0]!='\0')
- tmps=backsql_strcat(tmps,&tmpslen," AND ",at_map->join_where,NULL);
- at_map->query=ch_strdup(tmps);
- ch_free(tmps);
+ at_map->delete_proc=(at_row.is_null[5]<0)?NULL:ch_strdup(at_row.cols[5]);
+ at_map->param_order=atoi(at_row.cols[6]);
+ at_map->expect_return=atoi(at_row.cols[7]);
+ backsql_make_attr_query(oc_map,at_map);
Debug(LDAP_DEBUG_TRACE,"load_schema_map(): preconstructed query '%s'\n",at_map->query,0,0);
avl_insert(&oc_map->attrs,at_map,(AVL_CMP)backsql_cmp_attr,backsql_dummy);
}
ch_free(at->join_where);
if (at->add_proc!=NULL)
ch_free(at->add_proc);
- if (at->modify_proc!=NULL)
- ch_free(at->modify_proc);
if (at->delete_proc!=NULL)
ch_free(at->delete_proc);
if (at->query)
char *from_tbls;
char *join_where;
char *sel_expr;
- char *add_proc; //supposed to expect 2 binded values: entry keyval and attr. value to add, like "add_name(?,?)"
- char *modify_proc; //supposed to expect two binded values: entry keyval and old and new values of attr
+ char *add_proc; //supposed to expect 2 binded values: entry keyval and attr. value to add, like "add_name(?,?,?)"
char *delete_proc; //supposed to expect 2 binded values: entry keyval and attr. value to delete
char *query; //for optimization purposes attribute load query is preconstructed from parts on schemamap load time
//following flags are bitmasks (first bit used for add_proc, second - for modify, third - for delete_proc)
char *sub_clause=NULL;
int len=0,res;
+ if (!f)
+ return 0;
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",NULL);
while(1)
{
int backsql_process_sub_filter(backsql_srch_info *bsi,Filter *f)
{
int i;
-
- backsql_at_map_rec *at=backsql_at_with_name(bsi->oc,f->f_sub_type);
+ backsql_at_map_rec *at=backsql_at_with_name(bsi->oc,f->f_sub_desc->ad_cname->bv_val);
+
+ if (!f)
+ return 0;
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",NULL);
int done=0,len=0;
Debug(LDAP_DEBUG_TRACE,"==>backsql_process_filter()\n",0,0,0);
+ if (f==NULL)
+ {
+ return 0;
+ }
+
switch(f->f_choice)
{
case LDAP_FILTER_OR:
done=1;
break;
case LDAP_FILTER_PRESENT:
- at_name=f->f_type;
+ at_name=f->f_desc->ad_cname->bv_val;
break;
default:
- at_name=f->f_avtype;
+ at_name=f->f_av_desc->ad_cname->bv_val;
break;
}
//upper_func stuff is made for Oracle, where UPPER is
//safely applicable to NUMBER etc.
if (bsi->bi->upper_func)
- bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",
+ bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",
bsi->bi->upper_func,"(",at->sel_expr,")='",
- f->f_avvalue.bv_val,"')",NULL);
+ f->f_av_value->bv_val,"')",NULL);
else
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",at->sel_expr,"='",
- f->f_avvalue.bv_val,"')",NULL);
+ f->f_av_value->bv_val,"')",NULL);
+
break;
case LDAP_FILTER_GE:
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",at->sel_expr,">=",
- f->f_avvalue.bv_val,")",NULL);
+ f->f_av_value->bv_val,")",NULL);
+
break;
case LDAP_FILTER_LE:
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",at->sel_expr,"<=",
- f->f_avvalue.bv_val,")",NULL);
+ f->f_av_value->bv_val,")",NULL);
break;
case LDAP_FILTER_PRESENT:
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"NOT (",at->sel_expr,
bsi->from=backsql_strcat(bsi->from,&bsi->from_len," FROM ldap_entries,",bsi->oc->keytbl,NULL);
bsi->join_where=backsql_strcat(bsi->join_where,&bsi->jwhere_len," WHERE ",
bsi->oc->keytbl,".",bsi->oc->keycol,"=ldap_entries.keyval AND ",
- "ldap_entries.objclass=? AND ",NULL);
+ "ldap_entries.oc_map_id=? AND ",NULL);
switch(bsi->scope)
{
SQLHDBC dbh;
int sres;
int nentries;
- Entry entry,*res;
+ Entry *entry,*res;
int manageDSAit = get_manageDSAit( op );
struct berval **v2refs = NULL;
time_t stoptime;
Debug(LDAP_DEBUG_TRACE,"backsql_search(): loading data for entry id=%d, oc_id=%d, keyval=%d\n",
eid->id,eid->oc_id,eid->keyval);
- res=backsql_id2entry(&srch_info,&entry,eid);
+ entry=(Entry *)ch_calloc(sizeof(Entry),1);
+ res=backsql_id2entry(&srch_info,entry,eid);
if (res==NULL)
{
Debug(LDAP_DEBUG_TRACE,"backsql_search(): error in backsql_id2entry() - skipping entry\n",0,0,0);
}
if ( !manageDSAit && scope != LDAP_SCOPE_BASE &&
- is_entry_referral( &entry ) )
+ is_entry_referral( entry ) )
{
- struct berval **refs = get_entry_referrals(be,conn,op,&entry);
+ struct berval **refs = get_entry_referrals(be,conn,op,entry);
- send_search_reference( be, conn, op, &entry, refs, scope, NULL, &v2refs );
+ send_search_reference( be, conn, op, entry, refs, scope, NULL, &v2refs );
ber_bvecfree( refs );
continue;
}
- // if (test_filter(be,conn,op,&entry,filter)==0)
+ if (test_filter(be,conn,op,entry,filter)==LDAP_COMPARE_TRUE)
{
- if ((sres=send_search_entry(be,conn,op,&entry,attrs,attrsonly,NULL))==-1)
+ if ((sres=send_search_entry(be,conn,op,entry,attrs,attrsonly,NULL))==-1)
{
Debug(LDAP_DEBUG_TRACE,"backsql_search(): connection lost\n",0,0,0);
break;
}
nentries+=!sres;
}
+ entry_free(entry);
}
for(eid=srch_info.id_list;eid!=NULL;eid=backsql_free_entryID(eid));
#include <stdarg.h>
#include "slap.h"
#include "back-sql.h"
+#include "schema-map.h"
#include "util.h"
-char backsql_def_oc_query[]="SELECT id,name,keytbl,keycol,create_proc,delete_proc,expect_return FROM ldap_objclasses";
-char backsql_def_at_query[]="SELECT name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc,param_order,expect_return FROM ldap_attrs WHERE oc_id=?";
+char backsql_def_oc_query[]="SELECT id,name,keytbl,keycol,create_proc,delete_proc,expect_return FROM ldap_oc_mappings";
+char backsql_def_at_query[]="SELECT name,sel_expr,from_tbls,join_where,add_proc,delete_proc,param_order,expect_return FROM ldap_attr_mappings WHERE oc_map_id=?";
char backsql_def_delentry_query[]="DELETE FROM ldap_entries WHERE id=?";
-char backsql_def_insentry_query[]="INSERT INTO ldap_entries (dn,objclass,parent,keyval) VALUES (?,?,?,?)";
+char backsql_def_insentry_query[]="INSERT INTO ldap_entries (dn,oc_map_id,parent,keyval) VALUES (?,?,?,?)";
char backsql_def_subtree_cond[]="ldap_entries.dn LIKE CONCAT('%',?)";
-char backsql_id_query[]="SELECT id,keyval,objclass FROM ldap_entries WHERE ";
-
+char backsql_id_query[]="SELECT id,keyval,oc_map_id FROM ldap_entries WHERE ";
char* backsql_strcat(char* dest,int *buflen, ...)
{
int backsql_entry_addattr(Entry *e,char *at_name,char *at_val,unsigned int at_val_len)
{
Attribute *c_at=e->e_attrs;
- struct berval **cval;
- int nvals;
+ struct berval* add_val[2];
+ struct berval cval;
+ AttributeDescription *ad;
+ int rc;
+ const char *text;
Debug(LDAP_DEBUG_TRACE,"backsql_entry_addattr(): at_name='%s', at_val='%s'\n",at_name,at_val,0);
- while (c_at!=NULL && strcasecmp(c_at->a_type,at_name))
- c_at=c_at->a_next;
- if (c_at == NULL)
+ cval.bv_val=at_val;
+ cval.bv_len=at_val_len;
+ add_val[0]=&cval;
+ add_val[1]=NULL;
+
+ ad=NULL;
+ rc = slap_str2ad( at_name, &ad, &text );
+ if( rc != LDAP_SUCCESS )
{
- //Debug(LDAP_DEBUG_TRACE,"backsql_addattr(): creating new attribute\n",0,0,0);
- c_at=(Attribute *)ch_calloc(sizeof(Attribute),1);
- c_at->a_type=ch_strdup(at_name);
- c_at->a_syntax=SYNTAX_CIS;
- c_at->a_vals=(struct berval**)ch_calloc(sizeof(struct berval *),1);
- c_at->a_vals[0]=NULL;
- c_at->a_next=e->e_attrs;
- e->e_attrs=c_at;
+ Debug(LDAP_DEBUG_TRACE,"backsql_entry_addattr(): failed to find AttributeDescription for '%s'\n",at_name,0,0);
+ return 0;
}
- //Debug(LDAP_DEBUG_TRACE,"backsql_addattr(): checking attribute values\n",0,0,0);
- //should use different comparison methods for different attributes
- //for now, uses memcmp
- for (cval=c_at->a_vals,nvals=0;*cval != NULL &&
- memcmp((*cval)->bv_val,at_val,BACKSQL_MIN((*cval)->bv_len,at_val_len));cval++,nvals++);
-
- if (*cval==NULL)
+
+ rc = attr_merge(e,ad,add_val);
+ ad_free( ad, 1 );
+
+ if( rc != 0 )
{
- //Debug(LDAP_DEBUG_TRACE,"backsql_addattr(): nvals=%d; adding new value\n",nvals,0,0);
- c_at->a_vals=(struct berval **)realloc(c_at->a_vals,sizeof(struct berval *)*(nvals+2));
- c_at->a_vals[nvals]=(struct berval*)ch_calloc(sizeof(struct berval),1);
- c_at->a_vals[nvals]->bv_val=(char*)ch_calloc(sizeof(char),at_val_len);
- strncpy(c_at->a_vals[nvals]->bv_val,at_val,at_val_len);
- c_at->a_vals[nvals]->bv_len=at_val_len;
- c_at->a_vals[nvals+1]=NULL;
+ Debug(LDAP_DEBUG_TRACE,"backsql_entry_addattr(): failed to merge value '%s' for attribute '%s'\n",at_val,at_name,0);
+ return 0;
}
- else
- {
- //Debug(LDAP_DEBUG_TRACE,"backsql_addattr(): value already exists\n",0,0,0);
- }
+
Debug(LDAP_DEBUG_TRACE,"<==backsql_query_addattr()\n",0,0,0);
return 1;
}