]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/init.c
First commit of Hallvard's backend documentation effort
[openldap] / servers / slapd / back-sql / init.c
index d14af1190a50cb5d50495824954829575cbb7563..92f7b5b90ba562fc2716896fc0a7b740269912f2 100644 (file)
@@ -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
@@ -9,6 +9,8 @@
 
 #include "portable.h"
 
+#ifdef SLAPD_SQL
+
 #include <stdio.h>
 #include <sys/types.h>
 #include "slap.h"
@@ -22,7 +24,7 @@
 int backsql_LTX_init_module(int argc, char *argv[]) {
     BackendInfo bi;
 
-    memset( &bi, 0, sizeof(bi) );
+    memset( &bi, '\0', sizeof(bi) );
     bi.bi_type = "sql";
     bi.bi_init = backbacksql_initialize;
 
@@ -64,9 +66,11 @@ int sql_back_initialize(
        bi->bi_op_delete = backsql_delete;
        
        bi->bi_acl_group = 0;
+       bi->bi_acl_attribute = 0;
+       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;
@@ -114,6 +118,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);
@@ -129,6 +135,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)
@@ -145,40 +152,68 @@ 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);
  }
  tmp.c_connid=-1;
  dbh=backsql_get_db_conn(bd,&tmp);
  if (!dbh)
  {
-  Debug(LDAP_DEBUG_TRACE,"backsql_db_open(): connection failed, exiting\n",0,0,0);
+  Debug(LDAP_DEBUG_TRACE,"backsql_db_open(): connection failed, exiting\n",0,0,0
+);
+  return 1;
+ }
+
+ 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
+ {
+    if (si->has_ldapinfo_dn_ru) {
+      si->id_query=backsql_strcat(si->id_query,&idq_len,backsql_id_query,"dn_ru=?",NULL);
+    }
+    else {
+      if (si->isTimesTen) {
+    si->id_query=backsql_strcat(si->id_query,&idq_len,backsql_id_query,si->upper_func,"(dn)=?",NULL);
+      }
+      else {
+               si->id_query=backsql_strcat(si->id_query,&idq_len,backsql_id_query,si->upper_func,"(dn)=",si->upper_func,"(?)",NULL);
+         }
+       }
+ }
+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;
  }
- backsql_free_db_conn(bd,&tmp);
  Debug(LDAP_DEBUG_TRACE,"<==backsql_db_open(): test succeeded, schema map loaded\n",0,0,0);
  return 0;
 }
@@ -188,4 +223,14 @@ int backsql_db_close(BackendDB *bd)
  Debug(LDAP_DEBUG_TRACE,"==>backsql_db_close()\n",0,0,0);
  Debug(LDAP_DEBUG_TRACE,"<==backsql_db_close()\n",0,0,0);
  return 0;
-}
\ No newline at end of file
+}
+
+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 */