mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-01-03 05:30:07 -05:00
Summary of changes:
- filter -> SQL translation bugfixes
- several memory leaks fixups
- improved configurability:
- allows definition of uppercasing function to support CIS matching on databases that do
case sensitive compares (this fixes up Oracle issues, example updated)
- allows more flexibility in stored procedures interface (different parameter order, optional return
codes - see samples, and comments in backsql.h)
- synchronize function interfaces to recent changes in prototypes ("const" clauses etc.) made for all backends
(those changes led to compile-time errors)
This commit is contained in:
parent
60981bdce1
commit
b8af4a67ea
27 changed files with 392 additions and 232 deletions
|
|
@ -2,7 +2,7 @@
|
|||
#define __BACKSQL_H__
|
||||
|
||||
/*
|
||||
* Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved.
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
|
|
@ -27,6 +27,8 @@ typedef struct
|
|||
char *subtree_cond;
|
||||
char *oc_query,*at_query;
|
||||
char *insentry_query,*delentry_query;
|
||||
char *id_query;
|
||||
char *upper_func;
|
||||
Avlnode *db_conns;
|
||||
Avlnode *oc_by_name;
|
||||
Avlnode *oc_by_id;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved.
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
|
|
@ -17,8 +17,8 @@
|
|||
#include "back-sql.h"
|
||||
#include "sql-wrap.h"
|
||||
|
||||
int backsql_bind(Backend *be,Connection *conn,Operation *op,
|
||||
char *dn,char *ndn,int method,struct berval *cred,char** edn)
|
||||
int backsql_bind(BackendDB *be,Connection *conn,Operation *op,
|
||||
const char *dn,const char *ndn,int method,struct berval *cred,char** edn)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"==>backsql_bind()\n",0,0,0);
|
||||
//for now, just return OK, allowing to test modify operations
|
||||
|
|
@ -27,7 +27,7 @@ int backsql_bind(Backend *be,Connection *conn,Operation *op,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int backsql_unbind(Backend *be,Connection *conn,Operation *op)
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved.
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
|
|
@ -38,7 +38,7 @@ int backsql_db_config(BackendDB *be,const char *fname,int lineno,int argc,char *
|
|||
}
|
||||
else
|
||||
{
|
||||
si->dbhost=strdup(argv[1]);
|
||||
si->dbhost=ch_strdup(argv[1]);
|
||||
Debug(LDAP_DEBUG_TRACE,"<==backsql_db_config(): hostname=%s\n",si->dbhost,0,0);
|
||||
}
|
||||
return(0);
|
||||
|
|
@ -53,7 +53,7 @@ int backsql_db_config(BackendDB *be,const char *fname,int lineno,int argc,char *
|
|||
}
|
||||
else
|
||||
{
|
||||
si->dbuser=strdup(argv[1]);
|
||||
si->dbuser=ch_strdup(argv[1]);
|
||||
Debug(LDAP_DEBUG_TRACE,"<==backsql_db_config(): dbuser=%s\n",argv[1],0,0);
|
||||
}
|
||||
return(0);
|
||||
|
|
@ -68,7 +68,7 @@ int backsql_db_config(BackendDB *be,const char *fname,int lineno,int argc,char *
|
|||
}
|
||||
else
|
||||
{
|
||||
si->dbpasswd=strdup(argv[1]);
|
||||
si->dbpasswd=ch_strdup(argv[1]);
|
||||
Debug(LDAP_DEBUG_TRACE,"<==backsql_db_config(): dbpasswd=%s\n",si->dbpasswd,0,0);
|
||||
}
|
||||
return(0);
|
||||
|
|
@ -83,7 +83,7 @@ int backsql_db_config(BackendDB *be,const char *fname,int lineno,int argc,char *
|
|||
}
|
||||
else
|
||||
{
|
||||
si->dbname=strdup(argv[1]);
|
||||
si->dbname=ch_strdup(argv[1]);
|
||||
Debug(LDAP_DEBUG_TRACE,"<==backsql_db_config(): dbname=%s\n",si->dbname,0,0);
|
||||
}
|
||||
return(0);
|
||||
|
|
@ -98,7 +98,7 @@ int backsql_db_config(BackendDB *be,const char *fname,int lineno,int argc,char *
|
|||
}
|
||||
else
|
||||
{
|
||||
si->subtree_cond=strdup(argv[1]);
|
||||
si->subtree_cond=ch_strdup(argv[1]);
|
||||
Debug(LDAP_DEBUG_TRACE,"<==backsql_db_config(): subtree_cond=%s\n",si->subtree_cond,0,0);
|
||||
}
|
||||
return(0);
|
||||
|
|
@ -113,7 +113,7 @@ int backsql_db_config(BackendDB *be,const char *fname,int lineno,int argc,char *
|
|||
}
|
||||
else
|
||||
{
|
||||
si->oc_query=strdup(argv[1]);
|
||||
si->oc_query=ch_strdup(argv[1]);
|
||||
Debug(LDAP_DEBUG_TRACE,"<==backsql_db_config(): oc_query=%s\n",si->oc_query,0,0);
|
||||
}
|
||||
return(0);
|
||||
|
|
@ -128,7 +128,7 @@ int backsql_db_config(BackendDB *be,const char *fname,int lineno,int argc,char *
|
|||
}
|
||||
else
|
||||
{
|
||||
si->at_query=strdup(argv[1]);
|
||||
si->at_query=ch_strdup(argv[1]);
|
||||
Debug(LDAP_DEBUG_TRACE,"<==backsql_db_config(): at_query=%s\n",si->at_query,0,0);
|
||||
}
|
||||
return(0);
|
||||
|
|
@ -143,12 +143,27 @@ int backsql_db_config(BackendDB *be,const char *fname,int lineno,int argc,char *
|
|||
}
|
||||
else
|
||||
{
|
||||
si->insentry_query=strdup(argv[1]);
|
||||
si->insentry_query=ch_strdup(argv[1]);
|
||||
Debug(LDAP_DEBUG_TRACE,"<==backsql_db_config(): insentry_query=%s\n",si->insentry_query,0,0);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
if (!strcasecmp(argv[0],"upper_func"))
|
||||
{
|
||||
if (argc<2)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"<==backsql_db_config (%s line %d): missing function name in upper_func directive\n",
|
||||
fname,lineno,0);
|
||||
}
|
||||
else
|
||||
{
|
||||
si->upper_func=ch_strdup(argv[1]);
|
||||
Debug(LDAP_DEBUG_TRACE,"<==backsql_db_config(): upper_func=%s\n",si->upper_func,0,0);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
if (!strcasecmp(argv[0],"delentry_query"))
|
||||
{
|
||||
if (argc<2)
|
||||
|
|
@ -158,7 +173,7 @@ int backsql_db_config(BackendDB *be,const char *fname,int lineno,int argc,char *
|
|||
}
|
||||
else
|
||||
{
|
||||
si->delentry_query=strdup(argv[1]);
|
||||
si->delentry_query=ch_strdup(argv[1]);
|
||||
Debug(LDAP_DEBUG_TRACE,"<==backsql_db_config(): delentry_query=%s\n",si->delentry_query,0,0);
|
||||
}
|
||||
return(0);
|
||||
|
|
@ -168,4 +183,5 @@ int backsql_db_config(BackendDB *be,const char *fname,int lineno,int argc,char *
|
|||
fname,lineno,argv[0]);
|
||||
return 0;
|
||||
}
|
||||
#endif /* SLAPD_SQL */
|
||||
|
||||
#endif /* SLAPD_SQL */
|
||||
|
|
|
|||
|
|
@ -25,12 +25,6 @@
|
|||
6.1 (glibc 2.1.2) (the same code behaves differently when built on 6.0 and 6.1)
|
||||
my problem was solved by upgrading iODBC to 3.0 beta - but it is kinda strange
|
||||
that beta works better than release (and release still works fine on 6.0)
|
||||
8) Oracle does case-sensitive comparison of strings by default, so back-sql
|
||||
becomes sensitive too when using Oracle. Later I'll add some option to slapd.conf
|
||||
that would allow to set some function to process values before comparison
|
||||
(something like "before_match UPPER", so that back-sql could generate
|
||||
something like "select ... from ... where ... and UPPER(colname)=UPPER(?) or
|
||||
UPPER(colname) LIKE UPPER(...)")
|
||||
9) ldapsearch sometimes refuses to show some attributes ("NOT PRINTABLE" diags)
|
||||
on Win32 (on linux everything's fine -- at least with mySQL)
|
||||
|
||||
|
|
@ -1,14 +1,14 @@
|
|||
1. Build
|
||||
To build slapd with back-sql under Unix you need to build and install
|
||||
iODBC 2.50.3 (later versions should probably work). Then, run
|
||||
"configure <options you need> --enable-sql [--with-iodbc-includes=<path>] [--with-iodbc-libs=<path>]",
|
||||
this should build back-sql-enabled slapd.
|
||||
"configure <other options you need> --enable-sql",
|
||||
this should build back-sql-enabled slapd, provided that you have iODBC
|
||||
libraries and include files in include/library paths.
|
||||
|
||||
Under Win32/MSVC++, I modified the workspace so that back-sql is built into
|
||||
slapd automatically, since MS odbc32 is included in standard library pack,
|
||||
and it does no bad even if you don't plan to use it. I also could provide
|
||||
precompiled executables for those who don't have MSVC later (when back-sql
|
||||
comes into some stable state).
|
||||
precompiled executables for those who don't have MSVC.
|
||||
|
||||
2. Tune datasources and slapd.conf
|
||||
Next, you need to define ODBC datasource with data you want to publish
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved.
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
|
|
@ -30,16 +30,15 @@ backsql_entryID* backsql_free_entryID(backsql_entryID* id)
|
|||
return next;
|
||||
}
|
||||
|
||||
backsql_entryID* backsql_dn2id(backsql_entryID *id,SQLHDBC dbh,char *dn)
|
||||
backsql_entryID* backsql_dn2id(backsql_info *bi,backsql_entryID *id,SQLHDBC dbh,char *dn)
|
||||
{
|
||||
static char id_query[]="SELECT id,keyval,objclass FROM ldap_entries WHERE dn=?";
|
||||
SQLHSTMT sth;
|
||||
BACKSQL_ROW_NTS row;
|
||||
//SQLINTEGER nrows=0;
|
||||
RETCODE rc;
|
||||
|
||||
Debug(LDAP_DEBUG_TRACE,"==>backsql_dn2id(): dn='%s'\n",dn,0,0);
|
||||
backsql_Prepare(dbh,&sth,id_query,0);
|
||||
backsql_Prepare(dbh,&sth,bi->id_query,0);
|
||||
if ((rc=backsql_BindParamStr(sth,1,dn,BACKSQL_MAX_DN_LEN)) != SQL_SUCCESS)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_dn2id(): error binding dn parameter:\n",0,0,0);
|
||||
|
|
@ -66,7 +65,7 @@ backsql_entryID* backsql_dn2id(backsql_entryID *id,SQLHDBC dbh,char *dn)
|
|||
id->id=atoi(row.cols[0]);
|
||||
id->keyval=atoi(row.cols[1]);
|
||||
id->oc_id=atoi(row.cols[2]);
|
||||
id->dn=strdup(dn);
|
||||
id->dn=ch_strdup(dn);
|
||||
id->next=NULL;
|
||||
}
|
||||
else
|
||||
|
|
@ -147,7 +146,7 @@ Entry* backsql_id2entry(backsql_srch_info *bsi,Entry* e,backsql_entryID* eid)
|
|||
bsi->c_eid=eid;
|
||||
e->e_attrs=NULL;
|
||||
if (bsi->base_dn != NULL)
|
||||
e->e_dn=strdup(bsi->c_eid->dn);
|
||||
e->e_dn=ch_strdup(bsi->c_eid->dn);
|
||||
|
||||
if (bsi->attrs!=NULL)
|
||||
{
|
||||
|
|
@ -179,4 +178,4 @@ Entry* backsql_id2entry(backsql_srch_info *bsi,Entry* e,backsql_entryID* eid)
|
|||
return e;
|
||||
}
|
||||
|
||||
#endif /* SLAPD_SQL */
|
||||
#endif /* SLAPD_SQL */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,16 @@
|
|||
#ifndef __BACKSQL_ENTRYID_H__
|
||||
#define __BACKSQL_ENTRYID_H__
|
||||
|
||||
/*
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
* license is available at http://www.OpenLDAP.org/license.html or
|
||||
* in file LICENSE in the top-level directory of the distribution.
|
||||
*/
|
||||
|
||||
|
||||
typedef struct __backsql_entryID
|
||||
{
|
||||
unsigned long id;
|
||||
|
|
@ -10,7 +20,7 @@ typedef struct __backsql_entryID
|
|||
struct __backsql_entryID *next;
|
||||
}backsql_entryID;
|
||||
|
||||
backsql_entryID* backsql_dn2id(backsql_entryID* id,SQLHDBC dbh,char *dn);
|
||||
backsql_entryID* backsql_dn2id(backsql_info *bi,backsql_entryID* id,SQLHDBC dbh,char *dn);
|
||||
backsql_entryID* backsql_free_entryID(backsql_entryID* id);//returns next
|
||||
|
||||
#endif
|
||||
|
|
@ -2,6 +2,16 @@
|
|||
#ifndef _SQL_EXTERNAL_H
|
||||
#define _SQL_EXTERNAL_H
|
||||
|
||||
/*
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
* license is available at http://www.OpenLDAP.org/license.html or
|
||||
* in file LICENSE in the top-level directory of the distribution.
|
||||
*/
|
||||
|
||||
|
||||
LDAP_BEGIN_DECL
|
||||
|
||||
extern int sql_back_initialize LDAP_P(( BackendInfo *bi ));
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved.
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
|
|
@ -116,6 +116,8 @@ int backsql_db_destroy(BackendDB *bd)
|
|||
free(si->dbpasswd);
|
||||
if (si->dbhost)
|
||||
free(si->dbhost);
|
||||
if (si->upper_func)
|
||||
free(si->upper_func);
|
||||
free(si->subtree_cond);
|
||||
free(si->oc_query);
|
||||
free(si->at_query);
|
||||
|
|
@ -131,6 +133,7 @@ int backsql_db_open (BackendDB *bd)
|
|||
backsql_info *si=(backsql_info*)bd->be_private;
|
||||
Connection tmp;
|
||||
SQLHDBC dbh;
|
||||
int idq_len;
|
||||
|
||||
Debug(LDAP_DEBUG_TRACE,"==>backsql_db_open(): testing RDBMS connection\n",0,0,0);
|
||||
if (si->dbname==NULL)
|
||||
|
|
@ -147,32 +150,42 @@ int backsql_db_open (BackendDB *bd)
|
|||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_db_open(): subtree search SQL condition not specified (use subtree_cond directive in slapd.conf)\n",0,0,0);
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_db_open(): setting '%s' as default\n",backsql_def_subtree_cond,0,0);
|
||||
si->subtree_cond=strdup(backsql_def_subtree_cond);
|
||||
si->subtree_cond=ch_strdup(backsql_def_subtree_cond);
|
||||
}
|
||||
if (si->oc_query==NULL)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_db_open(): objectclass mapping SQL statement not specified (use oc_query directive in slapd.conf)\n",0,0,0);
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_db_open(): setting '%s' by default\n",backsql_def_oc_query,0,0);
|
||||
si->oc_query=strdup(backsql_def_oc_query);
|
||||
si->oc_query=ch_strdup(backsql_def_oc_query);
|
||||
}
|
||||
if (si->at_query==NULL)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_db_open(): attribute mapping SQL statement not specified (use at_query directive in slapd.conf)\n",0,0,0);
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_db_open(): setting '%s' by default\n",backsql_def_at_query,0,0);
|
||||
si->at_query=strdup(backsql_def_at_query);
|
||||
si->at_query=ch_strdup(backsql_def_at_query);
|
||||
}
|
||||
if (si->insentry_query==NULL)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_db_open(): entry insertion SQL statement not specified (use insentry_query directive in slapd.conf)\n",0,0,0);
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_db_open(): setting '%s' by default\n",backsql_def_insentry_query,0,0);
|
||||
si->insentry_query=strdup(backsql_def_insentry_query);
|
||||
si->insentry_query=ch_strdup(backsql_def_insentry_query);
|
||||
}
|
||||
if (si->delentry_query==NULL)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_db_open(): entry deletion SQL statement not specified (use delentry_query directive in slapd.conf)\n",0,0,0);
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_db_open(): setting '%s' by default\n",backsql_def_delentry_query,0,0);
|
||||
si->delentry_query=strdup(backsql_def_delentry_query);
|
||||
si->delentry_query=ch_strdup(backsql_def_delentry_query);
|
||||
}
|
||||
si->id_query=NULL;
|
||||
idq_len=0;
|
||||
if (si->upper_func==NULL)
|
||||
{
|
||||
si->id_query=backsql_strcat(si->id_query,&idq_len,backsql_id_query,"dn=?",NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
si->id_query=backsql_strcat(si->id_query,&idq_len,backsql_id_query,si->upper_func,"(dn)=",si->upper_func,"(?)",NULL);
|
||||
}
|
||||
tmp.c_connid=-1;
|
||||
dbh=backsql_get_db_conn(bd,&tmp);
|
||||
if (!dbh)
|
||||
|
|
@ -181,6 +194,11 @@ int backsql_db_open (BackendDB *bd)
|
|||
return 1;
|
||||
}
|
||||
backsql_free_db_conn(bd,&tmp);
|
||||
if (!si->schema_loaded)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_db_open(): test failed, schema map not loaded - exiting\n",0,0,0);
|
||||
return 1;
|
||||
}
|
||||
Debug(LDAP_DEBUG_TRACE,"<==backsql_db_open(): test succeeded, schema map loaded\n",0,0,0);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -192,4 +210,4 @@ int backsql_db_close(BackendDB *bd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#endif /* SLAPD_SQL */
|
||||
#endif /* SLAPD_SQL */
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved.
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
#include "util.h"
|
||||
|
||||
int backsql_modify(BackendDB *be,Connection *conn,Operation *op,
|
||||
char *dn,char *ndn,LDAPModList *modlist)
|
||||
const char *dn,const char *ndn,LDAPModList *modlist)
|
||||
{
|
||||
backsql_info *bi=(backsql_info*)be->be_private;
|
||||
SQLHDBC dbh;
|
||||
|
|
@ -34,9 +34,10 @@ int backsql_modify(BackendDB *be,Connection *conn,Operation *op,
|
|||
backsql_at_map_rec *at=NULL;
|
||||
struct berval *at_val;
|
||||
int i;
|
||||
int pno,po;//first parameter no, parameter order
|
||||
int prc; //procedure return code
|
||||
|
||||
dn=dn_validate(dn);
|
||||
Debug(LDAP_DEBUG_TRACE,"==>backsql_modify(): changing entry '%s'\n",dn,0,0);
|
||||
Debug(LDAP_DEBUG_TRACE,"==>backsql_modify(): changing entry '%s'\n",ndn,0,0);
|
||||
dbh=backsql_get_db_conn(be,conn);
|
||||
if (!dbh)
|
||||
{
|
||||
|
|
@ -44,7 +45,7 @@ int backsql_modify(BackendDB *be,Connection *conn,Operation *op,
|
|||
send_ldap_result(conn,op,LDAP_OTHER,"","SQL-backend error",NULL,NULL);
|
||||
return 1;
|
||||
}
|
||||
res=backsql_dn2id(&e_id,dbh,dn);
|
||||
res=backsql_dn2id(bi,&e_id,dbh,(char*)ndn);
|
||||
if (res==NULL)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_modify(): could not lookup entry id\n",0,0,0);
|
||||
|
|
@ -69,16 +70,14 @@ int backsql_modify(BackendDB *be,Connection *conn,Operation *op,
|
|||
at=backsql_at_with_name(oc,c_mod->ml_type);
|
||||
if (at==NULL)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_add(): 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->ml_type,0,0);
|
||||
continue;
|
||||
}
|
||||
SQLBindParameter(sth,1,SQL_PARAM_INPUT,SQL_C_ULONG,SQL_INTEGER,0,0,&e_id.keyval,0,0);
|
||||
|
||||
switch(c_mod->ml_op)
|
||||
{
|
||||
case LDAP_MOD_REPLACE:
|
||||
{
|
||||
char *query;
|
||||
int qlen;
|
||||
SQLHSTMT asth;
|
||||
BACKSQL_ROW_NTS row;
|
||||
|
||||
|
|
@ -89,27 +88,17 @@ int backsql_modify(BackendDB *be,Connection *conn,Operation *op,
|
|||
break;
|
||||
}
|
||||
del_all:
|
||||
query=NULL;
|
||||
qlen=0;
|
||||
query=backsql_strcat(query,&qlen,"SELECT ",at->sel_expr," AS ",at->name,
|
||||
" FROM ",at->from_tbls,
|
||||
" WHERE ",oc->keytbl,".",oc->keycol,"=?",NULL);
|
||||
if (at->join_where!=NULL && at->join_where[0]!='\0')
|
||||
query=backsql_strcat(query,&qlen," AND ",at->join_where,NULL);
|
||||
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_modify() constructed query to get all existing values: %s\n",query,0,0);
|
||||
if ((rc=backsql_Prepare(dbh,&asth,query,0)) != SQL_SUCCESS)
|
||||
|
||||
if ((rc=backsql_Prepare(dbh,&asth,at->query,0)) != SQL_SUCCESS)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_get_attr_values(): error preparing query\n",0,0,0);
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_modify(): error preparing query\n",0,0,0);
|
||||
backsql_PrintErrors(bi->db_env,dbh,asth,rc);
|
||||
free(query);
|
||||
break;
|
||||
}
|
||||
free(query);
|
||||
|
||||
if (backsql_BindParamID(asth,1,&e_id.keyval) != SQL_SUCCESS)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_get_attr_values(): error binding key value parameter\n",0,0,0);
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_modify(): error binding key value parameter\n",0,0,0);
|
||||
backsql_PrintErrors(bi->db_env,dbh,asth,rc);
|
||||
SQLFreeStmt(asth,SQL_DROP);
|
||||
break;
|
||||
|
|
@ -117,7 +106,7 @@ del_all:
|
|||
|
||||
if ((rc=SQLExecute(asth)) != SQL_SUCCESS && rc!= SQL_SUCCESS_WITH_INFO)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_get_attr_values(): error executing attribute query\n",0,0,0);
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_modify(): error executing attribute query\n",0,0,0);
|
||||
backsql_PrintErrors(bi->db_env,dbh,asth,rc);
|
||||
SQLFreeStmt(asth,SQL_DROP);
|
||||
break;
|
||||
|
|
@ -128,7 +117,18 @@ del_all:
|
|||
{
|
||||
for (i=0;i<row.ncols;i++)
|
||||
{
|
||||
SQLBindParameter(sth,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,0,0,row.cols[i],strlen(row.cols[i]),0);
|
||||
if (at->expect_return & BACKSQL_DEL)
|
||||
{
|
||||
pno=1;
|
||||
SQLBindParameter(sth,1,SQL_PARAM_OUTPUT,SQL_C_ULONG,SQL_INTEGER,0,0,&prc,0,0);
|
||||
}
|
||||
else
|
||||
pno=0;
|
||||
po=(at->param_order & BACKSQL_DEL)>0;
|
||||
SQLBindParameter(sth,(SQLUSMALLINT)(pno+1+po),SQL_PARAM_INPUT,SQL_C_ULONG,SQL_INTEGER,0,0,&e_id.keyval,0,0);
|
||||
//check for syntax needed here - maybe need binary bind?
|
||||
SQLBindParameter(sth,(SQLUSMALLINT)(pno+2-po),SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,0,0,row.cols[i],strlen(row.cols[i]),0);
|
||||
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_modify(): executing '%s'\n",at->delete_proc,0,0);
|
||||
rc=SQLExecDirect(sth,at->delete_proc,SQL_NTS);
|
||||
if (rc!=SQL_SUCCESS)
|
||||
|
|
@ -156,8 +156,18 @@ del_all:
|
|||
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])
|
||||
{
|
||||
//check for syntax here - maybe need binary bind?
|
||||
SQLBindParameter(sth,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,0,0,at_val->bv_val,at_val->bv_len,0);
|
||||
if (at->expect_return & BACKSQL_ADD)
|
||||
{
|
||||
pno=1;
|
||||
SQLBindParameter(sth,1,SQL_PARAM_OUTPUT,SQL_C_ULONG,SQL_INTEGER,0,0,&prc,0,0);
|
||||
}
|
||||
else
|
||||
pno=0;
|
||||
po=(at->param_order & BACKSQL_ADD)>0;
|
||||
SQLBindParameter(sth,(SQLUSMALLINT)(pno+1+po),SQL_PARAM_INPUT,SQL_C_ULONG,SQL_INTEGER,0,0,&e_id.keyval,0,0);
|
||||
//check for syntax needed here - maybe need binary bind?
|
||||
SQLBindParameter(sth,(SQLUSMALLINT)(pno+2-po),SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,0,0,at_val->bv_val,at_val->bv_len,0);
|
||||
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_modify(): executing '%s'\n",at->add_proc,0,0);
|
||||
rc=SQLExecDirect(sth,at->add_proc,SQL_NTS);
|
||||
if (rc!=SQL_SUCCESS)
|
||||
|
|
@ -181,8 +191,18 @@ 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])
|
||||
{
|
||||
//check for syntax here - maybe need binary bind?
|
||||
SQLBindParameter(sth,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,0,0,at_val->bv_val,at_val->bv_len,0);
|
||||
if (at->expect_return & BACKSQL_DEL)
|
||||
{
|
||||
pno=1;
|
||||
SQLBindParameter(sth,1,SQL_PARAM_OUTPUT,SQL_C_ULONG,SQL_INTEGER,0,0,&prc,0,0);
|
||||
}
|
||||
else
|
||||
pno=0;
|
||||
po=(at->param_order & BACKSQL_DEL)>0;
|
||||
SQLBindParameter(sth,(SQLUSMALLINT)(pno+1+po),SQL_PARAM_INPUT,SQL_C_ULONG,SQL_INTEGER,0,0,&e_id.keyval,0,0);
|
||||
//check for syntax needed here - maybe need binary bind?
|
||||
SQLBindParameter(sth,(SQLUSMALLINT)(pno+2-po),SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,0,0,at_val->bv_val,at_val->bv_len,0);
|
||||
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_modify(): executing '%s'\n",at->delete_proc,0,0);
|
||||
rc=SQLExecDirect(sth,at->delete_proc,SQL_NTS);
|
||||
if (rc!=SQL_SUCCESS)
|
||||
|
|
@ -203,7 +223,7 @@ del_all:
|
|||
}
|
||||
|
||||
int backsql_modrdn(BackendDB *be,Connection *conn,Operation *op,
|
||||
char *dn,char *ndn,char *newrdn,int deleteoldrdn,char *newSuperior)
|
||||
const char *dn,const char *ndn,const char *newrdn,int deleteoldrdn,const char *newSuperior)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"==>backsql_modrdn()\n",0,0,0);
|
||||
return 0;
|
||||
|
|
@ -223,6 +243,8 @@ int backsql_add(BackendDB *be,Connection *conn,Operation *op,Entry *e)
|
|||
Attribute *at;
|
||||
struct berval *at_val;
|
||||
char *pdn;
|
||||
int pno,po;//first parameter no, parameter order
|
||||
int prc; //procedure return code
|
||||
|
||||
Debug(LDAP_DEBUG_TRACE,"==>backsql_add(): adding entry '%s'\n",e->e_dn,0,0);
|
||||
if (dn_validate(e->e_dn)==NULL)
|
||||
|
|
@ -262,7 +284,6 @@ int backsql_add(BackendDB *be,Connection *conn,Operation *op,Entry *e)
|
|||
|
||||
SQLAllocStmt(dbh, &sth);
|
||||
SQLBindParameter(sth,1,SQL_PARAM_OUTPUT,SQL_C_ULONG,SQL_INTEGER,0,0,&new_keyval,0,0);
|
||||
//SQLBindParameter(sth,2,SQL_PARAM_OUTPUT,SQL_C_SLONG,SQL_INTEGER,0,0,&retcode,0,0);
|
||||
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_add(): executing '%s'\n",oc->create_proc,0,0);
|
||||
rc=SQLExecDirect(sth,oc->create_proc,SQL_NTS);
|
||||
|
|
@ -290,13 +311,20 @@ int backsql_add(BackendDB *be,Connection *conn,Operation *op,Entry *e)
|
|||
Debug(LDAP_DEBUG_TRACE,"backsql_add(): add procedure is not defined for this attribute ('%s')\n",at->a_type,0,0);
|
||||
continue;
|
||||
}
|
||||
SQLBindParameter(sth,1,SQL_PARAM_INPUT,SQL_C_LONG,SQL_INTEGER,0,0,&new_keyval,0,0);
|
||||
|
||||
for(i=0,at_val=at->a_vals[0];at_val!=NULL;i++,at_val=at->a_vals[i])
|
||||
{
|
||||
//if (at->a_syntax==SYNTAX_BIN)
|
||||
// SQLBindParameter(sth,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_BINARY,0,0,at_val->bv_val,0,0);
|
||||
//else
|
||||
SQLBindParameter(sth,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,0,0,at_val->bv_val,at_val->bv_len,0);
|
||||
if (at_rec->expect_return & BACKSQL_ADD)
|
||||
{
|
||||
pno=1;
|
||||
SQLBindParameter(sth,1,SQL_PARAM_OUTPUT,SQL_C_ULONG,SQL_INTEGER,0,0,&prc,0,0);
|
||||
}
|
||||
else
|
||||
pno=0;
|
||||
po=(at_rec->param_order & BACKSQL_ADD)>0;
|
||||
SQLBindParameter(sth,(SQLUSMALLINT)(pno+1+po),SQL_PARAM_INPUT,SQL_C_ULONG,SQL_INTEGER,0,0,&new_keyval,0,0);
|
||||
//check for syntax needed here - maybe need binary bind?
|
||||
SQLBindParameter(sth,(SQLUSMALLINT)(pno+2-po),SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,0,0,at_val->bv_val,at_val->bv_len,0);
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_add(): executing '%s'\n",at_rec->add_proc,0,0);
|
||||
rc=SQLExecDirect(sth,at_rec->add_proc,SQL_NTS);
|
||||
if (rc!=SQL_SUCCESS)
|
||||
|
|
@ -308,7 +336,7 @@ int backsql_add(BackendDB *be,Connection *conn,Operation *op,Entry *e)
|
|||
}
|
||||
SQLFreeStmt(sth,SQL_RESET_PARAMS);
|
||||
pdn=dn_parent(be,e->e_dn);
|
||||
res=backsql_dn2id(&parent_id,dbh,pdn);
|
||||
res=backsql_dn2id(bi,&parent_id,dbh,pdn);
|
||||
if (res==NULL)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_add(): could not lookup parent entry for new record ('%s')\n",
|
||||
|
|
@ -337,7 +365,7 @@ int backsql_add(BackendDB *be,Connection *conn,Operation *op,Entry *e)
|
|||
}
|
||||
|
||||
int backsql_delete(BackendDB *be,Connection *conn,Operation *op,
|
||||
char *dn,char *ndn)
|
||||
const char *dn,const char *ndn)
|
||||
{
|
||||
backsql_info *bi=(backsql_info*)be->be_private;
|
||||
SQLHDBC dbh;
|
||||
|
|
@ -345,9 +373,9 @@ int backsql_delete(BackendDB *be,Connection *conn,Operation *op,
|
|||
RETCODE rc;
|
||||
backsql_oc_map_rec *oc=NULL;
|
||||
backsql_entryID e_id,*res;
|
||||
int pno;//first parameter no, parameter order
|
||||
|
||||
dn=dn_validate(dn);
|
||||
Debug(LDAP_DEBUG_TRACE,"==>backsql_delete(): deleting entry '%s'\n",dn,0,0);
|
||||
Debug(LDAP_DEBUG_TRACE,"==>backsql_delete(): deleting entry '%s'\n",ndn,0,0);
|
||||
dbh=backsql_get_db_conn(be,conn);
|
||||
if (!dbh)
|
||||
{
|
||||
|
|
@ -355,7 +383,7 @@ int backsql_delete(BackendDB *be,Connection *conn,Operation *op,
|
|||
send_ldap_result(conn,op,LDAP_OTHER,"","SQL-backend error",NULL,NULL);
|
||||
return 1;
|
||||
}
|
||||
res=backsql_dn2id(&e_id,dbh,dn);
|
||||
res=backsql_dn2id(bi,&e_id,dbh,(char*)ndn);
|
||||
if (res==NULL)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_delete(): could not lookup entry id\n",0,0,0);
|
||||
|
|
@ -378,7 +406,14 @@ int backsql_delete(BackendDB *be,Connection *conn,Operation *op,
|
|||
}
|
||||
|
||||
SQLAllocStmt(dbh, &sth);
|
||||
SQLBindParameter(sth,1,SQL_PARAM_INPUT,SQL_C_ULONG,SQL_INTEGER,0,0,&e_id.keyval,0,0);
|
||||
if (oc->expect_return)
|
||||
{
|
||||
pno=1;
|
||||
SQLBindParameter(sth,1,SQL_PARAM_OUTPUT,SQL_C_ULONG,SQL_INTEGER,0,0,&rc,0,0);
|
||||
}
|
||||
else
|
||||
pno=0;
|
||||
SQLBindParameter(sth,(SQLUSMALLINT)(pno+1),SQL_PARAM_INPUT,SQL_C_ULONG,SQL_INTEGER,0,0,&e_id.keyval,0,0);
|
||||
//SQLBindParameter(sth,2,SQL_PARAM_OUTPUT,SQL_C_SLONG,SQL_INTEGER,0,0,&retcode,0,0);
|
||||
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_delete(): executing '%s'\n",oc->delete_proc,0,0);
|
||||
|
|
@ -410,4 +445,4 @@ int backsql_delete(BackendDB *be,Connection *conn,Operation *op,
|
|||
return 0;
|
||||
}
|
||||
|
||||
#endif /* SLAPD_SQL */
|
||||
#endif /* SLAPD_SQL */
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved.
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
|
|
@ -23,7 +23,7 @@ int backsql_dummy()
|
|||
}
|
||||
|
||||
int backsql_compare(BackendDB *be,Connection *conn,Operation *op,
|
||||
char *dn,char *ndn,Ava *ava)
|
||||
const char *dn,const char *ndn,Ava *ava)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"==>backsql_compare()\n",0,0,0);
|
||||
return 0;
|
||||
|
|
@ -37,4 +37,4 @@ int backsql_abandon( BackendDB *be,
|
|||
return 0;
|
||||
}
|
||||
|
||||
#endif /* SLAPD_SQL */
|
||||
#endif /* SLAPD_SQL */
|
||||
|
|
|
|||
|
|
@ -7,7 +7,9 @@ CREATE TABLE ldap_attrs (
|
|||
join_where varchar (255) NULL ,
|
||||
add_proc varchar (255) NULL ,
|
||||
modify_proc varchar (255) NULL ,
|
||||
delete_proc varchar (255) NULL
|
||||
delete_proc varchar (255) NULL ,
|
||||
param_order int NOT NULL,
|
||||
expect_return int NOT NULL
|
||||
)
|
||||
GO
|
||||
|
||||
|
|
@ -26,7 +28,8 @@ CREATE TABLE ldap_objclasses (
|
|||
keytbl varchar (64) NOT NULL ,
|
||||
keycol varchar (64) NOT NULL ,
|
||||
create_proc varchar (255) NULL ,
|
||||
delete_proc varchar (255) NULL
|
||||
delete_proc varchar (255) NULL,
|
||||
expect_return int NOT NULL
|
||||
)
|
||||
GO
|
||||
|
||||
|
|
|
|||
|
|
@ -1,56 +1,56 @@
|
|||
|
||||
|
||||
SET IDENTITY_INSERT ldap_objclasses ON
|
||||
insert into ldap_objclasses (id,name,keytbl,keycol,create_proc,delete_proc)
|
||||
values (1,'person','persons','id','{call create_person(?)}','{call delete_person(?)}')
|
||||
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)
|
||||
values (2,'document','documents','id','{call create_document(?)}','{call delete_document(?)}')
|
||||
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)
|
||||
values (3,'organization','institutes','id','{call create_org(?)}','{call delete_org(?)}')
|
||||
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)
|
||||
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)
|
||||
NULL,NULL,0,0)
|
||||
|
||||
insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc)
|
||||
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(?,?)}')
|
||||
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)
|
||||
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)
|
||||
NULL,NULL,0,0)
|
||||
|
||||
insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc)
|
||||
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)
|
||||
|
||||
insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc)
|
||||
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)
|
||||
NULL,NULL,0,0)
|
||||
|
||||
insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
NULL,NULL,0,0)
|
||||
|
||||
insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc)
|
||||
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(?,?)}')
|
||||
'{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)
|
||||
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(?,?)}')
|
||||
'{call make_author_link(?,?)}',NULL,'{call del_author_link(?,?)}',0,0)
|
||||
|
||||
SET IDENTITY_INSERT ldap_attrs OFF
|
||||
|
|
|
|||
|
|
@ -7,7 +7,9 @@ CREATE TABLE ldap_attrs (
|
|||
join_where varchar(255),
|
||||
add_proc varchar(255),
|
||||
modify_proc varchar(255),
|
||||
delete_proc varchar(255)
|
||||
delete_proc varchar(255),
|
||||
param_order tinyint NOT NULL,
|
||||
expect_return tinyint NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
|
@ -26,7 +28,8 @@ CREATE TABLE ldap_objclasses (
|
|||
keytbl varchar(64) NOT NULL ,
|
||||
keycol varchar(64) NOT NULL ,
|
||||
create_proc varchar(255),
|
||||
delete_proc varchar(255)
|
||||
delete_proc varchar(255),
|
||||
expect_return tinyint NOT NULL
|
||||
);
|
||||
|
||||
ALTER TABLE ldap_entries ADD
|
||||
|
|
|
|||
|
|
@ -1,43 +1,43 @@
|
|||
insert into ldap_objclasses (id,name,keytbl,keycol,create_proc,delete_proc)
|
||||
values (1,'person','persons','id',NULL,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)
|
||||
values (2,'document','documents','id',NULL,NULL);
|
||||
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)
|
||||
values (3,'organization','institutes','id',NULL,NULL);
|
||||
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)
|
||||
values (1,1,'cn','persons.name','persons',NULL,NULL,NULL,NULL);
|
||||
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)
|
||||
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);
|
||||
'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)
|
||||
values (3,1,'sn','persons.name','persons',NULL,NULL,NULL,NULL);
|
||||
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)
|
||||
values (4,2,'abstract','documents.abstract','documents',NULL,NULL,NULL,NULL);
|
||||
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)
|
||||
values (5,2,'documentTitle','documents.title','documents',NULL,NULL,NULL,NULL);
|
||||
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)
|
||||
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);
|
||||
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)
|
||||
values (7,3,'o','institutes.name','institutes',NULL,NULL,NULL,NULL);
|
||||
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)
|
||||
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);
|
||||
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)
|
||||
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);
|
||||
NULL,NULL,NULL,3,0);
|
||||
|
|
|
|||
|
|
@ -7,7 +7,9 @@ CREATE TABLE ldap_attrs (
|
|||
join_where varchar2(255),
|
||||
add_proc varchar2(255),
|
||||
modify_proc varchar2(255),
|
||||
delete_proc varchar2(255)
|
||||
delete_proc varchar2(255),
|
||||
param_order NUMBER NOT NULL,
|
||||
expect_return NUMBER NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
|
@ -26,7 +28,8 @@ CREATE TABLE ldap_objclasses (
|
|||
keytbl varchar2(64) NOT NULL ,
|
||||
keycol varchar2(64) NOT NULL ,
|
||||
create_proc varchar2(255),
|
||||
delete_proc varchar2(255)
|
||||
delete_proc varchar2(255),
|
||||
expect_return NUMBER NOT NULL
|
||||
);
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -143,40 +143,46 @@ UPDATE documents SET abstract=new_abstract WHERE id=keyval;
|
|||
END;
|
||||
/
|
||||
|
||||
CREATE OR REPLACE PROCEDURE make_author_link (keyval IN NUMBER, author_dn IN varchar2) AS
|
||||
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 PROCEDURE make_doc_link (keyval IN NUMBER, doc_dn IN varchar2) AS
|
||||
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 PROCEDURE del_doc_link (keyval IN NUMBER, doc_dn IN varchar2) AS
|
||||
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 PROCEDURE del_author_link (keyval IN NUMBER, author_dn IN varchar2) AS
|
||||
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
|
||||
|
|
@ -184,7 +190,9 @@ SELECT keyval INTO per_id FROM ldap_entries
|
|||
|
||||
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;
|
||||
/
|
||||
|
||||
|
|
|
|||
|
|
@ -37,5 +37,6 @@ rootpw secret
|
|||
dbname ldap_ora8
|
||||
dbuser ldap
|
||||
dbpasswd ldap
|
||||
subtree_cond "ldap_entries.dn LIKE CONCAT('%',?)"
|
||||
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,?,?,?,?)"
|
||||
upper_func UPPER
|
||||
|
|
|
|||
|
|
@ -1,49 +1,49 @@
|
|||
insert into ldap_objclasses (id,name,keytbl,keycol,create_proc,delete_proc)
|
||||
values (1,'person','persons','id','{call create_person(?)}','{call delete_person(?)}');
|
||||
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)
|
||||
values (2,'document','documents','id','{call create_document(?)}','{call delete_document(?)}');
|
||||
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)
|
||||
values (3,'organization','institutes','id','{call create_org(?)}','{call delete_org(?)}');
|
||||
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)
|
||||
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);
|
||||
NULL,NULL,0,0);
|
||||
|
||||
insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc)
|
||||
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(?,?)}');
|
||||
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)
|
||||
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);
|
||||
NULL,NULL,0,0);
|
||||
|
||||
insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc)
|
||||
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);
|
||||
NULL,NULL,0,0);
|
||||
|
||||
insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc)
|
||||
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);
|
||||
NULL,NULL,0,0);
|
||||
|
||||
insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc)
|
||||
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);
|
||||
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)
|
||||
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);
|
||||
NULL,NULL,0,0);
|
||||
|
||||
insert into ldap_attrs (id,oc_id,name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc)
|
||||
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(?,?)}');
|
||||
'{?=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)
|
||||
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(?,?)}');
|
||||
'{?=call make_author_link(?,?)}',NULL,'{?=call del_author_link(?,?)}',0,3);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved.
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
|
|
@ -84,19 +84,21 @@ int backsql_load_schema_map(backsql_info *si,SQLHDBC dbh)
|
|||
{
|
||||
oc_map=(backsql_oc_map_rec*)ch_calloc(1,sizeof(backsql_oc_map_rec));
|
||||
oc_map->id=atoi(oc_row.cols[0]);
|
||||
oc_map->name=strdup(oc_row.cols[1]);
|
||||
oc_map->keytbl=strdup(oc_row.cols[2]);
|
||||
oc_map->keycol=strdup(oc_row.cols[3]);
|
||||
oc_map->create_proc=(oc_row.is_null[4]<0)?NULL:strdup(oc_row.cols[4]);
|
||||
oc_map->delete_proc=(oc_row.is_null[5]<0)?NULL:strdup(oc_row.cols[5]);
|
||||
oc_map->name=ch_strdup(oc_row.cols[1]);
|
||||
oc_map->keytbl=ch_strdup(oc_row.cols[2]);
|
||||
oc_map->keycol=ch_strdup(oc_row.cols[3]);
|
||||
oc_map->create_proc=(oc_row.is_null[4]<0)?NULL:ch_strdup(oc_row.cols[4]);
|
||||
oc_map->delete_proc=(oc_row.is_null[5]<0)?NULL:ch_strdup(oc_row.cols[5]);
|
||||
oc_map->expect_return=atoi(oc_row.cols[6]);
|
||||
|
||||
oc_map->attrs=NULL;
|
||||
avl_insert(&si->oc_by_name,oc_map,(AVL_CMP)backsql_cmp_oc_name,backsql_dummy);
|
||||
avl_insert(&si->oc_by_id,oc_map,(AVL_CMP)backsql_cmp_oc_id,backsql_dummy);
|
||||
oc_id=oc_map->id;
|
||||
Debug(LDAP_DEBUG_TRACE,"load_schema_map(): objectclass '%s': keytbl='%s' keycol='%s' ",
|
||||
oc_row.cols[1],oc_row.cols[2],oc_row.cols[3]);
|
||||
Debug(LDAP_DEBUG_TRACE,"create_proc='%s' delete_proc='%s' ; attributes:\n",oc_row.cols[4],
|
||||
oc_row.cols[5],0);
|
||||
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);
|
||||
if ((rc=SQLExecute(at_sth)) != SQL_SUCCESS)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"load_schema_map(): error executing at_query: \n",0,0,0);
|
||||
|
|
@ -113,23 +115,25 @@ int backsql_load_schema_map(backsql_info *si,SQLHDBC dbh)
|
|||
at_row.cols[4],at_row.cols[5]);
|
||||
Debug(LDAP_DEBUG_TRACE,"delete_proc='%s'\n",at_row.cols[6],0,0);
|
||||
at_map=(backsql_at_map_rec*)ch_calloc(1,sizeof(backsql_at_map_rec));
|
||||
at_map->name=strdup(at_row.cols[0]);
|
||||
at_map->sel_expr=strdup(at_row.cols[1]);
|
||||
at_map->name=ch_strdup(at_row.cols[0]);
|
||||
at_map->sel_expr=ch_strdup(at_row.cols[1]);
|
||||
tmps=NULL;tmpslen=0;
|
||||
backsql_merge_from_clause(&tmps,&tmpslen,at_row.cols[2]);
|
||||
at_map->from_tbls=strdup(tmps);
|
||||
at_map->from_tbls=ch_strdup(tmps);
|
||||
ch_free(tmps);
|
||||
at_map->join_where=strdup((at_row.is_null[3]<0)?"":at_row.cols[3]);
|
||||
at_map->add_proc=(at_row.is_null[4]<0)?NULL:strdup(at_row.cols[4]);
|
||||
at_map->modify_proc=(at_row.is_null[5]<0)?NULL:strdup(at_row.cols[5]);
|
||||
at_map->delete_proc=(at_row.is_null[6]<0)?NULL:strdup(at_row.cols[6]);
|
||||
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=strdup(tmps);
|
||||
at_map->query=ch_strdup(tmps);
|
||||
ch_free(tmps);
|
||||
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);
|
||||
|
|
@ -236,4 +240,4 @@ int backsql_destroy_schema_map(backsql_info *si)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#endif /* SLAPD_SQL */
|
||||
#endif /* SLAPD_SQL */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,16 @@
|
|||
#ifndef __BACKSQL_SCHEMA_MAP_H__
|
||||
#define __BACKSQL_SCHEMA_MAP_H__
|
||||
|
||||
/*
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
* license is available at http://www.OpenLDAP.org/license.html or
|
||||
* in file LICENSE in the top-level directory of the distribution.
|
||||
*/
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *name;
|
||||
|
|
@ -8,6 +18,7 @@ typedef struct
|
|||
char *keycol;
|
||||
char *create_proc;//expected to return keyval of newly created entry
|
||||
char *delete_proc;//supposed to expect keyval as parameter and delete all the attributes as well
|
||||
int expect_return; //flags whether delete_proc is a function (whether back-sql should bind first parameter as output for return code)
|
||||
unsigned long id;
|
||||
Avlnode *attrs;
|
||||
}backsql_oc_map_rec;
|
||||
|
|
@ -22,8 +33,15 @@ typedef struct
|
|||
char *modify_proc; //supposed to expect two binded values: entry keyval and old and new values of attr
|
||||
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)
|
||||
int param_order; //order of parameters for procedures above; 1 means "data then keyval", 0 means "keyval then data"
|
||||
int expect_return; //flags whether one or more of procedures is a function (whether back-sql should bind first parameter as output for return code)
|
||||
}backsql_at_map_rec;
|
||||
|
||||
//defines to support bitmasks above
|
||||
#define BACKSQL_ADD 1
|
||||
#define BACKSQL_DEL 2
|
||||
|
||||
int backsql_load_schema_map(backsql_info *si,SQLHDBC dbh);
|
||||
backsql_oc_map_rec* backsql_oc_with_name(backsql_info *si,char* objclass);
|
||||
backsql_oc_map_rec* backsql_oc_with_id(backsql_info *si,unsigned long id);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved.
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
|
|
@ -39,14 +39,14 @@ int backsql_attrlist_add(backsql_srch_info *bsi,char *at_name)
|
|||
}
|
||||
Debug(LDAP_DEBUG_TRACE,"==>backsql_attrlist_add(): adding '%s' to list\n",at_name,0,0);
|
||||
bsi->attrs=(char**)ch_realloc(bsi->attrs,(n_attrs+2)*sizeof(char*));
|
||||
bsi->attrs[n_attrs]=strdup(at_name);
|
||||
bsi->attrs[n_attrs]=ch_strdup(at_name);
|
||||
bsi->attrs[n_attrs+1]=NULL;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void backsql_init_search(backsql_srch_info *bsi,backsql_info *bi,char *nbase,int scope,
|
||||
int slimit,int tlimit,time_t stoptime,Filter *filter,
|
||||
SQLHDBC dbh,Backend *be,Connection *conn,Operation *op,char **attrs)
|
||||
SQLHDBC dbh,BackendDB *be,Connection *conn,Operation *op,char **attrs)
|
||||
{
|
||||
char **p;
|
||||
bsi->base_dn=nbase;
|
||||
|
|
@ -85,9 +85,6 @@ int backsql_process_filter_list(backsql_srch_info *bsi,Filter *f,int op)
|
|||
{
|
||||
res=backsql_process_filter(bsi,f);
|
||||
|
||||
if (res==-1)
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len," 1=0 ",NULL);
|
||||
|
||||
f=f->f_next;
|
||||
if (f==NULL)
|
||||
break;
|
||||
|
|
@ -114,19 +111,35 @@ int backsql_process_sub_filter(backsql_srch_info *bsi,Filter *f)
|
|||
|
||||
backsql_at_map_rec *at=backsql_at_with_name(bsi->oc,f->f_sub_type);
|
||||
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",at->sel_expr,
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",NULL);
|
||||
|
||||
if (bsi->bi->upper_func)
|
||||
{
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,
|
||||
bsi->bi->upper_func,"(",at->sel_expr,")",
|
||||
" LIKE '",NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,at->sel_expr,
|
||||
" LIKE '",NULL);
|
||||
}
|
||||
if (f->f_sub_initial!=NULL)
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,f->f_sub_initial,NULL);
|
||||
{
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,f->f_sub_initial->bv_val,NULL);
|
||||
}
|
||||
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"%",NULL);
|
||||
|
||||
if (f->f_sub_any!=NULL)
|
||||
for(i=0;f->f_sub_any[i]!=NULL;i++)
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,f->f_sub_any[i],"%",NULL);
|
||||
{
|
||||
//Debug(LDAP_DEBUG_TRACE,"==>backsql_process_sub_filter(): sub_any='%s'\n",f->f_sub_any[i]->bv_val,0,0);
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,f->f_sub_any[i]->bv_val,"%",NULL);
|
||||
}
|
||||
|
||||
if (f->f_sub_final!=NULL)
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,f->f_sub_final,NULL);
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,f->f_sub_final->bv_val,NULL);
|
||||
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"')",NULL);
|
||||
|
||||
|
|
@ -179,6 +192,7 @@ int backsql_process_filter(backsql_srch_info *bsi,Filter *f)
|
|||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_process_filter(): attribute '%s' is not defined for objectclass '%s'\n",
|
||||
at_name,bsi->oc->name,0);
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len," 1=0 ",NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
@ -195,8 +209,17 @@ int backsql_process_filter(backsql_srch_info *bsi,Filter *f)
|
|||
switch(f->f_choice)
|
||||
{
|
||||
case LDAP_FILTER_EQUALITY:
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",at->sel_expr,"='",
|
||||
f->f_avvalue.bv_val,"')",NULL);
|
||||
//maybe we should check type of at->sel_expr here somehow,
|
||||
//to know whether upper_func is applicable, but for now
|
||||
//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->bi->upper_func,"(",at->sel_expr,")='",
|
||||
f->f_avvalue.bv_val,"')",NULL);
|
||||
else
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",at->sel_expr,"='",
|
||||
f->f_avvalue.bv_val,"')",NULL);
|
||||
break;
|
||||
case LDAP_FILTER_GE:
|
||||
bsi->flt_where=backsql_strcat(bsi->flt_where,&bsi->fwhere_len,"(",at->sel_expr,">=",
|
||||
|
|
@ -247,8 +270,16 @@ char* backsql_srch_query(backsql_srch_info *bsi)
|
|||
switch(bsi->scope)
|
||||
{
|
||||
case LDAP_SCOPE_BASE:
|
||||
bsi->join_where=backsql_strcat(bsi->join_where,&bsi->jwhere_len,
|
||||
if (bsi->bi->upper_func)
|
||||
{
|
||||
bsi->join_where=backsql_strcat(bsi->join_where,&bsi->jwhere_len,
|
||||
bsi->bi->upper_func,"(","ldap_entries.dn)=(?)",NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
bsi->join_where=backsql_strcat(bsi->join_where,&bsi->jwhere_len,
|
||||
"ldap_entries.dn=?",NULL);
|
||||
}
|
||||
break;
|
||||
case LDAP_SCOPE_ONELEVEL:
|
||||
bsi->join_where=backsql_strcat(bsi->join_where,&bsi->jwhere_len,
|
||||
|
|
@ -318,7 +349,7 @@ int backsql_oc_get_candidates(backsql_oc_map_rec *oc,backsql_srch_info *bsi)
|
|||
}
|
||||
break;
|
||||
case LDAP_SCOPE_ONELEVEL:
|
||||
res=backsql_dn2id(&base_id,bsi->dbh,bsi->base_dn);
|
||||
res=backsql_dn2id(bsi->bi,&base_id,bsi->dbh,bsi->base_dn);
|
||||
if (res==NULL)
|
||||
{
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_oc_get_candidates(): could not retrieve base_dn id - no such entry\n",0,0,0);
|
||||
|
|
@ -360,15 +391,15 @@ int backsql_oc_get_candidates(backsql_oc_map_rec *oc,backsql_srch_info *bsi)
|
|||
}
|
||||
*/
|
||||
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_oc_get_candidates(): adding entry id=%s, keyval=%s dn='%s'\n",
|
||||
row.cols[0],row.cols[1],row.cols[3]);
|
||||
c_id=(backsql_entryID*)ch_calloc(1,sizeof(backsql_entryID));
|
||||
c_id->id=atoi(row.cols[0]);
|
||||
c_id->keyval=atoi(row.cols[1]);
|
||||
c_id->oc_id=bsi->oc->id;
|
||||
c_id->dn=strdup(row.cols[3]);
|
||||
c_id->dn=ch_strdup(row.cols[3]);
|
||||
c_id->next=bsi->id_list;
|
||||
bsi->id_list=c_id;
|
||||
Debug(LDAP_DEBUG_TRACE,"backsql_oc_get_candidates(): added entry id=%d, keyval=%d dn='%s'\n",
|
||||
c_id->id,c_id->keyval,row.cols[3]);
|
||||
}
|
||||
backsql_FreeRow(&row);
|
||||
SQLFreeStmt(sth,SQL_DROP);
|
||||
|
|
@ -376,10 +407,9 @@ int backsql_oc_get_candidates(backsql_oc_map_rec *oc,backsql_srch_info *bsi)
|
|||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int backsql_search(Backend *be,Connection *conn,Operation *op,
|
||||
char *base, char *nbase, int scope,int deref,int slimit,int tlimit,
|
||||
Filter *filter, char *filterstr,char **attrs,int attrsonly)
|
||||
int backsql_search(BackendDB *be,Connection *conn,Operation *op,
|
||||
const char *base, const char *nbase, int scope,int deref,int slimit,int tlimit,
|
||||
Filter *filter, const char *filterstr,char **attrs,int attrsonly)
|
||||
{
|
||||
backsql_info *bi=(backsql_info*)be->be_private;
|
||||
SQLHDBC dbh;
|
||||
|
|
@ -392,9 +422,8 @@ int backsql_search(Backend *be,Connection *conn,Operation *op,
|
|||
backsql_srch_info srch_info;
|
||||
backsql_entryID *eid=NULL;
|
||||
|
||||
base=dn_validate(base);
|
||||
Debug(LDAP_DEBUG_TRACE,"==>backsql_search(): base='%s', filter='%s', scope=%d,",
|
||||
base,filterstr,scope);
|
||||
nbase,filterstr,scope);
|
||||
Debug(LDAP_DEBUG_TRACE," deref=%d, attrsonly=%d, attributes to load: %s\n",
|
||||
deref,attrsonly,attrs==NULL?"all":"custom list");
|
||||
dbh=backsql_get_db_conn(be,conn);
|
||||
|
|
@ -427,11 +456,8 @@ int backsql_search(Backend *be,Connection *conn,Operation *op,
|
|||
be->be_sizelimit : slimit;
|
||||
}
|
||||
|
||||
//backsql_init_search(&srch_info,bi,nbase/*!!!!!!!!*/,scope,slimit,tlimit,stoptime,filter,dbh,
|
||||
// be,conn,op,attrs);
|
||||
backsql_init_search(&srch_info,bi,base/*don't know so far how to make Oracle do CIS search on VARCHAR2*/,
|
||||
scope,slimit,tlimit,stoptime,filter,dbh,
|
||||
be,conn,op,attrs);
|
||||
backsql_init_search(&srch_info,bi,(char*)nbase,scope,slimit,tlimit,stoptime,filter,dbh,
|
||||
be,conn,op,attrs);
|
||||
|
||||
//for each objectclass we try to construct query which gets IDs
|
||||
//of entries matching LDAP query filter and scope (or at least candidates),
|
||||
|
|
@ -494,7 +520,7 @@ int backsql_search(Backend *be,Connection *conn,Operation *op,
|
|||
|
||||
for(eid=srch_info.id_list;eid!=NULL;eid=backsql_free_entryID(eid));
|
||||
|
||||
//free bsi->attrs!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
charray_free(srch_info.attrs);
|
||||
|
||||
if (nentries>0)
|
||||
send_search_result( conn, op,
|
||||
|
|
@ -507,4 +533,4 @@ int backsql_search(Backend *be,Connection *conn,Operation *op,
|
|||
return 0;
|
||||
}
|
||||
|
||||
#endif /* SLAPD_SQL */
|
||||
#endif /* SLAPD_SQL */
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
#define __BACKSQL_SQL_TYPES_H__
|
||||
|
||||
/*
|
||||
* Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved.
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved.
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
|
|
@ -138,7 +138,7 @@ RETCODE backsql_BindRowAsStrings(SQLHSTMT sth,BACKSQL_ROW_NTS *row)
|
|||
{
|
||||
rc=SQLDescribeCol(sth,(SQLSMALLINT)i,&colname[0],(SQLUINTEGER)sizeof(colname)-1,&name_len,&col_type,
|
||||
(UDWORD*) &col_prec,&col_scale,&col_null);
|
||||
row->col_names[i-1]=strdup(colname);
|
||||
row->col_names[i-1]=ch_strdup(colname);
|
||||
//Debug(LDAP_DEBUG_TRACE,"backsql_BindRowAsStrings: col_name=%s, col_prec[%d]=%d\n",colname,(int)i,(int)col_prec);
|
||||
if (col_type == SQL_LONGVARCHAR || col_type== SQL_LONGVARBINARY)
|
||||
{
|
||||
|
|
@ -313,4 +313,4 @@ SQLHDBC backsql_get_db_conn(Backend *be,Connection *ldapc)
|
|||
return dbc->dbh;
|
||||
}
|
||||
|
||||
#endif /* SLAPD_SQL */
|
||||
#endif /* SLAPD_SQL */
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
#define __BACKSQL_SQL_WRAP_H__
|
||||
|
||||
/*
|
||||
* Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved.
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright 1999, Dmitry Kovalev (zmit@mail.ru), All rights reserved.
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
|
|
@ -20,11 +20,12 @@
|
|||
#include "util.h"
|
||||
|
||||
|
||||
char backsql_def_oc_query[]="SELECT id,name,keytbl,keycol,create_proc,delete_proc FROM ldap_objclasses";
|
||||
char backsql_def_at_query[]="SELECT name,sel_expr,from_tbls,join_where,add_proc,modify_proc,delete_proc FROM ldap_attrs WHERE oc_id=?";
|
||||
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_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_subtree_cond[]="ldap_entries.dn LIKE CONCAT('%',?)";
|
||||
char backsql_id_query[]="SELECT id,keyval,objclass FROM ldap_entries WHERE ";
|
||||
|
||||
|
||||
char* backsql_strcat(char* dest,int *buflen, ...)
|
||||
|
|
@ -78,7 +79,7 @@ int backsql_entry_addattr(Entry *e,char *at_name,char *at_val,unsigned int at_va
|
|||
{
|
||||
//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=strdup(at_name);
|
||||
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;
|
||||
|
|
@ -143,10 +144,10 @@ int backsql_merge_from_clause(char **dest_from,int *dest_len,char *src_from)
|
|||
|
||||
//Debug(LDAP_DEBUG_TRACE,"==>backsql_merge_from_clause(): dest_from='%s',src_from='%s'\n",
|
||||
// dest_from,src_from,0);
|
||||
srcc=strdup(src_from);
|
||||
srcc=ch_strdup(src_from);
|
||||
p=srcc;
|
||||
while(*p)
|
||||
{//4832041
|
||||
{
|
||||
s=backsql_get_table_spec(&p);
|
||||
// Debug(LDAP_DEBUG_TRACE,"backsql_merge_from_clause(): p='%s' s='%s'\n",p,s,0);
|
||||
if (*dest_from==NULL)
|
||||
|
|
@ -164,4 +165,4 @@ int backsql_merge_from_clause(char **dest_from,int *dest_len,char *src_from)
|
|||
return 1;
|
||||
}
|
||||
|
||||
#endif /* SLAPD_SQL */
|
||||
#endif /* SLAPD_SQL */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,15 @@
|
|||
#ifndef __BACKSQL_UTIL_H__
|
||||
#define __BACKSQL_UTIL_H__
|
||||
|
||||
/*
|
||||
* Copyright 1999, Dmitry Kovalev <mit@openldap.org>, All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted only
|
||||
* as authorized by the OpenLDAP Public License. A copy of this
|
||||
* license is available at http://www.OpenLDAP.org/license.html or
|
||||
* in file LICENSE in the top-level directory of the distribution.
|
||||
*/
|
||||
|
||||
|
||||
#include "entry-id.h"
|
||||
#include "schema-map.h"
|
||||
|
|
@ -44,7 +53,7 @@ Entry* backsql_id2entry(backsql_srch_info *bsi,Entry* e,backsql_entryID* id);
|
|||
|
||||
extern char backsql_def_oc_query[],backsql_def_at_query[],
|
||||
backsql_def_delentry_query[],backsql_def_insentry_query[],
|
||||
backsql_def_subtree_cond[];
|
||||
backsql_def_subtree_cond[],backsql_id_query[];
|
||||
|
||||
int backsql_merge_from_clause(char **dest_from,int *dest_len,char *src_from);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue